sa2kit 1.6.57 → 1.6.59

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.
Files changed (147) hide show
  1. package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
  2. package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
  4. package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
  5. package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
  6. package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
  7. package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
  8. package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
  9. package/dist/UniversalFileService-336GFY6N.mjs +6 -0
  10. package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
  11. package/dist/UniversalFileService-J6ET6KZK.js +15 -0
  12. package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
  13. package/dist/calendar/index.js +11 -11
  14. package/dist/calendar/index.mjs +4 -4
  15. package/dist/chunk-25OFOKNF.js +171 -0
  16. package/dist/chunk-25OFOKNF.js.map +1 -0
  17. package/dist/chunk-3DXPQ4YV.mjs +165 -0
  18. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  19. package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
  20. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  21. package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
  22. package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
  23. package/dist/{chunk-HYZ5C6FY.mjs → chunk-7CMGQX3S.mjs} +1199 -1995
  24. package/dist/chunk-7CMGQX3S.mjs.map +1 -0
  25. package/dist/chunk-CIVO4R6N.mjs +37 -0
  26. package/dist/chunk-CIVO4R6N.mjs.map +1 -0
  27. package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
  28. package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
  29. package/dist/{chunk-UR5TU4MW.mjs → chunk-FVDPGX6A.mjs} +3 -3
  30. package/dist/{chunk-UR5TU4MW.mjs.map → chunk-FVDPGX6A.mjs.map} +1 -1
  31. package/dist/chunk-HDMIOOZY.mjs +546 -0
  32. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  33. package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
  34. package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
  35. package/dist/chunk-HJ6MH7J7.js +552 -0
  36. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  37. package/dist/chunk-KH6RQ4J5.js +28 -0
  38. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  39. package/dist/{chunk-53WLQ22S.js → chunk-LJGJPAQ4.js} +6 -6
  40. package/dist/{chunk-53WLQ22S.js.map → chunk-LJGJPAQ4.js.map} +1 -1
  41. package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
  42. package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
  43. package/dist/chunk-NZZZUMMX.mjs +784 -0
  44. package/dist/chunk-NZZZUMMX.mjs.map +1 -0
  45. package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
  46. package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
  47. package/dist/chunk-Q5EDCKQA.js +336 -0
  48. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  49. package/dist/{chunk-U7AQC2Z7.js → chunk-SKCMZYSQ.js} +1203 -2001
  50. package/dist/chunk-SKCMZYSQ.js.map +1 -0
  51. package/dist/{chunk-6NMIKAE7.mjs → chunk-SNBILYSH.mjs} +5 -5
  52. package/dist/{chunk-6NMIKAE7.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
  53. package/dist/{chunk-IPY26RQH.js → chunk-UVHPCLP6.js} +5 -5
  54. package/dist/{chunk-IPY26RQH.js.map → chunk-UVHPCLP6.js.map} +1 -1
  55. package/dist/{chunk-V6BXO6ZS.mjs → chunk-UZB4IO3T.mjs} +835 -38
  56. package/dist/chunk-UZB4IO3T.mjs.map +1 -0
  57. package/dist/{chunk-W2NCOORK.js → chunk-WK3HTUID.js} +951 -145
  58. package/dist/chunk-WK3HTUID.js.map +1 -0
  59. package/dist/chunk-YMS6BPXS.js +807 -0
  60. package/dist/chunk-YMS6BPXS.js.map +1 -0
  61. package/dist/chunk-YOTQG4NP.mjs +314 -0
  62. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  63. package/dist/chunk-ZGVB35L2.mjs +25 -0
  64. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  65. package/dist/chunk-ZRAW3HXA.js +43 -0
  66. package/dist/chunk-ZRAW3HXA.js.map +1 -0
  67. package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
  68. package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
  69. package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
  70. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  71. package/dist/components/index.js +104 -104
  72. package/dist/components/index.mjs +4 -4
  73. package/dist/index.js +146 -148
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +8 -11
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/logger/index.js +7 -7
  78. package/dist/logger/index.mjs +1 -4
  79. package/dist/mikuFusionGame/index.js +4 -4
  80. package/dist/mikuFusionGame/index.mjs +3 -3
  81. package/dist/portfolio/index.js +10 -10
  82. package/dist/portfolio/index.mjs +5 -5
  83. package/dist/showmasterpiece/db/index.js +42 -42
  84. package/dist/showmasterpiece/db/index.mjs +1 -1
  85. package/dist/showmasterpiece/index.js +143 -144
  86. package/dist/showmasterpiece/index.js.map +1 -1
  87. package/dist/showmasterpiece/index.mjs +7 -9
  88. package/dist/showmasterpiece/index.mjs.map +1 -1
  89. package/dist/showmasterpiece/logic/index.d.mts +10 -1
  90. package/dist/showmasterpiece/logic/index.d.ts +10 -1
  91. package/dist/showmasterpiece/logic/index.js +19 -19
  92. package/dist/showmasterpiece/logic/index.mjs +2 -2
  93. package/dist/showmasterpiece/server/index.js +42 -42
  94. package/dist/showmasterpiece/server/index.mjs +1 -1
  95. package/dist/showmasterpiece/ui/web/index.js +34 -34
  96. package/dist/showmasterpiece/ui/web/index.mjs +6 -6
  97. package/dist/universalExport/server/index.js +2 -4
  98. package/dist/universalExport/server/index.js.map +1 -1
  99. package/dist/universalExport/server/index.mjs +1 -3
  100. package/dist/universalExport/server/index.mjs.map +1 -1
  101. package/dist/universalFile/index.js +6 -9
  102. package/dist/universalFile/index.js.map +1 -1
  103. package/dist/universalFile/index.mjs +1 -5
  104. package/dist/universalFile/index.mjs.map +1 -1
  105. package/dist/universalFile/server/index.js +31 -64
  106. package/dist/universalFile/server/index.js.map +1 -1
  107. package/dist/universalFile/server/index.mjs +7 -42
  108. package/dist/universalFile/server/index.mjs.map +1 -1
  109. package/dist/utils/index.js +11 -11
  110. package/dist/utils/index.mjs +2 -2
  111. package/package.json +1 -1
  112. package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
  113. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
  114. package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
  115. package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
  116. package/dist/UniversalFileService-RBV6EN5J.js +0 -15
  117. package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
  118. package/dist/chunk-4NFOSCM6.js +0 -34
  119. package/dist/chunk-4NFOSCM6.js.map +0 -1
  120. package/dist/chunk-4VJQZSPU.mjs.map +0 -1
  121. package/dist/chunk-6AHYPPUP.js +0 -344
  122. package/dist/chunk-6AHYPPUP.js.map +0 -1
  123. package/dist/chunk-76V7EKBX.mjs +0 -796
  124. package/dist/chunk-76V7EKBX.mjs.map +0 -1
  125. package/dist/chunk-ACLOJXXE.js +0 -195
  126. package/dist/chunk-ACLOJXXE.js.map +0 -1
  127. package/dist/chunk-AEXPAH7Z.mjs +0 -32
  128. package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
  129. package/dist/chunk-CFGX3EKK.js +0 -560
  130. package/dist/chunk-CFGX3EKK.js.map +0 -1
  131. package/dist/chunk-D2HXMGXS.js +0 -46
  132. package/dist/chunk-D2HXMGXS.js.map +0 -1
  133. package/dist/chunk-DVENFCQY.js.map +0 -1
  134. package/dist/chunk-HYZ5C6FY.mjs.map +0 -1
  135. package/dist/chunk-K7WNCB4V.mjs +0 -554
  136. package/dist/chunk-K7WNCB4V.mjs.map +0 -1
  137. package/dist/chunk-L4ZYBFB2.mjs +0 -44
  138. package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
  139. package/dist/chunk-M4HGHTIC.js +0 -820
  140. package/dist/chunk-M4HGHTIC.js.map +0 -1
  141. package/dist/chunk-PXWDQFWV.mjs +0 -192
  142. package/dist/chunk-PXWDQFWV.mjs.map +0 -1
  143. package/dist/chunk-U7AQC2Z7.js.map +0 -1
  144. package/dist/chunk-V6BXO6ZS.mjs.map +0 -1
  145. package/dist/chunk-VTGPHE4Z.mjs +0 -322
  146. package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
  147. package/dist/chunk-W2NCOORK.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ai/ocr/hooks/useOCR.ts","../src/ai/ocr/components/OCRScanner.tsx","../src/ai/background-removal/hooks/useBackgroundRemoval.ts","../src/ai/background-removal/components/BackgroundRemover.tsx","../src/ai/sentiment-analysis/hooks/useSentimentAnalysis.ts","../src/ai/sentiment-analysis/components/SentimentAnalyzer.tsx","../src/ai/text-generation/hooks/useTextGeneration.ts","../src/ai/text-generation/components/SmartAssistant.tsx","../src/profile/ProfileModal.tsx","../src/profile/internal/BadgeList.tsx","../src/profile/internal/Stat.tsx","../src/profile/internal/StatList.tsx","../src/profile/ProfileButton.tsx","../src/profile/AutoOpenModal.tsx","../src/profile/EnhancedAvatar.tsx","../src/testField/utils/index.ts","../src/testField/components/CategoryFilter.tsx","../src/testField/components/CompletionFilter.tsx","../src/testField/components/PageHeader.tsx","../src/testField/components/ExperimentGrid.tsx","../src/testField/components/EmptyState.tsx","../src/testField/components/SortControl.tsx","../src/testField/components/SortModeToggle.tsx","../src/testField/components/SortableExperimentItem.tsx","../src/testField/components/DraggableExperimentGrid.tsx","../src/testField/components/PermissionGuard.tsx","../src/testField/components/UserInfoBar.tsx"],"names":["init_logger","useState","useRef","useCallback","createWorker","useEffect","React","clsx","Upload","X","Loader2","FileText","Eraser","Download","Smile","Frown","Meh","MessageSquare","Send","Bot","User","cn","Dialog","DialogContent","Avatar","AvatarImage","AvatarFallback","Badge","Button","FilterButtonGroup","BackButton","ExperimentCard","Grid","useSortable","CSS","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","rectSortingStrategy","useAuth","Shield","AlertTriangle","FlaskConical","LogOut"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SA2Kit\n * A modern, type-safe React utility library with cross-platform support\n *\n * Version: 0.3.0\n * Features: Logger, Utils, Storage, Hooks, File Upload, Data Export, i18n, Analytics, Music, Calendar\n */\n\n// Logger\nexport * from './logger';\n\n// AI\nexport * from './ai/ocr';\nexport * from './ai/background-removal';\nexport * from './ai/sentiment-analysis';\nexport * from './ai/text-generation';\n\n// Utils\nexport * from './utils';\n\n// Components (Foundation UI)\nexport * from './components';\n\n// Business Logic Components\nexport * from './profile';\nexport * from './portfolio';\nexport * from './navigation';\nexport * from './testField';\nexport * from './mikuFireworks3D';\n\n// Storage - Only export types and hooks, not platform adapters\n// Platform adapters should be imported from '@qhr123/sa2kit/storage' subpath\nexport type { StorageAdapter, StorageChangeEvent } from './storage/types';\nexport * from './storage/hooks';\n\n// Note: The following modules are available as separate subpath exports\n// to avoid naming conflicts and reduce bundle size. Import them directly:\n// - File Management: import { universalFileClient } from '@qhr123/sa2kit/universalFile';\n// - Data Export: import { universalExportClient } from '@qhr123/sa2kit/universalExport';\n// - Internationalization: import { createI18n, useTranslation } from '@qhr123/sa2kit/i18n';\n// - Analytics: import { Analytics } from '@qhr123/sa2kit/analytics';\n// - Music: import { MusicPlayer, musicService } from '@qhr123/sa2kit/music';\n// - Calendar: import { useEvents, CalendarPage } from '@qhr123/sa2kit/calendar';\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { createWorker, Worker } from 'tesseract.js';\nimport { OCRResult, OCROptions, OCRState } from '../types';\n\nexport const useOCR = (options: OCROptions = {}) => {\n const [state, setState] = useState<OCRState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const workerRef = useRef<Worker | null>(null);\n\n const cleanup = useCallback(async () => {\n if (workerRef.current) {\n await workerRef.current.terminate();\n workerRef.current = null;\n }\n }, []);\n\n const recognize = useCallback(\n async (image: string | File | Blob | HTMLImageElement | HTMLCanvasElement) => {\n setState((prev) => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const worker = await createWorker(options.language || 'eng', 1, {\n logger: (m) => {\n if (m.status === 'recognizing text') {\n setState((prev) => ({\n ...prev,\n status: 'recognizing',\n progress: m.progress,\n }));\n }\n options.logger?.(m);\n },\n });\n\n workerRef.current = worker;\n\n const { data } = await worker.recognize(image);\n\n // In some versions of tesseract.js, words and lines are not directly on data\n // We extract them from blocks if needed\n const words = (data as any).words || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines.flatMap(l => l.words))) || [];\n const lines = (data as any).lines || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines)) || [];\n\n const result: OCRResult = {\n text: data.text,\n confidence: data.confidence,\n words: words.map((w: any) => ({\n text: w.text,\n confidence: w.confidence,\n bbox: w.bbox,\n })),\n lines: lines.map((l: any) => l.text),\n };\n\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n result,\n }));\n\n await worker.terminate();\n workerRef.current = null;\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error,\n }));\n throw error;\n }\n },\n [options]\n );\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n ...state,\n recognize,\n cleanup,\n };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState, useRef } from 'react';\nimport { useOCR } from '../hooks/useOCR';\nimport { Loader2, Upload, FileText, Image as ImageIcon, X } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface OCRScannerProps {\n onResult?: (text: string) => void;\n className?: string;\n language?: string;\n}\n\nexport const OCRScanner: React.FC<OCRScannerProps> = ({\n onResult,\n className = '',\n language = 'eng',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { recognize, isProcessing, progress, status, result, error } = useOCR({\n language,\n });\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Create preview\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const ocrResult = await recognize(file);\n onResult?.(ocrResult.text);\n } catch (err) {\n console.error('OCR Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n const file = e.dataTransfer.files?.[0];\n if (file && file.type.startsWith('image/')) {\n const mockEvent = { target: { files: [file] } } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleFileChange(mockEvent);\n }\n };\n\n return (\n <div \n className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-blue-400 bg-blue-50/10' : 'border-gray-200 hover:border-blue-400', className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-blue-50 rounded-full text-blue-500\">\n <Upload size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">点击或拖拽图片进行 OCR 识别</p>\n <p className=\"text-sm text-gray-500\">支持 JPG, PNG, WebP</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"relative group rounded-lg overflow-hidden border border-gray-200\">\n <img \n src={imagePreview} \n alt=\"Preview\" \n className={clsx('max-h-64 mx-auto object-contain transition-opacity', isProcessing ? 'opacity-50' : 'opacity-100')}\n />\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm\"\n >\n <X size={18} />\n </button>\n )}\n \n {isProcessing && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/5\">\n <Loader2 className=\"animate-spin text-blue-500 mb-2\" size={32} />\n <div className=\"w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-blue-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-xs font-medium text-blue-600 mt-2\">\n {status === 'initializing' ? '正在加载引擎...' : '识别中 ' + (Math.round(progress * 100)) + '%'}\n </p>\n </div>\n )}\n </div>\n\n {result && !isProcessing && (\n <div className=\"bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2 mb-2 text-gray-600 font-medium\">\n <FileText size={18} />\n <span>识别结果 (置信度: {Math.round(result.confidence)}%)</span>\n </div>\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {result.text}\n </pre>\n </div>\n )}\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 识别失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useEffect } from 'react';\nimport { BackgroundRemovalOptions, BackgroundRemovalState } from '../types';\n\nexport const useBackgroundRemoval = (options: BackgroundRemovalOptions = {}) => {\n const [state, setState] = useState<BackgroundRemovalState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n resultBlob: null,\n resultUrl: null,\n });\n\n const remove = useCallback(async (image: string | File | Blob | HTMLImageElement | URL) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n let backgroundRemoval;\n\n try {\n // 环境盾牌:防止库初始化时 Object.keys(null) 崩溃\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' } },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n \n backgroundRemoval = await import('@imgly/background-removal');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', {\n value: originalProcess,\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n }\n\n const { removeBackground } = backgroundRemoval;\n\n const config: any = {\n progress: (status: string, progress: number) => {\n setState(prev => ({\n ...prev,\n status,\n progress,\n }));\n options.progress?.(status, progress);\n },\n model: options.model || 'small',\n publicPath: options.publicPath,\n fetchArgs: options.fetchArgs,\n };\n\n const blob = await removeBackground(image, config);\n const url = URL.createObjectURL(blob);\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n resultBlob: blob,\n resultUrl: url,\n }));\n\n return { blob, url };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Background Removal Error:', msg);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error: new Error(msg),\n }));\n throw err;\n }\n }, [options]);\n\n const cleanup = useCallback(() => {\n if (state.resultUrl) {\n URL.revokeObjectURL(state.resultUrl);\n }\n }, [state.resultUrl]);\n\n useEffect(() => {\n return () => cleanup();\n }, [cleanup]);\n\n return {\n ...state,\n remove,\n cleanup,\n };\n};\n","import React, { useState, useRef } from 'react';\nimport { useBackgroundRemoval } from '../hooks/useBackgroundRemoval';\nimport { Loader2, Upload, Download, Image as ImageIcon, X, Eraser } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface BackgroundRemoverProps {\n onResult?: (blob: Blob, url: string) => void;\n className?: string;\n}\n\nexport const BackgroundRemover: React.FC<BackgroundRemoverProps> = ({\n onResult,\n className = '',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const { blob, url } = await remove(file);\n onResult?.(blob, url);\n } catch (err) {\n console.error('Background Removal Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const downloadResult = () => {\n if (!resultUrl) return;\n const a = document.createElement('a');\n a.href = resultUrl;\n a.download = 'removed_background.png';\n a.click();\n };\n\n return (\n <div className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-purple-400 bg-purple-50/10' : 'border-gray-200 hover:border-purple-400', className)}>\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-purple-50 rounded-full text-purple-500\">\n <Eraser size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">上传图片移除背景</p>\n <p className=\"text-sm text-gray-500\">建议使用主体明确的图片</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">原图</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50\">\n <img src={imagePreview} alt=\"Original\" className=\"max-h-64 mx-auto object-contain\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">处理结果</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]\">\n {resultUrl ? (\n <img src={resultUrl} alt=\"Result\" className=\"max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500\" />\n ) : (\n <div className=\"h-64 flex flex-col items-center justify-center text-gray-400\">\n {isProcessing ? (\n <>\n <Loader2 className=\"animate-spin text-purple-500 mb-2\" size={32} />\n <div className=\"w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-purple-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-[10px] mt-2 font-mono uppercase\">{status.replace(/-/g, ' ')}</p>\n </>\n ) : (\n <span className=\"text-sm italic\">等待处理...</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-between items-center pt-2\">\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors\"\n >\n <X size={16} />\n 重新开始\n </button>\n )}\n \n {resultUrl && !isProcessing && (\n <button \n onClick={downloadResult}\n className=\"flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all\"\n >\n <Download size={16} />\n 下载 PNG\n </button>\n )}\n </div>\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 处理失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { SentimentResult, SentimentOptions, SentimentState } from '../types';\n\nexport const useSentimentAnalysis = (options: SentimentOptions = {}) => {\n const [state, setState] = useState<SentimentState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const analyze = useCallback(async (text: string) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'loading model',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0) },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const defaultModel = 'Xenova/distilbert-base-multilingual-cased-sentiments-student';\n \n pipelineRef.current = await pipeline('sentiment-analysis', options.model || defaultModel);\n }\n\n setState(prev => ({ ...prev, status: 'analyzing' }));\n \n const output = await pipelineRef.current(text);\n const resultData = output[0];\n\n const label = resultData.label.toLowerCase();\n let sentiment: 'positive' | 'negative' | 'neutral' = 'neutral';\n \n // 增强逻辑:针对中文常见消极词汇进行本地加权\n const negativeKeywords = ['累', '惨', '绝望', '难受', '伤心', '差', '坏', '糟', '不行'];\n const hasNegativeKeyword = negativeKeywords.some(k => text.includes(k));\n\n if (label.includes('positive') && !hasNegativeKeyword) {\n sentiment = 'positive';\n } else if (label.includes('negative') || label.includes('0') || hasNegativeKeyword) {\n sentiment = 'negative';\n }\n\n const result: SentimentResult = {\n label: resultData.label,\n score: resultData.score,\n sentiment,\n };\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Sentiment Error:', msg);\n setState(prev => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model]);\n\n return { ...state, analyze };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState } from 'react';\nimport { useSentimentAnalysis } from '../hooks/useSentimentAnalysis';\nimport { MessageSquare, Send, Loader2, Smile, Frown, Meh } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SentimentAnalyzerProps {\n onResult?: (result: any) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport const SentimentAnalyzer: React.FC<SentimentAnalyzerProps> = ({\n onResult,\n className = '',\n placeholder = '输入一段中文或英文,分析其情感倾向...',\n}) => {\n const [text, setText] = useState('');\n const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();\n\n const handleAnalyze = async () => {\n if (!text.trim() || isProcessing) return;\n try {\n const res = await analyze(text);\n onResult?.(res);\n } catch (err) {\n console.error('Sentiment Analysis Error:', err);\n }\n };\n\n const getSentimentIcon = () => {\n if (!result) return null;\n switch (result.sentiment) {\n case 'positive': return <Smile className=\"text-green-500\" size={24} />;\n case 'negative': return <Frown className=\"text-red-500\" size={24} />;\n default: return <Meh className=\"text-yellow-500\" size={24} />;\n }\n };\n\n const getSentimentColor = () => {\n if (!result) return '';\n switch (result.sentiment) {\n case 'positive': return 'bg-green-50 border-green-200 text-green-700';\n case 'negative': return 'bg-red-50 border-red-200 text-red-700';\n default: return 'bg-yellow-50 border-yellow-200 text-yellow-700';\n }\n };\n\n return (\n <div className={clsx('p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm', className)}>\n <div className=\"flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium\">\n <MessageSquare size={20} />\n <span>文本情感分析</span>\n </div>\n\n <div className=\"relative\">\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n className=\"w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200\"\n disabled={isProcessing}\n />\n <button\n onClick={handleAnalyze}\n disabled={!text.trim() || isProcessing}\n className=\"absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm\"\n >\n {isProcessing ? <Loader2 className=\"animate-spin\" size={18} /> : <Send size={18} />}\n </button>\n </div>\n\n {isProcessing && (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>正在分析 (首次运行将加载模型资源)...</span>\n </div>\n )}\n\n {result && !isProcessing && (\n <div className={clsx('mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2', getSentimentColor())}>\n <div className=\"p-2 bg-white rounded-full shadow-sm\">\n {getSentimentIcon()}\n </div>\n <div>\n <p className=\"font-bold text-lg capitalize\">{result.sentiment}</p>\n <p className=\"text-sm opacity-80\">\n 置信度: {(result.score * 100).toFixed(1)}% ({result.label})\n </p>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 分析失败: {error.message}\n </div>\n )}\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { TextGenerationOptions, TextGenerationState } from '../types';\n\nexport const useTextGeneration = (options: TextGenerationOptions = {}) => {\n const [state, setState] = useState<TextGenerationState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const generate = useCallback(async (prompt: string) => {\n console.log('[AI] Generating for prompt:', prompt);\n \n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'initializing',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0), cwd: () => '/', browser: true },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const modelName = options.model || 'Xenova/LaMini-Flan-T5-77M';\n pipelineRef.current = await pipeline('text2text-generation', modelName, {\n progress_callback: (info: any) => {\n if (info.status === 'progress') {\n setState((prev: TextGenerationState) => ({ ...prev, status: 'loading model: ' + (Math.round(info.progress)) + '%' }));\n }\n }\n });\n }\n\n setState((prev: TextGenerationState) => ({ ...prev, status: 'thinking' }));\n \n // 优化生成参数,使其对小模型更友好\n const output = await pipelineRef.current(prompt, {\n max_new_tokens: options.max_new_tokens || 64,\n temperature: options.temperature || 0.5, // 稍微提高温度\n do_sample: true, // 开启采样,避免空输出\n top_k: 50,\n repetition_penalty: 1.1,\n });\n\n const result = output[0].generated_text || '';\n console.log('[AI] Raw result:', result);\n\n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[AI] Error:', err);\n setState((prev: TextGenerationState) => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model, options.max_new_tokens, options.temperature]);\n\n return { ...state, generate };\n};\n\n\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTextGeneration } from '../hooks/useTextGeneration';\nimport { Bot, User, Send, Loader2 } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SmartAssistantProps {\n className?: string;\n}\n\nexport const SmartAssistant: React.FC<SmartAssistantProps> = ({ className = '' }) => {\n const [input, setInput] = useState('');\n const [chatHistory, setChatHistory] = useState<Array<{ role: 'user' | 'assistant', content: string }>>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [chatHistory, isGenerating]);\n\n const handleSend = async () => {\n if (!input.trim() || isGenerating) return;\n\n const userMessage = input.trim();\n setInput('');\n setChatHistory(prev => [...prev, { role: 'user', content: userMessage }]);\n\n // --- 1. 本地硬规则匹配 (意图识别) ---\n // 对于 77M 模型,某些固定回复由逻辑生成效果更好\n let finalContent = '';\n const lowerMessage = userMessage.toLowerCase();\n \n if (lowerMessage.includes('你好') || lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n finalContent = '你好呀!我是 sa2kit 的本地 AI 助手,很高兴能和你聊天。😊';\n } else if (lowerMessage.includes('谁') || lowerMessage.includes('who are you')) {\n finalContent = '我是一个完全运行在你浏览器本地的小型 AI 模型,我不需要服务器,非常保护你的隐私。';\n } else if (lowerMessage.includes('天气')) {\n finalContent = '虽然我看不见外面的阳光,但听你的语气,今天一定是个适合出门的好天气!☀️';\n } else if (lowerMessage.includes('累') || lowerMessage.includes('难过') || lowerMessage.includes('绝望')) {\n finalContent = '听起来你现在心情不太好... 抱抱你,我会一直在这里陪你聊天的。❤️';\n }\n\n // 如果命中了硬规则,直接显示并返回,不再调用模型\n if (finalContent) {\n // 模拟一点点思考时间,体验更自然\n setTimeout(() => {\n setChatHistory(prev => [...prev, { role: 'assistant', content: finalContent }]);\n }, 500);\n return;\n }\n\n // --- 2. 调用模型生成 (针对非固定意图) ---\n const prompt = `对话。\n人说:\"${userMessage}\"\nAI回应:\"`;\n\n try {\n const response = await generate(prompt);\n \n // 深度清理模型输出\n let modelOutput = response\n .replace(/^AI回应:|^AI:|^Assistant:|^回答:|^答:|^Answer:/i, '')\n .replace(/[. ]*Positive[. ]*|[. ]*Negative[. ]*|[. ]*Neutral[. ]*/gi, '') // 拦截情绪单词\n .replace(/^[\"'“]|[\"'”]$/g, '') // 去掉引号\n .trim();\n\n // --- 3. 结果质量检查 (Recovery) ---\n // 如果模型返回包含大量英文、或者是废话、或者太短\n const isEnglishTrash = /[a-zA-Z]{5,}/.test(modelOutput) && !/[一-龥]/.test(modelOutput);\n const isTooShort = modelOutput.length < 1;\n\n if (isEnglishTrash || isTooShort) {\n console.warn('[AI] Model failure, triggering smart recovery. Raw was:', response);\n modelOutput = '嗯嗯,我正在听。关于“' + userMessage.slice(0, 6) + '...”,你还有什么想分享的吗?';\n }\n\n setChatHistory(prev => [...prev, { role: 'assistant', content: modelOutput }]);\n } catch (err) {\n setChatHistory(prev => [...prev, { role: 'assistant', content: '(本地模型思考过度,暂时休息中...)' }]);\n }\n };\n\n return (\n <div className={clsx('flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden', className)}>\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50\">\n {chatHistory.length === 0 && (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400 space-y-2\">\n <Bot size={48} className=\"opacity-20\" />\n <p className=\"text-sm italic text-center px-8 text-gray-400 font-sans\">\n 你好!我是 100% 本地运行的 AI。<br/>\n 你可以和我聊聊天,我会尝试理解你的意思。\n </p>\n </div>\n )}\n {chatHistory.map((msg, i) => (\n <div key={i} className={clsx('flex', msg.role === 'user' ? 'justify-end' : 'justify-start', 'animate-in fade-in slide-in-from-bottom-2')}>\n <div className={clsx('flex gap-3 max-w-[85%]', msg.role === 'user' ? 'flex-row-reverse' : '')}>\n <div className={clsx('p-2 rounded-lg h-fit', msg.role === 'user' ? 'bg-blue-100 text-blue-600' : 'bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400')}>\n {msg.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n </div>\n <div className={clsx('p-3 rounded-2xl shadow-sm text-sm', msg.role === 'user' \n ? 'bg-blue-600 text-white rounded-tr-none' \n : 'bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed')}>\n {msg.content}\n </div>\n </div>\n </div>\n ))}\n {isGenerating && (\n <div className=\"flex justify-start\">\n <div className=\"flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600\">\n <Loader2 className=\"animate-spin text-blue-500\" size={16} />\n <div className=\"flex flex-col\">\n <span className=\"text-xs text-gray-500 font-medium\">思考中...</span>\n <span className=\"text-[10px] text-blue-400 font-mono tracking-tighter\">{genStatus}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700\">\n <div className=\"relative flex items-center gap-2\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n placeholder=\"输入文字...\"\n className=\"flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800\"\n disabled={isGenerating}\n />\n <button\n onClick={handleSend}\n disabled={!input.trim() || isGenerating}\n className=\"absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center\"\n >\n <Send size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@/components/Dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { ProfileData, SocialLink } from './types';\nimport { cn } from '@/utils';\n\nconst themeStyles = {\n light: \"\",\n dark: \"bg-[#222] text-[#eee] border-[#444]\",\n blue: \"bg-[#f0f8ff] border-[#1890ff]/20\",\n};\n\nexport interface ProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n data: ProfileData;\n showAvatar?: boolean;\n showContacts?: boolean;\n showSocial?: boolean;\n showBio?: boolean;\n avatarSize?: number;\n onAvatarClick?: () => void;\n onSocialLinkClick?: (url: string, type: string) => void;\n onContactClick?: (type: string, value: string) => void;\n themeName?: 'light' | 'dark' | 'blue';\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ProfileModal: React.FC<ProfileModalProps> = ({\n isOpen,\n onClose,\n data,\n showAvatar = true,\n showContacts = true,\n showSocial = true,\n showBio = true,\n avatarSize = 80,\n onAvatarClick,\n onSocialLinkClick,\n onContactClick,\n themeName = 'light',\n className,\n}) => {\n // 渲染社交媒体链接\n const renderSocialLinks = () => {\n if (!data.socialLinks || data.socialLinks.length === 0) return null;\n return (\n <div className=\"flex gap-3 mt-2\">\n {data.socialLinks.map((link: SocialLink, index: number) => (\n <a\n key={index}\n href={link.url}\n className={cn(\n \"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5\",\n themeName === 'dark' ? \"bg-gray-800 text-gray-200 hover:bg-gray-700\" : \"bg-gray-100 text-gray-800 hover:bg-gray-200\"\n )}\n title={link.type}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n if (onSocialLinkClick) {\n e.preventDefault();\n onSocialLinkClick(link.url, link.type);\n }\n }}\n >\n {link.icon ? (\n <span className=\"text-base\">{link.icon}</span>\n ) : (\n <span className=\"text-[10px] font-semibold\">{link.type}</span>\n )}\n </a>\n ))}\n </div>\n );\n };\n\n // 渲染联系方式\n const renderContacts = () => {\n if (!data.contacts || Object.keys(data.contacts).length === 0) return null;\n return (\n <div className={cn(\n \"mt-4 border-t pt-4\",\n themeName === 'dark' ? \"border-gray-800\" : \"border-gray-100\"\n )}>\n {Object.entries(data.contacts).map(([type, value], index) => (\n <div \n key={index} \n className={cn(\n \"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors\",\n themeName === 'dark' ? \"hover:bg-gray-800\" : \"hover:bg-gray-50\"\n )}\n onClick={() => onContactClick && onContactClick(type, value)}\n >\n <span className={cn(\n \"font-medium w-[70px] shrink-0\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{type}:</span>\n <span className={themeName === 'dark' ? \"text-gray-200\" : \"text-gray-800\"}>{value}</span>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className={cn(\n \"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl\",\n themeStyles[themeName as keyof typeof themeStyles] || \"\",\n className\n )}>\n <div className=\"p-6\">\n <div className=\"flex gap-5 mb-5\">\n {showAvatar && (\n <div \n className=\"shrink-0\"\n onClick={onAvatarClick}\n style={{ cursor: onAvatarClick ? 'pointer' : 'default' }}\n >\n <Avatar className=\"border-2 border-primary/10 shadow-sm\" style={{ width: avatarSize, height: avatarSize }}>\n {data.avatar && <AvatarImage src={data.avatar} alt={data.name} className=\"object-cover\" />}\n <AvatarFallback className=\"text-xl\">\n {data.name.substring(0, 2).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <h2 className={cn(\n \"text-2xl font-bold m-0 mb-1\",\n themeName === 'dark' ? \"text-white\" : \"text-gray-900\"\n )}>{data.name}</h2>\n {data.title && <div className={cn(\n \"text-sm mb-2\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{data.title}</div>}\n {showSocial && renderSocialLinks()}\n </div>\n </div>\n \n {showBio && data.bio && (\n <div className={cn(\n \"mb-5 leading-relaxed text-sm\",\n themeName === 'dark' ? \"text-gray-300\" : \"text-gray-600\"\n )}>\n <p>{data.bio}</p>\n </div>\n )}\n \n {showContacts && renderContacts()}\n \n {data.customContent && (\n <div className=\"mt-5\">\n {data.customContent}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProfileModal;\n","import React from 'react';\nimport { Badge } from '@/components/Badge';\nimport { cn } from '@/utils';\nimport { BadgeType } from '../types';\n \ninterface BadgeListProps {\n badges: BadgeType[];\n className?: string;\n}\n\nexport const BadgeList: React.FC<BadgeListProps> = ({\n badges,\n className = '',\n}) => {\n if (!badges || badges.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-wrap gap-2 mt-4\", className)}>\n {badges.map((badge, index) => (\n <Badge \n key={index} \n variant={badge.type === 'default' ? 'default' : (badge.type as any)}\n >\n {badge.icon && <span className=\"mr-1\">{badge.icon}</span>}\n {badge.label}\n </Badge>\n ))}\n </div>\n );\n};\n","import { StatType } from '..';\nimport { cn } from '@/utils';\n\ninterface StatProps extends StatType {\n className?: string;\n}\n\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n icon,\n className = '',\n}) => {\n return (\n <div className={cn(\"flex flex-col items-center flex-1 text-center\", className)}>\n {icon && <span className=\"mb-2 text-2xl text-gray-400\">{icon}</span>}\n <div>\n <div className=\"text-lg font-semibold text-gray-800\">{value}</div>\n <div className=\"text-xs text-gray-400 mt-1\">{label}</div>\n </div>\n </div>\n );\n};\n","import { StatType } from \"..\";\nimport { Stat } from \"./Stat\";\nimport { cn } from '@/utils';\n\ninterface StatListProps {\n stats: StatType[];\n className?: string;\n}\n\nexport const StatList: React.FC<StatListProps> = ({\n stats,\n className = '',\n}) => {\n if (!stats || stats.length === 0) return null;\n\n return (\n <div className={cn(\"flex justify-between mt-4 pt-4 border-t border-gray-100\", className)}>\n {stats.map((stat, index) => (\n <Stat key={index} {...stat} />\n ))}\n </div>\n );\n}; ","'use client';\n\nimport React, { useState } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\nimport { Button } from '@/components/Button';\n\n// 示例数据\nconst exampleProfileData: ProfileData = {\n name: '张三',\n avatar: 'https://randomuser.me/api/portraits/men/32.jpg',\n title: '高级前端工程师',\n bio: '专注于React和Next.js开发的前端工程师,有5年工作经验。热爱开源,喜欢分享技术经验。',\n contacts: {\n '邮箱': 'zhangsan@example.com',\n '电话': '138-8888-8888',\n '地址': '上海市浦东新区',\n },\n socialLinks: [\n { type: 'GitHub', url: 'https://github.com/zhangsan', icon: '★' },\n { type: 'Twitter', url: 'https://twitter.com/zhangsan', icon: '✦' },\n { type: 'LinkedIn', url: 'https://linkedin.com/in/zhangsan', icon: '✪' },\n ],\n badges: [\n { label: 'React', type: 'primary' },\n { label: 'Next.js', type: 'success' },\n { label: 'TypeScript', type: 'info' },\n { label: 'CSS', type: 'default' },\n ],\n stats: [\n { label: '项目', value: 42 },\n { label: '粉丝', value: 1024 },\n { label: '评分', value: '4.9' },\n ],\n customContent: (\n <div className=\"mt-5 border-t border-gray-100 pt-4\">\n <h3 className=\"text-sm font-semibold mb-2\">专业技能</h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n 精通React、Vue、Angular等前端框架,熟悉TypeScript、JavaScript、CSS3、HTML5等前端技术。\n 有丰富的大型项目开发经验,能独立负责前端架构设计。\n </p>\n </div>\n ),\n};\n\nexport interface ProfileButtonProps {\n data?: ProfileData;\n buttonText?: string;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n className?: string;\n modalTheme?: 'light' | 'dark' | 'blue';\n}\n\n/**\n * 个人信息按钮组件,点击后显示个人信息弹窗\n */\nexport const ProfileButton: React.FC<ProfileButtonProps> = ({\n data = exampleProfileData,\n buttonText = '查看个人信息',\n variant = 'default',\n size = 'default',\n className = '',\n modalTheme = 'light',\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n const closeModal = () => setIsModalOpen(false);\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <>\n <Button \n variant={variant}\n size={size}\n onClick={openModal} \n className={className}\n >\n {buttonText}\n </Button>\n\n <ProfileModal\n isOpen={isModalOpen}\n onClose={closeModal}\n data={data}\n themeName={modalTheme}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.customContent}\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n </>\n );\n};\n\nexport default ProfileButton;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\n\nexport interface AutoOpenModalProps {\n data: ProfileData;\n delay?: number; // 延迟显示时间(毫秒)\n themeName?: 'light' | 'dark' | 'blue';\n onClose?: () => void;\n}\n\n/**\n * 自动打开个人信息弹窗组件\n * 页面加载后自动显示弹窗\n */\nexport const AutoOpenModal: React.FC<AutoOpenModalProps> = ({\n data,\n delay = 500, // 默认延迟500毫秒\n themeName = 'light',\n onClose,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // 页面加载后自动显示弹窗\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsModalOpen(true);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [delay]);\n\n const handleClose = () => {\n setIsModalOpen(false);\n if (onClose) {\n onClose();\n }\n };\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <ProfileModal\n isOpen={isModalOpen}\n onClose={handleClose}\n data={data}\n themeName={themeName}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n );\n};\n\nexport default AutoOpenModal;\n","'use client';\n\nimport React from 'react';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { cn } from '@/utils';\n\nexport interface EnhancedAvatarProps {\n src?: string;\n name?: string;\n size?: 'small' | 'medium' | 'large' | number;\n mood?: 'online' | 'offline' | 'away';\n statusText?: string;\n onClick?: () => void;\n className?: string;\n}\n\nconst sizeMap = {\n small: 'h-8 w-8',\n medium: 'h-12 w-12',\n large: 'h-16 w-16',\n};\n\nconst moodColors = {\n online: 'bg-green-500',\n offline: 'bg-gray-500',\n away: 'bg-yellow-500',\n};\n\nexport const EnhancedAvatar: React.FC<EnhancedAvatarProps> = ({\n src,\n name,\n size = 'medium',\n mood = 'online',\n statusText,\n onClick,\n className,\n}) => {\n const sizeClass = typeof size === 'string' ? sizeMap[size] : '';\n const customSizeStyle = typeof size === 'number' ? { width: size, height: size } : {};\n\n return (\n <div className={cn(\"relative inline-block\", className)} onClick={onClick}>\n <Avatar className={cn(sizeClass, onClick && \"cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all\")} style={customSizeStyle}>\n {src && <AvatarImage src={src} alt={name || \"Avatar\"} className=\"object-cover\" />}\n <AvatarFallback className=\"bg-primary/10 text-primary-foreground\">\n {name ? name.substring(0, 2).toUpperCase() : '??'}\n </AvatarFallback>\n </Avatar>\n \n {mood && (\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-2 border-white\",\n moodColors[mood],\n typeof size === 'number' ? (size > 60 ? 'h-4 w-4' : 'h-3 w-3') : (size === 'large' ? 'h-4 w-4' : 'h-3 w-3')\n )}\n />\n )}\n \n {statusText && (\n <div className=\"absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap\">\n <span className=\"text-xs text-muted-foreground\">{statusText}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default EnhancedAvatar;\n","/**\n * 实验田模块工具函数\n */\n\nimport type { ExperimentItem, ViewMode, TestFieldConfig, CompletionFilter } from '../types';\n\n/**\n * 过滤实验项目\n */\nexport function filterExperiments(\n experiments: ExperimentItem[],\n config: Partial<TestFieldConfig>\n): ExperimentItem[] {\n const {\n viewMode = 'all',\n searchQuery = '',\n completionFilter = 'all'\n } = config;\n\n return experiments.filter(experiment => {\n // 类别过滤\n const matchesViewMode = viewMode === 'all' || experiment.category === viewMode;\n \n // 搜索过滤\n const query = searchQuery.toLowerCase();\n const matchesSearch = !query || \n experiment.title.toLowerCase().includes(query) ||\n experiment.description.toLowerCase().includes(query) ||\n experiment.tags.some(tag => tag.toLowerCase().includes(query));\n \n // 完成状态过滤\n const matchesCompletion = (() => {\n switch (completionFilter) {\n case 'completed':\n return experiment.isCompleted === true;\n case 'incomplete':\n return experiment.isCompleted !== true;\n case 'all':\n default:\n return true;\n }\n })();\n \n return matchesViewMode && matchesSearch && matchesCompletion;\n });\n}\n\n/**\n * 排序实验项目\n */\nexport function sortExperiments(\n experiments: ExperimentItem[],\n sortBy: TestFieldConfig['sortBy'] = 'title',\n sortOrder: TestFieldConfig['sortOrder'] = 'asc'\n): ExperimentItem[] {\n return [...experiments].sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'title':\n comparison = a.title.localeCompare(b.title);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'completion':\n // 已完成的排在前面\n const aCompleted = a.isCompleted ? 1 : 0;\n const bCompleted = b.isCompleted ? 1 : 0;\n comparison = bCompleted - aCompleted;\n break;\n case 'createdAt':\n // 处理创建日期排序,确保没有日期的项目排在最后\n if (!a.createdAt && !b.createdAt) {\n comparison = 0;\n } else if (!a.createdAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.createdAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n }\n break;\n case 'updatedAt':\n // 处理更新日期排序,确保没有日期的项目排在最后\n if (!a.updatedAt && !b.updatedAt) {\n comparison = 0;\n } else if (!a.updatedAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.updatedAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime();\n }\n break;\n default:\n comparison = 0;\n }\n \n // 如果主要排序字段相同,使用ID作为第二排序键确保稳定性\n if (comparison === 0) {\n comparison = a.id.localeCompare(b.id);\n }\n \n return sortOrder === 'asc' ? comparison : -comparison;\n });\n}\n\n/**\n * 获取所有标签\n */\nexport function getAllTags(experiments: ExperimentItem[]): string[] {\n const allTags = experiments.flatMap(experiment => experiment.tags);\n return Array.from(new Set(allTags)).sort();\n}\n\n/**\n * 根据类别统计实验项目数量\n */\nexport function getExperimentCounts(experiments: ExperimentItem[]) {\n const counts = {\n all: experiments.length,\n utility: 0,\n leisure: 0,\n completed: 0,\n inProgress: 0\n };\n \n experiments.forEach(experiment => {\n if (experiment.category === 'utility') {\n counts.utility++;\n } else if (experiment.category === 'leisure') {\n counts.leisure++;\n }\n \n if (experiment.isCompleted) {\n counts.completed++;\n } else {\n counts.inProgress++;\n }\n });\n \n return counts;\n}\n\n/**\n * 验证实验项目数据\n */\nexport function validateExperiment(experiment: Partial<ExperimentItem>): boolean {\n return !!(\n experiment.id &&\n experiment.title &&\n experiment.description &&\n experiment.path &&\n experiment.category &&\n Array.isArray(experiment.tags)\n );\n}\n\n/**\n * 获取类别显示名称\n */\nexport function getCategoryDisplayName(category: ViewMode): string {\n switch (category) {\n case 'utility':\n return '实用工具';\n case 'leisure':\n return '休闲娱乐';\n case 'all':\n default:\n return '全部';\n }\n}\n\n/**\n * 获取类别颜色\n */\nexport function getCategoryColor(category: ExperimentItem['category']): string {\n switch (category) {\n case 'utility':\n return 'bg-blue-100 text-blue-800 border-blue-200';\n case 'leisure':\n return 'bg-purple-100 text-purple-800 border-purple-200';\n default:\n return 'bg-gray-100 text-gray-800 border-gray-200';\n }\n}\n\n/**\n * 获取完成状态显示名称\n */\nexport function getCompletionFilterDisplayName(filter: CompletionFilter): string {\n switch (filter) {\n case 'completed':\n return '已完成';\n case 'incomplete':\n return '进行中';\n case 'all':\n default:\n return '全部状态';\n }\n}\n\n/**\n * 获取完成状态标签样式\n */\nexport function getCompletionStatusColor(isCompleted?: boolean): string {\n if (isCompleted) {\n return 'bg-green-100 text-green-800 border-green-200';\n }\n return 'bg-yellow-100 text-yellow-800 border-yellow-200';\n}\n\n/**\n * 获取完成状态标签文本\n */\nexport function getCompletionStatusText(isCompleted?: boolean): string {\n return isCompleted ? '已完成' : '进行中';\n}","'use client';\n\nimport React from \"react\";\nimport type { ViewMode } from '../types';\nimport { getCategoryDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CategoryFilterProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n counts: { utility: number; leisure: number };\n className?: string;\n}\n\nexport const CategoryFilter: React.FC<CategoryFilterProps> = ({ \n viewMode, \n onViewModeChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCategoryDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-blue-500',\n shadow: 'shadow-blue-200'\n },\n showCount: false\n },\n {\n value: 'utility' as const,\n label: getCategoryDisplayName('utility'),\n icon: '🔧',\n activeColor: {\n bg: 'bg-green-500',\n shadow: 'shadow-green-200'\n },\n count: counts.utility,\n showCount: true\n },\n {\n value: 'leisure' as const,\n label: getCategoryDisplayName('leisure'),\n icon: '🎮',\n activeColor: {\n bg: 'bg-purple-500',\n shadow: 'shadow-purple-200'\n },\n count: counts.leisure,\n showCount: true\n },\n ];\n\n return (\n <FilterButtonGroup\n label=\"项目类别\"\n value={viewMode}\n options={options}\n onChange={onViewModeChange}\n className={className}\n />\n );\n};\n\nexport default CategoryFilter;\n","'use client';\n\nimport React from \"react\";\nimport type { CompletionFilter } from '../types';\nimport { getCompletionFilterDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CompletionFilterProps {\n completionFilter: CompletionFilter;\n onCompletionFilterChange: (filter: CompletionFilter) => void;\n counts: { all: number; completed: number; inProgress: number };\n className?: string;\n}\n\nexport const CompletionFilterComponent: React.FC<CompletionFilterProps> = ({ \n completionFilter, \n onCompletionFilterChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCompletionFilterDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-slate-500',\n shadow: 'shadow-slate-200'\n },\n count: counts.all,\n showCount: true\n },\n {\n value: 'completed' as const,\n label: getCompletionFilterDisplayName('completed'),\n icon: '✅',\n activeColor: {\n bg: 'bg-emerald-500',\n shadow: 'shadow-emerald-200'\n },\n count: counts.completed,\n showCount: true\n },\n {\n value: 'incomplete' as const,\n label: getCompletionFilterDisplayName('incomplete'),\n icon: '🚧',\n activeColor: {\n bg: 'bg-orange-500',\n shadow: 'shadow-orange-200'\n },\n count: counts.inProgress,\n showCount: true\n }\n ];\n\n return (\n <FilterButtonGroup\n label=\"完成状态\"\n value={completionFilter}\n options={options}\n onChange={onCompletionFilterChange}\n className={className}\n />\n );\n};\n\nexport default CompletionFilterComponent;\n","'use client';\n\nimport React from \"react\";\nimport { BackButton } from '@/components';\n\nexport interface PageHeaderProps {\n counts: { all: number; utility: number; leisure: number; completed: number };\n className?: string;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ counts, className }) => {\n return (\n <div className={className}>\n {/* 顶部导航 */}\n <div className=\"mb-8\">\n <BackButton />\n </div>\n\n {/* 页面标题 */}\n <div className=\"mb-8\">\n <h1 className=\"text-3xl font-bold text-gray-900\">实验田</h1>\n <p className=\"mt-2 text-sm text-gray-600\">\n 在这里,你可以尝试各种实验性的功能和项目\n </p>\n \n {/* 统计信息 */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-gray-500\">\n <span>总计: {counts.all} 个项目</span>\n <span>实用工具: {counts.utility} 个</span>\n <span>休闲娱乐: {counts.leisure} 个</span>\n <span>已完成: {counts.completed} 个</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PageHeader;\n","'use client';\n\nimport React from \"react\";\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { Grid } from '@/components';\nimport type { GridItem, GridColumns, GridGap } from '@/components';\n\n/** 实验项目网格项接口 */\nexport interface ExperimentGridItem extends GridItem {\n title: string;\n description: string;\n path: string;\n tags: string[];\n category: string;\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n}\n\n/** 实验项目网格组件 Props */\nexport interface ExperimentGridProps<T extends ExperimentGridItem> {\n /** 数据项数组 */\n items: T[];\n /** 自定义渲染函数(可选) */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置(可选) */\n columns?: GridColumns;\n /** 间距配置(可选) */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n}\n\n/** 默认的 ExperimentCard 渲染器 */\nfunction defaultExperimentRenderer(item: ExperimentItem) {\n return (\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n );\n}\n\n/** 实验项目网格组件 */\nexport function ExperimentGrid<T extends ExperimentGridItem>({\n items,\n renderItem,\n columns = { sm: 1, md: 2, lg: 3, xl: 4 },\n gap = 'md',\n className = ''\n}: ExperimentGridProps<T>) {\n const itemRenderer = renderItem || ((item: T) => defaultExperimentRenderer(item as any));\n\n return (\n <Grid\n items={items}\n renderItem={itemRenderer}\n columns={columns}\n gap={gap}\n className={className}\n />\n );\n}\n\n/** 为了向后兼容,导出一个专门用于 ExperimentItem 的组件 */\nexport function ExperimentItemGrid({ \n experiments, \n ...props \n}: Omit<ExperimentGridProps<ExperimentItem>, 'items'> & { experiments: ExperimentItem[] }) {\n return <ExperimentGrid<ExperimentItem> items={experiments} {...props} />;\n}\n\nexport default ExperimentGrid;\n","'use client';\n\nimport React from \"react\";\nimport { clsx } from 'clsx';\n\nexport interface EmptyStateProps {\n searchQuery: string;\n onClearSearch: () => void;\n className?: string;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({ searchQuery, onClearSearch, className }) => {\n return (\n <div className={clsx('text-center py-12', className)}>\n <svg \n className=\"mx-auto h-12 w-12 text-gray-400\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384\" \n />\n </svg>\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">没有找到匹配的实验项目</h3>\n <p className=\"mt-1 text-sm text-gray-500\">\n {searchQuery \n ? '尝试调整搜索关键词或筛选条件' \n : '当前分类下暂无实验项目'\n }\n </p>\n {searchQuery && (\n <div className=\"mt-4\">\n <button\n onClick={onClearSearch}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-blue-700 bg-blue-100 hover:bg-blue-200\"\n >\n 清除搜索\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport type { TestFieldConfig } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortControlProps {\n sortBy: TestFieldConfig['sortBy'];\n sortOrder: TestFieldConfig['sortOrder'];\n onSortByChange: (sortBy: TestFieldConfig['sortBy']) => void;\n onSortOrderChange: (sortOrder: TestFieldConfig['sortOrder']) => void;\n}\n\nexport const SortControl: React.FC<SortControlProps> = ({\n sortBy,\n sortOrder,\n onSortByChange,\n onSortOrderChange,\n}) => {\n // 排序方式选项\n const sortOptions: { value: TestFieldConfig['sortBy']; label: string }[] = [\n { value: 'title', label: '名称' },\n { value: 'updatedAt', label: '更新时间' },\n { value: 'createdAt', label: '创建时间' },\n { value: 'category', label: '类别' },\n { value: 'completion', label: '完成状态' },\n ];\n\n return (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100\">\n <div className=\"text-sm font-medium text-gray-700\">排序方式:</div>\n \n <div className=\"flex flex-wrap gap-2\">\n {sortOptions.map((option) => (\n <button\n key={option.value}\n className={clsx('px-3 py-1.5 text-sm rounded-full transition-colors', sortBy === option.value\n ? 'bg-blue-100 text-blue-700 font-medium'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortByChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n \n <div className=\"ml-auto flex items-center\">\n <button\n className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200\"\n onClick={() => onSortOrderChange(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\" />\n </svg>\n <span>升序</span>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>降序</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortControl;\n","'use client';\n\nimport React from 'react';\nimport type { SortMode } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortModeToggleProps {\n sortMode: SortMode;\n onSortModeChange: (mode: SortMode) => void;\n}\n\nexport const SortModeToggle: React.FC<SortModeToggleProps> = ({ sortMode, onSortModeChange }) => {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100\">\n <span className=\"text-sm font-medium text-gray-700\">排序模式:</span>\n \n <div className=\"flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg\">\n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'auto'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('auto')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>自动排序</span>\n </div>\n </button>\n \n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'manual'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('manual')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" />\n </svg>\n <span>手动排序</span>\n </div>\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortModeToggle;\n","'use client';\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortableExperimentItemProps {\n item: ExperimentItem;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n isFirst?: boolean;\n isLast?: boolean;\n}\n\nexport const SortableExperimentItem: React.FC<SortableExperimentItemProps> = ({ \n item, \n onMoveUp, \n onMoveDown,\n isFirst,\n isLast \n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : 1,\n opacity: isDragging ? 0.8 : 1,\n position: 'relative' as const,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"relative group\"\n >\n {/* 拖拽手柄 - 桌面端 */}\n <div\n {...attributes}\n {...listeners}\n className=\"absolute right-2 top-2 w-8 h-8 bg-white/80 hover:bg-white rounded-full flex items-center justify-center shadow-md z-[10]\n hidden sm:flex\n opacity-0 group-hover:opacity-100 transition-opacity\n cursor-grab active:cursor-grabbing\n touch-action-none\" /* 防止触摸设备上的滚动冲突 */\n onClick={(e) => e.stopPropagation()}\n aria-label=\"拖动排序\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8h16M4 16h16\" />\n </svg>\n \n <span className=\"absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity\">\n 拖动排序\n </span>\n </div>\n\n {/* 移动端排序按钮组 */}\n <div className=\"absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-[10]\">\n {/* 向上按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveUp?.();\n }}\n disabled={isFirst}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isFirst ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向上移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isFirst ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* 向下按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveDown?.();\n }}\n disabled={isLast}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isLast ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向下移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isLast ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 实验卡片 */}\n <div className={clsx('transition-all', isDragging ? 'scale-105 shadow-xl' : '')}>\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n </div>\n </div>\n );\n};\n\nexport default SortableExperimentItem;\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\nimport { \n DndContext, \n closestCenter, \n KeyboardSensor, \n PointerSensor, \n useSensor, \n useSensors,\n DragEndEvent,\n TouchSensor\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy\n} from '@dnd-kit/sortable';\nimport { SortableExperimentItem } from './SortableExperimentItem';\n\nexport interface DraggableExperimentGridProps {\n items: ExperimentItem[];\n onOrderChange?: (items: ExperimentItem[]) => void;\n className?: string;\n}\n\nexport const DraggableExperimentGrid: React.FC<DraggableExperimentGridProps> = ({ \n items: initialItems, \n onOrderChange,\n className = '' \n}) => {\n // 本地状态跟踪项目顺序\n const [items, setItems] = useState<ExperimentItem[]>(initialItems);\n const [isDragging, setIsDragging] = useState(false);\n\n // 设置传感器\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 需要拖动8px才激活,避免意外触发\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250, // 触摸需要按住250ms才激活,避免与点击冲突\n tolerance: 5, // 允许的移动容差\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // 处理拖拽开始事件\n function handleDragStart() {\n setIsDragging(true);\n }\n\n // 处理拖拽结束事件\n function handleDragEnd(event: DragEndEvent) {\n setIsDragging(false);\n \n const { active, over } = event;\n \n if (over && active.id !== over.id) {\n setItems((currentItems) => {\n // 找到拖拽项和目标项的索引\n const oldIndex = currentItems.findIndex(item => item.id === active.id);\n const newIndex = currentItems.findIndex(item => item.id === over.id);\n \n // 重新排序项目\n const newItems = arrayMove(currentItems, oldIndex, newIndex);\n \n // 如果提供了回调函数,通知父组件顺序变化\n if (onOrderChange) {\n onOrderChange(newItems);\n }\n \n return newItems;\n });\n }\n }\n\n // 处理向上移动\n const handleMoveUp = (index: number) => {\n if (index > 0) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index - 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 处理向下移动\n const handleMoveDown = (index: number) => {\n if (index < items.length - 1) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index + 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 当初始项目变化时更新本地状态\n React.useEffect(() => {\n setItems(initialItems);\n }, [initialItems]);\n\n return (\n <div className={clsx('relative', className)}>\n <div className=\"mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm\">\n <div className=\"flex items-start sm:items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n <div>\n <p className=\"mb-1\">拖拽卡片可以自定义排序。点击卡片可以访问对应的实验项目。</p>\n <p className=\"text-xs text-blue-600 sm:hidden\">点击卡片右上角的上下箭头按钮调整顺序</p>\n <p className=\"text-xs text-blue-600 hidden sm:block\">长按卡片右上角的拖动图标进行排序</p>\n </div>\n </div>\n </div>\n \n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items.map(item => item.id)}\n strategy={rectSortingStrategy}\n >\n <div className={clsx('grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6', isDragging ? 'cursor-grabbing' : '')}>\n {items.map((item, index) => (\n <SortableExperimentItem \n key={item.id} \n item={item}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n};\n\nexport default DraggableExperimentGrid;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, UseAuthReturn, useAuth } from '@/auth';\nimport { Shield, AlertTriangle } from 'lucide-react';\nimport { ApiError } from '@/universalFile/server';\n\ninterface PermissionGuardProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n apiClient: BaseApiClient;\n}\n\nexport const PermissionGuard: React.FC<PermissionGuardProps> = ({\n apiClient,\n children,\n fallback\n}) => {\n const { user, isLoggedIn } = useAuth(apiClient);\n\n // 检查用户是否有权限(所有登录用户都可以访问实验田)\n const hasPermission = () => {\n if (!isLoggedIn || !user) {\n return false;\n }\n\n // 实验田对所有登录用户开放\n return true;\n };\n\n if (!hasPermission()) {\n return (fallback as any) || (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center\">\n <div className=\"flex items-center justify-center mb-4\">\n <Shield className=\"w-12 h-12 text-red-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n 需要登录\n </h2>\n <p className=\"text-gray-600 mb-4\">\n 请先登录以访问实验田功能。\n </p>\n <div className=\"flex items-center justify-center text-sm text-gray-500 mb-4\">\n <AlertTriangle className=\"w-4 h-4 mr-1\" />\n 实验田对所有注册用户开放\n </div>\n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700\"\n >\n 返回上一页\n </button>\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default PermissionGuard;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, useAuth } from '@/auth';\nimport { LogOut, User, FlaskConical } from 'lucide-react';\n\nexport interface UserInfoBarProps {\n apiClient: BaseApiClient;\n}\n\nexport const UserInfoBar: React.FC<UserInfoBarProps> = ({ apiClient }) => {\n const { user, logout, isLoggedIn } = useAuth(apiClient);\n\n const handleLogout = async () => {\n try {\n await logout();\n // 登出后重定向到首页\n window.location.href = '/';\n } catch (error) {\n console.error('登出失败:', error);\n }\n };\n\n if (!isLoggedIn || !user) {\n return null;\n }\n\n return (\n <div className=\"bg-white border-b border-gray-200 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center space-x-2\">\n <User className=\"w-5 h-5 text-gray-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {user.name || user.email || '用户'}\n </span>\n {user.role && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <div className=\"flex items-center space-x-1 text-sm text-gray-500\">\n <FlaskConical className=\"w-4 h-4\" />\n <span>实验田</span>\n </div>\n \n <button\n onClick={handleLogout}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500\"\n >\n <LogOut className=\"w-4 h-4 mr-1\" />\n 登出\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UserInfoBar;\n"]}
