@nabeh/chat-widget 0.1.0 → 0.1.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/README.md +66 -398
- package/dist/browser.cjs +589 -57
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.iife.js +589 -57
- package/dist/browser.iife.js.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/chunk-IFIILMOK.js +1404 -0
- package/dist/chunk-IFIILMOK.js.map +1 -0
- package/dist/index.cjs +589 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.iife.js +589 -57
- package/dist/index.iife.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-T4LQIVBI.js +0 -872
- package/dist/chunk-T4LQIVBI.js.map +0 -1
package/dist/browser.iife.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser.ts","../src/utils.ts","../src/api.ts","../src/defaults.ts","../src/config.ts","../src/dom.ts","../src/styles.ts","../src/widget.ts"],"sourcesContent":["import { createChatWidget } from \"./widget\";\nimport type { BrowserGlobal } from \"./types\";\n\nconst version = \"0.1.0\";\nconst init = createChatWidget;\n\nconst browserGlobal: BrowserGlobal = {\n init,\n createChatWidget,\n version\n};\n\ndeclare global {\n interface Window {\n ChatWidget?: BrowserGlobal;\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.ChatWidget = browserGlobal;\n}\n\nexport { browserGlobal, createChatWidget, init, version };\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function mergeDeep<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n const output = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = output[key];\n\n if (isRecord(targetValue) && isRecord(sourceValue)) {\n output[key] = mergeDeep(\n targetValue as Record<string, unknown>,\n sourceValue as Partial<Record<string, unknown>>\n ) as T[keyof T];\n continue;\n }\n\n if (sourceValue !== undefined) {\n output[key] = sourceValue as T[keyof T];\n }\n }\n\n return output;\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === \"string\") {\n return new Error(error);\n }\n\n return new Error(\"Unexpected widget error\");\n}\n\nexport function joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/$/, \"\")}/${path.replace(/^\\//, \"\")}`;\n}\n","import { joinUrl, normalizeError } from \"./utils\";\nimport type {\n ChatListItem,\n ChatHistoryMessage,\n ResolvedChatWidgetConfig,\n SendMessageRequest,\n SendMessageResponse\n} from \"./types\";\n\ntype RagResponseItem = {\n answer?: string;\n content?: {\n source_documents?: Array<string | null>;\n scores?: Array<number | null> | null;\n page_numbers?: Array<number | null> | null;\n sheet_names?: Array<string | null> | null;\n row_numbers?: Array<number | null> | null;\n knowledge_names?: Array<string | null> | null;\n };\n};\n\ntype AdapterMessageResponse = {\n chatId?: string;\n answer?: string;\n suggestions?: string[];\n citations?: SendMessageResponse[\"citations\"];\n};\n\ntype EndpointParams = {\n chatId?: string;\n};\n\nfunction buildHeaders(\n config: ResolvedChatWidgetConfig,\n token: string | null,\n userContextHeader?: string | null\n): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n ...config.customHeaders,\n ...(userContextHeader ? { \"X-Chat-User-Context\": userContextHeader } : {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {})\n };\n}\n\nasync function resolveUserContextHeader(\n config: ResolvedChatWidgetConfig\n): Promise<string | null> {\n if (!config.getUserContext) {\n return null;\n }\n\n const userContext = await config.getUserContext();\n\n if (!userContext) {\n return null;\n }\n\n return JSON.stringify(userContext);\n}\n\nfunction resolveEndpointUrl(\n config: ResolvedChatWidgetConfig,\n path: string,\n params: EndpointParams = {}\n): string {\n const resolvedPath = path\n .replace(/\\{chatId\\}/g, encodeURIComponent(params.chatId ?? \"\"))\n .replace(/:chatId\\b/g, encodeURIComponent(params.chatId ?? \"\"));\n\n return joinUrl(config.apiBaseUrl, resolvedPath);\n}\n\nexport async function postMessage(\n config: ResolvedChatWidgetConfig,\n payload: SendMessageRequest\n): Promise<SendMessageResponse> {\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const url = resolveEndpointUrl(config, config.endpoints.ask, {\n chatId: payload.chatId\n });\n const usesChatPath = /(\\{chatId\\}|:chatId\\b)/.test(config.endpoints.ask);\n const requestBody = usesChatPath\n ? {\n message: payload.message,\n knowledgeNames: payload.knowledgeNames,\n editLastQa: payload.editLastQa ?? false,\n enableReferences: payload.enableReferences ?? true\n }\n : {\n query: payload.message,\n chat_id: payload.chatId,\n knowledge_names: payload.knowledgeNames,\n edit_last_qa: payload.editLastQa ?? false,\n enable_references: payload.enableReferences ?? true\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Chat backend returned ${response.status}.`);\n }\n\n const data = (await response.json()) as RagResponseItem[] | AdapterMessageResponse;\n\n if (!Array.isArray(data)) {\n if (!data.answer || typeof data.answer !== \"string\") {\n throw new Error(\"Chat backend response is missing a valid answer.\");\n }\n\n return {\n chatId: data.chatId ?? payload.chatId,\n answer: data.answer,\n suggestions: data.suggestions ?? [],\n citations: data.citations ?? []\n };\n }\n\n const firstAnswer = data[0];\n\n if (!firstAnswer?.answer || typeof firstAnswer.answer !== \"string\") {\n throw new Error(\"Chat backend response is missing a valid answer.\");\n }\n\n const content = firstAnswer.content;\n const sourceDocuments = content?.source_documents ?? [];\n const scores = content?.scores ?? [];\n const pageNumbers = content?.page_numbers ?? [];\n const sheetNames = content?.sheet_names ?? [];\n const rowNumbers = content?.row_numbers ?? [];\n const knowledgeNames = content?.knowledge_names ?? [];\n\n const citations = sourceDocuments.map((sourceDocument, index) => ({\n sourceDocument,\n score: scores[index] ?? null,\n pageNumber: pageNumbers[index] ?? null,\n sheetName: sheetNames[index] ?? null,\n rowNumber: rowNumbers[index] ?? null,\n knowledgeName: knowledgeNames[index] ?? null\n }));\n\n return {\n chatId: payload.chatId,\n answer: firstAnswer.answer,\n suggestions: [],\n citations\n };\n}\n\nexport async function fetchHistory(\n config: ResolvedChatWidgetConfig,\n chatId: string\n): Promise<ChatHistoryMessage[]> {\n if (!config.endpoints.history) {\n return [];\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const usesChatPath = /(\\{chatId\\}|:chatId\\b)/.test(config.endpoints.history);\n const url = usesChatPath\n ? resolveEndpointUrl(config, config.endpoints.history, { chatId })\n : (() => {\n const historyUrl = new URL(joinUrl(config.apiBaseUrl, config.endpoints.history!));\n historyUrl.searchParams.set(\"chat_id\", chatId);\n return historyUrl.toString();\n })();\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: buildHeaders(config, token, userContextHeader)\n });\n\n if (!response.ok) {\n throw new Error(`Chat history endpoint returned ${response.status}.`);\n }\n\n const data = (await response.json()) as unknown;\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data\n .map((item) => {\n if (!item || typeof item !== \"object\") {\n return null;\n }\n\n const candidate = item as Record<string, unknown>;\n const roleValue =\n candidate.role ?? candidate.type ?? candidate.sender ?? candidate.author;\n const textValue =\n candidate.text ?? candidate.message ?? candidate.content ?? candidate.answer;\n\n if (typeof textValue !== \"string\") {\n return null;\n }\n\n const loweredRole =\n typeof roleValue === \"string\" ? roleValue.toLowerCase() : \"assistant\";\n\n return {\n role:\n loweredRole === \"user\" || loweredRole === \"human\"\n ? \"user\"\n : \"assistant\",\n text: textValue\n } satisfies ChatHistoryMessage;\n })\n .filter((message): message is ChatHistoryMessage => Boolean(message));\n}\n\nexport async function fetchChats(\n config: ResolvedChatWidgetConfig\n): Promise<ChatListItem[]> {\n if (!config.endpoints.listChats) {\n return [];\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const response = await fetch(joinUrl(config.apiBaseUrl, config.endpoints.listChats), {\n method: \"GET\",\n headers: buildHeaders(config, token, userContextHeader)\n });\n\n if (!response.ok) {\n throw new Error(`Chat list endpoint returned ${response.status}.`);\n }\n\n const data = (await response.json()) as unknown;\n\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data\n .map((item) => {\n if (!item || typeof item !== \"object\") {\n return null;\n }\n\n const candidate = item as Record<string, unknown>;\n const chatIdValue = candidate.chatId ?? candidate.chat_id ?? candidate.id;\n const titleValue = candidate.title ?? candidate.name ?? candidate.chatId;\n\n if (typeof chatIdValue !== \"string\" || typeof titleValue !== \"string\") {\n return null;\n }\n\n const createdAtValue =\n typeof candidate.createdAt === \"string\"\n ? candidate.createdAt\n : typeof candidate.created_at === \"string\"\n ? candidate.created_at\n : null;\n const updatedAtValue =\n typeof candidate.updatedAt === \"string\"\n ? candidate.updatedAt\n : typeof candidate.updated_at === \"string\"\n ? candidate.updated_at\n : null;\n\n const mapped: ChatListItem = {\n chatId: chatIdValue,\n title: titleValue,\n pinned: typeof candidate.pinned === \"boolean\" ? candidate.pinned : false\n };\n\n if (createdAtValue) {\n mapped.createdAt = createdAtValue;\n }\n\n if (updatedAtValue) {\n mapped.updatedAt = updatedAtValue;\n }\n\n return mapped;\n })\n .filter((item): item is ChatListItem => Boolean(item));\n}\n\nexport async function createChat(\n config: ResolvedChatWidgetConfig,\n chatId: string,\n title?: string\n): Promise<void> {\n const endpoint = config.endpoints.createChat ?? config.endpoints.listChats;\n\n if (!endpoint) {\n return;\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const response = await fetch(joinUrl(config.apiBaseUrl, endpoint), {\n method: \"POST\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify({\n chatId,\n ...(title ? { title } : {})\n })\n });\n\n if (!response.ok) {\n throw new Error(`Create chat endpoint returned ${response.status}.`);\n }\n}\n\nexport async function updateChat(\n config: ResolvedChatWidgetConfig,\n chatId: string,\n payload: {\n pinned: boolean;\n }\n): Promise<void> {\n if (!config.endpoints.updateChat) {\n return;\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const url = resolveEndpointUrl(config, config.endpoints.updateChat, { chatId });\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify(payload)\n });\n\n if (!response.ok) {\n throw new Error(`Update chat endpoint returned ${response.status}.`);\n }\n}\n\nexport function reportWidgetError(\n config: ResolvedChatWidgetConfig,\n error: unknown\n): Error {\n const normalized = normalizeError(error);\n config.onError?.(normalized);\n return normalized;\n}\n","import type { ChatWidgetTheme, ResolvedChatWidgetConfig } from \"./types\";\n\nexport const defaultTheme: ChatWidgetTheme = {\n accent: \"#0f766e\",\n accentSoft: \"#ecfeff\",\n panelBackground: \"#ffffff\",\n surfaceBackground: \"#f8fafc\",\n text: \"#1f2937\",\n mutedText: \"#64748b\",\n borderColor: \"#dbe4ee\",\n shadow: \"0 24px 64px rgba(15, 23, 42, 0.20)\",\n zIndex: 2147483000,\n fontFamily:\n \"\\\"Segoe UI\\\", -apple-system, BlinkMacSystemFont, \\\"Helvetica Neue\\\", sans-serif\"\n};\n\nexport const defaultConfigValues: Omit<\n ResolvedChatWidgetConfig,\n \"apiBaseUrl\" | \"endpoints\" | \"mount\"\n> = {\n position: \"bottom-right\",\n title: \"Knowledge Assistant\",\n subtitle: \"Answers are generated based on your access permissions\",\n welcomeMessage: \"How can I assist you today?\",\n inputPlaceholder: \"Ask your question...\",\n launcherAriaLabel: \"Open chat assistant\",\n closeAriaLabel: \"Close chat assistant\",\n initialSuggestions: [\n \"Which indicators reflect the achievements of Vision KSA goals?\",\n \"Case studies of real estate initiatives for economic growth\",\n \"Study of UX for the ministry external portal\"\n ],\n sourceApp: \"knowledge-platform\",\n locale: \"en\",\n customHeaders: {},\n rag: {\n knowledgeNames: [],\n enableReferences: true,\n loadHistoryOnOpen: false\n },\n theme: defaultTheme,\n getAccessToken: undefined,\n getUserContext: undefined,\n onOpen: undefined,\n onClose: undefined,\n onError: undefined\n};\n","import { defaultConfigValues, defaultTheme } from \"./defaults\";\nimport { mergeDeep } from \"./utils\";\nimport type { ChatWidgetConfig, ResolvedChatWidgetConfig } from \"./types\";\n\nexport function resolveConfig(config: ChatWidgetConfig): ResolvedChatWidgetConfig {\n if (!config.apiBaseUrl?.trim()) {\n throw new Error(\"Chat widget config requires a non-empty apiBaseUrl.\");\n }\n\n if (!config.endpoints?.ask?.trim()) {\n throw new Error(\"Chat widget config requires endpoints.ask to be provided.\");\n }\n\n const mount = config.mount ?? document.body;\n const theme = mergeDeep(defaultTheme, config.theme ?? {});\n\n return {\n apiBaseUrl: config.apiBaseUrl,\n endpoints: {\n ...config.endpoints\n },\n mount,\n position: config.position ?? defaultConfigValues.position,\n title: config.title ?? defaultConfigValues.title,\n subtitle: config.subtitle ?? defaultConfigValues.subtitle,\n welcomeMessage: config.welcomeMessage ?? defaultConfigValues.welcomeMessage,\n inputPlaceholder:\n config.inputPlaceholder ?? defaultConfigValues.inputPlaceholder,\n launcherAriaLabel:\n config.launcherAriaLabel ?? defaultConfigValues.launcherAriaLabel,\n closeAriaLabel: config.closeAriaLabel ?? defaultConfigValues.closeAriaLabel,\n initialSuggestions:\n config.initialSuggestions ?? defaultConfigValues.initialSuggestions,\n sourceApp: config.sourceApp ?? defaultConfigValues.sourceApp,\n locale: config.locale ?? defaultConfigValues.locale,\n customHeaders: config.customHeaders ?? defaultConfigValues.customHeaders,\n rag: {\n ...defaultConfigValues.rag,\n ...(config.rag ?? {})\n },\n theme,\n getAccessToken: config.getAccessToken,\n getUserContext: config.getUserContext,\n onOpen: config.onOpen,\n onClose: config.onClose,\n onError: config.onError\n };\n}\n","export function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n textContent?: string\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n\n if (className) {\n element.className = className;\n }\n\n if (textContent !== undefined) {\n element.textContent = textContent;\n }\n\n return element;\n}\n","import type { ChatWidgetTheme } from \"./types\";\n\nconst STYLE_ELEMENT_ID = \"kp-chat-widget-styles\";\n\nexport function ensureStyles(shadowRoot: ShadowRoot, theme: ChatWidgetTheme): void {\n if (shadowRoot.getElementById(STYLE_ELEMENT_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ELEMENT_ID;\n style.textContent = getCss(theme);\n shadowRoot.appendChild(style);\n}\n\nfunction getCss(theme: ChatWidgetTheme): string {\n return `\n :host {\n all: initial;\n }\n\n .kp-chat-widget {\n --kp-accent: ${theme.accent};\n --kp-accent-soft: ${theme.accentSoft};\n --kp-panel-background: ${theme.panelBackground};\n --kp-surface-background: ${theme.surfaceBackground};\n --kp-text: ${theme.text};\n --kp-muted-text: ${theme.mutedText};\n --kp-border-color: ${theme.borderColor};\n --kp-shadow: ${theme.shadow};\n --kp-z-index: ${theme.zIndex};\n --kp-font-family: ${theme.fontFamily};\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: var(--kp-z-index);\n font-family: var(--kp-font-family);\n color: var(--kp-text);\n box-sizing: border-box;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n font-family: inherit;\n }\n\n .kp-chat-widget.bottom-left {\n left: 24px;\n right: auto;\n }\n\n .kp-launcher {\n width: 72px;\n height: 72px;\n border: none;\n border-radius: 999px;\n cursor: pointer;\n background: radial-gradient(circle at 30% 30%, #f8fffe 0%, #ecfdf5 52%, #d6f4ef 100%);\n box-shadow: 0 16px 32px rgba(15, 118, 110, 0.18);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n color: var(--kp-accent);\n position: relative;\n overflow: hidden;\n }\n\n .kp-launcher:hover {\n transform: translateY(-1px);\n box-shadow: 0 20px 36px rgba(15, 118, 110, 0.22);\n }\n\n .kp-launcher:focus-visible,\n .kp-close:focus-visible,\n .kp-send:focus-visible,\n .kp-suggestion:focus-visible,\n .kp-input:focus-visible,\n .kp-full-page-new-chat:focus-visible,\n .kp-full-page-close:focus-visible,\n .kp-full-page-search-input:focus-visible,\n .kp-full-page-chat-item:focus-visible,\n .kp-chat-pin:focus-visible {\n outline: 2px solid var(--kp-accent);\n outline-offset: 2px;\n }\n\n .kp-launcher.hidden {\n opacity: 0;\n pointer-events: none;\n transform: translateY(8px) scale(0.96);\n }\n\n .kp-star-cluster {\n position: relative;\n width: 50px;\n height: 50px;\n animation: kp-cluster-rotate 8.5s linear infinite;\n }\n\n .kp-star {\n position: absolute;\n color: #08384c;\n line-height: 1;\n transform-origin: center;\n }\n\n .kp-star.main {\n top: 50%;\n left: 50%;\n font-size: 30px;\n transform: translate(-50%, -50%) scale(0.96);\n animation: kp-main-pulse 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-a {\n top: -3px;\n left: 50%;\n font-size: 18px;\n transform: translateX(-50%);\n animation: kp-orbit-a 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-b {\n right: -3px;\n bottom: 5px;\n font-size: 18px;\n animation: kp-orbit-b 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-c {\n left: -1px;\n bottom: 5px;\n font-size: 18px;\n animation: kp-orbit-c 3s ease-in-out infinite;\n }\n\n .kp-overlay {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.18);\n opacity: 0;\n pointer-events: none;\n transition: opacity 220ms ease;\n }\n\n .kp-overlay.visible {\n opacity: 1;\n pointer-events: auto;\n }\n\n .kp-panel {\n position: fixed;\n bottom: 88px;\n right: 24px;\n width: 480px;\n max-width: calc(100vw - 24px);\n height: min(730px, calc(100vh - 118px));\n background: var(--kp-panel-background);\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-radius: 20px;\n box-shadow: var(--kp-shadow);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n opacity: 0;\n transform: translateX(112px) scale(0.97);\n transform-origin: bottom right;\n pointer-events: none;\n transition: opacity 420ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 620ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n .kp-chat-widget.bottom-left .kp-panel {\n left: 24px;\n right: auto;\n transform: translateX(-112px) scale(0.97);\n transform-origin: bottom left;\n }\n\n .kp-panel.open {\n opacity: 1;\n transform: translateX(0) scale(1);\n pointer-events: auto;\n }\n\n .kp-full-page {\n position: fixed;\n inset: 0;\n background:\n radial-gradient(circle at top, rgba(32, 185, 210, 0.12), transparent 24%),\n linear-gradient(180deg, #f9fbfd 0%, #eef3f8 100%);\n opacity: 0;\n pointer-events: none;\n transform: translateY(18px);\n transition: opacity 260ms ease, transform 320ms ease;\n z-index: calc(var(--kp-z-index) + 2);\n overflow: hidden;\n }\n\n .kp-full-page.open {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0);\n }\n\n .kp-full-page-shell {\n height: 100vh;\n display: flex;\n flex-direction: column;\n padding: 22px 34px 26px;\n gap: 16px;\n overflow: hidden;\n }\n\n .kp-full-page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 12px 4px 0;\n flex: none;\n }\n\n .kp-full-page-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #08384c;\n }\n\n .kp-full-page-brand-mark {\n width: 44px;\n height: 44px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, rgba(37, 181, 192, 0.14), rgba(15, 118, 110, 0.08));\n font-size: 26px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n\n .kp-full-page-brand-text {\n font-size: 20px;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: #16394b;\n }\n\n .kp-full-page-header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .kp-full-page-badge {\n padding: 10px 14px;\n border-radius: 999px;\n font-size: 13px;\n line-height: 1;\n color: #0b556c;\n background: rgba(255, 255, 255, 0.82);\n border: 1px solid rgba(15, 118, 110, 0.12);\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);\n }\n\n .kp-full-page-close {\n width: 44px;\n height: 44px;\n border: none;\n border-radius: 14px;\n background: rgba(255, 255, 255, 0.82);\n color: #61788a;\n font-size: 28px;\n line-height: 1;\n cursor: pointer;\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);\n }\n\n .kp-full-page-breadcrumb {\n padding: 0 4px;\n color: #8192a0;\n font-size: 13px;\n line-height: 1.5;\n flex: none;\n }\n\n .kp-full-page-content {\n display: grid;\n grid-template-columns: 290px minmax(0, 1fr);\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n\n .kp-full-page-sidebar,\n .kp-full-page-panel {\n border-radius: 22px;\n border: 1px solid rgba(219, 228, 238, 0.9);\n background: rgba(255, 255, 255, 0.88);\n box-shadow: 0 20px 60px rgba(15, 23, 42, 0.08);\n backdrop-filter: blur(12px);\n }\n\n .kp-full-page-sidebar {\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-height: 0;\n overflow: auto;\n }\n\n .kp-full-page-new-chat {\n width: 100%;\n height: 48px;\n border: none;\n border-radius: 12px;\n background: linear-gradient(135deg, #0a465d 0%, #0f6a75 100%);\n color: #ffffff;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n box-shadow: 0 14px 30px rgba(10, 70, 93, 0.18);\n }\n\n .kp-full-page-search {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 44px;\n border-radius: 12px;\n border: 1px solid rgba(203, 213, 225, 0.95);\n background: #ffffff;\n padding: 0 12px;\n }\n\n .kp-full-page-search-input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n color: #334155;\n font-size: 14px;\n min-width: 0;\n }\n\n .kp-full-page-search-icon {\n color: #607082;\n font-size: 20px;\n line-height: 1;\n }\n\n .kp-full-page-section-label {\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: #8a98a6;\n margin-top: 4px;\n }\n\n .kp-full-page-recent-list,\n .kp-full-page-pinned-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .kp-full-page-item {\n padding: 12px 12px 13px;\n border-radius: 12px;\n color: #293845;\n font-size: 15px;\n line-height: 1.5;\n background: rgba(247, 250, 252, 0.9);\n border: 1px solid rgba(219, 228, 238, 0.88);\n }\n\n .kp-full-page-chat-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n cursor: pointer;\n transition: border-color 140ms ease, background 140ms ease, transform 140ms ease;\n }\n\n .kp-full-page-chat-item:hover {\n border-color: rgba(15, 118, 110, 0.34);\n background: rgba(240, 253, 250, 0.95);\n transform: translateY(-1px);\n }\n\n .kp-full-page-chat-item.active {\n border-color: rgba(15, 118, 110, 0.5);\n background: rgba(220, 252, 231, 0.72);\n }\n\n .kp-full-page-item-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n }\n\n .kp-chat-pin {\n flex: none;\n border: none;\n background: transparent;\n color: #0f6a75;\n font-size: 16px;\n line-height: 1;\n padding: 0;\n cursor: pointer;\n }\n\n .kp-full-page-empty {\n padding: 8px 4px 0;\n color: #7a8a99;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .kp-full-page-item-pinned {\n background: rgba(237, 248, 251, 0.92);\n border-color: rgba(127, 208, 217, 0.4);\n }\n\n .kp-full-page-main {\n min-width: 0;\n min-height: 0;\n display: flex;\n }\n\n .kp-full-page-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n .kp-full-page-body {\n flex: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 42px 28px 18px;\n background:\n radial-gradient(circle at top, rgba(54, 196, 220, 0.14), transparent 22%),\n linear-gradient(180deg, #ffffff 0%, #f8fbfd 100%);\n scroll-behavior: smooth;\n }\n\n .kp-full-page-body.kp-conversation-active {\n padding-top: 24px;\n }\n\n .kp-full-page-hero {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 22px;\n padding: 18px 18px 12px;\n max-width: 880px;\n width: 100%;\n margin: 0 auto;\n }\n\n .kp-full-page-hero-badge {\n width: 140px;\n height: 140px;\n border-radius: 999px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: radial-gradient(circle at 30% 30%, #f8fdff 0%, #edf8ff 50%, #e4eef8 100%);\n box-shadow:\n inset 0 2px 0 rgba(255, 255, 255, 0.9),\n 0 22px 40px rgba(15, 23, 42, 0.08);\n }\n\n .kp-star-cluster-static {\n animation: none;\n }\n\n .kp-full-page-hero-text {\n max-width: 760px;\n font-size: 26px;\n line-height: 1.5;\n font-weight: 700;\n letter-spacing: -0.03em;\n color: #374151;\n }\n\n .kp-full-page-suggestions {\n width: min(520px, 100%);\n margin: auto auto 0;\n }\n\n .kp-full-page-footer {\n flex: none;\n padding: 0 16px 18px;\n background: rgba(255, 255, 255, 0.72);\n border-top: 1px solid rgba(219, 228, 238, 0.75);\n }\n\n .kp-full-page-form {\n max-width: none;\n min-height: 56px;\n border-radius: 16px;\n }\n\n .kp-full-page-note {\n font-size: 13px;\n margin-top: 10px;\n }\n\n .kp-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 18px 18px 8px;\n background: linear-gradient(180deg, #ffffff 0%, #fbfdff 100%);\n }\n\n .kp-toolbar {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .kp-tool-button {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 12px;\n background: transparent;\n color: #0f4f68;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n transition: background 140ms ease;\n }\n\n .kp-tool-button:hover {\n background: rgba(15, 118, 110, 0.08);\n }\n\n .kp-pencil-icon {\n width: 22px;\n height: 22px;\n position: relative;\n display: inline-block;\n }\n\n .kp-pencil-icon::before {\n content: \"\";\n position: absolute;\n width: 14px;\n height: 2.5px;\n background: currentColor;\n border-radius: 999px;\n transform: rotate(-45deg);\n top: 3px;\n right: 1px;\n }\n\n .kp-pencil-icon::after {\n content: \"\";\n position: absolute;\n left: 2px;\n bottom: 2px;\n width: 11px;\n height: 11px;\n border: 2px solid currentColor;\n border-radius: 4px;\n }\n\n .kp-chevron {\n font-size: 13px;\n color: #66839a;\n transition: transform 160ms ease;\n margin-left: -2px;\n }\n\n .kp-menu-trigger.open .kp-chevron {\n transform: rotate(180deg);\n }\n\n .kp-dropdown {\n position: absolute;\n top: 44px;\n left: 0;\n width: 164px;\n background: #ffffff;\n border: 1px solid rgba(15, 79, 104, 0.12);\n border-radius: 10px;\n box-shadow: 0 18px 40px rgba(15, 23, 42, 0.16);\n padding: 8px;\n opacity: 0;\n transform: translateY(-6px);\n pointer-events: none;\n transition: opacity 180ms ease, transform 180ms ease;\n z-index: 2;\n }\n\n .kp-dropdown.open {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n }\n\n .kp-dropdown-item {\n width: 100%;\n border: none;\n background: transparent;\n text-align: left;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 14px;\n color: var(--kp-text);\n cursor: pointer;\n }\n\n .kp-dropdown-item:hover {\n background: rgba(15, 118, 110, 0.08);\n }\n\n .kp-title-wrap {\n display: none;\n }\n\n .kp-close {\n border: none;\n background: transparent;\n font-size: 24px;\n line-height: 1;\n color: var(--kp-muted-text);\n cursor: pointer;\n padding: 0;\n }\n\n .kp-body {\n flex: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 10px 16px 16px;\n background: linear-gradient(180deg, #ffffff 0%, var(--kp-surface-background) 100%);\n scroll-behavior: smooth;\n }\n\n .kp-body.kp-conversation-active {\n padding-top: 16px;\n }\n\n .kp-hero {\n display: flex;\n gap: 10px;\n padding: 4px 2px 8px;\n align-items: flex-start;\n }\n\n .kp-hero-icon {\n color: #0ea5b7;\n font-size: 28px;\n line-height: 1;\n margin-top: 2px;\n }\n\n .kp-hero-text {\n font-size: 20px;\n line-height: 1.45;\n font-weight: 700;\n color: #374151;\n }\n\n .kp-bubble {\n max-width: 85%;\n padding: 12px 14px;\n border-radius: 18px;\n font-size: 14px;\n line-height: 1.5;\n white-space: pre-wrap;\n border: 1px solid var(--kp-border-color);\n background: #ffffff;\n }\n\n .kp-bubble.user {\n align-self: flex-end;\n background: var(--kp-accent-soft);\n border-color: rgba(15, 118, 110, 0.22);\n }\n\n .kp-bubble.bot {\n align-self: flex-start;\n }\n\n .kp-meta {\n font-size: 11px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n margin-top: 6px;\n }\n\n .kp-suggestions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: auto;\n }\n\n .kp-suggestion {\n border: 1px solid rgba(15, 118, 110, 0.18);\n background: rgba(247, 251, 255, 0.92);\n color: var(--kp-text);\n border-radius: 999px;\n padding: 11px 14px;\n cursor: pointer;\n text-align: left;\n font-size: 14px;\n line-height: 1.35;\n }\n\n .kp-footer {\n padding: 10px 16px 12px;\n border-top: 1px solid rgba(219, 228, 238, 0.85);\n background: #ffffff;\n }\n\n .kp-form {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px solid var(--kp-border-color);\n border-radius: 14px;\n padding: 10px 12px;\n background: #ffffff;\n }\n\n .kp-input {\n flex: 1;\n border: none;\n outline: none;\n box-shadow: none;\n background: transparent;\n color: var(--kp-text);\n font-size: 14px;\n line-height: 1.5;\n min-width: 0;\n appearance: none;\n }\n\n .kp-input:focus,\n .kp-input:focus-visible,\n .kp-input:active {\n border: none;\n outline: none;\n box-shadow: none;\n }\n\n .kp-send {\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 999px;\n background: #e4f1f8;\n color: var(--kp-accent);\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .kp-note {\n margin-top: 8px;\n text-align: center;\n font-size: 11px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n }\n\n .kp-loading {\n font-size: 13px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n padding: 4px 2px;\n }\n\n @media (max-width: 640px) {\n .kp-chat-widget,\n .kp-chat-widget.bottom-left {\n left: auto;\n right: 16px;\n bottom: 16px;\n }\n\n .kp-panel,\n .kp-chat-widget.bottom-left .kp-panel {\n inset: 0;\n width: 100vw;\n max-width: none;\n height: 100vh;\n border-radius: 0;\n transform: translateX(72px) scale(0.985);\n transform-origin: center right;\n }\n\n .kp-panel.open {\n transform: translateX(0) scale(1);\n }\n\n .kp-full-page-shell {\n padding: 14px;\n }\n\n .kp-full-page-header {\n padding: 0;\n }\n\n .kp-full-page-content {\n grid-template-columns: 1fr;\n }\n\n .kp-full-page-sidebar {\n order: 2;\n }\n\n .kp-full-page-body {\n padding: 24px 16px 16px;\n }\n\n .kp-full-page-hero-badge {\n width: 112px;\n height: 112px;\n }\n\n .kp-full-page-hero-text {\n font-size: 22px;\n }\n }\n\n @keyframes kp-cluster-rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n @keyframes kp-main-pulse {\n 0%, 100% { transform: translate(-50%, -50%) scale(0.82); opacity: 0.45; }\n 38% { transform: translate(-50%, -50%) scale(1.04); opacity: 1; }\n 60% { transform: translate(-50%, -50%) scale(0.94); opacity: 0.88; }\n }\n\n @keyframes kp-orbit-a {\n 0%, 100% { transform: translate(-50%, 0) scale(1); opacity: 1; }\n 40% { transform: translate(-50%, 17px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(-50%, 2px) scale(1); opacity: 0.98; }\n }\n\n @keyframes kp-orbit-b {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 1; }\n 40% { transform: translate(-16px, -13px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(-2px, -2px) scale(1); opacity: 0.98; }\n }\n\n @keyframes kp-orbit-c {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 1; }\n 40% { transform: translate(16px, -13px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(2px, -2px) scale(1); opacity: 0.98; }\n }\n `;\n}\n","import {\n createChat,\n fetchChats,\n fetchHistory,\n postMessage,\n reportWidgetError,\n updateChat\n} from \"./api\";\nimport { resolveConfig } from \"./config\";\nimport { createElement } from \"./dom\";\nimport { ensureStyles } from \"./styles\";\nimport type {\n ChatHistoryMessage,\n ChatListItem,\n ChatWidgetConfig,\n ChatWidgetInstance,\n ResolvedChatWidgetConfig\n} from \"./types\";\n\ntype WidgetState = {\n chatId: string;\n open: boolean;\n fullPageOpen: boolean;\n accessTokenProvider: ResolvedChatWidgetConfig[\"getAccessToken\"];\n historyLoadedChatId: string | null;\n menuOpen: boolean;\n chats: ChatListItem[];\n chatSearchTerm: string;\n loadingChats: boolean;\n};\n\ntype ConversationView = {\n body: HTMLDivElement;\n input: HTMLInputElement;\n suggestions: HTMLDivElement;\n hero: HTMLDivElement;\n};\n\nexport function createChatWidget(config: ChatWidgetConfig): ChatWidgetInstance {\n if (typeof document === \"undefined\") {\n throw new Error(\"Chat widget can only be initialized in a browser.\");\n }\n\n const resolvedConfig = resolveConfig(config);\n const state: WidgetState = {\n chatId: resolveChatId(resolvedConfig),\n open: false,\n fullPageOpen: false,\n accessTokenProvider: resolvedConfig.getAccessToken,\n historyLoadedChatId: null,\n menuOpen: false,\n chats: [],\n chatSearchTerm: \"\",\n loadingChats: false\n };\n\n const host = document.createElement(\"div\");\n host.dataset.chatWidgetHost = \"true\";\n resolvedConfig.mount.appendChild(host);\n\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n ensureStyles(shadowRoot, resolvedConfig.theme);\n\n const shell = createElement(\"div\", `kp-chat-widget ${resolvedConfig.position}`);\n const overlay = createElement(\"div\", \"kp-overlay\");\n const launcher = createElement(\"button\", \"kp-launcher\");\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-label\", resolvedConfig.launcherAriaLabel);\n launcher.innerHTML = [\n '<span class=\"kp-star-cluster\" aria-hidden=\"true\">',\n '<span class=\"kp-star orbit-a\">✦</span>',\n '<span class=\"kp-star orbit-b\">✦</span>',\n '<span class=\"kp-star orbit-c\">✦</span>',\n '<span class=\"kp-star main\">✦</span>',\n \"</span>\"\n ].join(\"\");\n\n const panel = createElement(\"section\", \"kp-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-modal\", \"true\");\n panel.setAttribute(\"aria-label\", resolvedConfig.title);\n\n const header = createElement(\"div\", \"kp-header\");\n const toolbar = createElement(\"div\", \"kp-toolbar\");\n const menuTrigger = createElement(\"button\", \"kp-tool-button kp-menu-trigger\");\n menuTrigger.type = \"button\";\n menuTrigger.setAttribute(\"aria-label\", \"Open chat actions\");\n menuTrigger.innerHTML = [\n '<span class=\"kp-pencil-icon\" aria-hidden=\"true\"></span>',\n '<span class=\"kp-chevron\" aria-hidden=\"true\">⌄</span>'\n ].join(\"\");\n const dropdown = createElement(\"div\", \"kp-dropdown\");\n const newChatAction = createElement(\"button\", \"kp-dropdown-item\", \"New Chat\");\n newChatAction.type = \"button\";\n const myChatsAction = createElement(\"button\", \"kp-dropdown-item\", \"My Chats\");\n myChatsAction.type = \"button\";\n const openAssistantAction = createElement(\n \"button\",\n \"kp-dropdown-item\",\n \"Open Knowledge Assistant\"\n );\n openAssistantAction.type = \"button\";\n dropdown.append(newChatAction, myChatsAction, openAssistantAction);\n toolbar.append(menuTrigger, dropdown);\n\n const headingWrap = createElement(\"div\", \"kp-title-wrap\");\n const title = createElement(\"h2\", \"kp-title\", resolvedConfig.title);\n const subtitle = createElement(\"div\", \"kp-subtitle\", resolvedConfig.subtitle);\n headingWrap.append(title, subtitle);\n\n const closeButton = createElement(\"button\", \"kp-close\", \"×\");\n closeButton.type = \"button\";\n closeButton.setAttribute(\"aria-label\", resolvedConfig.closeAriaLabel);\n header.append(toolbar, headingWrap, closeButton);\n\n const body = createElement(\"div\", \"kp-body\");\n const hero = createElement(\"div\", \"kp-hero\");\n const heroIcon = createElement(\"div\", \"kp-hero-icon\", \"✦\");\n const heroText = createElement(\"div\", \"kp-hero-text\", resolvedConfig.welcomeMessage);\n hero.append(heroIcon, heroText);\n const footer = createElement(\"div\", \"kp-footer\");\n const form = createElement(\"form\", \"kp-form\");\n const input = createElement(\"input\", \"kp-input\");\n input.type = \"text\";\n input.autocomplete = \"off\";\n input.placeholder = resolvedConfig.inputPlaceholder;\n\n const sendButton = createElement(\"button\", \"kp-send\", \"➜\");\n sendButton.type = \"submit\";\n\n const note = createElement(\n \"div\",\n \"kp-note\",\n \"Auth token is forwarded from the host app when configured.\"\n );\n\n form.append(input, sendButton);\n footer.append(form, note);\n panel.append(header, body, footer);\n shell.append(overlay, launcher, panel);\n shadowRoot.appendChild(shell);\n\n body.appendChild(hero);\n\n const suggestions = createElement(\"div\", \"kp-suggestions\");\n body.appendChild(suggestions);\n const panelView: ConversationView = { body, input, suggestions, hero };\n\n const fullPage = createElement(\"section\", \"kp-full-page\");\n fullPage.setAttribute(\"role\", \"dialog\");\n fullPage.setAttribute(\"aria-modal\", \"true\");\n fullPage.setAttribute(\"aria-label\", `${resolvedConfig.title} page`);\n\n const fullPageShell = createElement(\"div\", \"kp-full-page-shell\");\n const fullPageHeader = createElement(\"div\", \"kp-full-page-header\");\n const fullPageBrand = createElement(\"div\", \"kp-full-page-brand\");\n const fullPageMark = createElement(\"div\", \"kp-full-page-brand-mark\", \"✦\");\n const fullPageBrandText = createElement(\n \"div\",\n \"kp-full-page-brand-text\",\n resolvedConfig.title\n );\n fullPageBrand.append(fullPageMark, fullPageBrandText);\n\n const fullPageHeaderActions = createElement(\"div\", \"kp-full-page-header-actions\");\n const fullPageBadge = createElement(\"div\", \"kp-full-page-badge\", \"Knowledge Assistant\");\n const fullPageClose = createElement(\"button\", \"kp-full-page-close\", \"×\");\n fullPageClose.type = \"button\";\n fullPageClose.setAttribute(\"aria-label\", \"Close knowledge assistant page\");\n fullPageHeaderActions.append(fullPageBadge, fullPageClose);\n fullPageHeader.append(fullPageBrand, fullPageHeaderActions);\n\n const fullPageBreadCrumb = createElement(\n \"div\",\n \"kp-full-page-breadcrumb\",\n \"Home › Knowledge Assistant\"\n );\n\n const fullPageContent = createElement(\"div\", \"kp-full-page-content\");\n const fullPageSidebar = createElement(\"aside\", \"kp-full-page-sidebar\");\n const fullPageNewChat = createElement(\"button\", \"kp-full-page-new-chat\", \"+ New Chat\");\n fullPageNewChat.type = \"button\";\n\n const fullPageSearchWrap = createElement(\"div\", \"kp-full-page-search\");\n const fullPageSearchInput = createElement(\"input\", \"kp-full-page-search-input\");\n fullPageSearchInput.type = \"search\";\n fullPageSearchInput.placeholder = \"Search Chat\";\n const fullPageSearchIcon = createElement(\"span\", \"kp-full-page-search-icon\", \"⌕\");\n fullPageSearchWrap.append(fullPageSearchInput, fullPageSearchIcon);\n\n const fullPageRecentLabel = createElement(\"div\", \"kp-full-page-section-label\", \"Recent Activity\");\n const fullPageRecentList = createElement(\"div\", \"kp-full-page-recent-list\");\n const fullPagePinnedLabel = createElement(\"div\", \"kp-full-page-section-label\", \"Pinned Collections\");\n const fullPagePinnedList = createElement(\"div\", \"kp-full-page-pinned-list\");\n fullPageSidebar.append(\n fullPageNewChat,\n fullPageSearchWrap,\n fullPageRecentLabel,\n fullPageRecentList,\n fullPagePinnedLabel,\n fullPagePinnedList\n );\n\n const fullPageMain = createElement(\"main\", \"kp-full-page-main\");\n const fullPagePanel = createElement(\"section\", \"kp-full-page-panel\");\n const fullPageBody = createElement(\"div\", \"kp-full-page-body\");\n const fullPageHero = createElement(\"div\", \"kp-full-page-hero\");\n const fullPageHeroBadge = createElement(\"div\", \"kp-full-page-hero-badge\");\n fullPageHeroBadge.innerHTML = [\n '<span class=\"kp-star-cluster kp-star-cluster-static\" aria-hidden=\"true\">',\n '<span class=\"kp-star orbit-a\">✦</span>',\n '<span class=\"kp-star orbit-b\">✦</span>',\n '<span class=\"kp-star orbit-c\">✦</span>',\n '<span class=\"kp-star main\">✦</span>',\n \"</span>\"\n ].join(\"\");\n const fullPageHeroText = createElement(\n \"div\",\n \"kp-full-page-hero-text\",\n resolvedConfig.welcomeMessage\n );\n fullPageHero.append(fullPageHeroBadge, fullPageHeroText);\n\n const fullPageSuggestions = createElement(\"div\", \"kp-suggestions kp-full-page-suggestions\");\n fullPageBody.append(fullPageHero, fullPageSuggestions);\n\n const fullPageFooter = createElement(\"div\", \"kp-full-page-footer\");\n const fullPageForm = createElement(\"form\", \"kp-form kp-full-page-form\");\n const fullPageInput = createElement(\"input\", \"kp-input kp-full-page-input\");\n fullPageInput.type = \"text\";\n fullPageInput.autocomplete = \"off\";\n fullPageInput.placeholder = resolvedConfig.inputPlaceholder;\n const fullPageSend = createElement(\"button\", \"kp-send kp-full-page-send\", \"➜\");\n fullPageSend.type = \"submit\";\n const fullPageNote = createElement(\n \"div\",\n \"kp-note kp-full-page-note\",\n \"Answers are generated based on your access permissions\"\n );\n fullPageForm.append(fullPageInput, fullPageSend);\n fullPageFooter.append(fullPageForm, fullPageNote);\n fullPagePanel.append(fullPageBody, fullPageFooter);\n fullPageMain.appendChild(fullPagePanel);\n fullPageContent.append(fullPageSidebar, fullPageMain);\n fullPageShell.append(fullPageHeader, fullPageBreadCrumb, fullPageContent);\n fullPage.appendChild(fullPageShell);\n shell.appendChild(fullPage);\n\n const fullPageView: ConversationView = {\n body: fullPageBody,\n input: fullPageInput,\n suggestions: fullPageSuggestions,\n hero: fullPageHero\n };\n\n const getRuntimeConfig = (): ResolvedChatWidgetConfig => ({\n ...resolvedConfig,\n getAccessToken: state.accessTokenProvider\n });\n\n syncSuggestionButtons(panelView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, panelView);\n });\n syncSuggestionButtons(fullPageView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, fullPageView);\n });\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n\n function open(): void {\n if (state.open) {\n return;\n }\n\n state.open = true;\n state.fullPageOpen = false;\n fullPage.classList.remove(\"open\");\n launcher.classList.add(\"hidden\");\n overlay.classList.add(\"visible\");\n panel.classList.add(\"open\");\n resolvedConfig.onOpen?.();\n if (resolvedConfig.rag.loadHistoryOnOpen) {\n void instance.loadHistory();\n }\n queueMicrotask(() => input.focus());\n }\n\n function close(): void {\n if (!state.open) {\n return;\n }\n\n closeMenu();\n state.open = false;\n launcher.classList.remove(\"hidden\");\n overlay.classList.remove(\"visible\");\n panel.classList.remove(\"open\");\n resolvedConfig.onClose?.();\n }\n\n async function sendMessageToView(\n message: string,\n view: ConversationView\n ): Promise<void> {\n const trimmed = message.trim();\n\n if (!trimmed) {\n return;\n }\n\n view.input.value = \"\";\n\n try {\n await ensureChatExists(trimmed);\n } catch (error) {\n const normalized = reportWidgetError(resolvedConfig, error);\n appendMessage(view.body, \"bot\", `Unable to create chat: ${normalized.message}`);\n return;\n }\n\n hidePromptsForConversation(view);\n appendMessage(view.body, \"user\", trimmed);\n view.body.scrollTop = view.body.scrollHeight;\n\n const loading = createElement(\"div\", \"kp-loading\", \"Thinking...\");\n view.body.appendChild(loading);\n view.body.scrollTop = view.body.scrollHeight;\n\n try {\n const response = await postMessage(getRuntimeConfig(), {\n message: trimmed,\n chatId: state.chatId,\n knowledgeNames: await resolveKnowledgeNames(resolvedConfig),\n ...(resolvedConfig.rag.enableReferences !== undefined\n ? { enableReferences: resolvedConfig.rag.enableReferences }\n : {})\n });\n\n if (loading.isConnected) {\n loading.remove();\n }\n\n appendMessage(view.body, \"bot\", response.answer, response.citations?.length);\n state.historyLoadedChatId = null;\n await refreshChats();\n\n if (response.suggestions?.length) {\n syncSuggestionButtons(view, response.suggestions, async (text) => {\n await sendMessageToView(text, view);\n });\n }\n } catch (error) {\n const normalized = reportWidgetError(resolvedConfig, error);\n\n if (loading.isConnected) {\n loading.remove();\n }\n\n appendMessage(view.body, \"bot\", `Request failed: ${normalized.message}`);\n }\n }\n\n async function sendMessage(message: string): Promise<void> {\n const targetView = state.fullPageOpen ? fullPageView : panelView;\n await sendMessageToView(message, targetView);\n }\n\n async function openFullPage(): Promise<void> {\n state.fullPageOpen = true;\n state.open = false;\n closeMenu();\n panel.classList.remove(\"open\");\n overlay.classList.remove(\"visible\");\n launcher.classList.add(\"hidden\");\n fullPage.classList.add(\"open\");\n await refreshChats();\n await loadHistoryIntoView(fullPageView, state.chatId);\n queueMicrotask(() => fullPageInput.focus());\n }\n\n function closeFullPage(): void {\n if (!state.fullPageOpen) {\n return;\n }\n\n state.fullPageOpen = false;\n fullPage.classList.remove(\"open\");\n launcher.classList.remove(\"hidden\");\n }\n\n function openMenu(): void {\n state.menuOpen = true;\n menuTrigger.classList.add(\"open\");\n dropdown.classList.add(\"open\");\n }\n\n function closeMenu(): void {\n state.menuOpen = false;\n menuTrigger.classList.remove(\"open\");\n dropdown.classList.remove(\"open\");\n }\n\n function resetConversation(): void {\n state.chatId = resolveChatId(resolvedConfig);\n state.historyLoadedChatId = null;\n resetConversationView(panelView);\n syncSuggestionButtons(panelView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, panelView);\n });\n closeMenu();\n }\n\n async function resetFullPageConversation(): Promise<void> {\n state.chatId = resolveChatId(resolvedConfig);\n state.historyLoadedChatId = null;\n resetConversationView(fullPageView);\n syncSuggestionButtons(fullPageView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, fullPageView);\n });\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n }\n\n async function refreshChats(): Promise<ChatListItem[]> {\n if (!resolvedConfig.endpoints.listChats) {\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n return [];\n }\n\n state.loadingChats = true;\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n\n try {\n const chats = await fetchChats(getRuntimeConfig());\n state.chats = chats;\n return chats;\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n return state.chats;\n } finally {\n state.loadingChats = false;\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n }\n }\n\n async function ensureChatExists(seedMessage?: string): Promise<void> {\n if (!resolvedConfig.endpoints.listChats && !resolvedConfig.endpoints.createChat) {\n return;\n }\n\n if (state.chats.some((chat) => chat.chatId === state.chatId)) {\n return;\n }\n\n await createChat(getRuntimeConfig(), state.chatId, seedMessage ? buildChatTitle(seedMessage) : undefined);\n }\n\n async function selectChat(chatId: string): Promise<void> {\n state.chatId = chatId;\n state.historyLoadedChatId = null;\n await loadHistoryIntoView(fullPageView, chatId);\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n }\n\n async function togglePinnedChat(chat: ChatListItem): Promise<void> {\n if (!resolvedConfig.endpoints.updateChat) {\n return;\n }\n\n try {\n await updateChat(getRuntimeConfig(), chat.chatId, {\n pinned: !chat.pinned\n });\n await refreshChats();\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n }\n }\n\n async function loadHistoryIntoView(\n view: ConversationView,\n chatId: string\n ): Promise<ChatHistoryMessage[]> {\n resetConversationView(view);\n syncSuggestionButtons(view, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, view);\n });\n\n const messages = await fetchHistory(getRuntimeConfig(), chatId);\n\n if (messages.length > 0) {\n hidePromptsForConversation(view);\n clearRenderedConversation(view.body, view.hero, view.suggestions);\n renderHistory(view.body, messages);\n }\n\n state.historyLoadedChatId = chatId;\n return messages;\n }\n\n const instance: ChatWidgetInstance = {\n open,\n close,\n toggle() {\n if (state.open) {\n close();\n return;\n }\n\n open();\n },\n destroy() {\n document.removeEventListener(\"keydown\", handleEscapeKeydown);\n host.remove();\n },\n sendMessage,\n setAccessTokenProvider(provider) {\n state.accessTokenProvider = provider;\n },\n getChatId() {\n return state.chatId;\n },\n loadChats() {\n return refreshChats();\n },\n async loadHistory() {\n const targetView = state.fullPageOpen ? fullPageView : panelView;\n return loadHistoryIntoView(targetView, state.chatId);\n }\n };\n\n launcher.addEventListener(\"click\", () => instance.toggle());\n closeButton.addEventListener(\"click\", close);\n overlay.addEventListener(\"click\", close);\n menuTrigger.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n if (!state.menuOpen) {\n openMenu();\n return;\n }\n\n closeMenu();\n });\n newChatAction.addEventListener(\"click\", resetConversation);\n myChatsAction.addEventListener(\"click\", async () => {\n closeMenu();\n await openFullPage();\n });\n openAssistantAction.addEventListener(\"click\", () => {\n void openFullPage();\n });\n fullPageClose.addEventListener(\"click\", closeFullPage);\n fullPageNewChat.addEventListener(\"click\", () => {\n void resetFullPageConversation();\n queueMicrotask(() => fullPageInput.focus());\n });\n fullPageSearchInput.addEventListener(\"input\", () => {\n state.chatSearchTerm = fullPageSearchInput.value.trim().toLowerCase();\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n }\n );\n });\n panel.addEventListener(\"click\", (event) => {\n if (\n state.menuOpen &&\n !dropdown.contains(event.target as Node) &&\n !menuTrigger.contains(event.target as Node)\n ) {\n closeMenu();\n }\n event.stopPropagation();\n });\n shadowRoot.addEventListener(\"click\", (event) => {\n const target = event.target;\n if (\n state.menuOpen &&\n target instanceof Node &&\n !dropdown.contains(target) &&\n !menuTrigger.contains(target)\n ) {\n closeMenu();\n }\n });\n form.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n await sendMessage(input.value);\n });\n fullPageForm.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n await sendMessageToView(fullPageInput.value, fullPageView);\n });\n\n function handleEscapeKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Escape\") {\n return;\n }\n\n if (state.fullPageOpen) {\n closeFullPage();\n return;\n }\n\n if (state.open) {\n close();\n }\n }\n\n document.addEventListener(\"keydown\", handleEscapeKeydown);\n\n return instance;\n}\n\nasync function resolveKnowledgeNames(\n config: ResolvedChatWidgetConfig\n): Promise<string[]> {\n if (config.rag.getKnowledgeNames) {\n const names = await config.rag.getKnowledgeNames();\n return Array.isArray(names) ? names.filter(Boolean) : [];\n }\n\n return (config.rag.knowledgeNames ?? []).filter(Boolean);\n}\n\nfunction resolveChatId(config: ResolvedChatWidgetConfig): string {\n if (config.rag.chatId?.trim()) {\n return config.rag.chatId;\n }\n\n if (config.rag.chatIdFactory) {\n return config.rag.chatIdFactory();\n }\n\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `kp-chat-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction appendMessage(\n body: HTMLDivElement,\n kind: \"bot\" | \"user\",\n text: string,\n citationCount?: number\n): HTMLDivElement {\n const bubble = createElement(\"div\", `kp-bubble ${kind}`, text);\n\n if (citationCount) {\n const meta = createElement(\n \"div\",\n \"kp-meta\",\n `${citationCount} citation${citationCount > 1 ? \"s\" : \"\"} attached`\n );\n bubble.appendChild(meta);\n }\n\n body.appendChild(bubble);\n body.scrollTop = body.scrollHeight;\n return bubble;\n}\n\nfunction renderSuggestions(\n container: HTMLDivElement,\n suggestions: string[],\n onClick: (text: string) => Promise<void>\n): void {\n container.textContent = \"\";\n\n for (const suggestion of suggestions) {\n const button = createElement(\"button\", \"kp-suggestion\", suggestion);\n button.type = \"button\";\n button.addEventListener(\"click\", async () => {\n await onClick(suggestion);\n });\n container.appendChild(button);\n }\n}\n\nfunction syncSuggestionButtons(\n view: ConversationView,\n suggestions: string[],\n onClick: (text: string) => Promise<void>\n): void {\n renderSuggestions(view.suggestions, suggestions, async (text) => {\n view.input.value = text;\n await onClick(text);\n });\n}\n\nfunction clearRenderedConversation(\n body: HTMLDivElement,\n hero: HTMLDivElement,\n suggestions: HTMLDivElement\n): void {\n const preservedNodes = new Set([hero, suggestions]);\n for (const child of Array.from(body.children)) {\n if (!preservedNodes.has(child as HTMLDivElement)) {\n child.remove();\n }\n }\n}\n\nfunction hidePromptsForConversation(view: ConversationView): void {\n view.body.classList.add(\"kp-conversation-active\");\n view.hero.remove();\n view.suggestions.remove();\n}\n\nfunction resetConversationView(view: ConversationView): void {\n view.body.classList.remove(\"kp-conversation-active\");\n\n if (!view.hero.isConnected) {\n view.body.prepend(view.hero);\n }\n\n if (!view.suggestions.isConnected) {\n view.body.appendChild(view.suggestions);\n }\n\n clearRenderedConversation(view.body, view.hero, view.suggestions);\n view.input.value = \"\";\n}\n\nfunction renderHistory(body: HTMLDivElement, messages: ChatHistoryMessage[]): void {\n for (const message of messages) {\n appendMessage(body, message.role === \"assistant\" ? \"bot\" : \"user\", message.text);\n }\n}\n\nfunction renderSidebarLists(\n recentContainer: HTMLDivElement,\n pinnedContainer: HTMLDivElement,\n state: WidgetState,\n onSelectChat: (chat: ChatListItem) => Promise<void>,\n onTogglePinned: (chat: ChatListItem) => Promise<void>\n): void {\n recentContainer.textContent = \"\";\n pinnedContainer.textContent = \"\";\n\n if (state.loadingChats) {\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", \"Loading chats...\"));\n return;\n }\n\n const filteredChats = state.chats.filter((chat) => {\n if (!state.chatSearchTerm) {\n return true;\n }\n\n return chat.title.toLowerCase().includes(state.chatSearchTerm);\n });\n\n if (filteredChats.length > 0) {\n const pinnedChats = filteredChats.filter((chat) => chat.pinned);\n const recentChats = filteredChats.filter((chat) => !chat.pinned).slice(0, 8);\n\n renderChatItems(recentContainer, recentChats, state.chatId, onSelectChat, onTogglePinned);\n renderChatItems(pinnedContainer, pinnedChats, state.chatId, onSelectChat, onTogglePinned);\n\n if (recentChats.length === 0) {\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", \"No recent chats yet.\"));\n }\n\n if (pinnedChats.length === 0) {\n pinnedContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", \"No pinned chats yet.\"));\n }\n\n return;\n }\n\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", \"No chats yet.\"));\n pinnedContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", \"No pinned chats yet.\"));\n}\n\nfunction renderChatItems(\n container: HTMLDivElement,\n chats: ChatListItem[],\n activeChatId: string,\n onSelectChat: (chat: ChatListItem) => Promise<void>,\n onTogglePinned: (chat: ChatListItem) => Promise<void>\n): void {\n for (const chat of chats) {\n const row = createElement(\n \"div\",\n `kp-full-page-item kp-full-page-chat-item${chat.chatId === activeChatId ? \" active\" : \"\"}`\n );\n\n const title = createElement(\"span\", \"kp-full-page-item-title\", chat.title);\n const pin = createElement(\"button\", \"kp-chat-pin\", chat.pinned ? \"★\" : \"☆\");\n pin.type = \"button\";\n pin.setAttribute(\"aria-label\", chat.pinned ? \"Unpin chat\" : \"Pin chat\");\n pin.addEventListener(\"click\", async (event) => {\n event.stopPropagation();\n await onTogglePinned(chat);\n });\n\n row.append(title, pin);\n row.setAttribute(\"role\", \"button\");\n row.tabIndex = 0;\n row.addEventListener(\"click\", async () => {\n await onSelectChat(chat);\n });\n row.addEventListener(\"keydown\", async (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n await onSelectChat(chat);\n }\n });\n container.appendChild(row);\n }\n}\n\nfunction buildChatTitle(message: string): string {\n return message.trim().slice(0, 60) || \"New Chat\";\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["browser_exports","__export","browserGlobal","createChatWidget","init","version","isRecord","value","mergeDeep","target","source","output","key","sourceValue","targetValue","normalizeError","error","joinUrl","baseUrl","path","buildHeaders","config","token","userContextHeader","resolveUserContextHeader","userContext","resolveEndpointUrl","path","params","resolvedPath","joinUrl","postMessage","payload","url","requestBody","response","data","firstAnswer","content","sourceDocuments","scores","pageNumbers","sheetNames","rowNumbers","knowledgeNames","citations","sourceDocument","index","fetchHistory","chatId","historyUrl","item","candidate","roleValue","textValue","loweredRole","message","fetchChats","chatIdValue","titleValue","createdAtValue","updatedAtValue","mapped","createChat","title","endpoint","updateChat","reportWidgetError","error","normalized","normalizeError","defaultTheme","defaultConfigValues","resolveConfig","config","mount","theme","mergeDeep","defaultTheme","defaultConfigValues","createElement","tagName","className","textContent","element","STYLE_ELEMENT_ID","ensureStyles","shadowRoot","theme","style","getCss","createChatWidget","config","resolvedConfig","resolveConfig","state","resolveChatId","host","shadowRoot","ensureStyles","shell","createElement","overlay","launcher","panel","header","toolbar","menuTrigger","dropdown","newChatAction","myChatsAction","openAssistantAction","headingWrap","title","subtitle","closeButton","body","hero","heroIcon","heroText","footer","form","input","sendButton","note","suggestions","panelView","fullPage","fullPageShell","fullPageHeader","fullPageBrand","fullPageMark","fullPageBrandText","fullPageHeaderActions","fullPageBadge","fullPageClose","fullPageBreadCrumb","fullPageContent","fullPageSidebar","fullPageNewChat","fullPageSearchWrap","fullPageSearchInput","fullPageSearchIcon","fullPageRecentLabel","fullPageRecentList","fullPagePinnedLabel","fullPagePinnedList","fullPageMain","fullPagePanel","fullPageBody","fullPageHero","fullPageHeroBadge","fullPageHeroText","fullPageSuggestions","fullPageFooter","fullPageForm","fullPageInput","fullPageSend","fullPageNote","fullPageView","getRuntimeConfig","syncSuggestionButtons","text","sendMessageToView","renderSidebarLists","chat","selectChat","togglePinnedChat","open","instance","close","closeMenu","message","view","trimmed","ensureChatExists","error","normalized","reportWidgetError","appendMessage","hidePromptsForConversation","loading","response","postMessage","resolveKnowledgeNames","refreshChats","sendMessage","targetView","openFullPage","loadHistoryIntoView","closeFullPage","openMenu","resetConversation","resetConversationView","resetFullPageConversation","chats","fetchChats","seedMessage","createChat","buildChatTitle","chatId","updateChat","messages","fetchHistory","clearRenderedConversation","renderHistory","handleEscapeKeydown","provider","event","target","names","kind","citationCount","bubble","meta","renderSuggestions","container","onClick","suggestion","button","preservedNodes","child","recentContainer","pinnedContainer","onSelectChat","onTogglePinned","filteredChats","pinnedChats","recentChats","renderChatItems","activeChatId","row","pin","version","init","createChatWidget","browserGlobal"]}
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts","../src/utils.ts","../src/api.ts","../src/defaults.ts","../src/config.ts","../src/dom.ts","../src/styles.ts","../src/widget.ts"],"sourcesContent":["import { createChatWidget } from \"./widget\";\nimport type { BrowserGlobal } from \"./types\";\n\nconst version = \"0.1.0\";\nconst init = createChatWidget;\n\nconst browserGlobal: BrowserGlobal = {\n init,\n createChatWidget,\n version\n};\n\ndeclare global {\n interface Window {\n ChatWidget?: BrowserGlobal;\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.ChatWidget = browserGlobal;\n}\n\nexport { browserGlobal, createChatWidget, init, version };\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function mergeDeep<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n const output = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = output[key];\n\n if (isRecord(targetValue) && isRecord(sourceValue)) {\n output[key] = mergeDeep(\n targetValue as Record<string, unknown>,\n sourceValue as Partial<Record<string, unknown>>\n ) as T[keyof T];\n continue;\n }\n\n if (sourceValue !== undefined) {\n output[key] = sourceValue as T[keyof T];\n }\n }\n\n return output;\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === \"string\") {\n return new Error(error);\n }\n\n return new Error(\"Unexpected widget error\");\n}\n\nexport function joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/$/, \"\")}/${path.replace(/^\\//, \"\")}`;\n}\n","import { joinUrl, normalizeError } from \"./utils\";\nimport type {\n ChatListItem,\n ChatHistoryMessage,\n ResolvedChatWidgetConfig,\n SendMessageRequest,\n SendMessageResponse\n} from \"./types\";\n\ntype RagResponseItem = {\n answer?: string;\n content?: {\n source_documents?: Array<string | null>;\n scores?: Array<number | null> | null;\n page_numbers?: Array<number | null> | null;\n sheet_names?: Array<string | null> | null;\n row_numbers?: Array<number | null> | null;\n knowledge_names?: Array<string | null> | null;\n };\n};\n\ntype AdapterMessageResponse = {\n chatId?: string;\n answer?: string;\n suggestions?: string[];\n citations?: SendMessageResponse[\"citations\"];\n};\n\ntype EndpointParams = {\n chatId?: string;\n};\n\nfunction buildHeaders(\n config: ResolvedChatWidgetConfig,\n token: string | null,\n userContextHeader?: string | null\n): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n ...config.customHeaders,\n ...(userContextHeader ? { \"X-Chat-User-Context\": userContextHeader } : {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {})\n };\n}\n\nasync function resolveUserContextHeader(\n config: ResolvedChatWidgetConfig\n): Promise<string | null> {\n if (!config.getUserContext) {\n return null;\n }\n\n const userContext = await config.getUserContext();\n\n if (!userContext) {\n return null;\n }\n\n return JSON.stringify(userContext);\n}\n\nfunction resolveEndpointUrl(\n config: ResolvedChatWidgetConfig,\n path: string,\n params: EndpointParams = {}\n): string {\n const resolvedPath = path\n .replace(/\\{chatId\\}/g, encodeURIComponent(params.chatId ?? \"\"))\n .replace(/:chatId\\b/g, encodeURIComponent(params.chatId ?? \"\"));\n\n return joinUrl(config.apiBaseUrl, resolvedPath);\n}\n\nexport async function postMessage(\n config: ResolvedChatWidgetConfig,\n payload: SendMessageRequest\n): Promise<SendMessageResponse> {\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const url = resolveEndpointUrl(config, config.endpoints.ask, {\n chatId: payload.chatId\n });\n const usesChatPath = /(\\{chatId\\}|:chatId\\b)/.test(config.endpoints.ask);\n const requestBody = usesChatPath\n ? {\n message: payload.message,\n knowledgeNames: payload.knowledgeNames,\n editLastQa: payload.editLastQa ?? false,\n enableReferences: payload.enableReferences ?? true\n }\n : {\n query: payload.message,\n chat_id: payload.chatId,\n knowledge_names: payload.knowledgeNames,\n edit_last_qa: payload.editLastQa ?? false,\n enable_references: payload.enableReferences ?? true\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Chat backend returned ${response.status}.`);\n }\n\n const data = (await response.json()) as RagResponseItem[] | AdapterMessageResponse;\n\n if (!Array.isArray(data)) {\n if (!data.answer || typeof data.answer !== \"string\") {\n throw new Error(\"Chat backend response is missing a valid answer.\");\n }\n\n return {\n chatId: data.chatId ?? payload.chatId,\n answer: data.answer,\n suggestions: data.suggestions ?? [],\n citations: data.citations ?? []\n };\n }\n\n const firstAnswer = data[0];\n\n if (!firstAnswer?.answer || typeof firstAnswer.answer !== \"string\") {\n throw new Error(\"Chat backend response is missing a valid answer.\");\n }\n\n const content = firstAnswer.content;\n const sourceDocuments = content?.source_documents ?? [];\n const scores = content?.scores ?? [];\n const pageNumbers = content?.page_numbers ?? [];\n const sheetNames = content?.sheet_names ?? [];\n const rowNumbers = content?.row_numbers ?? [];\n const knowledgeNames = content?.knowledge_names ?? [];\n\n const citations = sourceDocuments.map((sourceDocument, index) => ({\n sourceDocument,\n score: scores[index] ?? null,\n pageNumber: pageNumbers[index] ?? null,\n sheetName: sheetNames[index] ?? null,\n rowNumber: rowNumbers[index] ?? null,\n knowledgeName: knowledgeNames[index] ?? null\n }));\n\n return {\n chatId: payload.chatId,\n answer: firstAnswer.answer,\n suggestions: [],\n citations\n };\n}\n\nexport async function fetchHistory(\n config: ResolvedChatWidgetConfig,\n chatId: string\n): Promise<ChatHistoryMessage[]> {\n if (!config.endpoints.history) {\n return [];\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const usesChatPath = /(\\{chatId\\}|:chatId\\b)/.test(config.endpoints.history);\n const url = usesChatPath\n ? resolveEndpointUrl(config, config.endpoints.history, { chatId })\n : (() => {\n const historyUrl = new URL(joinUrl(config.apiBaseUrl, config.endpoints.history!));\n historyUrl.searchParams.set(\"chat_id\", chatId);\n return historyUrl.toString();\n })();\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: buildHeaders(config, token, userContextHeader)\n });\n\n if (!response.ok) {\n throw new Error(`Chat history endpoint returned ${response.status}.`);\n }\n\n const data = (await response.json()) as unknown;\n const historyItems = Array.isArray(data)\n ? data\n : data && typeof data === \"object\"\n ? (data as Record<string, unknown>).history ??\n (data as Record<string, unknown>).messages ??\n (data as Record<string, unknown>).data ??\n []\n : [];\n\n if (!Array.isArray(historyItems)) {\n return [];\n }\n\n return historyItems\n .map((item) => {\n if (!item || typeof item !== \"object\") {\n return null;\n }\n\n const candidate = item as Record<string, unknown>;\n if (\n typeof candidate.question === \"string\" &&\n typeof candidate.answer === \"string\"\n ) {\n return [\n {\n role: \"user\",\n text: candidate.question\n },\n {\n role: \"assistant\",\n text: candidate.answer\n }\n ] satisfies ChatHistoryMessage[];\n }\n\n const roleValue =\n candidate.role ?? candidate.type ?? candidate.sender ?? candidate.author;\n const textValue =\n candidate.text ?? candidate.message ?? candidate.content ?? candidate.answer;\n\n if (typeof textValue !== \"string\") {\n return null;\n }\n\n const loweredRole =\n typeof roleValue === \"string\" ? roleValue.toLowerCase() : \"assistant\";\n\n return [\n {\n role:\n loweredRole === \"user\" || loweredRole === \"human\"\n ? \"user\"\n : \"assistant\",\n text: textValue\n }\n ] satisfies ChatHistoryMessage[];\n })\n .flat()\n .filter((message): message is ChatHistoryMessage => Boolean(message));\n}\n\nexport async function fetchChats(\n config: ResolvedChatWidgetConfig\n): Promise<ChatListItem[]> {\n if (!config.endpoints.listChats) {\n return [];\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const response = await fetch(joinUrl(config.apiBaseUrl, config.endpoints.listChats), {\n method: \"GET\",\n headers: buildHeaders(config, token, userContextHeader)\n });\n\n if (!response.ok) {\n throw new Error(`Chat list endpoint returned ${response.status}.`);\n }\n\n const data = (await response.json()) as unknown;\n const chatItems = Array.isArray(data)\n ? data\n : data && typeof data === \"object\"\n ? (data as Record<string, unknown>).chats ??\n (data as Record<string, unknown>).data ??\n (data as Record<string, unknown>).items ??\n []\n : [];\n\n if (!Array.isArray(chatItems)) {\n return [];\n }\n\n return chatItems\n .map((item) => {\n if (!item || typeof item !== \"object\") {\n return null;\n }\n\n const candidate = item as Record<string, unknown>;\n const chatIdValue = candidate.chatId ?? candidate.chat_id ?? candidate.id;\n const titleValue = candidate.title ?? candidate.name ?? candidate.chatId;\n\n if (typeof chatIdValue !== \"string\" || typeof titleValue !== \"string\") {\n return null;\n }\n\n const createdAtValue =\n typeof candidate.createdAt === \"string\"\n ? candidate.createdAt\n : typeof candidate.created_at === \"string\"\n ? candidate.created_at\n : null;\n const updatedAtValue =\n typeof candidate.updatedAt === \"string\"\n ? candidate.updatedAt\n : typeof candidate.updated_at === \"string\"\n ? candidate.updated_at\n : null;\n\n const mapped: ChatListItem = {\n chatId: chatIdValue,\n title: titleValue,\n pinned: typeof candidate.pinned === \"boolean\" ? candidate.pinned : false\n };\n\n if (createdAtValue) {\n mapped.createdAt = createdAtValue;\n }\n\n if (updatedAtValue) {\n mapped.updatedAt = updatedAtValue;\n }\n\n return mapped;\n })\n .filter((item): item is ChatListItem => Boolean(item));\n}\n\nexport async function createChat(\n config: ResolvedChatWidgetConfig,\n chatId: string,\n title?: string\n): Promise<void> {\n const endpoint = config.endpoints.createChat ?? config.endpoints.listChats;\n\n if (!endpoint) {\n return;\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const response = await fetch(joinUrl(config.apiBaseUrl, endpoint), {\n method: \"POST\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify({\n chatId,\n ...(title ? { title } : {})\n })\n });\n\n if (!response.ok) {\n throw new Error(`Create chat endpoint returned ${response.status}.`);\n }\n}\n\nexport async function updateChat(\n config: ResolvedChatWidgetConfig,\n chatId: string,\n payload: {\n pinned?: boolean;\n title?: string;\n }\n): Promise<void> {\n if (!config.endpoints.updateChat) {\n return;\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const url = resolveEndpointUrl(config, config.endpoints.updateChat, { chatId });\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: buildHeaders(config, token, userContextHeader),\n body: JSON.stringify(payload)\n });\n\n if (!response.ok) {\n throw new Error(`Update chat endpoint returned ${response.status}.`);\n }\n}\n\nexport async function deleteChat(\n config: ResolvedChatWidgetConfig,\n chatId: string\n): Promise<void> {\n if (!config.endpoints.deleteChat) {\n return;\n }\n\n const token = config.getAccessToken ? await config.getAccessToken() : null;\n const userContextHeader = await resolveUserContextHeader(config);\n const url = resolveEndpointUrl(config, config.endpoints.deleteChat, { chatId });\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: buildHeaders(config, token, userContextHeader)\n });\n\n if (!response.ok) {\n throw new Error(`Delete chat endpoint returned ${response.status}.`);\n }\n}\n\nexport function reportWidgetError(\n config: ResolvedChatWidgetConfig,\n error: unknown\n): Error {\n const normalized = normalizeError(error);\n config.onError?.(normalized);\n return normalized;\n}\n","import type { ChatWidgetTheme, ResolvedChatWidgetConfig } from \"./types\";\n\nexport const defaultTheme: ChatWidgetTheme = {\n accent: \"#0f766e\",\n accentSoft: \"#ecfeff\",\n panelBackground: \"#ffffff\",\n surfaceBackground: \"#f8fafc\",\n text: \"#1f2937\",\n mutedText: \"#64748b\",\n borderColor: \"#dbe4ee\",\n shadow: \"0 24px 64px rgba(15, 23, 42, 0.20)\",\n zIndex: 2147483000,\n fontFamily:\n \"\\\"Segoe UI\\\", -apple-system, BlinkMacSystemFont, \\\"Helvetica Neue\\\", sans-serif\"\n};\n\nexport const defaultConfigValues: Omit<\n ResolvedChatWidgetConfig,\n \"apiBaseUrl\" | \"endpoints\" | \"mount\"\n> = {\n position: \"bottom-right\",\n title: \"Knowledge Assistant\",\n subtitle: \"Answers are generated based on your access permissions\",\n welcomeMessage: \"How can I assist you today?\",\n inputPlaceholder: \"Ask your question...\",\n launcherAriaLabel: \"Open chat assistant\",\n closeAriaLabel: \"Close chat assistant\",\n initialSuggestions: [\n \"Which indicators reflect the achievements of Vision KSA goals?\",\n \"Case studies of real estate initiatives for economic growth\",\n \"Study of UX for the ministry external portal\"\n ],\n sourceApp: \"knowledge-platform\",\n locale: \"en\",\n customHeaders: {},\n rag: {\n knowledgeNames: [],\n enableReferences: true,\n loadHistoryOnOpen: false\n },\n theme: defaultTheme,\n getAccessToken: undefined,\n getUserContext: undefined,\n onOpen: undefined,\n onClose: undefined,\n onError: undefined\n};\n","import { defaultConfigValues, defaultTheme } from \"./defaults\";\nimport { mergeDeep } from \"./utils\";\nimport type { ChatWidgetConfig, ResolvedChatWidgetConfig } from \"./types\";\n\nexport function resolveConfig(config: ChatWidgetConfig): ResolvedChatWidgetConfig {\n if (!config.apiBaseUrl?.trim()) {\n throw new Error(\"Chat widget config requires a non-empty apiBaseUrl.\");\n }\n\n if (!config.endpoints?.ask?.trim()) {\n throw new Error(\"Chat widget config requires endpoints.ask to be provided.\");\n }\n\n const mount = config.mount ?? document.body;\n const theme = mergeDeep(defaultTheme, config.theme ?? {});\n\n return {\n apiBaseUrl: config.apiBaseUrl,\n endpoints: {\n ...config.endpoints\n },\n mount,\n position: config.position ?? defaultConfigValues.position,\n title: config.title ?? defaultConfigValues.title,\n subtitle: config.subtitle ?? defaultConfigValues.subtitle,\n welcomeMessage: config.welcomeMessage ?? defaultConfigValues.welcomeMessage,\n inputPlaceholder:\n config.inputPlaceholder ?? defaultConfigValues.inputPlaceholder,\n launcherAriaLabel:\n config.launcherAriaLabel ?? defaultConfigValues.launcherAriaLabel,\n closeAriaLabel: config.closeAriaLabel ?? defaultConfigValues.closeAriaLabel,\n initialSuggestions:\n config.initialSuggestions ?? defaultConfigValues.initialSuggestions,\n sourceApp: config.sourceApp ?? defaultConfigValues.sourceApp,\n locale: config.locale ?? defaultConfigValues.locale,\n customHeaders: config.customHeaders ?? defaultConfigValues.customHeaders,\n rag: {\n ...defaultConfigValues.rag,\n ...(config.rag ?? {})\n },\n theme,\n getAccessToken: config.getAccessToken,\n getUserContext: config.getUserContext,\n onOpen: config.onOpen,\n onClose: config.onClose,\n onError: config.onError\n };\n}\n","export function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n textContent?: string\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n\n if (className) {\n element.className = className;\n }\n\n if (textContent !== undefined) {\n element.textContent = textContent;\n }\n\n return element;\n}\n","import type { ChatWidgetTheme } from \"./types\";\n\nconst STYLE_ELEMENT_ID = \"kp-chat-widget-styles\";\n\nexport function ensureStyles(shadowRoot: ShadowRoot, theme: ChatWidgetTheme): void {\n if (shadowRoot.getElementById(STYLE_ELEMENT_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ELEMENT_ID;\n style.textContent = getCss(theme);\n shadowRoot.appendChild(style);\n}\n\nfunction getCss(theme: ChatWidgetTheme): string {\n return `\n :host {\n all: initial;\n }\n\n .kp-chat-widget {\n --kp-accent: ${theme.accent};\n --kp-accent-soft: ${theme.accentSoft};\n --kp-panel-background: ${theme.panelBackground};\n --kp-surface-background: ${theme.surfaceBackground};\n --kp-text: ${theme.text};\n --kp-muted-text: ${theme.mutedText};\n --kp-border-color: ${theme.borderColor};\n --kp-shadow: ${theme.shadow};\n --kp-z-index: ${theme.zIndex};\n --kp-font-family: ${theme.fontFamily};\n --kp-card-background: rgba(255, 255, 255, 0.92);\n --kp-soft-highlight: rgba(236, 254, 255, 0.82);\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: var(--kp-z-index);\n font-family: var(--kp-font-family);\n color: var(--kp-text);\n box-sizing: border-box;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n font-family: inherit;\n }\n\n .kp-chat-widget.bottom-left {\n left: 24px;\n right: auto;\n }\n\n .kp-rtl .kp-dropdown-item,\n .kp-rtl .kp-suggestion,\n .kp-rtl .kp-input,\n .kp-rtl .kp-full-page-search-input,\n .kp-rtl .kp-bubble-content,\n .kp-rtl .kp-source-card,\n .kp-rtl .kp-source-panel {\n text-align: right;\n }\n\n .kp-launcher {\n width: 72px;\n height: 72px;\n border: none;\n border-radius: 999px;\n cursor: pointer;\n background: radial-gradient(circle at 30% 30%, #f8fffe 0%, #ecfdf5 52%, #d6f4ef 100%);\n box-shadow: 0 16px 32px rgba(15, 118, 110, 0.18);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 140ms ease, box-shadow 140ms ease, opacity 140ms ease;\n color: var(--kp-accent);\n position: relative;\n overflow: hidden;\n }\n\n .kp-launcher:hover {\n transform: translateY(-1px);\n box-shadow: 0 20px 36px rgba(15, 118, 110, 0.22);\n }\n\n .kp-launcher:focus-visible,\n .kp-close:focus-visible,\n .kp-send:focus-visible,\n .kp-suggestion:focus-visible,\n .kp-input:focus-visible,\n .kp-full-page-new-chat:focus-visible,\n .kp-full-page-close:focus-visible,\n .kp-full-page-chat-item:focus-visible,\n .kp-chat-pin:focus-visible,\n .kp-message-action:focus-visible,\n .kp-source-chip:focus-visible,\n .kp-source-panel-close:focus-visible {\n outline: 2px solid var(--kp-accent);\n outline-offset: 2px;\n }\n\n .kp-launcher.hidden {\n opacity: 0;\n pointer-events: none;\n transform: translateY(8px) scale(0.96);\n }\n\n .kp-star-cluster {\n position: relative;\n width: 50px;\n height: 50px;\n animation: kp-cluster-rotate 8.5s linear infinite;\n }\n\n .kp-star {\n position: absolute;\n color: #08384c;\n line-height: 1;\n transform-origin: center;\n }\n\n .kp-star.main {\n top: 50%;\n left: 50%;\n font-size: 30px;\n transform: translate(-50%, -50%) scale(0.96);\n animation: kp-main-pulse 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-a {\n top: -3px;\n left: 50%;\n font-size: 18px;\n transform: translateX(-50%);\n animation: kp-orbit-a 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-b {\n right: -3px;\n bottom: 5px;\n font-size: 18px;\n animation: kp-orbit-b 3s ease-in-out infinite;\n }\n\n .kp-star.orbit-c {\n left: -1px;\n bottom: 5px;\n font-size: 18px;\n animation: kp-orbit-c 3s ease-in-out infinite;\n }\n\n .kp-overlay {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.18);\n opacity: 0;\n pointer-events: none;\n transition: opacity 220ms ease;\n }\n\n .kp-overlay.visible {\n opacity: 1;\n pointer-events: auto;\n }\n\n .kp-panel {\n position: fixed;\n bottom: 88px;\n right: 24px;\n width: min(480px, calc(100vw - 48px));\n height: min(730px, calc(100vh - 118px));\n background: var(--kp-panel-background);\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-radius: 24px;\n box-shadow: var(--kp-shadow);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n opacity: 0;\n transform: translateX(112px) scale(0.97);\n transform-origin: bottom right;\n pointer-events: none;\n transition: opacity 420ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 620ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n .kp-chat-widget.bottom-left .kp-panel {\n left: 24px;\n right: auto;\n transform: translateX(-112px) scale(0.97);\n transform-origin: bottom left;\n }\n\n .kp-panel.open {\n opacity: 1;\n transform: translateX(0) scale(1);\n pointer-events: auto;\n }\n\n .kp-full-page {\n position: fixed;\n inset: 0;\n background: #ffffff;\n opacity: 0;\n pointer-events: none;\n transform: translateY(18px);\n transition: opacity 260ms ease, transform 320ms ease;\n z-index: calc(var(--kp-z-index) + 2);\n overflow: hidden;\n }\n\n .kp-full-page.open {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0);\n }\n\n .kp-full-page-shell {\n height: 100vh;\n display: flex;\n flex-direction: column;\n padding: 22px 28px 26px;\n gap: 16px;\n overflow: hidden;\n }\n\n .kp-full-page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 8px 4px 0;\n flex: none;\n }\n\n .kp-full-page-brand {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #08384c;\n }\n\n .kp-full-page-brand-mark {\n width: 44px;\n height: 44px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, rgba(37, 181, 192, 0.14), rgba(15, 118, 110, 0.08));\n font-size: 26px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n\n .kp-full-page-brand-text {\n font-size: 20px;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: #16394b;\n }\n\n .kp-full-page-header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .kp-full-page-badge {\n padding: 10px 14px;\n border-radius: 999px;\n font-size: 13px;\n line-height: 1;\n color: #0b556c;\n background: rgba(255, 255, 255, 0.82);\n border: 1px solid rgba(15, 118, 110, 0.12);\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);\n }\n\n .kp-full-page-close,\n .kp-source-panel-close {\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 14px;\n background: rgba(255, 255, 255, 0.82);\n color: #61788a;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);\n }\n\n .kp-full-page-content {\n display: grid;\n grid-template-columns: 290px minmax(0, 1fr) minmax(0, 0);\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n align-items: stretch;\n }\n\n .kp-full-page-sidebar,\n .kp-full-page-panel,\n .kp-source-panel {\n border-radius: 24px;\n border: 1px solid rgba(219, 228, 238, 0.9);\n background: rgba(255, 255, 255, 0.88);\n box-shadow: 0 20px 60px rgba(15, 23, 42, 0.08);\n backdrop-filter: blur(12px);\n }\n\n .kp-full-page-sidebar {\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-height: 0;\n overflow: auto;\n }\n\n .kp-full-page-new-chat {\n width: 100%;\n height: 48px;\n border: none;\n border-radius: 12px;\n background: linear-gradient(135deg, #0a465d 0%, #0f6a75 100%);\n color: #ffffff;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n box-shadow: 0 14px 30px rgba(10, 70, 93, 0.18);\n }\n\n .kp-full-page-search {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 44px;\n border-radius: 12px;\n border: 1px solid rgba(203, 213, 225, 0.95);\n background: #ffffff;\n padding: 0 12px;\n }\n\n .kp-full-page-search-input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n color: #334155;\n font-size: 14px;\n min-width: 0;\n box-shadow: none;\n }\n\n .kp-full-page-search-input:focus,\n .kp-full-page-search-input:focus-visible,\n .kp-full-page-search-input:active {\n outline: none;\n box-shadow: none;\n border: none;\n }\n\n .kp-full-page-search-icon {\n color: #607082;\n font-size: 20px;\n line-height: 1;\n }\n\n .kp-full-page-section-label {\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: #8a98a6;\n margin-top: 4px;\n }\n\n .kp-full-page-recent-list,\n .kp-full-page-pinned-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .kp-full-page-item {\n padding: 12px 12px 13px;\n border-radius: 14px;\n color: #293845;\n font-size: 15px;\n line-height: 1.5;\n background: rgba(247, 250, 252, 0.9);\n border: 1px solid rgba(219, 228, 238, 0.88);\n }\n\n .kp-full-page-chat-item {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n cursor: pointer;\n transition: border-color 140ms ease, background 140ms ease, transform 140ms ease;\n overflow: visible;\n }\n\n .kp-full-page-chat-item:hover {\n border-color: rgba(15, 118, 110, 0.34);\n background: rgba(240, 253, 250, 0.95);\n transform: translateY(-1px);\n }\n\n .kp-full-page-chat-item.active {\n border-color: rgba(15, 118, 110, 0.5);\n background: rgba(220, 252, 231, 0.72);\n }\n\n .kp-full-page-chat-item.menu-open {\n z-index: 4;\n }\n\n .kp-full-page-item-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n }\n\n .kp-chat-pin {\n flex: none;\n border: none;\n background: transparent;\n color: #0f6a75;\n font-size: 16px;\n line-height: 1;\n padding: 0;\n cursor: pointer;\n }\n\n .kp-full-page-empty {\n padding: 8px 4px 0;\n color: #7a8a99;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .kp-full-page-main {\n min-width: 0;\n min-height: 0;\n display: flex;\n }\n\n .kp-full-page-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n .kp-source-panel {\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n display: none;\n flex-direction: column;\n }\n\n .kp-source-panel.open {\n display: flex;\n }\n\n .kp-full-page-content:has(.kp-source-panel.open) {\n grid-template-columns: 290px minmax(0, 1fr) 320px;\n }\n\n .kp-source-panel-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding: 18px 18px 12px;\n border-bottom: 1px solid rgba(219, 228, 238, 0.7);\n }\n\n .kp-source-panel-title {\n font-size: 17px;\n font-weight: 700;\n color: #16394b;\n }\n\n .kp-source-panel-subtitle {\n margin-top: 4px;\n font-size: 12px;\n color: #7a8a99;\n }\n\n .kp-source-panel-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n overflow: auto;\n }\n\n .kp-source-panel-empty {\n color: #7a8a99;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .kp-source-card {\n width: 100%;\n text-align: left;\n cursor: pointer;\n appearance: none;\n border: 1px solid rgba(219, 228, 238, 0.9);\n border-radius: 16px;\n background: #ffffff;\n padding: 14px;\n }\n\n .kp-source-card-media {\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n }\n\n .kp-source-thumb,\n .kp-source-thumb-large {\n flex: none;\n width: 32px;\n height: 32px;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(180deg, #eefcf8 0%, #dff7f2 100%);\n border: 1px solid rgba(15, 118, 110, 0.18);\n color: #0f6a75;\n font-size: 14px;\n line-height: 1;\n box-shadow: 0 6px 16px rgba(15, 23, 42, 0.08);\n }\n\n .kp-source-thumb-large {\n width: 42px;\n height: 42px;\n font-size: 18px;\n }\n\n .kp-source-card-title {\n font-size: 14px;\n font-weight: 700;\n color: #16394b;\n word-break: break-word;\n }\n\n .kp-source-card-meta {\n margin-top: 8px;\n font-size: 12px;\n line-height: 1.5;\n color: #667a8d;\n word-break: break-word;\n }\n\n .kp-full-page-body {\n flex: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 42px 28px 18px;\n background: #ffffff;\n scroll-behavior: smooth;\n }\n\n .kp-full-page-body.kp-conversation-active {\n padding-top: 24px;\n }\n\n .kp-full-page-hero {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 22px;\n padding: 18px 18px 12px;\n max-width: 880px;\n width: 100%;\n margin: 0 auto;\n }\n\n .kp-full-page-hero-badge {\n width: 140px;\n height: 140px;\n border-radius: 999px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: radial-gradient(circle at 30% 30%, #f8fdff 0%, #edf8ff 50%, #e4eef8 100%);\n box-shadow:\n inset 0 2px 0 rgba(255, 255, 255, 0.9),\n 0 22px 40px rgba(15, 23, 42, 0.08);\n }\n\n .kp-star-cluster-static {\n animation: none;\n }\n\n .kp-full-page-hero-text {\n max-width: 760px;\n font-size: 26px;\n line-height: 1.5;\n font-weight: 700;\n letter-spacing: -0.03em;\n color: #374151;\n }\n\n .kp-full-page-suggestions {\n width: min(520px, 100%);\n margin: auto auto 0;\n }\n\n .kp-full-page-footer {\n flex: none;\n padding: 0 16px 18px;\n background: rgba(255, 255, 255, 0.72);\n border-top: 1px solid rgba(219, 228, 238, 0.75);\n }\n\n .kp-full-page-form {\n max-width: none;\n min-height: 56px;\n border-radius: 16px;\n }\n\n .kp-full-page-note {\n font-size: 13px;\n margin-top: 10px;\n }\n\n .kp-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n padding: 18px 18px 8px;\n background: linear-gradient(180deg, #ffffff 0%, #fbfdff 100%);\n }\n\n .kp-toolbar {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .kp-tool-button {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 12px;\n background: transparent;\n color: #0f4f68;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n transition: background 140ms ease;\n }\n\n .kp-tool-button:hover {\n background: rgba(15, 118, 110, 0.08);\n }\n\n .kp-pencil-icon {\n width: 22px;\n height: 22px;\n position: relative;\n display: inline-block;\n }\n\n .kp-pencil-icon::before {\n content: \"\";\n position: absolute;\n width: 14px;\n height: 2.5px;\n background: currentColor;\n border-radius: 999px;\n transform: rotate(-45deg);\n top: 3px;\n right: 1px;\n }\n\n .kp-pencil-icon::after {\n content: \"\";\n position: absolute;\n left: 2px;\n bottom: 2px;\n width: 11px;\n height: 11px;\n border: 2px solid currentColor;\n border-radius: 4px;\n }\n\n .kp-chevron {\n font-size: 13px;\n color: #66839a;\n transition: transform 160ms ease;\n margin-left: -2px;\n }\n\n .kp-menu-trigger.open .kp-chevron {\n transform: rotate(180deg);\n }\n\n .kp-dropdown {\n position: absolute;\n top: 44px;\n left: 0;\n width: 184px;\n background: #ffffff;\n border: 1px solid rgba(15, 79, 104, 0.12);\n border-radius: 10px;\n box-shadow: 0 18px 40px rgba(15, 23, 42, 0.16);\n padding: 8px;\n opacity: 0;\n transform: translateY(-6px);\n pointer-events: none;\n transition: opacity 180ms ease, transform 180ms ease;\n z-index: 2;\n }\n\n .kp-rtl .kp-dropdown {\n left: auto;\n right: 0;\n }\n\n .kp-dropdown.open {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n }\n\n .kp-dropdown-item {\n width: 100%;\n border: none;\n background: transparent;\n text-align: left;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 14px;\n color: var(--kp-text);\n cursor: pointer;\n }\n\n .kp-dropdown-item:hover {\n background: rgba(15, 118, 110, 0.08);\n }\n\n .kp-title-wrap {\n display: none;\n }\n\n .kp-close {\n border: none;\n background: transparent;\n font-size: 24px;\n line-height: 1;\n color: var(--kp-muted-text);\n cursor: pointer;\n padding: 0;\n }\n\n .kp-body {\n flex: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 10px 16px 16px;\n background: linear-gradient(180deg, #ffffff 0%, var(--kp-surface-background) 100%);\n scroll-behavior: smooth;\n }\n\n .kp-body.kp-conversation-active {\n padding-top: 16px;\n }\n\n .kp-panel.kp-sheet-open .kp-body,\n .kp-panel.kp-sheet-open .kp-footer,\n .kp-panel.kp-sheet-open .kp-header {\n opacity: 0;\n pointer-events: none;\n }\n\n .kp-my-chats-sheet {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n border: none;\n background: #ffffff;\n box-shadow: none;\n display: none;\n flex-direction: column;\n z-index: 3;\n overflow: hidden;\n }\n\n .kp-my-chats-sheet.open {\n display: flex;\n }\n\n .kp-my-chats-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 18px 10px;\n flex: none;\n background: #ffffff;\n }\n\n .kp-my-chats-nav {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: #61788a;\n font-size: 22px;\n line-height: 1;\n cursor: pointer;\n }\n\n .kp-my-chats-body {\n flex: 1;\n overflow: auto;\n padding: 8px 18px 18px;\n background: #ffffff;\n }\n\n .kp-my-chats-section-label {\n font-size: 14px;\n line-height: 1.5;\n color: #7a8a99;\n margin: 14px 0 10px;\n }\n\n .kp-my-chats-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .kp-chat-actions {\n position: relative;\n flex: none;\n }\n\n .kp-chat-actions-trigger {\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: #526678;\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .kp-chat-actions-menu {\n position: absolute;\n top: 30px;\n inset-inline-end: 0;\n width: 120px;\n padding: 8px;\n border-radius: 10px;\n border: 1px solid rgba(219, 228, 238, 0.95);\n background: #ffffff;\n box-shadow: 0 16px 40px rgba(15, 23, 42, 0.14);\n display: none;\n flex-direction: column;\n gap: 2px;\n z-index: 20;\n }\n\n .kp-chat-actions.open .kp-chat-actions-menu {\n display: flex;\n }\n\n .kp-chat-actions-item {\n width: 100%;\n border: none;\n background: transparent;\n color: #1f2937;\n text-align: left;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .kp-chat-actions-item:hover {\n background: rgba(241, 245, 249, 0.95);\n }\n\n .kp-hero {\n display: flex;\n gap: 10px;\n padding: 4px 2px 8px;\n align-items: flex-start;\n }\n\n .kp-hero-icon {\n color: #0ea5b7;\n font-size: 28px;\n line-height: 1;\n margin-top: 2px;\n }\n\n .kp-hero-text {\n font-size: 20px;\n line-height: 1.45;\n font-weight: 700;\n color: #374151;\n }\n\n .kp-message-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n width: 100%;\n }\n\n .kp-message-row.user {\n justify-content: flex-end;\n }\n\n .kp-avatar {\n flex: none;\n width: 36px;\n height: 36px;\n border-radius: 999px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 700;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6);\n }\n\n .kp-avatar.bot {\n background: linear-gradient(180deg, #e8fbff 0%, #dff7f2 100%);\n color: #0f6a75;\n border: 1px solid rgba(15, 118, 110, 0.16);\n }\n\n .kp-avatar.user {\n background: linear-gradient(180deg, #fff4ee 0%, #fbe3d5 100%);\n color: #8c4b1f;\n border: 1px solid rgba(180, 102, 43, 0.16);\n }\n\n .kp-bubble {\n max-width: min(85%, 720px);\n padding: 14px 16px;\n border-radius: 20px;\n font-size: 14px;\n line-height: 1.65;\n border: 1px solid var(--kp-border-color);\n background: #ffffff;\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.04);\n }\n\n .kp-bubble.user {\n background: linear-gradient(180deg, #fff8f3 0%, #fdf1e8 100%);\n border-color: rgba(222, 184, 135, 0.34);\n }\n\n .kp-bubble.bot {\n background: linear-gradient(180deg, #ffffff 0%, #fbfdff 100%);\n }\n\n .kp-bubble-content {\n color: var(--kp-text);\n white-space: normal;\n word-break: break-word;\n }\n\n .kp-bubble-content p,\n .kp-bubble-content ul,\n .kp-bubble-content ol,\n .kp-bubble-content table,\n .kp-bubble-content blockquote {\n margin: 0;\n }\n\n .kp-bubble-content p + p,\n .kp-bubble-content p + ul,\n .kp-bubble-content p + ol,\n .kp-bubble-content ul + p,\n .kp-bubble-content ol + p,\n .kp-bubble-content .kp-table-wrap + p,\n .kp-bubble-content p + .kp-table-wrap,\n .kp-bubble-content h1 + p,\n .kp-bubble-content h2 + p,\n .kp-bubble-content h3 + p {\n margin-top: 12px;\n }\n\n .kp-bubble-content h1,\n .kp-bubble-content h2,\n .kp-bubble-content h3,\n .kp-bubble-content h4,\n .kp-bubble-content h5,\n .kp-bubble-content h6 {\n margin: 0 0 10px;\n font-size: 16px;\n line-height: 1.4;\n color: #16394b;\n }\n\n .kp-bubble-content ul,\n .kp-bubble-content ol {\n padding-inline-start: 20px;\n }\n\n .kp-bubble-content code {\n padding: 2px 6px;\n border-radius: 8px;\n background: rgba(226, 232, 240, 0.66);\n font-size: 0.92em;\n }\n\n .kp-bubble-content a {\n color: #0f6a75;\n text-decoration: underline;\n }\n\n .kp-table-wrap {\n overflow-x: auto;\n margin-top: 8px;\n }\n\n .kp-bubble-content table {\n width: 100%;\n border-collapse: collapse;\n border: 1px solid rgba(203, 213, 225, 0.95);\n border-radius: 14px;\n overflow: hidden;\n background: #ffffff;\n }\n\n .kp-bubble-content th,\n .kp-bubble-content td {\n padding: 10px 12px;\n border-bottom: 1px solid rgba(226, 232, 240, 0.95);\n border-inline-end: 1px solid rgba(226, 232, 240, 0.95);\n vertical-align: top;\n text-align: start;\n }\n\n .kp-bubble-content tr:last-child td {\n border-bottom: none;\n }\n\n .kp-bubble-content th:last-child,\n .kp-bubble-content td:last-child {\n border-inline-end: none;\n }\n\n .kp-bubble-content th {\n background: #f4fbfc;\n color: #16394b;\n font-weight: 700;\n }\n\n .kp-meta {\n font-size: 11px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n margin-top: 10px;\n }\n\n .kp-source-preview {\n margin-top: 10px;\n padding: 12px;\n border-radius: 16px;\n border: 1px solid rgba(219, 228, 238, 0.88);\n background: #ffffff;\n }\n\n .kp-source-preview-title {\n font-size: 12px;\n font-weight: 700;\n color: #16394b;\n margin-bottom: 8px;\n }\n\n .kp-source-preview-list {\n display: flex;\n flex-wrap: nowrap;\n gap: 8px;\n overflow-x: auto;\n }\n\n .kp-source-chip {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n border: 1px solid rgba(15, 118, 110, 0.16);\n background: #ffffff;\n color: #0f4f68;\n border-radius: 999px;\n padding: 8px 12px;\n cursor: pointer;\n font-size: 12px;\n line-height: 1.3;\n max-width: 100%;\n min-width: 0;\n }\n\n .kp-source-chip-more {\n background: rgba(236, 254, 255, 0.9);\n }\n\n .kp-source-chip-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .kp-source-thumb-stack {\n display: inline-flex;\n align-items: center;\n margin-inline-end: 2px;\n }\n\n .kp-source-thumb.stacked {\n margin-inline-end: -10px;\n background: #ffffff;\n }\n\n .kp-message-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 10px;\n }\n\n .kp-message-action {\n border: 1px solid rgba(219, 228, 238, 0.9);\n background: #ffffff;\n color: #4b6478;\n border-radius: 999px;\n padding: 7px 10px;\n cursor: pointer;\n font-size: 12px;\n line-height: 1;\n }\n\n .kp-message-action.active {\n color: #0f6a75;\n border-color: rgba(15, 118, 110, 0.3);\n background: rgba(236, 254, 255, 0.92);\n }\n\n .kp-suggestions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: auto;\n }\n\n .kp-suggestion {\n border: 1px solid rgba(15, 118, 110, 0.18);\n background: rgba(247, 251, 255, 0.92);\n color: var(--kp-text);\n border-radius: 999px;\n padding: 11px 14px;\n cursor: pointer;\n text-align: left;\n font-size: 14px;\n line-height: 1.35;\n }\n\n .kp-footer {\n padding: 10px 16px 12px;\n border-top: 1px solid rgba(219, 228, 238, 0.85);\n background: #ffffff;\n }\n\n .kp-form {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px solid var(--kp-border-color);\n border-radius: 16px;\n padding: 10px 12px;\n background: #ffffff;\n }\n\n .kp-rtl .kp-form {\n flex-direction: row-reverse;\n }\n\n .kp-input {\n flex: 1;\n border: none;\n outline: none;\n box-shadow: none;\n background: transparent;\n color: var(--kp-text);\n font-size: 14px;\n line-height: 1.5;\n min-width: 0;\n appearance: none;\n }\n\n .kp-input:focus,\n .kp-input:focus-visible,\n .kp-input:active {\n border: none;\n outline: none;\n box-shadow: none;\n }\n\n .kp-send {\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 999px;\n background: #e4f1f8;\n color: var(--kp-accent);\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: none;\n }\n\n .kp-rtl .kp-send {\n transform: scaleX(-1);\n }\n\n .kp-note {\n margin-top: 8px;\n text-align: center;\n font-size: 11px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n }\n\n .kp-loading {\n font-size: 13px;\n line-height: 1.4;\n color: var(--kp-muted-text);\n padding: 4px 2px;\n }\n\n @media (max-width: 1100px) {\n .kp-full-page-content:has(.kp-source-panel.open) {\n grid-template-columns: 260px minmax(0, 1fr);\n }\n\n .kp-source-panel.open {\n position: absolute;\n inset-inline-end: 28px;\n top: 92px;\n bottom: 26px;\n width: min(320px, calc(100vw - 56px));\n z-index: 3;\n }\n }\n\n @media (max-width: 860px) {\n .kp-full-page-content,\n .kp-full-page-content:has(.kp-source-panel.open) {\n grid-template-columns: 1fr;\n }\n\n .kp-full-page-sidebar {\n max-height: 260px;\n }\n\n .kp-source-panel.open {\n position: static;\n inset: auto;\n width: auto;\n max-height: 280px;\n }\n }\n\n @media (max-width: 640px) {\n .kp-chat-widget,\n .kp-chat-widget.bottom-left {\n left: auto;\n right: 16px;\n bottom: 16px;\n }\n\n .kp-panel,\n .kp-chat-widget.bottom-left .kp-panel {\n inset: 0;\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n transform: translateX(72px) scale(0.985);\n transform-origin: center right;\n }\n\n .kp-panel.open {\n transform: translateX(0) scale(1);\n }\n\n .kp-full-page-shell {\n padding: 14px;\n }\n\n .kp-full-page-header {\n padding: 0;\n }\n\n .kp-full-page-body {\n padding: 24px 16px 16px;\n }\n\n .kp-full-page-hero-badge {\n width: 112px;\n height: 112px;\n }\n\n .kp-full-page-hero-text {\n font-size: 22px;\n }\n\n .kp-message-row {\n gap: 8px;\n }\n\n .kp-avatar {\n width: 32px;\n height: 32px;\n }\n\n .kp-bubble {\n max-width: calc(100% - 40px);\n }\n }\n\n @keyframes kp-cluster-rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n @keyframes kp-main-pulse {\n 0%, 100% { transform: translate(-50%, -50%) scale(0.82); opacity: 0.45; }\n 38% { transform: translate(-50%, -50%) scale(1.04); opacity: 1; }\n 60% { transform: translate(-50%, -50%) scale(0.94); opacity: 0.88; }\n }\n\n @keyframes kp-orbit-a {\n 0%, 100% { transform: translate(-50%, 0) scale(1); opacity: 1; }\n 40% { transform: translate(-50%, 17px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(-50%, 2px) scale(1); opacity: 0.98; }\n }\n\n @keyframes kp-orbit-b {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 1; }\n 40% { transform: translate(-16px, -13px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(-2px, -2px) scale(1); opacity: 0.98; }\n }\n\n @keyframes kp-orbit-c {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 1; }\n 40% { transform: translate(16px, -13px) scale(0.92); opacity: 0.96; }\n 62% { transform: translate(2px, -2px) scale(1); opacity: 0.98; }\n }\n `;\n}\n","import {\n createChat,\n deleteChat,\n fetchChats,\n fetchHistory,\n postMessage,\n reportWidgetError,\n updateChat\n} from \"./api\";\nimport { resolveConfig } from \"./config\";\nimport { createElement } from \"./dom\";\nimport { ensureStyles } from \"./styles\";\nimport type {\n ChatHistoryMessage,\n ChatListItem,\n ChatWidgetConfig,\n ChatWidgetInstance,\n RagCitation,\n ResolvedChatWidgetConfig\n} from \"./types\";\n\ntype WidgetState = {\n chatId: string;\n open: boolean;\n fullPageOpen: boolean;\n myChatsOpen: boolean;\n accessTokenProvider: ResolvedChatWidgetConfig[\"getAccessToken\"];\n historyLoadedChatId: string | null;\n menuOpen: boolean;\n chats: ChatListItem[];\n chatSearchTerm: string;\n loadingChats: boolean;\n sourcePanelOpen: boolean;\n sourcePanelTitle: string | null;\n};\n\ntype ConversationView = {\n body: HTMLDivElement;\n input: HTMLInputElement;\n suggestions: HTMLDivElement;\n hero: HTMLDivElement;\n kind: \"panel\" | \"full-page\";\n};\n\ntype LocaleStrings = {\n openChatActions: string;\n newChat: string;\n myChats: string;\n openAssistant: string;\n back: string;\n close: string;\n assistantBadge: string;\n closeAssistantPage: string;\n searchChat: string;\n recentActivity: string;\n pinnedCollections: string;\n answersBasedOnPermissions: string;\n authTokenForwarded: string;\n thinking: string;\n unableToCreateChat: string;\n requestFailed: string;\n noRecentChats: string;\n noPinnedChats: string;\n noChats: string;\n loadingChats: string;\n pinChat: string;\n unpinChat: string;\n renameChat: string;\n deleteChat: string;\n chatActions: string;\n renamePrompt: string;\n citationsAttached: (count: number) => string;\n sourcesUsed: string;\n allSourcesUsed: string;\n documentsAndReferences: string;\n showAll: string;\n noSources: string;\n closeSourcesPanel: string;\n openSource: string;\n sourceScore: string;\n sourcePage: string;\n sourceSheet: string;\n sourceRow: string;\n sourceKnowledge: string;\n untitledSource: string;\n copy: string;\n copied: string;\n helpful: string;\n notHelpful: string;\n send: string;\n assistantAvatar: string;\n userAvatar: string;\n};\n\nconst LOCALES: Record<string, LocaleStrings> = {\n en: {\n openChatActions: \"Open chat actions\",\n newChat: \"New Chat\",\n myChats: \"My Chats\",\n openAssistant: \"Open Knowledge Assistant\",\n back: \"Back\",\n close: \"Close\",\n assistantBadge: \"Knowledge Assistant\",\n closeAssistantPage: \"Close knowledge assistant page\",\n searchChat: \"Search Chat\",\n recentActivity: \"Recent Activity\",\n pinnedCollections: \"Pinned Collections\",\n answersBasedOnPermissions: \"Answers are generated based on your access permissions\",\n authTokenForwarded: \"Auth token is forwarded from the host app when configured.\",\n thinking: \"Thinking...\",\n unableToCreateChat: \"Unable to create chat\",\n requestFailed: \"Request failed\",\n noRecentChats: \"No recent chats yet.\",\n noPinnedChats: \"No pinned chats yet.\",\n noChats: \"No chats yet.\",\n loadingChats: \"Loading chats...\",\n pinChat: \"Pin chat\",\n unpinChat: \"Unpin chat\",\n renameChat: \"Rename\",\n deleteChat: \"Delete\",\n chatActions: \"Chat actions\",\n renamePrompt: \"Enter a new chat name\",\n citationsAttached: (count) => `${count} citation${count > 1 ? \"s\" : \"\"} attached`,\n sourcesUsed: \"Sources Used\",\n allSourcesUsed: \"All Sources Used\",\n documentsAndReferences: \"AI documents and references\",\n showAll: \"Show All\",\n noSources: \"No sources were returned for this answer.\",\n closeSourcesPanel: \"Close sources panel\",\n openSource: \"Open source\",\n sourceScore: \"Score\",\n sourcePage: \"Page\",\n sourceSheet: \"Sheet\",\n sourceRow: \"Row\",\n sourceKnowledge: \"Knowledge Base\",\n untitledSource: \"Untitled Source\",\n copy: \"Copy\",\n copied: \"Copied\",\n helpful: \"Helpful\",\n notHelpful: \"Needs work\",\n send: \"Send message\",\n assistantAvatar: \"Assistant\",\n userAvatar: \"User\"\n },\n ar: {\n openChatActions: \"فتح إجراءات المحادثة\",\n newChat: \"محادثة جديدة\",\n myChats: \"محادثاتي\",\n openAssistant: \"فتح مساعد المعرفة\",\n back: \"رجوع\",\n close: \"إغلاق\",\n assistantBadge: \"مساعد المعرفة\",\n closeAssistantPage: \"إغلاق صفحة مساعد المعرفة\",\n searchChat: \"ابحث في المحادثات\",\n recentActivity: \"النشاط الأخير\",\n pinnedCollections: \"المحادثات المثبتة\",\n answersBasedOnPermissions: \"يتم إنشاء الإجابات بناءً على صلاحيات الوصول الخاصة بك\",\n authTokenForwarded: \"يتم تمرير رمز التحقق من التطبيق المضيف عند الإعداد.\",\n thinking: \"جارٍ التفكير...\",\n unableToCreateChat: \"تعذر إنشاء المحادثة\",\n requestFailed: \"فشل الطلب\",\n noRecentChats: \"لا توجد محادثات حديثة بعد.\",\n noPinnedChats: \"لا توجد محادثات مثبتة بعد.\",\n noChats: \"لا توجد محادثات بعد.\",\n loadingChats: \"جارٍ تحميل المحادثات...\",\n pinChat: \"تثبيت المحادثة\",\n unpinChat: \"إلغاء تثبيت المحادثة\",\n renameChat: \"إعادة تسمية\",\n deleteChat: \"حذف\",\n chatActions: \"إجراءات المحادثة\",\n renamePrompt: \"أدخل اسمًا جديدًا للمحادثة\",\n citationsAttached: (count) => `تم إرفاق ${count} مرجع${count > 1 ? \"ات\" : \"\"}`,\n sourcesUsed: \"المصادر المستخدمة\",\n allSourcesUsed: \"كل المصادر المستخدمة\",\n documentsAndReferences: \"مستندات ومراجع الذكاء الاصطناعي\",\n showAll: \"عرض الكل\",\n noSources: \"لم يتم إرجاع مصادر لهذه الإجابة.\",\n closeSourcesPanel: \"إغلاق لوحة المصادر\",\n openSource: \"فتح المصدر\",\n sourceScore: \"الدرجة\",\n sourcePage: \"الصفحة\",\n sourceSheet: \"الورقة\",\n sourceRow: \"الصف\",\n sourceKnowledge: \"قاعدة المعرفة\",\n untitledSource: \"مصدر بدون عنوان\",\n copy: \"نسخ\",\n copied: \"تم النسخ\",\n helpful: \"مفيد\",\n notHelpful: \"يحتاج تحسين\",\n send: \"إرسال الرسالة\",\n assistantAvatar: \"المساعد\",\n userAvatar: \"المستخدم\"\n }\n};\n\nexport function createChatWidget(config: ChatWidgetConfig): ChatWidgetInstance {\n if (typeof document === \"undefined\") {\n throw new Error(\"Chat widget can only be initialized in a browser.\");\n }\n\n const resolvedConfig = resolveConfig(config);\n const locale = normalizeLocale(resolvedConfig.locale);\n const strings = getLocaleStrings(resolvedConfig.locale);\n const isRtl = isRtlLocale(locale);\n const state: WidgetState = {\n chatId: resolveChatId(resolvedConfig),\n open: false,\n fullPageOpen: false,\n myChatsOpen: false,\n accessTokenProvider: resolvedConfig.getAccessToken,\n historyLoadedChatId: null,\n menuOpen: false,\n chats: [],\n chatSearchTerm: \"\",\n loadingChats: false,\n sourcePanelOpen: false,\n sourcePanelTitle: null\n };\n\n const host = document.createElement(\"div\");\n host.dataset.chatWidgetHost = \"true\";\n resolvedConfig.mount.appendChild(host);\n\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n ensureStyles(shadowRoot, resolvedConfig.theme);\n\n const shell = createElement(\"div\", `kp-chat-widget ${resolvedConfig.position}`);\n shell.lang = locale;\n shell.dir = isRtl ? \"rtl\" : \"ltr\";\n if (isRtl) {\n shell.classList.add(\"kp-rtl\");\n }\n\n const overlay = createElement(\"div\", \"kp-overlay\");\n const launcher = createElement(\"button\", \"kp-launcher\");\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-label\", resolvedConfig.launcherAriaLabel);\n launcher.innerHTML = [\n '<span class=\"kp-star-cluster\" aria-hidden=\"true\">',\n '<span class=\"kp-star orbit-a\">✦</span>',\n '<span class=\"kp-star orbit-b\">✦</span>',\n '<span class=\"kp-star orbit-c\">✦</span>',\n '<span class=\"kp-star main\">✦</span>',\n \"</span>\"\n ].join(\"\");\n\n const panel = createElement(\"section\", \"kp-panel\");\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-modal\", \"true\");\n panel.setAttribute(\"aria-label\", resolvedConfig.title);\n\n const header = createElement(\"div\", \"kp-header\");\n const toolbar = createElement(\"div\", \"kp-toolbar\");\n const menuTrigger = createElement(\"button\", \"kp-tool-button kp-menu-trigger\");\n menuTrigger.type = \"button\";\n menuTrigger.setAttribute(\"aria-label\", strings.openChatActions);\n menuTrigger.innerHTML = [\n '<span class=\"kp-pencil-icon\" aria-hidden=\"true\"></span>',\n '<span class=\"kp-chevron\" aria-hidden=\"true\">⌄</span>'\n ].join(\"\");\n const dropdown = createElement(\"div\", \"kp-dropdown\");\n const newChatAction = createElement(\"button\", \"kp-dropdown-item\", strings.newChat);\n newChatAction.type = \"button\";\n const myChatsAction = createElement(\"button\", \"kp-dropdown-item\", strings.myChats);\n myChatsAction.type = \"button\";\n const openAssistantAction = createElement(\n \"button\",\n \"kp-dropdown-item\",\n strings.openAssistant\n );\n openAssistantAction.type = \"button\";\n dropdown.append(newChatAction, myChatsAction, openAssistantAction);\n toolbar.append(menuTrigger, dropdown);\n\n const headingWrap = createElement(\"div\", \"kp-title-wrap\");\n const title = createElement(\"h2\", \"kp-title\", resolvedConfig.title);\n const subtitle = createElement(\"div\", \"kp-subtitle\", resolvedConfig.subtitle);\n headingWrap.append(title, subtitle);\n\n const closeButton = createElement(\"button\", \"kp-close\", \"×\");\n closeButton.type = \"button\";\n closeButton.setAttribute(\"aria-label\", resolvedConfig.closeAriaLabel);\n header.append(toolbar, headingWrap, closeButton);\n\n const body = createElement(\"div\", \"kp-body\");\n const hero = createElement(\"div\", \"kp-hero\");\n const heroIcon = createElement(\"div\", \"kp-hero-icon\", \"✦\");\n const heroText = createElement(\"div\", \"kp-hero-text\", resolvedConfig.welcomeMessage);\n hero.append(heroIcon, heroText);\n const footer = createElement(\"div\", \"kp-footer\");\n const form = createElement(\"form\", \"kp-form\");\n const input = createElement(\"input\", \"kp-input\");\n input.type = \"text\";\n input.autocomplete = \"off\";\n input.placeholder = resolvedConfig.inputPlaceholder;\n input.setAttribute(\"aria-label\", resolvedConfig.inputPlaceholder);\n\n const sendButton = createElement(\"button\", \"kp-send\", \"➜\");\n sendButton.type = \"submit\";\n sendButton.setAttribute(\"aria-label\", strings.send);\n\n const note = createElement(\"div\", \"kp-note\", strings.authTokenForwarded);\n\n form.append(input, sendButton);\n footer.append(form, note);\n panel.append(header, body, footer);\n shell.append(overlay, launcher, panel);\n shadowRoot.appendChild(shell);\n\n body.appendChild(hero);\n\n const suggestions = createElement(\"div\", \"kp-suggestions\");\n body.appendChild(suggestions);\n const myChatsSheet = createElement(\"section\", \"kp-my-chats-sheet\");\n const myChatsSheetHeader = createElement(\"div\", \"kp-my-chats-header\");\n const myChatsBack = createElement(\"button\", \"kp-my-chats-nav\", \"←\");\n myChatsBack.type = \"button\";\n myChatsBack.setAttribute(\"aria-label\", strings.back);\n const myChatsClose = createElement(\"button\", \"kp-my-chats-nav kp-my-chats-close\", \"×\");\n myChatsClose.type = \"button\";\n myChatsClose.setAttribute(\"aria-label\", strings.close);\n myChatsSheetHeader.append(myChatsBack, myChatsClose);\n const myChatsSheetBody = createElement(\"div\", \"kp-my-chats-body\");\n const myChatsRecentLabel = createElement(\"div\", \"kp-my-chats-section-label\", strings.recentActivity);\n const myChatsRecentList = createElement(\"div\", \"kp-my-chats-list\");\n const myChatsPinnedLabel = createElement(\"div\", \"kp-my-chats-section-label\", strings.pinnedCollections);\n const myChatsPinnedList = createElement(\"div\", \"kp-my-chats-list\");\n myChatsSheetBody.append(\n myChatsRecentLabel,\n myChatsRecentList,\n myChatsPinnedLabel,\n myChatsPinnedList\n );\n myChatsSheet.append(myChatsSheetHeader, myChatsSheetBody);\n panel.appendChild(myChatsSheet);\n const panelView: ConversationView = {\n body,\n input,\n suggestions,\n hero,\n kind: \"panel\"\n };\n\n const fullPage = createElement(\"section\", \"kp-full-page\");\n fullPage.setAttribute(\"role\", \"dialog\");\n fullPage.setAttribute(\"aria-modal\", \"true\");\n fullPage.setAttribute(\"aria-label\", `${resolvedConfig.title} page`);\n\n const fullPageShell = createElement(\"div\", \"kp-full-page-shell\");\n const fullPageHeader = createElement(\"div\", \"kp-full-page-header\");\n const fullPageBrand = createElement(\"div\", \"kp-full-page-brand\");\n const fullPageMark = createElement(\"div\", \"kp-full-page-brand-mark\", \"✦\");\n const fullPageBrandText = createElement(\n \"div\",\n \"kp-full-page-brand-text\",\n resolvedConfig.title\n );\n fullPageBrand.append(fullPageMark, fullPageBrandText);\n\n const fullPageHeaderActions = createElement(\"div\", \"kp-full-page-header-actions\");\n const fullPageBadge = createElement(\"div\", \"kp-full-page-badge\", strings.assistantBadge);\n const fullPageClose = createElement(\"button\", \"kp-full-page-close\", \"×\");\n fullPageClose.type = \"button\";\n fullPageClose.setAttribute(\"aria-label\", strings.closeAssistantPage);\n fullPageHeaderActions.append(fullPageBadge, fullPageClose);\n fullPageHeader.append(fullPageBrand, fullPageHeaderActions);\n\n const fullPageContent = createElement(\"div\", \"kp-full-page-content\");\n const fullPageSidebar = createElement(\"aside\", \"kp-full-page-sidebar\");\n const fullPageNewChat = createElement(\"button\", \"kp-full-page-new-chat\", `+ ${strings.newChat}`);\n fullPageNewChat.type = \"button\";\n\n const fullPageSearchWrap = createElement(\"div\", \"kp-full-page-search\");\n const fullPageSearchInput = createElement(\"input\", \"kp-full-page-search-input\");\n fullPageSearchInput.type = \"search\";\n fullPageSearchInput.placeholder = strings.searchChat;\n const fullPageSearchIcon = createElement(\"span\", \"kp-full-page-search-icon\", \"⌕\");\n fullPageSearchWrap.append(fullPageSearchInput, fullPageSearchIcon);\n\n const fullPageRecentLabel = createElement(\"div\", \"kp-full-page-section-label\", strings.recentActivity);\n const fullPageRecentList = createElement(\"div\", \"kp-full-page-recent-list\");\n const fullPagePinnedLabel = createElement(\"div\", \"kp-full-page-section-label\", strings.pinnedCollections);\n const fullPagePinnedList = createElement(\"div\", \"kp-full-page-pinned-list\");\n fullPageSidebar.append(\n fullPageNewChat,\n fullPageSearchWrap,\n fullPageRecentLabel,\n fullPageRecentList,\n fullPagePinnedLabel,\n fullPagePinnedList\n );\n\n const fullPageMain = createElement(\"main\", \"kp-full-page-main\");\n const fullPagePanel = createElement(\"section\", \"kp-full-page-panel\");\n const fullPageBody = createElement(\"div\", \"kp-full-page-body\");\n const fullPageHero = createElement(\"div\", \"kp-full-page-hero\");\n const fullPageHeroBadge = createElement(\"div\", \"kp-full-page-hero-badge\");\n fullPageHeroBadge.innerHTML = [\n '<span class=\"kp-star-cluster kp-star-cluster-static\" aria-hidden=\"true\">',\n '<span class=\"kp-star orbit-a\">✦</span>',\n '<span class=\"kp-star orbit-b\">✦</span>',\n '<span class=\"kp-star orbit-c\">✦</span>',\n '<span class=\"kp-star main\">✦</span>',\n \"</span>\"\n ].join(\"\");\n const fullPageHeroText = createElement(\n \"div\",\n \"kp-full-page-hero-text\",\n resolvedConfig.welcomeMessage\n );\n fullPageHero.append(fullPageHeroBadge, fullPageHeroText);\n\n const fullPageSuggestions = createElement(\"div\", \"kp-suggestions kp-full-page-suggestions\");\n fullPageBody.append(fullPageHero, fullPageSuggestions);\n\n const fullPageFooter = createElement(\"div\", \"kp-full-page-footer\");\n const fullPageForm = createElement(\"form\", \"kp-form kp-full-page-form\");\n const fullPageInput = createElement(\"input\", \"kp-input kp-full-page-input\");\n fullPageInput.type = \"text\";\n fullPageInput.autocomplete = \"off\";\n fullPageInput.placeholder = resolvedConfig.inputPlaceholder;\n fullPageInput.setAttribute(\"aria-label\", resolvedConfig.inputPlaceholder);\n const fullPageSend = createElement(\"button\", \"kp-send kp-full-page-send\", \"➜\");\n fullPageSend.type = \"submit\";\n fullPageSend.setAttribute(\"aria-label\", strings.send);\n const fullPageNote = createElement(\n \"div\",\n \"kp-note kp-full-page-note\",\n strings.answersBasedOnPermissions\n );\n fullPageForm.append(fullPageInput, fullPageSend);\n fullPageFooter.append(fullPageForm, fullPageNote);\n fullPagePanel.append(fullPageBody, fullPageFooter);\n fullPageMain.appendChild(fullPagePanel);\n\n const sourceAside = createElement(\"aside\", \"kp-source-panel\");\n const sourcePanelHeader = createElement(\"div\", \"kp-source-panel-header\");\n const sourcePanelTitleWrap = createElement(\"div\", \"kp-source-panel-title-wrap\");\n const sourcePanelTitle = createElement(\"div\", \"kp-source-panel-title\", strings.allSourcesUsed);\n const sourcePanelSubtitle = createElement(\n \"div\",\n \"kp-source-panel-subtitle\",\n strings.documentsAndReferences\n );\n sourcePanelTitleWrap.append(sourcePanelTitle, sourcePanelSubtitle);\n const sourcePanelClose = createElement(\"button\", \"kp-source-panel-close\", \"×\");\n sourcePanelClose.type = \"button\";\n sourcePanelClose.setAttribute(\"aria-label\", strings.closeSourcesPanel);\n sourcePanelHeader.append(sourcePanelTitleWrap, sourcePanelClose);\n const sourcePanelList = createElement(\"div\", \"kp-source-panel-list\");\n const sourcePanelEmpty = createElement(\"div\", \"kp-source-panel-empty\", strings.noSources);\n sourcePanelList.appendChild(sourcePanelEmpty);\n sourceAside.append(sourcePanelHeader, sourcePanelList);\n\n fullPageContent.append(fullPageSidebar, fullPageMain, sourceAside);\n fullPageShell.append(fullPageHeader, fullPageContent);\n fullPage.appendChild(fullPageShell);\n shell.appendChild(fullPage);\n\n const fullPageView: ConversationView = {\n body: fullPageBody,\n input: fullPageInput,\n suggestions: fullPageSuggestions,\n hero: fullPageHero,\n kind: \"full-page\"\n };\n\n const getRuntimeConfig = (): ResolvedChatWidgetConfig => ({\n ...resolvedConfig,\n getAccessToken: state.accessTokenProvider\n });\n\n const getUserDisplayName = async (): Promise<string | null> => {\n if (!resolvedConfig.getUserContext) {\n return null;\n }\n\n try {\n const user = await resolvedConfig.getUserContext();\n return user?.displayName?.trim() || user?.email?.trim() || user?.userId?.trim() || null;\n } catch {\n return null;\n }\n };\n\n const showSourcePanel = (citations: RagCitation[], titleText?: string): void => {\n state.sourcePanelOpen = true;\n state.sourcePanelTitle = titleText ?? strings.allSourcesUsed;\n sourcePanelTitle.textContent = state.sourcePanelTitle;\n sourceAside.classList.add(\"open\");\n sourcePanelList.textContent = \"\";\n\n if (citations.length === 0) {\n sourcePanelList.appendChild(createElement(\"div\", \"kp-source-panel-empty\", strings.noSources));\n return;\n }\n\n for (const citation of citations) {\n sourcePanelList.appendChild(buildSourceCard(citation, strings));\n }\n };\n\n const hideSourcePanel = (): void => {\n state.sourcePanelOpen = false;\n state.sourcePanelTitle = null;\n sourceAside.classList.remove(\"open\");\n };\n\n syncSuggestionButtons(panelView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, panelView);\n });\n syncSuggestionButtons(fullPageView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, fullPageView);\n });\n renderFullPageChatLists();\n renderMyChatsSheetLists();\n\n function open(): void {\n if (state.open) {\n return;\n }\n\n state.open = true;\n state.fullPageOpen = false;\n closeMyChatsSheet();\n fullPage.classList.remove(\"open\");\n launcher.classList.add(\"hidden\");\n overlay.classList.add(\"visible\");\n panel.classList.add(\"open\");\n resolvedConfig.onOpen?.();\n if (resolvedConfig.rag.loadHistoryOnOpen) {\n void instance.loadHistory();\n }\n queueMicrotask(() => input.focus());\n }\n\n function close(): void {\n if (!state.open) {\n return;\n }\n\n closeMenu();\n closeMyChatsSheet();\n state.open = false;\n launcher.classList.remove(\"hidden\");\n overlay.classList.remove(\"visible\");\n panel.classList.remove(\"open\");\n resolvedConfig.onClose?.();\n }\n\n async function sendMessageToView(\n message: string,\n view: ConversationView\n ): Promise<void> {\n const trimmed = message.trim();\n\n if (!trimmed) {\n return;\n }\n\n view.input.value = \"\";\n\n try {\n await ensureChatExists(trimmed);\n } catch (error) {\n const normalized = reportWidgetError(resolvedConfig, error);\n appendMessage(view.body, \"bot\", `${strings.unableToCreateChat}: ${normalized.message}`, {\n strings,\n view,\n userName: null,\n onShowSources: showSourcePanel\n });\n return;\n }\n\n hidePromptsForConversation(view);\n appendMessage(view.body, \"user\", trimmed, {\n strings,\n view,\n userName: await getUserDisplayName(),\n onShowSources: showSourcePanel\n });\n view.body.scrollTop = view.body.scrollHeight;\n\n const loading = createElement(\"div\", \"kp-loading\", strings.thinking);\n view.body.appendChild(loading);\n view.body.scrollTop = view.body.scrollHeight;\n\n try {\n const response = await postMessage(getRuntimeConfig(), {\n message: trimmed,\n chatId: state.chatId,\n knowledgeNames: await resolveKnowledgeNames(resolvedConfig),\n ...(resolvedConfig.rag.enableReferences !== undefined\n ? { enableReferences: resolvedConfig.rag.enableReferences }\n : {})\n });\n\n if (loading.isConnected) {\n loading.remove();\n }\n\n appendMessage(view.body, \"bot\", response.answer, {\n strings,\n view,\n userName: null,\n citations: response.citations ?? [],\n onShowSources: showSourcePanel\n });\n state.historyLoadedChatId = null;\n await refreshChats();\n\n if (response.suggestions?.length) {\n syncSuggestionButtons(view, response.suggestions, async (text) => {\n await sendMessageToView(text, view);\n });\n }\n } catch (error) {\n const normalized = reportWidgetError(resolvedConfig, error);\n\n if (loading.isConnected) {\n loading.remove();\n }\n\n appendMessage(view.body, \"bot\", `${strings.requestFailed}: ${normalized.message}`, {\n strings,\n view,\n userName: null,\n onShowSources: showSourcePanel\n });\n }\n }\n\n async function sendMessage(message: string): Promise<void> {\n const targetView = state.fullPageOpen ? fullPageView : panelView;\n await sendMessageToView(message, targetView);\n }\n\n async function openFullPage(): Promise<void> {\n state.fullPageOpen = true;\n state.open = false;\n closeMenu();\n closeMyChatsSheet();\n panel.classList.remove(\"open\");\n overlay.classList.remove(\"visible\");\n launcher.classList.add(\"hidden\");\n fullPage.classList.add(\"open\");\n await refreshChats();\n await loadHistoryIntoView(fullPageView, state.chatId);\n queueMicrotask(() => fullPageInput.focus());\n }\n\n function closeFullPage(): void {\n if (!state.fullPageOpen) {\n return;\n }\n\n state.fullPageOpen = false;\n fullPage.classList.remove(\"open\");\n launcher.classList.remove(\"hidden\");\n hideSourcePanel();\n }\n\n function openMenu(): void {\n state.menuOpen = true;\n menuTrigger.classList.add(\"open\");\n dropdown.classList.add(\"open\");\n }\n\n function closeMenu(): void {\n state.menuOpen = false;\n menuTrigger.classList.remove(\"open\");\n dropdown.classList.remove(\"open\");\n }\n\n function resetConversation(): void {\n state.chatId = resolveChatId(resolvedConfig);\n state.historyLoadedChatId = null;\n closeMyChatsSheet();\n resetConversationView(panelView);\n syncSuggestionButtons(panelView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, panelView);\n });\n closeMenu();\n }\n\n async function resetFullPageConversation(): Promise<void> {\n state.chatId = resolveChatId(resolvedConfig);\n state.historyLoadedChatId = null;\n resetConversationView(fullPageView);\n hideSourcePanel();\n syncSuggestionButtons(fullPageView, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, fullPageView);\n });\n renderFullPageChatLists();\n }\n\n async function refreshChats(): Promise<ChatListItem[]> {\n if (!resolvedConfig.endpoints.listChats) {\n renderFullPageChatLists();\n renderMyChatsSheetLists();\n return [];\n }\n\n state.loadingChats = true;\n renderFullPageChatLists();\n renderMyChatsSheetLists();\n\n try {\n const chats = await fetchChats(getRuntimeConfig());\n state.chats = chats;\n return chats;\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n return state.chats;\n } finally {\n state.loadingChats = false;\n renderFullPageChatLists();\n renderMyChatsSheetLists();\n }\n }\n\n async function ensureChatExists(seedMessage?: string): Promise<void> {\n if (!resolvedConfig.endpoints.listChats && !resolvedConfig.endpoints.createChat) {\n return;\n }\n\n if (state.chats.some((chat) => chat.chatId === state.chatId)) {\n return;\n }\n\n await createChat(\n getRuntimeConfig(),\n state.chatId,\n seedMessage ? buildChatTitle(seedMessage, strings.newChat) : undefined\n );\n }\n\n async function selectChat(chatId: string): Promise<void> {\n state.chatId = chatId;\n state.historyLoadedChatId = null;\n await loadHistoryIntoView(fullPageView, chatId);\n renderFullPageChatLists();\n }\n\n async function selectChatFromSheet(chatId: string): Promise<void> {\n state.chatId = chatId;\n state.historyLoadedChatId = null;\n await loadHistoryIntoView(panelView, chatId);\n closeMyChatsSheet();\n }\n\n async function openMyChatsSheet(): Promise<void> {\n closeMenu();\n await refreshChats();\n state.myChatsOpen = true;\n panel.classList.add(\"kp-sheet-open\");\n myChatsSheet.classList.add(\"open\");\n }\n\n function closeMyChatsSheet(): void {\n state.myChatsOpen = false;\n panel.classList.remove(\"kp-sheet-open\");\n myChatsSheet.classList.remove(\"open\");\n }\n\n async function renameChatItem(chat: ChatListItem): Promise<void> {\n if (!resolvedConfig.endpoints.updateChat) {\n return;\n }\n\n const nextTitle = window.prompt(strings.renamePrompt, chat.title)?.trim();\n if (!nextTitle || nextTitle === chat.title) {\n return;\n }\n\n try {\n await updateChat(getRuntimeConfig(), chat.chatId, {\n title: nextTitle\n });\n await refreshChats();\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n }\n }\n\n async function deleteChatItem(chat: ChatListItem): Promise<void> {\n if (!resolvedConfig.endpoints.deleteChat) {\n return;\n }\n\n try {\n await deleteChat(getRuntimeConfig(), chat.chatId);\n if (state.chatId === chat.chatId) {\n state.chatId = resolveChatId(resolvedConfig);\n state.historyLoadedChatId = null;\n resetConversationView(panelView);\n resetConversationView(fullPageView);\n }\n await refreshChats();\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n }\n }\n\n function renderFullPageChatLists(): void {\n renderSidebarLists(\n fullPageRecentList,\n fullPagePinnedList,\n state,\n strings,\n async (chat) => {\n await selectChat(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n },\n async (chat) => {\n await renameChatItem(chat);\n },\n async (chat) => {\n await deleteChatItem(chat);\n }\n );\n }\n\n function renderMyChatsSheetLists(): void {\n renderSidebarLists(\n myChatsRecentList,\n myChatsPinnedList,\n state,\n strings,\n async (chat) => {\n await selectChatFromSheet(chat.chatId);\n },\n async (chat) => {\n await togglePinnedChat(chat);\n },\n async (chat) => {\n await renameChatItem(chat);\n },\n async (chat) => {\n await deleteChatItem(chat);\n }\n );\n }\n\n async function togglePinnedChat(chat: ChatListItem): Promise<void> {\n if (!resolvedConfig.endpoints.updateChat) {\n return;\n }\n\n try {\n await updateChat(getRuntimeConfig(), chat.chatId, {\n pinned: !chat.pinned\n });\n await refreshChats();\n } catch (error) {\n reportWidgetError(resolvedConfig, error);\n }\n }\n\n async function loadHistoryIntoView(\n view: ConversationView,\n chatId: string\n ): Promise<ChatHistoryMessage[]> {\n resetConversationView(view);\n syncSuggestionButtons(view, resolvedConfig.initialSuggestions, async (text) => {\n await sendMessageToView(text, view);\n });\n\n const messages = await fetchHistory(getRuntimeConfig(), chatId);\n\n if (messages.length > 0) {\n hidePromptsForConversation(view);\n clearRenderedConversation(view.body, view.hero, view.suggestions);\n renderHistory(view.body, messages, {\n strings,\n view,\n userName: await getUserDisplayName(),\n onShowSources: showSourcePanel\n });\n }\n\n state.historyLoadedChatId = chatId;\n return messages;\n }\n\n const instance: ChatWidgetInstance = {\n open,\n close,\n toggle() {\n if (state.open) {\n close();\n return;\n }\n\n open();\n },\n destroy() {\n document.removeEventListener(\"keydown\", handleEscapeKeydown);\n host.remove();\n },\n sendMessage,\n setAccessTokenProvider(provider) {\n state.accessTokenProvider = provider;\n },\n getChatId() {\n return state.chatId;\n },\n loadChats() {\n return refreshChats();\n },\n async loadHistory() {\n const targetView = state.fullPageOpen ? fullPageView : panelView;\n return loadHistoryIntoView(targetView, state.chatId);\n }\n };\n\n launcher.addEventListener(\"click\", () => instance.toggle());\n closeButton.addEventListener(\"click\", close);\n overlay.addEventListener(\"click\", close);\n sourcePanelClose.addEventListener(\"click\", hideSourcePanel);\n myChatsBack.addEventListener(\"click\", closeMyChatsSheet);\n myChatsClose.addEventListener(\"click\", closeMyChatsSheet);\n menuTrigger.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n if (!state.menuOpen) {\n openMenu();\n return;\n }\n\n closeMenu();\n });\n newChatAction.addEventListener(\"click\", resetConversation);\n myChatsAction.addEventListener(\"click\", async () => {\n await openMyChatsSheet();\n });\n openAssistantAction.addEventListener(\"click\", () => {\n void openFullPage();\n });\n fullPageClose.addEventListener(\"click\", closeFullPage);\n fullPageNewChat.addEventListener(\"click\", () => {\n void resetFullPageConversation();\n queueMicrotask(() => fullPageInput.focus());\n });\n fullPageSearchInput.addEventListener(\"input\", () => {\n state.chatSearchTerm = fullPageSearchInput.value.trim().toLowerCase();\n renderFullPageChatLists();\n });\n panel.addEventListener(\"click\", (event) => {\n const target = event.target as Node;\n if (!(target instanceof Element) || !target.closest(\".kp-chat-actions\")) {\n for (const openActions of Array.from(shadowRoot.querySelectorAll(\".kp-chat-actions.open\"))) {\n openActions.classList.remove(\"open\");\n }\n for (const openRows of Array.from(shadowRoot.querySelectorAll(\".kp-full-page-chat-item.menu-open\"))) {\n openRows.classList.remove(\"menu-open\");\n }\n }\n if (\n state.menuOpen &&\n !dropdown.contains(target) &&\n !menuTrigger.contains(target)\n ) {\n closeMenu();\n }\n event.stopPropagation();\n });\n shadowRoot.addEventListener(\"click\", (event) => {\n const target = event.target;\n if (\n state.menuOpen &&\n target instanceof Node &&\n !dropdown.contains(target) &&\n !menuTrigger.contains(target)\n ) {\n closeMenu();\n }\n if (\n target instanceof Element &&\n !target.closest(\".kp-chat-actions\")\n ) {\n for (const openActions of Array.from(shadowRoot.querySelectorAll(\".kp-chat-actions.open\"))) {\n openActions.classList.remove(\"open\");\n }\n for (const openRows of Array.from(shadowRoot.querySelectorAll(\".kp-full-page-chat-item.menu-open\"))) {\n openRows.classList.remove(\"menu-open\");\n }\n }\n });\n form.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n await sendMessage(input.value);\n });\n fullPageForm.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n await sendMessageToView(fullPageInput.value, fullPageView);\n });\n\n function handleEscapeKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Escape\") {\n return;\n }\n\n if (state.sourcePanelOpen) {\n hideSourcePanel();\n return;\n }\n\n if (state.myChatsOpen) {\n closeMyChatsSheet();\n return;\n }\n\n if (state.fullPageOpen) {\n closeFullPage();\n return;\n }\n\n if (state.open) {\n close();\n }\n }\n\n document.addEventListener(\"keydown\", handleEscapeKeydown);\n\n return instance;\n}\n\nasync function resolveKnowledgeNames(\n config: ResolvedChatWidgetConfig\n): Promise<string[]> {\n if (config.rag.getKnowledgeNames) {\n const names = await config.rag.getKnowledgeNames();\n return Array.isArray(names) ? names.filter(Boolean) : [];\n }\n\n return (config.rag.knowledgeNames ?? []).filter(Boolean);\n}\n\nfunction resolveChatId(config: ResolvedChatWidgetConfig): string {\n if (config.rag.chatId?.trim()) {\n return config.rag.chatId;\n }\n\n if (config.rag.chatIdFactory) {\n return config.rag.chatIdFactory();\n }\n\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `kp-chat-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction appendMessage(\n body: HTMLDivElement,\n kind: \"bot\" | \"user\",\n text: string,\n options: {\n strings: LocaleStrings;\n view: ConversationView;\n userName: string | null;\n citations?: RagCitation[];\n onShowSources: (citations: RagCitation[], titleText?: string) => void;\n }\n): HTMLDivElement {\n const derivedContent =\n kind === \"bot\"\n ? deriveAssistantDisplayContent(text, options.citations ?? [])\n : {\n displayText: text,\n citations: options.citations ?? []\n };\n const row = createElement(\"div\", `kp-message-row ${kind}`);\n const avatar = createAvatar(\n kind === \"bot\" ? options.strings.assistantAvatar : options.userName ?? options.strings.userAvatar,\n kind\n );\n const bubble = createElement(\"div\", `kp-bubble ${kind}`);\n const content = createElement(\"div\", \"kp-bubble-content\");\n renderMarkdown(content, derivedContent.displayText);\n bubble.appendChild(content);\n\n const citations = derivedContent.citations;\n if (citations.length) {\n const meta = createElement(\n \"div\",\n \"kp-meta\",\n options.strings.citationsAttached(citations.length)\n );\n bubble.appendChild(meta);\n\n const sourcePreview = createElement(\"div\", \"kp-source-preview\");\n const sourceTitle = createElement(\"div\", \"kp-source-preview-title\", options.strings.sourcesUsed);\n const sourceItems = createElement(\"div\", \"kp-source-preview-list\");\n for (const citation of citations.slice(0, 2)) {\n const chip = buildSourcePreviewChip(citation, options.strings);\n chip.addEventListener(\"click\", async () => {\n openCitationInNewTab(citation, options.strings);\n });\n sourceItems.appendChild(chip);\n }\n const showAll = buildShowAllChip(options.strings);\n showAll.addEventListener(\"click\", async () => {\n options.onShowSources(citations, options.strings.allSourcesUsed);\n });\n sourceItems.appendChild(showAll);\n sourcePreview.append(sourceTitle, sourceItems);\n bubble.appendChild(sourcePreview);\n }\n\n if (kind === \"bot\") {\n bubble.appendChild(createMessageActions(derivedContent.displayText, options.strings));\n }\n\n if (kind === \"user\") {\n row.append(bubble, avatar);\n } else {\n row.append(avatar, bubble);\n }\n\n body.appendChild(row);\n body.scrollTop = body.scrollHeight;\n return row;\n}\n\nfunction createMessageActions(text: string, strings: LocaleStrings): HTMLDivElement {\n const actions = createElement(\"div\", \"kp-message-actions\");\n const copyButton = createElement(\"button\", \"kp-message-action\", strings.copy);\n copyButton.type = \"button\";\n copyButton.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(text);\n copyButton.textContent = strings.copied;\n window.setTimeout(() => {\n copyButton.textContent = strings.copy;\n }, 1200);\n } catch {\n copyButton.textContent = strings.copy;\n }\n });\n\n const likeButton = createElement(\"button\", \"kp-message-action\", \"👍\");\n likeButton.type = \"button\";\n likeButton.setAttribute(\"aria-label\", strings.helpful);\n likeButton.addEventListener(\"click\", () => {\n likeButton.classList.toggle(\"active\");\n dislikeButton.classList.remove(\"active\");\n });\n\n const dislikeButton = createElement(\"button\", \"kp-message-action\", \"👎\");\n dislikeButton.type = \"button\";\n dislikeButton.setAttribute(\"aria-label\", strings.notHelpful);\n dislikeButton.addEventListener(\"click\", () => {\n dislikeButton.classList.toggle(\"active\");\n likeButton.classList.remove(\"active\");\n });\n\n actions.append(copyButton, likeButton, dislikeButton);\n return actions;\n}\n\nfunction createAvatar(label: string, kind: \"bot\" | \"user\"): HTMLDivElement {\n const avatar = createElement(\"div\", `kp-avatar ${kind}`);\n const initials = kind === \"bot\" ? \"✦\" : getInitials(label);\n avatar.textContent = initials;\n avatar.setAttribute(\"aria-hidden\", \"true\");\n return avatar;\n}\n\nfunction renderSuggestions(\n container: HTMLDivElement,\n suggestions: string[],\n onClick: (text: string) => Promise<void>\n): void {\n container.textContent = \"\";\n\n for (const suggestion of suggestions) {\n const button = createElement(\"button\", \"kp-suggestion\", suggestion);\n button.type = \"button\";\n button.addEventListener(\"click\", async () => {\n await onClick(suggestion);\n });\n container.appendChild(button);\n }\n}\n\nfunction syncSuggestionButtons(\n view: ConversationView,\n suggestions: string[],\n onClick: (text: string) => Promise<void>\n): void {\n renderSuggestions(view.suggestions, suggestions, async (text) => {\n view.input.value = text;\n await onClick(text);\n });\n}\n\nfunction clearRenderedConversation(\n body: HTMLDivElement,\n hero: HTMLDivElement,\n suggestions: HTMLDivElement\n): void {\n const preservedNodes = new Set([hero, suggestions]);\n for (const child of Array.from(body.children)) {\n if (!preservedNodes.has(child as HTMLDivElement)) {\n child.remove();\n }\n }\n}\n\nfunction hidePromptsForConversation(view: ConversationView): void {\n view.body.classList.add(\"kp-conversation-active\");\n view.hero.remove();\n view.suggestions.remove();\n}\n\nfunction resetConversationView(view: ConversationView): void {\n view.body.classList.remove(\"kp-conversation-active\");\n\n if (!view.hero.isConnected) {\n view.body.prepend(view.hero);\n }\n\n if (!view.suggestions.isConnected) {\n view.body.appendChild(view.suggestions);\n }\n\n clearRenderedConversation(view.body, view.hero, view.suggestions);\n view.input.value = \"\";\n}\n\nfunction renderHistory(\n body: HTMLDivElement,\n messages: ChatHistoryMessage[],\n options: {\n strings: LocaleStrings;\n view: ConversationView;\n userName: string | null;\n onShowSources: (citations: RagCitation[], titleText?: string) => void;\n }\n): void {\n for (const message of messages) {\n appendMessage(body, message.role === \"assistant\" ? \"bot\" : \"user\", message.text, options);\n }\n}\n\nfunction renderSidebarLists(\n recentContainer: HTMLDivElement,\n pinnedContainer: HTMLDivElement,\n state: WidgetState,\n strings: LocaleStrings,\n onSelectChat: (chat: ChatListItem) => Promise<void>,\n onTogglePinned: (chat: ChatListItem) => Promise<void>,\n onRenameChat: (chat: ChatListItem) => Promise<void>,\n onDeleteChat: (chat: ChatListItem) => Promise<void>\n): void {\n recentContainer.textContent = \"\";\n pinnedContainer.textContent = \"\";\n\n if (state.loadingChats) {\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", strings.loadingChats));\n return;\n }\n\n const filteredChats = state.chats.filter((chat) => {\n if (!state.chatSearchTerm) {\n return true;\n }\n\n return chat.title.toLowerCase().includes(state.chatSearchTerm);\n });\n\n if (filteredChats.length > 0) {\n const pinnedChats = filteredChats.filter((chat) => chat.pinned);\n const recentChats = filteredChats.filter((chat) => !chat.pinned).slice(0, 8);\n\n renderChatItems(\n recentContainer,\n recentChats,\n state.chatId,\n strings,\n onSelectChat,\n onTogglePinned,\n onRenameChat,\n onDeleteChat\n );\n renderChatItems(\n pinnedContainer,\n pinnedChats,\n state.chatId,\n strings,\n onSelectChat,\n onTogglePinned,\n onRenameChat,\n onDeleteChat\n );\n\n if (recentChats.length === 0) {\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", strings.noRecentChats));\n }\n\n if (pinnedChats.length === 0) {\n pinnedContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", strings.noPinnedChats));\n }\n\n return;\n }\n\n recentContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", strings.noChats));\n pinnedContainer.appendChild(createElement(\"div\", \"kp-full-page-empty\", strings.noPinnedChats));\n}\n\nfunction renderChatItems(\n container: HTMLDivElement,\n chats: ChatListItem[],\n activeChatId: string,\n strings: LocaleStrings,\n onSelectChat: (chat: ChatListItem) => Promise<void>,\n onTogglePinned: (chat: ChatListItem) => Promise<void>,\n onRenameChat: (chat: ChatListItem) => Promise<void>,\n onDeleteChat: (chat: ChatListItem) => Promise<void>\n): void {\n for (const chat of chats) {\n const row = createElement(\n \"div\",\n `kp-full-page-item kp-full-page-chat-item${chat.chatId === activeChatId ? \" active\" : \"\"}`\n );\n\n const title = createElement(\"span\", \"kp-full-page-item-title\", chat.title);\n const actions = createElement(\"div\", \"kp-chat-actions\");\n const menuTrigger = createElement(\"button\", \"kp-chat-actions-trigger\", \"⋯\");\n menuTrigger.type = \"button\";\n menuTrigger.setAttribute(\"aria-label\", strings.chatActions);\n const menu = createElement(\"div\", \"kp-chat-actions-menu\");\n const pinAction = createElement(\n \"button\",\n \"kp-chat-actions-item\",\n chat.pinned ? strings.unpinChat : strings.pinChat\n );\n pinAction.type = \"button\";\n pinAction.addEventListener(\"click\", async (event) => {\n event.stopPropagation();\n await onTogglePinned(chat);\n });\n const renameAction = createElement(\"button\", \"kp-chat-actions-item\", strings.renameChat);\n renameAction.type = \"button\";\n renameAction.addEventListener(\"click\", async (event) => {\n event.stopPropagation();\n await onRenameChat(chat);\n });\n const deleteAction = createElement(\"button\", \"kp-chat-actions-item\", strings.deleteChat);\n deleteAction.type = \"button\";\n deleteAction.addEventListener(\"click\", async (event) => {\n event.stopPropagation();\n await onDeleteChat(chat);\n });\n menu.append(pinAction, renameAction, deleteAction);\n actions.append(menuTrigger, menu);\n menuTrigger.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const isOpen = actions.classList.contains(\"open\");\n for (const openActions of Array.from(container.querySelectorAll(\".kp-chat-actions.open\"))) {\n openActions.classList.remove(\"open\");\n }\n for (const openRows of Array.from(container.querySelectorAll(\".kp-full-page-chat-item.menu-open\"))) {\n openRows.classList.remove(\"menu-open\");\n }\n if (!isOpen) {\n actions.classList.add(\"open\");\n row.classList.add(\"menu-open\");\n }\n });\n\n row.append(title, actions);\n row.setAttribute(\"role\", \"button\");\n row.tabIndex = 0;\n row.addEventListener(\"click\", async () => {\n await onSelectChat(chat);\n });\n row.addEventListener(\"keydown\", async (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n await onSelectChat(chat);\n }\n });\n row.addEventListener(\"blur\", () => {\n actions.classList.remove(\"open\");\n row.classList.remove(\"menu-open\");\n });\n container.appendChild(row);\n }\n}\n\nfunction buildChatTitle(message: string, fallback: string): string {\n return message.trim().slice(0, 60) || fallback;\n}\n\nfunction normalizeLocale(locale: string): string {\n return locale.toLowerCase().split(\"-\")[0] || \"en\";\n}\n\nfunction getLocaleStrings(locale: string): LocaleStrings {\n const fallback = LOCALES.en as LocaleStrings;\n return LOCALES[normalizeLocale(locale)] ?? fallback;\n}\n\nfunction isRtlLocale(locale: string): boolean {\n return [\"ar\", \"fa\", \"he\", \"ur\"].includes(normalizeLocale(locale));\n}\n\nfunction getInitials(label: string): string {\n const parts = label.split(/\\s+/).filter(Boolean).slice(0, 2);\n if (parts.length === 0) {\n return \"U\";\n }\n\n return parts.map((part) => part[0]?.toUpperCase() ?? \"\").join(\"\");\n}\n\nfunction getCitationLabel(citation: RagCitation): string | null {\n return (\n citation.knowledgeName?.trim() ||\n citation.sourceDocument?.trim() ||\n null\n );\n}\n\nfunction deriveAssistantDisplayContent(\n text: string,\n citations: RagCitation[]\n): {\n displayText: string;\n citations: RagCitation[];\n} {\n const parsed = parseReferencesFromAnswer(text);\n return {\n displayText: parsed.displayText,\n citations: citations.length > 0 ? mergeCitations(citations, parsed.citations) : parsed.citations\n };\n}\n\nfunction parseReferencesFromAnswer(text: string): {\n displayText: string;\n citations: RagCitation[];\n} {\n const normalized = normalizeMarkdown(text);\n const lines = normalized.split(\"\\n\");\n let referencesLineIndex = -1;\n\n for (let index = 0; index < lines.length; index += 1) {\n if (/^#{0,6}\\s*References\\s*$/i.test(lines[index]?.trim() ?? \"\")) {\n referencesLineIndex = index;\n }\n }\n\n if (referencesLineIndex === -1) {\n return {\n displayText: text,\n citations: []\n };\n }\n\n const displayText = lines.slice(0, referencesLineIndex).join(\"\\n\").trimEnd();\n const referencesBody = lines.slice(referencesLineIndex + 1).join(\"\\n\").trim();\n const entries = collectReferenceEntries(referencesBody);\n const citations = entries\n .map((entry) => parseReferenceEntry(entry))\n .filter((citation): citation is RagCitation => Boolean(citation));\n\n return {\n displayText,\n citations\n };\n}\n\nfunction collectReferenceEntries(section: string): string[] {\n const entries: string[] = [];\n let current = \"\";\n\n for (const rawLine of section.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n\n if (/^\\d+\\.\\s+/.test(line)) {\n if (current) {\n entries.push(current.trim());\n }\n current = line.replace(/^\\d+\\.\\s+/, \"\");\n continue;\n }\n\n if (current) {\n current = `${current} ${line}`;\n }\n }\n\n if (current) {\n entries.push(current.trim());\n }\n\n return entries;\n}\n\nfunction parseReferenceEntry(entry: string): RagCitation | null {\n const urlMatch = entry.match(/https?:\\/\\/\\S+/i);\n if (!urlMatch) {\n return null;\n }\n\n const url = urlMatch[0];\n const title = entry\n .slice(0, urlMatch.index)\n .replace(/[.\\s]+$/, \"\")\n .trim();\n\n return {\n sourceDocument: url,\n knowledgeName: title || url\n };\n}\n\nfunction mergeCitations(primary: RagCitation[], fallback: RagCitation[]): RagCitation[] {\n const merged: RagCitation[] = [];\n const seen = new Set<string>();\n\n for (const citation of [...primary, ...fallback]) {\n const key = `${citation.knowledgeName ?? \"\"}::${citation.sourceDocument ?? \"\"}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n merged.push(citation);\n }\n\n return merged;\n}\n\nfunction buildSourcePreviewChip(citation: RagCitation, strings: LocaleStrings): HTMLButtonElement {\n const chip = createElement(\"button\", \"kp-source-chip\");\n chip.type = \"button\";\n chip.setAttribute(\"aria-label\", strings.openSource);\n\n const avatar = createElement(\"span\", \"kp-source-thumb\");\n avatar.textContent = \"✦\";\n const label = createElement(\n \"span\",\n \"kp-source-chip-label\",\n getCitationLabel(citation) ?? strings.untitledSource\n );\n chip.append(avatar, label);\n return chip;\n}\n\nfunction buildShowAllChip(strings: LocaleStrings): HTMLButtonElement {\n const chip = createElement(\"button\", \"kp-source-chip kp-source-chip-more\");\n chip.type = \"button\";\n\n const avatars = createElement(\"span\", \"kp-source-thumb-stack\");\n for (let index = 0; index < 3; index += 1) {\n const avatar = createElement(\"span\", \"kp-source-thumb stacked\");\n avatar.textContent = \"✦\";\n avatars.appendChild(avatar);\n }\n\n const label = createElement(\"span\", \"kp-source-chip-label\", strings.showAll);\n chip.append(avatars, label);\n return chip;\n}\n\nfunction buildSourceCard(citation: RagCitation, strings: LocaleStrings): HTMLButtonElement {\n const card = createElement(\"button\", \"kp-source-card\");\n card.type = \"button\";\n card.setAttribute(\"aria-label\", strings.openSource);\n card.addEventListener(\"click\", () => {\n openCitationInNewTab(citation, strings);\n });\n\n const media = createElement(\"div\", \"kp-source-card-media\");\n const avatar = createElement(\"span\", \"kp-source-thumb kp-source-thumb-large\");\n avatar.textContent = \"✦\";\n const title = createElement(\n \"div\",\n \"kp-source-card-title\",\n getCitationLabel(citation) ?? strings.untitledSource\n );\n const meta = createElement(\"div\", \"kp-source-card-meta\");\n const parts: string[] = [];\n\n if (typeof citation.score === \"number\") {\n parts.push(`${strings.sourceScore}: ${citation.score.toFixed(2)}`);\n }\n if (typeof citation.pageNumber === \"number\") {\n parts.push(`${strings.sourcePage}: ${citation.pageNumber}`);\n }\n if (citation.sheetName) {\n parts.push(`${strings.sourceSheet}: ${citation.sheetName}`);\n }\n if (typeof citation.rowNumber === \"number\") {\n parts.push(`${strings.sourceRow}: ${citation.rowNumber}`);\n }\n if (citation.knowledgeName) {\n parts.push(`${strings.sourceKnowledge}: ${citation.knowledgeName}`);\n }\n\n meta.textContent = parts.join(\" • \");\n media.appendChild(avatar);\n card.append(media, title, meta);\n return card;\n}\n\nfunction openCitationInNewTab(citation: RagCitation, strings: LocaleStrings): void {\n const rawTarget =\n citation.sourceDocument?.trim() ||\n citation.knowledgeName?.trim() ||\n strings.untitledSource;\n const urlCandidate = extractCitationUrl(citation.sourceDocument);\n\n if (urlCandidate) {\n window.open(urlCandidate, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n\n const popup = window.open(\"\", \"_blank\", \"noopener,noreferrer\");\n if (!popup) {\n return;\n }\n\n const title = escapeHtml(rawTarget);\n const details = buildSourceDetails(citation, strings)\n .map((line) => `<li>${escapeHtml(line)}</li>`)\n .join(\"\");\n\n popup.document.write(`<!doctype html>\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <title>${title}</title>\n <style>\n body { font-family: Arial, sans-serif; margin: 32px; color: #1f2937; }\n .card { max-width: 720px; padding: 24px; border: 1px solid #dbe4ee; border-radius: 16px; background: #fff; }\n h1 { margin: 0 0 12px; font-size: 24px; }\n p { margin: 0 0 16px; color: #64748b; }\n ul { margin: 0; padding-left: 20px; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>${title}</h1>\n <p>${escapeHtml(strings.documentsAndReferences)}</p>\n <ul>${details || `<li>${escapeHtml(strings.noSources)}</li>`}</ul>\n </div>\n </body>\n </html>`);\n popup.document.close();\n}\n\nfunction extractCitationUrl(candidate?: string | null): string | null {\n if (!candidate) {\n return null;\n }\n\n const trimmed = candidate.trim();\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : null;\n}\n\nfunction buildSourceDetails(citation: RagCitation, strings: LocaleStrings): string[] {\n const details: string[] = [];\n if (citation.sourceDocument) {\n details.push(citation.sourceDocument);\n }\n if (typeof citation.score === \"number\") {\n details.push(`${strings.sourceScore}: ${citation.score.toFixed(2)}`);\n }\n if (typeof citation.pageNumber === \"number\") {\n details.push(`${strings.sourcePage}: ${citation.pageNumber}`);\n }\n if (citation.sheetName) {\n details.push(`${strings.sourceSheet}: ${citation.sheetName}`);\n }\n if (typeof citation.rowNumber === \"number\") {\n details.push(`${strings.sourceRow}: ${citation.rowNumber}`);\n }\n if (citation.knowledgeName) {\n details.push(`${strings.sourceKnowledge}: ${citation.knowledgeName}`);\n }\n return details;\n}\n\nfunction renderMarkdown(target: HTMLElement, markdown: string): void {\n target.innerHTML = renderBlocks(normalizeMarkdown(markdown));\n}\n\nfunction normalizeMarkdown(markdown: string): string {\n return markdown.replace(/\\r\\n/g, \"\\n\").replace(/<br\\s*\\/?>/gi, \"\\n\");\n}\n\nfunction renderBlocks(markdown: string): string {\n const blocks = markdown.split(/\\n{2,}/).map((block) => block.trim()).filter(Boolean);\n return blocks.map(renderBlock).join(\"\");\n}\n\nfunction renderBlock(block: string): string {\n const lines = block.split(\"\\n\").map((line) => line.trimEnd());\n\n if (lines.every((line) => /^\\s*\\|.*\\|\\s*$/.test(line)) && lines.length >= 2) {\n return renderTable(lines);\n }\n\n if (lines.every((line) => /^\\d+\\.\\s+/.test(line))) {\n return `<ol>${lines\n .map((line) => `<li>${renderInline(line.replace(/^\\d+\\.\\s+/, \"\"))}</li>`)\n .join(\"\")}</ol>`;\n }\n\n if (lines.every((line) => /^[-*]\\s+/.test(line))) {\n return `<ul>${lines\n .map((line) => `<li>${renderInline(line.replace(/^[-*]\\s+/, \"\"))}</li>`)\n .join(\"\")}</ul>`;\n }\n\n const headingMatch = lines[0]?.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n const hashes = headingMatch[1] ?? \"#\";\n const headingText = headingMatch[2] ?? \"\";\n const level = hashes.length;\n return `<h${level}>${renderInline(headingText)}</h${level}>`;\n }\n\n return `<p>${lines.map((line) => renderInline(line)).join(\"<br>\")}</p>`;\n}\n\nfunction renderTable(lines: string[]): string {\n const rows = lines\n .filter((line, index) => !(index === 1 && /^\\s*\\|?(\\s*:?-{3,}:?\\s*\\|)+\\s*$/.test(line)))\n .map((line) => splitTableRow(line));\n\n if (rows.length === 0) {\n return \"\";\n }\n\n const header = rows[0] ?? [];\n const body = rows.slice(1);\n const headHtml = `<thead><tr>${header\n .map((cell) => `<th>${renderInline(cell)}</th>`)\n .join(\"\")}</tr></thead>`;\n const bodyHtml = body.length\n ? `<tbody>${body\n .map(\n (row) =>\n `<tr>${row.map((cell) => `<td>${renderInline(cell)}</td>`).join(\"\")}</tr>`\n )\n .join(\"\")}</tbody>`\n : \"\";\n\n return `<div class=\"kp-table-wrap\"><table>${headHtml}${bodyHtml}</table></div>`;\n}\n\nfunction splitTableRow(line: string): string[] {\n return line\n .trim()\n .replace(/^\\|/, \"\")\n .replace(/\\|$/, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n}\n\nfunction renderInline(text: string): string {\n let html = escapeHtml(text);\n html = html.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noreferrer\">$1</a>');\n html = html.replace(/`([^`]+)`/g, \"<code>$1</code>\");\n html = html.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n html = html.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n return html;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAi1C1C,CClxCA,IAAMG,GAAyC,CAC7C,GAAI,CACF,gBAAiB,oBACjB,QAAS,WACT,QAAS,WACT,cAAe,2BACf,KAAM,OACN,MAAO,QACP,eAAgB,sBAChB,mBAAoB,iCACpB,WAAY,cACZ,eAAgB,kBAChB,kBAAmB,qBACnB,0BAA2B,yDAC3B,mBAAoB,6DACpB,SAAU,cACV,mBAAoB,wBACpB,cAAe,iBACf,cAAe,uBACf,cAAe,uBACf,QAAS,gBACT,aAAc,mBACd,QAAS,WACT,UAAW,aACX,WAAY,SACZ,WAAY,SACZ,YAAa,eACb,aAAc,wBACd,kBAAoBC,GAAU,GAAGA,CAAK,YAAYA,EAAQ,EAAI,IAAM,EAAE,YACtE,YAAa,eACb,eAAgB,mBAChB,uBAAwB,8BACxB,QAAS,WACT,UAAW,4CACX,kBAAmB,sBACnB,WAAY,cACZ,YAAa,QACb,WAAY,OACZ,YAAa,QACb,UAAW,MACX,gBAAiB,iBACjB,eAAgB,kBAChB,KAAM,OACN,OAAQ,SACR,QAAS,UACT,WAAY,aACZ,KAAM,eACN,gBAAiB,YACjB,WAAY,MACd,EACA,GAAI,CACF,gBAAiB,iHACjB,QAAS,sEACT,QAAS,mDACT,cAAe,+FACf,KAAM,2BACN,MAAO,iCACP,eAAgB,4EAChB,mBAAoB,oIACpB,WAAY,+FACZ,eAAgB,4EAChB,kBAAmB,oGACnB,0BAA2B,yRAC3B,mBAAoB,wQACpB,SAAU,yEACV,mBAAoB,2GACpB,cAAe,oDACf,cAAe,sIACf,cAAe,sIACf,QAAS,uGACT,aAAc,oHACd,QAAS,kFACT,UAAW,iHACX,WAAY,gEACZ,WAAY,qBACZ,YAAa,8FACb,aAAc,gJACd,kBAAoBA,GAAU,+CAAYA,CAAK,4BAAQA,EAAQ,EAAI,eAAO,EAAE,GAC5E,YAAa,oGACb,eAAgB,iHAChB,uBAAwB,8KACxB,QAAS,8CACT,UAAW,qKACX,kBAAmB,qGACnB,WAAY,0DACZ,YAAa,uCACb,WAAY,uCACZ,YAAa,uCACb,UAAW,2BACX,gBAAiB,4EACjB,eAAgB,mFAChB,KAAM,qBACN,OAAQ,8CACR,QAAS,2BACT,WAAY,gEACZ,KAAM,4EACN,gBAAiB,6CACjB,WAAY,kDACd,CACF,EAEO,SAASC,GAAiBC,EAA8C,CAC7E,GAAI,OAAO,SAAa,IACtB,MAAM,IAAI,MAAM,mDAAmD,EAGrE,IAAMC,EAAiBC,GAAcF,CAAM,EACrCG,EAASC,GAAgBH,EAAe,MAAM,EAC9CI,EAAUC,GAAiBL,EAAe,MAAM,EAChDM,EAAQC,GAAYL,CAAM,EAC1BM,EAAqB,CACzB,OAAQC,GAAcT,CAAc,EACpC,KAAM,GACN,aAAc,GACd,YAAa,GACb,oBAAqBA,EAAe,eACpC,oBAAqB,KACrB,SAAU,GACV,MAAO,CAAC,EACR,eAAgB,GAChB,aAAc,GACd,gBAAiB,GACjB,iBAAkB,IACpB,EAEMU,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,QAAQ,eAAiB,OAC9BV,EAAe,MAAM,YAAYU,CAAI,EAErC,IAAMC,EAAaD,EAAK,aAAa,CAAE,KAAM,MAAO,CAAC,EACrDE,GAAaD,EAAYX,EAAe,KAAK,EAE7C,IAAMa,EAAQC,EAAc,MAAO,kBAAkBd,EAAe,QAAQ,EAAE,EAC9Ea,EAAM,KAAOX,EACbW,EAAM,IAAMP,EAAQ,MAAQ,MACxBA,GACFO,EAAM,UAAU,IAAI,QAAQ,EAG9B,IAAME,EAAUD,EAAc,MAAO,YAAY,EAC3CE,EAAWF,EAAc,SAAU,aAAa,EACtDE,EAAS,KAAO,SAChBA,EAAS,aAAa,aAAchB,EAAe,iBAAiB,EACpEgB,EAAS,UAAY,CACnB,oDACA,8CACA,8CACA,8CACA,2CACA,SACF,EAAE,KAAK,EAAE,EAET,IAAMC,EAAQH,EAAc,UAAW,UAAU,EACjDG,EAAM,aAAa,OAAQ,QAAQ,EACnCA,EAAM,aAAa,aAAc,MAAM,EACvCA,EAAM,aAAa,aAAcjB,EAAe,KAAK,EAErD,IAAMkB,EAASJ,EAAc,MAAO,WAAW,EACzCK,EAAUL,EAAc,MAAO,YAAY,EAC3CM,EAAcN,EAAc,SAAU,gCAAgC,EAC5EM,EAAY,KAAO,SACnBA,EAAY,aAAa,aAAchB,EAAQ,eAAe,EAC9DgB,EAAY,UAAY,CACtB,0DACA,2DACF,EAAE,KAAK,EAAE,EACT,IAAMC,EAAWP,EAAc,MAAO,aAAa,EAC7CQ,EAAgBR,EAAc,SAAU,mBAAoBV,EAAQ,OAAO,EACjFkB,EAAc,KAAO,SACrB,IAAMC,EAAgBT,EAAc,SAAU,mBAAoBV,EAAQ,OAAO,EACjFmB,EAAc,KAAO,SACrB,IAAMC,EAAsBV,EAC1B,SACA,mBACAV,EAAQ,aACV,EACAoB,EAAoB,KAAO,SAC3BH,EAAS,OAAOC,EAAeC,EAAeC,CAAmB,EACjEL,EAAQ,OAAOC,EAAaC,CAAQ,EAEpC,IAAMI,EAAcX,EAAc,MAAO,eAAe,EAClDY,GAAQZ,EAAc,KAAM,WAAYd,EAAe,KAAK,EAC5D2B,GAAWb,EAAc,MAAO,cAAed,EAAe,QAAQ,EAC5EyB,EAAY,OAAOC,GAAOC,EAAQ,EAElC,IAAMC,EAAcd,EAAc,SAAU,WAAY,MAAG,EAC3Dc,EAAY,KAAO,SACnBA,EAAY,aAAa,aAAc5B,EAAe,cAAc,EACpEkB,EAAO,OAAOC,EAASM,EAAaG,CAAW,EAE/C,IAAMC,EAAOf,EAAc,MAAO,SAAS,EACrCgB,GAAOhB,EAAc,MAAO,SAAS,EACrCiB,GAAWjB,EAAc,MAAO,eAAgB,QAAG,EACnDkB,GAAWlB,EAAc,MAAO,eAAgBd,EAAe,cAAc,EACnF8B,GAAK,OAAOC,GAAUC,EAAQ,EAC9B,IAAMC,GAASnB,EAAc,MAAO,WAAW,EACzCoB,GAAOpB,EAAc,OAAQ,SAAS,EACtCqB,EAAQrB,EAAc,QAAS,UAAU,EAC/CqB,EAAM,KAAO,OACbA,EAAM,aAAe,MACrBA,EAAM,YAAcnC,EAAe,iBACnCmC,EAAM,aAAa,aAAcnC,EAAe,gBAAgB,EAEhE,IAAMoC,GAAatB,EAAc,SAAU,UAAW,QAAG,EACzDsB,GAAW,KAAO,SAClBA,GAAW,aAAa,aAAchC,EAAQ,IAAI,EAElD,IAAMiC,GAAOvB,EAAc,MAAO,UAAWV,EAAQ,kBAAkB,EAEvE8B,GAAK,OAAOC,EAAOC,EAAU,EAC7BH,GAAO,OAAOC,GAAMG,EAAI,EACxBpB,EAAM,OAAOC,EAAQW,EAAMI,EAAM,EACjCpB,EAAM,OAAOE,EAASC,EAAUC,CAAK,EACrCN,EAAW,YAAYE,CAAK,EAE5BgB,EAAK,YAAYC,EAAI,EAErB,IAAMQ,GAAcxB,EAAc,MAAO,gBAAgB,EACzDe,EAAK,YAAYS,EAAW,EAC5B,IAAMC,GAAezB,EAAc,UAAW,mBAAmB,EAC3D0B,GAAqB1B,EAAc,MAAO,oBAAoB,EAC9D2B,GAAc3B,EAAc,SAAU,kBAAmB,QAAG,EAClE2B,GAAY,KAAO,SACnBA,GAAY,aAAa,aAAcrC,EAAQ,IAAI,EACnD,IAAMsC,GAAe5B,EAAc,SAAU,oCAAqC,MAAG,EACrF4B,GAAa,KAAO,SACpBA,GAAa,aAAa,aAActC,EAAQ,KAAK,EACrDoC,GAAmB,OAAOC,GAAaC,EAAY,EACnD,IAAMC,GAAmB7B,EAAc,MAAO,kBAAkB,EAC1D8B,GAAqB9B,EAAc,MAAO,4BAA6BV,EAAQ,cAAc,EAC7FyC,GAAoB/B,EAAc,MAAO,kBAAkB,EAC3DgC,GAAqBhC,EAAc,MAAO,4BAA6BV,EAAQ,iBAAiB,EAChG2C,GAAoBjC,EAAc,MAAO,kBAAkB,EACjE6B,GAAiB,OACfC,GACAC,GACAC,GACAC,EACF,EACAR,GAAa,OAAOC,GAAoBG,EAAgB,EACxD1B,EAAM,YAAYsB,EAAY,EAC9B,IAAMS,EAA8B,CAClC,KAAAnB,EACA,MAAAM,EACA,YAAAG,GACA,KAAAR,GACA,KAAM,OACR,EAEMmB,EAAWnC,EAAc,UAAW,cAAc,EACxDmC,EAAS,aAAa,OAAQ,QAAQ,EACtCA,EAAS,aAAa,aAAc,MAAM,EAC1CA,EAAS,aAAa,aAAc,GAAGjD,EAAe,KAAK,OAAO,EAElE,IAAMkD,GAAgBpC,EAAc,MAAO,oBAAoB,EACzDqC,GAAiBrC,EAAc,MAAO,qBAAqB,EAC3DsC,GAAgBtC,EAAc,MAAO,oBAAoB,EACzDuC,GAAevC,EAAc,MAAO,0BAA2B,QAAG,EAClEwC,GAAoBxC,EACxB,MACA,0BACAd,EAAe,KACjB,EACAoD,GAAc,OAAOC,GAAcC,EAAiB,EAEpD,IAAMC,GAAwBzC,EAAc,MAAO,6BAA6B,EAC1E0C,GAAgB1C,EAAc,MAAO,qBAAsBV,EAAQ,cAAc,EACjFqD,GAAgB3C,EAAc,SAAU,qBAAsB,MAAG,EACvE2C,GAAc,KAAO,SACrBA,GAAc,aAAa,aAAcrD,EAAQ,kBAAkB,EACnEmD,GAAsB,OAAOC,GAAeC,EAAa,EACzDN,GAAe,OAAOC,GAAeG,EAAqB,EAE1D,IAAMG,GAAkB5C,EAAc,MAAO,sBAAsB,EAC7D6C,GAAkB7C,EAAc,QAAS,sBAAsB,EAC/D8C,GAAkB9C,EAAc,SAAU,wBAAyB,KAAKV,EAAQ,OAAO,EAAE,EAC/FwD,GAAgB,KAAO,SAEvB,IAAMC,GAAqB/C,EAAc,MAAO,qBAAqB,EAC/DgD,EAAsBhD,EAAc,QAAS,2BAA2B,EAC9EgD,EAAoB,KAAO,SAC3BA,EAAoB,YAAc1D,EAAQ,WAC1C,IAAM2D,GAAqBjD,EAAc,OAAQ,2BAA4B,QAAG,EAChF+C,GAAmB,OAAOC,EAAqBC,EAAkB,EAEjE,IAAMC,GAAsBlD,EAAc,MAAO,6BAA8BV,EAAQ,cAAc,EAC/F6D,GAAqBnD,EAAc,MAAO,0BAA0B,EACpEoD,GAAsBpD,EAAc,MAAO,6BAA8BV,EAAQ,iBAAiB,EAClG+D,GAAqBrD,EAAc,MAAO,0BAA0B,EAC1E6C,GAAgB,OACdC,GACAC,GACAG,GACAC,GACAC,GACAC,EACF,EAEA,IAAMC,GAAetD,EAAc,OAAQ,mBAAmB,EACxDuD,GAAgBvD,EAAc,UAAW,oBAAoB,EAC7DwD,GAAexD,EAAc,MAAO,mBAAmB,EACvDyD,GAAezD,EAAc,MAAO,mBAAmB,EACvD0D,GAAoB1D,EAAc,MAAO,yBAAyB,EACxE0D,GAAkB,UAAY,CAC5B,2EACA,8CACA,8CACA,8CACA,2CACA,SACF,EAAE,KAAK,EAAE,EACT,IAAMC,GAAmB3D,EACvB,MACA,yBACAd,EAAe,cACjB,EACAuE,GAAa,OAAOC,GAAmBC,EAAgB,EAEvD,IAAMC,GAAsB5D,EAAc,MAAO,yCAAyC,EAC1FwD,GAAa,OAAOC,GAAcG,EAAmB,EAErD,IAAMC,GAAiB7D,EAAc,MAAO,qBAAqB,EAC3D8D,GAAe9D,EAAc,OAAQ,2BAA2B,EAChE+D,EAAgB/D,EAAc,QAAS,6BAA6B,EAC1E+D,EAAc,KAAO,OACrBA,EAAc,aAAe,MAC7BA,EAAc,YAAc7E,EAAe,iBAC3C6E,EAAc,aAAa,aAAc7E,EAAe,gBAAgB,EACxE,IAAM8E,GAAehE,EAAc,SAAU,4BAA6B,QAAG,EAC7EgE,GAAa,KAAO,SACpBA,GAAa,aAAa,aAAc1E,EAAQ,IAAI,EACpD,IAAM2E,GAAejE,EACnB,MACA,4BACAV,EAAQ,yBACV,EACAwE,GAAa,OAAOC,EAAeC,EAAY,EAC/CH,GAAe,OAAOC,GAAcG,EAAY,EAChDV,GAAc,OAAOC,GAAcK,EAAc,EACjDP,GAAa,YAAYC,EAAa,EAEtC,IAAMW,GAAclE,EAAc,QAAS,iBAAiB,EACtDmE,GAAoBnE,EAAc,MAAO,wBAAwB,EACjEoE,GAAuBpE,EAAc,MAAO,4BAA4B,EACxEqE,GAAmBrE,EAAc,MAAO,wBAAyBV,EAAQ,cAAc,EACvFgF,GAAsBtE,EAC1B,MACA,2BACAV,EAAQ,sBACV,EACA8E,GAAqB,OAAOC,GAAkBC,EAAmB,EACjE,IAAMC,GAAmBvE,EAAc,SAAU,wBAAyB,MAAG,EAC7EuE,GAAiB,KAAO,SACxBA,GAAiB,aAAa,aAAcjF,EAAQ,iBAAiB,EACrE6E,GAAkB,OAAOC,GAAsBG,EAAgB,EAC/D,IAAMC,EAAkBxE,EAAc,MAAO,sBAAsB,EAC7DyE,GAAmBzE,EAAc,MAAO,wBAAyBV,EAAQ,SAAS,EACxFkF,EAAgB,YAAYC,EAAgB,EAC5CP,GAAY,OAAOC,GAAmBK,CAAe,EAErD5B,GAAgB,OAAOC,GAAiBS,GAAcY,EAAW,EACjE9B,GAAc,OAAOC,GAAgBO,EAAe,EACpDT,EAAS,YAAYC,EAAa,EAClCrC,EAAM,YAAYoC,CAAQ,EAE1B,IAAMuC,EAAiC,CACrC,KAAMlB,GACN,MAAOO,EACP,YAAaH,GACb,KAAMH,GACN,KAAM,WACR,EAEMkB,EAAmB,KAAiC,CACxD,GAAGzF,EACH,eAAgBQ,EAAM,mBACxB,GAEMkF,GAAqB,SAAoC,CAC7D,GAAI,CAAC1F,EAAe,eAClB,OAAO,KAGT,GAAI,CACF,IAAM2F,EAAO,MAAM3F,EAAe,eAAe,EACjD,OAAO2F,GAAM,aAAa,KAAK,GAAKA,GAAM,OAAO,KAAK,GAAKA,GAAM,QAAQ,KAAK,GAAK,IACrF,MAAQ,CACN,OAAO,IACT,CACF,EAEMC,EAAkB,CAACC,EAA0BC,IAA6B,CAO9E,GANAtF,EAAM,gBAAkB,GACxBA,EAAM,iBAAmBsF,GAAa1F,EAAQ,eAC9C+E,GAAiB,YAAc3E,EAAM,iBACrCwE,GAAY,UAAU,IAAI,MAAM,EAChCM,EAAgB,YAAc,GAE1BO,EAAU,SAAW,EAAG,CAC1BP,EAAgB,YAAYxE,EAAc,MAAO,wBAAyBV,EAAQ,SAAS,CAAC,EAC5F,MACF,CAEA,QAAW2F,KAAYF,EACrBP,EAAgB,YAAYU,GAAgBD,EAAU3F,CAAO,CAAC,CAElE,EAEM6F,GAAkB,IAAY,CAClCzF,EAAM,gBAAkB,GACxBA,EAAM,iBAAmB,KACzBwE,GAAY,UAAU,OAAO,MAAM,CACrC,EAEAkB,EAAsBlD,EAAWhD,EAAe,mBAAoB,MAAOmG,GAAS,CAClF,MAAMC,EAAkBD,EAAMnD,CAAS,CACzC,CAAC,EACDkD,EAAsBV,EAAcxF,EAAe,mBAAoB,MAAOmG,GAAS,CACrF,MAAMC,EAAkBD,EAAMX,CAAY,CAC5C,CAAC,EACDa,EAAwB,EACxBC,GAAwB,EAExB,SAASC,IAAa,CAChB/F,EAAM,OAIVA,EAAM,KAAO,GACbA,EAAM,aAAe,GACrBgG,EAAkB,EAClBvD,EAAS,UAAU,OAAO,MAAM,EAChCjC,EAAS,UAAU,IAAI,QAAQ,EAC/BD,EAAQ,UAAU,IAAI,SAAS,EAC/BE,EAAM,UAAU,IAAI,MAAM,EAC1BjB,EAAe,SAAS,EACpBA,EAAe,IAAI,mBAChByG,GAAS,YAAY,EAE5B,eAAe,IAAMtE,EAAM,MAAM,CAAC,EACpC,CAEA,SAASuE,GAAc,CAChBlG,EAAM,OAIXmG,EAAU,EACVH,EAAkB,EAClBhG,EAAM,KAAO,GACbQ,EAAS,UAAU,OAAO,QAAQ,EAClCD,EAAQ,UAAU,OAAO,SAAS,EAClCE,EAAM,UAAU,OAAO,MAAM,EAC7BjB,EAAe,UAAU,EAC3B,CAEA,eAAeoG,EACbQ,EACAC,EACe,CACf,IAAMC,EAAUF,EAAQ,KAAK,EAE7B,GAAI,CAACE,EACH,OAGFD,EAAK,MAAM,MAAQ,GAEnB,GAAI,CACF,MAAME,GAAiBD,CAAO,CAChC,OAASE,EAAO,CACd,IAAMC,EAAaC,EAAkBlH,EAAgBgH,CAAK,EAC1DG,EAAcN,EAAK,KAAM,MAAO,GAAGzG,EAAQ,kBAAkB,KAAK6G,EAAW,OAAO,GAAI,CACtF,QAAA7G,EACA,KAAAyG,EACA,SAAU,KACV,cAAejB,CACjB,CAAC,EACD,MACF,CAEAwB,GAA2BP,CAAI,EAC/BM,EAAcN,EAAK,KAAM,OAAQC,EAAS,CACxC,QAAA1G,EACA,KAAAyG,EACA,SAAU,MAAMnB,GAAmB,EACnC,cAAeE,CACjB,CAAC,EACDiB,EAAK,KAAK,UAAYA,EAAK,KAAK,aAEhC,IAAMQ,EAAUvG,EAAc,MAAO,aAAcV,EAAQ,QAAQ,EACnEyG,EAAK,KAAK,YAAYQ,CAAO,EAC7BR,EAAK,KAAK,UAAYA,EAAK,KAAK,aAEhC,GAAI,CACF,IAAMS,EAAW,MAAMC,GAAY9B,EAAiB,EAAG,CACrD,QAASqB,EACT,OAAQtG,EAAM,OACd,eAAgB,MAAMgH,GAAsBxH,CAAc,EAC1D,GAAIA,EAAe,IAAI,mBAAqB,OACxC,CAAE,iBAAkBA,EAAe,IAAI,gBAAiB,EACxD,CAAC,CACP,CAAC,EAEGqH,EAAQ,aACVA,EAAQ,OAAO,EAGjBF,EAAcN,EAAK,KAAM,MAAOS,EAAS,OAAQ,CAC/C,QAAAlH,EACA,KAAAyG,EACA,SAAU,KACV,UAAWS,EAAS,WAAa,CAAC,EAClC,cAAe1B,CACjB,CAAC,EACDpF,EAAM,oBAAsB,KAC5B,MAAMiH,EAAa,EAEfH,EAAS,aAAa,QACxBpB,EAAsBW,EAAMS,EAAS,YAAa,MAAOnB,GAAS,CAChE,MAAMC,EAAkBD,EAAMU,CAAI,CACpC,CAAC,CAEL,OAASG,EAAO,CACd,IAAMC,EAAaC,EAAkBlH,EAAgBgH,CAAK,EAEtDK,EAAQ,aACVA,EAAQ,OAAO,EAGjBF,EAAcN,EAAK,KAAM,MAAO,GAAGzG,EAAQ,aAAa,KAAK6G,EAAW,OAAO,GAAI,CACjF,QAAA7G,EACA,KAAAyG,EACA,SAAU,KACV,cAAejB,CACjB,CAAC,CACH,CACF,CAEA,eAAe8B,GAAYd,EAAgC,CACzD,IAAMe,EAAanH,EAAM,aAAegF,EAAexC,EACvD,MAAMoD,EAAkBQ,EAASe,CAAU,CAC7C,CAEA,eAAeC,IAA8B,CAC3CpH,EAAM,aAAe,GACrBA,EAAM,KAAO,GACbmG,EAAU,EACVH,EAAkB,EAClBvF,EAAM,UAAU,OAAO,MAAM,EAC7BF,EAAQ,UAAU,OAAO,SAAS,EAClCC,EAAS,UAAU,IAAI,QAAQ,EAC/BiC,EAAS,UAAU,IAAI,MAAM,EAC7B,MAAMwE,EAAa,EACnB,MAAMI,GAAoBrC,EAAchF,EAAM,MAAM,EACpD,eAAe,IAAMqE,EAAc,MAAM,CAAC,CAC5C,CAEA,SAASiD,IAAsB,CACxBtH,EAAM,eAIXA,EAAM,aAAe,GACrByC,EAAS,UAAU,OAAO,MAAM,EAChCjC,EAAS,UAAU,OAAO,QAAQ,EAClCiF,GAAgB,EAClB,CAEA,SAAS8B,IAAiB,CACxBvH,EAAM,SAAW,GACjBY,EAAY,UAAU,IAAI,MAAM,EAChCC,EAAS,UAAU,IAAI,MAAM,CAC/B,CAEA,SAASsF,GAAkB,CACzBnG,EAAM,SAAW,GACjBY,EAAY,UAAU,OAAO,MAAM,EACnCC,EAAS,UAAU,OAAO,MAAM,CAClC,CAEA,SAAS2G,IAA0B,CACjCxH,EAAM,OAASC,GAAcT,CAAc,EAC3CQ,EAAM,oBAAsB,KAC5BgG,EAAkB,EAClByB,EAAsBjF,CAAS,EAC/BkD,EAAsBlD,EAAWhD,EAAe,mBAAoB,MAAOmG,GAAS,CAClF,MAAMC,EAAkBD,EAAMnD,CAAS,CACzC,CAAC,EACD2D,EAAU,CACZ,CAEA,eAAeuB,IAA2C,CACxD1H,EAAM,OAASC,GAAcT,CAAc,EAC3CQ,EAAM,oBAAsB,KAC5ByH,EAAsBzC,CAAY,EAClCS,GAAgB,EAChBC,EAAsBV,EAAcxF,EAAe,mBAAoB,MAAOmG,GAAS,CACrF,MAAMC,EAAkBD,EAAMX,CAAY,CAC5C,CAAC,EACDa,EAAwB,CAC1B,CAEA,eAAeoB,GAAwC,CACrD,GAAI,CAACzH,EAAe,UAAU,UAC5B,OAAAqG,EAAwB,EACxBC,GAAwB,EACjB,CAAC,EAGV9F,EAAM,aAAe,GACrB6F,EAAwB,EACxBC,GAAwB,EAExB,GAAI,CACF,IAAM6B,EAAQ,MAAMC,GAAW3C,EAAiB,CAAC,EACjD,OAAAjF,EAAM,MAAQ2H,EACPA,CACT,OAASnB,EAAO,CACd,OAAAE,EAAkBlH,EAAgBgH,CAAK,EAChCxG,EAAM,KACf,QAAE,CACAA,EAAM,aAAe,GACrB6F,EAAwB,EACxBC,GAAwB,CAC1B,CACF,CAEA,eAAeS,GAAiBsB,EAAqC,CAC/D,CAACrI,EAAe,UAAU,WAAa,CAACA,EAAe,UAAU,YAIjEQ,EAAM,MAAM,KAAM8H,GAASA,EAAK,SAAW9H,EAAM,MAAM,GAI3D,MAAM+H,GACJ9C,EAAiB,EACjBjF,EAAM,OACN6H,EAAcG,GAAeH,EAAajI,EAAQ,OAAO,EAAI,MAC/D,CACF,CAEA,eAAeqI,GAAWC,EAA+B,CACvDlI,EAAM,OAASkI,EACflI,EAAM,oBAAsB,KAC5B,MAAMqH,GAAoBrC,EAAckD,CAAM,EAC9CrC,EAAwB,CAC1B,CAEA,eAAesC,GAAoBD,EAA+B,CAChElI,EAAM,OAASkI,EACflI,EAAM,oBAAsB,KAC5B,MAAMqH,GAAoB7E,EAAW0F,CAAM,EAC3ClC,EAAkB,CACpB,CAEA,eAAeoC,IAAkC,CAC/CjC,EAAU,EACV,MAAMc,EAAa,EACnBjH,EAAM,YAAc,GACpBS,EAAM,UAAU,IAAI,eAAe,EACnCsB,GAAa,UAAU,IAAI,MAAM,CACnC,CAEA,SAASiE,GAA0B,CACjChG,EAAM,YAAc,GACpBS,EAAM,UAAU,OAAO,eAAe,EACtCsB,GAAa,UAAU,OAAO,MAAM,CACtC,CAEA,eAAesG,GAAeP,EAAmC,CAC/D,GAAI,CAACtI,EAAe,UAAU,WAC5B,OAGF,IAAM8I,EAAY,OAAO,OAAO1I,EAAQ,aAAckI,EAAK,KAAK,GAAG,KAAK,EACxE,GAAI,GAACQ,GAAaA,IAAcR,EAAK,OAIrC,GAAI,CACF,MAAMS,GAAWtD,EAAiB,EAAG6C,EAAK,OAAQ,CAChD,MAAOQ,CACT,CAAC,EACD,MAAMrB,EAAa,CACrB,OAAST,EAAO,CACdE,EAAkBlH,EAAgBgH,CAAK,CACzC,CACF,CAEA,eAAegC,GAAeV,EAAmC,CAC/D,GAAKtI,EAAe,UAAU,WAI9B,GAAI,CACF,MAAMiJ,GAAWxD,EAAiB,EAAG6C,EAAK,MAAM,EAC5C9H,EAAM,SAAW8H,EAAK,SACxB9H,EAAM,OAASC,GAAcT,CAAc,EAC3CQ,EAAM,oBAAsB,KAC5ByH,EAAsBjF,CAAS,EAC/BiF,EAAsBzC,CAAY,GAEpC,MAAMiC,EAAa,CACrB,OAAST,EAAO,CACdE,EAAkBlH,EAAgBgH,CAAK,CACzC,CACF,CAEA,SAASX,GAAgC,CACvC6C,GACEjF,GACAE,GACA3D,EACAJ,EACA,MAAOkI,GAAS,CACd,MAAMG,GAAWH,EAAK,MAAM,CAC9B,EACA,MAAOA,GAAS,CACd,MAAMa,GAAiBb,CAAI,CAC7B,EACA,MAAOA,GAAS,CACd,MAAMO,GAAeP,CAAI,CAC3B,EACA,MAAOA,GAAS,CACd,MAAMU,GAAeV,CAAI,CAC3B,CACF,CACF,CAEA,SAAShC,IAAgC,CACvC4C,GACErG,GACAE,GACAvC,EACAJ,EACA,MAAOkI,GAAS,CACd,MAAMK,GAAoBL,EAAK,MAAM,CACvC,EACA,MAAOA,GAAS,CACd,MAAMa,GAAiBb,CAAI,CAC7B,EACA,MAAOA,GAAS,CACd,MAAMO,GAAeP,CAAI,CAC3B,EACA,MAAOA,GAAS,CACd,MAAMU,GAAeV,CAAI,CAC3B,CACF,CACF,CAEA,eAAea,GAAiBb,EAAmC,CACjE,GAAKtI,EAAe,UAAU,WAI9B,GAAI,CACF,MAAM+I,GAAWtD,EAAiB,EAAG6C,EAAK,OAAQ,CAChD,OAAQ,CAACA,EAAK,MAChB,CAAC,EACD,MAAMb,EAAa,CACrB,OAAST,EAAO,CACdE,EAAkBlH,EAAgBgH,CAAK,CACzC,CACF,CAEA,eAAea,GACbhB,EACA6B,EAC+B,CAC/BT,EAAsBpB,CAAI,EAC1BX,EAAsBW,EAAM7G,EAAe,mBAAoB,MAAOmG,GAAS,CAC7E,MAAMC,EAAkBD,EAAMU,CAAI,CACpC,CAAC,EAED,IAAMuC,EAAW,MAAMC,GAAa5D,EAAiB,EAAGiD,CAAM,EAE9D,OAAIU,EAAS,OAAS,IACpBhC,GAA2BP,CAAI,EAC/ByC,GAA0BzC,EAAK,KAAMA,EAAK,KAAMA,EAAK,WAAW,EAChE0C,GAAc1C,EAAK,KAAMuC,EAAU,CACjC,QAAAhJ,EACA,KAAAyG,EACA,SAAU,MAAMnB,GAAmB,EACnC,cAAeE,CACjB,CAAC,GAGHpF,EAAM,oBAAsBkI,EACrBU,CACT,CAEA,IAAM3C,GAA+B,CACnC,KAAAF,GACA,MAAAG,EACA,QAAS,CACP,GAAIlG,EAAM,KAAM,CACdkG,EAAM,EACN,MACF,CAEAH,GAAK,CACP,EACA,SAAU,CACR,SAAS,oBAAoB,UAAWiD,EAAmB,EAC3D9I,EAAK,OAAO,CACd,EACA,YAAAgH,GACA,uBAAuB+B,EAAU,CAC/BjJ,EAAM,oBAAsBiJ,CAC9B,EACA,WAAY,CACV,OAAOjJ,EAAM,MACf,EACA,WAAY,CACV,OAAOiH,EAAa,CACtB,EACA,MAAM,aAAc,CAClB,IAAME,EAAanH,EAAM,aAAegF,EAAexC,EACvD,OAAO6E,GAAoBF,EAAYnH,EAAM,MAAM,CACrD,CACF,EAEAQ,EAAS,iBAAiB,QAAS,IAAMyF,GAAS,OAAO,CAAC,EAC1D7E,EAAY,iBAAiB,QAAS8E,CAAK,EAC3C3F,EAAQ,iBAAiB,QAAS2F,CAAK,EACvCrB,GAAiB,iBAAiB,QAASY,EAAe,EAC1DxD,GAAY,iBAAiB,QAAS+D,CAAiB,EACvD9D,GAAa,iBAAiB,QAAS8D,CAAiB,EACxDpF,EAAY,iBAAiB,QAAUsI,GAAU,CAE/C,GADAA,EAAM,gBAAgB,EAClB,CAAClJ,EAAM,SAAU,CACnBuH,GAAS,EACT,MACF,CAEApB,EAAU,CACZ,CAAC,EACDrF,EAAc,iBAAiB,QAAS0G,EAAiB,EACzDzG,EAAc,iBAAiB,QAAS,SAAY,CAClD,MAAMqH,GAAiB,CACzB,CAAC,EACDpH,EAAoB,iBAAiB,QAAS,IAAM,CAC7CoG,GAAa,CACpB,CAAC,EACDnE,GAAc,iBAAiB,QAASqE,EAAa,EACrDlE,GAAgB,iBAAiB,QAAS,IAAM,CACzCsE,GAA0B,EAC/B,eAAe,IAAMrD,EAAc,MAAM,CAAC,CAC5C,CAAC,EACDf,EAAoB,iBAAiB,QAAS,IAAM,CAClDtD,EAAM,eAAiBsD,EAAoB,MAAM,KAAK,EAAE,YAAY,EACpEuC,EAAwB,CAC1B,CAAC,EACDpF,EAAM,iBAAiB,QAAUyI,GAAU,CACzC,IAAMC,EAASD,EAAM,OACrB,GAAI,EAAEC,aAAkB,UAAY,CAACA,EAAO,QAAQ,kBAAkB,EAAG,CACvE,QAAWC,KAAe,MAAM,KAAKjJ,EAAW,iBAAiB,uBAAuB,CAAC,EACvFiJ,EAAY,UAAU,OAAO,MAAM,EAErC,QAAWC,KAAY,MAAM,KAAKlJ,EAAW,iBAAiB,mCAAmC,CAAC,EAChGkJ,EAAS,UAAU,OAAO,WAAW,CAEzC,CAEErJ,EAAM,UACN,CAACa,EAAS,SAASsI,CAAM,GACzB,CAACvI,EAAY,SAASuI,CAAM,GAE5BhD,EAAU,EAEZ+C,EAAM,gBAAgB,CACxB,CAAC,EACD/I,EAAW,iBAAiB,QAAU+I,GAAU,CAC9C,IAAMC,EAASD,EAAM,OASrB,GAPElJ,EAAM,UACNmJ,aAAkB,MAClB,CAACtI,EAAS,SAASsI,CAAM,GACzB,CAACvI,EAAY,SAASuI,CAAM,GAE5BhD,EAAU,EAGVgD,aAAkB,SAClB,CAACA,EAAO,QAAQ,kBAAkB,EAClC,CACA,QAAWC,KAAe,MAAM,KAAKjJ,EAAW,iBAAiB,uBAAuB,CAAC,EACvFiJ,EAAY,UAAU,OAAO,MAAM,EAErC,QAAWC,KAAY,MAAM,KAAKlJ,EAAW,iBAAiB,mCAAmC,CAAC,EAChGkJ,EAAS,UAAU,OAAO,WAAW,CAEzC,CACF,CAAC,EACD3H,GAAK,iBAAiB,SAAU,MAAOwH,GAAU,CAC/CA,EAAM,eAAe,EACrB,MAAMhC,GAAYvF,EAAM,KAAK,CAC/B,CAAC,EACDyC,GAAa,iBAAiB,SAAU,MAAO8E,GAAU,CACvDA,EAAM,eAAe,EACrB,MAAMtD,EAAkBvB,EAAc,MAAOW,CAAY,CAC3D,CAAC,EAED,SAASgE,GAAoBE,EAA4B,CACvD,GAAIA,EAAM,MAAQ,SAIlB,IAAIlJ,EAAM,gBAAiB,CACzByF,GAAgB,EAChB,MACF,CAEA,GAAIzF,EAAM,YAAa,CACrBgG,EAAkB,EAClB,MACF,CAEA,GAAIhG,EAAM,aAAc,CACtBsH,GAAc,EACd,MACF,CAEItH,EAAM,MACRkG,EAAM,EAEV,CAEA,gBAAS,iBAAiB,UAAW8C,EAAmB,EAEjD/C,EACT,CAEA,eAAee,GACbzH,EACmB,CACnB,GAAIA,EAAO,IAAI,kBAAmB,CAChC,IAAM+J,EAAQ,MAAM/J,EAAO,IAAI,kBAAkB,EACjD,OAAO,MAAM,QAAQ+J,CAAK,EAAIA,EAAM,OAAO,OAAO,EAAI,CAAC,CACzD,CAEA,OAAQ/J,EAAO,IAAI,gBAAkB,CAAC,GAAG,OAAO,OAAO,CACzD,CAEA,SAASU,GAAcV,EAA0C,CAC/D,OAAIA,EAAO,IAAI,QAAQ,KAAK,EACnBA,EAAO,IAAI,OAGhBA,EAAO,IAAI,cACNA,EAAO,IAAI,cAAc,EAG9B,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,WACzD,OAAO,WAAW,EAGpB,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAAC,EACzE,CAEA,SAASoH,EACPtF,EACAkI,EACA5D,EACA6D,EAOgB,CAChB,IAAMC,EACJF,IAAS,MACLG,GAA8B/D,EAAM6D,EAAQ,WAAa,CAAC,CAAC,EAC3D,CACE,YAAa7D,EACb,UAAW6D,EAAQ,WAAa,CAAC,CACnC,EACAG,EAAMrJ,EAAc,MAAO,kBAAkBiJ,CAAI,EAAE,EACnDK,EAASC,GACbN,IAAS,MAAQC,EAAQ,QAAQ,gBAAkBA,EAAQ,UAAYA,EAAQ,QAAQ,WACvFD,CACF,EACMO,EAASxJ,EAAc,MAAO,aAAaiJ,CAAI,EAAE,EACjDQ,EAAUzJ,EAAc,MAAO,mBAAmB,EACxD0J,GAAeD,EAASN,EAAe,WAAW,EAClDK,EAAO,YAAYC,CAAO,EAE1B,IAAM1E,EAAYoE,EAAe,UACjC,GAAIpE,EAAU,OAAQ,CACpB,IAAM4E,EAAO3J,EACX,MACA,UACAkJ,EAAQ,QAAQ,kBAAkBnE,EAAU,MAAM,CACpD,EACAyE,EAAO,YAAYG,CAAI,EAEvB,IAAMC,EAAgB5J,EAAc,MAAO,mBAAmB,EACxD6J,EAAc7J,EAAc,MAAO,0BAA2BkJ,EAAQ,QAAQ,WAAW,EACzFY,EAAc9J,EAAc,MAAO,wBAAwB,EACjE,QAAWiF,KAAYF,EAAU,MAAM,EAAG,CAAC,EAAG,CAC5C,IAAMgF,EAAOC,GAAuB/E,EAAUiE,EAAQ,OAAO,EAC7Da,EAAK,iBAAiB,QAAS,SAAY,CACzCE,GAAqBhF,EAAUiE,EAAQ,OAAO,CAChD,CAAC,EACDY,EAAY,YAAYC,CAAI,CAC9B,CACA,IAAMG,EAAUC,GAAiBjB,EAAQ,OAAO,EAChDgB,EAAQ,iBAAiB,QAAS,SAAY,CAC5ChB,EAAQ,cAAcnE,EAAWmE,EAAQ,QAAQ,cAAc,CACjE,CAAC,EACDY,EAAY,YAAYI,CAAO,EAC/BN,EAAc,OAAOC,EAAaC,CAAW,EAC7CN,EAAO,YAAYI,CAAa,CAClC,CAEA,OAAIX,IAAS,OACXO,EAAO,YAAYY,GAAqBjB,EAAe,YAAaD,EAAQ,OAAO,CAAC,EAGlFD,IAAS,OACXI,EAAI,OAAOG,EAAQF,CAAM,EAEzBD,EAAI,OAAOC,EAAQE,CAAM,EAG3BzI,EAAK,YAAYsI,CAAG,EACpBtI,EAAK,UAAYA,EAAK,aACfsI,CACT,CAEA,SAASe,GAAqB/E,EAAc/F,EAAwC,CAClF,IAAM+K,EAAUrK,EAAc,MAAO,oBAAoB,EACnDsK,EAAatK,EAAc,SAAU,oBAAqBV,EAAQ,IAAI,EAC5EgL,EAAW,KAAO,SAClBA,EAAW,iBAAiB,QAAS,SAAY,CAC/C,GAAI,CACF,MAAM,UAAU,UAAU,UAAUjF,CAAI,EACxCiF,EAAW,YAAchL,EAAQ,OACjC,OAAO,WAAW,IAAM,CACtBgL,EAAW,YAAchL,EAAQ,IACnC,EAAG,IAAI,CACT,MAAQ,CACNgL,EAAW,YAAchL,EAAQ,IACnC,CACF,CAAC,EAED,IAAMiL,EAAavK,EAAc,SAAU,oBAAqB,WAAI,EACpEuK,EAAW,KAAO,SAClBA,EAAW,aAAa,aAAcjL,EAAQ,OAAO,EACrDiL,EAAW,iBAAiB,QAAS,IAAM,CACzCA,EAAW,UAAU,OAAO,QAAQ,EACpCC,EAAc,UAAU,OAAO,QAAQ,CACzC,CAAC,EAED,IAAMA,EAAgBxK,EAAc,SAAU,oBAAqB,WAAI,EACvE,OAAAwK,EAAc,KAAO,SACrBA,EAAc,aAAa,aAAclL,EAAQ,UAAU,EAC3DkL,EAAc,iBAAiB,QAAS,IAAM,CAC5CA,EAAc,UAAU,OAAO,QAAQ,EACvCD,EAAW,UAAU,OAAO,QAAQ,CACtC,CAAC,EAEDF,EAAQ,OAAOC,EAAYC,EAAYC,CAAa,EAC7CH,CACT,CAEA,SAASd,GAAakB,EAAexB,EAAsC,CACzE,IAAMK,EAAStJ,EAAc,MAAO,aAAaiJ,CAAI,EAAE,EACjDyB,EAAWzB,IAAS,MAAQ,SAAM0B,GAAYF,CAAK,EACzD,OAAAnB,EAAO,YAAcoB,EACrBpB,EAAO,aAAa,cAAe,MAAM,EAClCA,CACT,CAEA,SAASsB,GACPC,EACArJ,EACAsJ,EACM,CACND,EAAU,YAAc,GAExB,QAAWE,KAAcvJ,EAAa,CACpC,IAAMwJ,EAAShL,EAAc,SAAU,gBAAiB+K,CAAU,EAClEC,EAAO,KAAO,SACdA,EAAO,iBAAiB,QAAS,SAAY,CAC3C,MAAMF,EAAQC,CAAU,CAC1B,CAAC,EACDF,EAAU,YAAYG,CAAM,CAC9B,CACF,CAEA,SAAS5F,EACPW,EACAvE,EACAsJ,EACM,CACNF,GAAkB7E,EAAK,YAAavE,EAAa,MAAO6D,GAAS,CAC/DU,EAAK,MAAM,MAAQV,EACnB,MAAMyF,EAAQzF,CAAI,CACpB,CAAC,CACH,CAEA,SAASmD,GACPzH,EACAC,EACAQ,EACM,CACN,IAAMyJ,EAAiB,IAAI,IAAI,CAACjK,EAAMQ,CAAW,CAAC,EAClD,QAAW0J,KAAS,MAAM,KAAKnK,EAAK,QAAQ,EACrCkK,EAAe,IAAIC,CAAuB,GAC7CA,EAAM,OAAO,CAGnB,CAEA,SAAS5E,GAA2BP,EAA8B,CAChEA,EAAK,KAAK,UAAU,IAAI,wBAAwB,EAChDA,EAAK,KAAK,OAAO,EACjBA,EAAK,YAAY,OAAO,CAC1B,CAEA,SAASoB,EAAsBpB,EAA8B,CAC3DA,EAAK,KAAK,UAAU,OAAO,wBAAwB,EAE9CA,EAAK,KAAK,aACbA,EAAK,KAAK,QAAQA,EAAK,IAAI,EAGxBA,EAAK,YAAY,aACpBA,EAAK,KAAK,YAAYA,EAAK,WAAW,EAGxCyC,GAA0BzC,EAAK,KAAMA,EAAK,KAAMA,EAAK,WAAW,EAChEA,EAAK,MAAM,MAAQ,EACrB,CAEA,SAAS0C,GACP1H,EACAuH,EACAY,EAMM,CACN,QAAWpD,KAAWwC,EACpBjC,EAActF,EAAM+E,EAAQ,OAAS,YAAc,MAAQ,OAAQA,EAAQ,KAAMoD,CAAO,CAE5F,CAEA,SAASd,GACP+C,EACAC,EACA1L,EACAJ,EACA+L,EACAC,EACAC,EACAC,EACM,CAIN,GAHAL,EAAgB,YAAc,GAC9BC,EAAgB,YAAc,GAE1B1L,EAAM,aAAc,CACtByL,EAAgB,YAAYnL,EAAc,MAAO,qBAAsBV,EAAQ,YAAY,CAAC,EAC5F,MACF,CAEA,IAAMmM,EAAgB/L,EAAM,MAAM,OAAQ8H,GACnC9H,EAAM,eAIJ8H,EAAK,MAAM,YAAY,EAAE,SAAS9H,EAAM,cAAc,EAHpD,EAIV,EAED,GAAI+L,EAAc,OAAS,EAAG,CAC5B,IAAMC,EAAcD,EAAc,OAAQjE,GAASA,EAAK,MAAM,EACxDmE,EAAcF,EAAc,OAAQjE,GAAS,CAACA,EAAK,MAAM,EAAE,MAAM,EAAG,CAAC,EAE3EoE,GACET,EACAQ,EACAjM,EAAM,OACNJ,EACA+L,EACAC,EACAC,EACAC,CACF,EACAI,GACER,EACAM,EACAhM,EAAM,OACNJ,EACA+L,EACAC,EACAC,EACAC,CACF,EAEIG,EAAY,SAAW,GACzBR,EAAgB,YAAYnL,EAAc,MAAO,qBAAsBV,EAAQ,aAAa,CAAC,EAG3FoM,EAAY,SAAW,GACzBN,EAAgB,YAAYpL,EAAc,MAAO,qBAAsBV,EAAQ,aAAa,CAAC,EAG/F,MACF,CAEA6L,EAAgB,YAAYnL,EAAc,MAAO,qBAAsBV,EAAQ,OAAO,CAAC,EACvF8L,EAAgB,YAAYpL,EAAc,MAAO,qBAAsBV,EAAQ,aAAa,CAAC,CAC/F,CAEA,SAASsM,GACPf,EACAxD,EACAwE,EACAvM,EACA+L,EACAC,EACAC,EACAC,EACM,CACN,QAAWhE,KAAQH,EAAO,CACxB,IAAMgC,EAAMrJ,EACV,MACA,2CAA2CwH,EAAK,SAAWqE,EAAe,UAAY,EAAE,EAC1F,EAEMjL,EAAQZ,EAAc,OAAQ,0BAA2BwH,EAAK,KAAK,EACnE6C,EAAUrK,EAAc,MAAO,iBAAiB,EAChDM,EAAcN,EAAc,SAAU,0BAA2B,QAAG,EAC1EM,EAAY,KAAO,SACnBA,EAAY,aAAa,aAAchB,EAAQ,WAAW,EAC1D,IAAMwM,EAAO9L,EAAc,MAAO,sBAAsB,EAClD+L,EAAY/L,EAChB,SACA,uBACAwH,EAAK,OAASlI,EAAQ,UAAYA,EAAQ,OAC5C,EACAyM,EAAU,KAAO,SACjBA,EAAU,iBAAiB,QAAS,MAAOnD,GAAU,CACnDA,EAAM,gBAAgB,EACtB,MAAM0C,EAAe9D,CAAI,CAC3B,CAAC,EACD,IAAMwE,EAAehM,EAAc,SAAU,uBAAwBV,EAAQ,UAAU,EACvF0M,EAAa,KAAO,SACpBA,EAAa,iBAAiB,QAAS,MAAOpD,GAAU,CACtDA,EAAM,gBAAgB,EACtB,MAAM2C,EAAa/D,CAAI,CACzB,CAAC,EACD,IAAMyE,EAAejM,EAAc,SAAU,uBAAwBV,EAAQ,UAAU,EACvF2M,EAAa,KAAO,SACpBA,EAAa,iBAAiB,QAAS,MAAOrD,GAAU,CACtDA,EAAM,gBAAgB,EACtB,MAAM4C,EAAahE,CAAI,CACzB,CAAC,EACDsE,EAAK,OAAOC,EAAWC,EAAcC,CAAY,EACjD5B,EAAQ,OAAO/J,EAAawL,CAAI,EAChCxL,EAAY,iBAAiB,QAAUsI,GAAU,CAC/CA,EAAM,gBAAgB,EACtB,IAAMsD,EAAS7B,EAAQ,UAAU,SAAS,MAAM,EAChD,QAAWvB,KAAe,MAAM,KAAK+B,EAAU,iBAAiB,uBAAuB,CAAC,EACtF/B,EAAY,UAAU,OAAO,MAAM,EAErC,QAAWC,KAAY,MAAM,KAAK8B,EAAU,iBAAiB,mCAAmC,CAAC,EAC/F9B,EAAS,UAAU,OAAO,WAAW,EAElCmD,IACH7B,EAAQ,UAAU,IAAI,MAAM,EAC5BhB,EAAI,UAAU,IAAI,WAAW,EAEjC,CAAC,EAEDA,EAAI,OAAOzI,EAAOyJ,CAAO,EACzBhB,EAAI,aAAa,OAAQ,QAAQ,EACjCA,EAAI,SAAW,EACfA,EAAI,iBAAiB,QAAS,SAAY,CACxC,MAAMgC,EAAa7D,CAAI,CACzB,CAAC,EACD6B,EAAI,iBAAiB,UAAW,MAAOT,GAAU,EAC3CA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAe,EACrB,MAAMyC,EAAa7D,CAAI,EAE3B,CAAC,EACD6B,EAAI,iBAAiB,OAAQ,IAAM,CACjCgB,EAAQ,UAAU,OAAO,MAAM,EAC/BhB,EAAI,UAAU,OAAO,WAAW,CAClC,CAAC,EACDwB,EAAU,YAAYxB,CAAG,CAC3B,CACF,CAEA,SAAS3B,GAAe5B,EAAiBqG,EAA0B,CACjE,OAAOrG,EAAQ,KAAK,EAAE,MAAM,EAAG,EAAE,GAAKqG,CACxC,CAEA,SAAS9M,GAAgBD,EAAwB,CAC/C,OAAOA,EAAO,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,GAAK,IAC/C,CAEA,SAASG,GAAiBH,EAA+B,CACvD,IAAM+M,EAAWrN,GAAQ,GACzB,OAAOA,GAAQO,GAAgBD,CAAM,CAAC,GAAK+M,CAC7C,CAEA,SAAS1M,GAAYL,EAAyB,CAC5C,MAAO,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,SAASC,GAAgBD,CAAM,CAAC,CAClE,CAEA,SAASuL,GAAYF,EAAuB,CAC1C,IAAM2B,EAAQ3B,EAAM,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,MAAM,EAAG,CAAC,EAC3D,OAAI2B,EAAM,SAAW,EACZ,IAGFA,EAAM,IAAKC,GAASA,EAAK,CAAC,GAAG,YAAY,GAAK,EAAE,EAAE,KAAK,EAAE,CAClE,CAEA,SAASC,GAAiBrH,EAAsC,CAC9D,OACEA,EAAS,eAAe,KAAK,GAC7BA,EAAS,gBAAgB,KAAK,GAC9B,IAEJ,CAEA,SAASmE,GACP/D,EACAN,EAIA,CACA,IAAMwH,EAASC,GAA0BnH,CAAI,EAC7C,MAAO,CACL,YAAakH,EAAO,YACpB,UAAWxH,EAAU,OAAS,EAAI0H,GAAe1H,EAAWwH,EAAO,SAAS,EAAIA,EAAO,SACzF,CACF,CAEA,SAASC,GAA0BnH,EAGjC,CAEA,IAAMqH,EADaC,GAAkBtH,CAAI,EAChB,MAAM;AAAA,CAAI,EAC/BuH,EAAsB,GAE1B,QAASC,EAAQ,EAAGA,EAAQH,EAAM,OAAQG,GAAS,EAC7C,4BAA4B,KAAKH,EAAMG,CAAK,GAAG,KAAK,GAAK,EAAE,IAC7DD,EAAsBC,GAI1B,GAAID,IAAwB,GAC1B,MAAO,CACL,YAAavH,EACb,UAAW,CAAC,CACd,EAGF,IAAMyH,EAAcJ,EAAM,MAAM,EAAGE,CAAmB,EAAE,KAAK;AAAA,CAAI,EAAE,QAAQ,EACrEG,EAAiBL,EAAM,MAAME,EAAsB,CAAC,EAAE,KAAK;AAAA,CAAI,EAAE,KAAK,EAEtE7H,EADUiI,GAAwBD,CAAc,EAEnD,IAAKE,GAAUC,GAAoBD,CAAK,CAAC,EACzC,OAAQhI,GAAsC,EAAQA,CAAS,EAElE,MAAO,CACL,YAAA6H,EACA,UAAA/H,CACF,CACF,CAEA,SAASiI,GAAwBG,EAA2B,CAC1D,IAAMC,EAAoB,CAAC,EACvBC,EAAU,GAEd,QAAWC,KAAWH,EAAQ,MAAM;AAAA,CAAI,EAAG,CACzC,IAAMI,EAAOD,EAAQ,KAAK,EAC1B,GAAKC,EAIL,IAAI,YAAY,KAAKA,CAAI,EAAG,CACtBF,GACFD,EAAQ,KAAKC,EAAQ,KAAK,CAAC,EAE7BA,EAAUE,EAAK,QAAQ,YAAa,EAAE,EACtC,QACF,CAEIF,IACFA,EAAU,GAAGA,CAAO,IAAIE,CAAI,IAEhC,CAEA,OAAIF,GACFD,EAAQ,KAAKC,EAAQ,KAAK,CAAC,EAGtBD,CACT,CAEA,SAASF,GAAoBD,EAAmC,CAC9D,IAAMO,EAAWP,EAAM,MAAM,iBAAiB,EAC9C,GAAI,CAACO,EACH,OAAO,KAGT,IAAMC,EAAMD,EAAS,CAAC,EAChB5M,EAAQqM,EACX,MAAM,EAAGO,EAAS,KAAK,EACvB,QAAQ,UAAW,EAAE,EACrB,KAAK,EAER,MAAO,CACL,eAAgBC,EAChB,cAAe7M,GAAS6M,CAC1B,CACF,CAEA,SAAShB,GAAeiB,EAAwBvB,EAAwC,CACtF,IAAMwB,EAAwB,CAAC,EACzBC,EAAO,IAAI,IAEjB,QAAW3I,IAAY,CAAC,GAAGyI,EAAS,GAAGvB,CAAQ,EAAG,CAChD,IAAM0B,EAAM,GAAG5I,EAAS,eAAiB,EAAE,KAAKA,EAAS,gBAAkB,EAAE,GACzE2I,EAAK,IAAIC,CAAG,IAGhBD,EAAK,IAAIC,CAAG,EACZF,EAAO,KAAK1I,CAAQ,EACtB,CAEA,OAAO0I,CACT,CAEA,SAAS3D,GAAuB/E,EAAuB3F,EAA2C,CAChG,IAAMyK,EAAO/J,EAAc,SAAU,gBAAgB,EACrD+J,EAAK,KAAO,SACZA,EAAK,aAAa,aAAczK,EAAQ,UAAU,EAElD,IAAMgK,EAAStJ,EAAc,OAAQ,iBAAiB,EACtDsJ,EAAO,YAAc,SACrB,IAAMmB,EAAQzK,EACZ,OACA,uBACAsM,GAAiBrH,CAAQ,GAAK3F,EAAQ,cACxC,EACA,OAAAyK,EAAK,OAAOT,EAAQmB,CAAK,EAClBV,CACT,CAEA,SAASI,GAAiB7K,EAA2C,CACnE,IAAMyK,EAAO/J,EAAc,SAAU,oCAAoC,EACzE+J,EAAK,KAAO,SAEZ,IAAM+D,EAAU9N,EAAc,OAAQ,uBAAuB,EAC7D,QAAS6M,EAAQ,EAAGA,EAAQ,EAAGA,GAAS,EAAG,CACzC,IAAMvD,EAAStJ,EAAc,OAAQ,yBAAyB,EAC9DsJ,EAAO,YAAc,SACrBwE,EAAQ,YAAYxE,CAAM,CAC5B,CAEA,IAAMmB,EAAQzK,EAAc,OAAQ,uBAAwBV,EAAQ,OAAO,EAC3E,OAAAyK,EAAK,OAAO+D,EAASrD,CAAK,EACnBV,CACT,CAEA,SAAS7E,GAAgBD,EAAuB3F,EAA2C,CACzF,IAAMyO,EAAO/N,EAAc,SAAU,gBAAgB,EACrD+N,EAAK,KAAO,SACZA,EAAK,aAAa,aAAczO,EAAQ,UAAU,EAClDyO,EAAK,iBAAiB,QAAS,IAAM,CACnC9D,GAAqBhF,EAAU3F,CAAO,CACxC,CAAC,EAED,IAAM0O,EAAQhO,EAAc,MAAO,sBAAsB,EACnDsJ,EAAStJ,EAAc,OAAQ,uCAAuC,EAC5EsJ,EAAO,YAAc,SACrB,IAAM1I,EAAQZ,EACZ,MACA,uBACAsM,GAAiBrH,CAAQ,GAAK3F,EAAQ,cACxC,EACMqK,EAAO3J,EAAc,MAAO,qBAAqB,EACjDoM,EAAkB,CAAC,EAEzB,OAAI,OAAOnH,EAAS,OAAU,UAC5BmH,EAAM,KAAK,GAAG9M,EAAQ,WAAW,KAAK2F,EAAS,MAAM,QAAQ,CAAC,CAAC,EAAE,EAE/D,OAAOA,EAAS,YAAe,UACjCmH,EAAM,KAAK,GAAG9M,EAAQ,UAAU,KAAK2F,EAAS,UAAU,EAAE,EAExDA,EAAS,WACXmH,EAAM,KAAK,GAAG9M,EAAQ,WAAW,KAAK2F,EAAS,SAAS,EAAE,EAExD,OAAOA,EAAS,WAAc,UAChCmH,EAAM,KAAK,GAAG9M,EAAQ,SAAS,KAAK2F,EAAS,SAAS,EAAE,EAEtDA,EAAS,eACXmH,EAAM,KAAK,GAAG9M,EAAQ,eAAe,KAAK2F,EAAS,aAAa,EAAE,EAGpE0E,EAAK,YAAcyC,EAAM,KAAK,UAAK,EACnC4B,EAAM,YAAY1E,CAAM,EACxByE,EAAK,OAAOC,EAAOpN,EAAO+I,CAAI,EACvBoE,CACT,CAEA,SAAS9D,GAAqBhF,EAAuB3F,EAA8B,CACjF,IAAM2O,EACJhJ,EAAS,gBAAgB,KAAK,GAC9BA,EAAS,eAAe,KAAK,GAC7B3F,EAAQ,eACJ4O,EAAeC,GAAmBlJ,EAAS,cAAc,EAE/D,GAAIiJ,EAAc,CAChB,OAAO,KAAKA,EAAc,SAAU,qBAAqB,EACzD,MACF,CAEA,IAAME,EAAQ,OAAO,KAAK,GAAI,SAAU,qBAAqB,EAC7D,GAAI,CAACA,EACH,OAGF,IAAMxN,EAAQyN,EAAWJ,CAAS,EAC5BK,EAAUC,GAAmBtJ,EAAU3F,CAAO,EACjD,IAAKiO,GAAS,OAAOc,EAAWd,CAAI,CAAC,OAAO,EAC5C,KAAK,EAAE,EAEVa,EAAM,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA,eAIRxN,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAWNA,CAAK;AAAA,aACNyN,EAAW/O,EAAQ,sBAAsB,CAAC;AAAA,cACzCgP,GAAW,OAAOD,EAAW/O,EAAQ,SAAS,CAAC,OAAO;AAAA;AAAA;AAAA,UAG1D,EACR8O,EAAM,SAAS,MAAM,CACvB,CAEA,SAASD,GAAmBK,EAA0C,CACpE,GAAI,CAACA,EACH,OAAO,KAGT,IAAMxI,EAAUwI,EAAU,KAAK,EAC/B,MAAO,gBAAgB,KAAKxI,CAAO,EAAIA,EAAU,IACnD,CAEA,SAASuI,GAAmBtJ,EAAuB3F,EAAkC,CACnF,IAAMgP,EAAoB,CAAC,EAC3B,OAAIrJ,EAAS,gBACXqJ,EAAQ,KAAKrJ,EAAS,cAAc,EAElC,OAAOA,EAAS,OAAU,UAC5BqJ,EAAQ,KAAK,GAAGhP,EAAQ,WAAW,KAAK2F,EAAS,MAAM,QAAQ,CAAC,CAAC,EAAE,EAEjE,OAAOA,EAAS,YAAe,UACjCqJ,EAAQ,KAAK,GAAGhP,EAAQ,UAAU,KAAK2F,EAAS,UAAU,EAAE,EAE1DA,EAAS,WACXqJ,EAAQ,KAAK,GAAGhP,EAAQ,WAAW,KAAK2F,EAAS,SAAS,EAAE,EAE1D,OAAOA,EAAS,WAAc,UAChCqJ,EAAQ,KAAK,GAAGhP,EAAQ,SAAS,KAAK2F,EAAS,SAAS,EAAE,EAExDA,EAAS,eACXqJ,EAAQ,KAAK,GAAGhP,EAAQ,eAAe,KAAK2F,EAAS,aAAa,EAAE,EAE/DqJ,CACT,CAEA,SAAS5E,GAAeb,EAAqB4F,EAAwB,CACnE5F,EAAO,UAAY6F,GAAa/B,GAAkB8B,CAAQ,CAAC,CAC7D,CAEA,SAAS9B,GAAkB8B,EAA0B,CACnD,OAAOA,EAAS,QAAQ,QAAS;AAAA,CAAI,EAAE,QAAQ,eAAgB;AAAA,CAAI,CACrE,CAEA,SAASC,GAAaD,EAA0B,CAE9C,OADeA,EAAS,MAAM,QAAQ,EAAE,IAAKE,GAAUA,EAAM,KAAK,CAAC,EAAE,OAAO,OAAO,EACrE,IAAIC,EAAW,EAAE,KAAK,EAAE,CACxC,CAEA,SAASA,GAAYD,EAAuB,CAC1C,IAAMjC,EAAQiC,EAAM,MAAM;AAAA,CAAI,EAAE,IAAKpB,GAASA,EAAK,QAAQ,CAAC,EAE5D,GAAIb,EAAM,MAAOa,GAAS,iBAAiB,KAAKA,CAAI,CAAC,GAAKb,EAAM,QAAU,EACxE,OAAOmC,GAAYnC,CAAK,EAG1B,GAAIA,EAAM,MAAOa,GAAS,YAAY,KAAKA,CAAI,CAAC,EAC9C,MAAO,OAAOb,EACX,IAAKa,GAAS,OAAOuB,EAAavB,EAAK,QAAQ,YAAa,EAAE,CAAC,CAAC,OAAO,EACvE,KAAK,EAAE,CAAC,QAGb,GAAIb,EAAM,MAAOa,GAAS,WAAW,KAAKA,CAAI,CAAC,EAC7C,MAAO,OAAOb,EACX,IAAKa,GAAS,OAAOuB,EAAavB,EAAK,QAAQ,WAAY,EAAE,CAAC,CAAC,OAAO,EACtE,KAAK,EAAE,CAAC,QAGb,IAAMwB,EAAerC,EAAM,CAAC,GAAG,MAAM,mBAAmB,EACxD,GAAIqC,EAAc,CAChB,IAAMC,EAASD,EAAa,CAAC,GAAK,IAC5BE,EAAcF,EAAa,CAAC,GAAK,GACjCG,EAAQF,EAAO,OACrB,MAAO,KAAKE,CAAK,IAAIJ,EAAaG,CAAW,CAAC,MAAMC,CAAK,GAC3D,CAEA,MAAO,MAAMxC,EAAM,IAAKa,GAASuB,EAAavB,CAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MACnE,CAEA,SAASsB,GAAYnC,EAAyB,CAC5C,IAAMyC,EAAOzC,EACV,OAAO,CAACa,EAAMV,IAAU,EAAEA,IAAU,GAAK,kCAAkC,KAAKU,CAAI,EAAE,EACtF,IAAKA,GAAS6B,GAAc7B,CAAI,CAAC,EAEpC,GAAI4B,EAAK,SAAW,EAClB,MAAO,GAGT,IAAM/O,EAAS+O,EAAK,CAAC,GAAK,CAAC,EACrBpO,EAAOoO,EAAK,MAAM,CAAC,EACnBE,EAAW,cAAcjP,EAC5B,IAAKkP,GAAS,OAAOR,EAAaQ,CAAI,CAAC,OAAO,EAC9C,KAAK,EAAE,CAAC,gBACLC,EAAWxO,EAAK,OAClB,UAAUA,EACP,IACEsI,GACC,OAAOA,EAAI,IAAKiG,GAAS,OAAOR,EAAaQ,CAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OACvE,EACC,KAAK,EAAE,CAAC,WACX,GAEJ,MAAO,qCAAqCD,CAAQ,GAAGE,CAAQ,gBACjE,CAEA,SAASH,GAAc7B,EAAwB,CAC7C,OAAOA,EACJ,KAAK,EACL,QAAQ,MAAO,EAAE,EACjB,QAAQ,MAAO,EAAE,EACjB,MAAM,GAAG,EACT,IAAK+B,GAASA,EAAK,KAAK,CAAC,CAC9B,CAEA,SAASR,EAAazJ,EAAsB,CAC1C,IAAImK,EAAOnB,EAAWhJ,CAAI,EAC1B,OAAAmK,EAAOA,EAAK,QAAQ,wCAAyC,sDAAsD,EACnHA,EAAOA,EAAK,QAAQ,aAAc,iBAAiB,EACnDA,EAAOA,EAAK,QAAQ,mBAAoB,qBAAqB,EAC7DA,EAAOA,EAAK,QAAQ,eAAgB,aAAa,EAC1CA,CACT,CAEA,SAASnB,EAAWoB,EAAuB,CACzC,OAAOA,EACJ,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,OAAO,CAC1B,CPzvDA,IAAMC,GAAU,QACVC,GAAOC,GAEPC,GAA+B,CACnC,KAAAF,GACA,iBAAAC,GACA,QAAAF,EACF,EAQI,OAAO,OAAW,MACpB,OAAO,WAAaG","names":["browser_exports","__export","browserGlobal","createChatWidget","init","version","isRecord","value","mergeDeep","target","source","output","key","sourceValue","targetValue","normalizeError","error","joinUrl","baseUrl","path","buildHeaders","config","token","userContextHeader","resolveUserContextHeader","userContext","resolveEndpointUrl","path","params","resolvedPath","joinUrl","postMessage","payload","url","requestBody","response","data","firstAnswer","content","sourceDocuments","scores","pageNumbers","sheetNames","rowNumbers","knowledgeNames","citations","sourceDocument","index","fetchHistory","chatId","historyUrl","historyItems","item","candidate","roleValue","textValue","loweredRole","message","fetchChats","chatItems","chatIdValue","titleValue","createdAtValue","updatedAtValue","mapped","createChat","title","endpoint","updateChat","deleteChat","reportWidgetError","error","normalized","normalizeError","defaultTheme","defaultConfigValues","resolveConfig","config","mount","theme","mergeDeep","defaultTheme","defaultConfigValues","createElement","tagName","className","textContent","element","STYLE_ELEMENT_ID","ensureStyles","shadowRoot","theme","style","getCss","LOCALES","count","createChatWidget","config","resolvedConfig","resolveConfig","locale","normalizeLocale","strings","getLocaleStrings","isRtl","isRtlLocale","state","resolveChatId","host","shadowRoot","ensureStyles","shell","createElement","overlay","launcher","panel","header","toolbar","menuTrigger","dropdown","newChatAction","myChatsAction","openAssistantAction","headingWrap","title","subtitle","closeButton","body","hero","heroIcon","heroText","footer","form","input","sendButton","note","suggestions","myChatsSheet","myChatsSheetHeader","myChatsBack","myChatsClose","myChatsSheetBody","myChatsRecentLabel","myChatsRecentList","myChatsPinnedLabel","myChatsPinnedList","panelView","fullPage","fullPageShell","fullPageHeader","fullPageBrand","fullPageMark","fullPageBrandText","fullPageHeaderActions","fullPageBadge","fullPageClose","fullPageContent","fullPageSidebar","fullPageNewChat","fullPageSearchWrap","fullPageSearchInput","fullPageSearchIcon","fullPageRecentLabel","fullPageRecentList","fullPagePinnedLabel","fullPagePinnedList","fullPageMain","fullPagePanel","fullPageBody","fullPageHero","fullPageHeroBadge","fullPageHeroText","fullPageSuggestions","fullPageFooter","fullPageForm","fullPageInput","fullPageSend","fullPageNote","sourceAside","sourcePanelHeader","sourcePanelTitleWrap","sourcePanelTitle","sourcePanelSubtitle","sourcePanelClose","sourcePanelList","sourcePanelEmpty","fullPageView","getRuntimeConfig","getUserDisplayName","user","showSourcePanel","citations","titleText","citation","buildSourceCard","hideSourcePanel","syncSuggestionButtons","text","sendMessageToView","renderFullPageChatLists","renderMyChatsSheetLists","open","closeMyChatsSheet","instance","close","closeMenu","message","view","trimmed","ensureChatExists","error","normalized","reportWidgetError","appendMessage","hidePromptsForConversation","loading","response","postMessage","resolveKnowledgeNames","refreshChats","sendMessage","targetView","openFullPage","loadHistoryIntoView","closeFullPage","openMenu","resetConversation","resetConversationView","resetFullPageConversation","chats","fetchChats","seedMessage","chat","createChat","buildChatTitle","selectChat","chatId","selectChatFromSheet","openMyChatsSheet","renameChatItem","nextTitle","updateChat","deleteChatItem","deleteChat","renderSidebarLists","togglePinnedChat","messages","fetchHistory","clearRenderedConversation","renderHistory","handleEscapeKeydown","provider","event","target","openActions","openRows","names","kind","options","derivedContent","deriveAssistantDisplayContent","row","avatar","createAvatar","bubble","content","renderMarkdown","meta","sourcePreview","sourceTitle","sourceItems","chip","buildSourcePreviewChip","openCitationInNewTab","showAll","buildShowAllChip","createMessageActions","actions","copyButton","likeButton","dislikeButton","label","initials","getInitials","renderSuggestions","container","onClick","suggestion","button","preservedNodes","child","recentContainer","pinnedContainer","onSelectChat","onTogglePinned","onRenameChat","onDeleteChat","filteredChats","pinnedChats","recentChats","renderChatItems","activeChatId","menu","pinAction","renameAction","deleteAction","isOpen","fallback","parts","part","getCitationLabel","parsed","parseReferencesFromAnswer","mergeCitations","lines","normalizeMarkdown","referencesLineIndex","index","displayText","referencesBody","collectReferenceEntries","entry","parseReferenceEntry","section","entries","current","rawLine","line","urlMatch","url","primary","merged","seen","key","avatars","card","media","rawTarget","urlCandidate","extractCitationUrl","popup","escapeHtml","details","buildSourceDetails","candidate","markdown","renderBlocks","block","renderBlock","renderTable","renderInline","headingMatch","hashes","headingText","level","rows","splitTableRow","headHtml","cell","bodyHtml","html","value","version","init","createChatWidget","browserGlobal"]}
|