@burtson-labs/bandit-engine 2.0.39 → 2.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{aiProviderStore-XN7GCBHJ.mjs → aiProviderStore-JMA5RWX7.mjs} +2 -2
- package/dist/{chat-5QJNWB7I.mjs → chat-JMWPOSQ4.mjs} +5 -5
- package/dist/chat-provider.js +421 -20
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +4 -4
- package/dist/{chunk-WO5KFNNW.mjs → chunk-26QQ4CLA.mjs} +62 -24
- package/dist/chunk-26QQ4CLA.mjs.map +1 -0
- package/dist/{chunk-CDQYBO3Q.mjs → chunk-2ZCR2TDY.mjs} +27 -5
- package/dist/chunk-2ZCR2TDY.mjs.map +1 -0
- package/dist/{chunk-ECRNIAG6.mjs → chunk-6ELNWXKC.mjs} +4 -4
- package/dist/{chunk-EOKIE5HZ.mjs → chunk-75W5VWPV.mjs} +3 -3
- package/dist/{chunk-JRCDANLN.mjs → chunk-7KEBNVCO.mjs} +67 -9
- package/dist/{chunk-JRCDANLN.mjs.map → chunk-7KEBNVCO.mjs.map} +1 -1
- package/dist/{chunk-3A2527TE.mjs → chunk-D3AGKOM6.mjs} +3 -3
- package/dist/{chunk-QU5S5QQP.mjs → chunk-QJYPWWA5.mjs} +379 -18
- package/dist/chunk-QJYPWWA5.mjs.map +1 -0
- package/dist/{chunk-QYH2T4L5.mjs → chunk-VIYBZO5W.mjs} +3 -3
- package/dist/{cli/cli.js → cli.js} +423 -10
- package/dist/cli.js.map +1 -0
- package/dist/{gateway-B0LJ3-jT.d.ts → gateway-5yt_3QDP.d.mts} +4 -4
- package/dist/{gateway-B0LJ3-jT.d.mts → gateway-5yt_3QDP.d.ts} +4 -4
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +598 -101
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/management/management.js +596 -99
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +6 -6
- package/dist/modals/chat-modal/chat-modal.js +430 -29
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +4 -4
- package/dist/public-types.d.mts +1 -1
- package/dist/public-types.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-CDQYBO3Q.mjs.map +0 -1
- package/dist/chunk-QU5S5QQP.mjs.map +0 -1
- package/dist/chunk-WO5KFNNW.mjs.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- /package/dist/{aiProviderStore-XN7GCBHJ.mjs.map → aiProviderStore-JMA5RWX7.mjs.map} +0 -0
- /package/dist/{chat-5QJNWB7I.mjs.map → chat-JMWPOSQ4.mjs.map} +0 -0
- /package/dist/{chunk-ECRNIAG6.mjs.map → chunk-6ELNWXKC.mjs.map} +0 -0
- /package/dist/{chunk-EOKIE5HZ.mjs.map → chunk-75W5VWPV.mjs.map} +0 -0
- /package/dist/{chunk-3A2527TE.mjs.map → chunk-D3AGKOM6.mjs.map} +0 -0
- /package/dist/{chunk-QYH2T4L5.mjs.map → chunk-VIYBZO5W.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/management/management.tsx","../src/management/components/PersonalitiesTab.tsx","../src/components/AvatarCropper.tsx","../src/management/components/PreferencesTab.tsx","../src/hooks/useGatewayQueries.ts","../src/management/components/BrandingTab.tsx","../src/components/LogoCropper.tsx","../src/management/components/KnowledgeTab.tsx","../src/components/shared/ProcessingOverlay.tsx","../src/hooks/useProcessingOverlay.ts","../src/management/components/StorageTab.tsx","../src/management/components/ProviderTab.tsx","../src/management/components/MCPToolsTabV2.tsx","../src/services/mcp/mcpControllerService.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FCFF-64ED2F\nconst __banditFingerprint_management_managementtsx = 'BL-FP-357F58-3D1B';\nconst __auditTrail_management_managementtsx = 'BL-AU-MGOIKVVL-LFF9';\n// File: management.tsx | Path: src/management/management.tsx | Hash: fcff3d1b\n\nconst preloadChatPage = () => import(\"../chat/chat\");\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { alpha } from \"@mui/material/styles\";\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport {\n Box,\n Button,\n Typography,\n ThemeProvider,\n CssBaseline,\n Fab,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Divider,\n SwipeableDrawer,\n} from \"@mui/material\";\nimport FaceRetouchingNaturalIcon from '@mui/icons-material/FaceRetouchingNatural';\nimport BrushIcon from '@mui/icons-material/Brush';\nimport MenuBookIcon from '@mui/icons-material/MenuBook';\nimport TuneIcon from '@mui/icons-material/Tune';\nimport BuildIcon from '@mui/icons-material/Build';\nimport CloudIcon from '@mui/icons-material/Cloud';\nimport StorageIcon from '@mui/icons-material/Storage';\nimport { useNavigate } from \"react-router-dom\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChatModal from \"../modals/chat-modal/chat-modal\";\nimport PersonalitiesTab, { LocalModelState } from './components/PersonalitiesTab';\nimport PreferencesTab from './components/PreferencesTab';\nimport BrandingTab from './components/BrandingTab';\nimport KnowledgeTab from './components/KnowledgeTab';\nimport StorageTab from './components/StorageTab';\nimport { ProviderTab } from './components/ProviderTab';\nimport MCPToolsTabV2 from './components/MCPToolsTabV2';\n\nimport { BanditPersonality, useModelStore } from \"../store/modelStore\";\nimport { banditDarkTheme } from \"../theme/banditTheme\";\nimport { predefinedThemes } from \"../theme/themeMap\";\nimport { detectTransparency, fetchAndConvertToBase64 } from \"../util\";\nimport brandingService from \"../services/branding/brandingService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { useAIProviderStore } from \"../store/aiProviderStore\";\nimport { useNotificationService } from \"../hooks/useNotificationService\";\nimport { useFeatures, useFeatureVisibility } from \"../hooks/useFeatures\";\nimport { StoredBanditConfigRecord, StoredModelConfig } from \"../types/config\";\n\nconst Management = () => {\n const navigate = useNavigate();\n\n const notificationService = useNotificationService();\n\n const isMobile = useMediaQuery(\"(max-width:900px)\");\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const getOptimalFabLogo = async (): Promise<string> => {\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n\n try {\n // First try subdomain favicon\n const subdomain = window.location.hostname.split('.')[0];\n const faviconUrl = `https://cdn.burtson.ai/favicons/${subdomain}/favicon.png`;\n\n const faviconExists = await new Promise<boolean>((resolve) => {\n const img = new Image();\n img.onload = () => resolve(true);\n img.onerror = () => resolve(false);\n img.src = faviconUrl;\n });\n\n if (faviconExists) {\n return faviconUrl;\n }\n\n // Fallback to branding logo\n const branding = await brandingService.getBranding();\n if (branding?.logoBase64) {\n return branding.logoBase64;\n }\n\n // Final fallback to Bandit head\n return banditHead;\n } catch (error) {\n debugLogger.error(\"Failed to get optimal FAB logo\", { error });\n return banditHead;\n }\n };\n const {\n name: modelName,\n setModelName,\n tagline,\n setTagline,\n systemPrompt,\n setSystemPrompt,\n availableModels,\n selectedModel,\n setSelectedModel,\n saveModel,\n resetModel,\n hasTransparentLogo,\n setHasTransparentLogo,\n } = useModelStore();\n\n const [modalOpen, setModalOpen] = useState(false);\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n const [fabLogo, setFabLogo] = useState<string>(banditHead);\n\n const [tabIndex, setTabIndex] = useState(0);\n const [logoFile, setLogoFile] = useState<File | null>(null);\n const [logoBase64, setLogoBase64] = useState<string | null>(null);\n const [brandingText, setBrandingText] = useState(\"\");\n const [theme, setTheme] = useState(\"bandit-dark\"); // Use consistent default\n const [customAvatarBase64, setCustomAvatarBase64] = useState<string | null>(null);\n const [presetAvatar, setPresetAvatar] = useState<string | null>(null);\n\n \n const showSnackbarMessage = (message: string, severity: 'success' | 'error' = 'success') => {\n if (severity === 'success') {\n notificationService?.showSuccess(message);\n } else {\n notificationService?.showError(message);\n }\n };\n\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n\n const [brandingLoaded, setBrandingLoaded] = useState(false);\n const [isLoadingBranding, setIsLoadingBranding] = useState(false);\n\n const { initModels } = useModelStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const { preferences, updatePreference } = usePreferencesStore();\n const { hasAdminDashboard, hasLimitedAdminDashboard, getCurrentTier, hasAdvancedSearch } = useFeatures();\n const { showAdminPanel, showLimitedAdminPanel } = useFeatureVisibility();\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n\n const [localSelectedModel, setLocalSelectedModel] = useState<LocalModelState>({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n\n const {\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n } = useKnowledgeStore();\n\n useEffect(() => {\n if (selectedModel) {\n const selected = availableModels.find((m) => m.name === selectedModel);\n if (selected) {\n debugLogger.debug(\"Model hydration complete\", {\n selectedModel: selected.name,\n hasAvatar: !!selected?.avatarBase64\n });\n setLocalSelectedModel({\n name: selected.name,\n tagline: selected.tagline,\n systemPrompt: selected.systemPrompt as string,\n selectedModel: selected.name,\n });\n\n // Handle avatar restoration properly\n if (selected.avatarBase64) {\n setCustomAvatarBase64(selected.avatarBase64);\n setPresetAvatar(null); // Clear preset if we have custom\n } else {\n // Clear custom avatar if model doesn't have one\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n }\n }\n }, [selectedModel, availableModels]);\n\n // Load branding/model config from IndexedDB on mount\n const loadBrandingConfig = useCallback(async () => {\n if (isLoadingBranding || brandingLoaded) {\n debugLogger.warn(\"Branding loading already in progress or completed, skipping\");\n return;\n }\n\n setIsLoadingBranding(true);\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const data = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingConfig = data?.branding;\n const modelConfig = data?.model;\n\n debugLogger.info(\"Management branding load\", {\n hasData: !!data,\n hasBranding: !!brandingConfig,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : [],\n userSaved: brandingConfig?.userSaved\n });\n\n const hasUserModifiedBranding = brandingConfig && (\n brandingConfig.userSaved === true ||\n (brandingConfig.brandingText && brandingConfig.brandingText.trim() !== \"\") ||\n (brandingConfig.logoBase64 && typeof brandingConfig.logoBase64 === \"string\" && brandingConfig.logoBase64.trim() !== \"\") ||\n (brandingConfig.theme && brandingConfig.theme !== \"bandit-dark\")\n );\n\n const hasCDNOnlyBranding = brandingConfig &&\n brandingConfig.userSaved === false &&\n !hasUserModifiedBranding;\n\n const shouldSkipCDNBranding = hasUserModifiedBranding;\n\n if (shouldSkipCDNBranding) {\n debugLogger.info(\"🚫 USER BRANDING PROTECTION - Skipping CDN branding (preserving user modifications)\", {\n hasUserModifiedBranding,\n userSaved: brandingConfig?.userSaved,\n hasCustomText: !!(brandingConfig?.brandingText && brandingConfig.brandingText.trim()),\n hasCustomLogo: !!(brandingConfig?.logoBase64 && brandingConfig.logoBase64.trim()),\n hasCustomTheme: !!(brandingConfig?.theme && brandingConfig.theme !== \"bandit-dark\")\n });\n\n setBrandingText(brandingConfig?.brandingText || \"\");\n setTheme(brandingConfig?.theme || \"bandit-dark\");\n setLogoBase64(brandingConfig?.logoBase64 || null);\n if (brandingConfig?.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(brandingConfig.hasTransparentLogo);\n }\n } else {\n debugLogger.info(\"Loading branding and models from CDN config\", {\n hasData: !!data,\n hasCDNOnlyBranding,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : []\n });\n\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnConfig = null;\n\n if (packageSettings?.brandingConfigUrl) {\n try {\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n cdnConfig = await configResponse.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n\n const cdnBranding = cdnConfig?.branding;\n if (cdnBranding) {\n debugLogger.info(\"Applying CDN branding\");\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n setLogoBase64(cdnBranding.logoBase64 || null);\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n }\n\n if (!hasUserModifiedBranding) {\n debugLogger.info(\"Saving CDN branding to IndexedDB\");\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...cdnBranding,\n userSaved: false,\n },\n }, storeConfigs);\n }\n } else {\n debugLogger.info(\"Using Bandit default branding\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n }\n\n if (cdnConfig?.models && Array.isArray(cdnConfig.models)) {\n debugLogger.info(\"Loading models from CDN config\", {\n modelCount: cdnConfig.models.length\n });\n\n await initModels();\n }\n }\n\n if (modelConfig) {\n setModelName(modelConfig.name || \"\");\n setTagline(modelConfig.tagline || \"\");\n setSystemPrompt(modelConfig.systemPrompt || \"\");\n setSelectedModel(modelConfig.selectedModel || \"\");\n }\n\n setBrandingLoaded(true);\n } catch (e) {\n debugLogger.error(\"Failed to load config from IndexedDB\", { error: e });\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n setBrandingLoaded(true);\n } finally {\n setIsLoadingBranding(false);\n }\n }, [\n brandingLoaded,\n initModels,\n isLoadingBranding,\n setBrandingLoaded,\n setHasTransparentLogo,\n setIsLoadingBranding,\n setModelName,\n setSelectedModel,\n setSystemPrompt,\n setTagline,\n setTheme,\n ]); // Only essential dependencies\n\n useEffect(() => {\n // Only load once on mount\n void loadBrandingConfig();\n }, [loadBrandingConfig]); // Empty dependency array to run only once on mount\n\n const handleOpenModal = () => setModalOpen(true);\n const handleCloseModal = () => setModalOpen(false);\n\n // Load branding logo for FAB\n useEffect(() => {\n getOptimalFabLogo().then(setFabLogo);\n }, []);\n\n // Update FAB logo when logoBase64 changes (when user uploads new logo)\n useEffect(() => {\n if (logoBase64) {\n setFabLogo(logoBase64);\n } else {\n getOptimalFabLogo().then(setFabLogo);\n }\n }, [logoBase64]);\n\n const handleSaveModel = async () => {\n debugLogger.info(\"STARTING handleSaveModel\", {\n modelName: localSelectedModel.name,\n selectedModel: localSelectedModel.selectedModel\n });\n\n // Validate required fields\n if (!localSelectedModel.name?.trim()) {\n showSnackbarMessage(\"Please enter a personality name before saving.\", 'error');\n return;\n }\n\n useModelStore.setState({ isInitializing: true });\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n // Save branding first (always save branding regardless of model type)\n debugLogger.info(\"Saving branding to IndexedDB\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo,\n userSaved: true,\n },\n }, storeConfigs);\n\n // Prepare avatar\n let avatarBase64ToStore: string | null = null;\n if (customAvatarBase64) {\n avatarBase64ToStore = customAvatarBase64;\n } else if (presetAvatar) {\n avatarBase64ToStore = await fetchAndConvertToBase64(presetAvatar);\n }\n\n // Create model object\n const modelToSave: BanditPersonality = {\n name: localSelectedModel.name.trim(),\n tagline: localSelectedModel.tagline || \"\",\n systemPrompt: localSelectedModel.systemPrompt || \"\",\n avatarBase64: avatarBase64ToStore || \"\",\n commands: [],\n };\n\n debugLogger.info(\"Saving custom model\", { modelName: modelToSave.name });\n\n // Save to IndexedDB\n const modelEntry: StoredBanditConfigRecord = {\n id: modelToSave.name,\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n avatarBase64: modelToSave.avatarBase64 || undefined,\n commands: modelToSave.commands,\n model: {\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n selectedModel: modelToSave.name,\n },\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", modelEntry, storeConfigs);\n\n // Determine if this is editing an existing model (custom or Bandit) or creating a new one\n const isEditingExistingModel = localSelectedModel.selectedModel &&\n localSelectedModel.selectedModel !== \"\" &&\n availableModels.some(m => m.name === localSelectedModel.selectedModel);\n\n const isRenamingModel = isEditingExistingModel && localSelectedModel.selectedModel !== modelToSave.name;\n\n // Only remove old entry if we're actually renaming a model\n if (isRenamingModel) {\n debugLogger.info(\"Model renamed, removing old entry\", {\n oldName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", localSelectedModel.selectedModel, storeConfigs);\n }\n\n // Update Zustand store\n if (isEditingExistingModel) {\n // Update existing model (whether custom or Bandit)\n debugLogger.info(\"Updating existing model in store\", {\n modelName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: availableModels.map(model =>\n model.name === localSelectedModel.selectedModel ? modelToSave : model\n ),\n });\n } else {\n // Add new model\n debugLogger.info(\"Adding new model to store\", {\n modelName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: [...availableModels, modelToSave],\n });\n }\n\n // Update selection and ensure UI state is synchronized\n setSelectedModel(modelToSave.name);\n setLocalSelectedModel({\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n selectedModel: modelToSave.name,\n });\n\n debugLogger.info(\"✅ Model saved successfully\");\n\n // Show success message\n showSnackbarMessage(`Personality \"${modelToSave.name}\" saved successfully!`, 'success');\n\n // Dispatch theme change event\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', { detail: { theme } }));\n\n } catch (e) {\n debugLogger.error(\"Failed to save\", { error: e });\n showSnackbarMessage(\"Failed to save personality. Please try again.\", 'error');\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n };\n\n // Save branding data only (separate from model saving)\n const handleSaveBranding = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Saving branding data to IndexedDB\");\n\n // Get current config to preserve other data\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const currentConfig: StoredBanditConfigRecord = current ?? { id: \"main\" };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...currentConfig,\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo,\n userSaved: true, // Mark as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme }\n }));\n\n debugLogger.info(\"Branding saved successfully\");\n\n // Show success feedback\n showSnackbarMessage(\"Branding saved successfully!\", 'success');\n\n } catch (error) {\n debugLogger.error(\"Failed to save branding\", { error });\n showSnackbarMessage(\"Failed to save branding. Please try again.\", 'error');\n }\n };\n\n const handleSavePreferences = () => {\n // Preferences are now automatically saved by IndexedDB via preferencesStore\n // This function is kept for UI feedback if needed\n debugLogger.info(\"Preferences saved automatically by zustand store\");\n };\n\n const handleResetModel = () => {\n resetModel();\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n };\n\n // Remove handleTabChange and use setTabIndex directly\n\n const handleLogoUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n setLogoFile(file);\n const reader = new FileReader();\n reader.onload = async function (e) {\n const base64 = e.target?.result as string;\n setLogoBase64(base64);\n debugLogger.debug(\"Starting transparency detection for uploaded image\");\n try {\n const isTransparent = await detectTransparency(base64);\n setHasTransparentLogo(isTransparent);\n debugLogger.debug(\"Transparency detection result saved\", { isTransparent });\n } catch (err) {\n debugLogger.error(\"Failed to detect transparency\", { error: err });\n }\n };\n reader.readAsDataURL(file);\n }\n };\n\n const handleExportConfig = async () => {\n const hasLogo = !!logoBase64;\n const exportData = {\n branding: {\n logoBase64: logoBase64 || \"\",\n brandingText: brandingText || \"\",\n theme,\n hasTransparentLogo: hasLogo ? await detectTransparency(logoBase64!) : false,\n },\n models: availableModels.map((model) => ({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt,\n avatarBase64: model.avatarBase64,\n commands: model.commands,\n })),\n knowledgeDocs: documents,\n };\n const dataStr =\n \"data:text/json;charset=utf-8,\" +\n encodeURIComponent(JSON.stringify(exportData, null, 2));\n const downloadAnchorNode = document.createElement(\"a\");\n downloadAnchorNode.setAttribute(\"href\", dataStr);\n downloadAnchorNode.setAttribute(\"download\", \"bandit_config.json\");\n document.body.appendChild(downloadAnchorNode);\n downloadAnchorNode.click();\n document.body.removeChild(downloadAnchorNode);\n };\n\n const handleRestoreDefaults = async () => {\n debugLogger.info(\"Starting branding restore - attempting CDN defaults first\");\n \n // First try to load CDN defaults\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnBranding = null;\n \n if (packageSettings?.brandingConfigUrl) {\n try {\n debugLogger.info(\"Attempting to load CDN branding config\", { url: packageSettings.brandingConfigUrl });\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n const cdnConfig = await configResponse.json();\n cdnBranding = cdnConfig?.branding;\n \n if (cdnBranding) {\n debugLogger.info(\"CDN branding found, applying CDN defaults\", { \n hasBrandingText: !!cdnBranding.brandingText,\n hasLogo: !!cdnBranding.logoBase64,\n theme: cdnBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN branding config, will use Bandit defaults\", { error: err });\n }\n }\n\n // Apply CDN defaults if available, otherwise use Bandit defaults\n if (cdnBranding) {\n // Apply CDN branding\n setLogoBase64(cdnBranding.logoBase64 || null);\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n } else {\n setHasTransparentLogo(true);\n }\n debugLogger.info(\"Applied CDN branding defaults\");\n } else {\n // Fall back to Bandit defaults\n setLogoBase64(null);\n setBrandingText(\"\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n debugLogger.info(\"Applied Bandit default branding\");\n }\n\n // Reset other local state\n setLogoFile(null);\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n getOptimalFabLogo().then(setFabLogo);\n\n // Save the restored defaults to IndexedDB to ensure persistence\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingToSave = cdnBranding ? {\n ...cdnBranding,\n userSaved: false, // Mark as CDN-loaded, not user-saved\n } : {\n logoBase64: null,\n brandingText: \"\",\n theme: \"bandit-dark\",\n hasTransparentLogo: true,\n userSaved: false, // Mark as default, not user-saved\n };\n\n debugLogger.info(\"Saving restored branding to IndexedDB\", { \n source: cdnBranding ? 'CDN' : 'Bandit defaults',\n userSaved: brandingToSave.userSaved\n });\n \n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: brandingToSave,\n model: current?.model ?? {},\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n const finalTheme = cdnBranding?.theme || \"bandit-dark\";\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme: finalTheme }\n }));\n\n debugLogger.info(\"Successfully restored and saved branding\", { theme: finalTheme });\n } catch (error) {\n debugLogger.error(\"Failed to save restored branding\", { error });\n }\n };\n\n // Restore default models: clear deletedModels and re-import from config\n const restoreDefaultModelsAndConfig = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Starting restore defaults - preserving critical data\");\n\n // Get current branding to preserve it if it's user-saved\n const currentMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const preservedBranding = currentMain?.branding?.userSaved ? currentMain.branding : null;\n\n // Remove \"deletedModels\" entry to clear deleted model tracking\n await indexedDBService.delete('banditConfig', 1, 'config', 'deletedModels', storeConfigs);\n\n // Only clear custom models from IndexedDB, but keep \"main\", \"mcpTools\", and other system data\n const allKeys = await indexedDBService.getAllKeys(\"banditConfig\", 1, \"config\", storeConfigs);\n const systemKeys = [\"main\", \"deletedModels\", \"mcpTools\", \"preferences\", \"knowledgeDocs\"]; // Preserve system data\n\n for (const key of allKeys) {\n if (typeof key === \"string\" && !systemKeys.includes(key)) {\n // Only delete if it looks like a model entry\n const entry = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n key,\n storeConfigs\n );\n const hasModelData =\n Boolean(entry?.model) ||\n (typeof entry?.name === \"string\" && entry.name.trim().length > 0) ||\n (typeof entry?.tagline === \"string\" && entry.tagline.trim().length > 0) ||\n (typeof entry?.systemPrompt === \"string\" && entry.systemPrompt.trim().length > 0);\n if (hasModelData) {\n debugLogger.info(\"Deleting custom model:\", { key });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", key, storeConfigs);\n } else {\n debugLogger.info(\"Preserving non-model data:\", { key });\n }\n }\n }\n\n // Restore default models (this now handles config URL loading and persistence)\n if (typeof useModelStore.getState().restoreDefaultModels === \"function\") {\n await useModelStore.getState().restoreDefaultModels();\n }\n\n // Restore preserved branding if it existed and was user-saved\n if (preservedBranding) {\n debugLogger.info(\"Restoring preserved user branding after model restore\");\n const updatedMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const restoredMain: StoredBanditConfigRecord = updatedMain ?? { id: \"main\" };\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...restoredMain,\n id: \"main\",\n branding: preservedBranding, // Restore the preserved branding\n }, storeConfigs);\n }\n\n debugLogger.info(\"Restore defaults completed successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore default models and config\", { error: err });\n }\n };\n\n // Restore deleted Bandit models only\n const restoreBanditModels = async () => {\n try {\n debugLogger.info(\"Restoring deleted Bandit models\");\n await useModelStore.getState().restoreDeletedBanditModels();\n debugLogger.info(\"✅ Bandit models restored successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore Bandit models\", { error: err });\n }\n };\n\n const handleImportConfig = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n const reader = new FileReader();\n reader.onload = async function (e) {\n try {\n const data = JSON.parse(e.target?.result as string);\n if (data.branding) {\n setBrandingText(data.branding.brandingText || \"\");\n setTheme(data.branding.theme || \"Dark\");\n setLogoBase64(data.branding.logoBase64 || null);\n setLogoFile(null);\n if (data.branding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(data.branding.hasTransparentLogo);\n }\n }\n // --- MODELS IMPORT LOGIC ---\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n // Persist each model separately by ID\n if (data.models && Array.isArray(data.models)) {\n for (const model of data.models) {\n if (!model || typeof model !== \"object\") {\n continue;\n }\n const parsedModel = model as Record<string, unknown>;\n const modelName = typeof parsedModel.name === \"string\" ? parsedModel.name : \"\";\n if (!modelName) {\n continue;\n }\n\n const sanitizedModel: StoredModelConfig = {\n name: modelName,\n tagline: typeof parsedModel.tagline === \"string\" ? parsedModel.tagline : undefined,\n systemPrompt: typeof parsedModel.systemPrompt === \"string\" ? parsedModel.systemPrompt : undefined,\n selectedModel: typeof parsedModel.selectedModel === \"string\" ? parsedModel.selectedModel : undefined,\n };\n\n const entry: StoredBanditConfigRecord = {\n id: modelName,\n model: sanitizedModel,\n name: modelName,\n tagline: sanitizedModel.tagline,\n systemPrompt: sanitizedModel.systemPrompt,\n avatarBase64: typeof parsedModel.avatarBase64 === \"string\" ? parsedModel.avatarBase64 : undefined,\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", entry, storeConfigs);\n }\n\n // Update Zustand with all imported models\n useModelStore.setState({\n availableModels: data.models,\n selectedModel: data.models[0]?.name || \"\",\n });\n setSelectedModel(data.models[0]?.name || \"\");\n setLocalSelectedModel({\n name: data.models[0]?.name || \"\",\n tagline: data.models[0]?.tagline || \"\",\n systemPrompt: data.models[0]?.systemPrompt || \"\",\n selectedModel: data.models[0]?.name || \"\",\n });\n setCustomAvatarBase64(data.models[0]?.avatarBase64 || null);\n setPresetAvatar(null);\n }\n\n // Save branding only to \"main\" entry - mark as user-saved to protect from CDN\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...data.branding,\n userSaved: true, // Mark imported branding as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Handle knowledgeDocs import\n if (data.knowledgeDocs && Array.isArray(data.knowledgeDocs)) {\n await clearAllDocuments();\n for (const doc of data.knowledgeDocs) {\n const blob = new Blob([doc.content], { type: \"text/plain\" });\n const file = new File([blob], doc.name, { type: \"text/plain\" });\n await addDocuments([file]);\n }\n await loadDocuments();\n }\n\n // Rehydrate from IndexedDB\n if (typeof initModels === \"function\") {\n await initModels();\n }\n } catch (e) {\n debugLogger.error(\"Failed to import config\", { error: e });\n }\n };\n reader.readAsText(file);\n }\n };\n\n // Ensure dropdown renders updated options when availableModels changes\n useEffect(() => {\n // If selectedModel is not in availableModels, clear selection\n if (\n localSelectedModel.selectedModel &&\n !availableModels.some((m) => m.name === localSelectedModel.selectedModel)\n ) {\n setLocalSelectedModel((prev) => ({\n ...prev,\n selectedModel: \"\",\n }));\n }\n // Optionally, you could auto-select the newly added model here if desired\n }, [availableModels, localSelectedModel.selectedModel]);\n\n useEffect(() => {\n loadDocuments();\n }, [loadDocuments]);\n\n // AI Provider configuration handlers\n const currentTheme = predefinedThemes[theme] || banditDarkTheme;\n if (!brandingLoaded) return null;\n // Side navigation tab config\n const allNavTabs = [\n {\n label: \"Personalities\",\n icon: <FaceRetouchingNaturalIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Branding\",\n icon: <BrushIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Knowledge\",\n icon: <MenuBookIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Storage\",\n icon: <StorageIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+ (changed from adminDashboardEnabled)\n },\n {\n label: \"Preferences\",\n icon: <TuneIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Provider\",\n icon: <CloudIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n {\n label: \"MCP Tools\",\n icon: <BuildIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n ];\n\n // Filter tabs based on user's features\n const navTabs = allNavTabs.filter(tab => {\n if (tab.requiresFeature === 'limitedAdminDashboard') {\n return hasLimitedAdminDashboard() || hasAdminDashboard();\n }\n if (tab.requiresFeature === 'adminDashboardEnabled') {\n return hasAdminDashboard();\n }\n if (tab.requiresFeature === 'advancedSearch') {\n return hasAdvancedSearch(); // Pro/Team users\n }\n return true;\n });\n\n const navigationContent = (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n bgcolor: \"inherit\",\n }}\n >\n {isMobile && (\n <Box\n sx={{\n height: 6,\n width: 56,\n borderRadius: 999,\n bgcolor: (theme) => alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n <Box sx={{ p: isMobile ? 2.5 : 3, pb: isMobile ? 1.5 : 2 }}>\n <Button\n onClick={() => {\n if (isMobile) setSidebarOpen(false);\n navigate(\"/chat\");\n }}\n onMouseEnter={preloadChatPage}\n startIcon={<ChevronLeftIcon sx={{ fontSize: 20 }} />}\n fullWidth\n variant=\"outlined\"\n sx={{\n height: 48,\n borderRadius: 3,\n fontWeight: 600,\n fontSize: \"1rem\",\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.08)\"\n : \"rgba(25,118,210,0.06)\",\n border: (theme) => `1.5px solid ${theme.palette.primary.main}30`,\n color: (theme) => theme.palette.primary.main,\n textTransform: \"none\",\n boxShadow: \"0 2px 8px rgba(25,118,210,0.15)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.12)\",\n borderColor: (theme) => theme.palette.primary.main,\n transform: \"translateY(-1px)\",\n boxShadow: \"0 4px 16px rgba(25,118,210,0.25)\",\n },\n \"&:active\": {\n transform: \"translateY(0px)\",\n },\n }}\n >\n Back to Chat\n </Button>\n </Box>\n\n <Divider sx={{ mx: isMobile ? 2 : 3, mb: 2, opacity: 0.6 }} />\n\n <Box sx={{ flex: 1, px: isMobile ? 1.5 : 2, pb: 3, overflowY: \"auto\" }}>\n <List sx={{ px: 0, py: 0 }}>\n {navTabs.map((tab, idx) => (\n <ListItemButton\n key={tab.label}\n selected={tabIndex === idx}\n onClick={() => {\n setTabIndex(idx);\n if (isMobile) setSidebarOpen(false);\n }}\n sx={{\n minHeight: 56,\n borderRadius: 3,\n mx: 1,\n my: 0.5,\n px: 2,\n py: 1.5,\n border: tabIndex === idx \n ? (theme) => `2px solid ${theme.palette.primary.main}40`\n : \"2px solid transparent\",\n bgcolor: tabIndex === idx\n ? (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\"\n : \"transparent\",\n color: tabIndex === idx ? \"primary.main\" : \"text.primary\",\n fontWeight: tabIndex === idx ? 700 : 500,\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n \"&:before\": {\n content: '\"\"',\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 4,\n bgcolor: tabIndex === idx ? \"primary.main\" : \"transparent\",\n borderRadius: \"0 2px 2px 0\",\n transition: \"all 0.2s\",\n },\n \"&:hover\": {\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.10)\",\n color: \"primary.main\",\n transform: \"translateX(4px)\",\n \"&:before\": {\n bgcolor: \"primary.main\",\n },\n },\n \"&:active\": {\n transform: \"translateX(2px) scale(0.98)\",\n },\n \"& .MuiListItemIcon-root\": {\n minWidth: 44,\n mr: 1.5,\n },\n }}\n >\n <ListItemIcon \n sx={{ \n color: tabIndex === idx ? \"primary.main\" : \"text.secondary\",\n fontSize: 24,\n transition: \"all 0.2s\",\n }}\n >\n {tab.icon}\n </ListItemIcon>\n <ListItemText\n primary={tab.label}\n primaryTypographyProps={{\n fontWeight: tabIndex === idx ? 700 : 600,\n fontSize: \"1rem\",\n letterSpacing: \"-0.01em\",\n }}\n />\n {tabIndex === idx && (\n <Box\n sx={{\n position: \"absolute\",\n right: -10,\n top: -10,\n width: 90,\n height: 90,\n bgcolor: (theme) => theme.palette.primary.main,\n filter: \"blur(45px)\",\n opacity: 0.35,\n pointerEvents: \"none\",\n }}\n />\n )}\n </ListItemButton>\n ))}\n </List>\n </Box>\n </Box>\n );\n return (\n <ThemeProvider theme={currentTheme}>\n <CssBaseline />\n <Box\n display=\"flex\"\n height=\"100vh\"\n sx={{\n bgcolor: \"background.default\",\n flexDirection: isMobile ? \"column\" : \"row\",\n width: \"100vw\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* Enhanced Mobile Header */}\n {isMobile && (\n <Box\n sx={{\n width: \"100%\",\n height: 64,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n px: 3,\n py: 1.5,\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(24,28,40,0.95)\"\n : \"rgba(255,255,255,0.95)\",\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n backdropFilter: \"blur(12px)\",\n zIndex: 1201,\n position: \"sticky\",\n top: 0,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n {/* Enhanced Hamburger Menu */}\n <Button\n onClick={() => setSidebarOpen((o) => !o)}\n sx={{\n minWidth: 48,\n minHeight: 48,\n p: 1.5,\n borderRadius: 2,\n border: \"none\",\n bgcolor: sidebarOpen \n ? (theme) => theme.palette.primary.main\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.08)\"\n : \"rgba(0,0,0,0.04)\",\n color: sidebarOpen \n ? \"white\"\n : (theme) => theme.palette.primary.main,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n transform: sidebarOpen ? \"rotate(90deg)\" : \"rotate(0deg)\",\n \"&:hover\": {\n bgcolor: sidebarOpen\n ? (theme) => theme.palette.primary.dark\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.12)\"\n : \"rgba(0,0,0,0.08)\",\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: sidebarOpen ? \"rotate(90deg) scale(0.95)\" : \"scale(0.95)\",\n },\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d={sidebarOpen \n ? \"M18 6L6 18M6 6L18 18\" \n : \"M3 12H21M3 6H21M3 18H21\"\n }\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n\n {/* App Title */}\n <Typography \n variant=\"h6\" \n sx={{ \n fontWeight: 700, \n color: \"primary.main\",\n fontSize: \"1.1rem\",\n letterSpacing: \"-0.02em\"\n }}\n >\n Management\n </Typography>\n\n {/* Current Tab Indicator */}\n <Box sx={{\n px: 2,\n py: 0.5,\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\",\n border: (theme) => `1px solid ${theme.palette.primary.main}20`,\n }}>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"primary.main\", \n fontWeight: 600,\n fontSize: \"0.75rem\"\n }}\n >\n {navTabs[tabIndex]?.label}\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Enhanced Side Navigation */}\n {isMobile ? (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={sidebarOpen}\n onClose={() => setSidebarOpen(false)}\n onOpen={() => setSidebarOpen(true)}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n PaperProps={{\n sx: {\n height: 'min(720px, 82vh)',\n borderRadius: '22px 22px 0 0',\n overflow: 'hidden',\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n boxShadow: '0 12px 32px rgba(0,0,0,0.28)',\n backdropFilter: 'blur(18px)',\n },\n }}\n >\n {navigationContent}\n </SwipeableDrawer>\n ) : (\n <Box\n sx={{\n width: 280,\n minWidth: 280,\n maxWidth: 280,\n height: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n borderRight: (theme) => `1px solid ${theme.palette.divider}`,\n boxShadow: (theme) => theme.palette.mode === \"dark\"\n ? \"2px 0 16px 0 rgba(0,0,0,0.25)\"\n : \"2px 0 16px 0 rgba(0,0,0,0.08)\",\n backdropFilter: \"blur(16px)\",\n zIndex: 1200,\n position: \"fixed\",\n left: 0,\n top: 0,\n overflow: \"hidden\",\n }}\n >\n {navigationContent}\n </Box>\n )}\n\n {/* Main content area */}\n <Box\n sx={{\n flex: 1,\n p: { xs: 1, sm: 3, md: 4 },\n overflowY: \"auto\",\n height: isMobile ? \"auto\" : \"100vh\",\n maxWidth: \"100vw\",\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"background.default\",\n ml: isMobile ? 0 : \"280px\", // Fixed left margin only on desktop\n mt: 0,\n transition: \"margin-left 0.2s\",\n overflow: \"auto\",\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}\n >\n {/* Tab Content */}\n {navTabs[tabIndex]?.label === \"Personalities\" && (\n <PersonalitiesTab\n availableModels={availableModels}\n selectedModel={selectedModel}\n setSelectedModel={setSelectedModel}\n localSelectedModel={localSelectedModel}\n setLocalSelectedModel={setLocalSelectedModel}\n customAvatarBase64={customAvatarBase64}\n setCustomAvatarBase64={setCustomAvatarBase64}\n presetAvatar={presetAvatar}\n setPresetAvatar={setPresetAvatar}\n handleSaveModel={handleSaveModel}\n handleResetModel={handleResetModel}\n restoreDefaultModelsAndConfig={restoreDefaultModelsAndConfig}\n restoreBanditModels={restoreBanditModels}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Branding\" && (\n <BrandingTab\n logoFile={logoFile}\n logoBase64={logoBase64}\n brandingText={brandingText}\n setBrandingText={setBrandingText}\n theme={theme}\n setTheme={setTheme}\n predefinedThemes={predefinedThemes}\n handleLogoUpload={handleLogoUpload}\n handleRestoreDefaults={handleRestoreDefaults}\n handleExportConfig={handleExportConfig}\n handleImportConfig={handleImportConfig}\n handleSaveBranding={handleSaveBranding}\n setLogoFile={setLogoFile}\n setLogoBase64={setLogoBase64}\n />\n )}\n {navTabs[tabIndex]?.label === \"Knowledge\" && (\n <KnowledgeTab\n documents={documents}\n addDocuments={addDocuments}\n removeDocument={removeDocument}\n loadDocuments={loadDocuments}\n clearAllDocuments={clearAllDocuments}\n currentTheme={currentTheme}\n isLimitedAdmin={hasLimitedAdminDashboard() && !hasAdminDashboard()}\n />\n )}\n {navTabs[tabIndex]?.label === \"Storage\" && (\n <StorageTab currentTheme={currentTheme} />\n )}\n {navTabs[tabIndex]?.label === \"Preferences\" && (\n <PreferencesTab\n preferences={preferences}\n updatePreference={updatePreference}\n packageSettings={packageSettings}\n handleSavePreferences={handleSavePreferences}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Provider\" && <ProviderTab />}\n {navTabs[tabIndex]?.label === \"MCP Tools\" && <MCPToolsTabV2 />}\n </Box>\n\n <Fab\n aria-label=\"AI\"\n onClick={handleOpenModal}\n sx={(theme) => ({\n position: \"fixed\",\n bottom: 16,\n right: 16,\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n \"&:hover\": {\n backgroundColor: theme.palette.primary.dark,\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: \"scale(0.95)\",\n },\n transition: \"all 0.2s ease-in-out\",\n boxShadow: theme.shadows[6],\n zIndex: 2000,\n })}\n >\n <img\n src={fabLogo}\n alt=\"AI Assistant Logo\"\n style={{\n width: 32,\n height: 32,\n objectFit: \"contain\",\n }}\n />\n </Fab>\n <ChatModal open={modalOpen} onClose={handleCloseModal} />\n </Box>\n\n </ThemeProvider>\n );\n};\n\nexport default Management;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FAB9-58E90B\nconst __banditFingerprint_components_PersonalitiesTabtsx = 'BL-FP-A5FD2B-5424';\nconst __auditTrail_components_PersonalitiesTabtsx = 'BL-AU-MGOIKVVJ-SL4R';\n// File: PersonalitiesTab.tsx | Path: src/management/components/PersonalitiesTab.tsx | Hash: fab95424\n\nimport React, { useState } from \"react\";\nimport {\n Box,\n TextField,\n Button,\n Typography,\n MenuItem,\n Avatar,\n Card,\n CardContent,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Tabs,\n Tab,\n Alert,\n Chip,\n GlobalStyles,\n} from \"@mui/material\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { useTheme } from \"@mui/material/styles\";\nimport AutoAwesomeIcon from '@mui/icons-material/AutoAwesome';\nimport RocketLaunchOutlinedIcon from '@mui/icons-material/RocketLaunchOutlined';\nimport ViewModuleOutlinedIcon from '@mui/icons-material/ViewModuleOutlined';\nimport EditNoteOutlinedIcon from '@mui/icons-material/EditNoteOutlined';\nimport ManageAccountsOutlinedIcon from '@mui/icons-material/ManageAccountsOutlined';\nimport PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded';\nimport AvatarCropper from '../../components/AvatarCropper';\nimport { BanditPersonality, useModelStore } from \"../../store/modelStore\";\nimport { models as defaultModels } from \"../../models/models\";\nimport { resolveAvatar } from \"../../util\";\nimport indexedDBService from \"../../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\n\nexport interface LocalModelState {\n name: string;\n tagline: string;\n systemPrompt: string;\n selectedModel: string;\n}\n\ninterface PersonalitiesTabProps {\n availableModels: BanditPersonality[];\n selectedModel: string;\n setSelectedModel: (model: string) => void;\n localSelectedModel: LocalModelState;\n setLocalSelectedModel: (model: LocalModelState) => void;\n customAvatarBase64: string | null;\n setCustomAvatarBase64: (avatar: string | null) => void;\n presetAvatar: string | null;\n setPresetAvatar: (avatar: string | null) => void;\n handleSaveModel: () => Promise<void>;\n handleResetModel: () => void;\n restoreDefaultModelsAndConfig: () => Promise<void>;\n restoreBanditModels: () => Promise<void>;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}const PersonalitiesTab: React.FC<PersonalitiesTabProps> = ({\n availableModels,\n selectedModel,\n setSelectedModel,\n localSelectedModel,\n setLocalSelectedModel,\n customAvatarBase64,\n setCustomAvatarBase64,\n presetAvatar,\n setPresetAvatar,\n handleSaveModel,\n handleResetModel,\n restoreDefaultModelsAndConfig,\n restoreBanditModels,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [personalityTabIndex, setPersonalityTabIndex] = useState(0);\n const sectionGap = isMobile ? 2 : 3;\n const tabWrapperStyles = isMobile ? { flexDirection: 'column', gap: 0.35, fontSize: '0.78rem' } : { flexDirection: 'row', gap: 0.75, fontSize: '0.95rem' };\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [personalityToDelete, setPersonalityToDelete] = useState<string | null>(null);\n const [clickedChips, setClickedChips] = useState<Set<string>>(new Set());\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n\n const promptTemplates = [\n {\n name: \"Business Professional\",\n tagline: \"Your reliable business companion\",\n avatar: \"https://cdn.burtson.ai/avatars/businessman.png\",\n prompt: \"You are a professional AI assistant specializing in business and productivity. You provide clear, concise, and actionable advice. Always maintain a professional tone while being helpful and efficient. Focus on practical solutions and best practices.\",\n description: \"Perfect for business environments, meetings, and professional communication.\"\n },\n {\n name: \"Creative Media Specialist\",\n tagline: \"Unleash your imagination together\",\n avatar: \"https://cdn.burtson.ai/avatars/mediagal.png\",\n prompt: \"You are a creative AI partner who loves to brainstorm, write, and explore imaginative ideas. You're enthusiastic, inspiring, and always ready to think outside the box. Help users unlock their creativity with vivid descriptions, innovative concepts, and artistic flair.\",\n description: \"Great for writers, designers, marketers, and creative projects.\"\n },\n {\n name: \"Data Science Expert\",\n tagline: \"Turn data into insights\",\n avatar: \"https://cdn.burtson.ai/avatars/datascience.png\",\n prompt: \"You are a data science expert who excels at analyzing data, creating visualizations, and extracting meaningful insights. You help with statistical analysis, machine learning models, and data interpretation. Always explain your reasoning and suggest actionable next steps based on data findings.\",\n description: \"Perfect for data analysis, research, and statistical insights.\"\n },\n {\n name: \"Customer Support Pro\",\n tagline: \"Helpful, patient, and solution-focused\",\n avatar: \"https://cdn.burtson.ai/avatars/support.png\",\n prompt: \"You are a customer support specialist who is patient, empathetic, and solution-focused. You listen carefully to customer concerns, ask clarifying questions, and provide step-by-step solutions. Always maintain a positive, helpful attitude even with difficult situations.\",\n description: \"Designed for customer service and support interactions.\"\n },\n {\n name: \"Startup Mentor\",\n tagline: \"From idea to unicorn\",\n avatar: \"https://cdn.burtson.ai/avatars/startupmentor.png\",\n prompt: \"You are an experienced startup mentor who has helped dozens of companies go from idea to successful business. You provide practical advice on product development, fundraising, marketing, and scaling. You're direct but encouraging, with a bias toward action and customer validation.\",\n description: \"Essential for entrepreneurs, founders, and startup teams.\"\n },\n {\n name: \"Learning Coach\",\n tagline: \"Master any skill together\",\n avatar: \"https://cdn.burtson.ai/avatars/trainer.png\",\n prompt: \"You are an expert learning coach who adapts to any subject and learning style. You break down complex topics into digestible chunks, create practice exercises, and provide encouraging feedback. You use analogies, examples, and interactive methods to make learning engaging and effective.\",\n description: \"Great for students, educators, and lifelong learners.\"\n },\n {\n name: \"Research Assistant\",\n tagline: \"Deep dives, accurate sources\",\n avatar: \"https://cdn.burtson.ai/avatars/researcher.png\",\n prompt: \"You are a meticulous research assistant who excels at finding reliable sources, synthesizing information, and presenting comprehensive findings. You approach topics systematically, consider multiple perspectives, and always cite your sources. You help users understand complex subjects through thorough investigation.\",\n description: \"Ideal for academics, journalists, and research projects.\"\n },\n {\n name: \"Travel Expert\",\n tagline: \"Adventures await everywhere\",\n avatar: \"https://cdn.burtson.ai/avatars/travel.png\",\n prompt: \"You are an experienced travel companion who knows hidden gems, local customs, and practical travel tips worldwide. You help plan itineraries, suggest activities, and provide cultural insights. You're enthusiastic about exploration while being mindful of budget, safety, and local etiquette.\",\n description: \"Essential for travelers, adventure seekers, and culture enthusiasts.\"\n }\n ];\n\n const moodSuggestions = [\n { label: \"Friendly\", color: \"#4CAF50\" },\n { label: \"Professional\", color: \"#2196F3\" },\n { label: \"Casual\", color: \"#FF9800\" },\n { label: \"Enthusiastic\", color: \"#E91E63\" },\n { label: \"Calm\", color: \"#9C27B0\" },\n { label: \"Witty\", color: \"#FF5722\" },\n { label: \"Serious\", color: \"#607D8B\" },\n { label: \"Supportive\", color: \"#009688\" }\n ];\n\n const handleTemplateSelect = (template: typeof promptTemplates[0]) => {\n setLocalSelectedModel({\n ...localSelectedModel,\n name: template.name,\n tagline: template.tagline,\n systemPrompt: template.prompt,\n selectedModel: \"\", // Clear selected model to indicate new model creation\n });\n // Set the template's avatar\n setPresetAvatar(template.avatar);\n setCustomAvatarBase64(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n };\n\n const handleMoodSelect = (mood: string) => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n let moodInstruction = \"\";\n \n switch (mood.toLowerCase()) {\n case \"friendly\":\n moodInstruction = \"Always be warm, welcoming, and approachable in your responses.\";\n break;\n case \"professional\":\n moodInstruction = \"Maintain a professional, business-appropriate tone in all interactions.\";\n break;\n case \"casual\":\n moodInstruction = \"Use a relaxed, conversational tone as if talking to a friend.\";\n break;\n case \"enthusiastic\":\n moodInstruction = \"Show excitement and energy in your responses, use positive language.\";\n break;\n case \"calm\":\n moodInstruction = \"Speak in a soothing, peaceful manner that helps users feel at ease.\";\n break;\n case \"witty\":\n moodInstruction = \"Use clever humor and wordplay when appropriate, but stay helpful.\";\n break;\n case \"serious\":\n moodInstruction = \"Maintain a focused, no-nonsense approach to problem-solving.\";\n break;\n case \"supportive\":\n moodInstruction = \"Be encouraging and understanding, offering emotional support when needed.\";\n break;\n }\n\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + moodInstruction;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `mood-${mood}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${mood}\" mood to your personality!`, 'success');\n }\n };\n\n const handleDeletePersonality = (modelNameToDelete?: string) => {\n const nameToDelete = modelNameToDelete || localSelectedModel.selectedModel;\n \n if (!nameToDelete) {\n debugLogger.warn(\"No model selected for deletion\");\n return;\n }\n \n setPersonalityToDelete(nameToDelete);\n setDeleteDialogOpen(true);\n };\n\n const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n if (showSnackbar) {\n showSnackbar('Please select a JPG or PNG image file.', 'error');\n }\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n if (showSnackbar) {\n showSnackbar('Image file size must be less than 10MB.', 'error');\n }\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n setCustomAvatarBase64(croppedImageData);\n setPresetAvatar(null);\n setCropperOpen(false);\n setSelectedImageFile(null);\n \n if (showSnackbar) {\n showSnackbar('Avatar cropped successfully!', 'success');\n }\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const confirmDeletePersonality = async () => {\n if (!personalityToDelete) return;\n\n debugLogger.info(\"Deleting personality\", { modelName: personalityToDelete });\n \n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Check if this is a Bandit personality that should be tracked as deleted\n const isBanditPersonality = defaultModels.some(banditModel => banditModel.name === personalityToDelete);\n \n if (isBanditPersonality) {\n // Add to deleted models tracking list\n const deletedEntry = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n if (!deletedModelNames.includes(personalityToDelete)) {\n const updatedDeletedNames = [...deletedModelNames, personalityToDelete];\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"deletedModels\",\n deleted: updatedDeletedNames,\n }, storeConfigs);\n debugLogger.info(\"Added Bandit personality to deleted tracking list\", { \n deletedPersonality: personalityToDelete \n });\n }\n }\n \n // Remove from IndexedDB\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", personalityToDelete, storeConfigs);\n \n // Update Zustand store\n useModelStore.setState({\n availableModels: availableModels.filter(model => model.name !== personalityToDelete),\n });\n \n // Reset form to first available model (or empty if no custom models)\n const remainingModels = availableModels.filter(model => model.name !== personalityToDelete);\n const firstModel = remainingModels.length > 0 ? remainingModels[0] : null;\n \n if (firstModel) {\n setSelectedModel(firstModel.name);\n setLocalSelectedModel({\n selectedModel: firstModel.name,\n name: firstModel.name,\n tagline: firstModel.tagline || \"\",\n systemPrompt: firstModel.systemPrompt || \"\",\n });\n setCustomAvatarBase64(firstModel.avatarBase64 || null);\n setPresetAvatar(null);\n } else {\n // No custom models left, reset form\n setSelectedModel(\"\");\n setLocalSelectedModel({\n selectedModel: \"\",\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n \n debugLogger.info(\"✅ Personality deleted successfully\");\n \n // Show success message\n if (showSnackbar) {\n showSnackbar(`Personality \"${personalityToDelete}\" deleted successfully!`, 'success');\n }\n \n } catch (error) {\n debugLogger.error(\"Failed to delete personality\", { error });\n \n // Show error message\n if (showSnackbar) {\n showSnackbar(\"Failed to delete personality. Please try again.\", 'error');\n }\n } finally {\n setDeleteDialogOpen(false);\n setPersonalityToDelete(null);\n }\n };\n\n const renderTemplatesTab = () => (\n <>\n <GlobalStyles\n styles={{\n '@keyframes pulse': {\n '0%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n '50%': {\n transform: 'scale(1.05)',\n opacity: 0.8,\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n },\n }}\n />\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box sx={{ \n display: \"flex\", \n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1.5, md: 2 }\n }}>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n gap: { xs: 1.1, sm: 1.5 },\n width: { xs: \"100%\", md: \"auto\" }\n }}>\n <Box sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n borderRadius: 2,\n p: { xs: 0.75, sm: 1 },\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: { xs: \"42px\", sm: \"48px\" },\n height: { xs: \"42px\", sm: \"48px\" },\n boxShadow: \"0 4px 12px rgba(25,118,210,0.25)\",\n }}>\n <RocketLaunchOutlinedIcon sx={{ fontSize: { xs: \"1.3rem\", sm: \"1.5rem\" }, color: 'common.white' }} />\n </Box>\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" }, flex: 1 }}>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n backgroundClip: \"text\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n mb: 0.5,\n fontSize: { xs: \"1.55rem\", sm: \"1.75rem\" }\n }}\n >\n Quick Start Templates\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ color: \"text.secondary\", fontWeight: 500, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}\n >\n 12 curated personalities • Ready to use\n </Typography>\n </Box>\n </Box>\n <Chip\n label=\"New\"\n size=\"small\"\n sx={{\n background: \"linear-gradient(135deg, #ff4081 0%, #f06292 100%)\",\n color: \"white\",\n fontWeight: 600,\n animation: \"pulse 2s infinite\",\n alignSelf: { xs: \"flex-start\", md: \"center\" }\n }}\n />\n </Box>\n \n <Alert \n severity=\"info\" \n sx={{ \n mb: { xs: 2.5, md: 4 }, \n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 },\n \"& .MuiAlert-icon\": {\n color: \"primary.main\"\n }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>💡</Typography>}\n >\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Choose a template to get started instantly\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically fill the creation form with a proven personality setup. \n You can then customize it further to match your specific needs.\n </Typography>\n </Box>\n </Alert>\n \n {/* Create from Scratch Card */}\n <Card\n sx={{\n mb: { xs: 3, md: 4 },\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n border: \"2px solid transparent\",\n borderRadius: 3,\n cursor: \"pointer\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n \"&:hover\": {\n transform: \"translateY(-4px) scale(1.02)\",\n boxShadow: \"0 12px 40px rgba(25, 118, 210, 0.3)\",\n },\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%)\",\n pointerEvents: \"none\",\n }\n }}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n >\n <CardContent sx={{ \n p: { xs: 3, sm: 4 }, \n color: \"white\",\n textAlign: \"center\",\n position: \"relative\",\n zIndex: 1\n }}>\n <Box sx={{ \n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 0,\n mb: { xs: 1.5, sm: 2 },\n }}>\n <AutoAwesomeIcon sx={{ fontSize: { xs: 36, sm: 44 }, color: 'common.white', filter: \"drop-shadow(0 4px 12px rgba(0,0,0,0.25))\" }} />\n </Box>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n mb: { xs: 0.75, sm: 1 },\n textShadow: \"0 2px 4px rgba(0,0,0,0.2)\"\n }}\n >\n Create from Scratch\n </Typography>\n <Typography \n variant=\"body1\" \n sx={{ \n opacity: 0.9,\n fontWeight: 500,\n textShadow: \"0 1px 2px rgba(0,0,0,0.2)\"\n }}\n >\n Start with a blank canvas and build your perfect AI personality\n </Typography>\n </CardContent>\n </Card>\n \n <Box sx={{ \n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, 1fr)\",\n md: \"repeat(3, 1fr)\",\n lg: \"repeat(4, 1fr)\",\n xl: \"repeat(4, 1fr)\",\n },\n gap: { xs: 2, sm: 2.5, md: 3 },\n alignItems: \"stretch\"\n }}>\n {promptTemplates.map((template, index) => (\n <Card\n key={index}\n sx={{\n cursor: \"pointer\",\n position: \"relative\",\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.05) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: \"1px solid\",\n borderColor: \"rgba(255,255,255,0.1)\",\n borderRadius: 3,\n minHeight: { xs: \"auto\", md: \"280px\" },\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n height: \"3px\",\n background: `linear-gradient(90deg, \n hsl(${(index * 30) % 360}, 70%, 60%) 0%, \n hsl(${(index * 30 + 60) % 360}, 70%, 60%) 100%)`,\n opacity: 0,\n transition: \"opacity 0.3s ease\",\n },\n \"&:hover\": {\n transform: \"translateY(-8px) scale(1.02)\",\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\n borderColor: \"primary.main\",\n \"&::before\": {\n opacity: 1,\n },\n \"& .template-icon\": {\n transform: \"scale(1.1) rotate(5deg)\",\n },\n \"& .template-chip\": {\n transform: \"translateY(-2px)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.2)\",\n },\n },\n \"&:active\": {\n transform: \"translateY(-4px) scale(1.01)\",\n }\n }}\n onClick={() => handleTemplateSelect(template)}\n >\n <CardContent sx={{ \n p: { xs: 2.5, sm: 3 }, \n display: \"flex\", \n flexDirection: \"column\", \n height: \"100%\",\n justifyContent: \"space-between\"\n }}>\n {/* Header Section */}\n <Box>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n mb: { xs: 2, md: 2.5 },\n minHeight: { xs: \"auto\", md: \"60px\" }\n }}>\n <Avatar\n src={template.avatar}\n alt={template.name}\n sx={{\n width: { xs: 48, sm: 56, md: 60 },\n height: { xs: 48, sm: 56, md: 60 },\n mr: { xs: 1.5, md: 2 },\n transition: \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n border: \"2px solid rgba(255,255,255,0.8)\",\n }}\n />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography \n variant=\"body1\" \n sx={{ \n fontWeight: 700,\n fontSize: { xs: \"1rem\", sm: \"1.05rem\", md: \"1.1rem\" },\n lineHeight: 1.2,\n mb: 0.5,\n color: \"text.primary\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.name}\n </Typography>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"text.secondary\",\n fontStyle: \"italic\",\n fontSize: { xs: \"0.75rem\", sm: \"0.78rem\", md: \"0.8rem\" },\n fontWeight: 500,\n display: \"-webkit-box\",\n WebkitLineClamp: 1,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.tagline}\n </Typography>\n </Box>\n </Box>\n\n {/* Description Section */}\n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\",\n lineHeight: 1.5,\n fontSize: { xs: \"0.82rem\", sm: \"0.85rem\", md: \"0.875rem\" },\n display: \"-webkit-box\",\n WebkitLineClamp: 4,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n mb: { xs: 1.5, md: 2 },\n minHeight: { xs: \"auto\", md: \"84px\" },\n }}\n >\n {template.description}\n </Typography>\n </Box>\n\n {/* Footer Section */}\n <Box sx={{ \n display: \"flex\", \n justifyContent: \"center\",\n alignItems: \"center\"\n }}>\n <Chip\n className=\"template-chip\"\n label=\"Apply Template\"\n size=\"small\"\n icon={<PlayArrowRoundedIcon sx={{ color: 'inherit', fontSize: '1rem !important' }} />}\n sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n color: \"white\",\n fontWeight: 600,\n fontSize: { xs: \"0.72rem\", md: \"0.75rem\" },\n height: { xs: \"30px\", md: \"32px\" },\n px: { xs: 1.5, md: 2 },\n borderRadius: 2,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n background: \"linear-gradient(135deg, #1565c0 0%, #1e88e5 100%)\",\n }\n }}\n />\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n\n <Alert \n severity=\"info\" \n sx={{ mt: { xs: 2.5, md: 4 }, borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}\n icon={<Typography>💡</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Pro Tip:\n </Typography>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically switch to the Create/Edit tab with the form pre-filled. Mix and match ideas to create your perfect AI personality!\n </Typography>\n </Alert>\n </Box>\n </>\n );\n\n const renderCreateEditTab = () => (\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Typography\n variant=\"h5\"\n sx={{\n fontWeight: 600,\n mb: 1,\n color: \"primary.main\",\n fontSize: { xs: \"1.55rem\", sm: \"1.7rem\" },\n }}\n >\n {localSelectedModel.selectedModel ? \"Edit Personality\" : \"Create New Personality\"}\n </Typography>\n \n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", mb: { xs: 2, md: 3 }, fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n {localSelectedModel.selectedModel \n ? `Customize and modify the \"${localSelectedModel.selectedModel}\" personality to better suit your needs.`\n : \"Design a custom AI personality that matches your brand, use case, and communication style.\"\n }\n </Typography>\n\n {!localSelectedModel.selectedModel && (\n <Alert \n severity=\"info\" \n sx={{ \n mb: { xs: 2.5, md: 3 }, \n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>🎯</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Creating a new personality\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Fill out the form below to create your custom AI assistant. Start with a template from the Templates tab, or build from scratch!\n </Typography>\n </Alert>\n )}\n </Box>\n\n <Box sx={{ mb: sectionGap }}>\n {localSelectedModel.selectedModel && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mt: 2, mb: 3 }}>\n <Avatar\n src={\n resolveAvatar(\n availableModels.find((m) => m.name === localSelectedModel.selectedModel) || {\n name: localSelectedModel.selectedModel,\n avatarBase64: customAvatarBase64,\n }\n )\n }\n alt={localSelectedModel.selectedModel}\n sx={{ width: 48, height: 48, mr: 2, filter: \"brightness(1.5)\" }}\n />\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>{localSelectedModel.selectedModel}</Typography>\n </Box>\n )}\n \n <TextField\n label=\"Select Existing Personality to Edit\"\n variant=\"outlined\"\n value={localSelectedModel.selectedModel}\n onChange={(e) => {\n const selectedModelName = e.target.value;\n if (selectedModelName) {\n // Find the selected model and populate the form\n const selectedModelData = availableModels.find(m => m.name === selectedModelName);\n if (selectedModelData) {\n setLocalSelectedModel({\n name: selectedModelData.name,\n tagline: selectedModelData.tagline,\n systemPrompt: selectedModelData.systemPrompt as string,\n selectedModel: selectedModelName,\n });\n setCustomAvatarBase64(selectedModelData.avatarBase64 || null);\n setPresetAvatar(null);\n }\n } else {\n // Clear form for new personality\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n setSelectedModel(selectedModelName);\n }}\n fullWidth\n select\n sx={{ mb: sectionGap }}\n >\n <MenuItem value=\"\">Create New Personality</MenuItem>\n {availableModels.map((model, index) => (\n <MenuItem key={index} value={model.name}>\n {model.name}\n </MenuItem>\n ))}\n </TextField>\n </Box>\n\n <TextField\n label=\"Personality Name\"\n variant=\"outlined\"\n value={localSelectedModel.name}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, name: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., My Custom Assistant\"\n sx={{ mb: sectionGap }}\n />\n \n <TextField\n label=\"Tagline\"\n variant=\"outlined\"\n value={localSelectedModel.tagline}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, tagline: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., Your helpful companion for daily tasks\"\n sx={{ mb: sectionGap }}\n />\n\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Mood & Personality\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any mood to automatically add personality instructions to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {moodSuggestions.map((mood) => (\n <Chip\n key={mood.label}\n label={mood.label}\n onClick={() => handleMoodSelect(mood.label)}\n sx={{\n bgcolor: mood.color + \"20\",\n color: mood.color,\n border: `1px solid ${mood.color}40`,\n \"&:hover\": {\n bgcolor: mood.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`mood-${mood.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: mood.color + \"40\",\n boxShadow: `0 0 20px ${mood.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Guidance */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n ✨ Formatting Tips\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any tip to add professional formatting to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { label: \"Be Specific\", text: \"Always be specific and detailed in your responses.\", color: \"#2196F3\" },\n { label: \"Stay In Character\", text: \"Maintain your personality consistently throughout the conversation.\", color: \"#4CAF50\" },\n { label: \"Ask Questions\", text: \"Ask clarifying questions when you need more information to help effectively.\", color: \"#FF9800\" },\n { label: \"Be Helpful\", text: \"Always prioritize being helpful and providing actionable advice.\", color: \"#9C27B0\" },\n { label: \"Use Examples\", text: \"Provide concrete examples whenever possible to illustrate your points.\", color: \"#F44336\" },\n { label: \"Be Concise\", text: \"Keep responses focused and concise while still being thorough.\", color: \"#00BCD4\" },\n ].map((tip) => (\n <Chip\n key={tip.label}\n label={tip.label}\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tip.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tip-${tip.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tip.label}\" tip to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tip.color + \"20\",\n color: tip.color,\n border: `1px solid ${tip.color}40`,\n \"&:hover\": {\n bgcolor: tip.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`tip-${tip.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tip.color + \"40\",\n boxShadow: `0 0 20px ${tip.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Tools */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Formatting Tools\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Add visual formatting to make your AI responses more engaging:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { \n label: \"Highlight Text\", \n text: \"Use <mark>highlighted text</mark> to emphasize important points.\", \n color: \"#FFC107\",\n icon: \"🔍\"\n },\n { \n label: \"Bold Emphasis\", \n text: \"Use **bold text** to make key concepts stand out.\", \n color: \"#795548\",\n icon: \"💪\"\n },\n { \n label: \"Add Emojis\", \n text: \"Use relevant emojis 🎯 to make responses more friendly and engaging.\", \n color: \"#FF9800\",\n icon: \"😊\"\n },\n { \n label: \"Code Blocks\", \n text: \"Use `code snippets` or ```code blocks``` for technical content.\", \n color: \"#424242\",\n icon: \"💻\"\n },\n { \n label: \"Lists & Structure\", \n text: \"Use bullet points:\\n• Point 1\\n• Point 2\\n• Point 3\", \n color: \"#607D8B\",\n icon: \"📝\"\n },\n { \n label: \"Action Items\", \n text: \"Create actionable steps:\\n✅ Do this first\\n🔄 Then this\\n🎯 Finally this\", \n color: \"#4CAF50\",\n icon: \"✅\"\n },\n ].map((tool) => (\n <Chip\n key={tool.label}\n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <Typography component=\"span\" sx={{ fontSize: \"0.85rem\" }}>\n {tool.icon}\n </Typography>\n <Typography component=\"span\" sx={{ fontSize: \"0.875rem\" }}>\n {tool.label}\n </Typography>\n </Box>\n }\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tool.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tool-${tool.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tool.label}\" formatting to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tool.color + \"20\",\n color: tool.color,\n border: `1px solid ${tool.color}40`,\n \"&:hover\": {\n bgcolor: tool.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n height: \"36px\",\n \"& .MuiChip-label\": {\n px: 1.5,\n },\n ...(clickedChips.has(`tool-${tool.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tool.color + \"40\",\n boxShadow: `0 0 20px ${tool.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n <TextField\n label=\"System Prompt\"\n variant=\"outlined\"\n value={localSelectedModel.systemPrompt}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, systemPrompt: e.target.value })\n }\n fullWidth\n multiline\n rows={10}\n placeholder=\"Describe how your assistant should behave...\"\n InputLabelProps={{ shrink: true }}\n InputProps={{\n style: {\n minHeight: isMobile ? \"180px\" : \"240px\",\n maxHeight: \"360px\",\n },\n }}\n sx={{ mb: 3 }}\n />\n\n {/* Avatar selection: show for all models */}\n <Box sx={{ mb: 4 }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Select an Avatar\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Choose from our curated collection of avatars to give your AI personality a face:\n </Typography>\n \n {/* Premium Professional Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"primary.main\", fontWeight: 600, display: \"block\" }}>\n 🤖 Robotic Collection\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Fembot', src: \"https://cdn.burtson.ai/avatars/fembot.png\" },\n { label: 'Dudebot', src: \"https://cdn.burtson.ai/avatars/dudebot.png\" },\n { label: 'Coolbot', src: \"https://cdn.burtson.ai/avatars/coolbot.png\" }\n ].map(({ label, src }) => (\n <Avatar\n key={label}\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n ))}\n </Box>\n\n {/* Professional Character Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"secondary.main\", fontWeight: 600, display: \"block\" }}>\n 👥 Professional Characters\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Business Professional', src: \"https://cdn.burtson.ai/avatars/businessman.png\", role: 'Business & Strategy' },\n { label: 'Data Scientist', src: \"https://cdn.burtson.ai/avatars/datascience.png\", role: 'Analytics & Insights' },\n { label: 'Support Specialist', src: \"https://cdn.burtson.ai/avatars/support.png\", role: 'Customer Support' },\n { label: 'Creative Professional', src: \"https://cdn.burtson.ai/avatars/mediagal.png\", role: 'Media & Design' },\n { label: 'Trainer & Mentor', src: \"https://cdn.burtson.ai/avatars/trainer.png\", role: 'Learning & Development' },\n { label: 'Researcher', src: \"https://cdn.burtson.ai/avatars/researcher.png\", role: 'Research & Analysis' },\n { label: 'Startup Mentor', src: \"https://cdn.burtson.ai/avatars/startupmentor.png\", role: 'Entrepreneurship' },\n { label: 'Travel Expert', src: \"https://cdn.burtson.ai/avatars/travel.png\", role: 'Travel & Adventure' },\n ].map(({ label, src, role }) => (\n <Box key={label} sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.5 }}>\n <Avatar\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n <Typography variant=\"caption\" sx={{ \n textAlign: 'center', \n maxWidth: '80px', \n fontSize: '0.7rem',\n lineHeight: 1.2,\n color: 'text.secondary',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }}>\n {role}\n </Typography>\n </Box>\n ))}\n </Box>\n\n {/* Custom Upload Section */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"warning.main\", fontWeight: 600, display: \"block\" }}>\n 📸 Custom Upload\n </Typography>\n <Button \n variant=\"outlined\" \n component=\"label\"\n sx={{\n mb: 2,\n px: { xs: 2.2, sm: 3 },\n py: { xs: 1.2, sm: 1.5 },\n borderRadius: 2,\n textTransform: 'none',\n fontWeight: 600,\n borderStyle: 'dashed',\n borderWidth: 2,\n '&:hover': {\n borderStyle: 'dashed',\n borderWidth: 2,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n 🎯 Upload & Crop Custom Avatar\n <input \n type=\"file\" \n accept=\"image/png, image/jpeg, image/jpg\" \n hidden \n onChange={handleImageUpload}\n />\n </Button>\n \n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2, fontSize: '0.8rem' }}>\n • Supports JPG/PNG up to 10MB • Built-in cropper for perfect sizing • Final output: 512×512px\n </Typography>\n\n {(customAvatarBase64 || presetAvatar) && (\n <Box sx={{ mt: 2, display: 'flex', alignItems: 'center', gap: 2 }}>\n <Avatar\n src={(customAvatarBase64 || presetAvatar) as string}\n alt=\"Avatar Preview\"\n sx={{ \n width: 96, \n height: 96,\n border: '3px solid',\n borderColor: 'primary.main',\n boxShadow: 3\n }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: 'success.main' }}>\n ✅ Avatar Ready\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {customAvatarBase64 ? 'Custom uploaded image' : 'Professional avatar selected'}\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Avatar Cropper Dialog */}\n <AvatarCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", sm: \"row\" },\n gap: { xs: 1.5, sm: 2 },\n justifyContent: \"flex-start\", // Changed from flex-end to flex-start\n mr: { xs: 0, sm: 10 }, // Add right margin to avoid FAB\n mb: { xs: 8, sm: 2 }, // Add bottom margin on mobile for FAB clearance\n }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={handleResetModel}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Reset Form\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSaveModel}\n disabled={!localSelectedModel.name || !localSelectedModel.systemPrompt}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Save Personality\n </Button>\n </Box>\n </Box>\n );\n\n const renderManageTab = () => (\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"1.45rem\", md: \"1.65rem\" } }}\n >\n 📋 Manage Personalities ({availableModels.length})\n </Typography>\n <Box sx={{ display: \"flex\", gap: { xs: 1, md: 2 }, flexWrap: \"wrap\", width: { xs: \"100%\", md: \"auto\" } }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.2, md: 3 },\n py: { xs: 0.95, md: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n Create Personality\n </Button>\n <Button\n variant=\"outlined\"\n color=\"info\"\n onClick={() => setRestoreDialogOpen(true)}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Restore Defaults\n </Button>\n </Box>\n </Box>\n\n {availableModels.length === 0 ? (\n <Card sx={{ textAlign: \"center\", py: 8, border: \"2px dashed\", borderColor: \"divider\" }}>\n <CardContent>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }} gutterBottom>\n 🤖 No Personalities Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Get started by creating your first custom AI personality or choosing from our templates.\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, justifyContent: \"center\", flexWrap: \"wrap\", mt: 3 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n ✨ Create From Scratch\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => setPersonalityTabIndex(0)} // Switch to Templates tab\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n 🎭 Browse Templates\n </Button>\n </Box>\n </CardContent>\n </Card>\n ) : (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: { xs: 2, md: 3 } }}>\n {availableModels.map((model) => (\n <Card key={model.name} sx={{ border: \"1px solid\", borderColor: \"divider\" }}>\n <CardContent sx={{ p: { xs: 2.5, sm: 3 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: { xs: 1.5, md: 2 } }}>\n <Avatar\n src={resolveAvatar(model)}\n alt={model.name}\n sx={{ width: { xs: 44, sm: 48 }, height: { xs: 44, sm: 48 }, mr: { xs: 1.5, sm: 2 } }}\n />\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {model.name}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontStyle: \"italic\" }}>\n {model.tagline}\n </Typography>\n </Box>\n </Box>\n \n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\", \n mb: 3,\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {model.systemPrompt}\n </Typography>\n\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt as string,\n selectedModel: model.name,\n });\n setCustomAvatarBase64(model.avatarBase64 || null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to edit tab\n }}\n sx={{ flex: 1 }}\n >\n Edit\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n onClick={() => handleDeletePersonality(model.name)}\n sx={{ flex: 1 }}\n >\n Delete\n </Button>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n <Dialog open={restoreDialogOpen} onClose={() => setRestoreDialogOpen(false)}>\n <DialogTitle>Restore Default Personalities?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will delete all custom personalities and reset to the original configuration.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setRestoreDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={async () => {\n useModelStore.setState({ isInitializing: true });\n \n try {\n useModelStore.setState({ availableModels: [] });\n setSelectedModel(\"\");\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n await restoreDefaultModelsAndConfig();\n setRestoreDialogOpen(false);\n } catch (error) {\n debugLogger.error(\"Failed to restore defaults\", { error });\n setRestoreDialogOpen(false);\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n }}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Confirm\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Delete Personality Dialog */}\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)}>\n <DialogTitle>Delete Personality?</DialogTitle>\n <DialogContent>\n {personalityToDelete && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 2 }}>\n <Avatar\n src={resolveAvatar(\n availableModels.find(m => m.name === personalityToDelete) || {\n name: personalityToDelete,\n avatarBase64: null,\n }\n )}\n alt={personalityToDelete}\n sx={{ width: 56, height: 56, mr: 2 }}\n />\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n {personalityToDelete}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {availableModels.find(m => m.name === personalityToDelete)?.tagline || \"Custom personality\"}\n </Typography>\n </Box>\n </Box>\n )}\n <DialogContentText>\n Are you sure you want to delete this personality? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setDeleteDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={confirmDeletePersonality}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n\n return (\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: \"1.6rem\", md: \"1.8rem\" } }}\n >\n Personalities\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n Create and manage AI personalities that match your brand and use case.\n </Typography>\n </Box>\n \n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.4, sm: 3 },\n py: { xs: 0.95, sm: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', md: 'auto' },\n minWidth: { xs: 'auto', md: '200px' }\n }}\n >\n Create Personality\n </Button>\n </Box>\n\n <Box sx={{ borderBottom: 1, borderColor: 'divider', mb: { xs: 1.5, md: 2 } }}>\n <Tabs \n value={personalityTabIndex} \n onChange={(_, newValue) => setPersonalityTabIndex(newValue)}\n variant={isMobile ? 'fullWidth' : 'standard'}\n sx={{\n '& .MuiTab-root': {\n textTransform: 'none',\n fontWeight: 600,\n fontSize: { xs: '0.95rem', sm: '1rem' },\n minWidth: { xs: 'auto', md: 160 },\n px: { xs: 1.1, sm: 1.5 },\n ...(isMobile ? { minHeight: 52 } : {}),\n },\n '& .MuiTab-wrapper': tabWrapperStyles,\n }}\n >\n <Tab \n icon={<ViewModuleOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Templates\" \n sx={{ \n color: personalityTabIndex === 0 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.5, sm: 0.75 },\n gap: { xs: 0.5, sm: 1 }\n }}\n />\n <Tab \n icon={<EditNoteOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Create / Edit\" \n sx={{ \n color: personalityTabIndex === 1 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n <Tab \n icon={<ManageAccountsOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Manage\" \n sx={{ \n color: personalityTabIndex === 2 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n </Tabs>\n </Box>\n\n <Box sx={{ flex: 1, overflow: \"hidden\" }}>\n {personalityTabIndex === 0 && renderTemplatesTab()}\n {personalityTabIndex === 1 && renderCreateEditTab()}\n {personalityTabIndex === 2 && renderManageTab()}\n </Box>\n </Box>\n );\n};\n\nexport default PersonalitiesTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-D92A-F4D6ED\nconst __banditFingerprint_components_AvatarCroppertsx = 'BL-FP-0C6AA6-121B';\nconst __auditTrail_components_AvatarCroppertsx = 'BL-AU-MGOIKVV8-VV3E';\n// File: AvatarCropper.tsx | Path: src/components/AvatarCropper.tsx | Hash: d92a121b\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n} from '@mui/material';\nimport RotateLeftIcon from '@mui/icons-material/RotateLeft';\nimport RotateRightIcon from '@mui/icons-material/RotateRight';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\n\ninterface AvatarCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\nconst AvatarCropper: React.FC<AvatarCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n\n const CROP_SIZE = 400; // Fixed crop area size\n const OUTPUT_SIZE = 512; // Final output size\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const minScale = Math.max(\n CROP_SIZE / naturalWidth,\n CROP_SIZE / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.5),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Set canvas size\n canvas.width = CROP_SIZE;\n canvas.height = CROP_SIZE;\n\n // Clear canvas\n ctx.clearRect(0, 0, CROP_SIZE, CROP_SIZE);\n\n // Save context\n ctx.save();\n\n // Apply transformations\n ctx.translate(CROP_SIZE / 2, CROP_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop circle overlay\n ctx.save();\n ctx.globalCompositeOperation = 'destination-in';\n ctx.beginPath();\n ctx.arc(CROP_SIZE / 2, CROP_SIZE / 2, CROP_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }, [cropSettings, imageLoaded]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n // Set output canvas size\n canvas.width = OUTPUT_SIZE;\n canvas.height = OUTPUT_SIZE;\n\n // Fill background with white for transparency support\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, OUTPUT_SIZE, OUTPUT_SIZE);\n\n // Save context\n ctx.save();\n\n // Create circular clipping path\n ctx.beginPath();\n ctx.arc(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, 0, Math.PI * 2);\n ctx.clip();\n\n // Apply transformations (scaled for output size)\n const scale = OUTPUT_SIZE / CROP_SIZE;\n ctx.translate(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scale, cropSettings.scale * scale);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scale,\n -image.naturalHeight / 2 + cropSettings.y * scale\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as data URL with high quality\n const croppedDataUrl = canvas.toDataURL('image/jpeg', 0.92);\n onCrop(croppedDataUrl);\n handleClose();\n }, [cropSettings, onCrop, handleClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const minScale = Math.max(\n CROP_SIZE / imageNaturalSize.width,\n CROP_SIZE / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n CROP_SIZE / Math.max(imageNaturalSize.width, 1),\n CROP_SIZE / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"md\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎯 Crop Your Avatar\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position and resize your image to create the perfect avatar\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3 }}>\n {/* Crop Preview */}\n <Paper\n elevation={3}\n sx={{\n width: CROP_SIZE,\n height: CROP_SIZE,\n borderRadius: '50%',\n overflow: 'hidden',\n border: '4px solid',\n borderColor: 'primary.main',\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\n '&:hover': {\n boxShadow: '0 12px 40px rgba(0,0,0,0.15)',\n transform: 'scale(1.02)',\n },\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CROP_SIZE}\n height={CROP_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n bottom: 8,\n left: '50%',\n transform: 'translateX(-50%)',\n background: 'rgba(0,0,0,0.7)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.8,\n }}\n >\n Drag to reposition\n </Box>\n )}\n </Paper>\n\n {/* Controls */}\n <Box sx={{ width: '100%', maxWidth: 400 }}>\n {/* Zoom Control */}\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 500 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={3}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 3}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 2, mb: 2 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n >\n Rotate Right\n </Button>\n </Box>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>💡 Pro Tips:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5 }}>\n • <strong>Drag</strong> the image to reposition it<br/>\n • <strong>Zoom</strong> to get the perfect framing<br/>\n • <strong>Rotate</strong> if your image is sideways<br/>\n • Final avatar will be <strong>{OUTPUT_SIZE}×{OUTPUT_SIZE}px</strong> and optimized for web\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Avatar\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default AvatarCropper;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0A6C-FE4A94\nconst __banditFingerprint_components_PreferencesTabtsx = 'BL-FP-D52A4A-DEAB';\nconst __auditTrail_components_PreferencesTabtsx = 'BL-AU-MGOIKVVK-ISXN';\n// File: PreferencesTab.tsx | Path: src/management/components/PreferencesTab.tsx | Hash: 0a6cdeab\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n Box,\n Button,\n Typography,\n Switch,\n FormControlLabel,\n Paper,\n Chip,\n TextField,\n InputAdornment,\n Alert,\n IconButton,\n Tooltip,\n useMediaQuery,\n useTheme,\n} from \"@mui/material\";\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport LinkIcon from '@mui/icons-material/Link';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport UploadIcon from '@mui/icons-material/Upload';\nimport RestoreIcon from '@mui/icons-material/Restore';\nimport CloudDoneIcon from '@mui/icons-material/CloudDone';\nimport CloudOffIcon from '@mui/icons-material/CloudOff';\nimport SyncIcon from '@mui/icons-material/Sync';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport { UserPreferences, usePreferencesStore } from \"../../store/preferencesStore\";\nimport { useModelStore } from \"../../store/modelStore\";\nimport { useVoiceStore } from \"../../store/voiceStore\";\nimport { useFeatures } from \"../../hooks/useFeatures\";\nimport { PackageSettings } from \"../../store/packageSettingsStore\";\nimport { useConversationSyncStore } from \"../../store/conversationSyncStore\";\nimport { useGatewayHealth } from \"../../hooks/useGatewayQueries\";\n\ninterface PreferencesTabProps {\n preferences: UserPreferences;\n packageSettings: PackageSettings | null;\n updatePreference: <K extends keyof UserPreferences>(key: K, value: UserPreferences[K]) => void;\n handleSavePreferences: () => void;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}\n\nconst PreferencesTab: React.FC<PreferencesTabProps> = ({\n preferences,\n packageSettings,\n updatePreference,\n handleSavePreferences,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [homeUrlStatus, setHomeUrlStatus] = useState<'idle' | 'valid' | 'invalid' | 'saving' | 'saved'>('idle');\n const [homeUrlError, setHomeUrlError] = useState<string>('');\n const [localHomeUrl, setLocalHomeUrl] = useState(preferences.homeUrl || '');\n const [importStatus, setImportStatus] = useState<'idle' | 'success' | 'error'>('idle');\n const [syncToggleLoading, setSyncToggleLoading] = useState(false);\n const [manualSyncLoading, setManualSyncLoading] = useState(false);\n const [advancedVectorToggleLoading, setAdvancedVectorToggleLoading] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Access the preferences store for export/import/reset functions\n const { exportPreferences, importPreferences, resetToDefaults } = usePreferencesStore();\n\n // Access voice store for TTS/STT service availability\n const { isServiceAvailable: isTTSSTTAvailable } = useVoiceStore();\n\n // Access feature flags for advanced features toggle\n const { hasAdvancedSearch, hasAdvancedMemories } = useFeatures();\n\n const {\n initialized: syncInitialized,\n syncEnabled,\n status: syncStatus,\n lastSyncAt,\n lastError: syncError,\n conflicts,\n pendingConversationUpserts,\n pendingConversationDeletes,\n pendingProjectUpserts,\n pendingProjectDeletes,\n totalConversationsOnServer,\n totalProjectsOnServer,\n warningConversations,\n oversizedConversations,\n setSyncEnabled,\n isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled,\n runSync,\n } = useConversationSyncStore((state) => ({\n initialized: state.initialized,\n syncEnabled: state.syncEnabled,\n status: state.status,\n lastSyncAt: state.lastSyncAt,\n lastError: state.lastError,\n conflicts: state.conflicts,\n pendingConversationUpserts: state.pendingConversationUpserts,\n pendingConversationDeletes: state.pendingConversationDeletes,\n pendingProjectUpserts: state.pendingProjectUpserts,\n pendingProjectDeletes: state.pendingProjectDeletes,\n totalConversationsOnServer: state.totalConversationsOnServer,\n totalProjectsOnServer: state.totalProjectsOnServer,\n warningConversations: state.warningConversations,\n oversizedConversations: state.oversizedConversations,\n setSyncEnabled: state.setSyncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled: state.setAdvancedVectorFeaturesEnabled,\n runSync: state.runSync,\n }));\n\n const spinSx = {\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n },\n } as const;\n\n const syncStatusLabel = (() => {\n switch (syncStatus) {\n case 'syncing':\n return 'Syncing';\n case 'error':\n return 'Attention needed';\n case 'idle':\n return 'Up to date';\n case 'disabled':\n default:\n return 'Not syncing';\n }\n })();\n\n const syncIcon = (() => {\n switch (syncStatus) {\n case 'syncing':\n return <SyncIcon color=\"primary\" sx={spinSx} fontSize=\"small\" />;\n case 'idle':\n return <CloudDoneIcon color=\"success\" fontSize=\"small\" />;\n case 'error':\n return <ErrorIcon color=\"error\" fontSize=\"small\" />;\n case 'disabled':\n default:\n return <CloudOffIcon color=\"action\" fontSize=\"small\" />;\n }\n })();\n\n const pendingCount =\n pendingConversationUpserts.size +\n pendingConversationDeletes.size +\n pendingProjectUpserts.size +\n pendingProjectDeletes.size;\n\n const conflictCount =\n (conflicts?.conversationConflicts.length ?? 0) +\n (conflicts?.projectConflicts.length ?? 0);\n\n const lastSyncDisplay = lastSyncAt ? new Date(lastSyncAt).toLocaleString() : 'Never';\n\n const MAX_CONVERSATION_MB = 12;\n const WARN_CONVERSATION_MB = 10;\n const formatBytesToMB = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n const renderNoticeList = (notices: typeof warningConversations) => (\n <Box component=\"ul\" sx={{ pl: 2, mb: 0 }}>\n {notices.map((notice) => (\n <Box component=\"li\" key={notice.id} sx={{ mb: 0.5 }}>\n <Typography component=\"span\" variant=\"body2\" color=\"text.primary\">\n {(notice.name && notice.name.trim()) || 'Untitled conversation'}\n </Typography>\n <Typography component=\"span\" variant=\"body2\" color=\"text.secondary\">\n {` — ${formatBytesToMB(notice.sizeBytes)} / ${MAX_CONVERSATION_MB} MB`}\n </Typography>\n </Box>\n ))}\n </Box>\n );\n\n const gatewayConfigured = Boolean(packageSettings?.gatewayApiUrl);\n\n const {\n data: gatewayHealth,\n error: gatewayHealthError,\n isLoading: gatewayHealthLoading,\n isFetching: gatewayHealthFetching,\n refetch: refetchGatewayHealth,\n } = useGatewayHealth({\n enabled: gatewayConfigured,\n refetchOnWindowFocus: false,\n staleTime: 60_000,\n });\n\n const isGatewayLoading = gatewayHealthLoading || gatewayHealthFetching;\n\n const gatewayChipLabel = gatewayConfigured\n ? isGatewayLoading\n ? 'Checking…'\n : gatewayHealthError\n ? 'Offline'\n : gatewayHealth\n ? (gatewayHealth.status?.toLowerCase() === 'healthy')\n ? 'Online'\n : 'Offline'\n : 'Unknown'\n : 'Not Configured';\n\n const gatewayChipColor: 'default' | 'error' | 'success' | 'warning' = (() => {\n if (!gatewayConfigured) return 'default';\n if (gatewayHealthError) return 'error';\n if (isGatewayLoading) return 'default';\n if (!gatewayHealth) return 'warning';\n return (gatewayHealth.status?.toLowerCase() === 'healthy') ? 'success' : 'error';\n })();\n\n const handleGatewayStatusRefresh = useCallback(() => {\n if (!gatewayConfigured) {\n return;\n }\n refetchGatewayHealth();\n }, [gatewayConfigured, refetchGatewayHealth]);\n\n const handleSyncToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setSyncToggleLoading(true);\n try {\n await setSyncEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled ? 'Cloud sync enabled. We will keep this device in parity with Bandit Cloud.' : 'Cloud sync disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update sync preference.', 'error');\n }\n } finally {\n setSyncToggleLoading(false);\n }\n };\n\n const handleManualSync = async () => {\n setManualSyncLoading(true);\n await runSync({ force: true });\n const statusAfter = useConversationSyncStore.getState().status;\n const message = statusAfter === 'idle'\n ? 'Sync completed successfully.'\n : 'Sync did not complete. Check status details.';\n const severity = statusAfter === 'idle' ? 'success' : 'error';\n if (showSnackbar) {\n showSnackbar(message, severity);\n }\n setManualSyncLoading(false);\n };\n\n const handleAdvancedVectorToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setAdvancedVectorToggleLoading(true);\n try {\n await setAdvancedVectorFeaturesEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled\n ? 'Advanced vector features enabled for this account.'\n : 'Advanced vector features disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update advanced vector setting.', 'error');\n }\n } finally {\n setAdvancedVectorToggleLoading(false);\n }\n };\n\n // URL validation regex - more comprehensive\n const urlRegex = /^https?:\\/\\/(?:[-\\w.])+(?:\\:[0-9]+)?(?:\\/(?:[\\w\\/_.])*(?:\\?(?:[\\w&=%.]*))?(?:\\#(?:\\w*))?)?$/;\n\n // Get effective home URL (user preference overrides package setting)\n const getEffectiveHomeUrl = () => {\n if (preferences.homeUrl && preferences.homeUrl.trim()) {\n return preferences.homeUrl;\n }\n return packageSettings?.homeUrl || '';\n };\n\n // Sync local state with preferences when they change externally\n useEffect(() => {\n setLocalHomeUrl(preferences.homeUrl || '');\n }, [preferences.homeUrl]);\n\n const validateAndSaveHomeUrl = async (url: string) => {\n if (!url.trim()) {\n // Empty URL is valid (will use default)\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', '');\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n return;\n }\n\n if (urlRegex.test(url)) {\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', url);\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n } else {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Please enter a valid URL (e.g., https://example.com)');\n }\n };\n\n const handleHomeUrlChange = (value: string) => {\n setLocalHomeUrl(value);\n setHomeUrlStatus('idle'); // Reset status while typing\n \n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n // Set new timeout for validation and auto-save\n timeoutRef.current = setTimeout(() => {\n validateAndSaveHomeUrl(value);\n }, 1500); // Increased to 1.5 seconds for better UX\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n // Export/Import/Reset functions\n const handleExportPreferences = () => {\n const jsonData = exportPreferences();\n const blob = new Blob([jsonData], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `bandit-preferences-${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n const handleImportPreferences = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const success = await importPreferences(text);\n \n if (success) {\n setImportStatus('success');\n // Refresh the local state\n setLocalHomeUrl(preferences.homeUrl || '');\n setTimeout(() => setImportStatus('idle'), 3000);\n } else {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n } catch (error) {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleResetToDefaults = async () => {\n if (confirm('Are you sure you want to reset all preferences to their default values? This action cannot be undone.')) {\n await resetToDefaults();\n setLocalHomeUrl('');\n setHomeUrlStatus('idle');\n }\n };\n\n const getHomeUrlFieldProps = () => {\n const baseProps = {\n size: \"small\" as const,\n variant: \"outlined\" as const,\n fullWidth: true,\n };\n\n const getHelperText = () => {\n if (homeUrlStatus === 'saving') return \"Saving...\";\n if (homeUrlStatus === 'invalid') return homeUrlError;\n if (homeUrlStatus === 'valid') return \"Valid URL format\";\n \n // Default helper text based on current state\n if (localHomeUrl) {\n return `Will navigate to: ${localHomeUrl}`;\n } else if (packageSettings?.homeUrl) {\n return `Will use package default: ${packageSettings.homeUrl}`;\n } else {\n return \"Enter a URL for the home button\";\n }\n };\n\n switch (homeUrlStatus) {\n case 'valid':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: getHelperText(),\n };\n case 'invalid':\n return {\n ...baseProps,\n color: \"error\" as const,\n error: true,\n helperText: getHelperText(),\n };\n case 'saving':\n return {\n ...baseProps,\n color: \"primary\" as const,\n helperText: getHelperText(),\n disabled: true,\n };\n case 'saved':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: \"✓ Saved successfully\",\n };\n default:\n return {\n ...baseProps,\n helperText: getHelperText(),\n };\n }\n };\n\n const getEndAdornment = () => {\n switch (homeUrlStatus) {\n case 'valid':\n case 'saved':\n return (\n <InputAdornment position=\"end\">\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'invalid':\n return (\n <InputAdornment position=\"end\">\n <ErrorIcon color=\"error\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'saving':\n return (\n <InputAdornment position=\"end\">\n <Box sx={{ \n width: 16, \n height: 16, \n border: '2px solid #1976d2',\n borderTop: '2px solid transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' }\n }\n }} />\n </InputAdornment>\n );\n default:\n return (\n <InputAdornment position=\"end\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n );\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n Preferences\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Control which AI features are enabled to optimize performance for your device. Disabling features can help\n reduce resource usage on machines with limited capabilities.\n </Typography>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, justifyContent: 'space-between', gap: 2 }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Conversation & Project Sync</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Mirror conversations and projects to Bandit Cloud so you can resume work on any device. Images stay on this\n machine until a dedicated media pipeline is ready.\n </Typography>\n </Box>\n <FormControlLabel\n control={\n <Switch\n checked={syncEnabled}\n onChange={handleSyncToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || syncToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {syncEnabled ? 'Sync enabled' : 'Sync disabled'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {syncInitialized ? 'Toggle at any time from the management panel.' : 'Loading preference…'}\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' }, ml: { xs: 0, sm: 2 } }}\n />\n </Box>\n\n <Box sx={{ mt: 2, display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, alignItems: { sm: 'center' }, gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {syncIcon}\n <Typography variant=\"body2\" color=\"text.primary\">{syncStatusLabel}</Typography>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Last sync: {lastSyncDisplay}\n </Typography>\n {syncEnabled && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Server totals: {totalConversationsOnServer ?? 0} conversations · {totalProjectsOnServer ?? 0} projects\n </Typography>\n )}\n {pendingCount > 0 && (\n <Chip\n label={`${pendingCount} change${pendingCount === 1 ? '' : 's'} pending upload`}\n color=\"warning\"\n size=\"small\"\n />\n )}\n {conflictCount > 0 && (\n <Chip\n label={`${conflictCount} conflict${conflictCount === 1 ? '' : 's'} to review`}\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {(hasAdvancedSearch() || hasAdvancedMemories()) && (\n <Box sx={{ mt: 2 }}>\n <FormControlLabel\n control={\n <Switch\n checked={isAdvancedVectorFeaturesEnabled}\n onChange={handleAdvancedVectorToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || advancedVectorToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Advanced vector features\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Keep semantic search, vector memories, and related context in sync across devices\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' } }}\n />\n </Box>\n )}\n\n {syncError && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n {syncError}\n </Alert>\n )}\n\n {oversizedConversations.length > 0 && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n Start a new conversation to keep syncing with Bandit Cloud.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n These threads exceeded the {MAX_CONVERSATION_MB} MB limit and are skipped until they are shortened:\n </Typography>\n {renderNoticeList(oversizedConversations)}\n </Alert>\n )}\n\n {warningConversations.length > 0 && oversizedConversations.length === 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n You are nearing the Bandit Cloud size limit.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Consider starting a fresh conversation once these reach about {WARN_CONVERSATION_MB} MB:\n </Typography>\n {renderNoticeList(warningConversations)}\n </Alert>\n )}\n\n <Box sx={{ mt: 2, display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleManualSync}\n disabled={!syncEnabled || syncStatus === 'syncing' || manualSyncLoading}\n startIcon={syncStatus === 'syncing' || manualSyncLoading ? <SyncIcon sx={spinSx} /> : <CloudDoneIcon />}\n >\n {syncStatus === 'syncing' || manualSyncLoading ? 'Syncing…' : 'Sync now'}\n </Button>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center' }}>\n Need media support? Images and large files stay local until retention rules are finalized.\n </Typography>\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Feature Controls</Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\", display: 'flex', alignItems: 'center', gap: 1 }}>\n <LinkIcon fontSize=\"small\" color=\"primary\" />\n Home Button URL\n </Typography>\n <TextField\n label=\"Custom Home URL (optional)\"\n value={localHomeUrl}\n onChange={(e) => handleHomeUrlChange(e.target.value)}\n placeholder=\"https://example.com\"\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: getEndAdornment(),\n }}\n {...getHomeUrlFieldProps()}\n />\n </Box>\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.memoryEnabled}\n onChange={(e) => updatePreference('memoryEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Memory</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Enable automatic conversation memory and context retention\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.knowledgeDocsEnabled}\n onChange={(e) => updatePreference('knowledgeDocsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Knowledge Documents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Use uploaded documents to enhance AI responses\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.moodEnabled}\n onChange={(e) => updatePreference('moodEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Mood Adaptation</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Allow AI personality to adapt based on conversation tone\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.chatSuggestionsEnabled}\n onChange={(e) => updatePreference('chatSuggestionsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Chat Suggestions</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show suggested prompts and conversation starters\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.ttsEnabled}\n onChange={(e) => updatePreference('ttsEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable AI voice responses\"\n : packageSettings?.gatewayApiUrl \n ? \"TTS service is currently unavailable\"\n : \"TTS service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.sttEnabled}\n onChange={(e) => updatePreference('sttEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable voice input and transcription\"\n : packageSettings?.gatewayApiUrl \n ? \"STT service is currently unavailable\"\n : \"STT service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.banditModelsEnabled}\n onChange={(e) => updatePreference('banditModelsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Include Bandit Personalities</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Include default Bandit personalities alongside CDN models\n </Typography>\n </Box>\n }\n />\n\n {preferences.banditModelsEnabled && (\n <Box sx={{ mt: 2, ml: 4 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<RestoreIcon />}\n onClick={async () => {\n try {\n const result = await useModelStore.getState().restoreDeletedBanditModels();\n if (showSnackbar) {\n if (result.hadNothingToRestore) {\n showSnackbar(\"No deleted Bandit personalities found to restore.\", 'success');\n } else if (result.restored.length > 0) {\n showSnackbar(`Restored ${result.restored.length} Bandit personalit${result.restored.length === 1 ? 'y' : 'ies'}: ${result.restored.join(', ')}`, 'success');\n } else {\n showSnackbar(\"Bandit personalities restored from deleted list (enable Bandit personalities to see them).\", 'success');\n }\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar(\"Failed to restore Bandit personalities. Please try again.\", 'error');\n }\n }\n }}\n sx={{ textTransform: 'none' }}\n >\n Restore Deleted Bandit Personalities\n </Button>\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n Restores any Bandit default personalities you may have deleted\n </Typography>\n </Box>\n )}\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.feedbackEnabled}\n onChange={(e) => updatePreference('feedbackEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Feedback Button</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show feedback button in chat interface and other components\n </Typography>\n </Box>\n }\n />\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Backup & Restore</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Export your preferences to save your settings, or import previously saved preferences. You can also reset to default values.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, gap: 2, alignItems: 'center' }}>\n <Button\n variant=\"outlined\"\n startIcon={<DownloadIcon />}\n onClick={handleExportPreferences}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Export\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<UploadIcon />}\n onClick={handleImportPreferences}\n color={importStatus === 'success' ? 'success' : importStatus === 'error' ? 'error' : 'primary'}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n {importStatus === 'success' ? '✓ Imported' : importStatus === 'error' ? '✗ Failed' : 'Import'}\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<RestoreIcon />}\n onClick={handleResetToDefaults}\n color=\"warning\"\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Reset\n </Button>\n </Box>\n\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileChange}\n accept=\".json\"\n style={{ display: 'none' }}\n />\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Service Status</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n The following services are configured for this deployment. Contact your administrator for more information about enabling or configuring these services.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Gateway/MCP</Typography>\n {gatewayConfigured && (\n <Tooltip title=\"Refresh gateway status\" placement=\"top\">\n <span>\n <IconButton\n size=\"small\"\n onClick={handleGatewayStatusRefresh}\n disabled={isGatewayLoading}\n sx={{ p: 0.25 }}\n >\n <RefreshIcon fontSize=\"small\" sx={isGatewayLoading ? spinSx : undefined} />\n </IconButton>\n </span>\n </Tooltip>\n )}\n </Box>\n <Chip\n label={gatewayChipLabel}\n color={gatewayChipColor}\n size=\"small\"\n />\n </Box>\n\n {gatewayConfigured && gatewayHealthError && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75, pl: { xs: 0, sm: 0.5 } }}>\n <Typography variant=\"caption\" color=\"error\">\n {gatewayHealthError.message}\n </Typography>\n </Box>\n )}\n </Box>\n </Paper>\n </Box>\n </Box>\n );\n};\n\nexport default PreferencesTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3096-F9AF1C\nconst __banditFingerprint_hooks_useGatewayQueriests = 'BL-FP-52A0D3-0867';\nconst __auditTrail_hooks_useGatewayQueriests = 'BL-AU-MGOIKVVE-4U8X';\n// File: useGatewayQueries.ts | Path: src/hooks/useGatewayQueries.ts | Hash: 30960867\n\nimport { useMemo } from \"react\";\nimport { lastValueFrom } from \"rxjs\";\nimport { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { GatewayService } from \"../services/gateway/gateway.service\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport {\n GatewayHealthResponse,\n GatewayMemoryResponse,\n GatewayModel\n} from \"../services/gateway/interfaces\";\n\nexport type GatewayQueryOptions<TData> = Omit<UseQueryOptions<TData, Error>, \"queryKey\" | \"queryFn\">;\n\nconst useGatewayClient = () => {\n const settings = usePackageSettingsStore((state) => state.settings);\n const gatewayUrl = settings?.gatewayApiUrl;\n const feedbackEmail = settings?.feedbackEmail;\n\n const service = useMemo<GatewayService | null>(() => {\n if (!gatewayUrl) {\n return null;\n }\n\n return new GatewayService(\n gatewayUrl,\n () => authenticationService.getToken(),\n feedbackEmail\n );\n }, [gatewayUrl, feedbackEmail]);\n\n return { service, gatewayUrl };\n};\n\nexport const useGatewayHealth = (\n options?: GatewayQueryOptions<GatewayHealthResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayHealthResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"health\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getHealth());\n },\n enabled\n });\n};\n\nexport const useGatewayModels = (\n options?: GatewayQueryOptions<GatewayModel[]>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayModel[], Error>({\n ...options,\n queryKey: [\"gateway\", \"models\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.listModels());\n },\n enabled\n });\n};\n\nexport const useGatewayMemory = (\n options?: GatewayQueryOptions<GatewayMemoryResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayMemoryResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"memory\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getMemory());\n },\n enabled\n });\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-10D4-7CC05E\nconst __banditFingerprint_components_BrandingTabtsx = 'BL-FP-9A095E-D769';\nconst __auditTrail_components_BrandingTabtsx = 'BL-AU-MGOIKVVH-B385';\n// File: BrandingTab.tsx | Path: src/management/components/BrandingTab.tsx | Hash: 10d4d769\n\nimport React, { useState, useRef } from 'react';\nimport {\n Box,\n Typography,\n Button,\n TextField,\n Card,\n CardContent,\n Paper,\n Chip,\n Alert,\n Fade,\n Skeleton,\n Stack,\n Snackbar,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport UploadIcon from '@mui/icons-material/Upload';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport PreviewIcon from '@mui/icons-material/Preview';\nimport RestoreIcon from '@mui/icons-material/Restore';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\nimport SaveIcon from '@mui/icons-material/Save';\nimport LogoCropper from '../../components/LogoCropper';\n\n// Default logos from CDN\nconst banditAiLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple.png\";\nconst lightLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple-alt.png\";\n\ninterface BrandingTabProps {\n logoFile: File | null;\n logoBase64: string | null;\n brandingText: string;\n setBrandingText: (text: string) => void;\n theme: string;\n setTheme: (theme: string) => void;\n predefinedThemes: Record<string, ThemeOptions & { name: string }>;\n handleLogoUpload: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleRestoreDefaults: () => void;\n handleExportConfig: () => void;\n handleImportConfig: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleSaveBranding: () => void;\n setLogoFile?: (file: File | null) => void;\n setLogoBase64?: (base64: string | null) => void;\n}\n\nconst BrandingTab: React.FC<BrandingTabProps> = ({\n logoFile,\n logoBase64,\n brandingText,\n setBrandingText,\n theme,\n setTheme,\n predefinedThemes,\n handleLogoUpload,\n handleRestoreDefaults,\n handleExportConfig,\n handleImportConfig,\n handleSaveBranding,\n setLogoFile,\n setLogoBase64,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n const [dragOver, setDragOver] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle');\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const importInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to get the appropriate default logo based on theme mode\n const getDefaultLogo = () => {\n // Use Material-UI theme mode for better accuracy\n return muiTheme.palette.mode === 'light' ? lightLogo : banditAiLogo;\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n const files = e.dataTransfer.files;\n if (files.length > 0 && (files[0].type === 'image/png' || files[0].type === 'image/jpeg' || files[0].type === 'image/jpg')) {\n handleImageUpload(files[0]);\n }\n };\n\n const handleImageUpload = (file: File) => {\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n setSnackbarMessage('Please select a JPG or PNG image file.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n setSnackbarMessage('Image file size must be less than 10MB.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n handleImageUpload(file);\n }\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n // Create a fake event to work with existing handleLogoUpload\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n\n // Set the base64 directly if we have setters\n if (setLogoBase64 && setLogoFile) {\n setLogoBase64(croppedImageData);\n setLogoFile(null);\n } else {\n // Fallback to existing handler\n handleLogoUpload(fakeEvent);\n }\n\n setCropperOpen(false);\n setSelectedImageFile(null);\n\n setSnackbarMessage('Logo cropped and applied successfully!');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const handleSaveWithFeedback = async () => {\n setSaveStatus('saving');\n try {\n await handleSaveBranding();\n setSaveStatus('saved');\n setTimeout(() => setSaveStatus('idle'), 2000);\n } catch (error) {\n setSaveStatus('error');\n setTimeout(() => setSaveStatus('idle'), 3000);\n }\n };\n\n const handleExportWithFeedback = async () => {\n try {\n await handleExportConfig();\n setSnackbarMessage('Branding configuration exported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to export branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleImportWithFeedback = async (event: React.ChangeEvent<HTMLInputElement>) => {\n try {\n await handleImportConfig(event);\n setSnackbarMessage('Branding configuration imported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to import branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleResetWithFeedback = async () => {\n try {\n await handleRestoreDefaults();\n setSnackbarMessage('Branding settings reset to defaults');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to reset branding settings');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDeleteLogo = () => {\n // Reset the file input value\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n\n // Use direct state setters if available, otherwise try the upload handler\n if (setLogoFile && setLogoBase64) {\n setLogoFile(null);\n setLogoBase64(null);\n } else {\n // Fallback to the upload handler approach\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleLogoUpload(fakeEvent);\n }\n };\n\n return (\n <Box sx={{ height: \"100%\", display: 'flex', flexDirection: 'column', p: { xs: 1.5, sm: 2 } }}>\n {/* Header Section */}\n <Box sx={{ mb: { xs: 2, md: 3 }, flex: '0 0 auto', display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Branding & Themes\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Customize your brand identity and visual appearance.\n </Typography>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: '0.82rem', sm: '0.88rem' }, lineHeight: 1.6 }}>\n <strong>Logo requirements:</strong> JPG or PNG up to 10MB. Uploads open a built-in cropper to help you\n finalize the perfect size. Leave any fields blank to fall back to Bandit defaults.\n </Typography>\n </Alert>\n </Box>\n\n {/* Main Content Section */}\n <Paper\n sx={{\n p: { xs: 1.5, sm: 2 },\n borderRadius: 2,\n flex: 1,\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2.5 },\n mb: { xs: 2, md: 3 },\n }}\n >\n {/* Logo Upload and Branding Text Section */}\n <Box\n sx={{\n width: { xs: '100%', md: '26%' },\n display: 'flex',\n flexDirection: 'column',\n height: { xs: 'auto', md: 320 },\n gap: { xs: 2, md: 0 },\n }}\n >\n {/* Logo Upload Section - Fixed height to match preview */}\n <Box sx={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <UploadIcon color=\"primary\" fontSize=\"small\" />\n Logo Upload\n </Typography>\n\n <Box\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n sx={{\n border: '2px dashed',\n borderColor: dragOver ? 'primary.main' : logoBase64 ? 'success.main' : 'info.main',\n borderRadius: 2,\n p: 2,\n textAlign: 'center',\n cursor: 'pointer',\n bgcolor: dragOver ? 'action.hover' : logoBase64 ? 'success.50' : 'info.50',\n transition: 'all 0.3s ease',\n position: 'relative',\n flex: '1 1 auto',\n minHeight: 160,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n '&:hover': {\n borderColor: 'primary.main',\n bgcolor: 'action.hover',\n '& .upload-icon': {\n color: 'primary.main',\n }\n }\n }}\n >\n {logoBase64 || getDefaultLogo() ? (\n <Fade in={true}>\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '140px',\n maxHeight: '140px',\n borderRadius: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n <Typography variant=\"body2\" color={logoBase64 ? \"success.main\" : \"info.main\"} sx={{ fontWeight: 600, fontSize: '0.85rem' }}>\n {logoBase64 ? \"✓ Custom Logo\" : \"Default Logo\"}\n </Typography>\n {!logoBase64 && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.75rem', textAlign: 'center' }}>\n 🎯 Click to upload & crop your logo\n </Typography>\n )}\n </Box>\n </Fade>\n ) : (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <UploadIcon\n className=\"upload-icon\"\n sx={{\n fontSize: 56,\n color: 'text.secondary',\n transition: 'color 0.3s ease'\n }}\n />\n <Typography variant=\"body2\" color=\"text.primary\" sx={{ fontSize: '1rem' }}>\n {dragOver ? 'Drop here' : '🎯 Upload & Crop Logo'}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.82rem', textAlign: 'center' }}>\n JPG/PNG • Drag & drop or tap to upload • Built-in cropper\n </Typography>\n </Box>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/jpg\"\n hidden\n onChange={handleFileInputChange}\n />\n </Box>\n\n {logoBase64 && (\n <Box sx={{ display: 'flex', gap: 1, mt: 1.5 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<UploadIcon />}\n onClick={() => fileInputRef.current?.click()}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Replace\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleDeleteLogo}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Remove\n </Button>\n </Box>\n )}\n </Box>\n {/* Branding Text Section - Fixed at bottom */}\n <Box sx={{ mt: 2, flex: '0 0 auto' }}>\n <TextField\n label=\"Custom Branding Text\"\n variant=\"outlined\"\n value={brandingText}\n onChange={(e) => setBrandingText(e.target.value)}\n fullWidth\n placeholder=\"e.g., Powered by YourCompany\"\n size=\"small\"\n sx={{\n '& .MuiInputBase-root': { fontSize: '0.85rem' },\n '& .MuiFormHelperText-root': { fontSize: '0.7rem' }\n }}\n />\n </Box>\n </Box>\n {/* Live Preview Section */}\n <Box sx={{ flex: 1, width: '100%' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <PreviewIcon color=\"primary\" fontSize=\"small\" />\n Live Preview\n </Typography>\n {/* New Chat Preview - closer to real chat page */}\n <Box\n sx={{\n height: { xs: 260, md: 320 },\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n bgcolor: 'background.default',\n borderRadius: 2,\n overflow: 'hidden',\n px: 2,\n py: 3,\n }}\n >\n {/* Centered Logo - Top section */}\n <Box sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flex: '1 1 auto',\n minHeight: 0\n }}>\n {logoBase64 || getDefaultLogo() ? (\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '320px',\n height: 'auto',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n ) : (\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 0.5\n }}>\n <Skeleton\n variant=\"rectangular\"\n width={160}\n height={40}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)'\n }}\n />\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ fontSize: '0.7rem' }}>\n Logo preview\n </Typography>\n </Box>\n )}\n </Box>\n\n {/* Chat Interface - Bottom section */}\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '100%',\n flex: '0 0 auto',\n gap: 1,\n }}>\n {/* Conversation Starters */}\n <Stack direction=\"row\" spacing={1} justifyContent=\"center\" sx={{ flexWrap: 'wrap', gap: 1 }}>\n {[1, 2, 3].map((i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n width={80}\n height={24}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)'\n }}\n />\n ))}\n </Stack>\n\n {/* Chat Input */}\n <Paper elevation={3} sx={{ px: 2, py: 1.5, borderRadius: 2, width: '100%', maxWidth: 500 }}>\n <Typography variant=\"body1\" sx={{ color: 'text.secondary' }}>\n What's on your mind?\n </Typography>\n </Paper>\n\n {/* Branding Footer */}\n <Typography variant=\"caption\" sx={{ textAlign: 'center', color: 'text.secondary', mt: 1 }}>\n {brandingText ? `${brandingText} • ` : 'Bandit AI • '}may be wrong — double-check important info.\n </Typography>\n </Box>\n </Box>\n </Box>\n </Paper>\n\n {/* Theme Selection - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto', mb: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Theme Selection\n </Typography>\n\n <Box\n sx={{\n display: \"grid\",\n gap: 1.5,\n gridTemplateColumns: {\n xs: \"repeat(4, 1fr)\",\n sm: \"repeat(6, 1fr)\",\n md: \"repeat(8, 1fr)\",\n lg: \"repeat(10, 1fr)\",\n xl: \"repeat(12, 1fr)\",\n },\n }}\n >\n {Object.values(predefinedThemes).map((themeOption) => {\n const isSelected = themeOption.name === theme;\n return (\n <Card\n key={themeOption.name}\n onClick={() => setTheme(themeOption.name)}\n sx={{\n cursor: \"pointer\",\n border: isSelected ? \"2px solid\" : \"1px solid\",\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n borderRadius: 1.5,\n transition: \"all 0.2s ease\",\n position: 'relative',\n overflow: 'visible',\n \"&:hover\": {\n transform: 'scale(1.05)',\n boxShadow: 2,\n borderColor: \"primary.main\",\n },\n }}\n elevation={isSelected ? 2 : 0}\n >\n {isSelected && (\n <Chip\n label=\"Selected\"\n size=\"small\"\n color=\"primary\"\n sx={{\n position: 'absolute',\n top: -6,\n right: -6,\n zIndex: 1,\n fontSize: '0.6rem',\n height: 16,\n }}\n />\n )}\n <CardContent sx={{ p: 1 }}>\n <Box\n sx={{\n height: 40,\n backgroundColor: themeOption.palette?.background?.default,\n borderRadius: 1,\n position: \"relative\",\n border: \"1px solid\",\n borderColor: \"divider\",\n mb: 0.5,\n }}\n >\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n left: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n right: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.secondary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n bottom: 4,\n left: 4,\n right: 4,\n height: 2,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: 1,\n opacity: 0.7,\n }}\n />\n </Box>\n <Typography\n variant=\"caption\"\n sx={{\n textAlign: \"center\",\n color: \"text.primary\",\n fontWeight: 600,\n fontSize: \"0.65rem\",\n display: 'block',\n lineHeight: 1.2,\n }}\n >\n {themeOption.name}\n </Typography>\n </CardContent>\n </Card>\n );\n })}\n </Box>\n </Paper>\n\n {/* Action Buttons - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Actions\n </Typography>\n\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<SaveIcon />}\n onClick={handleSaveWithFeedback}\n disabled={saveStatus === 'saving'}\n color={saveStatus === 'saved' ? 'success' : saveStatus === 'error' ? 'error' : 'primary'}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n {saveStatus === 'saving' ? 'Saving...' :\n saveStatus === 'saved' ? '✓ Saved' :\n saveStatus === 'error' ? '✗ Error' : 'Save'}\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<DownloadIcon />}\n onClick={handleExportWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Export\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<FileUploadIcon />}\n onClick={() => importInputRef.current?.click()}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Import\n </Button>\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json\"\n hidden\n onChange={handleImportWithFeedback}\n />\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n color=\"warning\"\n startIcon={<RestoreIcon />}\n onClick={handleResetWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Reset\n </Button>\n </Box>\n </Box>\n </Paper>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Logo Cropper Dialog */}\n <LogoCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n );\n};\n\nexport default BrandingTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FCA3-C93D1A\nconst __banditFingerprint_components_LogoCroppertsx = 'BL-FP-8A6FB7-D540';\nconst __auditTrail_components_LogoCroppertsx = 'BL-AU-MGOIKVV8-FTQA';\n// File: LogoCropper.tsx | Path: src/components/LogoCropper.tsx | Hash: fca3d540\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n ToggleButtonGroup,\n ToggleButton,\n Chip,\n} from '@mui/material';\nimport RotateLeftIcon from '@mui/icons-material/RotateLeft';\nimport RotateRightIcon from '@mui/icons-material/RotateRight';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport Crop169Icon from '@mui/icons-material/Crop169';\nimport CropSquareIcon from '@mui/icons-material/CropSquare';\nimport CropPortraitIcon from '@mui/icons-material/CropPortrait';\n\ninterface LogoCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\ntype AspectRatio = 'free' | 'square' | 'landscape' | 'portrait';\n\nconst LOGO_OUTPUT_SIZES = {\n small: 256,\n medium: 512,\n large: 1024,\n} as const;\n\nconst LogoCropper: React.FC<LogoCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const previewCanvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n const [aspectRatio, setAspectRatio] = useState<AspectRatio>('square');\n const [cropArea, setCropArea] = useState({ width: 400, height: 400 });\n\n const CANVAS_SIZE = 500; // Fixed canvas size for editing\n const [outputSize, setOutputSize] = useState<keyof typeof LOGO_OUTPUT_SIZES>('large');\n\n // Calculate crop dimensions based on aspect ratio\n const getCropDimensions = useCallback(() => {\n const maxSize = 380; // Leave some padding in the canvas\n switch (aspectRatio) {\n case 'square':\n return { width: maxSize, height: maxSize };\n case 'landscape':\n return { width: maxSize, height: maxSize * 0.6 }; // 16:9-ish\n case 'portrait':\n return { width: maxSize * 0.6, height: maxSize };\n case 'free':\n default:\n return cropArea;\n }\n }, [aspectRatio, cropArea]);\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / naturalWidth,\n cropDims.height / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.3),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, [getCropDimensions]);\n\n // Update crop area when aspect ratio changes\n useEffect(() => {\n if (imageLoaded) {\n const cropDims = getCropDimensions();\n setCropArea(cropDims);\n \n // Recalculate minimum scale\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n \n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(prev.scale, minScale)\n }));\n }\n }, [aspectRatio, imageLoaded, imageNaturalSize, getCropDimensions]);\n\n const updatePreview = useCallback((cropX: number, cropY: number, cropDims: { width: number; height: number }) => {\n const previewCanvas = previewCanvasRef.current;\n const mainCanvas = canvasRef.current;\n \n if (!previewCanvas || !mainCanvas) return;\n \n const previewCtx = previewCanvas.getContext('2d');\n if (!previewCtx) return;\n\n previewCanvas.width = 120;\n previewCanvas.height = 120;\n\n // Clear preview\n previewCtx.clearRect(0, 0, 120, 120);\n\n // Calculate scale to fit preview\n const scale = Math.min(120 / cropDims.width, 120 / cropDims.height);\n const scaledWidth = cropDims.width * scale;\n const scaledHeight = cropDims.height * scale;\n const offsetX = (120 - scaledWidth) / 2;\n const offsetY = (120 - scaledHeight) / 2;\n\n // Draw scaled crop area\n previewCtx.drawImage(\n mainCanvas,\n cropX, cropY, cropDims.width, cropDims.height,\n offsetX, offsetY, scaledWidth, scaledHeight\n );\n\n // Add border\n previewCtx.strokeStyle = '#1976d2';\n previewCtx.lineWidth = 2;\n previewCtx.strokeRect(offsetX, offsetY, scaledWidth, scaledHeight);\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const cropDims = getCropDimensions();\n\n // Set canvas size\n canvas.width = CANVAS_SIZE;\n canvas.height = CANVAS_SIZE;\n\n // Clear canvas with transparent background\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\n\n // Draw background pattern for transparency visibility\n const patternSize = 20;\n ctx.fillStyle = '#f0f0f0';\n for (let x = 0; x < CANVAS_SIZE; x += patternSize) {\n for (let y = 0; y < CANVAS_SIZE; y += patternSize) {\n if ((x / patternSize + y / patternSize) % 2 === 0) {\n ctx.fillRect(x, y, patternSize, patternSize);\n }\n }\n }\n\n // Save context\n ctx.save();\n\n // Create crop rectangle clipping path\n const cropX = (CANVAS_SIZE - cropDims.width) / 2;\n const cropY = (CANVAS_SIZE - cropDims.height) / 2;\n \n ctx.beginPath();\n ctx.rect(cropX, cropY, cropDims.width, cropDims.height);\n ctx.clip();\n\n // Apply transformations\n ctx.translate(CANVAS_SIZE / 2, CANVAS_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop area border\n ctx.strokeStyle = '#1976d2';\n ctx.lineWidth = 3;\n ctx.strokeRect(cropX, cropY, cropDims.width, cropDims.height);\n\n // Draw corner indicators\n const cornerSize = 20;\n ctx.fillStyle = '#1976d2';\n // Top-left\n ctx.fillRect(cropX - 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY - 1, 3, cornerSize);\n // Top-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY - 1, 3, cornerSize);\n // Bottom-left\n ctx.fillRect(cropX - 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n // Bottom-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n\n // Update preview canvas\n updatePreview(cropX, cropY, cropDims);\n }, [cropSettings, imageLoaded, getCropDimensions, updatePreview]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n const cropDims = getCropDimensions();\n const finalSize = LOGO_OUTPUT_SIZES[outputSize];\n \n // Set output canvas size maintaining aspect ratio\n const aspectRatioValue = cropDims.width / cropDims.height;\n let outputWidth = finalSize;\n let outputHeight = finalSize;\n \n if (aspectRatio !== 'square') {\n if (aspectRatioValue > 1) {\n // Landscape\n outputHeight = finalSize / aspectRatioValue;\n } else {\n // Portrait\n outputWidth = finalSize * aspectRatioValue;\n }\n }\n\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n\n // Save context\n ctx.save();\n\n // Apply transformations (scaled for output size)\n const scaleX = outputWidth / cropDims.width;\n const scaleY = outputHeight / cropDims.height;\n \n ctx.translate(outputWidth / 2, outputHeight / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scaleX, cropSettings.scale * scaleY);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scaleX,\n -image.naturalHeight / 2 + cropSettings.y * scaleY\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as PNG to preserve transparency\n const croppedDataUrl = canvas.toDataURL('image/png', 1.0);\n onCrop(croppedDataUrl);\n \n // Reset state and close\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [cropSettings, onCrop, getCropDimensions, outputSize, aspectRatio, onClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize, getCropDimensions]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n getCropDimensions().width / Math.max(imageNaturalSize.width, 1),\n getCropDimensions().height / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"lg\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎨 Crop Your Logo\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position, resize, and format your logo for perfect branding\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', gap: 3 }}>\n {/* Main Crop Area */}\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>\n <Paper\n elevation={3}\n sx={{\n width: CANVAS_SIZE,\n height: CANVAS_SIZE,\n overflow: 'hidden',\n border: '2px solid',\n borderColor: 'divider',\n borderRadius: 2,\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 20px 20px',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CANVAS_SIZE}\n height={CANVAS_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n left: 8,\n background: 'rgba(0,0,0,0.8)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.9,\n }}\n >\n Drag to reposition • Blue area will be exported\n </Box>\n )}\n </Paper>\n </Box>\n\n {/* Controls Panel */}\n <Box sx={{ width: 300, display: 'flex', flexDirection: 'column', gap: 3 }}>\n {/* Preview */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📋 Preview ({LOGO_OUTPUT_SIZES[outputSize]}px)\n </Typography>\n <Paper elevation={2} sx={{ p: 1, borderRadius: 2, background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 10px 10px' }}>\n <canvas\n ref={previewCanvasRef}\n width={120}\n height={120}\n style={{\n width: '120px',\n height: '120px',\n display: 'block',\n borderRadius: '4px',\n }}\n />\n </Paper>\n </Box>\n\n {/* Aspect Ratio */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📐 Aspect Ratio\n </Typography>\n <ToggleButtonGroup\n value={aspectRatio}\n exclusive\n onChange={(_, newRatio) => newRatio && setAspectRatio(newRatio)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"square\">\n <CropSquareIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Square</Typography>\n </ToggleButton>\n <ToggleButton value=\"landscape\">\n <Crop169Icon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Wide</Typography>\n </ToggleButton>\n <ToggleButton value=\"portrait\">\n <CropPortraitIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Tall</Typography>\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Output Size */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📏 Output Size\n </Typography>\n <ToggleButtonGroup\n value={outputSize}\n exclusive\n onChange={(_, newSize) => newSize && setOutputSize(newSize)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"small\">256px</ToggleButton>\n <ToggleButton value=\"medium\">512px</ToggleButton>\n <ToggleButton value=\"large\">1024px</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Zoom Control */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={4}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 4}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔄 Rotation\n </Typography>\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n fullWidth\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n fullWidth\n >\n Rotate Right\n </Button>\n </Box>\n {cropSettings.rotation !== 0 && (\n <Chip \n label={`${cropSettings.rotation}°`} \n size=\"small\" \n color=\"primary\" \n sx={{ mt: 1 }}\n />\n )}\n </Box>\n\n <Alert severity=\"success\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>✨ Logo Features:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5, fontSize: '0.8rem' }}>\n • <strong>Transparency preserved</strong> for clean logos<br/>\n • <strong>High quality PNG</strong> output<br/>\n • <strong>Multiple sizes</strong> for different uses<br/>\n • <strong>Perfect for branding</strong> across platforms\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Logo\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default LogoCropper;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-70C7-7E0961\nconst __banditFingerprint_components_KnowledgeTabtsx = 'BL-FP-17186C-247F';\nconst __auditTrail_components_KnowledgeTabtsx = 'BL-AU-MGOIKVVI-8Q43';\n// File: KnowledgeTab.tsx | Path: src/management/components/KnowledgeTab.tsx | Hash: 70c7247f\n\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Box,\n Typography,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n TextField,\n InputAdornment,\n Chip,\n LinearProgress,\n Card,\n CardContent,\n IconButton,\n Alert,\n Stack,\n MenuItem,\n Snackbar,\n Switch,\n useMediaQuery,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ViewModuleIcon from '@mui/icons-material/ViewModule';\nimport ViewListIcon from '@mui/icons-material/ViewList';\nimport UploadFileIcon from '@mui/icons-material/UploadFile';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport FolderIcon from '@mui/icons-material/Folder';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';\nimport CodeIcon from '@mui/icons-material/Code';\nimport DataObjectIcon from '@mui/icons-material/DataObject';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CheckIcon from '@mui/icons-material/Check';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport LockIcon from '@mui/icons-material/Lock';\nimport PublicIcon from '@mui/icons-material/Public';\nimport { KnowledgeDoc } from '../../chat/hooks/useKnowledgeStore';\nimport KnowledgeFileModal from '../../modals/knowlege/knowledge-file-modal';\nimport DocumentCard from '../../shared/DocumentCard';\nimport { useVectorStore } from '../../hooks/useVectorStore';\nimport { useAuthenticationStore } from '../../store/authenticationStore';\nimport { useFeatures } from '../../hooks/useFeatures';\nimport ProcessingOverlay from '../../components/shared/ProcessingOverlay';\nimport { useProcessingOverlay } from '../../hooks/useProcessingOverlay';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\n\n// File type detection and categorization with language detection\nconst getFileTypeInfo = (filename: string) => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n // Programming languages with specific colors and labels\n type FileTypeMeta = { icon: React.ElementType; color: string; category: string; language?: string };\n const languageMap: Record<string, FileTypeMeta> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, color: '#d32f2f', category: 'Document' },\n 'doc': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'docx': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'odt': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'rtf': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n \n // Text files\n 'txt': { icon: DescriptionIcon, color: '#388e3c', category: 'Text' },\n 'md': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n \n // Web languages\n 'js': { icon: CodeIcon, color: '#f7df1e', category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React TS' },\n 'html': { icon: CodeIcon, color: '#e34f26', category: 'Code', language: 'HTML' },\n 'css': { icon: CodeIcon, color: '#1572b6', category: 'Code', language: 'CSS' },\n 'scss': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'SCSS' },\n 'sass': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'Sass' },\n 'php': { icon: CodeIcon, color: '#777bb4', category: 'Code', language: 'PHP' },\n \n // Systems languages\n 'c': { icon: CodeIcon, color: '#a8b9cc', category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, color: '#f34b7d', category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, color: '#239120', category: 'Code', language: 'C#' },\n 'java': { icon: CodeIcon, color: '#ed8b00', category: 'Code', language: 'Java' },\n 'py': { icon: CodeIcon, color: '#3776ab', category: 'Code', language: 'Python' },\n 'go': { icon: CodeIcon, color: '#00add8', category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, color: '#ce422b', category: 'Code', language: 'Rust' },\n 'kt': { icon: CodeIcon, color: '#7f52ff', category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, color: '#fa7343', category: 'Code', language: 'Swift' },\n 'scala': { icon: CodeIcon, color: '#dc322f', category: 'Code', language: 'Scala' },\n 'rb': { icon: CodeIcon, color: '#cc342d', category: 'Code', language: 'Ruby' },\n \n // Scripts\n 'sh': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Shell' },\n 'bash': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Bash' },\n 'bat': { icon: CodeIcon, color: '#c1f12e', category: 'Code', language: 'Batch' },\n 'ps1': { icon: CodeIcon, color: '#012456', category: 'Code', language: 'PowerShell' },\n \n // Data formats\n 'json': { icon: DataObjectIcon, color: '#f7df1e', category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, color: '#ff6600', category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, color: '#217346', category: 'Data', language: 'CSV' },\n };\n \n return languageMap[ext] || { icon: DescriptionIcon, color: '#666', category: 'Other' };\n};\n\n// File size formatting\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n};\n\n// Content source badge information with proper vector detection\nconst getContentSourceInfo = (doc: KnowledgeDoc, isVectorMode: boolean) => {\n // Check if this is a vector document - simplified logic focusing on s3Url\n const isVectorDocument = isVectorMode && !!doc.s3Url;\n \n if (isVectorDocument) {\n // Vector documents from S3/private cloud - use teamSid to determine team vs personal\n const teamSid = doc.teamSid;\n if (teamSid) {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n } else {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue \n bgColor: '#1976d220'\n };\n }\n }\n \n // For legacy content source classification\n if (doc.contentSource) {\n if (doc.contentSource === 'user') {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue\n bgColor: '#1976d220'\n };\n } else if (doc.contentSource === 'team') {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n }\n }\n \n // For local IndexedDB documents\n return {\n label: 'Local',\n icon: LockIcon,\n color: '#757575', // Gray\n bgColor: '#75757520'\n };\n};\n\n// Document upload status\ninterface UploadStatus {\n filename: string;\n progress: number;\n status: 'uploading' | 'success' | 'error';\n error?: string;\n}\n\n// View modes\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'size' | 'type';\n\ninterface KnowledgeTabProps {\n documents: KnowledgeDoc[];\n addDocuments: (files: File[]) => Promise<void>;\n removeDocument: (id: string) => void;\n loadDocuments: () => Promise<void>;\n clearAllDocuments: () => Promise<void>;\n currentTheme: ThemeOptions;\n isLimitedAdmin?: boolean; // For premium users with limited admin access\n}\n\nconst KnowledgeTab: React.FC<KnowledgeTabProps> = ({\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n currentTheme,\n isLimitedAdmin = false,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n // Vector store integration for seamless advanced search\n const authStore = useAuthenticationStore();\n const features = useFeatures();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n \n const {\n isVectorEnabled,\n uploadDocument: uploadToVector,\n searchDocuments: searchVectorDocuments,\n getUserDocuments,\n downloadVectorFile,\n getFilePreview,\n refreshCompatibilityCheck,\n initializeVectorService\n } = useVectorStore();\n\n // Processing overlay for vector operations\n const { showProcessing, hideProcessing, updateProgress, processingState } = useProcessingOverlay();\n\n // Allow access for admins, pro tier users, and team tier users\n const shouldUseVector =\n (features.isAdmin() || features.hasAdvancedSearch() || features.hasAdvancedMemories()) &&\n isAdvancedVectorFeaturesEnabled &&\n isVectorEnabled;\n\n const [clearDocsDialogOpen, setClearDocsDialogOpen] = useState(false);\n const [selectedDoc, setSelectedDoc] = useState<KnowledgeDoc | null>(null);\n const [vectorDocuments, setVectorDocuments] = useState<KnowledgeDoc[]>([]);\n const [loadingVectorDocs, setLoadingVectorDocs] = useState(false);\n \n // Enhanced state management for better UX\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>('all');\n const [contentSourceFilter, setContentSourceFilter] = useState<'all' | 'personal' | 'team'>('all');\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [sortBy, setSortBy] = useState<SortBy>('date');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc');\n const [selectedDocuments, setSelectedDocuments] = useState<string[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const [uploadStatuses, setUploadStatuses] = useState<UploadStatus[]>([]);\n const [filterMenuAnchor, setFilterMenuAnchor] = useState<null | HTMLElement>(null);\n const [snackbarMessage, setSnackbarMessage] = useState<string>('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error' | 'warning'>('success');\n const [deletingDocuments, setDeletingDocuments] = useState<Set<string>>(new Set());\n // Check if user has a team (teamSid or teamId in JWT)\n const hasTeam = !!(authStore.user?.teamSid || authStore.user?.teamId);\n \n const [shareWithTeam, setShareWithTeam] = useState<boolean>(false); // Default to personal (off) for safety\n const [dragActive, setDragActive] = useState(false);\n\n // Convert vector database files to KnowledgeDoc format\n type RawVectorDocument = {\n id?: string;\n fileId?: string;\n _id?: string;\n name?: string;\n filename?: string;\n content?: string;\n preview?: string;\n mimeType?: string;\n type?: string;\n uploadedAt?: string;\n createdAt?: string;\n embedding?: number[];\n size?: number;\n uploadedBy?: string;\n userId?: string;\n userEmail?: string;\n bucket?: string;\n key?: string;\n teamSid?: string;\n };\n\n const mapVectorDocsToKnowledgeDocs = useCallback((vectorDocs: RawVectorDocument[]): KnowledgeDoc[] => {\n return vectorDocs.map((doc) => {\n const primaryId = doc.id ?? doc.fileId ?? doc._id;\n const docId = typeof primaryId === 'string'\n ? primaryId\n : primaryId\n ? JSON.stringify(primaryId)\n : uuidv4();\n\n const filename = doc.filename || doc.name || 'Unknown Document';\n const uploadedAt = doc.uploadedAt || doc.createdAt || new Date().toISOString();\n const mimeType = doc.mimeType || doc.type || 'application/octet-stream';\n const isTeamDocument = Boolean(doc.teamSid);\n\n return {\n id: docId,\n name: filename,\n content: doc.preview ?? doc.content ?? '',\n s3Url: docId,\n type: mimeType,\n addedDate: new Date(uploadedAt),\n embedding: doc.embedding,\n size: doc.size ?? 0,\n uploadedBy: doc.uploadedBy || doc.userId || '',\n userEmail: doc.userEmail || '',\n bucket: doc.bucket || '',\n key: doc.key || docId,\n isUserContent: !isTeamDocument,\n isTeamContent: isTeamDocument,\n contentSource: isTeamDocument ? 'team' : 'user',\n ...(isTeamDocument ? { teamSid: doc.teamSid } : {}),\n };\n });\n }, []);\n\n // Load vector documents when vector storage is enabled\n const loadVectorDocuments = useCallback(async () => {\n if (!shouldUseVector) {\n return;\n }\n \n setLoadingVectorDocs(true);\n try {\n const docs = await getUserDocuments(0, 100); // Load first 100 documents\n const mappedDocs = mapVectorDocsToKnowledgeDocs(docs);\n setVectorDocuments(mappedDocs);\n } catch (error) {\n console.error('Failed to load vector documents:', error);\n } finally {\n setLoadingVectorDocs(false);\n }\n }, [shouldUseVector, getUserDocuments, mapVectorDocsToKnowledgeDocs]);\n\n // Load documents on mount and when vector storage availability changes\n useEffect(() => {\n if (shouldUseVector) {\n loadVectorDocuments();\n }\n }, [shouldUseVector, loadVectorDocuments]);\n\n // Enhanced filtering and sorting\n const filteredAndSortedDocuments = useMemo(() => {\n // Use vector documents when vector storage is enabled, otherwise use local documents\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n let filtered = sourceDocuments;\n \n // Search filter - use vector search when available\n if (searchQuery) {\n if (shouldUseVector) {\n // For vector search, we'll need to implement async search\n // For now, fall back to regular search to maintain UI responsiveness\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n } else {\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n }\n }\n\n // Category filter\n if (selectedCategory !== 'all') {\n filtered = filtered.filter(doc => \n getFileTypeInfo(doc.name).category === selectedCategory\n );\n }\n\n // Content source filter\n if (contentSourceFilter !== 'all') {\n filtered = filtered.filter(doc => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n \n if (contentSourceFilter === 'personal') {\n return sourceInfo.label === 'Personal' || sourceInfo.label === 'Local';\n } else if (contentSourceFilter === 'team') {\n return sourceInfo.label === 'Team';\n }\n return true;\n });\n }\n\n // Sort\n filtered.sort((a, b) => {\n let comparison = 0;\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'date':\n // Use document order as fallback since we don't have upload date\n comparison = documents.indexOf(a) - documents.indexOf(b);\n break;\n case 'size':\n comparison = (a.content.length || 0) - (b.content.length || 0);\n break;\n case 'type':\n comparison = getFileTypeInfo(a.name).category.localeCompare(getFileTypeInfo(b.name).category);\n break;\n }\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n\n return filtered;\n }, [documents, vectorDocuments, shouldUseVector, searchQuery, selectedCategory, contentSourceFilter, sortBy, sortOrder]);\n\n // Get unique categories - use active document source\n const categories = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n const cats = new Set(sourceDocuments.map(doc => getFileTypeInfo(doc.name).category));\n return Array.from(cats).sort();\n }, [documents, vectorDocuments, shouldUseVector]);\n\n // Calculate statistics - use active document source\n const statistics = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n \n // Calculate total size - for vector docs use actual size, for local docs estimate from content\n const totalSize = sourceDocuments.reduce((sum, doc) => {\n if (shouldUseVector && doc.size) {\n return sum + doc.size; // Use actual file size from vector storage\n } else {\n return sum + (doc.content?.length || 0) * 2; // Estimate from content length\n }\n }, 0);\n \n const categoryCounts = sourceDocuments.reduce((acc, doc) => {\n const category = getFileTypeInfo(doc.name).category;\n acc[category] = (acc[category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n return {\n totalDocuments: sourceDocuments.length,\n totalSize: formatFileSize(totalSize),\n categoryCounts,\n };\n }, [documents, vectorDocuments, shouldUseVector]);\n\n const getFileIcon = (filename: string): string => {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"js\":\n return \"JS\";\n case \"ts\":\n return \"TS\";\n case \"tsx\":\n return \"TX\";\n case \"py\":\n return \"🐍\";\n case \"json\":\n return \"{}\";\n case \"md\":\n return \"MD\";\n case \"pdf\":\n return \"📄\";\n case \"docx\":\n return \"📄\";\n case \"c\":\n return \"C\";\n case \"cpp\":\n return \"C++\";\n case \"cs\":\n return \"C#\";\n case \"java\":\n return \"J\";\n case \"txt\":\n return \"TXT\";\n default:\n return \"📁\";\n }\n };\n\n // Enhanced file upload with progress tracking\n // Wrapper function to handle vector store integration\n const handleDocumentUpload = async (files: File[]): Promise<{ success: boolean; error?: string; usedVector: boolean }> => {\n if (shouldUseVector) {\n // Show processing overlay for vector uploads\n showProcessing(\n 'Uploading to Vector Database',\n [\n \"🥷 Digital ninjas securing your documents...\",\n \"🤖 AI robots reading and understanding content...\", \n \"⚡ Neural networks encoding knowledge vectors...\",\n \"🧠 Machine learning creating searchable memories...\",\n \"🔮 AI wizards optimizing semantic search...\",\n \"🚀 Vector embeddings achieving light speed...\",\n \"💫 Transforming documents into intelligent data...\",\n \"🎯 Precision-targeting knowledge patterns...\"\n ]\n );\n \n try {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n \n // Update progress for each file\n updateProgress('upload', (i / files.length) * 25); // 25% for upload phase\n \n // Step 1: Upload to S3 - use shareWithTeam only if user has a team\n const shouldShareWithTeam = hasTeam ? shareWithTeam : false;\n const result = await uploadToVector(file, shouldShareWithTeam);\n \n // Step 2: AI Analysis and Embedding\n updateProgress('analyze', 25 + (i / files.length) * 50); // 25-75% for analysis\n \n if (!result.success) {\n throw new Error(result.error || 'Vector upload failed');\n }\n }\n \n // Step 3: Optimizing search\n updateProgress('optimize', 90);\n \n // Final step: Complete\n updateProgress('optimize', 100);\n \n // Reload vector documents to show the newly uploaded files\n await loadVectorDocuments();\n \n return { success: true, usedVector: true };\n } catch (error) {\n console.error('Error uploading to vector database:', error);\n hideProcessing();\n // Fallback to regular local upload only if vector fails\n try {\n await addDocuments(files);\n return { \n success: true, \n usedVector: false, \n error: `Vector upload failed: ${error instanceof Error ? error.message : String(error)}. Saved locally instead.` \n };\n } catch (localError) {\n return { \n success: false, \n usedVector: false, \n error: `Both vector and local upload failed: ${localError instanceof Error ? localError.message : String(localError)}` \n };\n }\n } finally {\n // Hide overlay after a brief delay to show completion\n setTimeout(() => {\n hideProcessing();\n }, 1500);\n }\n } else {\n // Use local IndexedDB storage for non-vector users\n try {\n await addDocuments(files);\n return { success: true, usedVector: false };\n } catch (error) {\n return { \n success: false, \n usedVector: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n };\n\n const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to vector database`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after upload\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Failed to add documents\", err);\n } finally {\n // Reset file input\n if (e.target) {\n e.target.value = '';\n }\n }\n };\n\n const handleFileDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n const files = Array.from(e.dataTransfer.files);\n \n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to vector database`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after drop\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Drag/drop failed\", err);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n };\n\n const handleDownloadDocument = async (e: React.MouseEvent, doc: KnowledgeDoc) => {\n e.stopPropagation();\n \n try {\n if (shouldUseVector && doc.id) {\n // Vector database file - download using MongoDB ObjectId\n await downloadVectorFile(doc.id, doc.name);\n \n setSnackbarMessage(`Downloaded ${doc.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } else {\n // Local file - download from memory\n const blob = new Blob([doc.content], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n } catch (error) {\n console.error('Download failed:', error);\n setSnackbarMessage(`Failed to download ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDocumentClick = async (doc: KnowledgeDoc) => {\n if (shouldUseVector && doc.id && !doc.content) {\n // Vector file without content - try to get preview using MongoDB ObjectId\n \n try {\n const preview = await getFilePreview(doc.id);\n if (preview) {\n // Create a temporary doc with preview content\n const previewDoc: KnowledgeDoc = {\n ...doc,\n content: preview.content,\n type: preview.mimeType\n };\n setSelectedDoc(previewDoc);\n } else {\n // No preview available - show info dialog instead\n setSnackbarMessage(`Preview not available for ${doc.name}. Use download to get the full file.`);\n setSnackbarSeverity('warning');\n setShowSnackbar(true);\n }\n } catch (error) {\n console.error('Failed to get preview:', error);\n setSnackbarMessage(`Failed to preview ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n } else {\n // Local file or vector file with content\n setSelectedDoc(doc);\n }\n };\n\n const handleRemoveDocument = async (e: React.MouseEvent | null, docId: string) => {\n e?.stopPropagation();\n\n // Add to deleting set to trigger animation\n setDeletingDocuments((prev) => new Set(prev).add(docId));\n\n // Wait for animation to complete\n setTimeout(async () => {\n await removeDocument(docId);\n\n // Remove from deleting set\n setDeletingDocuments((prev) => {\n const newSet = new Set(prev);\n newSet.delete(docId);\n return newSet;\n });\n\n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n\n setSnackbarMessage('Document removed');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const handleClearAllDocuments = async () => {\n await clearAllDocuments();\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setClearDocsDialogOpen(false);\n setSnackbarMessage('All documents cleared');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleBulkDelete = async () => {\n // Add all selected documents to deleting set to trigger animation\n setDeletingDocuments(prev => new Set([...prev, ...selectedDocuments]));\n \n // Wait for animation to complete\n setTimeout(async () => {\n const deletePromises = selectedDocuments.map(id => removeDocument(id));\n await Promise.all(deletePromises);\n \n // Remove all from deleting set\n setDeletingDocuments(prev => {\n const newSet = new Set(prev);\n selectedDocuments.forEach(id => newSet.delete(id));\n return newSet;\n });\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setSelectedDocuments([]);\n setSnackbarMessage(`Removed ${selectedDocuments.length} documents`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const toggleDocumentSelection = (docId: string) => {\n setSelectedDocuments(prev => \n prev.includes(docId) \n ? prev.filter(id => id !== docId)\n : [...prev, docId]\n );\n };\n\n const selectAllDocuments = () => {\n setSelectedDocuments(filteredAndSortedDocuments.map(doc => doc.id));\n };\n\n const clearSelection = () => {\n setSelectedDocuments([]);\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ pt: { xs: 1, md: 2 }, pb: { xs: 3, md: 4 } }}>\n {/* Enhanced Header with Statistics */}\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2 },\n justifyContent: 'space-between',\n alignItems: { xs: 'flex-start', md: 'center' },\n mb: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: 'left', md: 'initial' } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Document Knowledge Base\n {shouldUseVector && (\n <Chip \n label=\"Vector DB\" \n color=\"primary\" \n size=\"small\" \n sx={{ ml: 1 }} \n />\n )}\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n sx={{ fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Add documents to your private knowledge base. Files are securely stored {shouldUseVector ? 'in the vector database' : 'locally in your browser'}.\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', gap: { xs: 1, sm: 1.5 }, alignItems: 'center', flexWrap: 'wrap', width: { xs: '100%', md: 'auto' } }}>\n {shouldUseVector && (\n <Button\n variant=\"outlined\"\n size={isMobile ? 'small' : 'medium'}\n onClick={loadVectorDocuments}\n disabled={loadingVectorDocs}\n sx={{ mr: { xs: 0, md: 1 }, width: { xs: '100%', md: 'auto' } }}\n >\n {loadingVectorDocs ? 'Loading...' : 'Refresh'}\n </Button>\n )}\n {documents.length > 0 && (\n <Button\n variant=\"outlined\"\n color=\"error\"\n size={isMobile ? 'small' : 'medium'}\n startIcon={<DeleteIcon />}\n onClick={() => setClearDocsDialogOpen(true)}\n sx={{ ml: { xs: 0, md: 2 }, width: { xs: '100%', md: 'auto' } }}\n >\n Clear All\n </Button>\n )}\n </Box>\n </Box>\n \n {/* Statistics Cards */}\n {documents.length > 0 && (\n <Box sx={{ display: 'flex', gap: { xs: 1.5, md: 2 }, flexWrap: 'wrap', mb: { xs: 2, md: 3 } }}>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalDocuments}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Documents\n </Typography>\n </CardContent>\n </Card>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalSize}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Total Size\n </Typography>\n </CardContent>\n </Card>\n {Object.entries(statistics.categoryCounts).map(([category, count]) => (\n <Card key={category} sx={{ minWidth: 100 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {count as number}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {category}\n </Typography>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n </Box>\n\n {/* Enhanced Upload Area */}\n <Card \n sx={{ \n mb: 3,\n border: dragActive ? `2px dashed ${currentTheme.palette?.primary?.main}` : `1px dashed ${currentTheme.palette?.divider}`,\n bgcolor: dragActive ? `${currentTheme.palette?.primary?.main}08` : 'transparent',\n transition: 'all 0.2s ease-in-out',\n cursor: 'pointer',\n '&:hover': {\n bgcolor: `${currentTheme.palette?.primary?.main}04`,\n borderColor: currentTheme.palette?.primary?.main,\n }\n }}\n onDrop={handleFileDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => document.getElementById('file-upload')?.click()}\n >\n <CardContent sx={{ textAlign: 'center', py: { xs: 3, md: 4 }, px: { xs: 2, md: 3 } }}>\n <UploadFileIcon \n sx={{ \n fontSize: 48, \n color: dragActive ? 'primary.main' : 'text.secondary',\n mb: 2 \n }} \n />\n <Typography variant=\"h6\" color={dragActive ? 'primary' : 'text.primary'} gutterBottom>\n {dragActive ? 'Drop files here' : 'Upload Documents'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Drag and drop files here or click to browse\n </Typography>\n \n {/* Team Sharing Control for Vector Documents - only show if user has a team */}\n {shouldUseVector && hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 2, \n bgcolor: 'background.paper', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider'\n }}\n onClick={(e) => e.stopPropagation()} // Prevent triggering file upload\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <Switch\n checked={shareWithTeam}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setShareWithTeam(e.target.checked)}\n color=\"primary\"\n size=\"small\"\n />\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n {shareWithTeam ? (\n <>\n <GroupIcon sx={{ fontSize: '1rem', color: 'success.main' }} />\n <Typography variant=\"body2\" color=\"success.main\" fontWeight={500}>\n Share with team\n </Typography>\n </>\n ) : (\n <>\n <PersonIcon sx={{ fontSize: '1rem', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\" fontWeight={500}>\n Personal only\n </Typography>\n </>\n )}\n </Box>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n {shareWithTeam \n ? 'Team members can search and access these documents' \n : 'Documents will be private to your account only'\n }\n </Typography>\n </Box>\n )}\n \n {/* Message for users without teams */}\n {shouldUseVector && !hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 1.5, \n bgcolor: 'info.main' + '10', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'info.main' + '30'\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"body2\" color=\"info.main\" fontWeight={500}>\n Personal Documents Only\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n Documents will be stored privately in your personal account\n </Typography>\n </Box>\n )}\n \n <Typography variant=\"caption\" color=\"text.secondary\">\n Supported: PDF, DOC, TXT, MD, Code files, and more\n </Typography>\n <input\n id=\"file-upload\"\n type=\"file\"\n multiple\n onChange={handleFileUpload}\n style={{ display: 'none' }}\n accept=\".pdf,.doc,.docx,.txt,.md,.js,.ts,.tsx,.jsx,.py,.java,.cpp,.c,.cs,.html,.css,.json,.xml,.yaml,.yml,.csv,.php,.rb,.go,.rs,.kt,.swift,.scala,.sh,.bat,.ps1\"\n />\n </CardContent>\n </Card>\n\n {/* Upload Progress */}\n {uploadStatuses.length > 0 && (\n <Box sx={{ mb: 3 }}>\n {uploadStatuses.map((status, index) => (\n <Card key={index} sx={{ mb: 1 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n {status.status === 'success' ? (\n <CheckCircleIcon color=\"success\" />\n ) : status.status === 'error' ? (\n <ErrorIcon color=\"error\" />\n ) : (\n <Box sx={{ width: 20, height: 20 }}>\n <LinearProgress \n variant=\"determinate\" \n value={status.progress}\n sx={{ height: 4, borderRadius: 2 }}\n />\n </Box>\n )}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body2\" color=\"text.primary\">\n {status.filename}\n </Typography>\n {status.error && (\n <Typography variant=\"caption\" color=\"error\">\n {status.error}\n </Typography>\n )}\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.progress}%\n </Typography>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n {/* Enhanced Search and Filter Bar */}\n {documents.length > 0 && (\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', gap: 2, alignItems: 'center', flexWrap: 'wrap' }}>\n {/* Search Field */}\n <TextField\n placeholder=\"Search documents...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n sx={{ minWidth: 250 }}\n size=\"small\"\n />\n\n {/* Active Filters Status */}\n {(searchQuery || contentSourceFilter !== 'all' || selectedCategory !== 'all') && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Chip \n label={`${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length} active filter${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n variant=\"outlined\"\n sx={{ fontWeight: 500 }}\n />\n {contentSourceFilter !== 'all' && (\n <Chip \n label={contentSourceFilter === 'personal' ? 'Personal Only' : 'Team Only'}\n size=\"small\"\n color={contentSourceFilter === 'personal' ? 'info' : 'success'}\n variant=\"filled\"\n icon={contentSourceFilter === 'personal' ? <PersonIcon /> : <GroupIcon />}\n />\n )}\n </Box>\n )}\n\n {/* Category Filter */}\n <TextField\n select\n label=\"Category\"\n value={selectedCategory}\n onChange={(e) => setSelectedCategory(e.target.value)}\n size=\"small\"\n sx={{ minWidth: 120 }}\n >\n <MenuItem value=\"all\">All Types</MenuItem>\n {categories.map(category => (\n <MenuItem key={category} value={category}>\n {category}\n </MenuItem>\n ))}\n </TextField>\n\n {/* Content Source Filter - Always visible for better UX */}\n <TextField\n select\n label=\"Source\"\n value={contentSourceFilter}\n onChange={(e) => setContentSourceFilter(e.target.value as 'all' | 'personal' | 'team')}\n size=\"small\"\n sx={{ \n minWidth: 140,\n '& .MuiOutlinedInput-root': {\n bgcolor: contentSourceFilter !== 'all' ? 'primary.main' + '10' : 'transparent',\n }\n }}\n >\n <MenuItem value=\"all\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PublicIcon sx={{ fontSize: 16 }} />\n All Sources\n </Box>\n </MenuItem>\n <MenuItem value=\"personal\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: 16, color: '#1976d2' }} />\n <Typography>Personal Only</Typography>\n </Box>\n </MenuItem>\n <MenuItem value=\"team\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <GroupIcon sx={{ fontSize: 16, color: '#388e3c' }} />\n <Typography>Team Only</Typography>\n </Box>\n </MenuItem>\n </TextField>\n\n {/* Sort Controls */}\n <TextField\n select\n label=\"Sort by\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n size=\"small\"\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"name\">Name</MenuItem>\n <MenuItem value=\"date\">Date</MenuItem>\n <MenuItem value=\"size\">Size</MenuItem>\n <MenuItem value=\"type\">Type</MenuItem>\n </TextField>\n\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? '↑' : '↓'}\n </Button>\n\n {/* View Mode Toggle */}\n <Box sx={{ display: 'flex', ml: 'auto' }}>\n <IconButton\n onClick={() => setViewMode('grid')}\n color={viewMode === 'grid' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewModuleIcon />\n </IconButton>\n <IconButton\n onClick={() => setViewMode('list')}\n color={viewMode === 'list' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewListIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Selection Controls */}\n {selectedDocuments.length > 0 && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete Selected\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear Selection\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={selectAllDocuments}\n >\n Select All\n </Button>\n </Box>\n </Box>\n )}\n </CardContent>\n </Card>\n )}\n \n {/* Enhanced Document Grid/List */}\n {filteredAndSortedDocuments.length === 0 ? (\n <Card sx={{ textAlign: 'center', py: 8 }}>\n <CardContent>\n <FolderIcon sx={{ fontSize: 64, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No Documents Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {shouldUseVector ? \n 'Upload and embed your first document to get started with advanced vector search' :\n 'Upload your first document to get started'\n }\n </Typography>\n </CardContent>\n </Card>\n ) : (\n <Box>\n {/* Results Summary */}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Showing {filteredAndSortedDocuments.length} of {shouldUseVector ? vectorDocuments.length : documents.length} documents\n {searchQuery && ` for \"${searchQuery}\"`}\n {shouldUseVector && ` (Vector Database)`}\n </Typography>\n\n {/* Document Grid/List View */}\n {viewMode === 'grid' ? (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"repeat(2, 1fr)\",\n sm: \"repeat(3, 1fr)\",\n md: \"repeat(4, 1fr)\",\n lg: \"repeat(6, 1fr)\",\n },\n gap: 2,\n }}\n >\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <DocumentCard\n key={doc.id}\n doc={doc}\n onView={() => handleDocumentClick(doc)}\n onDelete={(id) => handleRemoveDocument(null, id)}\n onSelect={(id) => toggleDocumentSelection(id)}\n isSelected={isSelected}\n isDeleting={isDeleting}\n variant=\"full\"\n showSelection={true}\n showDelete={true}\n showPreview={true}\n />\n );\n })}\n </Box>\n ) : (\n /* List View */\n <Stack spacing={1}>\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <Card\n key={doc.id}\n sx={{\n cursor: \"pointer\",\n transition: \"all 0.3s ease-in-out\",\n border: isSelected ? `2px solid ${currentTheme.palette?.primary?.main}` : `1px solid ${currentTheme.palette?.divider}`,\n \"&:hover\": {\n boxShadow: 4,\n },\n bgcolor: isSelected ? `${currentTheme.palette?.primary?.main}08` : 'background.paper',\n opacity: isDeleting ? 0.3 : 1,\n transform: isDeleting ? 'scale(0.95)' : 'scale(1)',\n }}\n onClick={(e) => {\n if (e.ctrlKey || e.metaKey) {\n toggleDocumentSelection(doc.id);\n } else {\n handleDocumentClick(doc);\n }\n }}\n >\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconComponent sx={{ fontSize: 32, color: fileInfo.color }} />\n \n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: 'text.primary',\n }}\n >\n {doc.name}\n </Typography>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n mt: 0.5,\n }}\n >\n {doc.content.substring(0, 200)}...\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, mt: 1 }}>\n <Chip \n label={fileInfo.category} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '20',\n color: fileInfo.color,\n fontWeight: 600,\n }}\n />\n {(() => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n return (\n <Chip\n icon={<sourceInfo.icon sx={{ fontSize: '0.8rem' }} />}\n label={sourceInfo.label}\n size=\"small\"\n sx={{\n bgcolor: sourceInfo.bgColor,\n color: sourceInfo.color,\n fontWeight: 500,\n fontSize: '0.75rem',\n '& .MuiChip-icon': {\n color: sourceInfo.color,\n }\n }}\n />\n );\n })()}\n <Chip \n label={formatFileSize(doc.content.length * 2)} \n size=\"small\" \n variant=\"outlined\"\n />\n </Box>\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n toggleDocumentSelection(doc.id);\n }}\n sx={{ \n width: 32,\n height: 32,\n bgcolor: isSelected ? 'primary.main' : 'transparent',\n color: isSelected ? 'primary.contrastText' : 'text.secondary',\n border: isSelected ? 'none' : '2px solid',\n borderColor: 'text.secondary',\n borderRadius: '50%',\n '&:hover': {\n bgcolor: isSelected ? 'primary.dark' : 'action.hover',\n borderColor: isSelected ? 'primary.dark' : 'primary.main',\n }\n }}\n >\n {isSelected ? (\n <CheckIcon sx={{ fontSize: 16 }} />\n ) : (\n <Box sx={{ \n width: 12, \n height: 12, \n borderRadius: '50%',\n bgcolor: 'transparent'\n }} />\n )}\n </IconButton>\n \n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadDocument(e, doc);\n }}\n sx={{ \n textTransform: 'none',\n height: { xs: 32, sm: 36, md: 40 }, // Responsive height matching grid view\n minWidth: { xs: 90, sm: 100, md: 110 }, // Consistent width\n borderWidth: 2,\n fontSize: { xs: '0.75rem', sm: '0.8rem', md: '0.875rem' }, // Responsive font\n fontWeight: 600,\n px: { xs: 1, sm: 1.5 }, // Responsive padding\n '&:hover': {\n borderWidth: 2,\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n transform: 'translateY(-1px)',\n boxShadow: 2,\n },\n }}\n startIcon={<DownloadIcon sx={{ fontSize: { xs: '1rem', sm: '1.1rem' } }} />}\n >\n Download\n </Button>\n \n <IconButton\n onClick={(e) => handleRemoveDocument(e, doc.id)}\n color=\"error\"\n >\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n </CardContent>\n </Card>\n );\n })}\n </Stack>\n )}\n\n {/* No Results */}\n {filteredAndSortedDocuments.length === 0 && (\n <Card sx={{ textAlign: 'center', py: 6 }}>\n <CardContent>\n <SearchIcon sx={{ fontSize: 48, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No documents found\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Try adjusting your search or filter criteria\n </Typography>\n <Button\n variant=\"text\"\n onClick={() => {\n setSearchQuery('');\n setSelectedCategory('all');\n }}\n sx={{ mt: 2 }}\n >\n Clear Filters\n </Button>\n </CardContent>\n </Card>\n )}\n </Box>\n )}\n\n {/* Remove old upload area and document grid - they're replaced by the enhanced versions above */}\n\n {/* Enhanced Clear All Documents Dialog */}\n <Dialog open={clearDocsDialogOpen} onClose={() => setClearDocsDialogOpen(false)}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Documents?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all {documents.length} documents from your local browser storage. \n This action cannot be undone.\n </DialogContentText>\n {documents.length > 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n You will lose {statistics.totalSize} of document content\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearDocsDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleClearAllDocuments}\n color=\"error\"\n variant=\"contained\"\n startIcon={<DeleteIcon />}\n >\n Delete All Documents\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Knowledge File Modal */}\n <KnowledgeFileModal \n open={!!selectedDoc} \n onClose={() => setSelectedDoc(null)} \n doc={selectedDoc}\n isVectorDocument={shouldUseVector && !!selectedDoc}\n />\n\n {/* Success/Error Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Quick Actions Panel (when documents are selected) */}\n {selectedDocuments.length > 0 && (\n <Box\n sx={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000,\n bgcolor: 'background.paper',\n border: 1,\n borderColor: 'divider',\n borderRadius: 2,\n boxShadow: 4,\n p: 2,\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n }}\n >\n <Typography variant=\"body2\" sx={{ mr: 2 }}>\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear\n </Button>\n </Box>\n )}\n\n {/* Vector Processing Overlay */}\n <ProcessingOverlay\n open={processingState.isVisible}\n currentStep={processingState.step}\n progress={processingState.progress}\n title={processingState.title}\n customMessages={processingState.customMessages}\n />\n </Box>\n </Box>\n );\n};\n\nexport default KnowledgeTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E790-227D12\nconst __banditFingerprint_shared_ProcessingOverlaytsx = 'BL-FP-218129-2B82';\nconst __auditTrail_shared_ProcessingOverlaytsx = 'BL-AU-MGOIKVVB-O349';\n// File: ProcessingOverlay.tsx | Path: src/components/shared/ProcessingOverlay.tsx | Hash: e7902b82\n\nimport React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogContent,\n Box,\n Typography,\n LinearProgress,\n Fade,\n Zoom,\n useTheme,\n alpha,\n keyframes,\n} from '@mui/material';\nimport { \n CloudUpload, \n Psychology, \n Memory, \n AutoAwesome,\n SmartToy,\n Bolt\n} from '@mui/icons-material';\n\n// Ninja animation keyframes\nconst ninjaFloat = keyframes`\n 0%, 100% { transform: translateY(0px) rotate(0deg); }\n 25% { transform: translateY(-10px) rotate(2deg); }\n 50% { transform: translateY(-5px) rotate(0deg); }\n 75% { transform: translateY(-15px) rotate(-2deg); }\n`;\n\nconst sparkle = keyframes`\n 0%, 100% { opacity: 0; transform: scale(0); }\n 50% { opacity: 1; transform: scale(1); }\n`;\n\nconst pulse = keyframes`\n 0%, 100% { transform: scale(1); opacity: 0.7; }\n 50% { transform: scale(1.1); opacity: 1; }\n`;\n\nconst rotate = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\ninterface ProcessingStep {\n id: string;\n title: string;\n description: string;\n icon: React.ReactNode;\n duration?: number; // rough estimate in seconds\n}\n\ninterface ProcessingOverlayProps {\n open: boolean;\n currentStep?: string;\n progress?: number; // 0-100\n title?: string;\n onCancel?: () => void;\n steps?: ProcessingStep[];\n customMessages?: string[];\n}\n\nconst defaultSteps: ProcessingStep[] = [\n {\n id: 'upload',\n title: 'Uploading to Cloud',\n description: 'Our digital ninjas are securely transferring your file...',\n icon: <CloudUpload />,\n duration: 5\n },\n {\n id: 'analyze',\n title: 'AI Analysis',\n description: 'Advanced AI robots are reading and understanding your content...',\n icon: <Psychology />,\n duration: 15\n },\n {\n id: 'embed',\n title: 'Creating Vectors',\n description: 'Neural networks are encoding knowledge into searchable vectors...',\n icon: <Memory />,\n duration: 10\n },\n {\n id: 'optimize',\n title: 'Optimizing Search',\n description: 'AI algorithms are organizing data for lightning-fast retrieval...',\n icon: <AutoAwesome />,\n duration: 8\n }\n];\n\nconst cleverMessages = [\n \"🥷 Digital ninjas are working their magic...\",\n \"🤖 AI robots are crunching your data...\",\n \"⚡ Neural networks firing at maximum capacity...\",\n \"🧠 Machine learning models deep in thought...\",\n \"🔮 AI wizards casting knowledge spells...\",\n \"⚙️ Quantum processors spinning up...\",\n \"🚀 Algorithms achieving warp speed...\",\n \"💫 Creating digital memories from your content...\",\n \"🎯 Precision-targeting knowledge patterns...\",\n \"🌟 Transforming text into searchable stardust...\"\n];\n\nexport const ProcessingOverlay: React.FC<ProcessingOverlayProps> = ({\n open,\n currentStep,\n progress = 0,\n title = \"Processing Your Request\",\n onCancel,\n steps = defaultSteps,\n customMessages\n}) => {\n const theme = useTheme();\n const [messageIndex, setMessageIndex] = useState(0);\n const [sparkles, setSparkles] = useState<Array<{ id: number; x: number; y: number }>>([]);\n\n const messages = customMessages || cleverMessages;\n\n // Rotate clever messages\n useEffect(() => {\n if (!open) return;\n \n const interval = setInterval(() => {\n setMessageIndex((prev) => (prev + 1) % messages.length);\n }, 3000);\n\n return () => clearInterval(interval);\n }, [open, messages.length]);\n\n // Generate random sparkles\n useEffect(() => {\n if (!open) return;\n\n const generateSparkles = () => {\n const newSparkles = Array.from({ length: 5 }, (_, i) => ({\n id: Date.now() + i,\n x: Math.random() * 100,\n y: Math.random() * 100\n }));\n setSparkles(newSparkles);\n };\n\n generateSparkles();\n const interval = setInterval(generateSparkles, 2000);\n\n return () => clearInterval(interval);\n }, [open]);\n\n const currentStepData = steps.find(step => step.id === currentStep) || steps[0];\n const currentStepIndex = steps.findIndex(step => step.id === currentStep);\n const stepProgress = currentStepIndex >= 0 ? ((currentStepIndex + 1) / steps.length) * 100 : progress;\n\n return (\n <Dialog\n open={open}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n background: `linear-gradient(135deg, \n ${alpha(theme.palette.primary.main, 0.1)} 0%, \n ${alpha(theme.palette.secondary.main, 0.1)} 100%)`,\n backdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n position: 'relative',\n overflow: 'hidden'\n }\n }}\n BackdropProps={{\n sx: {\n backgroundColor: alpha(theme.palette.background.default, 0.8),\n backdropFilter: 'blur(4px)'\n }\n }}\n >\n {/* Animated sparkles */}\n {sparkles.map((sparkle) => (\n <Box\n key={sparkle.id}\n sx={{\n position: 'absolute',\n left: `${sparkle.x}%`,\n top: `${sparkle.y}%`,\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: theme.palette.primary.main,\n animation: `${sparkle} 2s ease-in-out infinite`,\n zIndex: 1\n }}\n />\n ))}\n\n <DialogContent sx={{ textAlign: 'center', py: 4, position: 'relative', zIndex: 2 }}>\n {/* Main Animation Area */}\n <Box sx={{ mb: 3, position: 'relative', height: 120 }}>\n {/* Primary Icon with Ninja Float Animation */}\n <Zoom in={open} timeout={500}>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 80,\n height: 80,\n borderRadius: '50%',\n background: `linear-gradient(45deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`,\n color: 'white',\n fontSize: '2rem',\n animation: `${ninjaFloat} 4s ease-in-out infinite`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.primary.main, 0.3)}`,\n position: 'relative'\n }}\n >\n {currentStepData.icon}\n \n {/* Rotating ring around icon */}\n <Box\n sx={{\n position: 'absolute',\n width: 100,\n height: 100,\n borderRadius: '50%',\n border: `2px solid ${alpha(theme.palette.primary.main, 0.3)}`,\n borderTopColor: theme.palette.primary.main,\n animation: `${rotate} 2s linear infinite`,\n top: -10,\n left: -10\n }}\n />\n </Box>\n </Zoom>\n\n {/* Floating secondary icons */}\n <Box\n sx={{\n position: 'absolute',\n top: 10,\n right: 20,\n animation: `${pulse} 3s ease-in-out infinite`,\n color: theme.palette.secondary.main\n }}\n >\n <SmartToy />\n </Box>\n \n <Box\n sx={{\n position: 'absolute',\n bottom: 10,\n left: 20,\n animation: `${pulse} 2.5s ease-in-out infinite`,\n color: theme.palette.primary.main,\n animationDelay: '1s'\n }}\n >\n <Bolt />\n </Box>\n </Box>\n\n {/* Title */}\n <Typography variant=\"h5\" gutterBottom sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n\n {/* Current Step */}\n <Fade in={true} key={currentStepData.id}>\n <Typography \n variant=\"h6\" \n color=\"primary\" \n gutterBottom\n sx={{ minHeight: 32 }}\n >\n {currentStepData.title}\n </Typography>\n </Fade>\n\n {/* Step Description */}\n <Fade in={true} key={currentStepData.description}>\n <Typography \n variant=\"body2\" \n color=\"text.secondary\" \n sx={{ mb: 3, minHeight: 20 }}\n >\n {currentStepData.description}\n </Typography>\n </Fade>\n\n {/* Clever Message Rotation */}\n <Box sx={{ height: 24, mb: 3, overflow: 'hidden' }}>\n <Fade in={true} key={messageIndex} timeout={500}>\n <Typography\n variant=\"body2\"\n sx={{\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n opacity: 0.8\n }}\n >\n {messages[messageIndex]}\n </Typography>\n </Fade>\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 3 }}>\n <LinearProgress\n variant=\"determinate\"\n value={stepProgress}\n sx={{\n height: 8,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n background: `linear-gradient(90deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {Math.round(stepProgress)}% Complete\n </Typography>\n </Box>\n\n {/* Step Indicators */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 1, mb: 2 }}>\n {steps.map((step, index) => (\n <Box\n key={step.id}\n sx={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n backgroundColor: index <= currentStepIndex \n ? theme.palette.primary.main \n : alpha(theme.palette.primary.main, 0.2),\n transition: 'all 0.3s ease',\n transform: index === currentStepIndex ? 'scale(1.2)' : 'scale(1)'\n }}\n />\n ))}\n </Box>\n\n {/* Estimated Time */}\n {currentStepData.duration && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Estimated time: ~{currentStepData.duration} seconds\n </Typography>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProcessingOverlay;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-2A55-B75390\nconst __banditFingerprint_hooks_useProcessingOverlayts = 'BL-FP-E47E99-C634';\nconst __auditTrail_hooks_useProcessingOverlayts = 'BL-AU-MGOIKVVF-JUZS';\n// File: useProcessingOverlay.ts | Path: src/hooks/useProcessingOverlay.ts | Hash: 2a55c634\n\nimport { useState, useCallback } from 'react';\n\ninterface ProcessingState {\n isVisible: boolean;\n step: string;\n progress: number;\n title: string;\n customMessages?: string[];\n}\n\ninterface UseProcessingOverlayReturn {\n showProcessing: (title?: string, messages?: string[]) => void;\n hideProcessing: () => void;\n updateProgress: (step: string, progress: number) => void;\n processingState: ProcessingState;\n}\n\n/**\n * Hook for managing processing overlay state across components\n * Provides a clean API for showing/hiding loading states with progress\n */\nexport const useProcessingOverlay = (): UseProcessingOverlayReturn => {\n const [processingState, setProcessingState] = useState<ProcessingState>({\n isVisible: false,\n step: 'upload',\n progress: 0,\n title: 'Processing...',\n customMessages: undefined\n });\n\n const showProcessing = useCallback((\n title: string = 'Processing...',\n messages?: string[]\n ) => {\n setProcessingState({\n isVisible: true,\n step: 'upload',\n progress: 0,\n title,\n customMessages: messages\n });\n }, []);\n\n const hideProcessing = useCallback(() => {\n setProcessingState(prev => ({\n ...prev,\n isVisible: false\n }));\n }, []);\n\n const updateProgress = useCallback((step: string, progress: number) => {\n setProcessingState(prev => ({\n ...prev,\n step,\n progress: Math.min(100, Math.max(0, progress))\n }));\n }, []);\n\n return {\n showProcessing,\n hideProcessing,\n updateProgress,\n processingState\n };\n};\n\nexport default useProcessingOverlay;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9903-36654D\nconst __banditFingerprint_components_StorageTabtsx = 'BL-FP-53E9DF-19E2';\nconst __auditTrail_components_StorageTabtsx = 'BL-AU-MGOIKVVK-EY8O';\n// File: StorageTab.tsx | Path: src/management/components/StorageTab.tsx | Hash: 990319e2\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport {\n Box,\n Typography,\n Button,\n Card,\n CardContent,\n LinearProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Alert,\n Stack,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n CircularProgress,\n Snackbar,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport StorageIcon from '@mui/icons-material/Storage';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport WarningIcon from '@mui/icons-material/Warning';\nimport InfoIcon from '@mui/icons-material/Info';\nimport CleaningServicesIcon from '@mui/icons-material/CleaningServices';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport PersonIcon from '@mui/icons-material/Person';\nimport ChatIcon from '@mui/icons-material/Chat';\nimport SettingsIcon from '@mui/icons-material/Settings';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\n\n// Storage category types\ninterface StorageCategory {\n name: string;\n icon: React.ElementType;\n color: string;\n size: number;\n itemCount: number;\n description: string;\n stores: string[];\n canClear: boolean;\n clearWarning?: string;\n}\n\ninterface StorageTabProps {\n currentTheme: ThemeOptions;\n}\n\ninterface StorageQuotaState {\n used: number;\n quota: number;\n available: number;\n browserQuotaEstimate: number;\n}\n\nconst DEFAULT_DISPLAY_QUOTA_BYTES = 1024 * 1024 * 1024; // Default 1 GB cap when the browser doesn't report a quota\nconst MAX_DISPLAY_QUOTA_BYTES = 5 * 1024 * 1024 * 1024; // Clamp giant device-wide quotas to 5 GB for display clarity\n\n// Utility functions for storage management\nconst formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n\nconst getStorageQuota = async (): Promise<{ used: number; quota: number }> => {\n try {\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n const estimate = await navigator.storage.estimate();\n return {\n used: estimate.usage || 0,\n quota: estimate.quota || 0,\n };\n }\n } catch (error) {\n debugLogger.warn('Could not get storage estimate', { error });\n }\n return { used: 0, quota: 0 };\n};\n\nconst getIndexedDBSize = async (): Promise<StorageCategory[]> => {\n const categories: StorageCategory[] = [];\n \n try {\n debugLogger.info('Starting IndexedDB size estimation');\n \n // List all available databases for debugging\n try {\n const databases = await indexedDB.databases();\n debugLogger.info('Available IndexedDB databases:', { \n databases: databases.map(db => ({ name: db.name, version: db.version })) \n });\n } catch (error) {\n debugLogger.warn('Could not list databases', { error });\n }\n \n // Process each category individually to prevent one timeout from breaking everything\n \n // Try multiple possible database names for conversations\n const conversationDbNames = ['bandit-conversations', 'banditConversations', 'conversations'];\n let chatSize = { size: 0, count: 0 };\n let foundConversationDb = '';\n \n for (const dbName of conversationDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'conversations');\n if (result.count > 0) {\n chatSize = result;\n foundConversationDb = dbName;\n debugLogger.info(`Found conversations in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check conversations in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Chat History',\n icon: ChatIcon,\n color: '#4caf50',\n size: chatSize.size,\n itemCount: chatSize.count,\n description: 'Conversation history and messages',\n stores: foundConversationDb ? [`${foundConversationDb}.conversations`] : [],\n canClear: chatSize.count > 0,\n clearWarning: 'This will permanently delete all your chat conversations and message history.'\n });\n \n debugLogger.info(`Chat History category created:`, { \n itemCount: chatSize.count, \n size: chatSize.size, \n canClear: chatSize.count > 0,\n foundDb: foundConversationDb \n });\n\n // Try multiple possible database names for knowledge\n const knowledgeDbNames = ['bandit-knowledge', 'banditKnowledge', 'knowledge'];\n let knowledgeSize = { size: 0, count: 0 };\n let foundKnowledgeDb = '';\n \n for (const dbName of knowledgeDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'documents');\n debugLogger.info(`Knowledge database ${dbName} check result:`, { \n size: result.size, \n count: result.count, \n sizeFormatted: `${(result.size / 1024).toFixed(2)} KB` \n });\n if (result.count > 0) {\n knowledgeSize = result;\n foundKnowledgeDb = dbName;\n debugLogger.info(`Found knowledge documents in database: ${dbName}`, { \n totalSize: result.size, \n itemCount: result.count \n });\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check knowledge in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Knowledge Documents',\n icon: DescriptionIcon,\n color: '#2196f3',\n size: knowledgeSize.size,\n itemCount: knowledgeSize.count,\n description: 'Uploaded documents and their embeddings',\n stores: foundKnowledgeDb ? [`${foundKnowledgeDb}.documents`] : [],\n canClear: knowledgeSize.count > 0,\n clearWarning: 'This will remove all uploaded documents and their AI embeddings. You will need to re-upload documents.'\n });\n\n debugLogger.info(`Knowledge Documents category created:`, { \n itemCount: knowledgeSize.count, \n size: knowledgeSize.size, \n sizeFormatted: `${(knowledgeSize.size / 1024).toFixed(2)} KB`,\n canClear: knowledgeSize.count > 0,\n foundDb: foundKnowledgeDb \n });\n\n // Try multiple possible database names for memory (with timeout protection)\n const memoryDbNames = ['bandit-memory-db', 'banditMemories', 'bandit-memories'];\n let memorySize = { size: 0, count: 0 };\n let foundMemoryDb = '';\n \n for (const dbName of memoryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'memories');\n if (result.count > 0) {\n memorySize = result;\n foundMemoryDb = dbName;\n debugLogger.info(`Found memories in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check memories in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'AI Memories',\n icon: PersonIcon,\n color: '#ff9800',\n size: memorySize.size,\n itemCount: memorySize.count,\n description: 'AI memory entries and learned patterns',\n stores: foundMemoryDb ? [`${foundMemoryDb}.memories`] : [],\n canClear: memorySize.count > 0,\n clearWarning: 'This will delete all AI memory entries and learned conversation patterns.'\n });\n\n // Try multiple possible database names for config\n const configDbNames = ['banditConfig', 'bandit-config'];\n let configSize = { size: 0, count: 0 };\n let foundConfigDb = '';\n \n for (const dbName of configDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'config');\n if (result.count > 0) {\n configSize = result;\n foundConfigDb = dbName;\n debugLogger.info(`Found config in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check config in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'App Settings & Models',\n icon: SettingsIcon,\n color: '#9c27b0',\n size: configSize.size,\n itemCount: configSize.count,\n description: 'Custom models, app settings, and user preferences',\n stores: foundConfigDb ? [`${foundConfigDb}.config`] : [],\n canClear: configSize.count > 0,\n clearWarning: 'This will delete all custom AI models, app settings, themes, and preferences. The app will reset to defaults.'\n });\n\n // Check for AI Query databases (with timeout protection)\n const queryDbNames = ['banditAIQuery', 'ai-query-db'];\n let querySize = { size: 0, count: 0 };\n let foundQueryDb = '';\n \n for (const dbName of queryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'queries');\n if (result.count > 0) {\n querySize = result;\n foundQueryDb = dbName;\n debugLogger.info(`Found AI queries in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check queries in ${dbName}`, { error });\n }\n }\n \n if (querySize.count > 0) {\n categories.push({\n name: 'AI Query Cache',\n icon: PersonIcon,\n color: '#ff5722',\n size: querySize.size,\n itemCount: querySize.count,\n description: 'Cached AI query results and responses',\n stores: [`${foundQueryDb}.queries`],\n canClear: true,\n clearWarning: 'This will delete all cached AI query results.'\n });\n }\n \n debugLogger.info('Categories created:', { \n totalCategories: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n canClear: cat.canClear,\n storesLength: cat.stores.length \n }))\n });\n \n return categories;\n\n } catch (error) {\n debugLogger.error('Error estimating IndexedDB size', { error });\n // Return empty categories on error so UI doesn't hang\n return [];\n }\n};\n\nconst estimateStoreSize = async (dbName: string, storeName: string): Promise<{ size: number; count: number }> => {\n try {\n debugLogger.info(`Attempting to estimate size for ${dbName}.${storeName}`);\n \n // Add a timeout for individual store estimation to prevent hanging\n const timeoutPromise = new Promise<{ size: number; count: number }>((_, reject) => {\n setTimeout(() => reject(new Error(`Store estimation timeout for ${dbName}.${storeName}`)), 3000);\n });\n \n const estimationPromise = (async () => {\n // Try to access the database directly instead of checking if it exists first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n \n try {\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n const rawItems: unknown[] = Array.isArray(items) ? items : [];\n debugLogger.info(`Retrieved ${rawItems.length} items from ${dbName}.${storeName}`);\n \n if (rawItems.length === 0) {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n return { size: 0, count: 0 };\n }\n \n // Estimate size by converting to JSON and measuring length\n const totalSize = rawItems.reduce<number>((acc, item) => {\n try {\n return acc + JSON.stringify(item ?? '').length * 2; // Rough estimate (UTF-16)\n } catch {\n return acc + 1000; // Fallback estimate for non-serializable items\n }\n }, 0);\n const itemCount = rawItems.length;\n \n debugLogger.info(`Estimated size for ${dbName}.${storeName}: ${totalSize} bytes, ${itemCount} items`);\n return { size: totalSize, count: itemCount };\n } catch (dbError) {\n debugLogger.info(`Database ${dbName} or store ${storeName} does not exist or is inaccessible`, { error: dbError });\n return { size: 0, count: 0 };\n }\n })();\n \n // Race between estimation and timeout\n return await Promise.race([estimationPromise, timeoutPromise]);\n } catch (error) {\n debugLogger.warn(`Failed to estimate size for ${dbName}.${storeName}`, { error });\n return { size: 0, count: 0 };\n }\n};\n\nconst clearStorageCategory = async (category: StorageCategory): Promise<void> => {\n debugLogger.info(`Clearing storage category: ${category.name}`);\n \n for (const storeSpec of category.stores) {\n try {\n const [dbName, storeName] = storeSpec.split('.');\n debugLogger.info(`Clearing store: ${dbName}.${storeName}`);\n \n // Skip if either part is undefined\n if (!dbName || !storeName) {\n debugLogger.warn(`Invalid store specification: ${storeSpec}`);\n continue;\n }\n \n // Get all items first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n\n const records: unknown[] = Array.isArray(items) ? items : [];\n\n if (records.length > 0) {\n // Delete each item by its key\n for (const rawItem of records) {\n if (rawItem && typeof rawItem === 'object') {\n const record = rawItem as Record<string, unknown>;\n const candidate = record['id'] ?? record['key'] ?? record['name'];\n if (typeof candidate === 'string' && candidate.length > 0) {\n await indexedDBService.delete(dbName, 1, storeName, candidate, storeConfigs);\n }\n }\n }\n debugLogger.info(`Cleared ${records.length} items from ${dbName}.${storeName}`);\n } else {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n }\n } catch (error) {\n debugLogger.error(`Failed to clear store: ${storeSpec}`, { error });\n // Don't throw error, continue with other stores\n }\n }\n};\n\n// Function to completely clear a database\nconst clearEntireDatabase = async (dbName: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n \n deleteRequest.onsuccess = () => {\n debugLogger.info(`Successfully deleted database: ${dbName}`);\n resolve();\n };\n \n deleteRequest.onerror = () => {\n debugLogger.error(`Failed to delete database: ${dbName}`, { error: deleteRequest.error });\n reject(deleteRequest.error);\n };\n \n deleteRequest.onblocked = () => {\n debugLogger.warn(`Database deletion blocked: ${dbName}. Close all tabs using this database.`);\n // Still resolve as the deletion will complete when other tabs are closed\n resolve();\n };\n });\n};\n\nconst StorageTab: React.FC<StorageTabProps> = ({ currentTheme }) => {\n const theme = useTheme();\n const [storageQuota, setStorageQuota] = useState<StorageQuotaState>({\n used: 0,\n quota: 0,\n available: 0,\n browserQuotaEstimate: 0,\n });\n const [storageCategories, setStorageCategories] = useState<StorageCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [clearAllDialogOpen, setClearAllDialogOpen] = useState(false);\n const [clearCategoryDialog, setClearCategoryDialog] = useState<StorageCategory | null>(null);\n const [clearing, setClearing] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const { syncEnabled, isAdvancedVectorFeaturesEnabled } = useConversationSyncStore((state) => ({\n syncEnabled: state.syncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n }));\n const syncFeaturesActive = syncEnabled || isAdvancedVectorFeaturesEnabled;\n const usageSummaryMessage = syncFeaturesActive\n ? 'IndexedDB/local storage is shown below. Conversation sync or advanced vector storage may copy items to your configured gateway.'\n : 'IndexedDB/local storage lives entirely in this browser when sync features are disabled.';\n const storageStatusPrimary = syncFeaturesActive ? 'IndexedDB/local storage (sync features enabled)' : 'IndexedDB/local storage only';\n\n\n // Load storage data\n const loadStorageData = async () => {\n setLoading(true);\n try {\n debugLogger.info('Loading storage data...');\n \n const [quotaEstimate, categories] = await Promise.all([\n getStorageQuota(),\n getIndexedDBSize()\n ]);\n\n const calculatedUsed = categories.reduce((sum, cat) => sum + cat.size, 0);\n const browserQuota = quotaEstimate.quota && quotaEstimate.quota > 0 ? quotaEstimate.quota : 0;\n const normalizedQuota = browserQuota > 0\n ? Math.min(Math.max(browserQuota, calculatedUsed || DEFAULT_DISPLAY_QUOTA_BYTES), MAX_DISPLAY_QUOTA_BYTES)\n : Math.max(DEFAULT_DISPLAY_QUOTA_BYTES, calculatedUsed);\n\n const available = Math.max(normalizedQuota - calculatedUsed, 0);\n\n debugLogger.info('Storage data loaded successfully', { \n browserQuota,\n browserUsageEstimate: quotaEstimate.used,\n normalizedQuota,\n calculatedUsed,\n available,\n categoriesCount: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n size: cat.size,\n canClear: cat.canClear \n }))\n });\n\n setStorageQuota({\n used: calculatedUsed,\n quota: normalizedQuota,\n available,\n browserQuotaEstimate: browserQuota,\n });\n setStorageCategories(categories);\n } catch (error) {\n debugLogger.error('Failed to load storage data', { error });\n setSnackbarMessage('Failed to load storage data. Please try refreshing.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n // Set empty data so UI doesn't break\n setStorageCategories([]);\n setStorageQuota({ used: 0, quota: DEFAULT_DISPLAY_QUOTA_BYTES, available: DEFAULT_DISPLAY_QUOTA_BYTES, browserQuotaEstimate: 0 });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadStorageData();\n }, []);\n\n // Calculate totals\n const totalUsed = useMemo(() => {\n return storageCategories.reduce((sum, cat) => sum + cat.size, 0);\n }, [storageCategories]);\n\n\n const usagePercentage = useMemo(() => {\n if (storageQuota.quota === 0) return 0;\n const percentage = Math.min((storageQuota.used / storageQuota.quota) * 100, 100);\n // Show at least 0.1% if there's any usage to make it visible\n return percentage > 0 && percentage < 0.1 ? 0.1 : percentage;\n }, [storageQuota]);\n\n const clearableCategories = useMemo(() => {\n return storageCategories.filter(cat => cat.canClear);\n }, [storageCategories]);\n\n // Handle category clearing\n const handleClearCategory = async (category: StorageCategory) => {\n setClearing(true);\n try {\n await clearStorageCategory(category);\n setSnackbarMessage(`Successfully cleared ${category.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearCategoryDialog(null);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage(`Failed to clear ${category.name}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear category', { category: category.name, error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle clear all\n const handleClearAll = async () => {\n setClearing(true);\n try {\n for (const category of clearableCategories) {\n await clearStorageCategory(category);\n }\n setSnackbarMessage('Successfully cleared all storage data');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearAllDialogOpen(false);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage('Failed to clear all storage data');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear all storage', { error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle nuclear clear (completely delete all databases)\n const handleNuclearClear = async () => {\n if (!window.confirm('⚠️ NUCLEAR CLEAR WARNING ⚠️\\n\\nThis will PERMANENTLY DELETE ALL DATABASES and cannot be undone!\\n\\nDifference from \"Clear All Data\":\\n• Clear All Data: Deletes items but keeps database structure\\n• Nuclear Clear: Completely destroys databases and reloads app\\n\\nThis includes:\\n- All chat history\\n- All knowledge documents\\n- All custom models\\n- All app settings\\n- Everything!\\n\\nAre you absolutely sure?')) {\n return;\n }\n \n if (!window.confirm('This is your FINAL WARNING!\\n\\nClick OK to permanently delete EVERYTHING or Cancel to abort.')) {\n return;\n }\n \n setClearing(true);\n try {\n // Include ALL databases seen in the user's system\n const databases = [\n // Current databases\n 'banditConfig', 'bandit-knowledge', 'bandit-conversations', 'bandit-memory-db',\n // Legacy/duplicate databases\n 'banditConversations', 'banditKnowledge', 'banditMemories', 'banditAIQuery',\n 'ai-query-db', 'knowledge'\n ];\n \n for (const dbName of databases) {\n await clearEntireDatabase(dbName);\n }\n \n // Also clear localStorage and sessionStorage\n localStorage.clear();\n sessionStorage.clear();\n \n setSnackbarMessage('Nuclear clear completed! All data has been permanently deleted.');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n \n // Reload the page after a delay to reset everything\n setTimeout(() => {\n window.location.reload();\n }, 2000);\n \n } catch (error) {\n setSnackbarMessage('Nuclear clear failed - some data may remain');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Nuclear clear failed', { error });\n } finally {\n setClearing(false);\n }\n };\n\n if (loading) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', py: 8 }}>\n <CircularProgress />\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ ml: 2 }}>\n Analyzing storage usage...\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box>\n <Box sx={{ px: { xs: 2, sm: 4, md: 6 }, pt: 3, pb: 5 }}>\n {/* Header */}\n <Box sx={{ mb: 4 }}>\n <Box sx={{ \n display: 'flex', \n flexDirection: { xs: 'column', sm: 'row' },\n justifyContent: 'space-between', \n alignItems: { xs: 'stretch', sm: 'flex-start' }, \n gap: { xs: 2, sm: 0 },\n mb: 2 \n }}>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h5\" color=\"text.primary\" sx={{ mb: 1, fontWeight: 600 }}>\n Storage Management\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Monitor and manage your local browser storage usage\n </Typography>\n </Box>\n <Box sx={{ \n display: 'flex', \n gap: 1, \n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n justifyContent: { xs: 'stretch', sm: 'flex-end' },\n width: { xs: '100%', sm: 'auto' }\n }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={loadStorageData}\n disabled={loading}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n minHeight: 36\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'flex' }, alignItems: 'center', gap: 1 }}>\n <RefreshIcon fontSize=\"medium\" />\n Refresh\n </Box>\n <Box sx={{ display: { xs: 'flex', sm: 'none' }, alignItems: 'center', justifyContent: 'center' }}>\n <RefreshIcon fontSize=\"medium\" />\n </Box>\n </Button>\n {clearableCategories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<CleaningServicesIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => setClearAllDialogOpen(true)}\n sx={{\n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Clear All Data</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Clear All</Box>\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => handleNuclearClear()}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Nuclear Clear</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Nuclear</Box>\n </Button>\n </>\n )}\n </Box>\n </Box>\n </Box>\n\n {/* Storage Overview */}\n <Box sx={{ mb: 4 }}>\n {/* Storage Quota - Full width on mobile */}\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 180 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <StorageIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Quota\n </Typography>\n <Box sx={{ mb: 2, flex: 1 }}>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${formatBytes(storageQuota.used)} Used`} \n color=\"warning\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.available)} Available`} \n color=\"success\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.quota)} Total`} \n color=\"info\" \n size=\"small\" \n variant=\"outlined\"\n />\n {storageQuota.browserQuotaEstimate > 0 &&\n storageQuota.quota > 0 &&\n Math.abs(storageQuota.browserQuotaEstimate - storageQuota.quota) > storageQuota.quota * 0.05 && (\n <Chip\n label={`≈${formatBytes(storageQuota.browserQuotaEstimate)} Browser Estimate`}\n color=\"default\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={usagePercentage}\n sx={{\n height: 8,\n borderRadius: 4,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n bgcolor: usagePercentage > 80 ? 'error.main' : usagePercentage > 60 ? 'warning.main' : 'success.main',\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 0.5, display: 'block' }}>\n {usagePercentage.toFixed(1)}% used\n </Typography>\n </Box>\n {usagePercentage > 80 && (\n <Alert severity=\"warning\" sx={{ mt: 'auto' }}>\n Storage usage is high. Consider clearing unused data.\n </Alert>\n )}\n </CardContent>\n </Card>\n\n {/* Usage Summary - Full width on mobile */}\n <Card>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 140 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Usage Summary\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${storageCategories.length} Categories`} \n color=\"primary\" \n size=\"small\" \n />\n <Chip \n label={`${storageCategories.reduce((sum, cat) => sum + cat.itemCount, 0)} Items`} \n color=\"secondary\" \n size=\"small\" \n />\n <Chip \n label={`${formatBytes(totalUsed)} Used`} \n color=\"info\" \n size=\"small\" \n />\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 'auto' }}>\n {usageSummaryMessage}\n </Typography>\n </CardContent>\n </Card>\n </Box>\n\n {/* Storage Categories */}\n <Typography variant=\"h6\" gutterBottom sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Storage Categories\n </Typography>\n\n <Box sx={{ \n maxHeight: '60vh',\n overflow: 'auto',\n '&::-webkit-scrollbar': {\n display: 'none'\n },\n msOverflowStyle: 'none',\n scrollbarWidth: 'none'\n }}>\n {storageCategories.length === 0 ? (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n No storage data found. This could mean:\n </Typography>\n <Typography variant=\"body2\" component=\"ul\" sx={{ mt: 1, pl: 2 }}>\n <li>All databases are empty</li>\n <li>Data is stored under different names</li>\n <li>There was an error accessing the databases</li>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n Try clicking \"Refresh\" or check the browser console for more details.\n </Typography>\n </Alert>\n ) : (\n <Stack spacing={2}>\n {storageCategories.map((category) => {\n const IconComponent = category.icon;\n // Calculate percentage relative to total storage quota for more meaningful display\n const categoryPercentage = storageQuota.quota > 0 ? (category.size / storageQuota.quota) * 100 : 0;\n // Also calculate percentage relative to total used storage\n const categoryRelativePercentage = totalUsed > 0 ? (category.size / totalUsed) * 100 : 0;\n \n debugLogger.info(`Category ${category.name} percentage calculation:`, {\n categorySize: category.size,\n totalUsed,\n storageQuota: storageQuota.quota,\n categoryPercentage: categoryPercentage.toFixed(2),\n categoryRelativePercentage: categoryRelativePercentage.toFixed(2)\n });\n \n return (\n <Accordion key={category.name} sx={{ bgcolor: 'background.paper' }}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${category.name}-content`}\n id={`${category.name}-header`}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', pr: 2 }}>\n <IconComponent sx={{ color: category.color, mr: 2 }} />\n <Box sx={{ flex: 1 }}>\n <Typography \n variant=\"body1\" \n style={{ \n fontWeight: 600,\n color: theme.palette.mode === 'dark' ? '#ffffff' : theme.palette.text.primary\n }}\n >\n {category.name}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, mt: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {formatBytes(category.size)}\n </Typography>\n <Chip \n label={`${category.itemCount} items`} \n size=\"small\" \n variant=\"outlined\"\n />\n <Box sx={{ flex: 1, mx: 2 }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(categoryRelativePercentage, 100)} // Use relative percentage for visual bar\n sx={{\n height: 4,\n borderRadius: 2,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 2,\n bgcolor: category.color,\n }\n }}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {categoryRelativePercentage.toFixed(1)}%\n </Typography>\n </Box>\n </Box>\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n <Box sx={{ pl: 5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n {category.description}\n </Typography>\n \n <Typography variant=\"subtitle2\" gutterBottom>\n Storage Locations:\n </Typography>\n <List dense>\n {category.stores.map((store) => (\n <ListItem key={store} sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <StorageIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary={store}\n primaryTypographyProps={{ variant: 'body2', fontFamily: 'monospace' }}\n />\n </ListItem>\n ))}\n </List>\n\n {category.canClear ? (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon />}\n onClick={() => setClearCategoryDialog(category)}\n disabled={clearing}\n >\n Clear {category.name}\n </Button>\n {category.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.clearWarning}\n </Typography>\n </Alert>\n )}\n </Box>\n ) : (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.itemCount === 0 ? 'This category is empty.' : 'This category cannot be cleared automatically.'}\n </Typography>\n </Alert>\n )}\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Stack>\n )}\n </Box>\n\n {/* Storage Tips */}\n <Card sx={{ mt: 4 }}>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <InfoIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Tips & Clear Options\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon>\n <CheckCircleIcon\n sx={{\n color: syncFeaturesActive\n ? theme.palette.warning.main\n : theme.palette.success.main,\n }}\n />\n </ListItemIcon>\n <ListItemText \n primary={storageStatusPrimary}\n secondary={\n syncFeaturesActive\n ? 'Some features (conversation sync or advanced vector storage) can sync items to your configured gateway storage.'\n : 'With conversation sync and advanced vector storage turned off, everything stays in this browser.'\n }\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <CleaningServicesIcon color=\"info\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Clear All Data (Safe)\"\n secondary=\"Deletes all items but keeps database structure intact. App continues working normally.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <DeleteIcon color=\"error\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Nuclear Clear (Complete Reset)\"\n secondary=\"Completely destroys all databases and forces app reload. Use only for complete reset.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <WarningIcon color=\"warning\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Backup important data\"\n secondary=\"Export custom models and important documents before clearing storage\"\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n\n {/* Clear Category Dialog */}\n <Dialog \n open={!!clearCategoryDialog} \n onClose={() => setClearCategoryDialog(null)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningIcon color=\"warning\" />\n Clear {clearCategoryDialog?.name}?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all data in the \"{clearCategoryDialog?.name}\" category.\n </DialogContentText>\n {clearCategoryDialog?.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n {clearCategoryDialog.clearWarning}\n </Alert>\n )}\n {clearCategoryDialog && (\n <Box sx={{ mt: 2, p: 2, bgcolor: 'action.hover', borderRadius: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>Will clear:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', mt: 1 }}>\n • {clearCategoryDialog.itemCount} items<br/>\n • {formatBytes(clearCategoryDialog.size)} of data<br/>\n • {clearCategoryDialog.stores.length} storage location{clearCategoryDialog.stores.length !== 1 ? 's' : ''}\n </Typography>\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearCategoryDialog(null)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={() => clearCategoryDialog && handleClearCategory(clearCategoryDialog)}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <DeleteIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing...' : 'Clear Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Clear All Dialog */}\n <Dialog \n open={clearAllDialogOpen} \n onClose={() => setClearAllDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Storage Data?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete ALL your local data including:\n </DialogContentText>\n <List dense sx={{ mt: 1 }}>\n {clearableCategories.map((category) => (\n <ListItem key={category.name}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <category.icon fontSize=\"small\" sx={{ color: category.color }} />\n </ListItemIcon>\n <ListItemText \n primary={category.name}\n secondary={`${category.itemCount} items • ${formatBytes(category.size)}`}\n />\n </ListItem>\n ))}\n </List>\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n <strong>This action cannot be undone!</strong> Make sure to export any important data before proceeding.\n </Typography>\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearAllDialogOpen(false)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={handleClearAll}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <CleaningServicesIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing All...' : 'Clear All Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n </Box>\n );\n};\n\nexport default StorageTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8422-DD3359\nconst __banditFingerprint_components_ProviderTabtsx = 'BL-FP-40A439-27B6';\nconst __auditTrail_components_ProviderTabtsx = 'BL-AU-MGOIKVVK-2GRA';\n// File: ProviderTab.tsx | Path: src/management/components/ProviderTab.tsx | Hash: 842227b6\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n Box,\n Typography,\n Paper,\n Button,\n TextField,\n MenuItem,\n Chip,\n Snackbar,\n Alert,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport { useAIProviderStore } from '../../store/aiProviderStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { AIProviderConfig, AIProviderType } from '../../services/ai-provider/types/common.types';\nimport { aiProviderInitService } from '../../services/ai-provider-init.service';\nimport { AIProviderFactory } from '../../services/ai-provider/ai-provider.factory';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\n\ntype PersistedProviderConfig = Omit<AIProviderConfig, 'tokenFactory'> & { id: string };\ntype GatewayBackendProvider = NonNullable<AIProviderConfig['provider']>;\n\nexport const ProviderTab: React.FC = () => {\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n\n const getSuggestedModel = useCallback((type: AIProviderType): string => {\n const configuredDefault = packageSettings?.defaultModel?.trim();\n if (configuredDefault) {\n return configuredDefault;\n }\n\n switch (type) {\n case AIProviderType.OPENAI:\n return 'gpt-4o-mini';\n case AIProviderType.XAI:\n return 'grok-beta';\n default:\n return '';\n }\n }, [packageSettings?.defaultModel]);\n\n const applyDefaultModel = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const normalized = { ...config } as AIProviderConfig & { defaultModel?: string };\n const trimmed = typeof normalized.defaultModel === 'string' ? normalized.defaultModel.trim() : undefined;\n const requiresModel =\n normalized.type === AIProviderType.OPENAI ||\n normalized.type === AIProviderType.XAI;\n\n if (trimmed) {\n normalized.defaultModel = trimmed;\n return normalized;\n }\n\n if (!requiresModel) {\n delete normalized.defaultModel;\n return normalized;\n }\n\n const suggestion = getSuggestedModel(normalized.type as AIProviderType);\n if (suggestion) {\n normalized.defaultModel = suggestion;\n } else {\n delete normalized.defaultModel;\n }\n\n return normalized;\n }, [getSuggestedModel]);\n\n const sanitizeConfigForSave = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const sanitized = { ...config } as AIProviderConfig & { defaultModel?: string };\n if (typeof sanitized.defaultModel === 'string') {\n const trimmed = sanitized.defaultModel.trim();\n sanitized.defaultModel = trimmed || undefined;\n }\n return sanitized;\n }, []);\n\n // AI Provider configuration state\n const [providerConfig, setProviderConfig] = useState<AIProviderConfig>({\n type: 'ollama' as const,\n baseUrl: 'http://localhost:11434'\n });\n const [isProviderConfigOpen, setIsProviderConfigOpen] = useState(false);\n\n // Snackbar states\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const saveProviderConfigToDB = async (config: AIProviderConfig) => {\n try {\n const { tokenFactory: _tokenFactory, ...persistableConfig } = config;\n const serializableConfig: PersistedProviderConfig = {\n ...persistableConfig,\n id: 'aiProvider'\n };\n\n await indexedDBService.put<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n serializableConfig,\n [{ name: 'config', keyPath: 'id' }]\n );\n debugLogger.info('Provider configuration saved to IndexedDB', { type: config.type });\n } catch (error) {\n console.error('Failed to save provider config to IndexedDB:', error);\n debugLogger.error('Failed to save provider config to IndexedDB:', { error });\n throw error; // Re-throw to handle in the calling function\n }\n };\n\n const loadProviderConfigFromDB = async (): Promise<AIProviderConfig | null> => {\n try {\n const config = await indexedDBService.get<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n 'aiProvider',\n [{ name: 'config', keyPath: 'id' }]\n );\n if (config) {\n debugLogger.info('Provider configuration loaded from IndexedDB', { type: config.type });\n // Remove the id property that was added for IndexedDB storage\n const { id: _id, ...configWithoutId } = config;\n return configWithoutId as AIProviderConfig;\n }\n } catch (error) {\n debugLogger.error('Failed to load provider config from IndexedDB:', { error });\n }\n return null;\n };\n\n const convertAnthropicConfig = useCallback((config: AIProviderConfig | null | undefined): AIProviderConfig | null => {\n if (!config) return null;\n if (config.type !== AIProviderType.ANTHROPIC) {\n return config;\n }\n\n const gatewayUrl = config.gatewayUrl || packageSettings?.gatewayApiUrl || '';\n const defaultModel = typeof config.defaultModel === 'string' && config.defaultModel.trim()\n ? config.defaultModel.trim()\n : 'claude-3-5-sonnet-latest';\n const converted: AIProviderConfig = {\n type: AIProviderType.GATEWAY,\n gatewayUrl,\n provider: 'anthropic',\n defaultModel,\n tokenFactory: config.tokenFactory\n };\n\n return converted;\n }, [packageSettings?.gatewayApiUrl]);\n\n // Load current provider configuration\n useEffect(() => {\n const initializeProviderConfig = async () => {\n // First try to load from IndexedDB\n const savedConfig = await loadProviderConfigFromDB();\n \n if (savedConfig) {\n const normalized = convertAnthropicConfig(savedConfig) || savedConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (currentProviderConfig) {\n const normalized = convertAnthropicConfig(currentProviderConfig) || currentProviderConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (packageSettings?.aiProvider) {\n const normalized = convertAnthropicConfig(packageSettings.aiProvider) || packageSettings.aiProvider;\n setProviderConfig(applyDefaultModel(normalized));\n }\n };\n\n initializeProviderConfig();\n }, [applyDefaultModel, convertAnthropicConfig, currentProviderConfig, packageSettings]);\n\n const showMessage = (message: string, severity: 'success' | 'error') => {\n setSnackbarMessage(message);\n setSnackbarSeverity(severity);\n setShowSnackbar(true);\n };\n\n // AI Provider configuration handlers\n const handleProviderTypeChange = (type: AIProviderType) => {\n const baseConfig: AIProviderConfig = { type };\n \n switch (type) {\n case AIProviderType.OLLAMA:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'http://localhost:11434'\n }));\n break;\n case AIProviderType.OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.openai.com/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.AZURE_OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: '',\n apiKey: '',\n apiVersion: '2024-02-01',\n deploymentName: ''\n }));\n break;\n case AIProviderType.ANTHROPIC:\n showMessage('Anthropic is only available via the Gateway provider. Please configure Gateway and choose Anthropic as the backend.', 'error');\n setProviderConfig(applyDefaultModel({\n type: AIProviderType.GATEWAY,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'anthropic',\n defaultModel: 'claude-3-5-sonnet-latest'\n }));\n break;\n case AIProviderType.XAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.x.ai/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.GATEWAY:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'openai'\n }));\n break;\n case AIProviderType.PLAYGROUND:\n setProviderConfig(applyDefaultModel({\n ...baseConfig\n }));\n break;\n }\n };\n\n const handleSaveProviderConfig = async () => {\n try { \n const normalizedConfigIntermediate = sanitizeConfigForSave(providerConfig);\n const normalizedConfig = convertAnthropicConfig(normalizedConfigIntermediate) || normalizedConfigIntermediate;\n const requiresModel =\n normalizedConfig.type === AIProviderType.OPENAI ||\n normalizedConfig.type === AIProviderType.XAI;\n\n if (requiresModel && !normalizedConfig.defaultModel) {\n showMessage('Please provide a default model ID for the selected provider.', 'error');\n return;\n }\n\n // Validate the configuration\n const isValid = AIProviderFactory.validateConfig(normalizedConfig);\n if (!isValid) {\n showMessage('Invalid provider configuration. Please check all required fields.', 'error');\n return;\n }\n\n // Save to IndexedDB first\n await saveProviderConfigToDB(normalizedConfig);\n\n // Switch to the new provider\n await aiProviderInitService.switchProvider(normalizedConfig);\n \n // Update package settings\n if (packageSettings) {\n const updatedSettings = {\n ...packageSettings,\n aiProvider: normalizedConfig\n };\n if (normalizedConfig.defaultModel) {\n updatedSettings.defaultModel = normalizedConfig.defaultModel;\n }\n usePackageSettingsStore.setState({ settings: updatedSettings });\n }\n\n setProviderConfig(applyDefaultModel(normalizedConfig));\n setIsProviderConfigOpen(false);\n showMessage('Provider configuration saved and switched successfully!', 'success');\n debugLogger.info('Provider configuration saved and switched', { type: normalizedConfig.type });\n } catch (error) {\n debugLogger.error('Failed to save provider configuration:', { error });\n showMessage(`Failed to save provider configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, 'error');\n }\n };\n\n const handleTestProviderConnection = async () => {\n try {\n const testConfig = sanitizeConfigForSave(providerConfig);\n const normalizedTestConfig = convertAnthropicConfig(testConfig) || testConfig;\n const testProvider = AIProviderFactory.createProvider(normalizedTestConfig);\n\n const result = await testProvider.validateServiceAvailability({ timeoutMs: 10000 });\n \n if (result.isAvailable) {\n showMessage('Connection successful! Provider is available.', 'success');\n } else {\n showMessage('Connection failed. Please check your configuration.', 'error');\n }\n } catch (error) {\n debugLogger.error('Provider connection test failed:', { error });\n showMessage('Connection test failed. Please check your configuration.', 'error');\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n AI Provider Configuration\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Configure your AI provider for chat, generation, and model services. This determines which backend service powers your AI interactions.\n </Typography>\n\n {/* Current Provider Status */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Current Provider\n </Typography>\n {currentProvider ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Chip\n label={currentProvider.getProviderType().toUpperCase()}\n color=\"primary\"\n variant=\"filled\"\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {currentProviderConfig?.baseUrl || currentProviderConfig?.gatewayUrl || 'No URL configured'}\n </Typography>\n </Box>\n ) : (\n <Chip label=\"No Provider Configured\" color=\"warning\" />\n )}\n </Paper>\n\n {/* Provider Configuration Form */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: { xs: 'flex-start', sm: 'center' },\n justifyContent: 'space-between',\n gap: { xs: 1, sm: 2 },\n mb: 3,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Provider Configuration\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setIsProviderConfigOpen(!isProviderConfigOpen)}\n size={isMobile ? 'small' : 'medium'}\n >\n {isProviderConfigOpen ? 'Hide' : 'Configure'} Provider\n </Button>\n </Box>\n\n {isProviderConfigOpen && (\n <Box sx={{ mt: 3 }}>\n {/* Provider Type Selection */}\n <TextField\n label=\"Provider Type\"\n select\n value={providerConfig.type}\n onChange={(e) => handleProviderTypeChange(e.target.value as AIProviderType)}\n fullWidth\n sx={{ mb: 3 }}\n >\n <MenuItem value=\"gateway\">Gateway (Recommended)</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n <MenuItem value=\"playground\">Playground (Mock Demo)</MenuItem>\n </TextField>\n\n {/* Gateway Configuration */}\n {providerConfig.type === 'gateway' && (\n <Box>\n <TextField\n label=\"Gateway URL\"\n value={providerConfig.gatewayUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, gatewayUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-gateway-api.com\"\n />\n <TextField\n label=\"Backend Provider\"\n select\n value={providerConfig.provider || 'openai'}\n onChange={(e) => setProviderConfig({\n ...providerConfig,\n provider: e.target.value as GatewayBackendProvider\n })}\n fullWidth\n sx={{ mb: 2 }}\n >\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"anthropic\">Anthropic</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n </TextField>\n </Box>\n )}\n\n {/* Ollama Configuration */}\n {providerConfig.type === 'ollama' && (\n <TextField\n label=\"Ollama URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n placeholder=\"http://localhost:11434\"\n />\n )}\n\n {/* OpenAI Configuration */}\n {providerConfig.type === 'openai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.openai.com/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"sk-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"gpt-4o-mini\"\n helperText=\"Example: gpt-4o-mini, gpt-4.1, gpt-3.5-turbo\"\n />\n </Box>\n )}\n\n {/* Azure OpenAI Configuration */}\n {providerConfig.type === 'azure-openai' && (\n <Box>\n <TextField\n label=\"Azure Endpoint\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-resource.openai.azure.com\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiKey: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n />\n <TextField\n label=\"API Version\"\n value={providerConfig.apiVersion || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiVersion: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"2024-02-01\"\n />\n <TextField\n label=\"Deployment Name\"\n value={providerConfig.deploymentName || ''}\n onChange={(e) => setProviderConfig({...providerConfig, deploymentName: e.target.value})}\n fullWidth\n placeholder=\"gpt-4\"\n />\n </Box>\n )}\n\n {/* xAI Configuration */}\n {providerConfig.type === 'xai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.x.ai/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"xai-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"grok-beta\"\n helperText=\"Example: grok-beta, grok-2, grok-vision-beta\"\n />\n </Box>\n )}\n\n {/* Anthropic Configuration (deprecated direct support) */}\n {providerConfig.type === 'anthropic' && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n Anthropic is only supported through the Bandit Gateway provider. Please switch to Gateway and\n select Anthropic as the backend service.\n </Alert>\n )}\n\n {/* Action Buttons */}\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button\n variant=\"outlined\"\n onClick={handleTestProviderConnection}\n disabled={!providerConfig.type}\n >\n Test Connection\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleSaveProviderConfig}\n disabled={!providerConfig.type}\n >\n Save & Switch Provider\n </Button>\n </Box>\n </Box>\n )}\n </Paper>\n\n {/* Migration Information */}\n <Paper sx={{ p: 3, bgcolor: 'info.main', color: 'info.contrastText', borderRadius: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\" }}>\n 🚀 Gateway Provider Recommended\n </Typography>\n <Typography variant=\"body2\">\n For production deployments, we recommend using the Gateway provider which routes requests through your secure backend API. \n This approach keeps API keys secure, enables rate limiting, and provides better monitoring capabilities.\n </Typography>\n </Paper>\n </Box>\n\n {/* Snackbar for messages */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={6000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6468-24BE3B\nconst __banditFingerprint_components_MCPToolsTabV2tsx = 'BL-FP-885971-25D5';\nconst __auditTrail_components_MCPToolsTabV2tsx = 'BL-AU-MGOIKVVJ-JBSK';\n// File: MCPToolsTabV2.tsx | Path: src/management/components/MCPToolsTabV2.tsx | Hash: 646825d5\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Box, Typography, Paper, Chip, Stack, IconButton, Tooltip, LinearProgress, Switch, FormControlLabel } from '@mui/material';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport HealthAndSafetyIcon from '@mui/icons-material/HealthAndSafety';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport SettingsIcon from '@mui/icons-material/Settings';\nimport { fetchAvailableMcpTools, fetchMcpHealth, McpTool } from '../../services/mcp/mcpControllerService';\nimport { useMCPToolsStore } from '../../store/mcpToolsStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\n\nconst MCPToolsTabV2: React.FC = () => {\n const { settings } = usePackageSettingsStore();\n const { tools: localTools, loadTools, toggleTool, addTool, updateTool, isLoaded } = useMCPToolsStore();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [tools, setTools] = useState<McpTool[]>([]);\n const [health, setHealth] = useState<{ status: 'healthy' | 'unhealthy' | 'unknown'; timestamp?: string } | null>(null);\n\n const gatewayConfigured = !!settings?.gatewayApiUrl;\n\n const refresh = async () => {\n setLoading(true);\n setError(null);\n try {\n await loadTools(); // ensure local store is hydrated\n const [serverTools, healthResp] = await Promise.all([\n fetchAvailableMcpTools(),\n fetchMcpHealth().catch(() => null)\n ]);\n setTools(serverTools);\n // Merge controller tools into local store to keep AI enablement aligned\n serverTools.forEach(ct => {\n const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, '_');\n let match = localTools.find(lt => lt.function.name === functionName);\n if (!match) {\n match = localTools.find(lt => lt.function.name === ct.id);\n }\n if (!match) {\n match = localTools.find(lt => lt.id === ct.id);\n }\n \n if (!match) {\n // Add a new local tool representation to allow enabling for AI\n addTool({\n name: functionName,\n description: ct.description,\n enabled: ct.isEnabled, // Use server's enabled state for new tools\n type: 'function',\n function: {\n name: ct.id, // Use server ID as function name for better mapping\n description: ct.description,\n parameters: { type: 'object', properties: {}, required: [] },\n },\n endpoint: `/mcp/${ct.id}`,\n method: 'GET',\n isBuiltIn: false,\n });\n } else {\n // For existing tools, sync with server state\n updateTool(match.id, { enabled: ct.isEnabled });\n }\n });\n if (healthResp) {\n const status = healthResp.status === 'healthy' || healthResp.status === 'unhealthy'\n ? healthResp.status\n : 'unknown';\n setHealth({ status, timestamp: healthResp.timestamp });\n } else {\n setHealth({ status: 'unknown' });\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load MCP data');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (isLoaded) {\n refresh();\n } else {\n // Ensure local tools are loaded first\n loadTools().then(() => {\n refresh();\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoaded]);\n\n const localEnabledMap = useMemo(() => {\n const map = new Map<string, boolean>();\n \n // Sort tools to prioritize built-in tools over custom duplicates\n const sortedTools = [...localTools].sort((a, b) => {\n // Built-in tools (shorter, cleaner IDs) come first\n if (a.isBuiltIn && !b.isBuiltIn) return -1;\n if (!a.isBuiltIn && b.isBuiltIn) return 1;\n // Among non-built-in tools, shorter IDs (likely original) come first\n return a.id.length - b.id.length;\n });\n \n sortedTools.forEach(t => {\n // Map by function name (primary)\n map.set(t.function.name, t.enabled);\n // Also map by tool id for easier lookup\n map.set(t.id, t.enabled);\n // Map by tool name for fallback\n if (t.name) {\n map.set(t.name, t.enabled);\n }\n });\n \n return map;\n }, [localTools]);\n\n return (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 600, color: 'primary.main' }}>Available Tools</Typography>\n <Box>\n <Tooltip title=\"Refresh\">\n <IconButton onClick={refresh}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n\n {!gatewayConfigured && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Gateway API URL isn’t configured. The controller endpoints will be fetched relative to this origin.\n </Typography>\n </Paper>\n )}\n\n <Paper sx={{ p: 2, mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {health?.status === 'healthy' ? (\n <HealthAndSafetyIcon color=\"success\" />\n ) : health?.status === 'unhealthy' ? (\n <ErrorOutlineIcon color=\"error\" />\n ) : (\n <ErrorOutlineIcon color=\"disabled\" />\n )}\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>Controller Health</Typography>\n <Chip\n size=\"small\"\n label={(health?.status || 'unknown').toString()}\n color={health?.status === 'healthy' ? 'success' : health?.status === 'unhealthy' ? 'error' : 'default'}\n sx={{ ml: 1 }}\n />\n {health?.timestamp && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ ml: 1 }}>\n {new Date(health.timestamp).toLocaleString()}\n </Typography>\n )}\n </Box>\n </Paper>\n\n {loading && (\n <Box sx={{ mb: 2 }}>\n <LinearProgress />\n </Box>\n )}\n {error && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography color=\"error\">{error}</Typography>\n </Paper>\n )}\n\n <Stack spacing={2}>\n {tools.map((tool) => {\n // Try multiple lookup strategies to find the local enabled state\n let locallyEnabled = localEnabledMap.get(tool.id); // Try server tool id first\n if (locallyEnabled === undefined) {\n locallyEnabled = localEnabledMap.get(tool.name); // Try server tool name\n }\n if (locallyEnabled === undefined) {\n // Fallback to direct lookup in localTools array (more reliable)\n const directLookup = localTools.find(t => \n t.id === tool.id || \n t.function.name === tool.id || \n t.name === tool.name\n );\n locallyEnabled = directLookup?.enabled ?? tool.isEnabled;\n }\n \n return (\n <Paper key={tool.id} sx={{ p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 700 }}>{tool.name}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {tool.description}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <FormControlLabel\n control={<Switch checked={!!locallyEnabled} onChange={() => {\n // Find the corresponding local tool using multiple strategies\n let local = localTools.find(t => t.function.name === tool.id);\n if (!local) {\n local = localTools.find(t => t.function.name === tool.name);\n }\n if (!local) {\n local = localTools.find(t => t.id === tool.id);\n }\n if (!local) {\n local = localTools.find(t => t.name === tool.name);\n }\n \n if (local) {\n toggleTool(local.id);\n } else {\n console.warn('Could not find local tool for server tool:', tool);\n }\n }} />}\n label={locallyEnabled ? 'Enabled' : 'Disabled'}\n />\n <Tooltip title=\"Controller-driven tools (read-only schema)\">\n <SettingsIcon color=\"disabled\" />\n </Tooltip>\n </Box>\n </Box>\n {!!tool.supportedParameters?.length && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Supported parameters</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {tool.supportedParameters.map((p) => (\n <Chip key={p} size=\"small\" label={p} />\n ))}\n </Box>\n </Box>\n )}\n </Paper>\n );\n })}\n </Stack>\n </Box>\n );\n};\n\nexport default MCPToolsTabV2;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-D920-E6B3B8\nconst __banditFingerprint_mcp_mcpControllerServicets = 'BL-FP-5B6964-A0CB';\nconst __auditTrail_mcp_mcpControllerServicets = 'BL-AU-MGOIKVVV-RXNY';\n// File: mcpControllerService.ts | Path: src/services/mcp/mcpControllerService.ts | Hash: d920a0cb\n\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport interface McpTool {\n id: string;\n name: string;\n description: string;\n supportedParameters: string[];\n isEnabled: boolean;\n}\n\nexport interface McpHealthResponse {\n status: string; // \"healthy\" | \"unhealthy\"\n timestamp: string;\n totalTools: number;\n enabledTools: number;\n availableTools: Array<{ id: string; name: string }>;\n}\n\nconst isPlaygroundMode = (): boolean => {\n const settings = usePackageSettingsStore.getState().settings;\n if (!settings) {\n return false;\n }\n const gatewayUrl = settings.gatewayApiUrl?.toLowerCase() ?? \"\";\n return Boolean(settings.playgroundMode || gatewayUrl.startsWith(\"playground://\"));\n};\n\nfunction buildUrl(path: string): string {\n // When running in playground mode, we never call the gateway directly.\n if (isPlaygroundMode()) {\n debugLogger.info(\"MCP controller URL build skipped in playground mode\", { path });\n return path.startsWith(\"/\") ? path : `/${path}`;\n }\n\n // Prefer configured gateway URL when available, otherwise fall back to relative path\n const base = usePackageSettingsStore.getState().settings?.gatewayApiUrl?.replace(/\\/$/, \"\") || \"\";\n if (base) {\n // Ensure path begins with '/'\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${base}${normalized}`;\n }\n return path; // relative to current origin\n}\n\nfunction authHeaders(): HeadersInit {\n const headers: HeadersInit = { 'Content-Type': 'application/json' };\n const token = authenticationService.getToken();\n if (token) headers['Authorization'] = `Bearer ${token}`;\n return headers;\n}\n\nexport async function fetchAvailableMcpTools(): Promise<McpTool[]> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Skipping remote MCP tool fetch — playground mode active\");\n return [];\n }\n\n const url = buildUrl('/mcp/tools');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to load MCP tools (${res.status})`);\n }\n return data as McpTool[];\n } catch (error) {\n debugLogger.error('Failed to fetch MCP tools', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n\nexport async function fetchMcpHealth(): Promise<McpHealthResponse> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Returning mocked MCP health — playground mode active\");\n return {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n totalTools: 0,\n enabledTools: 0,\n availableTools: [],\n };\n }\n\n const url = buildUrl('/mcp/health');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to fetch MCP health (${res.status})`);\n }\n return data as McpHealthResponse;\n } catch (error) {\n debugLogger.error('Failed to fetch MCP health', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,YAAAA,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD,OAAOC,oBAAmB;AAC1B,SAAS,SAAAC,cAAa;AAGtB;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,+BAA+B;AACtC,OAAO,eAAe;AACtB,OAAO,kBAAkB;AACzB,OAAO,cAAc;AACrB,OAAO,eAAe;AACtB,OAAO,eAAe;AACtB,OAAOC,kBAAiB;AACxB,SAAS,mBAAmB;AAC5B,OAAO,qBAAqB;;;AC7B5B,SAAgB,YAAAC,iBAAgB;AAChC;AAAA,EACE,OAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,mBAAmB;AAC1B,SAAS,gBAAgB;AACzB,OAAO,qBAAqB;AAC5B,OAAO,8BAA8B;AACrC,OAAO,4BAA4B;AACnC,OAAO,0BAA0B;AACjC,OAAO,gCAAgC;AACvC,OAAO,0BAA0B;;;AC5BjC,SAAgB,UAAU,QAAQ,aAAa,iBAAiB;AAChE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,oBAAoB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,gBAAgB;AACvB,OAAO,iBAAiB;AAyOlB,SAWI,UAVF,KADF;AAzNN,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,OAA0B,IAAI;AAChD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAiB,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAuB;AAAA,IAC7D,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACzD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAEhF,QAAM,YAAY;AAClB,QAAM,cAAc;AAGpB,YAAU,MAAM;AACd,QAAI,aAAa,MAAM;AACrB,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,CAAC,MAAM;AACrB,YAAI,EAAE,QAAQ,QAAQ;AACpB,sBAAY,EAAE,OAAO,MAAgB;AACrC,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AACA,aAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,WAAW,IAAI,CAAC;AAGpB,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,SAAS,SAAS;AACpB,YAAM,EAAE,cAAc,cAAc,IAAI,SAAS;AACjD,0BAAoB,EAAE,OAAO,cAAc,QAAQ,cAAc,CAAC;AAGlE,YAAMC,YAAW,KAAK;AAAA,QACpB,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAEA,sBAAgB;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,KAAK,IAAIA,WAAU,GAAG;AAAA,QAC7B,UAAU;AAAA,MACZ,CAAC;AAED,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkB,YAAY,MAAM;AACxC,UAAM,SAAS,UAAU;AACzB,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAa;AAEvC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AAGV,WAAO,QAAQ;AACf,WAAO,SAAS;AAGhB,QAAI,UAAU,GAAG,GAAG,WAAW,SAAS;AAGxC,QAAI,KAAK;AAGT,QAAI,UAAU,YAAY,GAAG,YAAY,CAAC;AAC1C,QAAI,OAAQ,aAAa,WAAW,KAAK,KAAM,GAAG;AAClD,QAAI,MAAM,aAAa,OAAO,aAAa,KAAK;AAChD,QAAI,UAAU,CAAC,MAAM,eAAe,IAAI,aAAa,GAAG,CAAC,MAAM,gBAAgB,IAAI,aAAa,CAAC;AAGjG,QAAI,UAAU,OAAO,GAAG,GAAG,MAAM,cAAc,MAAM,aAAa;AAGlE,QAAI,QAAQ;AAGZ,QAAI,KAAK;AACT,QAAI,2BAA2B;AAC/B,QAAI,UAAU;AACd,QAAI,IAAI,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,GAAG,KAAK,KAAK,CAAC;AACnE,QAAI,KAAK;AACT,QAAI,QAAQ;AAAA,EACd,GAAG,CAAC,cAAc,WAAW,CAAC;AAG9B,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,kBAAkB,YAAY,CAAC,MAAwB;AAC3D,kBAAc,IAAI;AAClB,iBAAa,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,YAAY,CAAC,MAAwB;AAC3D,QAAI,CAAC,WAAY;AAEjB,UAAM,SAAS,EAAE,UAAU,UAAU;AACrC,UAAM,SAAS,EAAE,UAAU,UAAU;AAErC,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,MAC1B,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,IAC5B,EAAE;AAEF,iBAAa,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC7C,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,QAAM,gBAAgB,YAAY,MAAM;AACtC,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,MAAM;AACpC,gBAAY,EAAE;AACd,mBAAe,KAAK;AACpB,oBAAgB,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;AACrD,YAAQ;AAAA,EACV,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,aAAa,YAAY,MAAM;AACnC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,OAAO,CAAC,MAAO;AAGpB,WAAO,QAAQ;AACf,WAAO,SAAS;AAGhB,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,aAAa,WAAW;AAG3C,QAAI,KAAK;AAGT,QAAI,UAAU;AACd,QAAI,IAAI,cAAc,GAAG,cAAc,GAAG,cAAc,GAAG,GAAG,KAAK,KAAK,CAAC;AACzE,QAAI,KAAK;AAGT,UAAM,QAAQ,cAAc;AAC5B,QAAI,UAAU,cAAc,GAAG,cAAc,CAAC;AAC9C,QAAI,OAAQ,aAAa,WAAW,KAAK,KAAM,GAAG;AAClD,QAAI,MAAM,aAAa,QAAQ,OAAO,aAAa,QAAQ,KAAK;AAChE,QAAI;AAAA,MACF,CAAC,MAAM,eAAe,IAAI,aAAa,IAAI;AAAA,MAC3C,CAAC,MAAM,gBAAgB,IAAI,aAAa,IAAI;AAAA,IAC9C;AAGA,QAAI,UAAU,OAAO,GAAG,GAAG,MAAM,cAAc,MAAM,aAAa;AAGlE,QAAI,QAAQ;AAGZ,UAAM,iBAAiB,OAAO,UAAU,cAAc,IAAI;AAC1D,WAAO,cAAc;AACrB,gBAAY;AAAA,EACd,GAAG,CAAC,cAAc,QAAQ,WAAW,CAAC;AAEtC,QAAM,oBAAoB,YAAY,CAAC,UAAkB;AACvD,UAAMA,YAAW,KAAK;AAAA,MACpB,YAAY,iBAAiB;AAAA,MAC7B,YAAY,iBAAiB;AAAA,IAC/B;AACA,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,OAAO,KAAK,IAAI,OAAOA,SAAQ;AAAA,IACjC,EAAE;AAAA,EACJ,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,iBAAiB,YAAY,CAAC,cAAgC;AAClE,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,UAAU,KAAK,YAAY,cAAc,SAAS,MAAM;AAAA,IAC1D,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,KAAK;AAAA,IACpB,YAAY,KAAK,IAAI,iBAAiB,OAAO,CAAC;AAAA,IAC9C,YAAY,KAAK,IAAI,iBAAiB,QAAQ,CAAC;AAAA,EACjD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,UAAS;AAAA,MACT,WAAS;AAAA,MACT,YAAY;AAAA,QACV,IAAI,EAAE,cAAc,EAAE;AAAA,MACxB;AAAA,MAEA;AAAA,6BAAC,eAAY,IAAI,EAAE,IAAI,EAAE,GACvB;AAAA,8BAAC,cAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAAG,wCAElD;AAAA,UACA,oBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB,yEAEnD;AAAA,WACF;AAAA,QAEA,oBAAC,iBACE,sBACC,iCAEE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,OAAO,EAAE,SAAS,OAAO;AAAA,cACzB,QAAQ;AAAA;AAAA,UACV;AAAA,UAEC,cACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,GAEhF;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,gBACX,IAAI;AAAA,kBACF,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,QAAQ,aAAa,aAAa;AAAA,kBAClC,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,WAAW;AAAA,oBACT,WAAW;AAAA,oBACX,WAAW;AAAA,kBACb;AAAA,kBACA,YAAY;AAAA,gBACd;AAAA,gBACA,aAAa;AAAA,gBACb,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,cAAc;AAAA,gBAEd;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,OAAO;AAAA,wBACL,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,SAAS;AAAA,sBACX;AAAA;AAAA,kBACF;AAAA,kBAGC,CAAC,cACA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,eAAe;AAAA,wBACf,SAAS;AAAA,sBACX;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YAEJ;AAAA,YAGA,qBAAC,OAAI,IAAI,EAAE,OAAO,QAAQ,UAAU,IAAI,GAEtC;AAAA,mCAAC,OAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,qCAAC,cAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG;AAAA;AAAA,kBAChD,KAAK,MAAM,aAAa,QAAQ,GAAG;AAAA,kBAAE;AAAA,mBACjD;AAAA,gBACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM,kBAAkB,aAAa,QAAQ,GAAG;AAAA,sBACzD,UAAU,aAAa,SAAS;AAAA,sBAChC,MAAK;AAAA,sBAEL,8BAAC,eAAY;AAAA;AAAA,kBACf;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,aAAa;AAAA,sBACpB,UAAU,CAAC,GAAG,UAAU,kBAAkB,KAAe;AAAA,sBACzD,KAAK;AAAA,sBACL,KAAK;AAAA,sBACL,MAAM;AAAA,sBACN,IAAI,EAAE,MAAM,EAAE;AAAA;AAAA,kBAChB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS,MAAM,kBAAkB,aAAa,QAAQ,GAAG;AAAA,sBACzD,UAAU,aAAa,SAAS;AAAA,sBAChC,MAAK;AAAA,sBAEL,8BAAC,cAAW;AAAA;AAAA,kBACd;AAAA,mBACF;AAAA,iBACF;AAAA,cAGA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,KAAK,GAAG,IAAI,EAAE,GAClE;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,WAAW,oBAAC,kBAAe;AAAA,oBAC3B,SAAS,MAAM,eAAe,MAAM;AAAA,oBACpC,MAAK;AAAA,oBACN;AAAA;AAAA,gBAED;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,WAAW,oBAAC,mBAAgB;AAAA,oBAC5B,SAAS,MAAM,eAAe,OAAO;AAAA,oBACrC,MAAK;AAAA,oBACN;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cAEA,qBAAC,SAAM,UAAS,QAAO,IAAI,EAAE,cAAc,EAAE,GAC3C;AAAA,oCAAC,cAAW,SAAQ,SAClB,8BAAC,YAAO,iCAAY,GACtB;AAAA,gBACA,qBAAC,cAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,IAAI,GAAG;AAAA;AAAA,kBACzC,oBAAC,YAAO,kBAAI;AAAA,kBAAS;AAAA,kBAA2B,oBAAC,QAAE;AAAA,kBAAE;AAAA,kBACrD,oBAAC,YAAO,kBAAI;AAAA,kBAAS;AAAA,kBAA2B,oBAAC,QAAE;AAAA,kBAAE;AAAA,kBACrD,oBAAC,YAAO,oBAAM;AAAA,kBAAS;AAAA,kBAA0B,oBAAC,QAAE;AAAA,kBAAE;AAAA,kBACjC,qBAAC,YAAQ;AAAA;AAAA,oBAAY;AAAA,oBAAE;AAAA,oBAAY;AAAA,qBAAE;AAAA,kBAAS;AAAA,mBACvE;AAAA,iBACF;AAAA,eACF;AAAA,aACF,IAEA,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,IAAI,EAAE,GAC1D,8BAAC,cAAW,8BAAgB,GAC9B;AAAA,WAEJ,GAEJ;AAAA,QAEA,qBAAC,iBAAc,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAChC;AAAA,8BAAC,UAAO,SAAS,aAAa,OAAM,aAAY,oBAEhD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,SAAQ;AAAA,cACR,UAAU,CAAC;AAAA,cACX,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,YAAY;AAAA,cACd;AAAA,cACD;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;;;ADnEX,qBAAAC,WACE,OAAAC,MAyDI,QAAAC,aA1DN;AA9SH,IAAM,mBAAoD,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,cAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAC3D,QAAM,CAAC,qBAAqB,sBAAsB,IAAIC,UAAS,CAAC;AAChE,QAAM,aAAa,WAAW,IAAI;AAClC,QAAM,mBAAmB,WAAW,EAAE,eAAe,UAAU,KAAK,MAAM,UAAU,UAAU,IAAI,EAAE,eAAe,OAAO,KAAK,MAAM,UAAU,UAAU;AACzJ,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAwB,IAAI;AAClF,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AACvE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAsB,IAAI;AAE5E,QAAM,kBAAkB;AAAA,IACtB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,IACtC,EAAE,OAAO,gBAAgB,OAAO,UAAU;AAAA,IAC1C,EAAE,OAAO,UAAU,OAAO,UAAU;AAAA,IACpC,EAAE,OAAO,gBAAgB,OAAO,UAAU;AAAA,IAC1C,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,IAClC,EAAE,OAAO,SAAS,OAAO,UAAU;AAAA,IACnC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,IACrC,EAAE,OAAO,cAAc,OAAO,UAAU;AAAA,EAC1C;AAEA,QAAM,uBAAuB,CAAC,aAAwC;AACpE,0BAAsB;AAAA,MACpB,GAAG;AAAA,MACH,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,MACvB,eAAe;AAAA;AAAA,IACjB,CAAC;AAED,oBAAgB,SAAS,MAAM;AAC/B,0BAAsB,IAAI;AAC1B,2BAAuB,CAAC;AAAA,EAC1B;AAEA,QAAM,mBAAmB,CAAC,SAAiB;AACzC,UAAM,gBAAgB,mBAAmB,gBAAgB;AACzD,QAAI,kBAAkB;AAEtB,YAAQ,KAAK,YAAY,GAAG;AAAA,MAC1B,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB;AAClB;AAAA,IACJ;AAEA,UAAM,gBAAgB,iBAAiB,gBAAgB,SAAS,MAAM;AACtE,0BAAsB;AAAA,MACpB,GAAG;AAAA,MACH,cAAc;AAAA,IAChB,CAAC;AAGD,UAAM,UAAU,QAAQ,IAAI;AAC5B,oBAAgB,UAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,OAAO,CAAC;AAClD,eAAW,MAAM;AACf,sBAAgB,UAAQ;AACtB,cAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,eAAO,OAAO,OAAO;AACrB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,GAAG,GAAI;AAGP,QAAI,cAAc;AAChB,mBAAa,UAAU,IAAI,+BAA+B,SAAS;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,0BAA0B,CAAC,sBAA+B;AAC9D,UAAM,eAAe,qBAAqB,mBAAmB;AAE7D,QAAI,CAAC,cAAc;AACjB,kBAAY,KAAK,gCAAgC;AACjD;AAAA,IACF;AAEA,2BAAuB,YAAY;AACnC,wBAAoB,IAAI;AAAA,EAC1B;AAEA,QAAM,oBAAoB,CAAC,MAA2C;AACpE,UAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAI,CAAC,KAAM;AAGX,QAAI,CAAC,KAAK,KAAK,MAAM,yBAAyB,GAAG;AAC/C,UAAI,cAAc;AAChB,qBAAa,0CAA0C,OAAO;AAAA,MAChE;AACA;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,KAAK,OAAO,MAAM;AAChC,UAAI,cAAc;AAChB,qBAAa,2CAA2C,OAAO;AAAA,MACjE;AACA;AAAA,IACF;AAEA,yBAAqB,IAAI;AACzB,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,qBAAqB,CAAC,qBAA6B;AACvD,0BAAsB,gBAAgB;AACtC,oBAAgB,IAAI;AACpB,mBAAe,KAAK;AACpB,yBAAqB,IAAI;AAEzB,QAAI,cAAc;AAChB,mBAAa,gCAAgC,SAAS;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,mBAAe,KAAK;AACpB,yBAAqB,IAAI;AAAA,EAC3B;AAEA,QAAM,2BAA2B,YAAY;AAC3C,QAAI,CAAC,oBAAqB;AAE1B,gBAAY,KAAK,wBAAwB,EAAE,WAAW,oBAAoB,CAAC;AAE3E,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAGvD,YAAM,sBAAsB,OAAc,KAAK,iBAAe,YAAY,SAAS,mBAAmB;AAEtG,UAAI,qBAAqB;AAEvB,cAAM,eAAe,MAAM,yBAAiB,IAAI,gBAAgB,GAAG,UAAU,iBAAiB,YAAY;AAC1G,cAAM,oBAAoB,cAAc,WAAW,CAAC;AAEpD,YAAI,CAAC,kBAAkB,SAAS,mBAAmB,GAAG;AACpD,gBAAM,sBAAsB,CAAC,GAAG,mBAAmB,mBAAmB;AACtE,gBAAM,yBAAiB,IAAI,gBAAgB,GAAG,UAAU;AAAA,YACtD,IAAI;AAAA,YACJ,SAAS;AAAA,UACX,GAAG,YAAY;AACf,sBAAY,KAAK,qDAAqD;AAAA,YACpE,oBAAoB;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF;AAGA,YAAM,yBAAiB,OAAO,gBAAgB,GAAG,UAAU,qBAAqB,YAAY;AAG5F,oBAAc,SAAS;AAAA,QACrB,iBAAiB,gBAAgB,OAAO,WAAS,MAAM,SAAS,mBAAmB;AAAA,MACrF,CAAC;AAGD,YAAM,kBAAkB,gBAAgB,OAAO,WAAS,MAAM,SAAS,mBAAmB;AAC1F,YAAM,aAAa,gBAAgB,SAAS,IAAI,gBAAgB,CAAC,IAAI;AAErE,UAAI,YAAY;AACd,yBAAiB,WAAW,IAAI;AAChC,8BAAsB;AAAA,UACpB,eAAe,WAAW;AAAA,UAC1B,MAAM,WAAW;AAAA,UACjB,SAAS,WAAW,WAAW;AAAA,UAC/B,cAAc,WAAW,gBAAgB;AAAA,QAC3C,CAAC;AACD,8BAAsB,WAAW,gBAAgB,IAAI;AACrD,wBAAgB,IAAI;AAAA,MACtB,OAAO;AAEL,yBAAiB,EAAE;AACnB,8BAAsB;AAAA,UACpB,eAAe;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AACD,8BAAsB,IAAI;AAC1B,wBAAgB,IAAI;AAAA,MACtB;AAEA,kBAAY,KAAK,yCAAoC;AAGrD,UAAI,cAAc;AAChB,qBAAa,gBAAgB,mBAAmB,2BAA2B,SAAS;AAAA,MACtF;AAAA,IAEF,SAAS,OAAO;AACd,kBAAY,MAAM,gCAAgC,EAAE,MAAM,CAAC;AAG3D,UAAI,cAAc;AAChB,qBAAa,mDAAmD,OAAO;AAAA,MACzE;AAAA,IACF,UAAE;AACA,0BAAoB,KAAK;AACzB,6BAAuB,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,qBAAqB,MACzB,gBAAAC,MAAAC,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,UACN,oBAAoB;AAAA,YAClB,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,YACA,OAAO;AAAA,cACL,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,YACA,QAAQ;AAAA,cACN,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,gBAAAF,MAACG,MAAA,EAAI,IAAI;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA;AAAA,MAEpB,gBAAgB;AAAA;AAAA,MAChB,wBAAwB;AAAA,QACtB,SAAS;AAAA;AAAA,MACX;AAAA,MACA,sBAAsB;AAAA;AAAA,IACxB,GACA;AAAA,sBAAAH,MAACG,MAAA,EAAI,IAAI;AAAA,QACP,SAAS;AAAA,QACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,QACzC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,QAC7C,gBAAgB;AAAA,QAChB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,QACnB,UAAU;AAAA,QACV,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MACxB,GACE;AAAA,wBAAAH,MAACG,MAAA,EAAI,IAAI;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,UACxB,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,QAClC,GACE;AAAA,0BAAAD,KAACC,MAAA,EAAI,IAAI;AAAA,YACP,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,GAAG,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,YACrB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,UAAU,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,YACnC,QAAQ,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,YACjC,WAAW;AAAA,UACb,GACE,0BAAAD,KAAC,4BAAyB,IAAI,EAAE,UAAU,EAAE,IAAI,UAAU,IAAI,SAAS,GAAG,OAAO,eAAe,GAAG,GACrG;AAAA,UACA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,QAAQ,IAAI,UAAU,GAAG,MAAM,EAAE,GAC3D;AAAA,4BAAAD;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI;AAAA,kBACF,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,sBAAsB;AAAA,kBACtB,qBAAqB;AAAA,kBACrB,IAAI;AAAA,kBACJ,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,gBAC3C;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI,EAAE,OAAO,kBAAkB,YAAY,KAAK,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE;AAAA,gBAC3F;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF;AAAA,QACA,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,WAAW,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,YAC9C;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEA,gBAAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,UAAS;AAAA,UACT,IAAI;AAAA,YACF,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACrB,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACrB,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI;AAAA,YACxB,oBAAoB;AAAA,cAClB,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA,MAAM,gBAAAH,KAACE,aAAA,EAAW,IAAI,EAAE,UAAU,SAAS,GAAG,uBAAE;AAAA,UAEhD,0BAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,IAAI,GAC5D;AAAA,4BAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE,GAAG,wDAEvH;AAAA,YACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,kBAAkB,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,GAAG,YAAY,IAAI,GAAG,yKAGzH;AAAA,aACF;AAAA;AAAA,MACF;AAAA,MAGA,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,YACF,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,YACnB,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAW;AAAA,cACT,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,YACA,aAAa;AAAA,cACX,SAAS;AAAA,cACT,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA,SAAS,MAAM;AACb,kCAAsB;AAAA,cACpB,MAAM;AAAA,cACN,SAAS;AAAA,cACT,cAAc;AAAA,cACd,eAAe;AAAA,YACjB,CAAC;AACD,kCAAsB,IAAI;AAC1B,4BAAgB,IAAI;AACpB,mCAAuB,CAAC;AAAA,UAC1B;AAAA,UAEA,0BAAAF,MAAC,eAAY,IAAI;AAAA,YACf,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,YAClB,OAAO;AAAA,YACP,WAAW;AAAA,YACX,UAAU;AAAA,YACV,QAAQ;AAAA,UACV,GACE;AAAA,4BAAAE,KAACC,MAAA,EAAI,IAAI;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACvB,GACE,0BAAAD,KAAC,mBAAgB,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,OAAO,gBAAgB,QAAQ,2CAA2C,GAAG,GACpI;AAAA,YACA,gBAAAA;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI;AAAA,kBACF,YAAY;AAAA,kBACZ,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,kBACtB,YAAY;AAAA,gBACd;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,aACF;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAF,KAACC,MAAA,EAAI,IAAI;AAAA,QACP,SAAS;AAAA,QACT,qBAAqB;AAAA,UACnB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE;AAAA,QAC7B,YAAY;AAAA,MACd,GACG,0BAAgB,IAAI,CAAC,UAAU,UAC9B,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI;AAAA,YACF,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,cAAc;AAAA,YACd,WAAW,EAAE,IAAI,QAAQ,IAAI,QAAQ;AAAA,YACrC,SAAS;AAAA,YACT,eAAe;AAAA,YACf,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,aAAa;AAAA,cACX,SAAS;AAAA,cACT,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,YAAY;AAAA,wBACH,QAAQ,KAAM,GAAG;AAAA,yBACjB,QAAQ,KAAK,MAAM,GAAG;AAAA,cAC/B,SAAS;AAAA,cACT,YAAY;AAAA,YACd;AAAA,YACA,WAAW;AAAA,cACT,WAAW;AAAA,cACX,WAAW;AAAA,cACX,aAAa;AAAA,cACb,aAAa;AAAA,gBACX,SAAS;AAAA,cACX;AAAA,cACA,oBAAoB;AAAA,gBAClB,WAAW;AAAA,cACb;AAAA,cACA,oBAAoB;AAAA,gBAClB,WAAW;AAAA,gBACX,WAAW;AAAA,cACb;AAAA,YACF;AAAA,YACA,YAAY;AAAA,cACV,WAAW;AAAA,YACb;AAAA,UACF;AAAA,UACA,SAAS,MAAM,qBAAqB,QAAQ;AAAA,UAE5C,0BAAAF,MAAC,eAAY,IAAI;AAAA,YACf,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACpB,SAAS;AAAA,YACT,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB,GAEE;AAAA,4BAAAA,MAACG,MAAA,EACC;AAAA,8BAAAH,MAACG,MAAA,EAAI,IAAI;AAAA,gBACP,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,gBACrB,WAAW,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,cACtC,GACE;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,SAAS;AAAA,oBACd,KAAK,SAAS;AAAA,oBACd,IAAI;AAAA,sBACF,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,sBAChC,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,sBACjC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,sBACrB,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,QAAQ;AAAA,oBACV;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,GAClC;AAAA,kCAAAD;AAAA,oBAACE;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI;AAAA,wBACF,YAAY;AAAA,wBACZ,UAAU,EAAE,IAAI,QAAQ,IAAI,WAAW,IAAI,SAAS;AAAA,wBACpD,YAAY;AAAA,wBACZ,IAAI;AAAA,wBACJ,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,iBAAiB;AAAA,wBACjB,UAAU;AAAA,sBACZ;AAAA,sBAEC,mBAAS;AAAA;AAAA,kBACZ;AAAA,kBACA,gBAAAF;AAAA,oBAACE;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI;AAAA,wBACF,OAAO;AAAA,wBACP,WAAW;AAAA,wBACX,UAAU,EAAE,IAAI,WAAW,IAAI,WAAW,IAAI,SAAS;AAAA,wBACvD,YAAY;AAAA,wBACZ,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,iBAAiB;AAAA,wBACjB,UAAU;AAAA,sBACZ;AAAA,sBAEC,mBAAS;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,iBACF;AAAA,cAGA,gBAAAF;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,IAAI;AAAA,oBACF,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,UAAU,EAAE,IAAI,WAAW,IAAI,WAAW,IAAI,WAAW;AAAA,oBACzD,SAAS;AAAA,oBACT,iBAAiB;AAAA,oBACjB,iBAAiB;AAAA,oBACjB,UAAU;AAAA,oBACV,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,oBACrB,WAAW,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,kBACtC;AAAA,kBAEC,mBAAS;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,YAGA,gBAAAF,KAACC,MAAA,EAAI,IAAI;AAAA,cACP,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd,GACE,0BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,MAAM,gBAAAA,KAAC,wBAAqB,IAAI,EAAE,OAAO,WAAW,UAAU,kBAAkB,GAAG;AAAA,gBACnF,IAAI;AAAA,kBACF,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,kBACzC,QAAQ,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,kBACjC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,kBACrB,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,WAAW;AAAA,oBACT,YAAY;AAAA,kBACd;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,aACF;AAAA;AAAA,QA3JK;AAAA,MA4JP,CACD,GACH;AAAA,MAEA,gBAAAF;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,UAAS;AAAA,UACT,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,cAAc,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE;AAAA,UACjG,MAAM,gBAAAH,KAACE,aAAA,EAAW,uBAAE;AAAA,UAEpB;AAAA,4BAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE,GAAG,sBAEhG;AAAA,YACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,GAAG,YAAY,IAAI,GAAG,oKAEhG;AAAA;AAAA;AAAA,MACF;AAAA,OACA;AAAA,KACF;AAGF,QAAM,sBAAsB,MAC1B,gBAAAJ,MAACG,MAAA,EAAI,IAAI;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA;AAAA,IAEpB,gBAAgB;AAAA;AAAA,IAChB,wBAAwB;AAAA,MACtB,SAAS;AAAA;AAAA,IACX;AAAA,IACA,sBAAsB;AAAA;AAAA,EACxB,GACE;AAAA,oBAAAH,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GAChC;AAAA,sBAAAD;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI;AAAA,YACF,YAAY;AAAA,YACZ,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS;AAAA,UAC1C;AAAA,UAEC,6BAAmB,gBAAgB,qBAAqB;AAAA;AAAA,MAC3D;AAAA,MAEA,gBAAAF;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,OAAO,kBAAkB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,UAE7G,6BAAmB,gBAChB,6BAA6B,mBAAmB,aAAa,6CAC7D;AAAA;AAAA,MAEN;AAAA,MAEC,CAAC,mBAAmB,iBACnB,gBAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,UAAS;AAAA,UACT,IAAI;AAAA,YACF,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACrB,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACrB,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI;AAAA,UAC1B;AAAA,UACA,MAAM,gBAAAH,KAACE,aAAA,EAAW,IAAI,EAAE,UAAU,SAAS,GAAG,uBAAE;AAAA,UAEhD;AAAA,4BAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE,GAAG,wCAEvH;AAAA,YACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,kBAAkB,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,GAAG,YAAY,IAAI,GAAG,8IAEzH;AAAA;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAEA,gBAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,WAAW,GACvB;AAAA,yBAAmB,iBAClB,gBAAAH,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAI,GAAG,IAAI,EAAE,GAC7D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KACE;AAAA,cACE,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,mBAAmB,aAAa,KAAK;AAAA,gBAC1E,MAAM,mBAAmB;AAAA,gBACzB,cAAc;AAAA,cAChB;AAAA,YACF;AAAA,YAEF,KAAK,mBAAmB;AAAA,YACxB,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,QAAQ,kBAAkB;AAAA;AAAA,QAChE;AAAA,QACA,gBAAAA,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAI,6BAAmB,eAAc;AAAA,SAChH;AAAA,MAGF,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,OAAO,mBAAmB;AAAA,UAC1B,UAAU,CAAC,MAAM;AACf,kBAAM,oBAAoB,EAAE,OAAO;AACnC,gBAAI,mBAAmB;AAErB,oBAAM,oBAAoB,gBAAgB,KAAK,OAAK,EAAE,SAAS,iBAAiB;AAChF,kBAAI,mBAAmB;AACrB,sCAAsB;AAAA,kBACpB,MAAM,kBAAkB;AAAA,kBACxB,SAAS,kBAAkB;AAAA,kBAC3B,cAAc,kBAAkB;AAAA,kBAChC,eAAe;AAAA,gBACjB,CAAC;AACD,sCAAsB,kBAAkB,gBAAgB,IAAI;AAC5D,gCAAgB,IAAI;AAAA,cACtB;AAAA,YACF,OAAO;AAEL,oCAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,eAAe;AAAA,cACjB,CAAC;AACD,oCAAsB,IAAI;AAC1B,8BAAgB,IAAI;AAAA,YACtB;AACA,6BAAiB,iBAAiB;AAAA,UACpC;AAAA,UACA,WAAS;AAAA,UACT,QAAM;AAAA,UACN,IAAI,EAAE,IAAI,WAAW;AAAA,UAErB;AAAA,4BAAAE,KAAC,YAAS,OAAM,IAAG,oCAAsB;AAAA,YACxC,gBAAgB,IAAI,CAAC,OAAO,UAC3B,gBAAAA,KAAC,YAAqB,OAAO,MAAM,MAChC,gBAAM,QADM,KAEf,CACD;AAAA;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,OAAO,mBAAmB;AAAA,QAC1B,UAAU,CAAC,MACT,sBAAsB,EAAE,GAAG,oBAAoB,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,QAEvE,WAAS;AAAA,QACT,aAAY;AAAA,QACZ,IAAI,EAAE,IAAI,WAAW;AAAA;AAAA,IACvB;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,OAAO,mBAAmB;AAAA,QAC1B,UAAU,CAAC,MACT,sBAAsB,EAAE,GAAG,oBAAoB,SAAS,EAAE,OAAO,MAAM,CAAC;AAAA,QAE1E,WAAS;AAAA,QACT,aAAY;AAAA,QACZ,IAAI,EAAE,IAAI,WAAW;AAAA;AAAA,IACvB;AAAA,IAEA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,WAAW,GACxB;AAAA,sBAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,gCAEnF;AAAA,MACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,OAAO,iBAAiB,GAAG,iGAEpE;AAAA,MACA,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,IAAI,EAAE,GACzD,0BAAgB,IAAI,CAAC,SACpB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,KAAK;AAAA,UACZ,SAAS,MAAM,iBAAiB,KAAK,KAAK;AAAA,UAC1C,IAAI;AAAA,YACF,SAAS,KAAK,QAAQ;AAAA,YACtB,OAAO,KAAK;AAAA,YACZ,QAAQ,aAAa,KAAK,KAAK;AAAA,YAC/B,WAAW;AAAA,cACT,SAAS,KAAK,QAAQ;AAAA,cACtB,WAAW;AAAA,YACb;AAAA,YACA,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,GAAI,aAAa,IAAI,QAAQ,KAAK,KAAK,EAAE,KAAK;AAAA,cAC5C,WAAW;AAAA,cACX,SAAS,KAAK,QAAQ;AAAA,cACtB,WAAW,YAAY,KAAK,KAAK;AAAA,YACnC;AAAA,UACF;AAAA;AAAA,QAlBK,KAAK;AAAA,MAmBZ,CACD,GACH;AAAA,OACF;AAAA,IAGA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,WAAW,GACxB;AAAA,sBAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,oCAEnF;AAAA,MACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,OAAO,iBAAiB,GAAG,iFAEpE;AAAA,MACA,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,IAAI,EAAE,GACzD;AAAA,QACC,EAAE,OAAO,eAAe,MAAM,sDAAsD,OAAO,UAAU;AAAA,QACrG,EAAE,OAAO,qBAAqB,MAAM,uEAAuE,OAAO,UAAU;AAAA,QAC5H,EAAE,OAAO,iBAAiB,MAAM,gFAAgF,OAAO,UAAU;AAAA,QACjI,EAAE,OAAO,cAAc,MAAM,oEAAoE,OAAO,UAAU;AAAA,QAClH,EAAE,OAAO,gBAAgB,MAAM,0EAA0E,OAAO,UAAU;AAAA,QAC1H,EAAE,OAAO,cAAc,MAAM,kEAAkE,OAAO,UAAU;AAAA,MAClH,EAAE,IAAI,CAAC,QACL,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,IAAI;AAAA,UACX,SAAS,MAAM;AACb,kBAAM,gBAAgB,mBAAmB,gBAAgB;AACzD,kBAAM,gBAAgB,iBAAiB,gBAAgB,SAAS,MAAM,IAAI;AAC1E,kCAAsB;AAAA,cACpB,GAAG;AAAA,cACH,cAAc;AAAA,YAChB,CAAC;AAGD,kBAAM,UAAU,OAAO,IAAI,KAAK;AAChC,4BAAgB,UAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,OAAO,CAAC;AAClD,uBAAW,MAAM;AACf,8BAAgB,UAAQ;AACtB,sBAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,uBAAO,OAAO,OAAO;AACrB,uBAAO;AAAA,cACT,CAAC;AAAA,YACH,GAAG,GAAI;AAGP,gBAAI,cAAc;AAChB,2BAAa,UAAU,IAAI,KAAK,yBAAyB,SAAS;AAAA,YACpE;AAAA,UACF;AAAA,UACA,IAAI;AAAA,YACF,SAAS,IAAI,QAAQ;AAAA,YACrB,OAAO,IAAI;AAAA,YACX,QAAQ,aAAa,IAAI,KAAK;AAAA,YAC9B,WAAW;AAAA,cACT,SAAS,IAAI,QAAQ;AAAA,cACrB,WAAW;AAAA,YACb;AAAA,YACA,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,GAAI,aAAa,IAAI,OAAO,IAAI,KAAK,EAAE,KAAK;AAAA,cAC1C,WAAW;AAAA,cACX,SAAS,IAAI,QAAQ;AAAA,cACrB,WAAW,YAAY,IAAI,KAAK;AAAA,YAClC;AAAA,UACF;AAAA;AAAA,QAzCK,IAAI;AAAA,MA0CX,CACD,GACH;AAAA,OACF;AAAA,IAGA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,WAAW,GACxB;AAAA,sBAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,8BAEnF;AAAA,MACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,OAAO,iBAAiB,GAAG,4EAEpE;AAAA,MACA,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,IAAI,EAAE,GACzD;AAAA,QACC;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF,EAAE,IAAI,CAAC,SACL,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,OACE,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,4BAAAD,KAACE,aAAA,EAAW,WAAU,QAAO,IAAI,EAAE,UAAU,UAAU,GACpD,eAAK,MACR;AAAA,YACA,gBAAAF,KAACE,aAAA,EAAW,WAAU,QAAO,IAAI,EAAE,UAAU,WAAW,GACrD,eAAK,OACR;AAAA,aACF;AAAA,UAEF,SAAS,MAAM;AACb,kBAAM,gBAAgB,mBAAmB,gBAAgB;AACzD,kBAAM,gBAAgB,iBAAiB,gBAAgB,SAAS,MAAM,KAAK;AAC3E,kCAAsB;AAAA,cACpB,GAAG;AAAA,cACH,cAAc;AAAA,YAChB,CAAC;AAGD,kBAAM,UAAU,QAAQ,KAAK,KAAK;AAClC,4BAAgB,UAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,OAAO,CAAC;AAClD,uBAAW,MAAM;AACf,8BAAgB,UAAQ;AACtB,sBAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,uBAAO,OAAO,OAAO;AACrB,uBAAO;AAAA,cACT,CAAC;AAAA,YACH,GAAG,GAAI;AAGP,gBAAI,cAAc;AAChB,2BAAa,UAAU,KAAK,KAAK,gCAAgC,SAAS;AAAA,YAC5E;AAAA,UACF;AAAA,UACA,IAAI;AAAA,YACF,SAAS,KAAK,QAAQ;AAAA,YACtB,OAAO,KAAK;AAAA,YACZ,QAAQ,aAAa,KAAK,KAAK;AAAA,YAC/B,WAAW;AAAA,cACT,SAAS,KAAK,QAAQ;AAAA,cACtB,WAAW;AAAA,YACb;AAAA,YACA,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,oBAAoB;AAAA,cAClB,IAAI;AAAA,YACN;AAAA,YACA,GAAI,aAAa,IAAI,QAAQ,KAAK,KAAK,EAAE,KAAK;AAAA,cAC5C,WAAW;AAAA,cACX,SAAS,KAAK,QAAQ;AAAA,cACtB,WAAW,YAAY,KAAK,KAAK;AAAA,YACnC;AAAA,UACF;AAAA;AAAA,QAtDK,KAAK;AAAA,MAuDZ,CACD,GACH;AAAA,OACF;AAAA,IAEA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,OAAO,mBAAmB;AAAA,QAC1B,UAAU,CAAC,MACT,sBAAsB,EAAE,GAAG,oBAAoB,cAAc,EAAE,OAAO,MAAM,CAAC;AAAA,QAE/E,WAAS;AAAA,QACT,WAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAY;AAAA,QACZ,iBAAiB,EAAE,QAAQ,KAAK;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,YACL,WAAW,WAAW,UAAU;AAAA,YAChC,WAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,IAAI,EAAE,IAAI,EAAE;AAAA;AAAA,IACd;AAAA,IAGA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,sBAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,8BAEnF;AAAA,MACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,OAAO,iBAAiB,GAAG,+FAEpE;AAAA,MAGA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,GAAG,OAAO,gBAAgB,YAAY,KAAK,SAAS,QAAQ,GAAG,0CAEvG;AAAA,MACA,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,GAAG,UAAU,OAAO,GACzD;AAAA,QACC,EAAE,OAAO,UAAU,KAAK,4CAA4C;AAAA,QACpE,EAAE,OAAO,WAAW,KAAK,6CAA6C;AAAA,QACtE,EAAE,OAAO,WAAW,KAAK,6CAA6C;AAAA,MACxE,EAAE,IAAI,CAAC,EAAE,OAAO,IAAI,MAClB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,KAAK;AAAA,UACL,SAAS,MAAM;AACb,4BAAgB,GAAG;AACnB,kCAAsB,IAAI;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,YACF,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ,iBAAiB,MAAM,sBAAsB;AAAA,YACrD,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,WAAW,iBAAiB,MAAM,oCAAoC;AAAA,YACtE,WAAW;AAAA,cACT,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,UACF;AAAA;AAAA,QAnBK;AAAA,MAoBP,CACD,GACH;AAAA,MAGA,gBAAAA,KAACE,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,GAAG,OAAO,kBAAkB,YAAY,KAAK,SAAS,QAAQ,GAAG,+CAEzG;AAAA,MACA,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,GAAG,UAAU,OAAO,GACzD;AAAA,QACC,EAAE,OAAO,yBAAyB,KAAK,kDAAkD,MAAM,sBAAsB;AAAA,QACrH,EAAE,OAAO,kBAAkB,KAAK,kDAAkD,MAAM,uBAAuB;AAAA,QAC/G,EAAE,OAAO,sBAAsB,KAAK,8CAA8C,MAAM,mBAAmB;AAAA,QAC3G,EAAE,OAAO,yBAAyB,KAAK,+CAA+C,MAAM,iBAAiB;AAAA,QAC7G,EAAE,OAAO,oBAAoB,KAAK,8CAA8C,MAAM,yBAAyB;AAAA,QAC/G,EAAE,OAAO,cAAc,KAAK,iDAAiD,MAAM,sBAAsB;AAAA,QACzG,EAAE,OAAO,kBAAkB,KAAK,oDAAoD,MAAM,mBAAmB;AAAA,QAC7G,EAAE,OAAO,iBAAiB,KAAK,6CAA6C,MAAM,qBAAqB;AAAA,MACzG,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,KAAK,MACxB,gBAAAH,MAACG,MAAA,EAAgB,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,IAAI,GAC9F;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,KAAK;AAAA,YACL,SAAS,MAAM;AACb,8BAAgB,GAAG;AACnB,oCAAsB,IAAI;AAAA,YAC5B;AAAA,YACA,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ,iBAAiB,MAAM,sBAAsB;AAAA,cACrD,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,WAAW,iBAAiB,MAAM,oCAAoC;AAAA,cACtE,WAAW;AAAA,gBACT,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,WAAW;AAAA,cACb;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,KAACE,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,UAChC,WAAW;AAAA,UACX,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,UAAU;AAAA,QACZ,GACG,gBACH;AAAA,WAlCQ,KAmCV,CACD,GACH;AAAA,MAGA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,GAAG,OAAO,gBAAgB,YAAY,KAAK,SAAS,QAAQ,GAAG,qCAEvG;AAAA,MACA,gBAAAJ;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,WAAU;AAAA,UACV,IAAI;AAAA,YACF,IAAI;AAAA,YACJ,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACrB,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,YACvB,cAAc;AAAA,YACd,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,cACT,aAAa;AAAA,cACb,aAAa;AAAA,YACf;AAAA,YACA,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,UAClC;AAAA,UACD;AAAA;AAAA,YAEC,gBAAAJ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,QAAM;AAAA,gBACN,UAAU;AAAA;AAAA,YACZ;AAAA;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAA,KAACE,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,GAAG,UAAU,SAAS,GAAG,6HAEtF;AAAA,OAEE,sBAAsB,iBACtB,gBAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC9D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAM,sBAAsB;AAAA,YAC5B,KAAI;AAAA,YACJ,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,WAAW;AAAA,YACb;AAAA;AAAA,QACF;AAAA,QACA,gBAAAF,MAACG,MAAA,EACC;AAAA,0BAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,iCAE5E;AAAA,UACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC,+BAAqB,0BAA0B,gCAClD;AAAA,WACF;AAAA,SACF;AAAA,MAIF,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IAEA,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,UACzC,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,UACtB,gBAAgB;AAAA;AAAA,UAChB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;AAAA;AAAA,UACpB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA;AAAA,QACrB;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,SAAS;AAAA,cACT,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,cACzC;AAAA;AAAA,UAED;AAAA,UACA,gBAAAJ;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,SAAS;AAAA,cACT,UAAU,CAAC,mBAAmB,QAAQ,CAAC,mBAAmB;AAAA,cAC1D,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,cACzC;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAGF,QAAM,kBAAkB,MACtB,gBAAAN,MAACG,MAAA,EAAI,IAAI;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA;AAAA,IAEpB,gBAAgB;AAAA;AAAA,IAChB,wBAAwB;AAAA,MACtB,SAAS;AAAA;AAAA,IACX;AAAA,IACA,sBAAsB;AAAA;AAAA,EACxB,GACE;AAAA,oBAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,UACzC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,UAC7C,gBAAgB;AAAA,UAChB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UACnB,UAAU;AAAA,UACV,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,QACxB;AAAA,QAEA;AAAA,0BAAAH;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU,EAAE;AAAA,cAC1F;AAAA;AAAA,gBAC2B,gBAAgB;AAAA,gBAAO;AAAA;AAAA;AAAA,UACnD;AAAA,UACA,gBAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,QAAQ,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE,GACrG;AAAA,4BAAAD;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,MAAM,WAAW,WAAW;AAAA,gBAC5B,WAAW,gBAAAJ,KAAC,mBAAgB,UAAU,WAAW,UAAU,UAAU;AAAA,gBACrE,SAAS,MAAM;AACb,wCAAsB;AAAA,oBACpB,MAAM;AAAA,oBACN,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,eAAe;AAAA,kBACjB,CAAC;AACD,wCAAsB,IAAI;AAC1B,kCAAgB,IAAI;AACpB,yCAAuB,CAAC;AAAA,gBAC1B;AAAA,gBACA,IAAI;AAAA,kBACF,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,kBACrB,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,kBACtB,YAAY;AAAA,kBACZ,cAAc;AAAA,kBACd,eAAe;AAAA,kBACf,WAAW;AAAA,kBACX,WAAW;AAAA,oBACT,WAAW;AAAA,kBACb;AAAA,kBACA,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,gBAClC;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,SAAS,MAAM,qBAAqB,IAAI;AAAA,gBACxC,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,gBACzC;AAAA;AAAA,YAED;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,gBAAgB,WAAW,IAC1B,gBAAAJ,KAAC,QAAK,IAAI,EAAE,WAAW,UAAU,IAAI,GAAG,QAAQ,cAAc,aAAa,UAAU,GACnF,0BAAAF,MAAC,eACC;AAAA,sBAAAE,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,cAAY,MAAC,4CAEzF;AAAA,MACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAS,MAAC,sGAE7D;AAAA,MACA,gBAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,gBAAgB,UAAU,UAAU,QAAQ,IAAI,EAAE,GACpF;AAAA,wBAAAD;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,MAAM;AACb,oCAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,eAAe;AAAA,cACjB,CAAC;AACD,oCAAsB,IAAI;AAC9B,8BAAgB,IAAI;AACpB,qCAAuB,CAAC;AAAA,YAC1B;AAAA,YACA,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,YAC1F;AAAA;AAAA,QAED;AAAA,QACA,gBAAAJ;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,MAAM,uBAAuB,CAAC;AAAA,YACvC,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,YAC1F;AAAA;AAAA,QAED;AAAA,SACE;AAAA,OACF,GACF,IAEA,gBAAAJ,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GACxE,0BAAgB,IAAI,CAAC,UACtB,gBAAAD,KAAC,QAAsB,IAAI,EAAE,QAAQ,aAAa,aAAa,UAAU,GACvE,0BAAAF,MAAC,eAAY,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GACvC;AAAA,sBAAAA,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GACvE;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,cAAc,KAAK;AAAA,YACxB,KAAK,MAAM;AAAA,YACX,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE;AAAA;AAAA,QACtF;AAAA,QACA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GACjB;AAAA,0BAAAD,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GACtE,gBAAM,MACT;AAAA,UACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,kBAAkB,WAAW,SAAS,GAC5E,gBAAM,SACT;AAAA,WACF;AAAA,SACF;AAAA,MAEA,gBAAAF;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI;AAAA,YACF,OAAO;AAAA,YACP,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,UAAU;AAAA,UACZ;AAAA,UAEC,gBAAM;AAAA;AAAA,MACT;AAAA,MAEA,gBAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,GACjC;AAAA,wBAAAD;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,MAAM;AACb,oCAAsB;AAAA,gBACpB,MAAM,MAAM;AAAA,gBACZ,SAAS,MAAM;AAAA,gBACf,cAAc,MAAM;AAAA,gBACpB,eAAe,MAAM;AAAA,cACvB,CAAC;AACD,oCAAsB,MAAM,gBAAgB,IAAI;AAChD,8BAAgB,IAAI;AACpB,qCAAuB,CAAC;AAAA,YAC1B;AAAA,YACA,IAAI,EAAE,MAAM,EAAE;AAAA,YACf;AAAA;AAAA,QAED;AAAA,QACA,gBAAAJ;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,MAAM,wBAAwB,MAAM,IAAI;AAAA,YACjD,IAAI,EAAE,MAAM,EAAE;AAAA,YACf;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF,KA5DS,MAAM,IA6DjB,CACD,GACD;AAAA,IAGF,gBAAAN,MAACO,SAAA,EAAO,MAAM,mBAAmB,SAAS,MAAM,qBAAqB,KAAK,GACxE;AAAA,sBAAAL,KAACM,cAAA,EAAY,4CAA8B;AAAA,MAC3C,gBAAAN,KAACO,gBAAA,EACC,0BAAAP,KAAC,qBAAkB,gGAEnB,GACF;AAAA,MACA,gBAAAF,MAACU,gBAAA,EACC;AAAA,wBAAAR,KAACI,SAAA,EAAO,SAAS,MAAM,qBAAqB,KAAK,GAAG,OAAM,WAAU,oBAEpE;AAAA,QACA,gBAAAJ;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAS,YAAY;AACnB,4BAAc,SAAS,EAAE,gBAAgB,KAAK,CAAC;AAE/C,kBAAI;AACF,8BAAc,SAAS,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC9C,iCAAiB,EAAE;AACnB,sCAAsB;AAAA,kBACpB,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,eAAe;AAAA,gBACjB,CAAC;AACD,gCAAgB,IAAI;AACpB,sCAAsB,IAAI;AAC1B,sBAAM,8BAA8B;AACpC,qCAAqB,KAAK;AAAA,cAC5B,SAAS,OAAO;AACd,4BAAY,MAAM,8BAA8B,EAAE,MAAM,CAAC;AACzD,qCAAqB,KAAK;AAAA,cAC5B,UAAE;AACA,8BAAc,SAAS,EAAE,gBAAgB,MAAM,CAAC;AAAA,cAClD;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,WAAS;AAAA,YACV;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAN,MAACO,SAAA,EAAO,MAAM,kBAAkB,SAAS,MAAM,oBAAoB,KAAK,GACtE;AAAA,sBAAAL,KAACM,cAAA,EAAY,iCAAmB;AAAA,MAChC,gBAAAR,MAACS,gBAAA,EACE;AAAA,+BACC,gBAAAT,MAACG,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAI,EAAE,GACtD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,gBACH,gBAAgB,KAAK,OAAK,EAAE,SAAS,mBAAmB,KAAK;AAAA,kBAC3D,MAAM;AAAA,kBACN,cAAc;AAAA,gBAChB;AAAA,cACF;AAAA,cACA,KAAK;AAAA,cACL,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,IAAI,EAAE;AAAA;AAAA,UACrC;AAAA,UACA,gBAAAF,MAACG,MAAA,EACC;AAAA,4BAAAD,KAACE,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAC5C,+BACH;AAAA,YACA,gBAAAF,KAACE,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,0BAAgB,KAAK,OAAK,EAAE,SAAS,mBAAmB,GAAG,WAAW,sBACzE;AAAA,aACF;AAAA,WACF;AAAA,QAEF,gBAAAF,KAAC,qBAAkB,6FAEnB;AAAA,SACF;AAAA,MACA,gBAAAF,MAACU,gBAAA,EACC;AAAA,wBAAAR,KAACI,SAAA,EAAO,SAAS,MAAM,oBAAoB,KAAK,GAAG,OAAM,WAAU,oBAEnE;AAAA,QACA,gBAAAJ;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,WAAS;AAAA,YACV;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAGF,SACE,gBAAAN,MAACG,MAAA,EAAI,IAAI,EAAE,QAAQ,QAAQ,SAAS,QAAQ,eAAe,SAAS,GAClE;AAAA,oBAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,UACzC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,UAC7C,gBAAgB;AAAA,UAChB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,UACnB,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,QACxB;AAAA,QAEA;AAAA,0BAAAH,MAACG,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,QAAQ,IAAI,UAAU,EAAE,GAClD;AAAA,4BAAAD;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,gBAAgB,UAAU,EAAE,IAAI,UAAU,IAAI,SAAS,EAAE;AAAA,gBAC/F;AAAA;AAAA,YAED;AAAA,YACA,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI,EAAE,OAAO,kBAAkB,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,gBACzF;AAAA;AAAA,YAED;AAAA,aACF;AAAA,UAEA,gBAAAF;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,MAAM,WAAW,WAAW;AAAA,cAC5B,WAAW,gBAAAJ,KAAC,mBAAgB,UAAU,WAAW,UAAU,UAAU;AAAA,cACrE,SAAS,MAAM;AACb,sCAAsB;AAAA,kBACpB,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,eAAe;AAAA,gBACjB,CAAC;AACD,sCAAsB,IAAI;AAC1B,gCAAgB,IAAI;AACpB,uCAAuB,CAAC;AAAA,cAC1B;AAAA,cACA,IAAI;AAAA,gBACF,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,gBACrB,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,gBACtB,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,eAAe;AAAA,gBACf,WAAW;AAAA,gBACX,WAAW;AAAA,kBACT,WAAW;AAAA,gBACb;AAAA,gBACA,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,gBAChC,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ;AAAA,cACtC;AAAA,cACD;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA,KAACC,MAAA,EAAI,IAAI,EAAE,cAAc,GAAG,aAAa,WAAW,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GACzE,0BAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,GAAG,aAAa,uBAAuB,QAAQ;AAAA,QAC1D,SAAS,WAAW,cAAc;AAAA,QAClC,IAAI;AAAA,UACF,kBAAkB;AAAA,YAChB,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO;AAAA,YACtC,UAAU,EAAE,IAAI,QAAQ,IAAI,IAAI;AAAA,YAChC,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,YACvB,GAAI,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;AAAA,UACtC;AAAA,UACA,qBAAqB;AAAA,QACvB;AAAA,QAEA;AAAA,0BAAAE;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,gBAAAA,KAAC,0BAAuB,UAAU,WAAW,UAAU,UAAU;AAAA,cACvE,cAAc,WAAW,QAAQ;AAAA,cACjC,OAAM;AAAA,cACN,IAAI;AAAA,gBACF,OAAO,wBAAwB,IAAI,iBAAiB;AAAA,gBACpD,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK;AAAA,gBACxB,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,cACxB;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,gBAAAA,KAAC,wBAAqB,UAAU,WAAW,UAAU,UAAU;AAAA,cACrE,cAAc,WAAW,QAAQ;AAAA,cACjC,OAAM;AAAA,cACN,IAAI;AAAA,gBACF,OAAO,wBAAwB,IAAI,iBAAiB;AAAA,gBACpD,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK;AAAA,cAC1B;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,gBAAAA,KAAC,8BAA2B,UAAU,WAAW,UAAU,UAAU;AAAA,cAC3E,cAAc,WAAW,QAAQ;AAAA,cACjC,OAAM;AAAA,cACN,IAAI;AAAA,gBACF,OAAO,wBAAwB,IAAI,iBAAiB;AAAA,gBACpD,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK;AAAA,cAC1B;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IAEA,gBAAAF,MAACG,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,SAAS,GACpC;AAAA,8BAAwB,KAAK,mBAAmB;AAAA,MAChD,wBAAwB,KAAK,oBAAoB;AAAA,MACjD,wBAAwB,KAAK,gBAAgB;AAAA,OAChD;AAAA,KACF;AAEJ;AAEA,IAAO,2BAAQ;;;AE5qDf,SAAgB,YAAAQ,WAAU,aAAAC,YAAW,UAAAC,SAAQ,eAAAC,oBAAmB;AAChE;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,OAAO,qBAAqB;AAC5B,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,kBAAkB;AACzB,OAAO,gBAAgB;AACvB,OAAO,iBAAiB;AACxB,OAAO,mBAAmB;AAC1B,OAAO,kBAAkB;AACzB,OAAO,cAAc;AACrB,OAAO,iBAAiB;;;AC1BxB,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,gBAAiC;AAY1C,IAAM,mBAAmB,MAAM;AAC7B,QAAM,WAAW,wBAAwB,CAAC,UAAU,MAAM,QAAQ;AAClE,QAAM,aAAa,UAAU;AAC7B,QAAM,gBAAgB,UAAU;AAEhC,QAAM,UAAU,QAA+B,MAAM;AACnD,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,MACA,MAAM,sBAAsB,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,SAAO,EAAE,SAAS,WAAW;AAC/B;AAEO,IAAM,mBAAmB,CAC9B,YACG;AACH,QAAM,EAAE,SAAS,WAAW,IAAI,iBAAiB;AACjD,QAAM,UAAU,QAAQ,WAAW,UAAU,MAAM,SAAS,WAAW;AAEvE,SAAO,SAAuC;AAAA,IAC5C,GAAG;AAAA,IACH,UAAU,CAAC,WAAW,UAAU,UAAU;AAAA,IAC1C,SAAS,YAAY;AACnB,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AACA,aAAO,cAAc,QAAQ,UAAU,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,IAAM,mBAAmB,CAC9B,YACG;AACH,QAAM,EAAE,SAAS,WAAW,IAAI,iBAAiB;AACjD,QAAM,UAAU,QAAQ,WAAW,UAAU,MAAM,SAAS,WAAW;AAEvE,SAAO,SAAgC;AAAA,IACrC,GAAG;AAAA,IACH,UAAU,CAAC,WAAW,UAAU,UAAU;AAAA,IAC1C,SAAS,YAAY;AACnB,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AACA,aAAO,cAAc,QAAQ,WAAW,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,IAAM,mBAAmB,CAC9B,YACG;AACH,QAAM,EAAE,SAAS,WAAW,IAAI,iBAAiB;AACjD,QAAM,UAAU,QAAQ,WAAW,UAAU,MAAM,SAAS,WAAW;AAEvE,SAAO,SAAuC;AAAA,IAC5C,GAAG;AAAA,IACH,UAAU,CAAC,WAAW,UAAU,UAAU;AAAA,IAC1C,SAAS,YAAY;AACnB,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AACA,aAAO,cAAc,QAAQ,UAAU,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AD+Ce,gBAAAC,MA6BP,QAAAC,aA7BO;AA7Ff,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQC,UAAS;AACvB,QAAM,WAAWC,eAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAA4D,MAAM;AAC5G,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAiB,EAAE;AAC3D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,YAAY,WAAW,EAAE;AAC1E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAuC,MAAM;AACrF,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,QAAM,CAAC,6BAA6B,8BAA8B,IAAIA,UAAS,KAAK;AACpF,QAAM,aAAaC,QAA8B,IAAI;AACrD,QAAM,eAAeA,QAAyB,IAAI;AAGlD,QAAM,EAAE,mBAAmB,mBAAmB,gBAAgB,IAAI,oBAAoB;AAGtF,QAAM,EAAE,oBAAoB,kBAAkB,IAAI,cAAc;AAGhE,QAAM,EAAE,mBAAmB,oBAAoB,IAAI,YAAY;AAE/D,QAAM;AAAA,IACJ,aAAa;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,yBAAyB,CAAC,WAAW;AAAA,IACvC,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,IACd,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,4BAA4B,MAAM;AAAA,IAClC,4BAA4B,MAAM;AAAA,IAClC,uBAAuB,MAAM;AAAA,IAC7B,uBAAuB,MAAM;AAAA,IAC7B,4BAA4B,MAAM;AAAA,IAClC,uBAAuB,MAAM;AAAA,IAC7B,sBAAsB,MAAM;AAAA,IAC5B,wBAAwB,MAAM;AAAA,IAC9B,gBAAgB,MAAM;AAAA,IACtB,iCAAiC,MAAM;AAAA,IACvC,kCAAkC,MAAM;AAAA,IACxC,SAAS,MAAM;AAAA,EACjB,EAAE;AAEF,QAAM,SAAS;AAAA,IACb,WAAW;AAAA,IACX,mBAAmB;AAAA,MACjB,MAAM,EAAE,WAAW,eAAe;AAAA,MAClC,QAAQ,EAAE,WAAW,iBAAiB;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG;AAEH,QAAM,YAAY,MAAM;AACtB,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,eAAO,gBAAAC,KAAC,YAAS,OAAM,WAAU,IAAI,QAAQ,UAAS,SAAQ;AAAA,MAChE,KAAK;AACH,eAAO,gBAAAA,KAAC,iBAAc,OAAM,WAAU,UAAS,SAAQ;AAAA,MACzD,KAAK;AACH,eAAO,gBAAAA,KAAC,aAAU,OAAM,SAAQ,UAAS,SAAQ;AAAA,MACnD,KAAK;AAAA,MACL;AACE,eAAO,gBAAAA,KAAC,gBAAa,OAAM,UAAS,UAAS,SAAQ;AAAA,IACzD;AAAA,EACF,GAAG;AAEH,QAAM,eACJ,2BAA2B,OAC3B,2BAA2B,OAC3B,sBAAsB,OACtB,sBAAsB;AAExB,QAAM,iBACH,WAAW,sBAAsB,UAAU,MAC3C,WAAW,iBAAiB,UAAU;AAEzC,QAAM,kBAAkB,aAAa,IAAI,KAAK,UAAU,EAAE,eAAe,IAAI;AAE7E,QAAM,sBAAsB;AAC5B,QAAM,uBAAuB;AAC7B,QAAM,kBAAkB,CAAC,UAAkB,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAChF,QAAM,mBAAmB,CAAC,YACxB,gBAAAA,KAACC,MAAA,EAAI,WAAU,MAAK,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GACpC,kBAAQ,IAAI,CAAC,WACZ,gBAAAC,MAACD,MAAA,EAAI,WAAU,MAAqB,IAAI,EAAE,IAAI,IAAI,GAChD;AAAA,oBAAAD,KAACG,aAAA,EAAW,WAAU,QAAO,SAAQ,SAAQ,OAAM,gBAC/C,iBAAO,QAAQ,OAAO,KAAK,KAAK,KAAM,yBAC1C;AAAA,IACA,gBAAAH,KAACG,aAAA,EAAW,WAAU,QAAO,SAAQ,SAAQ,OAAM,kBAChD,qBAAM,gBAAgB,OAAO,SAAS,CAAC,MAAM,mBAAmB,OACnE;AAAA,OANuB,OAAO,EAOhC,CACD,GACH;AAGF,QAAM,oBAAoB,QAAQ,iBAAiB,aAAa;AAEhE,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,IAAI,iBAAiB;AAAA,IACnB,SAAS;AAAA,IACT,sBAAsB;AAAA,IACtB,WAAW;AAAA,EACb,CAAC;AAED,QAAM,mBAAmB,wBAAwB;AAEjD,QAAM,mBAAmB,oBACrB,mBACE,mBACA,qBACA,YACA,gBACC,cAAc,QAAQ,YAAY,MAAM,YACvC,WACA,YACF,YACF;AAEJ,QAAM,oBAAiE,MAAM;AAC3E,QAAI,CAAC,kBAAmB,QAAO;AAC/B,QAAI,mBAAoB,QAAO;AAC/B,QAAI,iBAAkB,QAAO;AAC7B,QAAI,CAAC,cAAe,QAAO;AAC3B,WAAQ,cAAc,QAAQ,YAAY,MAAM,YAAa,YAAY;AAAA,EAC3E,GAAG;AAEH,QAAM,6BAA6BC,aAAY,MAAM;AACnD,QAAI,CAAC,mBAAmB;AACtB;AAAA,IACF;AACA,yBAAqB;AAAA,EACvB,GAAG,CAAC,mBAAmB,oBAAoB,CAAC;AAE5C,QAAM,yBAAyB,OAAO,UAA+C;AACnF,UAAM,UAAU,MAAM,OAAO;AAC7B,yBAAqB,IAAI;AACzB,QAAI;AACF,YAAM,eAAe,OAAO;AAC5B,UAAI,cAAc;AAChB;AAAA,UACE,UAAU,8EAA8E;AAAA,UACxF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,cAAc;AAChB,qBAAa,qCAAqC,OAAO;AAAA,MAC3D;AAAA,IACF,UAAE;AACA,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY;AACnC,yBAAqB,IAAI;AACzB,UAAM,QAAQ,EAAE,OAAO,KAAK,CAAC;AAC7B,UAAM,cAAc,yBAAyB,SAAS,EAAE;AACxD,UAAM,UAAU,gBAAgB,SAC5B,iCACA;AACJ,UAAM,WAAW,gBAAgB,SAAS,YAAY;AACtD,QAAI,cAAc;AAChB,mBAAa,SAAS,QAAQ;AAAA,IAChC;AACA,yBAAqB,KAAK;AAAA,EAC5B;AAEA,QAAM,mCAAmC,OAAO,UAA+C;AAC7F,UAAM,UAAU,MAAM,OAAO;AAC7B,mCAA+B,IAAI;AACnC,QAAI;AACF,YAAM,iCAAiC,OAAO;AAC9C,UAAI,cAAc;AAChB;AAAA,UACE,UACI,uDACA;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,cAAc;AAChB,qBAAa,6CAA6C,OAAO;AAAA,MACnE;AAAA,IACF,UAAE;AACA,qCAA+B,KAAK;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,WAAW;AAGjB,QAAM,sBAAsB,MAAM;AAChC,QAAI,YAAY,WAAW,YAAY,QAAQ,KAAK,GAAG;AACrD,aAAO,YAAY;AAAA,IACrB;AACA,WAAO,iBAAiB,WAAW;AAAA,EACrC;AAGA,EAAAC,WAAU,MAAM;AACd,oBAAgB,YAAY,WAAW,EAAE;AAAA,EAC3C,GAAG,CAAC,YAAY,OAAO,CAAC;AAExB,QAAM,yBAAyB,OAAO,QAAgB;AACpD,QAAI,CAAC,IAAI,KAAK,GAAG;AAEf,uBAAiB,OAAO;AACxB,sBAAgB,EAAE;AAClB,uBAAiB,WAAW,EAAE;AAC9B,uBAAiB,QAAQ;AACzB,UAAI;AACF,cAAM,sBAAsB;AAC5B,yBAAiB,OAAO;AACxB,mBAAW,MAAM,iBAAiB,MAAM,GAAG,GAAI;AAAA,MACjD,SAAS,OAAO;AACd,yBAAiB,SAAS;AAC1B,wBAAgB,mCAAmC;AAAA,MACrD;AACA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,GAAG,GAAG;AACtB,uBAAiB,OAAO;AACxB,sBAAgB,EAAE;AAClB,uBAAiB,WAAW,GAAG;AAC/B,uBAAiB,QAAQ;AACzB,UAAI;AACF,cAAM,sBAAsB;AAC5B,yBAAiB,OAAO;AACxB,mBAAW,MAAM,iBAAiB,MAAM,GAAG,GAAI;AAAA,MACjD,SAAS,OAAO;AACd,yBAAiB,SAAS;AAC1B,wBAAgB,mCAAmC;AAAA,MACrD;AAAA,IACF,OAAO;AACL,uBAAiB,SAAS;AAC1B,sBAAgB,sDAAsD;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,UAAkB;AAC7C,oBAAgB,KAAK;AACrB,qBAAiB,MAAM;AAGvB,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IACjC;AAGA,eAAW,UAAU,WAAW,MAAM;AACpC,6BAAuB,KAAK;AAAA,IAC9B,GAAG,IAAI;AAAA,EACT;AAGA,EAAAA,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,0BAA0B,MAAM;AACpC,UAAM,WAAW,kBAAkB;AACnC,UAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC9D,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,OAAO;AACZ,SAAK,WAAW,uBAAsB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAC5E,aAAS,KAAK,YAAY,IAAI;AAC9B,SAAK,MAAM;AACX,aAAS,KAAK,YAAY,IAAI;AAC9B,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAEA,QAAM,0BAA0B,MAAM;AACpC,iBAAa,SAAS,MAAM;AAAA,EAC9B;AAEA,QAAM,mBAAmB,OAAO,UAA+C;AAC7E,UAAM,OAAO,MAAM,OAAO,QAAQ,CAAC;AACnC,QAAI,CAAC,KAAM;AAEX,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAM,UAAU,MAAM,kBAAkB,IAAI;AAE5C,UAAI,SAAS;AACX,wBAAgB,SAAS;AAEzB,wBAAgB,YAAY,WAAW,EAAE;AACzC,mBAAW,MAAM,gBAAgB,MAAM,GAAG,GAAI;AAAA,MAChD,OAAO;AACL,wBAAgB,OAAO;AACvB,mBAAW,MAAM,gBAAgB,MAAM,GAAG,GAAI;AAAA,MAChD;AAAA,IACF,SAAS,OAAO;AACd,sBAAgB,OAAO;AACvB,iBAAW,MAAM,gBAAgB,MAAM,GAAG,GAAI;AAAA,IAChD;AAGA,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,QAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,wBAAwB,YAAY;AACxC,QAAI,QAAQ,uGAAuG,GAAG;AACpH,YAAM,gBAAgB;AACtB,sBAAgB,EAAE;AAClB,uBAAiB,MAAM;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,uBAAuB,MAAM;AACjC,UAAM,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,kBAAkB,SAAU,QAAO;AACvC,UAAI,kBAAkB,UAAW,QAAO;AACxC,UAAI,kBAAkB,QAAS,QAAO;AAGtC,UAAI,cAAc;AAChB,eAAO,qBAAqB,YAAY;AAAA,MAC1C,WAAW,iBAAiB,SAAS;AACnC,eAAO,6BAA6B,gBAAgB,OAAO;AAAA,MAC7D,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,YAAQ,eAAe;AAAA,MACrB,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,YAAY,cAAc;AAAA,QAC5B;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY,cAAc;AAAA,QAC5B;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,YAAY,cAAc;AAAA,UAC1B,UAAU;AAAA,QACZ;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AACE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,YAAY,cAAc;AAAA,QAC5B;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,YAAQ,eAAe;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AACH,eACE,gBAAAL,KAAC,kBAAe,UAAS,OACvB,0BAAAA,KAAC,mBAAgB,OAAM,WAAU,UAAS,SAAQ,GACpD;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAA,KAAC,kBAAe,UAAS,OACvB,0BAAAA,KAAC,aAAU,OAAM,SAAQ,UAAS,SAAQ,GAC5C;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAA,KAAC,kBAAe,UAAS,OACvB,0BAAAA,KAACC,MAAA,EAAI,IAAI;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,UACX,mBAAmB;AAAA,YACjB,MAAM,EAAE,WAAW,eAAe;AAAA,YAClC,QAAQ,EAAE,WAAW,iBAAiB;AAAA,UACxC;AAAA,QACF,GAAG,GACL;AAAA,MAEJ;AACE,eACE,gBAAAD,KAAC,kBAAe,UAAS,OACvB,0BAAAA,KAAC,YAAS,OAAM,UAAS,UAAS,SAAQ,GAC5C;AAAA,IAEN;AAAA,EACF;AAEA,SACE,gBAAAA,KAACC,MAAA,EAAI,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,EAAE,GACtC,0BAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GAChC;AAAA,oBAAAD;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,UAAU,EAAE,IAAI,UAAU,IAAI,SAAS,EAAE;AAAA,QACxE;AAAA;AAAA,IAED;AAAA,IACA,gBAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,WAAS;AAAA,QACT,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,QAC9E;AAAA;AAAA,IAGD;AAAA,IAEA,gBAAAD,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GAC1D;AAAA,sBAAAJ,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM,GAAG,gBAAgB,iBAAiB,KAAK,EAAE,GAC9G;AAAA,wBAAAC,MAACD,MAAA,EACC;AAAA,0BAAAD,KAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,yCAA2B;AAAA,UACpG,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,4KAGnD;AAAA,WACF;AAAA,QACA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,OAAM;AAAA,gBACN,UAAU,CAAC,mBAAmB;AAAA;AAAA,YAChC;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EAAI,WAAU,QACb;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GACtE,wBAAc,iBAAiB,iBAClC;AAAA,cACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,4BAAkB,kDAAkD,4BACvE;AAAA,eACF;AAAA,YAEF,IAAI,EAAE,WAAW,EAAE,IAAI,cAAc,IAAI,SAAS,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE;AAAA;AAAA,QAC5E;AAAA,SACF;AAAA,MAEA,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM,GAAG,YAAY,EAAE,IAAI,SAAS,GAAG,KAAK,IAAI,GACpH;AAAA,wBAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACtD;AAAA;AAAA,UACD,gBAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,gBAAgB,2BAAgB;AAAA,WACpE;AAAA,QACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,UACrC;AAAA,WACd;AAAA,QACC,eACC,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,UACjC,8BAA8B;AAAA,UAAE;AAAA,UAAkB,yBAAyB;AAAA,UAAE;AAAA,WAC/F;AAAA,QAED,eAAe,KACd,gBAAAH;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,OAAO,GAAG,YAAY,UAAU,iBAAiB,IAAI,KAAK,GAAG;AAAA,YAC7D,OAAM;AAAA,YACN,MAAK;AAAA;AAAA,QACP;AAAA,QAED,gBAAgB,KACf,gBAAAP;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,OAAO,GAAG,aAAa,YAAY,kBAAkB,IAAI,KAAK,GAAG;AAAA,YACjE,OAAM;AAAA,YACN,MAAK;AAAA;AAAA,QACP;AAAA,SAEJ;AAAA,OAEE,kBAAkB,KAAK,oBAAoB,MAC3C,gBAAAP,KAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf,0BAAAD;AAAA,QAAC;AAAA;AAAA,UACC,SACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAM;AAAA,cACN,UAAU,CAAC,mBAAmB;AAAA;AAAA,UAChC;AAAA,UAEF,OACE,gBAAAE,MAACD,MAAA,EAAI,WAAU,QACb;AAAA,4BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,sCAE5E;AAAA,YACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,+FAEnD;AAAA,aACF;AAAA,UAEF,IAAI,EAAE,WAAW,EAAE,IAAI,cAAc,IAAI,SAAS,EAAE;AAAA;AAAA,MACtD,GACF;AAAA,MAGH,aACC,gBAAAH,KAACQ,QAAA,EAAM,UAAS,SAAQ,IAAI,EAAE,IAAI,EAAE,GACjC,qBACH;AAAA,MAGC,uBAAuB,SAAS,KAC/B,gBAAAN,MAACM,QAAA,EAAM,UAAS,SAAQ,IAAI,EAAE,IAAI,EAAE,GAClC;AAAA,wBAAAR,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI,GAAG,yEAE9D;AAAA,QACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,UACrB;AAAA,UAAoB;AAAA,WAClD;AAAA,QACC,iBAAiB,sBAAsB;AAAA,SAC1C;AAAA,MAGD,qBAAqB,SAAS,KAAK,uBAAuB,WAAW,KACpE,gBAAAD,MAACM,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GACpC;AAAA,wBAAAR,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI,GAAG,0DAE9D;AAAA,QACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,UACc;AAAA,UAAqB;AAAA,WACtF;AAAA,QACC,iBAAiB,oBAAoB;AAAA,SACxC;AAAA,MAGF,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,UAAU,QAAQ,KAAK,IAAI,GAC5D;AAAA,wBAAAD;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,CAAC,eAAe,eAAe,aAAa;AAAA,YACtD,WAAW,eAAe,aAAa,oBAAoB,gBAAAT,KAAC,YAAS,IAAI,QAAQ,IAAK,gBAAAA,KAAC,iBAAc;AAAA,YAEpG,yBAAe,aAAa,oBAAoB,kBAAa;AAAA;AAAA,QAChE;AAAA,QACA,gBAAAA,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,SAAS,QAAQ,YAAY,SAAS,GAAG,wGAElG;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAD,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GAC1D;AAAA,sBAAAN,KAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,8BAAgB;AAAA,MAEhG,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAC1D;AAAA,wBAAAC,MAACD,MAAA,EACC;AAAA,0BAAAC,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,gBAAgB,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC7H;AAAA,4BAAAH,KAAC,YAAS,UAAS,SAAQ,OAAM,WAAU;AAAA,YAAE;AAAA,aAE/C;AAAA,UACA,gBAAAA;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,oBAAoB,EAAE,OAAO,KAAK;AAAA,cACnD,aAAY;AAAA,cACZ,YAAY;AAAA,gBACV,gBACE,gBAAAV,KAAC,kBAAe,UAAS,SACvB,0BAAAA,KAAC,YAAS,OAAM,UAAS,UAAS,SAAQ,GAC5C;AAAA,gBAEF,cAAc,gBAAgB;AAAA,cAChC;AAAA,cACC,GAAG,qBAAqB;AAAA;AAAA,UAC3B;AAAA,WACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,iBAAiB,EAAE,OAAO,OAAO;AAAA,gBACnE,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,oBAAM;AAAA,cAClF,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,wEAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,wBAAwB,EAAE,OAAO,OAAO;AAAA,gBAC1E,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,iCAAmB;AAAA,cAC/F,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,4DAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,eAAe,EAAE,OAAO,OAAO;AAAA,gBACjE,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,6BAAe;AAAA,cAC3F,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,sEAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,0BAA0B,EAAE,OAAO,OAAO;AAAA,gBAC5E,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,8BAAgB;AAAA,cAC5F,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,8DAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,cAAc,EAAE,OAAO,OAAO;AAAA,gBAChE,OAAM;AAAA,gBACN,UAAU,CAAC;AAAA;AAAA,YACb;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,kCAAoB;AAAA,cAChG,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,8BACG,8BACA,iBAAiB,gBACf,yCACA,sDAER;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,cAAc,EAAE,OAAO,OAAO;AAAA,gBAChE,OAAM;AAAA,gBACN,UAAU,CAAC;AAAA;AAAA,YACb;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,kCAAoB;AAAA,cAChG,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,8BACG,yCACA,iBAAiB,gBACf,yCACA,sDAER;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,uBAAuB,EAAE,OAAO,OAAO;AAAA,gBACzE,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,0CAA4B;AAAA,cACxG,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,uEAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAEC,YAAY,uBACX,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GACtB;AAAA,0BAAAD;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAW,gBAAAT,KAAC,eAAY;AAAA,cACxB,SAAS,YAAY;AACnB,oBAAI;AACF,wBAAM,SAAS,MAAM,cAAc,SAAS,EAAE,2BAA2B;AACzE,sBAAI,cAAc;AAChB,wBAAI,OAAO,qBAAqB;AAC9B,mCAAa,qDAAqD,SAAS;AAAA,oBAC7E,WAAW,OAAO,SAAS,SAAS,GAAG;AACrC,mCAAa,YAAY,OAAO,SAAS,MAAM,qBAAqB,OAAO,SAAS,WAAW,IAAI,MAAM,KAAK,KAAK,OAAO,SAAS,KAAK,IAAI,CAAC,IAAI,SAAS;AAAA,oBAC5J,OAAO;AACL,mCAAa,8FAA8F,SAAS;AAAA,oBACtH;AAAA,kBACF;AAAA,gBACF,SAAS,OAAO;AACd,sBAAI,cAAc;AAChB,iCAAa,6DAA6D,OAAO;AAAA,kBACnF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,IAAI,EAAE,eAAe,OAAO;AAAA,cAC7B;AAAA;AAAA,UAED;AAAA,UACA,gBAAAA,KAACG,aAAA,EAAW,SAAQ,WAAU,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,IAAI,GAAG,4EAEtF;AAAA,WACF;AAAA,QAGF,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,UAAU,CAAC,MAAM,iBAAiB,mBAAmB,EAAE,OAAO,OAAO;AAAA,gBACrE,OAAM;AAAA;AAAA,YACR;AAAA,YAEF,OACE,gBAAAE,MAACD,MAAA,EACC;AAAA,8BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,6BAAe;AAAA,cAC3F,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,yEAEnD;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAD,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GAC1D;AAAA,sBAAAN,KAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,8BAAgB;AAAA,MAChG,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAS,MAAC,0IAE7D;AAAA,MAEA,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM,GAAG,KAAK,GAAG,YAAY,SAAS,GACnG;AAAA,wBAAAD;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAW,gBAAAT,KAAC,gBAAa;AAAA,YACzB,SAAS;AAAA,YACT,IAAI,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,YAC7C;AAAA;AAAA,QAED;AAAA,QAEA,gBAAAA;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAW,gBAAAT,KAAC,cAAW;AAAA,YACvB,SAAS;AAAA,YACT,OAAO,iBAAiB,YAAY,YAAY,iBAAiB,UAAU,UAAU;AAAA,YACrF,IAAI,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,YAE3C,2BAAiB,YAAY,oBAAe,iBAAiB,UAAU,kBAAa;AAAA;AAAA,QACvF;AAAA,QAEA,gBAAAA;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAW,gBAAAT,KAAC,eAAY;AAAA,YACxB,SAAS;AAAA,YACT,OAAM;AAAA,YACN,IAAI,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,YAC7C;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAO;AAAA,UACP,OAAO,EAAE,SAAS,OAAO;AAAA;AAAA,MAC3B;AAAA,OACF;AAAA,IAEA,gBAAAE,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,GACpC;AAAA,sBAAAN,KAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,4BAAc;AAAA,MAC9F,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAS,MAAC,sKAE7D;AAAA,MAEA,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,IAAI,GAC5D;AAAA,wBAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,gBAAgB,GAChF;AAAA,0BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,kCAAoB;AAAA,UAChG,gBAAAH;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,OAAO,oBAAoB,cAAc,iBAAiB,gBAAgB,gBAAgB;AAAA,cAC1F,OAAO,oBAAoB,YAAY,iBAAiB,gBAAgB,YAAY;AAAA,cACpF,MAAK;AAAA;AAAA,UACP;AAAA,WACF;AAAA,QAEA,gBAAAL,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,gBAAgB,GAChF;AAAA,0BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,kCAAoB;AAAA,UAChG,gBAAAH;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,OAAO,oBAAoB,cAAc,iBAAiB,gBAAgB,gBAAgB;AAAA,cAC1F,OAAO,oBAAoB,YAAY,iBAAiB,gBAAgB,YAAY;AAAA,cACpF,MAAK;AAAA;AAAA,UACP;AAAA,WACF;AAAA,QAEA,gBAAAL,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,UAAU,QAAQ,KAAK,EAAE,GAC1G;AAAA,0BAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4BAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,yBAAW;AAAA,YACtF,qBACC,gBAAAH,KAAC,WAAQ,OAAM,0BAAyB,WAAU,OAChD,0BAAAA,KAAC,UACC,0BAAAA;AAAA,cAACW;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,IAAI,EAAE,GAAG,KAAK;AAAA,gBAEd,0BAAAX,KAAC,eAAY,UAAS,SAAQ,IAAI,mBAAmB,SAAS,QAAW;AAAA;AAAA,YAC3E,GACF,GACF;AAAA,aAEJ;AAAA,UACA,gBAAAA;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAO;AAAA,cACP,MAAK;AAAA;AAAA,UACP;AAAA,WACF;AAAA,QAEC,qBAAqB,sBACpB,gBAAAP,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAM,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,GACrF,0BAAAD,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,SACjC,6BAAmB,SACtB,GACF;AAAA,SAEJ;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAEA,IAAO,yBAAQ;;;AE19Bf,SAAgB,YAAAS,WAAU,UAAAC,eAAc;AACxC;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,OAAOC,iBAAgB;AACvB,OAAO,gBAAgB;AACvB,OAAO,iBAAiB;AACxB,OAAOC,kBAAiB;AACxB,OAAOC,mBAAkB;AACzB,OAAO,oBAAoB;AAC3B,OAAO,cAAc;;;ACxBrB,SAAgB,YAAAC,WAAU,UAAAC,SAAQ,eAAAC,cAAa,aAAAC,kBAAiB;AAChE;AAAA,EACE,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,OACK;AACP,OAAOC,qBAAoB;AAC3B,OAAOC,sBAAqB;AAC5B,OAAOC,iBAAgB;AACvB,OAAOC,kBAAiB;AACxB,OAAO,iBAAiB;AACxB,OAAO,oBAAoB;AAC3B,OAAO,sBAAsB;AAkXvB,SAWI,YAAAC,WAVF,OAAAC,MADF,QAAAC,aAAA;AAhWN,IAAM,oBAAoB;AAAA,EACxB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAYC,QAA0B,IAAI;AAChD,QAAM,mBAAmBA,QAA0B,IAAI;AACvD,QAAM,WAAWA,QAAyB,IAAI;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAiB,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAuB;AAAA,IAC7D,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACzD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAChF,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAsB,QAAQ;AACpE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAEpE,QAAM,cAAc;AACpB,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAyC,OAAO;AAGpF,QAAM,oBAAoBC,aAAY,MAAM;AAC1C,UAAM,UAAU;AAChB,YAAQ,aAAa;AAAA,MACnB,KAAK;AACH,eAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ;AAAA,MAC3C,KAAK;AACH,eAAO,EAAE,OAAO,SAAS,QAAQ,UAAU,IAAI;AAAA;AAAA,MACjD,KAAK;AACH,eAAO,EAAE,OAAO,UAAU,KAAK,QAAQ,QAAQ;AAAA,MACjD,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,CAAC;AAG1B,EAAAC,WAAU,MAAM;AACd,QAAI,aAAa,MAAM;AACrB,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,CAAC,MAAM;AACrB,YAAI,EAAE,QAAQ,QAAQ;AACpB,sBAAY,EAAE,OAAO,MAAgB;AACrC,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AACA,aAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,WAAW,IAAI,CAAC;AAGpB,QAAM,kBAAkBD,aAAY,MAAM;AACxC,QAAI,SAAS,SAAS;AACpB,YAAM,EAAE,cAAc,cAAc,IAAI,SAAS;AACjD,0BAAoB,EAAE,OAAO,cAAc,QAAQ,cAAc,CAAC;AAGlE,YAAM,WAAW,kBAAkB;AACnC,YAAME,YAAW,KAAK;AAAA,QACpB,SAAS,QAAQ;AAAA,QACjB,SAAS,SAAS;AAAA,MACpB;AAEA,sBAAgB;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,KAAK,IAAIA,WAAU,GAAG;AAAA,QAC7B,UAAU;AAAA,MACZ,CAAC;AAED,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAGtB,EAAAD,WAAU,MAAM;AACd,QAAI,aAAa;AACf,YAAM,WAAW,kBAAkB;AACnC,kBAAY,QAAQ;AAGpB,YAAMC,YAAW,KAAK;AAAA,QACpB,SAAS,QAAQ,iBAAiB;AAAA,QAClC,SAAS,SAAS,iBAAiB;AAAA,MACrC;AAEA,sBAAgB,WAAS;AAAA,QACvB,GAAG;AAAA,QACH,OAAO,KAAK,IAAI,KAAK,OAAOA,SAAQ;AAAA,MACtC,EAAE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,kBAAkB,iBAAiB,CAAC;AAElE,QAAM,gBAAgBF,aAAY,CAAC,OAAe,OAAe,aAAgD;AAC/G,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,aAAa,UAAU;AAE7B,QAAI,CAAC,iBAAiB,CAAC,WAAY;AAEnC,UAAM,aAAa,cAAc,WAAW,IAAI;AAChD,QAAI,CAAC,WAAY;AAEjB,kBAAc,QAAQ;AACtB,kBAAc,SAAS;AAGvB,eAAW,UAAU,GAAG,GAAG,KAAK,GAAG;AAGnC,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,MAAM;AAClE,UAAM,cAAc,SAAS,QAAQ;AACrC,UAAM,eAAe,SAAS,SAAS;AACvC,UAAM,WAAW,MAAM,eAAe;AACtC,UAAM,WAAW,MAAM,gBAAgB;AAGvC,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MAAO;AAAA,MAAO,SAAS;AAAA,MAAO,SAAS;AAAA,MACvC;AAAA,MAAS;AAAA,MAAS;AAAA,MAAa;AAAA,IACjC;AAGA,eAAW,cAAc;AACzB,eAAW,YAAY;AACvB,eAAW,WAAW,SAAS,SAAS,aAAa,YAAY;AAAA,EACnE,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkBA,aAAY,MAAM;AACxC,UAAM,SAAS,UAAU;AACzB,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAa;AAEvC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AAEV,UAAM,WAAW,kBAAkB;AAGnC,WAAO,QAAQ;AACf,WAAO,SAAS;AAGhB,QAAI,UAAU,GAAG,GAAG,aAAa,WAAW;AAG5C,UAAM,cAAc;AACpB,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK,aAAa;AACjD,eAAS,IAAI,GAAG,IAAI,aAAa,KAAK,aAAa;AACjD,aAAK,IAAI,cAAc,IAAI,eAAe,MAAM,GAAG;AACjD,cAAI,SAAS,GAAG,GAAG,aAAa,WAAW;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK;AAGT,UAAM,SAAS,cAAc,SAAS,SAAS;AAC/C,UAAM,SAAS,cAAc,SAAS,UAAU;AAEhD,QAAI,UAAU;AACd,QAAI,KAAK,OAAO,OAAO,SAAS,OAAO,SAAS,MAAM;AACtD,QAAI,KAAK;AAGT,QAAI,UAAU,cAAc,GAAG,cAAc,CAAC;AAC9C,QAAI,OAAQ,aAAa,WAAW,KAAK,KAAM,GAAG;AAClD,QAAI,MAAM,aAAa,OAAO,aAAa,KAAK;AAChD,QAAI,UAAU,CAAC,MAAM,eAAe,IAAI,aAAa,GAAG,CAAC,MAAM,gBAAgB,IAAI,aAAa,CAAC;AAGjG,QAAI,UAAU,OAAO,GAAG,GAAG,MAAM,cAAc,MAAM,aAAa;AAGlE,QAAI,QAAQ;AAGZ,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI,WAAW,OAAO,OAAO,SAAS,OAAO,SAAS,MAAM;AAG5D,UAAM,aAAa;AACnB,QAAI,YAAY;AAEhB,QAAI,SAAS,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAChD,QAAI,SAAS,QAAQ,GAAG,QAAQ,GAAG,GAAG,UAAU;AAEhD,QAAI,SAAS,QAAQ,SAAS,QAAQ,aAAa,GAAG,QAAQ,GAAG,YAAY,CAAC;AAC9E,QAAI,SAAS,QAAQ,SAAS,QAAQ,GAAG,QAAQ,GAAG,GAAG,UAAU;AAEjE,QAAI,SAAS,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG,YAAY,CAAC;AAClE,QAAI,SAAS,QAAQ,GAAG,QAAQ,SAAS,SAAS,aAAa,GAAG,GAAG,UAAU;AAE/E,QAAI,SAAS,QAAQ,SAAS,QAAQ,aAAa,GAAG,QAAQ,SAAS,SAAS,GAAG,YAAY,CAAC;AAChG,QAAI,SAAS,QAAQ,SAAS,QAAQ,GAAG,QAAQ,SAAS,SAAS,aAAa,GAAG,GAAG,UAAU;AAGhG,kBAAc,OAAO,OAAO,QAAQ;AAAA,EACtC,GAAG,CAAC,cAAc,aAAa,mBAAmB,aAAa,CAAC;AAGhE,EAAAC,WAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,kBAAkBD,aAAY,CAAC,MAAwB;AAC3D,kBAAc,IAAI;AAClB,iBAAa,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,CAAC,MAAwB;AAC3D,QAAI,CAAC,WAAY;AAEjB,UAAM,SAAS,EAAE,UAAU,UAAU;AACrC,UAAM,SAAS,EAAE,UAAU,UAAU;AAErC,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,MAC1B,GAAG,KAAK,IAAI,SAAS,KAAK;AAAA,IAC5B,EAAE;AAEF,iBAAa,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC7C,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,QAAM,gBAAgBA,aAAY,MAAM;AACtC,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,gBAAY,EAAE;AACd,mBAAe,KAAK;AACpB,oBAAgB,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;AACrD,mBAAe,QAAQ;AACvB,YAAQ;AAAA,EACV,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,aAAaA,aAAY,MAAM;AACnC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,OAAO,CAAC,MAAO;AAEpB,UAAM,WAAW,kBAAkB;AACnC,UAAM,YAAY,kBAAkB,UAAU;AAG9C,UAAM,mBAAmB,SAAS,QAAQ,SAAS;AACnD,QAAI,cAAc;AAClB,QAAI,eAAe;AAEnB,QAAI,gBAAgB,UAAU;AAC5B,UAAI,mBAAmB,GAAG;AAExB,uBAAe,YAAY;AAAA,MAC7B,OAAO;AAEL,sBAAc,YAAY;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO,QAAQ;AACf,WAAO,SAAS;AAGhB,QAAI,KAAK;AAGT,UAAM,SAAS,cAAc,SAAS;AACtC,UAAM,SAAS,eAAe,SAAS;AAEvC,QAAI,UAAU,cAAc,GAAG,eAAe,CAAC;AAC/C,QAAI,OAAQ,aAAa,WAAW,KAAK,KAAM,GAAG;AAClD,QAAI,MAAM,aAAa,QAAQ,QAAQ,aAAa,QAAQ,MAAM;AAClE,QAAI;AAAA,MACF,CAAC,MAAM,eAAe,IAAI,aAAa,IAAI;AAAA,MAC3C,CAAC,MAAM,gBAAgB,IAAI,aAAa,IAAI;AAAA,IAC9C;AAGA,QAAI,UAAU,OAAO,GAAG,GAAG,MAAM,cAAc,MAAM,aAAa;AAGlE,QAAI,QAAQ;AAGZ,UAAM,iBAAiB,OAAO,UAAU,aAAa,CAAG;AACxD,WAAO,cAAc;AAGrB,gBAAY,EAAE;AACd,mBAAe,KAAK;AACpB,oBAAgB,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;AACrD,mBAAe,QAAQ;AACvB,YAAQ;AAAA,EACV,GAAG,CAAC,cAAc,QAAQ,mBAAmB,YAAY,aAAa,OAAO,CAAC;AAE9E,QAAM,oBAAoBA,aAAY,CAAC,UAAkB;AACvD,UAAM,WAAW,kBAAkB;AACnC,UAAME,YAAW,KAAK;AAAA,MACpB,SAAS,QAAQ,iBAAiB;AAAA,MAClC,SAAS,SAAS,iBAAiB;AAAA,IACrC;AACA,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,OAAO,KAAK,IAAI,OAAOA,SAAQ;AAAA,IACjC,EAAE;AAAA,EACJ,GAAG,CAAC,kBAAkB,iBAAiB,CAAC;AAExC,QAAM,iBAAiBF,aAAY,CAAC,cAAgC;AAClE,oBAAgB,WAAS;AAAA,MACvB,GAAG;AAAA,MACH,UAAU,KAAK,YAAY,cAAc,SAAS,MAAM;AAAA,IAC1D,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,KAAK;AAAA,IACpB,kBAAkB,EAAE,QAAQ,KAAK,IAAI,iBAAiB,OAAO,CAAC;AAAA,IAC9D,kBAAkB,EAAE,SAAS,KAAK,IAAI,iBAAiB,QAAQ,CAAC;AAAA,EAClE;AAEA,SACE,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,UAAS;AAAA,MACT,WAAS;AAAA,MACT,YAAY;AAAA,QACV,IAAI,EAAE,cAAc,EAAE;AAAA,MACxB;AAAA,MAEA;AAAA,wBAAAD,MAACE,cAAA,EAAY,IAAI,EAAE,IAAI,EAAE,GACvB;AAAA,0BAAAC,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAAG,sCAElD;AAAA,UACA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,yEAEnD;AAAA,WACF;AAAA,QAEA,gBAAAD,KAACE,gBAAA,EACE,sBACC,gBAAAL,MAAAM,WAAA,EAEE;AAAA,0BAAAH;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,OAAO,EAAE,SAAS,OAAO;AAAA,cACzB,QAAQ;AAAA;AAAA,UACV;AAAA,UAEC,cACC,gBAAAH,MAACO,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,GAEjC;AAAA,4BAAAJ,KAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,GAChF,0BAAAP;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,gBACX,IAAI;AAAA,kBACF,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,cAAc;AAAA,kBACd,QAAQ,aAAa,aAAa;AAAA,kBAClC,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACA,aAAa;AAAA,gBACb,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,cAAc;AAAA,gBAEd;AAAA,kCAAAL;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,OAAO;AAAA,wBACL,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,SAAS;AAAA,sBACX;AAAA;AAAA,kBACF;AAAA,kBAGC,CAAC,cACA,gBAAAA;AAAA,oBAACI;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,KAAK;AAAA,wBACL,MAAM;AAAA,wBACN,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,eAAe;AAAA,wBACf,SAAS;AAAA,sBACX;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YAEJ,GACF;AAAA,YAGA,gBAAAP,MAACO,MAAA,EAAI,IAAI,EAAE,OAAO,KAAK,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAEtE;AAAA,8BAAAP,MAACO,MAAA,EACC;AAAA,gCAAAP,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG;AAAA;AAAA,kBAC7C,kBAAkB,UAAU;AAAA,kBAAE;AAAA,mBAC7C;AAAA,gBACA,gBAAAD,KAACK,QAAA,EAAM,WAAW,GAAG,IAAI,EAAE,GAAG,GAAG,cAAc,GAAG,YAAY,+EAA+E,GAC3I,0BAAAL;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,cAAc;AAAA,oBAChB;AAAA;AAAA,gBACF,GACF;AAAA,iBACF;AAAA,cAGA,gBAAAH,MAACO,MAAA,EACC;AAAA,gCAAAJ,KAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG,oCAE5D;AAAA,gBACA,gBAAAJ;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,WAAS;AAAA,oBACT,UAAU,CAAC,GAAG,aAAa,YAAY,eAAe,QAAQ;AAAA,oBAC9D,MAAK;AAAA,oBACL,WAAS;AAAA,oBAET;AAAA,sCAAAA,MAAC,gBAAa,OAAM,UAClB;AAAA,wCAAAG,KAAC,kBAAe,UAAS,SAAQ;AAAA,wBACjC,gBAAAA,KAACC,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,IAAI,GAAG,oBAAM;AAAA,yBACvD;AAAA,sBACA,gBAAAJ,MAAC,gBAAa,OAAM,aAClB;AAAA,wCAAAG,KAAC,eAAY,UAAS,SAAQ;AAAA,wBAC9B,gBAAAA,KAACC,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,IAAI,GAAG,kBAAI;AAAA,yBACrD;AAAA,sBACA,gBAAAJ,MAAC,gBAAa,OAAM,YAClB;AAAA,wCAAAG,KAAC,oBAAiB,UAAS,SAAQ;AAAA,wBACnC,gBAAAA,KAACC,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,IAAI,IAAI,GAAG,kBAAI;AAAA,yBACrD;AAAA;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAGA,gBAAAJ,MAACO,MAAA,EACC;AAAA,gCAAAJ,KAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG,mCAE5D;AAAA,gBACA,gBAAAJ;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,WAAS;AAAA,oBACT,UAAU,CAAC,GAAG,YAAY,WAAW,cAAc,OAAO;AAAA,oBAC1D,MAAK;AAAA,oBACL,WAAS;AAAA,oBAET;AAAA,sCAAAG,KAAC,gBAAa,OAAM,SAAQ,mBAAK;AAAA,sBACjC,gBAAAA,KAAC,gBAAa,OAAM,UAAS,mBAAK;AAAA,sBAClC,gBAAAA,KAAC,gBAAa,OAAM,SAAQ,oBAAM;AAAA;AAAA;AAAA,gBACpC;AAAA,iBACF;AAAA,cAGA,gBAAAH,MAACO,MAAA,EACC;AAAA,gCAAAP,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG;AAAA;AAAA,kBAChD,KAAK,MAAM,aAAa,QAAQ,GAAG;AAAA,kBAAE;AAAA,mBACjD;AAAA,gBACA,gBAAAJ,MAACO,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,kCAAAJ;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,SAAS,MAAM,kBAAkB,aAAa,QAAQ,GAAG;AAAA,sBACzD,UAAU,aAAa,SAAS;AAAA,sBAChC,MAAK;AAAA,sBAEL,0BAAAN,KAACO,cAAA,EAAY;AAAA;AAAA,kBACf;AAAA,kBACA,gBAAAP;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,OAAO,aAAa;AAAA,sBACpB,UAAU,CAAC,GAAG,UAAU,kBAAkB,KAAe;AAAA,sBACzD,KAAK;AAAA,sBACL,KAAK;AAAA,sBACL,MAAM;AAAA,sBACN,IAAI,EAAE,MAAM,EAAE;AAAA;AAAA,kBAChB;AAAA,kBACA,gBAAAR;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,SAAS,MAAM,kBAAkB,aAAa,QAAQ,GAAG;AAAA,sBACzD,UAAU,aAAa,SAAS;AAAA,sBAChC,MAAK;AAAA,sBAEL,0BAAAN,KAACS,aAAA,EAAW;AAAA;AAAA,kBACd;AAAA,mBACF;AAAA,iBACF;AAAA,cAGA,gBAAAZ,MAACO,MAAA,EACC;AAAA,gCAAAJ,KAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG,gCAE5D;AAAA,gBACA,gBAAAJ,MAACO,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,GACjC;AAAA,kCAAAJ;AAAA,oBAACU;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,WAAW,gBAAAV,KAACW,iBAAA,EAAe;AAAA,sBAC3B,SAAS,MAAM,eAAe,MAAM;AAAA,sBACpC,MAAK;AAAA,sBACL,WAAS;AAAA,sBACV;AAAA;AAAA,kBAED;AAAA,kBACA,gBAAAX;AAAA,oBAACU;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,WAAW,gBAAAV,KAACY,kBAAA,EAAgB;AAAA,sBAC5B,SAAS,MAAM,eAAe,OAAO;AAAA,sBACrC,MAAK;AAAA,sBACL,WAAS;AAAA,sBACV;AAAA;AAAA,kBAED;AAAA,mBACF;AAAA,gBACC,aAAa,aAAa,KACzB,gBAAAZ;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBACC,OAAO,GAAG,aAAa,QAAQ;AAAA,oBAC/B,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,IAAI,EAAE,IAAI,EAAE;AAAA;AAAA,gBACd;AAAA,iBAEJ;AAAA,cAEA,gBAAAhB,MAACiB,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,cAAc,EAAE,GAC9C;AAAA,gCAAAd,KAACC,aAAA,EAAW,SAAQ,SAClB,0BAAAD,KAAC,YAAO,mCAAgB,GAC1B;AAAA,gBACA,gBAAAH,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,KAAK,UAAU,SAAS,GAAG;AAAA;AAAA,kBAC7D,gBAAAD,KAAC,YAAO,oCAAsB;AAAA,kBAAS;AAAA,kBAAgB,gBAAAA,KAAC,QAAE;AAAA,kBAAE;AAAA,kBAC5D,gBAAAA,KAAC,YAAO,8BAAgB;AAAA,kBAAS;AAAA,kBAAO,gBAAAA,KAAC,QAAE;AAAA,kBAAE;AAAA,kBAC7C,gBAAAA,KAAC,YAAO,4BAAc;AAAA,kBAAS;AAAA,kBAAmB,gBAAAA,KAAC,QAAE;AAAA,kBAAE;AAAA,kBACvD,gBAAAA,KAAC,YAAO,kCAAoB;AAAA,kBAAS;AAAA,mBACzC;AAAA,iBACF;AAAA,eACF;AAAA,aACF,IAEA,gBAAAA,KAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,IAAI,EAAE,GAC1D,0BAAAJ,KAACC,aAAA,EAAW,8BAAgB,GAC9B;AAAA,WAEJ,GAEJ;AAAA,QAEA,gBAAAJ,MAACkB,gBAAA,EAAc,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAChC;AAAA,0BAAAf,KAACU,SAAA,EAAO,SAAS,aAAa,OAAM,aAAY,oBAEhD;AAAA,UACA,gBAAAV;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,SAAQ;AAAA,cACR,UAAU,CAAC;AAAA,cACX,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,YAAY;AAAA,cACd;AAAA,cACD;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,sBAAQ;;;ADzZP,gBAAAM,MAcE,QAAAC,aAdF;AAjNR,IAAM,eAAe;AACrB,IAAM,YAAY;AAmBlB,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAWC,UAAS;AAC1B,QAAM,WAAWC,eAAc,SAAS,YAAY,KAAK,IAAI,CAAC;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,KAAK;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAgD,MAAM;AAC1F,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAA8B,SAAS;AACvF,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAsB,IAAI;AAC5E,QAAM,eAAeC,QAAyB,IAAI;AAClD,QAAM,iBAAiBA,QAAyB,IAAI;AAGpD,QAAM,iBAAiB,MAAM;AAE3B,WAAO,SAAS,QAAQ,SAAS,UAAU,YAAY;AAAA,EACzD;AAEA,QAAM,iBAAiB,CAAC,MAAuB;AAC7C,MAAE,eAAe;AACjB,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,kBAAkB,CAAC,MAAuB;AAC9C,MAAE,eAAe;AACjB,gBAAY,KAAK;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,MAAuB;AACzC,MAAE,eAAe;AACjB,gBAAY,KAAK;AACjB,UAAM,QAAQ,EAAE,aAAa;AAC7B,QAAI,MAAM,SAAS,MAAM,MAAM,CAAC,EAAE,SAAS,eAAe,MAAM,CAAC,EAAE,SAAS,gBAAgB,MAAM,CAAC,EAAE,SAAS,cAAc;AAC1H,wBAAkB,MAAM,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,SAAe;AAExC,QAAI,CAAC,KAAK,KAAK,MAAM,yBAAyB,GAAG;AAC/C,yBAAmB,wCAAwC;AAC3D,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AACpB;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,KAAK,OAAO,MAAM;AAChC,yBAAmB,yCAAyC;AAC5D,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,yBAAqB,IAAI;AACzB,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,wBAAwB,CAAC,MAA2C;AACxE,UAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAI,MAAM;AACR,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,qBAA6B;AAEvD,UAAM,YAAY;AAAA,MAChB,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,iBAAiB,aAAa;AAChC,oBAAc,gBAAgB;AAC9B,kBAAY,IAAI;AAAA,IAClB,OAAO;AAEL,uBAAiB,SAAS;AAAA,IAC5B;AAEA,mBAAe,KAAK;AACpB,yBAAqB,IAAI;AAEzB,uBAAmB,wCAAwC;AAC3D,wBAAoB,SAAS;AAC7B,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,qBAAqB,MAAM;AAC/B,mBAAe,KAAK;AACpB,yBAAqB,IAAI;AAAA,EAC3B;AAEA,QAAM,yBAAyB,YAAY;AACzC,kBAAc,QAAQ;AACtB,QAAI;AACF,YAAM,mBAAmB;AACzB,oBAAc,OAAO;AACrB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C,SAAS,OAAO;AACd,oBAAc,OAAO;AACrB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,2BAA2B,YAAY;AAC3C,QAAI;AACF,YAAM,mBAAmB;AACzB,yBAAmB,8CAA8C;AACjE,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,yBAAmB,yCAAyC;AAC5D,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,2BAA2B,OAAO,UAA+C;AACrF,QAAI;AACF,YAAM,mBAAmB,KAAK;AAC9B,yBAAmB,8CAA8C;AACjE,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,yBAAmB,yCAAyC;AAC5D,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,0BAA0B,YAAY;AAC1C,QAAI;AACF,YAAM,sBAAsB;AAC5B,yBAAmB,qCAAqC;AACxD,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,yBAAmB,mCAAmC;AACtD,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAE7B,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,QAAQ;AAAA,IAC/B;AAGA,QAAI,eAAe,eAAe;AAChC,kBAAY,IAAI;AAChB,oBAAc,IAAI;AAAA,IACpB,OAAO;AAEL,YAAM,YAAY;AAAA,QAChB,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,uBAAiB,SAAS;AAAA,IAC5B;AAAA,EACF;AAEA,SACE,gBAAAC,MAACC,MAAA,EAAI,IAAI,EAAE,QAAQ,QAAQ,SAAS,QAAQ,eAAe,UAAU,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GAEzF;AAAA,oBAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,MAAM,YAAY,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAClG;AAAA,sBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE;AAAA,UACzF;AAAA;AAAA,MAED;AAAA,MACA,gBAAAD;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,OAAO,kBAAkB,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,UACzF;AAAA;AAAA,MAED;AAAA,MAEA,gBAAAD,KAACE,QAAA,EAAM,UAAS,QAAO,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,GAC9F,0BAAAJ,MAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU,GAAG,YAAY,IAAI,GAC5F;AAAA,wBAAAD,KAAC,YAAO,gCAAkB;AAAA,QAAS;AAAA,SAErC,GACF;AAAA,OACF;AAAA,IAGA,gBAAAF;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,UACpB,cAAc;AAAA,UACd,MAAM;AAAA,UACN,SAAS;AAAA,UACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,UACzC,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,UACxB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,QACrB;AAAA,QAGA;AAAA,0BAAAL;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,OAAO,EAAE,IAAI,QAAQ,IAAI,MAAM;AAAA,gBAC/B,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ,EAAE,IAAI,QAAQ,IAAI,IAAI;AAAA,gBAC9B,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACtB;AAAA,cAGA;AAAA,gCAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,MAAM,YAAY,SAAS,QAAQ,eAAe,SAAS,GACpE;AAAA,kCAAAD,MAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,KAAK,YAAY,KAAK,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,QAAQ,OAAO,eAAe,GAC9I;AAAA,oCAAAD,KAACI,aAAA,EAAW,OAAM,WAAU,UAAS,SAAQ;AAAA,oBAAE;AAAA,qBAEjD;AAAA,kBAEA,gBAAAN;AAAA,oBAACC;AAAA,oBAAA;AAAA,sBACC,YAAY;AAAA,sBACZ,aAAa;AAAA,sBACb,QAAQ;AAAA,sBACR,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,sBAC3C,IAAI;AAAA,wBACF,QAAQ;AAAA,wBACR,aAAa,WAAW,iBAAiB,aAAa,iBAAiB;AAAA,wBACvE,cAAc;AAAA,wBACd,GAAG;AAAA,wBACH,WAAW;AAAA,wBACX,QAAQ;AAAA,wBACR,SAAS,WAAW,iBAAiB,aAAa,eAAe;AAAA,wBACjE,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,SAAS;AAAA,wBACT,eAAe;AAAA,wBACf,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,WAAW;AAAA,0BACT,aAAa;AAAA,0BACb,SAAS;AAAA,0BACT,kBAAkB;AAAA,4BAChB,OAAO;AAAA,0BACT;AAAA,wBACF;AAAA,sBACF;AAAA,sBAEC;AAAA,sCAAc,eAAe,IAC5B,gBAAAC,KAAC,QAAK,IAAI,MACR,0BAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,GAChF;AAAA,0CAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,KAAK,cAAc,eAAe;AAAA,8BAClC,KAAI;AAAA,8BACJ,OAAO;AAAA,gCACL,UAAU;AAAA,gCACV,WAAW;AAAA,gCACX,cAAc;AAAA,gCACd,WAAW;AAAA,gCACX,gBAAgB;AAAA,gCAChB,WAAW;AAAA,gCACX,QAAQ;AAAA,8BACV;AAAA;AAAA,0BACF;AAAA,0BACA,gBAAAA,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAO,aAAa,iBAAiB,aAAa,IAAI,EAAE,YAAY,KAAK,UAAU,UAAU,GACtH,uBAAa,uBAAkB,gBAClC;AAAA,0BACC,CAAC,cACA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,UAAU,WAAW,WAAW,SAAS,GAAG,wDAEvG;AAAA,2BAEJ,GACF,IAEA,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,GAChF;AAAA,0CAAAC;AAAA,4BAACI;AAAA,4BAAA;AAAA,8BACC,WAAU;AAAA,8BACV,IAAI;AAAA,gCACF,UAAU;AAAA,gCACV,OAAO;AAAA,gCACP,YAAY;AAAA,8BACd;AAAA;AAAA,0BACF;AAAA,0BACA,gBAAAJ,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,gBAAe,IAAI,EAAE,UAAU,OAAO,GACrE,qBAAW,cAAc,gCAC5B;AAAA,0BACJ,gBAAAD,KAACC,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,UAAU,WAAW,WAAW,SAAS,GAAG,iFAEvG;AAAA,2BACF;AAAA,wBAGE,gBAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,KAAK;AAAA,4BACL,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,QAAM;AAAA,4BACN,UAAU;AAAA;AAAA,wBACZ;AAAA;AAAA;AAAA,kBACF;AAAA,kBAEC,cACC,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,IAAI,GAC1C;AAAA,oCAAAC;AAAA,sBAACK;AAAA,sBAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,WAAW,gBAAAL,KAACI,aAAA,EAAW;AAAA,wBACvB,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,wBAC3C,IAAI,EAAE,MAAM,GAAG,UAAU,UAAU,IAAI,KAAK;AAAA,wBAC7C;AAAA;AAAA,oBAED;AAAA,oBACA,gBAAAJ;AAAA,sBAACK;AAAA,sBAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,OAAM;AAAA,wBACN,WAAW,gBAAAL,KAAC,cAAW;AAAA,wBACvB,SAAS;AAAA,wBACT,IAAI,EAAE,MAAM,GAAG,UAAU,UAAU,IAAI,KAAK;AAAA,wBAC7C;AAAA;AAAA,oBAED;AAAA,qBACF;AAAA,mBAEJ;AAAA,gBAEA,gBAAAA,KAACD,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,MAAM,WAAW,GACjC,0BAAAC;AAAA,kBAACM;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,SAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,oBAC/C,WAAS;AAAA,oBACT,aAAY;AAAA,oBACZ,MAAK;AAAA,oBACL,IAAI;AAAA,sBACF,wBAAwB,EAAE,UAAU,UAAU;AAAA,sBAC9C,6BAA6B,EAAE,UAAU,SAAS;AAAA,oBACpD;AAAA;AAAA,gBACF,GACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAR,MAACC,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,OAAO,OAAO,GAChC;AAAA,4BAAAD,MAACG,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,KAAK,YAAY,KAAK,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,QAAQ,OAAO,eAAe,GAC9I;AAAA,8BAAAD,KAAC,eAAY,OAAM,WAAU,UAAS,SAAQ;AAAA,cAAE;AAAA,eAElD;AAAA,YAEA,gBAAAF;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,kBAC3B,SAAS;AAAA,kBACT,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,IAAI;AAAA,kBACJ,IAAI;AAAA,gBACN;AAAA,gBAGA;AAAA,kCAAAC,KAACD,MAAA,EAAI,IAAI;AAAA,oBACP,SAAS;AAAA,oBACT,gBAAgB;AAAA,oBAChB,YAAY;AAAA,oBACZ,MAAM;AAAA,oBACN,WAAW;AAAA,kBACb,GACG,wBAAc,eAAe,IAC5B,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,cAAc,eAAe;AAAA,sBAClC,KAAI;AAAA,sBACJ,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,gBAAgB;AAAA,wBAChB,WAAW;AAAA,wBACX,QAAQ;AAAA,sBACV;AAAA;AAAA,kBACF,IAEA,gBAAAF,MAACC,MAAA,EAAI,IAAI;AAAA,oBACP,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,YAAY;AAAA,oBACZ,KAAK;AAAA,kBACP,GACE;AAAA,oCAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,cAAc;AAAA,0BACd,SAAS,CAACO,WAAUA,OAAM,QAAQ,SAAS,SAAS,2BAA2B;AAAA,wBACjF;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAP,KAACC,aAAA,EAAW,SAAQ,WAAU,OAAM,iBAAgB,IAAI,EAAE,UAAU,SAAS,GAAG,0BAEhF;AAAA,qBACF,GAEJ;AAAA,kBAGA,gBAAAH,MAACC,MAAA,EAAI,IAAI;AAAA,oBACP,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,MAAM;AAAA,oBACN,KAAK;AAAA,kBACP,GAEE;AAAA,oCAAAC,KAAC,SAAM,WAAU,OAAM,SAAS,GAAG,gBAAe,UAAS,IAAI,EAAE,UAAU,QAAQ,KAAK,EAAE,GACvF,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACd,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,SAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,cAAc;AAAA,0BACd,SAAS,CAACO,WAAUA,OAAM,QAAQ,SAAS,SAAS,2BAA2B;AAAA,wBACjF;AAAA;AAAA,sBAPK;AAAA,oBAQP,CACD,GACH;AAAA,oBAGA,gBAAAP,KAACG,QAAA,EAAM,WAAW,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,cAAc,GAAG,OAAO,QAAQ,UAAU,IAAI,GACvF,0BAAAH,KAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,iBAAiB,GAAG,kCAE7D,GACF;AAAA,oBAGA,gBAAAH,MAACG,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,WAAW,UAAU,OAAO,kBAAkB,IAAI,EAAE,GACrF;AAAA,qCAAe,GAAG,YAAY,aAAQ;AAAA,sBAAe;AAAA,uBACxD;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAH,MAACK,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,cAAc,GAAG,MAAM,YAAY,IAAI,EAAE,GAC1D;AAAA,sBAAAH,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,KAAK,YAAY,KAAK,UAAU,QAAQ,OAAO,eAAe,GAAG,6BAEpG;AAAA,MAEA,gBAAAD;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,KAAK;AAAA,YACL,qBAAqB;AAAA,cACnB,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,YACN;AAAA,UACF;AAAA,UAEC,iBAAO,OAAON,iBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACpD,kBAAM,aAAa,YAAY,SAAS;AACxC,mBACE,gBAAAK;AAAA,cAACU;AAAA,cAAA;AAAA,gBAEC,SAAS,MAAM,SAAS,YAAY,IAAI;AAAA,gBACxC,IAAI;AAAA,kBACF,QAAQ;AAAA,kBACR,QAAQ,aAAa,cAAc;AAAA,kBACnC,aAAa,aAAa,iBAAiB;AAAA,kBAC3C,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,UAAU;AAAA,kBACV,WAAW;AAAA,oBACT,WAAW;AAAA,oBACX,WAAW;AAAA,oBACX,aAAa;AAAA,kBACf;AAAA,gBACF;AAAA,gBACA,WAAW,aAAa,IAAI;AAAA,gBAE3B;AAAA,gCACC,gBAAAR;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,MAAK;AAAA,sBACL,OAAM;AAAA,sBACN,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,KAAK;AAAA,wBACL,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,QAAQ;AAAA,sBACV;AAAA;AAAA,kBACF;AAAA,kBAEF,gBAAAX,MAACY,cAAA,EAAY,IAAI,EAAE,GAAG,EAAE,GACtB;AAAA,oCAAAZ;AAAA,sBAACC;AAAA,sBAAA;AAAA,wBACC,IAAI;AAAA,0BACF,QAAQ;AAAA,0BACR,iBAAiB,YAAY,SAAS,YAAY;AAAA,0BAClD,cAAc;AAAA,0BACd,UAAU;AAAA,0BACV,QAAQ;AAAA,0BACR,aAAa;AAAA,0BACb,IAAI;AAAA,wBACN;AAAA,wBAEA;AAAA,0CAAAC;AAAA,4BAACD;AAAA,4BAAA;AAAA,8BACC,IAAI;AAAA,gCACF,UAAU;AAAA,gCACV,KAAK;AAAA,gCACL,MAAM;AAAA,gCACN,OAAO;AAAA,gCACP,QAAQ;AAAA,gCACR,iBAAiB,YAAY,SAAS,SAAS;AAAA,gCAC/C,cAAc;AAAA,8BAChB;AAAA;AAAA,0BACF;AAAA,0BACA,gBAAAC;AAAA,4BAACD;AAAA,4BAAA;AAAA,8BACC,IAAI;AAAA,gCACF,UAAU;AAAA,gCACV,KAAK;AAAA,gCACL,OAAO;AAAA,gCACP,OAAO;AAAA,gCACP,QAAQ;AAAA,gCACR,iBAAiB,YAAY,SAAS,WAAW;AAAA,gCACjD,cAAc;AAAA,8BAChB;AAAA;AAAA,0BACF;AAAA,0BACA,gBAAAC;AAAA,4BAACD;AAAA,4BAAA;AAAA,8BACC,IAAI;AAAA,gCACF,UAAU;AAAA,gCACV,QAAQ;AAAA,gCACR,MAAM;AAAA,gCACN,OAAO;AAAA,gCACP,QAAQ;AAAA,gCACR,iBAAiB,YAAY,SAAS,SAAS;AAAA,gCAC/C,cAAc;AAAA,gCACd,SAAS;AAAA,8BACX;AAAA;AAAA,0BACF;AAAA;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAC;AAAA,sBAACC;AAAA,sBAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,WAAW;AAAA,0BACX,OAAO;AAAA,0BACP,YAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,SAAS;AAAA,0BACT,YAAY;AAAA,wBACd;AAAA,wBAEC,sBAAY;AAAA;AAAA,oBACf;AAAA,qBACF;AAAA;AAAA;AAAA,cA7FK,YAAY;AAAA,YA8FnB;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAGA,gBAAAH,MAACK,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,cAAc,GAAG,MAAM,WAAW,GACnD;AAAA,sBAAAH,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,KAAK,YAAY,KAAK,UAAU,QAAQ,OAAO,eAAe,GAAG,qBAEpG;AAAA,MAEA,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,IAAI,GACrD;AAAA,wBAAAC,KAACD,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,GACrE,0BAAAC;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAS;AAAA,YACT,WAAW,gBAAAL,KAAC,YAAS;AAAA,YACrB,SAAS;AAAA,YACT,UAAU,eAAe;AAAA,YACzB,OAAO,eAAe,UAAU,YAAY,eAAe,UAAU,UAAU;AAAA,YAC/E,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS;AAAA,YAEpC,yBAAe,WAAW,cACzB,eAAe,UAAU,iBACvB,eAAe,UAAU,iBAAY;AAAA;AAAA,QAC3C,GACF;AAAA,QAEA,gBAAAA,KAACD,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,GACrE,0BAAAC;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAS;AAAA,YACT,WAAW,gBAAAL,KAACW,eAAA,EAAa;AAAA,YACzB,SAAS;AAAA,YACT,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS;AAAA,YACtC;AAAA;AAAA,QAED,GACF;AAAA,QAEA,gBAAAb,MAACC,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,GACrE;AAAA,0BAAAC;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAS;AAAA,cACT,WAAW,gBAAAL,KAAC,kBAAe;AAAA,cAC3B,SAAS,MAAM,eAAe,SAAS,MAAM;AAAA,cAC7C,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS;AAAA,cACtC;AAAA;AAAA,UAED;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAO;AAAA,cACP,QAAM;AAAA,cACN,UAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QAEA,gBAAAA,KAACD,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,GACrE,0BAAAC;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAS;AAAA,YACT,OAAM;AAAA,YACN,WAAW,gBAAAL,KAACY,cAAA,EAAY;AAAA,YACxB,SAAS;AAAA,YACT,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS;AAAA,YACtC;AAAA;AAAA,QAED,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAZ;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,QAEvD,0BAAAA;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,UAAU;AAAA,YACV,SAAQ;AAAA,YACR,IAAI,EAAE,OAAO,OAAO;AAAA,YAEnB;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA;AAAA,IACb;AAAA,KACF;AAEJ;AAEA,IAAO,sBAAQ;;;AEhuBf,SAAgB,YAAAa,WAAU,WAAAC,UAAS,eAAAC,cAAa,aAAAC,kBAAiB;AACjE,SAAS,MAAM,cAAc;AAC7B;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AACP,OAAO,gBAAgB;AACvB,OAAO,oBAAoB;AAC3B,OAAO,kBAAkB;AACzB,OAAO,oBAAoB;AAC3B,OAAOC,iBAAgB;AACvB,OAAOC,mBAAkB;AACzB,OAAO,gBAAgB;AACvB,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AAC7B,OAAO,cAAc;AACrB,OAAO,oBAAoB;AAC3B,OAAO,iBAAiB;AACxB,OAAOC,sBAAqB;AAC5B,OAAO,eAAe;AACtB,OAAOC,gBAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,gBAAgB;;;AC7CvB,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C;AAAA,EACE,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgDG,gBAAAC,MAuIE,QAAAC,aAvIF;AA7CV,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnB,IAAM,UAAU;AAAA;AAAA;AAAA;AAKhB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAKd,IAAM,SAAS;AAAA;AAAA;AAAA;AAuBf,IAAM,eAAiC;AAAA,EACrC;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM,gBAAAC,KAAC,eAAY;AAAA,IACnB,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM,gBAAAA,KAAC,cAAW;AAAA,IAClB,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM,gBAAAA,KAAC,UAAO;AAAA,IACd,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM,gBAAAA,KAAC,eAAY;AAAA,IACnB,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAM,QAAQC,UAAS;AACvB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,CAAC;AAClD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsD,CAAC,CAAC;AAExF,QAAM,WAAW,kBAAkB;AAGnC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,UAAM,WAAW,YAAY,MAAM;AACjC,sBAAgB,CAAC,UAAU,OAAO,KAAK,SAAS,MAAM;AAAA,IACxD,GAAG,GAAI;AAEP,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,MAAM,SAAS,MAAM,CAAC;AAG1B,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,UAAM,mBAAmB,MAAM;AAC7B,YAAM,cAAc,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO;AAAA,QACvD,IAAI,KAAK,IAAI,IAAI;AAAA,QACjB,GAAG,KAAK,OAAO,IAAI;AAAA,QACnB,GAAG,KAAK,OAAO,IAAI;AAAA,MACrB,EAAE;AACF,kBAAY,WAAW;AAAA,IACzB;AAEA,qBAAiB;AACjB,UAAM,WAAW,YAAY,kBAAkB,GAAI;AAEnD,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,kBAAkB,MAAM,KAAK,UAAQ,KAAK,OAAO,WAAW,KAAK,MAAM,CAAC;AAC9E,QAAM,mBAAmB,MAAM,UAAU,UAAQ,KAAK,OAAO,WAAW;AACxE,QAAM,eAAe,oBAAoB,KAAM,mBAAmB,KAAK,MAAM,SAAU,MAAM;AAE7F,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,UAAS;AAAA,MACT,WAAS;AAAA,MACT,YAAY;AAAA,QACV,IAAI;AAAA,UACF,cAAc;AAAA,UACd,YAAY;AAAA,cACR,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,cACtC,MAAM,MAAM,QAAQ,UAAU,MAAM,GAAG,CAAC;AAAA,UAC5C,gBAAgB;AAAA,UAChB,QAAQ,aAAa,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,UAC3D,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,IAAI;AAAA,UACF,iBAAiB,MAAM,MAAM,QAAQ,WAAW,SAAS,GAAG;AAAA,UAC5D,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MAGC;AAAA,iBAAS,IAAI,CAACC,aACb,gBAAAN;AAAA,UAACO;AAAA,UAAA;AAAA,YAEC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,MAAM,GAAGD,SAAQ,CAAC;AAAA,cAClB,KAAK,GAAGA,SAAQ,CAAC;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY,MAAM,QAAQ,QAAQ;AAAA,cAClC,WAAW,GAAGA,QAAO;AAAA,cACrB,QAAQ;AAAA,YACV;AAAA;AAAA,UAXKA,SAAQ;AAAA,QAYf,CACD;AAAA,QAED,gBAAAF,MAACI,gBAAA,EAAc,IAAI,EAAE,WAAW,UAAU,IAAI,GAAG,UAAU,YAAY,QAAQ,EAAE,GAE/E;AAAA,0BAAAJ,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,UAAU,YAAY,QAAQ,IAAI,GAElD;AAAA,4BAAAP,KAAC,QAAK,IAAI,MAAM,SAAS,KACvB,0BAAAI;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,oBACR,MAAM,QAAQ,QAAQ,IAAI;AAAA,oBAC1B,MAAM,QAAQ,UAAU,IAAI;AAAA,kBAChC,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,WAAW,GAAG,UAAU;AAAA,kBACxB,WAAW,cAAc,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,kBAC/D,UAAU;AAAA,gBACZ;AAAA,gBAEC;AAAA,kCAAgB;AAAA,kBAGjB,gBAAAP;AAAA,oBAACO;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,QAAQ,aAAa,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,wBAC3D,gBAAgB,MAAM,QAAQ,QAAQ;AAAA,wBACtC,WAAW,GAAG,MAAM;AAAA,wBACpB,KAAK;AAAA,wBACL,MAAM;AAAA,sBACR;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF,GACF;AAAA,YAGA,gBAAAP;AAAA,cAACO;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,WAAW,GAAG,KAAK;AAAA,kBACnB,OAAO,MAAM,QAAQ,UAAU;AAAA,gBACjC;AAAA,gBAEA,0BAAAP,KAAC,YAAS;AAAA;AAAA,YACZ;AAAA,YAEA,gBAAAA;AAAA,cAACO;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,MAAM;AAAA,kBACN,WAAW,GAAG,KAAK;AAAA,kBACnB,OAAO,MAAM,QAAQ,QAAQ;AAAA,kBAC7B,gBAAgB;AAAA,gBAClB;AAAA,gBAEA,0BAAAP,KAAC,QAAK;AAAA;AAAA,YACR;AAAA,aACF;AAAA,UAGA,gBAAAA,KAACS,aAAA,EAAW,SAAQ,MAAK,cAAY,MAAC,IAAI,EAAE,YAAY,IAAI,GACzD,iBACH;AAAA,UAGA,gBAAAT,KAACU,OAAA,EAAK,IAAI,MACR,0BAAAV;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,cAAY;AAAA,cACZ,IAAI,EAAE,WAAW,GAAG;AAAA,cAEnB,0BAAgB;AAAA;AAAA,UACnB,KARmB,gBAAgB,EASrC;AAAA,UAGA,gBAAAT,KAACU,OAAA,EAAK,IAAI,MACR,0BAAAV;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG;AAAA,cAE1B,0BAAgB;AAAA;AAAA,UACnB,KAPmB,gBAAgB,WAQrC;AAAA,UAGA,gBAAAT,KAACO,MAAA,EAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,GAAG,UAAU,SAAS,GAC/C,0BAAAP,KAACU,OAAA,EAAK,IAAI,MAAyB,SAAS,KAC1C,0BAAAV;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI;AAAA,gBACF,WAAW;AAAA,gBACX,OAAO,MAAM,QAAQ,KAAK;AAAA,gBAC1B,SAAS;AAAA,cACX;AAAA,cAEC,mBAAS,YAAY;AAAA;AAAA,UACxB,KAVmB,YAWrB,GACF;AAAA,UAGA,gBAAAL,MAACG,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,4BAAAP;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,IAAI;AAAA,kBACF,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,kBACtD,4BAA4B;AAAA,oBAC1B,cAAc;AAAA,oBACd,YAAY;AAAA,oBACR,MAAM,QAAQ,QAAQ,IAAI;AAAA,oBAC1B,MAAM,QAAQ,UAAU,IAAI;AAAA,kBAClC;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YACA,gBAAAI,MAACK,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAC9D;AAAA,mBAAK,MAAM,YAAY;AAAA,cAAE;AAAA,eAC5B;AAAA,aACF;AAAA,UAGA,gBAAAT,KAACO,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,KAAK,GAAG,IAAI,EAAE,GACjE,gBAAM,IAAI,CAAC,MAAM,UAChB,gBAAAP;AAAA,YAACO;AAAA,YAAA;AAAA,cAEC,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,iBAAiB,SAAS,mBACtB,MAAM,QAAQ,QAAQ,OACtB,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,gBACzC,YAAY;AAAA,gBACZ,WAAW,UAAU,mBAAmB,eAAe;AAAA,cACzD;AAAA;AAAA,YAVK,KAAK;AAAA,UAWZ,CACD,GACH;AAAA,UAGC,gBAAgB,YACf,gBAAAH,MAACK,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB;AAAA;AAAA,YACjC,gBAAgB;AAAA,YAAS;AAAA,aAC7C;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,4BAAQ;;;AC3Wf,SAAS,YAAAE,WAAU,eAAAC,oBAAmB;AAqB/B,IAAM,uBAAuB,MAAkC;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,UAA0B;AAAA,IACtE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,iBAAiBC,aAAY,CACjC,QAAgB,iBAChB,aACG;AACH,uBAAmB;AAAA,MACjB,WAAW;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,MAAM;AACvC,uBAAmB,WAAS;AAAA,MAC1B,GAAG;AAAA,MACH,WAAW;AAAA,IACb,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,CAAC,MAAc,aAAqB;AACrE,uBAAmB,WAAS;AAAA,MAC1B,GAAG;AAAA,MACH;AAAA,MACA,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAAA,IAC/C,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AFg1Bc,SAiJQ,YAAAC,WA1IJ,OAAAC,MAPJ,QAAAC,aAAA;AAv1Bd,IAAM,kBAAkB,CAAC,aAAqB;AAC5C,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAIxD,QAAM,cAA4C;AAAA;AAAA,IAEhD,OAAO,EAAE,MAAM,kBAAkB,OAAO,WAAW,UAAU,WAAW;AAAA,IACxE,OAAO,EAAE,MAAM,aAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACnE,QAAQ,EAAE,MAAM,aAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACpE,OAAO,EAAE,MAAM,aAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACnE,OAAO,EAAE,MAAM,aAAa,OAAO,WAAW,UAAU,WAAW;AAAA;AAAA,IAGnE,OAAO,EAAE,MAAM,iBAAiB,OAAO,WAAW,UAAU,OAAO;AAAA,IACnE,MAAM,EAAE,MAAM,iBAAiB,OAAO,WAAW,UAAU,QAAQ,UAAU,WAAW;AAAA,IACxF,YAAY,EAAE,MAAM,iBAAiB,OAAO,WAAW,UAAU,QAAQ,UAAU,WAAW;AAAA;AAAA,IAG9F,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACnF,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC/E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACnF,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,WAAW;AAAA,IAClF,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC7E,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA;AAAA,IAG7E,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,IAAI;AAAA,IACzE,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC7E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC3E,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC/E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC3E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC7E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC/E,SAAS,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACjF,SAAS,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACjF,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA;AAAA,IAG7E,MAAM,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA;AAAA,IAGpF,QAAQ,EAAE,MAAM,gBAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACrF,OAAO,EAAE,MAAM,gBAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IACnF,QAAQ,EAAE,MAAM,gBAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACrF,OAAO,EAAE,MAAM,gBAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACpF,OAAO,EAAE,MAAM,gBAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,EACrF;AAEA,SAAO,YAAY,GAAG,KAAK,EAAE,MAAM,iBAAiB,OAAO,QAAQ,UAAU,QAAQ;AACvF;AAGA,IAAM,iBAAiB,CAAC,UAA0B;AAChD,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAGA,IAAM,uBAAuB,CAAC,KAAmB,iBAA0B;AAEzE,QAAM,mBAAmB,gBAAgB,CAAC,CAAC,IAAI;AAE/C,MAAI,kBAAkB;AAEpB,UAAM,UAAU,IAAI;AACpB,QAAI,SAAS;AACX,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,MAAI,IAAI,eAAe;AACrB,QAAI,IAAI,kBAAkB,QAAQ;AAChC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,WAAW,IAAI,kBAAkB,QAAQ;AACvC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,IACP,SAAS;AAAA,EACX;AACF;AAwBA,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,MAAM;AACJ,QAAM,WAAWC,UAAS;AAC1B,QAAM,WAAWC,eAAc,SAAS,YAAY,KAAK,IAAI,CAAC;AAE9D,QAAM,YAAY,uBAAuB;AACzC,QAAM,WAAW,YAAY;AAC7B,QAAM,kCAAkC;AAAA,IACtC,CAAC,UAAU,MAAM;AAAA,EACnB;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAGnB,QAAM,EAAE,gBAAgB,gBAAgB,gBAAgB,gBAAgB,IAAI,qBAAqB;AAGjG,QAAM,mBACH,SAAS,QAAQ,KAAK,SAAS,kBAAkB,KAAK,SAAS,oBAAoB,MACpF,mCACA;AAEF,QAAM,CAAC,qBAAqB,sBAAsB,IAAIC,UAAS,KAAK;AACpE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA8B,IAAI;AACxE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAyB,CAAC,CAAC;AACzE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAGhE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAiB,KAAK;AACtE,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAsC,KAAK;AACjG,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,MAAM;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiB,MAAM;AACnD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAyB,MAAM;AACjE,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAmB,CAAC,CAAC;AACvE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAyB,CAAC,CAAC;AACvE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAA6B,IAAI;AACjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAiB,EAAE;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAA0C,SAAS;AACnG,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAEjF,QAAM,UAAU,CAAC,EAAE,UAAU,MAAM,WAAW,UAAU,MAAM;AAE9D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAkB,KAAK;AACjE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAyBlD,QAAM,+BAA+BC,aAAY,CAAC,eAAoD;AACpG,WAAO,WAAW,IAAI,CAAC,QAAQ;AAC7B,YAAM,YAAY,IAAI,MAAM,IAAI,UAAU,IAAI;AAC9C,YAAM,QAAQ,OAAO,cAAc,WAC/B,YACA,YACA,KAAK,UAAU,SAAS,IACxB,OAAO;AAEX,YAAM,WAAW,IAAI,YAAY,IAAI,QAAQ;AAC7C,YAAM,aAAa,IAAI,cAAc,IAAI,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC7E,YAAM,WAAW,IAAI,YAAY,IAAI,QAAQ;AAC7C,YAAM,iBAAiB,QAAQ,IAAI,OAAO;AAE1C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,IAAI,WAAW,IAAI,WAAW;AAAA,QACvC,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW,IAAI,KAAK,UAAU;AAAA,QAC9B,WAAW,IAAI;AAAA,QACf,MAAM,IAAI,QAAQ;AAAA,QAClB,YAAY,IAAI,cAAc,IAAI,UAAU;AAAA,QAC5C,WAAW,IAAI,aAAa;AAAA,QAC5B,QAAQ,IAAI,UAAU;AAAA,QACtB,KAAK,IAAI,OAAO;AAAA,QAChB,eAAe,CAAC;AAAA,QAChB,eAAe;AAAA,QACf,eAAe,iBAAiB,SAAS;AAAA,QACzC,GAAI,iBAAiB,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsBA,aAAY,YAAY;AAClD,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,yBAAqB,IAAI;AACzB,QAAI;AACF,YAAM,OAAO,MAAM,iBAAiB,GAAG,GAAG;AAC1C,YAAM,aAAa,6BAA6B,IAAI;AACpD,yBAAmB,UAAU;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AAAA,IACzD,UAAE;AACA,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,iBAAiB,kBAAkB,4BAA4B,CAAC;AAGpE,EAAAC,WAAU,MAAM;AACd,QAAI,iBAAiB;AACnB,0BAAoB;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,iBAAiB,mBAAmB,CAAC;AAGzC,QAAM,6BAA6BC,SAAQ,MAAM;AAE3C,UAAM,kBAAkB,kBAAkB,kBAAkB;AAChE,QAAI,WAAW;AAGf,QAAI,aAAa;AACf,UAAI,iBAAiB;AAGnB,mBAAW,SAAS;AAAA,UAAO,SACzB,IAAI,KAAK,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,KACzD,IAAI,QAAQ,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC;AAAA,QAC9D;AAAA,MACF,OAAO;AACL,mBAAW,SAAS;AAAA,UAAO,SACzB,IAAI,KAAK,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,KACzD,IAAI,QAAQ,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAGA,QAAI,qBAAqB,OAAO;AAC9B,iBAAW,SAAS;AAAA,QAAO,SACzB,gBAAgB,IAAI,IAAI,EAAE,aAAa;AAAA,MACzC;AAAA,IACF;AAGA,QAAI,wBAAwB,OAAO;AACjC,iBAAW,SAAS,OAAO,SAAO;AAChC,cAAM,aAAa,qBAAqB,KAAK,eAAe;AAE5D,YAAI,wBAAwB,YAAY;AACtC,iBAAO,WAAW,UAAU,cAAc,WAAW,UAAU;AAAA,QACjE,WAAW,wBAAwB,QAAQ;AACzC,iBAAO,WAAW,UAAU;AAAA,QAC9B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,aAAS,KAAK,CAAC,GAAG,MAAM;AACtB,UAAI,aAAa;AACjB,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,uBAAa,EAAE,KAAK,cAAc,EAAE,IAAI;AACxC;AAAA,QACF,KAAK;AAEH,uBAAa,UAAU,QAAQ,CAAC,IAAI,UAAU,QAAQ,CAAC;AACvD;AAAA,QACF,KAAK;AACH,wBAAc,EAAE,QAAQ,UAAU,MAAM,EAAE,QAAQ,UAAU;AAC5D;AAAA,QACF,KAAK;AACH,uBAAa,gBAAgB,EAAE,IAAI,EAAE,SAAS,cAAc,gBAAgB,EAAE,IAAI,EAAE,QAAQ;AAC5F;AAAA,MACJ;AACA,aAAO,cAAc,QAAQ,aAAa,CAAC;AAAA,IAC7C,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,iBAAiB,iBAAiB,aAAa,kBAAkB,qBAAqB,QAAQ,SAAS,CAAC;AAGvH,QAAM,aAAaA,SAAQ,MAAM;AAC3B,UAAM,kBAAkB,kBAAkB,kBAAkB;AAChE,UAAM,OAAO,IAAI,IAAI,gBAAgB,IAAI,SAAO,gBAAgB,IAAI,IAAI,EAAE,QAAQ,CAAC;AACnF,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B,GAAG,CAAC,WAAW,iBAAiB,eAAe,CAAC;AAGhD,QAAM,aAAaA,SAAQ,MAAM;AAC3B,UAAM,kBAAkB,kBAAkB,kBAAkB;AAGhE,UAAM,YAAY,gBAAgB,OAAO,CAAC,KAAK,QAAQ;AACrD,UAAI,mBAAmB,IAAI,MAAM;AAC/B,eAAO,MAAM,IAAI;AAAA,MACnB,OAAO;AACL,eAAO,OAAO,IAAI,SAAS,UAAU,KAAK;AAAA,MAC5C;AAAA,IACF,GAAG,CAAC;AAEJ,UAAM,iBAAiB,gBAAgB,OAAO,CAAC,KAAK,QAAQ;AAC1D,YAAM,WAAW,gBAAgB,IAAI,IAAI,EAAE;AAC3C,UAAI,QAAQ,KAAK,IAAI,QAAQ,KAAK,KAAK;AACvC,aAAO;AAAA,IACT,GAAG,CAAC,CAA2B;AAE/B,WAAO;AAAA,MACL,gBAAgB,gBAAgB;AAAA,MAChC,WAAW,eAAe,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,iBAAiB,eAAe,CAAC;AAEhD,QAAM,cAAc,CAAC,aAA6B;AAChD,UAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACnD,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAIA,QAAM,uBAAuB,OAAO,UAAsF;AACxH,QAAI,iBAAiB;AAEnB;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,OAAO,MAAM,CAAC;AAGpB,yBAAe,UAAW,IAAI,MAAM,SAAU,EAAE;AAGhD,gBAAM,sBAAsB,UAAU,gBAAgB;AACtD,gBAAM,SAAS,MAAM,eAAe,MAAM,mBAAmB;AAG7D,yBAAe,WAAW,KAAM,IAAI,MAAM,SAAU,EAAE;AAEtD,cAAI,CAAC,OAAO,SAAS;AACnB,kBAAM,IAAI,MAAM,OAAO,SAAS,sBAAsB;AAAA,UACxD;AAAA,QACF;AAGA,uBAAe,YAAY,EAAE;AAG7B,uBAAe,YAAY,GAAG;AAG9B,cAAM,oBAAoB;AAE1B,eAAO,EAAE,SAAS,MAAM,YAAY,KAAK;AAAA,MAC3C,SAAS,OAAO;AACd,gBAAQ,MAAM,uCAAuC,KAAK;AAC1D,uBAAe;AAEf,YAAI;AACF,gBAAM,aAAa,KAAK;AACxB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UACxF;AAAA,QACF,SAAS,YAAY;AACnB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO,wCAAwC,sBAAsB,QAAQ,WAAW,UAAU,OAAO,UAAU,CAAC;AAAA,UACtH;AAAA,QACF;AAAA,MACF,UAAE;AAEA,mBAAW,MAAM;AACf,yBAAe;AAAA,QACjB,GAAG,IAAI;AAAA,MACT;AAAA,IACF,OAAO;AAEL,UAAI;AACF,cAAM,aAAa,KAAK;AACxB,eAAO,EAAE,SAAS,MAAM,YAAY,MAAM;AAAA,MAC5C,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,MAA2C;AACzE,UAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAC7C,QAAI,MAAM,WAAW,EAAG;AAGxB,UAAM,kBAAkC,MAAM,IAAI,WAAS;AAAA,MACzD,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,EAAE;AACF,sBAAkB,eAAe;AAEjC,QAAI;AAEF,wBAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,QAC5C,GAAG;AAAA,QACH,UAAU;AAAA,MACZ,EAAE,CAAC;AAGH,YAAM,SAAS,MAAM,qBAAqB,KAAK;AAE/C,UAAI,OAAO,SAAS;AAElB,0BAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,UAC5C,GAAG;AAAA,UACH,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,EAAE,CAAC;AAGH,cAAM,UAAU,OAAO,aACnB,yBAAyB,MAAM,MAAM,oCACrC,OAAO,QACL,mCAAmC,OAAO,KAAK,KAC/C,yBAAyB,MAAM,MAAM;AAE3C,2BAAmB,OAAO;AAC1B,4BAAoB,OAAO,QAAQ,YAAY,SAAS;AACxD,wBAAgB,IAAI;AAGpB,mBAAW,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAI;AAG5C,mBAAW,YAAY;AACrB,cAAI;AACF,kBAAM,cAAc;AAAA,UACtB,SAAS,WAAW;AAClB,oBAAQ,MAAM,2CAA2C,SAAS;AAAA,UACpE;AAAA,QACF,GAAG,GAAG;AAAA,MACR,OAAO;AAEL,0BAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,UAC5C,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,EAAE,CAAC;AAEH,2BAAmB,+BAA+B,OAAO,SAAS,eAAe,EAAE;AACnF,4BAAoB,OAAO;AAC3B,wBAAgB,IAAI;AAAA,MACtB;AAAA,IAEF,SAAS,KAAK;AACZ,wBAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,QAC5C,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,EAAE,CAAC;AAEH,yBAAmB,+BAA+B,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AACxG,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAEpB,cAAQ,MAAM,2BAA2B,GAAG;AAAA,IAC9C,UAAE;AAEA,UAAI,EAAE,QAAQ;AACZ,UAAE,OAAO,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,OAAO,MAAuC;AACnE,MAAE,eAAe;AACjB,kBAAc,KAAK;AACnB,UAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAE7C,QAAI,MAAM,WAAW,EAAG;AAGxB,UAAM,kBAAkC,MAAM,IAAI,WAAS;AAAA,MACzD,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,EAAE;AACF,sBAAkB,eAAe;AAEjC,QAAI;AAEF,wBAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,QAC5C,GAAG;AAAA,QACH,UAAU;AAAA,MACZ,EAAE,CAAC;AAGH,YAAM,SAAS,MAAM,qBAAqB,KAAK;AAE/C,UAAI,OAAO,SAAS;AAElB,0BAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,UAC5C,GAAG;AAAA,UACH,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,EAAE,CAAC;AAGH,cAAM,UAAU,OAAO,aACnB,yBAAyB,MAAM,MAAM,oCACrC,OAAO,QACL,mCAAmC,OAAO,KAAK,KAC/C,yBAAyB,MAAM,MAAM;AAE3C,2BAAmB,OAAO;AAC1B,4BAAoB,OAAO,QAAQ,YAAY,SAAS;AACxD,wBAAgB,IAAI;AAGpB,mBAAW,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAI;AAG5C,mBAAW,YAAY;AACrB,cAAI;AACF,kBAAM,cAAc;AAAA,UACtB,SAAS,WAAW;AAClB,oBAAQ,MAAM,yCAAyC,SAAS;AAAA,UAClE;AAAA,QACF,GAAG,GAAG;AAAA,MACR,OAAO;AAEL,0BAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,UAC5C,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,EAAE,CAAC;AAEH,2BAAmB,+BAA+B,OAAO,SAAS,eAAe,EAAE;AACnF,4BAAoB,OAAO;AAC3B,wBAAgB,IAAI;AAAA,MACtB;AAAA,IAEF,SAAS,KAAK;AACZ,wBAAkB,UAAQ,KAAK,IAAI,aAAW;AAAA,QAC5C,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,EAAE,CAAC;AAEH,yBAAmB,+BAA+B,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AACxG,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAEpB,cAAQ,MAAM,oBAAoB,GAAG;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,MAAuC;AAC7D,MAAE,eAAe;AACjB,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,kBAAkB,CAAC,MAAuC;AAC9D,MAAE,eAAe;AACjB,kBAAc,KAAK;AAAA,EACrB;AAEA,QAAM,yBAAyB,OAAO,GAAqB,QAAsB;AAC/E,MAAE,gBAAgB;AAElB,QAAI;AACF,UAAI,mBAAmB,IAAI,IAAI;AAE7B,cAAM,mBAAmB,IAAI,IAAI,IAAI,IAAI;AAEzC,2BAAmB,cAAc,IAAI,IAAI,EAAE;AAC3C,4BAAoB,SAAS;AAC7B,wBAAgB,IAAI;AAAA,MACtB,OAAO;AAEL,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACzE,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,OAAO;AACZ,aAAK,WAAW,IAAI;AACpB,iBAAS,KAAK,YAAY,IAAI;AAC9B,aAAK,MAAM;AACX,iBAAS,KAAK,YAAY,IAAI;AAC9B,YAAI,gBAAgB,GAAG;AAAA,MACzB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oBAAoB,KAAK;AACvC,yBAAmB,sBAAsB,IAAI,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAChH,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,QAAsB;AACvD,QAAI,mBAAmB,IAAI,MAAM,CAAC,IAAI,SAAS;AAG7C,UAAI;AACF,cAAM,UAAU,MAAM,eAAe,IAAI,EAAE;AAC3C,YAAI,SAAS;AAEX,gBAAM,aAA2B;AAAA,YAC/B,GAAG;AAAA,YACH,SAAS,QAAQ;AAAA,YACjB,MAAM,QAAQ;AAAA,UAChB;AACA,yBAAe,UAAU;AAAA,QAC3B,OAAO;AAEL,6BAAmB,6BAA6B,IAAI,IAAI,sCAAsC;AAC9F,8BAAoB,SAAS;AAC7B,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAC7C,2BAAmB,qBAAqB,IAAI,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC/G,4BAAoB,OAAO;AAC3B,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF,OAAO;AAEL,qBAAe,GAAG;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,uBAAuB,OAAO,GAA4B,UAAkB;AAChF,OAAG,gBAAgB;AAGnB,yBAAqB,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC;AAGvD,eAAW,YAAY;AACrB,YAAM,eAAe,KAAK;AAG1B,2BAAqB,CAAC,SAAS;AAC7B,cAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,eAAO,OAAO,KAAK;AACnB,eAAO;AAAA,MACT,CAAC;AAGD,UAAI,iBAAiB;AACnB,cAAM,oBAAoB;AAAA,MAC5B;AAEA,yBAAmB,kBAAkB;AACrC,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAAA,IACtB,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,0BAA0B,YAAY;AAC1C,UAAM,kBAAkB;AAGxB,QAAI,iBAAiB;AACnB,YAAM,oBAAoB;AAAA,IAC5B;AAEA,2BAAuB,KAAK;AAC5B,uBAAmB,uBAAuB;AAC1C,wBAAoB,SAAS;AAC7B,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,mBAAmB,YAAY;AAEnC,yBAAqB,UAAQ,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,iBAAiB,CAAC,CAAC;AAGrE,eAAW,YAAY;AACrB,YAAM,iBAAiB,kBAAkB,IAAI,QAAM,eAAe,EAAE,CAAC;AACrE,YAAM,QAAQ,IAAI,cAAc;AAGhC,2BAAqB,UAAQ;AAC3B,cAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,0BAAkB,QAAQ,QAAM,OAAO,OAAO,EAAE,CAAC;AACjD,eAAO;AAAA,MACT,CAAC;AAGD,UAAI,iBAAiB;AACnB,cAAM,oBAAoB;AAAA,MAC5B;AAEA,2BAAqB,CAAC,CAAC;AACvB,yBAAmB,WAAW,kBAAkB,MAAM,YAAY;AAClE,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAAA,IACtB,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,0BAA0B,CAAC,UAAkB;AACjD;AAAA,MAAqB,UACnB,KAAK,SAAS,KAAK,IACf,KAAK,OAAO,QAAM,OAAO,KAAK,IAC9B,CAAC,GAAG,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,yBAAqB,2BAA2B,IAAI,SAAO,IAAI,EAAE,CAAC;AAAA,EACpE;AAEA,QAAM,iBAAiB,MAAM;AAC3B,yBAAqB,CAAC,CAAC;AAAA,EACzB;AAEA,SACE,gBAAAC,KAACC,MAAA,EAAI,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,EAAE,GACtC,0BAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GAEpD;AAAA,oBAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GAChC;AAAA,sBAAAC;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,YACzC,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,YACtB,gBAAgB;AAAA,YAChB,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,YAC7C,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,UACvB;AAAA,UAEA;AAAA,4BAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,WAAW,EAAE,IAAI,QAAQ,IAAI,UAAU,EAAE,GAClD;AAAA,8BAAAC;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,UAAU,EAAE,IAAI,WAAW,IAAI,SAAS,EAAE;AAAA,kBACzE;AAAA;AAAA,oBAEE,mBACC,gBAAAH;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,MAAK;AAAA,wBACL,IAAI,EAAE,IAAI,EAAE;AAAA;AAAA,oBACd;AAAA;AAAA;AAAA,cAEJ;AAAA,cACA,gBAAAF;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,IAAI,EAAE,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,kBAChE;AAAA;AAAA,oBAC0E,kBAAkB,2BAA2B;AAAA,oBAA0B;AAAA;AAAA;AAAA,cAClJ;AAAA,eACF;AAAA,YACA,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,YAAY,UAAU,UAAU,QAAQ,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE,GAC5H;AAAA,iCACC,gBAAAD;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAM,WAAW,UAAU;AAAA,kBAC3B,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,kBAE7D,8BAAoB,eAAe;AAAA;AAAA,cACtC;AAAA,cAED,UAAU,SAAS,KAClB,gBAAAL;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,MAAM,WAAW,UAAU;AAAA,kBAC3B,WAAW,gBAAAL,KAACM,aAAA,EAAW;AAAA,kBACvB,SAAS,MAAM,uBAAuB,IAAI;AAAA,kBAC1C,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE;AAAA,kBAC/D;AAAA;AAAA,cAED;AAAA,eAEJ;AAAA;AAAA;AAAA,MACF;AAAA,MAGC,UAAU,SAAS,KAClB,gBAAAJ,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG,UAAU,QAAQ,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GAC1F;AAAA,wBAAAD,KAACO,OAAA,EAAK,IAAI,EAAE,UAAU,IAAI,GACxB,0BAAAL,MAACM,cAAA,EAAY,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,gBAAgB,EAAE,IAAI,IAAI,EAAE,GAC7D;AAAA,0BAAAR,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,WAC5B,qBAAW,gBACd;AAAA,UACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,uBAErD;AAAA,WACF,GACF;AAAA,QACA,gBAAAH,KAACO,OAAA,EAAK,IAAI,EAAE,UAAU,IAAI,GACxB,0BAAAL,MAACM,cAAA,EAAY,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,gBAAgB,EAAE,IAAI,IAAI,EAAE,GAC7D;AAAA,0BAAAR,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,WAC5B,qBAAW,WACd;AAAA,UACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,wBAErD;AAAA,WACF,GACF;AAAA,QACC,OAAO,QAAQ,WAAW,cAAc,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MAC9D,gBAAAH,KAACO,OAAA,EAAoB,IAAI,EAAE,UAAU,IAAI,GACvC,0BAAAL,MAACM,cAAA,EAAY,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,gBAAgB,EAAE,IAAI,IAAI,EAAE,GAC7D;AAAA,0BAAAR,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,WAC5B,iBACH;AAAA,UACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC,oBACH;AAAA,WACF,KARS,QASX,CACD;AAAA,SACH;AAAA,OAGJ;AAAA,IAGA,gBAAAH;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,IAAI;AAAA,UACJ,QAAQ,aAAa,cAAc,aAAa,SAAS,SAAS,IAAI,KAAK,cAAc,aAAa,SAAS,OAAO;AAAA,UACtH,SAAS,aAAa,GAAG,aAAa,SAAS,SAAS,IAAI,OAAO;AAAA,UACnE,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,WAAW;AAAA,YACT,SAAS,GAAG,aAAa,SAAS,SAAS,IAAI;AAAA,YAC/C,aAAa,aAAa,SAAS,SAAS;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS,MAAM,SAAS,eAAe,aAAa,GAAG,MAAM;AAAA,QAE7D,0BAAAL,MAACM,cAAA,EAAY,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,GACjF;AAAA,0BAAAR;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,OAAO,aAAa,iBAAiB;AAAA,gBACrC,IAAI;AAAA,cACN;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAO,aAAa,YAAY,gBAAgB,cAAY,MAClF,uBAAa,oBAAoB,oBACpC;AAAA,UACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAS,MAAC,yDAE7D;AAAA,UAGC,mBAAmB,WAClB,gBAAAD;AAAA,YAACD;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,aAAa;AAAA,cACf;AAAA,cACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAElC;AAAA,gCAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,EAAE,GACjF;AAAA,kCAAAD;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,SAAS;AAAA,sBACT,UAAU,CAAC,MAA2C,iBAAiB,EAAE,OAAO,OAAO;AAAA,sBACvF,OAAM;AAAA,sBACN,MAAK;AAAA;AAAA,kBACP;AAAA,kBACA,gBAAAT,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACxD,0BACC,gBAAAC,MAAAQ,WAAA,EACE;AAAA,oCAAAV,KAAC,aAAU,IAAI,EAAE,UAAU,QAAQ,OAAO,eAAe,GAAG;AAAA,oBAC5D,gBAAAA,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,gBAAe,YAAY,KAAK,6BAElE;AAAA,qBACF,IAEA,gBAAAD,MAAAQ,WAAA,EACE;AAAA,oCAAAV,KAAC,cAAW,IAAI,EAAE,UAAU,QAAQ,OAAO,iBAAiB,GAAG;AAAA,oBAC/D,gBAAAA,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,YAAY,KAAK,2BAEpE;AAAA,qBACF,GAEJ;AAAA,mBACF;AAAA,gBACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,SAAS,SAAS,WAAW,UAAU,IAAI,IAAI,GACvG,0BACG,uDACA,kDAEN;AAAA;AAAA;AAAA,UACF;AAAA,UAID,mBAAmB,CAAC,WACnB,gBAAAD;AAAA,YAACD;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,aAAa;AAAA,cACf;AAAA,cAEA;AAAA,gCAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,EAAE,GACjF;AAAA,kCAAAD,KAAC,cAAW,IAAI,EAAE,UAAU,QAAQ,OAAO,YAAY,GAAG;AAAA,kBAC1D,gBAAAA,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,aAAY,YAAY,KAAK,qCAE/D;AAAA,mBACF;AAAA,gBACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,SAAS,SAAS,WAAW,UAAU,IAAI,IAAI,GAAG,yEAE7G;AAAA;AAAA;AAAA,UACF;AAAA,UAGF,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,gEAErD;AAAA,UACA,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO,EAAE,SAAS,OAAO;AAAA,cACzB,QAAO;AAAA;AAAA,UACT;AAAA,WACF;AAAA;AAAA,IACF;AAAA,IAGC,eAAe,SAAS,KACvB,gBAAAA,KAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACd,yBAAe,IAAI,CAAC,QAAQ,UAC3B,gBAAAD,KAACO,OAAA,EAAiB,IAAI,EAAE,IAAI,EAAE,GAC5B,0BAAAP,KAACQ,cAAA,EAAY,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,gBAAgB,EAAE,IAAI,IAAI,EAAE,GAC7D,0BAAAN,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACtD;AAAA,aAAO,WAAW,YACjB,gBAAAD,KAACW,kBAAA,EAAgB,OAAM,WAAU,IAC/B,OAAO,WAAW,UACpB,gBAAAX,KAACY,YAAA,EAAU,OAAM,SAAQ,IAEzB,gBAAAZ,KAACC,MAAA,EAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAC/B,0BAAAD;AAAA,QAACa;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,OAAO;AAAA,UACd,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAE;AAAA;AAAA,MACnC,GACF;AAAA,MAEF,gBAAAX,MAACD,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GACjB;AAAA,wBAAAD,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,gBAC/B,iBAAO,UACV;AAAA,QACC,OAAO,SACN,gBAAAH,KAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,SACjC,iBAAO,OACV;AAAA,SAEJ;AAAA,MACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC;AAAA,eAAO;AAAA,QAAS;AAAA,SACnB;AAAA,OACF,GACF,KA9BS,KA+BX,CACD,GACH;AAAA,IAID,UAAU,SAAS,KAClB,gBAAAH,KAACO,OAAA,EAAK,IAAI,EAAE,IAAI,EAAE,GAChB,0BAAAL,MAACM,cAAA,EAAY,IAAI,EAAE,IAAI,EAAE,GACvB;AAAA,sBAAAN,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,UAAU,OAAO,GAEzE;AAAA,wBAAAD;AAAA,UAACc;AAAA,UAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,YAC9C,YAAY;AAAA,cACV,gBACE,gBAAAd,KAACe,iBAAA,EAAe,UAAS,SACvB,0BAAAf,KAAC,cAAW,GACd;AAAA,YAEJ;AAAA,YACA,IAAI,EAAE,UAAU,IAAI;AAAA,YACpB,MAAK;AAAA;AAAA,QACP;AAAA,SAGE,eAAe,wBAAwB,SAAS,qBAAqB,UACrE,gBAAAE,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,0BAAAD;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,OAAO,GAAG,CAAC,eAAe,UAAU,wBAAwB,SAAS,UAAU,qBAAqB,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,MAAM,iBAAiB,CAAC,eAAe,UAAU,wBAAwB,SAAS,UAAU,qBAAqB,SAAS,UAAU,EAAE,OAAO,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE;AAAA,cACtT,MAAK;AAAA,cACL,OAAM;AAAA,cACN,SAAQ;AAAA,cACR,IAAI,EAAE,YAAY,IAAI;AAAA;AAAA,UACxB;AAAA,UACC,wBAAwB,SACvB,gBAAAJ;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,OAAO,wBAAwB,aAAa,kBAAkB;AAAA,cAC9D,MAAK;AAAA,cACL,OAAO,wBAAwB,aAAa,SAAS;AAAA,cACrD,SAAQ;AAAA,cACR,MAAM,wBAAwB,aAAa,gBAAAJ,KAAC,cAAW,IAAK,gBAAAA,KAAC,aAAU;AAAA;AAAA,UACzE;AAAA,WAEJ;AAAA,QAIF,gBAAAE;AAAA,UAACY;AAAA,UAAA;AAAA,YACC,QAAM;AAAA,YACN,OAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,oBAAoB,EAAE,OAAO,KAAK;AAAA,YACnD,MAAK;AAAA,YACL,IAAI,EAAE,UAAU,IAAI;AAAA,YAEpB;AAAA,8BAAAd,KAACgB,WAAA,EAAS,OAAM,OAAM,uBAAS;AAAA,cAC9B,WAAW,IAAI,cACd,gBAAAhB,KAACgB,WAAA,EAAwB,OAAO,UAC7B,sBADY,QAEf,CACD;AAAA;AAAA;AAAA,QACH;AAAA,QAGA,gBAAAd;AAAA,UAACY;AAAA,UAAA;AAAA,YACC,QAAM;AAAA,YACN,OAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,uBAAuB,EAAE,OAAO,KAAoC;AAAA,YACrF,MAAK;AAAA,YACL,IAAI;AAAA,cACF,UAAU;AAAA,cACV,4BAA4B;AAAA,gBAC1B,SAAS,wBAAwB,QAAQ,mBAAwB;AAAA,cACnE;AAAA,YACF;AAAA,YAEA;AAAA,8BAAAd,KAACgB,WAAA,EAAS,OAAM,OACd,0BAAAd,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,gCAAAD,KAAC,cAAW,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,gBAAE;AAAA,iBAEtC,GACF;AAAA,cACA,gBAAAA,KAACgB,WAAA,EAAS,OAAM,YACd,0BAAAd,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,gCAAAD,KAAC,cAAW,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,gBACpD,gBAAAA,KAACG,aAAA,EAAW,2BAAa;AAAA,iBAC3B,GACF;AAAA,cACA,gBAAAH,KAACgB,WAAA,EAAS,OAAM,QACd,0BAAAd,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,gCAAAD,KAAC,aAAU,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,gBACnD,gBAAAA,KAACG,aAAA,EAAW,uBAAS;AAAA,iBACvB,GACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGA,gBAAAD;AAAA,UAACY;AAAA,UAAA;AAAA,YACC,QAAM;AAAA,YACN,OAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAe;AAAA,YACnD,MAAK;AAAA,YACL,IAAI,EAAE,UAAU,IAAI;AAAA,YAEpB;AAAA,8BAAAd,KAACgB,WAAA,EAAS,OAAM,QAAO,kBAAI;AAAA,cAC3B,gBAAAhB,KAACgB,WAAA,EAAS,OAAM,QAAO,kBAAI;AAAA,cAC3B,gBAAAhB,KAACgB,WAAA,EAAS,OAAM,QAAO,kBAAI;AAAA,cAC3B,gBAAAhB,KAACgB,WAAA,EAAS,OAAM,QAAO,kBAAI;AAAA;AAAA;AAAA,QAC7B;AAAA,QAEA,gBAAAhB;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,cAAc,QAAQ,SAAS,KAAK;AAAA,YAE/D,wBAAc,QAAQ,WAAM;AAAA;AAAA,QAC/B;AAAA,QAGA,gBAAAH,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,IAAI,OAAO,GACrC;AAAA,0BAAAD;AAAA,YAACiB;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,YAAY,MAAM;AAAA,cACjC,OAAO,aAAa,SAAS,YAAY;AAAA,cACzC,MAAK;AAAA,cAEL,0BAAAjB,KAAC,kBAAe;AAAA;AAAA,UAClB;AAAA,UACA,gBAAAA;AAAA,YAACiB;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,YAAY,MAAM;AAAA,cACjC,OAAO,aAAa,SAAS,YAAY;AAAA,cACzC,MAAK;AAAA,cAEL,0BAAAjB,KAAC,gBAAa;AAAA;AAAA,UAChB;AAAA,WACF;AAAA,SACF;AAAA,MAGC,kBAAkB,SAAS,KAC1B,gBAAAA,KAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,aAAa,UAAU,GAC5D,0BAAAC,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,wBAAAC,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B;AAAA,4BAAkB;AAAA,UAAO;AAAA,WAC5B;AAAA,QACA,gBAAAH;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,WAAW,gBAAAL,KAACM,aAAA,EAAW;AAAA,YACvB,SAAS;AAAA,YACV;AAAA;AAAA,QAED;AAAA,QACA,gBAAAN;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACV;AAAA;AAAA,QAED;AAAA,QACA,gBAAAL;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACV;AAAA;AAAA,QAED;AAAA,SACF,GACF;AAAA,OAEJ,GACF;AAAA,IAID,2BAA2B,WAAW,IACrC,gBAAAL,KAACO,OAAA,EAAK,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,GACrC,0BAAAL,MAACM,cAAA,EACC;AAAA,sBAAAR,KAAC,cAAW,IAAI,EAAE,UAAU,IAAI,OAAO,kBAAkB,IAAI,EAAE,GAAG;AAAA,MAClE,gBAAAA,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,kBAAiB,cAAY,MAAC,8BAE7D;AAAA,MACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,4BACC,oFACA,6CAEJ;AAAA,OACF,GACF,IAEA,gBAAAD,MAACD,MAAA,EAEC;AAAA,sBAAAC,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,QACvD,2BAA2B;AAAA,QAAO;AAAA,QAAK,kBAAkB,gBAAgB,SAAS,UAAU;AAAA,QAAO;AAAA,QAC3G,eAAe,SAAS,WAAW;AAAA,QACnC,mBAAmB;AAAA,SACtB;AAAA,MAGC,aAAa,SACZ,gBAAAH;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,qBAAqB;AAAA,cACnB,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,YACN;AAAA,YACA,KAAK;AAAA,UACP;AAAA,UAEC,qCAA2B,IAAI,CAAC,QAAsB;AACrD,kBAAM,aAAa,kBAAkB,SAAS,IAAI,EAAE;AACpD,kBAAM,aAAa,kBAAkB,IAAI,IAAI,EAAE;AAE/C,mBACE,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA,QAAQ,MAAM,oBAAoB,GAAG;AAAA,gBACrC,UAAU,CAAC,OAAO,qBAAqB,MAAM,EAAE;AAAA,gBAC/C,UAAU,CAAC,OAAO,wBAAwB,EAAE;AAAA,gBAC5C;AAAA,gBACA;AAAA,gBACA,SAAQ;AAAA,gBACR,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,aAAa;AAAA;AAAA,cAVR,IAAI;AAAA,YAWX;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH;AAAA;AAAA,QAGA,gBAAAA,KAACkB,QAAA,EAAM,SAAS,GACb,qCAA2B,IAAI,CAAC,QAAsB;AACrD,gBAAM,WAAW,gBAAgB,IAAI,IAAI;AACzC,gBAAM,gBAAgB,SAAS;AAC/B,gBAAM,aAAa,kBAAkB,SAAS,IAAI,EAAE;AACpD,gBAAM,aAAa,kBAAkB,IAAI,IAAI,EAAE;AAE/C,iBACE,gBAAAlB;AAAA,YAACO;AAAA,YAAA;AAAA,cAEC,IAAI;AAAA,gBACF,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,QAAQ,aAAa,aAAa,aAAa,SAAS,SAAS,IAAI,KAAK,aAAa,aAAa,SAAS,OAAO;AAAA,gBACpH,WAAW;AAAA,kBACT,WAAW;AAAA,gBACb;AAAA,gBACA,SAAS,aAAa,GAAG,aAAa,SAAS,SAAS,IAAI,OAAO;AAAA,gBACnE,SAAS,aAAa,MAAM;AAAA,gBAC5B,WAAW,aAAa,gBAAgB;AAAA,cAC1C;AAAA,cACA,SAAS,CAAC,MAAM;AACd,oBAAI,EAAE,WAAW,EAAE,SAAS;AAC1B,0CAAwB,IAAI,EAAE;AAAA,gBAChC,OAAO;AACL,sCAAoB,GAAG;AAAA,gBACzB;AAAA,cACF;AAAA,cAEA,0BAAAP,KAACQ,cAAA,EAAY,IAAI,EAAE,IAAI,EAAE,GACvB,0BAAAN,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,gCAAAD,KAAC,iBAAc,IAAI,EAAE,UAAU,IAAI,OAAO,SAAS,MAAM,GAAG;AAAA,gBAE5D,gBAAAE,MAACD,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAC9B;AAAA,kCAAAD;AAAA,oBAACG;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI;AAAA,wBACF,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,OAAO;AAAA,sBACT;AAAA,sBAEC,cAAI;AAAA;AAAA,kBACP;AAAA,kBACA,gBAAAD;AAAA,oBAACC;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,IAAI;AAAA,wBACF,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,iBAAiB;AAAA,wBACjB,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,IAAI;AAAA,sBACN;AAAA,sBAEC;AAAA,4BAAI,QAAQ,UAAU,GAAG,GAAG;AAAA,wBAAE;AAAA;AAAA;AAAA,kBACjC;AAAA,kBACA,gBAAAD,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,EAAE,GACxC;AAAA,oCAAAD;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,OAAO,SAAS;AAAA,wBAChB,MAAK;AAAA,wBACL,IAAI;AAAA,0BACF,SAAS,SAAS,QAAQ;AAAA,0BAC1B,OAAO,SAAS;AAAA,0BAChB,YAAY;AAAA,wBACd;AAAA;AAAA,oBACF;AAAA,qBACE,MAAM;AACN,4BAAM,aAAa,qBAAqB,KAAK,eAAe;AAC5D,6BACE,gBAAAJ;AAAA,wBAACI;AAAA,wBAAA;AAAA,0BACC,MAAM,gBAAAJ,KAAC,WAAW,MAAX,EAAgB,IAAI,EAAE,UAAU,SAAS,GAAG;AAAA,0BACnD,OAAO,WAAW;AAAA,0BAClB,MAAK;AAAA,0BACL,IAAI;AAAA,4BACF,SAAS,WAAW;AAAA,4BACpB,OAAO,WAAW;AAAA,4BAClB,YAAY;AAAA,4BACZ,UAAU;AAAA,4BACV,mBAAmB;AAAA,8BACjB,OAAO,WAAW;AAAA,4BACpB;AAAA,0BACF;AAAA;AAAA,sBACF;AAAA,oBAEJ,GAAG;AAAA,oBACH,gBAAAA;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,OAAO,eAAe,IAAI,QAAQ,SAAS,CAAC;AAAA,wBAC5C,MAAK;AAAA,wBACL,SAAQ;AAAA;AAAA,oBACV;AAAA,qBACF;AAAA,mBACF;AAAA,gBAEA,gBAAAF,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,SAAS,GACvD;AAAA,kCAAAD;AAAA,oBAACiB;AAAA,oBAAA;AAAA,sBACC,SAAS,CAAC,MAAM;AACd,0BAAE,gBAAgB;AAClB,gDAAwB,IAAI,EAAE;AAAA,sBAChC;AAAA,sBACA,IAAI;AAAA,wBACF,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,SAAS,aAAa,iBAAiB;AAAA,wBACvC,OAAO,aAAa,yBAAyB;AAAA,wBAC7C,QAAQ,aAAa,SAAS;AAAA,wBAC9B,aAAa;AAAA,wBACb,cAAc;AAAA,wBACd,WAAW;AAAA,0BACT,SAAS,aAAa,iBAAiB;AAAA,0BACvC,aAAa,aAAa,iBAAiB;AAAA,wBAC7C;AAAA,sBACF;AAAA,sBAEC,uBACC,gBAAAjB,KAAC,aAAU,IAAI,EAAE,UAAU,GAAG,GAAG,IAEjC,gBAAAA,KAACC,MAAA,EAAI,IAAI;AAAA,wBACP,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,SAAS;AAAA,sBACX,GAAG;AAAA;AAAA,kBAEP;AAAA,kBAEA,gBAAAD;AAAA,oBAACK;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,SAAS,CAAC,MAAM;AACd,0BAAE,gBAAgB;AAClB,+CAAuB,GAAG,GAAG;AAAA,sBAC/B;AAAA,sBACA,IAAI;AAAA,wBACF,eAAe;AAAA,wBACf,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA;AAAA,wBACjC,UAAU,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA;AAAA,wBACrC,aAAa;AAAA,wBACb,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW;AAAA;AAAA,wBACxD,YAAY;AAAA,wBACZ,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA;AAAA,wBACrB,WAAW;AAAA,0BACT,aAAa;AAAA,0BACb,SAAS;AAAA,0BACT,OAAO;AAAA,0BACP,WAAW;AAAA,0BACX,WAAW;AAAA,wBACb;AAAA,sBACF;AAAA,sBACA,WAAW,gBAAAL,KAACmB,eAAA,EAAa,IAAI,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,SAAS,EAAE,GAAG;AAAA,sBAC1E;AAAA;AAAA,kBAED;AAAA,kBAEA,gBAAAnB;AAAA,oBAACiB;AAAA,oBAAA;AAAA,sBACC,SAAS,CAAC,MAAM,qBAAqB,GAAG,IAAI,EAAE;AAAA,sBAC9C,OAAM;AAAA,sBAEN,0BAAAjB,KAACM,aAAA,EAAW;AAAA;AAAA,kBACd;AAAA,mBACF;AAAA,iBACF,GACF;AAAA;AAAA,YA5JK,IAAI;AAAA,UA6JX;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA,MAID,2BAA2B,WAAW,KACrC,gBAAAN,KAACO,OAAA,EAAK,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,GACrC,0BAAAL,MAACM,cAAA,EACC;AAAA,wBAAAR,KAAC,cAAW,IAAI,EAAE,UAAU,IAAI,OAAO,kBAAkB,IAAI,EAAE,GAAG;AAAA,QAClE,gBAAAA,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,kBAAiB,cAAY,MAAC,gCAE7D;AAAA,QACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,0DAEnD;AAAA,QACA,gBAAAH;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM;AACb,6BAAe,EAAE;AACjB,kCAAoB,KAAK;AAAA,YAC3B;AAAA,YACA,IAAI,EAAE,IAAI,EAAE;AAAA,YACb;AAAA;AAAA,QAED;AAAA,SACF,GACF;AAAA,OAEJ;AAAA,IAMF,gBAAAH,MAACkB,SAAA,EAAO,MAAM,qBAAqB,SAAS,MAAM,uBAAuB,KAAK,GAC5E;AAAA,sBAAApB,KAACqB,cAAA,EACC,0BAAAnB,MAACD,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,wBAAAD,KAACY,YAAA,EAAU,OAAM,SAAQ;AAAA,QAAE;AAAA,SAE7B,GACF;AAAA,MACA,gBAAAV,MAACoB,gBAAA,EACC;AAAA,wBAAApB,MAACqB,oBAAA,EAAkB;AAAA;AAAA,UACiB,UAAU;AAAA,UAAO;AAAA,WAErD;AAAA,QACC,UAAU,SAAS,KAClB,gBAAArB,MAACsB,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,UACxB,WAAW;AAAA,UAAU;AAAA,WACtC;AAAA,SAEJ;AAAA,MACA,gBAAAtB,MAACuB,gBAAA,EACC;AAAA,wBAAAzB,KAACK,SAAA,EAAO,SAAS,MAAM,uBAAuB,KAAK,GAAG,oBAEtD;AAAA,QACA,gBAAAL;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,WAAW,gBAAAL,KAACM,aAAA,EAAW;AAAA,YACxB;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,CAAC,CAAC;AAAA,QACR,SAAS,MAAM,eAAe,IAAI;AAAA,QAClC,KAAK;AAAA,QACL,kBAAkB,mBAAmB,CAAC,CAAC;AAAA;AAAA,IACzC;AAAA,IAGA,gBAAAA;AAAA,MAAC0B;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,QAEvD,0BAAA1B;AAAA,UAACwB;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,UAAU;AAAA,YACV,SAAQ;AAAA,YACR,IAAI,EAAE,OAAO,OAAO;AAAA,YAEnB;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IAGC,kBAAkB,SAAS,KAC1B,gBAAAtB;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,UACd,WAAW;AAAA,UACX,GAAG;AAAA,UACH,SAAS;AAAA,UACT,KAAK;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAC,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GACrC;AAAA,8BAAkB;AAAA,YAAO;AAAA,aAC5B;AAAA,UACA,gBAAAH;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAW,gBAAAL,KAACM,aAAA,EAAW;AAAA,cACvB,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA,UACA,gBAAAN;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACF;AAAA,IAIF,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,gBAAgB;AAAA,QACtB,aAAa,gBAAgB;AAAA,QAC7B,UAAU,gBAAgB;AAAA,QAC1B,OAAO,gBAAgB;AAAA,QACvB,gBAAgB,gBAAgB;AAAA;AAAA,IAClC;AAAA,KACF,GACF;AAEJ;AAEA,IAAO,uBAAQ;;;AG9qDf,SAAgB,YAAA2B,WAAU,aAAAC,YAAW,WAAAC,gBAAe;AACpD;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AACP,OAAO,iBAAiB;AACxB,OAAOC,iBAAgB;AACvB,OAAOC,kBAAiB;AACxB,OAAO,iBAAiB;AACxB,OAAO,cAAc;AACrB,OAAO,0BAA0B;AACjC,OAAOC,sBAAqB;AAC5B,OAAOC,iBAAgB;AACvB,OAAO,cAAc;AACrB,OAAO,kBAAkB;AACzB,OAAO,oBAAoB;AAC3B,OAAOC,sBAAqB;AAC5B,OAAOC,gBAAe;AAskBhB,SAyDU,YAAAC,WAxDR,OAAAC,MADF,QAAAC,aAAA;AAziBN,IAAM,8BAA8B,OAAO,OAAO;AAClD,IAAM,0BAA0B,IAAI,OAAO,OAAO;AAGlD,IAAM,cAAc,CAAC,UAA0B;AAC7C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAEA,IAAM,kBAAkB,YAAsD;AAC5E,MAAI;AACF,QAAI,aAAa,aAAa,cAAc,UAAU,SAAS;AAC7D,YAAM,WAAW,MAAM,UAAU,QAAQ,SAAS;AAClD,aAAO;AAAA,QACL,MAAM,SAAS,SAAS;AAAA,QACxB,OAAO,SAAS,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,KAAK,kCAAkC,EAAE,MAAM,CAAC;AAAA,EAC9D;AACA,SAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAC7B;AAEA,IAAM,mBAAmB,YAAwC;AAC/D,QAAM,aAAgC,CAAC;AAEvC,MAAI;AACF,gBAAY,KAAK,oCAAoC;AAGrD,QAAI;AACF,YAAM,YAAY,MAAM,UAAU,UAAU;AAC5C,kBAAY,KAAK,kCAAkC;AAAA,QACjD,WAAW,UAAU,IAAI,SAAO,EAAE,MAAM,GAAG,MAAM,SAAS,GAAG,QAAQ,EAAE;AAAA,MACzE,CAAC;AAAA,IACH,SAAS,OAAO;AACd,kBAAY,KAAK,4BAA4B,EAAE,MAAM,CAAC;AAAA,IACxD;AAKA,UAAM,sBAAsB,CAAC,wBAAwB,uBAAuB,eAAe;AAC3F,QAAI,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE;AACnC,QAAI,sBAAsB;AAE1B,eAAW,UAAU,qBAAqB;AACxC,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,QAAQ,eAAe;AAC9D,YAAI,OAAO,QAAQ,GAAG;AACpB,qBAAW;AACX,gCAAsB;AACtB,sBAAY,KAAK,oCAAoC,MAAM,EAAE;AAC7D;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,oCAAoC,MAAM,IAAI,EAAE,MAAM,CAAC;AAAA,MAC1E;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,SAAS;AAAA,MACf,WAAW,SAAS;AAAA,MACpB,aAAa;AAAA,MACb,QAAQ,sBAAsB,CAAC,GAAG,mBAAmB,gBAAgB,IAAI,CAAC;AAAA,MAC1E,UAAU,SAAS,QAAQ;AAAA,MAC3B,cAAc;AAAA,IAChB,CAAC;AAED,gBAAY,KAAK,kCAAkC;AAAA,MACjD,WAAW,SAAS;AAAA,MACpB,MAAM,SAAS;AAAA,MACf,UAAU,SAAS,QAAQ;AAAA,MAC3B,SAAS;AAAA,IACX,CAAC;AAGD,UAAM,mBAAmB,CAAC,oBAAoB,mBAAmB,WAAW;AAC5E,QAAI,gBAAgB,EAAE,MAAM,GAAG,OAAO,EAAE;AACxC,QAAI,mBAAmB;AAEvB,eAAW,UAAU,kBAAkB;AACrC,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,QAAQ,WAAW;AAC1D,oBAAY,KAAK,sBAAsB,MAAM,kBAAkB;AAAA,UAC7D,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,UACd,eAAe,IAAI,OAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,QACnD,CAAC;AACD,YAAI,OAAO,QAAQ,GAAG;AACpB,0BAAgB;AAChB,6BAAmB;AACnB,sBAAY,KAAK,0CAA0C,MAAM,IAAI;AAAA,YACnE,WAAW,OAAO;AAAA,YAClB,WAAW,OAAO;AAAA,UACpB,CAAC;AACD;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,gCAAgC,MAAM,IAAI,EAAE,MAAM,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAMC;AAAA,MACN,OAAO;AAAA,MACP,MAAM,cAAc;AAAA,MACpB,WAAW,cAAc;AAAA,MACzB,aAAa;AAAA,MACb,QAAQ,mBAAmB,CAAC,GAAG,gBAAgB,YAAY,IAAI,CAAC;AAAA,MAChE,UAAU,cAAc,QAAQ;AAAA,MAChC,cAAc;AAAA,IAChB,CAAC;AAED,gBAAY,KAAK,yCAAyC;AAAA,MACxD,WAAW,cAAc;AAAA,MACzB,MAAM,cAAc;AAAA,MACpB,eAAe,IAAI,cAAc,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MACxD,UAAU,cAAc,QAAQ;AAAA,MAChC,SAAS;AAAA,IACX,CAAC;AAGD,UAAM,gBAAgB,CAAC,oBAAoB,kBAAkB,iBAAiB;AAC9E,QAAI,aAAa,EAAE,MAAM,GAAG,OAAO,EAAE;AACrC,QAAI,gBAAgB;AAEpB,eAAW,UAAU,eAAe;AAClC,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,QAAQ,UAAU;AACzD,YAAI,OAAO,QAAQ,GAAG;AACpB,uBAAa;AACb,0BAAgB;AAChB,sBAAY,KAAK,+BAA+B,MAAM,EAAE;AACxD;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,+BAA+B,MAAM,IAAI,EAAE,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAMC;AAAA,MACN,OAAO;AAAA,MACP,MAAM,WAAW;AAAA,MACjB,WAAW,WAAW;AAAA,MACtB,aAAa;AAAA,MACb,QAAQ,gBAAgB,CAAC,GAAG,aAAa,WAAW,IAAI,CAAC;AAAA,MACzD,UAAU,WAAW,QAAQ;AAAA,MAC7B,cAAc;AAAA,IAChB,CAAC;AAGD,UAAM,gBAAgB,CAAC,gBAAgB,eAAe;AACtD,QAAI,aAAa,EAAE,MAAM,GAAG,OAAO,EAAE;AACrC,QAAI,gBAAgB;AAEpB,eAAW,UAAU,eAAe;AAClC,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,QAAQ,QAAQ;AACvD,YAAI,OAAO,QAAQ,GAAG;AACpB,uBAAa;AACb,0BAAgB;AAChB,sBAAY,KAAK,6BAA6B,MAAM,EAAE;AACtD;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,6BAA6B,MAAM,IAAI,EAAE,MAAM,CAAC;AAAA,MACnE;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,WAAW;AAAA,MACjB,WAAW,WAAW;AAAA,MACtB,aAAa;AAAA,MACb,QAAQ,gBAAgB,CAAC,GAAG,aAAa,SAAS,IAAI,CAAC;AAAA,MACvD,UAAU,WAAW,QAAQ;AAAA,MAC7B,cAAc;AAAA,IAChB,CAAC;AAGD,UAAM,eAAe,CAAC,iBAAiB,aAAa;AACpD,QAAI,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE;AACpC,QAAI,eAAe;AAEnB,eAAW,UAAU,cAAc;AACjC,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,QAAQ,SAAS;AACxD,YAAI,OAAO,QAAQ,GAAG;AACpB,sBAAY;AACZ,yBAAe;AACf,sBAAY,KAAK,iCAAiC,MAAM,EAAE;AAC1D;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,8BAA8B,MAAM,IAAI,EAAE,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,GAAG;AACvB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAMA;AAAA,QACN,OAAO;AAAA,QACP,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,QACrB,aAAa;AAAA,QACb,QAAQ,CAAC,GAAG,YAAY,UAAU;AAAA,QAClC,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,gBAAY,KAAK,uBAAuB;AAAA,MACtC,iBAAiB,WAAW;AAAA,MAC5B,YAAY,WAAW,IAAI,UAAQ;AAAA,QACjC,MAAM,IAAI;AAAA,QACV,WAAW,IAAI;AAAA,QACf,UAAU,IAAI;AAAA,QACd,cAAc,IAAI,OAAO;AAAA,MAC3B,EAAE;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EAET,SAAS,OAAO;AACd,gBAAY,MAAM,mCAAmC,EAAE,MAAM,CAAC;AAE9D,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAM,oBAAoB,OAAO,QAAgB,cAAgE;AAC/G,MAAI;AACF,gBAAY,KAAK,mCAAmC,MAAM,IAAI,SAAS,EAAE;AAGzE,UAAM,iBAAiB,IAAI,QAAyC,CAAC,GAAG,WAAW;AACjF,iBAAW,MAAM,OAAO,IAAI,MAAM,gCAAgC,MAAM,IAAI,SAAS,EAAE,CAAC,GAAG,GAAI;AAAA,IACjG,CAAC;AAED,UAAM,qBAAqB,YAAY;AAErC,YAAM,eAAe,CAAC,EAAE,MAAM,WAAW,SAAS,KAAK,CAAC;AAExD,UAAI;AACF,cAAM,QAAQ,MAAM,yBAAiB,OAAO,QAAQ,GAAG,WAAW,YAAY;AAC9E,cAAM,WAAsB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC5D,oBAAY,KAAK,aAAa,SAAS,MAAM,eAAe,MAAM,IAAI,SAAS,EAAE;AAEjF,YAAI,SAAS,WAAW,GAAG;AACzB,sBAAY,KAAK,qBAAqB,MAAM,IAAI,SAAS,EAAE;AAC3D,iBAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,QAC7B;AAGA,cAAM,YAAY,SAAS,OAAe,CAAC,KAAK,SAAS;AACvD,cAAI;AACF,mBAAO,MAAM,KAAK,UAAU,QAAQ,EAAE,EAAE,SAAS;AAAA,UACnD,QAAQ;AACN,mBAAO,MAAM;AAAA,UACf;AAAA,QACF,GAAG,CAAC;AACJ,cAAM,YAAY,SAAS;AAE3B,oBAAY,KAAK,sBAAsB,MAAM,IAAI,SAAS,KAAK,SAAS,WAAW,SAAS,QAAQ;AACpG,eAAO,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,MAC7C,SAAS,SAAS;AAChB,oBAAY,KAAK,YAAY,MAAM,aAAa,SAAS,sCAAsC,EAAE,OAAO,QAAQ,CAAC;AACjH,eAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,MAC7B;AAAA,IACF,GAAG;AAGH,WAAO,MAAM,QAAQ,KAAK,CAAC,mBAAmB,cAAc,CAAC;AAAA,EAC/D,SAAS,OAAO;AACd,gBAAY,KAAK,+BAA+B,MAAM,IAAI,SAAS,IAAI,EAAE,MAAM,CAAC;AAChF,WAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,EAC7B;AACF;AAEA,IAAM,uBAAuB,OAAO,aAA6C;AAC/E,cAAY,KAAK,8BAA8B,SAAS,IAAI,EAAE;AAE9D,aAAW,aAAa,SAAS,QAAQ;AACvC,QAAI;AACF,YAAM,CAAC,QAAQ,SAAS,IAAI,UAAU,MAAM,GAAG;AAC/C,kBAAY,KAAK,mBAAmB,MAAM,IAAI,SAAS,EAAE;AAGzD,UAAI,CAAC,UAAU,CAAC,WAAW;AACzB,oBAAY,KAAK,gCAAgC,SAAS,EAAE;AAC5D;AAAA,MACF;AAGA,YAAM,eAAe,CAAC,EAAE,MAAM,WAAW,SAAS,KAAK,CAAC;AACxD,YAAM,QAAQ,MAAM,yBAAiB,OAAO,QAAQ,GAAG,WAAW,YAAY;AAE9E,YAAM,UAAqB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAE3D,UAAI,QAAQ,SAAS,GAAG;AAEtB,mBAAW,WAAW,SAAS;AAC7B,cAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,kBAAM,SAAS;AACf,kBAAM,YAAY,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,OAAO,MAAM;AAChE,gBAAI,OAAO,cAAc,YAAY,UAAU,SAAS,GAAG;AACzD,oBAAM,yBAAiB,OAAO,QAAQ,GAAG,WAAW,WAAW,YAAY;AAAA,YAC7E;AAAA,UACF;AAAA,QACF;AACA,oBAAY,KAAK,WAAW,QAAQ,MAAM,eAAe,MAAM,IAAI,SAAS,EAAE;AAAA,MAChF,OAAO;AACL,oBAAY,KAAK,qBAAqB,MAAM,IAAI,SAAS,EAAE;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM,0BAA0B,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,IAEpE;AAAA,EACF;AACF;AAGA,IAAM,sBAAsB,OAAO,WAAkC;AACnE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,gBAAgB,UAAU,eAAe,MAAM;AAErD,kBAAc,YAAY,MAAM;AAC9B,kBAAY,KAAK,kCAAkC,MAAM,EAAE;AAC3D,cAAQ;AAAA,IACV;AAEA,kBAAc,UAAU,MAAM;AAC5B,kBAAY,MAAM,8BAA8B,MAAM,IAAI,EAAE,OAAO,cAAc,MAAM,CAAC;AACxF,aAAO,cAAc,KAAK;AAAA,IAC5B;AAEA,kBAAc,YAAY,MAAM;AAC9B,kBAAY,KAAK,8BAA8B,MAAM,uCAAuC;AAE5F,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,IAAM,aAAwC,CAAC,EAAE,aAAa,MAAM;AAClE,QAAM,QAAQC,UAAS;AACvB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAA4B;AAAA,IAClE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,sBAAsB;AAAA,EACxB,CAAC;AACD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAA4B,CAAC,CAAC;AAChF,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,KAAK;AAClE,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAiC,IAAI;AAC3F,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAA8B,SAAS;AAEvF,QAAM,EAAE,aAAa,gCAAgC,IAAI,yBAAyB,CAAC,WAAW;AAAA,IAC5F,aAAa,MAAM;AAAA,IACnB,iCAAiC,MAAM;AAAA,EACzC,EAAE;AACF,QAAM,qBAAqB,eAAe;AAC1C,QAAM,sBAAsB,qBACxB,oIACA;AACJ,QAAM,uBAAuB,qBAAqB,oDAAoD;AAItG,QAAM,kBAAkB,YAAY;AAClC,eAAW,IAAI;AACf,QAAI;AACF,kBAAY,KAAK,yBAAyB;AAE1C,YAAM,CAAC,eAAe,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpD,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AAED,YAAM,iBAAiB,WAAW,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,MAAM,CAAC;AACxE,YAAM,eAAe,cAAc,SAAS,cAAc,QAAQ,IAAI,cAAc,QAAQ;AAC5F,YAAM,kBAAkB,eAAe,IACnC,KAAK,IAAI,KAAK,IAAI,cAAc,kBAAkB,2BAA2B,GAAG,uBAAuB,IACvG,KAAK,IAAI,6BAA6B,cAAc;AAExD,YAAM,YAAY,KAAK,IAAI,kBAAkB,gBAAgB,CAAC;AAE9D,kBAAY,KAAK,oCAAoC;AAAA,QACnD;AAAA,QACA,sBAAsB,cAAc;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB,WAAW;AAAA,QAC5B,YAAY,WAAW,IAAI,UAAQ;AAAA,UACjC,MAAM,IAAI;AAAA,UACV,WAAW,IAAI;AAAA,UACf,MAAM,IAAI;AAAA,UACV,UAAU,IAAI;AAAA,QAChB,EAAE;AAAA,MACJ,CAAC;AAED,sBAAgB;AAAA,QACd,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA,sBAAsB;AAAA,MACxB,CAAC;AACD,2BAAqB,UAAU;AAAA,IACjC,SAAS,OAAO;AACd,kBAAY,MAAM,+BAA+B,EAAE,MAAM,CAAC;AAC1D,yBAAmB,qDAAqD;AACxE,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AAEpB,2BAAqB,CAAC,CAAC;AACvB,sBAAgB,EAAE,MAAM,GAAG,OAAO,6BAA6B,WAAW,6BAA6B,sBAAsB,EAAE,CAAC;AAAA,IAClI,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,CAAC;AAGL,QAAM,YAAYC,SAAQ,MAAM;AAC9B,WAAO,kBAAkB,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,MAAM,CAAC;AAAA,EACjE,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,kBAAkBA,SAAQ,MAAM;AACpC,QAAI,aAAa,UAAU,EAAG,QAAO;AACrC,UAAM,aAAa,KAAK,IAAK,aAAa,OAAO,aAAa,QAAS,KAAK,GAAG;AAE/E,WAAO,aAAa,KAAK,aAAa,MAAM,MAAM;AAAA,EACpD,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,sBAAsBA,SAAQ,MAAM;AACxC,WAAO,kBAAkB,OAAO,SAAO,IAAI,QAAQ;AAAA,EACrD,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,sBAAsB,OAAO,aAA8B;AAC/D,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,qBAAqB,QAAQ;AACnC,yBAAmB,wBAAwB,SAAS,IAAI,EAAE;AAC1D,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AACpB,6BAAuB,IAAI;AAC3B,YAAM,gBAAgB;AAAA,IACxB,SAAS,OAAO;AACd,yBAAmB,mBAAmB,SAAS,IAAI,EAAE;AACrD,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AACpB,kBAAY,MAAM,4BAA4B,EAAE,UAAU,SAAS,MAAM,MAAM,CAAC;AAAA,IAClF,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,iBAAiB,YAAY;AACjC,gBAAY,IAAI;AAChB,QAAI;AACF,iBAAW,YAAY,qBAAqB;AAC1C,cAAM,qBAAqB,QAAQ;AAAA,MACrC;AACA,yBAAmB,uCAAuC;AAC1D,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AACpB,4BAAsB,KAAK;AAC3B,YAAM,gBAAgB;AAAA,IACxB,SAAS,OAAO;AACd,yBAAmB,kCAAkC;AACrD,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AACpB,kBAAY,MAAM,+BAA+B,EAAE,MAAM,CAAC;AAAA,IAC5D,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,qBAAqB,YAAY;AACrC,QAAI,CAAC,OAAO,QAAQ,ubAAyZ,GAAG;AAC9a;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,QAAQ,8FAA8F,GAAG;AACnH;AAAA,IACF;AAEA,gBAAY,IAAI;AAChB,QAAI;AAEF,YAAM,YAAY;AAAA;AAAA,QAEhB;AAAA,QAAgB;AAAA,QAAoB;AAAA,QAAwB;AAAA;AAAA,QAE5D;AAAA,QAAuB;AAAA,QAAmB;AAAA,QAAkB;AAAA,QAC5D;AAAA,QAAe;AAAA,MACjB;AAEA,iBAAW,UAAU,WAAW;AAC9B,cAAM,oBAAoB,MAAM;AAAA,MAClC;AAGA,mBAAa,MAAM;AACnB,qBAAe,MAAM;AAErB,yBAAmB,iEAAiE;AACpF,0BAAoB,SAAS;AAC7B,sBAAgB,IAAI;AAGpB,iBAAW,MAAM;AACf,eAAO,SAAS,OAAO;AAAA,MACzB,GAAG,GAAI;AAAA,IAET,SAAS,OAAO;AACd,yBAAmB,6CAA6C;AAChE,0BAAoB,OAAO;AAC3B,sBAAgB,IAAI;AACpB,kBAAY,MAAM,wBAAwB,EAAE,MAAM,CAAC;AAAA,IACrD,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE,gBAAAC,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,YAAY,UAAU,IAAI,EAAE,GAChF;AAAA,sBAAAC,KAAC,oBAAiB;AAAA,MAClB,gBAAAA,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAAG,wCAElE;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAD,KAACD,MAAA,EACC,0BAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAEnD;AAAA,oBAAAC,KAACD,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf,0BAAAD,MAACC,MAAA,EAAI,IAAI;AAAA,MACP,SAAS;AAAA,MACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,MACzC,gBAAgB;AAAA,MAChB,YAAY,EAAE,IAAI,WAAW,IAAI,aAAa;AAAA,MAC9C,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACpB,IAAI;AAAA,IACN,GACE;AAAA,sBAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GACjB;AAAA,wBAAAC,KAACC,aAAA,EAAW,SAAQ,MAAK,OAAM,gBAAe,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG,gCAE9E;AAAA,QACA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,iEAEnD;AAAA,SACF;AAAA,MACA,gBAAAH,MAACC,MAAA,EAAI,IAAI;AAAA,QACP,SAAS;AAAA,QACT,KAAK;AAAA,QACL,UAAU,EAAE,IAAI,QAAQ,IAAI,SAAS;AAAA,QACrC,gBAAgB,EAAE,IAAI,WAAW,IAAI,WAAW;AAAA,QAChD,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,MAClC,GACE;AAAA,wBAAAD;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,IAAI;AAAA,cACF,UAAU,EAAE,IAAI,QAAQ,IAAI,cAAc;AAAA,cAC1C,MAAM,EAAE,IAAI,KAAK,IAAI,WAAW;AAAA,cAChC,WAAW;AAAA,YACb;AAAA,YAEA;AAAA,8BAAAJ,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,OAAO,GAAG,YAAY,UAAU,KAAK,EAAE,GAC3E;AAAA,gCAAAC,KAACG,cAAA,EAAY,UAAS,UAAS;AAAA,gBAAE;AAAA,iBAEnC;AAAA,cACA,gBAAAH,KAACD,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,OAAO,GAAG,YAAY,UAAU,gBAAgB,SAAS,GAC7F,0BAAAC,KAACG,cAAA,EAAY,UAAS,UAAS,GACjC;AAAA;AAAA;AAAA,QACF;AAAA,QACC,oBAAoB,SAAS,KAC5B,gBAAAL,MAAAM,WAAA,EACE;AAAA,0BAAAN;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,MAAK;AAAA,cACL,WAAW,gBAAAF,KAAC,wBAAqB,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,cAAc,EAAE,GAAG;AAAA,cACrF,SAAS,MAAM,sBAAsB,IAAI;AAAA,cACzC,IAAI;AAAA,gBACF,UAAU,EAAE,IAAI,QAAQ,IAAI,cAAc;AAAA,gBAC1C,MAAM,EAAE,IAAI,KAAK,IAAI,WAAW;AAAA,gBAChC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACrB;AAAA,cAEA;AAAA,gCAAAA,KAACD,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,SAAS,EAAE,GAAG,4BAAc;AAAA,gBAClE,gBAAAC,KAACD,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,UAAU,IAAI,OAAO,EAAE,GAAG,uBAAS;AAAA;AAAA;AAAA,UAC/D;AAAA,UACA,gBAAAD;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,MAAK;AAAA,cACL,WAAW,gBAAAF,KAACK,aAAA,EAAW,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,cAAc,EAAE,GAAG;AAAA,cAC3E,SAAS,MAAM,mBAAmB;AAAA,cAClC,IAAI;AAAA,gBACF,UAAU,EAAE,IAAI,QAAQ,IAAI,cAAc;AAAA,gBAC1C,MAAM,EAAE,IAAI,KAAK,IAAI,WAAW;AAAA,gBAChC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACrB;AAAA,cAEA;AAAA,gCAAAL,KAACD,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,SAAS,EAAE,GAAG,2BAAa;AAAA,gBACjE,gBAAAC,KAACD,MAAA,EAAI,IAAI,EAAE,SAAS,EAAE,IAAI,UAAU,IAAI,OAAO,EAAE,GAAG,qBAAO;AAAA;AAAA;AAAA,UAC7D;AAAA,WACF;AAAA,SAEJ;AAAA,OACF,GACF;AAAA,IAGA,gBAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GAEf;AAAA,sBAAAC,KAACM,OAAA,EAAK,IAAI,EAAE,IAAI,EAAE,GAChB,0BAAAR,MAACS,cAAA,EAAY,IAAI;AAAA,QACf,SAAS;AAAA,QACT,eAAe;AAAA,QACf,WAAW;AAAA,MACb,GACE;AAAA,wBAAAT,MAACG,aAAA,EAAW,SAAQ,MAAK,cAAY,MAAC,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GACjF;AAAA,0BAAAD,KAAC,eAAY,IAAI,EAAE,IAAI,GAAG,eAAe,SAAS,GAAG;AAAA,UAAE;AAAA,WAEzD;AAAA,QACA,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GACxB;AAAA,0BAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,IAAI,EAAE,GAC1D;AAAA,4BAAAC;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,OAAO,GAAG,YAAY,aAAa,IAAI,CAAC;AAAA,gBACxC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,SAAQ;AAAA;AAAA,YACV;AAAA,YACA,gBAAAR;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,OAAO,GAAG,YAAY,aAAa,SAAS,CAAC;AAAA,gBAC7C,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,SAAQ;AAAA;AAAA,YACV;AAAA,YACA,gBAAAR;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,OAAO,GAAG,YAAY,aAAa,KAAK,CAAC;AAAA,gBACzC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,SAAQ;AAAA;AAAA,YACV;AAAA,YACC,aAAa,uBAAuB,KACpC,aAAa,QAAQ,KACrB,KAAK,IAAI,aAAa,uBAAuB,aAAa,KAAK,IAAI,aAAa,QAAQ,QACvF,gBAAAR;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,OAAO,SAAI,YAAY,aAAa,oBAAoB,CAAC;AAAA,gBACzD,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,SAAQ;AAAA;AAAA,YACV;AAAA,aAEJ;AAAA,UACA,gBAAAR;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAO;AAAA,cACP,IAAI;AAAA,gBACF,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,4BAA4B;AAAA,kBAC1B,cAAc;AAAA,kBACd,SAAS,kBAAkB,KAAK,eAAe,kBAAkB,KAAK,iBAAiB;AAAA,gBACzF;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UACA,gBAAAX,MAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,IAAI,KAAK,SAAS,QAAQ,GAClF;AAAA,4BAAgB,QAAQ,CAAC;AAAA,YAAE;AAAA,aAC9B;AAAA,WACF;AAAA,QACC,kBAAkB,MACjB,gBAAAD,KAACU,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,OAAO,GAAG,mEAE9C;AAAA,SAEJ,GACF;AAAA,MAGA,gBAAAV,KAACM,OAAA,EACC,0BAAAR,MAACS,cAAA,EAAY,IAAI;AAAA,QACf,SAAS;AAAA,QACT,eAAe;AAAA,QACf,WAAW;AAAA,MACb,GACE;AAAA,wBAAAP,KAACC,aAAA,EAAW,SAAQ,MAAK,cAAY,MAAC,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,2BAEtF;AAAA,QACA,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,IAAI,EAAE,GAC1D;AAAA,0BAAAC;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,OAAO,GAAG,kBAAkB,MAAM;AAAA,cAClC,OAAM;AAAA,cACN,MAAK;AAAA;AAAA,UACP;AAAA,UACA,gBAAAR;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,OAAO,GAAG,kBAAkB,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,cACxE,OAAM;AAAA,cACN,MAAK;AAAA;AAAA,UACP;AAAA,UACA,gBAAAR;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,OAAO,GAAG,YAAY,SAAS,CAAC;AAAA,cAChC,OAAM;AAAA,cACN,MAAK;AAAA;AAAA,UACP;AAAA,WACF;AAAA,QACA,gBAAAR,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,OAAO,GACjE,+BACH;AAAA,SACF,GACF;AAAA,OACF;AAAA,IAGA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,MAAK,cAAY,MAAC,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,gCAE7F;AAAA,IAEA,gBAAAD,KAACD,MAAA,EAAI,IAAI;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,MACV,wBAAwB;AAAA,QACtB,SAAS;AAAA,MACX;AAAA,MACA,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,IAClB,GACG,4BAAkB,WAAW,IAC5B,gBAAAD,MAACY,QAAA,EAAM,UAAS,QAAO,IAAI,EAAE,IAAI,EAAE,GACjC;AAAA,sBAAAV,KAACC,aAAA,EAAW,SAAQ,SAAQ,qDAE5B;AAAA,MACA,gBAAAH,MAACG,aAAA,EAAW,SAAQ,SAAQ,WAAU,MAAK,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAC5D;AAAA,wBAAAD,KAAC,QAAG,qCAAuB;AAAA,QAC3B,gBAAAA,KAAC,QAAG,kDAAoC;AAAA,QACxC,gBAAAA,KAAC,QAAG,wDAA0C;AAAA,SAChD;AAAA,MACA,gBAAAA,KAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG,mFAE3C;AAAA,OACF,IAEA,gBAAAD,KAACW,QAAA,EAAM,SAAS,GACb,4BAAkB,IAAI,CAAC,aAAa;AACnC,YAAM,gBAAgB,SAAS;AAE/B,YAAM,qBAAqB,aAAa,QAAQ,IAAK,SAAS,OAAO,aAAa,QAAS,MAAM;AAEjG,YAAM,6BAA6B,YAAY,IAAK,SAAS,OAAO,YAAa,MAAM;AAEvF,kBAAY,KAAK,YAAY,SAAS,IAAI,4BAA4B;AAAA,QACpE,cAAc,SAAS;AAAA,QACvB;AAAA,QACA,cAAc,aAAa;AAAA,QAC3B,oBAAoB,mBAAmB,QAAQ,CAAC;AAAA,QAChD,4BAA4B,2BAA2B,QAAQ,CAAC;AAAA,MAClE,CAAC;AAED,aACE,gBAAAb,MAAC,aAA8B,IAAI,EAAE,SAAS,mBAAmB,GAC/D;AAAA,wBAAAE;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,gBAAAA,KAAC,kBAAe;AAAA,YAC5B,iBAAe,GAAG,SAAS,IAAI;AAAA,YAC/B,IAAI,GAAG,SAAS,IAAI;AAAA,YAEpB,0BAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,OAAO,QAAQ,IAAI,EAAE,GACrE;AAAA,8BAAAC,KAAC,iBAAc,IAAI,EAAE,OAAO,SAAS,OAAO,IAAI,EAAE,GAAG;AAAA,cACrD,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GACjB;AAAA,gCAAAC;AAAA,kBAACC;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAO;AAAA,sBACL,YAAY;AAAA,sBACZ,OAAO,MAAM,QAAQ,SAAS,SAAS,YAAY,MAAM,QAAQ,KAAK;AAAA,oBACxE;AAAA,oBAEC,mBAAS;AAAA;AAAA,gBACZ;AAAA,gBACA,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,IAAI,IAAI,GAChE;AAAA,kCAAAC,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,sBAAY,SAAS,IAAI,GAC5B;AAAA,kBACA,gBAAAD;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,OAAO,GAAG,SAAS,SAAS;AAAA,sBAC5B,MAAK;AAAA,sBACL,SAAQ;AAAA;AAAA,kBACV;AAAA,kBACA,gBAAAR,KAACD,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GACxB,0BAAAC;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAO,KAAK,IAAI,4BAA4B,GAAG;AAAA,sBAC/C,IAAI;AAAA,wBACF,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,SAAS;AAAA,wBACT,4BAA4B;AAAA,0BAC1B,cAAc;AAAA,0BACd,SAAS,SAAS;AAAA,wBACpB;AAAA,sBACF;AAAA;AAAA,kBACF,GACF;AAAA,kBACA,gBAAAX,MAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC;AAAA,+CAA2B,QAAQ,CAAC;AAAA,oBAAE;AAAA,qBACzC;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA;AAAA,QACF;AAAA,QACA,gBAAAD,KAAC,oBACC,0BAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,0BAAAC,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,WAAS,MACzD,mBAAS,aACZ;AAAA,UAEA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,aAAY,cAAY,MAAC,gCAE7C;AAAA,UACA,gBAAAD,KAAC,QAAK,OAAK,MACR,mBAAS,OAAO,IAAI,CAAC,UACpB,gBAAAF,MAAC,YAAqB,IAAI,EAAE,IAAI,IAAI,GAClC;AAAA,4BAAAE,KAAC,gBAAa,IAAI,EAAE,UAAU,GAAG,GAC/B,0BAAAA,KAAC,eAAY,UAAS,SAAQ,GAChC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,wBAAwB,EAAE,SAAS,SAAS,YAAY,YAAY;AAAA;AAAA,YACtE;AAAA,eAPa,KAQf,CACD,GACH;AAAA,UAEC,SAAS,WACR,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,aAAa,UAAU,GAC5D;AAAA,4BAAAD;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,WAAW,gBAAAF,KAACK,aAAA,EAAW;AAAA,gBACvB,SAAS,MAAM,uBAAuB,QAAQ;AAAA,gBAC9C,UAAU;AAAA,gBACX;AAAA;AAAA,kBACQ,SAAS;AAAA;AAAA;AAAA,YAClB;AAAA,YACC,SAAS,gBACR,gBAAAL,KAACU,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GACpC,0BAAAV,KAACC,aAAA,EAAW,SAAQ,WACjB,mBAAS,cACZ,GACF;AAAA,aAEJ,IAEA,gBAAAD,KAACU,QAAA,EAAM,UAAS,QAAO,IAAI,EAAE,IAAI,EAAE,GACjC,0BAAAV,KAACC,aAAA,EAAW,SAAQ,WACjB,mBAAS,cAAc,IAAI,4BAA4B,kDAC1D,GACF;AAAA,WAEJ,GACF;AAAA,WApGc,SAAS,IAqGzB;AAAA,IAEJ,CAAC,GACH,GAEJ;AAAA,IAGA,gBAAAD,KAACM,OAAA,EAAK,IAAI,EAAE,IAAI,EAAE,GAChB,0BAAAR,MAACS,cAAA,EACC;AAAA,sBAAAT,MAACG,aAAA,EAAW,SAAQ,MAAK,cAAY,MAAC,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GACjF;AAAA,wBAAAD,KAAC,YAAS,IAAI,EAAE,IAAI,GAAG,eAAe,SAAS,GAAG;AAAA,QAAE;AAAA,SAEtD;AAAA,MACA,gBAAAF,MAAC,QACC;AAAA,wBAAAA,MAAC,YACC;AAAA,0BAAAE,KAAC,gBACC,0BAAAA;AAAA,YAACY;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,OAAO,qBACH,MAAM,QAAQ,QAAQ,OACtB,MAAM,QAAQ,QAAQ;AAAA,cAC5B;AAAA;AAAA,UACF,GACF;AAAA,UACA,gBAAAZ;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WACE,qBACI,oHACA;AAAA;AAAA,UAER;AAAA,WACF;AAAA,QACA,gBAAAF,MAAC,YACC;AAAA,0BAAAE,KAAC,gBACC,0BAAAA,KAAC,wBAAqB,OAAM,QAAO,GACrC;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QACA,gBAAAF,MAAC,YACC;AAAA,0BAAAE,KAAC,gBACC,0BAAAA,KAACK,aAAA,EAAW,OAAM,SAAQ,GAC5B;AAAA,UACA,gBAAAL;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QACA,gBAAAF,MAAC,YACC;AAAA,0BAAAE,KAAC,gBACC,0BAAAA,KAAC,eAAY,OAAM,WAAU,GAC/B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAGA,gBAAAF;AAAA,MAACe;AAAA,MAAA;AAAA,QACC,MAAM,CAAC,CAAC;AAAA,QACR,SAAS,MAAM,uBAAuB,IAAI;AAAA,QAC1C,UAAS;AAAA,QACT,WAAS;AAAA,QAET;AAAA,0BAAAb,KAACc,cAAA,EACC,0BAAAhB,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4BAAAC,KAAC,eAAY,OAAM,WAAU;AAAA,YAAE;AAAA,YACxB,qBAAqB;AAAA,YAAK;AAAA,aACnC,GACF;AAAA,UACA,gBAAAF,MAACiB,gBAAA,EACC;AAAA,4BAAAjB,MAACkB,oBAAA,EAAkB;AAAA;AAAA,cAC8B,qBAAqB;AAAA,cAAK;AAAA,eAC3E;AAAA,YACC,qBAAqB,gBACpB,gBAAAhB,KAACU,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GACnC,8BAAoB,cACvB;AAAA,YAED,uBACC,gBAAAZ,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,SAAS,gBAAgB,cAAc,EAAE,GAC/D;AAAA,8BAAAC,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAChC,0BAAAD,KAAC,YAAO,yBAAW,GACrB;AAAA,cACA,gBAAAF,MAACG,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,aAAa,IAAI,EAAE,GAAG;AAAA;AAAA,gBAC/D,oBAAoB;AAAA,gBAAU;AAAA,gBAAM,gBAAAD,KAAC,QAAE;AAAA,gBAAE;AAAA,gBACzC,YAAY,oBAAoB,IAAI;AAAA,gBAAE;AAAA,gBAAQ,gBAAAA,KAAC,QAAE;AAAA,gBAAE;AAAA,gBACnD,oBAAoB,OAAO;AAAA,gBAAO;AAAA,gBAAkB,oBAAoB,OAAO,WAAW,IAAI,MAAM;AAAA,iBACzG;AAAA,eACF;AAAA,aAEJ;AAAA,UACA,gBAAAF,MAACmB,gBAAA,EACC;AAAA,4BAAAjB;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,uBAAuB,IAAI;AAAA,gBAC1C,UAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,uBAAuB,oBAAoB,mBAAmB;AAAA,gBAC7E,OAAM;AAAA,gBACN,SAAQ;AAAA,gBACR,WAAW,WAAW,gBAAAF,KAAC,oBAAiB,MAAM,IAAI,IAAK,gBAAAA,KAACK,aAAA,EAAW;AAAA,gBACnE,UAAU;AAAA,gBAET,qBAAW,gBAAgB;AAAA;AAAA,YAC9B;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAP;AAAA,MAACe;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,sBAAsB,KAAK;AAAA,QAC1C,UAAS;AAAA,QACT,WAAS;AAAA,QAET;AAAA,0BAAAb,KAACc,cAAA,EACC,0BAAAhB,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4BAAAC,KAACkB,YAAA,EAAU,OAAM,SAAQ;AAAA,YAAE;AAAA,aAE7B,GACF;AAAA,UACA,gBAAApB,MAACiB,gBAAA,EACC;AAAA,4BAAAf,KAACgB,oBAAA,EAAkB,yEAEnB;AAAA,YACA,gBAAAhB,KAAC,QAAK,OAAK,MAAC,IAAI,EAAE,IAAI,EAAE,GACrB,8BAAoB,IAAI,CAAC,aACxB,gBAAAF,MAAC,YACC;AAAA,8BAAAE,KAAC,gBAAa,IAAI,EAAE,UAAU,GAAG,GAC/B,0BAAAA,KAAC,SAAS,MAAT,EAAc,UAAS,SAAQ,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,GACjE;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,SAAS;AAAA,kBAClB,WAAW,GAAG,SAAS,SAAS,iBAAY,YAAY,SAAS,IAAI,CAAC;AAAA;AAAA,cACxE;AAAA,iBAPa,SAAS,IAQxB,CACD,GACH;AAAA,YACA,gBAAAA,KAACU,QAAA,EAAM,UAAS,SAAQ,IAAI,EAAE,IAAI,EAAE,GAClC,0BAAAZ,MAACG,aAAA,EAAW,SAAQ,SAClB;AAAA,8BAAAD,KAAC,YAAO,2CAA6B;AAAA,cAAS;AAAA,eAChD,GACF;AAAA,aACF;AAAA,UACA,gBAAAF,MAACmB,gBAAA,EACC;AAAA,4BAAAjB;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,sBAAsB,KAAK;AAAA,gBAC1C,UAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,SAAQ;AAAA,gBACR,WAAW,WAAW,gBAAAF,KAAC,oBAAiB,MAAM,IAAI,IAAK,gBAAAA,KAAC,wBAAqB;AAAA,gBAC7E,UAAU;AAAA,gBAET,qBAAW,oBAAoB;AAAA;AAAA,YAClC;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAA;AAAA,MAACmB;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,QAEvD,0BAAAnB;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,UAAU;AAAA,YACV,SAAQ;AAAA,YACR,IAAI,EAAE,OAAO,OAAO;AAAA,YAEnB;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;AAEA,IAAO,qBAAQ;;;ACzoCf,SAAgB,YAAAU,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AA8SC,gBAAAC,MAqBI,QAAAC,aArBJ;AAlSD,IAAM,cAAwB,MAAM;AACzC,QAAM,EAAE,UAAU,iBAAiB,QAAQ,sBAAsB,IAAI,mBAAmB;AACxF,QAAM,EAAE,UAAU,gBAAgB,IAAI,wBAAwB;AAC9D,QAAM,QAAQC,UAAS;AACvB,QAAM,WAAWC,eAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAE3D,QAAM,oBAAoBC,aAAY,CAAC,SAAiC;AACtE,UAAM,oBAAoB,iBAAiB,cAAc,KAAK;AAC9D,QAAI,mBAAmB;AACrB,aAAO;AAAA,IACT;AAEA,YAAQ,MAAM;AAAA,MACZ;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAElC,QAAM,oBAAoBA,aAAY,CAAC,WAA+C;AACpF,UAAM,aAAa,EAAE,GAAG,OAAO;AAC/B,UAAM,UAAU,OAAO,WAAW,iBAAiB,WAAW,WAAW,aAAa,KAAK,IAAI;AAC/F,UAAM,gBACJ,WAAW,kCACX,WAAW;AAEb,QAAI,SAAS;AACX,iBAAW,eAAe;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,eAAe;AAClB,aAAO,WAAW;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,kBAAkB,WAAW,IAAsB;AACtE,QAAI,YAAY;AACd,iBAAW,eAAe;AAAA,IAC5B,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,wBAAwBA,aAAY,CAAC,WAA+C;AACxF,UAAM,YAAY,EAAE,GAAG,OAAO;AAC9B,QAAI,OAAO,UAAU,iBAAiB,UAAU;AAC9C,YAAM,UAAU,UAAU,aAAa,KAAK;AAC5C,gBAAU,eAAe,WAAW;AAAA,IACtC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,WAA2B;AAAA,IACrE,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACD,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,WAAS,KAAK;AAGtE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAA8B,SAAS;AAEvF,QAAM,yBAAyB,OAAO,WAA6B;AACjE,QAAI;AACF,YAAM,EAAE,cAAc,eAAe,GAAG,kBAAkB,IAAI;AAC9D,YAAM,qBAA8C;AAAA,QAClD,GAAG;AAAA,QACH,IAAI;AAAA,MACN;AAEA,YAAM,yBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAAA,MACpC;AACA,kBAAY,KAAK,6CAA6C,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,IACrF,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AACnE,kBAAY,MAAM,gDAAgD,EAAE,MAAM,CAAC;AAC3E,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,2BAA2B,YAA8C;AAC7E,QAAI;AACF,YAAM,SAAS,MAAM,yBAAiB;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAAA,MACpC;AACA,UAAI,QAAQ;AACV,oBAAY,KAAK,gDAAgD,EAAE,MAAM,OAAO,KAAK,CAAC;AAEtF,cAAM,EAAE,IAAI,KAAK,GAAG,gBAAgB,IAAI;AACxC,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM,kDAAkD,EAAE,MAAM,CAAC;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyBD,aAAY,CAAC,WAAyE;AACnH,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,OAAO,sCAAmC;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,OAAO,cAAc,iBAAiB,iBAAiB;AAC1E,UAAM,eAAe,OAAO,OAAO,iBAAiB,YAAY,OAAO,aAAa,KAAK,IACrF,OAAO,aAAa,KAAK,IACzB;AACJ,UAAM,YAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,cAAc,OAAO;AAAA,IACvB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAGnC,EAAAE,WAAU,MAAM;AACd,UAAM,2BAA2B,YAAY;AAE3C,YAAM,cAAc,MAAM,yBAAyB;AAEnD,UAAI,aAAa;AACf,cAAM,aAAa,uBAAuB,WAAW,KAAK;AAC1D,0BAAkB,kBAAkB,UAAU,CAAC;AAAA,MACjD,WAAW,uBAAuB;AAChC,cAAM,aAAa,uBAAuB,qBAAqB,KAAK;AACpE,0BAAkB,kBAAkB,UAAU,CAAC;AAAA,MACjD,WAAW,iBAAiB,YAAY;AACtC,cAAM,aAAa,uBAAuB,gBAAgB,UAAU,KAAK,gBAAgB;AACzF,0BAAkB,kBAAkB,UAAU,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,6BAAyB;AAAA,EAC3B,GAAG,CAAC,mBAAmB,wBAAwB,uBAAuB,eAAe,CAAC;AAEtF,QAAM,cAAc,CAAC,SAAiB,aAAkC;AACtE,uBAAmB,OAAO;AAC1B,wBAAoB,QAAQ;AAC5B,oBAAgB,IAAI;AAAA,EACtB;AAGA,QAAM,2BAA2B,CAAC,SAAyB;AACzD,UAAM,aAA+B,EAAE,KAAK;AAE5C,YAAQ,MAAM;AAAA,MACZ;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,UACH,SAAS;AAAA,QACX,CAAC,CAAC;AACF;AAAA,MACF;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,UACH,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC,CAAC;AACF;AAAA,MACF;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,UACH,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAClB,CAAC,CAAC;AACF;AAAA,MACF;AACE,oBAAY,uHAAuH,OAAO;AAC1I,0BAAkB,kBAAkB;AAAA,UAClC;AAAA,UACA,YAAY,iBAAiB,iBAAiB;AAAA,UAC9C,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,CAAC,CAAC;AACF;AAAA,MACF;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,UACH,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC,CAAC;AACF;AAAA,MACF;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,UACH,YAAY,iBAAiB,iBAAiB;AAAA,UAC9C,UAAU;AAAA,QACZ,CAAC,CAAC;AACF;AAAA,MACF;AACE,0BAAkB,kBAAkB;AAAA,UAClC,GAAG;AAAA,QACL,CAAC,CAAC;AACF;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,2BAA2B,YAAY;AAC3C,QAAI;AACF,YAAM,+BAA+B,sBAAsB,cAAc;AACzE,YAAM,mBAAmB,uBAAuB,4BAA4B,KAAK;AACjF,YAAM,gBACJ,iBAAiB,kCACjB,iBAAiB;AAEnB,UAAI,iBAAiB,CAAC,iBAAiB,cAAc;AACnD,oBAAY,gEAAgE,OAAO;AACnF;AAAA,MACF;AAGA,YAAM,UAAU,kBAAkB,eAAe,gBAAgB;AACjE,UAAI,CAAC,SAAS;AACZ,oBAAY,qEAAqE,OAAO;AACxF;AAAA,MACF;AAGA,YAAM,uBAAuB,gBAAgB;AAG7C,YAAM,sBAAsB,eAAe,gBAAgB;AAG3D,UAAI,iBAAiB;AACnB,cAAM,kBAAkB;AAAA,UACtB,GAAG;AAAA,UACH,YAAY;AAAA,QACd;AACA,YAAI,iBAAiB,cAAc;AACjC,0BAAgB,eAAe,iBAAiB;AAAA,QAClD;AACA,gCAAwB,SAAS,EAAE,UAAU,gBAAgB,CAAC;AAAA,MAChE;AAEA,wBAAkB,kBAAkB,gBAAgB,CAAC;AACrD,8BAAwB,KAAK;AAC7B,kBAAY,2DAA2D,SAAS;AAChF,kBAAY,KAAK,6CAA6C,EAAE,MAAM,iBAAiB,KAAK,CAAC;AAAA,IAC/F,SAAS,OAAO;AACd,kBAAY,MAAM,0CAA0C,EAAE,MAAM,CAAC;AACrE,kBAAY,0CAA0C,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,OAAO;AAAA,IAC3H;AAAA,EACF;AAEA,QAAM,+BAA+B,YAAY;AAC/C,QAAI;AACF,YAAM,aAAa,sBAAsB,cAAc;AACvD,YAAM,uBAAuB,uBAAuB,UAAU,KAAK;AACnE,YAAM,eAAe,kBAAkB,eAAe,oBAAoB;AAE1E,YAAM,SAAS,MAAM,aAAa,4BAA4B,EAAE,WAAW,IAAM,CAAC;AAElF,UAAI,OAAO,aAAa;AACtB,oBAAY,iDAAiD,SAAS;AAAA,MACxE,OAAO;AACL,oBAAY,uDAAuD,OAAO;AAAA,MAC5E;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM,oCAAoC,EAAE,MAAM,CAAC;AAC/D,kBAAY,4DAA4D,OAAO;AAAA,IACjF;AAAA,EACF;AAEA,SACE,gBAAAC,MAACC,MAAA,EAAI,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,EAAE,GACtC;AAAA,oBAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,GAChC;AAAA,sBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,gBAAgB,UAAU,EAAE,IAAI,UAAU,IAAI,SAAS,EAAE;AAAA,UAC/F;AAAA;AAAA,MAED;AAAA,MACA,gBAAAD;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,WAAS;AAAA,UACT,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,IAAI,WAAW,IAAI,OAAO,GAAG,YAAY,IAAI;AAAA,UAC9E;AAAA;AAAA,MAED;AAAA,MAGA,gBAAAH,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,SAAS,oBAAoB,QAAQ,aAAa,aAAa,UAAU,GACpI;AAAA,wBAAAF,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,8BAEhF;AAAA,QACC,kBACC,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,0BAAAC;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,OAAO,gBAAgB,gBAAgB,EAAE,YAAY;AAAA,cACrD,OAAM;AAAA,cACN,SAAQ;AAAA;AAAA,UACV;AAAA,UACA,gBAAAH,KAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,iCAAuB,WAAW,uBAAuB,cAAc,qBAC1E;AAAA,WACF,IAEA,gBAAAD,KAACG,OAAA,EAAK,OAAM,0BAAyB,OAAM,WAAU;AAAA,SAEzD;AAAA,MAGA,gBAAAL,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,SAAS,oBAAoB,QAAQ,aAAa,aAAa,UAAU,GACpI;AAAA,wBAAAJ;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,SAAS;AAAA,cACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,cACzC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,cAC7C,gBAAgB;AAAA,cAChB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,cACpB,IAAI;AAAA,YACN;AAAA,YAEA;AAAA,8BAAAC,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,oCAEzE;AAAA,cACA,gBAAAH;AAAA,gBAACM;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS,MAAM,wBAAwB,CAAC,oBAAoB;AAAA,kBAC5D,MAAM,WAAW,UAAU;AAAA,kBAE1B;AAAA,2CAAuB,SAAS;AAAA,oBAAY;AAAA;AAAA;AAAA,cAC/C;AAAA;AAAA;AAAA,QACF;AAAA,QAEC,wBACC,gBAAAN,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GAEf;AAAA,0BAAAD;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAM;AAAA,cACN,OAAO,eAAe;AAAA,cACtB,UAAU,CAAC,MAAM,yBAAyB,EAAE,OAAO,KAAuB;AAAA,cAC1E,WAAS;AAAA,cACT,IAAI,EAAE,IAAI,EAAE;AAAA,cAEd;AAAA,gCAAAL,KAACM,WAAA,EAAS,OAAM,WAAU,mCAAqB;AAAA,gBAC/C,gBAAAN,KAACM,WAAA,EAAS,OAAM,UAAS,oBAAM;AAAA,gBAC/B,gBAAAN,KAACM,WAAA,EAAS,OAAM,UAAS,oBAAM;AAAA,gBAC/B,gBAAAN,KAACM,WAAA,EAAS,OAAM,gBAAe,0BAAY;AAAA,gBAC3C,gBAAAN,KAACM,WAAA,EAAS,OAAM,OAAM,iBAAG;AAAA,gBACzB,gBAAAN,KAACM,WAAA,EAAS,OAAM,cAAa,oCAAsB;AAAA;AAAA;AAAA,UACrD;AAAA,UAGG,eAAe,SAAS,aACvB,gBAAAR,MAACC,MAAA,EACC;AAAA,4BAAAC;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,cAAc;AAAA,gBACpC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,YAAY,EAAE,OAAO,MAAK,CAAC;AAAA,gBAClF,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAP;AAAA,cAACO;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,QAAM;AAAA,gBACN,OAAO,eAAe,YAAY;AAAA,gBAClC,UAAU,CAAC,MAAM,kBAAkB;AAAA,kBACjC,GAAG;AAAA,kBACH,UAAU,EAAE,OAAO;AAAA,gBACrB,CAAC;AAAA,gBACD,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBAEZ;AAAA,kCAAAL,KAACM,WAAA,EAAS,OAAM,UAAS,oBAAM;AAAA,kBAC/B,gBAAAN,KAACM,WAAA,EAAS,OAAM,gBAAe,0BAAY;AAAA,kBAC3C,gBAAAN,KAACM,WAAA,EAAS,OAAM,aAAY,uBAAS;AAAA,kBACrC,gBAAAN,KAACM,WAAA,EAAS,OAAM,UAAS,oBAAM;AAAA,kBAC/B,gBAAAN,KAACM,WAAA,EAAS,OAAM,OAAM,iBAAG;AAAA;AAAA;AAAA,YAC3B;AAAA,aACF;AAAA,UAID,eAAe,SAAS,YACvB,gBAAAN;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,OAAO,eAAe,WAAW;AAAA,cACjC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,SAAS,EAAE,OAAO,MAAK,CAAC;AAAA,cAC/E,WAAS;AAAA,cACT,aAAY;AAAA;AAAA,UACd;AAAA,UAID,eAAe,SAAS,YACvB,gBAAAP,MAACC,MAAA,EACC;AAAA,4BAAAC;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,WAAW;AAAA,gBACjC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,SAAS,EAAE,OAAO;AAAA,gBACpB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,OAAO,eAAe,UAAU;AAAA,gBAChC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,QAAQ,EAAE,OAAO;AAAA,gBACnB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,gBAAgB;AAAA,gBACtC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,cAAc,EAAE,OAAO;AAAA,gBACzB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,aAAY;AAAA,gBACZ,YAAW;AAAA;AAAA,YACb;AAAA,aACF;AAAA,UAID,eAAe,SAAS,kBACvB,gBAAAP,MAACC,MAAA,EACC;AAAA,4BAAAC;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,WAAW;AAAA,gBACjC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,SAAS,EAAE,OAAO,MAAK,CAAC;AAAA,gBAC/E,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,OAAO,eAAe,UAAU;AAAA,gBAChC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,QAAQ,EAAE,OAAO,MAAK,CAAC;AAAA,gBAC9E,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,cAAc;AAAA,gBACpC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,YAAY,EAAE,OAAO,MAAK,CAAC;AAAA,gBAClF,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,kBAAkB;AAAA,gBACxC,UAAU,CAAC,MAAM,kBAAkB,EAAC,GAAG,gBAAgB,gBAAgB,EAAE,OAAO,MAAK,CAAC;AAAA,gBACtF,WAAS;AAAA,gBACT,aAAY;AAAA;AAAA,YACd;AAAA,aACF;AAAA,UAID,eAAe,SAAS,SACvB,gBAAAP,MAACC,MAAA,EACC;AAAA,4BAAAC;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,WAAW;AAAA,gBACjC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,SAAS,EAAE,OAAO;AAAA,gBACpB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,OAAO,eAAe,UAAU;AAAA,gBAChC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,QAAQ,EAAE,OAAO;AAAA,gBACnB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,IAAI,EAAE,IAAI,EAAE;AAAA,gBACZ,aAAY;AAAA;AAAA,YACd;AAAA,YACA,gBAAAL;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,eAAe,gBAAgB;AAAA,gBACtC,UAAU,CAAC,MACT,kBAAkB,CAAC,UAAU;AAAA,kBAC3B,GAAG;AAAA,kBACH,cAAc,EAAE,OAAO;AAAA,gBACzB,EAAE;AAAA,gBAEJ,WAAS;AAAA,gBACT,aAAY;AAAA,gBACZ,YAAW;AAAA;AAAA,YACb;AAAA,aACF;AAAA,UAID,eAAe,SAAS,eACvB,gBAAAL,KAACO,QAAA,EAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GAAG,oJAGzC;AAAA,UAIF,gBAAAT,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,EAAE,GACxC;AAAA,4BAAAC;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU,CAAC,eAAe;AAAA,gBAC3B;AAAA;AAAA,YAED;AAAA,YACA,gBAAAJ;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU,CAAC,eAAe;AAAA,gBAC3B;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF;AAAA,SAEJ;AAAA,MAGA,gBAAAN,MAACI,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,SAAS,aAAa,OAAO,qBAAqB,cAAc,EAAE,GACnF;AAAA,wBAAAF,KAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,GAAG,YAAY,KAAK,OAAO,eAAe,GAAG,oDAEhF;AAAA,QACA,gBAAAD,KAACC,aAAA,EAAW,SAAQ,SAAQ,iPAG5B;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAD;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,QAEvD,0BAAAR;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,UAAU;AAAA,YACV,SAAQ;AAAA,YACR,IAAI,EAAE,OAAO,OAAO;AAAA,YAEnB;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AChnBA,SAAgB,aAAAE,YAAW,WAAAC,UAAS,YAAAC,kBAAgB;AACpD,SAAS,OAAAC,OAAK,cAAAC,cAAY,SAAAC,QAAO,QAAAC,OAAM,SAAAC,QAAO,cAAAC,aAAY,WAAAC,UAAS,kBAAAC,iBAAgB,UAAAC,SAAQ,oBAAAC,yBAAwB;AACnH,OAAOC,kBAAiB;AACxB,OAAO,yBAAyB;AAChC,OAAO,sBAAsB;AAC7B,OAAOC,mBAAkB;;;ACezB,IAAM,mBAAmB,MAAe;AACtC,QAAM,WAAW,wBAAwB,SAAS,EAAE;AACpD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,aAAa,SAAS,eAAe,YAAY,KAAK;AAC5D,SAAO,QAAQ,SAAS,kBAAkB,WAAW,WAAW,eAAe,CAAC;AAClF;AAEA,SAAS,SAAS,MAAsB;AAEtC,MAAI,iBAAiB,GAAG;AACtB,gBAAY,KAAK,uDAAuD,EAAE,KAAK,CAAC;AAChF,WAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,EAC/C;AAGA,QAAM,OAAO,wBAAwB,SAAS,EAAE,UAAU,eAAe,QAAQ,OAAO,EAAE,KAAK;AAC/F,MAAI,MAAM;AAER,UAAM,aAAa,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACzD,WAAO,GAAG,IAAI,GAAG,UAAU;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,cAA2B;AAClC,QAAM,UAAuB,EAAE,gBAAgB,mBAAmB;AAClE,QAAM,QAAQ,sBAAsB,SAAS;AAC7C,MAAI,MAAO,SAAQ,eAAe,IAAI,UAAU,KAAK;AACrD,SAAO;AACT;AAEA,eAAsB,yBAA6C;AACjE,MAAI,iBAAiB,GAAG;AACtB,gBAAY,KAAK,8DAAyD;AAC1E,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM,SAAS,YAAY;AACjC,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;AACvD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,MAAM,SAAS,6BAA6B,IAAI,MAAM,GAAG;AAAA,IAC3E;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,gBAAY,MAAM,6BAA6B,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAChH,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,iBAA6C;AACjE,MAAI,iBAAiB,GAAG;AACtB,gBAAY,KAAK,2DAAsD;AACvE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM,SAAS,aAAa;AAClC,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;AACvD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,MAAM,SAAS,+BAA+B,IAAI,MAAM,GAAG;AAAA,IAC7E;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,gBAAY,MAAM,8BAA8B,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AACjH,UAAM;AAAA,EACR;AACF;;;ADoBM,SACE,OAAAC,OADF,QAAAC,cAAA;AA3GN,IAAM,gBAA0B,MAAM;AACpC,QAAM,EAAE,SAAS,IAAI,wBAAwB;AAC7C,QAAM,EAAE,OAAO,YAAY,WAAW,YAAY,SAAS,YAAY,SAAS,IAAI,iBAAiB;AACrG,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAoB,CAAC,CAAC;AAChD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAqF,IAAI;AAErH,QAAM,oBAAoB,CAAC,CAAC,UAAU;AAEtC,QAAM,UAAU,YAAY;AAC1B,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,UAAU;AAChB,YAAM,CAAC,aAAa,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClD,uBAAuB;AAAA,QACvB,eAAe,EAAE,MAAM,MAAM,IAAI;AAAA,MACnC,CAAC;AACD,eAAS,WAAW;AAEpB,kBAAY,QAAQ,QAAM;AACxB,cAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,QAAQ,kBAAkB,GAAG;AACrE,YAAI,QAAQ,WAAW,KAAK,QAAM,GAAG,SAAS,SAAS,YAAY;AACnE,YAAI,CAAC,OAAO;AACV,kBAAQ,WAAW,KAAK,QAAM,GAAG,SAAS,SAAS,GAAG,EAAE;AAAA,QAC1D;AACA,YAAI,CAAC,OAAO;AACV,kBAAQ,WAAW,KAAK,QAAM,GAAG,OAAO,GAAG,EAAE;AAAA,QAC/C;AAEA,YAAI,CAAC,OAAO;AAEV,kBAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa,GAAG;AAAA,YAChB,SAAS,GAAG;AAAA;AAAA,YACZ,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM,GAAG;AAAA;AAAA,cACT,aAAa,GAAG;AAAA,cAChB,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,YAC7D;AAAA,YACA,UAAU,QAAQ,GAAG,EAAE;AAAA,YACvB,QAAQ;AAAA,YACR,WAAW;AAAA,UACb,CAAC;AAAA,QACH,OAAO;AAEL,qBAAW,MAAM,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;AAAA,QAChD;AAAA,MACF,CAAC;AACD,UAAI,YAAY;AACd,cAAM,SAAS,WAAW,WAAW,aAAa,WAAW,WAAW,cACpE,WAAW,SACX;AACJ,kBAAU,EAAE,QAAQ,WAAW,WAAW,UAAU,CAAC;AAAA,MACvD,OAAO;AACL,kBAAU,EAAE,QAAQ,UAAU,CAAC;AAAA,MACjC;AAAA,IACF,SAAS,GAAG;AACV,eAAS,aAAa,QAAQ,EAAE,UAAU,yBAAyB;AAAA,IACrE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU;AACZ,cAAQ;AAAA,IACV,OAAO;AAEL,gBAAU,EAAE,KAAK,MAAM;AACrB,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EAEF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAkBC,SAAQ,MAAM;AACpC,UAAM,MAAM,oBAAI,IAAqB;AAGrC,UAAM,cAAc,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM;AAEjD,UAAI,EAAE,aAAa,CAAC,EAAE,UAAW,QAAO;AACxC,UAAI,CAAC,EAAE,aAAa,EAAE,UAAW,QAAO;AAExC,aAAO,EAAE,GAAG,SAAS,EAAE,GAAG;AAAA,IAC5B,CAAC;AAED,gBAAY,QAAQ,OAAK;AAEvB,UAAI,IAAI,EAAE,SAAS,MAAM,EAAE,OAAO;AAElC,UAAI,IAAI,EAAE,IAAI,EAAE,OAAO;AAEvB,UAAI,EAAE,MAAM;AACV,YAAI,IAAI,EAAE,MAAM,EAAE,OAAO;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,gBAAAC,OAACC,OAAA,EACC;AAAA,oBAAAD,OAACC,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,IAAI,EAAE,GACvF;AAAA,sBAAAC,MAACC,cAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GAAG,6BAAe;AAAA,MACxF,gBAAAD,MAACD,OAAA,EACC,0BAAAC,MAACE,UAAA,EAAQ,OAAM,WACb,0BAAAF,MAACG,aAAA,EAAW,SAAS,SACnB,0BAAAH,MAACI,cAAA,EAAY,GACf,GACF,GACF;AAAA,OACF;AAAA,IAEC,CAAC,qBACA,gBAAAJ,MAACK,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GACvB,0BAAAL,MAACC,cAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,sHAEnD,GACF;AAAA,IAGF,gBAAAD,MAACK,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GACvB,0BAAAP,OAACC,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACtD;AAAA,cAAQ,WAAW,YAClB,gBAAAC,MAAC,uBAAoB,OAAM,WAAU,IACnC,QAAQ,WAAW,cACrB,gBAAAA,MAAC,oBAAiB,OAAM,SAAQ,IAEhC,gBAAAA,MAAC,oBAAiB,OAAM,YAAW;AAAA,MAErC,gBAAAA,MAACC,cAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,IAAI,GAAG,+BAAiB;AAAA,MAC1E,gBAAAD;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAQ,QAAQ,UAAU,WAAW,SAAS;AAAA,UAC9C,OAAO,QAAQ,WAAW,YAAY,YAAY,QAAQ,WAAW,cAAc,UAAU;AAAA,UAC7F,IAAI,EAAE,IAAI,EAAE;AAAA;AAAA,MACd;AAAA,MACC,QAAQ,aACP,gBAAAN,MAACC,cAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAC9D,cAAI,KAAK,OAAO,SAAS,EAAE,eAAe,GAC7C;AAAA,OAEJ,GACF;AAAA,IAEC,WACC,gBAAAD,MAACD,OAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf,0BAAAC,MAACO,iBAAA,EAAe,GAClB;AAAA,IAED,SACC,gBAAAP,MAACK,QAAA,EAAM,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GACvB,0BAAAL,MAACC,cAAA,EAAW,OAAM,SAAS,iBAAM,GACnC;AAAA,IAGF,gBAAAD,MAACQ,QAAA,EAAM,SAAS,GACb,gBAAM,IAAI,CAAC,SAAS;AAEnB,UAAI,iBAAiB,gBAAgB,IAAI,KAAK,EAAE;AAChD,UAAI,mBAAmB,QAAW;AAChC,yBAAiB,gBAAgB,IAAI,KAAK,IAAI;AAAA,MAChD;AACA,UAAI,mBAAmB,QAAW;AAEhC,cAAM,eAAe,WAAW;AAAA,UAAK,OACnC,EAAE,OAAO,KAAK,MACd,EAAE,SAAS,SAAS,KAAK,MACzB,EAAE,SAAS,KAAK;AAAA,QAClB;AACA,yBAAiB,cAAc,WAAW,KAAK;AAAA,MACjD;AAEA,aACE,gBAAAV,OAACO,QAAA,EAAoB,IAAI,EAAE,GAAG,EAAE,GAC9B;AAAA,wBAAAP,OAACC,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,gBAAgB,GAChF;AAAA,0BAAAD,OAACC,OAAA,EACC;AAAA,4BAAAC,MAACC,cAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAAI,eAAK,MAAK;AAAA,YAC7D,gBAAAD,MAACC,cAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,IAAI,GAC9D,eAAK,aACR;AAAA,aACF;AAAA,UACA,gBAAAH,OAACC,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4BAAAC;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,SAAS,gBAAAT,MAACU,SAAA,EAAO,SAAS,CAAC,CAAC,gBAAgB,UAAU,MAAM;AAE1D,sBAAI,QAAQ,WAAW,KAAK,OAAK,EAAE,SAAS,SAAS,KAAK,EAAE;AAC5D,sBAAI,CAAC,OAAO;AACV,4BAAQ,WAAW,KAAK,OAAK,EAAE,SAAS,SAAS,KAAK,IAAI;AAAA,kBAC5D;AACA,sBAAI,CAAC,OAAO;AACV,4BAAQ,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AAAA,kBAC/C;AACA,sBAAI,CAAC,OAAO;AACV,4BAAQ,WAAW,KAAK,OAAK,EAAE,SAAS,KAAK,IAAI;AAAA,kBACnD;AAEA,sBAAI,OAAO;AACT,+BAAW,MAAM,EAAE;AAAA,kBACrB,OAAO;AACL,4BAAQ,KAAK,8CAA8C,IAAI;AAAA,kBACjE;AAAA,gBACF,GAAG;AAAA,gBACH,OAAO,iBAAiB,YAAY;AAAA;AAAA,YACtC;AAAA,YACA,gBAAAV,MAACE,UAAA,EAAQ,OAAM,8CACb,0BAAAF,MAACW,eAAA,EAAa,OAAM,YAAW,GACjC;AAAA,aACF;AAAA,WACF;AAAA,QACC,CAAC,CAAC,KAAK,qBAAqB,UAC3B,gBAAAb,OAACC,OAAA,EAAI,IAAI,EAAE,IAAI,IAAI,GACjB;AAAA,0BAAAC,MAACC,cAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,kCAAoB;AAAA,UACzE,gBAAAD,MAACD,OAAA,EAAI,IAAI,EAAE,IAAI,KAAK,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE,GAC3D,eAAK,oBAAoB,IAAI,CAAC,MAC7B,gBAAAC,MAACM,OAAA,EAAa,MAAK,SAAQ,OAAO,KAAvB,CAA0B,CACtC,GACH;AAAA,WACF;AAAA,WA5CQ,KAAK,EA8CjB;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEA,IAAO,wBAAQ;;;AZkpBH,gBAAAM,OAsHA,QAAAC,cAtHA;AAr4BZ,IAAM,kBAAkB,MAAM,OAAO,qBAAc;AAoDnD,IAAM,aAAa,MAAM;AACvB,QAAM,WAAW,YAAY;AAE7B,QAAM,sBAAsB,uBAAuB;AAEnD,QAAM,WAAWC,eAAc,mBAAmB;AAClD,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AAEpD,QAAM,oBAAoB,YAA6B;AACrD,UAAMC,cAAa;AAEnB,QAAI;AAEF,YAAM,YAAY,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACvD,YAAM,aAAa,mCAAmC,SAAS;AAE/D,YAAM,gBAAgB,MAAM,IAAI,QAAiB,CAAC,YAAY;AAC5D,cAAM,MAAM,IAAI,MAAM;AACtB,YAAI,SAAS,MAAM,QAAQ,IAAI;AAC/B,YAAI,UAAU,MAAM,QAAQ,KAAK;AACjC,YAAI,MAAM;AAAA,MACZ,CAAC;AAED,UAAI,eAAe;AACjB,eAAO;AAAA,MACT;AAGA,YAAM,WAAW,MAAM,wBAAgB,YAAY;AACnD,UAAI,UAAU,YAAY;AACxB,eAAO,SAAS;AAAA,MAClB;AAGA,aAAOA;AAAA,IACT,SAAS,OAAO;AACd,kBAAY,MAAM,kCAAkC,EAAE,MAAM,CAAC;AAC7D,aAAOA;AAAA,IACT;AAAA,EACF;AACA,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,QAAM,CAAC,WAAW,YAAY,IAAID,WAAS,KAAK;AAChD,QAAM,aAAa;AACnB,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAiB,UAAU;AAEzD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,CAAC;AAC1C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAsB,IAAI;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAChE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,EAAE;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,aAAa;AAChD,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,WAAwB,IAAI;AAChF,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAwB,IAAI;AAGpE,QAAM,sBAAsB,CAAC,SAAiB,WAAgC,cAAc;AAC1F,QAAI,aAAa,WAAW;AAC1B,2BAAqB,YAAY,OAAO;AAAA,IAC1C,OAAO;AACL,2BAAqB,UAAU,OAAO;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAS,KAAK;AAEhE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAC1D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAS,KAAK;AAEhE,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,EAAE,UAAU,gBAAgB,IAAI,wBAAwB;AAC9D,QAAM,EAAE,aAAa,iBAAiB,IAAI,oBAAoB;AAC9D,QAAM,EAAE,mBAAmB,0BAA0B,gBAAgB,kBAAkB,IAAI,YAAY;AACvG,QAAM,EAAE,gBAAgB,sBAAsB,IAAI,qBAAqB;AACvE,QAAM,EAAE,UAAU,iBAAiB,QAAQ,sBAAsB,IAAI,mBAAmB;AAExF,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,WAA0B;AAAA,IAC5E,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe;AAAA,EACjB,CAAC;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB;AAEtB,EAAAE,WAAU,MAAM;AACd,QAAI,eAAe;AACjB,YAAM,WAAW,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa;AACrE,UAAI,UAAU;AACZ,oBAAY,MAAM,4BAA4B;AAAA,UAC5C,eAAe,SAAS;AAAA,UACxB,WAAW,CAAC,CAAC,UAAU;AAAA,QACzB,CAAC;AACD,8BAAsB;AAAA,UACpB,MAAM,SAAS;AAAA,UACf,SAAS,SAAS;AAAA,UAClB,cAAc,SAAS;AAAA,UACvB,eAAe,SAAS;AAAA,QAC1B,CAAC;AAGD,YAAI,SAAS,cAAc;AACzB,gCAAsB,SAAS,YAAY;AAC3C,0BAAgB,IAAI;AAAA,QACtB,OAAO;AAEL,gCAAsB,IAAI;AAC1B,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,eAAe,CAAC;AAGnC,QAAM,qBAAqBC,aAAY,YAAY;AACjD,QAAI,qBAAqB,gBAAgB;AACvC,kBAAY,KAAK,6DAA6D;AAC9E;AAAA,IACF;AAEA,yBAAqB,IAAI;AAEzB,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AACvD,YAAM,OAAO,MAAM,yBAAiB;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM;AAC7B,YAAM,cAAc,MAAM;AAE1B,kBAAY,KAAK,4BAA4B;AAAA,QAC3C,SAAS,CAAC,CAAC;AAAA,QACX,aAAa,CAAC,CAAC;AAAA,QACf,cAAc,iBAAiB,OAAO,KAAK,cAAc,IAAI,CAAC;AAAA,QAC9D,WAAW,gBAAgB;AAAA,MAC7B,CAAC;AAED,YAAM,0BAA0B,mBAC9B,eAAe,cAAc,QAC5B,eAAe,gBAAgB,eAAe,aAAa,KAAK,MAAM,MACtE,eAAe,cAAc,OAAO,eAAe,eAAe,YAAY,eAAe,WAAW,KAAK,MAAM,MACnH,eAAe,SAAS,eAAe,UAAU;AAGpD,YAAM,qBAAqB,kBACzB,eAAe,cAAc,SAC7B,CAAC;AAEH,YAAM,wBAAwB;AAE9B,UAAI,uBAAuB;AACzB,oBAAY,KAAK,8FAAuF;AAAA,UACtG;AAAA,UACA,WAAW,gBAAgB;AAAA,UAC3B,eAAe,CAAC,EAAE,gBAAgB,gBAAgB,eAAe,aAAa,KAAK;AAAA,UACnF,eAAe,CAAC,EAAE,gBAAgB,cAAc,eAAe,WAAW,KAAK;AAAA,UAC/E,gBAAgB,CAAC,EAAE,gBAAgB,SAAS,eAAe,UAAU;AAAA,QACvE,CAAC;AAED,wBAAgB,gBAAgB,gBAAgB,EAAE;AAClD,iBAAS,gBAAgB,SAAS,aAAa;AAC/C,sBAAc,gBAAgB,cAAc,IAAI;AAChD,YAAI,gBAAgB,uBAAuB,QAAW;AACpD,gCAAsB,eAAe,kBAAkB;AAAA,QACzD;AAAA,MACF,OAAO;AACL,oBAAY,KAAK,+CAA+C;AAAA,UAC9D,SAAS,CAAC,CAAC;AAAA,UACX;AAAA,UACA,cAAc,iBAAiB,OAAO,KAAK,cAAc,IAAI,CAAC;AAAA,QAChE,CAAC;AAED,cAAMC,mBAAkB,wBAAwB,SAAS,EAAE,YAAY;AACvE,YAAI,YAAY;AAEhB,YAAIA,kBAAiB,mBAAmB;AACtC,cAAI;AACF,kBAAM,iBAAiB,MAAM,MAAMA,iBAAgB,iBAAiB;AACpE,wBAAY,MAAM,eAAe,KAAK;AAAA,UACxC,SAAS,KAAK;AACZ,wBAAY,KAAK,8BAA8B,EAAE,OAAO,IAAI,CAAC;AAAA,UAC/D;AAAA,QACF;AAEA,cAAM,cAAc,WAAW;AAC/B,YAAI,aAAa;AACf,sBAAY,KAAK,uBAAuB;AACxC,0BAAgB,YAAY,gBAAgB,EAAE;AAC9C,mBAAS,YAAY,SAAS,aAAa;AAC3C,wBAAc,YAAY,cAAc,IAAI;AAC5C,cAAI,YAAY,uBAAuB,QAAW;AAChD,kCAAsB,YAAY,kBAAkB;AAAA,UACtD;AAEA,cAAI,CAAC,yBAAyB;AAC5B,wBAAY,KAAK,kCAAkC;AACnD,kBAAM,yBAAiB,IAAI,gBAAgB,GAAG,UAAU;AAAA,cACtD,IAAI;AAAA,cACJ,UAAU;AAAA,gBACR,GAAG;AAAA,gBACH,WAAW;AAAA,cACb;AAAA,YACF,GAAG,YAAY;AAAA,UACjB;AAAA,QACF,OAAO;AACL,sBAAY,KAAK,+BAA+B;AAChD,mBAAS,aAAa;AACtB,gCAAsB,IAAI;AAAA,QAC5B;AAEA,YAAI,WAAW,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AACxD,sBAAY,KAAK,kCAAkC;AAAA,YACjD,YAAY,UAAU,OAAO;AAAA,UAC/B,CAAC;AAED,gBAAM,WAAW;AAAA,QACnB;AAAA,MACF;AAEA,UAAI,aAAa;AACf,qBAAa,YAAY,QAAQ,EAAE;AACnC,mBAAW,YAAY,WAAW,EAAE;AACpC,wBAAgB,YAAY,gBAAgB,EAAE;AAC9C,yBAAiB,YAAY,iBAAiB,EAAE;AAAA,MAClD;AAEA,wBAAkB,IAAI;AAAA,IACxB,SAAS,GAAG;AACV,kBAAY,MAAM,wCAAwC,EAAE,OAAO,EAAE,CAAC;AACtE,eAAS,aAAa;AACtB,4BAAsB,IAAI;AAC1B,wBAAkB,IAAI;AAAA,IACxB,UAAE;AACA,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,EAAAF,WAAU,MAAM;AAEd,SAAK,mBAAmB;AAAA,EAC1B,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,kBAAkB,MAAM,aAAa,IAAI;AAC/C,QAAM,mBAAmB,MAAM,aAAa,KAAK;AAGjD,EAAAA,WAAU,MAAM;AACd,sBAAkB,EAAE,KAAK,UAAU;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,EAAAA,WAAU,MAAM;AACd,QAAI,YAAY;AACd,iBAAW,UAAU;AAAA,IACvB,OAAO;AACL,wBAAkB,EAAE,KAAK,UAAU;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,kBAAkB,YAAY;AAClC,gBAAY,KAAK,4BAA4B;AAAA,MAC3C,WAAW,mBAAmB;AAAA,MAC9B,eAAe,mBAAmB;AAAA,IACpC,CAAC;AAGD,QAAI,CAAC,mBAAmB,MAAM,KAAK,GAAG;AACpC,0BAAoB,kDAAkD,OAAO;AAC7E;AAAA,IACF;AAEA,kBAAc,SAAS,EAAE,gBAAgB,KAAK,CAAC;AAE/C,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAGvD,kBAAY,KAAK,8BAA8B;AAC/C,YAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU;AAAA,QAChF,IAAI;AAAA,QACJ,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF,GAAG,YAAY;AAGf,UAAI,sBAAqC;AACzC,UAAI,oBAAoB;AACtB,8BAAsB;AAAA,MACxB,WAAW,cAAc;AACvB,8BAAsB,MAAM,wBAAwB,YAAY;AAAA,MAClE;AAGA,YAAM,cAAiC;AAAA,QACrC,MAAM,mBAAmB,KAAK,KAAK;AAAA,QACnC,SAAS,mBAAmB,WAAW;AAAA,QACvC,cAAc,mBAAmB,gBAAgB;AAAA,QACjD,cAAc,uBAAuB;AAAA,QACrC,UAAU,CAAC;AAAA,MACb;AAEA,kBAAY,KAAK,uBAAuB,EAAE,WAAW,YAAY,KAAK,CAAC;AAGvE,YAAM,aAAuC;AAAA,QAC3C,IAAI,YAAY;AAAA,QAChB,MAAM,YAAY;AAAA,QAClB,SAAS,YAAY;AAAA,QACrB,cAAc,YAAY;AAAA,QAC1B,cAAc,YAAY,gBAAgB;AAAA,QAC1C,UAAU,YAAY;AAAA,QACtB,OAAO;AAAA,UACL,MAAM,YAAY;AAAA,UAClB,SAAS,YAAY;AAAA,UACrB,cAAc,YAAY;AAAA,UAC1B,eAAe,YAAY;AAAA,QAC7B;AAAA,MACF;AAEA,YAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU,YAAY,YAAY;AAG1G,YAAM,yBAAyB,mBAAmB,iBAChD,mBAAmB,kBAAkB,MACrC,gBAAgB,KAAK,OAAK,EAAE,SAAS,mBAAmB,aAAa;AAEvE,YAAM,kBAAkB,0BAA0B,mBAAmB,kBAAkB,YAAY;AAGnG,UAAI,iBAAiB;AACnB,oBAAY,KAAK,qCAAqC;AAAA,UACpD,SAAS,mBAAmB;AAAA,UAC5B,SAAS,YAAY;AAAA,QACvB,CAAC;AACD,cAAM,yBAAiB,OAAO,gBAAgB,GAAG,UAAU,mBAAmB,eAAe,YAAY;AAAA,MAC3G;AAGA,UAAI,wBAAwB;AAE1B,oBAAY,KAAK,oCAAoC;AAAA,UACnD,WAAW,mBAAmB;AAAA,UAC9B,SAAS,YAAY;AAAA,QACvB,CAAC;AACD,sBAAc,SAAS;AAAA,UACrB,iBAAiB,gBAAgB;AAAA,YAAI,WACnC,MAAM,SAAS,mBAAmB,gBAAgB,cAAc;AAAA,UAClE;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,oBAAY,KAAK,6BAA6B;AAAA,UAC5C,WAAW,YAAY;AAAA,QACzB,CAAC;AACD,sBAAc,SAAS;AAAA,UACrB,iBAAiB,CAAC,GAAG,iBAAiB,WAAW;AAAA,QACnD,CAAC;AAAA,MACH;AAGA,uBAAiB,YAAY,IAAI;AACjC,4BAAsB;AAAA,QACpB,MAAM,YAAY;AAAA,QAClB,SAAS,YAAY;AAAA,QACrB,cAAc,YAAY;AAAA,QAC1B,eAAe,YAAY;AAAA,MAC7B,CAAC;AAED,kBAAY,KAAK,iCAA4B;AAG7C,0BAAoB,gBAAgB,YAAY,IAAI,yBAAyB,SAAS;AAGtF,aAAO,cAAc,IAAI,YAAY,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,IAErF,SAAS,GAAG;AACV,kBAAY,MAAM,kBAAkB,EAAE,OAAO,EAAE,CAAC;AAChD,0BAAoB,iDAAiD,OAAO;AAAA,IAC9E,UAAE;AACA,oBAAc,SAAS,EAAE,gBAAgB,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAGA,QAAM,qBAAqB,YAAY;AACrC,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAEvD,kBAAY,KAAK,mCAAmC;AAGpD,YAAM,UAAU,MAAM,yBAAiB;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,gBAA0C,WAAW,EAAE,IAAI,OAAO;AAExE,YAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU;AAAA,QAChF,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA;AAAA,QACb;AAAA,MACF,GAAG,YAAY;AAGf,aAAO,cAAc,IAAI,YAAY,wBAAwB;AAAA,QAC3D,QAAQ,EAAE,MAAM;AAAA,MAClB,CAAC,CAAC;AAEF,kBAAY,KAAK,6BAA6B;AAG9C,0BAAoB,gCAAgC,SAAS;AAAA,IAE/D,SAAS,OAAO;AACd,kBAAY,MAAM,2BAA2B,EAAE,MAAM,CAAC;AACtD,0BAAoB,8CAA8C,OAAO;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM;AAGlC,gBAAY,KAAK,kDAAkD;AAAA,EACrE;AAEA,QAAM,mBAAmB,MAAM;AAC7B,eAAW;AACX,0BAAsB;AAAA,MACpB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AACD,oBAAgB,IAAI;AACpB,0BAAsB,IAAI;AAAA,EAC5B;AAIA,QAAM,mBAAmB,CAAC,UAA+C;AACvE,QAAI,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM,CAAC,GAAG;AAC/C,YAAM,OAAO,MAAM,OAAO,MAAM,CAAC;AACjC,kBAAY,IAAI;AAChB,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,eAAgB,GAAG;AACjC,cAAM,SAAS,EAAE,QAAQ;AACzB,sBAAc,MAAM;AACpB,oBAAY,MAAM,oDAAoD;AACtE,YAAI;AACF,gBAAM,gBAAgB,MAAM,mBAAmB,MAAM;AACrD,gCAAsB,aAAa;AACnC,sBAAY,MAAM,uCAAuC,EAAE,cAAc,CAAC;AAAA,QAC5E,SAAS,KAAK;AACZ,sBAAY,MAAM,iCAAiC,EAAE,OAAO,IAAI,CAAC;AAAA,QACnE;AAAA,MACF;AACA,aAAO,cAAc,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,qBAAqB,YAAY;AACrC,UAAM,UAAU,CAAC,CAAC;AAClB,UAAM,aAAa;AAAA,MACjB,UAAU;AAAA,QACR,YAAY,cAAc;AAAA,QAC1B,cAAc,gBAAgB;AAAA,QAC9B;AAAA,QACA,oBAAoB,UAAU,MAAM,mBAAmB,UAAW,IAAI;AAAA,MACxE;AAAA,MACA,QAAQ,gBAAgB,IAAI,CAAC,WAAW;AAAA,QACtC,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,cAAc,MAAM;AAAA,QACpB,cAAc,MAAM;AAAA,QACpB,UAAU,MAAM;AAAA,MAClB,EAAE;AAAA,MACF,eAAe;AAAA,IACjB;AACA,UAAM,UACJ,kCACA,mBAAmB,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AACxD,UAAM,qBAAqB,SAAS,cAAc,GAAG;AACrD,uBAAmB,aAAa,QAAQ,OAAO;AAC/C,uBAAmB,aAAa,YAAY,oBAAoB;AAChE,aAAS,KAAK,YAAY,kBAAkB;AAC5C,uBAAmB,MAAM;AACzB,aAAS,KAAK,YAAY,kBAAkB;AAAA,EAC9C;AAEA,QAAM,wBAAwB,YAAY;AACxC,gBAAY,KAAK,2DAA2D;AAG5E,UAAME,mBAAkB,wBAAwB,SAAS,EAAE,YAAY;AACvE,QAAI,cAAc;AAElB,QAAIA,kBAAiB,mBAAmB;AACtC,UAAI;AACF,oBAAY,KAAK,0CAA0C,EAAE,KAAKA,iBAAgB,kBAAkB,CAAC;AACrG,cAAM,iBAAiB,MAAM,MAAMA,iBAAgB,iBAAiB;AACpE,cAAM,YAAY,MAAM,eAAe,KAAK;AAC5C,sBAAc,WAAW;AAEzB,YAAI,aAAa;AACf,sBAAY,KAAK,6CAA6C;AAAA,YAC5D,iBAAiB,CAAC,CAAC,YAAY;AAAA,YAC/B,SAAS,CAAC,CAAC,YAAY;AAAA,YACvB,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,oBAAY,KAAK,gEAAgE,EAAE,OAAO,IAAI,CAAC;AAAA,MACjG;AAAA,IACF;AAGA,QAAI,aAAa;AAEf,oBAAc,YAAY,cAAc,IAAI;AAC5C,sBAAgB,YAAY,gBAAgB,EAAE;AAC9C,eAAS,YAAY,SAAS,aAAa;AAC3C,UAAI,YAAY,uBAAuB,QAAW;AAChD,8BAAsB,YAAY,kBAAkB;AAAA,MACtD,OAAO;AACL,8BAAsB,IAAI;AAAA,MAC5B;AACA,kBAAY,KAAK,+BAA+B;AAAA,IAClD,OAAO;AAEL,oBAAc,IAAI;AAClB,sBAAgB,EAAE;AAClB,eAAS,aAAa;AACtB,4BAAsB,IAAI;AAC1B,kBAAY,KAAK,iCAAiC;AAAA,IACpD;AAGA,gBAAY,IAAI;AAChB,0BAAsB,IAAI;AAC1B,oBAAgB,IAAI;AACpB,sBAAkB,EAAE,KAAK,UAAU;AAGnC,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AACvD,YAAM,UAAU,MAAM,yBAAiB;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,iBAAiB,cAAc;AAAA,QACnC,GAAG;AAAA,QACH,WAAW;AAAA;AAAA,MACb,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,OAAO;AAAA,QACP,oBAAoB;AAAA,QACpB,WAAW;AAAA;AAAA,MACb;AAEA,kBAAY,KAAK,yCAAyC;AAAA,QACxD,QAAQ,cAAc,QAAQ;AAAA,QAC9B,WAAW,eAAe;AAAA,MAC5B,CAAC;AAED,YAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU;AAAA,QAChF,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,OAAO,SAAS,SAAS,CAAC;AAAA,MAC5B,GAAG,YAAY;AAGf,YAAM,aAAa,aAAa,SAAS;AACzC,aAAO,cAAc,IAAI,YAAY,wBAAwB;AAAA,QAC3D,QAAQ,EAAE,OAAO,WAAW;AAAA,MAC9B,CAAC,CAAC;AAEF,kBAAY,KAAK,4CAA4C,EAAE,OAAO,WAAW,CAAC;AAAA,IACpF,SAAS,OAAO;AACd,kBAAY,MAAM,oCAAoC,EAAE,MAAM,CAAC;AAAA,IACjE;AAAA,EACF;AAGA,QAAM,gCAAgC,YAAY;AAChD,QAAI;AACF,YAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAEvD,kBAAY,KAAK,sDAAsD;AAGvE,YAAM,cAAc,MAAM,yBAAiB;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,oBAAoB,aAAa,UAAU,YAAY,YAAY,WAAW;AAGpF,YAAM,yBAAiB,OAAO,gBAAgB,GAAG,UAAU,iBAAiB,YAAY;AAGxF,YAAM,UAAU,MAAM,yBAAiB,WAAW,gBAAgB,GAAG,UAAU,YAAY;AAC3F,YAAM,aAAa,CAAC,QAAQ,iBAAiB,YAAY,eAAe,eAAe;AAEvF,iBAAW,OAAO,SAAS;AACzB,YAAI,OAAO,QAAQ,YAAY,CAAC,WAAW,SAAS,GAAG,GAAG;AAExD,gBAAM,QAAQ,MAAM,yBAAiB;AAAA,YACnC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAM,eACJ,QAAQ,OAAO,KAAK,KACnB,OAAO,OAAO,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,SAAS,KAC9D,OAAO,OAAO,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,SAAS,KACpE,OAAO,OAAO,iBAAiB,YAAY,MAAM,aAAa,KAAK,EAAE,SAAS;AACjF,cAAI,cAAc;AAChB,wBAAY,KAAK,0BAA0B,EAAE,IAAI,CAAC;AAClD,kBAAM,yBAAiB,OAAO,gBAAgB,GAAG,UAAU,KAAK,YAAY;AAAA,UAC9E,OAAO;AACL,wBAAY,KAAK,8BAA8B,EAAE,IAAI,CAAC;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,cAAc,SAAS,EAAE,yBAAyB,YAAY;AACvE,cAAM,cAAc,SAAS,EAAE,qBAAqB;AAAA,MACtD;AAGA,UAAI,mBAAmB;AACrB,oBAAY,KAAK,uDAAuD;AACxE,cAAM,cAAc,MAAM,yBAAiB;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,eAAyC,eAAe,EAAE,IAAI,OAAO;AAC3E,cAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU;AAAA,UAChF,GAAG;AAAA,UACH,IAAI;AAAA,UACJ,UAAU;AAAA;AAAA,QACZ,GAAG,YAAY;AAAA,MACjB;AAEA,kBAAY,KAAK,yCAAyC;AAAA,IAC5D,SAAS,KAAK;AACZ,kBAAY,MAAM,+CAA+C,EAAE,OAAO,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AAGA,QAAM,sBAAsB,YAAY;AACtC,QAAI;AACF,kBAAY,KAAK,iCAAiC;AAClD,YAAM,cAAc,SAAS,EAAE,2BAA2B;AAC1D,kBAAY,KAAK,4CAAuC;AAAA,IAC1D,SAAS,KAAK;AACZ,kBAAY,MAAM,mCAAmC,EAAE,OAAO,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,UAA+C;AACzE,QAAI,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM,CAAC,GAAG;AAC/C,YAAM,OAAO,MAAM,OAAO,MAAM,CAAC;AACjC,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,eAAgB,GAAG;AACjC,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,EAAE,QAAQ,MAAgB;AAClD,cAAI,KAAK,UAAU;AACjB,4BAAgB,KAAK,SAAS,gBAAgB,EAAE;AAChD,qBAAS,KAAK,SAAS,SAAS,MAAM;AACtC,0BAAc,KAAK,SAAS,cAAc,IAAI;AAC9C,wBAAY,IAAI;AAChB,gBAAI,KAAK,SAAS,uBAAuB,QAAW;AAClD,oCAAsB,KAAK,SAAS,kBAAkB;AAAA,YACxD;AAAA,UACF;AAEA,gBAAM,eAAe,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,CAAC;AAEvD,cAAI,KAAK,UAAU,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC7C,uBAAW,SAAS,KAAK,QAAQ;AAC/B,kBAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,cACF;AACA,oBAAM,cAAc;AACpB,oBAAMC,aAAY,OAAO,YAAY,SAAS,WAAW,YAAY,OAAO;AAC5E,kBAAI,CAACA,YAAW;AACd;AAAA,cACF;AAEA,oBAAM,iBAAoC;AAAA,gBACxC,MAAMA;AAAA,gBACN,SAAS,OAAO,YAAY,YAAY,WAAW,YAAY,UAAU;AAAA,gBACzE,cAAc,OAAO,YAAY,iBAAiB,WAAW,YAAY,eAAe;AAAA,gBACxF,eAAe,OAAO,YAAY,kBAAkB,WAAW,YAAY,gBAAgB;AAAA,cAC7F;AAEA,oBAAM,QAAkC;AAAA,gBACtC,IAAIA;AAAA,gBACJ,OAAO;AAAA,gBACP,MAAMA;AAAA,gBACN,SAAS,eAAe;AAAA,gBACxB,cAAc,eAAe;AAAA,gBAC7B,cAAc,OAAO,YAAY,iBAAiB,WAAW,YAAY,eAAe;AAAA,cAC1F;AAEA,oBAAM,yBAAiB,IAA8B,gBAAgB,GAAG,UAAU,OAAO,YAAY;AAAA,YACvG;AAGA,0BAAc,SAAS;AAAA,cACrB,iBAAiB,KAAK;AAAA,cACtB,eAAe,KAAK,OAAO,CAAC,GAAG,QAAQ;AAAA,YACzC,CAAC;AACD,6BAAiB,KAAK,OAAO,CAAC,GAAG,QAAQ,EAAE;AAC3C,kCAAsB;AAAA,cACpB,MAAM,KAAK,OAAO,CAAC,GAAG,QAAQ;AAAA,cAC9B,SAAS,KAAK,OAAO,CAAC,GAAG,WAAW;AAAA,cACpC,cAAc,KAAK,OAAO,CAAC,GAAG,gBAAgB;AAAA,cAC9C,eAAe,KAAK,OAAO,CAAC,GAAG,QAAQ;AAAA,YACzC,CAAC;AACD,kCAAsB,KAAK,OAAO,CAAC,GAAG,gBAAgB,IAAI;AAC1D,4BAAgB,IAAI;AAAA,UACtB;AAGA,gBAAM,yBAAiB,IAAI,gBAAgB,GAAG,UAAU;AAAA,YACtD,IAAI;AAAA,YACJ,UAAU;AAAA,cACR,GAAG,KAAK;AAAA,cACR,WAAW;AAAA;AAAA,YACb;AAAA,UACF,GAAG,YAAY;AAGf,cAAI,KAAK,iBAAiB,MAAM,QAAQ,KAAK,aAAa,GAAG;AAC3D,kBAAM,kBAAkB;AACxB,uBAAW,OAAO,KAAK,eAAe;AACpC,oBAAM,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3D,oBAAMC,QAAO,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC9D,oBAAM,aAAa,CAACA,KAAI,CAAC;AAAA,YAC3B;AACA,kBAAM,cAAc;AAAA,UACtB;AAGA,cAAI,OAAO,eAAe,YAAY;AACpC,kBAAM,WAAW;AAAA,UACnB;AAAA,QACF,SAASC,IAAG;AACV,sBAAY,MAAM,2BAA2B,EAAE,OAAOA,GAAE,CAAC;AAAA,QAC3D;AAAA,MACF;AACA,aAAO,WAAW,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,EAAAL,WAAU,MAAM;AAEd,QACE,mBAAmB,iBACnB,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,mBAAmB,aAAa,GACxE;AACA,4BAAsB,CAAC,UAAU;AAAA,QAC/B,GAAG;AAAA,QACH,eAAe;AAAA,MACjB,EAAE;AAAA,IACJ;AAAA,EAEF,GAAG,CAAC,iBAAiB,mBAAmB,aAAa,CAAC;AAEtD,EAAAA,WAAU,MAAM;AACd,kBAAc;AAAA,EAChB,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,eAAe,iBAAiB,KAAK,KAAK;AAChD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAM,MAAC,6BAA0B;AAAA,MACjC,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAA,MAAC,aAAU;AAAA,MACjB,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAA,MAAC,gBAAa;AAAA,MACpB,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAA,MAACC,cAAA,EAAY;AAAA,MACnB,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAD,MAAC,YAAS;AAAA,MAChB,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAA,MAAC,aAAU;AAAA,MACjB,iBAAiB;AAAA;AAAA,IACnB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,gBAAAA,MAAC,aAAU;AAAA,MACjB,iBAAiB;AAAA;AAAA,IACnB;AAAA,EACF;AAGA,QAAM,UAAU,WAAW,OAAO,SAAO;AACvC,QAAI,IAAI,oBAAoB,yBAAyB;AACnD,aAAO,yBAAyB,KAAK,kBAAkB;AAAA,IACzD;AACA,QAAI,IAAI,oBAAoB,yBAAyB;AACnD,aAAO,kBAAkB;AAAA,IAC3B;AACA,QAAI,IAAI,oBAAoB,kBAAkB;AAC5C,aAAO,kBAAkB;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,oBACJ,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,MAEC;AAAA,oBACC,gBAAAH;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,cAAc;AAAA,cACd,SAAS,CAACC,WAAUC,OAAMD,OAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,cAC1D,WAAW;AAAA,cACX,IAAI;AAAA,cACJ,IAAI;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QAGF,gBAAAJ,MAACG,OAAA,EAAI,IAAI,EAAE,GAAG,WAAW,MAAM,GAAG,IAAI,WAAW,MAAM,EAAE,GACvD,0BAAAH;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AACb,kBAAI,SAAU,gBAAe,KAAK;AAClC,uBAAS,OAAO;AAAA,YAClB;AAAA,YACA,cAAc;AAAA,YACd,WAAW,gBAAAN,MAAC,mBAAgB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,YAClD,WAAS;AAAA,YACT,SAAQ;AAAA,YACR,IAAI;AAAA,cACF,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,SAAS,CAACI,WAAUA,OAAM,QAAQ,SAAS,SACvC,0BACA;AAAA,cACJ,QAAQ,CAACA,WAAU,eAAeA,OAAM,QAAQ,QAAQ,IAAI;AAAA,cAC5D,OAAO,CAACA,WAAUA,OAAM,QAAQ,QAAQ;AAAA,cACxC,eAAe;AAAA,cACf,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,WAAW;AAAA,gBACT,SAAS,CAACA,WAAUA,OAAM,QAAQ,SAAS,SACvC,0BACA;AAAA,gBACJ,aAAa,CAACA,WAAUA,OAAM,QAAQ,QAAQ;AAAA,gBAC9C,WAAW;AAAA,gBACX,WAAW;AAAA,cACb;AAAA,cACA,YAAY;AAAA,gBACV,WAAW;AAAA,cACb;AAAA,YACF;AAAA,YACD;AAAA;AAAA,QAED,GACF;AAAA,QAEA,gBAAAJ,MAAC,WAAQ,IAAI,EAAE,IAAI,WAAW,IAAI,GAAG,IAAI,GAAG,SAAS,IAAI,GAAG;AAAA,QAE5D,gBAAAA,MAACG,OAAA,EAAI,IAAI,EAAE,MAAM,GAAG,IAAI,WAAW,MAAM,GAAG,IAAI,GAAG,WAAW,OAAO,GACnE,0BAAAH,MAACO,OAAA,EAAK,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GACtB,kBAAQ,IAAI,CAAC,KAAK,QACjB,gBAAAL;AAAA,UAAC;AAAA;AAAA,YAEC,UAAU,aAAa;AAAA,YACvB,SAAS,MAAM;AACb,0BAAY,GAAG;AACf,kBAAI,SAAU,gBAAe,KAAK;AAAA,YACpC;AAAA,YACA,IAAI;AAAA,cACF,WAAW;AAAA,cACX,cAAc;AAAA,cACd,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,QAAQ,aAAa,MACjB,CAACE,WAAU,aAAaA,OAAM,QAAQ,QAAQ,IAAI,OAClD;AAAA,cACJ,SAAS,aAAa,MAClB,CAACA,WACDA,OAAM,QAAQ,SAAS,SACnB,0BACA,0BACJ;AAAA,cACJ,OAAO,aAAa,MAAM,iBAAiB;AAAA,cAC3C,YAAY,aAAa,MAAM,MAAM;AAAA,cACrC,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,YAAY;AAAA,gBACV,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,SAAS,aAAa,MAAM,iBAAiB;AAAA,gBAC7C,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,cACA,WAAW;AAAA,gBACT,SAAS,CAACA,WACRA,OAAM,QAAQ,SAAS,SACnB,0BACA;AAAA,gBACN,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,YAAY;AAAA,kBACV,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,cACA,YAAY;AAAA,gBACV,WAAW;AAAA,cACb;AAAA,cACA,2BAA2B;AAAA,gBACzB,UAAU;AAAA,gBACV,IAAI;AAAA,cACN;AAAA,YACF;AAAA,YAEA;AAAA,8BAAAJ;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,OAAO,aAAa,MAAM,iBAAiB;AAAA,oBAC3C,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBAEC,cAAI;AAAA;AAAA,cACP;AAAA,cACA,gBAAAR;AAAA,gBAACS;AAAA,gBAAA;AAAA,kBACC,SAAS,IAAI;AAAA,kBACb,wBAAwB;AAAA,oBACtB,YAAY,aAAa,MAAM,MAAM;AAAA,oBACrC,UAAU;AAAA,oBACV,eAAe;AAAA,kBACjB;AAAA;AAAA,cACF;AAAA,cACC,aAAa,OACZ,gBAAAT;AAAA,gBAACG;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS,CAACC,WAAUA,OAAM,QAAQ,QAAQ;AAAA,oBAC1C,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,eAAe;AAAA,kBACjB;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,UAxFG,IAAI;AAAA,QA0FX,CACD,GACH,GACF;AAAA;AAAA;AAAA,EACF;AAEF,SACE,gBAAAF,OAAC,iBAAc,OAAO,cACpB;AAAA,oBAAAF,MAAC,eAAY;AAAA,IACb,gBAAAE;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAO;AAAA,QACP,IAAI;AAAA,UACF,SAAS;AAAA,UACT,eAAe,WAAW,WAAW;AAAA,UACrC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QAGC;AAAA,sBACC,gBAAAD;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,SAAS,CAACC,WACRA,OAAM,QAAQ,SAAS,SACnB,wBACA;AAAA,gBACN,cAAc,CAACA,WAAU,aAAaA,OAAM,QAAQ,OAAO;AAAA,gBAC3D,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,WAAW;AAAA,cACb;AAAA,cAGA;AAAA,gCAAAJ;AAAA,kBAACM;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;AAAA,oBACvC,IAAI;AAAA,sBACF,UAAU;AAAA,sBACV,WAAW;AAAA,sBACX,GAAG;AAAA,sBACH,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,SAAS,cACL,CAACF,WAAUA,OAAM,QAAQ,QAAQ,OACjC,CAACA,WAAUA,OAAM,QAAQ,SAAS,SAChC,2BACA;AAAA,sBACN,OAAO,cACH,UACA,CAACA,WAAUA,OAAM,QAAQ,QAAQ;AAAA,sBACrC,YAAY;AAAA,sBACZ,WAAW,cAAc,kBAAkB;AAAA,sBAC3C,WAAW;AAAA,wBACT,SAAS,cACL,CAACA,WAAUA,OAAM,QAAQ,QAAQ,OACjC,CAACA,WAAUA,OAAM,QAAQ,SAAS,SAChC,2BACA;AAAA,wBACN,WAAW;AAAA,sBACb;AAAA,sBACA,YAAY;AAAA,wBACV,WAAW,cAAc,8BAA8B;AAAA,sBACzD;AAAA,oBACF;AAAA,oBAEA,0BAAAJ,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAG,cACC,yBACA;AAAA,wBAEJ,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,eAAc;AAAA,wBACd,gBAAe;AAAA;AAAA,oBACjB,GACF;AAAA;AAAA,gBACF;AAAA,gBAGA,gBAAAA;AAAA,kBAACU;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,IAAI;AAAA,sBACF,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,eAAe;AAAA,oBACjB;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBAGA,gBAAAV,MAACG,OAAA,EAAI,IAAI;AAAA,kBACP,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,cAAc;AAAA,kBACd,SAAS,CAACC,WAAUA,OAAM,QAAQ,SAAS,SACvC,0BACA;AAAA,kBACJ,QAAQ,CAACA,WAAU,aAAaA,OAAM,QAAQ,QAAQ,IAAI;AAAA,gBAC5D,GACE,0BAAAJ;AAAA,kBAACU;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,IAAI;AAAA,sBACF,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,UAAU;AAAA,oBACZ;AAAA,oBAEC,kBAAQ,QAAQ,GAAG;AAAA;AAAA,gBACtB,GACF;AAAA;AAAA;AAAA,UACF;AAAA,UAID,WACC,gBAAAV;AAAA,YAAC;AAAA;AAAA,cACC,QAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS,MAAM,eAAe,KAAK;AAAA,cACnC,QAAQ,MAAM,eAAe,IAAI;AAAA,cACjC,oBAAkB;AAAA,cAClB,YAAY,EAAE,aAAa,KAAK;AAAA,cAChC,YAAY;AAAA,gBACV,IAAI;AAAA,kBACF,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,SAAS,CAACI,WACRA,OAAM,QAAQ,SAAS,SACnB,wBACA;AAAA,kBACN,WAAW;AAAA,kBACX,gBAAgB;AAAA,gBAClB;AAAA,cACF;AAAA,cAEC;AAAA;AAAA,UACH,IAEA,gBAAAJ;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,SAAS,CAACC,WACRA,OAAM,QAAQ,SAAS,SACnB,wBACA;AAAA,gBACN,aAAa,CAACA,WAAU,aAAaA,OAAM,QAAQ,OAAO;AAAA,gBAC1D,WAAW,CAACA,WAAUA,OAAM,QAAQ,SAAS,SACzC,kCACA;AAAA,gBACJ,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,UAAU;AAAA,cACZ;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAIF,gBAAAF;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,MAAM;AAAA,gBACN,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,gBACzB,WAAW;AAAA,gBACX,QAAQ,WAAW,SAAS;AAAA,gBAC5B,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,SAAS;AAAA,gBACT,IAAI,WAAW,IAAI;AAAA;AAAA,gBACnB,IAAI;AAAA,gBACJ,YAAY;AAAA,gBACZ,UAAU;AAAA;AAAA,gBAEV,gBAAgB;AAAA;AAAA,gBAChB,wBAAwB;AAAA,kBACtB,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,sBAAsB;AAAA;AAAA,cACxB;AAAA,cAGC;AAAA,wBAAQ,QAAQ,GAAG,UAAU,mBAC5B,gBAAAH;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,cAAc;AAAA;AAAA,gBAChB;AAAA,gBAED,QAAQ,QAAQ,GAAG,UAAU,cAC5B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,gBAED,QAAQ,QAAQ,GAAG,UAAU,eAC5B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,gBAAgB,yBAAyB,KAAK,CAAC,kBAAkB;AAAA;AAAA,gBACnE;AAAA,gBAED,QAAQ,QAAQ,GAAG,UAAU,aAC5B,gBAAAA,MAAC,sBAAW,cAA4B;AAAA,gBAEzC,QAAQ,QAAQ,GAAG,UAAU,iBAC5B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,cAAc;AAAA;AAAA,gBAChB;AAAA,gBAED,QAAQ,QAAQ,GAAG,UAAU,cAAc,gBAAAA,MAAC,eAAY;AAAA,gBACxD,QAAQ,QAAQ,GAAG,UAAU,eAAe,gBAAAA,MAAC,yBAAc;AAAA;AAAA;AAAA,UAC9D;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAW;AAAA,cACX,SAAS;AAAA,cACT,IAAI,CAACI,YAAW;AAAA,gBACd,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,iBAAiBA,OAAM,QAAQ,QAAQ;AAAA,gBACvC,OAAOA,OAAM,QAAQ,QAAQ;AAAA,gBAC7B,WAAW;AAAA,kBACT,iBAAiBA,OAAM,QAAQ,QAAQ;AAAA,kBACvC,WAAW;AAAA,gBACb;AAAA,gBACA,YAAY;AAAA,kBACV,WAAW;AAAA,gBACb;AAAA,gBACA,YAAY;AAAA,gBACZ,WAAWA,OAAM,QAAQ,CAAC;AAAA,gBAC1B,QAAQ;AAAA,cACV;AAAA,cAEA,0BAAAJ;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,WAAW;AAAA,kBACb;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA,MAAC,sBAAU,MAAM,WAAW,SAAS,kBAAkB;AAAA;AAAA;AAAA,IACzD;AAAA,KAEF;AAEJ;AAEA,IAAO,qBAAQ;","names":["useState","useEffect","useCallback","useMediaQuery","alpha","Box","Button","Typography","List","ListItemIcon","ListItemText","StorageIcon","useState","Box","Button","Typography","Dialog","DialogTitle","DialogContent","DialogActions","Alert","minScale","Fragment","jsx","jsxs","useState","jsxs","Fragment","jsx","Box","Typography","Alert","Button","Dialog","DialogTitle","DialogContent","DialogActions","useState","useEffect","useRef","useCallback","Box","Button","Typography","Paper","Chip","TextField","Alert","IconButton","useMediaQuery","useTheme","jsx","jsxs","useTheme","useMediaQuery","useState","useRef","jsx","Box","jsxs","Typography","useCallback","useEffect","Paper","Chip","Alert","Button","TextField","IconButton","useState","useRef","Box","Typography","Button","TextField","Card","CardContent","Paper","Chip","Alert","useTheme","useMediaQuery","UploadIcon","RestoreIcon","DownloadIcon","useState","useRef","useCallback","useEffect","Dialog","DialogTitle","DialogContent","DialogActions","Button","Box","Typography","Slider","IconButton","Paper","Alert","Chip","RotateLeftIcon","RotateRightIcon","ZoomInIcon","ZoomOutIcon","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","minScale","jsxs","Dialog","DialogTitle","jsx","Typography","DialogContent","Fragment","Box","Paper","IconButton","ZoomOutIcon","Slider","ZoomInIcon","Button","RotateLeftIcon","RotateRightIcon","Chip","Alert","DialogActions","jsx","jsxs","predefinedThemes","useTheme","useMediaQuery","useState","useRef","jsxs","Box","jsx","Typography","Alert","Paper","UploadIcon","Button","TextField","theme","Card","Chip","CardContent","DownloadIcon","RestoreIcon","useState","useMemo","useCallback","useEffect","Box","Typography","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","TextField","InputAdornment","Chip","LinearProgress","Card","CardContent","IconButton","Alert","Stack","MenuItem","Snackbar","Switch","useMediaQuery","useTheme","DeleteIcon","DownloadIcon","CheckCircleIcon","ErrorIcon","useState","useEffect","Dialog","DialogContent","Box","Typography","Fade","useTheme","jsx","jsxs","jsx","useTheme","useState","useEffect","jsxs","Dialog","sparkle","Box","DialogContent","Typography","Fade","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useTheme","useMediaQuery","useState","useCallback","useEffect","useMemo","jsx","Box","jsxs","Typography","Chip","Button","DeleteIcon","Card","CardContent","Switch","Fragment","CheckCircleIcon","ErrorIcon","LinearProgress","TextField","InputAdornment","MenuItem","IconButton","Stack","DownloadIcon","Dialog","DialogTitle","DialogContent","DialogContentText","Alert","DialogActions","Snackbar","useState","useEffect","useMemo","Box","Typography","Button","Card","CardContent","LinearProgress","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Alert","Stack","Chip","Snackbar","useTheme","DeleteIcon","RefreshIcon","DescriptionIcon","PersonIcon","CheckCircleIcon","ErrorIcon","Fragment","jsx","jsxs","DescriptionIcon","PersonIcon","useTheme","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Button","RefreshIcon","Fragment","DeleteIcon","Card","CardContent","Chip","LinearProgress","Alert","Stack","CheckCircleIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","ErrorIcon","Snackbar","useState","useEffect","useCallback","Box","Typography","Paper","Button","TextField","MenuItem","Chip","Snackbar","Alert","useTheme","useMediaQuery","jsx","jsxs","useTheme","useMediaQuery","useCallback","useState","useEffect","jsxs","Box","jsx","Typography","Paper","Chip","Button","TextField","MenuItem","Alert","Snackbar","useEffect","useMemo","useState","Box","Typography","Paper","Chip","Stack","IconButton","Tooltip","LinearProgress","Switch","FormControlLabel","RefreshIcon","SettingsIcon","jsx","jsxs","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Tooltip","IconButton","RefreshIcon","Paper","Chip","LinearProgress","Stack","FormControlLabel","Switch","SettingsIcon","jsx","jsxs","useMediaQuery","useState","banditHead","useEffect","useCallback","packageSettings","modelName","file","e","jsx","StorageIcon","jsxs","Box","theme","alpha","Button","List","ListItemIcon","ListItemText","Typography"]}
|
|
1
|
+
{"version":3,"sources":["../src/management/management.tsx","../src/management/components/PersonalitiesTab.tsx","../src/components/AvatarCropper.tsx","../src/management/components/PreferencesTab.tsx","../src/hooks/useGatewayQueries.ts","../src/management/components/BrandingTab.tsx","../src/components/LogoCropper.tsx","../src/management/components/KnowledgeTab.tsx","../src/components/shared/ProcessingOverlay.tsx","../src/hooks/useProcessingOverlay.ts","../src/management/components/StorageTab.tsx","../src/management/components/ProviderTab.tsx","../src/management/components/MCPToolsTabV2.tsx","../src/services/mcp/mcpControllerService.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FCFF-64ED2F\nconst __banditFingerprint_management_managementtsx = 'BL-FP-357F58-3D1B';\nconst __auditTrail_management_managementtsx = 'BL-AU-MGOIKVVL-LFF9';\n// File: management.tsx | Path: src/management/management.tsx | Hash: fcff3d1b\n\nconst preloadChatPage = () => import(\"../chat/chat\");\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { alpha } from \"@mui/material/styles\";\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport indexedDBService from \"../services/indexedDB/indexedDBService\";\nimport {\n Box,\n Button,\n Typography,\n ThemeProvider,\n CssBaseline,\n Fab,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Divider,\n SwipeableDrawer,\n} from \"@mui/material\";\nimport FaceRetouchingNaturalIcon from '@mui/icons-material/FaceRetouchingNatural';\nimport BrushIcon from '@mui/icons-material/Brush';\nimport MenuBookIcon from '@mui/icons-material/MenuBook';\nimport TuneIcon from '@mui/icons-material/Tune';\nimport BuildIcon from '@mui/icons-material/Build';\nimport CloudIcon from '@mui/icons-material/Cloud';\nimport StorageIcon from '@mui/icons-material/Storage';\nimport { useNavigate } from \"react-router-dom\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChatModal from \"../modals/chat-modal/chat-modal\";\nimport PersonalitiesTab, { LocalModelState } from './components/PersonalitiesTab';\nimport PreferencesTab from './components/PreferencesTab';\nimport BrandingTab from './components/BrandingTab';\nimport KnowledgeTab from './components/KnowledgeTab';\nimport StorageTab from './components/StorageTab';\nimport { ProviderTab } from './components/ProviderTab';\nimport MCPToolsTabV2 from './components/MCPToolsTabV2';\n\nimport { BanditPersonality, useModelStore } from \"../store/modelStore\";\nimport { banditDarkTheme } from \"../theme/banditTheme\";\nimport { predefinedThemes } from \"../theme/themeMap\";\nimport { detectTransparency, fetchAndConvertToBase64 } from \"../util\";\nimport brandingService from \"../services/branding/brandingService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { usePreferencesStore } from \"../store/preferencesStore\";\nimport { useAIProviderStore } from \"../store/aiProviderStore\";\nimport { useNotificationService } from \"../hooks/useNotificationService\";\nimport { useFeatures, useFeatureVisibility } from \"../hooks/useFeatures\";\nimport { StoredBanditConfigRecord, StoredModelConfig } from \"../types/config\";\n\nconst Management = () => {\n const navigate = useNavigate();\n\n const notificationService = useNotificationService();\n\n const isMobile = useMediaQuery(\"(max-width:900px)\");\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const getOptimalFabLogo = async (): Promise<string> => {\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n\n try {\n // First try subdomain favicon\n const subdomain = window.location.hostname.split('.')[0];\n const faviconUrl = `https://cdn.burtson.ai/favicons/${subdomain}/favicon.png`;\n\n const faviconExists = await new Promise<boolean>((resolve) => {\n const img = new Image();\n img.onload = () => resolve(true);\n img.onerror = () => resolve(false);\n img.src = faviconUrl;\n });\n\n if (faviconExists) {\n return faviconUrl;\n }\n\n // Fallback to branding logo\n const branding = await brandingService.getBranding();\n if (branding?.logoBase64) {\n return branding.logoBase64;\n }\n\n // Final fallback to Bandit head\n return banditHead;\n } catch (error) {\n debugLogger.error(\"Failed to get optimal FAB logo\", { error });\n return banditHead;\n }\n };\n const {\n name: modelName,\n setModelName,\n tagline,\n setTagline,\n systemPrompt,\n setSystemPrompt,\n availableModels,\n selectedModel,\n setSelectedModel,\n saveModel,\n resetModel,\n hasTransparentLogo,\n setHasTransparentLogo,\n } = useModelStore();\n\n const [modalOpen, setModalOpen] = useState(false);\n const banditHead = \"https://cdn.burtson.ai/images/bandit-head.png\";\n const [fabLogo, setFabLogo] = useState<string>(banditHead);\n\n const [tabIndex, setTabIndex] = useState(0);\n const [logoFile, setLogoFile] = useState<File | null>(null);\n const [logoBase64, setLogoBase64] = useState<string | null>(null);\n const [brandingText, setBrandingText] = useState(\"\");\n const [theme, setTheme] = useState(\"bandit-dark\"); // Use consistent default\n const [customAvatarBase64, setCustomAvatarBase64] = useState<string | null>(null);\n const [presetAvatar, setPresetAvatar] = useState<string | null>(null);\n\n \n const showSnackbarMessage = (message: string, severity: 'success' | 'error' = 'success') => {\n if (severity === 'success') {\n notificationService?.showSuccess(message);\n } else {\n notificationService?.showError(message);\n }\n };\n\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n\n const [brandingLoaded, setBrandingLoaded] = useState(false);\n const [isLoadingBranding, setIsLoadingBranding] = useState(false);\n\n const { initModels } = useModelStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const { preferences, updatePreference } = usePreferencesStore();\n const { hasAdminDashboard, hasLimitedAdminDashboard, getCurrentTier, hasAdvancedSearch } = useFeatures();\n const { showAdminPanel, showLimitedAdminPanel } = useFeatureVisibility();\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n\n const [localSelectedModel, setLocalSelectedModel] = useState<LocalModelState>({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n\n const {\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n } = useKnowledgeStore();\n\n useEffect(() => {\n if (selectedModel) {\n const selected = availableModels.find((m) => m.name === selectedModel);\n if (selected) {\n debugLogger.debug(\"Model hydration complete\", {\n selectedModel: selected.name,\n hasAvatar: !!selected?.avatarBase64\n });\n setLocalSelectedModel({\n name: selected.name,\n tagline: selected.tagline,\n systemPrompt: selected.systemPrompt as string,\n selectedModel: selected.name,\n });\n\n // Handle avatar restoration properly\n if (selected.avatarBase64) {\n setCustomAvatarBase64(selected.avatarBase64);\n setPresetAvatar(null); // Clear preset if we have custom\n } else {\n // Clear custom avatar if model doesn't have one\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n }\n }\n }, [selectedModel, availableModels]);\n\n // Load branding/model config from IndexedDB on mount\n const loadBrandingConfig = useCallback(async () => {\n if (isLoadingBranding || brandingLoaded) {\n debugLogger.warn(\"Branding loading already in progress or completed, skipping\");\n return;\n }\n\n setIsLoadingBranding(true);\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const data = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingConfig = data?.branding;\n const modelConfig = data?.model;\n\n debugLogger.info(\"Management branding load\", {\n hasData: !!data,\n hasBranding: !!brandingConfig,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : [],\n userSaved: brandingConfig?.userSaved\n });\n\n const hasUserModifiedBranding = brandingConfig && (\n brandingConfig.userSaved === true ||\n (brandingConfig.brandingText && brandingConfig.brandingText.trim() !== \"\") ||\n (brandingConfig.logoBase64 && typeof brandingConfig.logoBase64 === \"string\" && brandingConfig.logoBase64.trim() !== \"\") ||\n (brandingConfig.theme && brandingConfig.theme !== \"bandit-dark\")\n );\n\n const hasCDNOnlyBranding = brandingConfig &&\n brandingConfig.userSaved === false &&\n !hasUserModifiedBranding;\n\n const shouldSkipCDNBranding = hasUserModifiedBranding;\n\n if (shouldSkipCDNBranding) {\n debugLogger.info(\"🚫 USER BRANDING PROTECTION - Skipping CDN branding (preserving user modifications)\", {\n hasUserModifiedBranding,\n userSaved: brandingConfig?.userSaved,\n hasCustomText: !!(brandingConfig?.brandingText && brandingConfig.brandingText.trim()),\n hasCustomLogo: !!(brandingConfig?.logoBase64 && brandingConfig.logoBase64.trim()),\n hasCustomTheme: !!(brandingConfig?.theme && brandingConfig.theme !== \"bandit-dark\")\n });\n\n setBrandingText(brandingConfig?.brandingText || \"\");\n setTheme(brandingConfig?.theme || \"bandit-dark\");\n setLogoBase64(brandingConfig?.logoBase64 || null);\n if (brandingConfig?.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(brandingConfig.hasTransparentLogo);\n }\n } else {\n debugLogger.info(\"Loading branding and models from CDN config\", {\n hasData: !!data,\n hasCDNOnlyBranding,\n brandingKeys: brandingConfig ? Object.keys(brandingConfig) : []\n });\n\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnConfig = null;\n\n if (packageSettings?.brandingConfigUrl) {\n try {\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n cdnConfig = await configResponse.json();\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN config:\", { error: err });\n }\n }\n\n const cdnBranding = cdnConfig?.branding;\n if (cdnBranding) {\n debugLogger.info(\"Applying CDN branding\");\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n setLogoBase64(cdnBranding.logoBase64 || null);\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n }\n\n if (!hasUserModifiedBranding) {\n debugLogger.info(\"Saving CDN branding to IndexedDB\");\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...cdnBranding,\n userSaved: false,\n },\n }, storeConfigs);\n }\n } else {\n debugLogger.info(\"Using Bandit default branding\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n }\n\n if (cdnConfig?.models && Array.isArray(cdnConfig.models)) {\n debugLogger.info(\"Loading models from CDN config\", {\n modelCount: cdnConfig.models.length\n });\n\n await initModels();\n }\n }\n\n if (modelConfig) {\n setModelName(modelConfig.name || \"\");\n setTagline(modelConfig.tagline || \"\");\n setSystemPrompt(modelConfig.systemPrompt || \"\");\n setSelectedModel(modelConfig.selectedModel || \"\");\n }\n\n setBrandingLoaded(true);\n } catch (e) {\n debugLogger.error(\"Failed to load config from IndexedDB\", { error: e });\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n setBrandingLoaded(true);\n } finally {\n setIsLoadingBranding(false);\n }\n }, [\n brandingLoaded,\n initModels,\n isLoadingBranding,\n setBrandingLoaded,\n setHasTransparentLogo,\n setIsLoadingBranding,\n setModelName,\n setSelectedModel,\n setSystemPrompt,\n setTagline,\n setTheme,\n ]); // Only essential dependencies\n\n useEffect(() => {\n // Only load once on mount\n void loadBrandingConfig();\n }, [loadBrandingConfig]); // Empty dependency array to run only once on mount\n\n const handleOpenModal = () => setModalOpen(true);\n const handleCloseModal = () => setModalOpen(false);\n\n // Load branding logo for FAB\n useEffect(() => {\n getOptimalFabLogo().then(setFabLogo);\n }, []);\n\n // Update FAB logo when logoBase64 changes (when user uploads new logo)\n useEffect(() => {\n if (logoBase64) {\n setFabLogo(logoBase64);\n } else {\n getOptimalFabLogo().then(setFabLogo);\n }\n }, [logoBase64]);\n\n const handleSaveModel = async () => {\n debugLogger.info(\"STARTING handleSaveModel\", {\n modelName: localSelectedModel.name,\n selectedModel: localSelectedModel.selectedModel\n });\n\n // Validate required fields\n if (!localSelectedModel.name?.trim()) {\n showSnackbarMessage(\"Please enter a personality name before saving.\", 'error');\n return;\n }\n\n useModelStore.setState({ isInitializing: true });\n\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n // Save branding first (always save branding regardless of model type)\n debugLogger.info(\"Saving branding to IndexedDB\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo,\n userSaved: true,\n },\n }, storeConfigs);\n\n // Prepare avatar\n let avatarBase64ToStore: string | null = null;\n if (customAvatarBase64) {\n avatarBase64ToStore = customAvatarBase64;\n } else if (presetAvatar) {\n avatarBase64ToStore = await fetchAndConvertToBase64(presetAvatar);\n }\n\n // Create model object\n const modelToSave: BanditPersonality = {\n name: localSelectedModel.name.trim(),\n tagline: localSelectedModel.tagline || \"\",\n systemPrompt: localSelectedModel.systemPrompt || \"\",\n avatarBase64: avatarBase64ToStore || \"\",\n commands: [],\n };\n\n debugLogger.info(\"Saving custom model\", { modelName: modelToSave.name });\n\n // Save to IndexedDB\n const modelEntry: StoredBanditConfigRecord = {\n id: modelToSave.name,\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n avatarBase64: modelToSave.avatarBase64 || undefined,\n commands: modelToSave.commands,\n model: {\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n selectedModel: modelToSave.name,\n },\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", modelEntry, storeConfigs);\n\n // Determine if this is editing an existing model (custom or Bandit) or creating a new one\n const isEditingExistingModel = localSelectedModel.selectedModel &&\n localSelectedModel.selectedModel !== \"\" &&\n availableModels.some(m => m.name === localSelectedModel.selectedModel);\n\n const isRenamingModel = isEditingExistingModel && localSelectedModel.selectedModel !== modelToSave.name;\n\n // Only remove old entry if we're actually renaming a model\n if (isRenamingModel) {\n debugLogger.info(\"Model renamed, removing old entry\", {\n oldName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", localSelectedModel.selectedModel, storeConfigs);\n }\n\n // Update Zustand store\n if (isEditingExistingModel) {\n // Update existing model (whether custom or Bandit)\n debugLogger.info(\"Updating existing model in store\", {\n modelName: localSelectedModel.selectedModel,\n newName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: availableModels.map(model =>\n model.name === localSelectedModel.selectedModel ? modelToSave : model\n ),\n });\n } else {\n // Add new model\n debugLogger.info(\"Adding new model to store\", {\n modelName: modelToSave.name\n });\n useModelStore.setState({\n availableModels: [...availableModels, modelToSave],\n });\n }\n\n // Update selection and ensure UI state is synchronized\n setSelectedModel(modelToSave.name);\n setLocalSelectedModel({\n name: modelToSave.name,\n tagline: modelToSave.tagline,\n systemPrompt: modelToSave.systemPrompt,\n selectedModel: modelToSave.name,\n });\n\n debugLogger.info(\"✅ Model saved successfully\");\n\n // Show success message\n showSnackbarMessage(`Personality \"${modelToSave.name}\" saved successfully!`, 'success');\n\n // Dispatch theme change event\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', { detail: { theme } }));\n\n } catch (e) {\n debugLogger.error(\"Failed to save\", { error: e });\n showSnackbarMessage(\"Failed to save personality. Please try again.\", 'error');\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n };\n\n // Save branding data only (separate from model saving)\n const handleSaveBranding = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Saving branding data to IndexedDB\");\n\n // Get current config to preserve other data\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const currentConfig: StoredBanditConfigRecord = current ?? { id: \"main\" };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...currentConfig,\n id: \"main\",\n branding: {\n logoBase64,\n brandingText,\n theme,\n hasTransparentLogo,\n userSaved: true, // Mark as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme }\n }));\n\n debugLogger.info(\"Branding saved successfully\");\n\n // Show success feedback\n showSnackbarMessage(\"Branding saved successfully!\", 'success');\n\n } catch (error) {\n debugLogger.error(\"Failed to save branding\", { error });\n showSnackbarMessage(\"Failed to save branding. Please try again.\", 'error');\n }\n };\n\n const handleSavePreferences = () => {\n // Preferences are now automatically saved by IndexedDB via preferencesStore\n // This function is kept for UI feedback if needed\n debugLogger.info(\"Preferences saved automatically by zustand store\");\n };\n\n const handleResetModel = () => {\n resetModel();\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n };\n\n // Remove handleTabChange and use setTabIndex directly\n\n const handleLogoUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n setLogoFile(file);\n const reader = new FileReader();\n reader.onload = async function (e) {\n const base64 = e.target?.result as string;\n setLogoBase64(base64);\n debugLogger.debug(\"Starting transparency detection for uploaded image\");\n try {\n const isTransparent = await detectTransparency(base64);\n setHasTransparentLogo(isTransparent);\n debugLogger.debug(\"Transparency detection result saved\", { isTransparent });\n } catch (err) {\n debugLogger.error(\"Failed to detect transparency\", { error: err });\n }\n };\n reader.readAsDataURL(file);\n }\n };\n\n const handleExportConfig = async () => {\n const hasLogo = !!logoBase64;\n const exportData = {\n branding: {\n logoBase64: logoBase64 || \"\",\n brandingText: brandingText || \"\",\n theme,\n hasTransparentLogo: hasLogo ? await detectTransparency(logoBase64!) : false,\n },\n models: availableModels.map((model) => ({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt,\n avatarBase64: model.avatarBase64,\n commands: model.commands,\n })),\n knowledgeDocs: documents,\n };\n const dataStr =\n \"data:text/json;charset=utf-8,\" +\n encodeURIComponent(JSON.stringify(exportData, null, 2));\n const downloadAnchorNode = document.createElement(\"a\");\n downloadAnchorNode.setAttribute(\"href\", dataStr);\n downloadAnchorNode.setAttribute(\"download\", \"bandit_config.json\");\n document.body.appendChild(downloadAnchorNode);\n downloadAnchorNode.click();\n document.body.removeChild(downloadAnchorNode);\n };\n\n const handleRestoreDefaults = async () => {\n debugLogger.info(\"Starting branding restore - attempting CDN defaults first\");\n \n // First try to load CDN defaults\n const packageSettings = usePackageSettingsStore.getState().getSettings();\n let cdnBranding = null;\n \n if (packageSettings?.brandingConfigUrl) {\n try {\n debugLogger.info(\"Attempting to load CDN branding config\", { url: packageSettings.brandingConfigUrl });\n const configResponse = await fetch(packageSettings.brandingConfigUrl);\n const cdnConfig = await configResponse.json();\n cdnBranding = cdnConfig?.branding;\n \n if (cdnBranding) {\n debugLogger.info(\"CDN branding found, applying CDN defaults\", { \n hasBrandingText: !!cdnBranding.brandingText,\n hasLogo: !!cdnBranding.logoBase64,\n theme: cdnBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Failed to load CDN branding config, will use Bandit defaults\", { error: err });\n }\n }\n\n // Apply CDN defaults if available, otherwise use Bandit defaults\n if (cdnBranding) {\n // Apply CDN branding\n setLogoBase64(cdnBranding.logoBase64 || null);\n setBrandingText(cdnBranding.brandingText || \"\");\n setTheme(cdnBranding.theme || \"bandit-dark\");\n if (cdnBranding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(cdnBranding.hasTransparentLogo);\n } else {\n setHasTransparentLogo(true);\n }\n debugLogger.info(\"Applied CDN branding defaults\");\n } else {\n // Fall back to Bandit defaults\n setLogoBase64(null);\n setBrandingText(\"\");\n setTheme(\"bandit-dark\");\n setHasTransparentLogo(true);\n debugLogger.info(\"Applied Bandit default branding\");\n }\n\n // Reset other local state\n setLogoFile(null);\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n getOptimalFabLogo().then(setFabLogo);\n\n // Save the restored defaults to IndexedDB to ensure persistence\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n const current = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n\n const brandingToSave = cdnBranding ? {\n ...cdnBranding,\n userSaved: false, // Mark as CDN-loaded, not user-saved\n } : {\n logoBase64: null,\n brandingText: \"\",\n theme: \"bandit-dark\",\n hasTransparentLogo: true,\n userSaved: false, // Mark as default, not user-saved\n };\n\n debugLogger.info(\"Saving restored branding to IndexedDB\", { \n source: cdnBranding ? 'CDN' : 'Bandit defaults',\n userSaved: brandingToSave.userSaved\n });\n \n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: brandingToSave,\n model: current?.model ?? {},\n }, storeConfigs);\n\n // Dispatch theme change event for other components to listen\n const finalTheme = cdnBranding?.theme || \"bandit-dark\";\n window.dispatchEvent(new CustomEvent('bandit-theme-changed', {\n detail: { theme: finalTheme }\n }));\n\n debugLogger.info(\"Successfully restored and saved branding\", { theme: finalTheme });\n } catch (error) {\n debugLogger.error(\"Failed to save restored branding\", { error });\n }\n };\n\n // Restore default models: clear deletedModels and re-import from config\n const restoreDefaultModelsAndConfig = async () => {\n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n\n debugLogger.info(\"Starting restore defaults - preserving critical data\");\n\n // Get current branding to preserve it if it's user-saved\n const currentMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const preservedBranding = currentMain?.branding?.userSaved ? currentMain.branding : null;\n\n // Remove \"deletedModels\" entry to clear deleted model tracking\n await indexedDBService.delete('banditConfig', 1, 'config', 'deletedModels', storeConfigs);\n\n // Only clear custom models from IndexedDB, but keep \"main\", \"mcpTools\", and other system data\n const allKeys = await indexedDBService.getAllKeys(\"banditConfig\", 1, \"config\", storeConfigs);\n const systemKeys = [\"main\", \"deletedModels\", \"mcpTools\", \"preferences\", \"knowledgeDocs\"]; // Preserve system data\n\n for (const key of allKeys) {\n if (typeof key === \"string\" && !systemKeys.includes(key)) {\n // Only delete if it looks like a model entry\n const entry = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n key,\n storeConfigs\n );\n const hasModelData =\n Boolean(entry?.model) ||\n (typeof entry?.name === \"string\" && entry.name.trim().length > 0) ||\n (typeof entry?.tagline === \"string\" && entry.tagline.trim().length > 0) ||\n (typeof entry?.systemPrompt === \"string\" && entry.systemPrompt.trim().length > 0);\n if (hasModelData) {\n debugLogger.info(\"Deleting custom model:\", { key });\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", key, storeConfigs);\n } else {\n debugLogger.info(\"Preserving non-model data:\", { key });\n }\n }\n }\n\n // Restore default models (this now handles config URL loading and persistence)\n if (typeof useModelStore.getState().restoreDefaultModels === \"function\") {\n await useModelStore.getState().restoreDefaultModels();\n }\n\n // Restore preserved branding if it existed and was user-saved\n if (preservedBranding) {\n debugLogger.info(\"Restoring preserved user branding after model restore\");\n const updatedMain = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n const restoredMain: StoredBanditConfigRecord = updatedMain ?? { id: \"main\" };\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...restoredMain,\n id: \"main\",\n branding: preservedBranding, // Restore the preserved branding\n }, storeConfigs);\n }\n\n debugLogger.info(\"Restore defaults completed successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore default models and config\", { error: err });\n }\n };\n\n // Restore deleted Bandit models only\n const restoreBanditModels = async () => {\n try {\n debugLogger.info(\"Restoring deleted Bandit models\");\n await useModelStore.getState().restoreDeletedBanditModels();\n debugLogger.info(\"✅ Bandit models restored successfully\");\n } catch (err) {\n debugLogger.error(\"Failed to restore Bandit models\", { error: err });\n }\n };\n\n const handleImportConfig = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.files && event.target.files[0]) {\n const file = event.target.files[0];\n const reader = new FileReader();\n reader.onload = async function (e) {\n try {\n const data = JSON.parse(e.target?.result as string);\n if (data.branding) {\n setBrandingText(data.branding.brandingText || \"\");\n setTheme(data.branding.theme || \"Dark\");\n setLogoBase64(data.branding.logoBase64 || null);\n setLogoFile(null);\n if (data.branding.hasTransparentLogo !== undefined) {\n setHasTransparentLogo(data.branding.hasTransparentLogo);\n }\n }\n // --- MODELS IMPORT LOGIC ---\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n // Persist each model separately by ID\n if (data.models && Array.isArray(data.models)) {\n for (const model of data.models) {\n if (!model || typeof model !== \"object\") {\n continue;\n }\n const parsedModel = model as Record<string, unknown>;\n const modelName = typeof parsedModel.name === \"string\" ? parsedModel.name : \"\";\n if (!modelName) {\n continue;\n }\n\n const sanitizedModel: StoredModelConfig = {\n name: modelName,\n tagline: typeof parsedModel.tagline === \"string\" ? parsedModel.tagline : undefined,\n systemPrompt: typeof parsedModel.systemPrompt === \"string\" ? parsedModel.systemPrompt : undefined,\n selectedModel: typeof parsedModel.selectedModel === \"string\" ? parsedModel.selectedModel : undefined,\n };\n\n const entry: StoredBanditConfigRecord = {\n id: modelName,\n model: sanitizedModel,\n name: modelName,\n tagline: sanitizedModel.tagline,\n systemPrompt: sanitizedModel.systemPrompt,\n avatarBase64: typeof parsedModel.avatarBase64 === \"string\" ? parsedModel.avatarBase64 : undefined,\n };\n\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", entry, storeConfigs);\n }\n\n // Update Zustand with all imported models\n useModelStore.setState({\n availableModels: data.models,\n selectedModel: data.models[0]?.name || \"\",\n });\n setSelectedModel(data.models[0]?.name || \"\");\n setLocalSelectedModel({\n name: data.models[0]?.name || \"\",\n tagline: data.models[0]?.tagline || \"\",\n systemPrompt: data.models[0]?.systemPrompt || \"\",\n selectedModel: data.models[0]?.name || \"\",\n });\n setCustomAvatarBase64(data.models[0]?.avatarBase64 || null);\n setPresetAvatar(null);\n }\n\n // Save branding only to \"main\" entry - mark as user-saved to protect from CDN\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"main\",\n branding: {\n ...data.branding,\n userSaved: true, // Mark imported branding as user-saved to protect from CDN overrides\n },\n }, storeConfigs);\n\n // Handle knowledgeDocs import\n if (data.knowledgeDocs && Array.isArray(data.knowledgeDocs)) {\n await clearAllDocuments();\n for (const doc of data.knowledgeDocs) {\n const blob = new Blob([doc.content], { type: \"text/plain\" });\n const file = new File([blob], doc.name, { type: \"text/plain\" });\n await addDocuments([file]);\n }\n await loadDocuments();\n }\n\n // Rehydrate from IndexedDB\n if (typeof initModels === \"function\") {\n await initModels();\n }\n } catch (e) {\n debugLogger.error(\"Failed to import config\", { error: e });\n }\n };\n reader.readAsText(file);\n }\n };\n\n // Ensure dropdown renders updated options when availableModels changes\n useEffect(() => {\n // If selectedModel is not in availableModels, clear selection\n if (\n localSelectedModel.selectedModel &&\n !availableModels.some((m) => m.name === localSelectedModel.selectedModel)\n ) {\n setLocalSelectedModel((prev) => ({\n ...prev,\n selectedModel: \"\",\n }));\n }\n // Optionally, you could auto-select the newly added model here if desired\n }, [availableModels, localSelectedModel.selectedModel]);\n\n useEffect(() => {\n loadDocuments();\n }, [loadDocuments]);\n\n // AI Provider configuration handlers\n const currentTheme = predefinedThemes[theme] || banditDarkTheme;\n if (!brandingLoaded) return null;\n // Side navigation tab config\n const allNavTabs = [\n {\n label: \"Personalities\",\n icon: <FaceRetouchingNaturalIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Branding\",\n icon: <BrushIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Knowledge\",\n icon: <MenuBookIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Storage\",\n icon: <StorageIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+ (changed from adminDashboardEnabled)\n },\n {\n label: \"Preferences\",\n icon: <TuneIcon />,\n requiresFeature: 'limitedAdminDashboard', // Available to premium+\n },\n {\n label: \"Provider\",\n icon: <CloudIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n {\n label: \"MCP Tools\",\n icon: <BuildIcon />,\n requiresFeature: 'advancedSearch', // Pro/Team users with advanced features\n },\n ];\n\n // Filter tabs based on user's features\n const navTabs = allNavTabs.filter(tab => {\n if (tab.requiresFeature === 'limitedAdminDashboard') {\n return hasLimitedAdminDashboard() || hasAdminDashboard();\n }\n if (tab.requiresFeature === 'adminDashboardEnabled') {\n return hasAdminDashboard();\n }\n if (tab.requiresFeature === 'advancedSearch') {\n return hasAdvancedSearch(); // Pro/Team users\n }\n return true;\n });\n\n const navigationContent = (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n bgcolor: \"inherit\",\n }}\n >\n {isMobile && (\n <Box\n sx={{\n height: 6,\n width: 56,\n borderRadius: 999,\n bgcolor: (theme) => alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n <Box sx={{ p: isMobile ? 2.5 : 3, pb: isMobile ? 1.5 : 2 }}>\n <Button\n onClick={() => {\n if (isMobile) setSidebarOpen(false);\n navigate(\"/chat\");\n }}\n onMouseEnter={preloadChatPage}\n startIcon={<ChevronLeftIcon sx={{ fontSize: 20 }} />}\n fullWidth\n variant=\"outlined\"\n sx={{\n height: 48,\n borderRadius: 3,\n fontWeight: 600,\n fontSize: \"1rem\",\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.08)\"\n : \"rgba(25,118,210,0.06)\",\n border: (theme) => `1.5px solid ${theme.palette.primary.main}30`,\n color: (theme) => theme.palette.primary.main,\n textTransform: \"none\",\n boxShadow: \"0 2px 8px rgba(25,118,210,0.15)\",\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.12)\",\n borderColor: (theme) => theme.palette.primary.main,\n transform: \"translateY(-1px)\",\n boxShadow: \"0 4px 16px rgba(25,118,210,0.25)\",\n },\n \"&:active\": {\n transform: \"translateY(0px)\",\n },\n }}\n >\n Back to Chat\n </Button>\n </Box>\n\n <Divider sx={{ mx: isMobile ? 2 : 3, mb: 2, opacity: 0.6 }} />\n\n <Box sx={{ flex: 1, px: isMobile ? 1.5 : 2, pb: 3, overflowY: \"auto\" }}>\n <List sx={{ px: 0, py: 0 }}>\n {navTabs.map((tab, idx) => (\n <ListItemButton\n key={tab.label}\n selected={tabIndex === idx}\n onClick={() => {\n setTabIndex(idx);\n if (isMobile) setSidebarOpen(false);\n }}\n sx={{\n minHeight: 56,\n borderRadius: 3,\n mx: 1,\n my: 0.5,\n px: 2,\n py: 1.5,\n border: tabIndex === idx \n ? (theme) => `2px solid ${theme.palette.primary.main}40`\n : \"2px solid transparent\",\n bgcolor: tabIndex === idx\n ? (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\"\n : \"transparent\",\n color: tabIndex === idx ? \"primary.main\" : \"text.primary\",\n fontWeight: tabIndex === idx ? 700 : 500,\n transition: \"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n \"&:before\": {\n content: '\"\"',\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 4,\n bgcolor: tabIndex === idx ? \"primary.main\" : \"transparent\",\n borderRadius: \"0 2px 2px 0\",\n transition: \"all 0.2s\",\n },\n \"&:hover\": {\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.15)\"\n : \"rgba(25,118,210,0.10)\",\n color: \"primary.main\",\n transform: \"translateX(4px)\",\n \"&:before\": {\n bgcolor: \"primary.main\",\n },\n },\n \"&:active\": {\n transform: \"translateX(2px) scale(0.98)\",\n },\n \"& .MuiListItemIcon-root\": {\n minWidth: 44,\n mr: 1.5,\n },\n }}\n >\n <ListItemIcon \n sx={{ \n color: tabIndex === idx ? \"primary.main\" : \"text.secondary\",\n fontSize: 24,\n transition: \"all 0.2s\",\n }}\n >\n {tab.icon}\n </ListItemIcon>\n <ListItemText\n primary={tab.label}\n primaryTypographyProps={{\n fontWeight: tabIndex === idx ? 700 : 600,\n fontSize: \"1rem\",\n letterSpacing: \"-0.01em\",\n }}\n />\n {tabIndex === idx && (\n <Box\n sx={{\n position: \"absolute\",\n right: -10,\n top: -10,\n width: 90,\n height: 90,\n bgcolor: (theme) => theme.palette.primary.main,\n filter: \"blur(45px)\",\n opacity: 0.35,\n pointerEvents: \"none\",\n }}\n />\n )}\n </ListItemButton>\n ))}\n </List>\n </Box>\n </Box>\n );\n return (\n <ThemeProvider theme={currentTheme}>\n <CssBaseline />\n <Box\n display=\"flex\"\n height=\"100vh\"\n sx={{\n bgcolor: \"background.default\",\n flexDirection: isMobile ? \"column\" : \"row\",\n width: \"100vw\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* Enhanced Mobile Header */}\n {isMobile && (\n <Box\n sx={{\n width: \"100%\",\n height: 64,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n px: 3,\n py: 1.5,\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(24,28,40,0.95)\"\n : \"rgba(255,255,255,0.95)\",\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n backdropFilter: \"blur(12px)\",\n zIndex: 1201,\n position: \"sticky\",\n top: 0,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n {/* Enhanced Hamburger Menu */}\n <Button\n onClick={() => setSidebarOpen((o) => !o)}\n sx={{\n minWidth: 48,\n minHeight: 48,\n p: 1.5,\n borderRadius: 2,\n border: \"none\",\n bgcolor: sidebarOpen \n ? (theme) => theme.palette.primary.main\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.08)\"\n : \"rgba(0,0,0,0.04)\",\n color: sidebarOpen \n ? \"white\"\n : (theme) => theme.palette.primary.main,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n transform: sidebarOpen ? \"rotate(90deg)\" : \"rotate(0deg)\",\n \"&:hover\": {\n bgcolor: sidebarOpen\n ? (theme) => theme.palette.primary.dark\n : (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(255,255,255,0.12)\"\n : \"rgba(0,0,0,0.08)\",\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: sidebarOpen ? \"rotate(90deg) scale(0.95)\" : \"scale(0.95)\",\n },\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d={sidebarOpen \n ? \"M18 6L6 18M6 6L18 18\" \n : \"M3 12H21M3 6H21M3 18H21\"\n }\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n\n {/* App Title */}\n <Typography \n variant=\"h6\" \n sx={{ \n fontWeight: 700, \n color: \"primary.main\",\n fontSize: \"1.1rem\",\n letterSpacing: \"-0.02em\"\n }}\n >\n Management\n </Typography>\n\n {/* Current Tab Indicator */}\n <Box sx={{\n px: 2,\n py: 0.5,\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === \"dark\"\n ? \"rgba(25,118,210,0.12)\"\n : \"rgba(25,118,210,0.08)\",\n border: (theme) => `1px solid ${theme.palette.primary.main}20`,\n }}>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"primary.main\", \n fontWeight: 600,\n fontSize: \"0.75rem\"\n }}\n >\n {navTabs[tabIndex]?.label}\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Enhanced Side Navigation */}\n {isMobile ? (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={sidebarOpen}\n onClose={() => setSidebarOpen(false)}\n onOpen={() => setSidebarOpen(true)}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n PaperProps={{\n sx: {\n height: 'min(720px, 82vh)',\n borderRadius: '22px 22px 0 0',\n overflow: 'hidden',\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n boxShadow: '0 12px 32px rgba(0,0,0,0.28)',\n backdropFilter: 'blur(18px)',\n },\n }}\n >\n {navigationContent}\n </SwipeableDrawer>\n ) : (\n <Box\n sx={{\n width: 280,\n minWidth: 280,\n maxWidth: 280,\n height: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n bgcolor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"rgba(16,20,28,0.98)\"\n : \"rgba(255,255,255,0.98)\",\n borderRight: (theme) => `1px solid ${theme.palette.divider}`,\n boxShadow: (theme) => theme.palette.mode === \"dark\"\n ? \"2px 0 16px 0 rgba(0,0,0,0.25)\"\n : \"2px 0 16px 0 rgba(0,0,0,0.08)\",\n backdropFilter: \"blur(16px)\",\n zIndex: 1200,\n position: \"fixed\",\n left: 0,\n top: 0,\n overflow: \"hidden\",\n }}\n >\n {navigationContent}\n </Box>\n )}\n\n {/* Main content area */}\n <Box\n sx={{\n flex: 1,\n p: { xs: 1, sm: 3, md: 4 },\n overflowY: \"auto\",\n height: isMobile ? \"auto\" : \"100vh\",\n maxWidth: \"100vw\",\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"background.default\",\n ml: isMobile ? 0 : \"280px\", // Fixed left margin only on desktop\n mt: 0,\n transition: \"margin-left 0.2s\",\n overflow: \"auto\",\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}\n >\n {/* Tab Content */}\n {navTabs[tabIndex]?.label === \"Personalities\" && (\n <PersonalitiesTab\n availableModels={availableModels}\n selectedModel={selectedModel}\n setSelectedModel={setSelectedModel}\n localSelectedModel={localSelectedModel}\n setLocalSelectedModel={setLocalSelectedModel}\n customAvatarBase64={customAvatarBase64}\n setCustomAvatarBase64={setCustomAvatarBase64}\n presetAvatar={presetAvatar}\n setPresetAvatar={setPresetAvatar}\n handleSaveModel={handleSaveModel}\n handleResetModel={handleResetModel}\n restoreDefaultModelsAndConfig={restoreDefaultModelsAndConfig}\n restoreBanditModels={restoreBanditModels}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Branding\" && (\n <BrandingTab\n logoFile={logoFile}\n logoBase64={logoBase64}\n brandingText={brandingText}\n setBrandingText={setBrandingText}\n theme={theme}\n setTheme={setTheme}\n predefinedThemes={predefinedThemes}\n handleLogoUpload={handleLogoUpload}\n handleRestoreDefaults={handleRestoreDefaults}\n handleExportConfig={handleExportConfig}\n handleImportConfig={handleImportConfig}\n handleSaveBranding={handleSaveBranding}\n setLogoFile={setLogoFile}\n setLogoBase64={setLogoBase64}\n />\n )}\n {navTabs[tabIndex]?.label === \"Knowledge\" && (\n <KnowledgeTab\n documents={documents}\n addDocuments={addDocuments}\n removeDocument={removeDocument}\n loadDocuments={loadDocuments}\n clearAllDocuments={clearAllDocuments}\n currentTheme={currentTheme}\n isLimitedAdmin={hasLimitedAdminDashboard() && !hasAdminDashboard()}\n />\n )}\n {navTabs[tabIndex]?.label === \"Storage\" && (\n <StorageTab currentTheme={currentTheme} />\n )}\n {navTabs[tabIndex]?.label === \"Preferences\" && (\n <PreferencesTab\n preferences={preferences}\n updatePreference={updatePreference}\n packageSettings={packageSettings}\n handleSavePreferences={handleSavePreferences}\n showSnackbar={showSnackbarMessage}\n />\n )}\n {navTabs[tabIndex]?.label === \"Provider\" && <ProviderTab />}\n {navTabs[tabIndex]?.label === \"MCP Tools\" && <MCPToolsTabV2 />}\n </Box>\n\n <Fab\n aria-label=\"AI\"\n onClick={handleOpenModal}\n sx={(theme) => ({\n position: \"fixed\",\n bottom: 16,\n right: 16,\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n \"&:hover\": {\n backgroundColor: theme.palette.primary.dark,\n transform: \"scale(1.05)\",\n },\n \"&:active\": {\n transform: \"scale(0.95)\",\n },\n transition: \"all 0.2s ease-in-out\",\n boxShadow: theme.shadows[6],\n zIndex: 2000,\n })}\n >\n <img\n src={fabLogo}\n alt=\"AI Assistant Logo\"\n style={{\n width: 32,\n height: 32,\n objectFit: \"contain\",\n }}\n />\n </Fab>\n <ChatModal open={modalOpen} onClose={handleCloseModal} />\n </Box>\n\n </ThemeProvider>\n );\n};\n\nexport default Management;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FAB9-58E90B\nconst __banditFingerprint_components_PersonalitiesTabtsx = 'BL-FP-A5FD2B-5424';\nconst __auditTrail_components_PersonalitiesTabtsx = 'BL-AU-MGOIKVVJ-SL4R';\n// File: PersonalitiesTab.tsx | Path: src/management/components/PersonalitiesTab.tsx | Hash: fab95424\n\nimport React, { useState } from \"react\";\nimport {\n Box,\n TextField,\n Button,\n Typography,\n MenuItem,\n Avatar,\n Card,\n CardContent,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Tabs,\n Tab,\n Alert,\n Chip,\n GlobalStyles,\n} from \"@mui/material\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { useTheme } from \"@mui/material/styles\";\nimport AutoAwesomeIcon from '@mui/icons-material/AutoAwesome';\nimport RocketLaunchOutlinedIcon from '@mui/icons-material/RocketLaunchOutlined';\nimport ViewModuleOutlinedIcon from '@mui/icons-material/ViewModuleOutlined';\nimport EditNoteOutlinedIcon from '@mui/icons-material/EditNoteOutlined';\nimport ManageAccountsOutlinedIcon from '@mui/icons-material/ManageAccountsOutlined';\nimport PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded';\nimport AvatarCropper from '../../components/AvatarCropper';\nimport { BanditPersonality, useModelStore } from \"../../store/modelStore\";\nimport { models as defaultModels } from \"../../models/models\";\nimport { resolveAvatar } from \"../../util\";\nimport indexedDBService from \"../../services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\n\nexport interface LocalModelState {\n name: string;\n tagline: string;\n systemPrompt: string;\n selectedModel: string;\n}\n\ninterface PersonalitiesTabProps {\n availableModels: BanditPersonality[];\n selectedModel: string;\n setSelectedModel: (model: string) => void;\n localSelectedModel: LocalModelState;\n setLocalSelectedModel: (model: LocalModelState) => void;\n customAvatarBase64: string | null;\n setCustomAvatarBase64: (avatar: string | null) => void;\n presetAvatar: string | null;\n setPresetAvatar: (avatar: string | null) => void;\n handleSaveModel: () => Promise<void>;\n handleResetModel: () => void;\n restoreDefaultModelsAndConfig: () => Promise<void>;\n restoreBanditModels: () => Promise<void>;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}const PersonalitiesTab: React.FC<PersonalitiesTabProps> = ({\n availableModels,\n selectedModel,\n setSelectedModel,\n localSelectedModel,\n setLocalSelectedModel,\n customAvatarBase64,\n setCustomAvatarBase64,\n presetAvatar,\n setPresetAvatar,\n handleSaveModel,\n handleResetModel,\n restoreDefaultModelsAndConfig,\n restoreBanditModels,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [personalityTabIndex, setPersonalityTabIndex] = useState(0);\n const sectionGap = isMobile ? 2 : 3;\n const tabWrapperStyles = isMobile ? { flexDirection: 'column', gap: 0.35, fontSize: '0.78rem' } : { flexDirection: 'row', gap: 0.75, fontSize: '0.95rem' };\n const [restoreDialogOpen, setRestoreDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [personalityToDelete, setPersonalityToDelete] = useState<string | null>(null);\n const [clickedChips, setClickedChips] = useState<Set<string>>(new Set());\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n\n const promptTemplates = [\n {\n name: \"Business Professional\",\n tagline: \"Your reliable business companion\",\n avatar: \"https://cdn.burtson.ai/avatars/businessman.png\",\n prompt: \"You are a professional AI assistant specializing in business and productivity. You provide clear, concise, and actionable advice. Always maintain a professional tone while being helpful and efficient. Focus on practical solutions and best practices.\",\n description: \"Perfect for business environments, meetings, and professional communication.\"\n },\n {\n name: \"Creative Media Specialist\",\n tagline: \"Unleash your imagination together\",\n avatar: \"https://cdn.burtson.ai/avatars/mediagal.png\",\n prompt: \"You are a creative AI partner who loves to brainstorm, write, and explore imaginative ideas. You're enthusiastic, inspiring, and always ready to think outside the box. Help users unlock their creativity with vivid descriptions, innovative concepts, and artistic flair.\",\n description: \"Great for writers, designers, marketers, and creative projects.\"\n },\n {\n name: \"Data Science Expert\",\n tagline: \"Turn data into insights\",\n avatar: \"https://cdn.burtson.ai/avatars/datascience.png\",\n prompt: \"You are a data science expert who excels at analyzing data, creating visualizations, and extracting meaningful insights. You help with statistical analysis, machine learning models, and data interpretation. Always explain your reasoning and suggest actionable next steps based on data findings.\",\n description: \"Perfect for data analysis, research, and statistical insights.\"\n },\n {\n name: \"Customer Support Pro\",\n tagline: \"Helpful, patient, and solution-focused\",\n avatar: \"https://cdn.burtson.ai/avatars/support.png\",\n prompt: \"You are a customer support specialist who is patient, empathetic, and solution-focused. You listen carefully to customer concerns, ask clarifying questions, and provide step-by-step solutions. Always maintain a positive, helpful attitude even with difficult situations.\",\n description: \"Designed for customer service and support interactions.\"\n },\n {\n name: \"Startup Mentor\",\n tagline: \"From idea to unicorn\",\n avatar: \"https://cdn.burtson.ai/avatars/startupmentor.png\",\n prompt: \"You are an experienced startup mentor who has helped dozens of companies go from idea to successful business. You provide practical advice on product development, fundraising, marketing, and scaling. You're direct but encouraging, with a bias toward action and customer validation.\",\n description: \"Essential for entrepreneurs, founders, and startup teams.\"\n },\n {\n name: \"Learning Coach\",\n tagline: \"Master any skill together\",\n avatar: \"https://cdn.burtson.ai/avatars/trainer.png\",\n prompt: \"You are an expert learning coach who adapts to any subject and learning style. You break down complex topics into digestible chunks, create practice exercises, and provide encouraging feedback. You use analogies, examples, and interactive methods to make learning engaging and effective.\",\n description: \"Great for students, educators, and lifelong learners.\"\n },\n {\n name: \"Research Assistant\",\n tagline: \"Deep dives, accurate sources\",\n avatar: \"https://cdn.burtson.ai/avatars/researcher.png\",\n prompt: \"You are a meticulous research assistant who excels at finding reliable sources, synthesizing information, and presenting comprehensive findings. You approach topics systematically, consider multiple perspectives, and always cite your sources. You help users understand complex subjects through thorough investigation.\",\n description: \"Ideal for academics, journalists, and research projects.\"\n },\n {\n name: \"Travel Expert\",\n tagline: \"Adventures await everywhere\",\n avatar: \"https://cdn.burtson.ai/avatars/travel.png\",\n prompt: \"You are an experienced travel companion who knows hidden gems, local customs, and practical travel tips worldwide. You help plan itineraries, suggest activities, and provide cultural insights. You're enthusiastic about exploration while being mindful of budget, safety, and local etiquette.\",\n description: \"Essential for travelers, adventure seekers, and culture enthusiasts.\"\n }\n ];\n\n const moodSuggestions = [\n { label: \"Friendly\", color: \"#4CAF50\" },\n { label: \"Professional\", color: \"#2196F3\" },\n { label: \"Casual\", color: \"#FF9800\" },\n { label: \"Enthusiastic\", color: \"#E91E63\" },\n { label: \"Calm\", color: \"#9C27B0\" },\n { label: \"Witty\", color: \"#FF5722\" },\n { label: \"Serious\", color: \"#607D8B\" },\n { label: \"Supportive\", color: \"#009688\" }\n ];\n\n const handleTemplateSelect = (template: typeof promptTemplates[0]) => {\n setLocalSelectedModel({\n ...localSelectedModel,\n name: template.name,\n tagline: template.tagline,\n systemPrompt: template.prompt,\n selectedModel: \"\", // Clear selected model to indicate new model creation\n });\n // Set the template's avatar\n setPresetAvatar(template.avatar);\n setCustomAvatarBase64(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n };\n\n const handleMoodSelect = (mood: string) => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n let moodInstruction = \"\";\n \n switch (mood.toLowerCase()) {\n case \"friendly\":\n moodInstruction = \"Always be warm, welcoming, and approachable in your responses.\";\n break;\n case \"professional\":\n moodInstruction = \"Maintain a professional, business-appropriate tone in all interactions.\";\n break;\n case \"casual\":\n moodInstruction = \"Use a relaxed, conversational tone as if talking to a friend.\";\n break;\n case \"enthusiastic\":\n moodInstruction = \"Show excitement and energy in your responses, use positive language.\";\n break;\n case \"calm\":\n moodInstruction = \"Speak in a soothing, peaceful manner that helps users feel at ease.\";\n break;\n case \"witty\":\n moodInstruction = \"Use clever humor and wordplay when appropriate, but stay helpful.\";\n break;\n case \"serious\":\n moodInstruction = \"Maintain a focused, no-nonsense approach to problem-solving.\";\n break;\n case \"supportive\":\n moodInstruction = \"Be encouraging and understanding, offering emotional support when needed.\";\n break;\n }\n\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + moodInstruction;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `mood-${mood}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${mood}\" mood to your personality!`, 'success');\n }\n };\n\n const handleDeletePersonality = (modelNameToDelete?: string) => {\n const nameToDelete = modelNameToDelete || localSelectedModel.selectedModel;\n \n if (!nameToDelete) {\n debugLogger.warn(\"No model selected for deletion\");\n return;\n }\n \n setPersonalityToDelete(nameToDelete);\n setDeleteDialogOpen(true);\n };\n\n const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n if (showSnackbar) {\n showSnackbar('Please select a JPG or PNG image file.', 'error');\n }\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n if (showSnackbar) {\n showSnackbar('Image file size must be less than 10MB.', 'error');\n }\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n setCustomAvatarBase64(croppedImageData);\n setPresetAvatar(null);\n setCropperOpen(false);\n setSelectedImageFile(null);\n \n if (showSnackbar) {\n showSnackbar('Avatar cropped successfully!', 'success');\n }\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const confirmDeletePersonality = async () => {\n if (!personalityToDelete) return;\n\n debugLogger.info(\"Deleting personality\", { modelName: personalityToDelete });\n \n try {\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }];\n \n // Check if this is a Bandit personality that should be tracked as deleted\n const isBanditPersonality = defaultModels.some(banditModel => banditModel.name === personalityToDelete);\n \n if (isBanditPersonality) {\n // Add to deleted models tracking list\n const deletedEntry = await indexedDBService.get(\"banditConfig\", 1, \"config\", \"deletedModels\", storeConfigs);\n const deletedModelNames = deletedEntry?.deleted ?? [];\n \n if (!deletedModelNames.includes(personalityToDelete)) {\n const updatedDeletedNames = [...deletedModelNames, personalityToDelete];\n await indexedDBService.put(\"banditConfig\", 1, \"config\", {\n id: \"deletedModels\",\n deleted: updatedDeletedNames,\n }, storeConfigs);\n debugLogger.info(\"Added Bandit personality to deleted tracking list\", { \n deletedPersonality: personalityToDelete \n });\n }\n }\n \n // Remove from IndexedDB\n await indexedDBService.delete(\"banditConfig\", 1, \"config\", personalityToDelete, storeConfigs);\n \n // Update Zustand store\n useModelStore.setState({\n availableModels: availableModels.filter(model => model.name !== personalityToDelete),\n });\n \n // Reset form to first available model (or empty if no custom models)\n const remainingModels = availableModels.filter(model => model.name !== personalityToDelete);\n const firstModel = remainingModels.length > 0 ? remainingModels[0] : null;\n \n if (firstModel) {\n setSelectedModel(firstModel.name);\n setLocalSelectedModel({\n selectedModel: firstModel.name,\n name: firstModel.name,\n tagline: firstModel.tagline || \"\",\n systemPrompt: firstModel.systemPrompt || \"\",\n });\n setCustomAvatarBase64(firstModel.avatarBase64 || null);\n setPresetAvatar(null);\n } else {\n // No custom models left, reset form\n setSelectedModel(\"\");\n setLocalSelectedModel({\n selectedModel: \"\",\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n \n debugLogger.info(\"✅ Personality deleted successfully\");\n \n // Show success message\n if (showSnackbar) {\n showSnackbar(`Personality \"${personalityToDelete}\" deleted successfully!`, 'success');\n }\n \n } catch (error) {\n debugLogger.error(\"Failed to delete personality\", { error });\n \n // Show error message\n if (showSnackbar) {\n showSnackbar(\"Failed to delete personality. Please try again.\", 'error');\n }\n } finally {\n setDeleteDialogOpen(false);\n setPersonalityToDelete(null);\n }\n };\n\n const renderTemplatesTab = () => (\n <>\n <GlobalStyles\n styles={{\n '@keyframes pulse': {\n '0%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n '50%': {\n transform: 'scale(1.05)',\n opacity: 0.8,\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 1,\n },\n },\n }}\n />\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box sx={{ \n display: \"flex\", \n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1.5, md: 2 }\n }}>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n gap: { xs: 1.1, sm: 1.5 },\n width: { xs: \"100%\", md: \"auto\" }\n }}>\n <Box sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n borderRadius: 2,\n p: { xs: 0.75, sm: 1 },\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: { xs: \"42px\", sm: \"48px\" },\n height: { xs: \"42px\", sm: \"48px\" },\n boxShadow: \"0 4px 12px rgba(25,118,210,0.25)\",\n }}>\n <RocketLaunchOutlinedIcon sx={{ fontSize: { xs: \"1.3rem\", sm: \"1.5rem\" }, color: 'common.white' }} />\n </Box>\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" }, flex: 1 }}>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n backgroundClip: \"text\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n mb: 0.5,\n fontSize: { xs: \"1.55rem\", sm: \"1.75rem\" }\n }}\n >\n Quick Start Templates\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ color: \"text.secondary\", fontWeight: 500, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}\n >\n 12 curated personalities • Ready to use\n </Typography>\n </Box>\n </Box>\n <Chip\n label=\"New\"\n size=\"small\"\n sx={{\n background: \"linear-gradient(135deg, #ff4081 0%, #f06292 100%)\",\n color: \"white\",\n fontWeight: 600,\n animation: \"pulse 2s infinite\",\n alignSelf: { xs: \"flex-start\", md: \"center\" }\n }}\n />\n </Box>\n \n <Alert \n severity=\"info\" \n sx={{ \n mb: { xs: 2.5, md: 4 }, \n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 },\n \"& .MuiAlert-icon\": {\n color: \"primary.main\"\n }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>💡</Typography>}\n >\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.5 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Choose a template to get started instantly\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically fill the creation form with a proven personality setup. \n You can then customize it further to match your specific needs.\n </Typography>\n </Box>\n </Alert>\n \n {/* Create from Scratch Card */}\n <Card\n sx={{\n mb: { xs: 3, md: 4 },\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n border: \"2px solid transparent\",\n borderRadius: 3,\n cursor: \"pointer\",\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n position: \"relative\",\n overflow: \"hidden\",\n \"&:hover\": {\n transform: \"translateY(-4px) scale(1.02)\",\n boxShadow: \"0 12px 40px rgba(25, 118, 210, 0.3)\",\n },\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%)\",\n pointerEvents: \"none\",\n }\n }}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n >\n <CardContent sx={{ \n p: { xs: 3, sm: 4 }, \n color: \"white\",\n textAlign: \"center\",\n position: \"relative\",\n zIndex: 1\n }}>\n <Box sx={{ \n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 0,\n mb: { xs: 1.5, sm: 2 },\n }}>\n <AutoAwesomeIcon sx={{ fontSize: { xs: 36, sm: 44 }, color: 'common.white', filter: \"drop-shadow(0 4px 12px rgba(0,0,0,0.25))\" }} />\n </Box>\n <Typography \n variant=\"h5\" \n sx={{ \n fontWeight: 700,\n mb: { xs: 0.75, sm: 1 },\n textShadow: \"0 2px 4px rgba(0,0,0,0.2)\"\n }}\n >\n Create from Scratch\n </Typography>\n <Typography \n variant=\"body1\" \n sx={{ \n opacity: 0.9,\n fontWeight: 500,\n textShadow: \"0 1px 2px rgba(0,0,0,0.2)\"\n }}\n >\n Start with a blank canvas and build your perfect AI personality\n </Typography>\n </CardContent>\n </Card>\n \n <Box sx={{ \n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, 1fr)\",\n md: \"repeat(3, 1fr)\",\n lg: \"repeat(4, 1fr)\",\n xl: \"repeat(4, 1fr)\",\n },\n gap: { xs: 2, sm: 2.5, md: 3 },\n alignItems: \"stretch\"\n }}>\n {promptTemplates.map((template, index) => (\n <Card\n key={index}\n sx={{\n cursor: \"pointer\",\n position: \"relative\",\n background: \"linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.05) 100%)\",\n backdropFilter: \"blur(10px)\",\n border: \"1px solid\",\n borderColor: \"rgba(255,255,255,0.1)\",\n borderRadius: 3,\n minHeight: { xs: \"auto\", md: \"280px\" },\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n height: \"3px\",\n background: `linear-gradient(90deg, \n hsl(${(index * 30) % 360}, 70%, 60%) 0%, \n hsl(${(index * 30 + 60) % 360}, 70%, 60%) 100%)`,\n opacity: 0,\n transition: \"opacity 0.3s ease\",\n },\n \"&:hover\": {\n transform: \"translateY(-8px) scale(1.02)\",\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\n borderColor: \"primary.main\",\n \"&::before\": {\n opacity: 1,\n },\n \"& .template-icon\": {\n transform: \"scale(1.1) rotate(5deg)\",\n },\n \"& .template-chip\": {\n transform: \"translateY(-2px)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.2)\",\n },\n },\n \"&:active\": {\n transform: \"translateY(-4px) scale(1.01)\",\n }\n }}\n onClick={() => handleTemplateSelect(template)}\n >\n <CardContent sx={{ \n p: { xs: 2.5, sm: 3 }, \n display: \"flex\", \n flexDirection: \"column\", \n height: \"100%\",\n justifyContent: \"space-between\"\n }}>\n {/* Header Section */}\n <Box>\n <Box sx={{ \n display: \"flex\", \n alignItems: \"center\", \n mb: { xs: 2, md: 2.5 },\n minHeight: { xs: \"auto\", md: \"60px\" }\n }}>\n <Avatar\n src={template.avatar}\n alt={template.name}\n sx={{\n width: { xs: 48, sm: 56, md: 60 },\n height: { xs: 48, sm: 56, md: 60 },\n mr: { xs: 1.5, md: 2 },\n transition: \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n border: \"2px solid rgba(255,255,255,0.8)\",\n }}\n />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography \n variant=\"body1\" \n sx={{ \n fontWeight: 700,\n fontSize: { xs: \"1rem\", sm: \"1.05rem\", md: \"1.1rem\" },\n lineHeight: 1.2,\n mb: 0.5,\n color: \"text.primary\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.name}\n </Typography>\n <Typography \n variant=\"caption\" \n sx={{ \n color: \"text.secondary\",\n fontStyle: \"italic\",\n fontSize: { xs: \"0.75rem\", sm: \"0.78rem\", md: \"0.8rem\" },\n fontWeight: 500,\n display: \"-webkit-box\",\n WebkitLineClamp: 1,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\"\n }}\n >\n {template.tagline}\n </Typography>\n </Box>\n </Box>\n\n {/* Description Section */}\n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\",\n lineHeight: 1.5,\n fontSize: { xs: \"0.82rem\", sm: \"0.85rem\", md: \"0.875rem\" },\n display: \"-webkit-box\",\n WebkitLineClamp: 4,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n mb: { xs: 1.5, md: 2 },\n minHeight: { xs: \"auto\", md: \"84px\" },\n }}\n >\n {template.description}\n </Typography>\n </Box>\n\n {/* Footer Section */}\n <Box sx={{ \n display: \"flex\", \n justifyContent: \"center\",\n alignItems: \"center\"\n }}>\n <Chip\n className=\"template-chip\"\n label=\"Apply Template\"\n size=\"small\"\n icon={<PlayArrowRoundedIcon sx={{ color: 'inherit', fontSize: '1rem !important' }} />}\n sx={{\n background: \"linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)\",\n color: \"white\",\n fontWeight: 600,\n fontSize: { xs: \"0.72rem\", md: \"0.75rem\" },\n height: { xs: \"30px\", md: \"32px\" },\n px: { xs: 1.5, md: 2 },\n borderRadius: 2,\n transition: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n \"&:hover\": {\n background: \"linear-gradient(135deg, #1565c0 0%, #1e88e5 100%)\",\n }\n }}\n />\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n\n <Alert \n severity=\"info\" \n sx={{ mt: { xs: 2.5, md: 4 }, borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}\n icon={<Typography>💡</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Pro Tip:\n </Typography>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Click any template to automatically switch to the Create/Edit tab with the form pre-filled. Mix and match ideas to create your perfect AI personality!\n </Typography>\n </Alert>\n </Box>\n </>\n );\n\n const renderCreateEditTab = () => (\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Typography\n variant=\"h5\"\n sx={{\n fontWeight: 600,\n mb: 1,\n color: \"primary.main\",\n fontSize: { xs: \"1.55rem\", sm: \"1.7rem\" },\n }}\n >\n {localSelectedModel.selectedModel ? \"Edit Personality\" : \"Create New Personality\"}\n </Typography>\n \n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", mb: { xs: 2, md: 3 }, fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n {localSelectedModel.selectedModel \n ? `Customize and modify the \"${localSelectedModel.selectedModel}\" personality to better suit your needs.`\n : \"Design a custom AI personality that matches your brand, use case, and communication style.\"\n }\n </Typography>\n\n {!localSelectedModel.selectedModel && (\n <Alert \n severity=\"info\" \n sx={{ \n mb: { xs: 2.5, md: 3 }, \n borderRadius: 2,\n border: \"1px solid rgba(25, 118, 210, 0.2)\",\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)\",\n px: { xs: 1.5, sm: 2 },\n py: { xs: 1.25, sm: 1.5 }\n }}\n icon={<Typography sx={{ fontSize: \"1.2rem\" }}>🎯</Typography>}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" } }}>\n Creating a new personality\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontSize: { xs: \"0.85rem\", sm: \"0.9rem\" }, lineHeight: 1.5 }}>\n Fill out the form below to create your custom AI assistant. Start with a template from the Templates tab, or build from scratch!\n </Typography>\n </Alert>\n )}\n </Box>\n\n <Box sx={{ mb: sectionGap }}>\n {localSelectedModel.selectedModel && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mt: 2, mb: 3 }}>\n <Avatar\n src={\n resolveAvatar(\n availableModels.find((m) => m.name === localSelectedModel.selectedModel) || {\n name: localSelectedModel.selectedModel,\n avatarBase64: customAvatarBase64,\n }\n )\n }\n alt={localSelectedModel.selectedModel}\n sx={{ width: 48, height: 48, mr: 2, filter: \"brightness(1.5)\" }}\n />\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>{localSelectedModel.selectedModel}</Typography>\n </Box>\n )}\n \n <TextField\n label=\"Select Existing Personality to Edit\"\n variant=\"outlined\"\n value={localSelectedModel.selectedModel}\n onChange={(e) => {\n const selectedModelName = e.target.value;\n if (selectedModelName) {\n // Find the selected model and populate the form\n const selectedModelData = availableModels.find(m => m.name === selectedModelName);\n if (selectedModelData) {\n setLocalSelectedModel({\n name: selectedModelData.name,\n tagline: selectedModelData.tagline,\n systemPrompt: selectedModelData.systemPrompt as string,\n selectedModel: selectedModelName,\n });\n setCustomAvatarBase64(selectedModelData.avatarBase64 || null);\n setPresetAvatar(null);\n }\n } else {\n // Clear form for new personality\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n }\n setSelectedModel(selectedModelName);\n }}\n fullWidth\n select\n sx={{ mb: sectionGap }}\n >\n <MenuItem value=\"\">Create New Personality</MenuItem>\n {availableModels.map((model, index) => (\n <MenuItem key={index} value={model.name}>\n {model.name}\n </MenuItem>\n ))}\n </TextField>\n </Box>\n\n <TextField\n label=\"Personality Name\"\n variant=\"outlined\"\n value={localSelectedModel.name}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, name: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., My Custom Assistant\"\n sx={{ mb: sectionGap }}\n />\n \n <TextField\n label=\"Tagline\"\n variant=\"outlined\"\n value={localSelectedModel.tagline}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, tagline: e.target.value })\n }\n fullWidth\n placeholder=\"e.g., Your helpful companion for daily tasks\"\n sx={{ mb: sectionGap }}\n />\n\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Mood & Personality\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any mood to automatically add personality instructions to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {moodSuggestions.map((mood) => (\n <Chip\n key={mood.label}\n label={mood.label}\n onClick={() => handleMoodSelect(mood.label)}\n sx={{\n bgcolor: mood.color + \"20\",\n color: mood.color,\n border: `1px solid ${mood.color}40`,\n \"&:hover\": {\n bgcolor: mood.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`mood-${mood.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: mood.color + \"40\",\n boxShadow: `0 0 20px ${mood.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Guidance */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n ✨ Formatting Tips\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Click any tip to add professional formatting to your system prompt:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { label: \"Be Specific\", text: \"Always be specific and detailed in your responses.\", color: \"#2196F3\" },\n { label: \"Stay In Character\", text: \"Maintain your personality consistently throughout the conversation.\", color: \"#4CAF50\" },\n { label: \"Ask Questions\", text: \"Ask clarifying questions when you need more information to help effectively.\", color: \"#FF9800\" },\n { label: \"Be Helpful\", text: \"Always prioritize being helpful and providing actionable advice.\", color: \"#9C27B0\" },\n { label: \"Use Examples\", text: \"Provide concrete examples whenever possible to illustrate your points.\", color: \"#F44336\" },\n { label: \"Be Concise\", text: \"Keep responses focused and concise while still being thorough.\", color: \"#00BCD4\" },\n ].map((tip) => (\n <Chip\n key={tip.label}\n label={tip.label}\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tip.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tip-${tip.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tip.label}\" tip to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tip.color + \"20\",\n color: tip.color,\n border: `1px solid ${tip.color}40`,\n \"&:hover\": {\n bgcolor: tip.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n ...(clickedChips.has(`tip-${tip.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tip.color + \"40\",\n boxShadow: `0 0 20px ${tip.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n {/* Formatting Tools */}\n <Box sx={{ mb: sectionGap }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Formatting Tools\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Add visual formatting to make your AI responses more engaging:\n </Typography>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1, mb: 2 }}>\n {[\n { \n label: \"Highlight Text\", \n text: \"Use <mark>highlighted text</mark> to emphasize important points.\", \n color: \"#FFC107\",\n icon: \"🔍\"\n },\n { \n label: \"Bold Emphasis\", \n text: \"Use **bold text** to make key concepts stand out.\", \n color: \"#795548\",\n icon: \"💪\"\n },\n { \n label: \"Add Emojis\", \n text: \"Use relevant emojis 🎯 to make responses more friendly and engaging.\", \n color: \"#FF9800\",\n icon: \"😊\"\n },\n { \n label: \"Code Blocks\", \n text: \"Use `code snippets` or ```code blocks``` for technical content.\", \n color: \"#424242\",\n icon: \"💻\"\n },\n { \n label: \"Lists & Structure\", \n text: \"Use bullet points:\\n• Point 1\\n• Point 2\\n• Point 3\", \n color: \"#607D8B\",\n icon: \"📝\"\n },\n { \n label: \"Action Items\", \n text: \"Create actionable steps:\\n✅ Do this first\\n🔄 Then this\\n🎯 Finally this\", \n color: \"#4CAF50\",\n icon: \"✅\"\n },\n ].map((tool) => (\n <Chip\n key={tool.label}\n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <Typography component=\"span\" sx={{ fontSize: \"0.85rem\" }}>\n {tool.icon}\n </Typography>\n <Typography component=\"span\" sx={{ fontSize: \"0.875rem\" }}>\n {tool.label}\n </Typography>\n </Box>\n }\n onClick={() => {\n const currentPrompt = localSelectedModel.systemPrompt || \"\";\n const updatedPrompt = currentPrompt + (currentPrompt ? \"\\n\\n\" : \"\") + tool.text;\n setLocalSelectedModel({\n ...localSelectedModel,\n systemPrompt: updatedPrompt\n });\n\n // Add visual feedback\n const chipKey = `tool-${tool.label}`;\n setClickedChips(prev => new Set(prev).add(chipKey));\n setTimeout(() => {\n setClickedChips(prev => {\n const newSet = new Set(prev);\n newSet.delete(chipKey);\n return newSet;\n });\n }, 1000);\n\n // Show snackbar feedback\n if (showSnackbar) {\n showSnackbar(`Added \"${tool.label}\" formatting to your prompt!`, 'success');\n }\n }}\n sx={{\n bgcolor: tool.color + \"20\",\n color: tool.color,\n border: `1px solid ${tool.color}40`,\n \"&:hover\": {\n bgcolor: tool.color + \"30\",\n transform: \"scale(1.05)\",\n },\n transition: \"all 0.2s ease-in-out\",\n cursor: \"pointer\",\n height: \"36px\",\n \"& .MuiChip-label\": {\n px: 1.5,\n },\n ...(clickedChips.has(`tool-${tool.label}`) && {\n transform: \"scale(1.1)\",\n bgcolor: tool.color + \"40\",\n boxShadow: `0 0 20px ${tool.color}60`,\n }),\n }}\n />\n ))}\n </Box>\n </Box>\n\n <TextField\n label=\"System Prompt\"\n variant=\"outlined\"\n value={localSelectedModel.systemPrompt}\n onChange={(e) =>\n setLocalSelectedModel({ ...localSelectedModel, systemPrompt: e.target.value })\n }\n fullWidth\n multiline\n rows={10}\n placeholder=\"Describe how your assistant should behave...\"\n InputLabelProps={{ shrink: true }}\n InputProps={{\n style: {\n minHeight: isMobile ? \"180px\" : \"240px\",\n maxHeight: \"360px\",\n },\n }}\n sx={{ mb: 3 }}\n />\n\n {/* Avatar selection: show for all models */}\n <Box sx={{ mb: 4 }}>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Select an Avatar\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 2, color: \"text.secondary\" }}>\n Choose from our curated collection of avatars to give your AI personality a face:\n </Typography>\n \n {/* Premium Professional Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"primary.main\", fontWeight: 600, display: \"block\" }}>\n 🤖 Robotic Collection\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Fembot', src: \"https://cdn.burtson.ai/avatars/fembot.png\" },\n { label: 'Dudebot', src: \"https://cdn.burtson.ai/avatars/dudebot.png\" },\n { label: 'Coolbot', src: \"https://cdn.burtson.ai/avatars/coolbot.png\" }\n ].map(({ label, src }) => (\n <Avatar\n key={label}\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n ))}\n </Box>\n\n {/* Professional Character Avatars */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"secondary.main\", fontWeight: 600, display: \"block\" }}>\n 👥 Professional Characters\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n {[\n { label: 'Business Professional', src: \"https://cdn.burtson.ai/avatars/businessman.png\", role: 'Business & Strategy' },\n { label: 'Data Scientist', src: \"https://cdn.burtson.ai/avatars/datascience.png\", role: 'Analytics & Insights' },\n { label: 'Support Specialist', src: \"https://cdn.burtson.ai/avatars/support.png\", role: 'Customer Support' },\n { label: 'Creative Professional', src: \"https://cdn.burtson.ai/avatars/mediagal.png\", role: 'Media & Design' },\n { label: 'Trainer & Mentor', src: \"https://cdn.burtson.ai/avatars/trainer.png\", role: 'Learning & Development' },\n { label: 'Researcher', src: \"https://cdn.burtson.ai/avatars/researcher.png\", role: 'Research & Analysis' },\n { label: 'Startup Mentor', src: \"https://cdn.burtson.ai/avatars/startupmentor.png\", role: 'Entrepreneurship' },\n { label: 'Travel Expert', src: \"https://cdn.burtson.ai/avatars/travel.png\", role: 'Travel & Adventure' },\n ].map(({ label, src, role }) => (\n <Box key={label} sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.5 }}>\n <Avatar\n src={src}\n alt={label}\n onClick={() => {\n setPresetAvatar(src);\n setCustomAvatarBase64(null);\n }}\n sx={{\n width: 72,\n height: 72,\n border: presetAvatar === src ? \"3px solid #1976d2\" : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.2s\",\n boxShadow: presetAvatar === src ? \"0 4px 12px rgba(25,118,210,0.3)\" : \"none\",\n '&:hover': {\n border: \"3px solid #1976d2\",\n transform: \"scale(1.05)\",\n boxShadow: \"0 4px 12px rgba(25,118,210,0.3)\",\n },\n }}\n />\n <Typography variant=\"caption\" sx={{ \n textAlign: 'center', \n maxWidth: '80px', \n fontSize: '0.7rem',\n lineHeight: 1.2,\n color: 'text.secondary',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden'\n }}>\n {role}\n </Typography>\n </Box>\n ))}\n </Box>\n\n {/* Custom Upload Section */}\n <Typography variant=\"caption\" sx={{ mb: 1, color: \"warning.main\", fontWeight: 600, display: \"block\" }}>\n 📸 Custom Upload\n </Typography>\n <Button \n variant=\"outlined\" \n component=\"label\"\n sx={{\n mb: 2,\n px: { xs: 2.2, sm: 3 },\n py: { xs: 1.2, sm: 1.5 },\n borderRadius: 2,\n textTransform: 'none',\n fontWeight: 600,\n borderStyle: 'dashed',\n borderWidth: 2,\n '&:hover': {\n borderStyle: 'dashed',\n borderWidth: 2,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n 🎯 Upload & Crop Custom Avatar\n <input \n type=\"file\" \n accept=\"image/png, image/jpeg, image/jpg\" \n hidden \n onChange={handleImageUpload}\n />\n </Button>\n \n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2, fontSize: '0.8rem' }}>\n • Supports JPG/PNG up to 10MB • Built-in cropper for perfect sizing • Final output: 512×512px\n </Typography>\n\n {(customAvatarBase64 || presetAvatar) && (\n <Box sx={{ mt: 2, display: 'flex', alignItems: 'center', gap: 2 }}>\n <Avatar\n src={(customAvatarBase64 || presetAvatar) as string}\n alt=\"Avatar Preview\"\n sx={{ \n width: 96, \n height: 96,\n border: '3px solid',\n borderColor: 'primary.main',\n boxShadow: 3\n }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: 'success.main' }}>\n ✅ Avatar Ready\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {customAvatarBase64 ? 'Custom uploaded image' : 'Professional avatar selected'}\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Avatar Cropper Dialog */}\n <AvatarCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", sm: \"row\" },\n gap: { xs: 1.5, sm: 2 },\n justifyContent: \"flex-start\", // Changed from flex-end to flex-start\n mr: { xs: 0, sm: 10 }, // Add right margin to avoid FAB\n mb: { xs: 8, sm: 2 }, // Add bottom margin on mobile for FAB clearance\n }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={handleResetModel}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Reset Form\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSaveModel}\n disabled={!localSelectedModel.name || !localSelectedModel.systemPrompt}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Save Personality\n </Button>\n </Box>\n </Box>\n );\n\n const renderManageTab = () => (\n <Box sx={{ \n height: \"100%\", \n overflow: \"auto\",\n p: { xs: 1.5, sm: 2 },\n // Hide scrollbars while keeping scroll functionality\n scrollbarWidth: \"none\", // Firefox\n \"&::-webkit-scrollbar\": {\n display: \"none\", // Chrome, Safari, Edge\n },\n \"-ms-overflow-style\": \"none\", // IE and Edge\n }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n flexWrap: \"wrap\",\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: \"1.45rem\", md: \"1.65rem\" } }}\n >\n 📋 Manage Personalities ({availableModels.length})\n </Typography>\n <Box sx={{ display: \"flex\", gap: { xs: 1, md: 2 }, flexWrap: \"wrap\", width: { xs: \"100%\", md: \"auto\" } }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.2, md: 3 },\n py: { xs: 0.95, md: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', sm: 'auto' }\n }}\n >\n Create Personality\n </Button>\n <Button\n variant=\"outlined\"\n color=\"info\"\n onClick={() => setRestoreDialogOpen(true)}\n sx={{ width: { xs: '100%', sm: 'auto' } }}\n >\n Restore Defaults\n </Button>\n </Box>\n </Box>\n\n {availableModels.length === 0 ? (\n <Card sx={{ textAlign: \"center\", py: 8, border: \"2px dashed\", borderColor: \"divider\" }}>\n <CardContent>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }} gutterBottom>\n 🤖 No Personalities Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Get started by creating your first custom AI personality or choosing from our templates.\n </Typography>\n <Box sx={{ display: \"flex\", gap: 2, justifyContent: \"center\", flexWrap: \"wrap\", mt: 3 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n ✨ Create From Scratch\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => setPersonalityTabIndex(0)} // Switch to Templates tab\n sx={{ px: { xs: 2.4, md: 3 }, py: { xs: 0.95, md: 1 }, width: { xs: '100%', sm: 'auto' } }}\n >\n 🎭 Browse Templates\n </Button>\n </Box>\n </CardContent>\n </Card>\n ) : (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: { xs: 2, md: 3 } }}>\n {availableModels.map((model) => (\n <Card key={model.name} sx={{ border: \"1px solid\", borderColor: \"divider\" }}>\n <CardContent sx={{ p: { xs: 2.5, sm: 3 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: { xs: 1.5, md: 2 } }}>\n <Avatar\n src={resolveAvatar(model)}\n alt={model.name}\n sx={{ width: { xs: 44, sm: 48 }, height: { xs: 44, sm: 48 }, mr: { xs: 1.5, sm: 2 } }}\n />\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {model.name}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontStyle: \"italic\" }}>\n {model.tagline}\n </Typography>\n </Box>\n </Box>\n \n <Typography \n variant=\"body2\" \n sx={{ \n color: \"text.secondary\", \n mb: 3,\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {model.systemPrompt}\n </Typography>\n\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => {\n setLocalSelectedModel({\n name: model.name,\n tagline: model.tagline,\n systemPrompt: model.systemPrompt as string,\n selectedModel: model.name,\n });\n setCustomAvatarBase64(model.avatarBase64 || null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to edit tab\n }}\n sx={{ flex: 1 }}\n >\n Edit\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n onClick={() => handleDeletePersonality(model.name)}\n sx={{ flex: 1 }}\n >\n Delete\n </Button>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n <Dialog open={restoreDialogOpen} onClose={() => setRestoreDialogOpen(false)}>\n <DialogTitle>Restore Default Personalities?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will delete all custom personalities and reset to the original configuration.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setRestoreDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={async () => {\n useModelStore.setState({ isInitializing: true });\n \n try {\n useModelStore.setState({ availableModels: [] });\n setSelectedModel(\"\");\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setPresetAvatar(null);\n setCustomAvatarBase64(null);\n await restoreDefaultModelsAndConfig();\n setRestoreDialogOpen(false);\n } catch (error) {\n debugLogger.error(\"Failed to restore defaults\", { error });\n setRestoreDialogOpen(false);\n } finally {\n useModelStore.setState({ isInitializing: false });\n }\n }}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Confirm\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Delete Personality Dialog */}\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)}>\n <DialogTitle>Delete Personality?</DialogTitle>\n <DialogContent>\n {personalityToDelete && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 2 }}>\n <Avatar\n src={resolveAvatar(\n availableModels.find(m => m.name === personalityToDelete) || {\n name: personalityToDelete,\n avatarBase64: null,\n }\n )}\n alt={personalityToDelete}\n sx={{ width: 56, height: 56, mr: 2 }}\n />\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n {personalityToDelete}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {availableModels.find(m => m.name === personalityToDelete)?.tagline || \"Custom personality\"}\n </Typography>\n </Box>\n </Box>\n )}\n <DialogContentText>\n Are you sure you want to delete this personality? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setDeleteDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={confirmDeletePersonality}\n color=\"error\"\n variant=\"contained\"\n autoFocus\n >\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n\n return (\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"flex-start\", md: \"center\" },\n justifyContent: \"space-between\",\n mb: { xs: 2, md: 3 },\n gap: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: \"left\", md: \"initial\" } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: \"1.6rem\", md: \"1.8rem\" } }}\n >\n Personalities\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: \"0.95rem\", sm: \"1rem\" }, lineHeight: 1.5 }}\n >\n Create and manage AI personalities that match your brand and use case.\n </Typography>\n </Box>\n \n <Button\n variant=\"contained\"\n color=\"primary\"\n size={isMobile ? \"medium\" : \"large\"}\n startIcon={<AutoAwesomeIcon fontSize={isMobile ? 'small' : 'medium'} />}\n onClick={() => {\n setLocalSelectedModel({\n name: \"\",\n tagline: \"\",\n systemPrompt: \"\",\n selectedModel: \"\",\n });\n setCustomAvatarBase64(null);\n setPresetAvatar(null);\n setPersonalityTabIndex(1); // Switch to Create/Edit tab\n }}\n sx={{ \n px: { xs: 2.4, sm: 3 },\n py: { xs: 0.95, sm: 1 },\n fontWeight: 600,\n borderRadius: 2,\n textTransform: 'none',\n boxShadow: 3,\n '&:hover': {\n boxShadow: 6,\n },\n width: { xs: '100%', md: 'auto' },\n minWidth: { xs: 'auto', md: '200px' }\n }}\n >\n Create Personality\n </Button>\n </Box>\n\n <Box sx={{ borderBottom: 1, borderColor: 'divider', mb: { xs: 1.5, md: 2 } }}>\n <Tabs \n value={personalityTabIndex} \n onChange={(_, newValue) => setPersonalityTabIndex(newValue)}\n variant={isMobile ? 'fullWidth' : 'standard'}\n sx={{\n '& .MuiTab-root': {\n textTransform: 'none',\n fontWeight: 600,\n fontSize: { xs: '0.95rem', sm: '1rem' },\n minWidth: { xs: 'auto', md: 160 },\n px: { xs: 1.1, sm: 1.5 },\n ...(isMobile ? { minHeight: 52 } : {}),\n },\n '& .MuiTab-wrapper': tabWrapperStyles,\n }}\n >\n <Tab \n icon={<ViewModuleOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Templates\" \n sx={{ \n color: personalityTabIndex === 0 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.5, sm: 0.75 },\n gap: { xs: 0.5, sm: 1 }\n }}\n />\n <Tab \n icon={<EditNoteOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Create / Edit\" \n sx={{ \n color: personalityTabIndex === 1 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n <Tab \n icon={<ManageAccountsOutlinedIcon fontSize={isMobile ? 'small' : 'medium'} />} \n iconPosition={isMobile ? 'top' : 'start'}\n label=\"Manage\" \n sx={{ \n color: personalityTabIndex === 2 ? 'primary.main' : 'text.secondary',\n py: { xs: 0.7, sm: 0.75 }\n }}\n />\n </Tabs>\n </Box>\n\n <Box sx={{ flex: 1, overflow: \"hidden\" }}>\n {personalityTabIndex === 0 && renderTemplatesTab()}\n {personalityTabIndex === 1 && renderCreateEditTab()}\n {personalityTabIndex === 2 && renderManageTab()}\n </Box>\n </Box>\n );\n};\n\nexport default PersonalitiesTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-D92A-F4D6ED\nconst __banditFingerprint_components_AvatarCroppertsx = 'BL-FP-0C6AA6-121B';\nconst __auditTrail_components_AvatarCroppertsx = 'BL-AU-MGOIKVV8-VV3E';\n// File: AvatarCropper.tsx | Path: src/components/AvatarCropper.tsx | Hash: d92a121b\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n} from '@mui/material';\nimport RotateLeftIcon from '@mui/icons-material/RotateLeft';\nimport RotateRightIcon from '@mui/icons-material/RotateRight';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\n\ninterface AvatarCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\nconst AvatarCropper: React.FC<AvatarCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n\n const CROP_SIZE = 400; // Fixed crop area size\n const OUTPUT_SIZE = 512; // Final output size\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const minScale = Math.max(\n CROP_SIZE / naturalWidth,\n CROP_SIZE / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.5),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Set canvas size\n canvas.width = CROP_SIZE;\n canvas.height = CROP_SIZE;\n\n // Clear canvas\n ctx.clearRect(0, 0, CROP_SIZE, CROP_SIZE);\n\n // Save context\n ctx.save();\n\n // Apply transformations\n ctx.translate(CROP_SIZE / 2, CROP_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop circle overlay\n ctx.save();\n ctx.globalCompositeOperation = 'destination-in';\n ctx.beginPath();\n ctx.arc(CROP_SIZE / 2, CROP_SIZE / 2, CROP_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }, [cropSettings, imageLoaded]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n // Set output canvas size\n canvas.width = OUTPUT_SIZE;\n canvas.height = OUTPUT_SIZE;\n\n // Fill background with white for transparency support\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, OUTPUT_SIZE, OUTPUT_SIZE);\n\n // Save context\n ctx.save();\n\n // Create circular clipping path\n ctx.beginPath();\n ctx.arc(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, OUTPUT_SIZE / 2, 0, Math.PI * 2);\n ctx.clip();\n\n // Apply transformations (scaled for output size)\n const scale = OUTPUT_SIZE / CROP_SIZE;\n ctx.translate(OUTPUT_SIZE / 2, OUTPUT_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scale, cropSettings.scale * scale);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scale,\n -image.naturalHeight / 2 + cropSettings.y * scale\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as data URL with high quality\n const croppedDataUrl = canvas.toDataURL('image/jpeg', 0.92);\n onCrop(croppedDataUrl);\n handleClose();\n }, [cropSettings, onCrop, handleClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const minScale = Math.max(\n CROP_SIZE / imageNaturalSize.width,\n CROP_SIZE / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n CROP_SIZE / Math.max(imageNaturalSize.width, 1),\n CROP_SIZE / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"md\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎯 Crop Your Avatar\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position and resize your image to create the perfect avatar\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3 }}>\n {/* Crop Preview */}\n <Paper\n elevation={3}\n sx={{\n width: CROP_SIZE,\n height: CROP_SIZE,\n borderRadius: '50%',\n overflow: 'hidden',\n border: '4px solid',\n borderColor: 'primary.main',\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\n '&:hover': {\n boxShadow: '0 12px 40px rgba(0,0,0,0.15)',\n transform: 'scale(1.02)',\n },\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CROP_SIZE}\n height={CROP_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n bottom: 8,\n left: '50%',\n transform: 'translateX(-50%)',\n background: 'rgba(0,0,0,0.7)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.8,\n }}\n >\n Drag to reposition\n </Box>\n )}\n </Paper>\n\n {/* Controls */}\n <Box sx={{ width: '100%', maxWidth: 400 }}>\n {/* Zoom Control */}\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 500 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={3}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 3}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 2, mb: 2 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n >\n Rotate Right\n </Button>\n </Box>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>💡 Pro Tips:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5 }}>\n • <strong>Drag</strong> the image to reposition it<br/>\n • <strong>Zoom</strong> to get the perfect framing<br/>\n • <strong>Rotate</strong> if your image is sideways<br/>\n • Final avatar will be <strong>{OUTPUT_SIZE}×{OUTPUT_SIZE}px</strong> and optimized for web\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Avatar\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default AvatarCropper;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0A6C-FE4A94\nconst __banditFingerprint_components_PreferencesTabtsx = 'BL-FP-D52A4A-DEAB';\nconst __auditTrail_components_PreferencesTabtsx = 'BL-AU-MGOIKVVK-ISXN';\n// File: PreferencesTab.tsx | Path: src/management/components/PreferencesTab.tsx | Hash: 0a6cdeab\n\nimport React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n Box,\n Button,\n Typography,\n Switch,\n FormControlLabel,\n Paper,\n Chip,\n TextField,\n InputAdornment,\n Alert,\n IconButton,\n Tooltip,\n useMediaQuery,\n useTheme,\n} from \"@mui/material\";\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport LinkIcon from '@mui/icons-material/Link';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport UploadIcon from '@mui/icons-material/Upload';\nimport RestoreIcon from '@mui/icons-material/Restore';\nimport CloudDoneIcon from '@mui/icons-material/CloudDone';\nimport CloudOffIcon from '@mui/icons-material/CloudOff';\nimport SyncIcon from '@mui/icons-material/Sync';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport { UserPreferences, usePreferencesStore } from \"../../store/preferencesStore\";\nimport { useModelStore } from \"../../store/modelStore\";\nimport { useVoiceStore } from \"../../store/voiceStore\";\nimport { useFeatures } from \"../../hooks/useFeatures\";\nimport { PackageSettings } from \"../../store/packageSettingsStore\";\nimport { useConversationSyncStore } from \"../../store/conversationSyncStore\";\nimport { useGatewayHealth } from \"../../hooks/useGatewayQueries\";\n\ninterface PreferencesTabProps {\n preferences: UserPreferences;\n packageSettings: PackageSettings | null;\n updatePreference: <K extends keyof UserPreferences>(key: K, value: UserPreferences[K]) => void;\n handleSavePreferences: () => void;\n showSnackbar?: (message: string, severity: 'success' | 'error') => void;\n}\n\nconst PreferencesTab: React.FC<PreferencesTabProps> = ({\n preferences,\n packageSettings,\n updatePreference,\n handleSavePreferences,\n showSnackbar,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const [homeUrlStatus, setHomeUrlStatus] = useState<'idle' | 'valid' | 'invalid' | 'saving' | 'saved'>('idle');\n const [homeUrlError, setHomeUrlError] = useState<string>('');\n const [localHomeUrl, setLocalHomeUrl] = useState(preferences.homeUrl || '');\n const [importStatus, setImportStatus] = useState<'idle' | 'success' | 'error'>('idle');\n const [syncToggleLoading, setSyncToggleLoading] = useState(false);\n const [manualSyncLoading, setManualSyncLoading] = useState(false);\n const [advancedVectorToggleLoading, setAdvancedVectorToggleLoading] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Access the preferences store for export/import/reset functions\n const { exportPreferences, importPreferences, resetToDefaults } = usePreferencesStore();\n\n // Access voice store for TTS/STT service availability\n const { isServiceAvailable: isTTSSTTAvailable } = useVoiceStore();\n\n // Access feature flags for advanced features toggle\n const { hasAdvancedSearch, hasAdvancedMemories } = useFeatures();\n\n const {\n initialized: syncInitialized,\n syncEnabled,\n status: syncStatus,\n lastSyncAt,\n lastError: syncError,\n conflicts,\n pendingConversationUpserts,\n pendingConversationDeletes,\n pendingProjectUpserts,\n pendingProjectDeletes,\n totalConversationsOnServer,\n totalProjectsOnServer,\n warningConversations,\n oversizedConversations,\n setSyncEnabled,\n isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled,\n runSync,\n } = useConversationSyncStore((state) => ({\n initialized: state.initialized,\n syncEnabled: state.syncEnabled,\n status: state.status,\n lastSyncAt: state.lastSyncAt,\n lastError: state.lastError,\n conflicts: state.conflicts,\n pendingConversationUpserts: state.pendingConversationUpserts,\n pendingConversationDeletes: state.pendingConversationDeletes,\n pendingProjectUpserts: state.pendingProjectUpserts,\n pendingProjectDeletes: state.pendingProjectDeletes,\n totalConversationsOnServer: state.totalConversationsOnServer,\n totalProjectsOnServer: state.totalProjectsOnServer,\n warningConversations: state.warningConversations,\n oversizedConversations: state.oversizedConversations,\n setSyncEnabled: state.setSyncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n setAdvancedVectorFeaturesEnabled: state.setAdvancedVectorFeaturesEnabled,\n runSync: state.runSync,\n }));\n\n const spinSx = {\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n },\n } as const;\n\n const syncStatusLabel = (() => {\n switch (syncStatus) {\n case 'syncing':\n return 'Syncing';\n case 'error':\n return 'Attention needed';\n case 'idle':\n return 'Up to date';\n case 'disabled':\n default:\n return 'Not syncing';\n }\n })();\n\n const syncIcon = (() => {\n switch (syncStatus) {\n case 'syncing':\n return <SyncIcon color=\"primary\" sx={spinSx} fontSize=\"small\" />;\n case 'idle':\n return <CloudDoneIcon color=\"success\" fontSize=\"small\" />;\n case 'error':\n return <ErrorIcon color=\"error\" fontSize=\"small\" />;\n case 'disabled':\n default:\n return <CloudOffIcon color=\"action\" fontSize=\"small\" />;\n }\n })();\n\n const pendingCount =\n pendingConversationUpserts.size +\n pendingConversationDeletes.size +\n pendingProjectUpserts.size +\n pendingProjectDeletes.size;\n\n const conflictCount =\n (conflicts?.conversationConflicts.length ?? 0) +\n (conflicts?.projectConflicts.length ?? 0);\n\n const lastSyncDisplay = lastSyncAt ? new Date(lastSyncAt).toLocaleString() : 'Never';\n\n const MAX_CONVERSATION_MB = 12;\n const WARN_CONVERSATION_MB = 10;\n const formatBytesToMB = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n const renderNoticeList = (notices: typeof warningConversations) => (\n <Box component=\"ul\" sx={{ pl: 2, mb: 0 }}>\n {notices.map((notice) => (\n <Box component=\"li\" key={notice.id} sx={{ mb: 0.5 }}>\n <Typography component=\"span\" variant=\"body2\" color=\"text.primary\">\n {(notice.name && notice.name.trim()) || 'Untitled conversation'}\n </Typography>\n <Typography component=\"span\" variant=\"body2\" color=\"text.secondary\">\n {` — ${formatBytesToMB(notice.sizeBytes)} / ${MAX_CONVERSATION_MB} MB`}\n </Typography>\n </Box>\n ))}\n </Box>\n );\n\n const gatewayConfigured = Boolean(packageSettings?.gatewayApiUrl);\n\n const {\n data: gatewayHealth,\n error: gatewayHealthError,\n isLoading: gatewayHealthLoading,\n isFetching: gatewayHealthFetching,\n refetch: refetchGatewayHealth,\n } = useGatewayHealth({\n enabled: gatewayConfigured,\n refetchOnWindowFocus: false,\n staleTime: 60_000,\n });\n\n const isGatewayLoading = gatewayHealthLoading || gatewayHealthFetching;\n\n const gatewayChipLabel = gatewayConfigured\n ? isGatewayLoading\n ? 'Checking…'\n : gatewayHealthError\n ? 'Offline'\n : gatewayHealth\n ? (gatewayHealth.status?.toLowerCase() === 'healthy')\n ? 'Online'\n : 'Offline'\n : 'Unknown'\n : 'Not Configured';\n\n const gatewayChipColor: 'default' | 'error' | 'success' | 'warning' = (() => {\n if (!gatewayConfigured) return 'default';\n if (gatewayHealthError) return 'error';\n if (isGatewayLoading) return 'default';\n if (!gatewayHealth) return 'warning';\n return (gatewayHealth.status?.toLowerCase() === 'healthy') ? 'success' : 'error';\n })();\n\n const handleGatewayStatusRefresh = useCallback(() => {\n if (!gatewayConfigured) {\n return;\n }\n refetchGatewayHealth();\n }, [gatewayConfigured, refetchGatewayHealth]);\n\n const handleSyncToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setSyncToggleLoading(true);\n try {\n await setSyncEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled ? 'Cloud sync enabled. We will keep this device in parity with Bandit Cloud.' : 'Cloud sync disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update sync preference.', 'error');\n }\n } finally {\n setSyncToggleLoading(false);\n }\n };\n\n const handleManualSync = async () => {\n setManualSyncLoading(true);\n await runSync({ force: true });\n const statusAfter = useConversationSyncStore.getState().status;\n const message = statusAfter === 'idle'\n ? 'Sync completed successfully.'\n : 'Sync did not complete. Check status details.';\n const severity = statusAfter === 'idle' ? 'success' : 'error';\n if (showSnackbar) {\n showSnackbar(message, severity);\n }\n setManualSyncLoading(false);\n };\n\n const handleAdvancedVectorToggleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const enabled = event.target.checked;\n setAdvancedVectorToggleLoading(true);\n try {\n await setAdvancedVectorFeaturesEnabled(enabled);\n if (showSnackbar) {\n showSnackbar(\n enabled\n ? 'Advanced vector features enabled for this account.'\n : 'Advanced vector features disabled.',\n 'success'\n );\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar('Failed to update advanced vector setting.', 'error');\n }\n } finally {\n setAdvancedVectorToggleLoading(false);\n }\n };\n\n // URL validation regex - more comprehensive\n const urlRegex = /^https?:\\/\\/(?:[-\\w.])+(?:\\:[0-9]+)?(?:\\/(?:[\\w\\/_.])*(?:\\?(?:[\\w&=%.]*))?(?:\\#(?:\\w*))?)?$/;\n\n // Get effective home URL (user preference overrides package setting)\n const getEffectiveHomeUrl = () => {\n if (preferences.homeUrl && preferences.homeUrl.trim()) {\n return preferences.homeUrl;\n }\n return packageSettings?.homeUrl || '';\n };\n\n // Sync local state with preferences when they change externally\n useEffect(() => {\n setLocalHomeUrl(preferences.homeUrl || '');\n }, [preferences.homeUrl]);\n\n const validateAndSaveHomeUrl = async (url: string) => {\n if (!url.trim()) {\n // Empty URL is valid (will use default)\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', '');\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n return;\n }\n\n if (urlRegex.test(url)) {\n setHomeUrlStatus('valid');\n setHomeUrlError('');\n updatePreference('homeUrl', url);\n setHomeUrlStatus('saving');\n try {\n await handleSavePreferences();\n setHomeUrlStatus('saved');\n setTimeout(() => setHomeUrlStatus('idle'), 2000);\n } catch (error) {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Failed to save. Please try again.');\n }\n } else {\n setHomeUrlStatus('invalid');\n setHomeUrlError('Please enter a valid URL (e.g., https://example.com)');\n }\n };\n\n const handleHomeUrlChange = (value: string) => {\n setLocalHomeUrl(value);\n setHomeUrlStatus('idle'); // Reset status while typing\n \n // Clear existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n // Set new timeout for validation and auto-save\n timeoutRef.current = setTimeout(() => {\n validateAndSaveHomeUrl(value);\n }, 1500); // Increased to 1.5 seconds for better UX\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n // Export/Import/Reset functions\n const handleExportPreferences = () => {\n const jsonData = exportPreferences();\n const blob = new Blob([jsonData], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `bandit-preferences-${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n const handleImportPreferences = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const success = await importPreferences(text);\n \n if (success) {\n setImportStatus('success');\n // Refresh the local state\n setLocalHomeUrl(preferences.homeUrl || '');\n setTimeout(() => setImportStatus('idle'), 3000);\n } else {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n } catch (error) {\n setImportStatus('error');\n setTimeout(() => setImportStatus('idle'), 3000);\n }\n\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleResetToDefaults = async () => {\n if (confirm('Are you sure you want to reset all preferences to their default values? This action cannot be undone.')) {\n await resetToDefaults();\n setLocalHomeUrl('');\n setHomeUrlStatus('idle');\n }\n };\n\n const getHomeUrlFieldProps = () => {\n const baseProps = {\n size: \"small\" as const,\n variant: \"outlined\" as const,\n fullWidth: true,\n };\n\n const getHelperText = () => {\n if (homeUrlStatus === 'saving') return \"Saving...\";\n if (homeUrlStatus === 'invalid') return homeUrlError;\n if (homeUrlStatus === 'valid') return \"Valid URL format\";\n \n // Default helper text based on current state\n if (localHomeUrl) {\n return `Will navigate to: ${localHomeUrl}`;\n } else if (packageSettings?.homeUrl) {\n return `Will use package default: ${packageSettings.homeUrl}`;\n } else {\n return \"Enter a URL for the home button\";\n }\n };\n\n switch (homeUrlStatus) {\n case 'valid':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: getHelperText(),\n };\n case 'invalid':\n return {\n ...baseProps,\n color: \"error\" as const,\n error: true,\n helperText: getHelperText(),\n };\n case 'saving':\n return {\n ...baseProps,\n color: \"primary\" as const,\n helperText: getHelperText(),\n disabled: true,\n };\n case 'saved':\n return {\n ...baseProps,\n color: \"success\" as const,\n helperText: \"✓ Saved successfully\",\n };\n default:\n return {\n ...baseProps,\n helperText: getHelperText(),\n };\n }\n };\n\n const getEndAdornment = () => {\n switch (homeUrlStatus) {\n case 'valid':\n case 'saved':\n return (\n <InputAdornment position=\"end\">\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'invalid':\n return (\n <InputAdornment position=\"end\">\n <ErrorIcon color=\"error\" fontSize=\"small\" />\n </InputAdornment>\n );\n case 'saving':\n return (\n <InputAdornment position=\"end\">\n <Box sx={{ \n width: 16, \n height: 16, \n border: '2px solid #1976d2',\n borderTop: '2px solid transparent',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n '@keyframes spin': {\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' }\n }\n }} />\n </InputAdornment>\n );\n default:\n return (\n <InputAdornment position=\"end\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n );\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n Preferences\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Control which AI features are enabled to optimize performance for your device. Disabling features can help\n reduce resource usage on machines with limited capabilities.\n </Typography>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, justifyContent: 'space-between', gap: 2 }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Conversation & Project Sync</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Mirror conversations and projects to Bandit Cloud so you can resume work on any device. Images stay on this\n machine until a dedicated media pipeline is ready.\n </Typography>\n </Box>\n <FormControlLabel\n control={\n <Switch\n checked={syncEnabled}\n onChange={handleSyncToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || syncToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {syncEnabled ? 'Sync enabled' : 'Sync disabled'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {syncInitialized ? 'Toggle at any time from the management panel.' : 'Loading preference…'}\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' }, ml: { xs: 0, sm: 2 } }}\n />\n </Box>\n\n <Box sx={{ mt: 2, display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, alignItems: { sm: 'center' }, gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {syncIcon}\n <Typography variant=\"body2\" color=\"text.primary\">{syncStatusLabel}</Typography>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Last sync: {lastSyncDisplay}\n </Typography>\n {syncEnabled && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Server totals: {totalConversationsOnServer ?? 0} conversations · {totalProjectsOnServer ?? 0} projects\n </Typography>\n )}\n {pendingCount > 0 && (\n <Chip\n label={`${pendingCount} change${pendingCount === 1 ? '' : 's'} pending upload`}\n color=\"warning\"\n size=\"small\"\n />\n )}\n {conflictCount > 0 && (\n <Chip\n label={`${conflictCount} conflict${conflictCount === 1 ? '' : 's'} to review`}\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {(hasAdvancedSearch() || hasAdvancedMemories()) && (\n <Box sx={{ mt: 2 }}>\n <FormControlLabel\n control={\n <Switch\n checked={isAdvancedVectorFeaturesEnabled}\n onChange={handleAdvancedVectorToggleChange}\n color=\"primary\"\n disabled={!syncInitialized || advancedVectorToggleLoading}\n />\n }\n label={\n <Box textAlign=\"left\">\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Advanced vector features\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Keep semantic search, vector memories, and related context in sync across devices\n </Typography>\n </Box>\n }\n sx={{ alignSelf: { xs: 'flex-start', sm: 'center' } }}\n />\n </Box>\n )}\n\n {syncError && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n {syncError}\n </Alert>\n )}\n\n {oversizedConversations.length > 0 && (\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n Start a new conversation to keep syncing with Bandit Cloud.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n These threads exceeded the {MAX_CONVERSATION_MB} MB limit and are skipped until they are shortened:\n </Typography>\n {renderNoticeList(oversizedConversations)}\n </Alert>\n )}\n\n {warningConversations.length > 0 && oversizedConversations.length === 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n You are nearing the Bandit Cloud size limit.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Consider starting a fresh conversation once these reach about {WARN_CONVERSATION_MB} MB:\n </Typography>\n {renderNoticeList(warningConversations)}\n </Alert>\n )}\n\n <Box sx={{ mt: 2, display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleManualSync}\n disabled={!syncEnabled || syncStatus === 'syncing' || manualSyncLoading}\n startIcon={syncStatus === 'syncing' || manualSyncLoading ? <SyncIcon sx={spinSx} /> : <CloudDoneIcon />}\n >\n {syncStatus === 'syncing' || manualSyncLoading ? 'Syncing…' : 'Sync now'}\n </Button>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center' }}>\n Need media support? Images and large files stay local until retention rules are finalized.\n </Typography>\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Feature Controls</Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\", display: 'flex', alignItems: 'center', gap: 1 }}>\n <LinkIcon fontSize=\"small\" color=\"primary\" />\n Home Button URL\n </Typography>\n <TextField\n label=\"Custom Home URL (optional)\"\n value={localHomeUrl}\n onChange={(e) => handleHomeUrlChange(e.target.value)}\n placeholder=\"https://example.com\"\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <LinkIcon color=\"action\" fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: getEndAdornment(),\n }}\n {...getHomeUrlFieldProps()}\n />\n </Box>\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.memoryEnabled}\n onChange={(e) => updatePreference('memoryEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Memory</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Enable automatic conversation memory and context retention\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.knowledgeDocsEnabled}\n onChange={(e) => updatePreference('knowledgeDocsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Knowledge Documents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Use uploaded documents to enhance AI responses\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.moodEnabled}\n onChange={(e) => updatePreference('moodEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Mood Adaptation</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Allow AI personality to adapt based on conversation tone\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.chatSuggestionsEnabled}\n onChange={(e) => updatePreference('chatSuggestionsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Chat Suggestions</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show suggested prompts and conversation starters\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.ttsEnabled}\n onChange={(e) => updatePreference('ttsEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable AI voice responses\"\n : packageSettings?.gatewayApiUrl \n ? \"TTS service is currently unavailable\"\n : \"TTS service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.sttEnabled}\n onChange={(e) => updatePreference('sttEnabled', e.target.checked)}\n color=\"primary\"\n disabled={!isTTSSTTAvailable}\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {isTTSSTTAvailable \n ? \"Enable voice input and transcription\"\n : packageSettings?.gatewayApiUrl \n ? \"STT service is currently unavailable\"\n : \"STT service not configured - contact administrator\"\n }\n </Typography>\n </Box>\n }\n />\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.banditModelsEnabled}\n onChange={(e) => updatePreference('banditModelsEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Include Bandit Personalities</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Include default Bandit personalities alongside CDN models\n </Typography>\n </Box>\n }\n />\n\n {preferences.banditModelsEnabled && (\n <Box sx={{ mt: 2, ml: 4 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<RestoreIcon />}\n onClick={async () => {\n try {\n const result = await useModelStore.getState().restoreDeletedBanditModels();\n if (showSnackbar) {\n if (result.hadNothingToRestore) {\n showSnackbar(\"No deleted Bandit personalities found to restore.\", 'success');\n } else if (result.restored.length > 0) {\n showSnackbar(`Restored ${result.restored.length} Bandit personalit${result.restored.length === 1 ? 'y' : 'ies'}: ${result.restored.join(', ')}`, 'success');\n } else {\n showSnackbar(\"Bandit personalities restored from deleted list (enable Bandit personalities to see them).\", 'success');\n }\n }\n } catch (error) {\n if (showSnackbar) {\n showSnackbar(\"Failed to restore Bandit personalities. Please try again.\", 'error');\n }\n }\n }}\n sx={{ textTransform: 'none' }}\n >\n Restore Deleted Bandit Personalities\n </Button>\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n Restores any Bandit default personalities you may have deleted\n </Typography>\n </Box>\n )}\n\n <FormControlLabel\n control={\n <Switch\n checked={preferences.feedbackEnabled}\n onChange={(e) => updatePreference('feedbackEnabled', e.target.checked)}\n color=\"primary\"\n />\n }\n label={\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Feedback Button</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Show feedback button in chat interface and other components\n </Typography>\n </Box>\n }\n />\n </Box>\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Backup & Restore</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Export your preferences to save your settings, or import previously saved preferences. You can also reset to default values.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, gap: 2, alignItems: 'center' }}>\n <Button\n variant=\"outlined\"\n startIcon={<DownloadIcon />}\n onClick={handleExportPreferences}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Export\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<UploadIcon />}\n onClick={handleImportPreferences}\n color={importStatus === 'success' ? 'success' : importStatus === 'error' ? 'error' : 'primary'}\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n {importStatus === 'success' ? '✓ Imported' : importStatus === 'error' ? '✗ Failed' : 'Import'}\n </Button>\n \n <Button\n variant=\"outlined\"\n startIcon={<RestoreIcon />}\n onClick={handleResetToDefaults}\n color=\"warning\"\n sx={{ minWidth: { xs: '100%', sm: '160px' } }}\n >\n Reset\n </Button>\n </Box>\n\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileChange}\n accept=\".json\"\n style={{ display: 'none' }}\n />\n </Paper>\n\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 } }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>Service Status</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n The following services are configured for this deployment. Contact your administrator for more information about enabling or configuring these services.\n </Typography>\n \n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Text-to-Speech (TTS)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Speech-to-Text (STT)</Typography>\n <Chip\n label={isTTSSTTAvailable ? \"Available\" : packageSettings?.gatewayApiUrl ? \"Unavailable\" : \"Not Configured\"}\n color={isTTSSTTAvailable ? \"success\" : packageSettings?.gatewayApiUrl ? \"warning\" : \"default\"}\n size=\"small\"\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 600, color: \"text.primary\" }}>Gateway/MCP</Typography>\n {gatewayConfigured && (\n <Tooltip title=\"Refresh gateway status\" placement=\"top\">\n <span>\n <IconButton\n size=\"small\"\n onClick={handleGatewayStatusRefresh}\n disabled={isGatewayLoading}\n sx={{ p: 0.25 }}\n >\n <RefreshIcon fontSize=\"small\" sx={isGatewayLoading ? spinSx : undefined} />\n </IconButton>\n </span>\n </Tooltip>\n )}\n </Box>\n <Chip\n label={gatewayChipLabel}\n color={gatewayChipColor}\n size=\"small\"\n />\n </Box>\n\n {gatewayConfigured && gatewayHealthError && (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75, pl: { xs: 0, sm: 0.5 } }}>\n <Typography variant=\"caption\" color=\"error\">\n {gatewayHealthError.message}\n </Typography>\n </Box>\n )}\n </Box>\n </Paper>\n </Box>\n </Box>\n );\n};\n\nexport default PreferencesTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3096-F9AF1C\nconst __banditFingerprint_hooks_useGatewayQueriests = 'BL-FP-52A0D3-0867';\nconst __auditTrail_hooks_useGatewayQueriests = 'BL-AU-MGOIKVVE-4U8X';\n// File: useGatewayQueries.ts | Path: src/hooks/useGatewayQueries.ts | Hash: 30960867\n\nimport { useMemo } from \"react\";\nimport { lastValueFrom } from \"rxjs\";\nimport { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { usePackageSettingsStore } from \"../store/packageSettingsStore\";\nimport { GatewayService } from \"../services/gateway/gateway.service\";\nimport { authenticationService } from \"../services/auth/authenticationService\";\nimport {\n GatewayHealthResponse,\n GatewayMemoryResponse,\n GatewayModel\n} from \"../services/gateway/interfaces\";\n\nexport type GatewayQueryOptions<TData> = Omit<UseQueryOptions<TData, Error>, \"queryKey\" | \"queryFn\">;\n\nconst useGatewayClient = () => {\n const settings = usePackageSettingsStore((state) => state.settings);\n const gatewayUrl = settings?.gatewayApiUrl;\n const feedbackEmail = settings?.feedbackEmail;\n\n const service = useMemo<GatewayService | null>(() => {\n if (!gatewayUrl) {\n return null;\n }\n\n return new GatewayService(\n gatewayUrl,\n () => authenticationService.getToken(),\n feedbackEmail\n );\n }, [gatewayUrl, feedbackEmail]);\n\n return { service, gatewayUrl };\n};\n\nexport const useGatewayHealth = (\n options?: GatewayQueryOptions<GatewayHealthResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayHealthResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"health\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getHealth());\n },\n enabled\n });\n};\n\nexport const useGatewayModels = (\n options?: GatewayQueryOptions<GatewayModel[]>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayModel[], Error>({\n ...options,\n queryKey: [\"gateway\", \"models\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.listModels());\n },\n enabled\n });\n};\n\nexport const useGatewayMemory = (\n options?: GatewayQueryOptions<GatewayMemoryResponse>\n) => {\n const { service, gatewayUrl } = useGatewayClient();\n const enabled = Boolean(service && gatewayUrl) && (options?.enabled ?? true);\n\n return useQuery<GatewayMemoryResponse, Error>({\n ...options,\n queryKey: [\"gateway\", \"memory\", gatewayUrl],\n queryFn: async () => {\n if (!service) {\n throw new Error(\"Gateway service is not configured\");\n }\n return lastValueFrom(service.getMemory());\n },\n enabled\n });\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-10D4-7CC05E\nconst __banditFingerprint_components_BrandingTabtsx = 'BL-FP-9A095E-D769';\nconst __auditTrail_components_BrandingTabtsx = 'BL-AU-MGOIKVVH-B385';\n// File: BrandingTab.tsx | Path: src/management/components/BrandingTab.tsx | Hash: 10d4d769\n\nimport React, { useState, useRef } from 'react';\nimport {\n Box,\n Typography,\n Button,\n TextField,\n Card,\n CardContent,\n Paper,\n Chip,\n Alert,\n Fade,\n Skeleton,\n Stack,\n Snackbar,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport UploadIcon from '@mui/icons-material/Upload';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport PreviewIcon from '@mui/icons-material/Preview';\nimport RestoreIcon from '@mui/icons-material/Restore';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\nimport SaveIcon from '@mui/icons-material/Save';\nimport LogoCropper from '../../components/LogoCropper';\n\n// Default logos from CDN\nconst banditAiLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple.png\";\nconst lightLogo = \"https://cdn.burtson.ai/logos/bandit-ai-logo-simple-alt.png\";\n\ninterface BrandingTabProps {\n logoFile: File | null;\n logoBase64: string | null;\n brandingText: string;\n setBrandingText: (text: string) => void;\n theme: string;\n setTheme: (theme: string) => void;\n predefinedThemes: Record<string, ThemeOptions & { name: string }>;\n handleLogoUpload: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleRestoreDefaults: () => void;\n handleExportConfig: () => void;\n handleImportConfig: (event: React.ChangeEvent<HTMLInputElement>) => void;\n handleSaveBranding: () => void;\n setLogoFile?: (file: File | null) => void;\n setLogoBase64?: (base64: string | null) => void;\n}\n\nconst BrandingTab: React.FC<BrandingTabProps> = ({\n logoFile,\n logoBase64,\n brandingText,\n setBrandingText,\n theme,\n setTheme,\n predefinedThemes,\n handleLogoUpload,\n handleRestoreDefaults,\n handleExportConfig,\n handleImportConfig,\n handleSaveBranding,\n setLogoFile,\n setLogoBase64,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n const [dragOver, setDragOver] = useState(false);\n const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle');\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n const [cropperOpen, setCropperOpen] = useState(false);\n const [selectedImageFile, setSelectedImageFile] = useState<File | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const importInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to get the appropriate default logo based on theme mode\n const getDefaultLogo = () => {\n // Use Material-UI theme mode for better accuracy\n return muiTheme.palette.mode === 'light' ? lightLogo : banditAiLogo;\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n const files = e.dataTransfer.files;\n if (files.length > 0 && (files[0].type === 'image/png' || files[0].type === 'image/jpeg' || files[0].type === 'image/jpg')) {\n handleImageUpload(files[0]);\n }\n };\n\n const handleImageUpload = (file: File) => {\n // Validate file type\n if (!file.type.match(/^image\\/(jpeg|jpg|png)$/)) {\n setSnackbarMessage('Please select a JPG or PNG image file.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n // Validate file size (max 10MB)\n if (file.size > 10 * 1024 * 1024) {\n setSnackbarMessage('Image file size must be less than 10MB.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n return;\n }\n\n setSelectedImageFile(file);\n setCropperOpen(true);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n handleImageUpload(file);\n }\n };\n\n const handleCropComplete = (croppedImageData: string) => {\n // Create a fake event to work with existing handleLogoUpload\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n\n // Set the base64 directly if we have setters\n if (setLogoBase64 && setLogoFile) {\n setLogoBase64(croppedImageData);\n setLogoFile(null);\n } else {\n // Fallback to existing handler\n handleLogoUpload(fakeEvent);\n }\n\n setCropperOpen(false);\n setSelectedImageFile(null);\n\n setSnackbarMessage('Logo cropped and applied successfully!');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleCropperClose = () => {\n setCropperOpen(false);\n setSelectedImageFile(null);\n };\n\n const handleSaveWithFeedback = async () => {\n setSaveStatus('saving');\n try {\n await handleSaveBranding();\n setSaveStatus('saved');\n setTimeout(() => setSaveStatus('idle'), 2000);\n } catch (error) {\n setSaveStatus('error');\n setTimeout(() => setSaveStatus('idle'), 3000);\n }\n };\n\n const handleExportWithFeedback = async () => {\n try {\n await handleExportConfig();\n setSnackbarMessage('Branding configuration exported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to export branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleImportWithFeedback = async (event: React.ChangeEvent<HTMLInputElement>) => {\n try {\n await handleImportConfig(event);\n setSnackbarMessage('Branding configuration imported successfully');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to import branding configuration');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleResetWithFeedback = async () => {\n try {\n await handleRestoreDefaults();\n setSnackbarMessage('Branding settings reset to defaults');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } catch (error) {\n setSnackbarMessage('Failed to reset branding settings');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDeleteLogo = () => {\n // Reset the file input value\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n\n // Use direct state setters if available, otherwise try the upload handler\n if (setLogoFile && setLogoBase64) {\n setLogoFile(null);\n setLogoBase64(null);\n } else {\n // Fallback to the upload handler approach\n const fakeEvent = {\n target: {\n files: null,\n value: ''\n }\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleLogoUpload(fakeEvent);\n }\n };\n\n return (\n <Box sx={{ height: \"100%\", display: 'flex', flexDirection: 'column', p: { xs: 1.5, sm: 2 } }}>\n {/* Header Section */}\n <Box sx={{ mb: { xs: 2, md: 3 }, flex: '0 0 auto', display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, color: \"primary.main\", fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Branding & Themes\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\", fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Customize your brand identity and visual appearance.\n </Typography>\n\n <Alert severity=\"info\" sx={{ borderRadius: 2, px: { xs: 1.5, sm: 2 }, py: { xs: 1.25, sm: 1.5 } }}>\n <Typography variant=\"body2\" sx={{ fontSize: { xs: '0.82rem', sm: '0.88rem' }, lineHeight: 1.6 }}>\n <strong>Logo requirements:</strong> JPG or PNG up to 10MB. Uploads open a built-in cropper to help you\n finalize the perfect size. Leave any fields blank to fall back to Bandit defaults.\n </Typography>\n </Alert>\n </Box>\n\n {/* Main Content Section */}\n <Paper\n sx={{\n p: { xs: 1.5, sm: 2 },\n borderRadius: 2,\n flex: 1,\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2.5 },\n mb: { xs: 2, md: 3 },\n }}\n >\n {/* Logo Upload and Branding Text Section */}\n <Box\n sx={{\n width: { xs: '100%', md: '26%' },\n display: 'flex',\n flexDirection: 'column',\n height: { xs: 'auto', md: 320 },\n gap: { xs: 2, md: 0 },\n }}\n >\n {/* Logo Upload Section - Fixed height to match preview */}\n <Box sx={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <UploadIcon color=\"primary\" fontSize=\"small\" />\n Logo Upload\n </Typography>\n\n <Box\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n sx={{\n border: '2px dashed',\n borderColor: dragOver ? 'primary.main' : logoBase64 ? 'success.main' : 'info.main',\n borderRadius: 2,\n p: 2,\n textAlign: 'center',\n cursor: 'pointer',\n bgcolor: dragOver ? 'action.hover' : logoBase64 ? 'success.50' : 'info.50',\n transition: 'all 0.3s ease',\n position: 'relative',\n flex: '1 1 auto',\n minHeight: 160,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n '&:hover': {\n borderColor: 'primary.main',\n bgcolor: 'action.hover',\n '& .upload-icon': {\n color: 'primary.main',\n }\n }\n }}\n >\n {logoBase64 || getDefaultLogo() ? (\n <Fade in={true}>\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '140px',\n maxHeight: '140px',\n borderRadius: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n <Typography variant=\"body2\" color={logoBase64 ? \"success.main\" : \"info.main\"} sx={{ fontWeight: 600, fontSize: '0.85rem' }}>\n {logoBase64 ? \"✓ Custom Logo\" : \"Default Logo\"}\n </Typography>\n {!logoBase64 && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.75rem', textAlign: 'center' }}>\n 🎯 Click to upload & crop your logo\n </Typography>\n )}\n </Box>\n </Fade>\n ) : (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>\n <UploadIcon\n className=\"upload-icon\"\n sx={{\n fontSize: 56,\n color: 'text.secondary',\n transition: 'color 0.3s ease'\n }}\n />\n <Typography variant=\"body2\" color=\"text.primary\" sx={{ fontSize: '1rem' }}>\n {dragOver ? 'Drop here' : '🎯 Upload & Crop Logo'}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.82rem', textAlign: 'center' }}>\n JPG/PNG • Drag & drop or tap to upload • Built-in cropper\n </Typography>\n </Box>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/jpg\"\n hidden\n onChange={handleFileInputChange}\n />\n </Box>\n\n {logoBase64 && (\n <Box sx={{ display: 'flex', gap: 1, mt: 1.5 }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<UploadIcon />}\n onClick={() => fileInputRef.current?.click()}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Replace\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleDeleteLogo}\n sx={{ flex: 1, fontSize: '0.8rem', py: 0.75 }}\n >\n Remove\n </Button>\n </Box>\n )}\n </Box>\n {/* Branding Text Section - Fixed at bottom */}\n <Box sx={{ mt: 2, flex: '0 0 auto' }}>\n <TextField\n label=\"Custom Branding Text\"\n variant=\"outlined\"\n value={brandingText}\n onChange={(e) => setBrandingText(e.target.value)}\n fullWidth\n placeholder=\"e.g., Powered by YourCompany\"\n size=\"small\"\n sx={{\n '& .MuiInputBase-root': { fontSize: '0.85rem' },\n '& .MuiFormHelperText-root': { fontSize: '0.7rem' }\n }}\n />\n </Box>\n </Box>\n {/* Live Preview Section */}\n <Box sx={{ flex: 1, width: '100%' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 1, fontSize: '1rem', color: \"text.primary\" }}>\n <PreviewIcon color=\"primary\" fontSize=\"small\" />\n Live Preview\n </Typography>\n {/* New Chat Preview - closer to real chat page */}\n <Box\n sx={{\n height: { xs: 260, md: 320 },\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n bgcolor: 'background.default',\n borderRadius: 2,\n overflow: 'hidden',\n px: 2,\n py: 3,\n }}\n >\n {/* Centered Logo - Top section */}\n <Box sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flex: '1 1 auto',\n minHeight: 0\n }}>\n {logoBase64 || getDefaultLogo() ? (\n <img\n src={logoBase64 || getDefaultLogo()}\n alt=\"Logo Preview\"\n style={{\n maxWidth: '320px',\n height: 'auto',\n imageRendering: 'auto' as const,\n objectFit: 'contain',\n filter: 'contrast(1.1) saturate(1.05)',\n }}\n />\n ) : (\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 0.5\n }}>\n <Skeleton\n variant=\"rectangular\"\n width={160}\n height={40}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)'\n }}\n />\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ fontSize: '0.7rem' }}>\n Logo preview\n </Typography>\n </Box>\n )}\n </Box>\n\n {/* Chat Interface - Bottom section */}\n <Box sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '100%',\n flex: '0 0 auto',\n gap: 1,\n }}>\n {/* Conversation Starters */}\n <Stack direction=\"row\" spacing={1} justifyContent=\"center\" sx={{ flexWrap: 'wrap', gap: 1 }}>\n {[1, 2, 3].map((i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n width={80}\n height={24}\n sx={{\n borderRadius: 2,\n bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.05)'\n }}\n />\n ))}\n </Stack>\n\n {/* Chat Input */}\n <Paper elevation={3} sx={{ px: 2, py: 1.5, borderRadius: 2, width: '100%', maxWidth: 500 }}>\n <Typography variant=\"body1\" sx={{ color: 'text.secondary' }}>\n What's on your mind?\n </Typography>\n </Paper>\n\n {/* Branding Footer */}\n <Typography variant=\"caption\" sx={{ textAlign: 'center', color: 'text.secondary', mt: 1 }}>\n {brandingText ? `${brandingText} • ` : 'Bandit AI • '}may be wrong — double-check important info.\n </Typography>\n </Box>\n </Box>\n </Box>\n </Paper>\n\n {/* Theme Selection - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto', mb: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Theme Selection\n </Typography>\n\n <Box\n sx={{\n display: \"grid\",\n gap: 1.5,\n gridTemplateColumns: {\n xs: \"repeat(4, 1fr)\",\n sm: \"repeat(6, 1fr)\",\n md: \"repeat(8, 1fr)\",\n lg: \"repeat(10, 1fr)\",\n xl: \"repeat(12, 1fr)\",\n },\n }}\n >\n {Object.values(predefinedThemes).map((themeOption) => {\n const isSelected = themeOption.name === theme;\n return (\n <Card\n key={themeOption.name}\n onClick={() => setTheme(themeOption.name)}\n sx={{\n cursor: \"pointer\",\n border: isSelected ? \"2px solid\" : \"1px solid\",\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n borderRadius: 1.5,\n transition: \"all 0.2s ease\",\n position: 'relative',\n overflow: 'visible',\n \"&:hover\": {\n transform: 'scale(1.05)',\n boxShadow: 2,\n borderColor: \"primary.main\",\n },\n }}\n elevation={isSelected ? 2 : 0}\n >\n {isSelected && (\n <Chip\n label=\"Selected\"\n size=\"small\"\n color=\"primary\"\n sx={{\n position: 'absolute',\n top: -6,\n right: -6,\n zIndex: 1,\n fontSize: '0.6rem',\n height: 16,\n }}\n />\n )}\n <CardContent sx={{ p: 1 }}>\n <Box\n sx={{\n height: 40,\n backgroundColor: themeOption.palette?.background?.default,\n borderRadius: 1,\n position: \"relative\",\n border: \"1px solid\",\n borderColor: \"divider\",\n mb: 0.5,\n }}\n >\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n left: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n top: 4,\n right: 4,\n width: 12,\n height: 12,\n backgroundColor: themeOption.palette?.secondary?.main,\n borderRadius: \"50%\",\n }}\n />\n <Box\n sx={{\n position: \"absolute\",\n bottom: 4,\n left: 4,\n right: 4,\n height: 2,\n backgroundColor: themeOption.palette?.primary?.main,\n borderRadius: 1,\n opacity: 0.7,\n }}\n />\n </Box>\n <Typography\n variant=\"caption\"\n sx={{\n textAlign: \"center\",\n color: \"text.primary\",\n fontWeight: 600,\n fontSize: \"0.65rem\",\n display: 'block',\n lineHeight: 1.2,\n }}\n >\n {themeOption.name}\n </Typography>\n </CardContent>\n </Card>\n );\n })}\n </Box>\n </Paper>\n\n {/* Action Buttons - Compact */}\n <Paper sx={{ p: 2, borderRadius: 2, flex: '0 0 auto' }}>\n <Typography variant=\"h6\" sx={{ mb: 1.5, fontWeight: 600, fontSize: '1rem', color: \"text.primary\" }}>\n Actions\n </Typography>\n\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1.5 }}>\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<SaveIcon />}\n onClick={handleSaveWithFeedback}\n disabled={saveStatus === 'saving'}\n color={saveStatus === 'saved' ? 'success' : saveStatus === 'error' ? 'error' : 'primary'}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n {saveStatus === 'saving' ? 'Saving...' :\n saveStatus === 'saved' ? '✓ Saved' :\n saveStatus === 'error' ? '✗ Error' : 'Save'}\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<DownloadIcon />}\n onClick={handleExportWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Export\n </Button>\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n startIcon={<FileUploadIcon />}\n onClick={() => importInputRef.current?.click()}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Import\n </Button>\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\"application/json\"\n hidden\n onChange={handleImportWithFeedback}\n />\n </Box>\n\n <Box sx={{ flexBasis: { xs: 'calc(50% - 6px)', sm: 'calc(25% - 9px)' } }}>\n <Button\n variant=\"outlined\"\n fullWidth\n color=\"warning\"\n startIcon={<RestoreIcon />}\n onClick={handleResetWithFeedback}\n sx={{ height: 36, fontSize: '0.8rem' }}\n >\n Reset\n </Button>\n </Box>\n </Box>\n </Paper>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Logo Cropper Dialog */}\n <LogoCropper\n open={cropperOpen}\n onClose={handleCropperClose}\n onCrop={handleCropComplete}\n imageFile={selectedImageFile}\n />\n </Box>\n );\n};\n\nexport default BrandingTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-FCA3-C93D1A\nconst __banditFingerprint_components_LogoCroppertsx = 'BL-FP-8A6FB7-D540';\nconst __auditTrail_components_LogoCroppertsx = 'BL-AU-MGOIKVV8-FTQA';\n// File: LogoCropper.tsx | Path: src/components/LogoCropper.tsx | Hash: fca3d540\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n Box,\n Typography,\n Slider,\n IconButton,\n Paper,\n Alert,\n ToggleButtonGroup,\n ToggleButton,\n Chip,\n} from '@mui/material';\nimport RotateLeftIcon from '@mui/icons-material/RotateLeft';\nimport RotateRightIcon from '@mui/icons-material/RotateRight';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport Crop169Icon from '@mui/icons-material/Crop169';\nimport CropSquareIcon from '@mui/icons-material/CropSquare';\nimport CropPortraitIcon from '@mui/icons-material/CropPortrait';\n\ninterface LogoCropperProps {\n open: boolean;\n onClose: () => void;\n onCrop: (croppedImageData: string) => void;\n imageFile: File | null;\n}\n\ninterface CropSettings {\n x: number;\n y: number;\n scale: number;\n rotation: number;\n}\n\ntype AspectRatio = 'free' | 'square' | 'landscape' | 'portrait';\n\nconst LOGO_OUTPUT_SIZES = {\n small: 256,\n medium: 512,\n large: 1024,\n} as const;\n\nconst LogoCropper: React.FC<LogoCropperProps> = ({\n open,\n onClose,\n onCrop,\n imageFile,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const previewCanvasRef = useRef<HTMLCanvasElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n const [imageSrc, setImageSrc] = useState<string>('');\n const [cropSettings, setCropSettings] = useState<CropSettings>({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageNaturalSize, setImageNaturalSize] = useState({ width: 0, height: 0 });\n const [aspectRatio, setAspectRatio] = useState<AspectRatio>('square');\n const [cropArea, setCropArea] = useState({ width: 400, height: 400 });\n\n const CANVAS_SIZE = 500; // Fixed canvas size for editing\n const [outputSize, setOutputSize] = useState<keyof typeof LOGO_OUTPUT_SIZES>('large');\n\n // Calculate crop dimensions based on aspect ratio\n const getCropDimensions = useCallback(() => {\n const maxSize = 380; // Leave some padding in the canvas\n switch (aspectRatio) {\n case 'square':\n return { width: maxSize, height: maxSize };\n case 'landscape':\n return { width: maxSize, height: maxSize * 0.6 }; // 16:9-ish\n case 'portrait':\n return { width: maxSize * 0.6, height: maxSize };\n case 'free':\n default:\n return cropArea;\n }\n }, [aspectRatio, cropArea]);\n\n // Load image from file\n useEffect(() => {\n if (imageFile && open) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n setImageSrc(e.target.result as string);\n setImageLoaded(false);\n }\n };\n reader.readAsDataURL(imageFile);\n }\n }, [imageFile, open]);\n\n // Handle image load\n const handleImageLoad = useCallback(() => {\n if (imageRef.current) {\n const { naturalWidth, naturalHeight } = imageRef.current;\n setImageNaturalSize({ width: naturalWidth, height: naturalHeight });\n \n // Calculate initial scale to fit the crop area\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / naturalWidth,\n cropDims.height / naturalHeight\n );\n \n setCropSettings({\n x: 0,\n y: 0,\n scale: Math.max(minScale, 0.3),\n rotation: 0,\n });\n \n setImageLoaded(true);\n }\n }, [getCropDimensions]);\n\n // Update crop area when aspect ratio changes\n useEffect(() => {\n if (imageLoaded) {\n const cropDims = getCropDimensions();\n setCropArea(cropDims);\n \n // Recalculate minimum scale\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n \n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(prev.scale, minScale)\n }));\n }\n }, [aspectRatio, imageLoaded, imageNaturalSize, getCropDimensions]);\n\n const updatePreview = useCallback((cropX: number, cropY: number, cropDims: { width: number; height: number }) => {\n const previewCanvas = previewCanvasRef.current;\n const mainCanvas = canvasRef.current;\n \n if (!previewCanvas || !mainCanvas) return;\n \n const previewCtx = previewCanvas.getContext('2d');\n if (!previewCtx) return;\n\n previewCanvas.width = 120;\n previewCanvas.height = 120;\n\n // Clear preview\n previewCtx.clearRect(0, 0, 120, 120);\n\n // Calculate scale to fit preview\n const scale = Math.min(120 / cropDims.width, 120 / cropDims.height);\n const scaledWidth = cropDims.width * scale;\n const scaledHeight = cropDims.height * scale;\n const offsetX = (120 - scaledWidth) / 2;\n const offsetY = (120 - scaledHeight) / 2;\n\n // Draw scaled crop area\n previewCtx.drawImage(\n mainCanvas,\n cropX, cropY, cropDims.width, cropDims.height,\n offsetX, offsetY, scaledWidth, scaledHeight\n );\n\n // Add border\n previewCtx.strokeStyle = '#1976d2';\n previewCtx.lineWidth = 2;\n previewCtx.strokeRect(offsetX, offsetY, scaledWidth, scaledHeight);\n }, []);\n\n // Draw the crop preview\n const drawCropPreview = useCallback(() => {\n const canvas = canvasRef.current;\n const image = imageRef.current;\n \n if (!canvas || !image || !imageLoaded) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const cropDims = getCropDimensions();\n\n // Set canvas size\n canvas.width = CANVAS_SIZE;\n canvas.height = CANVAS_SIZE;\n\n // Clear canvas with transparent background\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\n\n // Draw background pattern for transparency visibility\n const patternSize = 20;\n ctx.fillStyle = '#f0f0f0';\n for (let x = 0; x < CANVAS_SIZE; x += patternSize) {\n for (let y = 0; y < CANVAS_SIZE; y += patternSize) {\n if ((x / patternSize + y / patternSize) % 2 === 0) {\n ctx.fillRect(x, y, patternSize, patternSize);\n }\n }\n }\n\n // Save context\n ctx.save();\n\n // Create crop rectangle clipping path\n const cropX = (CANVAS_SIZE - cropDims.width) / 2;\n const cropY = (CANVAS_SIZE - cropDims.height) / 2;\n \n ctx.beginPath();\n ctx.rect(cropX, cropY, cropDims.width, cropDims.height);\n ctx.clip();\n\n // Apply transformations\n ctx.translate(CANVAS_SIZE / 2, CANVAS_SIZE / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale, cropSettings.scale);\n ctx.translate(-image.naturalWidth / 2 + cropSettings.x, -image.naturalHeight / 2 + cropSettings.y);\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Draw crop area border\n ctx.strokeStyle = '#1976d2';\n ctx.lineWidth = 3;\n ctx.strokeRect(cropX, cropY, cropDims.width, cropDims.height);\n\n // Draw corner indicators\n const cornerSize = 20;\n ctx.fillStyle = '#1976d2';\n // Top-left\n ctx.fillRect(cropX - 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY - 1, 3, cornerSize);\n // Top-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY - 1, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY - 1, 3, cornerSize);\n // Bottom-left\n ctx.fillRect(cropX - 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n // Bottom-right\n ctx.fillRect(cropX + cropDims.width - cornerSize + 1, cropY + cropDims.height - 2, cornerSize, 3);\n ctx.fillRect(cropX + cropDims.width - 1, cropY + cropDims.height - cornerSize + 1, 3, cornerSize);\n\n // Update preview canvas\n updatePreview(cropX, cropY, cropDims);\n }, [cropSettings, imageLoaded, getCropDimensions, updatePreview]);\n\n // Update preview when settings change\n useEffect(() => {\n drawCropPreview();\n }, [drawCropPreview]);\n\n // Mouse/touch handlers for dragging\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n setIsDragging(true);\n setDragStart({ x: e.clientX, y: e.clientY });\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStart.x;\n const deltaY = e.clientY - dragStart.y;\n\n setCropSettings(prev => ({\n ...prev,\n x: prev.x + deltaX / prev.scale,\n y: prev.y + deltaY / prev.scale,\n }));\n\n setDragStart({ x: e.clientX, y: e.clientY });\n }, [isDragging, dragStart]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleClose = useCallback(() => {\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [onClose]);\n\n // Handle crop and output\n const handleCrop = useCallback(() => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = imageRef.current;\n\n if (!ctx || !image) return;\n\n const cropDims = getCropDimensions();\n const finalSize = LOGO_OUTPUT_SIZES[outputSize];\n \n // Set output canvas size maintaining aspect ratio\n const aspectRatioValue = cropDims.width / cropDims.height;\n let outputWidth = finalSize;\n let outputHeight = finalSize;\n \n if (aspectRatio !== 'square') {\n if (aspectRatioValue > 1) {\n // Landscape\n outputHeight = finalSize / aspectRatioValue;\n } else {\n // Portrait\n outputWidth = finalSize * aspectRatioValue;\n }\n }\n\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n\n // Save context\n ctx.save();\n\n // Apply transformations (scaled for output size)\n const scaleX = outputWidth / cropDims.width;\n const scaleY = outputHeight / cropDims.height;\n \n ctx.translate(outputWidth / 2, outputHeight / 2);\n ctx.rotate((cropSettings.rotation * Math.PI) / 180);\n ctx.scale(cropSettings.scale * scaleX, cropSettings.scale * scaleY);\n ctx.translate(\n -image.naturalWidth / 2 + cropSettings.x * scaleX,\n -image.naturalHeight / 2 + cropSettings.y * scaleY\n );\n\n // Draw image\n ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\n\n // Restore context\n ctx.restore();\n\n // Export as PNG to preserve transparency\n const croppedDataUrl = canvas.toDataURL('image/png', 1.0);\n onCrop(croppedDataUrl);\n \n // Reset state and close\n setImageSrc('');\n setImageLoaded(false);\n setCropSettings({ x: 0, y: 0, scale: 1, rotation: 0 });\n setAspectRatio('square');\n onClose();\n }, [cropSettings, onCrop, getCropDimensions, outputSize, aspectRatio, onClose]);\n\n const handleScaleChange = useCallback((value: number) => {\n const cropDims = getCropDimensions();\n const minScale = Math.max(\n cropDims.width / imageNaturalSize.width,\n cropDims.height / imageNaturalSize.height\n );\n setCropSettings(prev => ({\n ...prev,\n scale: Math.max(value, minScale),\n }));\n }, [imageNaturalSize, getCropDimensions]);\n\n const handleRotation = useCallback((direction: 'left' | 'right') => {\n setCropSettings(prev => ({\n ...prev,\n rotation: prev.rotation + (direction === 'left' ? -90 : 90),\n }));\n }, []);\n\n const minScale = Math.max(\n getCropDimensions().width / Math.max(imageNaturalSize.width, 1),\n getCropDimensions().height / Math.max(imageNaturalSize.height, 1)\n );\n\n return (\n <Dialog \n open={open} \n onClose={handleClose} \n maxWidth=\"lg\" \n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n 🎨 Crop Your Logo\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Position, resize, and format your logo for perfect branding\n </Typography>\n </DialogTitle>\n\n <DialogContent>\n {imageSrc && (\n <>\n {/* Hidden image for loading */}\n <img\n ref={imageRef}\n src={imageSrc}\n alt=\"Crop source\"\n style={{ display: 'none' }}\n onLoad={handleImageLoad}\n />\n\n {imageLoaded ? (\n <Box sx={{ display: 'flex', gap: 3 }}>\n {/* Main Crop Area */}\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>\n <Paper\n elevation={3}\n sx={{\n width: CANVAS_SIZE,\n height: CANVAS_SIZE,\n overflow: 'hidden',\n border: '2px solid',\n borderColor: 'divider',\n borderRadius: 2,\n cursor: isDragging ? 'grabbing' : 'grab',\n position: 'relative',\n background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 20px 20px',\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <canvas\n ref={canvasRef}\n width={CANVAS_SIZE}\n height={CANVAS_SIZE}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n }}\n />\n \n {/* Overlay hint */}\n {!isDragging && (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n left: 8,\n background: 'rgba(0,0,0,0.8)',\n color: 'white',\n px: 2,\n py: 0.5,\n borderRadius: 2,\n fontSize: '0.75rem',\n fontWeight: 500,\n pointerEvents: 'none',\n opacity: 0.9,\n }}\n >\n Drag to reposition • Blue area will be exported\n </Box>\n )}\n </Paper>\n </Box>\n\n {/* Controls Panel */}\n <Box sx={{ width: 300, display: 'flex', flexDirection: 'column', gap: 3 }}>\n {/* Preview */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📋 Preview ({LOGO_OUTPUT_SIZES[outputSize]}px)\n </Typography>\n <Paper elevation={2} sx={{ p: 1, borderRadius: 2, background: 'repeating-conic-gradient(#f0f0f0 0% 25%, transparent 0% 50%) 50% / 10px 10px' }}>\n <canvas\n ref={previewCanvasRef}\n width={120}\n height={120}\n style={{\n width: '120px',\n height: '120px',\n display: 'block',\n borderRadius: '4px',\n }}\n />\n </Paper>\n </Box>\n\n {/* Aspect Ratio */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📐 Aspect Ratio\n </Typography>\n <ToggleButtonGroup\n value={aspectRatio}\n exclusive\n onChange={(_, newRatio) => newRatio && setAspectRatio(newRatio)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"square\">\n <CropSquareIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Square</Typography>\n </ToggleButton>\n <ToggleButton value=\"landscape\">\n <Crop169Icon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Wide</Typography>\n </ToggleButton>\n <ToggleButton value=\"portrait\">\n <CropPortraitIcon fontSize=\"small\" />\n <Typography variant=\"caption\" sx={{ ml: 0.5 }}>Tall</Typography>\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Output Size */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 📏 Output Size\n </Typography>\n <ToggleButtonGroup\n value={outputSize}\n exclusive\n onChange={(_, newSize) => newSize && setOutputSize(newSize)}\n size=\"small\"\n fullWidth\n >\n <ToggleButton value=\"small\">256px</ToggleButton>\n <ToggleButton value=\"medium\">512px</ToggleButton>\n <ToggleButton value=\"large\">1024px</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {/* Zoom Control */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔍 Zoom: {Math.round(cropSettings.scale * 100)}%\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale - 0.1)}\n disabled={cropSettings.scale <= minScale}\n size=\"small\"\n >\n <ZoomOutIcon />\n </IconButton>\n <Slider\n value={cropSettings.scale}\n onChange={(_, value) => handleScaleChange(value as number)}\n min={minScale}\n max={4}\n step={0.1}\n sx={{ flex: 1 }}\n />\n <IconButton\n onClick={() => handleScaleChange(cropSettings.scale + 0.1)}\n disabled={cropSettings.scale >= 4}\n size=\"small\"\n >\n <ZoomInIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Rotation Controls */}\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1, fontWeight: 600 }}>\n 🔄 Rotation\n </Typography>\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n variant=\"outlined\"\n startIcon={<RotateLeftIcon />}\n onClick={() => handleRotation('left')}\n size=\"small\"\n fullWidth\n >\n Rotate Left\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RotateRightIcon />}\n onClick={() => handleRotation('right')}\n size=\"small\"\n fullWidth\n >\n Rotate Right\n </Button>\n </Box>\n {cropSettings.rotation !== 0 && (\n <Chip \n label={`${cropSettings.rotation}°`} \n size=\"small\" \n color=\"primary\" \n sx={{ mt: 1 }}\n />\n )}\n </Box>\n\n <Alert severity=\"success\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"body2\">\n <strong>✨ Logo Features:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 0.5, fontSize: '0.8rem' }}>\n • <strong>Transparency preserved</strong> for clean logos<br/>\n • <strong>High quality PNG</strong> output<br/>\n • <strong>Multiple sizes</strong> for different uses<br/>\n • <strong>Perfect for branding</strong> across platforms\n </Typography>\n </Alert>\n </Box>\n </Box>\n ) : (\n <Box sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>\n <Typography>Loading image...</Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button onClick={handleClose} color=\"secondary\">\n Cancel\n </Button>\n <Button\n onClick={handleCrop}\n variant=\"contained\"\n disabled={!imageLoaded}\n sx={{\n px: 3,\n fontWeight: 600,\n }}\n >\n ✂️ Crop Logo\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default LogoCropper;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-70C7-7E0961\nconst __banditFingerprint_components_KnowledgeTabtsx = 'BL-FP-17186C-247F';\nconst __auditTrail_components_KnowledgeTabtsx = 'BL-AU-MGOIKVVI-8Q43';\n// File: KnowledgeTab.tsx | Path: src/management/components/KnowledgeTab.tsx | Hash: 70c7247f\n\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Box,\n Typography,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n TextField,\n InputAdornment,\n Chip,\n LinearProgress,\n Card,\n CardContent,\n IconButton,\n Alert,\n Stack,\n MenuItem,\n Snackbar,\n Switch,\n useMediaQuery,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ViewModuleIcon from '@mui/icons-material/ViewModule';\nimport ViewListIcon from '@mui/icons-material/ViewList';\nimport UploadFileIcon from '@mui/icons-material/UploadFile';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport FolderIcon from '@mui/icons-material/Folder';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';\nimport CodeIcon from '@mui/icons-material/Code';\nimport DataObjectIcon from '@mui/icons-material/DataObject';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CheckIcon from '@mui/icons-material/Check';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport LockIcon from '@mui/icons-material/Lock';\nimport PublicIcon from '@mui/icons-material/Public';\nimport { KnowledgeDoc } from '../../chat/hooks/useKnowledgeStore';\nimport KnowledgeFileModal from '../../modals/knowlege/knowledge-file-modal';\nimport DocumentCard from '../../shared/DocumentCard';\nimport { useVectorStore } from '../../hooks/useVectorStore';\nimport { useAuthenticationStore } from '../../store/authenticationStore';\nimport { useFeatures } from '../../hooks/useFeatures';\nimport ProcessingOverlay from '../../components/shared/ProcessingOverlay';\nimport { useProcessingOverlay } from '../../hooks/useProcessingOverlay';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\n\n// File type detection and categorization with language detection\nconst getFileTypeInfo = (filename: string) => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n // Programming languages with specific colors and labels\n type FileTypeMeta = { icon: React.ElementType; color: string; category: string; language?: string };\n const languageMap: Record<string, FileTypeMeta> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, color: '#d32f2f', category: 'Document' },\n 'doc': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'docx': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'odt': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'rtf': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n \n // Text files\n 'txt': { icon: DescriptionIcon, color: '#388e3c', category: 'Text' },\n 'md': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n \n // Web languages\n 'js': { icon: CodeIcon, color: '#f7df1e', category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'React TS' },\n 'html': { icon: CodeIcon, color: '#e34f26', category: 'Code', language: 'HTML' },\n 'css': { icon: CodeIcon, color: '#1572b6', category: 'Code', language: 'CSS' },\n 'scss': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'SCSS' },\n 'sass': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'Sass' },\n 'php': { icon: CodeIcon, color: '#777bb4', category: 'Code', language: 'PHP' },\n \n // Systems languages\n 'c': { icon: CodeIcon, color: '#a8b9cc', category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, color: '#f34b7d', category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, color: '#239120', category: 'Code', language: 'C#' },\n 'java': { icon: CodeIcon, color: '#ed8b00', category: 'Code', language: 'Java' },\n 'py': { icon: CodeIcon, color: '#3776ab', category: 'Code', language: 'Python' },\n 'go': { icon: CodeIcon, color: '#00add8', category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, color: '#ce422b', category: 'Code', language: 'Rust' },\n 'kt': { icon: CodeIcon, color: '#7f52ff', category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, color: '#fa7343', category: 'Code', language: 'Swift' },\n 'scala': { icon: CodeIcon, color: '#dc322f', category: 'Code', language: 'Scala' },\n 'rb': { icon: CodeIcon, color: '#cc342d', category: 'Code', language: 'Ruby' },\n \n // Scripts\n 'sh': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Shell' },\n 'bash': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Bash' },\n 'bat': { icon: CodeIcon, color: '#c1f12e', category: 'Code', language: 'Batch' },\n 'ps1': { icon: CodeIcon, color: '#012456', category: 'Code', language: 'PowerShell' },\n \n // Data formats\n 'json': { icon: DataObjectIcon, color: '#f7df1e', category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, color: '#ff6600', category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, color: '#217346', category: 'Data', language: 'CSV' },\n };\n \n return languageMap[ext] || { icon: DescriptionIcon, color: '#666', category: 'Other' };\n};\n\n// File size formatting\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n};\n\n// Content source badge information with proper vector detection\nconst getContentSourceInfo = (doc: KnowledgeDoc, isVectorMode: boolean) => {\n // Check if this is a vector document - simplified logic focusing on s3Url\n const isVectorDocument = isVectorMode && !!doc.s3Url;\n \n if (isVectorDocument) {\n // Vector documents from S3/private cloud - use teamSid to determine team vs personal\n const teamSid = doc.teamSid;\n if (teamSid) {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n } else {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue \n bgColor: '#1976d220'\n };\n }\n }\n \n // For legacy content source classification\n if (doc.contentSource) {\n if (doc.contentSource === 'user') {\n return {\n label: 'Personal',\n icon: PersonIcon,\n color: '#1976d2', // Blue\n bgColor: '#1976d220'\n };\n } else if (doc.contentSource === 'team') {\n return {\n label: 'Team',\n icon: GroupIcon,\n color: '#388e3c', // Green\n bgColor: '#388e3c20'\n };\n }\n }\n \n // For local IndexedDB documents\n return {\n label: 'Local',\n icon: LockIcon,\n color: '#757575', // Gray\n bgColor: '#75757520'\n };\n};\n\n// Document upload status\ninterface UploadStatus {\n filename: string;\n progress: number;\n status: 'uploading' | 'success' | 'error';\n error?: string;\n}\n\n// View modes\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'size' | 'type';\n\ninterface KnowledgeTabProps {\n documents: KnowledgeDoc[];\n addDocuments: (files: File[]) => Promise<void>;\n removeDocument: (id: string) => void;\n loadDocuments: () => Promise<void>;\n clearAllDocuments: () => Promise<void>;\n currentTheme: ThemeOptions;\n isLimitedAdmin?: boolean; // For premium users with limited admin access\n}\n\nconst KnowledgeTab: React.FC<KnowledgeTabProps> = ({\n documents,\n addDocuments,\n removeDocument,\n loadDocuments,\n clearAllDocuments,\n currentTheme,\n isLimitedAdmin = false,\n}) => {\n const muiTheme = useTheme();\n const isMobile = useMediaQuery(muiTheme.breakpoints.down('sm'));\n // Vector store integration for seamless advanced search\n const authStore = useAuthenticationStore();\n const features = useFeatures();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n \n const {\n isVectorEnabled,\n uploadDocument: uploadToVector,\n searchDocuments: searchVectorDocuments,\n getUserDocuments,\n downloadVectorFile,\n getFilePreview,\n refreshCompatibilityCheck,\n initializeVectorService\n } = useVectorStore();\n\n // Processing overlay for vector operations\n const { showProcessing, hideProcessing, updateProgress, processingState } = useProcessingOverlay();\n\n // Allow access for admins, pro tier users, and team tier users\n const shouldUseVector =\n (features.isAdmin() || features.hasAdvancedSearch() || features.hasAdvancedMemories()) &&\n isAdvancedVectorFeaturesEnabled &&\n isVectorEnabled;\n\n const [clearDocsDialogOpen, setClearDocsDialogOpen] = useState(false);\n const [selectedDoc, setSelectedDoc] = useState<KnowledgeDoc | null>(null);\n const [vectorDocuments, setVectorDocuments] = useState<KnowledgeDoc[]>([]);\n const [loadingVectorDocs, setLoadingVectorDocs] = useState(false);\n \n // Enhanced state management for better UX\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>('all');\n const [contentSourceFilter, setContentSourceFilter] = useState<'all' | 'personal' | 'team'>('all');\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [sortBy, setSortBy] = useState<SortBy>('date');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc');\n const [selectedDocuments, setSelectedDocuments] = useState<string[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const [uploadStatuses, setUploadStatuses] = useState<UploadStatus[]>([]);\n const [filterMenuAnchor, setFilterMenuAnchor] = useState<null | HTMLElement>(null);\n const [snackbarMessage, setSnackbarMessage] = useState<string>('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error' | 'warning'>('success');\n const [deletingDocuments, setDeletingDocuments] = useState<Set<string>>(new Set());\n // Check if user has a team (teamSid or teamId in JWT)\n const hasTeam = !!(authStore.user?.teamSid || authStore.user?.teamId);\n \n const [shareWithTeam, setShareWithTeam] = useState<boolean>(false); // Default to personal (off) for safety\n const [dragActive, setDragActive] = useState(false);\n\n // Convert vector database files to KnowledgeDoc format\n type RawVectorDocument = {\n id?: string;\n fileId?: string;\n _id?: string;\n name?: string;\n filename?: string;\n content?: string;\n preview?: string;\n mimeType?: string;\n type?: string;\n uploadedAt?: string;\n createdAt?: string;\n embedding?: number[];\n size?: number;\n uploadedBy?: string;\n userId?: string;\n userEmail?: string;\n bucket?: string;\n key?: string;\n teamSid?: string;\n };\n\n const mapVectorDocsToKnowledgeDocs = useCallback((vectorDocs: RawVectorDocument[]): KnowledgeDoc[] => {\n return vectorDocs.map((doc) => {\n const primaryId = doc.id ?? doc.fileId ?? doc._id;\n const docId = typeof primaryId === 'string'\n ? primaryId\n : primaryId\n ? JSON.stringify(primaryId)\n : uuidv4();\n\n const filename = doc.filename || doc.name || 'Unknown Document';\n const uploadedAt = doc.uploadedAt || doc.createdAt || new Date().toISOString();\n const mimeType = doc.mimeType || doc.type || 'application/octet-stream';\n const isTeamDocument = Boolean(doc.teamSid);\n\n return {\n id: docId,\n name: filename,\n content: doc.preview ?? doc.content ?? '',\n s3Url: docId,\n type: mimeType,\n addedDate: new Date(uploadedAt),\n embedding: doc.embedding,\n size: doc.size ?? 0,\n uploadedBy: doc.uploadedBy || doc.userId || '',\n userEmail: doc.userEmail || '',\n bucket: doc.bucket || '',\n key: doc.key || docId,\n isUserContent: !isTeamDocument,\n isTeamContent: isTeamDocument,\n contentSource: isTeamDocument ? 'team' : 'user',\n ...(isTeamDocument ? { teamSid: doc.teamSid } : {}),\n };\n });\n }, []);\n\n // Load vector documents when vector storage is enabled\n const loadVectorDocuments = useCallback(async () => {\n if (!shouldUseVector) {\n return;\n }\n \n setLoadingVectorDocs(true);\n try {\n const docs = await getUserDocuments(0, 100); // Load first 100 documents\n const mappedDocs = mapVectorDocsToKnowledgeDocs(docs);\n setVectorDocuments(mappedDocs);\n } catch (error) {\n console.error('Failed to load vector documents:', error);\n } finally {\n setLoadingVectorDocs(false);\n }\n }, [shouldUseVector, getUserDocuments, mapVectorDocsToKnowledgeDocs]);\n\n // Load documents on mount and when vector storage availability changes\n useEffect(() => {\n if (shouldUseVector) {\n loadVectorDocuments();\n }\n }, [shouldUseVector, loadVectorDocuments]);\n\n // Enhanced filtering and sorting\n const filteredAndSortedDocuments = useMemo(() => {\n // Use vector documents when vector storage is enabled, otherwise use local documents\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n let filtered = sourceDocuments;\n \n // Search filter - use vector search when available\n if (searchQuery) {\n if (shouldUseVector) {\n // For vector search, we'll need to implement async search\n // For now, fall back to regular search to maintain UI responsiveness\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n } else {\n filtered = filtered.filter(doc => \n doc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n doc.content.toLowerCase().includes(searchQuery.toLowerCase())\n );\n }\n }\n\n // Category filter\n if (selectedCategory !== 'all') {\n filtered = filtered.filter(doc => \n getFileTypeInfo(doc.name).category === selectedCategory\n );\n }\n\n // Content source filter\n if (contentSourceFilter !== 'all') {\n filtered = filtered.filter(doc => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n \n if (contentSourceFilter === 'personal') {\n return sourceInfo.label === 'Personal' || sourceInfo.label === 'Local';\n } else if (contentSourceFilter === 'team') {\n return sourceInfo.label === 'Team';\n }\n return true;\n });\n }\n\n // Sort\n filtered.sort((a, b) => {\n let comparison = 0;\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'date':\n // Use document order as fallback since we don't have upload date\n comparison = documents.indexOf(a) - documents.indexOf(b);\n break;\n case 'size':\n comparison = (a.content.length || 0) - (b.content.length || 0);\n break;\n case 'type':\n comparison = getFileTypeInfo(a.name).category.localeCompare(getFileTypeInfo(b.name).category);\n break;\n }\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n\n return filtered;\n }, [documents, vectorDocuments, shouldUseVector, searchQuery, selectedCategory, contentSourceFilter, sortBy, sortOrder]);\n\n // Get unique categories - use active document source\n const categories = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n const cats = new Set(sourceDocuments.map(doc => getFileTypeInfo(doc.name).category));\n return Array.from(cats).sort();\n }, [documents, vectorDocuments, shouldUseVector]);\n\n // Calculate statistics - use active document source\n const statistics = useMemo(() => {\n const sourceDocuments = shouldUseVector ? vectorDocuments : documents;\n \n // Calculate total size - for vector docs use actual size, for local docs estimate from content\n const totalSize = sourceDocuments.reduce((sum, doc) => {\n if (shouldUseVector && doc.size) {\n return sum + doc.size; // Use actual file size from vector storage\n } else {\n return sum + (doc.content?.length || 0) * 2; // Estimate from content length\n }\n }, 0);\n \n const categoryCounts = sourceDocuments.reduce((acc, doc) => {\n const category = getFileTypeInfo(doc.name).category;\n acc[category] = (acc[category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n return {\n totalDocuments: sourceDocuments.length,\n totalSize: formatFileSize(totalSize),\n categoryCounts,\n };\n }, [documents, vectorDocuments, shouldUseVector]);\n\n const getFileIcon = (filename: string): string => {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"js\":\n return \"JS\";\n case \"ts\":\n return \"TS\";\n case \"tsx\":\n return \"TX\";\n case \"py\":\n return \"🐍\";\n case \"json\":\n return \"{}\";\n case \"md\":\n return \"MD\";\n case \"pdf\":\n return \"📄\";\n case \"docx\":\n return \"📄\";\n case \"c\":\n return \"C\";\n case \"cpp\":\n return \"C++\";\n case \"cs\":\n return \"C#\";\n case \"java\":\n return \"J\";\n case \"txt\":\n return \"TXT\";\n default:\n return \"📁\";\n }\n };\n\n // Enhanced file upload with progress tracking\n // Wrapper function to handle vector store integration\n const handleDocumentUpload = async (files: File[]): Promise<{ success: boolean; error?: string; usedVector: boolean }> => {\n if (shouldUseVector) {\n // Show processing overlay for vector uploads\n showProcessing(\n 'Uploading to Vector Database',\n [\n \"🥷 Digital ninjas securing your documents...\",\n \"🤖 AI robots reading and understanding content...\", \n \"⚡ Neural networks encoding knowledge vectors...\",\n \"🧠 Machine learning creating searchable memories...\",\n \"🔮 AI wizards optimizing semantic search...\",\n \"🚀 Vector embeddings achieving light speed...\",\n \"💫 Transforming documents into intelligent data...\",\n \"🎯 Precision-targeting knowledge patterns...\"\n ]\n );\n \n try {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n \n // Update progress for each file\n updateProgress('upload', (i / files.length) * 25); // 25% for upload phase\n \n // Step 1: Upload to S3 - use shareWithTeam only if user has a team\n const shouldShareWithTeam = hasTeam ? shareWithTeam : false;\n const result = await uploadToVector(file, shouldShareWithTeam);\n \n // Step 2: AI Analysis and Embedding\n updateProgress('analyze', 25 + (i / files.length) * 50); // 25-75% for analysis\n \n if (!result.success) {\n throw new Error(result.error || 'Vector upload failed');\n }\n }\n \n // Step 3: Optimizing search\n updateProgress('optimize', 90);\n \n // Final step: Complete\n updateProgress('optimize', 100);\n \n // Reload vector documents to show the newly uploaded files\n await loadVectorDocuments();\n \n return { success: true, usedVector: true };\n } catch (error) {\n console.error('Error uploading to vector database:', error);\n hideProcessing();\n // Fallback to regular local upload only if vector fails\n try {\n await addDocuments(files);\n return { \n success: true, \n usedVector: false, \n error: `Vector upload failed: ${error instanceof Error ? error.message : String(error)}. Saved locally instead.` \n };\n } catch (localError) {\n return { \n success: false, \n usedVector: false, \n error: `Both vector and local upload failed: ${localError instanceof Error ? localError.message : String(localError)}` \n };\n }\n } finally {\n // Hide overlay after a brief delay to show completion\n setTimeout(() => {\n hideProcessing();\n }, 1500);\n }\n } else {\n // Use local IndexedDB storage for non-vector users\n try {\n await addDocuments(files);\n return { success: true, usedVector: false };\n } catch (error) {\n return { \n success: false, \n usedVector: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n }\n };\n\n const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to vector database`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after upload\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Failed to add documents\", err);\n } finally {\n // Reset file input\n if (e.target) {\n e.target.value = '';\n }\n }\n };\n\n const handleFileDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n const files = Array.from(e.dataTransfer.files);\n \n if (files.length === 0) return;\n\n // Initialize upload statuses\n const initialStatuses: UploadStatus[] = files.map(file => ({\n filename: file.name,\n progress: 0,\n status: 'uploading'\n }));\n setUploadStatuses(initialStatuses);\n\n try {\n // Update progress to show processing\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 50\n })));\n\n // Add documents and wait for completion\n const result = await handleDocumentUpload(files);\n \n if (result.success) {\n // Complete progress\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n progress: 100,\n status: 'success' as const\n })));\n\n // Show appropriate success message based on upload method\n const message = result.usedVector \n ? `Successfully uploaded ${files.length} document(s) to vector database`\n : result.error \n ? `Upload completed with warnings: ${result.error}`\n : `Successfully uploaded ${files.length} document(s)`;\n \n setSnackbarMessage(message);\n setSnackbarSeverity(result.error ? 'warning' : 'success');\n setShowSnackbar(true);\n\n // Clear upload statuses after delay\n setTimeout(() => setUploadStatuses([]), 2000);\n\n // Force reload documents to ensure they appear\n setTimeout(async () => {\n try {\n await loadDocuments();\n } catch (loadError) {\n console.error(\"Failed to reload documents after drop\", loadError);\n }\n }, 100);\n } else {\n // Upload failed completely\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${result.error || 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n\n } catch (err) {\n setUploadStatuses(prev => prev.map(status => ({\n ...status,\n status: 'error' as const,\n error: 'Upload failed'\n })));\n \n setSnackbarMessage(`Failed to upload documents: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n \n console.error(\"Drag/drop failed\", err);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragActive(false);\n };\n\n const handleDownloadDocument = async (e: React.MouseEvent, doc: KnowledgeDoc) => {\n e.stopPropagation();\n \n try {\n if (shouldUseVector && doc.id) {\n // Vector database file - download using MongoDB ObjectId\n await downloadVectorFile(doc.id, doc.name);\n \n setSnackbarMessage(`Downloaded ${doc.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n } else {\n // Local file - download from memory\n const blob = new Blob([doc.content], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n } catch (error) {\n console.error('Download failed:', error);\n setSnackbarMessage(`Failed to download ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n };\n\n const handleDocumentClick = async (doc: KnowledgeDoc) => {\n if (shouldUseVector && doc.id && !doc.content) {\n // Vector file without content - try to get preview using MongoDB ObjectId\n \n try {\n const preview = await getFilePreview(doc.id);\n if (preview) {\n // Create a temporary doc with preview content\n const previewDoc: KnowledgeDoc = {\n ...doc,\n content: preview.content,\n type: preview.mimeType\n };\n setSelectedDoc(previewDoc);\n } else {\n // No preview available - show info dialog instead\n setSnackbarMessage(`Preview not available for ${doc.name}. Use download to get the full file.`);\n setSnackbarSeverity('warning');\n setShowSnackbar(true);\n }\n } catch (error) {\n console.error('Failed to get preview:', error);\n setSnackbarMessage(`Failed to preview ${doc.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n }\n } else {\n // Local file or vector file with content\n setSelectedDoc(doc);\n }\n };\n\n const handleRemoveDocument = async (e: React.MouseEvent | null, docId: string) => {\n e?.stopPropagation();\n\n // Add to deleting set to trigger animation\n setDeletingDocuments((prev) => new Set(prev).add(docId));\n\n // Wait for animation to complete\n setTimeout(async () => {\n await removeDocument(docId);\n\n // Remove from deleting set\n setDeletingDocuments((prev) => {\n const newSet = new Set(prev);\n newSet.delete(docId);\n return newSet;\n });\n\n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n\n setSnackbarMessage('Document removed');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const handleClearAllDocuments = async () => {\n await clearAllDocuments();\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setClearDocsDialogOpen(false);\n setSnackbarMessage('All documents cleared');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n };\n\n const handleBulkDelete = async () => {\n // Add all selected documents to deleting set to trigger animation\n setDeletingDocuments(prev => new Set([...prev, ...selectedDocuments]));\n \n // Wait for animation to complete\n setTimeout(async () => {\n const deletePromises = selectedDocuments.map(id => removeDocument(id));\n await Promise.all(deletePromises);\n \n // Remove all from deleting set\n setDeletingDocuments(prev => {\n const newSet = new Set(prev);\n selectedDocuments.forEach(id => newSet.delete(id));\n return newSet;\n });\n \n // Refetch vector documents to update the list\n if (shouldUseVector) {\n await loadVectorDocuments();\n }\n \n setSelectedDocuments([]);\n setSnackbarMessage(`Removed ${selectedDocuments.length} documents`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n }, 300); // 300ms for animation\n };\n\n const toggleDocumentSelection = (docId: string) => {\n setSelectedDocuments(prev => \n prev.includes(docId) \n ? prev.filter(id => id !== docId)\n : [...prev, docId]\n );\n };\n\n const selectAllDocuments = () => {\n setSelectedDocuments(filteredAndSortedDocuments.map(doc => doc.id));\n };\n\n const clearSelection = () => {\n setSelectedDocuments([]);\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ pt: { xs: 1, md: 2 }, pb: { xs: 3, md: 4 } }}>\n {/* Enhanced Header with Statistics */}\n <Box sx={{ mb: { xs: 2.5, md: 4 } }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', md: 'row' },\n gap: { xs: 1.5, md: 2 },\n justifyContent: 'space-between',\n alignItems: { xs: 'flex-start', md: 'center' },\n mb: { xs: 1.5, md: 2 },\n }}\n >\n <Box sx={{ textAlign: { xs: 'left', md: 'initial' } }}>\n <Typography\n variant=\"h5\"\n color=\"text.primary\"\n sx={{ mb: 1, fontWeight: 600, fontSize: { xs: '1.55rem', md: '1.8rem' } }}\n >\n Document Knowledge Base\n {shouldUseVector && (\n <Chip \n label=\"Vector DB\" \n color=\"primary\" \n size=\"small\" \n sx={{ ml: 1 }} \n />\n )}\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n sx={{ fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Add documents to your private knowledge base. Files are securely stored {shouldUseVector ? 'in the vector database' : 'locally in your browser'}.\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', gap: { xs: 1, sm: 1.5 }, alignItems: 'center', flexWrap: 'wrap', width: { xs: '100%', md: 'auto' } }}>\n {shouldUseVector && (\n <Button\n variant=\"outlined\"\n size={isMobile ? 'small' : 'medium'}\n onClick={loadVectorDocuments}\n disabled={loadingVectorDocs}\n sx={{ mr: { xs: 0, md: 1 }, width: { xs: '100%', md: 'auto' } }}\n >\n {loadingVectorDocs ? 'Loading...' : 'Refresh'}\n </Button>\n )}\n {documents.length > 0 && (\n <Button\n variant=\"outlined\"\n color=\"error\"\n size={isMobile ? 'small' : 'medium'}\n startIcon={<DeleteIcon />}\n onClick={() => setClearDocsDialogOpen(true)}\n sx={{ ml: { xs: 0, md: 2 }, width: { xs: '100%', md: 'auto' } }}\n >\n Clear All\n </Button>\n )}\n </Box>\n </Box>\n \n {/* Statistics Cards */}\n {documents.length > 0 && (\n <Box sx={{ display: 'flex', gap: { xs: 1.5, md: 2 }, flexWrap: 'wrap', mb: { xs: 2, md: 3 } }}>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalDocuments}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Documents\n </Typography>\n </CardContent>\n </Card>\n <Card sx={{ minWidth: 120 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {statistics.totalSize}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Total Size\n </Typography>\n </CardContent>\n </Card>\n {Object.entries(statistics.categoryCounts).map(([category, count]) => (\n <Card key={category} sx={{ minWidth: 100 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Typography variant=\"h6\" color=\"primary\">\n {count as number}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {category}\n </Typography>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n </Box>\n\n {/* Enhanced Upload Area */}\n <Card \n sx={{ \n mb: 3,\n border: dragActive ? `2px dashed ${currentTheme.palette?.primary?.main}` : `1px dashed ${currentTheme.palette?.divider}`,\n bgcolor: dragActive ? `${currentTheme.palette?.primary?.main}08` : 'transparent',\n transition: 'all 0.2s ease-in-out',\n cursor: 'pointer',\n '&:hover': {\n bgcolor: `${currentTheme.palette?.primary?.main}04`,\n borderColor: currentTheme.palette?.primary?.main,\n }\n }}\n onDrop={handleFileDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => document.getElementById('file-upload')?.click()}\n >\n <CardContent sx={{ textAlign: 'center', py: { xs: 3, md: 4 }, px: { xs: 2, md: 3 } }}>\n <UploadFileIcon \n sx={{ \n fontSize: 48, \n color: dragActive ? 'primary.main' : 'text.secondary',\n mb: 2 \n }} \n />\n <Typography variant=\"h6\" color={dragActive ? 'primary' : 'text.primary'} gutterBottom>\n {dragActive ? 'Drop files here' : 'Upload Documents'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n Drag and drop files here or click to browse\n </Typography>\n \n {/* Team Sharing Control for Vector Documents - only show if user has a team */}\n {shouldUseVector && hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 2, \n bgcolor: 'background.paper', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider'\n }}\n onClick={(e) => e.stopPropagation()} // Prevent triggering file upload\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <Switch\n checked={shareWithTeam}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setShareWithTeam(e.target.checked)}\n color=\"primary\"\n size=\"small\"\n />\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n {shareWithTeam ? (\n <>\n <GroupIcon sx={{ fontSize: '1rem', color: 'success.main' }} />\n <Typography variant=\"body2\" color=\"success.main\" fontWeight={500}>\n Share with team\n </Typography>\n </>\n ) : (\n <>\n <PersonIcon sx={{ fontSize: '1rem', color: 'text.secondary' }} />\n <Typography variant=\"body2\" color=\"text.secondary\" fontWeight={500}>\n Personal only\n </Typography>\n </>\n )}\n </Box>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n {shareWithTeam \n ? 'Team members can search and access these documents' \n : 'Documents will be private to your account only'\n }\n </Typography>\n </Box>\n )}\n \n {/* Message for users without teams */}\n {shouldUseVector && !hasTeam && (\n <Box \n sx={{ \n mb: 2, \n p: 1.5, \n bgcolor: 'info.main' + '10', \n borderRadius: 1,\n border: '1px solid',\n borderColor: 'info.main' + '30'\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: '1rem', color: 'info.main' }} />\n <Typography variant=\"body2\" color=\"info.main\" fontWeight={500}>\n Personal Documents Only\n </Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', textAlign: 'center', mt: 0.5 }}>\n Documents will be stored privately in your personal account\n </Typography>\n </Box>\n )}\n \n <Typography variant=\"caption\" color=\"text.secondary\">\n Supported: PDF, DOC, TXT, MD, Code files, and more\n </Typography>\n <input\n id=\"file-upload\"\n type=\"file\"\n multiple\n onChange={handleFileUpload}\n style={{ display: 'none' }}\n accept=\".pdf,.doc,.docx,.txt,.md,.js,.ts,.tsx,.jsx,.py,.java,.cpp,.c,.cs,.html,.css,.json,.xml,.yaml,.yml,.csv,.php,.rb,.go,.rs,.kt,.swift,.scala,.sh,.bat,.ps1\"\n />\n </CardContent>\n </Card>\n\n {/* Upload Progress */}\n {uploadStatuses.length > 0 && (\n <Box sx={{ mb: 3 }}>\n {uploadStatuses.map((status, index) => (\n <Card key={index} sx={{ mb: 1 }}>\n <CardContent sx={{ py: 1.5, px: 2, '&:last-child': { pb: 1.5 } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n {status.status === 'success' ? (\n <CheckCircleIcon color=\"success\" />\n ) : status.status === 'error' ? (\n <ErrorIcon color=\"error\" />\n ) : (\n <Box sx={{ width: 20, height: 20 }}>\n <LinearProgress \n variant=\"determinate\" \n value={status.progress}\n sx={{ height: 4, borderRadius: 2 }}\n />\n </Box>\n )}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"body2\" color=\"text.primary\">\n {status.filename}\n </Typography>\n {status.error && (\n <Typography variant=\"caption\" color=\"error\">\n {status.error}\n </Typography>\n )}\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.progress}%\n </Typography>\n </Box>\n </CardContent>\n </Card>\n ))}\n </Box>\n )}\n\n {/* Enhanced Search and Filter Bar */}\n {documents.length > 0 && (\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', gap: 2, alignItems: 'center', flexWrap: 'wrap' }}>\n {/* Search Field */}\n <TextField\n placeholder=\"Search documents...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n sx={{ minWidth: 250 }}\n size=\"small\"\n />\n\n {/* Active Filters Status */}\n {(searchQuery || contentSourceFilter !== 'all' || selectedCategory !== 'all') && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Chip \n label={`${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length} active filter${[searchQuery && 'search', contentSourceFilter !== 'all' && 'source', selectedCategory !== 'all' && 'category'].filter(Boolean).length !== 1 ? 's' : ''}`}\n size=\"small\"\n color=\"primary\"\n variant=\"outlined\"\n sx={{ fontWeight: 500 }}\n />\n {contentSourceFilter !== 'all' && (\n <Chip \n label={contentSourceFilter === 'personal' ? 'Personal Only' : 'Team Only'}\n size=\"small\"\n color={contentSourceFilter === 'personal' ? 'info' : 'success'}\n variant=\"filled\"\n icon={contentSourceFilter === 'personal' ? <PersonIcon /> : <GroupIcon />}\n />\n )}\n </Box>\n )}\n\n {/* Category Filter */}\n <TextField\n select\n label=\"Category\"\n value={selectedCategory}\n onChange={(e) => setSelectedCategory(e.target.value)}\n size=\"small\"\n sx={{ minWidth: 120 }}\n >\n <MenuItem value=\"all\">All Types</MenuItem>\n {categories.map(category => (\n <MenuItem key={category} value={category}>\n {category}\n </MenuItem>\n ))}\n </TextField>\n\n {/* Content Source Filter - Always visible for better UX */}\n <TextField\n select\n label=\"Source\"\n value={contentSourceFilter}\n onChange={(e) => setContentSourceFilter(e.target.value as 'all' | 'personal' | 'team')}\n size=\"small\"\n sx={{ \n minWidth: 140,\n '& .MuiOutlinedInput-root': {\n bgcolor: contentSourceFilter !== 'all' ? 'primary.main' + '10' : 'transparent',\n }\n }}\n >\n <MenuItem value=\"all\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PublicIcon sx={{ fontSize: 16 }} />\n All Sources\n </Box>\n </MenuItem>\n <MenuItem value=\"personal\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <PersonIcon sx={{ fontSize: 16, color: '#1976d2' }} />\n <Typography>Personal Only</Typography>\n </Box>\n </MenuItem>\n <MenuItem value=\"team\">\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <GroupIcon sx={{ fontSize: 16, color: '#388e3c' }} />\n <Typography>Team Only</Typography>\n </Box>\n </MenuItem>\n </TextField>\n\n {/* Sort Controls */}\n <TextField\n select\n label=\"Sort by\"\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n size=\"small\"\n sx={{ minWidth: 100 }}\n >\n <MenuItem value=\"name\">Name</MenuItem>\n <MenuItem value=\"date\">Date</MenuItem>\n <MenuItem value=\"size\">Size</MenuItem>\n <MenuItem value=\"type\">Type</MenuItem>\n </TextField>\n\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? '↑' : '↓'}\n </Button>\n\n {/* View Mode Toggle */}\n <Box sx={{ display: 'flex', ml: 'auto' }}>\n <IconButton\n onClick={() => setViewMode('grid')}\n color={viewMode === 'grid' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewModuleIcon />\n </IconButton>\n <IconButton\n onClick={() => setViewMode('list')}\n color={viewMode === 'list' ? 'primary' : 'default'}\n size=\"small\"\n >\n <ViewListIcon />\n </IconButton>\n </Box>\n </Box>\n\n {/* Selection Controls */}\n {selectedDocuments.length > 0 && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete Selected\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear Selection\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={selectAllDocuments}\n >\n Select All\n </Button>\n </Box>\n </Box>\n )}\n </CardContent>\n </Card>\n )}\n \n {/* Enhanced Document Grid/List */}\n {filteredAndSortedDocuments.length === 0 ? (\n <Card sx={{ textAlign: 'center', py: 8 }}>\n <CardContent>\n <FolderIcon sx={{ fontSize: 64, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No Documents Yet\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {shouldUseVector ? \n 'Upload and embed your first document to get started with advanced vector search' :\n 'Upload your first document to get started'\n }\n </Typography>\n </CardContent>\n </Card>\n ) : (\n <Box>\n {/* Results Summary */}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Showing {filteredAndSortedDocuments.length} of {shouldUseVector ? vectorDocuments.length : documents.length} documents\n {searchQuery && ` for \"${searchQuery}\"`}\n {shouldUseVector && ` (Vector Database)`}\n </Typography>\n\n {/* Document Grid/List View */}\n {viewMode === 'grid' ? (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"repeat(2, 1fr)\",\n sm: \"repeat(3, 1fr)\",\n md: \"repeat(4, 1fr)\",\n lg: \"repeat(6, 1fr)\",\n },\n gap: 2,\n }}\n >\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <DocumentCard\n key={doc.id}\n doc={doc}\n onView={() => handleDocumentClick(doc)}\n onDelete={(id) => handleRemoveDocument(null, id)}\n onSelect={(id) => toggleDocumentSelection(id)}\n isSelected={isSelected}\n isDeleting={isDeleting}\n variant=\"full\"\n showSelection={true}\n showDelete={true}\n showPreview={true}\n />\n );\n })}\n </Box>\n ) : (\n /* List View */\n <Stack spacing={1}>\n {filteredAndSortedDocuments.map((doc: KnowledgeDoc) => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const isSelected = selectedDocuments.includes(doc.id);\n const isDeleting = deletingDocuments.has(doc.id);\n \n return (\n <Card\n key={doc.id}\n sx={{\n cursor: \"pointer\",\n transition: \"all 0.3s ease-in-out\",\n border: isSelected ? `2px solid ${currentTheme.palette?.primary?.main}` : `1px solid ${currentTheme.palette?.divider}`,\n \"&:hover\": {\n boxShadow: 4,\n },\n bgcolor: isSelected ? `${currentTheme.palette?.primary?.main}08` : 'background.paper',\n opacity: isDeleting ? 0.3 : 1,\n transform: isDeleting ? 'scale(0.95)' : 'scale(1)',\n }}\n onClick={(e) => {\n if (e.ctrlKey || e.metaKey) {\n toggleDocumentSelection(doc.id);\n } else {\n handleDocumentClick(doc);\n }\n }}\n >\n <CardContent sx={{ py: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconComponent sx={{ fontSize: 32, color: fileInfo.color }} />\n \n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"subtitle1\"\n sx={{\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: 'text.primary',\n }}\n >\n {doc.name}\n </Typography>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n mt: 0.5,\n }}\n >\n {doc.content.substring(0, 200)}...\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, mt: 1 }}>\n <Chip \n label={fileInfo.category} \n size=\"small\" \n sx={{ \n bgcolor: fileInfo.color + '20',\n color: fileInfo.color,\n fontWeight: 600,\n }}\n />\n {(() => {\n const sourceInfo = getContentSourceInfo(doc, shouldUseVector);\n return (\n <Chip\n icon={<sourceInfo.icon sx={{ fontSize: '0.8rem' }} />}\n label={sourceInfo.label}\n size=\"small\"\n sx={{\n bgcolor: sourceInfo.bgColor,\n color: sourceInfo.color,\n fontWeight: 500,\n fontSize: '0.75rem',\n '& .MuiChip-icon': {\n color: sourceInfo.color,\n }\n }}\n />\n );\n })()}\n <Chip \n label={formatFileSize(doc.content.length * 2)} \n size=\"small\" \n variant=\"outlined\"\n />\n </Box>\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n toggleDocumentSelection(doc.id);\n }}\n sx={{ \n width: 32,\n height: 32,\n bgcolor: isSelected ? 'primary.main' : 'transparent',\n color: isSelected ? 'primary.contrastText' : 'text.secondary',\n border: isSelected ? 'none' : '2px solid',\n borderColor: 'text.secondary',\n borderRadius: '50%',\n '&:hover': {\n bgcolor: isSelected ? 'primary.dark' : 'action.hover',\n borderColor: isSelected ? 'primary.dark' : 'primary.main',\n }\n }}\n >\n {isSelected ? (\n <CheckIcon sx={{ fontSize: 16 }} />\n ) : (\n <Box sx={{ \n width: 12, \n height: 12, \n borderRadius: '50%',\n bgcolor: 'transparent'\n }} />\n )}\n </IconButton>\n \n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownloadDocument(e, doc);\n }}\n sx={{ \n textTransform: 'none',\n height: { xs: 32, sm: 36, md: 40 }, // Responsive height matching grid view\n minWidth: { xs: 90, sm: 100, md: 110 }, // Consistent width\n borderWidth: 2,\n fontSize: { xs: '0.75rem', sm: '0.8rem', md: '0.875rem' }, // Responsive font\n fontWeight: 600,\n px: { xs: 1, sm: 1.5 }, // Responsive padding\n '&:hover': {\n borderWidth: 2,\n bgcolor: 'primary.main',\n color: 'primary.contrastText',\n transform: 'translateY(-1px)',\n boxShadow: 2,\n },\n }}\n startIcon={<DownloadIcon sx={{ fontSize: { xs: '1rem', sm: '1.1rem' } }} />}\n >\n Download\n </Button>\n \n <IconButton\n onClick={(e) => handleRemoveDocument(e, doc.id)}\n color=\"error\"\n >\n <DeleteIcon />\n </IconButton>\n </Box>\n </Box>\n </CardContent>\n </Card>\n );\n })}\n </Stack>\n )}\n\n {/* No Results */}\n {filteredAndSortedDocuments.length === 0 && (\n <Card sx={{ textAlign: 'center', py: 6 }}>\n <CardContent>\n <SearchIcon sx={{ fontSize: 48, color: 'text.secondary', mb: 2 }} />\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n No documents found\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Try adjusting your search or filter criteria\n </Typography>\n <Button\n variant=\"text\"\n onClick={() => {\n setSearchQuery('');\n setSelectedCategory('all');\n }}\n sx={{ mt: 2 }}\n >\n Clear Filters\n </Button>\n </CardContent>\n </Card>\n )}\n </Box>\n )}\n\n {/* Remove old upload area and document grid - they're replaced by the enhanced versions above */}\n\n {/* Enhanced Clear All Documents Dialog */}\n <Dialog open={clearDocsDialogOpen} onClose={() => setClearDocsDialogOpen(false)}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Documents?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all {documents.length} documents from your local browser storage. \n This action cannot be undone.\n </DialogContentText>\n {documents.length > 0 && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n You will lose {statistics.totalSize} of document content\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setClearDocsDialogOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleClearAllDocuments}\n color=\"error\"\n variant=\"contained\"\n startIcon={<DeleteIcon />}\n >\n Delete All Documents\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Knowledge File Modal */}\n <KnowledgeFileModal \n open={!!selectedDoc} \n onClose={() => setSelectedDoc(null)} \n doc={selectedDoc}\n isVectorDocument={shouldUseVector && !!selectedDoc}\n />\n\n {/* Success/Error Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n\n {/* Quick Actions Panel (when documents are selected) */}\n {selectedDocuments.length > 0 && (\n <Box\n sx={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000,\n bgcolor: 'background.paper',\n border: 1,\n borderColor: 'divider',\n borderRadius: 2,\n boxShadow: 4,\n p: 2,\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n }}\n >\n <Typography variant=\"body2\" sx={{ mr: 2 }}>\n {selectedDocuments.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n startIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n >\n Delete\n </Button>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={clearSelection}\n >\n Clear\n </Button>\n </Box>\n )}\n\n {/* Vector Processing Overlay */}\n <ProcessingOverlay\n open={processingState.isVisible}\n currentStep={processingState.step}\n progress={processingState.progress}\n title={processingState.title}\n customMessages={processingState.customMessages}\n />\n </Box>\n </Box>\n );\n};\n\nexport default KnowledgeTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E790-227D12\nconst __banditFingerprint_shared_ProcessingOverlaytsx = 'BL-FP-218129-2B82';\nconst __auditTrail_shared_ProcessingOverlaytsx = 'BL-AU-MGOIKVVB-O349';\n// File: ProcessingOverlay.tsx | Path: src/components/shared/ProcessingOverlay.tsx | Hash: e7902b82\n\nimport React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogContent,\n Box,\n Typography,\n LinearProgress,\n Fade,\n Zoom,\n useTheme,\n alpha,\n keyframes,\n} from '@mui/material';\nimport { \n CloudUpload, \n Psychology, \n Memory, \n AutoAwesome,\n SmartToy,\n Bolt\n} from '@mui/icons-material';\n\n// Ninja animation keyframes\nconst ninjaFloat = keyframes`\n 0%, 100% { transform: translateY(0px) rotate(0deg); }\n 25% { transform: translateY(-10px) rotate(2deg); }\n 50% { transform: translateY(-5px) rotate(0deg); }\n 75% { transform: translateY(-15px) rotate(-2deg); }\n`;\n\nconst sparkle = keyframes`\n 0%, 100% { opacity: 0; transform: scale(0); }\n 50% { opacity: 1; transform: scale(1); }\n`;\n\nconst pulse = keyframes`\n 0%, 100% { transform: scale(1); opacity: 0.7; }\n 50% { transform: scale(1.1); opacity: 1; }\n`;\n\nconst rotate = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`;\n\ninterface ProcessingStep {\n id: string;\n title: string;\n description: string;\n icon: React.ReactNode;\n duration?: number; // rough estimate in seconds\n}\n\ninterface ProcessingOverlayProps {\n open: boolean;\n currentStep?: string;\n progress?: number; // 0-100\n title?: string;\n onCancel?: () => void;\n steps?: ProcessingStep[];\n customMessages?: string[];\n}\n\nconst defaultSteps: ProcessingStep[] = [\n {\n id: 'upload',\n title: 'Uploading to Cloud',\n description: 'Our digital ninjas are securely transferring your file...',\n icon: <CloudUpload />,\n duration: 5\n },\n {\n id: 'analyze',\n title: 'AI Analysis',\n description: 'Advanced AI robots are reading and understanding your content...',\n icon: <Psychology />,\n duration: 15\n },\n {\n id: 'embed',\n title: 'Creating Vectors',\n description: 'Neural networks are encoding knowledge into searchable vectors...',\n icon: <Memory />,\n duration: 10\n },\n {\n id: 'optimize',\n title: 'Optimizing Search',\n description: 'AI algorithms are organizing data for lightning-fast retrieval...',\n icon: <AutoAwesome />,\n duration: 8\n }\n];\n\nconst cleverMessages = [\n \"🥷 Digital ninjas are working their magic...\",\n \"🤖 AI robots are crunching your data...\",\n \"⚡ Neural networks firing at maximum capacity...\",\n \"🧠 Machine learning models deep in thought...\",\n \"🔮 AI wizards casting knowledge spells...\",\n \"⚙️ Quantum processors spinning up...\",\n \"🚀 Algorithms achieving warp speed...\",\n \"💫 Creating digital memories from your content...\",\n \"🎯 Precision-targeting knowledge patterns...\",\n \"🌟 Transforming text into searchable stardust...\"\n];\n\nexport const ProcessingOverlay: React.FC<ProcessingOverlayProps> = ({\n open,\n currentStep,\n progress = 0,\n title = \"Processing Your Request\",\n onCancel,\n steps = defaultSteps,\n customMessages\n}) => {\n const theme = useTheme();\n const [messageIndex, setMessageIndex] = useState(0);\n const [sparkles, setSparkles] = useState<Array<{ id: number; x: number; y: number }>>([]);\n\n const messages = customMessages || cleverMessages;\n\n // Rotate clever messages\n useEffect(() => {\n if (!open) return;\n \n const interval = setInterval(() => {\n setMessageIndex((prev) => (prev + 1) % messages.length);\n }, 3000);\n\n return () => clearInterval(interval);\n }, [open, messages.length]);\n\n // Generate random sparkles\n useEffect(() => {\n if (!open) return;\n\n const generateSparkles = () => {\n const newSparkles = Array.from({ length: 5 }, (_, i) => ({\n id: Date.now() + i,\n x: Math.random() * 100,\n y: Math.random() * 100\n }));\n setSparkles(newSparkles);\n };\n\n generateSparkles();\n const interval = setInterval(generateSparkles, 2000);\n\n return () => clearInterval(interval);\n }, [open]);\n\n const currentStepData = steps.find(step => step.id === currentStep) || steps[0];\n const currentStepIndex = steps.findIndex(step => step.id === currentStep);\n const stepProgress = currentStepIndex >= 0 ? ((currentStepIndex + 1) / steps.length) * 100 : progress;\n\n return (\n <Dialog\n open={open}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n background: `linear-gradient(135deg, \n ${alpha(theme.palette.primary.main, 0.1)} 0%, \n ${alpha(theme.palette.secondary.main, 0.1)} 100%)`,\n backdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n position: 'relative',\n overflow: 'hidden'\n }\n }}\n BackdropProps={{\n sx: {\n backgroundColor: alpha(theme.palette.background.default, 0.8),\n backdropFilter: 'blur(4px)'\n }\n }}\n >\n {/* Animated sparkles */}\n {sparkles.map((sparkle) => (\n <Box\n key={sparkle.id}\n sx={{\n position: 'absolute',\n left: `${sparkle.x}%`,\n top: `${sparkle.y}%`,\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: theme.palette.primary.main,\n animation: `${sparkle} 2s ease-in-out infinite`,\n zIndex: 1\n }}\n />\n ))}\n\n <DialogContent sx={{ textAlign: 'center', py: 4, position: 'relative', zIndex: 2 }}>\n {/* Main Animation Area */}\n <Box sx={{ mb: 3, position: 'relative', height: 120 }}>\n {/* Primary Icon with Ninja Float Animation */}\n <Zoom in={open} timeout={500}>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 80,\n height: 80,\n borderRadius: '50%',\n background: `linear-gradient(45deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`,\n color: 'white',\n fontSize: '2rem',\n animation: `${ninjaFloat} 4s ease-in-out infinite`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.primary.main, 0.3)}`,\n position: 'relative'\n }}\n >\n {currentStepData.icon}\n \n {/* Rotating ring around icon */}\n <Box\n sx={{\n position: 'absolute',\n width: 100,\n height: 100,\n borderRadius: '50%',\n border: `2px solid ${alpha(theme.palette.primary.main, 0.3)}`,\n borderTopColor: theme.palette.primary.main,\n animation: `${rotate} 2s linear infinite`,\n top: -10,\n left: -10\n }}\n />\n </Box>\n </Zoom>\n\n {/* Floating secondary icons */}\n <Box\n sx={{\n position: 'absolute',\n top: 10,\n right: 20,\n animation: `${pulse} 3s ease-in-out infinite`,\n color: theme.palette.secondary.main\n }}\n >\n <SmartToy />\n </Box>\n \n <Box\n sx={{\n position: 'absolute',\n bottom: 10,\n left: 20,\n animation: `${pulse} 2.5s ease-in-out infinite`,\n color: theme.palette.primary.main,\n animationDelay: '1s'\n }}\n >\n <Bolt />\n </Box>\n </Box>\n\n {/* Title */}\n <Typography variant=\"h5\" gutterBottom sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n\n {/* Current Step */}\n <Fade in={true} key={currentStepData.id}>\n <Typography \n variant=\"h6\" \n color=\"primary\" \n gutterBottom\n sx={{ minHeight: 32 }}\n >\n {currentStepData.title}\n </Typography>\n </Fade>\n\n {/* Step Description */}\n <Fade in={true} key={currentStepData.description}>\n <Typography \n variant=\"body2\" \n color=\"text.secondary\" \n sx={{ mb: 3, minHeight: 20 }}\n >\n {currentStepData.description}\n </Typography>\n </Fade>\n\n {/* Clever Message Rotation */}\n <Box sx={{ height: 24, mb: 3, overflow: 'hidden' }}>\n <Fade in={true} key={messageIndex} timeout={500}>\n <Typography\n variant=\"body2\"\n sx={{\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n opacity: 0.8\n }}\n >\n {messages[messageIndex]}\n </Typography>\n </Fade>\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 3 }}>\n <LinearProgress\n variant=\"determinate\"\n value={stepProgress}\n sx={{\n height: 8,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n background: `linear-gradient(90deg, \n ${theme.palette.primary.main}, \n ${theme.palette.secondary.main})`\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {Math.round(stepProgress)}% Complete\n </Typography>\n </Box>\n\n {/* Step Indicators */}\n <Box sx={{ display: 'flex', justifyContent: 'center', gap: 1, mb: 2 }}>\n {steps.map((step, index) => (\n <Box\n key={step.id}\n sx={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n backgroundColor: index <= currentStepIndex \n ? theme.palette.primary.main \n : alpha(theme.palette.primary.main, 0.2),\n transition: 'all 0.3s ease',\n transform: index === currentStepIndex ? 'scale(1.2)' : 'scale(1)'\n }}\n />\n ))}\n </Box>\n\n {/* Estimated Time */}\n {currentStepData.duration && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n Estimated time: ~{currentStepData.duration} seconds\n </Typography>\n )}\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProcessingOverlay;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-2A55-B75390\nconst __banditFingerprint_hooks_useProcessingOverlayts = 'BL-FP-E47E99-C634';\nconst __auditTrail_hooks_useProcessingOverlayts = 'BL-AU-MGOIKVVF-JUZS';\n// File: useProcessingOverlay.ts | Path: src/hooks/useProcessingOverlay.ts | Hash: 2a55c634\n\nimport { useState, useCallback } from 'react';\n\ninterface ProcessingState {\n isVisible: boolean;\n step: string;\n progress: number;\n title: string;\n customMessages?: string[];\n}\n\ninterface UseProcessingOverlayReturn {\n showProcessing: (title?: string, messages?: string[]) => void;\n hideProcessing: () => void;\n updateProgress: (step: string, progress: number) => void;\n processingState: ProcessingState;\n}\n\n/**\n * Hook for managing processing overlay state across components\n * Provides a clean API for showing/hiding loading states with progress\n */\nexport const useProcessingOverlay = (): UseProcessingOverlayReturn => {\n const [processingState, setProcessingState] = useState<ProcessingState>({\n isVisible: false,\n step: 'upload',\n progress: 0,\n title: 'Processing...',\n customMessages: undefined\n });\n\n const showProcessing = useCallback((\n title: string = 'Processing...',\n messages?: string[]\n ) => {\n setProcessingState({\n isVisible: true,\n step: 'upload',\n progress: 0,\n title,\n customMessages: messages\n });\n }, []);\n\n const hideProcessing = useCallback(() => {\n setProcessingState(prev => ({\n ...prev,\n isVisible: false\n }));\n }, []);\n\n const updateProgress = useCallback((step: string, progress: number) => {\n setProcessingState(prev => ({\n ...prev,\n step,\n progress: Math.min(100, Math.max(0, progress))\n }));\n }, []);\n\n return {\n showProcessing,\n hideProcessing,\n updateProgress,\n processingState\n };\n};\n\nexport default useProcessingOverlay;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9903-36654D\nconst __banditFingerprint_components_StorageTabtsx = 'BL-FP-53E9DF-19E2';\nconst __auditTrail_components_StorageTabtsx = 'BL-AU-MGOIKVVK-EY8O';\n// File: StorageTab.tsx | Path: src/management/components/StorageTab.tsx | Hash: 990319e2\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport {\n Box,\n Typography,\n Button,\n Card,\n CardContent,\n LinearProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Alert,\n Stack,\n Chip,\n Accordion,\n AccordionSummary,\n AccordionDetails,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n CircularProgress,\n Snackbar,\n useTheme,\n ThemeOptions,\n} from '@mui/material';\nimport StorageIcon from '@mui/icons-material/Storage';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport WarningIcon from '@mui/icons-material/Warning';\nimport InfoIcon from '@mui/icons-material/Info';\nimport CleaningServicesIcon from '@mui/icons-material/CleaningServices';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport PersonIcon from '@mui/icons-material/Person';\nimport ChatIcon from '@mui/icons-material/Chat';\nimport SettingsIcon from '@mui/icons-material/Settings';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\nimport { useConversationSyncStore } from '../../store/conversationSyncStore';\n\n// Storage category types\ninterface StorageCategory {\n name: string;\n icon: React.ElementType;\n color: string;\n size: number;\n itemCount: number;\n description: string;\n stores: string[];\n canClear: boolean;\n clearWarning?: string;\n}\n\ninterface StorageTabProps {\n currentTheme: ThemeOptions;\n}\n\ninterface StorageQuotaState {\n used: number;\n quota: number;\n available: number;\n browserQuotaEstimate: number;\n}\n\nconst DEFAULT_DISPLAY_QUOTA_BYTES = 1024 * 1024 * 1024; // Default 1 GB cap when the browser doesn't report a quota\nconst MAX_DISPLAY_QUOTA_BYTES = 5 * 1024 * 1024 * 1024; // Clamp giant device-wide quotas to 5 GB for display clarity\n\n// Utility functions for storage management\nconst formatBytes = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n};\n\nconst getStorageQuota = async (): Promise<{ used: number; quota: number }> => {\n try {\n if ('storage' in navigator && 'estimate' in navigator.storage) {\n const estimate = await navigator.storage.estimate();\n return {\n used: estimate.usage || 0,\n quota: estimate.quota || 0,\n };\n }\n } catch (error) {\n debugLogger.warn('Could not get storage estimate', { error });\n }\n return { used: 0, quota: 0 };\n};\n\nconst getIndexedDBSize = async (): Promise<StorageCategory[]> => {\n const categories: StorageCategory[] = [];\n \n try {\n debugLogger.info('Starting IndexedDB size estimation');\n \n // List all available databases for debugging\n try {\n const databases = await indexedDB.databases();\n debugLogger.info('Available IndexedDB databases:', { \n databases: databases.map(db => ({ name: db.name, version: db.version })) \n });\n } catch (error) {\n debugLogger.warn('Could not list databases', { error });\n }\n \n // Process each category individually to prevent one timeout from breaking everything\n \n // Try multiple possible database names for conversations\n const conversationDbNames = ['bandit-conversations', 'banditConversations', 'conversations'];\n let chatSize = { size: 0, count: 0 };\n let foundConversationDb = '';\n \n for (const dbName of conversationDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'conversations');\n if (result.count > 0) {\n chatSize = result;\n foundConversationDb = dbName;\n debugLogger.info(`Found conversations in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check conversations in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Chat History',\n icon: ChatIcon,\n color: '#4caf50',\n size: chatSize.size,\n itemCount: chatSize.count,\n description: 'Conversation history and messages',\n stores: foundConversationDb ? [`${foundConversationDb}.conversations`] : [],\n canClear: chatSize.count > 0,\n clearWarning: 'This will permanently delete all your chat conversations and message history.'\n });\n \n debugLogger.info(`Chat History category created:`, { \n itemCount: chatSize.count, \n size: chatSize.size, \n canClear: chatSize.count > 0,\n foundDb: foundConversationDb \n });\n\n // Try multiple possible database names for knowledge\n const knowledgeDbNames = ['bandit-knowledge', 'banditKnowledge', 'knowledge'];\n let knowledgeSize = { size: 0, count: 0 };\n let foundKnowledgeDb = '';\n \n for (const dbName of knowledgeDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'documents');\n debugLogger.info(`Knowledge database ${dbName} check result:`, { \n size: result.size, \n count: result.count, \n sizeFormatted: `${(result.size / 1024).toFixed(2)} KB` \n });\n if (result.count > 0) {\n knowledgeSize = result;\n foundKnowledgeDb = dbName;\n debugLogger.info(`Found knowledge documents in database: ${dbName}`, { \n totalSize: result.size, \n itemCount: result.count \n });\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check knowledge in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'Knowledge Documents',\n icon: DescriptionIcon,\n color: '#2196f3',\n size: knowledgeSize.size,\n itemCount: knowledgeSize.count,\n description: 'Uploaded documents and their embeddings',\n stores: foundKnowledgeDb ? [`${foundKnowledgeDb}.documents`] : [],\n canClear: knowledgeSize.count > 0,\n clearWarning: 'This will remove all uploaded documents and their AI embeddings. You will need to re-upload documents.'\n });\n\n debugLogger.info(`Knowledge Documents category created:`, { \n itemCount: knowledgeSize.count, \n size: knowledgeSize.size, \n sizeFormatted: `${(knowledgeSize.size / 1024).toFixed(2)} KB`,\n canClear: knowledgeSize.count > 0,\n foundDb: foundKnowledgeDb \n });\n\n // Try multiple possible database names for memory (with timeout protection)\n const memoryDbNames = ['bandit-memory-db', 'banditMemories', 'bandit-memories'];\n let memorySize = { size: 0, count: 0 };\n let foundMemoryDb = '';\n \n for (const dbName of memoryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'memories');\n if (result.count > 0) {\n memorySize = result;\n foundMemoryDb = dbName;\n debugLogger.info(`Found memories in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check memories in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'AI Memories',\n icon: PersonIcon,\n color: '#ff9800',\n size: memorySize.size,\n itemCount: memorySize.count,\n description: 'AI memory entries and learned patterns',\n stores: foundMemoryDb ? [`${foundMemoryDb}.memories`] : [],\n canClear: memorySize.count > 0,\n clearWarning: 'This will delete all AI memory entries and learned conversation patterns.'\n });\n\n // Try multiple possible database names for config\n const configDbNames = ['banditConfig', 'bandit-config'];\n let configSize = { size: 0, count: 0 };\n let foundConfigDb = '';\n \n for (const dbName of configDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'config');\n if (result.count > 0) {\n configSize = result;\n foundConfigDb = dbName;\n debugLogger.info(`Found config in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check config in ${dbName}`, { error });\n }\n }\n \n categories.push({\n name: 'App Settings & Models',\n icon: SettingsIcon,\n color: '#9c27b0',\n size: configSize.size,\n itemCount: configSize.count,\n description: 'Custom models, app settings, and user preferences',\n stores: foundConfigDb ? [`${foundConfigDb}.config`] : [],\n canClear: configSize.count > 0,\n clearWarning: 'This will delete all custom AI models, app settings, themes, and preferences. The app will reset to defaults.'\n });\n\n // Check for AI Query databases (with timeout protection)\n const queryDbNames = ['banditAIQuery', 'ai-query-db'];\n let querySize = { size: 0, count: 0 };\n let foundQueryDb = '';\n \n for (const dbName of queryDbNames) {\n try {\n const result = await estimateStoreSize(dbName, 'queries');\n if (result.count > 0) {\n querySize = result;\n foundQueryDb = dbName;\n debugLogger.info(`Found AI queries in database: ${dbName}`);\n break;\n }\n } catch (error) {\n debugLogger.warn(`Failed to check queries in ${dbName}`, { error });\n }\n }\n \n if (querySize.count > 0) {\n categories.push({\n name: 'AI Query Cache',\n icon: PersonIcon,\n color: '#ff5722',\n size: querySize.size,\n itemCount: querySize.count,\n description: 'Cached AI query results and responses',\n stores: [`${foundQueryDb}.queries`],\n canClear: true,\n clearWarning: 'This will delete all cached AI query results.'\n });\n }\n \n debugLogger.info('Categories created:', { \n totalCategories: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n canClear: cat.canClear,\n storesLength: cat.stores.length \n }))\n });\n \n return categories;\n\n } catch (error) {\n debugLogger.error('Error estimating IndexedDB size', { error });\n // Return empty categories on error so UI doesn't hang\n return [];\n }\n};\n\nconst estimateStoreSize = async (dbName: string, storeName: string): Promise<{ size: number; count: number }> => {\n try {\n debugLogger.info(`Attempting to estimate size for ${dbName}.${storeName}`);\n \n // Add a timeout for individual store estimation to prevent hanging\n const timeoutPromise = new Promise<{ size: number; count: number }>((_, reject) => {\n setTimeout(() => reject(new Error(`Store estimation timeout for ${dbName}.${storeName}`)), 3000);\n });\n \n const estimationPromise = (async () => {\n // Try to access the database directly instead of checking if it exists first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n \n try {\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n const rawItems: unknown[] = Array.isArray(items) ? items : [];\n debugLogger.info(`Retrieved ${rawItems.length} items from ${dbName}.${storeName}`);\n \n if (rawItems.length === 0) {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n return { size: 0, count: 0 };\n }\n \n // Estimate size by converting to JSON and measuring length\n const totalSize = rawItems.reduce<number>((acc, item) => {\n try {\n return acc + JSON.stringify(item ?? '').length * 2; // Rough estimate (UTF-16)\n } catch {\n return acc + 1000; // Fallback estimate for non-serializable items\n }\n }, 0);\n const itemCount = rawItems.length;\n \n debugLogger.info(`Estimated size for ${dbName}.${storeName}: ${totalSize} bytes, ${itemCount} items`);\n return { size: totalSize, count: itemCount };\n } catch (dbError) {\n debugLogger.info(`Database ${dbName} or store ${storeName} does not exist or is inaccessible`, { error: dbError });\n return { size: 0, count: 0 };\n }\n })();\n \n // Race between estimation and timeout\n return await Promise.race([estimationPromise, timeoutPromise]);\n } catch (error) {\n debugLogger.warn(`Failed to estimate size for ${dbName}.${storeName}`, { error });\n return { size: 0, count: 0 };\n }\n};\n\nconst clearStorageCategory = async (category: StorageCategory): Promise<void> => {\n debugLogger.info(`Clearing storage category: ${category.name}`);\n \n for (const storeSpec of category.stores) {\n try {\n const [dbName, storeName] = storeSpec.split('.');\n debugLogger.info(`Clearing store: ${dbName}.${storeName}`);\n \n // Skip if either part is undefined\n if (!dbName || !storeName) {\n debugLogger.warn(`Invalid store specification: ${storeSpec}`);\n continue;\n }\n \n // Get all items first\n const storeConfigs = [{ name: storeName, keyPath: \"id\" }];\n const items = await indexedDBService.getAll(dbName, 1, storeName, storeConfigs);\n\n const records: unknown[] = Array.isArray(items) ? items : [];\n\n if (records.length > 0) {\n // Delete each item by its key\n for (const rawItem of records) {\n if (rawItem && typeof rawItem === 'object') {\n const record = rawItem as Record<string, unknown>;\n const candidate = record['id'] ?? record['key'] ?? record['name'];\n if (typeof candidate === 'string' && candidate.length > 0) {\n await indexedDBService.delete(dbName, 1, storeName, candidate, storeConfigs);\n }\n }\n }\n debugLogger.info(`Cleared ${records.length} items from ${dbName}.${storeName}`);\n } else {\n debugLogger.info(`No items found in ${dbName}.${storeName}`);\n }\n } catch (error) {\n debugLogger.error(`Failed to clear store: ${storeSpec}`, { error });\n // Don't throw error, continue with other stores\n }\n }\n};\n\n// Function to completely clear a database\nconst clearEntireDatabase = async (dbName: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n \n deleteRequest.onsuccess = () => {\n debugLogger.info(`Successfully deleted database: ${dbName}`);\n resolve();\n };\n \n deleteRequest.onerror = () => {\n debugLogger.error(`Failed to delete database: ${dbName}`, { error: deleteRequest.error });\n reject(deleteRequest.error);\n };\n \n deleteRequest.onblocked = () => {\n debugLogger.warn(`Database deletion blocked: ${dbName}. Close all tabs using this database.`);\n // Still resolve as the deletion will complete when other tabs are closed\n resolve();\n };\n });\n};\n\nconst StorageTab: React.FC<StorageTabProps> = ({ currentTheme }) => {\n const theme = useTheme();\n const [storageQuota, setStorageQuota] = useState<StorageQuotaState>({\n used: 0,\n quota: 0,\n available: 0,\n browserQuotaEstimate: 0,\n });\n const [storageCategories, setStorageCategories] = useState<StorageCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [clearAllDialogOpen, setClearAllDialogOpen] = useState(false);\n const [clearCategoryDialog, setClearCategoryDialog] = useState<StorageCategory | null>(null);\n const [clearing, setClearing] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const { syncEnabled, isAdvancedVectorFeaturesEnabled } = useConversationSyncStore((state) => ({\n syncEnabled: state.syncEnabled,\n isAdvancedVectorFeaturesEnabled: state.isAdvancedVectorFeaturesEnabled,\n }));\n const syncFeaturesActive = syncEnabled || isAdvancedVectorFeaturesEnabled;\n const usageSummaryMessage = syncFeaturesActive\n ? 'IndexedDB/local storage is shown below. Conversation sync or advanced vector storage may copy items to your configured gateway.'\n : 'IndexedDB/local storage lives entirely in this browser when sync features are disabled.';\n const storageStatusPrimary = syncFeaturesActive ? 'IndexedDB/local storage (sync features enabled)' : 'IndexedDB/local storage only';\n\n\n // Load storage data\n const loadStorageData = async () => {\n setLoading(true);\n try {\n debugLogger.info('Loading storage data...');\n \n const [quotaEstimate, categories] = await Promise.all([\n getStorageQuota(),\n getIndexedDBSize()\n ]);\n\n const calculatedUsed = categories.reduce((sum, cat) => sum + cat.size, 0);\n const browserQuota = quotaEstimate.quota && quotaEstimate.quota > 0 ? quotaEstimate.quota : 0;\n const normalizedQuota = browserQuota > 0\n ? Math.min(Math.max(browserQuota, calculatedUsed || DEFAULT_DISPLAY_QUOTA_BYTES), MAX_DISPLAY_QUOTA_BYTES)\n : Math.max(DEFAULT_DISPLAY_QUOTA_BYTES, calculatedUsed);\n\n const available = Math.max(normalizedQuota - calculatedUsed, 0);\n\n debugLogger.info('Storage data loaded successfully', { \n browserQuota,\n browserUsageEstimate: quotaEstimate.used,\n normalizedQuota,\n calculatedUsed,\n available,\n categoriesCount: categories.length,\n categories: categories.map(cat => ({ \n name: cat.name, \n itemCount: cat.itemCount, \n size: cat.size,\n canClear: cat.canClear \n }))\n });\n\n setStorageQuota({\n used: calculatedUsed,\n quota: normalizedQuota,\n available,\n browserQuotaEstimate: browserQuota,\n });\n setStorageCategories(categories);\n } catch (error) {\n debugLogger.error('Failed to load storage data', { error });\n setSnackbarMessage('Failed to load storage data. Please try refreshing.');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n // Set empty data so UI doesn't break\n setStorageCategories([]);\n setStorageQuota({ used: 0, quota: DEFAULT_DISPLAY_QUOTA_BYTES, available: DEFAULT_DISPLAY_QUOTA_BYTES, browserQuotaEstimate: 0 });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadStorageData();\n }, []);\n\n // Calculate totals\n const totalUsed = useMemo(() => {\n return storageCategories.reduce((sum, cat) => sum + cat.size, 0);\n }, [storageCategories]);\n\n\n const usagePercentage = useMemo(() => {\n if (storageQuota.quota === 0) return 0;\n const percentage = Math.min((storageQuota.used / storageQuota.quota) * 100, 100);\n // Show at least 0.1% if there's any usage to make it visible\n return percentage > 0 && percentage < 0.1 ? 0.1 : percentage;\n }, [storageQuota]);\n\n const clearableCategories = useMemo(() => {\n return storageCategories.filter(cat => cat.canClear);\n }, [storageCategories]);\n\n // Handle category clearing\n const handleClearCategory = async (category: StorageCategory) => {\n setClearing(true);\n try {\n await clearStorageCategory(category);\n setSnackbarMessage(`Successfully cleared ${category.name}`);\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearCategoryDialog(null);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage(`Failed to clear ${category.name}`);\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear category', { category: category.name, error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle clear all\n const handleClearAll = async () => {\n setClearing(true);\n try {\n for (const category of clearableCategories) {\n await clearStorageCategory(category);\n }\n setSnackbarMessage('Successfully cleared all storage data');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n setClearAllDialogOpen(false);\n await loadStorageData(); // Refresh data\n } catch (error) {\n setSnackbarMessage('Failed to clear all storage data');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Failed to clear all storage', { error });\n } finally {\n setClearing(false);\n }\n };\n\n // Handle nuclear clear (completely delete all databases)\n const handleNuclearClear = async () => {\n if (!window.confirm('⚠️ NUCLEAR CLEAR WARNING ⚠️\\n\\nThis will PERMANENTLY DELETE ALL DATABASES and cannot be undone!\\n\\nDifference from \"Clear All Data\":\\n• Clear All Data: Deletes items but keeps database structure\\n• Nuclear Clear: Completely destroys databases and reloads app\\n\\nThis includes:\\n- All chat history\\n- All knowledge documents\\n- All custom models\\n- All app settings\\n- Everything!\\n\\nAre you absolutely sure?')) {\n return;\n }\n \n if (!window.confirm('This is your FINAL WARNING!\\n\\nClick OK to permanently delete EVERYTHING or Cancel to abort.')) {\n return;\n }\n \n setClearing(true);\n try {\n // Include ALL databases seen in the user's system\n const databases = [\n // Current databases\n 'banditConfig', 'bandit-knowledge', 'bandit-conversations', 'bandit-memory-db',\n // Legacy/duplicate databases\n 'banditConversations', 'banditKnowledge', 'banditMemories', 'banditAIQuery',\n 'ai-query-db', 'knowledge'\n ];\n \n for (const dbName of databases) {\n await clearEntireDatabase(dbName);\n }\n \n // Also clear localStorage and sessionStorage\n localStorage.clear();\n sessionStorage.clear();\n \n setSnackbarMessage('Nuclear clear completed! All data has been permanently deleted.');\n setSnackbarSeverity('success');\n setShowSnackbar(true);\n \n // Reload the page after a delay to reset everything\n setTimeout(() => {\n window.location.reload();\n }, 2000);\n \n } catch (error) {\n setSnackbarMessage('Nuclear clear failed - some data may remain');\n setSnackbarSeverity('error');\n setShowSnackbar(true);\n debugLogger.error('Nuclear clear failed', { error });\n } finally {\n setClearing(false);\n }\n };\n\n if (loading) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', py: 8 }}>\n <CircularProgress />\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ ml: 2 }}>\n Analyzing storage usage...\n </Typography>\n </Box>\n );\n }\n\n return (\n <Box>\n <Box sx={{ px: { xs: 2, sm: 4, md: 6 }, pt: 3, pb: 5 }}>\n {/* Header */}\n <Box sx={{ mb: 4 }}>\n <Box sx={{ \n display: 'flex', \n flexDirection: { xs: 'column', sm: 'row' },\n justifyContent: 'space-between', \n alignItems: { xs: 'stretch', sm: 'flex-start' }, \n gap: { xs: 2, sm: 0 },\n mb: 2 \n }}>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h5\" color=\"text.primary\" sx={{ mb: 1, fontWeight: 600 }}>\n Storage Management\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Monitor and manage your local browser storage usage\n </Typography>\n </Box>\n <Box sx={{ \n display: 'flex', \n gap: 1, \n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n justifyContent: { xs: 'stretch', sm: 'flex-end' },\n width: { xs: '100%', sm: 'auto' }\n }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={loadStorageData}\n disabled={loading}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n minHeight: 36\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'flex' }, alignItems: 'center', gap: 1 }}>\n <RefreshIcon fontSize=\"medium\" />\n Refresh\n </Box>\n <Box sx={{ display: { xs: 'flex', sm: 'none' }, alignItems: 'center', justifyContent: 'center' }}>\n <RefreshIcon fontSize=\"medium\" />\n </Box>\n </Button>\n {clearableCategories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<CleaningServicesIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => setClearAllDialogOpen(true)}\n sx={{\n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Clear All Data</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Clear All</Box>\n </Button>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon sx={{ display: { xs: 'none', sm: 'inline-flex' } }} />}\n onClick={() => handleNuclearClear()}\n sx={{ \n minWidth: { xs: 'auto', sm: 'fit-content' },\n flex: { xs: '1', sm: '0 0 auto' },\n px: { xs: 1, sm: 2 }\n }}\n >\n <Box sx={{ display: { xs: 'none', sm: 'inline' } }}>Nuclear Clear</Box>\n <Box sx={{ display: { xs: 'inline', sm: 'none' } }}>Nuclear</Box>\n </Button>\n </>\n )}\n </Box>\n </Box>\n </Box>\n\n {/* Storage Overview */}\n <Box sx={{ mb: 4 }}>\n {/* Storage Quota - Full width on mobile */}\n <Card sx={{ mb: 3 }}>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 180 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <StorageIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Quota\n </Typography>\n <Box sx={{ mb: 2, flex: 1 }}>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${formatBytes(storageQuota.used)} Used`} \n color=\"warning\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.available)} Available`} \n color=\"success\" \n size=\"small\" \n variant=\"outlined\"\n />\n <Chip \n label={`${formatBytes(storageQuota.quota)} Total`} \n color=\"info\" \n size=\"small\" \n variant=\"outlined\"\n />\n {storageQuota.browserQuotaEstimate > 0 &&\n storageQuota.quota > 0 &&\n Math.abs(storageQuota.browserQuotaEstimate - storageQuota.quota) > storageQuota.quota * 0.05 && (\n <Chip\n label={`≈${formatBytes(storageQuota.browserQuotaEstimate)} Browser Estimate`}\n color=\"default\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={usagePercentage}\n sx={{\n height: 8,\n borderRadius: 4,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 4,\n bgcolor: usagePercentage > 80 ? 'error.main' : usagePercentage > 60 ? 'warning.main' : 'success.main',\n }\n }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 0.5, display: 'block' }}>\n {usagePercentage.toFixed(1)}% used\n </Typography>\n </Box>\n {usagePercentage > 80 && (\n <Alert severity=\"warning\" sx={{ mt: 'auto' }}>\n Storage usage is high. Consider clearing unused data.\n </Alert>\n )}\n </CardContent>\n </Card>\n\n {/* Usage Summary - Full width on mobile */}\n <Card>\n <CardContent sx={{ \n display: 'flex', \n flexDirection: 'column',\n minHeight: 140 \n }}>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Usage Summary\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\n <Chip \n label={`${storageCategories.length} Categories`} \n color=\"primary\" \n size=\"small\" \n />\n <Chip \n label={`${storageCategories.reduce((sum, cat) => sum + cat.itemCount, 0)} Items`} \n color=\"secondary\" \n size=\"small\" \n />\n <Chip \n label={`${formatBytes(totalUsed)} Used`} \n color=\"info\" \n size=\"small\" \n />\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 'auto' }}>\n {usageSummaryMessage}\n </Typography>\n </CardContent>\n </Card>\n </Box>\n\n {/* Storage Categories */}\n <Typography variant=\"h6\" gutterBottom sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Storage Categories\n </Typography>\n\n <Box sx={{ \n maxHeight: '60vh',\n overflow: 'auto',\n '&::-webkit-scrollbar': {\n display: 'none'\n },\n msOverflowStyle: 'none',\n scrollbarWidth: 'none'\n }}>\n {storageCategories.length === 0 ? (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n No storage data found. This could mean:\n </Typography>\n <Typography variant=\"body2\" component=\"ul\" sx={{ mt: 1, pl: 2 }}>\n <li>All databases are empty</li>\n <li>Data is stored under different names</li>\n <li>There was an error accessing the databases</li>\n </Typography>\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n Try clicking \"Refresh\" or check the browser console for more details.\n </Typography>\n </Alert>\n ) : (\n <Stack spacing={2}>\n {storageCategories.map((category) => {\n const IconComponent = category.icon;\n // Calculate percentage relative to total storage quota for more meaningful display\n const categoryPercentage = storageQuota.quota > 0 ? (category.size / storageQuota.quota) * 100 : 0;\n // Also calculate percentage relative to total used storage\n const categoryRelativePercentage = totalUsed > 0 ? (category.size / totalUsed) * 100 : 0;\n \n debugLogger.info(`Category ${category.name} percentage calculation:`, {\n categorySize: category.size,\n totalUsed,\n storageQuota: storageQuota.quota,\n categoryPercentage: categoryPercentage.toFixed(2),\n categoryRelativePercentage: categoryRelativePercentage.toFixed(2)\n });\n \n return (\n <Accordion key={category.name} sx={{ bgcolor: 'background.paper' }}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${category.name}-content`}\n id={`${category.name}-header`}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', pr: 2 }}>\n <IconComponent sx={{ color: category.color, mr: 2 }} />\n <Box sx={{ flex: 1 }}>\n <Typography \n variant=\"body1\" \n style={{ \n fontWeight: 600,\n color: theme.palette.mode === 'dark' ? '#ffffff' : theme.palette.text.primary\n }}\n >\n {category.name}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, mt: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {formatBytes(category.size)}\n </Typography>\n <Chip \n label={`${category.itemCount} items`} \n size=\"small\" \n variant=\"outlined\"\n />\n <Box sx={{ flex: 1, mx: 2 }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(categoryRelativePercentage, 100)} // Use relative percentage for visual bar\n sx={{\n height: 4,\n borderRadius: 2,\n bgcolor: 'action.hover',\n '& .MuiLinearProgress-bar': {\n borderRadius: 2,\n bgcolor: category.color,\n }\n }}\n />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {categoryRelativePercentage.toFixed(1)}%\n </Typography>\n </Box>\n </Box>\n </Box>\n </AccordionSummary>\n <AccordionDetails>\n <Box sx={{ pl: 5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\n {category.description}\n </Typography>\n \n <Typography variant=\"subtitle2\" gutterBottom>\n Storage Locations:\n </Typography>\n <List dense>\n {category.stores.map((store) => (\n <ListItem key={store} sx={{ py: 0.5 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <StorageIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary={store}\n primaryTypographyProps={{ variant: 'body2', fontFamily: 'monospace' }}\n />\n </ListItem>\n ))}\n </List>\n\n {category.canClear ? (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>\n <Button\n variant=\"outlined\"\n color=\"error\"\n size=\"small\"\n startIcon={<DeleteIcon />}\n onClick={() => setClearCategoryDialog(category)}\n disabled={clearing}\n >\n Clear {category.name}\n </Button>\n {category.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.clearWarning}\n </Typography>\n </Alert>\n )}\n </Box>\n ) : (\n <Alert severity=\"info\" sx={{ mt: 2 }}>\n <Typography variant=\"caption\">\n {category.itemCount === 0 ? 'This category is empty.' : 'This category cannot be cleared automatically.'}\n </Typography>\n </Alert>\n )}\n </Box>\n </AccordionDetails>\n </Accordion>\n );\n })}\n </Stack>\n )}\n </Box>\n\n {/* Storage Tips */}\n <Card sx={{ mt: 4 }}>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ fontWeight: 600, color: \"text.primary\" }}>\n <InfoIcon sx={{ mr: 1, verticalAlign: 'middle' }} />\n Storage Tips & Clear Options\n </Typography>\n <List>\n <ListItem>\n <ListItemIcon>\n <CheckCircleIcon\n sx={{\n color: syncFeaturesActive\n ? theme.palette.warning.main\n : theme.palette.success.main,\n }}\n />\n </ListItemIcon>\n <ListItemText \n primary={storageStatusPrimary}\n secondary={\n syncFeaturesActive\n ? 'Some features (conversation sync or advanced vector storage) can sync items to your configured gateway storage.'\n : 'With conversation sync and advanced vector storage turned off, everything stays in this browser.'\n }\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <CleaningServicesIcon color=\"info\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Clear All Data (Safe)\"\n secondary=\"Deletes all items but keeps database structure intact. App continues working normally.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <DeleteIcon color=\"error\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Nuclear Clear (Complete Reset)\"\n secondary=\"Completely destroys all databases and forces app reload. Use only for complete reset.\"\n />\n </ListItem>\n <ListItem>\n <ListItemIcon>\n <WarningIcon color=\"warning\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Backup important data\"\n secondary=\"Export custom models and important documents before clearing storage\"\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n\n {/* Clear Category Dialog */}\n <Dialog \n open={!!clearCategoryDialog} \n onClose={() => setClearCategoryDialog(null)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningIcon color=\"warning\" />\n Clear {clearCategoryDialog?.name}?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete all data in the \"{clearCategoryDialog?.name}\" category.\n </DialogContentText>\n {clearCategoryDialog?.clearWarning && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n {clearCategoryDialog.clearWarning}\n </Alert>\n )}\n {clearCategoryDialog && (\n <Box sx={{ mt: 2, p: 2, bgcolor: 'action.hover', borderRadius: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>Will clear:</strong>\n </Typography>\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace', mt: 1 }}>\n • {clearCategoryDialog.itemCount} items<br/>\n • {formatBytes(clearCategoryDialog.size)} of data<br/>\n • {clearCategoryDialog.stores.length} storage location{clearCategoryDialog.stores.length !== 1 ? 's' : ''}\n </Typography>\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearCategoryDialog(null)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={() => clearCategoryDialog && handleClearCategory(clearCategoryDialog)}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <DeleteIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing...' : 'Clear Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Clear All Dialog */}\n <Dialog \n open={clearAllDialogOpen} \n onClose={() => setClearAllDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <ErrorIcon color=\"error\" />\n Clear All Storage Data?\n </Box>\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n This will permanently delete ALL your local data including:\n </DialogContentText>\n <List dense sx={{ mt: 1 }}>\n {clearableCategories.map((category) => (\n <ListItem key={category.name}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <category.icon fontSize=\"small\" sx={{ color: category.color }} />\n </ListItemIcon>\n <ListItemText \n primary={category.name}\n secondary={`${category.itemCount} items • ${formatBytes(category.size)}`}\n />\n </ListItem>\n ))}\n </List>\n <Alert severity=\"error\" sx={{ mt: 2 }}>\n <Typography variant=\"body2\">\n <strong>This action cannot be undone!</strong> Make sure to export any important data before proceeding.\n </Typography>\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button \n onClick={() => setClearAllDialogOpen(false)}\n disabled={clearing}\n >\n Cancel\n </Button>\n <Button\n onClick={handleClearAll}\n color=\"error\"\n variant=\"contained\"\n startIcon={clearing ? <CircularProgress size={16} /> : <CleaningServicesIcon />}\n disabled={clearing}\n >\n {clearing ? 'Clearing All...' : 'Clear All Data'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Snackbar */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={4000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n </Box>\n );\n};\n\nexport default StorageTab;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8422-DD3359\nconst __banditFingerprint_components_ProviderTabtsx = 'BL-FP-40A439-27B6';\nconst __auditTrail_components_ProviderTabtsx = 'BL-AU-MGOIKVVK-2GRA';\n// File: ProviderTab.tsx | Path: src/management/components/ProviderTab.tsx | Hash: 842227b6\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n Box,\n Typography,\n Paper,\n Button,\n TextField,\n MenuItem,\n Chip,\n Snackbar,\n Alert,\n useTheme,\n useMediaQuery,\n} from '@mui/material';\nimport { useAIProviderStore } from '../../store/aiProviderStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { AIProviderConfig, AIProviderType } from '../../services/ai-provider/types/common.types';\nimport { aiProviderInitService } from '../../services/ai-provider-init.service';\nimport { AIProviderFactory } from '../../services/ai-provider/ai-provider.factory';\nimport { debugLogger } from '../../services/logging/debugLogger';\nimport indexedDBService from '../../services/indexedDB/indexedDBService';\n\ntype PersistedProviderConfig = Omit<AIProviderConfig, 'tokenFactory'> & { id: string };\ntype GatewayBackendProvider = NonNullable<AIProviderConfig['provider']>;\n\nexport const ProviderTab: React.FC = () => {\n const { provider: currentProvider, config: currentProviderConfig } = useAIProviderStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n\n const getSuggestedModel = useCallback((type: AIProviderType): string => {\n const configuredDefault = packageSettings?.defaultModel?.trim();\n if (configuredDefault) {\n return configuredDefault;\n }\n\n switch (type) {\n case AIProviderType.OPENAI:\n return 'gpt-4o-mini';\n case AIProviderType.XAI:\n return 'grok-beta';\n case AIProviderType.BANDIT:\n return 'bandit-core-1';\n default:\n return '';\n }\n }, [packageSettings?.defaultModel]);\n\n const applyDefaultModel = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const normalized = { ...config } as AIProviderConfig & { defaultModel?: string };\n const trimmed = typeof normalized.defaultModel === 'string' ? normalized.defaultModel.trim() : undefined;\n const requiresModel =\n normalized.type === AIProviderType.OPENAI ||\n normalized.type === AIProviderType.XAI ||\n normalized.type === AIProviderType.BANDIT;\n\n if (trimmed) {\n normalized.defaultModel = trimmed;\n return normalized;\n }\n\n if (!requiresModel) {\n delete normalized.defaultModel;\n return normalized;\n }\n\n const suggestion = getSuggestedModel(normalized.type as AIProviderType);\n if (suggestion) {\n normalized.defaultModel = suggestion;\n } else {\n delete normalized.defaultModel;\n }\n\n return normalized;\n }, [getSuggestedModel]);\n\n const sanitizeConfigForSave = useCallback((config: AIProviderConfig): AIProviderConfig => {\n const sanitized = { ...config } as AIProviderConfig & { defaultModel?: string };\n if (typeof sanitized.defaultModel === 'string') {\n const trimmed = sanitized.defaultModel.trim();\n sanitized.defaultModel = trimmed || undefined;\n }\n return sanitized;\n }, []);\n\n // AI Provider configuration state\n const [providerConfig, setProviderConfig] = useState<AIProviderConfig>({\n type: 'ollama' as const,\n baseUrl: 'http://localhost:11434'\n });\n const [isProviderConfigOpen, setIsProviderConfigOpen] = useState(false);\n\n // Snackbar states\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [showSnackbar, setShowSnackbar] = useState(false);\n const [snackbarSeverity, setSnackbarSeverity] = useState<'success' | 'error'>('success');\n\n const saveProviderConfigToDB = async (config: AIProviderConfig) => {\n try {\n const { tokenFactory: _tokenFactory, ...persistableConfig } = config;\n const serializableConfig: PersistedProviderConfig = {\n ...persistableConfig,\n id: 'aiProvider'\n };\n\n await indexedDBService.put<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n serializableConfig,\n [{ name: 'config', keyPath: 'id' }]\n );\n debugLogger.info('Provider configuration saved to IndexedDB', { type: config.type });\n } catch (error) {\n console.error('Failed to save provider config to IndexedDB:', error);\n debugLogger.error('Failed to save provider config to IndexedDB:', { error });\n throw error; // Re-throw to handle in the calling function\n }\n };\n\n const loadProviderConfigFromDB = async (): Promise<AIProviderConfig | null> => {\n try {\n const config = await indexedDBService.get<PersistedProviderConfig>(\n 'banditConfig', \n 1, \n 'config', \n 'aiProvider',\n [{ name: 'config', keyPath: 'id' }]\n );\n if (config) {\n debugLogger.info('Provider configuration loaded from IndexedDB', { type: config.type });\n // Remove the id property that was added for IndexedDB storage\n const { id: _id, ...configWithoutId } = config;\n return configWithoutId as AIProviderConfig;\n }\n } catch (error) {\n debugLogger.error('Failed to load provider config from IndexedDB:', { error });\n }\n return null;\n };\n\n const convertAnthropicConfig = useCallback((config: AIProviderConfig | null | undefined): AIProviderConfig | null => {\n if (!config) return null;\n if (config.type !== AIProviderType.ANTHROPIC) {\n return config;\n }\n\n const gatewayUrl = config.gatewayUrl || packageSettings?.gatewayApiUrl || '';\n const defaultModel = typeof config.defaultModel === 'string' && config.defaultModel.trim()\n ? config.defaultModel.trim()\n : 'claude-3-5-sonnet-latest';\n const converted: AIProviderConfig = {\n type: AIProviderType.GATEWAY,\n gatewayUrl,\n provider: 'anthropic',\n defaultModel,\n tokenFactory: config.tokenFactory\n };\n\n return converted;\n }, [packageSettings?.gatewayApiUrl]);\n\n // Load current provider configuration\n useEffect(() => {\n const initializeProviderConfig = async () => {\n // First try to load from IndexedDB\n const savedConfig = await loadProviderConfigFromDB();\n \n if (savedConfig) {\n const normalized = convertAnthropicConfig(savedConfig) || savedConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (currentProviderConfig) {\n const normalized = convertAnthropicConfig(currentProviderConfig) || currentProviderConfig;\n setProviderConfig(applyDefaultModel(normalized));\n } else if (packageSettings?.aiProvider) {\n const normalized = convertAnthropicConfig(packageSettings.aiProvider) || packageSettings.aiProvider;\n setProviderConfig(applyDefaultModel(normalized));\n }\n };\n\n initializeProviderConfig();\n }, [applyDefaultModel, convertAnthropicConfig, currentProviderConfig, packageSettings]);\n\n const showMessage = (message: string, severity: 'success' | 'error') => {\n setSnackbarMessage(message);\n setSnackbarSeverity(severity);\n setShowSnackbar(true);\n };\n\n // AI Provider configuration handlers\n const handleProviderTypeChange = (type: AIProviderType) => {\n const baseConfig: AIProviderConfig = { type };\n \n switch (type) {\n case AIProviderType.OLLAMA:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'http://localhost:11434'\n }));\n break;\n case AIProviderType.OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.openai.com/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.AZURE_OPENAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: '',\n apiKey: '',\n apiVersion: '2024-02-01',\n deploymentName: ''\n }));\n break;\n case AIProviderType.ANTHROPIC:\n showMessage('Anthropic is only available via the Gateway provider. Please configure Gateway and choose Anthropic as the backend.', 'error');\n setProviderConfig(applyDefaultModel({\n type: AIProviderType.GATEWAY,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'anthropic',\n defaultModel: 'claude-3-5-sonnet-latest'\n }));\n break;\n case AIProviderType.XAI:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.x.ai/v1',\n apiKey: ''\n }));\n break;\n case AIProviderType.BANDIT:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n baseUrl: 'https://api.burtson.ai',\n apiKey: '',\n defaultModel: 'bandit-core-1'\n }));\n break;\n case AIProviderType.GATEWAY:\n setProviderConfig(applyDefaultModel({\n ...baseConfig,\n gatewayUrl: packageSettings?.gatewayApiUrl || '',\n provider: 'openai'\n }));\n break;\n case AIProviderType.PLAYGROUND:\n setProviderConfig(applyDefaultModel({\n ...baseConfig\n }));\n break;\n }\n };\n\n const handleSaveProviderConfig = async () => {\n try { \n const normalizedConfigIntermediate = sanitizeConfigForSave(providerConfig);\n const normalizedConfig = convertAnthropicConfig(normalizedConfigIntermediate) || normalizedConfigIntermediate;\n const requiresModel =\n normalizedConfig.type === AIProviderType.OPENAI ||\n normalizedConfig.type === AIProviderType.XAI ||\n normalizedConfig.type === AIProviderType.BANDIT;\n\n if (requiresModel && !normalizedConfig.defaultModel) {\n showMessage('Please provide a default model ID for the selected provider.', 'error');\n return;\n }\n\n // Validate the configuration\n const isValid = AIProviderFactory.validateConfig(normalizedConfig);\n if (!isValid) {\n showMessage('Invalid provider configuration. Please check all required fields.', 'error');\n return;\n }\n\n // Save to IndexedDB first\n await saveProviderConfigToDB(normalizedConfig);\n\n // Switch to the new provider\n await aiProviderInitService.switchProvider(normalizedConfig);\n \n // Update package settings\n if (packageSettings) {\n const updatedSettings = {\n ...packageSettings,\n aiProvider: normalizedConfig\n };\n if (normalizedConfig.defaultModel) {\n updatedSettings.defaultModel = normalizedConfig.defaultModel;\n }\n usePackageSettingsStore.setState({ settings: updatedSettings });\n }\n\n setProviderConfig(applyDefaultModel(normalizedConfig));\n setIsProviderConfigOpen(false);\n showMessage('Provider configuration saved and switched successfully!', 'success');\n debugLogger.info('Provider configuration saved and switched', { type: normalizedConfig.type });\n } catch (error) {\n debugLogger.error('Failed to save provider configuration:', { error });\n showMessage(`Failed to save provider configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, 'error');\n }\n };\n\n const handleTestProviderConnection = async () => {\n try {\n const testConfig = sanitizeConfigForSave(providerConfig);\n const normalizedTestConfig = convertAnthropicConfig(testConfig) || testConfig;\n const testProvider = AIProviderFactory.createProvider(normalizedTestConfig);\n\n const result = await testProvider.validateServiceAvailability({ timeoutMs: 10000 });\n \n if (result.isAvailable) {\n showMessage('Connection successful! Provider is available.', 'success');\n } else {\n showMessage('Connection failed. Please check your configuration.', 'error');\n }\n } catch (error) {\n debugLogger.error('Provider connection test failed:', { error });\n showMessage('Connection test failed. Please check your configuration.', 'error');\n }\n };\n\n return (\n <Box sx={{ p: { xs: 1.5, sm: 3, md: 4 } }}>\n <Box sx={{ mb: { xs: 2.5, md: 3 } }}>\n <Typography\n variant=\"h5\"\n sx={{ fontWeight: 600, mb: 1, color: \"primary.main\", fontSize: { xs: '1.6rem', md: '1.8rem' } }}\n >\n AI Provider Configuration\n </Typography>\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n paragraph\n sx={{ opacity: 0.9, fontSize: { xs: '0.95rem', sm: '1rem' }, lineHeight: 1.5 }}\n >\n Configure your AI provider for chat, generation, and model services. This determines which backend service powers your AI interactions.\n </Typography>\n\n {/* Current Provider Status */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Typography variant=\"h6\" sx={{ mb: 2, fontWeight: 600, color: \"text.primary\" }}>\n Current Provider\n </Typography>\n {currentProvider ? (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Chip\n label={currentProvider.getProviderType().toUpperCase()}\n color=\"primary\"\n variant=\"filled\"\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {currentProviderConfig?.baseUrl || currentProviderConfig?.gatewayUrl || 'No URL configured'}\n </Typography>\n </Box>\n ) : (\n <Chip label=\"No Provider Configured\" color=\"warning\" />\n )}\n </Paper>\n\n {/* Provider Configuration Form */}\n <Paper sx={{ p: { xs: 1.75, sm: 2.5 }, mb: { xs: 2, md: 3 }, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider' }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: { xs: 'flex-start', sm: 'center' },\n justifyContent: 'space-between',\n gap: { xs: 1, sm: 2 },\n mb: 3,\n }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n Provider Configuration\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setIsProviderConfigOpen(!isProviderConfigOpen)}\n size={isMobile ? 'small' : 'medium'}\n >\n {isProviderConfigOpen ? 'Hide' : 'Configure'} Provider\n </Button>\n </Box>\n\n {isProviderConfigOpen && (\n <Box sx={{ mt: 3 }}>\n {/* Provider Type Selection */}\n <TextField\n label=\"Provider Type\"\n select\n value={providerConfig.type}\n onChange={(e) => handleProviderTypeChange(e.target.value as AIProviderType)}\n fullWidth\n sx={{ mb: 3 }}\n >\n <MenuItem value=\"gateway\">Gateway (Recommended)</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"bandit\">Bandit AI</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n <MenuItem value=\"playground\">Playground (Mock Demo)</MenuItem>\n </TextField>\n\n {/* Gateway Configuration */}\n {providerConfig.type === 'gateway' && (\n <Box>\n <TextField\n label=\"Gateway URL\"\n value={providerConfig.gatewayUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, gatewayUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-gateway-api.com\"\n />\n <TextField\n label=\"Backend Provider\"\n select\n value={providerConfig.provider || 'openai'}\n onChange={(e) => setProviderConfig({\n ...providerConfig,\n provider: e.target.value as GatewayBackendProvider\n })}\n fullWidth\n sx={{ mb: 2 }}\n >\n <MenuItem value=\"openai\">OpenAI</MenuItem>\n <MenuItem value=\"azure-openai\">Azure OpenAI</MenuItem>\n <MenuItem value=\"anthropic\">Anthropic</MenuItem>\n <MenuItem value=\"ollama\">Ollama</MenuItem>\n <MenuItem value=\"bandit\">Bandit AI</MenuItem>\n <MenuItem value=\"xai\">xAI</MenuItem>\n </TextField>\n </Box>\n )}\n\n {/* Ollama Configuration */}\n {providerConfig.type === 'ollama' && (\n <TextField\n label=\"Ollama URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n placeholder=\"http://localhost:11434\"\n />\n )}\n\n {/* Bandit AI Configuration */}\n {providerConfig.type === 'bandit' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.burtson.ai\"\n helperText=\"Defaults to https://api.burtson.ai\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"bai_...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"bandit-core-1\"\n helperText=\"Example: bandit-core-1 (Bandit Core canonical alias).\"\n />\n </Box>\n )}\n\n {/* OpenAI Configuration */}\n {providerConfig.type === 'openai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.openai.com/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"sk-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"gpt-4o-mini\"\n helperText=\"Example: gpt-4o-mini, gpt-4.1, gpt-3.5-turbo\"\n />\n </Box>\n )}\n\n {/* Azure OpenAI Configuration */}\n {providerConfig.type === 'azure-openai' && (\n <Box>\n <TextField\n label=\"Azure Endpoint\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) => setProviderConfig({...providerConfig, baseUrl: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://your-resource.openai.azure.com\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiKey: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n />\n <TextField\n label=\"API Version\"\n value={providerConfig.apiVersion || ''}\n onChange={(e) => setProviderConfig({...providerConfig, apiVersion: e.target.value})}\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"2024-02-01\"\n />\n <TextField\n label=\"Deployment Name\"\n value={providerConfig.deploymentName || ''}\n onChange={(e) => setProviderConfig({...providerConfig, deploymentName: e.target.value})}\n fullWidth\n placeholder=\"gpt-4\"\n />\n </Box>\n )}\n\n {/* xAI Configuration */}\n {providerConfig.type === 'xai' && (\n <Box>\n <TextField\n label=\"API Base URL\"\n value={providerConfig.baseUrl || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n baseUrl: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"https://api.x.ai/v1\"\n />\n <TextField\n label=\"API Key\"\n type=\"password\"\n value={providerConfig.apiKey || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n apiKey: e.target.value\n }))\n }\n fullWidth\n sx={{ mb: 2 }}\n placeholder=\"xai-...\"\n />\n <TextField\n label=\"Default Model ID\"\n value={providerConfig.defaultModel || ''}\n onChange={(e) =>\n setProviderConfig((prev) => ({\n ...prev,\n defaultModel: e.target.value\n }))\n }\n fullWidth\n placeholder=\"grok-beta\"\n helperText=\"Example: grok-beta, grok-2, grok-vision-beta\"\n />\n </Box>\n )}\n\n {/* Anthropic Configuration (deprecated direct support) */}\n {providerConfig.type === 'anthropic' && (\n <Alert severity=\"warning\" sx={{ mt: 2 }}>\n Anthropic is only supported through the Bandit Gateway provider. Please switch to Gateway and\n select Anthropic as the backend service.\n </Alert>\n )}\n\n {/* Action Buttons */}\n <Box sx={{ display: 'flex', gap: 2, mt: 3 }}>\n <Button\n variant=\"outlined\"\n onClick={handleTestProviderConnection}\n disabled={!providerConfig.type}\n >\n Test Connection\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleSaveProviderConfig}\n disabled={!providerConfig.type}\n >\n Save & Switch Provider\n </Button>\n </Box>\n </Box>\n )}\n </Paper>\n\n {/* Migration Information */}\n <Paper sx={{ p: 3, bgcolor: 'info.main', color: 'info.contrastText', borderRadius: 2 }}>\n <Typography variant=\"h6\" sx={{ mb: 1, fontWeight: 600, color: \"text.primary\" }}>\n 🚀 Gateway Provider Recommended\n </Typography>\n <Typography variant=\"body2\">\n For production deployments, we recommend using the Gateway provider which routes requests through your secure backend API. \n This approach keeps API keys secure, enables rate limiting, and provides better monitoring capabilities.\n </Typography>\n </Paper>\n </Box>\n\n {/* Snackbar for messages */}\n <Snackbar\n open={showSnackbar}\n autoHideDuration={6000}\n onClose={() => setShowSnackbar(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert\n onClose={() => setShowSnackbar(false)}\n severity={snackbarSeverity}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {snackbarMessage}\n </Alert>\n </Snackbar>\n </Box>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6468-24BE3B\nconst __banditFingerprint_components_MCPToolsTabV2tsx = 'BL-FP-885971-25D5';\nconst __auditTrail_components_MCPToolsTabV2tsx = 'BL-AU-MGOIKVVJ-JBSK';\n// File: MCPToolsTabV2.tsx | Path: src/management/components/MCPToolsTabV2.tsx | Hash: 646825d5\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Box, Typography, Paper, Chip, Stack, IconButton, Tooltip, LinearProgress, Switch, FormControlLabel } from '@mui/material';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport HealthAndSafetyIcon from '@mui/icons-material/HealthAndSafety';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport SettingsIcon from '@mui/icons-material/Settings';\nimport { fetchAvailableMcpTools, fetchMcpHealth, McpTool } from '../../services/mcp/mcpControllerService';\nimport { useMCPToolsStore } from '../../store/mcpToolsStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\n\nconst MCPToolsTabV2: React.FC = () => {\n const { settings } = usePackageSettingsStore();\n const { tools: localTools, loadTools, toggleTool, addTool, updateTool, isLoaded } = useMCPToolsStore();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [tools, setTools] = useState<McpTool[]>([]);\n const [health, setHealth] = useState<{ status: 'healthy' | 'unhealthy' | 'unknown'; timestamp?: string } | null>(null);\n\n const gatewayConfigured = !!settings?.gatewayApiUrl;\n\n const refresh = async () => {\n setLoading(true);\n setError(null);\n try {\n await loadTools(); // ensure local store is hydrated\n const [serverTools, healthResp] = await Promise.all([\n fetchAvailableMcpTools(),\n fetchMcpHealth().catch(() => null)\n ]);\n setTools(serverTools);\n // Merge controller tools into local store to keep AI enablement aligned\n serverTools.forEach(ct => {\n const functionName = (ct.id || ct.name).replace(/[^a-zA-Z0-9_]/g, '_');\n let match = localTools.find(lt => lt.function.name === functionName);\n if (!match) {\n match = localTools.find(lt => lt.function.name === ct.id);\n }\n if (!match) {\n match = localTools.find(lt => lt.id === ct.id);\n }\n \n if (!match) {\n // Add a new local tool representation to allow enabling for AI\n addTool({\n name: functionName,\n description: ct.description,\n enabled: ct.isEnabled, // Use server's enabled state for new tools\n type: 'function',\n function: {\n name: ct.id, // Use server ID as function name for better mapping\n description: ct.description,\n parameters: { type: 'object', properties: {}, required: [] },\n },\n endpoint: `/mcp/${ct.id}`,\n method: 'GET',\n isBuiltIn: false,\n });\n } else {\n // For existing tools, sync with server state\n updateTool(match.id, { enabled: ct.isEnabled });\n }\n });\n if (healthResp) {\n const status = healthResp.status === 'healthy' || healthResp.status === 'unhealthy'\n ? healthResp.status\n : 'unknown';\n setHealth({ status, timestamp: healthResp.timestamp });\n } else {\n setHealth({ status: 'unknown' });\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load MCP data');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (isLoaded) {\n refresh();\n } else {\n // Ensure local tools are loaded first\n loadTools().then(() => {\n refresh();\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoaded]);\n\n const localEnabledMap = useMemo(() => {\n const map = new Map<string, boolean>();\n \n // Sort tools to prioritize built-in tools over custom duplicates\n const sortedTools = [...localTools].sort((a, b) => {\n // Built-in tools (shorter, cleaner IDs) come first\n if (a.isBuiltIn && !b.isBuiltIn) return -1;\n if (!a.isBuiltIn && b.isBuiltIn) return 1;\n // Among non-built-in tools, shorter IDs (likely original) come first\n return a.id.length - b.id.length;\n });\n \n sortedTools.forEach(t => {\n // Map by function name (primary)\n map.set(t.function.name, t.enabled);\n // Also map by tool id for easier lookup\n map.set(t.id, t.enabled);\n // Map by tool name for fallback\n if (t.name) {\n map.set(t.name, t.enabled);\n }\n });\n \n return map;\n }, [localTools]);\n\n return (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 600, color: 'primary.main' }}>Available Tools</Typography>\n <Box>\n <Tooltip title=\"Refresh\">\n <IconButton onClick={refresh}>\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n\n {!gatewayConfigured && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Gateway API URL isn’t configured. The controller endpoints will be fetched relative to this origin.\n </Typography>\n </Paper>\n )}\n\n <Paper sx={{ p: 2, mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {health?.status === 'healthy' ? (\n <HealthAndSafetyIcon color=\"success\" />\n ) : health?.status === 'unhealthy' ? (\n <ErrorOutlineIcon color=\"error\" />\n ) : (\n <ErrorOutlineIcon color=\"disabled\" />\n )}\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600 }}>Controller Health</Typography>\n <Chip\n size=\"small\"\n label={(health?.status || 'unknown').toString()}\n color={health?.status === 'healthy' ? 'success' : health?.status === 'unhealthy' ? 'error' : 'default'}\n sx={{ ml: 1 }}\n />\n {health?.timestamp && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ ml: 1 }}>\n {new Date(health.timestamp).toLocaleString()}\n </Typography>\n )}\n </Box>\n </Paper>\n\n {loading && (\n <Box sx={{ mb: 2 }}>\n <LinearProgress />\n </Box>\n )}\n {error && (\n <Paper sx={{ p: 2, mb: 2 }}>\n <Typography color=\"error\">{error}</Typography>\n </Paper>\n )}\n\n <Stack spacing={2}>\n {tools.map((tool) => {\n // Try multiple lookup strategies to find the local enabled state\n let locallyEnabled = localEnabledMap.get(tool.id); // Try server tool id first\n if (locallyEnabled === undefined) {\n locallyEnabled = localEnabledMap.get(tool.name); // Try server tool name\n }\n if (locallyEnabled === undefined) {\n // Fallback to direct lookup in localTools array (more reliable)\n const directLookup = localTools.find(t => \n t.id === tool.id || \n t.function.name === tool.id || \n t.name === tool.name\n );\n locallyEnabled = directLookup?.enabled ?? tool.isEnabled;\n }\n \n return (\n <Paper key={tool.id} sx={{ p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 700 }}>{tool.name}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {tool.description}\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <FormControlLabel\n control={<Switch checked={!!locallyEnabled} onChange={() => {\n // Find the corresponding local tool using multiple strategies\n let local = localTools.find(t => t.function.name === tool.id);\n if (!local) {\n local = localTools.find(t => t.function.name === tool.name);\n }\n if (!local) {\n local = localTools.find(t => t.id === tool.id);\n }\n if (!local) {\n local = localTools.find(t => t.name === tool.name);\n }\n \n if (local) {\n toggleTool(local.id);\n } else {\n console.warn('Could not find local tool for server tool:', tool);\n }\n }} />}\n label={locallyEnabled ? 'Enabled' : 'Disabled'}\n />\n <Tooltip title=\"Controller-driven tools (read-only schema)\">\n <SettingsIcon color=\"disabled\" />\n </Tooltip>\n </Box>\n </Box>\n {!!tool.supportedParameters?.length && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Supported parameters</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {tool.supportedParameters.map((p) => (\n <Chip key={p} size=\"small\" label={p} />\n ))}\n </Box>\n </Box>\n )}\n </Paper>\n );\n })}\n </Stack>\n </Box>\n );\n};\n\nexport default MCPToolsTabV2;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-D920-E6B3B8\nconst __banditFingerprint_mcp_mcpControllerServicets = 'BL-FP-5B6964-A0CB';\nconst __auditTrail_mcp_mcpControllerServicets = 'BL-AU-MGOIKVVV-RXNY';\n// File: mcpControllerService.ts | Path: src/services/mcp/mcpControllerService.ts | Hash: d920a0cb\n\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nexport interface McpTool {\n id: string;\n name: string;\n description: string;\n supportedParameters: string[];\n isEnabled: boolean;\n}\n\nexport interface McpHealthResponse {\n status: string; // \"healthy\" | \"unhealthy\"\n timestamp: string;\n totalTools: number;\n enabledTools: number;\n availableTools: Array<{ id: string; name: string }>;\n}\n\nconst isPlaygroundMode = (): boolean => {\n const settings = usePackageSettingsStore.getState().settings;\n if (!settings) {\n return false;\n }\n const gatewayUrl = settings.gatewayApiUrl?.toLowerCase() ?? \"\";\n return Boolean(settings.playgroundMode || gatewayUrl.startsWith(\"playground://\"));\n};\n\nfunction buildUrl(path: string): string {\n // When running in playground mode, we never call the gateway directly.\n if (isPlaygroundMode()) {\n debugLogger.info(\"MCP controller URL build skipped in playground mode\", { path });\n return path.startsWith(\"/\") ? path : `/${path}`;\n }\n\n // Prefer configured gateway URL when available, otherwise fall back to relative path\n const base = usePackageSettingsStore.getState().settings?.gatewayApiUrl?.replace(/\\/$/, \"\") || \"\";\n if (base) {\n // Ensure path begins with '/'\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return `${base}${normalized}`;\n }\n return path; // relative to current origin\n}\n\nfunction authHeaders(): HeadersInit {\n const headers: HeadersInit = { 'Content-Type': 'application/json' };\n const token = authenticationService.getToken();\n if (token) headers['Authorization'] = `Bearer ${token}`;\n return headers;\n}\n\nexport async function fetchAvailableMcpTools(): Promise<McpTool[]> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Skipping remote MCP tool fetch — playground mode active\");\n return [];\n }\n\n const url = buildUrl('/mcp/tools');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to load MCP tools (${res.status})`);\n }\n return data as McpTool[];\n } catch (error) {\n debugLogger.error('Failed to fetch MCP tools', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n\nexport async function fetchMcpHealth(): Promise<McpHealthResponse> {\n if (isPlaygroundMode()) {\n debugLogger.info(\"Returning mocked MCP health — playground mode active\");\n return {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n totalTools: 0,\n enabledTools: 0,\n availableTools: [],\n };\n }\n\n const url = buildUrl('/mcp/health');\n try {\n const res = await fetch(url, { headers: authHeaders() });\n const data = await res.json();\n if (!res.ok) {\n throw new Error(data?.error || `Failed to fetch MCP health (${res.status})`);\n }\n return data as McpHealthResponse;\n } catch (error) {\n debugLogger.error('Failed to fetch MCP health', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useMediaQuery","alpha","Box","Button","Typography","List","ListItemIcon","ListItemText","StorageIcon","useState","Box","Button","Typography","Dialog","DialogTitle","DialogContent","DialogActions","Alert","minScale","Fragment","jsx","jsxs","useState","jsxs","Fragment","jsx","Box","Typography","Alert","Button","Dialog","DialogTitle","DialogContent","DialogActions","useState","useEffect","useRef","useCallback","Box","Button","Typography","Paper","Chip","TextField","Alert","IconButton","useMediaQuery","useTheme","jsx","jsxs","useTheme","useMediaQuery","useState","useRef","jsx","Box","jsxs","Typography","useCallback","useEffect","Paper","Chip","Alert","Button","TextField","IconButton","useState","useRef","Box","Typography","Button","TextField","Card","CardContent","Paper","Chip","Alert","useTheme","useMediaQuery","UploadIcon","RestoreIcon","DownloadIcon","useState","useRef","useCallback","useEffect","Dialog","DialogTitle","DialogContent","DialogActions","Button","Box","Typography","Slider","IconButton","Paper","Alert","Chip","RotateLeftIcon","RotateRightIcon","ZoomInIcon","ZoomOutIcon","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","minScale","jsxs","Dialog","DialogTitle","jsx","Typography","DialogContent","Fragment","Box","Paper","IconButton","ZoomOutIcon","Slider","ZoomInIcon","Button","RotateLeftIcon","RotateRightIcon","Chip","Alert","DialogActions","jsx","jsxs","predefinedThemes","useTheme","useMediaQuery","useState","useRef","jsxs","Box","jsx","Typography","Alert","Paper","UploadIcon","Button","TextField","theme","Card","Chip","CardContent","DownloadIcon","RestoreIcon","useState","useMemo","useCallback","useEffect","Box","Typography","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","TextField","InputAdornment","Chip","LinearProgress","Card","CardContent","IconButton","Alert","Stack","MenuItem","Snackbar","Switch","useMediaQuery","useTheme","DeleteIcon","DownloadIcon","CheckCircleIcon","ErrorIcon","useState","useEffect","Dialog","DialogContent","Box","Typography","Fade","useTheme","jsx","jsxs","jsx","useTheme","useState","useEffect","jsxs","Dialog","sparkle","Box","DialogContent","Typography","Fade","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useTheme","useMediaQuery","useState","useCallback","useEffect","useMemo","jsx","Box","jsxs","Typography","Chip","Button","DeleteIcon","Card","CardContent","Switch","Fragment","CheckCircleIcon","ErrorIcon","LinearProgress","TextField","InputAdornment","MenuItem","IconButton","Stack","DownloadIcon","Dialog","DialogTitle","DialogContent","DialogContentText","Alert","DialogActions","Snackbar","useState","useEffect","useMemo","Box","Typography","Button","Card","CardContent","LinearProgress","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Alert","Stack","Chip","Snackbar","useTheme","DeleteIcon","RefreshIcon","DescriptionIcon","PersonIcon","CheckCircleIcon","ErrorIcon","Fragment","jsx","jsxs","DescriptionIcon","PersonIcon","useTheme","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Button","RefreshIcon","Fragment","DeleteIcon","Card","CardContent","Chip","LinearProgress","Alert","Stack","CheckCircleIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","ErrorIcon","Snackbar","useState","useEffect","useCallback","Box","Typography","Paper","Button","TextField","MenuItem","Chip","Snackbar","Alert","useTheme","useMediaQuery","jsx","jsxs","useTheme","useMediaQuery","useCallback","useState","useEffect","jsxs","Box","jsx","Typography","Paper","Chip","Button","TextField","MenuItem","Alert","Snackbar","useEffect","useMemo","useState","Box","Typography","Paper","Chip","Stack","IconButton","Tooltip","LinearProgress","Switch","FormControlLabel","RefreshIcon","SettingsIcon","jsx","jsxs","useState","useEffect","useMemo","jsxs","Box","jsx","Typography","Tooltip","IconButton","RefreshIcon","Paper","Chip","LinearProgress","Stack","FormControlLabel","Switch","SettingsIcon","jsx","jsxs","useMediaQuery","useState","banditHead","useEffect","useCallback","packageSettings","modelName","file","e","jsx","StorageIcon","jsxs","Box","theme","alpha","Button","List","ListItemIcon","ListItemText","Typography"]}
|