sa2kit 1.6.113 → 1.6.114

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 (63) hide show
  1. package/dist/{index-CdtT3qtg.d.ts → index-CL4cXTf2.d.ts} +9 -92
  2. package/dist/{index-BQVl--uZ.d.mts → index-D78lqnFG.d.mts} +1 -1
  3. package/dist/{index-DGuqvsv-.d.ts → index-Dw9P_FAX.d.ts} +1 -1
  4. package/dist/{index-CcKFeVut.d.mts → index-DyTrbHIH.d.mts} +9 -92
  5. package/dist/{index-C0YVsYpz.d.ts → index-Sy5rj_Et.d.ts} +2 -2
  6. package/dist/{index-DPd4bnYA.d.mts → index-anBAKrnN.d.mts} +2 -2
  7. package/dist/index.d.mts +3 -3
  8. package/dist/index.d.ts +3 -3
  9. package/dist/index.js +53 -70
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +53 -70
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/showmasterpiece/core.js +41 -50
  14. package/dist/showmasterpiece/core.js.map +1 -1
  15. package/dist/showmasterpiece/core.mjs +41 -50
  16. package/dist/showmasterpiece/core.mjs.map +1 -1
  17. package/dist/showmasterpiece/db.js +2 -2
  18. package/dist/showmasterpiece/db.js.map +1 -1
  19. package/dist/showmasterpiece/db.mjs +2 -2
  20. package/dist/showmasterpiece/db.mjs.map +1 -1
  21. package/dist/showmasterpiece/index.js +40 -45
  22. package/dist/showmasterpiece/index.js.map +1 -1
  23. package/dist/showmasterpiece/index.mjs +40 -45
  24. package/dist/showmasterpiece/index.mjs.map +1 -1
  25. package/dist/showmasterpiece/logic/index.js +41 -50
  26. package/dist/showmasterpiece/logic/index.js.map +1 -1
  27. package/dist/showmasterpiece/logic/index.mjs +41 -50
  28. package/dist/showmasterpiece/logic/index.mjs.map +1 -1
  29. package/dist/showmasterpiece/server/index.js +2 -2
  30. package/dist/showmasterpiece/server/index.js.map +1 -1
  31. package/dist/showmasterpiece/server/index.mjs +2 -2
  32. package/dist/showmasterpiece/server/index.mjs.map +1 -1
  33. package/dist/showmasterpiece/service/client-business/index.d.mts +1 -1
  34. package/dist/showmasterpiece/service/client-business/index.d.ts +1 -1
  35. package/dist/showmasterpiece/service/client-business/index.js +45 -62
  36. package/dist/showmasterpiece/service/client-business/index.js.map +1 -1
  37. package/dist/showmasterpiece/service/client-business/index.mjs +45 -62
  38. package/dist/showmasterpiece/service/client-business/index.mjs.map +1 -1
  39. package/dist/showmasterpiece/service/index.d.mts +2 -2
  40. package/dist/showmasterpiece/service/index.d.ts +2 -2
  41. package/dist/showmasterpiece/service/index.js +45 -62
  42. package/dist/showmasterpiece/service/index.js.map +1 -1
  43. package/dist/showmasterpiece/service/index.mjs +45 -62
  44. package/dist/showmasterpiece/service/index.mjs.map +1 -1
  45. package/dist/showmasterpiece/service/web/index.d.mts +2 -2
  46. package/dist/showmasterpiece/service/web/index.d.ts +2 -2
  47. package/dist/showmasterpiece/service/web/index.js +45 -62
  48. package/dist/showmasterpiece/service/web/index.js.map +1 -1
  49. package/dist/showmasterpiece/service/web/index.mjs +45 -62
  50. package/dist/showmasterpiece/service/web/index.mjs.map +1 -1
  51. package/dist/showmasterpiece/ui/miniapp/index.js +5 -5
  52. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  53. package/dist/showmasterpiece/ui/miniapp/index.mjs +5 -5
  54. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  55. package/dist/showmasterpiece/ui/web/index.js +40 -45
  56. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  57. package/dist/showmasterpiece/ui/web/index.mjs +40 -45
  58. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  59. package/dist/showmasterpiece/web/index.js +40 -45
  60. package/dist/showmasterpiece/web/index.js.map +1 -1
  61. package/dist/showmasterpiece/web/index.mjs +40 -45
  62. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  63. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/logger/types.ts","../../../src/logger/console-adapter.ts","../../../src/logger/Logger.ts","../../../src/logger/index.ts","../../../src/universalFile/server/utils/mime.ts","../../../src/universalFile/types.ts","../../../src/universalFile/server/types.ts","../../../src/universalFile/server/providers/AliyunOSSProvider.ts","../../../src/universalFile/server/providers/LocalStorageProvider.ts","../../../src/universalFile/server/UniversalFileService.ts","../../../src/business/showmasterpiece/service/api/client.ts","../../../src/business/showmasterpiece/service/web/index.ts","../../../src/business/showmasterpiece/service/web/client.ts","../../../src/business/showmasterpiece/service/client-business/index.ts","../../../src/business/showmasterpiece/service/client-business/masterpiecesService.ts","../../../src/business/showmasterpiece/service/client-business/masterpiecesConfigService.ts","../../../src/business/showmasterpiece/service/client-business/cartService.ts","../../../src/business/showmasterpiece/service/client-business/cartHistoryService.ts","../../../src/business/showmasterpiece/service/client-business/bookingService.ts","../../../src/business/showmasterpiece/service/client-business/bookingAdminService.ts","../../../src/business/showmasterpiece/service/client-business/eventAwareMasterpiecesService.ts","../../../src/business/showmasterpiece/service/client-business/exportConfig.ts","../../../src/business/showmasterpiece/service/client-business/fileService.ts","../../../src/services/universalFile/config/index.ts","../../../src/business/showmasterpiece/service/miniapp/index.ts","../../../src/business/showmasterpiece/service/miniapp/client.ts"],"names":["path","init_types","FileServiceError","StorageProviderError","logger","fs","uuidv4","AliyunOSSProvider","LocalStorageProvider","path3","basename","getCollectionsOverview","batchBooking","createBooking","getBookableCollections","getBookings","deleteBooking","updateBookingStatus","UniversalFileService","checkPopupConfigs","getCategories","extractErrorMessage","createClient"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4, // 禁用所有日志\n}\n\n/**\n * 日志条目\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n context?: string;\n error?: Error;\n}\n\n/**\n * 日志适配器接口\n * 不同平台实现不同的日志输出方式\n */\nexport interface LoggerAdapter {\n /**\n * 输出日志\n */\n log(entry: LogEntry): void;\n\n /**\n * 批量输出日志(可选)\n */\n logBatch?(entries: LogEntry[]): void;\n}\n\n/**\n * 日志配置\n */\nexport interface LoggerConfig {\n /**\n * 最小日志级别\n * 只有大于等于此级别的日志才会输出\n */\n minLevel: LogLevel;\n\n /**\n * 是否启用时间戳\n */\n enableTimestamp?: boolean;\n\n /**\n * 是否启用上下文(模块名)\n */\n enableContext?: boolean;\n\n /**\n * 环境(development/production)\n */\n environment?: 'development' | 'production';\n\n /**\n * 自定义适配器\n */\n adapter?: LoggerAdapter;\n}\n\n","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","export * from './types';\nexport * from './Logger';\nexport * from './console-adapter';\n\n","/**\n * MIME 类型工具函数\n */\n\nimport * as path from 'path';\n\n/** MIME 类型映射表 */\nconst MIME_TYPES: Record<string, string> = {\n // 图片\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n\n // 视频\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.wmv': 'video/x-ms-wmv',\n '.flv': 'video/x-flv',\n '.mkv': 'video/x-matroska',\n '.webm': 'video/webm',\n\n // 音频\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.flac': 'audio/flac',\n '.aac': 'audio/aac',\n\n // 文档\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.txt': 'text/plain',\n '.rtf': 'application/rtf',\n\n // 压缩文件\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n\n // 代码文件\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.css': 'text/css',\n '.ts': 'application/typescript',\n\n // 其他\n '.csv': 'text/csv',\n '.md': 'text/markdown',\n};\n\n/**\n * 根据文件名获取 MIME 类型\n *\n * @param filename 文件名\n * @returns MIME 类型\n *\n * @example\n * ```typescript\n * getMimeType('photo.jpg') // 'image/jpeg'\n * getMimeType('video.mp4') // 'video/mp4'\n * getMimeType('unknown.xyz') // 'application/octet-stream'\n * ```\n */\nexport function getMimeType(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return MIME_TYPES[ext] || 'application/octet-stream';\n}\n\n/**\n * 根据 MIME 类型获取文件扩展名\n *\n * @param mimeType MIME 类型\n * @returns 文件扩展名(包含点号)\n *\n * @example\n * ```typescript\n * getExtensionFromMimeType('image/jpeg') // '.jpg'\n * getExtensionFromMimeType('video/mp4') // '.mp4'\n * ```\n */\nexport function getExtensionFromMimeType(mimeType: string): string | null {\n for (const [ext, mime] of Object.entries(MIME_TYPES)) {\n if (mime === mimeType) {\n return ext;\n }\n }\n return null;\n}\n\n/**\n * 检查是否为图片类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为图片\n */\nexport function isImageType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * 检查是否为视频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为视频\n */\nexport function isVideoType(mimeType: string): boolean {\n return mimeType.startsWith('video/');\n}\n\n/**\n * 检查是否为音频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为音频\n */\nexport function isAudioType(mimeType: string): boolean {\n return mimeType.startsWith('audio/');\n}\n\n/**\n * 检查是否为文档类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为文档\n */\nexport function isDocumentType(mimeType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument',\n 'text/plain',\n 'application/rtf',\n ];\n return documentTypes.some(type => mimeType.includes(type));\n}\n\n/**\n * 验证 MIME 类型是否在允许列表中\n *\n * @param mimeType MIME 类型\n * @param allowedTypes 允许的类型列表(支持通配符)\n * @returns 是否允许\n *\n * @example\n * ```typescript\n * isAllowedMimeType('image/jpeg', ['image/*']) // true\n * isAllowedMimeType('video/mp4', ['image/*']) // false\n * isAllowedMimeType('image/png', ['image/jpeg']) // false\n * ```\n */\nexport function isAllowedMimeType(\n mimeType: string,\n allowedTypes: string[]\n): boolean {\n return allowedTypes.some(allowed => {\n if (allowed === '*/*') {\n return true;\n }\n if (allowed.endsWith('/*')) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix + '/');\n }\n return mimeType === allowed;\n });\n}\n\n","/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n","/**\n * UniversalFile Server 端类型定义\n */\n\nimport type {\n StorageType as _StorageType,\n CDNType as _CDNType,\n ProcessorType as _ProcessorType,\n FileMetadata,\n UploadStatus,\n AccessPermission,\n UploadFileInfo as _UploadFileInfo,\n ProcessingOptions as _ProcessingOptions,\n} from '../types';\n\n// Re-export client types for server use\nexport type StorageType = _StorageType;\nexport type CDNType = _CDNType;\nexport type ProcessorType = _ProcessorType;\nexport type UploadFileInfo = _UploadFileInfo;\nexport type ProcessingOptions = _ProcessingOptions;\n\n// ============= Provider 接口 =============\n\n/** 存储提供者接口 */\nexport interface IStorageProvider {\n /** 提供者类型 */\n readonly type: StorageType;\n\n /** 初始化 */\n initialize(config: StorageConfig): Promise<void>;\n\n /** 上传文件 */\n upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;\n\n /** 下载文件 */\n download(path: string): Promise<Buffer>;\n\n /** 删除文件 */\n delete(path: string): Promise<StorageResult>;\n\n /** 获取文件信息 */\n getFileInfo(path: string): Promise<StorageResult>;\n\n /** 生成访问URL */\n getAccessUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 生成预签名上传URL */\n getUploadUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 检查文件是否存在 */\n exists(path: string): Promise<boolean>;\n\n /** 列出文件 */\n list(prefix: string, maxKeys?: number): Promise<string[]>;\n}\n\n/** CDN 提供者接口 */\nexport interface ICDNProvider {\n /** 提供者类型 */\n readonly type: CDNType;\n\n /** 初始化 */\n initialize(config: CDNConfig): Promise<void>;\n\n /** 生成CDN URL */\n generateUrl(originalUrl: string): Promise<string>;\n\n /** 刷新缓存 */\n refreshCache(urls: string[]): Promise<CDNResult>;\n\n /** 预热缓存 */\n preheatCache(urls: string[]): Promise<CDNResult>;\n\n /** 获取访问统计 */\n getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;\n}\n\n/** 文件处理器接口 */\nexport interface IFileProcessor {\n /** 处理器类型 */\n readonly type: ProcessorType;\n\n /** 初始化 */\n initialize(): Promise<void>;\n\n /** 处理文件 */\n process(\n inputPath: string,\n outputPath: string,\n options: ProcessingOptions\n ): Promise<ProcessingResult>;\n\n /** 检查文件是否支持处理 */\n supports(mimeType: string): boolean;\n\n /** 获取文件信息 */\n getFileInfo(filePath: string): Promise<Record<string, any>>;\n}\n\n// ============= 配置接口 =============\n\n/** 存储配置基础接口 */\nexport interface StorageConfig {\n /** 存储类型 */\n type: StorageType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 本地存储配置 */\nexport interface LocalStorageConfig extends StorageConfig {\n type: 'local';\n /** 存储根目录 */\n rootPath: string;\n /** 基础URL */\n baseUrl: string;\n}\n\n/** 阿里云 OSS 配置 */\nexport interface AliyunOSSConfig extends StorageConfig {\n type: 'aliyun-oss';\n /** 地域 */\n region: string;\n /** 存储桶名称 */\n bucket: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 自定义域名 */\n customDomain?: string;\n /** 是否使用HTTPS */\n secure?: boolean;\n /** 是否使用内网访问 */\n internal?: boolean;\n}\n\n/** CDN配置基础接口 */\nexport interface CDNConfig {\n /** CDN类型 */\n type: CDNType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 阿里云 CDN 配置 */\nexport interface AliyunCDNConfig extends CDNConfig {\n type: 'aliyun-cdn';\n /** CDN域名 */\n domain: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 地域 */\n region?: string;\n}\n\n/** 缓存配置 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 最大缓存大小 */\n maxSize?: number;\n /** 缓存 TTL(秒) */\n ttl?: number;\n /** 是否使用 Redis */\n useRedis?: boolean;\n /** Redis 配置 */\n redisConfig?: {\n host: string;\n port: number;\n password?: string;\n db?: number;\n };\n}\n\n/** 文件服务配置 */\n/** 缓存配置扩展 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 元数据缓存TTL(秒) */\n metadataTTL?: number;\n /** URL缓存TTL(秒) */\n urlTTL?: number;\n /** 最大缓存条目数 */\n maxSize?: number;\n}\n\nexport interface UniversalFileServiceConfig {\n /** 存储配置 */\n storage: StorageConfig;\n /** CDN 配置(可选) */\n cdn?: CDNConfig;\n /** 缓存配置(可选) */\n cache?: CacheConfig;\n /** 数据库持久化配置(可选) */\n persistence?: FileServicePersistenceConfig;\n /** 启用的处理器 */\n processors?: ProcessorType[];\n /** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */\n db?: any;\n /** 最大文件大小(字节) */\n maxFileSize?: number;\n /** 允许的文件类型 */\n allowedMimeTypes?: string[];\n /** 是否启用监控 */\n enableMonitoring?: boolean;\n\n // 运行时字段(由服务类内部管理)\n /** 存储提供者映射(内部使用) */\n storageProviders?: Map<StorageType, IStorageProvider>;\n /** 默认存储类型 */\n defaultStorage?: StorageType;\n /** 默认CDN类型 */\n defaultCDN?: CDNType;\n}\n\n// ============= 结果类型 =============\n\n/** 存储结果 */\n/** 存储操作结果 */\nexport interface StorageResult {\n /** 是否成功 */\n success: boolean;\n /** 存储路径 */\n path?: string;\n /** 访问URL */\n url?: string;\n /** 文件大小 */\n size?: number;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 存储元数据 */\nexport interface StorageMetadata {\n /** 文件大小 */\n size: number;\n /** MIME 类型 */\n mimeType: string;\n /** 最后修改时间 */\n lastModified: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** CDN 结果 */\n/** CDN操作结果 */\nexport interface CDNResult {\n /** 是否成功 */\n success: boolean;\n /** CDN URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** CDN 统计信息 */\nexport interface CDNStats {\n /** 带宽(字节/秒) */\n bandwidth: number;\n /** 请求数 */\n requests: number;\n /** 流量(字节) */\n traffic: number;\n /** 统计时间范围 */\n timeRange: {\n start: Date;\n end: Date;\n };\n}\n\n/** 处理结果 */\nexport interface ProcessingResult {\n /** 是否成功 */\n success: boolean;\n /** 处理后的文件路径 */\n processedPath?: string;\n /** 处理后的文件大小 */\n processedSize?: number;\n /** 缩略图路径 */\n thumbnailPath?: string;\n /** 错误信息 */\n error?: string;\n /** 处理耗时(毫秒) */\n processingTime?: number;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 处理器信息 */\nexport interface ProcessorInfo {\n /** 处理器名称 */\n name: string;\n /** 处理器版本 */\n version: string;\n /** 支持的格式 */\n supportedFormats: string[];\n /** 支持的操作 */\n supportedOperations: string[];\n}\n\n// ============= 数据库相关类型 =============\n\n/** 文件数据库记录 */\nexport interface FileRecord extends FileMetadata {\n /** 创建时间 */\n createdAt: Date | string;\n /** 更新时间 */\n updatedAt: Date | string;\n}\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块 ID */\n moduleId?: string;\n /** 业务 ID */\n businessId?: string;\n /** 上传者 ID */\n uploaderId?: string;\n /** 文件类型 */\n mimeType?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 状态 */\n status?: UploadStatus;\n /** 分页 */\n page?: number;\n pageSize?: number;\n /** 排序 */\n orderBy?: string;\n orderDirection?: 'asc' | 'desc';\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据列表 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n}\n\n// ============= 事件类型 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'delete:error'\n | 'process:start'\n | 'process:complete'\n | 'process:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件 ID */\n fileId: string;\n /** 事件数据 */\n data?: any;\n /** 时间戳 */\n timestamp: Date;\n}\n\n/** 事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 数据库持久化接口 =============\n\n/**\n * 文件元数据数据库持久化接口\n *\n * 实现此接口以提供自定义的数据库持久化支持\n *\n * @example\n * ```typescript\n * // Drizzle ORM 实现\n * class DrizzleFileRepository implements IFileMetadataRepository {\n * async save(metadata: FileMetadata): Promise<void> {\n * await db.insert(fileMetadata).values(metadata);\n * }\n * // ... 其他方法\n * }\n * ```\n */\nexport interface IFileMetadataRepository {\n /**\n * 保存文件元数据到数据库\n */\n save(metadata: FileMetadata): Promise<void>;\n\n /**\n * 从数据库获取文件元数据\n */\n get(fileId: string): Promise<FileMetadata | null>;\n\n /**\n * 查询文件列表\n */\n query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;\n\n /**\n * 从数据库删除文件元数据\n */\n delete(fileId: string): Promise<void>;\n\n /**\n * 批量删除文件元数据\n */\n batchDelete(fileIds: string[]): Promise<void>;\n}\n\n/**\n * 数据库持久化配置\n */\nexport interface FileServicePersistenceConfig {\n /**\n * 是否启用持久化\n */\n enabled: boolean;\n\n /**\n * 持久化仓储实现\n */\n repository: IFileMetadataRepository;\n\n /**\n * 是否自动持久化(默认 true)\n * 如果为 true,文件上传完成后自动保存到数据库\n */\n autoPersist?: boolean;\n\n /**\n * 是否优先使用缓存(默认 false)\n * 如果为 true,查询时优先从缓存获取\n */\n cacheFirst?: boolean;\n}\n\n// ============= 异常类型定义 =============\n\n/** 文件服务异常基类 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传异常 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理异常 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者异常 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者异常 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n","/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n logger.info('🔄 [AliyunOSSProvider] 重新初始化OSS客户端', config);\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n '☁️ [AliyunOSSProvider] 新配置: bucket=' + (newConfig.bucket) + ', region=' + (newConfig.region)\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info('☁️ [AliyunOSSProvider] ' + (this.isInitialized ? '重新' : '') + '初始化阿里云OSS');\n logger.info('☁️ [AliyunOSSProvider] ' + (this.config ? JSON.stringify(this.config) : ''));\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n this.isInitialized = true;\n logger.info('✅ [AliyunOSSProvider] 阿里云OSS' + (configChanged ? '重新' : '') + '初始化完成');\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始上传文件到OSS: ' + (filePath));\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n '📦 [AliyunOSSProvider] 使用分片上传大文件: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n '📤 [AliyunOSSProvider] 使用普通上传: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [AliyunOSSProvider] 开始从OSS下载文件: ' + (filePath));\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n '✅ [AliyunOSSProvider] 文件下载完成: ' + (filePath) + ', 大小: ' + (result.content.length)\n );\n\n return result.content;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件下载失败: ' + (filePath) + ':', error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ' + (filePath));\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件删除完成: ' + (filePath));\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件删除失败: ' + (filePath) + ':', error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn('⚠️ [AliyunOSSProvider] 文件不存在: ' + (filePath));\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成访问URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成上传URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn('⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ' + (filePath) + ':', error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n \n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info('📦 [AliyunOSSProvider] 上传进度: ' + ((p * 100).toFixed(1)) + '%');\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.customDomain) + '/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用自定义域名: ' + (url));\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.bucket) + '.' + (this.config.region) + '.aliyuncs.com/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用默认OSS域名: ' + (url));\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n // if (this.isOSSError(error)) {\n // const requestId = error.requestId ? ' (RequestId: ' + (error.requestId) + ')' : '';\n // return (error.code) + ': ' + (error.message) + (requestId);\n // }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ' + (filePath));\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 流式上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ' + (filePaths.length));\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info('✅ [AliyunOSSProvider] 批量删除完成,成功: ' + (result.deleted?.length || 0));\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('📋 [AliyunOSSProvider] 开始复制文件: ' + (sourcePath) + ' -> ' + (targetPath));\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件复制完成: ' + (sourcePath) + ' -> ' + (targetPath));\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件复制失败: ' + (sourcePath) + ' -> ' + (targetPath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n","/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info('📂 [LocalStorageProvider] 初始化本地存储,根目录: ' + (this.config.rootPath));\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始上传文件: ' + (filePath));\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n '文件大小不匹配: 期望 ' + (fileInfo.file.size) + ', 实际 ' + (stats.size)\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [LocalStorageProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [LocalStorageProvider] 开始下载文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件下载完成: ' + (path) + ', 大小: ' + (buffer.length));\n\n return buffer;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件下载失败: ' + (path) + ':', error);\n throw new StorageProviderError(\n '文件下载失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [LocalStorageProvider] 开始删除文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn('⚠️ [LocalStorageProvider] 文件不存在: ' + (path));\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件删除完成: ' + (path));\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件删除失败: ' + (path) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : '/' + (urlPath);\n\n return (this.config.baseUrl) + (normalizedUrlPath);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n '目录访问权限不足: ' + (dirPath) + ', ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始流式上传文件: ' + (filePath));\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n '✅ [LocalStorageProvider] 流式上传完成: ' + (filePath) + ', 大小: ' + (stats.size) + ', 耗时: ' + (uploadTime) + 'ms'\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n return createReadStream(fullPath);\n }\n}\n\n","/**\n * 通用文件服务核心实现\n *\n * 提供统一的文件上传、下载、管理接口\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport { createLogger } from '../../logger';\nimport { getMimeType } from './utils/mime';\n\nconst logger = createLogger('UniversalFileService');\n\nimport type {\n StorageType,\n CDNType,\n ProcessorType,\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n FileEvent,\n FileEventListener,\n UploadStatus,\n} from '../types';\n\n// Backend specific types\nimport type {\n UniversalFileServiceConfig,\n IStorageProvider,\n ICDNProvider,\n IFileProcessor,\n} from './types';\n\nimport {\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n} from '../types';\n\n/**\n * 通用文件服务类\n */\nexport class UniversalFileService extends EventEmitter {\n private config: UniversalFileServiceConfig;\n private storageProviders = new Map<StorageType, IStorageProvider>();\n private cdnProviders = new Map<CDNType, ICDNProvider>();\n private fileProcessors = new Map<ProcessorType, IFileProcessor>();\n private uploadProgressMap = new Map<string, UploadProgress>();\n private metadataCache = new Map<string, { data: FileMetadata; expires: number }>();\n private urlCache = new Map<string, { url: string; expires: number }>();\n private processingQueue: Array<{\n fileId: string;\n processor: IFileProcessor;\n inputPath: string;\n outputPath: string;\n options: any;\n }> = [];\n private isProcessingQueueRunning = false;\n\n constructor(config: UniversalFileServiceConfig) {\n super();\n this.config = config;\n\n // 如果启用了持久化,设置自动监听器\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n this.setupPersistenceListeners();\n }\n }\n\n // ============= 持久化设置 =============\n\n /**\n * 设置数据库持久化监听器\n *\n * 当文件上传完成或删除时,自动触发数据库操作\n */\n private setupPersistenceListeners(): void {\n const { repository, autoPersist = true } = this.config.persistence!;\n\n if (!autoPersist) {\n logger.info('⚙️ [UniversalFileService] 自动持久化已禁用');\n return;\n }\n\n logger.info('✅ [UniversalFileService] 已启用数据库持久化,自动监听文件事件');\n\n // 监听文件上传完成事件\n this.on('upload:complete', async (fileId: string, data: any) => {\n try {\n const metadata = data.metadata || data;\n await repository.save(metadata);\n logger.info('💾 [Persistence] 文件元数据已自动保存: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 保存失败: ' + (fileId), error);\n // 不抛出错误,避免影响上传流程\n }\n });\n\n // 监听文件删除事件\n this.on('file:deleted', async (fileId: string) => {\n try {\n await repository.delete(fileId);\n logger.info('🗑️ [Persistence] 文件元数据已自动删除: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 删除失败: ' + (fileId), error);\n }\n });\n\n // 监听批量删除事件\n this.on('files:batch-deleted', async (fileIds: string[]) => {\n try {\n await repository.batchDelete(fileIds);\n logger.info('🗑️ [Persistence] 批量删除元数据: ' + (fileIds.length) + ' 个文件');\n } catch (error) {\n logger.error(`❌ [Persistence] 批量删除失败`, error);\n }\n });\n }\n\n // ============= 初始化方法 =============\n\n /**\n * 初始化文件服务\n */\n async initialize(): Promise<void> {\n logger.info('🚀 [UniversalFileService] 开始初始化文件服务...');\n\n try {\n // 验证配置是否完整\n await this.validateConfiguration();\n\n // 初始化存储提供者\n await this.initializeStorageProviders();\n\n // 初始化CDN提供者\n await this.initializeCDNProviders();\n\n // 初始化文件处理器\n await this.initializeFileProcessors();\n\n logger.info('✅ [UniversalFileService] 文件服务初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件服务初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitializeStorageProviders(): Promise<void> {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者...');\n\n try {\n // 重新初始化所有存储提供者\n for (const [type, provider] of this.storageProviders) {\n if ('reinitialize' in provider) {\n try {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者: ' + (type) + '...');\n\n // 获取对应的配置(从原始配置中获取)\n const config = (this.config as any).storageProviders?.[type as string];\n if (config) {\n await (provider as any).reinitialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成: ' + (type));\n } else {\n logger.warn('⚠️ [UniversalFileService] 存储提供者配置不存在: ' + (type));\n }\n } catch (error) {\n logger.error('❌ [UniversalFileService] 存储提供者重新初始化失败: ' + (type), error);\n // 继续处理其他提供者\n }\n }\n }\n\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 存储提供者重新初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 注册存储提供者\n */\n registerStorageProvider(provider: IStorageProvider): void {\n this.storageProviders.set(provider.type, provider);\n logger.info('📦 [UniversalFileService] 注册存储提供者: ' + (provider.type));\n }\n\n /**\n * 注册CDN提供者\n */\n registerCDNProvider(provider: ICDNProvider): void {\n this.cdnProviders.set(provider.type, provider);\n logger.info('🌐 [UniversalFileService] 注册CDN提供者: ' + (provider.type));\n }\n\n /**\n * 注册文件处理器\n */\n registerFileProcessor(processor: IFileProcessor): void {\n this.fileProcessors.set(processor.type, processor);\n logger.info('⚙️ [UniversalFileService] 注册文件处理器: ' + (processor.type));\n }\n\n // ============= 核心文件操作方法 =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n storageType?: StorageType,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const fileId = uuidv4();\n const startTime = Date.now();\n\n logger.info('📤 [UniversalFileService] 开始上传文件: ' + (fileInfo.file.name) + ', ID: ' + (fileId));\n\n try {\n // 验证文件\n await this.validateFile(fileInfo.file);\n\n // 初始化上传进度\n const progress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n this.uploadProgressMap.set(fileId, progress);\n this.emitFileEvent('upload:start', fileId, { fileName: fileInfo.file.name });\n\n // 生成文件元数据\n const metadata = await this.generateFileMetadata(fileId, fileInfo);\n\n // 选择存储提供者\n const selectedStorageType = storageType || this.config.defaultStorage;\n let storageProvider = this.storageProviders.get(selectedStorageType as StorageType);\n\n // 如果指定的存储提供者不可用,优先尝试OSS\n if (!storageProvider) {\n logger.info(\n '⚠️ [UniversalFileService] 存储提供者 ' + (selectedStorageType) + ' 不可用,尝试使用OSS'\n );\n storageProvider = this.storageProviders.get('aliyun-oss');\n\n // 如果OSS也不可用,回退到本地存储\n if (!storageProvider) {\n logger.info(`⚠️ [UniversalFileService] OSS不可用,回退到本地存储`);\n storageProvider = this.storageProviders.get('local');\n }\n }\n\n if (!storageProvider) {\n throw new StorageProviderError(`没有可用的存储提供者`);\n }\n\n // 生成存储路径\n const storagePath = this.generateStoragePath(metadata);\n\n // 更新上传状态\n progress.status = 'uploading';\n progress.progress = 10;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n this.emitFileEvent('upload:progress', fileId, { progress: progress.progress });\n\n // 执行上传\n const uploadResult = await storageProvider.upload(fileInfo, storagePath);\n\n if (!uploadResult.success) {\n throw new FileUploadError('上传失败: ' + (uploadResult.error));\n }\n\n // 更新元数据\n metadata.storagePath = uploadResult.path || storagePath;\n metadata.storageProvider = selectedStorageType as StorageType;\n\n // 生成CDN URL(如果启用)\n if (this.config.defaultCDN !== 'none') {\n const cdnProvider = this.cdnProviders.get(this.config.defaultCDN as CDNType);\n if (cdnProvider && uploadResult.url) {\n metadata.cdnUrl = await cdnProvider.generateUrl(uploadResult.url);\n }\n }\n\n // 更新上传进度\n progress.status = fileInfo.needsProcessing ? 'processing' : 'completed';\n progress.progress = fileInfo.needsProcessing ? 70 : 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n // 如果需要处理,添加到处理队列\n if (fileInfo.needsProcessing && fileInfo.processingOptions) {\n await this.queueFileProcessing(metadata, fileInfo.processingOptions);\n }\n\n // 缓存元数据\n this.cacheMetadata(metadata);\n\n // 保存到数据库通过事件触发(如果启用了持久化)\n // persistence.repository 会监听 'upload:complete' 事件自动保存\n\n // 完成上传\n progress.status = 'completed';\n progress.progress = 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [UniversalFileService] 文件上传完成: ' + (fileId) + ', 耗时: ' + (uploadTime) + 'ms');\n\n this.emitFileEvent('upload:complete', fileId, {\n fileName: fileInfo.file.name,\n size: fileInfo.file.size,\n uploadTime,\n });\n\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件上传失败: ' + (fileId) + ':', error);\n\n // 更新上传状态为失败\n const progress = this.uploadProgressMap.get(fileId);\n if (progress) {\n progress.status = 'failed';\n progress.error = error instanceof Error ? error.message : '上传失败';\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n }\n\n this.emitFileEvent(\n 'upload:error',\n fileId,\n undefined,\n error instanceof Error ? error.message : '上传失败'\n );\n throw error;\n } finally {\n // 清理上传进度(可选,或设置过期时间)\n setTimeout(\n () => {\n this.uploadProgressMap.delete(fileId);\n },\n 5 * 60 * 1000\n ); // 5分钟后清理\n }\n }\n\n\n /**\n * 下载文件\n */\n async downloadFile(fileId: string, userId?: string): Promise<Buffer> {\n logger.info('📥 [UniversalFileService] 开始下载文件: ' + (fileId));\n\n try {\n this.emitFileEvent('download:start', fileId);\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查权限\n await this.checkFileAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 下载文件\n const fileBuffer = await storageProvider.download(metadata.storagePath);\n\n // 更新访问统计 (如果启用了持久化)\n if (this.config.persistence?.enabled) {\n await this.updateAccessStats(fileId);\n }\n\n logger.info('✅ [UniversalFileService] 文件下载完成: ' + (fileId));\n this.emitFileEvent('download:complete', fileId, { size: fileBuffer.length });\n\n return fileBuffer;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件下载失败: ' + (fileId) + ':', error);\n this.emitFileEvent('download:error', fileId, undefined, error instanceof Error ? error.message : '下载失败');\n throw error;\n }\n }\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string, userId?: string): Promise<void> {\n logger.info('🗑️ [UniversalFileService] 开始删除文件: ' + (fileId));\n\n try {\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查删除权限\n await this.checkFileDeleteAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 从存储中删除文件\n const deleteResult = await storageProvider.delete(metadata.storagePath);\n\n if (!deleteResult.success) {\n console.warn('⚠️ [UniversalFileService] 存储文件删除失败: ' + (deleteResult.error));\n }\n\n // 从数据库中删除元数据 (通过事件触发)\n if (this.config.persistence?.enabled) {\n await this.deleteFileMetadata(fileId);\n }\n\n // 清除缓存\n this.clearMetadataCache(fileId);\n\n logger.info('✅ [UniversalFileService] 文件删除完成: ' + (fileId));\n this.emitFileEvent('delete:complete', fileId);\n this.emit('file:deleted', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件删除失败: ' + (fileId) + ':', error);\n this.emitFileEvent('delete:error', fileId, undefined, error instanceof Error ? error.message : '删除失败');\n throw error;\n }\n }\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, userId?: string, expiresIn?: number): Promise<string> {\n // 检查缓存\n const cacheKey = (fileId) + '_' + (userId || 'public') + '_' + (expiresIn || 0);\n const cached = this.urlCache.get(cacheKey);\n\n if (cached && cached.expires > Date.now()) {\n return cached.url;\n }\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查访问权限\n await this.checkFileAccess(metadata, userId);\n\n let url: string;\n\n // 优先使用CDN URL\n if (metadata.cdnUrl) {\n url = metadata.cdnUrl;\n } else {\n // 获取存储提供者访问URL\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);\n }\n\n // 缓存URL\n const cacheExpires = Date.now() + (this.config.cache?.urlTTL || 1800) * 1000;\n this.urlCache.set(cacheKey, { url, expires: cacheExpires });\n\n return url;\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata | null> {\n // 检查缓存\n const cached = this.metadataCache.get(fileId);\n if (cached && cached.expires > Date.now()) {\n return cached.data;\n }\n\n // 如果启用了持久化,从数据库查询\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n try {\n const metadata = await this.config.persistence.repository.get(fileId);\n if (metadata) {\n // 缓存结果\n this.cacheMetadata(metadata);\n }\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件元数据失败:', error);\n return null;\n }\n }\n\n // 如果没有启用持久化,返回 null\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件元数据: ' + (fileId));\n return null;\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件列表');\n return {\n items: [],\n total: 0,\n page: options.page || 1,\n pageSize: options.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n\n try {\n const result = await this.config.persistence.repository.query(options);\n // 添加 hasNext 和 hasPrev\n const hasNext = result.page < result.totalPages;\n const hasPrev = result.page > 1;\n return {\n ...result,\n hasNext,\n hasPrev,\n };\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[], userId?: string): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n successCount: 0,\n failureCount: 0,\n failures: [],\n };\n\n for (const fileId of fileIds) {\n try {\n await this.deleteFile(fileId, userId);\n result.successCount++;\n } catch (error) {\n result.failureCount++;\n result.failures.push({\n fileId,\n error: error instanceof Error ? error.message : '删除失败',\n });\n }\n }\n\n // 触发批量删除事件\n if (result.successCount > 0) {\n this.emit('files:batch-deleted', fileIds.filter((_, i) => i < result.successCount));\n }\n\n return result;\n }\n\n /**\n * 获取上传进度\n */\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this.uploadProgressMap.get(fileId);\n }\n\n // ============= 事件处理方法 =============\n\n /**\n * 监听文件事件\n */\n onFileEvent(eventType: string, listener: FileEventListener): void {\n this.on(eventType, listener);\n }\n\n /**\n * 移除文件事件监听器\n */\n offFileEvent(eventType: string, listener: FileEventListener): void {\n this.off(eventType, listener);\n }\n\n // ============= 私有方法 =============\n\n /**\n * 验证配置是否完整\n */\n private async validateConfiguration(): Promise<void> {\n logger.info('🔍 [UniversalFileService] 验证配置文件...');\n\n // 检查基础配置\n if (!this.config) {\n throw new Error('文件服务配置为空');\n }\n\n // 检查存储配置\n if (!this.config.storage) {\n throw new Error('存储配置为空');\n }\n\n // 检查存储提供者配置\n if (this.config.storage.type === 'aliyun-oss') {\n const ossConfig = this.config.storage as any;\n\n // 如果配置不完整,等待配置加载\n if (!ossConfig.accessKeyId || !ossConfig.accessKeySecret || !ossConfig.bucket || !ossConfig.region) {\n logger.warn('⚠️ [UniversalFileService] OSS配置不完整,等待配置加载...');\n\n // 轮询检查配置是否加载完成,最多等待30秒\n const maxRetries = 30;\n const retryInterval = 1000; // 1秒\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, retryInterval));\n\n // 重新检查配置(这里假设配置可能会被外部更新)\n const updatedConfig = this.config.storage as any;\n if (updatedConfig.accessKeyId && updatedConfig.accessKeySecret && updatedConfig.bucket && updatedConfig.region) {\n logger.info('✅ [UniversalFileService] OSS配置加载完成');\n break;\n }\n\n if (i === maxRetries - 1) {\n throw new Error('OSS配置加载超时:缺少必需的配置项 (accessKeyId, accessKeySecret, bucket, region)');\n }\n\n logger.debug('等待OSS配置加载中... (' + (i + 1) + '/' + (maxRetries) + ')');\n }\n }\n }\n\n // 检查默认存储类型\n if (!this.config.defaultStorage) {\n this.config.defaultStorage = this.config.storage.type as any;\n }\n\n logger.info('✅ [UniversalFileService] 配置验证完成');\n }\n\n private async initializeStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 开始初始化存储提供者...');\n\n // 如果还没有注册任何存储提供者,先注册默认的\n if (this.storageProviders.size === 0) {\n await this.registerDefaultStorageProviders();\n }\n\n if (this.config.storageProviders) {\n for (const [type, config] of Object.entries(this.config.storageProviders)) {\n if (config && config.enabled) {\n const provider = this.storageProviders.get(type as StorageType);\n if (provider) {\n try {\n await provider.initialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者初始化完成: ' + (type));\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 存储提供者初始化失败: ' + (type) + ':', error);\n // 如果默认存储提供者初始化失败,切换到本地存储\n // if (type === this.config.defaultStorage) {\n // console.warn('⚠️ [UniversalFileService] 默认存储提供者 ' + (type) + ' 初始化失败,切换到本地存储');\n // this.config.defaultStorage = 'local';\n // }\n }\n } else {\n console.warn('⚠️ [UniversalFileService] 存储提供者未注册: ' + (type));\n }\n }\n }\n }\n }\n\n private async registerDefaultStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 注册默认存储提供者...');\n\n // 根据配置注册相应的存储提供者\n try {\n if (this.config.storage) {\n if (this.config.storage.type === 'aliyun-oss' && this.config.storage.enabled) {\n const { AliyunOSSProvider } = await import('./providers/AliyunOSSProvider');\n const ossProvider = new AliyunOSSProvider();\n this.registerStorageProvider(ossProvider);\n logger.info('✅ [UniversalFileService] 阿里云OSS提供者注册成功');\n } else if (this.config.storage.type === 'local' && this.config.storage.enabled) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const localProvider = new LocalStorageProvider();\n this.registerStorageProvider(localProvider);\n logger.info('✅ [UniversalFileService] 本地存储提供者注册成功');\n }\n }\n\n // 如果没有注册任何提供者,注册本地存储作为后备\n if (this.storageProviders.size === 0) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const fallbackProvider = new LocalStorageProvider();\n this.registerStorageProvider(fallbackProvider);\n logger.info('✅ [UniversalFileService] 已注册备用本地存储提供者');\n }\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 注册默认存储提供者失败:', error);\n throw new Error('无法初始化存储提供者');\n }\n }\n\n private async initializeCDNProviders(): Promise<void> {\n // CDN 初始化暂时跳过,未来支持多个 CDN 提供者时实现\n if (this.config.cdn && this.config.cdn.enabled) {\n logger.info('✅ [UniversalFileService] CDN配置已启用: ' + (this.config.cdn.type));\n }\n }\n\n private async initializeFileProcessors(): Promise<void> {\n for (const processor of Array.from(this.fileProcessors.values())) {\n await processor.initialize();\n logger.info('✅ [UniversalFileService] 文件处理器初始化完成: ' + (processor.type));\n }\n }\n\n private async validateFile(file: File): Promise<void> {\n // 检查文件大小\n if (this.config.maxFileSize && file.size > this.config.maxFileSize) {\n throw new FileUploadError('文件大小超过限制: ' + (file.size) + ' > ' + (this.config.maxFileSize));\n }\n\n // 检查文件类型\n const mimeType = file.type || getMimeType(file.name);\n\n if (\n this.config.allowedMimeTypes &&\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new FileUploadError('不支持的文件类型: ' + (mimeType));\n }\n }\n\n private async generateFileMetadata(\n fileId: string,\n fileInfo: UploadFileInfo\n ): Promise<FileMetadata> {\n const now = new Date();\n const mimeType = fileInfo.file.type || getMimeType(fileInfo.file.name);\n const extension = path.extname(fileInfo.file.name).toLowerCase();\n\n // 生成文件哈希(用于去重检测)\n const hash = await this.generateFileHash(fileInfo.file);\n\n return {\n id: fileId,\n originalName: fileInfo.file.name,\n storageName: (fileId) + (extension),\n size: fileInfo.file.size,\n mimeType,\n extension,\n hash,\n uploadTime: now,\n permission: fileInfo.permission || 'public',\n uploaderId: fileInfo.metadata?.uploadedBy || 'system',\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n storageProvider: (this.config.defaultStorage || 'local') as StorageType,\n storagePath: '',\n accessCount: 0,\n metadata: fileInfo.metadata || {},\n };\n }\n\n private generateStoragePath(metadata: FileMetadata): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return (metadata.moduleId) + '/' + (year) + '/' + (month) + '/' + (day) + '/' + (metadata.storageName);\n }\n\n private async generateFileHash(file: File): Promise<string> {\n const buffer = await file.arrayBuffer();\n const hash = createHash('sha256');\n hash.update(Buffer.from(buffer));\n return hash.digest('hex');\n }\n\n private async queueFileProcessing(metadata: FileMetadata, options: any): Promise<void> {\n if (!this.config.processors?.length || 0 > 0) {\n return;\n }\n\n const processor = this.fileProcessors.get(options.type);\n if (!processor) {\n console.warn('⚠️ [UniversalFileService] 文件处理器不存在: ' + (options.type));\n return;\n }\n\n if (this.processingQueue.length >= 1000) {\n throw new FileProcessingError('处理队列已满');\n }\n\n this.processingQueue.push({\n fileId: metadata.id,\n processor,\n inputPath: metadata.storagePath,\n outputPath: this.generateProcessedPath(metadata, options),\n options,\n });\n\n // 启动处理队列\n if (!this.isProcessingQueueRunning) {\n this.processFileQueue();\n }\n }\n\n private generateProcessedPath(metadata: FileMetadata, options: any): string {\n const basePath = metadata.storagePath;\n const extension = path.extname(basePath);\n const basename = basePath.replace(extension, '');\n\n return (basename) + '_processed' + (extension);\n }\n\n private async processFileQueue(): Promise<void> {\n if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {\n return;\n }\n\n this.isProcessingQueueRunning = true;\n\n while (this.processingQueue.length > 0) {\n const task = this.processingQueue.shift();\n if (!task) break;\n\n try {\n this.emitFileEvent('processing:start', task.fileId);\n\n const result = await task.processor.process(task.inputPath, task.outputPath, task.options);\n\n if (result.success) {\n this.emitFileEvent('processing:complete', task.fileId, result);\n } else {\n this.emitFileEvent('processing:error', task.fileId, undefined, result.error);\n }\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件处理失败: ' + (task.fileId) + ':', error);\n this.emitFileEvent(\n 'processing:error',\n task.fileId,\n undefined,\n error instanceof Error ? error.message : '处理失败'\n );\n }\n }\n\n this.isProcessingQueueRunning = false;\n }\n\n private cacheMetadata(metadata: FileMetadata): void {\n const expires = Date.now() + (this.config.cache?.metadataTTL || 3600) * 1000;\n this.metadataCache.set(metadata.id, { data: metadata, expires });\n }\n\n private clearMetadataCache(fileId: string): void {\n this.metadataCache.delete(fileId);\n }\n\n private emitFileEvent(type: string, fileId: string, data?: any, error?: string): void {\n const event: FileEvent = {\n type: type as any,\n fileId,\n timestamp: new Date(),\n data,\n error,\n };\n\n this.emit(type, event);\n this.emit('*', event); // 通用事件监听\n }\n\n // ============= 数据库操作私有方法 =============\n\n /**\n * 保存文件元数据到数据库 (通过持久化仓储)\n */\n private async saveFileMetadata(metadata: FileMetadata): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,跳过保存元数据');\n return;\n }\n\n try {\n await this.config.persistence.repository.save(metadata);\n logger.info('💾 [UniversalFileService] 文件元数据保存成功:', metadata.id);\n } catch (error) {\n console.error('❌ [UniversalFileService] 保存文件元数据失败:', error);\n throw new FileUploadError(\n '保存文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 从数据库删除文件元数据 (通过持久化仓储)\n */\n private async deleteFileMetadata(fileId: string): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n return;\n }\n\n try {\n await this.config.persistence.repository.delete(fileId);\n logger.info('🗑️ [UniversalFileService] 文件元数据删除成功:', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 删除文件元数据失败:', error);\n throw new FileUploadError(\n '删除文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 更新访问统计\n */\n private async updateAccessStats(fileId: string): Promise<void> {\n // 访问统计更新由数据库仓储实现决定\n // 这里只记录日志\n logger.info('📊 [UniversalFileService] 需要更新访问统计:', fileId);\n }\n\n /**\n * 检查文件访问权限\n */\n private async checkFileAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 如果文件是公开的,允许访问\n if (metadata.permission === 'public') {\n return;\n }\n\n // 如果是私有文件,检查用户权限\n if (metadata.permission === 'private' && metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限访问此文件');\n }\n\n // 如果是认证用户可访问,检查是否提供了 userId\n if (metadata.permission === 'authenticated' && !userId) {\n throw new FileUploadError('需要登录才能访问此文件');\n }\n }\n\n /**\n * 检查文件删除权限\n */\n private async checkFileDeleteAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 只有上传者可以删除文件\n if (metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限删除此文件');\n }\n }\n\n /**\n * 检查服务是否完全可用(包括存储提供者)\n */\n isFullyInitialized(): boolean {\n // 检查是否有可用的存储提供者\n const hasStorageProvider = Array.from(this.storageProviders.values()).some(provider =>\n provider.type === 'aliyun-oss' || provider.type === 'local'\n );\n\n return hasStorageProvider;\n }\n\n /**\n * 等待服务完全初始化(带超时)\n */\n async waitForInitialization(timeoutMs: number = 30000): Promise<void> {\n const startTime = Date.now();\n\n while (!this.isFullyInitialized()) {\n if (Date.now() - startTime > timeoutMs) {\n throw new Error('服务初始化超时 (' + (timeoutMs) + 'ms)');\n }\n\n // 等待100ms后重试\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n logger.info('✅ [UniversalFileService] 服务完全初始化就绪');\n }\n}\n","import type { ArtCollection } from '../../types';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n url: string;\n method: HttpMethod;\n data?: unknown;\n headers?: Record<string, string>;\n}\n\nexport type RequestExecutor = <T = any>(options: RequestOptions) => Promise<T>;\n\nexport type CollectionOverview = Omit<ArtCollection, 'pages'> & { pages?: ArtCollection['pages'] };\n\nexport interface ShowmasterpieceClient {\n getCollectionsOverview: () => Promise<CollectionOverview[]>;\n getCategories: () => Promise<CategoryOption[]>;\n getBookableCollections: () => Promise<CollectionSummary[]>;\n createBooking: (payload: CreateBookingRequest) => Promise<Booking>;\n batchBooking: (payload: BatchBookingRequest) => Promise<BatchBookingResponse>;\n getBookings: (params: BookingListParams) => Promise<BookingListResponse>;\n checkPopupConfigs: (params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n }) => Promise<PopupConfig[]>;\n}\n\nconst joinUrl = (baseUrl: string, path: string): string => {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n};\n\nconst toSearchParams = (params: BookingListParams): string => {\n const searchParams = new URLSearchParams();\n\n if (params.collectionId) searchParams.set('collectionId', String(params.collectionId));\n if (params.qqNumber) searchParams.set('qqNumber', params.qqNumber);\n if (params.phoneNumber) searchParams.set('phoneNumber', params.phoneNumber);\n if (params.status) searchParams.set('status', params.status);\n if (params.page) searchParams.set('page', String(params.page));\n if (params.limit) searchParams.set('limit', String(params.limit));\n\n return searchParams.toString();\n};\n\nconst extractArrayData = <T>(data: any): T[] => {\n if (Array.isArray(data?.data)) return data.data as T[];\n if (Array.isArray(data?.collections)) return data.collections as T[];\n if (Array.isArray(data?.configs)) return data.configs as T[];\n if (Array.isArray(data?.data?.configs)) return data.data.configs as T[];\n if (Array.isArray(data)) return data as T[];\n return [];\n};\n\nexport const createShowmasterpieceClient = (\n request: RequestExecutor,\n baseUrl: string,\n): ShowmasterpieceClient => {\n return {\n getCollectionsOverview: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/collections?overview=true');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionOverview>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n getCategories: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/categories');\n const data = await request<any>({ url, method: 'GET' });\n const categories = extractArrayData<CategoryOption>(data);\n if (!Array.isArray(categories)) {\n throw new Error('API响应格式错误');\n }\n return categories;\n },\n\n getBookableCollections: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/collections');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionSummary>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n createBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings');\n return request<Booking>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n batchBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/batch');\n return request<BatchBookingResponse>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n getBookings: async (params) => {\n const query = toSearchParams(params);\n const path = query\n ? `/api/showmasterpiece/bookings?${query}`\n : '/api/showmasterpiece/bookings';\n const url = joinUrl(baseUrl, path);\n return request<BookingListResponse>({\n url,\n method: 'GET',\n });\n },\n\n checkPopupConfigs: async (params) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/popup-configs/check');\n const data = await request<any>({\n url,\n method: 'POST',\n data: {\n businessModule: params.businessModule,\n businessScene: params.businessScene,\n currentTime: params.currentTime || new Date().toISOString(),\n },\n });\n return extractArrayData<PopupConfig>(data);\n },\n };\n};\n","export * from './client';\nexport * as clientBusinessWebServices from '../client-business';\n","import type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_WEB_BASE_URL = '';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createFetchExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: data === undefined ? undefined : JSON.stringify(data),\n });\n\n const payload = await response.json().catch(() => null);\n\n if (response.ok) {\n return payload as T;\n }\n\n throw new Error(extractErrorMessage(payload, `请求失败 (${response.status})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_WEB_BASE_URL) =>\n createShowmasterpieceClient(createFetchExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_WEB_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_WEB_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n","export * as masterpiecesService from './masterpiecesService';\nexport * as masterpiecesConfigService from './masterpiecesConfigService';\nexport * as cartService from './cartService';\nexport * as bookingService from './bookingService';\nexport * as bookingAdminService from './bookingAdminService';\nexport * as cartHistoryService from './cartHistoryService';\nexport * as eventAwareMasterpiecesService from './eventAwareMasterpiecesService';\nexport * as exportConfigService from './exportConfig';\nexport * as fileService from './fileService';\n","/**\n * MasterpiecesService - 美术作品前端API服务\n * \n * 这个文件提供了客户端与美术作品相关API的通信接口。\n * 主要用于前端组件和Hook中调用后端API,获取和操作画集数据。\n * \n * 主要功能:\n * - 画集数据的获取和查询\n * - 搜索和筛选功能\n * - 分类和标签管理\n * - 推荐算法\n * \n * 设计特点:\n * - 使用静态方法,无需实例化\n * - 统一的错误处理\n * - 支持多种查询方式\n * - TypeScript类型安全\n * \n * @module MasterpiecesService\n */\n\nimport type { ArtCollection } from '../../types';\n\n/**\n * 获取美术作品画集列表(函数式API)\n * \n * 这是一个简单的函数式接口,用于获取所有画集数据。\n * 主要为了保持向后兼容性而保留。\n * \n * @returns Promise<ArtCollection[]> 画集数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @deprecated 建议使用 MasterpiecesService.getAllCollections() 代替\n */\nexport const getMasterpieces = async (): Promise<ArtCollection[]> => {\n const response = await fetch('/api/showmasterpiece/collections');\n if (!response.ok) {\n throw new Error('获取画集失败');\n }\n return await response.json();\n};\n\n/**\n * 美术作品服务类\n * \n * 提供完整的美术作品数据访问接口,包括画集的获取、搜索、筛选等功能。\n * 所有方法都是静态方法,可以直接调用,无需实例化。\n * \n * @example\n * ```typescript\n * // 获取所有画集\n * const collections = await MasterpiecesService.getAllCollections();\n * \n * // 搜索画集\n * const results = await MasterpiecesService.searchCollections('油画');\n * \n * // 按分类获取\n * const paintings = await MasterpiecesService.getCollectionsByCategory('油画');\n * ```\n */\nexport class MasterpiecesService {\n /**\n * 获取所有画集\n * \n * 从后端API获取所有可用的画集数据。\n * 返回的数据包含完整的画集信息和作品页面。\n * \n * @returns Promise<ArtCollection[]> 所有画集的数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * try {\n * const collections = await MasterpiecesService.getAllCollections();\n * console.log(`共加载了 ${collections.length} 个画集`);\n * } catch (error) {\n * console.error('加载失败:', error.message);\n * }\n * ```\n */\n static async getAllCollections(): Promise<ArtCollection[]> {\n const response = await fetch('/api/showmasterpiece/collections');\n if (!response.ok) {\n throw new Error('获取画集失败');\n }\n const payload = await response.json();\n const collections = Array.isArray(payload)\n ? payload\n : (payload?.collections ?? payload?.data ?? []);\n\n if (!Array.isArray(collections)) {\n throw new Error('画集数据格式不正确');\n }\n\n return collections;\n }\n\n /**\n * 根据ID获取特定画集\n * \n * 通过画集ID获取单个画集的详细信息。\n * 内部实现是先获取所有画集,然后筛选出指定ID的画集。\n * \n * @param id - 画集的唯一标识符\n * @returns Promise<ArtCollection | null> 找到的画集对象,如果不存在则返回null\n * \n * @example\n * ```typescript\n * const collection = await MasterpiecesService.getCollectionById(1);\n * if (collection) {\n * console.log(`找到画集: ${collection.title}`);\n * } else {\n * console.log('画集不存在');\n * }\n * ```\n */\n static async getCollectionById(id: number): Promise<ArtCollection | null> {\n const collections = await this.getAllCollections();\n return collections.find(c => c.id === id) || null;\n }\n\n /**\n * 搜索画集\n * \n * 根据关键词在画集的多个字段中进行搜索,包括:\n * - 画集标题\n * - 艺术家姓名\n * - 画集描述\n * - 画集分类\n * - 画集标签\n * \n * 搜索是大小写不敏感的,支持部分匹配。\n * \n * @param query - 搜索关键词\n * @returns Promise<ArtCollection[]> 匹配的画集数组\n * \n * @example\n * ```typescript\n * // 搜索包含\"山水\"的画集\n * const results = await MasterpiecesService.searchCollections('山水');\n * console.log(`找到 ${results.length} 个相关画集`);\n * ```\n */\n static async searchCollections(query: string): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n const searchTerm = query.toLowerCase();\n \n return collections.filter((collection: ArtCollection) => \n collection.title.toLowerCase().includes(searchTerm) ||\n collection.number.toLowerCase().includes(searchTerm) ||\n collection.description.toLowerCase().includes(searchTerm) ||\n (collection.category && collection.category.toLowerCase().includes(searchTerm)) ||\n (collection.tags && collection.tags.some((tag: string) => tag.toLowerCase().includes(searchTerm)))\n );\n }\n\n /**\n * 根据分类获取画集\n * \n * 获取属于指定分类的所有画集。\n * 支持特殊值 'all' 来获取所有画集。\n * \n * @param category - 分类名称,或 'all' 表示所有分类\n * @returns Promise<ArtCollection[]> 该分类下的画集数组\n * \n * @example\n * ```typescript\n * // 获取油画分类的画集\n * const paintings = await MasterpiecesService.getCollectionsByCategory('油画');\n * \n * // 获取所有画集\n * const allCollections = await MasterpiecesService.getCollectionsByCategory('all');\n * ```\n */\n static async getCollectionsByCategory(category: string): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n \n if (category === 'all') {\n return collections;\n }\n \n return collections.filter((collection: ArtCollection) => collection.category === category);\n }\n\n /**\n * 获取推荐画集\n * \n * 基于简单的推荐算法获取推荐的画集。\n * 当前算法:优先选择已发布的画集,按作品数量降序排列。\n * \n * @param limit - 返回的推荐画集数量,默认为3个\n * @returns Promise<ArtCollection[]> 推荐的画集数组\n * \n * @example\n * ```typescript\n * // 获取3个推荐画集\n * const recommended = await MasterpiecesService.getRecommendedCollections();\n * \n * // 获取5个推荐画集\n * const moreRecommended = await MasterpiecesService.getRecommendedCollections(5);\n * ```\n */\n static async getRecommendedCollections(limit: number = 3): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n \n // 简单的推荐逻辑:返回已发布的画集,按作品数量排序\n return collections\n .filter((collection: ArtCollection) => collection.isPublished !== false)\n .sort((a: ArtCollection, b: ArtCollection) => b.pages.length - a.pages.length)\n .slice(0, limit);\n }\n\n /**\n * 获取所有可用分类\n * \n * 从后端API获取所有已定义的画集分类列表。\n * 用于构建分类筛选器和下拉菜单。\n * \n * @returns Promise<Array<{ name: string; description?: string | null }>> 分类名称数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * const categories = await MasterpiecesService.getCategories();\n * console.log('可用分类:', categories);\n * ```\n */\n static async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const response = await fetch('/api/showmasterpiece/categories');\n if (!response.ok) {\n throw new Error('获取分类失败');\n }\n const payload = await response.json();\n return Array.isArray(payload) ? payload : payload?.data ?? [];\n }\n\n /**\n * 获取所有可用标签\n * \n * 从后端API获取所有已定义的画集标签列表。\n * 用于构建标签筛选器和标签云。\n * \n * @returns Promise<string[]> 标签名称数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * const tags = await MasterpiecesService.getTags();\n * console.log('可用标签:', tags);\n * ```\n */\n static async getTags(): Promise<string[]> {\n const response = await fetch('/api/showmasterpiece/tags');\n if (!response.ok) {\n throw new Error('获取标签失败');\n }\n return await response.json();\n }\n} \n","import type { \n MasterpiecesConfig, \n ArtCollection, \n ArtworkPage,\n CollectionFormData,\n ArtworkFormData \n} from '../../types';\n\n// 配置缓存\nlet configCache: MasterpiecesConfig | null = null;\nlet configCacheTime: number = 0;\nconst CONFIG_CACHE_DURATION = 5 * 60 * 1000; // 5分钟缓存\n\n// 配置管理\nexport const getConfig = async (): Promise<MasterpiecesConfig> => {\n // 检查缓存是否有效\n const now = Date.now();\n if (configCache && (now - configCacheTime) < CONFIG_CACHE_DURATION) {\n return configCache;\n }\n\n const response = await fetch('/api/showmasterpiece/config');\n if (!response.ok) {\n throw new Error('获取配置失败');\n }\n \n const config = await response.json();\n \n // 更新缓存\n configCache = config;\n configCacheTime = now;\n \n return config;\n};\n\nexport const updateConfig = async (configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> => {\n const response = await fetch('/api/showmasterpiece/config', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(configData),\n });\n \n if (!response.ok) {\n throw new Error('更新配置失败');\n }\n \n const updatedConfig = await response.json();\n \n // 更新缓存\n configCache = updatedConfig;\n configCacheTime = Date.now();\n \n return updatedConfig;\n};\n\nexport const resetConfig = async (): Promise<MasterpiecesConfig> => {\n const response = await fetch('/api/showmasterpiece/config', {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n throw new Error('重置配置失败');\n }\n \n const resetConfigData = await response.json();\n \n // 清除缓存\n configCache = resetConfigData;\n configCacheTime = Date.now();\n \n return resetConfigData;\n};\n\n// 画集管理\nexport const getAllCollections = async (): Promise<ArtCollection[]> => {\n console.log('📡 [服务] 开始获取所有画集...');\n \n try {\n // 添加时间戳参数防止缓存\n const timestamp = new Date().getTime();\n const response = await fetch(`/api/showmasterpiece/collections?_t=${timestamp}`, {\n method: 'GET',\n headers: {\n 'Cache-Control': 'no-cache',\n 'Pragma': 'no-cache'\n }\n });\n \n console.log('📡 [服务] 画集请求响应状态:', response.status);\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error('❌ [服务] 获取画集失败:', {\n status: response.status,\n statusText: response.statusText,\n error: errorText\n });\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n \n const payload = await response.json();\n const collections = Array.isArray(payload)\n ? payload\n : (payload?.collections ?? payload?.data ?? []);\n\n if (!Array.isArray(collections)) {\n throw new Error('画集数据格式不正确');\n }\n\n console.log('✅ [服务] 画集数据获取成功:', {\n count: collections.length,\n titles: collections.map((c: ArtCollection) => c.title)\n });\n\n return collections;\n } catch (error) {\n console.error('❌ [服务] 获取画集数据失败:', error);\n throw error;\n }\n};\n\nexport const createCollection = async (collectionData: CollectionFormData): Promise<ArtCollection> => {\n const requestBody = collectionData;\n \n const response = await fetch('/api/showmasterpiece/collections', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('创建画集失败');\n }\n return await response.json();\n};\n\nexport const updateCollection = async (id: number, collectionData: CollectionFormData): Promise<ArtCollection> => {\n const response = await fetch(`/api/showmasterpiece/collections/${id}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(collectionData),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('更新画集失败');\n }\n return await response.json();\n};\n\nexport const deleteCollection = async (id: number): Promise<void> => {\n const url = new URL(`/api/showmasterpiece/collections/${id}`, window.location.origin);\n \n const response = await fetch(url.toString(), {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || '删除画集失败');\n }\n};\n\n// 画集顺序管理\nexport const updateCollectionOrder = async (collectionOrders: { id: number; displayOrder: number }[]): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=reorder', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionOrders }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '更新画集顺序失败');\n }\n};\n\nexport const moveCollection = async (collectionId: number, targetOrder: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=move', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId, targetOrder }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '移动画集失败');\n }\n};\n\nexport const moveCollectionUp = async (collectionId: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=up', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '上移画集失败');\n }\n};\n\nexport const moveCollectionDown = async (collectionId: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=down', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '下移画集失败');\n }\n};\n\n// 作品管理\nexport const addArtworkToCollection = async (collectionId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> => {\n console.log('🌐 [服务] 开始发送作品创建请求:', {\n collectionId,\n title: artworkData.title,\n number: artworkData.number,\n imageSize: artworkData.image ? `${artworkData.image.length} chars` : 'null'\n });\n \n const requestBody = JSON.stringify(artworkData);\n console.log('📦 [服务] 请求体大小:', `${requestBody.length} chars (${(requestBody.length / 1024).toFixed(1)} KB)`);\n \n try { \n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: requestBody,\n });\n \n console.log('📡 [服务] 收到HTTP响应:', {\n status: response.status,\n statusText: response.statusText,\n contentLength: response.headers.get('content-length'),\n contentType: response.headers.get('content-type')\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error('❌ [服务] HTTP请求失败:', {\n status: response.status,\n statusText: response.statusText,\n errorText: errorText.substring(0, 200)\n });\n \n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error(`添加作品失败: ${response.status} ${response.statusText}`);\n }\n \n const result = await response.json();\n console.log('✅ [服务] 作品创建成功:', {\n id: result.id,\n title: result.title,\n number: result.number\n });\n \n return result;\n \n } catch (error) {\n console.error('❌ [服务] 请求过程中发生错误:', error);\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new Error('网络连接失败,请检查网络连接后重试');\n }\n throw error;\n }\n};\n\nexport const updateArtwork = async (collectionId: number, artworkId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks/${artworkId}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(artworkData),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('更新作品失败');\n }\n return await response.json();\n};\n\nexport const deleteArtwork = async (collectionId: number, artworkId: number): Promise<void> => {\n const url = new URL(`/api/showmasterpiece/collections/${collectionId}/artworks/${artworkId}`, window.location.origin);\n \n const response = await fetch(url.toString(), {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || '删除作品失败');\n }\n};\n\n// 作品排序管理\nexport const getArtworksByCollection = async (collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> => {\n // 添加时间戳参数防止缓存\n const timestamp = new Date().getTime();\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?_t=${timestamp}`, {\n headers: {\n 'Cache-Control': 'no-cache',\n 'Pragma': 'no-cache'\n }\n });\n if (!response.ok) {\n throw new Error('获取作品列表失败');\n }\n return await response.json();\n};\n\nexport const updateArtworkOrder = async (collectionId: number, artworkOrders: { id: number; pageOrder: number }[]): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=reorder`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkOrders }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '更新作品顺序失败');\n }\n};\n\nexport const moveArtwork = async (collectionId: number, artworkId: number, targetOrder: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=move`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId, targetOrder }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '移动作品失败');\n }\n};\n\nexport const moveArtworkUp = async (collectionId: number, artworkId: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=up`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '上移作品失败');\n }\n};\n\nexport const moveArtworkDown = async (collectionId: number, artworkId: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=down`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '下移作品失败');\n }\n};\n\n// 分类和标签\nexport const getCategories = async (): Promise<Array<{ name: string; description?: string | null }>> => {\n const response = await fetch('/api/showmasterpiece/categories');\n if (!response.ok) {\n throw new Error('获取分类失败');\n }\n const payload = await response.json();\n const categories = Array.isArray(payload) ? payload : (payload?.data ?? []);\n if (!Array.isArray(categories)) {\n throw new Error('分类数据格式不正确');\n }\n return categories;\n};\n\nexport const createCategory = async (name: string, description?: string): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/categories', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name, description }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || '创建分类失败');\n }\n};\n\nexport const getTags = async (): Promise<string[]> => {\n const response = await fetch('/api/showmasterpiece/tags');\n if (!response.ok) {\n throw new Error('获取标签失败');\n }\n return await response.json();\n};\n\n// 获取画集概览(不包含作品详情,用于列表展示)\nexport async function getCollectionsOverview(): Promise<Omit<ArtCollection, 'pages'>[]> {\n const response = await fetch('/api/showmasterpiece/collections?overview=true');\n if (!response.ok) {\n throw new Error('获取画集概览失败');\n }\n return response.json();\n} \n","/**\n * ShowMasterpiece 模块 - 购物车服务\n * \n * 提供购物车功能的前端本地存储服务,包括:\n * - 添加商品到购物车\n * - 更新购物车商品数量\n * - 从购物车移除商品\n * - 清空购物车\n * - 批量预订\n * \n * @fileoverview 购物车服务 - 本地存储版本\n */\n\nimport { \n Cart,\n AddToCartRequest,\n UpdateCartItemRequest,\n RemoveFromCartRequest,\n ClearCartRequest,\n BatchBookingRequest,\n BatchBookingResponse\n} from '../../types/cart';\nimport { saveCartHistory } from './cartHistoryService';\nimport { batchBooking as submitBatchBookingBySharedClient } from '../web/client';\n\n/**\n * 购物车本地存储键名\n */\nconst CART_STORAGE_KEY = 'showmasterpiece_cart';\n\n/**\n * 购物车服务类\n * \n * 提供购物车功能相关的本地存储操作方法\n */\nexport class CartService {\n /**\n * 获取购物车数据\n * \n * @param userId 用户ID\n * @returns 购物车数据\n */\n static async getCart(userId: number): Promise<Cart> {\n try {\n const storageKey = `${CART_STORAGE_KEY}_${userId}`;\n \n const cartData = localStorage.getItem(storageKey);\n if (cartData) {\n const parsed = JSON.parse(cartData);\n // 将字符串日期转换为Date对象\n if (parsed.items) {\n parsed.items = parsed.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }));\n }\n return parsed;\n }\n } catch (error) {\n console.error('读取购物车数据失败:', error);\n }\n \n // 返回空的购物车\n return {\n items: [],\n totalQuantity: 0,\n totalPrice: 0\n };\n }\n\n /**\n * 保存购物车数据到本地存储\n * \n * @param userId 用户ID\n * @param cart 购物车数据\n */\n private static saveCart(userId: number, cart: Cart): void {\n try {\n const storageKey = `${CART_STORAGE_KEY}_${userId}`;\n \n localStorage.setItem(storageKey, JSON.stringify(cart));\n } catch (error) {\n console.error('保存购物车数据失败:', error);\n }\n }\n\n /**\n * 计算购物车总数量和总价格\n * \n * @param items 购物车商品项\n * @returns 总数量和总价格\n */\n private static calculateTotals(items: Cart['items']): { totalQuantity: number; totalPrice: number } {\n let totalQuantity = 0;\n let totalPrice = 0;\n \n items.forEach(item => {\n totalQuantity += item.quantity;\n const itemPrice = (item.collection.price || 0) * item.quantity;\n totalPrice += itemPrice;\n });\n \n return { totalQuantity, totalPrice };\n }\n\n /**\n * 添加商品到购物车\n * \n * @param data 添加商品数据\n * @returns 更新后的购物车数据\n */\n static async addToCart(data: AddToCartRequest & { userId: number; collection?: any }): Promise<Cart> {\n const { userId, collectionId, quantity, collection } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 检查商品是否已在购物车中\n const existingItemIndex = cart.items.findIndex(item => item.collectionId === collectionId);\n \n if (existingItemIndex >= 0) {\n // 如果已存在,增加数量\n const existingItem = cart.items[existingItemIndex];\n if (existingItem) {\n existingItem.quantity += quantity;\n }\n } else {\n // 如果不存在,添加新项\n if (collection) {\n // 使用传入的完整画集信息\n cart.items.push({\n collectionId,\n collection,\n quantity,\n addedAt: new Date()\n });\n } else {\n // 如果没有传入画集信息,使用简化的数据结构\n cart.items.push({\n collectionId,\n collection: {\n id: collectionId,\n title: `画集${collectionId}`, // 临时标题,实际应该从画集数据中获取\n number: '未知编号',\n coverImage: '',\n description: '',\n pages: [],\n category: '画集' as any,\n tags: [],\n isPublished: true,\n price: 0\n },\n quantity,\n addedAt: new Date()\n });\n }\n }\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n \n return cart;\n }\n\n /**\n * 更新购物车商品数量\n * \n * @param data 更新商品数据\n * @returns 更新后的购物车数据\n */\n static async updateCartItem(data: UpdateCartItemRequest & { userId: number }): Promise<Cart> {\n const { userId, collectionId, quantity } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 查找商品项\n const itemIndex = cart.items.findIndex(item => item.collectionId === collectionId);\n \n if (itemIndex >= 0) {\n if (quantity <= 0) {\n // 如果数量为0或负数,移除商品\n cart.items.splice(itemIndex, 1);\n } else {\n // 更新数量\n const item = cart.items[itemIndex];\n if (item) {\n item.quantity = quantity;\n }\n }\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n }\n \n return cart;\n }\n\n /**\n * 从购物车移除商品\n * \n * @param data 移除商品数据\n * @returns 更新后的购物车数据\n */\n static async removeFromCart(data: RemoveFromCartRequest & { userId: number }): Promise<Cart> {\n const { userId, collectionId } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 移除商品\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n \n return cart;\n }\n\n /**\n * 清空购物车\n * \n * @param userId 用户ID\n * @returns 清空后的购物车数据\n */\n static async clearCart(userId: number): Promise<Cart> {\n const emptyCart: Cart = {\n items: [],\n totalQuantity: 0,\n totalPrice: 0\n };\n \n // 保存空的购物车到本地存储\n this.saveCart(userId, emptyCart);\n \n return emptyCart;\n }\n\n /**\n * 批量预订购物车中的商品\n * \n * @param data 批量预订数据\n * @param cart 当前购物车数据(用于保存历史记录)\n * @returns 预订结果\n */\n static async batchBooking(data: BatchBookingRequest, cart?: Cart): Promise<BatchBookingResponse> {\n console.log('🛒 [CartService] 批量预订:', { data });\n const result = await submitBatchBookingBySharedClient(data);\n\n // 如果预订成功且有购物车数据,保存历史记录\n if (result.successCount > 0 && cart) {\n try {\n await saveCartHistory({\n qqNumber: data.qqNumber,\n phoneNumber: data.phoneNumber,\n items: cart.items,\n totalQuantity: cart.totalQuantity,\n totalPrice: cart.totalPrice,\n notes: data.notes,\n pickupMethod: data.pickupMethod,\n status: 'pending',\n bookingIds: result.bookingIds,\n submittedAt: new Date()\n });\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n // 不影响预订流程,只记录错误\n }\n }\n\n return result;\n }\n}\n\n/**\n * 购物车服务函数集\n * \n * 提供函数式的API调用接口,作为服务类的补充。\n */\n\n/**\n * 获取购物车数据\n * \n * @param userId 用户ID\n * @returns 购物车数据\n */\nexport const getCart = (userId: number): Promise<Cart> => {\n return CartService.getCart(userId);\n};\n\n/**\n * 添加商品到购物车\n * \n * @param data 添加商品数据\n * @returns 更新后的购物车数据\n */\nexport const addToCart = (data: AddToCartRequest & { userId: number }): Promise<Cart> => {\n return CartService.addToCart(data);\n};\n\n/**\n * 更新购物车商品数量\n * \n * @param data 更新商品数据\n * @returns 更新后的购物车数据\n */\nexport const updateCartItem = (data: UpdateCartItemRequest & { userId: number }): Promise<Cart> => {\n return CartService.updateCartItem(data);\n};\n\n/**\n * 从购物车移除商品\n * \n * @param data 移除商品数据\n * @returns 更新后的购物车数据\n */\nexport const removeFromCart = (data: RemoveFromCartRequest & { userId: number }): Promise<Cart> => {\n return CartService.removeFromCart(data);\n};\n\n/**\n * 清空购物车\n * \n * @param userId 用户ID\n * @returns 清空后的购物车数据\n */\nexport const clearCart = (userId: number): Promise<Cart> => {\n return CartService.clearCart(userId);\n};\n\n/**\n * 批量预订购物车中的商品\n * \n * @param data 批量预订数据\n * @param cart 当前购物车数据(用于保存历史记录)\n * @returns 预订结果\n */\nexport const batchBooking = (data: BatchBookingRequest, cart?: Cart): Promise<BatchBookingResponse> => {\n return CartService.batchBooking(data, cart);\n}; \n","/**\n * ShowMasterpiece 模块 - 购物车历史记录服务\n * \n * 提供用户购物车历史记录功能,包括:\n * - 保存用户提交的购物车数据\n * - 获取用户历史记录\n * - 更新预订状态\n * - 本地存储管理\n * \n * @fileoverview 购物车历史记录服务\n */\n\nimport { \n CartHistoryItem, \n CartHistory, \n CartItem,\n BatchBookingResponse \n} from '../../types/cart';\n\n/**\n * 购物车历史记录本地存储键名基础\n */\nconst CART_HISTORY_STORAGE_KEY_BASE = 'showmasterpiece_cart_history';\n\n/**\n * 默认的购物车历史记录存储键(向后兼容)\n */\nconst CART_HISTORY_STORAGE_KEY = CART_HISTORY_STORAGE_KEY_BASE;\n\n\n/**\n * 购物车历史记录服务类\n * \n * 提供购物车历史记录相关的本地存储操作方法\n */\nexport class CartHistoryService {\n /**\n * 生成唯一ID\n */\n // static generateId(): string {\n // return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n // }\n\n /**\n * 获取用户购物车历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @returns 购物车历史记录\n */\n static async getCartHistory(qqNumber: string, phoneNumber: string): Promise<CartHistory> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤当前用户的历史记录\n const userHistory = allHistory.filter(record => \n record.qqNumber === qqNumber && record.phoneNumber === phoneNumber\n );\n\n // 将字符串日期转换为Date对象\n const processedHistory = userHistory.map(record => ({\n ...record,\n submittedAt: new Date(record.submittedAt),\n items: record.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }))\n }));\n\n // 按提交时间倒序排列\n processedHistory.sort((a, b) => b.submittedAt.getTime() - a.submittedAt.getTime());\n\n return {\n records: processedHistory,\n totalRecords: processedHistory.length\n };\n }\n } catch (error) {\n console.error('读取购物车历史记录失败:', error);\n }\n \n return {\n records: [],\n totalRecords: 0\n };\n }\n\n /**\n * 保存购物车历史记录\n * \n * @param historyItem 历史记录项\n */\n static async saveCartHistory(historyItem: Omit<CartHistoryItem, 'id'>): Promise<CartHistoryItem> {\n try {\n // 直接在函数内生成ID,避免this上下文问题\n const generateId = () => `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n const newHistoryItem: CartHistoryItem = {\n ...historyItem,\n id: generateId(),\n submittedAt: new Date()\n };\n\n // 获取现有历史记录\n const existingData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n const allHistory: CartHistoryItem[] = existingData ? JSON.parse(existingData) : [];\n\n // 添加新记录\n allHistory.push(newHistoryItem);\n\n // 保存到本地存储\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 购物车历史记录保存成功:', { \n id: newHistoryItem.id,\n qqNumber: newHistoryItem.qqNumber,\n itemCount: newHistoryItem.items.length\n });\n\n return newHistoryItem;\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n throw new Error('保存购物车历史记录失败');\n }\n }\n\n /**\n * 更新预订状态\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @param historyId 历史记录ID\n * @param status 新状态\n * @param bookingIds 预订ID列表\n */\n static async updateBookingStatus(\n qqNumber: string, \n phoneNumber: string, \n historyId: string, \n status: CartHistoryItem['status'],\n bookingIds?: number[]\n ): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 找到并更新指定记录\n const recordIndex = allHistory.findIndex(record => \n record.id === historyId && \n record.qqNumber === qqNumber && \n record.phoneNumber === phoneNumber\n );\n\n if (recordIndex !== -1) {\n const record = allHistory[recordIndex];\n if (!record) {\n return;\n }\n record.status = status;\n if (bookingIds) {\n record.bookingIds = bookingIds;\n }\n\n // 保存更新后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 预订状态更新成功:', { \n historyId, \n status, \n bookingIds \n });\n }\n }\n } catch (error) {\n console.error('更新预订状态失败:', error);\n throw new Error('更新预订状态失败');\n }\n }\n\n /**\n * 删除历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @param historyId 历史记录ID\n */\n static async deleteHistoryRecord(\n qqNumber: string, \n phoneNumber: string, \n historyId: string\n ): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤掉要删除的记录\n const filteredHistory = allHistory.filter(record => \n !(record.id === historyId && \n record.qqNumber === qqNumber && \n record.phoneNumber === phoneNumber)\n );\n\n // 保存过滤后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(filteredHistory));\n\n console.log('✅ 历史记录删除成功:', { historyId });\n }\n } catch (error) {\n console.error('删除历史记录失败:', error);\n throw new Error('删除历史记录失败');\n }\n }\n\n /**\n * 清空用户所有历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n */\n static async clearUserHistory(qqNumber: string, phoneNumber: string): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤掉当前用户的所有记录\n const filteredHistory = allHistory.filter(record => \n !(record.qqNumber === qqNumber && record.phoneNumber === phoneNumber)\n );\n\n // 保存过滤后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(filteredHistory));\n\n console.log('✅ 用户历史记录清空成功:', { qqNumber, phoneNumber });\n }\n } catch (error) {\n console.error('清空用户历史记录失败:', error);\n throw new Error('清空用户历史记录失败');\n }\n }\n\n /**\n * 获取所有历史记录(管理员功能)\n */\n static async getAllHistory(): Promise<CartHistoryItem[]> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 将字符串日期转换为Date对象\n return allHistory.map(record => ({\n ...record,\n submittedAt: new Date(record.submittedAt),\n items: record.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }))\n }));\n }\n } catch (error) {\n console.error('读取所有历史记录失败:', error);\n }\n \n return [];\n }\n\n /**\n * 获取统计数据\n */\n static async getStatistics(): Promise<{\n totalRecords: number;\n totalUsers: number;\n totalItems: number;\n totalRevenue: number;\n }> {\n try {\n const allHistory = await this.getAllHistory();\n \n const totalRecords = allHistory.length;\n const uniqueUsers = new Set(\n allHistory.map(record => `${record.qqNumber}_${record.phoneNumber}`)\n );\n const totalUsers = uniqueUsers.size;\n \n let totalItems = 0;\n let totalRevenue = 0;\n \n allHistory.forEach(record => {\n totalItems += record.totalQuantity;\n totalRevenue += record.totalPrice;\n });\n\n return {\n totalRecords,\n totalUsers,\n totalItems,\n totalRevenue\n };\n } catch (error) {\n console.error('获取统计数据失败:', error);\n return {\n totalRecords: 0,\n totalUsers: 0,\n totalItems: 0,\n totalRevenue: 0\n };\n }\n }\n}\n\n// 导出单独的函数,方便直接导入使用\nexport const getCartHistory = CartHistoryService.getCartHistory;\nexport const updateBookingStatus = CartHistoryService.updateBookingStatus;\nexport const deleteHistoryRecord = CartHistoryService.deleteHistoryRecord;\nexport const clearUserHistory = CartHistoryService.clearUserHistory;\nexport const getAllHistory = CartHistoryService.getAllHistory;\nexport const getStatistics = CartHistoryService.getStatistics;\n\n// 独立的saveCartHistory函数,避免类方法绑定问题\nexport const saveCartHistory = async (historyItem: Omit<CartHistoryItem, 'id'>): Promise<CartHistoryItem> => {\n try {\n // 生成唯一ID\n const generateId = () => `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n const newHistoryItem: CartHistoryItem = {\n ...historyItem,\n id: generateId(),\n submittedAt: new Date()\n };\n\n // 获取现有历史记录\n const existingData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n const allHistory: CartHistoryItem[] = existingData ? JSON.parse(existingData) : [];\n\n // 添加新记录\n allHistory.push(newHistoryItem);\n\n // 保存到本地存储\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 购物车历史记录保存成功:', { \n id: newHistoryItem.id,\n qqNumber: newHistoryItem.qqNumber,\n itemCount: newHistoryItem.items.length\n });\n\n return newHistoryItem;\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n throw new Error('保存购物车历史记录失败');\n }\n}; \n","/**\n * ShowMasterpiece 模块 - 预订服务\n * \n * 提供画集预订功能的前端API调用服务,包括:\n * - 创建预订\n * - 查询预订列表\n * - 更新预订状态\n * - 获取画集简略信息\n * \n * @fileoverview 预订服务\n */\n\nimport { \n Booking, \n CreateBookingRequest, \n UpdateBookingRequest, \n BookingListParams, \n BookingListResponse,\n CollectionSummary \n} from '../../types/booking';\nimport {\n createBooking as createBookingBySharedClient,\n getBookableCollections as getBookableCollectionsBySharedClient,\n getBookings as getBookingsBySharedClient,\n} from '../web/client';\n\n/**\n * 预订服务类\n * \n * 提供预订功能相关的API调用方法,使用面向对象的方式封装HTTP请求。\n */\nexport class BookingService {\n private static readonly BASE_URL = '/api/showmasterpiece/bookings';\n\n /**\n * 创建新预订\n * \n * @param data 预订数据\n * @returns 创建的预订信息\n */\n static async createBooking(data: CreateBookingRequest): Promise<Booking> {\n return createBookingBySharedClient(data);\n }\n\n /**\n * 获取预订列表\n * \n * @param params 查询参数\n * @returns 预订列表和分页信息\n */\n static async getBookings(params: BookingListParams = {}): Promise<BookingListResponse> {\n return getBookingsBySharedClient(params);\n }\n\n /**\n * 获取单个预订详情\n * \n * @param id 预订ID\n * @returns 预订详情\n */\n static async getBooking(id: number): Promise<Booking> {\n const response = await fetch(`${this.BASE_URL}/${id}`);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: '获取预订详情失败' }));\n throw new Error(error.message || '获取预订详情失败');\n }\n\n return response.json();\n }\n\n /**\n * 更新预订状态\n * \n * @param id 预订ID\n * @param data 更新数据\n * @returns 更新后的预订信息\n */\n static async updateBooking(id: number, data: UpdateBookingRequest): Promise<Booking> {\n const response = await fetch(`${this.BASE_URL}/${id}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: '更新预订失败' }));\n throw new Error(error.message || '更新预订失败');\n }\n\n return response.json();\n }\n\n /**\n * 删除预订\n * \n * @param id 预订ID\n */\n static async deleteBooking(id: number): Promise<void> {\n const response = await fetch(`${this.BASE_URL}/${id}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: '删除预订失败' }));\n throw new Error(error.message || '删除预订失败');\n }\n }\n\n /**\n * 获取可预订的画集列表\n * \n * @returns 画集简略信息列表\n */\n static async getBookableCollections(): Promise<CollectionSummary[]> {\n return getBookableCollectionsBySharedClient();\n }\n}\n\n/**\n * 预订服务函数集\n * \n * 提供函数式的API调用接口,作为服务类的补充。\n */\n\n/**\n * 创建新预订\n * \n * @param data 预订数据\n * @returns 创建的预订信息\n */\nexport const createBooking = (data: CreateBookingRequest): Promise<Booking> => {\n return BookingService.createBooking(data);\n};\n\n/**\n * 获取预订列表\n * \n * @param params 查询参数\n * @returns 预订列表和分页信息\n */\nexport const getBookings = (params?: BookingListParams): Promise<BookingListResponse> => {\n return BookingService.getBookings(params);\n};\n\n/**\n * 获取单个预订详情\n * \n * @param id 预订ID\n * @returns 预订详情\n */\nexport const getBooking = (id: number): Promise<Booking> => {\n return BookingService.getBooking(id);\n};\n\n/**\n * 更新预订状态\n * \n * @param id 预订ID\n * @param data 更新数据\n * @returns 更新后的预订信息\n */\nexport const updateBooking = (id: number, data: UpdateBookingRequest): Promise<Booking> => {\n return BookingService.updateBooking(id, data);\n};\n\n/**\n * 删除预订\n * \n * @param id 预订ID\n */\nexport const deleteBooking = (id: number): Promise<void> => {\n return BookingService.deleteBooking(id);\n};\n\n/**\n * 获取可预订的画集列表\n * \n * @returns 画集简略信息列表\n */\nexport const getBookableCollections = (): Promise<CollectionSummary[]> => {\n return BookingService.getBookableCollections();\n};\n","/**\n * ShowMasterpiece 模块 - 预订管理服务\n * \n * 提供预订管理相关的类型定义和服务函数\n * \n * @fileoverview 预订管理服务\n */\n\nimport { BookingStatus } from '../../types/booking';\n\n/**\n * 预订管理数据接口\n */\nexport interface BookingAdminData {\n /** 预订ID */\n id: number;\n /** 用户ID */\n userId: number;\n /** 用户名 */\n userName: string;\n /** 用户手机号 */\n userPhone: string;\n /** QQ号 */\n qqNumber?: string;\n /** 手机号 */\n phoneNumber?: string;\n /** 画集ID */\n collectionId: number;\n /** 画集标题 */\n collectionTitle: string;\n /** 画集编号 */\n collectionNumber: string;\n /** 画集信息 */\n collection: {\n /** 画集ID */\n id: number;\n /** 画集标题 */\n title: string;\n /** 画集编号 */\n number: string;\n /** 封面图片 */\n coverImage: string;\n /** 价格 */\n price: number;\n };\n /** 预订状态 */\n status: BookingStatus;\n /** 预订时间 */\n bookingTime: string;\n /** 更新时间 */\n updatedAt: string;\n /** 创建时间 */\n createdAt: string;\n /** 管理员备注 */\n adminNotes?: string;\n /** 用户备注 */\n notes?: string;\n /** 领取方式 */\n pickupMethod?: string;\n /** 数量 */\n quantity: number;\n /** 价格 */\n price: number;\n /** 总价格 */\n totalPrice: number;\n /** 确认时间 */\n confirmedAt?: string;\n /** 完成时间 */\n completedAt?: string;\n /** 取消时间 */\n cancelledAt?: string;\n}\n\n/**\n * 预订管理统计信息接口\n */\nexport interface BookingAdminStats {\n /** 总预订数 */\n totalBookings: number;\n /** 待处理预订数 */\n pendingBookings: number;\n /** 已确认预订数 */\n confirmedBookings: number;\n /** 已完成预订数 */\n completedBookings: number;\n /** 已取消预订数 */\n cancelledBookings: number;\n /** 总金额 */\n totalAmount: number;\n /** 总收入 */\n totalRevenue: number;\n /** 总数量 */\n totalQuantity: number;\n /** 今日新增预订数 */\n todayBookings: number;\n /** 本周新增预订数 */\n weekBookings: number;\n}\n\n/**\n * 预订管理接口响应类型\n */\nexport interface BookingAdminResponse {\n bookings: BookingAdminData[];\n stats: BookingAdminStats;\n}\n\n/**\n * 预订管理查询参数\n */\nexport interface BookingAdminQueryParams {\n /** QQ号搜索 */\n qqNumber?: string;\n /** 手机号搜索 */\n phoneNumber?: string;\n /** 状态过滤 */\n status?: BookingStatus | 'all';\n}\n\n/**\n * 预订管理服务类\n */\nexport class BookingAdminService {\n /**\n * 获取所有预订数据\n */\n static async getAllBookings(params?: BookingAdminQueryParams): Promise<BookingAdminData[]> {\n try {\n // 添加时间戳参数防止缓存\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'GET',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest'\n }\n });\n if (!response.ok) {\n throw new Error('获取预订数据失败');\n }\n const data = await response.json();\n return data.bookings || [];\n } catch (error) {\n console.error('获取预订数据失败:', error);\n throw error;\n }\n }\n\n /**\n * 强制刷新获取所有预订数据(绕过所有缓存)\n */\n static async forceRefreshAllBookings(params?: BookingAdminQueryParams): Promise<BookingAdminData[]> {\n try {\n console.log('🔄 使用强制刷新API获取预订数据...');\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'POST',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Force-Refresh': 'true'\n }\n });\n if (!response.ok) {\n throw new Error('强制刷新获取预订数据失败');\n }\n const data = await response.json();\n console.log('🔄 强制刷新API响应:', { \n bookingsCount: data.bookings?.length || 0,\n timestamp: data._timestamp,\n refreshType: data._refreshType\n });\n return data.bookings || [];\n } catch (error) {\n console.error('强制刷新获取预订数据失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取预订统计信息\n */\n static async getBookingStats(params?: BookingAdminQueryParams): Promise<BookingAdminStats> {\n try {\n // 添加时间戳参数防止缓存\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'GET',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest'\n }\n });\n if (!response.ok) {\n throw new Error('获取统计信息失败');\n }\n const data = await response.json();\n return data.stats || {\n totalBookings: 0,\n pendingBookings: 0,\n confirmedBookings: 0,\n completedBookings: 0,\n cancelledBookings: 0,\n totalQuantity: 0,\n totalRevenue: 0,\n totalAmount: 0,\n todayBookings: 0,\n weekBookings: 0,\n };\n } catch (error) {\n console.error('获取统计信息失败:', error);\n throw error;\n }\n }\n\n /**\n * 强制刷新获取预订统计信息(绕过所有缓存)\n */\n static async forceRefreshBookingStats(params?: BookingAdminQueryParams): Promise<BookingAdminStats> {\n try {\n console.log('🔄 使用强制刷新API获取统计信息...');\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'POST',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Force-Refresh': 'true'\n }\n });\n if (!response.ok) {\n throw new Error('强制刷新获取统计信息失败');\n }\n const data = await response.json();\n console.log('🔄 强制刷新统计信息响应:', { \n stats: data.stats,\n timestamp: data._timestamp,\n refreshType: data._refreshType\n });\n return data.stats || {\n totalBookings: 0,\n pendingBookings: 0,\n confirmedBookings: 0,\n completedBookings: 0,\n cancelledBookings: 0,\n totalQuantity: 0,\n totalRevenue: 0,\n totalAmount: 0,\n todayBookings: 0,\n weekBookings: 0,\n };\n } catch (error) {\n console.error('强制刷新获取统计信息失败:', error);\n throw error;\n }\n }\n\n /**\n * 更新预订状态\n */\n static async updateBookingStatus(\n bookingId: number, \n status: BookingStatus, \n adminNotes?: string\n ): Promise<void> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/${bookingId}/status`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ status, adminNotes }),\n });\n \n if (!response.ok) {\n throw new Error('更新预订状态失败');\n }\n } catch (error) {\n console.error('更新预订状态失败:', error);\n throw error;\n }\n }\n\n /**\n * 删除预订\n */\n static async deleteBooking(bookingId: number): Promise<void> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/${bookingId}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || '删除预订失败');\n }\n \n console.log('✅ 预订删除成功:', { bookingId });\n } catch (error) {\n console.error('删除预订失败:', error);\n throw error;\n }\n }\n\n /**\n * 导出预订数据\n */\n static async exportBookings(format: 'csv' | 'excel' = 'csv'): Promise<Blob> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/export?format=${format}`);\n if (!response.ok) {\n throw new Error('导出预订数据失败');\n }\n return await response.blob();\n } catch (error) {\n console.error('导出预订数据失败:', error);\n throw error;\n }\n }\n}\n\n// 导出单独的函数,方便直接导入使用\nexport const getAllBookings = BookingAdminService.getAllBookings;\nexport const getBookingStats = BookingAdminService.getBookingStats;\nexport const forceRefreshAllBookings = BookingAdminService.forceRefreshAllBookings;\nexport const forceRefreshBookingStats = BookingAdminService.forceRefreshBookingStats;\nexport const updateBookingStatus = BookingAdminService.updateBookingStatus;\nexport const deleteBooking = BookingAdminService.deleteBooking;\nexport const exportBookings = BookingAdminService.exportBookings; \n","/**\n * EventAwareMasterpiecesService - 兼容层\n *\n * 为了向下兼容旧接口保留该服务,但已移除活动参数支持。\n */\n\nimport { MasterpiecesService } from './masterpiecesService';\nimport type { ArtCollection } from '../../types';\n\n/**\n * 活动感知的美术作品服务类\n */\nexport class EventAwareMasterpiecesService {\n /**\n * 获取所有画集数据\n *\n * @returns Promise<ArtCollection[]> 画集数组\n */\n static async getAllCollections(): Promise<ArtCollection[]> {\n return MasterpiecesService.getAllCollections();\n }\n\n /**\n * 根据ID获取特定画集\n *\n * @param id 画集ID\n * @returns Promise<ArtCollection | null> 画集对象或null\n */\n static async getCollectionById(id: number): Promise<ArtCollection | null> {\n return MasterpiecesService.getCollectionById(id);\n }\n\n /**\n * 根据分类获取画集\n *\n * @param category 分类名称\n * @returns Promise<ArtCollection[]> 指定分类的画集数组\n */\n static async getCollectionsByCategory(category: string): Promise<ArtCollection[]> {\n return MasterpiecesService.getCollectionsByCategory(category);\n }\n\n /**\n * 搜索画集\n *\n * @param query 搜索关键词\n * @returns Promise<ArtCollection[]> 搜索结果数组\n */\n static async searchCollections(query: string): Promise<ArtCollection[]> {\n return MasterpiecesService.searchCollections(query);\n }\n\n /**\n * 获取推荐画集\n *\n * @param currentCollectionId 当前画集ID\n * @param limit 推荐数量限制\n * @returns Promise<ArtCollection[]> 推荐画集数组\n */\n static async getRecommendedCollections(\n currentCollectionId: number,\n limit: number = 4\n ): Promise<ArtCollection[]> {\n void currentCollectionId;\n return MasterpiecesService.getRecommendedCollections(limit);\n }\n}\n\n// 为了向下兼容,也导出原有的函数式接口\nexport const getEventAwareMasterpieces = async (): Promise<ArtCollection[]> => {\n return EventAwareMasterpiecesService.getAllCollections();\n};\n","/**\n * ShowMasterpiece 模块 - 导出配置\n * \n * 定义预订信息的导出字段配置\n */\n\nimport type { ExportField } from '@/universalExport';\n\n/**\n * 预订信息导出字段定义\n */\nexport const BOOKING_EXPORT_FIELDS: ExportField[] = [\n {\n key: 'id',\n label: '预订ID',\n type: 'number',\n enabled: true,\n required: true,\n description: '预订记录的唯一标识',\n alignment: 'center',\n },\n {\n key: 'collectionId',\n label: '画集ID',\n type: 'number',\n enabled: true,\n required: true,\n description: '画集的唯一标识',\n alignment: 'center',\n },\n {\n key: 'qqNumber',\n label: 'QQ号',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户的QQ号码',\n alignment: 'left',\n },\n {\n key: 'phoneNumber',\n label: '手机号',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户的手机号码',\n alignment: 'left',\n },\n\n {\n key: 'collectionTitle',\n label: '画集标题',\n type: 'string',\n enabled: true,\n required: true,\n description: '预订的画集标题',\n alignment: 'left',\n },\n {\n key: 'collectionNumber',\n label: '画集编号',\n type: 'string',\n enabled: true,\n required: true,\n description: '画集的编号',\n alignment: 'left',\n },\n {\n key: 'collectionPrice',\n label: '画集价格',\n type: 'number',\n enabled: true,\n required: true,\n description: '画集的价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'status',\n label: '预订状态',\n type: 'string',\n enabled: true,\n required: true,\n description: '预订的当前状态',\n alignment: 'center',\n formatter: (value: any) => {\n const statusMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消',\n };\n return statusMap[value] || value;\n },\n },\n {\n key: 'quantity',\n label: '预订数量',\n type: 'number',\n enabled: true,\n required: true,\n description: '预订的数量',\n alignment: 'center',\n },\n {\n key: 'price',\n label: '单价',\n type: 'number',\n enabled: true,\n required: true,\n description: '单个画集的价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'totalPrice',\n label: '总价格',\n type: 'number',\n enabled: true,\n required: true,\n description: '总价格(单价 × 数量)',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'notes',\n label: '用户备注',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户提交的备注信息',\n alignment: 'left',\n },\n {\n key: 'pickupMethod',\n label: '领取方式',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户选择的领取方式',\n alignment: 'left',\n },\n {\n key: 'adminNotes',\n label: '管理员备注',\n type: 'string',\n enabled: true,\n required: false,\n description: '管理员添加的备注信息',\n alignment: 'left',\n },\n\n {\n key: 'createdAt',\n label: '创建时间',\n type: 'date',\n enabled: true,\n required: true,\n description: '预订创建的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'updatedAt',\n label: '更新时间',\n type: 'date',\n enabled: true,\n required: true,\n description: '预订最后更新的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'confirmedAt',\n label: '确认时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订确认的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'completedAt',\n label: '完成时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订完成的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'cancelledAt',\n label: '取消时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订取消的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'userTotalPrice',\n label: '用户总价',\n type: 'number',\n enabled: false, // 默认不启用,需要勾选才启用\n required: false,\n description: '根据QQ号和手机号统一匹配的该用户所有预订商品的总价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value || 0).toFixed(2)}`,\n },\n];\n\n/**\n * 默认导出配置\n */\nexport const DEFAULT_BOOKING_EXPORT_CONFIG = {\n id: 'default_booking_export',\n name: '预订信息导出',\n description: '导出所有预订信息为Excel格式,支持QQ号和手机号合并单元格',\n format: 'excel' as const,\n fields: BOOKING_EXPORT_FIELDS,\n grouping: {\n enabled: true,\n fields: [\n {\n key: 'phoneNumber',\n label: '手机号',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n },\n {\n key: 'qqNumber',\n label: 'QQ号',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n },\n {\n key: 'userTotalPrice',\n label: '用户总价',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n }\n ],\n preserveOrder: true,\n nullValueHandling: 'separate' as const,\n },\n fileNameTemplate: '预订信息_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId: 'showmasterpiece',\n businessId: 'bookings',\n}; \n","/**\n * ShowMasterpiece模块 - 文件服务配置\n * \n * 为ShowMasterpiece模块提供特定的文件服务配置和帮助函数\n */\n\nimport { createFileServiceConfig, createFileServiceConfigWithConfigManager } from '@/services/universalFile/config';\n\nimport type { LocalStorageConfig, AliyunOSSConfig, StorageConfig } from '@/services/universalFile/types';\n\n// 缓存ConfigManager实例,避免重复创建\nlet cachedConfigManager: Awaited<ReturnType<typeof createFileServiceConfigWithConfigManager>> | null = null;\n\n/**\n * 从showmasterpiece独立配置获取OSS配置\n */\nasync function getShowmasterpieceOSSConfig() {\n try {\n console.log('🎨 [ShowMasterpiece] 尝试从独立配置读取OSS配置...');\n \n const environment = process.env.NODE_ENV === 'production' ? 'production' : 'development';\n console.log(`🎨 [ShowMasterpiece] 当前环境: ${environment}`);\n \n // 检查是否在服务器端环境\n if (typeof window !== 'undefined') {\n // 客户端环境:通过API读取配置\n console.log('🌐 [ShowMasterpiece] 客户端环境,通过API读取配置');\n \n const configKeys = 'ALIYUN_OSS_REGION,ALIYUN_OSS_BUCKET,ALIYUN_OSS_ACCESS_KEY_ID,ALIYUN_OSS_ACCESS_KEY_SECRET,ALIYUN_OSS_CUSTOM_DOMAIN,ALIYUN_OSS_SECURE,ALIYUN_OSS_INTERNAL';\n const response = await fetch(`/api/showmasterpiece/config/items?environment=${environment}&keys=${configKeys}`);\n \n if (!response.ok) {\n console.warn('⚠️ [ShowMasterpiece] 读取独立配置API失败:', response.status);\n return null;\n }\n \n const data = await response.json();\n if (!data.success || !data.items) {\n console.warn('⚠️ [ShowMasterpiece] 独立配置API响应异常:', data);\n return null;\n }\n\n // 将配置项数组转换为对象\n const configMap: Record<string, string> = {};\n data.items.forEach((item: any) => {\n if (item.value) {\n configMap[item.key] = item.value;\n }\n });\n\n const ossConfig = {\n region: configMap['ALIYUN_OSS_REGION'],\n bucket: configMap['ALIYUN_OSS_BUCKET'],\n accessKeyId: configMap['ALIYUN_OSS_ACCESS_KEY_ID'],\n accessKeySecret: configMap['ALIYUN_OSS_ACCESS_KEY_SECRET'],\n customDomain: configMap['ALIYUN_OSS_CUSTOM_DOMAIN'],\n secure: configMap['ALIYUN_OSS_SECURE'] === 'true',\n internal: configMap['ALIYUN_OSS_INTERNAL'] === 'true'\n };\n\n console.log('🎨 [ShowMasterpiece] 独立配置读取结果:', {\n region: ossConfig.region || '未配置',\n bucket: ossConfig.bucket || '未配置',\n accessKeyId: ossConfig.accessKeyId ? '***' : '未配置',\n accessKeySecret: ossConfig.accessKeySecret ? '***' : '未配置',\n customDomain: ossConfig.customDomain || '未配置',\n secure: ossConfig.secure,\n internal: ossConfig.internal\n });\n\n // 检查必要配置是否完整\n if (ossConfig.region && ossConfig.bucket && ossConfig.accessKeyId && ossConfig.accessKeySecret) {\n console.log('✅ [ShowMasterpiece] 独立配置完整,将使用独立OSS配置');\n return ossConfig;\n } else {\n console.log('⚠️ [ShowMasterpiece] 独立配置不完整,将回退到公共配置');\n console.log('🔍 [ShowMasterpiece] 缺失配置项:', {\n region: !ossConfig.region,\n bucket: !ossConfig.bucket,\n accessKeyId: !ossConfig.accessKeyId,\n accessKeySecret: !ossConfig.accessKeySecret\n });\n return null;\n }\n } else {\n // 服务器端环境:当前 sa2kit 未提供独立配置服务,回退到默认配置\n console.log('🖥️ [ShowMasterpiece] 服务器端环境,使用默认配置回退');\n return null;\n }\n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 读取独立配置失败:', error);\n return null;\n }\n}\n\n/**\n * 获取缓存的ConfigManager实例\n */\nasync function getCachedConfigManager() {\n if (!cachedConfigManager) {\n // 尝试从showmasterpiece独立配置创建配置管理器\n const showmasterpieceOSSConfig = await getShowmasterpieceOSSConfig();\n \n if (showmasterpieceOSSConfig) {\n console.log('🎨 [ShowMasterpiece] 使用独立OSS配置创建配置管理器');\n \n // 使用独立配置创建配置管理器\n cachedConfigManager = await createFileServiceConfig({\n defaultStorage: 'aliyun-oss',\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: false,\n rootPath: 'uploads',\n baseUrl: '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: true,\n ...showmasterpieceOSSConfig\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n }\n });\n } else {\n console.log('🎨 [ShowMasterpiece] 独立配置不完整,使用默认配置');\n // 使用默认配置(主要从环境变量读取)\n cachedConfigManager = await createFileServiceConfig({\n defaultStorage: 'local', // 默认使用本地存储\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: true,\n rootPath: 'uploads',\n baseUrl: '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: false // 如果独立配置失败,禁用OSS\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n }\n });\n }\n }\n return cachedConfigManager;\n}\n\n/**\n * 获取ShowMasterpiece模块的文件服务配置\n */\nexport async function getShowMasterpieceFileConfig() {\n const configManager = await getCachedConfigManager();\n \n // 检查是否有OSS配置,如果有则优先使用OSS\n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n console.log('✅ [ShowMasterpiece] 使用阿里云OSS存储');\n return configManager;\n } else {\n console.log('ℹ️ [ShowMasterpiece] OSS未配置,使用本地存储');\n return configManager;\n }\n}\n\n/**\n * 上传ShowMasterpiece作品图片\n */\nexport async function uploadArtworkImage(file: File, collectionId?: number): Promise<{\n fileId: string;\n accessUrl: string;\n}> {\n console.log('🎨 [ShowMasterpiece] 开始上传作品图片:', file.name);\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', file);\n formData.append('moduleId', 'showmasterpiece');\n formData.append('businessId', collectionId ? `collection-${collectionId}` : 'artwork');\n\n // 为作品图片生成包含扩展名的路径,确保被正确识别为图片文件\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substr(2, 9);\n const extension = file.name.split('.').pop()?.toLowerCase() || 'jpg';\n const basePath = collectionId ? `showmasterpiece/collection-${collectionId}` : 'showmasterpiece/artwork';\n formData.append('folderPath', `${basePath}/${timestamp}_${randomId}.${extension}`);\n formData.append('needsProcessing', 'true');\n \n // 调用通用文件上传API\n const response = await fetch('/api/universal-file/upload', {\n method: 'POST',\n body: formData,\n });\n \n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n \n const result = await response.json();\n \n if (!result.success) {\n throw new Error(result.error || '上传失败');\n }\n \n console.log('✅ [ShowMasterpiece] 作品图片上传成功:', {\n fileId: result.data.fileId,\n accessUrl: result.data.accessUrl\n });\n \n return {\n fileId: result.data.fileId,\n accessUrl: result.data.accessUrl\n };\n}\n\n/**\n * 获取作品图片访问URL\n */\nexport async function getArtworkImageUrl(fileId: string): Promise<string> {\n console.log('🔗 [ShowMasterpiece] 获取作品图片URL:', fileId);\n \n const response = await fetch(`/api/universal-file/${fileId}`);\n \n if (!response.ok) {\n throw new Error(`获取文件URL失败: HTTP ${response.status}`);\n }\n \n const result = await response.json();\n \n if (!result.success) {\n throw new Error(result.error || '获取文件URL失败');\n }\n \n return result.data.accessUrl;\n}\n\n/**\n * 检查是否应该使用通用文件服务\n * \n * 策略:\n * 1. 如果已经配置了OSS,新上传默认使用文件服务\n * 2. 如果只有本地存储,可以选择使用文件服务进行统一管理\n * 3. 兼容旧的Base64存储方式\n */\nexport async function shouldUseUniversalFileService(): Promise<boolean> {\n try {\n const configManager = await getCachedConfigManager();\n \n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n // 如果OSS已配置且启用,推荐使用文件服务\n if (ossConfig && ossConfig.enabled) {\n return true;\n }\n \n // 即使只有本地存储,也推荐使用文件服务进行统一管理\n // 这样可以享受文件去重、缓存、统计等功能\n return true;\n \n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 检查文件服务配置失败:', error);\n return false;\n }\n}\n\n/**\n * 获取存储模式显示名称\n */\nexport async function getStorageModeDisplayName(): Promise<string> {\n const shouldUse = await shouldUseUniversalFileService();\n if (shouldUse) {\n const configManager = await getCachedConfigManager();\n \n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n return '阿里云OSS + CDN (独立配置)';\n } else {\n return '本地存储 + 文件服务';\n }\n } else {\n return 'Base64数据库存储';\n }\n}\n\n/**\n * 清除配置缓存\n * \n * 当配置更新后调用此函数,强制重新读取配置\n */\nexport function clearConfigCache(): void {\n console.log('🧹 [ShowMasterpiece] 清除配置缓存');\n cachedConfigManager = null;\n}\n\n/**\n * 强制刷新配置\n * \n * 清除缓存并重新获取配置\n */\nexport async function refreshFileServiceConfig() {\n console.log('🔄 [ShowMasterpiece] 强制刷新文件服务配置');\n clearConfigCache();\n const configManager = await getCachedConfigManager();\n \n // 如果是使用独立配置,确保重新初始化Provider(仅在服务器端)\n if (typeof window === 'undefined') {\n try {\n const config = configManager.getConfig() as any;\n const ossConfig = config?.storageProviders?.['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n console.log('🔄 [ShowMasterpiece] 重新初始化OSS Provider以应用新配置');\n // 创建新的文件服务实例以确保Provider使用最新配置\n const { UniversalFileService } = await import('../../../../universalFile/server/UniversalFileService');\n const fileService = new UniversalFileService(config as any);\n await fileService.initialize();\n \n // 重新初始化Provider\n await (fileService as any).reinitializeStorageProviders?.();\n }\n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 重新初始化Provider失败:', error);\n }\n }\n \n return configManager;\n} \n","/**\n * 通用文件服务配置管理\n */\n\n// 手动加载环境变量\nif (typeof window === 'undefined') {\n try {\n require('dotenv').config({ path: require('path').join(process.cwd(), '.env.local') });\n } catch (error) {\n console.warn('⚠️ [ConfigManager] 无法加载.env.local文件:', error);\n }\n}\n\nimport type {\n UniversalFileServiceConfig,\n StorageType,\n CDNType,\n LocalStorageConfig,\n AliyunOSSConfig,\n AliyunCDNConfig,\n StorageConfig,\n CDNConfig\n} from '../types';\n\n/**\n * 默认配置\n */\nconst DEFAULT_CONFIG: UniversalFileServiceConfig = {\n defaultStorage: 'aliyun-oss', // 修改默认存储为OSS\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: false, // 默认禁用本地存储\n rootPath: process.env.FILE_STORAGE_PATH || 'uploads',\n baseUrl: process.env.FILE_BASE_URL || '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: true, // 默认启用OSS\n region: '',\n bucket: '',\n accessKeyId: '',\n accessKeySecret: ''\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n },\n defaultCDN: 'none',\n cdnProviders: {\n 'none': {\n type: 'none',\n enabled: false\n } as CDNConfig,\n 'aliyun-cdn': {\n type: 'aliyun-cdn',\n enabled: false,\n domain: '',\n accessKeyId: '',\n accessKeySecret: ''\n } as AliyunCDNConfig,\n 'aws-cloudfront': {\n type: 'aws-cloudfront',\n enabled: false\n } as CDNConfig,\n 'qcloud-cdn': {\n type: 'qcloud-cdn',\n enabled: false\n } as CDNConfig\n },\n maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '104857600'), // 100MB\n allowedMimeTypes: [\n // 图片类型\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n // 音频类型\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n 'audio/mp4',\n 'audio/aac',\n // 视频类型\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/webm',\n 'video/mkv',\n // 文档类型\n 'application/pdf',\n 'text/plain',\n 'application/json',\n 'application/javascript',\n 'text/css',\n 'text/html',\n 'text/markdown',\n // 压缩文件\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n // 3D模型文件\n 'application/octet-stream', // PMD/PMX文件\n 'model/gltf+json',\n 'model/gltf-binary'\n ],\n enableProcessing: process.env.ENABLE_FILE_PROCESSING === 'true',\n processingQueueSize: parseInt(process.env.PROCESSING_QUEUE_SIZE || '10'),\n cache: {\n metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || '3600'), // 1小时\n urlTTL: parseInt(process.env.URL_CACHE_TTL || '1800') // 30分钟\n }\n};\n\n/**\n * 配置管理器\n */\nexport class FileServiceConfigManager {\n private config: UniversalFileServiceConfig;\n\n constructor(customConfig?: Partial<UniversalFileServiceConfig>) {\n this.config = this.mergeConfig(DEFAULT_CONFIG, customConfig);\n this.validateConfig();\n }\n\n /**\n * 获取完整配置\n */\n getConfig(): UniversalFileServiceConfig {\n return { ...this.config };\n }\n\n /**\n * 获取存储提供者配置\n */\n getStorageConfig(type: StorageType): StorageConfig | undefined {\n return this.config.storageProviders[type];\n }\n\n /**\n * 获取CDN提供者配置\n */\n getCDNConfig(type: CDNType): CDNConfig | undefined {\n return this.config.cdnProviders[type];\n }\n\n /**\n * 更新配置\n */\n updateConfig(updates: Partial<UniversalFileServiceConfig>): void {\n this.config = this.mergeConfig(this.config, updates);\n this.validateConfig();\n }\n\n /**\n * 启用存储提供者\n */\n enableStorageProvider(type: StorageType, config?: Partial<StorageConfig>): void {\n if (this.config.storageProviders[type]) {\n this.config.storageProviders[type] = {\n ...this.config.storageProviders[type],\n ...config,\n enabled: true\n };\n }\n }\n\n /**\n * 禁用存储提供者\n */\n disableStorageProvider(type: StorageType): void {\n if (this.config.storageProviders[type]) {\n this.config.storageProviders[type].enabled = false;\n }\n }\n\n /**\n * 启用CDN提供者\n */\n enableCDNProvider(type: CDNType, config?: Partial<CDNConfig>): void {\n if (this.config.cdnProviders[type]) {\n this.config.cdnProviders[type] = {\n ...this.config.cdnProviders[type],\n ...config,\n enabled: true\n };\n this.config.defaultCDN = type;\n }\n }\n\n /**\n * 禁用CDN提供者\n */\n disableCDNProvider(type: CDNType): void {\n if (this.config.cdnProviders[type]) {\n this.config.cdnProviders[type].enabled = false;\n if (this.config.defaultCDN === type) {\n this.config.defaultCDN = 'none';\n }\n }\n }\n\n /**\n * 从环境变量加载阿里云OSS配置\n */\n loadAliyunOSSFromEnv(): void {\n const config: Partial<AliyunOSSConfig> = {\n region: process.env.ALIYUN_OSS_REGION,\n bucket: process.env.ALIYUN_OSS_BUCKET,\n accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET,\n customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,\n secure: process.env.ALIYUN_OSS_SECURE === 'true',\n internal: process.env.ALIYUN_OSS_INTERNAL === 'true'\n };\n\n // 检查必需的配置项\n console.log('🔍 [ConfigManager] 阿里云OSS配置:', {\n region: config.region,\n bucket: config.bucket,\n accessKeyId: config.accessKeyId ? '***' : '未设置',\n accessKeySecret: config.accessKeySecret ? '***' : '未设置',\n customDomain: config.customDomain || '未设置'\n });\n if (config.region && config.bucket && config.accessKeyId && config.accessKeySecret) {\n this.enableStorageProvider('aliyun-oss', config);\n this.config.defaultStorage = 'aliyun-oss';\n console.log('✅ [ConfigManager] 从环境变量加载阿里云OSS配置成功');\n } else {\n console.warn('⚠️ [ConfigManager] 阿里云OSS环境变量配置不完整');\n }\n }\n\n /**\n * 从配置管理模块加载阿里云OSS配置\n */\n async loadAliyunOSSFromConfigManager(): Promise<void> {\n // sa2kit: configManager 未迁移,保持空实现\n return;\n }\n\n /**\n * 从环境变量加载阿里云CDN配置\n */\n loadAliyunCDNFromEnv(): void {\n const config: Partial<AliyunCDNConfig> = {\n domain: process.env.ALIYUN_CDN_DOMAIN,\n accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,\n region: process.env.ALIYUN_CDN_REGION\n };\n\n // 检查必需的配置项\n if (config.domain && config.accessKeyId && config.accessKeySecret) {\n this.enableCDNProvider('aliyun-cdn', config);\n console.log('✅ [ConfigManager] 从环境变量加载阿里云CDN配置成功');\n } else {\n // CDN配置是可选的,不输出警告\n console.log('ℹ️ [ConfigManager] 阿里云CDN未配置,将使用默认存储方式');\n }\n }\n\n /**\n * 验证配置有效性\n */\n private validateConfig(): void {\n // 检查默认存储提供者是否启用\n const defaultStorageConfig = this.config.storageProviders[this.config.defaultStorage];\n if (!defaultStorageConfig || !defaultStorageConfig.enabled) {\n console.warn(`⚠️ [ConfigManager] 默认存储提供者 ${this.config.defaultStorage} 未启用`);\n }\n\n // 检查文件大小限制\n if (this.config.maxFileSize <= 0) {\n throw new Error('文件大小限制必须大于0');\n }\n\n // 检查处理队列大小\n if (this.config.processingQueueSize <= 0) {\n throw new Error('处理队列大小必须大于0');\n }\n\n // 检查缓存TTL\n if (this.config.cache.metadataTTL <= 0 || this.config.cache.urlTTL <= 0) {\n throw new Error('缓存TTL必须大于0');\n }\n }\n\n /**\n * 合并配置\n */\n private mergeConfig(\n base: UniversalFileServiceConfig,\n override?: Partial<UniversalFileServiceConfig>\n ): UniversalFileServiceConfig {\n if (!override) return { ...base };\n\n return {\n ...base,\n ...override,\n storageProviders: {\n ...base.storageProviders,\n ...(override.storageProviders || {})\n },\n cdnProviders: {\n ...base.cdnProviders,\n ...(override.cdnProviders || {})\n },\n cache: {\n ...base.cache,\n ...(override.cache || {})\n }\n };\n }\n}\n\n/**\n * 创建默认配置管理器\n */\nexport async function createFileServiceConfig(customConfig?: Partial<UniversalFileServiceConfig>): Promise<FileServiceConfigManager> {\n const configManager = new FileServiceConfigManager(customConfig);\n \n // 尝试从环境变量加载云服务配置\n await configManager.loadAliyunOSSFromEnv();\n await configManager.loadAliyunCDNFromEnv();\n await configManager.loadAliyunOSSFromConfigManager();\n return configManager;\n}\n\n/**\n * 创建配置管理器(优先从配置管理模块加载)\n */\nexport async function createFileServiceConfigWithConfigManager(customConfig?: Partial<UniversalFileServiceConfig>): Promise<FileServiceConfigManager> {\n const configManager = new FileServiceConfigManager(customConfig);\n \n // 优先从配置管理模块加载配置\n await configManager.loadAliyunOSSFromConfigManager();\n \n // 如果配置管理模块没有配置,则从环境变量加载\n const ossConfig = configManager.getStorageConfig('aliyun-oss');\n if (!ossConfig || !ossConfig.enabled) {\n configManager.loadAliyunOSSFromEnv();\n }\n \n // 检查OSS配置是否有效\n const finalOssConfig = configManager.getStorageConfig('aliyun-oss');\n if (!finalOssConfig || !finalOssConfig.enabled || !validateAliyunOSSConfig(finalOssConfig as AliyunOSSConfig)) {\n console.warn('⚠️ [ConfigManager] OSS配置无效或未启用,启用本地存储作为备用方案');\n // 启用本地存储作为备用\n configManager.enableStorageProvider('local');\n configManager.updateConfig({ defaultStorage: 'local' });\n console.log('ℹ️ [ConfigManager] 已启用本地存储作为备用方案');\n } else {\n // OSS配置有效,确保使用OSS作为默认存储\n configManager.updateConfig({ defaultStorage: 'aliyun-oss' });\n console.log('✅ [ConfigManager] 使用阿里云OSS作为默认存储');\n \n // 同时启用本地存储作为备用\n configManager.enableStorageProvider('local');\n console.log('ℹ️ [ConfigManager] 同时启用本地存储作为备用方案');\n }\n \n configManager.loadAliyunCDNFromEnv();\n \n return configManager;\n}\n\n/**\n * 获取默认配置\n */\nexport function getDefaultConfig(): UniversalFileServiceConfig {\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * 验证阿里云OSS配置\n */\nexport function validateAliyunOSSConfig(config: AliyunOSSConfig): boolean {\n return !!(\n config.region &&\n config.bucket &&\n config.accessKeyId &&\n config.accessKeySecret\n );\n}\n\n/**\n * 验证阿里云CDN配置\n */\nexport function validateAliyunCDNConfig(config: AliyunCDNConfig): boolean {\n return !!(\n config.domain &&\n config.accessKeyId &&\n config.accessKeySecret\n );\n}\n\n/**\n * 格式化文件大小显示\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * 检查文件类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes: string[]): boolean {\n if (allowedTypes.length === 0) return true;\n return allowedTypes.includes(mimeType);\n}\n\n/**\n * 生成存储提供者显示名称\n */\nexport function getStorageProviderDisplayName(type: StorageType): string {\n const names: Record<StorageType, string> = {\n 'local': '本地存储',\n 'aliyun-oss': '阿里云OSS',\n 'aws-s3': 'AWS S3',\n 'qcloud-cos': '腾讯云COS'\n };\n \n return names[type] || type;\n}\n\n/**\n * 生成CDN提供者显示名称\n */\nexport function getCDNProviderDisplayName(type: CDNType): string {\n const names: Record<CDNType, string> = {\n 'none': '无CDN',\n 'aliyun-cdn': '阿里云CDN',\n 'aws-cloudfront': 'AWS CloudFront',\n 'qcloud-cdn': '腾讯云CDN'\n };\n \n return names[type] || type;\n} ","export * from './client';\n","import Taro from '@tarojs/taro';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_BASE_URL = 'https://qhr062.top';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createTaroExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await Taro.request({\n url,\n method,\n data,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return response.data as T;\n }\n\n throw new Error(extractErrorMessage(response.data, `请求失败 (${response.statusCode})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_BASE_URL) =>\n createShowmasterpieceClient(createTaroExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getCategories = async (baseUrl = DEFAULT_BASE_URL): Promise<CategoryOption[]> =>\n createClient(baseUrl).getCategories();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n"]}
1
+ {"version":3,"sources":["../../../src/logger/types.ts","../../../src/logger/console-adapter.ts","../../../src/logger/Logger.ts","../../../src/logger/index.ts","../../../src/universalFile/server/utils/mime.ts","../../../src/universalFile/types.ts","../../../src/universalFile/server/types.ts","../../../src/universalFile/server/providers/AliyunOSSProvider.ts","../../../src/universalFile/server/providers/LocalStorageProvider.ts","../../../src/universalFile/server/UniversalFileService.ts","../../../src/business/showmasterpiece/service/api/client.ts","../../../src/business/showmasterpiece/service/web/index.ts","../../../src/business/showmasterpiece/service/web/client.ts","../../../src/business/showmasterpiece/service/client-business/index.ts","../../../src/business/showmasterpiece/service/client-business/masterpiecesService.ts","../../../src/business/showmasterpiece/service/client-business/masterpiecesConfigService.ts","../../../src/business/showmasterpiece/service/client-business/cartService.ts","../../../src/business/showmasterpiece/service/client-business/cartHistoryService.ts","../../../src/business/showmasterpiece/service/client-business/bookingService.ts","../../../src/business/showmasterpiece/service/client-business/bookingAdminService.ts","../../../src/business/showmasterpiece/service/client-business/eventAwareMasterpiecesService.ts","../../../src/business/showmasterpiece/service/client-business/exportConfig.ts","../../../src/business/showmasterpiece/service/client-business/fileService.ts","../../../src/services/universalFile/config/index.ts","../../../src/business/showmasterpiece/service/miniapp/index.ts","../../../src/business/showmasterpiece/service/miniapp/client.ts"],"names":["path","init_types","FileServiceError","StorageProviderError","logger","fs","uuidv4","AliyunOSSProvider","LocalStorageProvider","path3","basename","getCollectionsOverview","batchBooking","createBooking","getBookableCollections","getBookings","deleteBooking","updateBookingStatus","UniversalFileService","checkPopupConfigs","getCategories","extractErrorMessage","createClient"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAMa,oBAAA;AANb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAMO,IAAM,uBAAN,MAAoD;AAAA,MAApD,WAAA,GAAA;AACL,QAAA,IAAA,CAAiB,MAAA,GAAS;AAAA,UACxB,KAAA,EAAO,UAAA;AAAA;AAAA,UACP,IAAA,EAAM,UAAA;AAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA;AAAA,UACN,KAAA,EAAO,UAAA;AAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,MAAA;AAAA,MAEA,IAAI,KAAA,EAAuB;AACzB,QAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,WAAW,IAAA,EAAM,OAAA,EAAS,OAAM,GAAI,KAAA;AAG5D,QAAA,IAAI,UAAA,GAAa,EAAA;AAGjB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,UAAA,IAAc,GAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,GAAK,IAAA;AAAA,QAC1D;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACzC,QAAA,UAAA,IAAe,SAAA,GAAa,IAAA;AAG5B,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,UAAA,IAAc,MAAO,OAAA,GAAW,IAAA;AAAA,QAClC;AAGA,QAAA,UAAA,IAAc,OAAA;AAGd,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,CAAA;AACH,YAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,OAAO,CAAA,EAAG,QAAQ,EAAE,CAAA;AAC5D,YAAA;AAAA,UACF,KAAK,CAAA;AACH,YAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,YAAY,MAAM,CAAA,EAAG,QAAQ,EAAE,CAAA;AAC1D,YAAA;AAAA,UACF,KAAK,CAAA;AACH,YAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,YAAY,MAAM,CAAA,EAAG,QAAQ,EAAE,CAAA;AAC1D,YAAA;AAAA,UACF,KAAK,CAAA;AACH,YAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,OAAO,CAAA,EAAG,QAAQ,EAAE,CAAA;AAC5D,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,YACrB;AACA,YAAA;AAAA;AACJ,MACF;AAAA,MAEQ,gBAAgB,IAAA,EAAoB;AAC1C,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B;AAAA,MAEQ,aAAa,KAAA,EAAyB;AAC5C,QAAA,MAAM,QAAQ,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AACvD,QAAA,OAAO,KAAA,CAAM,KAAK,CAAA,IAAK,SAAA;AAAA,MACzB;AAAA,MAEQ,QAAA,CAAS,SAAiB,KAAA,EAAyC;AAEzE,QAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,QAAQ,KAAA,EAAO;AAC3D,UAAA,OAAQ,KAAK,MAAA,CAAO,KAAK,CAAA,GAAM,OAAA,GAAY,KAAK,MAAA,CAAO,KAAA;AAAA,QACzD;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC8CO,SAAS,YAAA,CAAa,SAAiB,MAAA,EAAwC;AACpF,EAAA,OAAO,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA;AACnC;AA1HA,IAMa,MAAA;AANb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AACA,IAAA,oBAAA,EAAA;AAKO,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,MAKlB,WAAA,CAAY,QAAgC,OAAA,EAAkB;AAC5D,QAAA,MAAM,eACJ,OAAO,OAAA,KAAY,cAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,YAAA,GAAe,KAAA;AAE3E,QAAA,IAAA,CAAK,MAAA,GAAS;AAAA,UACZ,QAAA,EAAU,MAAA,EAAQ,QAAA,KAAa,YAAA,GAAe,CAAA,GAAI,CAAA,CAAA;AAAA;AAAA,UAClD,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,UAC5C,aAAA,EAAe,QAAQ,aAAA,IAAiB,IAAA;AAAA,UACxC,WAAA,EAAa,MAAA,EAAQ,WAAA,KAAgB,YAAA,GAAe,YAAA,GAAe,aAAA,CAAA;AAAA,UACnE,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,IAAI,oBAAA;AAAqB,SACvD;AACA,QAAA,IAAA,CAAK,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAC3B,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,OAAA,EAAyB;AACnC,QAAA,OAAO,IAAI,OAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,CAAM,SAAiB,KAAA,EAA2B;AAChD,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,CAAA;AAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA,YAAiB,QAAQ,MAAA,GAAY,KAAA;AAAA,UACrC,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,SACnC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAiB,IAAA,EAAY,KAAA,EAAqB;AAE7E,QAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAChC,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,iBAAiB,WAAA,EAAa;AACxE,UAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA;AAEvD,UAAA,IAAI,WAAA,KAAgB,OAAA,IAAW,KAAA,GAAQ,CAAA,EAAG;AAExC,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAkB;AAAA,UACtB,KAAA;AAAA,UACA,OAAA;AAAA,UACA,WAAW,IAAA,CAAK,MAAA,CAAO,eAAA,mBAAkB,IAAI,MAAK,GAAK,MAAA;AAAA,UACvD,IAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,aAAA,GAAgB,KAAK,OAAA,GAAU,MAAA;AAAA,UACpD;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,KAAA,EAAuB;AAC9B,QAAA,IAAA,CAAK,OAAO,QAAA,GAAW,KAAA;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAA,GAAqB;AACnB,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA;AAAA,MACrB;AAAA,KACF;AAKO,IAAe,IAAI,MAAA,EAAO;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnHjC,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC6EO,SAAS,YAAY,QAAA,EAA0B;AACpD,EAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,OAAO,UAAA,CAAW,GAAG,CAAA,IAAK,0BAAA;AAC5B;AAlFA,IAOM,UAAA;AAPN,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAOA,IAAM,UAAA,GAAqC;AAAA;AAAA,MAEzC,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA;AAAA,MAGT,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,oBAAA;AAAA,MACR,OAAA,EAAS,yEAAA;AAAA,MACT,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS,mEAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,OAAA,EAAS,2EAAA;AAAA,MACT,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,iBAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,8BAAA;AAAA,MACR,KAAA,EAAO,6BAAA;AAAA,MACP,MAAA,EAAQ,mBAAA;AAAA,MACR,KAAA,EAAO,kBAAA;AAAA;AAAA,MAGP,KAAA,EAAO,wBAAA;AAAA,MACP,OAAA,EAAS,kBAAA;AAAA,MACT,MAAA,EAAQ,iBAAA;AAAA,MACR,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,wBAAA;AAAA;AAAA,MAGP,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChEA,IAmSa,gBAAA,EAYA,iBAQA,mBAAA,EAQA,oBAAA;AA/Tb,IAAAC,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAmSO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,MAC1C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,QAAA,KAAA,CAAM,OAAO,CAAA;AAHG,QAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,QAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,QAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAM,eAAA,GAAN,cAA8B,gBAAA,CAAiB;AAAA,MACpD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAAiB;AAAA,MACxD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,yBAAyB,OAAO,CAAA;AAC/C,QAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,gBAAA,CAAiB;AAAA,MACzD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,0BAA0B,OAAO,CAAA;AAChD,QAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpUA,IA8caC,iBAAAA,EA4BAC,qBAAAA;AA1eb,IAAAF,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AA8cO,IAAMC,iBAAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,MAC1C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,QAAA,KAAA,CAAM,OAAO,CAAA;AAHG,QAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,QAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,QAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,MACd;AAAA,KACF;AAmBO,IAAMC,qBAAAA,GAAN,cAAmCD,iBAAAA,CAAiB;AAAA,MACzD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,0BAA0B,OAAO,CAAA;AAChD,QAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/eA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAkBME,OAAAA,EAKO,iBAAA;AAvBb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yDAAA,GAAA;AAKA,IAAA,WAAA,EAAA;AAWA,IAAAH,WAAAA,EAAAA;AAEA,IAAMG,OAAAA,GAAS,aAAa,mBAAmB,CAAA;AAKxC,IAAM,oBAAN,MAAoD;AAAA,MAApD,WAAA,GAAA;AACL,QAAA,IAAA,CAAS,IAAA,GAAoB,YAAA;AAE7B,QAAA,IAAA,CAAQ,MAAA,GAAiC,IAAA;AACzC,QAAA,IAAA,CAAQ,MAAA,GAAqB,IAAA;AAC7B,QAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AAAA,MAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,MAAM,WAAW,MAAA,EAAsC;AACrD,QAAA,OAAO,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,MAAA,EAAsC;AACvD,QAAAA,OAAAA,CAAO,IAAA,CAAK,mFAAA,EAAsC,MAAM,CAAA;AACxD,QAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,UAAA,MAAM,IAAID,sBAAqB,yEAAuB,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,SAAA,GAAY,MAAA;AAGlB,QAAA,MAAM,gBACJ,CAAC,IAAA,CAAK,MAAA,IACN,IAAA,CAAK,OAAO,MAAA,KAAW,SAAA,CAAU,MAAA,IACjC,IAAA,CAAK,OAAO,MAAA,KAAW,SAAA,CAAU,MAAA,IACjC,IAAA,CAAK,OAAO,WAAA,KAAgB,SAAA,CAAU,WAAA,IACtC,IAAA,CAAK,OAAO,eAAA,KAAoB,SAAA,CAAU,eAAA,IAC1C,IAAA,CAAK,OAAO,YAAA,KAAiB,SAAA,CAAU,YAAA,IACvC,IAAA,CAAK,OAAO,MAAA,KAAW,SAAA,CAAU,UACjC,IAAA,CAAK,MAAA,CAAO,aAAa,SAAA,CAAU,QAAA;AAErC,QAAA,IAAI,aAAA,EAAe;AACjB,UAAAC,OAAAA,CAAO,KAAK,mIAA4C,CAAA;AACxD,UAAAA,OAAAA,CAAO,IAAA;AAAA,YACL,8DAAA,GAAyC,SAAA,CAAU,MAAA,GAAU,WAAA,GAAe,SAAA,CAAU;AAAA,WACxF;AAAA,QACF,CAAA,MAAA,IAAW,KAAK,aAAA,EAAe;AAC7B,UAAAA,OAAAA,CAAO,KAAK,iHAAsC,CAAA;AAClD,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AAEd,QAAAA,QAAO,IAAA,CAAK,mCAAA,IAA6B,KAAK,aAAA,GAAgB,cAAA,GAAO,MAAM,yCAAW,CAAA;AACtF,QAAAA,OAAAA,CAAO,IAAA,CAAK,mCAAA,IAA6B,IAAA,CAAK,MAAA,GAAS,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,CAAG,CAAA;AAExF,QAAA,IAAI;AAEF,UAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,UAAA,IAAI,CAAC,KAAK,MAAA,CAAO,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,CAAO,WAAW,QAAA,EAAU;AACjE,YAAA,MAAM,IAAI,MAAM,mEAAsB,CAAA;AAAA,UACxC;AACA,UAAA,IAAI,CAAC,KAAK,MAAA,CAAO,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,CAAO,WAAW,QAAA,EAAU;AACjE,YAAA,MAAM,IAAI,MAAM,mEAAsB,CAAA;AAAA,UACxC;AACA,UAAA,IAAI,CAAC,KAAK,MAAA,CAAO,WAAA,IAAe,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAgB,QAAA,EAAU;AAC3E,YAAA,MAAM,IAAI,MAAM,wEAA2B,CAAA;AAAA,UAC7C;AACA,UAAA,IAAI,CAAC,KAAK,MAAA,CAAO,eAAA,IAAmB,OAAO,IAAA,CAAK,MAAA,CAAO,oBAAoB,QAAA,EAAU;AACnF,YAAA,MAAM,IAAI,MAAM,4EAA+B,CAAA;AAAA,UACjD;AAEA,UAAAA,OAAAA,CAAO,KAAK,CAAA,+EAAA,CAAA,EAAsC;AAAA,YAChD,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,YACpB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,YACpB,cAAA,EAAgB,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,YAC9B,kBAAA,EAAoB,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,eAAA;AAAA,YAClC,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,KAAA;AAAA,YAC/B,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,KAAA;AAAA,YAClC,KAAA,EAAO,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,YACrB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB;AAAA,WACvC,CAAA;AAGD,UAAA,IAAA,CAAK,MAAA,GAAS,IAAI,GAAA,CAAI;AAAA,YACpB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,YACpB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,YACpB,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,YACzB,eAAA,EAAiB,KAAK,MAAA,CAAO,eAAA;AAAA,YAC7B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,KAAA;AAAA;AAAA,YAC/B,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,KAAA;AAAA;AAAA,YAClC,OAAA,EAAS,GAAA;AAAA;AAAA,YACT,KAAA,EAAO,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA;AAAA,YACrB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,KAAA;AAAA,WACvC,CAAA;AAED,UAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,YAAA,MAAM,IAAI,MAAM,+CAAY,CAAA;AAAA,UAC9B;AACA,UAAAA,OAAAA,CAAO,KAAK,CAAA,8EAAA,CAAmC,CAAA;AAC/C,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,UAAAA,QAAO,IAAA,CAAK,kDAAA,IAAkC,aAAA,GAAgB,cAAA,GAAO,MAAM,gCAAO,CAAA;AAAA,QACpF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,iFAAA,EAAsC,KAAK,CAAA;AACxD,UAAA,MAAM,IAAID,sBAAqB,CAAA,mDAAA,CAAa,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAA,CAAO,QAAA,EAA0B,QAAA,EAA0C;AAC/E,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAAC,OAAAA,CAAO,IAAA,CAAK,+EAAA,GAAyC,QAAS,CAAA;AAE9D,QAAA,IAAI;AAEF,UAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA;AAG5D,UAAA,MAAM,OAAA,GAAe;AAAA,YACnB,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,IAAQ,0BAAA;AAAA,cACtC,gBAAA,EAAkB,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,QAAA;AAAS,aAChD;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,GAAA,EAAK,CAAA;AAAA;AAAA,cACL,GAAA,EAAK,CAAA;AAAA;AAAA,cACL,YAAA,EAAc,kBAAA,CAAmB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,cACnD,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,UAAA,EAAY,SAAS,UAAA,IAAc,EAAA;AAAA,cACnC,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA;AAAA,cAEnC,GAAG,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,QAAA,IAAY,EAAE;AAAA;AAChD,WACF;AAGA,UAAA,IAAI,MAAA;AAEJ,UAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAA,GAAO,GAAA,GAAM,OAAO,IAAA,EAAM;AAE1C,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,wFAAA,GAAwC,QAAA,GAAY,kBAAA,GAAY,QAAA,CAAS,IAAA,CAAK;AAAA,aAChF;AACA,YAAA,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,UAC/D,CAAA,MAAO;AACL,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,sEAAA,GAAqC,QAAA,GAAY,kBAAA,GAAY,QAAA,CAAS,IAAA,CAAK;AAAA,aAC7E;AACA,YAAA,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,UAC3D;AAGA,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAEjD,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,UAAAA,QAAO,IAAA,CAAK,mEAAA,GAAoC,QAAA,GAAY,kBAAA,GAAY,aAAc,IAAI,CAAA;AAE1F,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,GAAA,EAAK,SAAA;AAAA,YACL,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,YACpB,IAAA,EAAM;AAAA,cACJ,MAAM,MAAA,CAAO,IAAA,GAAO,KAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,GAAI,EAAA;AAAA,cAClD,SAAA,EAAW,MAAA,CAAO,GAAA,EAAK,EAAA,IAAM,CAAA;AAAA,cAC7B,UAAA;AAAA,cACA,MAAA,EAAQ,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO;AAAA;AAC/B,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,QAAA,GAAY,KAAK,KAAK,CAAA;AAEvE,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAS,QAAA,EAAmC;AAChD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAA,OAAAA,CAAO,IAAA,CAAK,+EAAA,GAAyC,QAAS,CAAA;AAE9D,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAE9C,UAAA,IAAI,CAAC,OAAO,OAAA,IAAW,CAAC,OAAO,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AACvD,YAAA,MAAM,IAAID,sBAAqB,oEAAa,CAAA;AAAA,UAC9C;AAEA,UAAAC,OAAAA,CAAO,IAAA;AAAA,YACL,mEAAA,GAAoC,QAAA,GAAY,kBAAA,GAAY,MAAA,CAAO,OAAA,CAAQ;AAAA,WAC7E;AAEA,UAAA,OAAO,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,QAAA,GAAY,KAAK,KAAK,CAAA;AAEvE,UAAA,IAAI,KAAK,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,WAAA,EAAa;AACxD,YAAA,MAAM,IAAID,sBAAqB,CAAA,8BAAA,CAAO,CAAA;AAAA,UACxC;AAEA,UAAA,MAAM,IAAIA,sBAAqB,CAAA,oCAAA,CAAQ,CAAA;AAAA,QACzC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,QAAA,EAA0C;AACrD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAC,OAAAA,CAAO,IAAA,CAAK,qFAAA,GAA0C,QAAS,CAAA;AAE/D,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAEjD,UAAAA,OAAAA,CAAO,IAAA,CAAK,mEAAA,GAAoC,QAAS,CAAA;AAEzD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAK,EAAA,IAAM,CAAA;AAAA,cAC9B,WAAA,EAAa;AAAA;AACf,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,QAAA,GAAY,KAAK,KAAK,CAAA;AAGvE,UAAA,IAAI,KAAK,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,WAAA,EAAa;AACxD,YAAAA,OAAAA,CAAO,IAAA,CAAK,mEAAA,GAAoC,QAAS,CAAA;AACzD,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM,EAAE,MAAA,EAAQ,iBAAA;AAAkB,aACpC;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,QAAA,EAA0C;AAC1D,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAE/C,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,gBAAgB,CAAA,IAAK,GAAG,CAAC,CAAA;AAAA,YAC3D,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,cAC1B,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,IAAK,EAAA;AAAA,cAC9C,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAAA,cACvC,MAAM,MAAA,CAAO,IAAA;AAAA,cACb,IAAA,EAAM,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,gBAAgB,CAAA,IAAK,GAAG,CAAC;AAAA;AAC7D,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAK,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,WAAA,EAAa;AACxD,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACT;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CAAa,QAAA,EAAkB,SAAA,EAAqC;AACxE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AAGF,UAAA,MAAM,OAAA,GAAU,yCAAA,CAA0C,IAAA,CAAK,QAAQ,CAAA;AAEvE,UAAA,IAAI,OAAA,EAAS;AAEX,YAAA,OAAO,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,UACxC,CAAA,MAAO;AAEL,YAAA,MAAM,UAAU,SAAA,IAAa,IAAA;AAC7B,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,QAAA,EAAU;AAAA,cACpD,OAAA;AAAA,cACA,MAAA,EAAQ;AAAA,aACT,CAAA;AAED,YAAA,OAAO,SAAA,IAAa,EAAA;AAAA,UACtB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuC,QAAA,GAAY,KAAK,KAAK,CAAA;AAC1E,UAAA,MAAM,IAAID,sBAAqB,CAAA,uCAAA,CAAW,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CAAa,QAAA,EAAkB,SAAA,EAAqC;AACxE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,SAAA,IAAa,IAAA;AAC7B,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,QAAA,EAAU;AAAA,YACpD,OAAA;AAAA,YACA,MAAA,EAAQ;AAAA,WACT,CAAA;AAED,UAAA,OAAO,SAAA,IAAa,EAAA;AAAA,QACtB,SAAS,KAAA,EAAO;AACd,UAAAC,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuC,QAAA,GAAY,KAAK,KAAK,CAAA;AAC1E,UAAA,MAAM,IAAID,sBAAqB,CAAA,uCAAA,CAAW,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,QAAA,EAAoC;AAC/C,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAChC,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAK,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,WAAA,EAAa;AACxD,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAAC,OAAAA,CAAO,IAAA,CAAK,iGAAA,GAAyC,QAAA,GAAY,KAAK,KAAK,CAAA;AAC3E,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAA,CAAU,MAAA,EAAgB,SAAA,GAAoB,GAAA,EAAK,UAAkB,GAAA,EAWxE;AACD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAe;AAAA,YACnB,MAAA;AAAA,YACA,SAAA;AAAA,YACA,UAAA,EAAY,OAAO,OAAO;AAAA,WAC5B;AAEA,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAElD,UAAA,MAAM,SAAS,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,YACtD,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,GAAA,EAAK,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA;AAAA,YACpC,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,cAAc,GAAA,CAAI,YAAA;AAAA,YAClB,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACR,CAAE,CAAA;AAEF,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAEpC,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA;AAAA,YACA,YAAY,MAAA,CAAO;AAAA,WACrB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,MAAA,GAAU,KAAK,KAAK,CAAA;AACrE,UAAA,MAAM,IAAID,sBAAqB,CAAA,oCAAA,CAAQ,CAAA;AAAA,QACzC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CAAK,MAAA,EAAgB,OAAA,EAAqC;AAC9D,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAe;AAAA,YACnB,MAAA;AAAA,YACA,UAAA,EAAY,MAAA,CAAO,OAAA,IAAW,GAAI;AAAA,WACpC;AAEA,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAElD,UAAA,OAAO,MAAA,CAAO,SAAS,GAAA,CAAI,CAAC,QAAa,GAAA,CAAI,IAAI,KAAK,EAAC;AAAA,QACzD,SAAS,KAAA,EAAO;AACd,UAAAC,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,MAAA,GAAU,KAAK,KAAK,CAAA;AACrE,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,iBAAA,GAA0B;AAChC,QAAA,IAAI,CAAC,KAAK,aAAA,IAAiB,CAAC,KAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AACvD,UAAA,MAAM,IAAID,sBAAqB,2DAAc,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAA,GAAuB;AAC7B,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAIA,sBAAqB,6BAAS,CAAA;AAAA,QAC1C;AAEA,QAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAU,QAAA,EAAU,eAAe,iBAAiB,CAAA;AACtE,QAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,QAAQ,CAAC,IAAA,CAAK,MAAA,CAAQ,GAA4B,CAAC,CAAA;AAEpF,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,MAAM,IAAIA,sBAAqB,CAAA,6CAAA,CAAY,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,cAAA,GAAgC;AAAA,MAE9C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,eAAA,CAAgB,QAAA,EAAkB,MAAA,EAAgB,OAAA,EAA4B;AAC1F,QAAAC,OAAAA,CAAO,KAAK,CAAA,wEAAA,CAAgC,CAAA;AAG5C,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,eAAA,CAAgB,UAAU,MAAA,EAAQ;AAAA,UAClE,QAAA,EAAU,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA,UACtB,QAAA,EAAU,CAAA;AAAA;AAAA,UACV,QAAA,EAAU,CAAC,CAAA,KAAc;AACvB,YAAA,IAAI,CAAA,GAAI,MAAM,IAAA,EAAM;AAElB,cAAAA,OAAAA,CAAO,KAAK,0DAAA,GAAA,CAAoC,CAAA,GAAI,KAAK,OAAA,CAAQ,CAAC,IAAK,GAAG,CAAA;AAAA,YAC5E;AAAA,UACF,CAAA;AAAA,UACA,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,SAAS,OAAA,CAAQ;AAAA,SAClB,CAAA;AAED,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,UACtB,GAAA,EAAK,QAAQ,IAAA,IAAQ,EAAA;AAAA;AAAA,UACrB,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,EAAC;AAAA,UACvB,GAAA,EAAK,MAAA,EAAQ,GAAA,IAAO;AAAC,SACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAkB,QAAA,EAA0B;AAClD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAID,sBAAqB,6BAAS,CAAA;AAAA,QAC1C;AAGA,QAAA,MAAM,cAAA,GAAiB,SAAS,UAAA,CAAW,GAAG,IAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,GAAI,QAAA;AAE1E,QAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAE5B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,QAAQ,OAAA,GAAU,MAAA;AAC1D,UAAA,MAAM,MAAO,QAAA,GAAY,KAAA,GAAS,IAAA,CAAK,MAAA,CAAO,eAAgB,GAAA,GAAO,cAAA;AACrE,UAAAC,OAAAA,CAAO,IAAA,CAAK,4EAAA,GAAsC,GAAI,CAAA;AACtD,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,MAAO;AAEL,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,QAAQ,OAAA,GAAU,MAAA;AAC1D,UAAA,MAAM,GAAA,GAAO,QAAA,GAAY,KAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAU,GAAA,GAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAU,gBAAA,GAAoB,cAAA;AACzG,UAAAA,OAAAA,CAAO,IAAA,CAAK,yEAAA,GAAwC,GAAI,CAAA;AACxD,UAAA,OAAO,GAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,WACN,KAAA,EAC8E;AAE9E,QAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IACtB,QAAQ,KAAA,CAAM,IAAA,IAAQ,EAAA,CAAA,KAAQ,QAAA,IAC9B,QAAQ,KAAA,CAAM,OAAA,IAAW,EAAA,CAAA,KAAQ,QAAA;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,KAAA,EAAoB;AAKzC,QAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,UAAA,OAAO,KAAA,CAAM,OAAA;AAAA,QACf;AACA,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,0BAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CACJ,cAAA,EACA,QAAA,EACA,aACA,aAAA,EACwB;AACxB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAAA,OAAAA,CAAO,IAAA,CAAK,2FAAA,GAA2C,QAAS,CAAA;AAEhE,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAe;AAAA,YACnB,OAAA,EAAS,GAAA;AAAA,YACT,MAAM,WAAA,IAAe,0BAAA;AAAA,YACrB,IAAA,EAAM,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,YACvB,QAAA,EAAU,EAAE,GAAA,EAAK,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA,YAC9B,SAAS;AAAC,WACZ;AAEA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA,GAAI,aAAA,CAAc,QAAA,EAAS;AAAA,UAC7D;AAEA,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,SAAA,CAAU,QAAA,EAAU,gBAAgB,OAAO,CAAA;AAE7E,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAEjD,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,UAAAA,QAAO,IAAA,CAAK,mEAAA,GAAoC,QAAA,GAAY,kBAAA,GAAY,aAAc,IAAI,CAAA;AAE1F,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,GAAA,EAAK,SAAA;AAAA,YACL,IAAA,EAAM,aAAA;AAAA,YACN,IAAA,EAAM;AAAA,cACJ,MAAM,MAAA,CAAO,IAAA;AAAA,cACb,SAAA,EAAW,MAAA,CAAO,GAAA,EAAK,EAAA,IAAM,CAAA;AAAA,cAC7B,UAAA;AAAA,cACA,MAAA,EAAQ,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO;AAAA;AAC/B,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,mEAAA,GAAoC,QAAA,GAAY,KAAK,KAAK,CAAA;AAEvE,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,SAAA,EAA6C;AAC7D,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAA,OAAAA,CAAO,IAAA,CAAK,0GAAA,GAA2C,SAAA,CAAU,MAAO,CAAA;AAExE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,YAAY,SAAA,EAAW;AAAA,YACvD,KAAA,EAAO;AAAA;AAAA,WACR,CAAA;AAED,UAAAA,QAAO,IAAA,CAAK,qFAAA,IAAuC,MAAA,CAAO,OAAA,EAAS,UAAU,CAAA,CAAE,CAAA;AAE/E,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,SAAS,MAAA,CAAO,OAAA;AAAA,cAChB,SAAA,EAAW,MAAA,CAAO,GAAA,EAAK,EAAA,IAAM;AAAA;AAC/B,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,gEAAA,CAAA,EAAiC,KAAK,CAAA;AAEnD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CAAK,UAAA,EAAoB,UAAA,EAA4C;AACzE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAA,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAAqC,UAAA,GAAc,SAAU,UAAW,CAAA;AAEpF,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,YAAY,UAAU,CAAA;AAE7D,UAAAA,OAAAA,CAAO,IAAA,CAAK,mEAAA,GAAoC,UAAA,GAAc,SAAU,UAAW,CAAA;AAEnF,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA;AAAA,cACnB,YAAA,EAAc,OAAO,IAAA,EAAM,YAAA;AAAA,cAC3B,SAAA,EAAW,MAAA,CAAO,GAAA,EAAK,EAAA,IAAM;AAAA;AAC/B,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,QAAO,KAAA,CAAM,mEAAA,GAAoC,aAAc,MAAA,GAAU,UAAA,GAAc,KAAK,KAAK,CAAA;AAEjG,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,KAAK;AAAA,WAClC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,QAAA,EAAuD;AAC5E,QAAA,MAAM,UAAkC,EAAC;AAEzC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,UAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAEzC,YAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,YAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,kBAAA,CAAmB,WAAW,CAAA;AAAA,UAC/C;AAAA,QACF;AAEA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9rBA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAqBMA,OAAAA,EAKO,oBAAA;AA1Bb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4DAAA,GAAA;AAQA,IAAA,WAAA,EAAA;AAWA,IAAAH,WAAAA,EAAAA;AAEA,IAAMG,OAAAA,GAAS,aAAa,sBAAsB,CAAA;AAK3C,IAAM,uBAAN,MAAuD;AAAA,MAAvD,WAAA,GAAA;AACL,QAAA,IAAA,CAAS,IAAA,GAAoB,OAAA;AAE7B,QAAA,IAAA,CAAQ,MAAA,GAAoC,IAAA;AAC5C,QAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AAAA,MAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,MAAM,WAAW,MAAA,EAAsC;AACrD,QAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,IAAID,sBAAqB,oEAAkB,CAAA;AAAA,QACnD;AAEA,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,QAAAC,OAAAA,CAAO,IAAA,CAAK,uGAAA,GAA6C,IAAA,CAAK,OAAO,QAAS,CAAA;AAE9E,QAAA,IAAI;AAEF,UAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAGrD,UAAA,MAAM,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAEvD,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,UAAAA,OAAAA,CAAO,KAAK,sFAAoC,CAAA;AAAA,QAClD,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,uFAAA,EAAuC,KAAK,CAAA;AACzD,UAAA,MAAM,IAAID,sBAAqB,CAAA,sDAAA,CAAW,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAA,CAAO,QAAA,EAA0B,QAAA,EAA0C;AAC/E,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAAC,OAAAA,CAAO,IAAA,CAAK,yEAAA,GAAwC,QAAS,CAAA;AAE7D,QAAA,IAAI;AAEF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAG1C,UAAA,MAAM,IAAA,CAAK,qBAAA,CAA2B,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGvD,UAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA;AAG5D,UAAA,MAAMC,QAAA,CAAG,SAAA,CAAU,QAAA,EAAU,MAAM,CAAA;AAGnC,UAAA,MAAM,KAAA,GAAQ,MAAMA,QAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAEpC,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM;AACrC,YAAA,MAAM,IAAIF,qBAAAA;AAAA,cACR,2DAAA,GAAkB,QAAA,CAAS,IAAA,CAAK,IAAA,GAAQ,oBAAW,KAAA,CAAM;AAAA,aAC3D;AAAA,UACF;AAGA,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAEjD,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,UAAAC,QAAO,IAAA,CAAK,sEAAA,GAAuC,QAAA,GAAY,kBAAA,GAAY,aAAc,IAAI,CAAA;AAE7F,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,GAAA,EAAK,SAAA;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,IAAA,EAAM;AAAA,cACJ,QAAA;AAAA,cACA;AAAA;AACF,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuC,QAAA,GAAY,KAAK,KAAK,CAAA;AAE1E,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAASJ,KAAAA,EAA+B;AAC5C,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAI,OAAAA,CAAO,IAAA,CAAK,yEAAA,GAAwCJ,KAAK,CAAA;AAEzD,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAYA,KAAI,CAAA;AAGtC,UAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,YAAA,MAAM,IAAIG,qBAAAA,CAAqB,kCAAA,GAAaH,KAAK,CAAA;AAAA,UACnD;AAGA,UAAA,MAAM,MAAA,GAAS,MAAMK,QAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAEzC,UAAAD,QAAO,IAAA,CAAK,sEAAA,GAAuCJ,KAAAA,GAAQ,kBAAA,GAAY,OAAO,MAAO,CAAA;AAErF,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAAI,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuCJ,KAAAA,GAAQ,KAAK,KAAK,CAAA;AACtE,UAAA,MAAM,IAAIG,qBAAAA;AAAA,YACR,wCAAA,IAAc,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,WACzD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAOH,KAAAA,EAAsC;AACjD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAAI,OAAAA,CAAO,IAAA,CAAK,+EAAA,GAAyCJ,KAAK,CAAA;AAE1D,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAYA,KAAI,CAAA;AAGtC,UAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,YAAAI,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAAuCJ,KAAK,CAAA;AACxD,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,IAAA;AAAA;AAAA,cACT,IAAA,EAAM,EAAE,MAAA,EAAQ,iBAAA;AAAkB,aACpC;AAAA,UACF;AAGA,UAAA,MAAMK,QAAA,CAAG,OAAO,QAAQ,CAAA;AAExB,UAAAD,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAAuCJ,KAAK,CAAA;AAExD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,EAAE,WAAA,EAAa,QAAA;AAAS,WAChC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAI,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuCJ,KAAAA,GAAQ,KAAK,KAAK,CAAA;AAEtE,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAYA,KAAAA,EAAsC;AACtD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAYA,KAAI,CAAA;AAEtC,UAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACT;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,GAAQ,MAAMK,QAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAEpC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,IAAA,EAAM;AAAA,cACJ,QAAA;AAAA,cACA,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,cACrB,WAAA,EAAa,MAAM,WAAA;AAAY;AACjC,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CAAaL,KAAAA,EAAc,UAAA,EAAsC;AACrE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAGvB,QAAA,OAAO,IAAA,CAAK,kBAAkBA,KAAI,CAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CAAaA,KAAAA,EAAc,UAAA,EAAsC;AACrE,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAGvB,QAAAI,OAAAA,CAAO,KAAK,CAAA,+GAAA,CAA2C,CAAA;AACvD,QAAA,OAAO,IAAA,CAAK,kBAAkBJ,KAAI,CAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAOA,KAAAA,EAAgC;AAC3C,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAYA,KAAI,CAAA;AACtC,UAAA,OAAO,WAAW,QAAQ,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CAAK,MAAA,EAAgB,OAAA,EAAqC;AAC9D,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC1C,UAAA,MAAM,OAAA,GAAe,cAAQ,UAAU,CAAA;AACvC,UAAA,MAAM,WAAA,GAAmB,eAAS,UAAU,CAAA;AAE5C,UAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG;AACxB,YAAA,OAAO,EAAC;AAAA,UACV;AAEA,UAAA,MAAM,OAAA,GAAU,MAAMK,QAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AACjE,UAAA,IAAI,KAAA,GAAQ,OAAA,CACT,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,EAAQ,CAAA,CAChC,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,WAAW,CAAC,CAAA,CAC7C,GAAA,CAAI,CAAC,IAAA,KAAc,KAAA,CAAA,IAAA,CAAU,KAAA,CAAA,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAGtD,UAAA,IAAI,OAAA,IAAW,UAAU,CAAA,EAAG;AAC1B,YAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,UAChC;AAEA,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAAD,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuC,MAAA,GAAU,KAAK,KAAK,CAAA;AACxE,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,iBAAA,GAA0B;AAChC,QAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,KAAK,MAAA,EAAQ;AACvC,UAAA,MAAM,IAAID,sBAAqB,wDAAW,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,YAAA,EAA8B;AAChD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAIA,sBAAqB,wDAAW,CAAA;AAAA,QAC5C;AAGA,QAAA,MAAM,cAAA,GAAsB,gBAAU,YAAY,CAAA;AAClD,QAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AACjC,UAAA,MAAM,IAAIA,sBAAqB,4FAAiB,CAAA;AAAA,QAClD;AAEA,QAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,cAAc,CAAA;AAAA,MACvD;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAkB,YAAA,EAA8B;AACtD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAIA,sBAAqB,wDAAW,CAAA;AAAA,QAC5C;AAGA,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAG/C,QAAA,MAAM,oBAAoB,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,UAAU,GAAA,GAAO,OAAA;AAErE,QAAA,OAAQ,IAAA,CAAK,OAAO,OAAA,GAAY,iBAAA;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,sBAAsB,OAAA,EAAgC;AAClE,QAAA,IAAI;AACF,UAAA,MAAME,SAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,QAC7C,SAAS,KAAA,EAAO;AAEd,UAAA,IAAI,iBAAiB,KAAA,IAAS,MAAA,IAAU,KAAA,IAAS,KAAA,CAAM,SAAS,QAAA,EAAU;AACxE,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAAwB,OAAA,EAAgC;AACpE,QAAA,IAAI;AAEF,UAAA,MAAMA,QAAA,CAAG,OAAO,OAAA,EAASA,QAAA,CAAG,UAAU,IAAA,GAAOA,QAAA,CAAG,UAAU,IAAI,CAAA;AAAA,QAChE,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAIF,qBAAAA;AAAA,YACR,uDAAgB,OAAA,GAAW,IAAA,IAAQ,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,0BAAA;AAAA,WAC9E;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,CACJ,cAAA,EACA,QAAA,EACwB;AACxB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAAC,OAAAA,CAAO,IAAA,CAAK,qFAAA,GAA0C,QAAS,CAAA;AAE/D,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAG1C,UAAA,MAAM,IAAA,CAAK,qBAAA,CAA2B,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGvD,UAAA,MAAM,WAAA,GAAc,kBAAkB,QAAQ,CAAA;AAG9C,UAAA,MAAM,QAAA,CAAS,gBAAgB,WAAW,CAAA;AAG1C,UAAA,MAAM,KAAA,GAAQ,MAAMC,QAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAGpC,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAEjD,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,UAAAD,OAAAA,CAAO,IAAA;AAAA,YACL,yEAAuC,QAAA,GAAY,kBAAA,GAAY,KAAA,CAAM,IAAA,GAAQ,qBAAY,UAAA,GAAc;AAAA,WACzG;AAEA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,GAAA,EAAK,SAAA;AAAA,YACL,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,IAAA,EAAM;AAAA,cACJ,QAAA;AAAA,cACA;AAAA;AACF,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,sEAAA,GAAuC,QAAA,GAAY,KAAK,KAAK,CAAA;AAE1E,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqBJ,KAAAA,EAAqC;AACxD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAYA,KAAI,CAAA;AAEtC,QAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,UAAA,MAAM,IAAIG,qBAAAA,CAAqB,kCAAA,GAAaH,KAAK,CAAA;AAAA,QACnD;AAEA,QAAA,OAAO,iBAAiB,QAAQ,CAAA;AAAA,MAClC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClbA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAaMI,OAAAA,EAkCO,oBAAA;AA/Cb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kDAAA,GAAA;AAUA,IAAA,WAAA,EAAA;AACA,IAAA,SAAA,EAAA;AA2BA,IAAAH,WAAAA,EAAAA;AAzBA,IAAMG,OAAAA,GAAS,aAAa,sBAAsB,CAAA;AAkC3C,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAA,MAiBrD,YAAY,MAAA,EAAoC;AAC9C,QAAA,KAAA,EAAM;AAhBR,QAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAAmC;AAClE,QAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAA2B;AACtD,QAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAmC;AAChE,QAAA,IAAA,CAAQ,iBAAA,uBAAwB,GAAA,EAA4B;AAC5D,QAAA,IAAA,CAAQ,aAAA,uBAAoB,GAAA,EAAqD;AACjF,QAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA8C;AACrE,QAAA,IAAA,CAAQ,kBAMH,EAAC;AACN,QAAA,IAAA,CAAQ,wBAAA,GAA2B,KAAA;AAIjC,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,QAAA,IAAI,KAAK,MAAA,CAAO,WAAA,EAAa,WAAW,IAAA,CAAK,MAAA,CAAO,YAAY,UAAA,EAAY;AAC1E,UAAA,IAAA,CAAK,yBAAA,EAA0B;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASQ,yBAAA,GAAkC;AACxC,QAAA,MAAM,EAAE,UAAA,EAAY,WAAA,GAAc,IAAA,EAAK,GAAI,KAAK,MAAA,CAAO,WAAA;AAEvD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAAA,OAAAA,CAAO,KAAK,sFAAoC,CAAA;AAChD,UAAA;AAAA,QACF;AAEA,QAAAA,OAAAA,CAAO,KAAK,4IAA6C,CAAA;AAGzD,QAAA,IAAA,CAAK,EAAA,CAAG,iBAAA,EAAmB,OAAO,MAAA,EAAgB,IAAA,KAAc;AAC9D,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AAClC,YAAA,MAAM,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC9B,YAAAA,OAAAA,CAAO,IAAA,CAAK,wFAAA,GAAmC,MAAO,CAAA;AAAA,UACxD,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,KAAA,CAAM,iDAAA,GAA4B,MAAA,EAAS,KAAK,CAAA;AAAA,UAEzD;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,IAAA,CAAK,EAAA,CAAG,cAAA,EAAgB,OAAO,MAAA,KAAmB;AAChD,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,CAAW,OAAO,MAAM,CAAA;AAC9B,YAAAA,OAAAA,CAAO,IAAA,CAAK,8FAAA,GAAoC,MAAO,CAAA;AAAA,UACzD,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,KAAA,CAAM,iDAAA,GAA4B,MAAA,EAAS,KAAK,CAAA;AAAA,UACzD;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,IAAA,CAAK,EAAA,CAAG,qBAAA,EAAuB,OAAO,OAAA,KAAsB;AAC1D,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,CAAW,YAAY,OAAO,CAAA;AACpC,YAAAA,OAAAA,CAAO,IAAA,CAAK,4EAAA,GAAiC,OAAA,CAAQ,SAAU,qBAAM,CAAA;AAAA,UACvE,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,yDAAA,CAAA,EAA0B,KAAK,CAAA;AAAA,UAC9C;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,UAAA,GAA4B;AAChC,QAAAA,OAAAA,CAAO,KAAK,4FAAwC,CAAA;AAEpD,QAAA,IAAI;AAEF,UAAA,MAAM,KAAK,qBAAA,EAAsB;AAGjC,UAAA,MAAM,KAAK,0BAAA,EAA2B;AAGtC,UAAA,MAAM,KAAK,sBAAA,EAAuB;AAGlC,UAAA,MAAM,KAAK,wBAAA,EAAyB;AAEpC,UAAAA,OAAAA,CAAO,KAAK,sFAAoC,CAAA;AAAA,QAClD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yFAAuC,KAAK,CAAA;AAC1D,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,4BAAA,GAA8C;AAClD,QAAAA,OAAAA,CAAO,KAAK,kGAAyC,CAAA;AAErD,QAAA,IAAI;AAEF,UAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACpD,YAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,cAAA,IAAI;AACF,gBAAAA,OAAAA,CAAO,IAAA,CAAK,iGAAA,GAA4C,IAAA,GAAQ,KAAK,CAAA;AAGrE,gBAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,CAAe,gBAAA,GAAmB,IAAc,CAAA;AACrE,gBAAA,IAAI,MAAA,EAAQ;AACV,kBAAA,MAAO,QAAA,CAAiB,aAAa,MAAM,CAAA;AAC3C,kBAAAA,OAAAA,CAAO,IAAA,CAAK,0GAAA,GAA6C,IAAK,CAAA;AAAA,gBAChE,CAAA,MAAO;AACL,kBAAAA,OAAAA,CAAO,IAAA,CAAK,oGAAA,GAA4C,IAAK,CAAA;AAAA,gBAC/D;AAAA,cACF,SAAS,KAAA,EAAO;AACd,gBAAAA,OAAAA,CAAO,KAAA,CAAM,0GAAA,GAA6C,IAAA,EAAO,KAAK,CAAA;AAAA,cAExE;AAAA,YACF;AAAA,UACF;AAEA,UAAAA,OAAAA,CAAO,KAAK,wGAAuC,CAAA;AAAA,QACrD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,2GAA0C,KAAK,CAAA;AAC7D,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,QAAA,EAAkC;AACxD,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AACjD,QAAAA,OAAAA,CAAO,IAAA,CAAK,+EAAA,GAAyC,QAAA,CAAS,IAAK,CAAA;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAoB,QAAA,EAA8B;AAChD,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAC7C,QAAAA,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAA0C,QAAA,CAAS,IAAK,CAAA;AAAA,MACtE;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAsB,SAAA,EAAiC;AACrD,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AACjD,QAAAA,OAAAA,CAAO,IAAA,CAAK,kFAAA,GAAyC,SAAA,CAAU,IAAK,CAAA;AAAA,MACtE;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,UAAA,CACJ,QAAA,EACA,WAAA,EACA,UAAA,EACuB;AACvB,QAAA,MAAM,SAASE,EAAA,EAAO;AACtB,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,QAAAF,QAAO,IAAA,CAAK,yEAAA,GAAwC,SAAS,IAAA,CAAK,IAAA,GAAQ,WAAY,MAAO,CAAA;AAE7F,QAAA,IAAI;AAEF,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA;AAGrC,UAAA,MAAM,QAAA,GAA2B;AAAA,YAC/B,MAAA;AAAA,YACA,MAAA,EAAQ,SAAA;AAAA,YACR,QAAA,EAAU,CAAA;AAAA,YACV,aAAA,EAAe,CAAA;AAAA,YACf,UAAA,EAAY,SAAS,IAAA,CAAK,IAAA;AAAA,YAC1B,KAAA,EAAO,CAAA;AAAA,YACP,aAAA,EAAe;AAAA,WACjB;AAEA,UAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC3C,UAAA,IAAA,CAAK,aAAA,CAAc,gBAAgB,MAAA,EAAQ,EAAE,UAAU,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAG3E,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,oBAAA,CAAqB,QAAQ,QAAQ,CAAA;AAGjE,UAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,cAAA;AACvD,UAAA,IAAI,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,mBAAkC,CAAA;AAGlF,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,wEAAsC,mBAAA,GAAuB;AAAA,aAC/D;AACA,YAAA,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,YAAY,CAAA;AAGxD,YAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,cAAAA,OAAAA,CAAO,KAAK,CAAA,yGAAA,CAA0C,CAAA;AACtD,cAAA,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAAA,YACrD;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,MAAM,IAAI,qBAAqB,CAAA,4DAAA,CAAY,CAAA;AAAA,UAC7C;AAGA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAGrD,UAAA,QAAA,CAAS,MAAA,GAAS,WAAA;AAClB,UAAA,QAAA,CAAS,QAAA,GAAW,EAAA;AACpB,UAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC3C,UAAA,UAAA,GAAa,QAAQ,CAAA;AACrB,UAAA,IAAA,CAAK,cAAc,iBAAA,EAAmB,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAG7E,UAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,MAAA,CAAO,UAAU,WAAW,CAAA;AAEvE,UAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,YAAA,MAAM,IAAI,eAAA,CAAgB,4BAAA,GAAY,YAAA,CAAa,KAAM,CAAA;AAAA,UAC3D;AAGA,UAAA,QAAA,CAAS,WAAA,GAAc,aAAa,IAAA,IAAQ,WAAA;AAC5C,UAAA,QAAA,CAAS,eAAA,GAAkB,mBAAA;AAG3B,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,MAAA,EAAQ;AACrC,YAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAO,UAAqB,CAAA;AAC3E,YAAA,IAAI,WAAA,IAAe,aAAa,GAAA,EAAK;AACnC,cAAA,QAAA,CAAS,MAAA,GAAS,MAAM,WAAA,CAAY,WAAA,CAAY,aAAa,GAAG,CAAA;AAAA,YAClE;AAAA,UACF;AAGA,UAAA,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,eAAA,GAAkB,YAAA,GAAe,WAAA;AAC5D,UAAA,QAAA,CAAS,QAAA,GAAW,QAAA,CAAS,eAAA,GAAkB,EAAA,GAAK,GAAA;AACpD,UAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC3C,UAAA,UAAA,GAAa,QAAQ,CAAA;AAGrB,UAAA,IAAI,QAAA,CAAS,eAAA,IAAmB,QAAA,CAAS,iBAAA,EAAmB;AAC1D,YAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,QAAA,CAAS,iBAAiB,CAAA;AAAA,UACrE;AAGA,UAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAM3B,UAAA,QAAA,CAAS,MAAA,GAAS,WAAA;AAClB,UAAA,QAAA,CAAS,QAAA,GAAW,GAAA;AACpB,UAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC3C,UAAA,UAAA,GAAa,QAAQ,CAAA;AAErB,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,UAAAA,QAAO,IAAA,CAAK,sEAAA,GAAuC,MAAA,GAAU,kBAAA,GAAY,aAAc,IAAI,CAAA;AAE3F,UAAA,IAAA,CAAK,aAAA,CAAc,mBAAmB,MAAA,EAAQ;AAAA,YAC5C,QAAA,EAAU,SAAS,IAAA,CAAK,IAAA;AAAA,YACxB,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,YACpB;AAAA,WACD,CAAA;AAED,UAAA,OAAO,QAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sEAAA,GAAuC,MAAA,GAAU,GAAA,EAAK,KAAK,CAAA;AAGzE,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA;AAClD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,MAAA,GAAS,QAAA;AAClB,YAAA,QAAA,CAAS,KAAA,GAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAC1D,YAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC3C,YAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,UACvB;AAEA,UAAA,IAAA,CAAK,aAAA;AAAA,YACH,cAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAC3C;AACA,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,SAAE;AAEA,UAAA,UAAA;AAAA,YACE,MAAM;AACJ,cAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAAA,YACtC,CAAA;AAAA,YACA,IAAI,EAAA,GAAK;AAAA,WACX;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,YAAA,CAAa,MAAA,EAAgB,MAAA,EAAkC;AACnE,QAAAA,OAAAA,CAAO,IAAA,CAAK,yEAAA,GAAwC,MAAO,CAAA;AAE3D,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,MAAM,CAAA;AAG3C,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAElD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,MAAM,IAAI,eAAA,CAAgB,kCAAA,GAAa,MAAO,CAAA;AAAA,UAChD;AAGA,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,MAAM,CAAA;AAG3C,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,eAAe,CAAA;AAE1E,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,MAAM,IAAI,oBAAA,CAAqB,oDAAA,GAAgB,QAAA,CAAS,eAAgB,CAAA;AAAA,UAC1E;AAGA,UAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,QAAA,CAAS,SAAS,WAAW,CAAA;AAGtE,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,OAAA,EAAS;AACpC,YAAA,MAAM,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,UACrC;AAEA,UAAAA,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAAuC,MAAO,CAAA;AAC1D,UAAA,IAAA,CAAK,cAAc,mBAAA,EAAqB,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA;AAE3E,UAAA,OAAO,UAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sEAAA,GAAuC,MAAA,GAAU,GAAA,EAAK,KAAK,CAAA;AACzE,UAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,MAAA,EAAQ,MAAA,EAAW,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,0BAAM,CAAA;AACvG,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAA,CAAW,MAAA,EAAgB,MAAA,EAAgC;AAC/D,QAAAA,OAAAA,CAAO,IAAA,CAAK,+EAAA,GAAyC,MAAO,CAAA;AAE5D,QAAA,IAAI;AAEF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAElD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,MAAM,IAAI,eAAA,CAAgB,kCAAA,GAAa,MAAO,CAAA;AAAA,UAChD;AAGA,UAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAA,EAAU,MAAM,CAAA;AAGjD,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,eAAe,CAAA;AAE1E,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,MAAM,IAAI,oBAAA,CAAqB,oDAAA,GAAgB,QAAA,CAAS,eAAgB,CAAA;AAAA,UAC1E;AAGA,UAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,MAAA,CAAO,SAAS,WAAW,CAAA;AAEtE,UAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,YAAA,OAAA,CAAQ,IAAA,CAAK,wFAAA,GAA0C,YAAA,CAAa,KAAM,CAAA;AAAA,UAC5E;AAGA,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,OAAA,EAAS;AACpC,YAAA,MAAM,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAAA,UACtC;AAGA,UAAA,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAE9B,UAAAA,OAAAA,CAAO,IAAA,CAAK,sEAAA,GAAuC,MAAO,CAAA;AAC1D,UAAA,IAAA,CAAK,aAAA,CAAc,mBAAmB,MAAM,CAAA;AAC5C,UAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,QAClC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sEAAA,GAAuC,MAAA,GAAU,GAAA,EAAK,KAAK,CAAA;AACzE,UAAA,IAAA,CAAK,aAAA,CAAc,gBAAgB,MAAA,EAAQ,MAAA,EAAW,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,0BAAM,CAAA;AACrG,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAA,CAAW,MAAA,EAAgB,MAAA,EAAiB,SAAA,EAAqC;AAErF,QAAA,MAAM,WAAY,MAAA,GAAU,GAAA,IAAO,MAAA,IAAU,QAAA,CAAA,GAAY,OAAO,SAAA,IAAa,CAAA,CAAA;AAC7E,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAEzC,QAAA,IAAI,MAAA,IAAU,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAI,EAAG;AACzC,UAAA,OAAO,MAAA,CAAO,GAAA;AAAA,QAChB;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAElD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,eAAA,CAAgB,kCAAA,GAAa,MAAO,CAAA;AAAA,QAChD;AAGA,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,MAAM,CAAA;AAE3C,QAAA,IAAI,GAAA;AAGJ,QAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,UAAA,GAAA,GAAM,QAAA,CAAS,MAAA;AAAA,QACjB,CAAA,MAAO;AAEL,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,eAAe,CAAA;AAE1E,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,MAAM,IAAI,oBAAA,CAAqB,oDAAA,GAAgB,QAAA,CAAS,eAAgB,CAAA;AAAA,UAC1E;AAEA,UAAA,GAAA,GAAM,MAAM,eAAA,CAAgB,YAAA,CAAa,QAAA,CAAS,aAAa,SAAS,CAAA;AAAA,QAC1E;AAGA,QAAA,MAAM,YAAA,GAAe,KAAK,GAAA,EAAI,GAAA,CAAK,KAAK,MAAA,CAAO,KAAA,EAAO,UAAU,IAAA,IAAQ,GAAA;AACxE,QAAA,IAAA,CAAK,SAAS,GAAA,CAAI,QAAA,EAAU,EAAE,GAAA,EAAK,OAAA,EAAS,cAAc,CAAA;AAE1D,QAAA,OAAO,GAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBAAgB,MAAA,EAA8C;AAElE,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAC5C,QAAA,IAAI,MAAA,IAAU,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAI,EAAG;AACzC,UAAA,OAAO,MAAA,CAAO,IAAA;AAAA,QAChB;AAGA,QAAA,IAAI,KAAK,MAAA,CAAO,WAAA,EAAa,WAAW,IAAA,CAAK,MAAA,CAAO,YAAY,UAAA,EAAY;AAC1E,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,WAAA,CAAY,UAAA,CAAW,IAAI,MAAM,CAAA;AACpE,YAAA,IAAI,QAAA,EAAU;AAEZ,cAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,YAC7B;AACA,YAAA,OAAO,QAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,yFAAuC,KAAK,CAAA;AAC1D,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAAA,OAAAA,CAAO,IAAA,CAAK,mIAAA,GAAkD,MAAO,CAAA;AACrE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,WAAW,OAAA,EAAmE;AAClF,QAAA,IAAI,CAAC,KAAK,MAAA,CAAO,WAAA,EAAa,WAAW,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY;AAC5E,UAAAA,OAAAA,CAAO,KAAK,2HAA2C,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,OAAO,EAAC;AAAA,YACR,KAAA,EAAO,CAAA;AAAA,YACP,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,YACtB,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,YAC9B,UAAA,EAAY,CAAA;AAAA,YACZ,OAAA,EAAS,KAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAO,WAAA,CAAY,UAAA,CAAW,MAAM,OAAO,CAAA;AAErE,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,UAAA;AACrC,UAAA,MAAM,OAAA,GAAU,OAAO,IAAA,GAAO,CAAA;AAC9B,UAAA,OAAO;AAAA,YACL,GAAG,MAAA;AAAA,YACH,OAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mFAAsC,KAAK,CAAA;AACzD,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBAAA,CAAiB,OAAA,EAAmB,MAAA,EAAgD;AACxF,QAAA,MAAM,MAAA,GAA+B;AAAA,UACnC,YAAA,EAAc,CAAA;AAAA,UACd,YAAA,EAAc,CAAA;AAAA,UACd,UAAU;AAAC,SACb;AAEA,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AACpC,YAAA,MAAA,CAAO,YAAA,EAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,YAAA,EAAA;AACP,YAAA,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,cACnB,MAAA;AAAA,cACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,aACjD,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,IAAA,CAAK,qBAAA,EAAuB,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,QACpF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,MAAA,EAA4C;AAC5D,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,WAAA,CAAY,WAAmB,QAAA,EAAmC;AAChE,QAAA,IAAA,CAAK,EAAA,CAAG,WAAW,QAAQ,CAAA;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,CAAa,WAAmB,QAAA,EAAmC;AACjE,QAAA,IAAA,CAAK,GAAA,CAAI,WAAW,QAAQ,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,qBAAA,GAAuC;AACnD,QAAAA,OAAAA,CAAO,KAAK,0EAAqC,CAAA;AAGjD,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,QAC5B;AAGA,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACxB,UAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,QAC1B;AAGA,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AAC7C,UAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,OAAA;AAG9B,UAAA,IAAI,CAAC,SAAA,CAAU,WAAA,IAAe,CAAC,SAAA,CAAU,eAAA,IAAmB,CAAC,SAAA,CAAU,MAAA,IAAU,CAAC,SAAA,CAAU,MAAA,EAAQ;AAClG,YAAAA,OAAAA,CAAO,KAAK,oHAA8C,CAAA;AAG1D,YAAA,MAAM,UAAA,GAAa,EAAA;AACnB,YAAA,MAAM,aAAA,GAAgB,GAAA;AAEtB,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,cAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,aAAa,CAAC,CAAA;AAG/D,cAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,OAAA;AAClC,cAAA,IAAI,cAAc,WAAA,IAAe,aAAA,CAAc,mBAAmB,aAAA,CAAc,MAAA,IAAU,cAAc,MAAA,EAAQ;AAC9G,gBAAAA,OAAAA,CAAO,KAAK,uEAAoC,CAAA;AAChD,gBAAA;AAAA,cACF;AAEA,cAAA,IAAI,CAAA,KAAM,aAAa,CAAA,EAAG;AACxB,gBAAA,MAAM,IAAI,MAAM,8IAAmE,CAAA;AAAA,cACrF;AAEA,cAAAA,QAAO,KAAA,CAAM,oDAAA,IAAqB,IAAI,CAAA,CAAA,GAAK,GAAA,GAAO,aAAc,GAAG,CAAA;AAAA,YACrE;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AAC/B,UAAA,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,QACnD;AAEA,QAAAA,OAAAA,CAAO,KAAK,oEAAiC,CAAA;AAAA,MAC/C;AAAA,MAEA,MAAc,0BAAA,GAA4C;AACxD,QAAAA,OAAAA,CAAO,KAAK,kGAAyC,CAAA;AAGrD,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG;AACpC,UAAA,MAAM,KAAK,+BAAA,EAAgC;AAAA,QAC7C;AAEA,QAAA,IAAI,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAChC,UAAA,KAAA,MAAW,CAAC,MAAM,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA,EAAG;AACzE,YAAA,IAAI,MAAA,IAAU,OAAO,OAAA,EAAS;AAC5B,cAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAmB,CAAA;AAC9D,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,IAAI;AACF,kBAAA,MAAM,QAAA,CAAS,WAAW,MAAM,CAAA;AAChC,kBAAAA,OAAAA,CAAO,IAAA,CAAK,8FAAA,GAA2C,IAAK,CAAA;AAAA,gBAChE,SAAS,KAAA,EAAO;AACd,kBAAA,OAAA,CAAQ,IAAA,CAAK,oGAAA,GAA4C,IAAA,GAAQ,GAAA,EAAK,KAAK,CAAA;AAAA,gBAM7E;AAAA,cACF,CAAA,MAAO;AACL,gBAAA,OAAA,CAAQ,IAAA,CAAK,2FAA0C,IAAK,CAAA;AAAA,cAC9D;AAAA,YACF;AAAA,UACF;AAAA,QACA;AAAA,MACF;AAAA,MAEA,MAAc,+BAAA,GAAiD;AAC7D,QAAAA,OAAAA,CAAO,KAAK,4FAAwC,CAAA;AAGpD,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACvB,YAAA,IAAI,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,KAAS,gBAAgB,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC5E,cAAA,MAAM,EAAE,iBAAA,EAAAG,kBAAAA,EAAkB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AACpC,cAAA,MAAM,WAAA,GAAc,IAAIA,kBAAAA,EAAkB;AAC1C,cAAA,IAAA,CAAK,wBAAwB,WAAW,CAAA;AACxC,cAAAH,OAAAA,CAAO,KAAK,+FAAwC,CAAA;AAAA,YACtD,CAAA,MAAA,IAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS;AAC9E,cAAA,MAAM,EAAE,oBAAA,EAAAI,qBAAAA,EAAqB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AACvC,cAAA,MAAM,aAAA,GAAgB,IAAIA,qBAAAA,EAAqB;AAC/C,cAAA,IAAA,CAAK,wBAAwB,aAAa,CAAA;AAC1C,cAAAJ,OAAAA,CAAO,KAAK,kGAAsC,CAAA;AAAA,YACpD;AAAA,UACF;AAGA,UAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,KAAS,CAAA,EAAG;AACpC,YAAA,MAAM,EAAE,oBAAA,EAAAI,qBAAAA,EAAqB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AACvC,YAAA,MAAM,gBAAA,GAAmB,IAAIA,qBAAAA,EAAqB;AAClD,YAAA,IAAA,CAAK,wBAAwB,gBAAgB,CAAA;AAC7C,YAAAJ,OAAAA,CAAO,KAAK,wGAAuC,CAAA;AAAA,UACrD;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,2GAA0C,KAAK,CAAA;AAC5D,UAAA,MAAM,IAAI,MAAM,8DAAY,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,MAAc,sBAAA,GAAwC;AAEpD,QAAA,IAAI,KAAK,MAAA,CAAO,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,IAAI,OAAA,EAAS;AAC9C,UAAAA,QAAO,IAAA,CAAK,mEAAA,GAAyC,IAAA,CAAK,MAAA,CAAO,IAAI,IAAK,CAAA;AAAA,QAC5E;AAAA,MACF;AAAA,MAEA,MAAc,wBAAA,GAA0C;AACtD,QAAA,KAAA,MAAW,aAAa,KAAA,CAAM,IAAA,CAAK,KAAK,cAAA,CAAe,MAAA,EAAQ,CAAA,EAAG;AAChE,UAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,UAAAA,OAAAA,CAAO,IAAA,CAAK,8FAAA,GAA2C,SAAA,CAAU,IAAK,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,MAEA,MAAc,aAAa,IAAA,EAA2B;AAEpD,QAAA,IAAI,KAAK,MAAA,CAAO,WAAA,IAAe,KAAK,IAAA,GAAO,IAAA,CAAK,OAAO,WAAA,EAAa;AAClE,UAAA,MAAM,IAAI,gBAAgB,oDAAA,GAAgB,IAAA,CAAK,OAAQ,KAAA,GAAS,IAAA,CAAK,OAAO,WAAY,CAAA;AAAA,QAC1F;AAGA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,IAAQ,WAAA,CAAY,KAAK,IAAI,CAAA;AAEnD,QAAA,IACE,IAAA,CAAK,MAAA,CAAO,gBAAA,IACZ,IAAA,CAAK,OAAO,gBAAA,CAAiB,MAAA,GAAS,CAAA,IACtC,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA,EAC/C;AACA,UAAA,MAAM,IAAI,eAAA,CAAgB,oDAAA,GAAgB,QAAS,CAAA;AAAA,QACrD;AAAA,MACF;AAAA,MAEA,MAAc,oBAAA,CACZ,MAAA,EACA,QAAA,EACuB;AACvB,QAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,QAAA,MAAM,WAAW,QAAA,CAAS,IAAA,CAAK,QAAQ,WAAA,CAAY,QAAA,CAAS,KAAK,IAAI,CAAA;AACrE,QAAA,MAAM,YAAiBK,KAAA,CAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,EAAE,WAAA,EAAY;AAG/D,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAI,CAAA;AAEtD,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,YAAA,EAAc,SAAS,IAAA,CAAK,IAAA;AAAA,UAC5B,aAAc,MAAA,GAAW,SAAA;AAAA,UACzB,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,UACpB,QAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA,EAAY,GAAA;AAAA,UACZ,UAAA,EAAY,SAAS,UAAA,IAAc,QAAA;AAAA,UACnC,UAAA,EAAY,QAAA,CAAS,QAAA,EAAU,UAAA,IAAc,QAAA;AAAA,UAC7C,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,eAAA,EAAkB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,OAAA;AAAA,UAChD,WAAA,EAAa,EAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,QAAA,EAAU,QAAA,CAAS,QAAA,IAAY;AAAC,SAClC;AAAA,MACF;AAAA,MAEQ,oBAAoB,QAAA,EAAgC;AAC1D,QAAA,MAAM,IAAA,uBAAW,IAAA,EAAK;AACtB,QAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAElD,QAAA,OAAQ,QAAA,CAAS,WAAY,GAAA,GAAO,IAAA,GAAQ,MAAO,KAAA,GAAS,GAAA,GAAO,GAAA,GAAO,GAAA,GAAO,QAAA,CAAS,WAAA;AAAA,MAC5F;AAAA,MAEA,MAAc,iBAAiB,IAAA,EAA6B;AAC1D,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,QAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/B,QAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MAC1B;AAAA,MAEA,MAAc,mBAAA,CAAoB,QAAA,EAAwB,OAAA,EAA6B;AACrF,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,MAAA,IAAU,IAAI,CAAA,EAAG;AAC5C,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,IAAI,CAAA;AACtD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,wFAAA,GAA0C,OAAA,CAAQ,IAAK,CAAA;AACpE,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,IAAU,GAAA,EAAM;AACvC,UAAA,MAAM,IAAI,oBAAoB,sCAAQ,CAAA;AAAA,QACxC;AAEA,QAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK;AAAA,UACxB,QAAQ,QAAA,CAAS,EAAA;AAAA,UACjB,SAAA;AAAA,UACA,WAAW,QAAA,CAAS,WAAA;AAAA,UACpB,UAAA,EAAY,IAAA,CAAK,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA;AAAA,UACxD;AAAA,SACD,CAAA;AAGD,QAAA,IAAI,CAAC,KAAK,wBAAA,EAA0B;AAClC,UAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,QACxB;AAAA,MACF;AAAA,MAEQ,qBAAA,CAAsB,UAAwB,OAAA,EAAsB;AAC1E,QAAA,MAAM,WAAW,QAAA,CAAS,WAAA;AAC1B,QAAA,MAAM,SAAA,GAAiBA,cAAQ,QAAQ,CAAA;AACvC,QAAA,MAAMC,SAAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAE/C,QAAA,OAAQA,YAAY,YAAA,GAAgB,SAAA;AAAA,MACtC;AAAA,MAEA,MAAc,gBAAA,GAAkC;AAC9C,QAAA,IAAI,IAAA,CAAK,wBAAA,IAA4B,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA,EAAG;AACtE,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,wBAAA,GAA2B,IAAA;AAEhC,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACtC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM;AACxC,UAAA,IAAI,CAAC,IAAA,EAAM;AAEX,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,aAAA,CAAc,kBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA;AAElD,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,OAAO,CAAA;AAEzF,YAAA,IAAI,OAAO,OAAA,EAAS;AAClB,cAAA,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAAA,YAC/D,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,cAAc,kBAAA,EAAoB,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAA,EAAW,OAAO,KAAK,CAAA;AAAA,YAC7E;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,sEAAA,GAAuC,IAAA,CAAK,MAAA,GAAU,KAAK,KAAK,CAAA;AAC9E,YAAA,IAAA,CAAK,aAAA;AAAA,cACH,kBAAA;AAAA,cACA,IAAA,CAAK,MAAA;AAAA,cACL,MAAA;AAAA,cACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,aAC3C;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,wBAAA,GAA2B,KAAA;AAAA,MAClC;AAAA,MAEQ,cAAc,QAAA,EAA8B;AAClD,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI,GAAA,CAAK,KAAK,MAAA,CAAO,KAAA,EAAO,eAAe,IAAA,IAAQ,GAAA;AACxE,QAAA,IAAA,CAAK,aAAA,CAAc,IAAI,QAAA,CAAS,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAA,MACjE;AAAA,MAEQ,mBAAmB,MAAA,EAAsB;AAC/C,QAAA,IAAA,CAAK,aAAA,CAAc,OAAO,MAAM,CAAA;AAAA,MAClC;AAAA,MAEQ,aAAA,CAAc,IAAA,EAAc,MAAA,EAAgB,IAAA,EAAY,KAAA,EAAsB;AACpF,QAAA,MAAM,KAAA,GAAmB;AAAA,UACvB,IAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,CAAA;AACrB,QAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,iBAAiB,QAAA,EAAuC;AACpE,QAAA,IAAI,CAAC,KAAK,MAAA,CAAO,WAAA,EAAa,WAAW,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY;AAC5E,UAAAN,OAAAA,CAAO,KAAK,qHAA0C,CAAA;AACtD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,KAAK,QAAQ,CAAA;AACtD,UAAAA,OAAAA,CAAO,IAAA,CAAK,0FAAA,EAAwC,QAAA,CAAS,EAAE,CAAA;AAAA,QACjE,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yFAAuC,KAAK,CAAA;AAC1D,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,0DAAA,IAAiB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,WAC5D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,MAAA,EAA+B;AAC9D,QAAA,IAAI,CAAC,KAAK,MAAA,CAAO,WAAA,EAAa,WAAW,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY;AAC5E,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,OAAO,MAAM,CAAA;AACtD,UAAAA,OAAAA,CAAO,IAAA,CAAK,gGAAA,EAAyC,MAAM,CAAA;AAAA,QAC7D,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yFAAuC,KAAK,CAAA;AAC1D,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,0DAAA,IAAiB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,WAC5D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,kBAAkB,MAAA,EAA+B;AAG7D,QAAAA,OAAAA,CAAO,IAAA,CAAK,oFAAA,EAAuC,MAAM,CAAA;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,eAAA,CAAgB,QAAA,EAAwB,MAAA,EAAgC;AAEpF,QAAA,IAAI,QAAA,CAAS,eAAe,QAAA,EAAU;AACpC,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,QAAA,CAAS,UAAA,KAAe,SAAA,IAAa,QAAA,CAAS,eAAe,MAAA,EAAQ;AACvE,UAAA,MAAM,IAAI,gBAAgB,kDAAU,CAAA;AAAA,QACtC;AAGA,QAAA,IAAI,QAAA,CAAS,UAAA,KAAe,eAAA,IAAmB,CAAC,MAAA,EAAQ;AACtD,UAAA,MAAM,IAAI,gBAAgB,oEAAa,CAAA;AAAA,QACzC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBAAA,CAAsB,QAAA,EAAwB,MAAA,EAAgC;AAE1F,QAAA,IAAI,QAAA,CAAS,eAAe,MAAA,EAAQ;AAClC,UAAA,MAAM,IAAI,gBAAgB,kDAAU,CAAA;AAAA,QACtC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,GAA8B;AAE5B,QAAA,MAAM,qBAAqB,KAAA,CAAM,IAAA,CAAK,KAAK,gBAAA,CAAiB,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,UAAK,CAAA,QAAA,KACzE,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,SAAS,IAAA,KAAS;AAAA,SACtD;AAEA,QAAA,OAAO,kBAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,qBAAA,CAAsB,SAAA,GAAoB,GAAA,EAAsB;AACpE,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,QAAA,OAAO,CAAC,IAAA,CAAK,kBAAA,EAAmB,EAAG;AACjC,UAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AACtC,YAAA,MAAM,IAAI,KAAA,CAAM,8CAAA,GAAe,SAAA,GAAa,KAAK,CAAA;AAAA,UACnD;AAGA,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,QACvD;AAEA,QAAAA,OAAAA,CAAO,KAAK,sFAAoC,CAAA;AAAA,MAClD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACt9BA,IAAM,OAAA,GAAU,CAAC,OAAA,EAAiBJ,KAAAA,KAAyB;AACzD,EAAA,IAAI,CAAC,SAAS,OAAOA,KAAAA;AACrB,EAAA,OAAO,GAAG,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAC,GAAGA,KAAI,CAAA,CAAA;AAC7C,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,MAAA,KAAsC;AAC5D,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,EAAA,IAAI,MAAA,CAAO,cAAc,YAAA,CAAa,GAAA,CAAI,gBAAgB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AACrF,EAAA,IAAI,OAAO,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AACjE,EAAA,IAAI,OAAO,WAAA,EAAa,YAAA,CAAa,GAAA,CAAI,aAAA,EAAe,OAAO,WAAW,CAAA;AAC1E,EAAA,IAAI,OAAO,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,EAAA,IAAI,MAAA,CAAO,MAAM,YAAA,CAAa,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,OAAO,YAAA,CAAa,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAEhE,EAAA,OAAO,aAAa,QAAA,EAAS;AAC/B,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAI,IAAA,KAAmB;AAC9C,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,SAAU,IAAA,CAAK,IAAA;AAC3C,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,SAAU,IAAA,CAAK,WAAA;AAClD,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,SAAU,IAAA,CAAK,OAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,QAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAG,OAAO,KAAK,IAAA,CAAK,OAAA;AACzD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,EAAC;AACV,CAAA;AAEO,IAAM,2BAAA,GAA8B,CACzC,OAAA,EACA,OAAA,KAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,wBAAwB,YAAY;AAClC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,gDAAgD,CAAA;AAC7E,MAAA,MAAM,OAAO,MAAM,OAAA,CAAa,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACtD,MAAA,MAAM,WAAA,GAAc,iBAAqC,IAAI,CAAA;AAC7D,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,MAAM,yCAAW,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IAEA,eAAe,YAAY;AACzB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,iCAAiC,CAAA;AAC9D,MAAA,MAAM,OAAO,MAAM,OAAA,CAAa,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACtD,MAAA,MAAM,UAAA,GAAa,iBAAiC,IAAI,CAAA;AACxD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,MAAM,yCAAW,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA;AAAA,IAEA,wBAAwB,YAAY;AAClC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,2CAA2C,CAAA;AACxE,MAAA,MAAM,OAAO,MAAM,OAAA,CAAa,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACtD,MAAA,MAAM,WAAA,GAAc,iBAAoC,IAAI,CAAA;AAC5D,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,MAAM,yCAAW,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IAEA,aAAA,EAAe,OAAO,OAAA,KAAY;AAChC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,+BAA+B,CAAA;AAC5D,MAAA,OAAO,OAAA,CAAiB;AAAA,QACtB,GAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,YAAA,EAAc,OAAO,OAAA,KAAY;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,qCAAqC,CAAA;AAClE,MAAA,OAAO,OAAA,CAA8B;AAAA,QACnC,GAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,WAAA,EAAa,OAAO,MAAA,KAAW;AAC7B,MAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,MAAA,MAAMA,KAAAA,GAAO,KAAA,GACT,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA,GACtC,+BAAA;AACJ,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAASA,KAAI,CAAA;AACjC,MAAA,OAAO,OAAA,CAA6B;AAAA,QAClC,GAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,MAAA,KAAW;AACnC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,0CAA0C,CAAA;AACvE,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAa;AAAA,QAC9B,GAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,gBAAgB,MAAA,CAAO,cAAA;AAAA,UACvB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,aAAa,MAAA,CAAO,WAAA,IAAA,iBAAe,IAAI,IAAA,IAAO,WAAA;AAAY;AAC5D,OACD,CAAA;AACD,MAAA,OAAO,iBAA8B,IAAI,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;ACjJA,IAAA,WAAA,GAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,sBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACWO,IAAM,oBAAA,GAAuB,EAAA;AAEpC,IAAM,mBAAA,GAAsB,CAAC,IAAA,EAAW,QAAA,KAA6B;AACnE,EAAA,IAAI,OAAO,IAAA,EAAM,OAAA,KAAY,YAAY,IAAA,CAAK,OAAA,SAAgB,IAAA,CAAK,OAAA;AACnE,EAAA,IAAI,OAAO,IAAA,EAAM,KAAA,KAAU,YAAY,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,KAAA;AAC/D,EAAA,OAAO,QAAA;AACT,CAAA;AAEA,IAAM,sBAAsB,MAAM;AAChC,EAAA,OAAO,OAAU;AAAA,IACf,GAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,KAKkB;AAChB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG;AAAA,OACL;AAAA,MACA,MAAM,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,IAAA,CAAK,UAAU,IAAI;AAAA,KAC3D,CAAA;AAED,IAAA,MAAM,UAAU,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAEtD,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,MAAM,mBAAA,CAAoB,OAAA,EAAS,6BAAS,QAAA,CAAS,MAAM,GAAG,CAAC,CAAA;AAAA,EAC3E,CAAA;AACF,CAAA;AAEA,IAAM,eAAe,CAAC,OAAA,GAAU,yBAC9B,2BAAA,CAA4B,mBAAA,IAAuB,OAAO,CAAA;AAErD,IAAM,yBAAyB,OAAO,OAAA,GAAU,yBACrD,YAAA,CAAa,OAAO,EAAE,sBAAA,EAAuB;AAExC,IAAM,yBAAyB,OAAO,OAAA,GAAU,yBACrD,YAAA,CAAa,OAAO,EAAE,sBAAA,EAAuB;AAExC,IAAM,aAAA,GAAgB,OAC3B,OAAA,EACA,OAAA,GAAU,yBACW,YAAA,CAAa,OAAO,CAAA,CAAE,aAAA,CAAc,OAAO,CAAA;AAE3D,IAAM,YAAA,GAAe,OAC1B,OAAA,EACA,OAAA,GAAU,yBACwB,YAAA,CAAa,OAAO,CAAA,CAAE,YAAA,CAAa,OAAO,CAAA;AAEvE,IAAM,WAAA,GAAc,OACzB,MAAA,EACA,OAAA,GAAU,yBACuB,YAAA,CAAa,OAAO,CAAA,CAAE,WAAA,CAAY,MAAM,CAAA;AAEpE,IAAM,iBAAA,GAAoB,OAC/B,MAAA,EAKA,OAAA,GAAU,yBACiB,YAAA,CAAa,OAAO,CAAA,CAAE,iBAAA,CAAkB,MAAM,CAAA;;;ACjF3E,IAAA,uBAAA,GAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,cAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,WAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,qCAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,iCAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAkCO,IAAM,kBAAkB,YAAsC;AACnE,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,kCAAkC,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAoBO,IAAM,sBAAN,MAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB/B,aAAa,iBAAA,GAA8C;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,kCAAkC,CAAA;AAC/D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GACrC,UACC,OAAA,EAAS,WAAA,IAAe,OAAA,EAAS,IAAA,IAAQ,EAAC;AAE/C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,wDAAW,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,aAAa,kBAAkB,EAAA,EAA2C;AACxE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACjD,IAAA,OAAO,YAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,kBAAkB,KAAA,EAAyC;AACtE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACjD,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,IAAA,OAAO,WAAA,CAAY,MAAA;AAAA,MAAO,CAAC,eACzB,UAAA,CAAW,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IAC1C,UAAA,CAAW,OAAO,WAAA,EAAY,CAAE,SAAS,UAAU,CAAA,IAC3D,WAAW,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,UAAU,KACvD,UAAA,CAAW,QAAA,IAAY,WAAW,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,UAAU,KAC5E,UAAA,CAAW,IAAA,IAAQ,WAAW,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAgB,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,UAAU,CAAC;AAAA,KAClG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAa,yBAAyB,QAAA,EAA4C;AAChF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAEjD,IAAA,IAAI,aAAa,KAAA,EAAO;AACtB,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,OAAO,YAAY,MAAA,CAAO,CAAC,UAAA,KAA8B,UAAA,CAAW,aAAa,QAAQ,CAAA;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAa,yBAAA,CAA0B,KAAA,GAAgB,CAAA,EAA6B;AAClF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAGjD,IAAA,OAAO,WAAA,CACJ,OAAO,CAAC,UAAA,KAA8B,WAAW,WAAA,KAAgB,KAAK,EACtE,IAAA,CAAK,CAAC,GAAkB,CAAA,KAAqB,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA,CAAE,MAAM,MAAM,CAAA,CAC5E,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAa,aAAA,GAA+E;AAC1F,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,iCAAiC,CAAA;AAC9D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,OAAA,EAAS,QAAQ,EAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,aAAa,OAAA,GAA6B;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,2BAA2B,CAAA;AACxD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B;AACF,CAAA;;;AClQA,IAAA,iCAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iCAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,sBAAA,EAAA,MAAAW,uBAAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASA,IAAI,WAAA,GAAyC,IAAA;AAC7C,IAAI,eAAA,GAA0B,CAAA;AAC9B,IAAM,qBAAA,GAAwB,IAAI,EAAA,GAAK,GAAA;AAGhC,IAAM,YAAY,YAAyC;AAEhE,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAI,WAAA,IAAgB,GAAA,GAAM,eAAA,GAAmB,qBAAA,EAAuB;AAClE,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,6BAA6B,CAAA;AAC1D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAGnC,EAAA,WAAA,GAAc,MAAA;AACd,EAAA,eAAA,GAAkB,GAAA;AAElB,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,IAAM,YAAA,GAAe,OAAO,UAAA,KAAyE;AAC1G,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,6BAAA,EAA+B;AAAA,IAC1D,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,UAAU;AAAA,GAChC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAG1C,EAAA,WAAA,GAAc,aAAA;AACd,EAAA,eAAA,GAAkB,KAAK,GAAA,EAAI;AAE3B,EAAA,OAAO,aAAA;AACT,CAAA;AAEO,IAAM,cAAc,YAAyC;AAClE,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,6BAAA,EAA+B;AAAA,IAC1D,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,eAAA,GAAkB,MAAM,QAAA,CAAS,IAAA,EAAK;AAG5C,EAAA,WAAA,GAAc,eAAA;AACd,EAAA,eAAA,GAAkB,KAAK,GAAA,EAAI;AAE3B,EAAA,OAAO,eAAA;AACT,CAAA;AAGO,IAAM,oBAAoB,YAAsC;AACrE,EAAA,OAAA,CAAQ,IAAI,8EAAqB,CAAA;AAEjC,EAAA,IAAI;AAEF,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,OAAA,EAAQ;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,EAAI;AAAA,MAC/E,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,UAAA;AAAA,QACjB,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,4EAAA,EAAqB,QAAA,CAAS,MAAM,CAAA;AAEhD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,MAAM,6DAAA,EAAkB;AAAA,QAC9B,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GACrC,UACC,OAAA,EAAS,WAAA,IAAe,OAAA,EAAS,IAAA,IAAQ,EAAC;AAE/C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,wDAAW,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAA,CAAQ,IAAI,yEAAA,EAAoB;AAAA,MAC9B,OAAO,WAAA,CAAY,MAAA;AAAA,MACnB,QAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAqB,EAAE,KAAK;AAAA,KACtD,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2EAAoB,KAAK,CAAA;AACvC,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;AAEO,IAAM,gBAAA,GAAmB,OAAO,cAAA,KAA+D;AACpG,EAAA,MAAM,WAAA,GAAc,cAAA;AAEpB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,kCAAA,EAAoC;AAAA,IAC/D,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,MAAM,oKAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAEO,IAAM,gBAAA,GAAmB,OAAO,EAAA,EAAY,cAAA,KAA+D;AAChH,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,EAAE,CAAA,CAAA,EAAI;AAAA,IACrE,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,cAAc;AAAA,GACpC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,MAAM,oKAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAEO,IAAM,gBAAA,GAAmB,OAAO,EAAA,KAA8B;AACnE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,iCAAA,EAAoC,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAEpF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,IAC3C,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,IAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,sCAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;AAGO,IAAM,qBAAA,GAAwB,OAAO,gBAAA,KAA4E;AACtH,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,iDAAA,EAAmD;AAAA,IAC9E,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,kBAAkB;AAAA,GAC1C,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,kDAAU,CAAA;AAAA,EAC3C;AACF,CAAA;AAEO,IAAM,cAAA,GAAiB,OAAO,YAAA,EAAsB,WAAA,KAAuC;AAChG,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,8CAAA,EAAgD;AAAA,IAC3E,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAA,EAAc,aAAa;AAAA,GACnD,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAEO,IAAM,gBAAA,GAAmB,OAAO,YAAA,KAAwC;AAC7E,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,4CAAA,EAA8C;AAAA,IACzE,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,GACtC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAEO,IAAM,kBAAA,GAAqB,OAAO,YAAA,KAAwC;AAC/E,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,8CAAA,EAAgD;AAAA,IAC3E,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,GACtC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAGO,IAAM,sBAAA,GAAyB,OAAO,YAAA,EAAsB,WAAA,KAAuD;AACxH,EAAA,OAAA,CAAQ,IAAI,wFAAA,EAAuB;AAAA,IACjC,YAAA;AAAA,IACA,OAAO,WAAA,CAAY,KAAA;AAAA,IACX,QAAQ,WAAA,CAAY,MAAA;AAAA,IAC5B,WAAW,WAAA,CAAY,KAAA,GAAQ,GAAG,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,MAAA,CAAA,GAAW;AAAA,GACtE,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA,CAAI,0DAAA,EAAkB,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,QAAA,EAAA,CAAY,WAAA,CAAY,MAAA,GAAS,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAM,CAAA;AAE1G,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,SAAA,CAAA,EAAa;AAAA,MACxF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAA,CAAQ,IAAI,wDAAA,EAAqB;AAAA,MAC/B,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,aAAA,EAAe,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,MACpD,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc;AAAA,KACjD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,MAAM,qDAAA,EAAoB;AAAA,QAChC,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAA,EAAW,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,GAAG;AAAA,OACtC,CAAA;AAED,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAI,MAAM,oKAA6B,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,IAAI,MAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,IAAA,OAAA,CAAQ,IAAI,6DAAA,EAAkB;AAAA,MAC5B,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,OAAO,MAAA,CAAO,KAAA;AAAA,MACN,QAAQ,MAAA,CAAO;AAAA,KACxB,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EAET,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iFAAqB,KAAK,CAAA;AACxC,IAAA,IAAI,iBAAiB,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACjE,MAAA,MAAM,IAAI,MAAM,wGAAmB,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF,CAAA;AAEO,IAAM,aAAA,GAAgB,OAAO,YAAA,EAAsB,SAAA,EAAmB,WAAA,KAAuD;AAClI,EAAA,MAAM,WAAW,MAAM,KAAA,CAAM,oCAAoC,YAAY,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI;AAAA,IACrG,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,GACjC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,MAAM,oKAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAEO,IAAM,aAAA,GAAgB,OAAO,YAAA,EAAsB,SAAA,KAAqC;AAC7F,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,iCAAA,EAAoC,YAAY,aAAa,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAEpH,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,IAC3C,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,IAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,sCAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;AAGO,IAAM,uBAAA,GAA0B,OAAO,YAAA,KAA2E;AAEvH,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,OAAA,EAAQ;AACrC,EAAA,MAAM,WAAW,MAAM,KAAA,CAAM,oCAAoC,YAAY,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,EAAI;AAAA,IACxG,OAAA,EAAS;AAAA,MACP,eAAA,EAAiB,UAAA;AAAA,MACjB,QAAA,EAAU;AAAA;AACZ,GACD,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAEO,IAAM,kBAAA,GAAqB,OAAO,YAAA,EAAsB,aAAA,KAAsE;AACnI,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,wBAAA,CAAA,EAA4B;AAAA,IACvG,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,eAAe;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,kDAAU,CAAA;AAAA,EAC3C;AACF,CAAA;AAEO,IAAM,WAAA,GAAc,OAAO,YAAA,EAAsB,SAAA,EAAmB,WAAA,KAAuC;AAChH,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,qBAAA,CAAA,EAAyB;AAAA,IACpG,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,aAAa;AAAA,GAChD,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAEO,IAAM,aAAA,GAAgB,OAAO,YAAA,EAAsB,SAAA,KAAqC;AAC7F,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,mBAAA,CAAA,EAAuB;AAAA,IAClG,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAW;AAAA,GACnC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAEO,IAAM,eAAA,GAAkB,OAAO,YAAA,EAAsB,SAAA,KAAqC;AAC/F,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,qBAAA,CAAA,EAAyB;AAAA,IACpG,MAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAW;AAAA,GACnC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAGO,IAAM,gBAAgB,YAA2E;AACtG,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,iCAAiC,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAW,OAAA,EAAS,QAAQ,EAAC;AACzE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,wDAAW,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,UAAA;AACT,CAAA;AAEO,IAAM,cAAA,GAAiB,OAAO,IAAA,EAAc,WAAA,KAAwC;AACzF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,iCAAA,EAAmC;AAAA,IAC9D,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,aAAa;AAAA,GAC3C,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACpD,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,sCAAQ,CAAA;AAAA,EACzC;AACF,CAAA;AAEO,IAAM,UAAU,YAA+B;AACpD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,2BAA2B,CAAA;AACxD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,sCAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC7B,CAAA;AAGA,eAAsBA,uBAAAA,GAAkE;AACtF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,gDAAgD,CAAA;AAC7E,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;;;AC9bA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,YAAA,EAAA,MAAAC,aAAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,0BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,0BAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAsBA,IAAM,6BAAA,GAAgC,8BAAA;AAKtC,IAAM,wBAAA,GAA2B,6BAAA;AAQ1B,IAAM,qBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe9B,aAAa,cAAA,CAAe,QAAA,EAAkB,WAAA,EAA2C;AACvF,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACjE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAA,GAAgC,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAG5D,QAAA,MAAM,cAAc,UAAA,CAAW,MAAA;AAAA,UAAO,CAAA,MAAA,KACpC,MAAA,CAAO,QAAA,KAAa,QAAA,IAAY,OAAO,WAAA,KAAgB;AAAA,SACzD;AAGA,QAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,UAClD,GAAG,MAAA;AAAA,UACH,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,UACxC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,YACtC,GAAG,IAAA;AAAA,YACH,OAAA,EAAS,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO;AAAA,WAChC,CAAE;AAAA,SACJ,CAAE,CAAA;AAGF,QAAA,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,CAAY,OAAA,EAAQ,GAAI,CAAA,CAAE,WAAA,CAAY,OAAA,EAAS,CAAA;AAEjF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,cAAc,gBAAA,CAAiB;AAAA,SACjC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uEAAgB,KAAK,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,EAAC;AAAA,MACV,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,gBAAgB,WAAA,EAAoE;AAC/F,IAAA,IAAI;AAEF,MAAA,MAAM,aAAa,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEjF,MAAA,MAAM,cAAA,GAAkC;AAAA,QACtC,GAAG,WAAA;AAAA,QACH,IAAI,UAAA,EAAW;AAAA,QACf,WAAA,sBAAiB,IAAA;AAAK,OACxB;AAGA,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AAClE,MAAA,MAAM,aAAgC,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAY,IAAI,EAAC;AAGjF,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAG9B,MAAA,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAEzE,MAAA,OAAA,CAAQ,IAAI,4EAAA,EAAkB;AAAA,QAC5B,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,UAAU,cAAA,CAAe,QAAA;AAAA,QACzB,SAAA,EAAW,eAAe,KAAA,CAAM;AAAA,OACjC,CAAA;AAED,MAAA,OAAO,cAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uEAAgB,KAAK,CAAA;AACnC,MAAA,MAAM,IAAI,MAAM,oEAAa,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAa,mBAAA,CACX,QAAA,EACA,WAAA,EACA,SAAA,EACA,QACA,UAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACjE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAA,GAAgC,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAG5D,QAAA,MAAM,cAAc,UAAA,CAAW,SAAA;AAAA,UAAU,CAAA,MAAA,KACvC,OAAO,EAAA,KAAO,SAAA,IACd,OAAO,QAAA,KAAa,QAAA,IACpB,OAAO,WAAA,KAAgB;AAAA,SACzB;AAEA,QAAA,IAAI,gBAAgB,CAAA,CAAA,EAAI;AACtB,UAAA,MAAM,MAAA,GAAS,WAAW,WAAW,CAAA;AACrC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAA,CAAO,UAAA,GAAa,UAAA;AAAA,UACtB;AAGA,UAAA,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAEzE,UAAA,OAAA,CAAQ,IAAI,0DAAA,EAAe;AAAA,YACzB,SAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,mBAAA,CACX,QAAA,EACA,WAAA,EACA,SAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACjE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAA,GAAgC,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAG5D,QAAA,MAAM,kBAAkB,UAAA,CAAW,MAAA;AAAA,UAAO,CAAA,MAAA,KACxC,EAAE,MAAA,CAAO,EAAA,KAAO,aACd,MAAA,CAAO,QAAA,KAAa,QAAA,IACpB,MAAA,CAAO,WAAA,KAAgB,WAAA;AAAA,SAC3B;AAGA,QAAA,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAE9E,QAAA,OAAA,CAAQ,GAAA,CAAI,0DAAA,EAAe,EAAE,SAAA,EAAW,CAAA;AAAA,MAC1C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,gBAAA,CAAiB,QAAA,EAAkB,WAAA,EAAoC;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACjE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAA,GAAgC,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAG5D,QAAA,MAAM,kBAAkB,UAAA,CAAW,MAAA;AAAA,UAAO,YACxC,EAAE,MAAA,CAAO,QAAA,KAAa,QAAA,IAAY,OAAO,WAAA,KAAgB,WAAA;AAAA,SAC3D;AAGA,QAAA,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAE9E,QAAA,OAAA,CAAQ,GAAA,CAAI,sEAAA,EAAiB,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA,MACxD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iEAAe,KAAK,CAAA;AAClC,MAAA,MAAM,IAAI,MAAM,8DAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,aAAA,GAA4C;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACjE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAA,GAAgC,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAG5D,QAAA,OAAO,UAAA,CAAW,IAAI,CAAA,MAAA,MAAW;AAAA,UAC/B,GAAG,MAAA;AAAA,UACH,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,UACxC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,YACtC,GAAG,IAAA;AAAA,YACH,OAAA,EAAS,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO;AAAA,WAChC,CAAE;AAAA,SACJ,CAAE,CAAA;AAAA,MACJ;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iEAAe,KAAK,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,aAAA,GAKV;AACD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,EAAc;AAE5C,MAAA,MAAM,eAAe,UAAA,CAAW,MAAA;AAChC,MAAA,MAAM,cAAc,IAAI,GAAA;AAAA,QACtB,UAAA,CAAW,IAAI,CAAA,MAAA,KAAU,CAAA,EAAG,OAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,CAAE;AAAA,OACrE;AACA,MAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAE/B,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,MAAA,UAAA,CAAW,QAAQ,CAAA,MAAA,KAAU;AAC3B,QAAA,UAAA,IAAc,MAAA,CAAO,aAAA;AACrB,QAAA,YAAA,IAAgB,MAAA,CAAO,UAAA;AAAA,MACzB,CAAC,CAAA;AAED,MAAA,OAAO;AAAA,QACL,YAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAGO,IAAM,iBAAiB,kBAAA,CAAmB,cAAA;AAC1C,IAAM,sBAAsB,kBAAA,CAAmB,mBAAA;AAC/C,IAAM,sBAAsB,kBAAA,CAAmB,mBAAA;AAC/C,IAAM,mBAAmB,kBAAA,CAAmB,gBAAA;AAC5C,IAAM,gBAAgB,kBAAA,CAAmB,aAAA;AACzC,IAAM,gBAAgB,kBAAA,CAAmB,aAAA;AAGzC,IAAM,eAAA,GAAkB,OAAO,WAAA,KAAuE;AAC3G,EAAA,IAAI;AAEF,IAAA,MAAM,aAAa,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEjF,IAAA,MAAM,cAAA,GAAkC;AAAA,MACtC,GAAG,WAAA;AAAA,MACH,IAAI,UAAA,EAAW;AAAA,MACf,WAAA,sBAAiB,IAAA;AAAK,KACxB;AAGA,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AAClE,IAAA,MAAM,aAAgC,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAY,IAAI,EAAC;AAGjF,IAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAG9B,IAAA,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAEzE,IAAA,OAAA,CAAQ,IAAI,4EAAA,EAAkB;AAAA,MAC5B,IAAI,cAAA,CAAe,EAAA;AAAA,MACnB,UAAU,cAAA,CAAe,QAAA;AAAA,MACzB,SAAA,EAAW,eAAe,KAAA,CAAM;AAAA,KACjC,CAAA;AAED,IAAA,OAAO,cAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uEAAgB,KAAK,CAAA;AACnC,IAAA,MAAM,IAAI,MAAM,oEAAa,CAAA;AAAA,EAC/B;AACF,CAAA;;;ADxUA,IAAM,gBAAA,GAAmB,sBAAA;AAOlB,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,aAAa,QAAQ,MAAA,EAA+B;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAEhD,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAChD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAElC,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,YAC9C,GAAG,IAAA;AAAA,YACH,OAAA,EAAS,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO;AAAA,WAChC,CAAE,CAAA;AAAA,QACJ;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2DAAc,KAAK,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO;AAAA,MACL,OAAO,EAAC;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAkB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAEhD,MAAA,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2DAAc,KAAK,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,gBAAgB,KAAA,EAAqE;AAClG,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,MAAA,aAAA,IAAiB,IAAA,CAAK,QAAA;AACtB,MAAA,MAAM,SAAA,GAAA,CAAa,IAAA,CAAK,UAAA,CAAW,KAAA,IAAS,KAAK,IAAA,CAAK,QAAA;AACtD,MAAA,UAAA,IAAc,SAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,eAAe,UAAA,EAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,UAAU,IAAA,EAA8E;AACnG,IAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,YAAW,GAAI,IAAA;AAGvD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAGtC,IAAA,MAAM,oBAAoB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAEzF,IAAA,IAAI,qBAAqB,CAAA,EAAG;AAE1B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AACjD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,QAAA,IAAY,QAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,IAAA,CAAK,MAAM,IAAA,CAAK;AAAA,UACd,YAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,sBAAa,IAAA;AAAK,SACnB,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,MAAM,IAAA,CAAK;AAAA,UACd,YAAA;AAAA,UACA,UAAA,EAAY;AAAA,YACV,EAAA,EAAI,YAAA;AAAA,YACJ,KAAA,EAAO,eAAK,YAAY,CAAA,CAAA;AAAA;AAAA,YACxB,MAAA,EAAQ,0BAAA;AAAA,YACR,UAAA,EAAY,EAAA;AAAA,YACZ,WAAA,EAAa,EAAA;AAAA,YACb,OAAO,EAAC;AAAA,YACR,QAAA,EAAU,cAAA;AAAA,YACV,MAAM,EAAC;AAAA,YACP,WAAA,EAAa,IAAA;AAAA,YACb,KAAA,EAAO;AAAA,WACT;AAAA,UACA,QAAA;AAAA,UACA,OAAA,sBAAa,IAAA;AAAK,SACnB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,aAAA,EAAe,UAAA,KAAe,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AACrE,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAGlB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,IAAI,CAAA;AAE1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,eAAe,IAAA,EAAiE;AAC3F,IAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAS,GAAI,IAAA;AAG3C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAGtC,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAEjF,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,IAAI,YAAY,CAAA,EAAG;AAEjB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,CAAC,CAAA;AAAA,MAChC,CAAA,MAAO;AAEL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACjC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,QAClB;AAAA,MACF;AAGA,MAAA,MAAM,EAAE,aAAA,EAAe,UAAA,KAAe,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AACrE,MAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAGlB,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,eAAe,IAAA,EAAiE;AAC3F,IAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI,IAAA;AAGjC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAGtC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAGzE,IAAA,MAAM,EAAE,aAAA,EAAe,UAAA,KAAe,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AACrE,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAGlB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,IAAI,CAAA;AAE1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,UAAU,MAAA,EAA+B;AACpD,IAAA,MAAM,SAAA,GAAkB;AAAA,MACtB,OAAO,EAAC;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACd;AAGA,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,SAAS,CAAA;AAE/B,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,YAAA,CAAa,IAAA,EAA2B,IAAA,EAA4C;AAC/F,IAAA,OAAA,CAAQ,GAAA,CAAI,mDAAA,EAA0B,EAAE,IAAA,EAAM,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAiC,IAAI,CAAA;AAG1D,IAAA,IAAI,MAAA,CAAO,YAAA,GAAe,CAAA,IAAK,IAAA,EAAM;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,CAAgB;AAAA,UACpB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,MAAA,EAAQ,SAAA;AAAA,UACR,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,WAAA,sBAAiB,IAAA;AAAK,SACvB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,uEAAgB,KAAK,CAAA;AAAA,MAErC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAcO,IAAM,OAAA,GAAU,CAAC,MAAA,KAAkC;AACxD,EAAA,OAAO,WAAA,CAAY,QAAQ,MAAM,CAAA;AACnC,CAAA;AAQO,IAAM,SAAA,GAAY,CAAC,IAAA,KAA+D;AACvF,EAAA,OAAO,WAAA,CAAY,UAAU,IAAI,CAAA;AACnC,CAAA;AAQO,IAAM,cAAA,GAAiB,CAAC,IAAA,KAAoE;AACjG,EAAA,OAAO,WAAA,CAAY,eAAe,IAAI,CAAA;AACxC,CAAA;AAQO,IAAM,cAAA,GAAiB,CAAC,IAAA,KAAoE;AACjG,EAAA,OAAO,WAAA,CAAY,eAAe,IAAI,CAAA;AACxC,CAAA;AAQO,IAAM,SAAA,GAAY,CAAC,MAAA,KAAkC;AAC1D,EAAA,OAAO,WAAA,CAAY,UAAU,MAAM,CAAA;AACrC,CAAA;AASO,IAAMA,aAAAA,GAAe,CAAC,IAAA,EAA2B,IAAA,KAA+C;AACrG,EAAA,OAAO,WAAA,CAAY,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AAC5C,CAAA;;;AElWA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAAC,cAAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,sBAAA,EAAA,MAAAC,uBAAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,YAAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoBA,SAAS,wBAAA,CACPf,OACA,WAAA,EACQ;AACR,EAAA,IAAI,CAAC,aAAa,QAAA,EAAU,IAAA,MAAU,CAAC,WAAA,EAAa,WAAA,EAAa,IAAA,EAAK,EAAG;AACvE,IAAA,OAAOA,KAAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IACjC,QAAA,EAAU,WAAA,CAAY,QAAA,CAAS,IAAA,EAAK;AAAA,IACpC,WAAA,EAAa,WAAA,CAAY,WAAA,CAAY,IAAA;AAAK,GAC3C,CAAA;AACD,EAAA,OAAO,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AACrC;AAEA,SAAS,uBAAuB,WAAA,EAAsD;AACpF,EAAA,IAAI,CAAC,aAAa,QAAA,EAAU,IAAA,MAAU,CAAC,WAAA,EAAa,WAAA,EAAa,IAAA,EAAK,EAAG;AACvE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,QAAA,EAAU,WAAA,CAAY,QAAA,CAAS,IAAA,EAAK;AAAA,IACpC,WAAA,EAAa,WAAA,CAAY,WAAA,CAAY,IAAA;AAAK,GAC3C,CAAA;AACH;AAEA,eAAe,iBAAA,CAAkB,UAAoB,QAAA,EAAmC;AACtF,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,EAAA,IAAI,OAAO,IAAA,EAAM,KAAA,KAAU,YAAY,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,KAAA;AAC/D,EAAA,IAAI,OAAO,IAAA,EAAM,OAAA,KAAY,YAAY,IAAA,CAAK,OAAA,SAAgB,IAAA,CAAK,OAAA;AACnE,EAAA,OAAO,QAAA;AACT;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,aAAa,cAAc,IAAA,EAA8C;AACvE,IAAA,OAAO,cAA4B,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,aAAa,WAAA,CAAY,MAAA,GAA4B,EAAC,EAAiC;AACrF,IAAA,OAAO,YAA0B,MAAM,CAAA;AAAA,EACzC;AAAA,EAEA,aAAa,UAAA,CACX,EAAA,EACA,WAAA,EACkB;AAClB,IAAA,MAAM,GAAA,GAAM,yBAAyB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,EAAE,IAAI,WAAW,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAEhC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,MAAM,iBAAA,CAAkB,QAAA,EAAU,kDAAU,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,aAAa,aAAA,CAAc,EAAA,EAAY,IAAA,EAA8C;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI;AAAA,MACrD,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,MAAM,iBAAA,CAAkB,QAAA,EAAU,sCAAQ,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,aAAA,CACX,EAAA,EACA,WAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,yBAAyB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,EAAE,IAAI,WAAW,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,uBAAuB,WAAW,CAAA;AAE/C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,IAAA,GAAO,EAAE,cAAA,EAAgB,oBAAmB,GAAI,MAAA;AAAA,MACzD;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,MAAM,iBAAA,CAAkB,QAAA,EAAU,sCAAQ,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,aAAa,sBAAA,GAAuD;AAClE,IAAA,OAAO,sBAAA,EAAqC;AAAA,EAC9C;AACF,CAAA;AAjEa,cAAA,CACa,QAAA,GAAW,+BAAA;AAkE9B,IAAMa,cAAAA,GAAgB,CAAC,IAAA,KAC5B,cAAA,CAAe,cAAc,IAAI,CAAA;AAE5B,IAAME,YAAAA,GAAc,CAAC,MAAA,KAC1B,cAAA,CAAe,YAAY,MAAM,CAAA;AAE5B,IAAM,aAAa,CACxB,EAAA,EACA,gBACqB,cAAA,CAAe,UAAA,CAAW,IAAI,WAAW,CAAA;AAEzD,IAAM,gBAAgB,CAAC,EAAA,EAAY,SACxC,cAAA,CAAe,aAAA,CAAc,IAAI,IAAI,CAAA;AAEhC,IAAM,gBAAgB,CAC3B,EAAA,EACA,gBACkB,cAAA,CAAe,aAAA,CAAc,IAAI,WAAW,CAAA;AAEzD,IAAMD,uBAAAA,GAAyB,MACpC,cAAA,CAAe,sBAAA,EAAuB;;;AC1IxC,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,aAAA,EAAA,MAAAE,cAAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AA0HO,IAAM,sBAAN,MAA0B;AAAA;AAAA;AAAA;AAAA,EAI/B,aAAa,eAAe,MAAA,EAA+D;AACzF,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AAGvD,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,SAAA,CAAU,QAAA,EAAU,CAAA;AAC7C,MAAA,YAAA,CAAa,MAAA,CAAO,gBAAgB,QAAQ,CAAA;AAE5C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAW,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,KAAA,EAAO;AAC7C,QAAA,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uCAAuC,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,QAC7F,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,qCAAA;AAAA,UACjB,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAW,GAAA;AAAA,UACX,kBAAA,EAAoB;AAAA;AACtB,OACD,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,YAAY,EAAC;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,wBAAwB,MAAA,EAA+D;AAClG,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,0FAAuB,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AAGvD,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,SAAA,CAAU,QAAA,EAAU,CAAA;AAC7C,MAAA,YAAA,CAAa,MAAA,CAAO,gBAAgB,QAAQ,CAAA;AAE5C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAW,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,KAAA,EAAO;AAC7C,QAAA,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uCAAuC,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,qCAAA;AAAA,UACjB,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAW,GAAA;AAAA,UACX,kBAAA,EAAoB,gBAAA;AAAA,UACpB,iBAAA,EAAmB;AAAA;AACrB,OACD,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,0EAAc,CAAA;AAAA,MAChC;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAA,CAAQ,IAAI,oDAAA,EAAiB;AAAA,QAC3B,aAAA,EAAe,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,QACxC,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,aAAa,IAAA,CAAK;AAAA,OACnB,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,YAAY,EAAC;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6EAAiB,KAAK,CAAA;AACpC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,gBAAgB,MAAA,EAA8D;AACzF,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AAGvD,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,SAAA,CAAU,QAAA,EAAU,CAAA;AAC7C,MAAA,YAAA,CAAa,MAAA,CAAO,gBAAgB,QAAQ,CAAA;AAE5C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAW,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,KAAA,EAAO;AAC7C,QAAA,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uCAAuC,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,QAC7F,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,qCAAA;AAAA,UACjB,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAW,GAAA;AAAA,UACX,kBAAA,EAAoB;AAAA;AACtB,OACD,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,KAAK,KAAA,IAAS;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc;AAAA,OAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,yBAAyB,MAAA,EAA8D;AAClG,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,0FAAuB,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AAGvD,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,SAAA,CAAU,QAAA,EAAU,CAAA;AAC7C,MAAA,YAAA,CAAa,MAAA,CAAO,gBAAgB,QAAQ,CAAA;AAE5C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAW,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,KAAA,EAAO;AAC7C,QAAA,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uCAAuC,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,qCAAA;AAAA,UACjB,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAW,GAAA;AAAA,UACX,kBAAA,EAAoB,gBAAA;AAAA,UACpB,iBAAA,EAAmB;AAAA;AACrB,OACD,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,0EAAc,CAAA;AAAA,MAChC;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAA,CAAQ,IAAI,yEAAA,EAAkB;AAAA,QAC5B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,aAAa,IAAA,CAAK;AAAA,OACnB,CAAA;AACD,MAAA,OAAO,KAAK,KAAA,IAAS;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc;AAAA,OAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6EAAiB,KAAK,CAAA;AACpC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,mBAAA,CACX,SAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,OAAA,CAAA,EAAW;AAAA,QACtF,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,YAAY;AAAA,OAC5C,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,MAC5B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAc,SAAA,EAAkC;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,EAAI;AAAA,QAC/E,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,OAAA,IAAW,sCAAQ,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,8CAAA,EAAa,EAAE,SAAA,EAAW,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAW,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAA,CAAe,MAAA,GAA0B,KAAA,EAAsB;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,kDAAA,EAAqD,MAAM,CAAA,CAAE,CAAA;AAC1F,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAa,KAAK,CAAA;AAChC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;AAGO,IAAM,iBAAiB,mBAAA,CAAoB,cAAA;AAC3C,IAAM,kBAAkB,mBAAA,CAAoB,eAAA;AAC5C,IAAM,0BAA0B,mBAAA,CAAoB,uBAAA;AACpD,IAAM,2BAA2B,mBAAA,CAAoB,wBAAA;AACrD,IAAMA,uBAAsB,mBAAA,CAAoB,mBAAA;AAChD,IAAMD,iBAAgB,mBAAA,CAAoB,aAAA;AAC1C,IAAM,iBAAiB,mBAAA,CAAoB,cAAA;;;AC/ZlD,IAAA,qCAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qCAAA,EAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,yBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAYO,IAAM,gCAAN,MAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,aAAa,iBAAA,GAA8C;AACzD,IAAA,OAAO,oBAAoB,iBAAA,EAAkB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,kBAAkB,EAAA,EAA2C;AACxE,IAAA,OAAO,mBAAA,CAAoB,kBAAkB,EAAE,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,yBAAyB,QAAA,EAA4C;AAChF,IAAA,OAAO,mBAAA,CAAoB,yBAAyB,QAAQ,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,kBAAkB,KAAA,EAAyC;AACtE,IAAA,OAAO,mBAAA,CAAoB,kBAAkB,KAAK,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,yBAAA,CACX,mBAAA,EACA,KAAA,GAAgB,CAAA,EACU;AAE1B,IAAA,OAAO,mBAAA,CAAoB,0BAA0B,KAAK,CAAA;AAAA,EAC5D;AACF,CAAA;AAGO,IAAM,4BAA4B,YAAsC;AAC7E,EAAA,OAAO,8BAA8B,iBAAA,EAAkB;AACzD,CAAA;;;ACvEA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAWO,IAAM,qBAAA,GAAuC;AAAA,EAClD;AAAA,IACE,GAAA,EAAK,IAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,kCAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,gCAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,gCAAA;AAAA,IACb,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe,CAAA,IAAA,EAAI,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,GACzD;AAAA,EACA;AAAA,IACE,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,MAAM,SAAA,GAAoC;AAAA,QACxC,OAAA,EAAS,oBAAA;AAAA,QACT,SAAA,EAAW,oBAAA;AAAA,QACX,SAAA,EAAW,oBAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AACA,MAAA,OAAO,SAAA,CAAU,KAAK,CAAA,IAAK,KAAA;AAAA,IAC7B;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,gCAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,OAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe,CAAA,IAAA,EAAI,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,GACzD;AAAA,EACA;AAAA,IACE,GAAA,EAAK,YAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,8DAAA;AAAA,IACb,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe,CAAA,IAAA,EAAI,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,GACzD;AAAA,EACA;AAAA,IACE,GAAA,EAAK,OAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,GAAA,EAAK,YAAA;AAAA,IACL,KAAA,EAAO,gCAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,8DAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,4CAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe;AACzB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gBAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,WAAA,EAAa,0JAAA;AAAA,IACb,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,CAAC,KAAA,KAAe,CAAA,IAAA,EAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAEhE,CAAA;AAKO,IAAM,6BAAA,GAAgC;AAAA,EAC3C,EAAA,EAAI,wBAAA;AAAA,EACJ,IAAA,EAAM,sCAAA;AAAA,EACN,WAAA,EAAa,yJAAA;AAAA,EACb,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,qBAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,oBAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,eAAA,EAAiB,OAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,eAAA,EAAiB,OAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,GAAA,EAAK,gBAAA;AAAA,QACL,KAAA,EAAO,0BAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,eAAA,EAAiB,OAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,UAAA,EAAY;AAAA;AACd,KACF;AAAA,IACA,aAAA,EAAe,IAAA;AAAA,IACf,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,gBAAA,EAAkB,iCAAA;AAAA,EAClB,aAAA,EAAe,IAAA;AAAA,EACf,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,OAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,SAAA,sBAAe,IAAA,EAAK;AAAA,EACpB,SAAA,sBAAe,IAAA,EAAK;AAAA,EACpB,QAAA,EAAU,iBAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;;;AC5RA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACKA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,EAAA,IAAI;AACF,IAAA,SAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,EAAE,MAAM,SAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,GAAG,CAAA;AAAA,EACtF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,gFAAwC,KAAK,CAAA;AAAA,EAC5D;AACF;AAgBA,IAAM,cAAA,GAA6C;AAAA,EACjD,cAAA,EAAgB,YAAA;AAAA;AAAA,EAChB,gBAAA,EAAkB;AAAA,IAChB,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA;AAAA,MACT,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,SAAA;AAAA,MAC3C,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB;AAAA,KACxC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA;AAAA,MACT,MAAA,EAAQ,EAAA;AAAA,MACR,MAAA,EAAQ,EAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA,MACb,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,UAAA,EAAY,MAAA;AAAA,EACZ,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,EAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA,MACb,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,iBAAiB,WAAW,CAAA;AAAA;AAAA,EAC9D,gBAAA,EAAkB;AAAA;AAAA,IAEhB,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA;AAAA,IAEA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA;AAAA,IAEA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA;AAAA,IAEA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,wBAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA;AAAA,IAEA,iBAAA;AAAA,IACA,8BAAA;AAAA,IACA,8BAAA;AAAA,IACA,6BAAA;AAAA;AAAA,IAEA,0BAAA;AAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,sBAAA,KAA2B,MAAA;AAAA,EACzD,mBAAA,EAAqB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,yBAAyB,IAAI,CAAA;AAAA,EACvE,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,sBAAsB,MAAM,CAAA;AAAA;AAAA,IAC9D,MAAA,EAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,iBAAiB,MAAM;AAAA;AAAA;AAExD,CAAA;AAKO,IAAM,2BAAN,MAA+B;AAAA,EAGpC,YAAY,YAAA,EAAoD;AAC9D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,cAAA,EAAgB,YAAY,CAAA;AAC3D,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAwC;AACtC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAA,EAA8C;AAC7D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAsC;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAoD;AAC/D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,OAAO,CAAA;AACnD,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CAAsB,MAAmB,MAAA,EAAuC;AAC9E,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,GAAI;AAAA,QACnC,GAAG,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACpC,GAAG,MAAA;AAAA,QACH,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,IAAA,EAAyB;AAC9C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,CAAE,OAAA,GAAU,KAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,MAAe,MAAA,EAAmC;AAClE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,GAAI;AAAA,QAC/B,GAAG,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA;AAAA,QAChC,GAAG,MAAA;AAAA,QACH,OAAA,EAAS;AAAA,OACX;AACA,MAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,IAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,CAAE,OAAA,GAAU,KAAA;AACzC,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,IAAA,EAAM;AACnC,QAAA,IAAA,CAAK,OAAO,UAAA,GAAa,MAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA6B;AAC3B,IAAA,MAAM,MAAA,GAAmC;AAAA,MACvC,MAAA,EAAQ,QAAQ,GAAA,CAAI,iBAAA;AAAA,MACpB,MAAA,EAAQ,QAAQ,GAAA,CAAI,iBAAA;AAAA,MACpB,WAAA,EAAa,QAAQ,GAAA,CAAI,wBAAA;AAAA,MACzB,eAAA,EAAiB,QAAQ,GAAA,CAAI,4BAAA;AAAA,MAC7B,YAAA,EAAc,QAAQ,GAAA,CAAI,wBAAA;AAAA,MAC1B,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAA,KAAsB,MAAA;AAAA,MAC1C,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,mBAAA,KAAwB;AAAA,KAChD;AAGA,IAAA,OAAA,CAAQ,IAAI,8DAAA,EAAgC;AAAA,MAC1C,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAA,EAAa,MAAA,CAAO,WAAA,GAAc,KAAA,GAAQ,oBAAA;AAAA,MAC1C,eAAA,EAAiB,MAAA,CAAO,eAAA,GAAkB,KAAA,GAAQ,oBAAA;AAAA,MAClD,YAAA,EAAc,OAAO,YAAA,IAAgB;AAAA,KACtC,CAAA;AACD,IAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,UAAU,MAAA,CAAO,WAAA,IAAe,OAAO,eAAA,EAAiB;AAClF,MAAA,IAAA,CAAK,qBAAA,CAAsB,cAAc,MAAM,CAAA;AAC/C,MAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,YAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,gHAAqC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,0GAAoC,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAAA,GAAgD;AAEpD,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA6B;AAC3B,IAAA,MAAM,MAAA,GAAmC;AAAA,MACvC,MAAA,EAAQ,QAAQ,GAAA,CAAI,iBAAA;AAAA,MACpB,WAAA,EAAa,QAAQ,GAAA,CAAI,wBAAA;AAAA,MACzB,eAAA,EAAiB,QAAQ,GAAA,CAAI,4BAAA;AAAA,MAC7B,MAAA,EAAQ,QAAQ,GAAA,CAAI;AAAA,KACtB;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,WAAA,IAAe,OAAO,eAAA,EAAiB;AACjE,MAAA,IAAA,CAAK,iBAAA,CAAkB,cAAc,MAAM,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,gHAAqC,CAAA;AAAA,IACnD,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAI,kIAAwC,CAAA;AAAA,IACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAE7B,IAAA,MAAM,uBAAuB,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,OAAO,cAAc,CAAA;AACpF,IAAA,IAAI,CAAC,oBAAA,IAAwB,CAAC,oBAAA,CAAqB,OAAA,EAAS;AAC1D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wEAAA,EAA8B,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,mBAAA,CAAM,CAAA;AAAA,IAC7E;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,+DAAa,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,mBAAA,IAAuB,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,+DAAa,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,CAAM,WAAA,IAAe,KAAK,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,MAAM,0CAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,MACA,QAAA,EAC4B;AAC5B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,GAAG,IAAA,EAAK;AAEhC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,GAAG,QAAA;AAAA,MACH,gBAAA,EAAkB;AAAA,QAChB,GAAG,IAAA,CAAK,gBAAA;AAAA,QACR,GAAI,QAAA,CAAS,gBAAA,IAAoB;AAAC,OACpC;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,GAAG,IAAA,CAAK,YAAA;AAAA,QACR,GAAI,QAAA,CAAS,YAAA,IAAgB;AAAC,OAChC;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,IAAA,CAAK,KAAA;AAAA,QACR,GAAI,QAAA,CAAS,KAAA,IAAS;AAAC;AACzB,KACF;AAAA,EACF;AACF,CAAA;AAKA,eAAsB,wBAAwB,YAAA,EAAuF;AACnI,EAAA,MAAM,aAAA,GAAgB,IAAI,wBAAA,CAAyB,YAAY,CAAA;AAG/D,EAAA,MAAM,cAAc,oBAAA,EAAqB;AACzC,EAAA,MAAM,cAAc,oBAAA,EAAqB;AACzC,EAAA,MAAM,cAAc,8BAAA,EAA+B;AACnD,EAAA,OAAO,aAAA;AACT;;;ADnUA,IAAI,mBAAA,GAAmG,IAAA;AAKvG,eAAe,2BAAA,GAA8B;AAC3C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,sGAAwC,CAAA;AAEpD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,eAAe,YAAA,GAAe,aAAA;AAC3E,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sDAAA,EAA8B,WAAW,CAAA,CAAE,CAAA;AAGvD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEjC,MAAA,OAAA,CAAQ,IAAI,yGAAsC,CAAA;AAElD,MAAA,MAAM,UAAA,GAAa,0JAAA;AACnB,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,iDAAiD,WAAW,CAAA,MAAA,EAAS,UAAU,CAAA,CAAE,CAAA;AAE9G,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAA,CAAQ,IAAA,CAAK,qFAAA,EAAqC,QAAA,CAAS,MAAM,CAAA;AACjE,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,KAAA,EAAO;AAChC,QAAA,OAAA,CAAQ,IAAA,CAAK,uFAAqC,IAAI,CAAA;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,YAAoC,EAAC;AAC3C,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAc;AAChC,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,MAAA,EAAQ,UAAU,mBAAmB,CAAA;AAAA,QACrC,MAAA,EAAQ,UAAU,mBAAmB,CAAA;AAAA,QACrC,WAAA,EAAa,UAAU,0BAA0B,CAAA;AAAA,QACjD,eAAA,EAAiB,UAAU,8BAA8B,CAAA;AAAA,QACzD,YAAA,EAAc,UAAU,0BAA0B,CAAA;AAAA,QAClD,MAAA,EAAQ,SAAA,CAAU,mBAAmB,CAAA,KAAM,MAAA;AAAA,QAC3C,QAAA,EAAU,SAAA,CAAU,qBAAqB,CAAA,KAAM;AAAA,OACjD;AAEA,MAAA,OAAA,CAAQ,IAAI,+EAAA,EAAkC;AAAA,QAC5C,MAAA,EAAQ,UAAU,MAAA,IAAU,oBAAA;AAAA,QAC5B,MAAA,EAAQ,UAAU,MAAA,IAAU,oBAAA;AAAA,QAC5B,WAAA,EAAa,SAAA,CAAU,WAAA,GAAc,KAAA,GAAQ,oBAAA;AAAA,QAC7C,eAAA,EAAiB,SAAA,CAAU,eAAA,GAAkB,KAAA,GAAQ,oBAAA;AAAA,QACrD,YAAA,EAAc,UAAU,YAAA,IAAgB,oBAAA;AAAA,QACxC,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA;AAGD,MAAA,IAAI,UAAU,MAAA,IAAU,SAAA,CAAU,UAAU,SAAA,CAAU,WAAA,IAAe,UAAU,eAAA,EAAiB;AAC9F,QAAA,OAAA,CAAQ,IAAI,kHAAuC,CAAA;AACnD,QAAA,OAAO,SAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,iIAAuC,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAI,6DAAA,EAA+B;AAAA,UACzC,MAAA,EAAQ,CAAC,SAAA,CAAU,MAAA;AAAA,UACnB,MAAA,EAAQ,CAAC,SAAA,CAAU,MAAA;AAAA,UACnB,WAAA,EAAa,CAAC,SAAA,CAAU,WAAA;AAAA,UACxB,eAAA,EAAiB,CAAC,SAAA,CAAU;AAAA,SAC7B,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAI,8HAAuC,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,oFAAkC,KAAK,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAe,sBAAA,GAAyB;AACtC,EAAA,IAAI,CAAC,mBAAA,EAAqB;AAExB,IAAA,MAAM,wBAAA,GAA2B,MAAM,2BAAA,EAA4B;AAEnE,IAAA,IAAI,wBAAA,EAA0B;AAC5B,MAAA,OAAA,CAAQ,IAAI,+GAAuC,CAAA;AAGnD,MAAA,mBAAA,GAAsB,MAAM,uBAAA,CAAwB;AAAA,QAClD,cAAA,EAAgB,YAAA;AAAA,QAChB,gBAAA,EAAkB;AAAA,UAChB,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,KAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACX;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS,IAAA;AAAA,YACT,GAAG;AAAA,WACL;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACX;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS;AAAA;AACX;AACF,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,kHAAqC,CAAA;AAEjD,MAAA,mBAAA,GAAsB,MAAM,uBAAA,CAAwB;AAAA,QAClD,cAAA,EAAgB,OAAA;AAAA;AAAA,QAChB,gBAAA,EAAkB;AAAA,UAChB,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACX;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACX;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS;AAAA;AACX;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,mBAAA;AACT;AAKA,eAAsB,4BAAA,GAA+B;AACnD,EAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,EAAuB;AAGnD,EAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,gBAAA,CAAiB,YAAY,CAAA;AAEtD,EAAA,IAAI,SAAA,IAAa,UAAU,OAAA,EAAS;AAClC,IAAA,OAAA,CAAQ,IAAI,wEAAgC,CAAA;AAC5C,IAAA,OAAO,aAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,gGAAoC,CAAA;AAChD,IAAA,OAAO,aAAA;AAAA,EACT;AACF;AAKA,eAAsB,kBAAA,CAAmB,MAAY,YAAA,EAGlD;AACD,EAAA,OAAA,CAAQ,GAAA,CAAI,+EAAA,EAAkC,IAAA,CAAK,IAAI,CAAA;AAGvD,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,EAAA,QAAA,CAAS,MAAA,CAAO,YAAY,iBAAiB,CAAA;AAC7C,EAAA,QAAA,CAAS,OAAO,YAAA,EAAc,YAAA,GAAe,CAAA,WAAA,EAAc,YAAY,KAAK,SAAS,CAAA;AAGrF,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,EAAY,IAAK,KAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,GAAe,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAA,GAAK,yBAAA;AAC/E,EAAA,QAAA,CAAS,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACjF,EAAA,QAAA,CAAS,MAAA,CAAO,mBAAmB,MAAM,CAAA;AAGzC,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,4BAAA,EAA8B;AAAA,IACzD,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EACtF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,0BAAM,CAAA;AAAA,EACxC;AAEA,EAAA,OAAA,CAAQ,IAAI,4EAAA,EAAiC;AAAA,IAC3C,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAAA,IACpB,SAAA,EAAW,OAAO,IAAA,CAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAAA,IACpB,SAAA,EAAW,OAAO,IAAA,CAAK;AAAA,GACzB;AACF;AAKA,eAAsB,mBAAmB,MAAA,EAAiC;AACxE,EAAA,OAAA,CAAQ,GAAA,CAAI,wEAAmC,MAAM,CAAA;AAErD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AAE5D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,yCAAW,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,SAAA;AACrB;AAUA,eAAsB,6BAAA,GAAkD;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,EAAuB;AAEnD,IAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,gBAAA,CAAiB,YAAY,CAAA;AAGtD,IAAA,IAAI,SAAA,IAAa,UAAU,OAAA,EAAS;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,OAAO,IAAA;AAAA,EAET,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,gGAAoC,KAAK,CAAA;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,yBAAA,GAA6C;AACjE,EAAA,MAAM,SAAA,GAAY,MAAM,6BAAA,EAA8B;AACtD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,EAAuB;AAEnD,IAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,gBAAA,CAAiB,YAAY,CAAA;AAEtD,IAAA,IAAI,SAAA,IAAa,UAAU,OAAA,EAAS;AAClC,MAAA,OAAO,wDAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,qDAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO,sCAAA;AAAA,EACT;AACF;AAOO,SAAS,gBAAA,GAAyB;AACvC,EAAA,OAAA,CAAQ,IAAI,kEAA6B,CAAA;AACzC,EAAA,mBAAA,GAAsB,IAAA;AACxB;AAOA,eAAsB,wBAAA,GAA2B;AAC/C,EAAA,OAAA,CAAQ,IAAI,0FAAiC,CAAA;AAC7C,EAAA,gBAAA,EAAiB;AACjB,EAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,EAAuB;AAGnD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,MAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,gBAAA,GAAmB,YAAY,CAAA;AAEzD,MAAA,IAAI,SAAA,IAAa,UAAU,OAAA,EAAS;AAClC,QAAA,OAAA,CAAQ,IAAI,4GAA8C,CAAA;AAE1D,QAAA,MAAM,EAAE,oBAAA,EAAAE,qBAAAA,EAAqB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,IAAIA,qBAAAA,CAAqB,MAAa,CAAA;AAC1D,QAAA,MAAM,YAAY,UAAA,EAAW;AAG7B,QAAA,MAAO,YAAoB,4BAAA,IAA+B;AAAA,MAC5D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,sFAAyC,KAAK,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;;;AE1VA,IAAA,eAAA,GAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAAN,aAAAA;AAAA,EAAA,iBAAA,EAAA,MAAAO,kBAAAA;AAAA,EAAA,aAAA,EAAA,MAAAN,cAAAA;AAAA,EAAA,sBAAA,EAAA,MAAAC,uBAAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,YAAAA;AAAA,EAAA,aAAA,EAAA,MAAAK,cAAAA;AAAA,EAAA,sBAAA,EAAA,MAAAT;AAAA,CAAA,CAAA;ACaO,IAAM,gBAAA,GAAmB,oBAAA;AAEhC,IAAMU,oBAAAA,GAAsB,CAAC,IAAA,EAAW,QAAA,KAA6B;AACnE,EAAA,IAAI,OAAO,IAAA,EAAM,OAAA,KAAY,YAAY,IAAA,CAAK,OAAA,SAAgB,IAAA,CAAK,OAAA;AACnE,EAAA,IAAI,OAAO,IAAA,EAAM,KAAA,KAAU,YAAY,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,KAAA;AAC/D,EAAA,OAAO,QAAA;AACT,CAAA;AAEA,IAAM,qBAAqB,MAAM;AAC/B,EAAA,OAAO,OAAU;AAAA,IACf,GAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,KAKkB;AAChB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ;AAAA,MAClC,GAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG;AAAA;AACL,KACD,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,UAAA,IAAc,GAAA,IAAO,QAAA,CAAS,aAAa,GAAA,EAAK;AAC3D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AAEA,IAAA,MAAM,IAAI,MAAMA,oBAAAA,CAAoB,QAAA,CAAS,MAAM,CAAA,0BAAA,EAAS,QAAA,CAAS,UAAU,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,EACrF,CAAA;AACF,CAAA;AAEA,IAAMC,gBAAe,CAAC,OAAA,GAAU,qBAC9B,2BAAA,CAA4B,kBAAA,IAAsB,OAAO,CAAA;AAEpD,IAAMX,0BAAyB,OAAO,OAAA,GAAU,qBACrDW,aAAAA,CAAa,OAAO,EAAE,sBAAA,EAAuB;AAExC,IAAMF,iBAAgB,OAAO,OAAA,GAAU,qBAC5CE,aAAAA,CAAa,OAAO,EAAE,aAAA,EAAc;AAE/B,IAAMR,0BAAyB,OAAO,OAAA,GAAU,qBACrDQ,aAAAA,CAAa,OAAO,EAAE,sBAAA,EAAuB;AAExC,IAAMT,cAAAA,GAAgB,OAC3B,OAAA,EACA,OAAA,GAAU,qBACWS,aAAAA,CAAa,OAAO,CAAA,CAAE,aAAA,CAAc,OAAO,CAAA;AAE3D,IAAMV,aAAAA,GAAe,OAC1B,OAAA,EACA,OAAA,GAAU,qBACwBU,aAAAA,CAAa,OAAO,CAAA,CAAE,YAAA,CAAa,OAAO,CAAA;AAEvE,IAAMP,YAAAA,GAAc,OACzB,MAAA,EACA,OAAA,GAAU,qBACuBO,aAAAA,CAAa,OAAO,CAAA,CAAE,WAAA,CAAY,MAAM,CAAA;AAEpE,IAAMH,kBAAAA,GAAoB,OAC/B,MAAA,EAKA,OAAA,GAAU,qBACiBG,aAAAA,CAAa,OAAO,CAAA,CAAE,iBAAA,CAAkB,MAAM,CAAA","file":"index.mjs","sourcesContent":["/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4, // 禁用所有日志\n}\n\n/**\n * 日志条目\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n context?: string;\n error?: Error;\n}\n\n/**\n * 日志适配器接口\n * 不同平台实现不同的日志输出方式\n */\nexport interface LoggerAdapter {\n /**\n * 输出日志\n */\n log(entry: LogEntry): void;\n\n /**\n * 批量输出日志(可选)\n */\n logBatch?(entries: LogEntry[]): void;\n}\n\n/**\n * 日志配置\n */\nexport interface LoggerConfig {\n /**\n * 最小日志级别\n * 只有大于等于此级别的日志才会输出\n */\n minLevel: LogLevel;\n\n /**\n * 是否启用时间戳\n */\n enableTimestamp?: boolean;\n\n /**\n * 是否启用上下文(模块名)\n */\n enableContext?: boolean;\n\n /**\n * 环境(development/production)\n */\n environment?: 'development' | 'production';\n\n /**\n * 自定义适配器\n */\n adapter?: LoggerAdapter;\n}\n\n","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","export * from './types';\nexport * from './Logger';\nexport * from './console-adapter';\n\n","/**\n * MIME 类型工具函数\n */\n\nimport * as path from 'path';\n\n/** MIME 类型映射表 */\nconst MIME_TYPES: Record<string, string> = {\n // 图片\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n\n // 视频\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.wmv': 'video/x-ms-wmv',\n '.flv': 'video/x-flv',\n '.mkv': 'video/x-matroska',\n '.webm': 'video/webm',\n\n // 音频\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.flac': 'audio/flac',\n '.aac': 'audio/aac',\n\n // 文档\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.txt': 'text/plain',\n '.rtf': 'application/rtf',\n\n // 压缩文件\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n\n // 代码文件\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.css': 'text/css',\n '.ts': 'application/typescript',\n\n // 其他\n '.csv': 'text/csv',\n '.md': 'text/markdown',\n};\n\n/**\n * 根据文件名获取 MIME 类型\n *\n * @param filename 文件名\n * @returns MIME 类型\n *\n * @example\n * ```typescript\n * getMimeType('photo.jpg') // 'image/jpeg'\n * getMimeType('video.mp4') // 'video/mp4'\n * getMimeType('unknown.xyz') // 'application/octet-stream'\n * ```\n */\nexport function getMimeType(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return MIME_TYPES[ext] || 'application/octet-stream';\n}\n\n/**\n * 根据 MIME 类型获取文件扩展名\n *\n * @param mimeType MIME 类型\n * @returns 文件扩展名(包含点号)\n *\n * @example\n * ```typescript\n * getExtensionFromMimeType('image/jpeg') // '.jpg'\n * getExtensionFromMimeType('video/mp4') // '.mp4'\n * ```\n */\nexport function getExtensionFromMimeType(mimeType: string): string | null {\n for (const [ext, mime] of Object.entries(MIME_TYPES)) {\n if (mime === mimeType) {\n return ext;\n }\n }\n return null;\n}\n\n/**\n * 检查是否为图片类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为图片\n */\nexport function isImageType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * 检查是否为视频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为视频\n */\nexport function isVideoType(mimeType: string): boolean {\n return mimeType.startsWith('video/');\n}\n\n/**\n * 检查是否为音频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为音频\n */\nexport function isAudioType(mimeType: string): boolean {\n return mimeType.startsWith('audio/');\n}\n\n/**\n * 检查是否为文档类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为文档\n */\nexport function isDocumentType(mimeType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument',\n 'text/plain',\n 'application/rtf',\n ];\n return documentTypes.some(type => mimeType.includes(type));\n}\n\n/**\n * 验证 MIME 类型是否在允许列表中\n *\n * @param mimeType MIME 类型\n * @param allowedTypes 允许的类型列表(支持通配符)\n * @returns 是否允许\n *\n * @example\n * ```typescript\n * isAllowedMimeType('image/jpeg', ['image/*']) // true\n * isAllowedMimeType('video/mp4', ['image/*']) // false\n * isAllowedMimeType('image/png', ['image/jpeg']) // false\n * ```\n */\nexport function isAllowedMimeType(\n mimeType: string,\n allowedTypes: string[]\n): boolean {\n return allowedTypes.some(allowed => {\n if (allowed === '*/*') {\n return true;\n }\n if (allowed.endsWith('/*')) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix + '/');\n }\n return mimeType === allowed;\n });\n}\n\n","/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n","/**\n * UniversalFile Server 端类型定义\n */\n\nimport type {\n StorageType as _StorageType,\n CDNType as _CDNType,\n ProcessorType as _ProcessorType,\n FileMetadata,\n UploadStatus,\n AccessPermission,\n UploadFileInfo as _UploadFileInfo,\n ProcessingOptions as _ProcessingOptions,\n} from '../types';\n\n// Re-export client types for server use\nexport type StorageType = _StorageType;\nexport type CDNType = _CDNType;\nexport type ProcessorType = _ProcessorType;\nexport type UploadFileInfo = _UploadFileInfo;\nexport type ProcessingOptions = _ProcessingOptions;\n\n// ============= Provider 接口 =============\n\n/** 存储提供者接口 */\nexport interface IStorageProvider {\n /** 提供者类型 */\n readonly type: StorageType;\n\n /** 初始化 */\n initialize(config: StorageConfig): Promise<void>;\n\n /** 上传文件 */\n upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;\n\n /** 下载文件 */\n download(path: string): Promise<Buffer>;\n\n /** 删除文件 */\n delete(path: string): Promise<StorageResult>;\n\n /** 获取文件信息 */\n getFileInfo(path: string): Promise<StorageResult>;\n\n /** 生成访问URL */\n getAccessUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 生成预签名上传URL */\n getUploadUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 检查文件是否存在 */\n exists(path: string): Promise<boolean>;\n\n /** 列出文件 */\n list(prefix: string, maxKeys?: number): Promise<string[]>;\n}\n\n/** CDN 提供者接口 */\nexport interface ICDNProvider {\n /** 提供者类型 */\n readonly type: CDNType;\n\n /** 初始化 */\n initialize(config: CDNConfig): Promise<void>;\n\n /** 生成CDN URL */\n generateUrl(originalUrl: string): Promise<string>;\n\n /** 刷新缓存 */\n refreshCache(urls: string[]): Promise<CDNResult>;\n\n /** 预热缓存 */\n preheatCache(urls: string[]): Promise<CDNResult>;\n\n /** 获取访问统计 */\n getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;\n}\n\n/** 文件处理器接口 */\nexport interface IFileProcessor {\n /** 处理器类型 */\n readonly type: ProcessorType;\n\n /** 初始化 */\n initialize(): Promise<void>;\n\n /** 处理文件 */\n process(\n inputPath: string,\n outputPath: string,\n options: ProcessingOptions\n ): Promise<ProcessingResult>;\n\n /** 检查文件是否支持处理 */\n supports(mimeType: string): boolean;\n\n /** 获取文件信息 */\n getFileInfo(filePath: string): Promise<Record<string, any>>;\n}\n\n// ============= 配置接口 =============\n\n/** 存储配置基础接口 */\nexport interface StorageConfig {\n /** 存储类型 */\n type: StorageType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 本地存储配置 */\nexport interface LocalStorageConfig extends StorageConfig {\n type: 'local';\n /** 存储根目录 */\n rootPath: string;\n /** 基础URL */\n baseUrl: string;\n}\n\n/** 阿里云 OSS 配置 */\nexport interface AliyunOSSConfig extends StorageConfig {\n type: 'aliyun-oss';\n /** 地域 */\n region: string;\n /** 存储桶名称 */\n bucket: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 自定义域名 */\n customDomain?: string;\n /** 是否使用HTTPS */\n secure?: boolean;\n /** 是否使用内网访问 */\n internal?: boolean;\n}\n\n/** CDN配置基础接口 */\nexport interface CDNConfig {\n /** CDN类型 */\n type: CDNType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 阿里云 CDN 配置 */\nexport interface AliyunCDNConfig extends CDNConfig {\n type: 'aliyun-cdn';\n /** CDN域名 */\n domain: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 地域 */\n region?: string;\n}\n\n/** 缓存配置 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 最大缓存大小 */\n maxSize?: number;\n /** 缓存 TTL(秒) */\n ttl?: number;\n /** 是否使用 Redis */\n useRedis?: boolean;\n /** Redis 配置 */\n redisConfig?: {\n host: string;\n port: number;\n password?: string;\n db?: number;\n };\n}\n\n/** 文件服务配置 */\n/** 缓存配置扩展 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 元数据缓存TTL(秒) */\n metadataTTL?: number;\n /** URL缓存TTL(秒) */\n urlTTL?: number;\n /** 最大缓存条目数 */\n maxSize?: number;\n}\n\nexport interface UniversalFileServiceConfig {\n /** 存储配置 */\n storage: StorageConfig;\n /** CDN 配置(可选) */\n cdn?: CDNConfig;\n /** 缓存配置(可选) */\n cache?: CacheConfig;\n /** 数据库持久化配置(可选) */\n persistence?: FileServicePersistenceConfig;\n /** 启用的处理器 */\n processors?: ProcessorType[];\n /** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */\n db?: any;\n /** 最大文件大小(字节) */\n maxFileSize?: number;\n /** 允许的文件类型 */\n allowedMimeTypes?: string[];\n /** 是否启用监控 */\n enableMonitoring?: boolean;\n\n // 运行时字段(由服务类内部管理)\n /** 存储提供者映射(内部使用) */\n storageProviders?: Map<StorageType, IStorageProvider>;\n /** 默认存储类型 */\n defaultStorage?: StorageType;\n /** 默认CDN类型 */\n defaultCDN?: CDNType;\n}\n\n// ============= 结果类型 =============\n\n/** 存储结果 */\n/** 存储操作结果 */\nexport interface StorageResult {\n /** 是否成功 */\n success: boolean;\n /** 存储路径 */\n path?: string;\n /** 访问URL */\n url?: string;\n /** 文件大小 */\n size?: number;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 存储元数据 */\nexport interface StorageMetadata {\n /** 文件大小 */\n size: number;\n /** MIME 类型 */\n mimeType: string;\n /** 最后修改时间 */\n lastModified: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** CDN 结果 */\n/** CDN操作结果 */\nexport interface CDNResult {\n /** 是否成功 */\n success: boolean;\n /** CDN URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** CDN 统计信息 */\nexport interface CDNStats {\n /** 带宽(字节/秒) */\n bandwidth: number;\n /** 请求数 */\n requests: number;\n /** 流量(字节) */\n traffic: number;\n /** 统计时间范围 */\n timeRange: {\n start: Date;\n end: Date;\n };\n}\n\n/** 处理结果 */\nexport interface ProcessingResult {\n /** 是否成功 */\n success: boolean;\n /** 处理后的文件路径 */\n processedPath?: string;\n /** 处理后的文件大小 */\n processedSize?: number;\n /** 缩略图路径 */\n thumbnailPath?: string;\n /** 错误信息 */\n error?: string;\n /** 处理耗时(毫秒) */\n processingTime?: number;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 处理器信息 */\nexport interface ProcessorInfo {\n /** 处理器名称 */\n name: string;\n /** 处理器版本 */\n version: string;\n /** 支持的格式 */\n supportedFormats: string[];\n /** 支持的操作 */\n supportedOperations: string[];\n}\n\n// ============= 数据库相关类型 =============\n\n/** 文件数据库记录 */\nexport interface FileRecord extends FileMetadata {\n /** 创建时间 */\n createdAt: Date | string;\n /** 更新时间 */\n updatedAt: Date | string;\n}\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块 ID */\n moduleId?: string;\n /** 业务 ID */\n businessId?: string;\n /** 上传者 ID */\n uploaderId?: string;\n /** 文件类型 */\n mimeType?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 状态 */\n status?: UploadStatus;\n /** 分页 */\n page?: number;\n pageSize?: number;\n /** 排序 */\n orderBy?: string;\n orderDirection?: 'asc' | 'desc';\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据列表 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n}\n\n// ============= 事件类型 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'delete:error'\n | 'process:start'\n | 'process:complete'\n | 'process:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件 ID */\n fileId: string;\n /** 事件数据 */\n data?: any;\n /** 时间戳 */\n timestamp: Date;\n}\n\n/** 事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 数据库持久化接口 =============\n\n/**\n * 文件元数据数据库持久化接口\n *\n * 实现此接口以提供自定义的数据库持久化支持\n *\n * @example\n * ```typescript\n * // Drizzle ORM 实现\n * class DrizzleFileRepository implements IFileMetadataRepository {\n * async save(metadata: FileMetadata): Promise<void> {\n * await db.insert(fileMetadata).values(metadata);\n * }\n * // ... 其他方法\n * }\n * ```\n */\nexport interface IFileMetadataRepository {\n /**\n * 保存文件元数据到数据库\n */\n save(metadata: FileMetadata): Promise<void>;\n\n /**\n * 从数据库获取文件元数据\n */\n get(fileId: string): Promise<FileMetadata | null>;\n\n /**\n * 查询文件列表\n */\n query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;\n\n /**\n * 从数据库删除文件元数据\n */\n delete(fileId: string): Promise<void>;\n\n /**\n * 批量删除文件元数据\n */\n batchDelete(fileIds: string[]): Promise<void>;\n}\n\n/**\n * 数据库持久化配置\n */\nexport interface FileServicePersistenceConfig {\n /**\n * 是否启用持久化\n */\n enabled: boolean;\n\n /**\n * 持久化仓储实现\n */\n repository: IFileMetadataRepository;\n\n /**\n * 是否自动持久化(默认 true)\n * 如果为 true,文件上传完成后自动保存到数据库\n */\n autoPersist?: boolean;\n\n /**\n * 是否优先使用缓存(默认 false)\n * 如果为 true,查询时优先从缓存获取\n */\n cacheFirst?: boolean;\n}\n\n// ============= 异常类型定义 =============\n\n/** 文件服务异常基类 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传异常 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理异常 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者异常 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者异常 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n","/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n logger.info('🔄 [AliyunOSSProvider] 重新初始化OSS客户端', config);\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n '☁️ [AliyunOSSProvider] 新配置: bucket=' + (newConfig.bucket) + ', region=' + (newConfig.region)\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info('☁️ [AliyunOSSProvider] ' + (this.isInitialized ? '重新' : '') + '初始化阿里云OSS');\n logger.info('☁️ [AliyunOSSProvider] ' + (this.config ? JSON.stringify(this.config) : ''));\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n this.isInitialized = true;\n logger.info('✅ [AliyunOSSProvider] 阿里云OSS' + (configChanged ? '重新' : '') + '初始化完成');\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始上传文件到OSS: ' + (filePath));\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n '📦 [AliyunOSSProvider] 使用分片上传大文件: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n '📤 [AliyunOSSProvider] 使用普通上传: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [AliyunOSSProvider] 开始从OSS下载文件: ' + (filePath));\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n '✅ [AliyunOSSProvider] 文件下载完成: ' + (filePath) + ', 大小: ' + (result.content.length)\n );\n\n return result.content;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件下载失败: ' + (filePath) + ':', error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ' + (filePath));\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件删除完成: ' + (filePath));\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件删除失败: ' + (filePath) + ':', error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn('⚠️ [AliyunOSSProvider] 文件不存在: ' + (filePath));\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成访问URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成上传URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn('⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ' + (filePath) + ':', error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n \n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info('📦 [AliyunOSSProvider] 上传进度: ' + ((p * 100).toFixed(1)) + '%');\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.customDomain) + '/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用自定义域名: ' + (url));\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.bucket) + '.' + (this.config.region) + '.aliyuncs.com/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用默认OSS域名: ' + (url));\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n // if (this.isOSSError(error)) {\n // const requestId = error.requestId ? ' (RequestId: ' + (error.requestId) + ')' : '';\n // return (error.code) + ': ' + (error.message) + (requestId);\n // }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ' + (filePath));\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 流式上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ' + (filePaths.length));\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info('✅ [AliyunOSSProvider] 批量删除完成,成功: ' + (result.deleted?.length || 0));\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('📋 [AliyunOSSProvider] 开始复制文件: ' + (sourcePath) + ' -> ' + (targetPath));\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件复制完成: ' + (sourcePath) + ' -> ' + (targetPath));\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件复制失败: ' + (sourcePath) + ' -> ' + (targetPath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n","/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info('📂 [LocalStorageProvider] 初始化本地存储,根目录: ' + (this.config.rootPath));\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始上传文件: ' + (filePath));\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n '文件大小不匹配: 期望 ' + (fileInfo.file.size) + ', 实际 ' + (stats.size)\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [LocalStorageProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [LocalStorageProvider] 开始下载文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件下载完成: ' + (path) + ', 大小: ' + (buffer.length));\n\n return buffer;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件下载失败: ' + (path) + ':', error);\n throw new StorageProviderError(\n '文件下载失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [LocalStorageProvider] 开始删除文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn('⚠️ [LocalStorageProvider] 文件不存在: ' + (path));\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件删除完成: ' + (path));\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件删除失败: ' + (path) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : '/' + (urlPath);\n\n return (this.config.baseUrl) + (normalizedUrlPath);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n '目录访问权限不足: ' + (dirPath) + ', ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始流式上传文件: ' + (filePath));\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n '✅ [LocalStorageProvider] 流式上传完成: ' + (filePath) + ', 大小: ' + (stats.size) + ', 耗时: ' + (uploadTime) + 'ms'\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n return createReadStream(fullPath);\n }\n}\n\n","/**\n * 通用文件服务核心实现\n *\n * 提供统一的文件上传、下载、管理接口\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport { createLogger } from '../../logger';\nimport { getMimeType } from './utils/mime';\n\nconst logger = createLogger('UniversalFileService');\n\nimport type {\n StorageType,\n CDNType,\n ProcessorType,\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n FileEvent,\n FileEventListener,\n UploadStatus,\n} from '../types';\n\n// Backend specific types\nimport type {\n UniversalFileServiceConfig,\n IStorageProvider,\n ICDNProvider,\n IFileProcessor,\n} from './types';\n\nimport {\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n} from '../types';\n\n/**\n * 通用文件服务类\n */\nexport class UniversalFileService extends EventEmitter {\n private config: UniversalFileServiceConfig;\n private storageProviders = new Map<StorageType, IStorageProvider>();\n private cdnProviders = new Map<CDNType, ICDNProvider>();\n private fileProcessors = new Map<ProcessorType, IFileProcessor>();\n private uploadProgressMap = new Map<string, UploadProgress>();\n private metadataCache = new Map<string, { data: FileMetadata; expires: number }>();\n private urlCache = new Map<string, { url: string; expires: number }>();\n private processingQueue: Array<{\n fileId: string;\n processor: IFileProcessor;\n inputPath: string;\n outputPath: string;\n options: any;\n }> = [];\n private isProcessingQueueRunning = false;\n\n constructor(config: UniversalFileServiceConfig) {\n super();\n this.config = config;\n\n // 如果启用了持久化,设置自动监听器\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n this.setupPersistenceListeners();\n }\n }\n\n // ============= 持久化设置 =============\n\n /**\n * 设置数据库持久化监听器\n *\n * 当文件上传完成或删除时,自动触发数据库操作\n */\n private setupPersistenceListeners(): void {\n const { repository, autoPersist = true } = this.config.persistence!;\n\n if (!autoPersist) {\n logger.info('⚙️ [UniversalFileService] 自动持久化已禁用');\n return;\n }\n\n logger.info('✅ [UniversalFileService] 已启用数据库持久化,自动监听文件事件');\n\n // 监听文件上传完成事件\n this.on('upload:complete', async (fileId: string, data: any) => {\n try {\n const metadata = data.metadata || data;\n await repository.save(metadata);\n logger.info('💾 [Persistence] 文件元数据已自动保存: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 保存失败: ' + (fileId), error);\n // 不抛出错误,避免影响上传流程\n }\n });\n\n // 监听文件删除事件\n this.on('file:deleted', async (fileId: string) => {\n try {\n await repository.delete(fileId);\n logger.info('🗑️ [Persistence] 文件元数据已自动删除: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 删除失败: ' + (fileId), error);\n }\n });\n\n // 监听批量删除事件\n this.on('files:batch-deleted', async (fileIds: string[]) => {\n try {\n await repository.batchDelete(fileIds);\n logger.info('🗑️ [Persistence] 批量删除元数据: ' + (fileIds.length) + ' 个文件');\n } catch (error) {\n logger.error(`❌ [Persistence] 批量删除失败`, error);\n }\n });\n }\n\n // ============= 初始化方法 =============\n\n /**\n * 初始化文件服务\n */\n async initialize(): Promise<void> {\n logger.info('🚀 [UniversalFileService] 开始初始化文件服务...');\n\n try {\n // 验证配置是否完整\n await this.validateConfiguration();\n\n // 初始化存储提供者\n await this.initializeStorageProviders();\n\n // 初始化CDN提供者\n await this.initializeCDNProviders();\n\n // 初始化文件处理器\n await this.initializeFileProcessors();\n\n logger.info('✅ [UniversalFileService] 文件服务初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件服务初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitializeStorageProviders(): Promise<void> {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者...');\n\n try {\n // 重新初始化所有存储提供者\n for (const [type, provider] of this.storageProviders) {\n if ('reinitialize' in provider) {\n try {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者: ' + (type) + '...');\n\n // 获取对应的配置(从原始配置中获取)\n const config = (this.config as any).storageProviders?.[type as string];\n if (config) {\n await (provider as any).reinitialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成: ' + (type));\n } else {\n logger.warn('⚠️ [UniversalFileService] 存储提供者配置不存在: ' + (type));\n }\n } catch (error) {\n logger.error('❌ [UniversalFileService] 存储提供者重新初始化失败: ' + (type), error);\n // 继续处理其他提供者\n }\n }\n }\n\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 存储提供者重新初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 注册存储提供者\n */\n registerStorageProvider(provider: IStorageProvider): void {\n this.storageProviders.set(provider.type, provider);\n logger.info('📦 [UniversalFileService] 注册存储提供者: ' + (provider.type));\n }\n\n /**\n * 注册CDN提供者\n */\n registerCDNProvider(provider: ICDNProvider): void {\n this.cdnProviders.set(provider.type, provider);\n logger.info('🌐 [UniversalFileService] 注册CDN提供者: ' + (provider.type));\n }\n\n /**\n * 注册文件处理器\n */\n registerFileProcessor(processor: IFileProcessor): void {\n this.fileProcessors.set(processor.type, processor);\n logger.info('⚙️ [UniversalFileService] 注册文件处理器: ' + (processor.type));\n }\n\n // ============= 核心文件操作方法 =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n storageType?: StorageType,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const fileId = uuidv4();\n const startTime = Date.now();\n\n logger.info('📤 [UniversalFileService] 开始上传文件: ' + (fileInfo.file.name) + ', ID: ' + (fileId));\n\n try {\n // 验证文件\n await this.validateFile(fileInfo.file);\n\n // 初始化上传进度\n const progress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n this.uploadProgressMap.set(fileId, progress);\n this.emitFileEvent('upload:start', fileId, { fileName: fileInfo.file.name });\n\n // 生成文件元数据\n const metadata = await this.generateFileMetadata(fileId, fileInfo);\n\n // 选择存储提供者\n const selectedStorageType = storageType || this.config.defaultStorage;\n let storageProvider = this.storageProviders.get(selectedStorageType as StorageType);\n\n // 如果指定的存储提供者不可用,优先尝试OSS\n if (!storageProvider) {\n logger.info(\n '⚠️ [UniversalFileService] 存储提供者 ' + (selectedStorageType) + ' 不可用,尝试使用OSS'\n );\n storageProvider = this.storageProviders.get('aliyun-oss');\n\n // 如果OSS也不可用,回退到本地存储\n if (!storageProvider) {\n logger.info(`⚠️ [UniversalFileService] OSS不可用,回退到本地存储`);\n storageProvider = this.storageProviders.get('local');\n }\n }\n\n if (!storageProvider) {\n throw new StorageProviderError(`没有可用的存储提供者`);\n }\n\n // 生成存储路径\n const storagePath = this.generateStoragePath(metadata);\n\n // 更新上传状态\n progress.status = 'uploading';\n progress.progress = 10;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n this.emitFileEvent('upload:progress', fileId, { progress: progress.progress });\n\n // 执行上传\n const uploadResult = await storageProvider.upload(fileInfo, storagePath);\n\n if (!uploadResult.success) {\n throw new FileUploadError('上传失败: ' + (uploadResult.error));\n }\n\n // 更新元数据\n metadata.storagePath = uploadResult.path || storagePath;\n metadata.storageProvider = selectedStorageType as StorageType;\n\n // 生成CDN URL(如果启用)\n if (this.config.defaultCDN !== 'none') {\n const cdnProvider = this.cdnProviders.get(this.config.defaultCDN as CDNType);\n if (cdnProvider && uploadResult.url) {\n metadata.cdnUrl = await cdnProvider.generateUrl(uploadResult.url);\n }\n }\n\n // 更新上传进度\n progress.status = fileInfo.needsProcessing ? 'processing' : 'completed';\n progress.progress = fileInfo.needsProcessing ? 70 : 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n // 如果需要处理,添加到处理队列\n if (fileInfo.needsProcessing && fileInfo.processingOptions) {\n await this.queueFileProcessing(metadata, fileInfo.processingOptions);\n }\n\n // 缓存元数据\n this.cacheMetadata(metadata);\n\n // 保存到数据库通过事件触发(如果启用了持久化)\n // persistence.repository 会监听 'upload:complete' 事件自动保存\n\n // 完成上传\n progress.status = 'completed';\n progress.progress = 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [UniversalFileService] 文件上传完成: ' + (fileId) + ', 耗时: ' + (uploadTime) + 'ms');\n\n this.emitFileEvent('upload:complete', fileId, {\n fileName: fileInfo.file.name,\n size: fileInfo.file.size,\n uploadTime,\n });\n\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件上传失败: ' + (fileId) + ':', error);\n\n // 更新上传状态为失败\n const progress = this.uploadProgressMap.get(fileId);\n if (progress) {\n progress.status = 'failed';\n progress.error = error instanceof Error ? error.message : '上传失败';\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n }\n\n this.emitFileEvent(\n 'upload:error',\n fileId,\n undefined,\n error instanceof Error ? error.message : '上传失败'\n );\n throw error;\n } finally {\n // 清理上传进度(可选,或设置过期时间)\n setTimeout(\n () => {\n this.uploadProgressMap.delete(fileId);\n },\n 5 * 60 * 1000\n ); // 5分钟后清理\n }\n }\n\n\n /**\n * 下载文件\n */\n async downloadFile(fileId: string, userId?: string): Promise<Buffer> {\n logger.info('📥 [UniversalFileService] 开始下载文件: ' + (fileId));\n\n try {\n this.emitFileEvent('download:start', fileId);\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查权限\n await this.checkFileAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 下载文件\n const fileBuffer = await storageProvider.download(metadata.storagePath);\n\n // 更新访问统计 (如果启用了持久化)\n if (this.config.persistence?.enabled) {\n await this.updateAccessStats(fileId);\n }\n\n logger.info('✅ [UniversalFileService] 文件下载完成: ' + (fileId));\n this.emitFileEvent('download:complete', fileId, { size: fileBuffer.length });\n\n return fileBuffer;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件下载失败: ' + (fileId) + ':', error);\n this.emitFileEvent('download:error', fileId, undefined, error instanceof Error ? error.message : '下载失败');\n throw error;\n }\n }\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string, userId?: string): Promise<void> {\n logger.info('🗑️ [UniversalFileService] 开始删除文件: ' + (fileId));\n\n try {\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查删除权限\n await this.checkFileDeleteAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 从存储中删除文件\n const deleteResult = await storageProvider.delete(metadata.storagePath);\n\n if (!deleteResult.success) {\n console.warn('⚠️ [UniversalFileService] 存储文件删除失败: ' + (deleteResult.error));\n }\n\n // 从数据库中删除元数据 (通过事件触发)\n if (this.config.persistence?.enabled) {\n await this.deleteFileMetadata(fileId);\n }\n\n // 清除缓存\n this.clearMetadataCache(fileId);\n\n logger.info('✅ [UniversalFileService] 文件删除完成: ' + (fileId));\n this.emitFileEvent('delete:complete', fileId);\n this.emit('file:deleted', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件删除失败: ' + (fileId) + ':', error);\n this.emitFileEvent('delete:error', fileId, undefined, error instanceof Error ? error.message : '删除失败');\n throw error;\n }\n }\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, userId?: string, expiresIn?: number): Promise<string> {\n // 检查缓存\n const cacheKey = (fileId) + '_' + (userId || 'public') + '_' + (expiresIn || 0);\n const cached = this.urlCache.get(cacheKey);\n\n if (cached && cached.expires > Date.now()) {\n return cached.url;\n }\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查访问权限\n await this.checkFileAccess(metadata, userId);\n\n let url: string;\n\n // 优先使用CDN URL\n if (metadata.cdnUrl) {\n url = metadata.cdnUrl;\n } else {\n // 获取存储提供者访问URL\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);\n }\n\n // 缓存URL\n const cacheExpires = Date.now() + (this.config.cache?.urlTTL || 1800) * 1000;\n this.urlCache.set(cacheKey, { url, expires: cacheExpires });\n\n return url;\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata | null> {\n // 检查缓存\n const cached = this.metadataCache.get(fileId);\n if (cached && cached.expires > Date.now()) {\n return cached.data;\n }\n\n // 如果启用了持久化,从数据库查询\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n try {\n const metadata = await this.config.persistence.repository.get(fileId);\n if (metadata) {\n // 缓存结果\n this.cacheMetadata(metadata);\n }\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件元数据失败:', error);\n return null;\n }\n }\n\n // 如果没有启用持久化,返回 null\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件元数据: ' + (fileId));\n return null;\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件列表');\n return {\n items: [],\n total: 0,\n page: options.page || 1,\n pageSize: options.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n\n try {\n const result = await this.config.persistence.repository.query(options);\n // 添加 hasNext 和 hasPrev\n const hasNext = result.page < result.totalPages;\n const hasPrev = result.page > 1;\n return {\n ...result,\n hasNext,\n hasPrev,\n };\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[], userId?: string): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n successCount: 0,\n failureCount: 0,\n failures: [],\n };\n\n for (const fileId of fileIds) {\n try {\n await this.deleteFile(fileId, userId);\n result.successCount++;\n } catch (error) {\n result.failureCount++;\n result.failures.push({\n fileId,\n error: error instanceof Error ? error.message : '删除失败',\n });\n }\n }\n\n // 触发批量删除事件\n if (result.successCount > 0) {\n this.emit('files:batch-deleted', fileIds.filter((_, i) => i < result.successCount));\n }\n\n return result;\n }\n\n /**\n * 获取上传进度\n */\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this.uploadProgressMap.get(fileId);\n }\n\n // ============= 事件处理方法 =============\n\n /**\n * 监听文件事件\n */\n onFileEvent(eventType: string, listener: FileEventListener): void {\n this.on(eventType, listener);\n }\n\n /**\n * 移除文件事件监听器\n */\n offFileEvent(eventType: string, listener: FileEventListener): void {\n this.off(eventType, listener);\n }\n\n // ============= 私有方法 =============\n\n /**\n * 验证配置是否完整\n */\n private async validateConfiguration(): Promise<void> {\n logger.info('🔍 [UniversalFileService] 验证配置文件...');\n\n // 检查基础配置\n if (!this.config) {\n throw new Error('文件服务配置为空');\n }\n\n // 检查存储配置\n if (!this.config.storage) {\n throw new Error('存储配置为空');\n }\n\n // 检查存储提供者配置\n if (this.config.storage.type === 'aliyun-oss') {\n const ossConfig = this.config.storage as any;\n\n // 如果配置不完整,等待配置加载\n if (!ossConfig.accessKeyId || !ossConfig.accessKeySecret || !ossConfig.bucket || !ossConfig.region) {\n logger.warn('⚠️ [UniversalFileService] OSS配置不完整,等待配置加载...');\n\n // 轮询检查配置是否加载完成,最多等待30秒\n const maxRetries = 30;\n const retryInterval = 1000; // 1秒\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, retryInterval));\n\n // 重新检查配置(这里假设配置可能会被外部更新)\n const updatedConfig = this.config.storage as any;\n if (updatedConfig.accessKeyId && updatedConfig.accessKeySecret && updatedConfig.bucket && updatedConfig.region) {\n logger.info('✅ [UniversalFileService] OSS配置加载完成');\n break;\n }\n\n if (i === maxRetries - 1) {\n throw new Error('OSS配置加载超时:缺少必需的配置项 (accessKeyId, accessKeySecret, bucket, region)');\n }\n\n logger.debug('等待OSS配置加载中... (' + (i + 1) + '/' + (maxRetries) + ')');\n }\n }\n }\n\n // 检查默认存储类型\n if (!this.config.defaultStorage) {\n this.config.defaultStorage = this.config.storage.type as any;\n }\n\n logger.info('✅ [UniversalFileService] 配置验证完成');\n }\n\n private async initializeStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 开始初始化存储提供者...');\n\n // 如果还没有注册任何存储提供者,先注册默认的\n if (this.storageProviders.size === 0) {\n await this.registerDefaultStorageProviders();\n }\n\n if (this.config.storageProviders) {\n for (const [type, config] of Object.entries(this.config.storageProviders)) {\n if (config && config.enabled) {\n const provider = this.storageProviders.get(type as StorageType);\n if (provider) {\n try {\n await provider.initialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者初始化完成: ' + (type));\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 存储提供者初始化失败: ' + (type) + ':', error);\n // 如果默认存储提供者初始化失败,切换到本地存储\n // if (type === this.config.defaultStorage) {\n // console.warn('⚠️ [UniversalFileService] 默认存储提供者 ' + (type) + ' 初始化失败,切换到本地存储');\n // this.config.defaultStorage = 'local';\n // }\n }\n } else {\n console.warn('⚠️ [UniversalFileService] 存储提供者未注册: ' + (type));\n }\n }\n }\n }\n }\n\n private async registerDefaultStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 注册默认存储提供者...');\n\n // 根据配置注册相应的存储提供者\n try {\n if (this.config.storage) {\n if (this.config.storage.type === 'aliyun-oss' && this.config.storage.enabled) {\n const { AliyunOSSProvider } = await import('./providers/AliyunOSSProvider');\n const ossProvider = new AliyunOSSProvider();\n this.registerStorageProvider(ossProvider);\n logger.info('✅ [UniversalFileService] 阿里云OSS提供者注册成功');\n } else if (this.config.storage.type === 'local' && this.config.storage.enabled) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const localProvider = new LocalStorageProvider();\n this.registerStorageProvider(localProvider);\n logger.info('✅ [UniversalFileService] 本地存储提供者注册成功');\n }\n }\n\n // 如果没有注册任何提供者,注册本地存储作为后备\n if (this.storageProviders.size === 0) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const fallbackProvider = new LocalStorageProvider();\n this.registerStorageProvider(fallbackProvider);\n logger.info('✅ [UniversalFileService] 已注册备用本地存储提供者');\n }\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 注册默认存储提供者失败:', error);\n throw new Error('无法初始化存储提供者');\n }\n }\n\n private async initializeCDNProviders(): Promise<void> {\n // CDN 初始化暂时跳过,未来支持多个 CDN 提供者时实现\n if (this.config.cdn && this.config.cdn.enabled) {\n logger.info('✅ [UniversalFileService] CDN配置已启用: ' + (this.config.cdn.type));\n }\n }\n\n private async initializeFileProcessors(): Promise<void> {\n for (const processor of Array.from(this.fileProcessors.values())) {\n await processor.initialize();\n logger.info('✅ [UniversalFileService] 文件处理器初始化完成: ' + (processor.type));\n }\n }\n\n private async validateFile(file: File): Promise<void> {\n // 检查文件大小\n if (this.config.maxFileSize && file.size > this.config.maxFileSize) {\n throw new FileUploadError('文件大小超过限制: ' + (file.size) + ' > ' + (this.config.maxFileSize));\n }\n\n // 检查文件类型\n const mimeType = file.type || getMimeType(file.name);\n\n if (\n this.config.allowedMimeTypes &&\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new FileUploadError('不支持的文件类型: ' + (mimeType));\n }\n }\n\n private async generateFileMetadata(\n fileId: string,\n fileInfo: UploadFileInfo\n ): Promise<FileMetadata> {\n const now = new Date();\n const mimeType = fileInfo.file.type || getMimeType(fileInfo.file.name);\n const extension = path.extname(fileInfo.file.name).toLowerCase();\n\n // 生成文件哈希(用于去重检测)\n const hash = await this.generateFileHash(fileInfo.file);\n\n return {\n id: fileId,\n originalName: fileInfo.file.name,\n storageName: (fileId) + (extension),\n size: fileInfo.file.size,\n mimeType,\n extension,\n hash,\n uploadTime: now,\n permission: fileInfo.permission || 'public',\n uploaderId: fileInfo.metadata?.uploadedBy || 'system',\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n storageProvider: (this.config.defaultStorage || 'local') as StorageType,\n storagePath: '',\n accessCount: 0,\n metadata: fileInfo.metadata || {},\n };\n }\n\n private generateStoragePath(metadata: FileMetadata): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return (metadata.moduleId) + '/' + (year) + '/' + (month) + '/' + (day) + '/' + (metadata.storageName);\n }\n\n private async generateFileHash(file: File): Promise<string> {\n const buffer = await file.arrayBuffer();\n const hash = createHash('sha256');\n hash.update(Buffer.from(buffer));\n return hash.digest('hex');\n }\n\n private async queueFileProcessing(metadata: FileMetadata, options: any): Promise<void> {\n if (!this.config.processors?.length || 0 > 0) {\n return;\n }\n\n const processor = this.fileProcessors.get(options.type);\n if (!processor) {\n console.warn('⚠️ [UniversalFileService] 文件处理器不存在: ' + (options.type));\n return;\n }\n\n if (this.processingQueue.length >= 1000) {\n throw new FileProcessingError('处理队列已满');\n }\n\n this.processingQueue.push({\n fileId: metadata.id,\n processor,\n inputPath: metadata.storagePath,\n outputPath: this.generateProcessedPath(metadata, options),\n options,\n });\n\n // 启动处理队列\n if (!this.isProcessingQueueRunning) {\n this.processFileQueue();\n }\n }\n\n private generateProcessedPath(metadata: FileMetadata, options: any): string {\n const basePath = metadata.storagePath;\n const extension = path.extname(basePath);\n const basename = basePath.replace(extension, '');\n\n return (basename) + '_processed' + (extension);\n }\n\n private async processFileQueue(): Promise<void> {\n if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {\n return;\n }\n\n this.isProcessingQueueRunning = true;\n\n while (this.processingQueue.length > 0) {\n const task = this.processingQueue.shift();\n if (!task) break;\n\n try {\n this.emitFileEvent('processing:start', task.fileId);\n\n const result = await task.processor.process(task.inputPath, task.outputPath, task.options);\n\n if (result.success) {\n this.emitFileEvent('processing:complete', task.fileId, result);\n } else {\n this.emitFileEvent('processing:error', task.fileId, undefined, result.error);\n }\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件处理失败: ' + (task.fileId) + ':', error);\n this.emitFileEvent(\n 'processing:error',\n task.fileId,\n undefined,\n error instanceof Error ? error.message : '处理失败'\n );\n }\n }\n\n this.isProcessingQueueRunning = false;\n }\n\n private cacheMetadata(metadata: FileMetadata): void {\n const expires = Date.now() + (this.config.cache?.metadataTTL || 3600) * 1000;\n this.metadataCache.set(metadata.id, { data: metadata, expires });\n }\n\n private clearMetadataCache(fileId: string): void {\n this.metadataCache.delete(fileId);\n }\n\n private emitFileEvent(type: string, fileId: string, data?: any, error?: string): void {\n const event: FileEvent = {\n type: type as any,\n fileId,\n timestamp: new Date(),\n data,\n error,\n };\n\n this.emit(type, event);\n this.emit('*', event); // 通用事件监听\n }\n\n // ============= 数据库操作私有方法 =============\n\n /**\n * 保存文件元数据到数据库 (通过持久化仓储)\n */\n private async saveFileMetadata(metadata: FileMetadata): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,跳过保存元数据');\n return;\n }\n\n try {\n await this.config.persistence.repository.save(metadata);\n logger.info('💾 [UniversalFileService] 文件元数据保存成功:', metadata.id);\n } catch (error) {\n console.error('❌ [UniversalFileService] 保存文件元数据失败:', error);\n throw new FileUploadError(\n '保存文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 从数据库删除文件元数据 (通过持久化仓储)\n */\n private async deleteFileMetadata(fileId: string): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n return;\n }\n\n try {\n await this.config.persistence.repository.delete(fileId);\n logger.info('🗑️ [UniversalFileService] 文件元数据删除成功:', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 删除文件元数据失败:', error);\n throw new FileUploadError(\n '删除文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 更新访问统计\n */\n private async updateAccessStats(fileId: string): Promise<void> {\n // 访问统计更新由数据库仓储实现决定\n // 这里只记录日志\n logger.info('📊 [UniversalFileService] 需要更新访问统计:', fileId);\n }\n\n /**\n * 检查文件访问权限\n */\n private async checkFileAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 如果文件是公开的,允许访问\n if (metadata.permission === 'public') {\n return;\n }\n\n // 如果是私有文件,检查用户权限\n if (metadata.permission === 'private' && metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限访问此文件');\n }\n\n // 如果是认证用户可访问,检查是否提供了 userId\n if (metadata.permission === 'authenticated' && !userId) {\n throw new FileUploadError('需要登录才能访问此文件');\n }\n }\n\n /**\n * 检查文件删除权限\n */\n private async checkFileDeleteAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 只有上传者可以删除文件\n if (metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限删除此文件');\n }\n }\n\n /**\n * 检查服务是否完全可用(包括存储提供者)\n */\n isFullyInitialized(): boolean {\n // 检查是否有可用的存储提供者\n const hasStorageProvider = Array.from(this.storageProviders.values()).some(provider =>\n provider.type === 'aliyun-oss' || provider.type === 'local'\n );\n\n return hasStorageProvider;\n }\n\n /**\n * 等待服务完全初始化(带超时)\n */\n async waitForInitialization(timeoutMs: number = 30000): Promise<void> {\n const startTime = Date.now();\n\n while (!this.isFullyInitialized()) {\n if (Date.now() - startTime > timeoutMs) {\n throw new Error('服务初始化超时 (' + (timeoutMs) + 'ms)');\n }\n\n // 等待100ms后重试\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n logger.info('✅ [UniversalFileService] 服务完全初始化就绪');\n }\n}\n","import type { ArtCollection } from '../../types';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n url: string;\n method: HttpMethod;\n data?: unknown;\n headers?: Record<string, string>;\n}\n\nexport type RequestExecutor = <T = any>(options: RequestOptions) => Promise<T>;\n\nexport type CollectionOverview = Omit<ArtCollection, 'pages'> & { pages?: ArtCollection['pages'] };\n\nexport interface ShowmasterpieceClient {\n getCollectionsOverview: () => Promise<CollectionOverview[]>;\n getCategories: () => Promise<CategoryOption[]>;\n getBookableCollections: () => Promise<CollectionSummary[]>;\n createBooking: (payload: CreateBookingRequest) => Promise<Booking>;\n batchBooking: (payload: BatchBookingRequest) => Promise<BatchBookingResponse>;\n getBookings: (params: BookingListParams) => Promise<BookingListResponse>;\n checkPopupConfigs: (params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n }) => Promise<PopupConfig[]>;\n}\n\nconst joinUrl = (baseUrl: string, path: string): string => {\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, '')}${path}`;\n};\n\nconst toSearchParams = (params: BookingListParams): string => {\n const searchParams = new URLSearchParams();\n\n if (params.collectionId) searchParams.set('collectionId', String(params.collectionId));\n if (params.qqNumber) searchParams.set('qqNumber', params.qqNumber);\n if (params.phoneNumber) searchParams.set('phoneNumber', params.phoneNumber);\n if (params.status) searchParams.set('status', params.status);\n if (params.page) searchParams.set('page', String(params.page));\n if (params.limit) searchParams.set('limit', String(params.limit));\n\n return searchParams.toString();\n};\n\nconst extractArrayData = <T>(data: any): T[] => {\n if (Array.isArray(data?.data)) return data.data as T[];\n if (Array.isArray(data?.collections)) return data.collections as T[];\n if (Array.isArray(data?.configs)) return data.configs as T[];\n if (Array.isArray(data?.data?.configs)) return data.data.configs as T[];\n if (Array.isArray(data)) return data as T[];\n return [];\n};\n\nexport const createShowmasterpieceClient = (\n request: RequestExecutor,\n baseUrl: string,\n): ShowmasterpieceClient => {\n return {\n getCollectionsOverview: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/collections?overview=true');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionOverview>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n getCategories: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/categories');\n const data = await request<any>({ url, method: 'GET' });\n const categories = extractArrayData<CategoryOption>(data);\n if (!Array.isArray(categories)) {\n throw new Error('API响应格式错误');\n }\n return categories;\n },\n\n getBookableCollections: async () => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/collections');\n const data = await request<any>({ url, method: 'GET' });\n const collections = extractArrayData<CollectionSummary>(data);\n if (!Array.isArray(collections)) {\n throw new Error('API响应格式错误');\n }\n return collections;\n },\n\n createBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings');\n return request<Booking>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n batchBooking: async (payload) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/bookings/batch');\n return request<BatchBookingResponse>({\n url,\n method: 'POST',\n data: payload,\n });\n },\n\n getBookings: async (params) => {\n const query = toSearchParams(params);\n const path = query\n ? `/api/showmasterpiece/bookings?${query}`\n : '/api/showmasterpiece/bookings';\n const url = joinUrl(baseUrl, path);\n return request<BookingListResponse>({\n url,\n method: 'GET',\n });\n },\n\n checkPopupConfigs: async (params) => {\n const url = joinUrl(baseUrl, '/api/showmasterpiece/popup-configs/check');\n const data = await request<any>({\n url,\n method: 'POST',\n data: {\n businessModule: params.businessModule,\n businessScene: params.businessScene,\n currentTime: params.currentTime || new Date().toISOString(),\n },\n });\n return extractArrayData<PopupConfig>(data);\n },\n };\n};\n","export * from './client';\nexport * as clientBusinessWebServices from '../client-business';\n","import type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_WEB_BASE_URL = '';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createFetchExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: data === undefined ? undefined : JSON.stringify(data),\n });\n\n const payload = await response.json().catch(() => null);\n\n if (response.ok) {\n return payload as T;\n }\n\n throw new Error(extractErrorMessage(payload, `请求失败 (${response.status})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_WEB_BASE_URL) =>\n createShowmasterpieceClient(createFetchExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_WEB_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_WEB_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_WEB_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n","export * as masterpiecesService from './masterpiecesService';\nexport * as masterpiecesConfigService from './masterpiecesConfigService';\nexport * as cartService from './cartService';\nexport * as bookingService from './bookingService';\nexport * as bookingAdminService from './bookingAdminService';\nexport * as cartHistoryService from './cartHistoryService';\nexport * as eventAwareMasterpiecesService from './eventAwareMasterpiecesService';\nexport * as exportConfigService from './exportConfig';\nexport * as fileService from './fileService';\n","/**\n * MasterpiecesService - 美术作品前端API服务\n * \n * 这个文件提供了客户端与美术作品相关API的通信接口。\n * 主要用于前端组件和Hook中调用后端API,获取和操作画集数据。\n * \n * 主要功能:\n * - 画集数据的获取和查询\n * - 搜索和筛选功能\n * - 分类和标签管理\n * - 推荐算法\n * \n * 设计特点:\n * - 使用静态方法,无需实例化\n * - 统一的错误处理\n * - 支持多种查询方式\n * - TypeScript类型安全\n * \n * @module MasterpiecesService\n */\n\nimport type { ArtCollection } from '../../types';\n\n/**\n * 获取美术作品画集列表(函数式API)\n * \n * 这是一个简单的函数式接口,用于获取所有画集数据。\n * 主要为了保持向后兼容性而保留。\n * \n * @returns Promise<ArtCollection[]> 画集数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @deprecated 建议使用 MasterpiecesService.getAllCollections() 代替\n */\nexport const getMasterpieces = async (): Promise<ArtCollection[]> => {\n const response = await fetch('/api/showmasterpiece/collections');\n if (!response.ok) {\n throw new Error('获取画集失败');\n }\n return await response.json();\n};\n\n/**\n * 美术作品服务类\n * \n * 提供完整的美术作品数据访问接口,包括画集的获取、搜索、筛选等功能。\n * 所有方法都是静态方法,可以直接调用,无需实例化。\n * \n * @example\n * ```typescript\n * // 获取所有画集\n * const collections = await MasterpiecesService.getAllCollections();\n * \n * // 搜索画集\n * const results = await MasterpiecesService.searchCollections('油画');\n * \n * // 按分类获取\n * const paintings = await MasterpiecesService.getCollectionsByCategory('油画');\n * ```\n */\nexport class MasterpiecesService {\n /**\n * 获取所有画集\n * \n * 从后端API获取所有可用的画集数据。\n * 返回的数据包含完整的画集信息和作品页面。\n * \n * @returns Promise<ArtCollection[]> 所有画集的数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * try {\n * const collections = await MasterpiecesService.getAllCollections();\n * console.log(`共加载了 ${collections.length} 个画集`);\n * } catch (error) {\n * console.error('加载失败:', error.message);\n * }\n * ```\n */\n static async getAllCollections(): Promise<ArtCollection[]> {\n const response = await fetch('/api/showmasterpiece/collections');\n if (!response.ok) {\n throw new Error('获取画集失败');\n }\n const payload = await response.json();\n const collections = Array.isArray(payload)\n ? payload\n : (payload?.collections ?? payload?.data ?? []);\n\n if (!Array.isArray(collections)) {\n throw new Error('画集数据格式不正确');\n }\n\n return collections;\n }\n\n /**\n * 根据ID获取特定画集\n * \n * 通过画集ID获取单个画集的详细信息。\n * 内部实现是先获取所有画集,然后筛选出指定ID的画集。\n * \n * @param id - 画集的唯一标识符\n * @returns Promise<ArtCollection | null> 找到的画集对象,如果不存在则返回null\n * \n * @example\n * ```typescript\n * const collection = await MasterpiecesService.getCollectionById(1);\n * if (collection) {\n * console.log(`找到画集: ${collection.title}`);\n * } else {\n * console.log('画集不存在');\n * }\n * ```\n */\n static async getCollectionById(id: number): Promise<ArtCollection | null> {\n const collections = await this.getAllCollections();\n return collections.find(c => c.id === id) || null;\n }\n\n /**\n * 搜索画集\n * \n * 根据关键词在画集的多个字段中进行搜索,包括:\n * - 画集标题\n * - 艺术家姓名\n * - 画集描述\n * - 画集分类\n * - 画集标签\n * \n * 搜索是大小写不敏感的,支持部分匹配。\n * \n * @param query - 搜索关键词\n * @returns Promise<ArtCollection[]> 匹配的画集数组\n * \n * @example\n * ```typescript\n * // 搜索包含\"山水\"的画集\n * const results = await MasterpiecesService.searchCollections('山水');\n * console.log(`找到 ${results.length} 个相关画集`);\n * ```\n */\n static async searchCollections(query: string): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n const searchTerm = query.toLowerCase();\n \n return collections.filter((collection: ArtCollection) => \n collection.title.toLowerCase().includes(searchTerm) ||\n collection.number.toLowerCase().includes(searchTerm) ||\n collection.description.toLowerCase().includes(searchTerm) ||\n (collection.category && collection.category.toLowerCase().includes(searchTerm)) ||\n (collection.tags && collection.tags.some((tag: string) => tag.toLowerCase().includes(searchTerm)))\n );\n }\n\n /**\n * 根据分类获取画集\n * \n * 获取属于指定分类的所有画集。\n * 支持特殊值 'all' 来获取所有画集。\n * \n * @param category - 分类名称,或 'all' 表示所有分类\n * @returns Promise<ArtCollection[]> 该分类下的画集数组\n * \n * @example\n * ```typescript\n * // 获取油画分类的画集\n * const paintings = await MasterpiecesService.getCollectionsByCategory('油画');\n * \n * // 获取所有画集\n * const allCollections = await MasterpiecesService.getCollectionsByCategory('all');\n * ```\n */\n static async getCollectionsByCategory(category: string): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n \n if (category === 'all') {\n return collections;\n }\n \n return collections.filter((collection: ArtCollection) => collection.category === category);\n }\n\n /**\n * 获取推荐画集\n * \n * 基于简单的推荐算法获取推荐的画集。\n * 当前算法:优先选择已发布的画集,按作品数量降序排列。\n * \n * @param limit - 返回的推荐画集数量,默认为3个\n * @returns Promise<ArtCollection[]> 推荐的画集数组\n * \n * @example\n * ```typescript\n * // 获取3个推荐画集\n * const recommended = await MasterpiecesService.getRecommendedCollections();\n * \n * // 获取5个推荐画集\n * const moreRecommended = await MasterpiecesService.getRecommendedCollections(5);\n * ```\n */\n static async getRecommendedCollections(limit: number = 3): Promise<ArtCollection[]> {\n const collections = await this.getAllCollections();\n \n // 简单的推荐逻辑:返回已发布的画集,按作品数量排序\n return collections\n .filter((collection: ArtCollection) => collection.isPublished !== false)\n .sort((a: ArtCollection, b: ArtCollection) => b.pages.length - a.pages.length)\n .slice(0, limit);\n }\n\n /**\n * 获取所有可用分类\n * \n * 从后端API获取所有已定义的画集分类列表。\n * 用于构建分类筛选器和下拉菜单。\n * \n * @returns Promise<Array<{ name: string; description?: string | null }>> 分类名称数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * const categories = await MasterpiecesService.getCategories();\n * console.log('可用分类:', categories);\n * ```\n */\n static async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const response = await fetch('/api/showmasterpiece/categories');\n if (!response.ok) {\n throw new Error('获取分类失败');\n }\n const payload = await response.json();\n return Array.isArray(payload) ? payload : payload?.data ?? [];\n }\n\n /**\n * 获取所有可用标签\n * \n * 从后端API获取所有已定义的画集标签列表。\n * 用于构建标签筛选器和标签云。\n * \n * @returns Promise<string[]> 标签名称数组\n * @throws {Error} 当API请求失败时抛出错误\n * \n * @example\n * ```typescript\n * const tags = await MasterpiecesService.getTags();\n * console.log('可用标签:', tags);\n * ```\n */\n static async getTags(): Promise<string[]> {\n const response = await fetch('/api/showmasterpiece/tags');\n if (!response.ok) {\n throw new Error('获取标签失败');\n }\n return await response.json();\n }\n} \n","import type { \n MasterpiecesConfig, \n ArtCollection, \n ArtworkPage,\n CollectionFormData,\n ArtworkFormData \n} from '../../types';\n\n// 配置缓存\nlet configCache: MasterpiecesConfig | null = null;\nlet configCacheTime: number = 0;\nconst CONFIG_CACHE_DURATION = 5 * 60 * 1000; // 5分钟缓存\n\n// 配置管理\nexport const getConfig = async (): Promise<MasterpiecesConfig> => {\n // 检查缓存是否有效\n const now = Date.now();\n if (configCache && (now - configCacheTime) < CONFIG_CACHE_DURATION) {\n return configCache;\n }\n\n const response = await fetch('/api/showmasterpiece/config');\n if (!response.ok) {\n throw new Error('获取配置失败');\n }\n \n const config = await response.json();\n \n // 更新缓存\n configCache = config;\n configCacheTime = now;\n \n return config;\n};\n\nexport const updateConfig = async (configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> => {\n const response = await fetch('/api/showmasterpiece/config', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(configData),\n });\n \n if (!response.ok) {\n throw new Error('更新配置失败');\n }\n \n const updatedConfig = await response.json();\n \n // 更新缓存\n configCache = updatedConfig;\n configCacheTime = Date.now();\n \n return updatedConfig;\n};\n\nexport const resetConfig = async (): Promise<MasterpiecesConfig> => {\n const response = await fetch('/api/showmasterpiece/config', {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n throw new Error('重置配置失败');\n }\n \n const resetConfigData = await response.json();\n \n // 清除缓存\n configCache = resetConfigData;\n configCacheTime = Date.now();\n \n return resetConfigData;\n};\n\n// 画集管理\nexport const getAllCollections = async (): Promise<ArtCollection[]> => {\n console.log('📡 [服务] 开始获取所有画集...');\n \n try {\n // 添加时间戳参数防止缓存\n const timestamp = new Date().getTime();\n const response = await fetch(`/api/showmasterpiece/collections?_t=${timestamp}`, {\n method: 'GET',\n headers: {\n 'Cache-Control': 'no-cache',\n 'Pragma': 'no-cache'\n }\n });\n \n console.log('📡 [服务] 画集请求响应状态:', response.status);\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error('❌ [服务] 获取画集失败:', {\n status: response.status,\n statusText: response.statusText,\n error: errorText\n });\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n \n const payload = await response.json();\n const collections = Array.isArray(payload)\n ? payload\n : (payload?.collections ?? payload?.data ?? []);\n\n if (!Array.isArray(collections)) {\n throw new Error('画集数据格式不正确');\n }\n\n console.log('✅ [服务] 画集数据获取成功:', {\n count: collections.length,\n titles: collections.map((c: ArtCollection) => c.title)\n });\n\n return collections;\n } catch (error) {\n console.error('❌ [服务] 获取画集数据失败:', error);\n throw error;\n }\n};\n\nexport const createCollection = async (collectionData: CollectionFormData): Promise<ArtCollection> => {\n const requestBody = collectionData;\n \n const response = await fetch('/api/showmasterpiece/collections', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('创建画集失败');\n }\n return await response.json();\n};\n\nexport const updateCollection = async (id: number, collectionData: CollectionFormData): Promise<ArtCollection> => {\n const response = await fetch(`/api/showmasterpiece/collections/${id}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(collectionData),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('更新画集失败');\n }\n return await response.json();\n};\n\nexport const deleteCollection = async (id: number): Promise<void> => {\n const url = new URL(`/api/showmasterpiece/collections/${id}`, window.location.origin);\n \n const response = await fetch(url.toString(), {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || '删除画集失败');\n }\n};\n\n// 画集顺序管理\nexport const updateCollectionOrder = async (collectionOrders: { id: number; displayOrder: number }[]): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=reorder', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionOrders }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '更新画集顺序失败');\n }\n};\n\nexport const moveCollection = async (collectionId: number, targetOrder: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=move', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId, targetOrder }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '移动画集失败');\n }\n};\n\nexport const moveCollectionUp = async (collectionId: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=up', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '上移画集失败');\n }\n};\n\nexport const moveCollectionDown = async (collectionId: number): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/collections?action=down', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ collectionId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '下移画集失败');\n }\n};\n\n// 作品管理\nexport const addArtworkToCollection = async (collectionId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> => {\n console.log('🌐 [服务] 开始发送作品创建请求:', {\n collectionId,\n title: artworkData.title,\n number: artworkData.number,\n imageSize: artworkData.image ? `${artworkData.image.length} chars` : 'null'\n });\n \n const requestBody = JSON.stringify(artworkData);\n console.log('📦 [服务] 请求体大小:', `${requestBody.length} chars (${(requestBody.length / 1024).toFixed(1)} KB)`);\n \n try { \n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: requestBody,\n });\n \n console.log('📡 [服务] 收到HTTP响应:', {\n status: response.status,\n statusText: response.statusText,\n contentLength: response.headers.get('content-length'),\n contentType: response.headers.get('content-type')\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error('❌ [服务] HTTP请求失败:', {\n status: response.status,\n statusText: response.statusText,\n errorText: errorText.substring(0, 200)\n });\n \n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error(`添加作品失败: ${response.status} ${response.statusText}`);\n }\n \n const result = await response.json();\n console.log('✅ [服务] 作品创建成功:', {\n id: result.id,\n title: result.title,\n number: result.number\n });\n \n return result;\n \n } catch (error) {\n console.error('❌ [服务] 请求过程中发生错误:', error);\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new Error('网络连接失败,请检查网络连接后重试');\n }\n throw error;\n }\n};\n\nexport const updateArtwork = async (collectionId: number, artworkId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks/${artworkId}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(artworkData),\n });\n \n if (!response.ok) {\n if (response.status === 413) {\n throw new Error('图片文件太大,请选择更小的图片或等待图片压缩完成后重试');\n }\n throw new Error('更新作品失败');\n }\n return await response.json();\n};\n\nexport const deleteArtwork = async (collectionId: number, artworkId: number): Promise<void> => {\n const url = new URL(`/api/showmasterpiece/collections/${collectionId}/artworks/${artworkId}`, window.location.origin);\n \n const response = await fetch(url.toString(), {\n method: 'DELETE',\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || '删除作品失败');\n }\n};\n\n// 作品排序管理\nexport const getArtworksByCollection = async (collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> => {\n // 添加时间戳参数防止缓存\n const timestamp = new Date().getTime();\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?_t=${timestamp}`, {\n headers: {\n 'Cache-Control': 'no-cache',\n 'Pragma': 'no-cache'\n }\n });\n if (!response.ok) {\n throw new Error('获取作品列表失败');\n }\n return await response.json();\n};\n\nexport const updateArtworkOrder = async (collectionId: number, artworkOrders: { id: number; pageOrder: number }[]): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=reorder`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkOrders }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '更新作品顺序失败');\n }\n};\n\nexport const moveArtwork = async (collectionId: number, artworkId: number, targetOrder: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=move`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId, targetOrder }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '移动作品失败');\n }\n};\n\nexport const moveArtworkUp = async (collectionId: number, artworkId: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=up`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '上移作品失败');\n }\n};\n\nexport const moveArtworkDown = async (collectionId: number, artworkId: number): Promise<void> => {\n const response = await fetch(`/api/showmasterpiece/collections/${collectionId}/artworks?action=down`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ artworkId }),\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || '下移作品失败');\n }\n};\n\n// 分类和标签\nexport const getCategories = async (): Promise<Array<{ name: string; description?: string | null }>> => {\n const response = await fetch('/api/showmasterpiece/categories');\n if (!response.ok) {\n throw new Error('获取分类失败');\n }\n const payload = await response.json();\n const categories = Array.isArray(payload) ? payload : (payload?.data ?? []);\n if (!Array.isArray(categories)) {\n throw new Error('分类数据格式不正确');\n }\n return categories;\n};\n\nexport const createCategory = async (name: string, description?: string): Promise<void> => {\n const response = await fetch('/api/showmasterpiece/categories', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name, description }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.error || '创建分类失败');\n }\n};\n\nexport const getTags = async (): Promise<string[]> => {\n const response = await fetch('/api/showmasterpiece/tags');\n if (!response.ok) {\n throw new Error('获取标签失败');\n }\n return await response.json();\n};\n\n// 获取画集概览(不包含作品详情,用于列表展示)\nexport async function getCollectionsOverview(): Promise<Omit<ArtCollection, 'pages'>[]> {\n const response = await fetch('/api/showmasterpiece/collections?overview=true');\n if (!response.ok) {\n throw new Error('获取画集概览失败');\n }\n return response.json();\n} \n","/**\n * ShowMasterpiece 模块 - 购物车服务\n * \n * 提供购物车功能的前端本地存储服务,包括:\n * - 添加商品到购物车\n * - 更新购物车商品数量\n * - 从购物车移除商品\n * - 清空购物车\n * - 批量预订\n * \n * @fileoverview 购物车服务 - 本地存储版本\n */\n\nimport { \n Cart,\n AddToCartRequest,\n UpdateCartItemRequest,\n RemoveFromCartRequest,\n ClearCartRequest,\n BatchBookingRequest,\n BatchBookingResponse\n} from '../../types/cart';\nimport { saveCartHistory } from './cartHistoryService';\nimport { batchBooking as submitBatchBookingBySharedClient } from '../web/client';\n\n/**\n * 购物车本地存储键名\n */\nconst CART_STORAGE_KEY = 'showmasterpiece_cart';\n\n/**\n * 购物车服务类\n * \n * 提供购物车功能相关的本地存储操作方法\n */\nexport class CartService {\n /**\n * 获取购物车数据\n * \n * @param userId 用户ID\n * @returns 购物车数据\n */\n static async getCart(userId: number): Promise<Cart> {\n try {\n const storageKey = `${CART_STORAGE_KEY}_${userId}`;\n \n const cartData = localStorage.getItem(storageKey);\n if (cartData) {\n const parsed = JSON.parse(cartData);\n // 将字符串日期转换为Date对象\n if (parsed.items) {\n parsed.items = parsed.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }));\n }\n return parsed;\n }\n } catch (error) {\n console.error('读取购物车数据失败:', error);\n }\n \n // 返回空的购物车\n return {\n items: [],\n totalQuantity: 0,\n totalPrice: 0\n };\n }\n\n /**\n * 保存购物车数据到本地存储\n * \n * @param userId 用户ID\n * @param cart 购物车数据\n */\n private static saveCart(userId: number, cart: Cart): void {\n try {\n const storageKey = `${CART_STORAGE_KEY}_${userId}`;\n \n localStorage.setItem(storageKey, JSON.stringify(cart));\n } catch (error) {\n console.error('保存购物车数据失败:', error);\n }\n }\n\n /**\n * 计算购物车总数量和总价格\n * \n * @param items 购物车商品项\n * @returns 总数量和总价格\n */\n private static calculateTotals(items: Cart['items']): { totalQuantity: number; totalPrice: number } {\n let totalQuantity = 0;\n let totalPrice = 0;\n \n items.forEach(item => {\n totalQuantity += item.quantity;\n const itemPrice = (item.collection.price || 0) * item.quantity;\n totalPrice += itemPrice;\n });\n \n return { totalQuantity, totalPrice };\n }\n\n /**\n * 添加商品到购物车\n * \n * @param data 添加商品数据\n * @returns 更新后的购物车数据\n */\n static async addToCart(data: AddToCartRequest & { userId: number; collection?: any }): Promise<Cart> {\n const { userId, collectionId, quantity, collection } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 检查商品是否已在购物车中\n const existingItemIndex = cart.items.findIndex(item => item.collectionId === collectionId);\n \n if (existingItemIndex >= 0) {\n // 如果已存在,增加数量\n const existingItem = cart.items[existingItemIndex];\n if (existingItem) {\n existingItem.quantity += quantity;\n }\n } else {\n // 如果不存在,添加新项\n if (collection) {\n // 使用传入的完整画集信息\n cart.items.push({\n collectionId,\n collection,\n quantity,\n addedAt: new Date()\n });\n } else {\n // 如果没有传入画集信息,使用简化的数据结构\n cart.items.push({\n collectionId,\n collection: {\n id: collectionId,\n title: `画集${collectionId}`, // 临时标题,实际应该从画集数据中获取\n number: '未知编号',\n coverImage: '',\n description: '',\n pages: [],\n category: '画集' as any,\n tags: [],\n isPublished: true,\n price: 0\n },\n quantity,\n addedAt: new Date()\n });\n }\n }\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n \n return cart;\n }\n\n /**\n * 更新购物车商品数量\n * \n * @param data 更新商品数据\n * @returns 更新后的购物车数据\n */\n static async updateCartItem(data: UpdateCartItemRequest & { userId: number }): Promise<Cart> {\n const { userId, collectionId, quantity } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 查找商品项\n const itemIndex = cart.items.findIndex(item => item.collectionId === collectionId);\n \n if (itemIndex >= 0) {\n if (quantity <= 0) {\n // 如果数量为0或负数,移除商品\n cart.items.splice(itemIndex, 1);\n } else {\n // 更新数量\n const item = cart.items[itemIndex];\n if (item) {\n item.quantity = quantity;\n }\n }\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n }\n \n return cart;\n }\n\n /**\n * 从购物车移除商品\n * \n * @param data 移除商品数据\n * @returns 更新后的购物车数据\n */\n static async removeFromCart(data: RemoveFromCartRequest & { userId: number }): Promise<Cart> {\n const { userId, collectionId } = data;\n \n // 获取当前购物车\n const cart = await this.getCart(userId);\n \n // 移除商品\n cart.items = cart.items.filter(item => item.collectionId !== collectionId);\n \n // 重新计算总数量和总价格\n const { totalQuantity, totalPrice } = this.calculateTotals(cart.items);\n cart.totalQuantity = totalQuantity;\n cart.totalPrice = totalPrice;\n \n // 保存到本地存储\n this.saveCart(userId, cart);\n \n return cart;\n }\n\n /**\n * 清空购物车\n * \n * @param userId 用户ID\n * @returns 清空后的购物车数据\n */\n static async clearCart(userId: number): Promise<Cart> {\n const emptyCart: Cart = {\n items: [],\n totalQuantity: 0,\n totalPrice: 0\n };\n \n // 保存空的购物车到本地存储\n this.saveCart(userId, emptyCart);\n \n return emptyCart;\n }\n\n /**\n * 批量预订购物车中的商品\n * \n * @param data 批量预订数据\n * @param cart 当前购物车数据(用于保存历史记录)\n * @returns 预订结果\n */\n static async batchBooking(data: BatchBookingRequest, cart?: Cart): Promise<BatchBookingResponse> {\n console.log('🛒 [CartService] 批量预订:', { data });\n const result = await submitBatchBookingBySharedClient(data);\n\n // 如果预订成功且有购物车数据,保存历史记录\n if (result.successCount > 0 && cart) {\n try {\n await saveCartHistory({\n qqNumber: data.qqNumber,\n phoneNumber: data.phoneNumber,\n items: cart.items,\n totalQuantity: cart.totalQuantity,\n totalPrice: cart.totalPrice,\n notes: data.notes,\n pickupMethod: data.pickupMethod,\n status: 'pending',\n bookingIds: result.bookingIds,\n submittedAt: new Date()\n });\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n // 不影响预订流程,只记录错误\n }\n }\n\n return result;\n }\n}\n\n/**\n * 购物车服务函数集\n * \n * 提供函数式的API调用接口,作为服务类的补充。\n */\n\n/**\n * 获取购物车数据\n * \n * @param userId 用户ID\n * @returns 购物车数据\n */\nexport const getCart = (userId: number): Promise<Cart> => {\n return CartService.getCart(userId);\n};\n\n/**\n * 添加商品到购物车\n * \n * @param data 添加商品数据\n * @returns 更新后的购物车数据\n */\nexport const addToCart = (data: AddToCartRequest & { userId: number }): Promise<Cart> => {\n return CartService.addToCart(data);\n};\n\n/**\n * 更新购物车商品数量\n * \n * @param data 更新商品数据\n * @returns 更新后的购物车数据\n */\nexport const updateCartItem = (data: UpdateCartItemRequest & { userId: number }): Promise<Cart> => {\n return CartService.updateCartItem(data);\n};\n\n/**\n * 从购物车移除商品\n * \n * @param data 移除商品数据\n * @returns 更新后的购物车数据\n */\nexport const removeFromCart = (data: RemoveFromCartRequest & { userId: number }): Promise<Cart> => {\n return CartService.removeFromCart(data);\n};\n\n/**\n * 清空购物车\n * \n * @param userId 用户ID\n * @returns 清空后的购物车数据\n */\nexport const clearCart = (userId: number): Promise<Cart> => {\n return CartService.clearCart(userId);\n};\n\n/**\n * 批量预订购物车中的商品\n * \n * @param data 批量预订数据\n * @param cart 当前购物车数据(用于保存历史记录)\n * @returns 预订结果\n */\nexport const batchBooking = (data: BatchBookingRequest, cart?: Cart): Promise<BatchBookingResponse> => {\n return CartService.batchBooking(data, cart);\n}; \n","/**\n * ShowMasterpiece 模块 - 购物车历史记录服务\n * \n * 提供用户购物车历史记录功能,包括:\n * - 保存用户提交的购物车数据\n * - 获取用户历史记录\n * - 更新预订状态\n * - 本地存储管理\n * \n * @fileoverview 购物车历史记录服务\n */\n\nimport { \n CartHistoryItem, \n CartHistory, \n CartItem,\n BatchBookingResponse \n} from '../../types/cart';\n\n/**\n * 购物车历史记录本地存储键名基础\n */\nconst CART_HISTORY_STORAGE_KEY_BASE = 'showmasterpiece_cart_history';\n\n/**\n * 默认的购物车历史记录存储键(向后兼容)\n */\nconst CART_HISTORY_STORAGE_KEY = CART_HISTORY_STORAGE_KEY_BASE;\n\n\n/**\n * 购物车历史记录服务类\n * \n * 提供购物车历史记录相关的本地存储操作方法\n */\nexport class CartHistoryService {\n /**\n * 生成唯一ID\n */\n // static generateId(): string {\n // return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n // }\n\n /**\n * 获取用户购物车历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @returns 购物车历史记录\n */\n static async getCartHistory(qqNumber: string, phoneNumber: string): Promise<CartHistory> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤当前用户的历史记录\n const userHistory = allHistory.filter(record => \n record.qqNumber === qqNumber && record.phoneNumber === phoneNumber\n );\n\n // 将字符串日期转换为Date对象\n const processedHistory = userHistory.map(record => ({\n ...record,\n submittedAt: new Date(record.submittedAt),\n items: record.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }))\n }));\n\n // 按提交时间倒序排列\n processedHistory.sort((a, b) => b.submittedAt.getTime() - a.submittedAt.getTime());\n\n return {\n records: processedHistory,\n totalRecords: processedHistory.length\n };\n }\n } catch (error) {\n console.error('读取购物车历史记录失败:', error);\n }\n \n return {\n records: [],\n totalRecords: 0\n };\n }\n\n /**\n * 保存购物车历史记录\n * \n * @param historyItem 历史记录项\n */\n static async saveCartHistory(historyItem: Omit<CartHistoryItem, 'id'>): Promise<CartHistoryItem> {\n try {\n // 直接在函数内生成ID,避免this上下文问题\n const generateId = () => `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n const newHistoryItem: CartHistoryItem = {\n ...historyItem,\n id: generateId(),\n submittedAt: new Date()\n };\n\n // 获取现有历史记录\n const existingData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n const allHistory: CartHistoryItem[] = existingData ? JSON.parse(existingData) : [];\n\n // 添加新记录\n allHistory.push(newHistoryItem);\n\n // 保存到本地存储\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 购物车历史记录保存成功:', { \n id: newHistoryItem.id,\n qqNumber: newHistoryItem.qqNumber,\n itemCount: newHistoryItem.items.length\n });\n\n return newHistoryItem;\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n throw new Error('保存购物车历史记录失败');\n }\n }\n\n /**\n * 更新预订状态\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @param historyId 历史记录ID\n * @param status 新状态\n * @param bookingIds 预订ID列表\n */\n static async updateBookingStatus(\n qqNumber: string, \n phoneNumber: string, \n historyId: string, \n status: CartHistoryItem['status'],\n bookingIds?: number[]\n ): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 找到并更新指定记录\n const recordIndex = allHistory.findIndex(record => \n record.id === historyId && \n record.qqNumber === qqNumber && \n record.phoneNumber === phoneNumber\n );\n\n if (recordIndex !== -1) {\n const record = allHistory[recordIndex];\n if (!record) {\n return;\n }\n record.status = status;\n if (bookingIds) {\n record.bookingIds = bookingIds;\n }\n\n // 保存更新后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 预订状态更新成功:', { \n historyId, \n status, \n bookingIds \n });\n }\n }\n } catch (error) {\n console.error('更新预订状态失败:', error);\n throw new Error('更新预订状态失败');\n }\n }\n\n /**\n * 删除历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n * @param historyId 历史记录ID\n */\n static async deleteHistoryRecord(\n qqNumber: string, \n phoneNumber: string, \n historyId: string\n ): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤掉要删除的记录\n const filteredHistory = allHistory.filter(record => \n !(record.id === historyId && \n record.qqNumber === qqNumber && \n record.phoneNumber === phoneNumber)\n );\n\n // 保存过滤后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(filteredHistory));\n\n console.log('✅ 历史记录删除成功:', { historyId });\n }\n } catch (error) {\n console.error('删除历史记录失败:', error);\n throw new Error('删除历史记录失败');\n }\n }\n\n /**\n * 清空用户所有历史记录\n * \n * @param qqNumber 用户QQ号\n * @param phoneNumber 用户手机号\n */\n static async clearUserHistory(qqNumber: string, phoneNumber: string): Promise<void> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 过滤掉当前用户的所有记录\n const filteredHistory = allHistory.filter(record => \n !(record.qqNumber === qqNumber && record.phoneNumber === phoneNumber)\n );\n\n // 保存过滤后的数据\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(filteredHistory));\n\n console.log('✅ 用户历史记录清空成功:', { qqNumber, phoneNumber });\n }\n } catch (error) {\n console.error('清空用户历史记录失败:', error);\n throw new Error('清空用户历史记录失败');\n }\n }\n\n /**\n * 获取所有历史记录(管理员功能)\n */\n static async getAllHistory(): Promise<CartHistoryItem[]> {\n try {\n const historyData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n if (historyData) {\n const allHistory: CartHistoryItem[] = JSON.parse(historyData);\n \n // 将字符串日期转换为Date对象\n return allHistory.map(record => ({\n ...record,\n submittedAt: new Date(record.submittedAt),\n items: record.items.map((item: any) => ({\n ...item,\n addedAt: new Date(item.addedAt)\n }))\n }));\n }\n } catch (error) {\n console.error('读取所有历史记录失败:', error);\n }\n \n return [];\n }\n\n /**\n * 获取统计数据\n */\n static async getStatistics(): Promise<{\n totalRecords: number;\n totalUsers: number;\n totalItems: number;\n totalRevenue: number;\n }> {\n try {\n const allHistory = await this.getAllHistory();\n \n const totalRecords = allHistory.length;\n const uniqueUsers = new Set(\n allHistory.map(record => `${record.qqNumber}_${record.phoneNumber}`)\n );\n const totalUsers = uniqueUsers.size;\n \n let totalItems = 0;\n let totalRevenue = 0;\n \n allHistory.forEach(record => {\n totalItems += record.totalQuantity;\n totalRevenue += record.totalPrice;\n });\n\n return {\n totalRecords,\n totalUsers,\n totalItems,\n totalRevenue\n };\n } catch (error) {\n console.error('获取统计数据失败:', error);\n return {\n totalRecords: 0,\n totalUsers: 0,\n totalItems: 0,\n totalRevenue: 0\n };\n }\n }\n}\n\n// 导出单独的函数,方便直接导入使用\nexport const getCartHistory = CartHistoryService.getCartHistory;\nexport const updateBookingStatus = CartHistoryService.updateBookingStatus;\nexport const deleteHistoryRecord = CartHistoryService.deleteHistoryRecord;\nexport const clearUserHistory = CartHistoryService.clearUserHistory;\nexport const getAllHistory = CartHistoryService.getAllHistory;\nexport const getStatistics = CartHistoryService.getStatistics;\n\n// 独立的saveCartHistory函数,避免类方法绑定问题\nexport const saveCartHistory = async (historyItem: Omit<CartHistoryItem, 'id'>): Promise<CartHistoryItem> => {\n try {\n // 生成唯一ID\n const generateId = () => `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n const newHistoryItem: CartHistoryItem = {\n ...historyItem,\n id: generateId(),\n submittedAt: new Date()\n };\n\n // 获取现有历史记录\n const existingData = localStorage.getItem(CART_HISTORY_STORAGE_KEY);\n const allHistory: CartHistoryItem[] = existingData ? JSON.parse(existingData) : [];\n\n // 添加新记录\n allHistory.push(newHistoryItem);\n\n // 保存到本地存储\n localStorage.setItem(CART_HISTORY_STORAGE_KEY, JSON.stringify(allHistory));\n\n console.log('✅ 购物车历史记录保存成功:', { \n id: newHistoryItem.id,\n qqNumber: newHistoryItem.qqNumber,\n itemCount: newHistoryItem.items.length\n });\n\n return newHistoryItem;\n } catch (error) {\n console.error('保存购物车历史记录失败:', error);\n throw new Error('保存购物车历史记录失败');\n }\n}; \n","/**\n * ShowMasterpiece 模块 - 预订服务\n */\n\nimport {\n Booking,\n CreateBookingRequest,\n UpdateBookingRequest,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n} from '../../types/booking';\nimport {\n createBooking as createBookingBySharedClient,\n getBookableCollections as getBookableCollectionsBySharedClient,\n getBookings as getBookingsBySharedClient,\n} from '../web/client';\n\nexport type BookingCredentials = Pick<BookingListParams, 'qqNumber' | 'phoneNumber'>;\n\nfunction appendBookingCredentials(\n path: string,\n credentials?: BookingCredentials,\n): string {\n if (!credentials?.qqNumber?.trim() || !credentials?.phoneNumber?.trim()) {\n return path;\n }\n const params = new URLSearchParams({\n qqNumber: credentials.qqNumber.trim(),\n phoneNumber: credentials.phoneNumber.trim(),\n });\n return `${path}?${params.toString()}`;\n}\n\nfunction bookingCredentialsBody(credentials?: BookingCredentials): string | undefined {\n if (!credentials?.qqNumber?.trim() || !credentials?.phoneNumber?.trim()) {\n return undefined;\n }\n return JSON.stringify({\n qqNumber: credentials.qqNumber.trim(),\n phoneNumber: credentials.phoneNumber.trim(),\n });\n}\n\nasync function parseErrorMessage(response: Response, fallback: string): Promise<string> {\n const data = await response.json().catch(() => ({}));\n if (typeof data?.error === 'string' && data.error) return data.error;\n if (typeof data?.message === 'string' && data.message) return data.message;\n return fallback;\n}\n\nexport class BookingService {\n private static readonly BASE_URL = '/api/showmasterpiece/bookings';\n\n static async createBooking(data: CreateBookingRequest): Promise<Booking> {\n return createBookingBySharedClient(data);\n }\n\n static async getBookings(params: BookingListParams = {}): Promise<BookingListResponse> {\n return getBookingsBySharedClient(params);\n }\n\n static async getBooking(\n id: number,\n credentials?: BookingCredentials,\n ): Promise<Booking> {\n const url = appendBookingCredentials(`${this.BASE_URL}/${id}`, credentials);\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(await parseErrorMessage(response, '获取预订详情失败'));\n }\n\n return response.json();\n }\n\n static async updateBooking(id: number, data: UpdateBookingRequest): Promise<Booking> {\n const response = await fetch(`${this.BASE_URL}/${id}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(await parseErrorMessage(response, '更新预订失败'));\n }\n\n return response.json();\n }\n\n /**\n * 删除预订(须携带与下单一致的 QQ + 手机号,与 profile-v1 API 约定一致)\n */\n static async deleteBooking(\n id: number,\n credentials: BookingCredentials,\n ): Promise<void> {\n const url = appendBookingCredentials(`${this.BASE_URL}/${id}`, credentials);\n const body = bookingCredentialsBody(credentials);\n\n const response = await fetch(url, {\n method: 'DELETE',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body,\n });\n\n if (!response.ok) {\n throw new Error(await parseErrorMessage(response, '删除预订失败'));\n }\n }\n\n static async getBookableCollections(): Promise<CollectionSummary[]> {\n return getBookableCollectionsBySharedClient();\n }\n}\n\nexport const createBooking = (data: CreateBookingRequest): Promise<Booking> =>\n BookingService.createBooking(data);\n\nexport const getBookings = (params?: BookingListParams): Promise<BookingListResponse> =>\n BookingService.getBookings(params);\n\nexport const getBooking = (\n id: number,\n credentials?: BookingCredentials,\n): Promise<Booking> => BookingService.getBooking(id, credentials);\n\nexport const updateBooking = (id: number, data: UpdateBookingRequest): Promise<Booking> =>\n BookingService.updateBooking(id, data);\n\nexport const deleteBooking = (\n id: number,\n credentials: BookingCredentials,\n): Promise<void> => BookingService.deleteBooking(id, credentials);\n\nexport const getBookableCollections = (): Promise<CollectionSummary[]> =>\n BookingService.getBookableCollections();\n","/**\n * ShowMasterpiece 模块 - 预订管理服务\n * \n * 提供预订管理相关的类型定义和服务函数\n * \n * @fileoverview 预订管理服务\n */\n\nimport { BookingStatus } from '../../types/booking';\n\n/**\n * 预订管理数据接口\n */\nexport interface BookingAdminData {\n /** 预订ID */\n id: number;\n /** 用户ID */\n userId: number;\n /** 用户名 */\n userName: string;\n /** 用户手机号 */\n userPhone: string;\n /** QQ号 */\n qqNumber?: string;\n /** 手机号 */\n phoneNumber?: string;\n /** 画集ID */\n collectionId: number;\n /** 画集标题 */\n collectionTitle: string;\n /** 画集编号 */\n collectionNumber: string;\n /** 画集信息 */\n collection: {\n /** 画集ID */\n id: number;\n /** 画集标题 */\n title: string;\n /** 画集编号 */\n number: string;\n /** 封面图片 */\n coverImage: string;\n /** 价格 */\n price: number;\n };\n /** 预订状态 */\n status: BookingStatus;\n /** 预订时间 */\n bookingTime: string;\n /** 更新时间 */\n updatedAt: string;\n /** 创建时间 */\n createdAt: string;\n /** 管理员备注 */\n adminNotes?: string;\n /** 用户备注 */\n notes?: string;\n /** 领取方式 */\n pickupMethod?: string;\n /** 数量 */\n quantity: number;\n /** 价格 */\n price: number;\n /** 总价格 */\n totalPrice: number;\n /** 确认时间 */\n confirmedAt?: string;\n /** 完成时间 */\n completedAt?: string;\n /** 取消时间 */\n cancelledAt?: string;\n}\n\n/**\n * 预订管理统计信息接口\n */\nexport interface BookingAdminStats {\n /** 总预订数 */\n totalBookings: number;\n /** 待处理预订数 */\n pendingBookings: number;\n /** 已确认预订数 */\n confirmedBookings: number;\n /** 已完成预订数 */\n completedBookings: number;\n /** 已取消预订数 */\n cancelledBookings: number;\n /** 总金额 */\n totalAmount: number;\n /** 总收入 */\n totalRevenue: number;\n /** 总数量 */\n totalQuantity: number;\n /** 今日新增预订数 */\n todayBookings: number;\n /** 本周新增预订数 */\n weekBookings: number;\n}\n\n/**\n * 预订管理接口响应类型\n */\nexport interface BookingAdminResponse {\n bookings: BookingAdminData[];\n stats: BookingAdminStats;\n}\n\n/**\n * 预订管理查询参数\n */\nexport interface BookingAdminQueryParams {\n /** QQ号搜索 */\n qqNumber?: string;\n /** 手机号搜索 */\n phoneNumber?: string;\n /** 状态过滤 */\n status?: BookingStatus | 'all';\n}\n\n/**\n * 预订管理服务类\n */\nexport class BookingAdminService {\n /**\n * 获取所有预订数据\n */\n static async getAllBookings(params?: BookingAdminQueryParams): Promise<BookingAdminData[]> {\n try {\n // 添加时间戳参数防止缓存\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'GET',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest'\n }\n });\n if (!response.ok) {\n throw new Error('获取预订数据失败');\n }\n const data = await response.json();\n return data.bookings || [];\n } catch (error) {\n console.error('获取预订数据失败:', error);\n throw error;\n }\n }\n\n /**\n * 强制刷新获取所有预订数据(绕过所有缓存)\n */\n static async forceRefreshAllBookings(params?: BookingAdminQueryParams): Promise<BookingAdminData[]> {\n try {\n console.log('🔄 使用强制刷新API获取预订数据...');\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'POST',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Force-Refresh': 'true'\n }\n });\n if (!response.ok) {\n throw new Error('强制刷新获取预订数据失败');\n }\n const data = await response.json();\n console.log('🔄 强制刷新API响应:', { \n bookingsCount: data.bookings?.length || 0,\n timestamp: data._timestamp,\n refreshType: data._refreshType\n });\n return data.bookings || [];\n } catch (error) {\n console.error('强制刷新获取预订数据失败:', error);\n throw error;\n }\n }\n\n /**\n * 获取预订统计信息\n */\n static async getBookingStats(params?: BookingAdminQueryParams): Promise<BookingAdminStats> {\n try {\n // 添加时间戳参数防止缓存\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'GET',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest'\n }\n });\n if (!response.ok) {\n throw new Error('获取统计信息失败');\n }\n const data = await response.json();\n return data.stats || {\n totalBookings: 0,\n pendingBookings: 0,\n confirmedBookings: 0,\n completedBookings: 0,\n cancelledBookings: 0,\n totalQuantity: 0,\n totalRevenue: 0,\n totalAmount: 0,\n todayBookings: 0,\n weekBookings: 0,\n };\n } catch (error) {\n console.error('获取统计信息失败:', error);\n throw error;\n }\n }\n\n /**\n * 强制刷新获取预订统计信息(绕过所有缓存)\n */\n static async forceRefreshBookingStats(params?: BookingAdminQueryParams): Promise<BookingAdminStats> {\n try {\n console.log('🔄 使用强制刷新API获取统计信息...');\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(7);\n \n // 构建查询参数\n const searchParams = new URLSearchParams();\n searchParams.append('t', timestamp.toString());\n searchParams.append('forceRefresh', randomId);\n \n if (params?.qqNumber) {\n searchParams.append('qqNumber', params.qqNumber);\n }\n if (params?.phoneNumber) {\n searchParams.append('phoneNumber', params.phoneNumber);\n }\n if (params?.status && params.status !== 'all') {\n searchParams.append('status', params.status);\n }\n \n \n const response = await fetch(`/api/showmasterpiece/bookings/admin?${searchParams.toString()}`, {\n method: 'POST',\n cache: 'no-store',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n 'Pragma': 'no-cache',\n 'Expires': '0',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Force-Refresh': 'true'\n }\n });\n if (!response.ok) {\n throw new Error('强制刷新获取统计信息失败');\n }\n const data = await response.json();\n console.log('🔄 强制刷新统计信息响应:', { \n stats: data.stats,\n timestamp: data._timestamp,\n refreshType: data._refreshType\n });\n return data.stats || {\n totalBookings: 0,\n pendingBookings: 0,\n confirmedBookings: 0,\n completedBookings: 0,\n cancelledBookings: 0,\n totalQuantity: 0,\n totalRevenue: 0,\n totalAmount: 0,\n todayBookings: 0,\n weekBookings: 0,\n };\n } catch (error) {\n console.error('强制刷新获取统计信息失败:', error);\n throw error;\n }\n }\n\n /**\n * 更新预订状态\n */\n static async updateBookingStatus(\n bookingId: number, \n status: BookingStatus, \n adminNotes?: string\n ): Promise<void> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/${bookingId}/status`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ status, adminNotes }),\n });\n \n if (!response.ok) {\n throw new Error('更新预订状态失败');\n }\n } catch (error) {\n console.error('更新预订状态失败:', error);\n throw error;\n }\n }\n\n /**\n * 删除预订\n */\n static async deleteBooking(bookingId: number): Promise<void> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/${bookingId}`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || '删除预订失败');\n }\n \n console.log('✅ 预订删除成功:', { bookingId });\n } catch (error) {\n console.error('删除预订失败:', error);\n throw error;\n }\n }\n\n /**\n * 导出预订数据\n */\n static async exportBookings(format: 'csv' | 'excel' = 'csv'): Promise<Blob> {\n try {\n const response = await fetch(`/api/showmasterpiece/bookings/admin/export?format=${format}`);\n if (!response.ok) {\n throw new Error('导出预订数据失败');\n }\n return await response.blob();\n } catch (error) {\n console.error('导出预订数据失败:', error);\n throw error;\n }\n }\n}\n\n// 导出单独的函数,方便直接导入使用\nexport const getAllBookings = BookingAdminService.getAllBookings;\nexport const getBookingStats = BookingAdminService.getBookingStats;\nexport const forceRefreshAllBookings = BookingAdminService.forceRefreshAllBookings;\nexport const forceRefreshBookingStats = BookingAdminService.forceRefreshBookingStats;\nexport const updateBookingStatus = BookingAdminService.updateBookingStatus;\nexport const deleteBooking = BookingAdminService.deleteBooking;\nexport const exportBookings = BookingAdminService.exportBookings; \n","/**\n * EventAwareMasterpiecesService - 兼容层\n *\n * 为了向下兼容旧接口保留该服务,但已移除活动参数支持。\n */\n\nimport { MasterpiecesService } from './masterpiecesService';\nimport type { ArtCollection } from '../../types';\n\n/**\n * 活动感知的美术作品服务类\n */\nexport class EventAwareMasterpiecesService {\n /**\n * 获取所有画集数据\n *\n * @returns Promise<ArtCollection[]> 画集数组\n */\n static async getAllCollections(): Promise<ArtCollection[]> {\n return MasterpiecesService.getAllCollections();\n }\n\n /**\n * 根据ID获取特定画集\n *\n * @param id 画集ID\n * @returns Promise<ArtCollection | null> 画集对象或null\n */\n static async getCollectionById(id: number): Promise<ArtCollection | null> {\n return MasterpiecesService.getCollectionById(id);\n }\n\n /**\n * 根据分类获取画集\n *\n * @param category 分类名称\n * @returns Promise<ArtCollection[]> 指定分类的画集数组\n */\n static async getCollectionsByCategory(category: string): Promise<ArtCollection[]> {\n return MasterpiecesService.getCollectionsByCategory(category);\n }\n\n /**\n * 搜索画集\n *\n * @param query 搜索关键词\n * @returns Promise<ArtCollection[]> 搜索结果数组\n */\n static async searchCollections(query: string): Promise<ArtCollection[]> {\n return MasterpiecesService.searchCollections(query);\n }\n\n /**\n * 获取推荐画集\n *\n * @param currentCollectionId 当前画集ID\n * @param limit 推荐数量限制\n * @returns Promise<ArtCollection[]> 推荐画集数组\n */\n static async getRecommendedCollections(\n currentCollectionId: number,\n limit: number = 4\n ): Promise<ArtCollection[]> {\n void currentCollectionId;\n return MasterpiecesService.getRecommendedCollections(limit);\n }\n}\n\n// 为了向下兼容,也导出原有的函数式接口\nexport const getEventAwareMasterpieces = async (): Promise<ArtCollection[]> => {\n return EventAwareMasterpiecesService.getAllCollections();\n};\n","/**\n * ShowMasterpiece 模块 - 导出配置\n * \n * 定义预订信息的导出字段配置\n */\n\nimport type { ExportField } from '@/universalExport';\n\n/**\n * 预订信息导出字段定义\n */\nexport const BOOKING_EXPORT_FIELDS: ExportField[] = [\n {\n key: 'id',\n label: '预订ID',\n type: 'number',\n enabled: true,\n required: true,\n description: '预订记录的唯一标识',\n alignment: 'center',\n },\n {\n key: 'collectionId',\n label: '画集ID',\n type: 'number',\n enabled: true,\n required: true,\n description: '画集的唯一标识',\n alignment: 'center',\n },\n {\n key: 'qqNumber',\n label: 'QQ号',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户的QQ号码',\n alignment: 'left',\n },\n {\n key: 'phoneNumber',\n label: '手机号',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户的手机号码',\n alignment: 'left',\n },\n\n {\n key: 'collectionTitle',\n label: '画集标题',\n type: 'string',\n enabled: true,\n required: true,\n description: '预订的画集标题',\n alignment: 'left',\n },\n {\n key: 'collectionNumber',\n label: '画集编号',\n type: 'string',\n enabled: true,\n required: true,\n description: '画集的编号',\n alignment: 'left',\n },\n {\n key: 'collectionPrice',\n label: '画集价格',\n type: 'number',\n enabled: true,\n required: true,\n description: '画集的价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'status',\n label: '预订状态',\n type: 'string',\n enabled: true,\n required: true,\n description: '预订的当前状态',\n alignment: 'center',\n formatter: (value: any) => {\n const statusMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消',\n };\n return statusMap[value] || value;\n },\n },\n {\n key: 'quantity',\n label: '预订数量',\n type: 'number',\n enabled: true,\n required: true,\n description: '预订的数量',\n alignment: 'center',\n },\n {\n key: 'price',\n label: '单价',\n type: 'number',\n enabled: true,\n required: true,\n description: '单个画集的价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'totalPrice',\n label: '总价格',\n type: 'number',\n enabled: true,\n required: true,\n description: '总价格(单价 × 数量)',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value).toFixed(2)}`,\n },\n {\n key: 'notes',\n label: '用户备注',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户提交的备注信息',\n alignment: 'left',\n },\n {\n key: 'pickupMethod',\n label: '领取方式',\n type: 'string',\n enabled: true,\n required: false,\n description: '用户选择的领取方式',\n alignment: 'left',\n },\n {\n key: 'adminNotes',\n label: '管理员备注',\n type: 'string',\n enabled: true,\n required: false,\n description: '管理员添加的备注信息',\n alignment: 'left',\n },\n\n {\n key: 'createdAt',\n label: '创建时间',\n type: 'date',\n enabled: true,\n required: true,\n description: '预订创建的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'updatedAt',\n label: '更新时间',\n type: 'date',\n enabled: true,\n required: true,\n description: '预订最后更新的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'confirmedAt',\n label: '确认时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订确认的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'completedAt',\n label: '完成时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订完成的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'cancelledAt',\n label: '取消时间',\n type: 'date',\n enabled: true,\n required: false,\n description: '预订取消的时间',\n alignment: 'center',\n formatter: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n },\n {\n key: 'userTotalPrice',\n label: '用户总价',\n type: 'number',\n enabled: false, // 默认不启用,需要勾选才启用\n required: false,\n description: '根据QQ号和手机号统一匹配的该用户所有预订商品的总价格',\n alignment: 'right',\n formatter: (value: any) => `¥${Number(value || 0).toFixed(2)}`,\n },\n];\n\n/**\n * 默认导出配置\n */\nexport const DEFAULT_BOOKING_EXPORT_CONFIG = {\n id: 'default_booking_export',\n name: '预订信息导出',\n description: '导出所有预订信息为Excel格式,支持QQ号和手机号合并单元格',\n format: 'excel' as const,\n fields: BOOKING_EXPORT_FIELDS,\n grouping: {\n enabled: true,\n fields: [\n {\n key: 'phoneNumber',\n label: '手机号',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n },\n {\n key: 'qqNumber',\n label: 'QQ号',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n },\n {\n key: 'userTotalPrice',\n label: '用户总价',\n mode: 'merge' as const,\n valueProcessing: 'first' as const,\n showGroupHeader: false,\n mergeCells: true\n }\n ],\n preserveOrder: true,\n nullValueHandling: 'separate' as const,\n },\n fileNameTemplate: '预订信息_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId: 'showmasterpiece',\n businessId: 'bookings',\n}; \n","/**\n * ShowMasterpiece模块 - 文件服务配置\n * \n * 为ShowMasterpiece模块提供特定的文件服务配置和帮助函数\n */\n\nimport { createFileServiceConfig, createFileServiceConfigWithConfigManager } from '@/services/universalFile/config';\n\nimport type { LocalStorageConfig, AliyunOSSConfig, StorageConfig } from '@/services/universalFile/types';\n\n// 缓存ConfigManager实例,避免重复创建\nlet cachedConfigManager: Awaited<ReturnType<typeof createFileServiceConfigWithConfigManager>> | null = null;\n\n/**\n * 从showmasterpiece独立配置获取OSS配置\n */\nasync function getShowmasterpieceOSSConfig() {\n try {\n console.log('🎨 [ShowMasterpiece] 尝试从独立配置读取OSS配置...');\n \n const environment = process.env.NODE_ENV === 'production' ? 'production' : 'development';\n console.log(`🎨 [ShowMasterpiece] 当前环境: ${environment}`);\n \n // 检查是否在服务器端环境\n if (typeof window !== 'undefined') {\n // 客户端环境:通过API读取配置\n console.log('🌐 [ShowMasterpiece] 客户端环境,通过API读取配置');\n \n const configKeys = 'ALIYUN_OSS_REGION,ALIYUN_OSS_BUCKET,ALIYUN_OSS_ACCESS_KEY_ID,ALIYUN_OSS_ACCESS_KEY_SECRET,ALIYUN_OSS_CUSTOM_DOMAIN,ALIYUN_OSS_SECURE,ALIYUN_OSS_INTERNAL';\n const response = await fetch(`/api/showmasterpiece/config/items?environment=${environment}&keys=${configKeys}`);\n \n if (!response.ok) {\n console.warn('⚠️ [ShowMasterpiece] 读取独立配置API失败:', response.status);\n return null;\n }\n \n const data = await response.json();\n if (!data.success || !data.items) {\n console.warn('⚠️ [ShowMasterpiece] 独立配置API响应异常:', data);\n return null;\n }\n\n // 将配置项数组转换为对象\n const configMap: Record<string, string> = {};\n data.items.forEach((item: any) => {\n if (item.value) {\n configMap[item.key] = item.value;\n }\n });\n\n const ossConfig = {\n region: configMap['ALIYUN_OSS_REGION'],\n bucket: configMap['ALIYUN_OSS_BUCKET'],\n accessKeyId: configMap['ALIYUN_OSS_ACCESS_KEY_ID'],\n accessKeySecret: configMap['ALIYUN_OSS_ACCESS_KEY_SECRET'],\n customDomain: configMap['ALIYUN_OSS_CUSTOM_DOMAIN'],\n secure: configMap['ALIYUN_OSS_SECURE'] === 'true',\n internal: configMap['ALIYUN_OSS_INTERNAL'] === 'true'\n };\n\n console.log('🎨 [ShowMasterpiece] 独立配置读取结果:', {\n region: ossConfig.region || '未配置',\n bucket: ossConfig.bucket || '未配置',\n accessKeyId: ossConfig.accessKeyId ? '***' : '未配置',\n accessKeySecret: ossConfig.accessKeySecret ? '***' : '未配置',\n customDomain: ossConfig.customDomain || '未配置',\n secure: ossConfig.secure,\n internal: ossConfig.internal\n });\n\n // 检查必要配置是否完整\n if (ossConfig.region && ossConfig.bucket && ossConfig.accessKeyId && ossConfig.accessKeySecret) {\n console.log('✅ [ShowMasterpiece] 独立配置完整,将使用独立OSS配置');\n return ossConfig;\n } else {\n console.log('⚠️ [ShowMasterpiece] 独立配置不完整,将回退到公共配置');\n console.log('🔍 [ShowMasterpiece] 缺失配置项:', {\n region: !ossConfig.region,\n bucket: !ossConfig.bucket,\n accessKeyId: !ossConfig.accessKeyId,\n accessKeySecret: !ossConfig.accessKeySecret\n });\n return null;\n }\n } else {\n // 服务器端环境:当前 sa2kit 未提供独立配置服务,回退到默认配置\n console.log('🖥️ [ShowMasterpiece] 服务器端环境,使用默认配置回退');\n return null;\n }\n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 读取独立配置失败:', error);\n return null;\n }\n}\n\n/**\n * 获取缓存的ConfigManager实例\n */\nasync function getCachedConfigManager() {\n if (!cachedConfigManager) {\n // 尝试从showmasterpiece独立配置创建配置管理器\n const showmasterpieceOSSConfig = await getShowmasterpieceOSSConfig();\n \n if (showmasterpieceOSSConfig) {\n console.log('🎨 [ShowMasterpiece] 使用独立OSS配置创建配置管理器');\n \n // 使用独立配置创建配置管理器\n cachedConfigManager = await createFileServiceConfig({\n defaultStorage: 'aliyun-oss',\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: false,\n rootPath: 'uploads',\n baseUrl: '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: true,\n ...showmasterpieceOSSConfig\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n }\n });\n } else {\n console.log('🎨 [ShowMasterpiece] 独立配置不完整,使用默认配置');\n // 使用默认配置(主要从环境变量读取)\n cachedConfigManager = await createFileServiceConfig({\n defaultStorage: 'local', // 默认使用本地存储\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: true,\n rootPath: 'uploads',\n baseUrl: '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: false // 如果独立配置失败,禁用OSS\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n }\n });\n }\n }\n return cachedConfigManager;\n}\n\n/**\n * 获取ShowMasterpiece模块的文件服务配置\n */\nexport async function getShowMasterpieceFileConfig() {\n const configManager = await getCachedConfigManager();\n \n // 检查是否有OSS配置,如果有则优先使用OSS\n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n console.log('✅ [ShowMasterpiece] 使用阿里云OSS存储');\n return configManager;\n } else {\n console.log('ℹ️ [ShowMasterpiece] OSS未配置,使用本地存储');\n return configManager;\n }\n}\n\n/**\n * 上传ShowMasterpiece作品图片\n */\nexport async function uploadArtworkImage(file: File, collectionId?: number): Promise<{\n fileId: string;\n accessUrl: string;\n}> {\n console.log('🎨 [ShowMasterpiece] 开始上传作品图片:', file.name);\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', file);\n formData.append('moduleId', 'showmasterpiece');\n formData.append('businessId', collectionId ? `collection-${collectionId}` : 'artwork');\n\n // 为作品图片生成包含扩展名的路径,确保被正确识别为图片文件\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substr(2, 9);\n const extension = file.name.split('.').pop()?.toLowerCase() || 'jpg';\n const basePath = collectionId ? `showmasterpiece/collection-${collectionId}` : 'showmasterpiece/artwork';\n formData.append('folderPath', `${basePath}/${timestamp}_${randomId}.${extension}`);\n formData.append('needsProcessing', 'true');\n \n // 调用通用文件上传API\n const response = await fetch('/api/universal-file/upload', {\n method: 'POST',\n body: formData,\n });\n \n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n \n const result = await response.json();\n \n if (!result.success) {\n throw new Error(result.error || '上传失败');\n }\n \n console.log('✅ [ShowMasterpiece] 作品图片上传成功:', {\n fileId: result.data.fileId,\n accessUrl: result.data.accessUrl\n });\n \n return {\n fileId: result.data.fileId,\n accessUrl: result.data.accessUrl\n };\n}\n\n/**\n * 获取作品图片访问URL\n */\nexport async function getArtworkImageUrl(fileId: string): Promise<string> {\n console.log('🔗 [ShowMasterpiece] 获取作品图片URL:', fileId);\n \n const response = await fetch(`/api/universal-file/${fileId}`);\n \n if (!response.ok) {\n throw new Error(`获取文件URL失败: HTTP ${response.status}`);\n }\n \n const result = await response.json();\n \n if (!result.success) {\n throw new Error(result.error || '获取文件URL失败');\n }\n \n return result.data.accessUrl;\n}\n\n/**\n * 检查是否应该使用通用文件服务\n * \n * 策略:\n * 1. 如果已经配置了OSS,新上传默认使用文件服务\n * 2. 如果只有本地存储,可以选择使用文件服务进行统一管理\n * 3. 兼容旧的Base64存储方式\n */\nexport async function shouldUseUniversalFileService(): Promise<boolean> {\n try {\n const configManager = await getCachedConfigManager();\n \n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n // 如果OSS已配置且启用,推荐使用文件服务\n if (ossConfig && ossConfig.enabled) {\n return true;\n }\n \n // 即使只有本地存储,也推荐使用文件服务进行统一管理\n // 这样可以享受文件去重、缓存、统计等功能\n return true;\n \n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 检查文件服务配置失败:', error);\n return false;\n }\n}\n\n/**\n * 获取存储模式显示名称\n */\nexport async function getStorageModeDisplayName(): Promise<string> {\n const shouldUse = await shouldUseUniversalFileService();\n if (shouldUse) {\n const configManager = await getCachedConfigManager();\n \n const config = configManager.getConfig();\n const ossConfig = config.storageProviders['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n return '阿里云OSS + CDN (独立配置)';\n } else {\n return '本地存储 + 文件服务';\n }\n } else {\n return 'Base64数据库存储';\n }\n}\n\n/**\n * 清除配置缓存\n * \n * 当配置更新后调用此函数,强制重新读取配置\n */\nexport function clearConfigCache(): void {\n console.log('🧹 [ShowMasterpiece] 清除配置缓存');\n cachedConfigManager = null;\n}\n\n/**\n * 强制刷新配置\n * \n * 清除缓存并重新获取配置\n */\nexport async function refreshFileServiceConfig() {\n console.log('🔄 [ShowMasterpiece] 强制刷新文件服务配置');\n clearConfigCache();\n const configManager = await getCachedConfigManager();\n \n // 如果是使用独立配置,确保重新初始化Provider(仅在服务器端)\n if (typeof window === 'undefined') {\n try {\n const config = configManager.getConfig() as any;\n const ossConfig = config?.storageProviders?.['aliyun-oss'];\n \n if (ossConfig && ossConfig.enabled) {\n console.log('🔄 [ShowMasterpiece] 重新初始化OSS Provider以应用新配置');\n // 创建新的文件服务实例以确保Provider使用最新配置\n const { UniversalFileService } = await import('../../../../universalFile/server/UniversalFileService');\n const fileService = new UniversalFileService(config as any);\n await fileService.initialize();\n \n // 重新初始化Provider\n await (fileService as any).reinitializeStorageProviders?.();\n }\n } catch (error) {\n console.warn('⚠️ [ShowMasterpiece] 重新初始化Provider失败:', error);\n }\n }\n \n return configManager;\n} \n","/**\n * 通用文件服务配置管理\n */\n\n// 手动加载环境变量\nif (typeof window === 'undefined') {\n try {\n require('dotenv').config({ path: require('path').join(process.cwd(), '.env.local') });\n } catch (error) {\n console.warn('⚠️ [ConfigManager] 无法加载.env.local文件:', error);\n }\n}\n\nimport type {\n UniversalFileServiceConfig,\n StorageType,\n CDNType,\n LocalStorageConfig,\n AliyunOSSConfig,\n AliyunCDNConfig,\n StorageConfig,\n CDNConfig\n} from '../types';\n\n/**\n * 默认配置\n */\nconst DEFAULT_CONFIG: UniversalFileServiceConfig = {\n defaultStorage: 'aliyun-oss', // 修改默认存储为OSS\n storageProviders: {\n 'local': {\n type: 'local',\n enabled: false, // 默认禁用本地存储\n rootPath: process.env.FILE_STORAGE_PATH || 'uploads',\n baseUrl: process.env.FILE_BASE_URL || '/uploads'\n } as LocalStorageConfig,\n 'aliyun-oss': {\n type: 'aliyun-oss',\n enabled: true, // 默认启用OSS\n region: '',\n bucket: '',\n accessKeyId: '',\n accessKeySecret: ''\n } as AliyunOSSConfig,\n 'aws-s3': {\n type: 'aws-s3',\n enabled: false\n } as StorageConfig,\n 'qcloud-cos': {\n type: 'qcloud-cos',\n enabled: false\n } as StorageConfig\n },\n defaultCDN: 'none',\n cdnProviders: {\n 'none': {\n type: 'none',\n enabled: false\n } as CDNConfig,\n 'aliyun-cdn': {\n type: 'aliyun-cdn',\n enabled: false,\n domain: '',\n accessKeyId: '',\n accessKeySecret: ''\n } as AliyunCDNConfig,\n 'aws-cloudfront': {\n type: 'aws-cloudfront',\n enabled: false\n } as CDNConfig,\n 'qcloud-cdn': {\n type: 'qcloud-cdn',\n enabled: false\n } as CDNConfig\n },\n maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '104857600'), // 100MB\n allowedMimeTypes: [\n // 图片类型\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n // 音频类型\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n 'audio/mp4',\n 'audio/aac',\n // 视频类型\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/webm',\n 'video/mkv',\n // 文档类型\n 'application/pdf',\n 'text/plain',\n 'application/json',\n 'application/javascript',\n 'text/css',\n 'text/html',\n 'text/markdown',\n // 压缩文件\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n // 3D模型文件\n 'application/octet-stream', // PMD/PMX文件\n 'model/gltf+json',\n 'model/gltf-binary'\n ],\n enableProcessing: process.env.ENABLE_FILE_PROCESSING === 'true',\n processingQueueSize: parseInt(process.env.PROCESSING_QUEUE_SIZE || '10'),\n cache: {\n metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || '3600'), // 1小时\n urlTTL: parseInt(process.env.URL_CACHE_TTL || '1800') // 30分钟\n }\n};\n\n/**\n * 配置管理器\n */\nexport class FileServiceConfigManager {\n private config: UniversalFileServiceConfig;\n\n constructor(customConfig?: Partial<UniversalFileServiceConfig>) {\n this.config = this.mergeConfig(DEFAULT_CONFIG, customConfig);\n this.validateConfig();\n }\n\n /**\n * 获取完整配置\n */\n getConfig(): UniversalFileServiceConfig {\n return { ...this.config };\n }\n\n /**\n * 获取存储提供者配置\n */\n getStorageConfig(type: StorageType): StorageConfig | undefined {\n return this.config.storageProviders[type];\n }\n\n /**\n * 获取CDN提供者配置\n */\n getCDNConfig(type: CDNType): CDNConfig | undefined {\n return this.config.cdnProviders[type];\n }\n\n /**\n * 更新配置\n */\n updateConfig(updates: Partial<UniversalFileServiceConfig>): void {\n this.config = this.mergeConfig(this.config, updates);\n this.validateConfig();\n }\n\n /**\n * 启用存储提供者\n */\n enableStorageProvider(type: StorageType, config?: Partial<StorageConfig>): void {\n if (this.config.storageProviders[type]) {\n this.config.storageProviders[type] = {\n ...this.config.storageProviders[type],\n ...config,\n enabled: true\n };\n }\n }\n\n /**\n * 禁用存储提供者\n */\n disableStorageProvider(type: StorageType): void {\n if (this.config.storageProviders[type]) {\n this.config.storageProviders[type].enabled = false;\n }\n }\n\n /**\n * 启用CDN提供者\n */\n enableCDNProvider(type: CDNType, config?: Partial<CDNConfig>): void {\n if (this.config.cdnProviders[type]) {\n this.config.cdnProviders[type] = {\n ...this.config.cdnProviders[type],\n ...config,\n enabled: true\n };\n this.config.defaultCDN = type;\n }\n }\n\n /**\n * 禁用CDN提供者\n */\n disableCDNProvider(type: CDNType): void {\n if (this.config.cdnProviders[type]) {\n this.config.cdnProviders[type].enabled = false;\n if (this.config.defaultCDN === type) {\n this.config.defaultCDN = 'none';\n }\n }\n }\n\n /**\n * 从环境变量加载阿里云OSS配置\n */\n loadAliyunOSSFromEnv(): void {\n const config: Partial<AliyunOSSConfig> = {\n region: process.env.ALIYUN_OSS_REGION,\n bucket: process.env.ALIYUN_OSS_BUCKET,\n accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET,\n customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,\n secure: process.env.ALIYUN_OSS_SECURE === 'true',\n internal: process.env.ALIYUN_OSS_INTERNAL === 'true'\n };\n\n // 检查必需的配置项\n console.log('🔍 [ConfigManager] 阿里云OSS配置:', {\n region: config.region,\n bucket: config.bucket,\n accessKeyId: config.accessKeyId ? '***' : '未设置',\n accessKeySecret: config.accessKeySecret ? '***' : '未设置',\n customDomain: config.customDomain || '未设置'\n });\n if (config.region && config.bucket && config.accessKeyId && config.accessKeySecret) {\n this.enableStorageProvider('aliyun-oss', config);\n this.config.defaultStorage = 'aliyun-oss';\n console.log('✅ [ConfigManager] 从环境变量加载阿里云OSS配置成功');\n } else {\n console.warn('⚠️ [ConfigManager] 阿里云OSS环境变量配置不完整');\n }\n }\n\n /**\n * 从配置管理模块加载阿里云OSS配置\n */\n async loadAliyunOSSFromConfigManager(): Promise<void> {\n // sa2kit: configManager 未迁移,保持空实现\n return;\n }\n\n /**\n * 从环境变量加载阿里云CDN配置\n */\n loadAliyunCDNFromEnv(): void {\n const config: Partial<AliyunCDNConfig> = {\n domain: process.env.ALIYUN_CDN_DOMAIN,\n accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,\n region: process.env.ALIYUN_CDN_REGION\n };\n\n // 检查必需的配置项\n if (config.domain && config.accessKeyId && config.accessKeySecret) {\n this.enableCDNProvider('aliyun-cdn', config);\n console.log('✅ [ConfigManager] 从环境变量加载阿里云CDN配置成功');\n } else {\n // CDN配置是可选的,不输出警告\n console.log('ℹ️ [ConfigManager] 阿里云CDN未配置,将使用默认存储方式');\n }\n }\n\n /**\n * 验证配置有效性\n */\n private validateConfig(): void {\n // 检查默认存储提供者是否启用\n const defaultStorageConfig = this.config.storageProviders[this.config.defaultStorage];\n if (!defaultStorageConfig || !defaultStorageConfig.enabled) {\n console.warn(`⚠️ [ConfigManager] 默认存储提供者 ${this.config.defaultStorage} 未启用`);\n }\n\n // 检查文件大小限制\n if (this.config.maxFileSize <= 0) {\n throw new Error('文件大小限制必须大于0');\n }\n\n // 检查处理队列大小\n if (this.config.processingQueueSize <= 0) {\n throw new Error('处理队列大小必须大于0');\n }\n\n // 检查缓存TTL\n if (this.config.cache.metadataTTL <= 0 || this.config.cache.urlTTL <= 0) {\n throw new Error('缓存TTL必须大于0');\n }\n }\n\n /**\n * 合并配置\n */\n private mergeConfig(\n base: UniversalFileServiceConfig,\n override?: Partial<UniversalFileServiceConfig>\n ): UniversalFileServiceConfig {\n if (!override) return { ...base };\n\n return {\n ...base,\n ...override,\n storageProviders: {\n ...base.storageProviders,\n ...(override.storageProviders || {})\n },\n cdnProviders: {\n ...base.cdnProviders,\n ...(override.cdnProviders || {})\n },\n cache: {\n ...base.cache,\n ...(override.cache || {})\n }\n };\n }\n}\n\n/**\n * 创建默认配置管理器\n */\nexport async function createFileServiceConfig(customConfig?: Partial<UniversalFileServiceConfig>): Promise<FileServiceConfigManager> {\n const configManager = new FileServiceConfigManager(customConfig);\n \n // 尝试从环境变量加载云服务配置\n await configManager.loadAliyunOSSFromEnv();\n await configManager.loadAliyunCDNFromEnv();\n await configManager.loadAliyunOSSFromConfigManager();\n return configManager;\n}\n\n/**\n * 创建配置管理器(优先从配置管理模块加载)\n */\nexport async function createFileServiceConfigWithConfigManager(customConfig?: Partial<UniversalFileServiceConfig>): Promise<FileServiceConfigManager> {\n const configManager = new FileServiceConfigManager(customConfig);\n \n // 优先从配置管理模块加载配置\n await configManager.loadAliyunOSSFromConfigManager();\n \n // 如果配置管理模块没有配置,则从环境变量加载\n const ossConfig = configManager.getStorageConfig('aliyun-oss');\n if (!ossConfig || !ossConfig.enabled) {\n configManager.loadAliyunOSSFromEnv();\n }\n \n // 检查OSS配置是否有效\n const finalOssConfig = configManager.getStorageConfig('aliyun-oss');\n if (!finalOssConfig || !finalOssConfig.enabled || !validateAliyunOSSConfig(finalOssConfig as AliyunOSSConfig)) {\n console.warn('⚠️ [ConfigManager] OSS配置无效或未启用,启用本地存储作为备用方案');\n // 启用本地存储作为备用\n configManager.enableStorageProvider('local');\n configManager.updateConfig({ defaultStorage: 'local' });\n console.log('ℹ️ [ConfigManager] 已启用本地存储作为备用方案');\n } else {\n // OSS配置有效,确保使用OSS作为默认存储\n configManager.updateConfig({ defaultStorage: 'aliyun-oss' });\n console.log('✅ [ConfigManager] 使用阿里云OSS作为默认存储');\n \n // 同时启用本地存储作为备用\n configManager.enableStorageProvider('local');\n console.log('ℹ️ [ConfigManager] 同时启用本地存储作为备用方案');\n }\n \n configManager.loadAliyunCDNFromEnv();\n \n return configManager;\n}\n\n/**\n * 获取默认配置\n */\nexport function getDefaultConfig(): UniversalFileServiceConfig {\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * 验证阿里云OSS配置\n */\nexport function validateAliyunOSSConfig(config: AliyunOSSConfig): boolean {\n return !!(\n config.region &&\n config.bucket &&\n config.accessKeyId &&\n config.accessKeySecret\n );\n}\n\n/**\n * 验证阿里云CDN配置\n */\nexport function validateAliyunCDNConfig(config: AliyunCDNConfig): boolean {\n return !!(\n config.domain &&\n config.accessKeyId &&\n config.accessKeySecret\n );\n}\n\n/**\n * 格式化文件大小显示\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * 检查文件类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes: string[]): boolean {\n if (allowedTypes.length === 0) return true;\n return allowedTypes.includes(mimeType);\n}\n\n/**\n * 生成存储提供者显示名称\n */\nexport function getStorageProviderDisplayName(type: StorageType): string {\n const names: Record<StorageType, string> = {\n 'local': '本地存储',\n 'aliyun-oss': '阿里云OSS',\n 'aws-s3': 'AWS S3',\n 'qcloud-cos': '腾讯云COS'\n };\n \n return names[type] || type;\n}\n\n/**\n * 生成CDN提供者显示名称\n */\nexport function getCDNProviderDisplayName(type: CDNType): string {\n const names: Record<CDNType, string> = {\n 'none': '无CDN',\n 'aliyun-cdn': '阿里云CDN',\n 'aws-cloudfront': 'AWS CloudFront',\n 'qcloud-cdn': '腾讯云CDN'\n };\n \n return names[type] || type;\n} ","export * from './client';\n","import Taro from '@tarojs/taro';\nimport type { CategoryOption } from '../../types';\nimport type {\n Booking,\n BookingListParams,\n BookingListResponse,\n CollectionSummary,\n CreateBookingRequest,\n} from '../../types/booking';\nimport type { BatchBookingRequest, BatchBookingResponse } from '../../types/cart';\nimport type { PopupConfig } from '../../types/popup';\nimport { createShowmasterpieceClient, type CollectionOverview } from '../api';\n\nexport const DEFAULT_BASE_URL = 'https://qhr062.top';\n\nconst extractErrorMessage = (data: any, fallback: string): string => {\n if (typeof data?.message === 'string' && data.message) return data.message;\n if (typeof data?.error === 'string' && data.error) return data.error;\n return fallback;\n};\n\nconst createTaroExecutor = () => {\n return async <T>({\n url,\n method,\n data,\n headers,\n }: {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<T> => {\n const response = await Taro.request({\n url,\n method,\n data,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return response.data as T;\n }\n\n throw new Error(extractErrorMessage(response.data, `请求失败 (${response.statusCode})`));\n };\n};\n\nconst createClient = (baseUrl = DEFAULT_BASE_URL) =>\n createShowmasterpieceClient(createTaroExecutor(), baseUrl);\n\nexport const getCollectionsOverview = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionOverview[]> =>\n createClient(baseUrl).getCollectionsOverview();\n\nexport const getCategories = async (baseUrl = DEFAULT_BASE_URL): Promise<CategoryOption[]> =>\n createClient(baseUrl).getCategories();\n\nexport const getBookableCollections = async (baseUrl = DEFAULT_BASE_URL): Promise<CollectionSummary[]> =>\n createClient(baseUrl).getBookableCollections();\n\nexport const createBooking = async (\n payload: CreateBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<Booking> => createClient(baseUrl).createBooking(payload);\n\nexport const batchBooking = async (\n payload: BatchBookingRequest,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BatchBookingResponse> => createClient(baseUrl).batchBooking(payload);\n\nexport const getBookings = async (\n params: BookingListParams,\n baseUrl = DEFAULT_BASE_URL,\n): Promise<BookingListResponse> => createClient(baseUrl).getBookings(params);\n\nexport const checkPopupConfigs = async (\n params: {\n businessModule: string;\n businessScene: string;\n currentTime?: string;\n },\n baseUrl = DEFAULT_BASE_URL,\n): Promise<PopupConfig[]> => createClient(baseUrl).checkPopupConfigs(params);\n\nexport type { CollectionOverview };\n"]}