1
+ {"version":3,"sources":["../src/ai/ocr/hooks/useOCR.ts","../src/ai/ocr/components/OCRScanner.tsx","../src/ai/background-removal/hooks/useBackgroundRemoval.ts","../src/ai/background-removal/components/BackgroundRemover.tsx","../src/ai/sentiment-analysis/hooks/useSentimentAnalysis.ts","../src/ai/sentiment-analysis/components/SentimentAnalyzer.tsx","../src/ai/text-generation/hooks/useTextGeneration.ts","../src/ai/text-generation/components/SmartAssistant.tsx","../src/profile/ProfileModal.tsx","../src/profile/internal/BadgeList.tsx","../src/profile/internal/Stat.tsx","../src/profile/internal/StatList.tsx","../src/profile/ProfileButton.tsx","../src/profile/AutoOpenModal.tsx","../src/profile/EnhancedAvatar.tsx","../src/testField/utils/index.ts","../src/testField/components/CategoryFilter.tsx","../src/testField/components/CompletionFilter.tsx","../src/testField/components/PageHeader.tsx","../src/testField/components/ExperimentGrid.tsx","../src/testField/components/EmptyState.tsx","../src/testField/components/SortControl.tsx","../src/testField/components/SortModeToggle.tsx","../src/testField/components/SortableExperimentItem.tsx","../src/testField/components/DraggableExperimentGrid.tsx","../src/testField/components/PermissionGuard.tsx","../src/testField/components/UserInfoBar.tsx"],"names":["useState","useRef","useCallback","createWorker","useEffect","React","clsx","Upload","X","Loader2","FileText","Eraser","Download","Smile","Frown","Meh","MessageSquare","Send","Bot","User","cn","Dialog","DialogContent","Avatar","AvatarImage","AvatarFallback","Badge","Button","FilterButtonGroup","BackButton","ExperimentCard","Grid","useSortable","CSS","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","rectSortingStrategy","useAuth","Shield","AlertTriangle","FlaskConical","LogOut"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,IAAM,MAAA,GAAS,CAAC,OAAA,GAAsB,EAAC,KAAM;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAA,CAAmB;AAAA,IAC3C,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,SAAA,GAAYC,cAAsB,IAAI,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAUC,mBAAY,YAAY;AACtC,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,MAAM,SAAA,CAAU,QAAQ,SAAA,EAAU;AAClC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,kBAAA;AAAA,IAChB,OAAO,KAAA,KAAuE;AAC5E,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,IAAA;AAAA,QACd,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,CAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACV,CAAE,CAAA;AAEF,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAMC,yBAAA,CAAa,OAAA,CAAQ,QAAA,IAAY,OAAO,CAAA,EAAG;AAAA,UAC9D,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,YAAA,IAAI,CAAA,CAAE,WAAW,kBAAA,EAAoB;AACnC,cAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,gBAClB,GAAG,IAAA;AAAA,gBACH,MAAA,EAAQ,aAAA;AAAA,gBACR,UAAU,CAAA,CAAE;AAAA,eACd,CAAE,CAAA;AAAA,YACJ;AACA,YAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,UACpB;AAAA,SACD,CAAA;AAED,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,QAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,UAAU,KAAK,CAAA;AAI7C,QAAA,MAAM,KAAA,GAAS,KAAa,KAAA,IAAS,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,EAAE,UAAA,CAAW,OAAA,CAAQ,OAAK,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAC,CAAC,KAAK,EAAC;AAC7H,QAAA,MAAM,KAAA,GAAS,IAAA,CAAa,KAAA,IAAS,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAC,KAAK,EAAC;AAEvG,QAAA,MAAM,MAAA,GAAoB;AAAA,UACxB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,YAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,MAAM,CAAA,CAAE;AAAA,WACV,CAAE,CAAA;AAAA,UACF,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI;AAAA,SACrC;AAEA,QAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,UAClB,GAAG,IAAA;AAAA,UACH,YAAA,EAAc,KAAA;AAAA,UACd,QAAA,EAAU,CAAA;AAAA,UACV,MAAA,EAAQ,WAAA;AAAA,UACR;AAAA,SACF,CAAE,CAAA;AAEF,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAEpB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,UAClB,GAAG,IAAA;AAAA,UACH,YAAA,EAAc,KAAA;AAAA,UACd,MAAA,EAAQ,OAAA;AAAA,UACR;AAAA,SACF,CAAE,CAAA;AACF,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,SAAA;AAAA,IACA;AAAA,GACF;AACF;AC5FO,IAAM,aAAwC,CAAC;AAAA,EACpD,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW;AACb,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIJ,gBAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,YAAA,GAAeC,cAAyB,IAAI,CAAA;AAElD,EAAA,MAAM,EAAE,WAAW,YAAA,EAAc,QAAA,EAAU,QAAQ,MAAA,EAAQ,KAAA,KAAU,MAAA,CAAO;AAAA,IAC1E;AAAA,GACD,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,OAAO,CAAA,KAA2C;AACzE,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,KAAA,KAAU;AACzB,MAAA,eAAA,CAAgB,KAAA,CAAM,QAAQ,MAAgB,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,IAAI,CAAA;AACtC,MAAA,QAAA,GAAW,UAAU,IAAI,CAAA;AAAA,IAC3B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,cAAc,GAAG,CAAA;AAAA,IACjC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuB;AAC7C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAAuB;AAC/C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC1C,MAAA,MAAM,SAAA,GAAY,EAAE,MAAA,EAAQ,EAAE,OAAO,CAAC,IAAI,GAAE,EAAE;AAC9C,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAWC,SAAA,CAAK,sDAAA,EAAwD,YAAA,GAAe,+BAAA,GAAkC,yCAAyC,SAAS,CAAA;AAAA,MAC3K,UAAA,EAAY,cAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KAAA;AAAA,IAEP,CAAC,YAAA,mBACAD,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oEAAA;AAAA,QACV,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA;AAAM,OAAA;AAAA,sBAE3CA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACE,kBAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CACpB,CAAA;AAAA,sBACAF,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAA,EAAoC,yEAAgB,mBACjEA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAA,EAAwB,6BAAiB,CACxD;AAAA,KACF,mBAEAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,GAAA,EAAI,SAAA;AAAA,QACJ,SAAA,EAAWC,SAAA,CAAK,oDAAA,EAAsD,YAAA,GAAe,eAAe,aAAa;AAAA;AAAA,KACnH,EACC,CAAC,YAAA,oBACAD,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,uBAAAA,CAAA,aAAA,CAACG,aAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA,KACf,EAGD,YAAA,oBACCH,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,uEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACI,mBAAA,EAAA,EAAQ,WAAU,iCAAA,EAAkC,IAAA,EAAM,EAAA,EAAI,CAAA,kBAC/DJ,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gDAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAQ,QAAA,GAAW,MAAO,GAAA;AAAI;AAAA,KAE3C,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EAAA,EACV,MAAA,KAAW,cAAA,GAAiB,4CAAc,qBAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAA,GAAK,GACrF,CACF,CAEJ,GAEC,MAAA,IAAU,CAAC,YAAA,oBACVA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EACbA,uBAAAA,CAAA,aAAA,CAACK,oBAAA,EAAA,EAAS,MAAM,EAAA,EAAI,CAAA,kBACpBL,uBAAAA,CAAA,cAAC,MAAA,EAAA,IAAA,EAAK,gDAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA,EAAE,IAAE,CACpD,mBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qDAAA,EAAA,EACZ,MAAA,CAAO,IACV,CACF,GAGD,KAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,qEAAA,EAAA,EAAsE,4BAAA,EAC5E,KAAA,CAAM,OACf,CAEJ,CAAA;AAAA,oBAGFA,uBAAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,gBAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA;AACZ,GACF;AAEJ;AC9IO,IAAM,oBAAA,GAAuB,CAAC,OAAA,GAAoC,EAAC,KAAM;AAC9E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAAA,CAAiC;AAAA,IACzD,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,MAAA,GAASE,kBAAAA,CAAY,OAAO,KAAA,KAAyD;AACzF,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,MAChB,GAAG,IAAA;AAAA,MACH,YAAA,EAAc,IAAA;AAAA,MACd,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AAEF,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAA,CAAO,IAAA;AAC5B,MAAA,MAAM,GAAA,GAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAS,UAAA;AACtD,MAAA,MAAM,kBAAkB,GAAA,CAAI,OAAA;AAC5B,MAAA,IAAI,iBAAA;AAEJ,MAAA,IAAI;AAEF,QAAC,MAAA,CAAe,IAAA,GAAO,SAAS,GAAA,EAAU;AACxC,UAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,KAAA,CAAA,SAAkB,EAAC;AAC/C,UAAA,OAAO,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA;AAAA,QACtC,CAAA;AAEA,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,cAAA,CAAe,KAAK,SAAA,EAAW;AAAA,cACpC,KAAA,EAAO,EAAE,GAAA,EAAK,EAAC,EAAG,QAAA,EAAU,EAAC,EAAG,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAO,EAAE;AAAA,cAC1D,YAAA,EAAc,IAAA;AAAA,cACd,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH,SAAS,CAAA,EAAG;AAAA,UAAC;AAAA,QACf;AAEA,QAAA,iBAAA,GAAoB,MAAM,OAAO,2BAA2B,CAAA;AAAA,MAC9D,CAAA,SAAE;AACA,QAAA,MAAA,CAAO,IAAA,GAAO,YAAA;AACd,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,eAAA,EAAiB;AACpD,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,cAAA,CAAe,KAAK,SAAA,EAAW;AAAA,cACpC,KAAA,EAAO,eAAA;AAAA,cACP,YAAA,EAAc,IAAA;AAAA,cACd,QAAA,EAAU;AAAA,aACX,CAAA;AAAA,UACH,SAAS,CAAA,EAAG;AAAA,UAAC;AAAA,QACf;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,kBAAiB,GAAI,iBAAA;AAE7B,MAAA,MAAM,MAAA,GAAc;AAAA,QAClB,QAAA,EAAU,CAAC,MAAA,EAAgB,QAAA,KAAqB;AAC9C,UAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,YAChB,GAAG,IAAA;AAAA,YACH,MAAA;AAAA,YACA;AAAA,WACF,CAAE,CAAA;AACF,UAAA,OAAA,CAAQ,QAAA,GAAW,QAAQ,QAAQ,CAAA;AAAA,QACrC,CAAA;AAAA,QACA,KAAA,EAAO,QAAQ,KAAA,IAAS,OAAA;AAAA,QACxB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA;AACjD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAEpC,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,KAAA;AAAA,QACd,QAAA,EAAU,CAAA;AAAA,QACV,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AAEF,MAAA,OAAO,EAAE,MAAM,GAAA,EAAI;AAAA,IACrB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AACjD,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,KAAA;AAAA,QACd,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,IAAI,KAAA,CAAM,GAAG;AAAA,OACtB,CAAE,CAAA;AACF,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,OAAA,GAAUA,mBAAY,MAAM;AAChC,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,GAAA,CAAI,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,SAAS,CAAC,CAAA;AAEpB,EAAAE,iBAAU,MAAM;AACd,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACvB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,MAAA;AAAA,IACA;AAAA,GACF;AACF;AC1GO,IAAM,oBAAsD,CAAC;AAAA,EAClE,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIJ,gBAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,YAAA,GAAeC,cAAyB,IAAI,CAAA;AAElD,EAAA,MAAM,EAAE,QAAQ,YAAA,EAAc,QAAA,EAAU,QAAQ,SAAA,EAAW,KAAA,KAAU,oBAAA,EAAqB;AAE1F,EAAA,MAAM,gBAAA,GAAmB,OAAO,CAAA,KAA2C;AACzE,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,KAAA,KAAU;AACzB,MAAA,eAAA,CAAgB,KAAA,CAAM,QAAQ,MAAgB,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,MAAM,OAAO,IAAI,CAAA;AACvC,MAAA,QAAA,GAAW,MAAM,GAAG,CAAA;AAAA,IACtB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,GAAG,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,SAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,wBAAA;AACb,IAAA,CAAA,CAAE,KAAA,EAAM;AAAA,EACV,CAAA;AAEA,EAAA,uBACEI,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,sDAAA,EAAwD,YAAA,GAAe,mCAAA,GAAsC,2CAA2C,SAAS,CAAA,EAAA,EACnL,CAAC,YAAA,mBACAD,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oEAAA;AAAA,MACV,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA;AAAM,KAAA;AAAA,oBAE3CA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACM,kBAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CACpB,CAAA;AAAA,oBACAN,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAA,EAAoC,kDAAQ,mBACzDA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAA,EAAwB,oEAAW,CAClD;AAAA,GACF,mBAEAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACbA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EAAA,EAA6D,cAAE,CAAA,kBAC5EA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAI,UAAA,EAAW,SAAA,EAAU,iCAAA,EAAkC,CACrF,CACF,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EAAA,EAA6D,0BAAI,CAAA,kBAC9EA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EAAA,EACZ,SAAA,mBACCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI,UAAS,SAAA,EAAU,4EAAA,EAA6E,CAAA,mBAEzHA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,8DAAA,EAAA,EACZ,YAAA,mBACCA,uBAAAA,CAAA,aAAA,CAAAA,wBAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA,CAACI,mBAAAA,EAAA,EAAQ,WAAU,mCAAA,EAAoC,IAAA,EAAM,EAAA,EAAI,CAAA,kBACjEJ,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,kDAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAQ,QAAA,GAAW,MAAO,GAAA;AAAI;AAAA,GAE3C,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EAAA,EAAwC,MAAA,CAAO,OAAA,CAAQ,MAAM,GAAG,CAAE,CACjF,CAAA,mBAEAA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAiB,6BAAO,CAE5C,CAEJ,CACF,CACF,CAAA,kBAEAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wCAAA,EAAA,EACZ,CAAC,YAAA,oBACAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,uBAAAA,CAAA,aAAA,CAACG,aAAAA,EAAA,EAAE,MAAM,EAAA,EAAI,CAAA;AAAA,IAAE;AAAA,GAEjB,EAGD,SAAA,IAAa,CAAC,YAAA,oBACbH,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,cAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,uBAAAA,CAAA,aAAA,CAACO,oBAAA,EAAA,EAAS,MAAM,EAAA,EAAI,CAAA;AAAA,IAAE;AAAA,GAI5B,CAAA,EAEC,KAAA,oBACCP,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EAAA,EAAsE,8BAC5E,KAAA,CAAM,OACf,CAEJ,CAAA,kBAGFA,uBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAU;AAAA;AAAA,GAEd,CAAA;AAEJ;AC1IO,IAAM,oBAAA,GAAuB,CAAC,OAAA,GAA4B,EAAC,KAAM;AACtE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAAA,CAAyB;AAAA,IACjD,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAcC,cAAmB,IAAI,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAUC,kBAAAA,CAAY,OAAO,IAAA,KAAiB;AAClD,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,MAChB,GAAG,IAAA;AAAA,MACH,YAAA,EAAc,IAAA;AAAA,MACd,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AAEF,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA;AAC5B,QAAA,MAAM,GAAA,GAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAS,UAAA;AACtD,QAAA,MAAM,kBAAkB,GAAA,CAAI,OAAA;AAE5B,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI;AACF,UAAC,MAAA,CAAe,IAAA,GAAO,SAAS,GAAA,EAAU;AACxC,YAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,KAAA,CAAA,SAAkB,EAAC;AAC/C,YAAA,OAAO,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA;AAAA,UACtC,CAAA;AACA,UAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,YAAA,IAAI;AACF,cAAA,MAAA,CAAO,cAAA,CAAe,KAAK,SAAA,EAAW;AAAA,gBACpC,OAAO,EAAE,GAAA,EAAK,EAAC,EAAG,QAAA,EAAU,EAAC,EAAG,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,IAAU,QAAA,EAAU,CAAC,OAAY,UAAA,CAAW,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,gBACpG,YAAA,EAAc,IAAA;AAAA,gBACd,QAAA,EAAU;AAAA,eACX,CAAA;AAAA,YACH,SAAS,CAAA,EAAG;AAAA,YAAC;AAAA,UACf;AACA,UAAA,YAAA,GAAe,MAAM,OAAO,sBAAsB,CAAA;AAAA,QACpD,CAAA,SAAE;AACA,UAAA,MAAA,CAAO,IAAA,GAAO,YAAA;AACd,UAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,eAAA,EAAiB;AACpD,YAAA,IAAI;AACF,cAAA,MAAA,CAAO,cAAA,CAAe,GAAA,EAAK,SAAA,EAAW,EAAE,KAAA,EAAO,iBAAiB,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,YACtG,SAAS,CAAA,EAAG;AAAA,YAAC;AAAA,UACf;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAI,GAAI,YAAA;AAC1B,QAAA,GAAA,CAAI,gBAAA,GAAmB,KAAA;AACvB,QAAA,IAAI,GAAA,CAAI,UAAU,IAAA,EAAM;AACtB,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,QACjC;AAEA,QAAA,MAAM,YAAA,GAAe,8DAAA;AAErB,QAAA,WAAA,CAAY,UAAU,MAAM,QAAA,CAAS,oBAAA,EAAsB,OAAA,CAAQ,SAAS,YAAY,CAAA;AAAA,MAC1F;AAEA,MAAA,QAAA,CAAS,WAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,aAAY,CAAE,CAAA;AAEnD,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAE3B,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,WAAA,EAAY;AAC3C,MAAA,IAAI,SAAA,GAAiD,SAAA;AAGrD,MAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,EAAK,QAAA,EAAK,cAAA,EAAM,gBAAM,cAAA,EAAM,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,cAAI,CAAA;AACzE,MAAA,MAAM,qBAAqB,gBAAA,CAAiB,IAAA,CAAK,OAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAEtE,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IAAK,CAAC,kBAAA,EAAoB;AACrD,QAAA,SAAA,GAAY,UAAA;AAAA,MACd,CAAA,MAAA,IAAW,MAAM,QAAA,CAAS,UAAU,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,kBAAA,EAAoB;AAClF,QAAA,SAAA,GAAY,UAAA;AAAA,MACd;AAEA,MAAA,MAAM,MAAA,GAA0B;AAAA,QAC9B,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB;AAAA,OACF;AAEA,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS;AAAA,QAChB,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,KAAA;AAAA,QACd,MAAA,EAAQ,WAAA;AAAA,QACR;AAAA,OACF,CAAE,CAAA;AAEF,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,GAAG,CAAA;AACxC,MAAA,QAAA,CAAS,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,KAAA,CAAM,GAAG,GAAE,CAAE,CAAA;AAC3F,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,KAAK,CAAC,CAAA;AAElB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAC7B;AC7FO,IAAM,oBAAsD,CAAC;AAAA,EAClE,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,gBAAS,EAAE,CAAA;AACnC,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,QAAQ,MAAA,EAAQ,KAAA,KAAU,oBAAA,EAAqB;AAE9E,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,YAAA,EAAc;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAI,CAAA;AAC9B,MAAA,QAAA,GAAW,GAAG,CAAA;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,GAAG,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,QAAQ,OAAO,SAAA;AAAW,MACxB,KAAK,UAAA;AAAY,QAAA,uBAAOK,uBAAAA,CAAA,aAAA,CAACQ,qBAAM,SAAA,EAAU,gBAAA,EAAiB,MAAM,EAAA,EAAI,CAAA;AAAA,MACpE,KAAK,UAAA;AAAY,QAAA,uBAAOR,uBAAAA,CAAA,aAAA,CAACS,qBAAM,SAAA,EAAU,cAAA,EAAe,MAAM,EAAA,EAAI,CAAA;AAAA,MAClE;AAAS,QAAA,uBAAOT,uBAAAA,CAAA,aAAA,CAACU,mBAAI,SAAA,EAAU,iBAAA,EAAkB,MAAM,EAAA,EAAI,CAAA;AAAA;AAC7D,EACF,CAAA;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,IAAA,QAAQ,OAAO,SAAA;AAAW,MACxB,KAAK,UAAA;AAAY,QAAA,OAAO,6CAAA;AAAA,MACxB,KAAK,UAAA;AAAY,QAAA,OAAO,uCAAA;AAAA,MACxB;AAAS,QAAA,OAAO,gDAAA;AAAA;AAClB,EACF,CAAA;AAEA,EAAA,uBACEV,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,UAAK,2DAAA,EAA6D,SAAS,CAAA,EAAA,kBACzFD,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACW,yBAAA,EAAA,EAAc,IAAA,EAAM,IAAI,CAAA,kBACzBX,uBAAAA,CAAA,aAAA,CAAC,cAAK,sCAAM,CACd,CAAA,kBAEAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACvC,WAAA;AAAA,MACA,SAAA,EAAU,uOAAA;AAAA,MACV,QAAA,EAAU;AAAA;AAAA,GACZ,kBACAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,YAAA;AAAA,MAC1B,SAAA,EAAU;AAAA,KAAA;AAAA,IAET,+BAAeA,uBAAAA,CAAA,aAAA,CAACI,mBAAAA,EAAA,EAAQ,SAAA,EAAU,cAAA,EAAe,IAAA,EAAM,EAAA,EAAI,oBAAKJ,uBAAAA,CAAA,aAAA,CAACY,gBAAA,EAAA,EAAK,MAAM,EAAA,EAAI;AAAA,GAErF,CAAA,EAEC,YAAA,oBACCZ,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kEAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACI,qBAAA,EAAQ,IAAA,EAAM,IAAI,SAAA,EAAU,cAAA,EAAe,mBAC5CJ,uBAAAA,CAAA,cAAC,MAAA,EAAA,IAAA,EAAK,kGAAqB,CAC7B,CAAA,EAGD,MAAA,IAAU,CAAC,YAAA,oBACVA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,2FAAA,EAA6F,mBAAmB,CAAA,EAAA,kBACnID,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EAAA,EACZ,kBACH,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,6BACCA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAgC,MAAA,CAAO,SAAU,mBAC9DA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAqB,sBAAA,EAAA,CACzB,MAAA,CAAO,QAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,EAAE,KAAA,EAAI,OAAO,KAAA,EAAM,GACzD,CACF,CACF,CAAA,EAGD,yBACCA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAA2E,4BAAA,EACjF,KAAA,CAAM,OACf,CAEJ,CAAA;AAEJ;AChGO,IAAM,iBAAA,GAAoB,CAAC,OAAA,GAAiC,EAAC,KAAM;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAAA,CAA8B;AAAA,IACtD,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAcC,cAAmB,IAAI,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAWC,kBAAAA,CAAY,OAAO,MAAA,KAAmB;AACrD,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,MAAM,CAAA;AAEjD,IAAA,QAAA,CAAS,CAAC,IAAA,MAA+B;AAAA,MACvC,GAAG,IAAA;AAAA,MACH,YAAA,EAAc,IAAA;AAAA,MACd,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AAEF,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,MAAM,eAAe,MAAA,CAAO,IAAA;AAC5B,QAAA,MAAM,GAAA,GAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAS,UAAA;AACtD,QAAA,MAAM,kBAAkB,GAAA,CAAI,OAAA;AAE5B,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI;AACF,UAAC,MAAA,CAAe,IAAA,GAAO,SAAS,GAAA,EAAU;AACxC,YAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,KAAA,CAAA,SAAkB,EAAC;AAC/C,YAAA,OAAO,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA;AAAA,UACtC,CAAA;AACA,UAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,YAAA,IAAI;AACF,cAAA,MAAA,CAAO,cAAA,CAAe,KAAK,SAAA,EAAW;AAAA,gBACpC,KAAA,EAAO,EAAE,GAAA,EAAK,EAAC,EAAG,UAAU,EAAC,EAAG,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,IAAU,QAAA,EAAU,CAAC,EAAA,KAAY,UAAA,CAAW,EAAA,EAAI,CAAC,GAAG,GAAA,EAAK,MAAM,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK;AAAA,gBACnI,YAAA,EAAc,IAAA;AAAA,gBACd,QAAA,EAAU;AAAA,eACX,CAAA;AAAA,YACH,SAAS,CAAA,EAAG;AAAA,YAAC;AAAA,UACf;AACA,UAAA,YAAA,GAAe,MAAM,OAAO,sBAAsB,CAAA;AAAA,QACpD,CAAA,SAAE;AACA,UAAA,MAAA,CAAO,IAAA,GAAO,YAAA;AACd,UAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,eAAA,EAAiB;AACpD,YAAA,IAAI;AACF,cAAA,MAAA,CAAO,cAAA,CAAe,GAAA,EAAK,SAAA,EAAW,EAAE,KAAA,EAAO,iBAAiB,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,YACtG,SAAS,CAAA,EAAG;AAAA,YAAC;AAAA,UACf;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAI,GAAI,YAAA;AAC1B,QAAA,GAAA,CAAI,gBAAA,GAAmB,KAAA;AACvB,QAAA,IAAI,GAAA,CAAI,UAAU,IAAA,EAAM;AACtB,UAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,QACjC;AAEA,QAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,2BAAA;AACnC,QAAA,WAAA,CAAY,OAAA,GAAU,MAAM,QAAA,CAAS,sBAAA,EAAwB,SAAA,EAAW;AAAA,UACtE,iBAAA,EAAmB,CAAC,IAAA,KAAc;AAChC,YAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAC9B,cAAA,QAAA,CAAS,CAAC,IAAA,MAA+B,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,iBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAK,KAAI,CAAE,CAAA;AAAA,YACtH;AAAA,UACF;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,QAAA,CAAS,CAAC,IAAA,MAA+B,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,YAAW,CAAE,CAAA;AAGzE,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ;AAAA,QAC/C,cAAA,EAAgB,QAAQ,cAAA,IAAkB,EAAA;AAAA,QAC1C,WAAA,EAAa,QAAQ,WAAA,IAAe,GAAA;AAAA;AAAA,QACpC,SAAA,EAAW,IAAA;AAAA;AAAA,QACX,KAAA,EAAO,EAAA;AAAA,QACP,kBAAA,EAAoB;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAE,cAAA,IAAkB,EAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,oBAAoB,MAAM,CAAA;AAEtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAA+B;AAAA,QACvC,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,KAAA;AAAA,QACd,MAAA,EAAQ,WAAA;AAAA,QACR;AAAA,OACF,CAAE,CAAA;AAEF,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,GAAG,CAAA;AAChC,MAAA,QAAA,CAAS,CAAC,IAAA,MAA+B,EAAE,GAAG,MAAM,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,KAAA,CAAM,GAAG,GAAE,CAAE,CAAA;AAClH,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,KAAA,EAAO,QAAQ,cAAA,EAAgB,OAAA,CAAQ,WAAW,CAAC,CAAA;AAE/D,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAS;AAC9B;AC5FO,IAAM,cAAA,GAAgD,CAAC,EAAE,SAAA,GAAY,IAAG,KAAM;AACnF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,gBAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAAA,CAAiE,EAAE,CAAA;AACzG,EAAA,MAAM,SAAA,GAAYC,cAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,cAAc,MAAA,EAAQ,SAAA,KAAc,iBAAA,EAAkB;AAEtF,EAAAG,iBAAU,MAAM;AACd,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,YAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAE9B,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,YAAA,EAAc;AAEnC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,EAAK;AAC/B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,CAAC,CAAA;AAIxE,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,MAAM,YAAA,GAAe,YAAY,WAAA,EAAY;AAE7C,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,cAAI,CAAA,IAAK,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,IAAK,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AAChG,MAAA,YAAA,GAAe,qJAAA;AAAA,IACjB,CAAA,MAAA,IAAW,aAAa,QAAA,CAAS,QAAG,KAAK,YAAA,CAAa,QAAA,CAAS,aAAa,CAAA,EAAG;AAC7E,MAAA,YAAA,GAAe,0OAAA;AAAA,IACjB,CAAA,MAAA,IAAW,YAAA,CAAa,QAAA,CAAS,cAAI,CAAA,EAAG;AACtC,MAAA,YAAA,GAAe,0NAAA;AAAA,IACjB,CAAA,MAAA,IAAW,YAAA,CAAa,QAAA,CAAS,QAAG,CAAA,IAAK,YAAA,CAAa,QAAA,CAAS,cAAI,CAAA,IAAK,YAAA,CAAa,QAAA,CAAS,cAAI,CAAA,EAAG;AACnG,MAAA,YAAA,GAAe,0LAAA;AAAA,IACjB;AAGA,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,YAAA,EAAc,CAAC,CAAA;AAAA,MAChF,GAAG,GAAG,CAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,CAAA;AAAA,mBAAA,EACb,WAAW,CAAA;AAAA,qBAAA,CAAA;AAGb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,MAAM,CAAA;AAGtC,MAAA,IAAI,WAAA,GAAc,QAAA,CACf,OAAA,CAAQ,4CAAA,EAA8C,EAAE,CAAA,CACxD,OAAA,CAAQ,2DAAA,EAA6D,EAAE,CAAA,CACvE,OAAA,CAAQ,gBAAA,EAAkB,EAAE,EAC5B,IAAA,EAAK;AAIR,MAAA,MAAM,cAAA,GAAiB,eAAe,IAAA,CAAK,WAAW,KAAK,CAAC,OAAA,CAAQ,KAAK,WAAW,CAAA;AACpF,MAAA,MAAM,UAAA,GAAa,YAAY,MAAA,GAAS,CAAA;AAExC,MAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,QAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,QAAQ,CAAA;AAChF,QAAA,WAAA,GAAc,oEAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,mFAAA;AAAA,MAC1D;AAEA,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,WAAA,EAAa,CAAC,CAAA;AAAA,IAC/E,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,qGAAA,EAAuB,CAAC,CAAA;AAAA,IACzF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,uIAAA,EAAyI,SAAS,CAAA,EAAA,kBACrKD,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAK,SAAA,EAAW,SAAA,EAAU,4EAC5B,WAAA,CAAY,MAAA,KAAW,CAAA,oBACtBA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0EAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACa,mBAAI,IAAA,EAAM,EAAA,EAAI,WAAU,YAAA,EAAa,CAAA,kBACtCb,uBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,yDAAA,EAAA,EAA0D,+FACjDA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAE,CAAA,EAAE,0HAE3B,CACF,CAAA,EAED,WAAA,CAAY,IAAI,CAAC,GAAA,EAAK,sBACrBA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAG,SAAA,EAAWC,SAAAA,CAAK,QAAQ,GAAA,CAAI,IAAA,KAAS,SAAS,aAAA,GAAgB,eAAA,EAAiB,2CAA2C,CAAA,EAAA,kBACrID,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,UAAK,wBAAA,EAA0B,GAAA,CAAI,SAAS,MAAA,GAAS,kBAAA,GAAqB,EAAE,CAAA,EAAA,kBAC1FD,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,sBAAA,EAAwB,IAAI,IAAA,KAAS,MAAA,GAAS,2BAAA,GAA8B,+FAA+F,CAAA,EAAA,EAC7L,GAAA,CAAI,SAAS,MAAA,mBAASD,wBAAA,aAAA,CAACc,gBAAA,EAAA,EAAK,MAAM,EAAA,EAAI,CAAA,mBAAKd,uBAAAA,CAAA,aAAA,CAACa,mBAAI,IAAA,EAAM,EAAA,EAAI,CAC7D,CAAA,kBACAb,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,SAAAA,CAAK,mCAAA,EAAqC,GAAA,CAAI,SAAS,MAAA,GACjE,wCAAA,GACA,wIAAwI,CAAA,EAAA,EAC3I,GAAA,CAAI,OACP,CACF,CACF,CACD,CAAA,EACA,YAAA,oBACCD,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+HAAA,EAAA,kBACbA,wBAAA,aAAA,CAACI,mBAAAA,EAAA,EAAQ,SAAA,EAAU,4BAAA,EAA6B,MAAM,EAAA,EAAI,CAAA,kBAC1DJ,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,mCAAA,EAAA,EAAoC,uBAAM,CAAA,kBAC1DA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAwD,SAAU,CACpF,CACF,CACF,CAEJ,mBAEAA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,WAAW,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAW,UAAA,EAAW;AAAA,MAClD,WAAA,EAAY,6BAAA;AAAA,MACZ,SAAA,EAAU,iKAAA;AAAA,MACV,QAAA,EAAU;AAAA;AAAA,GACZ,kBACAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,YAAA;AAAA,MAC3B,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,uBAAAA,CAAA,aAAA,CAACY,gBAAAA,EAAA,EAAK,MAAM,EAAA,EAAI;AAAA,GAEpB,CACF,CACF,CAAA;AAEJ;ACpIA,IAAM,WAAA,GAAc;AAAA,EAClB,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,qCAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAmBO,IAAM,eAA4C,CAAC;AAAA,EACxD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,YAAA,GAAe,IAAA;AAAA,EACf,UAAA,GAAa,IAAA;AAAA,EACb,OAAA,GAAU,IAAA;AAAA,EACV,UAAA,GAAa,EAAA;AAAA,EACb,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA,GAAY,OAAA;AAAA,EACZ;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,KAAK,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,IAAA;AAC/D,IAAA,uBACEZ,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAA,EACZ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,EAAkB,KAAA,qBACvCA,uBAAAA,CAAA,aAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,MAAM,IAAA,CAAK,GAAA;AAAA,QACX,SAAA,EAAWe,mBAAA;AAAA,UACT,0GAAA;AAAA,UACA,SAAA,KAAc,SAAS,6CAAA,GAAgD;AAAA,SACzE;AAAA,QACA,OAAO,IAAA,CAAK,IAAA;AAAA,QACZ,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QACJ,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,IAAI,iBAAA,EAAmB;AACrB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,iBAAA,CAAkB,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA;AAAA,UACvC;AAAA,QACF;AAAA,OAAA;AAAA,MAEC,KAAK,IAAA,mBACJf,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,WAAA,EAAA,EAAa,IAAA,CAAK,IAAK,CAAA,mBAEvCA,uBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAAA,EAA6B,KAAK,IAAK;AAAA,KAG5D,CACH,CAAA;AAAA,EAEJ,CAAA;AAGA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACtE,IAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWe,mBAAA;AAAA,MACd,oBAAA;AAAA,MACA,SAAA,KAAc,SAAS,iBAAA,GAAoB;AAAA,KAC7C,EAAA,EACG,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,qBACjDf,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAWe,mBAAA;AAAA,UACT,gEAAA;AAAA,UACA,SAAA,KAAc,SAAS,mBAAA,GAAsB;AAAA,SAC/C;AAAA,QACA,OAAA,EAAS,MAAM,cAAA,IAAkB,cAAA,CAAe,MAAM,KAAK;AAAA,OAAA;AAAA,sBAE3Df,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWe,mBAAA;AAAA,QACf,+BAAA;AAAA,QACA,SAAA,KAAc,SAAS,eAAA,GAAkB;AAAA,OAC3C,EAAA,EAAI,MAAK,GAAC,CAAA;AAAA,sBACVf,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAW,SAAA,KAAc,MAAA,GAAS,eAAA,GAAkB,eAAA,EAAA,EAAkB,KAAM;AAAA,KAErF,CACH,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAACgB,uBAAA,EAAA,EAAO,IAAA,EAAM,QAAQ,YAAA,EAAc,CAAC,IAAA,KAAkB,CAAC,QAAQ,OAAA,EAAQ,EAAA,kBACtEhB,uBAAAA,CAAA,aAAA,CAACiB,kCAAc,SAAA,EAAWF,mBAAA;AAAA,IACxB,6DAAA;AAAA,IACA,WAAA,CAAY,SAAqC,CAAA,IAAK,EAAA;AAAA,IACtD;AAAA,GACF,EAAA,kBACEf,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,KAAA,EAAA,kBACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAA,EACZ,UAAA,oBACCA,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO,EAAE,MAAA,EAAQ,aAAA,GAAgB,YAAY,SAAA;AAAU,KAAA;AAAA,oBAEvDA,uBAAAA,CAAA,aAAA,CAACkB,2BAAO,SAAA,EAAU,sCAAA,EAAuC,OAAO,EAAE,KAAA,EAAO,YAAY,MAAA,EAAQ,UAAA,MAC1F,IAAA,CAAK,MAAA,oBAAUlB,uBAAAA,CAAA,aAAA,CAACmB,gCAAY,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,KAAK,IAAA,EAAM,SAAA,EAAU,gBAAe,CAAA,kBACxFnB,wBAAA,aAAA,CAACoB,+BAAA,EAAA,EAAe,WAAU,SAAA,EAAA,EACvB,IAAA,CAAK,KAAK,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAC7B,CACF;AAAA,GACF,kBAEFpB,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAWe,mBAAA;AAAA,IACb,6BAAA;AAAA,IACA,SAAA,KAAc,SAAS,YAAA,GAAe;AAAA,GACxC,EAAA,EAAI,IAAA,CAAK,IAAK,CAAA,EACb,IAAA,CAAK,yBAASf,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWe,mBAAA;AAAA,IAC7B,cAAA;AAAA,IACA,SAAA,KAAc,SAAS,eAAA,GAAkB;AAAA,OACvC,IAAA,CAAK,KAAM,CAAA,EACd,UAAA,IAAc,mBACjB,CACF,CAAA,EAEC,OAAA,IAAW,KAAK,GAAA,oBACff,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAWe,mBAAA;AAAA,IACd,8BAAA;AAAA,IACA,SAAA,KAAc,SAAS,eAAA,GAAkB;AAAA,GAC3C,EAAA,kBACEf,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,IAAA,EAAG,KAAK,GAAI,CACf,CAAA,EAGD,YAAA,IAAgB,cAAA,EAAe,EAE/B,KAAK,aAAA,oBACJA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UACZ,IAAA,CAAK,aACR,CAEJ,CACF,CACF,CAAA;AAEJ;AAEA,IAAO,oBAAA,GAAQ,YAAA;ACjKR,IAAM,YAAsC,CAAC;AAAA,EAChD,MAAA;AAAA,EACA,SAAA,GAAY;AAChB,CAAA,KAAM;AACF,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AAE3C,EAAA,uBACIA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWe,mBAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA,EAAA,EACpD,OAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAChBf,uBAAAA,CAAA,aAAA;AAAA,IAACqB,sBAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,YAAa,KAAA,CAAM;AAAA,KAAA;AAAA,IAEtD,KAAA,CAAM,wBAAQrB,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAA,EAAQ,KAAA,CAAM,IAAK,CAAA;AAAA,IACjD,KAAA,CAAM;AAAA,GAEZ,CACL,CAAA;AAER,CAAA;;;ACtBO,IAAM,OAA4B,CAAC;AAAA,EACxC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWe,mBAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA,EAAA,EAC1E,IAAA,oBAAQ,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAAA,EAA+B,IAAK,CAAA,kBAC7D,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACC,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAA,EAAuC,KAAM,CAAA,kBAC5D,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAAA,EAA8B,KAAM,CACrD,CACF,CAAA;AAEJ,CAAA;;;ACbO,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzC,EAAA,2CACG,KAAA,EAAA,EAAI,SAAA,EAAWA,oBAAG,yDAAA,EAA2D,SAAS,KACpF,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,yCACf,IAAA,EAAA,EAAK,GAAA,EAAK,OAAQ,GAAG,IAAA,EAAM,CAC7B,CACH,CAAA;AAEJ,CAAA;;;ACZA,IAAM,kBAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,cAAA;AAAA,EACN,MAAA,EAAQ,gDAAA;AAAA,EACR,KAAA,EAAO,4CAAA;AAAA,EACP,GAAA,EAAK,2NAAA;AAAA,EACL,QAAA,EAAU;AAAA,IACR,cAAA,EAAM,sBAAA;AAAA,IACN,cAAA,EAAM,eAAA;AAAA,IACN,cAAA,EAAM;AAAA,GACR;AAAA,EACA,WAAA,EAAa;AAAA,IACX,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,6BAAA,EAA+B,MAAM,QAAA,EAAI;AAAA,IAChE,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,8BAAA,EAAgC,MAAM,QAAA,EAAI;AAAA,IAClE,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,kCAAA,EAAoC,MAAM,QAAA;AAAI,GACzE;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,IAClC,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,IACpC,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,MAAA,EAAO;AAAA,IACpC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;AAAU,GAClC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,KAAA,EAAO,cAAA,EAAM,KAAA,EAAO,EAAA,EAAG;AAAA,IACzB,EAAE,KAAA,EAAO,cAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IAC3B,EAAE,KAAA,EAAO,cAAA,EAAM,KAAA,EAAO,KAAA;AAAM,GAC9B;AAAA,EACA,aAAA,kBACEf,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,4BAAA,EAAA,EAA6B,0BAAI,mBAC/CA,uBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAA,EAAwC,mUAGrD,CACF;AAEJ,CAAA;AAcO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,IAAA,GAAO,kBAAA;AAAA,EACP,UAAA,GAAa,sCAAA;AAAA,EACb,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA,GAAa;AACf,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIL,gBAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,KAAK,CAAA;AAE7C,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAkB;AAC1D,IAAA,IAAI,SAAS,cAAA,EAAM;AACjB,MAAA,MAAA,CAAO,IAAA,CAAK,YAAa,KAAM,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,SAAS,cAAA,EAAM;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,SAAU,KAAM,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,uBACEK,uBAAAA,CAAA,aAAA,CAAAA,uBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA;AAAA,IAACsB,uBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT;AAAA,KAAA;AAAA,IAEC;AAAA,GACH,kBAEAtB,uBAAAA,CAAA,aAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,IAAA;AAAA,MACA,SAAA,EAAW,UAAA;AAAA,MACX,cAAA,EAAgB,kBAAA;AAAA,MAChB,mBAAmB,CAAC,GAAA,KAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ;AAAA,KAAA;AAAA,IAEpD,IAAA,CAAK,aAAA;AAAA,IACL,IAAA,CAAK,0BAAUA,uBAAAA,CAAA,cAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,EAAQ,CAAA;AAAA,IAC/C,IAAA,CAAK,yBAASA,uBAAAA,CAAA,cAAC,QAAA,EAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAO;AAAA,GAEhD,CAAA;AAEJ;ACtFO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,IAAA;AAAA,EACA,KAAA,GAAQ,GAAA;AAAA;AAAA,EACR,SAAA,GAAY,OAAA;AAAA,EACZ;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIL,gBAAS,KAAK,CAAA;AAGpD,EAAAI,iBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB,GAAG,KAAK,CAAA;AAER,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAkB;AAC1D,IAAA,IAAI,SAAS,cAAA,EAAM;AACjB,MAAA,MAAA,CAAO,IAAA,CAAK,YAAa,KAAM,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,SAAS,cAAA,EAAM;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,SAAU,KAAM,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,uBAAAA,CAAA,aAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,WAAA;AAAA,MACT,IAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA,EAAgB,kBAAA;AAAA,MAChB,mBAAmB,CAAC,GAAA,KAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ;AAAA,KAAA;AAAA,IAEpD,IAAA,CAAK,0BAAUA,uBAAAA,CAAA,cAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,EAAQ,CAAA;AAAA,IAC/C,IAAA,CAAK,yBAASA,uBAAAA,CAAA,cAAC,QAAA,EAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAO;AAAA,GAC9C;AAEJ;AChDA,IAAM,OAAA,GAAU;AAAA,EACd,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,IAAA,GAAO,QAAA;AAAA,EACP,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,YAAY,OAAO,IAAA,KAAS,QAAA,GAAW,OAAA,CAAQ,IAAI,CAAA,GAAI,EAAA;AAC7D,EAAA,MAAM,eAAA,GAAkB,OAAO,IAAA,KAAS,QAAA,GAAW,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,GAAI,EAAC;AAEpF,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWe,oBAAG,uBAAA,EAAyB,SAAS,CAAA,EAAG,OAAA,EAAA,kBACtDf,uBAAAA,CAAA,cAACkB,uBAAA,EAAA,EAAO,SAAA,EAAWH,mBAAA,CAAG,SAAA,EAAW,OAAA,IAAW,gEAAgE,GAAG,KAAA,EAAO,eAAA,EAAA,EACnH,GAAA,oBAAOf,uBAAAA,CAAA,aAAA,CAACmB,gCAAY,GAAA,EAAU,GAAA,EAAK,IAAA,IAAQ,QAAA,EAAU,SAAA,EAAU,cAAA,EAAe,mBAC/EnB,uBAAAA,CAAA,aAAA,CAACoB,+BAAA,EAAA,EAAe,SAAA,EAAU,uCAAA,EAAA,EACvB,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAC/C,CACF,CAAA,EAEC,IAAA,oBACCpB,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWe,mBAAA;AAAA,QACT,8DAAA;AAAA,QACA,WAAW,IAAI,CAAA;AAAA,QACf,OAAO,SAAS,QAAA,GAAY,IAAA,GAAO,KAAK,SAAA,GAAY,SAAA,GAAc,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY;AAAA;AACnG;AAAA,KAIH,UAAA,oBACCf,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0EAAA,EAAA,kBACbA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAA,EAAiC,UAAW,CAC9D,CAEJ,CAAA;AAEJ;;;ACzDO,SAAS,iBAAA,CACd,aACA,MAAA,EACkB;AAClB,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,EAAA;AAAA,IACd,gBAAA,GAAmB;AAAA,GACrB,GAAI,MAAA;AAEJ,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,UAAA,KAAc;AAEtC,IAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,KAAA,IAAS,UAAA,CAAW,QAAA,KAAa,QAAA;AAGtE,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AACtC,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,IACrB,UAAA,CAAW,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IAC7C,UAAA,CAAW,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,KAAK,CAAA,IACnD,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AAG/D,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,QAAQ,gBAAA;AAAkB,QACxB,KAAK,WAAA;AACH,UAAA,OAAO,WAAW,WAAA,KAAgB,IAAA;AAAA,QACpC,KAAK,YAAA;AACH,UAAA,OAAO,WAAW,WAAA,KAAgB,IAAA;AAAA,QACpC,KAAK,KAAA;AAAA,QACL;AACE,UAAA,OAAO,IAAA;AAAA;AACX,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,mBAAmB,aAAA,IAAiB,iBAAA;AAAA,EAC7C,CAAC,CAAA;AACH;AAKO,SAAS,eAAA,CACd,WAAA,EACA,MAAA,GAAoC,OAAA,EACpC,YAA0C,KAAA,EACxB;AAClB,EAAA,OAAO,CAAC,GAAG,WAAW,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACrC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA;AACH,QAAA,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,UAAA,GAAa,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,YAAA;AAEH,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,WAAA,GAAc,CAAA,GAAI,CAAA;AACvC,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,WAAA,GAAc,CAAA,GAAI,CAAA;AACvC,QAAA,UAAA,GAAa,UAAA,GAAa,UAAA;AAC1B,QAAA;AAAA,MACF,KAAK,WAAA;AAEH,QAAA,IAAI,CAAC,CAAA,CAAE,SAAA,IAAa,CAAC,EAAE,SAAA,EAAW;AAChC,UAAA,UAAA,GAAa,CAAA;AAAA,QACf,CAAA,MAAA,IAAW,CAAC,CAAA,CAAE,SAAA,EAAW;AACvB,UAAA,UAAA,GAAa,CAAA;AAAA,QACf,CAAA,MAAA,IAAW,CAAC,CAAA,CAAE,SAAA,EAAW;AACvB,UAAA,UAAA,GAAa,EAAA;AAAA,QACf,CAAA,MAAO;AAEL,UAAA,UAAA,GAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,QAC/E;AACA,QAAA;AAAA,MACF,KAAK,WAAA;AAEH,QAAA,IAAI,CAAC,CAAA,CAAE,SAAA,IAAa,CAAC,EAAE,SAAA,EAAW;AAChC,UAAA,UAAA,GAAa,CAAA;AAAA,QACf,CAAA,MAAA,IAAW,CAAC,CAAA,CAAE,SAAA,EAAW;AACvB,UAAA,UAAA,GAAa,CAAA;AAAA,QACf,CAAA,MAAA,IAAW,CAAC,CAAA,CAAE,SAAA,EAAW;AACvB,UAAA,UAAA,GAAa,EAAA;AAAA,QACf,CAAA,MAAO;AAEL,UAAA,UAAA,GAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,QAC/E;AACA,QAAA;AAAA,MACF;AACE,QAAA,UAAA,GAAa,CAAA;AAAA;AAIjB,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,UAAA,GAAa,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,UAAA,GAAa,CAAC,UAAA;AAAA,EAC7C,CAAC,CAAA;AACH;AAKO,SAAS,WAAW,WAAA,EAAyC;AAClE,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,CAAA,UAAA,KAAc,WAAW,IAAI,CAAA;AACjE,EAAA,OAAO,MAAM,IAAA,CAAK,IAAI,IAAI,OAAO,CAAC,EAAE,IAAA,EAAK;AAC3C;AAKO,SAAS,oBAAoB,WAAA,EAA+B;AACjE,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,KAAK,WAAA,CAAY,MAAA;AAAA,IACjB,OAAA,EAAS,CAAA;AAAA,IACT,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,WAAA,CAAY,QAAQ,CAAA,UAAA,KAAc;AAChC,IAAA,IAAI,UAAA,CAAW,aAAa,SAAA,EAAW;AACrC,MAAA,MAAA,CAAO,OAAA,EAAA;AAAA,IACT,CAAA,MAAA,IAAW,UAAA,CAAW,QAAA,KAAa,SAAA,EAAW;AAC5C,MAAA,MAAA,CAAO,OAAA,EAAA;AAAA,IACT;AAEA,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAA,CAAO,SAAA,EAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,UAAA,EAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,mBAAmB,UAAA,EAA8C;AAC/E,EAAA,OAAO,CAAC,EACN,UAAA,CAAW,EAAA,IACX,WAAW,KAAA,IACX,UAAA,CAAW,WAAA,IACX,UAAA,CAAW,QACX,UAAA,CAAW,QAAA,IACX,KAAA,CAAM,OAAA,CAAQ,WAAW,IAAI,CAAA,CAAA;AAEjC;AAKO,SAAS,uBAAuB,QAAA,EAA4B;AACjE,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,SAAA;AACH,MAAA,OAAO,0BAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,0BAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,cAAA;AAAA;AAEb;AAKO,SAAS,iBAAiB,QAAA,EAA8C;AAC7E,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,SAAA;AACH,MAAA,OAAO,2CAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,iDAAA;AAAA,IACT;AACE,MAAA,OAAO,2CAAA;AAAA;AAEb;AAKO,SAAS,+BAA+B,MAAA,EAAkC;AAC/E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,0BAAA;AAAA;AAEb;AAKO,SAAS,yBAAyB,WAAA,EAA+B;AACtE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,8CAAA;AAAA,EACT;AACA,EAAA,OAAO,iDAAA;AACT;AAKO,SAAS,wBAAwB,WAAA,EAA+B;AACrE,EAAA,OAAO,cAAc,oBAAA,GAAQ,oBAAA;AAC/B;;;AC9MO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd;AAAA,MACE,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,uBAAuB,KAAK,CAAA;AAAA,MACnC,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,aAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,uBAAuB,SAAS,CAAA;AAAA,MACvC,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,cAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAO,MAAA,CAAO,OAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,uBAAuB,SAAS,CAAA;AAAA,MACvC,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,eAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAO,MAAA,CAAO,OAAA;AAAA,MACd,SAAA,EAAW;AAAA;AACb,GACF;AAEA,EAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,IAACuB,kCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,0BAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA;AAAA,MACA,QAAA,EAAU,gBAAA;AAAA,MACV;AAAA;AAAA,GACF;AAEJ;AClDO,IAAM,4BAA6D,CAAC;AAAA,EACzE,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd;AAAA,MACE,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,+BAA+B,KAAK,CAAA;AAAA,MAC3C,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,cAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAO,MAAA,CAAO,GAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,+BAA+B,WAAW,CAAA;AAAA,MACjD,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,gBAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO,+BAA+B,YAAY,CAAA;AAAA,MAClD,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa;AAAA,QACX,EAAA,EAAI,eAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAO,MAAA,CAAO,UAAA;AAAA,MACd,SAAA,EAAW;AAAA;AACb,GACF;AAEA,EAAA,uBACEvB,uBAAAA,CAAA,aAAA;AAAA,IAACuB,kCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,0BAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,OAAA;AAAA,MACA,QAAA,EAAU,wBAAA;AAAA,MACV;AAAA;AAAA,GACF;AAEJ;ACvDO,IAAM,UAAA,GAAwC,CAAC,EAAE,MAAA,EAAQ,WAAU,KAAM;AAC9E,EAAA,uBACEvB,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAA,kBAEHA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,uBAAAA,CAAA,cAACwB,2BAAA,EAAA,IAAW,CACd,mBAGAxB,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,kCAAA,EAAA,EAAmC,oBAAG,CAAA,kBACpDA,wBAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,4BAAA,EAAA,EAA6B,0HAE1C,mBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,cAAK,gBAAA,EAAK,MAAA,CAAO,GAAA,EAAI,qBAAI,mBAC1BA,uBAAAA,CAAA,cAAC,MAAA,EAAA,IAAA,EAAK,4BAAA,EAAO,OAAO,OAAA,EAAQ,SAAE,CAAA,kBAC9BA,wBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,8BAAO,MAAA,CAAO,OAAA,EAAQ,SAAE,CAAA,kBAC9BA,uBAAAA,CAAA,aAAA,CAAC,cAAK,sBAAA,EAAM,MAAA,CAAO,WAAU,SAAE,CACjC,CACF,CACF,CAAA;AAEJ;ACAA,SAAS,0BAA0B,IAAA,EAAsB;AACvD,EAAA,uBACEA,uBAAAA,CAAA,aAAA;AAAA,IAACyB,+BAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA;AAAA,GAClB;AAEJ;AAGO,SAAS,cAAA,CAA6C;AAAA,EAC3D,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE;AAAA,EACvC,GAAA,GAAM,IAAA;AAAA,EACN,SAAA,GAAY;AACd,CAAA,EAA2B;AACzB,EAAA,MAAM,YAAA,GAAe,UAAA,KAAe,CAAC,IAAA,KAAY,0BAA0B,IAAW,CAAA,CAAA;AAEtF,EAAA,uBACEzB,uBAAAA,CAAA,aAAA;AAAA,IAAC0B,qBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAGO,SAAS,kBAAA,CAAmB;AAAA,EACjC,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2F;AACzF,EAAA,uBAAO1B,uBAAAA,CAAA,aAAA,CAAC,kBAA+B,KAAA,EAAO,WAAA,EAAc,GAAG,KAAA,EAAO,CAAA;AACxE;AClEO,IAAM,aAAwC,CAAC,EAAE,WAAA,EAAa,aAAA,EAAe,WAAU,KAAM;AAClG,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,UAAK,mBAAA,EAAqB,SAAS,CAAA,EAAA,kBACjDD,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAQ;AAAA,KAAA;AAAA,oBAERA,uBAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QACf,WAAA,EAAa,CAAA;AAAA,QACb,CAAA,EAAE;AAAA;AAAA;AACJ,GACF,kBACAA,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wCAAA,EAAA,EAAyC,oEAAW,CAAA,kBAClEA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAAA,EACV,WAAA,GACG,sFAAA,GACA,oEAEN,CAAA,EACC,WAAA,oBACCA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,aAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,IACX;AAAA,GAGH,CAEJ,CAAA;AAEJ;ACjCO,IAAM,cAA0C,CAAC;AAAA,EACtD,MAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,WAAA,GAAqE;AAAA,IACzE,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,cAAA,EAAK;AAAA,IAC9B,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,0BAAA,EAAO;AAAA,IACpC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,0BAAA,EAAO;AAAA,IACpC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAK;AAAA,IACjC,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,0BAAA;AAAO,GACvC;AAEA,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mJACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,EAAoC,gCAAK,CAAA,kBAExDA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAA,EACZ,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,qBAChBA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAK,MAAA,CAAO,KAAA;AAAA,MACZ,WAAWC,SAAAA,CAAK,oDAAA,EAAsD,WAAW,MAAA,CAAO,KAAA,GAClF,0CACA,6CAA6C,CAAA;AAAA,MACnD,OAAA,EAAS,MAAM,cAAA,CAAe,MAAA,CAAO,KAAK;AAAA,KAAA;AAAA,IAEzC,MAAA,CAAO;AAAA,GAEX,CACH,CAAA,kBAEAD,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,wFAAA;AAAA,MACV,SAAS,MAAM,iBAAA,CAAkB,SAAA,KAAc,KAAA,GAAQ,SAAS,KAAK;AAAA,KAAA;AAAA,IAEpE,cAAc,KAAA,mBACbA,uBAAAA,CAAA,aAAA,CAAAA,wBAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,WAAU,SAAA,EAAU,IAAA,EAAK,QAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACjGA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,GAAE,8CAAA,EAA+C,CACtH,mBACAA,uBAAAA,CAAA,cAAC,MAAA,EAAA,IAAA,EAAK,cAAE,CACV,CAAA,mBAEAA,uBAAAA,CAAA,aAAA,CAAAA,uBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAA,kBACjGA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,8CAAA,EAA+C,CACtH,CAAA,kBACAA,wBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,cAAE,CACV;AAAA,GAGN,CACF,CAAA;AAEJ;AC3DO,IAAM,cAAA,GAAgD,CAAC,EAAE,QAAA,EAAU,kBAAiB,KAAM;AAC/F,EAAA,uBACEA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0GAAA,EAAA,kBACbA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mCAAA,EAAA,EAAoC,gCAAK,mBAEzDA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAWC,SAAAA,CAAK,yEAAA,EAA2E,QAAA,KAAa,MAAA,GAClG,iDACA,iCAAiC,CAAA;AAAA,MACvC,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAM;AAAA,KAAA;AAAA,oBAEtCD,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACjGA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,8CAAA,EAA+C,CACtH,CAAA,kBACAA,wBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,0BAAI,CACZ;AAAA,GACF,kBAEAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAWC,SAAAA,CAAK,yEAAA,EAA2E,QAAA,KAAa,QAAA,GAClG,iDACA,iCAAiC,CAAA;AAAA,MACvC,OAAA,EAAS,MAAM,gBAAA,CAAiB,QAAQ;AAAA,KAAA;AAAA,oBAExCD,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACjGA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,0KAAA,EAA2K,CAClP,CAAA,kBACAA,wBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,0BAAI,CACZ;AAAA,GAEJ,CACF,CAAA;AAEJ;AC9BO,IAAM,yBAAgE,CAAC;AAAA,EAC5E,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE2B,oBAAA,CAAY,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,SAAA,EAAWC,aAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,UAAA;AAAA,IACA,MAAA,EAAQ,aAAa,GAAA,GAAM,CAAA;AAAA,IAC3B,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,IAC5B,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,uBACE5B,uBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACA,SAAA,EAAU;AAAA,KAAA;AAAA,oBAGVA,uBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,UAAA;AAAA,QACH,GAAG,SAAA;AAAA,QACJ,SAAA,EAAU,+TAAA;AAAA,QAKV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAClC,YAAA,EAAW;AAAA,OAAA;AAAA,sBAEXA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,SAAA,EAAU,uBAAA,EAAwB,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,kCAC/GA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,iBAAA,EAAkB,CACzF,CAAA;AAAA,sBAEAA,uBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wLAAqL,0BAErM;AAAA,KACF;AAAA,oBAGAA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6DAAA,EAAA,kBAEbA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,IAAW;AAAA,QACb,CAAA;AAAA,QACA,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAWC,SAAAA,CAAK,iEAAA,EAAmE,OAAA,GAAU,mCAAmC,+CAA+C,CAAA;AAAA,QAC/K,YAAA,EAAW;AAAA,OAAA;AAAA,sBAEXD,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,SAAA,EAAWC,SAAAA,CAAK,SAAA,EAAW,OAAA,GAAU,eAAA,GAAkB,eAAe,GAAG,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACtJD,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,iBAAgB,CACvF;AAAA,KACF,kBAGAA,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,UAAA,IAAa;AAAA,QACf,CAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAWC,SAAAA,CAAK,iEAAA,EAAmE,MAAA,GAAS,mCAAmC,+CAA+C,CAAA;AAAA,QAC9K,YAAA,EAAW;AAAA,OAAA;AAAA,sBAEXD,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,SAAA,EAAWC,SAAAA,CAAK,SAAA,EAAW,MAAA,GAAS,eAAA,GAAkB,eAAe,GAAG,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAA,kBACrJD,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,kBAAiB,CACxF;AAAA,KAEJ,CAAA;AAAA,oBAGAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,SAAAA,CAAK,gBAAA,EAAkB,UAAA,GAAa,qBAAA,GAAwB,EAAE,CAAA,EAAA,kBAC5ED,uBAAAA,CAAA,aAAA;AAAA,MAACyB,+BAAA;AAAA,MAAA;AAAA,QACC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK;AAAA;AAAA,KAEpB;AAAA,GACF;AAEJ;;;ACvFO,IAAM,0BAAkE,CAAC;AAAA,EAC9E,KAAA,EAAO,YAAA;AAAA,EACP,aAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI9B,gBAA2B,YAAY,CAAA;AACjE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAGlD,EAAA,MAAM,OAAA,GAAUkC,eAAA;AAAA,IACdC,eAAUC,kBAAA,EAAe;AAAA,MACvB,oBAAA,EAAsB;AAAA,QACpB,QAAA,EAAU;AAAA;AAAA;AACZ,KACD,CAAA;AAAA,IACDD,eAAUE,gBAAA,EAAa;AAAA,MACrB,oBAAA,EAAsB;AAAA,QACpB,KAAA,EAAO,GAAA;AAAA;AAAA,QACP,SAAA,EAAW;AAAA;AAAA;AACb,KACD,CAAA;AAAA,IACDF,eAAUG,mBAAA,EAAgB;AAAA,MACxB,gBAAA,EAAkBC;AAAA,KACnB;AAAA,GACH;AAGA,EAAA,SAAS,eAAA,GAAkB;AACzB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB;AAGA,EAAA,SAAS,cAAc,KAAA,EAAqB;AAC1C,IAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AAEzB,IAAA,IAAI,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,EAAA,EAAI;AACjC,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AAEzB,QAAA,MAAM,WAAW,YAAA,CAAa,SAAA,CAAU,UAAQ,IAAA,CAAK,EAAA,KAAO,OAAO,EAAE,CAAA;AACrE,QAAA,MAAM,WAAW,YAAA,CAAa,SAAA,CAAU,UAAQ,IAAA,CAAK,EAAA,KAAO,KAAK,EAAE,CAAA;AAGnE,QAAA,MAAM,QAAA,GAAWC,kBAAA,CAAU,YAAA,EAAc,QAAA,EAAU,QAAQ,CAAA;AAG3D,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,QACxB;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAkB;AACtC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,QAAA,MAAM,QAAA,GAAWA,kBAAA,CAAU,YAAA,EAAc,KAAA,EAAO,QAAQ,CAAC,CAAA;AACzD,QAAA,aAAA,GAAgB,QAAQ,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,QAAA,MAAM,QAAA,GAAWA,kBAAA,CAAU,YAAA,EAAc,KAAA,EAAO,QAAQ,CAAC,CAAA;AACzD,QAAA,aAAA,GAAgB,QAAQ,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAGA,EAAAnC,uBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,QAAA,CAAS,YAAY,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,uBACEA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,UAAK,UAAA,EAAY,SAAS,CAAA,EAAA,kBACxCD,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,SAAA,EAAU,2CAAA,EAA4C,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EAAA,kBACrHA,uBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAAE,oIAAmI,QAAA,EAAS,SAAA,EAAU,CACnL,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACCA,wBAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,MAAA,EAAA,EAAO,0KAA4B,CAAA,kBAChDA,uBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EAAA,EAAkC,8GAAkB,CAAA,kBACjEA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAwC,kGAAgB,CACvE,CACF,CACF,CAAA,kBAEAA,uBAAAA,CAAA,aAAA;AAAA,IAACoC,eAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,kBAAA,EAAoBC,kBAAA;AAAA,MACpB,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW;AAAA,KAAA;AAAA,oBAEXrC,uBAAAA,CAAA,aAAA;AAAA,MAACsC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,EAAE,CAAA;AAAA,QAChC,QAAA,EAAUC;AAAA,OAAA;AAAA,sBAEVvC,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,UAAK,8EAAA,EAAgF,UAAA,GAAa,iBAAA,GAAoB,EAAE,KACrI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBD,uBAAAA,CAAA,aAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,KAAK,IAAA,CAAK,EAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA,EAAU,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,UAClC,UAAA,EAAY,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,UACtC,SAAS,KAAA,KAAU,CAAA;AAAA,UACnB,MAAA,EAAQ,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS;AAAA;AAAA,OAEpC,CACH;AAAA;AACF,GAEJ,CAAA;AAEJ;AC7IO,IAAM,kBAAkD,CAAC;AAAA,EAC9D,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAIwC,yBAAQ,SAAS,CAAA;AAG9C,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,EAAM;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,CAAC,eAAc,EAAG;AACpB,IAAA,OAAQ,QAAA,oBACNxC,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAACyC,kBAAA,EAAA,EAAO,SAAA,EAAU,wBAAA,EAAyB,CAC7C,CAAA,kBACAzC,uBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAAA,EAA2C,0BAEzD,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAA,EAAqB,gFAElC,CAAA,kBACAA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC0C,yBAAA,EAAA,EAAc,SAAA,EAAU,cAAA,EAAe,CAAA,EAAE,0EAE5C,CAAA,kBACA1C,uBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK;AAAA,QACnC,SAAA,EAAU;AAAA,OAAA;AAAA,MACX;AAAA,KAGH,CACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOA,uBAAAA,CAAA,aAAA,CAAAA,uBAAAA,CAAA,gBAAG,QAAS,CAAA;AACrB;ACjDO,IAAM,WAAA,GAA0C,CAAC,EAAE,SAAA,EAAU,KAAM;AACxE,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW,GAAIwC,yBAAQ,SAAS,CAAA;AAEtD,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AAEb,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,GAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAAS,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACExC,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,uBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACbA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EAAA,kBACbA,wBAAA,aAAA,CAACc,gBAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,CAAA,kBACxCd,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mCAAA,EAAA,EACb,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,IAAS,cAC9B,CAAA,EACC,KAAK,IAAA,oBACJA,wBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iGAAA,EAAA,EACb,IAAA,CAAK,IACR,CAEJ,CACF,CAAA,kBAEAA,wBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EAAA,kBACbA,uBAAAA,CAAA,aAAA,CAAC2C,4BAAa,SAAA,EAAU,SAAA,EAAU,CAAA,kBAClC3C,wBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,oBAAG,CACX,CAAA,kBAEAA,uBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,YAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,uBAAAA,CAAA,aAAA,CAAC4C,kBAAA,EAAA,EAAO,WAAU,cAAA,EAAe,CAAA;AAAA,IAAE;AAAA,GAGvC,CACF,CACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\nimport { createWorker, Worker } from 'tesseract.js';\nimport { OCRResult, OCROptions, OCRState } from '../types';\n\nexport const useOCR = (options: OCROptions = {}) => {\n const [state, setState] = useState<OCRState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const workerRef = useRef<Worker | null>(null);\n\n const cleanup = useCallback(async () => {\n if (workerRef.current) {\n await workerRef.current.terminate();\n workerRef.current = null;\n }\n }, []);\n\n const recognize = useCallback(\n async (image: string | File | Blob | HTMLImageElement | HTMLCanvasElement) => {\n setState((prev) => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const worker = await createWorker(options.language || 'eng', 1, {\n logger: (m) => {\n if (m.status === 'recognizing text') {\n setState((prev) => ({\n ...prev,\n status: 'recognizing',\n progress: m.progress,\n }));\n }\n options.logger?.(m);\n },\n });\n\n workerRef.current = worker;\n\n const { data } = await worker.recognize(image);\n\n // In some versions of tesseract.js, words and lines are not directly on data\n // We extract them from blocks if needed\n const words = (data as any).words || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines.flatMap(l => l.words))) || [];\n const lines = (data as any).lines || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines)) || [];\n\n const result: OCRResult = {\n text: data.text,\n confidence: data.confidence,\n words: words.map((w: any) => ({\n text: w.text,\n confidence: w.confidence,\n bbox: w.bbox,\n })),\n lines: lines.map((l: any) => l.text),\n };\n\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n result,\n }));\n\n await worker.terminate();\n workerRef.current = null;\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error,\n }));\n throw error;\n }\n },\n [options]\n );\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n ...state,\n recognize,\n cleanup,\n };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState, useRef } from 'react';\nimport { useOCR } from '../hooks/useOCR';\nimport { Loader2, Upload, FileText, Image as ImageIcon, X } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface OCRScannerProps {\n onResult?: (text: string) => void;\n className?: string;\n language?: string;\n}\n\nexport const OCRScanner: React.FC<OCRScannerProps> = ({\n onResult,\n className = '',\n language = 'eng',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { recognize, isProcessing, progress, status, result, error } = useOCR({\n language,\n });\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Create preview\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const ocrResult = await recognize(file);\n onResult?.(ocrResult.text);\n } catch (err) {\n console.error('OCR Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n const file = e.dataTransfer.files?.[0];\n if (file && file.type.startsWith('image/')) {\n const mockEvent = { target: { files: [file] } } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleFileChange(mockEvent);\n }\n };\n\n return (\n <div \n className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-blue-400 bg-blue-50/10' : 'border-gray-200 hover:border-blue-400', className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-blue-50 rounded-full text-blue-500\">\n <Upload size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">点击或拖拽图片进行 OCR 识别</p>\n <p className=\"text-sm text-gray-500\">支持 JPG, PNG, WebP</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"relative group rounded-lg overflow-hidden border border-gray-200\">\n <img \n src={imagePreview} \n alt=\"Preview\" \n className={clsx('max-h-64 mx-auto object-contain transition-opacity', isProcessing ? 'opacity-50' : 'opacity-100')}\n />\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm\"\n >\n <X size={18} />\n </button>\n )}\n \n {isProcessing && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/5\">\n <Loader2 className=\"animate-spin text-blue-500 mb-2\" size={32} />\n <div className=\"w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-blue-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-xs font-medium text-blue-600 mt-2\">\n {status === 'initializing' ? '正在加载引擎...' : '识别中 ' + (Math.round(progress * 100)) + '%'}\n </p>\n </div>\n )}\n </div>\n\n {result && !isProcessing && (\n <div className=\"bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2 mb-2 text-gray-600 font-medium\">\n <FileText size={18} />\n <span>识别结果 (置信度: {Math.round(result.confidence)}%)</span>\n </div>\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {result.text}\n </pre>\n </div>\n )}\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 识别失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useEffect } from 'react';\nimport { BackgroundRemovalOptions, BackgroundRemovalState } from '../types';\n\nexport const useBackgroundRemoval = (options: BackgroundRemovalOptions = {}) => {\n const [state, setState] = useState<BackgroundRemovalState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n resultBlob: null,\n resultUrl: null,\n });\n\n const remove = useCallback(async (image: string | File | Blob | HTMLImageElement | URL) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n let backgroundRemoval;\n\n try {\n // 环境盾牌:防止库初始化时 Object.keys(null) 崩溃\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' } },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n \n backgroundRemoval = await import('@imgly/background-removal');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', {\n value: originalProcess,\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n }\n\n const { removeBackground } = backgroundRemoval;\n\n const config: any = {\n progress: (status: string, progress: number) => {\n setState(prev => ({\n ...prev,\n status,\n progress,\n }));\n options.progress?.(status, progress);\n },\n model: options.model || 'small',\n publicPath: options.publicPath,\n fetchArgs: options.fetchArgs,\n };\n\n const blob = await removeBackground(image, config);\n const url = URL.createObjectURL(blob);\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n resultBlob: blob,\n resultUrl: url,\n }));\n\n return { blob, url };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Background Removal Error:', msg);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error: new Error(msg),\n }));\n throw err;\n }\n }, [options]);\n\n const cleanup = useCallback(() => {\n if (state.resultUrl) {\n URL.revokeObjectURL(state.resultUrl);\n }\n }, [state.resultUrl]);\n\n useEffect(() => {\n return () => cleanup();\n }, [cleanup]);\n\n return {\n ...state,\n remove,\n cleanup,\n };\n};\n","import React, { useState, useRef } from 'react';\nimport { useBackgroundRemoval } from '../hooks/useBackgroundRemoval';\nimport { Loader2, Upload, Download, Image as ImageIcon, X, Eraser } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface BackgroundRemoverProps {\n onResult?: (blob: Blob, url: string) => void;\n className?: string;\n}\n\nexport const BackgroundRemover: React.FC<BackgroundRemoverProps> = ({\n onResult,\n className = '',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const { blob, url } = await remove(file);\n onResult?.(blob, url);\n } catch (err) {\n console.error('Background Removal Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const downloadResult = () => {\n if (!resultUrl) return;\n const a = document.createElement('a');\n a.href = resultUrl;\n a.download = 'removed_background.png';\n a.click();\n };\n\n return (\n <div className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-purple-400 bg-purple-50/10' : 'border-gray-200 hover:border-purple-400', className)}>\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-purple-50 rounded-full text-purple-500\">\n <Eraser size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">上传图片移除背景</p>\n <p className=\"text-sm text-gray-500\">建议使用主体明确的图片</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">原图</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50\">\n <img src={imagePreview} alt=\"Original\" className=\"max-h-64 mx-auto object-contain\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">处理结果</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]\">\n {resultUrl ? (\n <img src={resultUrl} alt=\"Result\" className=\"max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500\" />\n ) : (\n <div className=\"h-64 flex flex-col items-center justify-center text-gray-400\">\n {isProcessing ? (\n <>\n <Loader2 className=\"animate-spin text-purple-500 mb-2\" size={32} />\n <div className=\"w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-purple-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-[10px] mt-2 font-mono uppercase\">{status.replace(/-/g, ' ')}</p>\n </>\n ) : (\n <span className=\"text-sm italic\">等待处理...</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-between items-center pt-2\">\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors\"\n >\n <X size={16} />\n 重新开始\n </button>\n )}\n \n {resultUrl && !isProcessing && (\n <button \n onClick={downloadResult}\n className=\"flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all\"\n >\n <Download size={16} />\n 下载 PNG\n </button>\n )}\n </div>\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 处理失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { SentimentResult, SentimentOptions, SentimentState } from '../types';\n\nexport const useSentimentAnalysis = (options: SentimentOptions = {}) => {\n const [state, setState] = useState<SentimentState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const analyze = useCallback(async (text: string) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'loading model',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0) },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const defaultModel = 'Xenova/distilbert-base-multilingual-cased-sentiments-student';\n \n pipelineRef.current = await pipeline('sentiment-analysis', options.model || defaultModel);\n }\n\n setState(prev => ({ ...prev, status: 'analyzing' }));\n \n const output = await pipelineRef.current(text);\n const resultData = output[0];\n\n const label = resultData.label.toLowerCase();\n let sentiment: 'positive' | 'negative' | 'neutral' = 'neutral';\n \n // 增强逻辑:针对中文常见消极词汇进行本地加权\n const negativeKeywords = ['累', '惨', '绝望', '难受', '伤心', '差', '坏', '糟', '不行'];\n const hasNegativeKeyword = negativeKeywords.some(k => text.includes(k));\n\n if (label.includes('positive') && !hasNegativeKeyword) {\n sentiment = 'positive';\n } else if (label.includes('negative') || label.includes('0') || hasNegativeKeyword) {\n sentiment = 'negative';\n }\n\n const result: SentimentResult = {\n label: resultData.label,\n score: resultData.score,\n sentiment,\n };\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Sentiment Error:', msg);\n setState(prev => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model]);\n\n return { ...state, analyze };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState } from 'react';\nimport { useSentimentAnalysis } from '../hooks/useSentimentAnalysis';\nimport { MessageSquare, Send, Loader2, Smile, Frown, Meh } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SentimentAnalyzerProps {\n onResult?: (result: any) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport const SentimentAnalyzer: React.FC<SentimentAnalyzerProps> = ({\n onResult,\n className = '',\n placeholder = '输入一段中文或英文,分析其情感倾向...',\n}) => {\n const [text, setText] = useState('');\n const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();\n\n const handleAnalyze = async () => {\n if (!text.trim() || isProcessing) return;\n try {\n const res = await analyze(text);\n onResult?.(res);\n } catch (err) {\n console.error('Sentiment Analysis Error:', err);\n }\n };\n\n const getSentimentIcon = () => {\n if (!result) return null;\n switch (result.sentiment) {\n case 'positive': return <Smile className=\"text-green-500\" size={24} />;\n case 'negative': return <Frown className=\"text-red-500\" size={24} />;\n default: return <Meh className=\"text-yellow-500\" size={24} />;\n }\n };\n\n const getSentimentColor = () => {\n if (!result) return '';\n switch (result.sentiment) {\n case 'positive': return 'bg-green-50 border-green-200 text-green-700';\n case 'negative': return 'bg-red-50 border-red-200 text-red-700';\n default: return 'bg-yellow-50 border-yellow-200 text-yellow-700';\n }\n };\n\n return (\n <div className={clsx('p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm', className)}>\n <div className=\"flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium\">\n <MessageSquare size={20} />\n <span>文本情感分析</span>\n </div>\n\n <div className=\"relative\">\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n className=\"w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200\"\n disabled={isProcessing}\n />\n <button\n onClick={handleAnalyze}\n disabled={!text.trim() || isProcessing}\n className=\"absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm\"\n >\n {isProcessing ? <Loader2 className=\"animate-spin\" size={18} /> : <Send size={18} />}\n </button>\n </div>\n\n {isProcessing && (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>正在分析 (首次运行将加载模型资源)...</span>\n </div>\n )}\n\n {result && !isProcessing && (\n <div className={clsx('mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2', getSentimentColor())}>\n <div className=\"p-2 bg-white rounded-full shadow-sm\">\n {getSentimentIcon()}\n </div>\n <div>\n <p className=\"font-bold text-lg capitalize\">{result.sentiment}</p>\n <p className=\"text-sm opacity-80\">\n 置信度: {(result.score * 100).toFixed(1)}% ({result.label})\n </p>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 分析失败: {error.message}\n </div>\n )}\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { TextGenerationOptions, TextGenerationState } from '../types';\n\nexport const useTextGeneration = (options: TextGenerationOptions = {}) => {\n const [state, setState] = useState<TextGenerationState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const generate = useCallback(async (prompt: string) => {\n console.log('[AI] Generating for prompt:', prompt);\n \n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'initializing',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0), cwd: () => '/', browser: true },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const modelName = options.model || 'Xenova/LaMini-Flan-T5-77M';\n pipelineRef.current = await pipeline('text2text-generation', modelName, {\n progress_callback: (info: any) => {\n if (info.status === 'progress') {\n setState((prev: TextGenerationState) => ({ ...prev, status: 'loading model: ' + (Math.round(info.progress)) + '%' }));\n }\n }\n });\n }\n\n setState((prev: TextGenerationState) => ({ ...prev, status: 'thinking' }));\n \n // 优化生成参数,使其对小模型更友好\n const output = await pipelineRef.current(prompt, {\n max_new_tokens: options.max_new_tokens || 64,\n temperature: options.temperature || 0.5, // 稍微提高温度\n do_sample: true, // 开启采样,避免空输出\n top_k: 50,\n repetition_penalty: 1.1,\n });\n\n const result = output[0].generated_text || '';\n console.log('[AI] Raw result:', result);\n\n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[AI] Error:', err);\n setState((prev: TextGenerationState) => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model, options.max_new_tokens, options.temperature]);\n\n return { ...state, generate };\n};\n\n\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTextGeneration } from '../hooks/useTextGeneration';\nimport { Bot, User, Send, Loader2 } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SmartAssistantProps {\n className?: string;\n}\n\nexport const SmartAssistant: React.FC<SmartAssistantProps> = ({ className = '' }) => {\n const [input, setInput] = useState('');\n const [chatHistory, setChatHistory] = useState<Array<{ role: 'user' | 'assistant', content: string }>>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [chatHistory, isGenerating]);\n\n const handleSend = async () => {\n if (!input.trim() || isGenerating) return;\n\n const userMessage = input.trim();\n setInput('');\n setChatHistory(prev => [...prev, { role: 'user', content: userMessage }]);\n\n // --- 1. 本地硬规则匹配 (意图识别) ---\n // 对于 77M 模型,某些固定回复由逻辑生成效果更好\n let finalContent = '';\n const lowerMessage = userMessage.toLowerCase();\n \n if (lowerMessage.includes('你好') || lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n finalContent = '你好呀!我是 sa2kit 的本地 AI 助手,很高兴能和你聊天。😊';\n } else if (lowerMessage.includes('谁') || lowerMessage.includes('who are you')) {\n finalContent = '我是一个完全运行在你浏览器本地的小型 AI 模型,我不需要服务器,非常保护你的隐私。';\n } else if (lowerMessage.includes('天气')) {\n finalContent = '虽然我看不见外面的阳光,但听你的语气,今天一定是个适合出门的好天气!☀️';\n } else if (lowerMessage.includes('累') || lowerMessage.includes('难过') || lowerMessage.includes('绝望')) {\n finalContent = '听起来你现在心情不太好... 抱抱你,我会一直在这里陪你聊天的。❤️';\n }\n\n // 如果命中了硬规则,直接显示并返回,不再调用模型\n if (finalContent) {\n // 模拟一点点思考时间,体验更自然\n setTimeout(() => {\n setChatHistory(prev => [...prev, { role: 'assistant', content: finalContent }]);\n }, 500);\n return;\n }\n\n // --- 2. 调用模型生成 (针对非固定意图) ---\n const prompt = `对话。\n人说:\"${userMessage}\"\nAI回应:\"`;\n\n try {\n const response = await generate(prompt);\n \n // 深度清理模型输出\n let modelOutput = response\n .replace(/^AI回应:|^AI:|^Assistant:|^回答:|^答:|^Answer:/i, '')\n .replace(/[. ]*Positive[. ]*|[. ]*Negative[. ]*|[. ]*Neutral[. ]*/gi, '') // 拦截情绪单词\n .replace(/^[\"'“]|[\"'”]$/g, '') // 去掉引号\n .trim();\n\n // --- 3. 结果质量检查 (Recovery) ---\n // 如果模型返回包含大量英文、或者是废话、或者太短\n const isEnglishTrash = /[a-zA-Z]{5,}/.test(modelOutput) && !/[一-龥]/.test(modelOutput);\n const isTooShort = modelOutput.length < 1;\n\n if (isEnglishTrash || isTooShort) {\n console.warn('[AI] Model failure, triggering smart recovery. Raw was:', response);\n modelOutput = '嗯嗯,我正在听。关于“' + userMessage.slice(0, 6) + '...”,你还有什么想分享的吗?';\n }\n\n setChatHistory(prev => [...prev, { role: 'assistant', content: modelOutput }]);\n } catch (err) {\n setChatHistory(prev => [...prev, { role: 'assistant', content: '(本地模型思考过度,暂时休息中...)' }]);\n }\n };\n\n return (\n <div className={clsx('flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden', className)}>\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50\">\n {chatHistory.length === 0 && (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400 space-y-2\">\n <Bot size={48} className=\"opacity-20\" />\n <p className=\"text-sm italic text-center px-8 text-gray-400 font-sans\">\n 你好!我是 100% 本地运行的 AI。<br/>\n 你可以和我聊聊天,我会尝试理解你的意思。\n </p>\n </div>\n )}\n {chatHistory.map((msg, i) => (\n <div key={i} className={clsx('flex', msg.role === 'user' ? 'justify-end' : 'justify-start', 'animate-in fade-in slide-in-from-bottom-2')}>\n <div className={clsx('flex gap-3 max-w-[85%]', msg.role === 'user' ? 'flex-row-reverse' : '')}>\n <div className={clsx('p-2 rounded-lg h-fit', msg.role === 'user' ? 'bg-blue-100 text-blue-600' : 'bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400')}>\n {msg.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n </div>\n <div className={clsx('p-3 rounded-2xl shadow-sm text-sm', msg.role === 'user' \n ? 'bg-blue-600 text-white rounded-tr-none' \n : 'bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed')}>\n {msg.content}\n </div>\n </div>\n </div>\n ))}\n {isGenerating && (\n <div className=\"flex justify-start\">\n <div className=\"flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600\">\n <Loader2 className=\"animate-spin text-blue-500\" size={16} />\n <div className=\"flex flex-col\">\n <span className=\"text-xs text-gray-500 font-medium\">思考中...</span>\n <span className=\"text-[10px] text-blue-400 font-mono tracking-tighter\">{genStatus}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700\">\n <div className=\"relative flex items-center gap-2\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n placeholder=\"输入文字...\"\n className=\"flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800\"\n disabled={isGenerating}\n />\n <button\n onClick={handleSend}\n disabled={!input.trim() || isGenerating}\n className=\"absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center\"\n >\n <Send size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@/components/Dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { ProfileData, SocialLink } from './types';\nimport { cn } from '@/utils';\n\nconst themeStyles = {\n light: \"\",\n dark: \"bg-[#222] text-[#eee] border-[#444]\",\n blue: \"bg-[#f0f8ff] border-[#1890ff]/20\",\n};\n\nexport interface ProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n data: ProfileData;\n showAvatar?: boolean;\n showContacts?: boolean;\n showSocial?: boolean;\n showBio?: boolean;\n avatarSize?: number;\n onAvatarClick?: () => void;\n onSocialLinkClick?: (url: string, type: string) => void;\n onContactClick?: (type: string, value: string) => void;\n themeName?: 'light' | 'dark' | 'blue';\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ProfileModal: React.FC<ProfileModalProps> = ({\n isOpen,\n onClose,\n data,\n showAvatar = true,\n showContacts = true,\n showSocial = true,\n showBio = true,\n avatarSize = 80,\n onAvatarClick,\n onSocialLinkClick,\n onContactClick,\n themeName = 'light',\n className,\n}) => {\n // 渲染社交媒体链接\n const renderSocialLinks = () => {\n if (!data.socialLinks || data.socialLinks.length === 0) return null;\n return (\n <div className=\"flex gap-3 mt-2\">\n {data.socialLinks.map((link: SocialLink, index: number) => (\n <a\n key={index}\n href={link.url}\n className={cn(\n \"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5\",\n themeName === 'dark' ? \"bg-gray-800 text-gray-200 hover:bg-gray-700\" : \"bg-gray-100 text-gray-800 hover:bg-gray-200\"\n )}\n title={link.type}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n if (onSocialLinkClick) {\n e.preventDefault();\n onSocialLinkClick(link.url, link.type);\n }\n }}\n >\n {link.icon ? (\n <span className=\"text-base\">{link.icon}</span>\n ) : (\n <span className=\"text-[10px] font-semibold\">{link.type}</span>\n )}\n </a>\n ))}\n </div>\n );\n };\n\n // 渲染联系方式\n const renderContacts = () => {\n if (!data.contacts || Object.keys(data.contacts).length === 0) return null;\n return (\n <div className={cn(\n \"mt-4 border-t pt-4\",\n themeName === 'dark' ? \"border-gray-800\" : \"border-gray-100\"\n )}>\n {Object.entries(data.contacts).map(([type, value], index) => (\n <div \n key={index} \n className={cn(\n \"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors\",\n themeName === 'dark' ? \"hover:bg-gray-800\" : \"hover:bg-gray-50\"\n )}\n onClick={() => onContactClick && onContactClick(type, value)}\n >\n <span className={cn(\n \"font-medium w-[70px] shrink-0\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{type}:</span>\n <span className={themeName === 'dark' ? \"text-gray-200\" : \"text-gray-800\"}>{value}</span>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className={cn(\n \"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl\",\n themeStyles[themeName as keyof typeof themeStyles] || \"\",\n className\n )}>\n <div className=\"p-6\">\n <div className=\"flex gap-5 mb-5\">\n {showAvatar && (\n <div \n className=\"shrink-0\"\n onClick={onAvatarClick}\n style={{ cursor: onAvatarClick ? 'pointer' : 'default' }}\n >\n <Avatar className=\"border-2 border-primary/10 shadow-sm\" style={{ width: avatarSize, height: avatarSize }}>\n {data.avatar && <AvatarImage src={data.avatar} alt={data.name} className=\"object-cover\" />}\n <AvatarFallback className=\"text-xl\">\n {data.name.substring(0, 2).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <h2 className={cn(\n \"text-2xl font-bold m-0 mb-1\",\n themeName === 'dark' ? \"text-white\" : \"text-gray-900\"\n )}>{data.name}</h2>\n {data.title && <div className={cn(\n \"text-sm mb-2\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{data.title}</div>}\n {showSocial && renderSocialLinks()}\n </div>\n </div>\n \n {showBio && data.bio && (\n <div className={cn(\n \"mb-5 leading-relaxed text-sm\",\n themeName === 'dark' ? \"text-gray-300\" : \"text-gray-600\"\n )}>\n <p>{data.bio}</p>\n </div>\n )}\n \n {showContacts && renderContacts()}\n \n {data.customContent && (\n <div className=\"mt-5\">\n {data.customContent}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProfileModal;\n","import React from 'react';\nimport { Badge } from '@/components/Badge';\nimport { cn } from '@/utils';\nimport { BadgeType } from '../types';\n \ninterface BadgeListProps {\n badges: BadgeType[];\n className?: string;\n}\n\nexport const BadgeList: React.FC<BadgeListProps> = ({\n badges,\n className = '',\n}) => {\n if (!badges || badges.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-wrap gap-2 mt-4\", className)}>\n {badges.map((badge, index) => (\n <Badge \n key={index} \n variant={badge.type === 'default' ? 'default' : (badge.type as any)}\n >\n {badge.icon && <span className=\"mr-1\">{badge.icon}</span>}\n {badge.label}\n </Badge>\n ))}\n </div>\n );\n};\n","import { StatType } from '..';\nimport { cn } from '@/utils';\n\ninterface StatProps extends StatType {\n className?: string;\n}\n\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n icon,\n className = '',\n}) => {\n return (\n <div className={cn(\"flex flex-col items-center flex-1 text-center\", className)}>\n {icon && <span className=\"mb-2 text-2xl text-gray-400\">{icon}</span>}\n <div>\n <div className=\"text-lg font-semibold text-gray-800\">{value}</div>\n <div className=\"text-xs text-gray-400 mt-1\">{label}</div>\n </div>\n </div>\n );\n};\n","import { StatType } from \"..\";\nimport { Stat } from \"./Stat\";\nimport { cn } from '@/utils';\n\ninterface StatListProps {\n stats: StatType[];\n className?: string;\n}\n\nexport const StatList: React.FC<StatListProps> = ({\n stats,\n className = '',\n}) => {\n if (!stats || stats.length === 0) return null;\n\n return (\n <div className={cn(\"flex justify-between mt-4 pt-4 border-t border-gray-100\", className)}>\n {stats.map((stat, index) => (\n <Stat key={index} {...stat} />\n ))}\n </div>\n );\n}; ","'use client';\n\nimport React, { useState } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\nimport { Button } from '@/components/Button';\n\n// 示例数据\nconst exampleProfileData: ProfileData = {\n name: '张三',\n avatar: 'https://randomuser.me/api/portraits/men/32.jpg',\n title: '高级前端工程师',\n bio: '专注于React和Next.js开发的前端工程师,有5年工作经验。热爱开源,喜欢分享技术经验。',\n contacts: {\n '邮箱': 'zhangsan@example.com',\n '电话': '138-8888-8888',\n '地址': '上海市浦东新区',\n },\n socialLinks: [\n { type: 'GitHub', url: 'https://github.com/zhangsan', icon: '★' },\n { type: 'Twitter', url: 'https://twitter.com/zhangsan', icon: '✦' },\n { type: 'LinkedIn', url: 'https://linkedin.com/in/zhangsan', icon: '✪' },\n ],\n badges: [\n { label: 'React', type: 'primary' },\n { label: 'Next.js', type: 'success' },\n { label: 'TypeScript', type: 'info' },\n { label: 'CSS', type: 'default' },\n ],\n stats: [\n { label: '项目', value: 42 },\n { label: '粉丝', value: 1024 },\n { label: '评分', value: '4.9' },\n ],\n customContent: (\n <div className=\"mt-5 border-t border-gray-100 pt-4\">\n <h3 className=\"text-sm font-semibold mb-2\">专业技能</h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n 精通React、Vue、Angular等前端框架,熟悉TypeScript、JavaScript、CSS3、HTML5等前端技术。\n 有丰富的大型项目开发经验,能独立负责前端架构设计。\n </p>\n </div>\n ),\n};\n\nexport interface ProfileButtonProps {\n data?: ProfileData;\n buttonText?: string;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n className?: string;\n modalTheme?: 'light' | 'dark' | 'blue';\n}\n\n/**\n * 个人信息按钮组件,点击后显示个人信息弹窗\n */\nexport const ProfileButton: React.FC<ProfileButtonProps> = ({\n data = exampleProfileData,\n buttonText = '查看个人信息',\n variant = 'default',\n size = 'default',\n className = '',\n modalTheme = 'light',\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n const closeModal = () => setIsModalOpen(false);\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <>\n <Button \n variant={variant}\n size={size}\n onClick={openModal} \n className={className}\n >\n {buttonText}\n </Button>\n\n <ProfileModal\n isOpen={isModalOpen}\n onClose={closeModal}\n data={data}\n themeName={modalTheme}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.customContent}\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n </>\n );\n};\n\nexport default ProfileButton;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\n\nexport interface AutoOpenModalProps {\n data: ProfileData;\n delay?: number; // 延迟显示时间(毫秒)\n themeName?: 'light' | 'dark' | 'blue';\n onClose?: () => void;\n}\n\n/**\n * 自动打开个人信息弹窗组件\n * 页面加载后自动显示弹窗\n */\nexport const AutoOpenModal: React.FC<AutoOpenModalProps> = ({\n data,\n delay = 500, // 默认延迟500毫秒\n themeName = 'light',\n onClose,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // 页面加载后自动显示弹窗\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsModalOpen(true);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [delay]);\n\n const handleClose = () => {\n setIsModalOpen(false);\n if (onClose) {\n onClose();\n }\n };\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <ProfileModal\n isOpen={isModalOpen}\n onClose={handleClose}\n data={data}\n themeName={themeName}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n );\n};\n\nexport default AutoOpenModal;\n","'use client';\n\nimport React from 'react';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { cn } from '@/utils';\n\nexport interface EnhancedAvatarProps {\n src?: string;\n name?: string;\n size?: 'small' | 'medium' | 'large' | number;\n mood?: 'online' | 'offline' | 'away';\n statusText?: string;\n onClick?: () => void;\n className?: string;\n}\n\nconst sizeMap = {\n small: 'h-8 w-8',\n medium: 'h-12 w-12',\n large: 'h-16 w-16',\n};\n\nconst moodColors = {\n online: 'bg-green-500',\n offline: 'bg-gray-500',\n away: 'bg-yellow-500',\n};\n\nexport const EnhancedAvatar: React.FC<EnhancedAvatarProps> = ({\n src,\n name,\n size = 'medium',\n mood = 'online',\n statusText,\n onClick,\n className,\n}) => {\n const sizeClass = typeof size === 'string' ? sizeMap[size] : '';\n const customSizeStyle = typeof size === 'number' ? { width: size, height: size } : {};\n\n return (\n <div className={cn(\"relative inline-block\", className)} onClick={onClick}>\n <Avatar className={cn(sizeClass, onClick && \"cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all\")} style={customSizeStyle}>\n {src && <AvatarImage src={src} alt={name || \"Avatar\"} className=\"object-cover\" />}\n <AvatarFallback className=\"bg-primary/10 text-primary-foreground\">\n {name ? name.substring(0, 2).toUpperCase() : '??'}\n </AvatarFallback>\n </Avatar>\n \n {mood && (\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-2 border-white\",\n moodColors[mood],\n typeof size === 'number' ? (size > 60 ? 'h-4 w-4' : 'h-3 w-3') : (size === 'large' ? 'h-4 w-4' : 'h-3 w-3')\n )}\n />\n )}\n \n {statusText && (\n <div className=\"absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap\">\n <span className=\"text-xs text-muted-foreground\">{statusText}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default EnhancedAvatar;\n","/**\n * 实验田模块工具函数\n */\n\nimport type { ExperimentItem, ViewMode, TestFieldConfig, CompletionFilter } from '../types';\n\n/**\n * 过滤实验项目\n */\nexport function filterExperiments(\n experiments: ExperimentItem[],\n config: Partial<TestFieldConfig>\n): ExperimentItem[] {\n const {\n viewMode = 'all',\n searchQuery = '',\n completionFilter = 'all'\n } = config;\n\n return experiments.filter(experiment => {\n // 类别过滤\n const matchesViewMode = viewMode === 'all' || experiment.category === viewMode;\n \n // 搜索过滤\n const query = searchQuery.toLowerCase();\n const matchesSearch = !query || \n experiment.title.toLowerCase().includes(query) ||\n experiment.description.toLowerCase().includes(query) ||\n experiment.tags.some(tag => tag.toLowerCase().includes(query));\n \n // 完成状态过滤\n const matchesCompletion = (() => {\n switch (completionFilter) {\n case 'completed':\n return experiment.isCompleted === true;\n case 'incomplete':\n return experiment.isCompleted !== true;\n case 'all':\n default:\n return true;\n }\n })();\n \n return matchesViewMode && matchesSearch && matchesCompletion;\n });\n}\n\n/**\n * 排序实验项目\n */\nexport function sortExperiments(\n experiments: ExperimentItem[],\n sortBy: TestFieldConfig['sortBy'] = 'title',\n sortOrder: TestFieldConfig['sortOrder'] = 'asc'\n): ExperimentItem[] {\n return [...experiments].sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'title':\n comparison = a.title.localeCompare(b.title);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'completion':\n // 已完成的排在前面\n const aCompleted = a.isCompleted ? 1 : 0;\n const bCompleted = b.isCompleted ? 1 : 0;\n comparison = bCompleted - aCompleted;\n break;\n case 'createdAt':\n // 处理创建日期排序,确保没有日期的项目排在最后\n if (!a.createdAt && !b.createdAt) {\n comparison = 0;\n } else if (!a.createdAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.createdAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n }\n break;\n case 'updatedAt':\n // 处理更新日期排序,确保没有日期的项目排在最后\n if (!a.updatedAt && !b.updatedAt) {\n comparison = 0;\n } else if (!a.updatedAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.updatedAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime();\n }\n break;\n default:\n comparison = 0;\n }\n \n // 如果主要排序字段相同,使用ID作为第二排序键确保稳定性\n if (comparison === 0) {\n comparison = a.id.localeCompare(b.id);\n }\n \n return sortOrder === 'asc' ? comparison : -comparison;\n });\n}\n\n/**\n * 获取所有标签\n */\nexport function getAllTags(experiments: ExperimentItem[]): string[] {\n const allTags = experiments.flatMap(experiment => experiment.tags);\n return Array.from(new Set(allTags)).sort();\n}\n\n/**\n * 根据类别统计实验项目数量\n */\nexport function getExperimentCounts(experiments: ExperimentItem[]) {\n const counts = {\n all: experiments.length,\n utility: 0,\n leisure: 0,\n completed: 0,\n inProgress: 0\n };\n \n experiments.forEach(experiment => {\n if (experiment.category === 'utility') {\n counts.utility++;\n } else if (experiment.category === 'leisure') {\n counts.leisure++;\n }\n \n if (experiment.isCompleted) {\n counts.completed++;\n } else {\n counts.inProgress++;\n }\n });\n \n return counts;\n}\n\n/**\n * 验证实验项目数据\n */\nexport function validateExperiment(experiment: Partial<ExperimentItem>): boolean {\n return !!(\n experiment.id &&\n experiment.title &&\n experiment.description &&\n experiment.path &&\n experiment.category &&\n Array.isArray(experiment.tags)\n );\n}\n\n/**\n * 获取类别显示名称\n */\nexport function getCategoryDisplayName(category: ViewMode): string {\n switch (category) {\n case 'utility':\n return '实用工具';\n case 'leisure':\n return '休闲娱乐';\n case 'all':\n default:\n return '全部';\n }\n}\n\n/**\n * 获取类别颜色\n */\nexport function getCategoryColor(category: ExperimentItem['category']): string {\n switch (category) {\n case 'utility':\n return 'bg-blue-100 text-blue-800 border-blue-200';\n case 'leisure':\n return 'bg-purple-100 text-purple-800 border-purple-200';\n default:\n return 'bg-gray-100 text-gray-800 border-gray-200';\n }\n}\n\n/**\n * 获取完成状态显示名称\n */\nexport function getCompletionFilterDisplayName(filter: CompletionFilter): string {\n switch (filter) {\n case 'completed':\n return '已完成';\n case 'incomplete':\n return '进行中';\n case 'all':\n default:\n return '全部状态';\n }\n}\n\n/**\n * 获取完成状态标签样式\n */\nexport function getCompletionStatusColor(isCompleted?: boolean): string {\n if (isCompleted) {\n return 'bg-green-100 text-green-800 border-green-200';\n }\n return 'bg-yellow-100 text-yellow-800 border-yellow-200';\n}\n\n/**\n * 获取完成状态标签文本\n */\nexport function getCompletionStatusText(isCompleted?: boolean): string {\n return isCompleted ? '已完成' : '进行中';\n}","'use client';\n\nimport React from \"react\";\nimport type { ViewMode } from '../types';\nimport { getCategoryDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CategoryFilterProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n counts: { utility: number; leisure: number };\n className?: string;\n}\n\nexport const CategoryFilter: React.FC<CategoryFilterProps> = ({ \n viewMode, \n onViewModeChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCategoryDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-blue-500',\n shadow: 'shadow-blue-200'\n },\n showCount: false\n },\n {\n value: 'utility' as const,\n label: getCategoryDisplayName('utility'),\n icon: '🔧',\n activeColor: {\n bg: 'bg-green-500',\n shadow: 'shadow-green-200'\n },\n count: counts.utility,\n showCount: true\n },\n {\n value: 'leisure' as const,\n label: getCategoryDisplayName('leisure'),\n icon: '🎮',\n activeColor: {\n bg: 'bg-purple-500',\n shadow: 'shadow-purple-200'\n },\n count: counts.leisure,\n showCount: true\n },\n ];\n\n return (\n <FilterButtonGroup\n label=\"项目类别\"\n value={viewMode}\n options={options}\n onChange={onViewModeChange}\n className={className}\n />\n );\n};\n\nexport default CategoryFilter;\n","'use client';\n\nimport React from \"react\";\nimport type { CompletionFilter } from '../types';\nimport { getCompletionFilterDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CompletionFilterProps {\n completionFilter: CompletionFilter;\n onCompletionFilterChange: (filter: CompletionFilter) => void;\n counts: { all: number; completed: number; inProgress: number };\n className?: string;\n}\n\nexport const CompletionFilterComponent: React.FC<CompletionFilterProps> = ({ \n completionFilter, \n onCompletionFilterChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCompletionFilterDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-slate-500',\n shadow: 'shadow-slate-200'\n },\n count: counts.all,\n showCount: true\n },\n {\n value: 'completed' as const,\n label: getCompletionFilterDisplayName('completed'),\n icon: '✅',\n activeColor: {\n bg: 'bg-emerald-500',\n shadow: 'shadow-emerald-200'\n },\n count: counts.completed,\n showCount: true\n },\n {\n value: 'incomplete' as const,\n label: getCompletionFilterDisplayName('incomplete'),\n icon: '🚧',\n activeColor: {\n bg: 'bg-orange-500',\n shadow: 'shadow-orange-200'\n },\n count: counts.inProgress,\n showCount: true\n }\n ];\n\n return (\n <FilterButtonGroup\n label=\"完成状态\"\n value={completionFilter}\n options={options}\n onChange={onCompletionFilterChange}\n className={className}\n />\n );\n};\n\nexport default CompletionFilterComponent;\n","'use client';\n\nimport React from \"react\";\nimport { BackButton } from '@/components';\n\nexport interface PageHeaderProps {\n counts: { all: number; utility: number; leisure: number; completed: number };\n className?: string;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ counts, className }) => {\n return (\n <div className={className}>\n {/* 顶部导航 */}\n <div className=\"mb-8\">\n <BackButton />\n </div>\n\n {/* 页面标题 */}\n <div className=\"mb-8\">\n <h1 className=\"text-3xl font-bold text-gray-900\">实验田</h1>\n <p className=\"mt-2 text-sm text-gray-600\">\n 在这里,你可以尝试各种实验性的功能和项目\n </p>\n \n {/* 统计信息 */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-gray-500\">\n <span>总计: {counts.all} 个项目</span>\n <span>实用工具: {counts.utility} 个</span>\n <span>休闲娱乐: {counts.leisure} 个</span>\n <span>已完成: {counts.completed} 个</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PageHeader;\n","'use client';\n\nimport React from \"react\";\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { Grid } from '@/components';\nimport type { GridItem, GridColumns, GridGap } from '@/components';\n\n/** 实验项目网格项接口 */\nexport interface ExperimentGridItem extends GridItem {\n title: string;\n description: string;\n path: string;\n tags: string[];\n category: string;\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n}\n\n/** 实验项目网格组件 Props */\nexport interface ExperimentGridProps<T extends ExperimentGridItem> {\n /** 数据项数组 */\n items: T[];\n /** 自定义渲染函数(可选) */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置(可选) */\n columns?: GridColumns;\n /** 间距配置(可选) */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n}\n\n/** 默认的 ExperimentCard 渲染器 */\nfunction defaultExperimentRenderer(item: ExperimentItem) {\n return (\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n );\n}\n\n/** 实验项目网格组件 */\nexport function ExperimentGrid<T extends ExperimentGridItem>({\n items,\n renderItem,\n columns = { sm: 1, md: 2, lg: 3, xl: 4 },\n gap = 'md',\n className = ''\n}: ExperimentGridProps<T>) {\n const itemRenderer = renderItem || ((item: T) => defaultExperimentRenderer(item as any));\n\n return (\n <Grid\n items={items}\n renderItem={itemRenderer}\n columns={columns}\n gap={gap}\n className={className}\n />\n );\n}\n\n/** 为了向后兼容,导出一个专门用于 ExperimentItem 的组件 */\nexport function ExperimentItemGrid({ \n experiments, \n ...props \n}: Omit<ExperimentGridProps<ExperimentItem>, 'items'> & { experiments: ExperimentItem[] }) {\n return <ExperimentGrid<ExperimentItem> items={experiments} {...props} />;\n}\n\nexport default ExperimentGrid;\n","'use client';\n\nimport React from \"react\";\nimport { clsx } from 'clsx';\n\nexport interface EmptyStateProps {\n searchQuery: string;\n onClearSearch: () => void;\n className?: string;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({ searchQuery, onClearSearch, className }) => {\n return (\n <div className={clsx('text-center py-12', className)}>\n <svg \n className=\"mx-auto h-12 w-12 text-gray-400\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384\" \n />\n </svg>\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">没有找到匹配的实验项目</h3>\n <p className=\"mt-1 text-sm text-gray-500\">\n {searchQuery \n ? '尝试调整搜索关键词或筛选条件' \n : '当前分类下暂无实验项目'\n }\n </p>\n {searchQuery && (\n <div className=\"mt-4\">\n <button\n onClick={onClearSearch}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-blue-700 bg-blue-100 hover:bg-blue-200\"\n >\n 清除搜索\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport type { TestFieldConfig } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortControlProps {\n sortBy: TestFieldConfig['sortBy'];\n sortOrder: TestFieldConfig['sortOrder'];\n onSortByChange: (sortBy: TestFieldConfig['sortBy']) => void;\n onSortOrderChange: (sortOrder: TestFieldConfig['sortOrder']) => void;\n}\n\nexport const SortControl: React.FC<SortControlProps> = ({\n sortBy,\n sortOrder,\n onSortByChange,\n onSortOrderChange,\n}) => {\n // 排序方式选项\n const sortOptions: { value: TestFieldConfig['sortBy']; label: string }[] = [\n { value: 'title', label: '名称' },\n { value: 'updatedAt', label: '更新时间' },\n { value: 'createdAt', label: '创建时间' },\n { value: 'category', label: '类别' },\n { value: 'completion', label: '完成状态' },\n ];\n\n return (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100\">\n <div className=\"text-sm font-medium text-gray-700\">排序方式:</div>\n \n <div className=\"flex flex-wrap gap-2\">\n {sortOptions.map((option) => (\n <button\n key={option.value}\n className={clsx('px-3 py-1.5 text-sm rounded-full transition-colors', sortBy === option.value\n ? 'bg-blue-100 text-blue-700 font-medium'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortByChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n \n <div className=\"ml-auto flex items-center\">\n <button\n className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200\"\n onClick={() => onSortOrderChange(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\" />\n </svg>\n <span>升序</span>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>降序</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortControl;\n","'use client';\n\nimport React from 'react';\nimport type { SortMode } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortModeToggleProps {\n sortMode: SortMode;\n onSortModeChange: (mode: SortMode) => void;\n}\n\nexport const SortModeToggle: React.FC<SortModeToggleProps> = ({ sortMode, onSortModeChange }) => {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100\">\n <span className=\"text-sm font-medium text-gray-700\">排序模式:</span>\n \n <div className=\"flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg\">\n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'auto'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('auto')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>自动排序</span>\n </div>\n </button>\n \n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'manual'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('manual')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" />\n </svg>\n <span>手动排序</span>\n </div>\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortModeToggle;\n","'use client';\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortableExperimentItemProps {\n item: ExperimentItem;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n isFirst?: boolean;\n isLast?: boolean;\n}\n\nexport const SortableExperimentItem: React.FC<SortableExperimentItemProps> = ({ \n item, \n onMoveUp, \n onMoveDown,\n isFirst,\n isLast \n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : 1,\n opacity: isDragging ? 0.8 : 1,\n position: 'relative' as const,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"relative group\"\n >\n {/* 拖拽手柄 - 桌面端 */}\n <div\n {...attributes}\n {...listeners}\n className=\"absolute right-2 top-2 w-8 h-8 bg-white/80 hover:bg-white rounded-full flex items-center justify-center shadow-md z-[10]\n hidden sm:flex\n opacity-0 group-hover:opacity-100 transition-opacity\n cursor-grab active:cursor-grabbing\n touch-action-none\" /* 防止触摸设备上的滚动冲突 */\n onClick={(e) => e.stopPropagation()}\n aria-label=\"拖动排序\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8h16M4 16h16\" />\n </svg>\n \n <span className=\"absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity\">\n 拖动排序\n </span>\n </div>\n\n {/* 移动端排序按钮组 */}\n <div className=\"absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-[10]\">\n {/* 向上按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveUp?.();\n }}\n disabled={isFirst}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isFirst ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向上移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isFirst ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* 向下按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveDown?.();\n }}\n disabled={isLast}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isLast ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向下移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isLast ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 实验卡片 */}\n <div className={clsx('transition-all', isDragging ? 'scale-105 shadow-xl' : '')}>\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n </div>\n </div>\n );\n};\n\nexport default SortableExperimentItem;\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\nimport { \n DndContext, \n closestCenter, \n KeyboardSensor, \n PointerSensor, \n useSensor, \n useSensors,\n DragEndEvent,\n TouchSensor\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy\n} from '@dnd-kit/sortable';\nimport { SortableExperimentItem } from './SortableExperimentItem';\n\nexport interface DraggableExperimentGridProps {\n items: ExperimentItem[];\n onOrderChange?: (items: ExperimentItem[]) => void;\n className?: string;\n}\n\nexport const DraggableExperimentGrid: React.FC<DraggableExperimentGridProps> = ({ \n items: initialItems, \n onOrderChange,\n className = '' \n}) => {\n // 本地状态跟踪项目顺序\n const [items, setItems] = useState<ExperimentItem[]>(initialItems);\n const [isDragging, setIsDragging] = useState(false);\n\n // 设置传感器\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 需要拖动8px才激活,避免意外触发\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250, // 触摸需要按住250ms才激活,避免与点击冲突\n tolerance: 5, // 允许的移动容差\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // 处理拖拽开始事件\n function handleDragStart() {\n setIsDragging(true);\n }\n\n // 处理拖拽结束事件\n function handleDragEnd(event: DragEndEvent) {\n setIsDragging(false);\n \n const { active, over } = event;\n \n if (over && active.id !== over.id) {\n setItems((currentItems) => {\n // 找到拖拽项和目标项的索引\n const oldIndex = currentItems.findIndex(item => item.id === active.id);\n const newIndex = currentItems.findIndex(item => item.id === over.id);\n \n // 重新排序项目\n const newItems = arrayMove(currentItems, oldIndex, newIndex);\n \n // 如果提供了回调函数,通知父组件顺序变化\n if (onOrderChange) {\n onOrderChange(newItems);\n }\n \n return newItems;\n });\n }\n }\n\n // 处理向上移动\n const handleMoveUp = (index: number) => {\n if (index > 0) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index - 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 处理向下移动\n const handleMoveDown = (index: number) => {\n if (index < items.length - 1) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index + 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 当初始项目变化时更新本地状态\n React.useEffect(() => {\n setItems(initialItems);\n }, [initialItems]);\n\n return (\n <div className={clsx('relative', className)}>\n <div className=\"mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm\">\n <div className=\"flex items-start sm:items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n <div>\n <p className=\"mb-1\">拖拽卡片可以自定义排序。点击卡片可以访问对应的实验项目。</p>\n <p className=\"text-xs text-blue-600 sm:hidden\">点击卡片右上角的上下箭头按钮调整顺序</p>\n <p className=\"text-xs text-blue-600 hidden sm:block\">长按卡片右上角的拖动图标进行排序</p>\n </div>\n </div>\n </div>\n \n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items.map(item => item.id)}\n strategy={rectSortingStrategy}\n >\n <div className={clsx('grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6', isDragging ? 'cursor-grabbing' : '')}>\n {items.map((item, index) => (\n <SortableExperimentItem \n key={item.id} \n item={item}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n};\n\nexport default DraggableExperimentGrid;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, UseAuthReturn, useAuth } from '@/auth';\nimport { Shield, AlertTriangle } from 'lucide-react';\nimport { ApiError } from '@/universalFile/server';\n\ninterface PermissionGuardProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n apiClient: BaseApiClient;\n}\n\nexport const PermissionGuard: React.FC<PermissionGuardProps> = ({\n apiClient,\n children,\n fallback\n}) => {\n const { user, isLoggedIn } = useAuth(apiClient);\n\n // 检查用户是否有权限(所有登录用户都可以访问实验田)\n const hasPermission = () => {\n if (!isLoggedIn || !user) {\n return false;\n }\n\n // 实验田对所有登录用户开放\n return true;\n };\n\n if (!hasPermission()) {\n return (fallback as any) || (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center\">\n <div className=\"flex items-center justify-center mb-4\">\n <Shield className=\"w-12 h-12 text-red-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n 需要登录\n </h2>\n <p className=\"text-gray-600 mb-4\">\n 请先登录以访问实验田功能。\n </p>\n <div className=\"flex items-center justify-center text-sm text-gray-500 mb-4\">\n <AlertTriangle className=\"w-4 h-4 mr-1\" />\n 实验田对所有注册用户开放\n </div>\n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700\"\n >\n 返回上一页\n </button>\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default PermissionGuard;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, useAuth } from '@/auth';\nimport { LogOut, User, FlaskConical } from 'lucide-react';\n\nexport interface UserInfoBarProps {\n apiClient: BaseApiClient;\n}\n\nexport const UserInfoBar: React.FC<UserInfoBarProps> = ({ apiClient }) => {\n const { user, logout, isLoggedIn } = useAuth(apiClient);\n\n const handleLogout = async () => {\n try {\n await logout();\n // 登出后重定向到首页\n window.location.href = '/';\n } catch (error) {\n console.error('登出失败:', error);\n }\n };\n\n if (!isLoggedIn || !user) {\n return null;\n }\n\n return (\n <div className=\"bg-white border-b border-gray-200 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center space-x-2\">\n <User className=\"w-5 h-5 text-gray-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {user.name || user.email || '用户'}\n </span>\n {user.role && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <div className=\"flex items-center space-x-1 text-sm text-gray-500\">\n <FlaskConical className=\"w-4 h-4\" />\n <span>实验田</span>\n </div>\n \n <button\n onClick={handleLogout}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500\"\n >\n <LogOut className=\"w-4 h-4 mr-1\" />\n 登出\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UserInfoBar;\n"]}