@waterwx/dsh-novel-forge 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["zh","zh","css","css","css","css","css","css"],"sources":["../src/protocol.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/panel/helpers.ts","../src/client/panel/AssistantTab.tsx","../src/client/panel/AssetsTab.tsx","../src/client/panel/BookshelfBar.tsx","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/client/docx.ts","../src/client/panel/NovelPanel.tsx","../src/client/mount.tsx","../src/client/panel/controller.ts","../src/client/sidebar-entry.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-novel-forge — shared protocol between the host half (Node) and the\n * browser half (web GUI). Route paths, request/response shapes, the project\n * state file format, and the NDJSON generation stream frames all live here so\n * both halves spell exactly one vocabulary.\n */\n\n/** The /api/dsh-novel-forge route family (same-origin, loopback-fenced). */\nexport const NOVEL_API = {\n status: '/api/dsh-novel-forge/status',\n loadOutline: '/api/dsh-novel-forge/load-outline',\n saveOutline: '/api/dsh-novel-forge/save-outline',\n plan: '/api/dsh-novel-forge/plan',\n volumes: '/api/dsh-novel-forge/volumes',\n bible: '/api/dsh-novel-forge/bible',\n assets: '/api/dsh-novel-forge/assets',\n styleEngine: '/api/dsh-novel-forge/style-engine',\n generate: '/api/dsh-novel-forge/generate',\n review: '/api/dsh-novel-forge/review',\n rewrite: '/api/dsh-novel-forge/rewrite',\n polish: '/api/dsh-novel-forge/polish',\n summary: '/api/dsh-novel-forge/summary',\n foreshadow: '/api/dsh-novel-forge/foreshadow',\n exportBook: '/api/dsh-novel-forge/export',\n chapter: '/api/dsh-novel-forge/chapter',\n assistant: '/api/dsh-novel-forge/assistant',\n assistantHistory: '/api/dsh-novel-forge/assistant-history',\n bookshelf: '/api/dsh-novel-forge/bookshelf',\n config: '/api/dsh-novel-forge/config',\n openFolder: '/api/dsh-novel-forge/open-folder',\n} as const\n\n/** 书架:一本书的条目。 */\nexport interface BookEntry {\n /** 稳定 id。 */\n id: string\n /** 书名。 */\n bookName: string\n /** 该书输出目录(独立项目目录)。 */\n outputDir: string\n /** 创建时间。 */\n createdAt: string\n /** 最后活动时间。 */\n updatedAt: string\n}\n\n/** 书架快照(含每本书的进度摘要)。 */\nexport interface BookshelfSnapshot {\n books: Array<BookEntry & { done: number; total: number; hasProject: boolean }>\n /** 当前激活的书 id(无则 null)。 */\n activeBookId: string | null\n}\n\n/** POST /bookshelf 请求:创建新书。 */\nexport interface BookCreateRequest {\n bookName: string\n outputDir?: string\n}\n\n/** POST /bookshelf/activate 请求:切换当前书。 */\nexport interface BookActivateRequest {\n id: string\n}\n\n/** POST /bookshelf/remove 请求:移除书架条目。 */\nexport interface BookRemoveRequest {\n id: string\n}\n\n/** Chapter lifecycle states (the writing pipeline's state machine). */\nexport type ChapterStatus =\n | 'pending' // planned, not started\n | 'generating' // LLM writing right now\n | 'written' // body on disk, awaiting review\n | 'reviewing' // review in progress\n | 'approved' // passed review (or user-approved)\n | 'rejected' // review found problems\n | 'error' // generation failed\n\n/** One chapter in the plan. */\nexport interface ChapterPlan {\n /** 1-based chapter number (stable identity; files are named from it). */\n no: number\n /** Volume this chapter belongs to (1-based; 0 = unassigned). */\n volume: number\n /** Chapter title, decided by the LLM plan step. */\n title: string\n /** Story beats / plot points for this chapter (model-facing guidance). */\n beats: string\n /** Target character count (defaults to the configured chapter size). */\n targetChars: number\n /** Generation/review state. */\n status: ChapterStatus\n /** Actual character count once generated. */\n chars?: number\n /** Failure message when status is 'error'. */\n error?: string\n /** Output file name once generated (relative to the output dir). */\n file?: string\n /** LLM summary of the chapter (narrative memory for later chapters). */\n summary?: string\n /** Latest review report (present once reviewed). */\n review?: ReviewReport\n}\n\n/** One review finding. */\nexport interface ReviewIssue {\n /** Severity: high = must fix, medium = should fix, low = suggestion. */\n severity: 'high' | 'medium' | 'low'\n /** What the problem is. */\n item: string\n /** Concrete suggestion for fixing it. */\n suggestion: string\n}\n\n/** AI review report for one chapter. */\nexport interface ReviewReport {\n /** Overall score 0-100. */\n score: number\n /** Pass threshold (config; 70 default). */\n passed: boolean\n /** One-line verdict. */\n verdict: string\n /** Individual findings. */\n issues: ReviewIssue[]\n /** When the review ran. */\n reviewedAt: string\n}\n\n/** A volume of the book. */\nexport interface Volume {\n /** 1-based volume number. */\n no: number\n /** Volume title. */\n title: string\n /** Volume positioning / summary. */\n summary: string\n /** First chapter number of this volume. */\n chapterStart: number\n /** Last chapter number (inclusive). */\n chapterEnd: number\n}\n\n/** A character card from the story bible. */\nexport interface CharacterCard {\n name: string\n role: 'protagonist' | 'supporting' | 'antagonist' | 'other'\n /** Personality / traits (short lines). */\n traits: string[]\n /** Goals and motivations. */\n goals: string\n /** Key relations to other characters. */\n relations: string\n}\n\n/** The structured story bible (worldbuilding extracted from the outline). */\nexport interface StoryBible {\n /** Genre + tone tags. */\n genre: string\n /** Worldbuilding rules (power system, geography, factions...). */\n worldRules: string[]\n /** Character cards. */\n characters: CharacterCard[]\n /** Writing red lines (forbidden content / must-avoid tropes). */\n redLines: string[]\n /** Style guidance (pacing, pov, tone). */\n style: string[]\n /** When the bible was generated. */\n generatedAt?: string\n}\n\n/** A planted/active/resolved foreshadowing thread. */\nexport interface Foreshadow {\n /** Stable id. */\n id: string\n /** What the foreshadow is. */\n description: string\n /** Chapter where it was planted (undefined = planned). */\n plantedChapter?: number\n /** Chapter where it should be paid off. */\n targetChapter?: number\n /** Lifecycle state. */\n status: 'planned' | 'planted' | 'progressing' | 'resolved' | 'abandoned'\n /** Resolution note when resolved. */\n resolvedNote?: string\n}\n\n/** The persisted project: outline + bible + plan + progress. */\nexport interface ProjectState {\n /** Book title (first non-empty line of the outline, usually). */\n bookName: string\n /** Full outline text (docx-extracted or pasted). */\n outline: string\n /** Source outline path when loaded from a docx. */\n outlinePath?: string\n /** Structured story bible (worldbuilding), if generated. */\n bible?: StoryBible\n /** Volumes, if planned. */\n volumes?: Volume[]\n /** Chapter plan. */\n chapters: ChapterPlan[]\n /** Foreshadowing threads. */\n foreshadows: Foreshadow[]\n /** 写作资产(题材基底/推进模式/反AI规则/写法资产)。 */\n assets?: ProjectAssets\n /** ISO timestamps. */\n createdAt: string\n updatedAt: string\n}\n\n/** Runtime config surface exposed to the panel (subset of plugin Config). */\nexport interface NovelConfig {\n /** Absolute path of the default docx outline to load. */\n outlinePath: string\n /** Absolute output directory for chapters + project state. */\n outputDir: string\n /** LLM provider route (e.g. deepseek-official). */\n provider: string\n /** LLM model id (e.g. deepseek-v4-flash). */\n model: string\n /** Target characters per chapter. */\n chapterChars: number\n /** Max output tokens per chapter call. */\n maxTokens: number\n /** Review pass threshold (0-100). */\n reviewPassScore: number\n /** Whether generation auto-runs review after writing. */\n autoReview: boolean\n}\n\n/** GET /status response. */\nexport interface StatusResponse {\n config: NovelConfig\n /** The persisted project, when one exists in the output dir. */\n project?: ProjectState\n /** Chapter files already on disk (basenames, sorted). */\n generatedFiles: string[]\n}\n\n/** POST /load-outline request: either a docx path or raw text. */\nexport interface LoadOutlineRequest {\n /** Absolute docx path; defaults to the configured outline path. */\n path?: string\n /** Raw outline text (takes precedence over path when present). */\n text?: string\n}\n\n/** POST /load-outline response. */\nexport interface LoadOutlineResponse {\n outline: string\n bookName: string\n chars: number\n path?: string\n}\n\n/** POST /plan request. */\nexport interface PlanRequest {\n /** Outline to plan from; defaults to the persisted project's outline. */\n outline?: string\n /** Number of chapters to plan (default: 30). */\n chapterCount?: number\n /** Volume to plan (1-based); when given, plans only that volume's chapters. */\n volume?: number\n}\n\n/** POST /plan response. */\nexport interface PlanResponse {\n chapters: ChapterPlan[]\n volumes?: Volume[]\n}\n\n/** POST /volumes request/response. */\nexport interface VolumesRequest {\n /** Outline to split into volumes; defaults to the project outline. */\n outline?: string\n}\nexport interface VolumesResponse {\n volumes: Volume[]\n}\n\n/** POST /bible request/response. */\nexport interface BibleRequest {\n /** Outline to extract from; defaults to the project outline. */\n outline?: string\n}\nexport interface BibleResponse {\n bible: StoryBible\n}\n\n/** POST /generate request: one chapter of the current project. */\nexport interface GenerateRequest {\n chapterNo: number\n /** When true, skips the auto-review step. */\n skipReview?: boolean\n}\n\n/** One NDJSON frame of a generation/review/rewrite stream. */\nexport type JobFrame =\n | { type: 'start'; no: number; title: string }\n | { type: 'delta'; text: string }\n | { type: 'progress'; chars: number }\n | { type: 'done'; no: number; file: string; chars: number; title: string }\n | { type: 'review'; no: number; report: ReviewReport }\n | { type: 'rewritten'; no: number; file: string; chars: number }\n | { type: 'error'; no: number; message: string }\n\n/** POST /review request: review one written chapter. */\nexport interface ReviewRequest {\n chapterNo: number\n}\n\n/** POST /rewrite request: rewrite one chapter (optionally per review issues). */\nexport interface RewriteRequest {\n chapterNo: number\n /** Free-form instructions; defaults to fixing the review's high issues. */\n instructions?: string\n /**\n * 局部修订:正文中的一段原文(无需完全精确,取一个自然段内的片段即可)。\n * 提供时只重写该段,其余正文保持不变;不提供时整章重写。\n */\n target?: string\n}\n\n/** POST /polish request: de-AI-ify one chapter. */\nexport interface PolishRequest {\n chapterNo: number\n}\n\n/** POST /summary request: (re)generate a chapter summary. */\nexport interface SummaryRequest {\n chapterNo: number\n}\n\n/** POST /foreshadow request: create, update, or AI-suggest foreshadows. */\nexport interface ForeshadowRequest {\n /** When true, runs the LLM suggestion pass (ignores other fields). */\n suggest?: boolean\n /** When given, updates that foreshadow instead of creating one. */\n id?: string\n description?: string\n plantedChapter?: number\n targetChapter?: number\n status?: Foreshadow['status']\n resolvedNote?: string\n}\nexport interface ForeshadowResponse {\n foreshadows: Foreshadow[]\n}\n\n/** GET /chapter response. */\nexport interface ChapterResponse {\n no: number\n title: string\n markdown: string\n}\n\n/** POST /export request/response. */\nexport interface ExportRequest {\n format: 'txt' | 'md'\n}\nexport interface ExportResponse {\n file: string\n chars: number\n chapters: number\n}\n\n/** POST /config request: patch any subset of the runtime config. */\nexport interface ConfigPatch {\n outlinePath?: string\n outputDir?: string\n provider?: string\n model?: string\n chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: boolean\n}\n\n// ------------------------------------------------------------ assistant\n\n/** One assistant conversation message (persisted per project). */\nexport interface AssistantMessage {\n role: 'user' | 'assistant' | 'tool'\n /** Message text (tool messages carry the tool result). */\n content: string\n /** ISO timestamp. */\n ts: string\n /** For tool messages: which tool ran. */\n tool?: string\n}\n\n/** POST /assistant request: one user turn. */\nexport interface AssistantRequest {\n message: string\n}\n\n/** One NDJSON frame of the assistant stream. */\nexport type AssistantFrame =\n | { type: 'delta'; text: string }\n | { type: 'tool'; name: string; status: 'start' | 'done' | 'error'; detail?: string }\n /** Live output while a tool runs (e.g. chapter text being generated). */\n | { type: 'toolDelta'; name: string; text: string }\n | { type: 'done' }\n | { type: 'error'; message: string }\n\n/** GET /assistant-history response. */\nexport interface AssistantHistoryResponse {\n messages: AssistantMessage[]\n}\n\n// ---------------------------------------------------------- writing assets\n\n/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */\nexport interface GenreNode {\n /** 题材名称(标签,如「仙侠修真」「都市异能」)。 */\n name: string\n /** 题材特征、常见爽点、叙事重心或读者期待。 */\n description: string\n /** 子题材。 */\n children: GenreNode[]\n}\n\n/** 推进模式库:读者为什么继续看下一章。 */\nexport interface ProgressionMode {\n /** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */\n name: string\n /** 核心驱动力:靠什么制造追读动力。 */\n driver: string\n /** 读者期待:每隔几章获得什么变化或回报。 */\n readerExpectation: string\n /** 常见兑现方式(爽点如何落地)。 */\n payoffs: string[]\n /** 节奏风险:最怕什么(重复升级、冲突变弱、谜题拖太久…)。 */\n risks: string[]\n /** 主模式或辅助模式。 */\n primary: boolean\n}\n\n/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */\nexport interface AntiAiRule {\n /** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */\n name: string\n /** 要避免的表达问题,具体可检查。 */\n avoid: string\n /** 推荐修正方向。 */\n fix: string\n /** 命中即告警的具体表达模式(用于审稿逐条核对与去 AI 味检测)。 */\n detectPatterns?: string[]\n /** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */\n builtin?: boolean\n}\n\n/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */\nexport interface StyleTemplate {\n /** 模板 key(如 power-up-escalation)。 */\n key: string\n /** 模板名(如「爽文递进推进流」)。 */\n name: string\n /** 模板说明。 */\n description: string\n /** 分类(如「爽文流」「悬疑流」)。 */\n category: string\n /** 适用题材。 */\n applicableGenres: string[]\n /** 叙述规则。 */\n proseRules: string[]\n /** 角色/台词规则。 */\n dialogueRules: string[]\n /** 语言规则。 */\n languageRules: string[]\n /** 节奏规则。 */\n rhythmRules: string[]\n /** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */\n defaultAntiAiRuleKeys: string[]\n}\n\n/** 写法引擎:从样本文本提取的叙事风格资产。 */\nexport interface StyleAsset {\n /** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */\n name: string\n /** 叙述视角与句式节奏。 */\n proseRules: string[]\n /** 角色台词风格。 */\n dialogueRules: string[]\n /** 描写密度与情绪表达。 */\n descriptionRules: string[]\n /** 表达边界(不要做什么)。 */\n boundaries: string[]\n /** 来源样本文本(可空)。 */\n sourceText?: string\n /** 创建时间。 */\n createdAt: string\n}\n\n/** 项目写作资产(题材基底 + 推进模式 + 反 AI 规则 + 写法资产)。 */\nexport interface ProjectAssets {\n /** 本书选用的题材(可以是题材基底库中某节点名)。 */\n genre?: GenreNode\n /** 主推进模式。 */\n primaryProgression?: ProgressionMode\n /** 辅助推进模式。 */\n auxiliaryProgressions: ProgressionMode[]\n /** 生效的反 AI 规则(内置 + 自定义)。 */\n antiAiRules: AntiAiRule[]\n /** 绑定的写法资产。 */\n styleAssets: StyleAsset[]\n /** 资产更新时间。 */\n updatedAt?: string\n}\n\n/** GET /assets response(含全局题材库与反 AI 规则库)。 */\nexport interface AssetsResponse {\n projectAssets: ProjectAssets\n /** 全局题材基底库(可复用资产,跨书)。 */\n genreLibrary: GenreNode[]\n /** 全局反 AI 规则库(内置默认规则)。 */\n antiAiLibrary: AntiAiRule[]\n /** 预置写法模板(一键绑定,无需样本文本)。 */\n styleTemplates: StyleTemplate[]\n /** 内置推进模式候选。 */\n progressionLibrary: ProgressionMode[]\n}\n\n/** POST /assets request:更新项目写作资产(部分字段可选)。 */\nexport interface AssetsPatch {\n genre?: GenreNode\n primaryProgression?: ProgressionMode\n auxiliaryProgressions?: ProgressionMode[]\n antiAiRules?: AntiAiRule[]\n styleAssets?: StyleAsset[]\n}\n\n/** POST /style-engine request:从样本文本提取写法资产。 */\nexport interface StyleEngineRequest {\n /** 样本文本(风格来源)。 */\n sampleText: string\n /** 资产名(可选,默认「风格资产 N」)。 */\n name?: string\n}\n","/**\n * Browser-side API client for the /api/dsh-novel-forge route family. Plain\n * fetch, same origin; generation/rewrite/polish ride NDJSON streams read\n * incrementally.\n */\n\nimport {\n NOVEL_API,\n type AssetsPatch,\n type AssetsResponse,\n type BibleResponse,\n type ChapterResponse,\n type ConfigPatch,\n type ExportResponse,\n type ForeshadowRequest,\n type ForeshadowResponse,\n type JobFrame,\n type LoadOutlineResponse,\n type NovelConfig,\n type PlanResponse,\n type ReviewReport,\n type StatusResponse,\n type StyleEngineRequest,\n type StyleAsset,\n type VolumesResponse,\n} from '../protocol.ts'\n\n/** Error carrying the route's JSON error message. */\nexport class NovelApiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NovelApiError'\n }\n}\n\n/** Parse a JSON response or throw a NovelApiError. */\nasync function readJson<T>(response: Response): Promise<T> {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n throw new NovelApiError(`HTTP ${response.status}: invalid JSON response`)\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `HTTP ${response.status}`\n throw new NovelApiError(message)\n }\n return body as T\n}\n\n/** POST JSON, return parsed JSON. */\nasync function postJson<T>(path: string, payload: unknown): Promise<T> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return readJson<T>(response)\n}\n\n/** The browser half's only data entry point. */\nexport class NovelApi {\n async status(): Promise<StatusResponse> {\n const response = await fetch(NOVEL_API.status)\n return readJson<StatusResponse>(response)\n }\n\n async loadOutline(path?: string, text?: string): Promise<LoadOutlineResponse> {\n return postJson<LoadOutlineResponse>(NOVEL_API.loadOutline, { path, text })\n }\n\n async saveOutline(text: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.saveOutline, { text })\n }\n\n async plan(outline?: string, chapterCount?: number, volume?: number): Promise<PlanResponse> {\n return postJson<PlanResponse>(NOVEL_API.plan, { outline, chapterCount, volume })\n }\n\n async volumes(outline?: string): Promise<VolumesResponse> {\n return postJson<VolumesResponse>(NOVEL_API.volumes, { outline })\n }\n\n async bible(outline?: string): Promise<BibleResponse> {\n return postJson<BibleResponse>(NOVEL_API.bible, { outline })\n }\n\n async review(chapterNo: number): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.review, { chapterNo })\n }\n\n async summarize(chapterNo: number): Promise<{ summary: string }> {\n return postJson<{ summary: string }>(NOVEL_API.summary, { chapterNo })\n }\n\n async foreshadow(req: ForeshadowRequest): Promise<ForeshadowResponse> {\n return postJson<ForeshadowResponse>(NOVEL_API.foreshadow, req)\n }\n\n async exportBook(format: 'txt' | 'md'): Promise<ExportResponse> {\n return postJson<ExportResponse>(NOVEL_API.exportBook, { format })\n }\n\n async chapter(no: number): Promise<ChapterResponse> {\n const response = await fetch(`${NOVEL_API.chapter}?no=${no}`)\n return readJson<ChapterResponse>(response)\n }\n\n async patchConfig(patch: ConfigPatch): Promise<{ config: NovelConfig }> {\n return postJson<{ config: NovelConfig }>(NOVEL_API.config, patch)\n }\n\n async openFolder(): Promise<void> {\n await fetch(NOVEL_API.openFolder, { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' })\n }\n\n /** 书架快照。 */\n async bookshelf(): Promise<import('../protocol.ts').BookshelfSnapshot> {\n const response = await fetch(NOVEL_API.bookshelf)\n return readJson<import('../protocol.ts').BookshelfSnapshot>(response)\n }\n\n /** 新建书并激活。 */\n async bookCreate(bookName: string, outputDir?: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>(NOVEL_API.bookshelf, { bookName, outputDir })\n }\n\n /** 切换当前书。 */\n async bookActivate(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/activate', { id })\n }\n\n /** 移除书架条目。 */\n async bookRemove(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/remove', { id })\n }\n\n /** Get project writing assets + built-in libraries. */\n async assets(): Promise<AssetsResponse> {\n const response = await fetch(NOVEL_API.assets)\n return readJson<AssetsResponse>(response)\n }\n\n /** Patch project writing assets. */\n async patchAssets(patch: AssetsPatch): Promise<AssetsResponse> {\n return postJson<AssetsResponse>(NOVEL_API.assets, patch)\n }\n\n /** Extract a style asset from sample text. */\n async styleEngine(req: StyleEngineRequest): Promise<{ styleAsset: StyleAsset }> {\n return postJson<{ styleAsset: StyleAsset }>(NOVEL_API.styleEngine, req)\n }\n\n /**\n * Consume an NDJSON job stream (generate / rewrite / polish).\n * @param path - the route to POST to.\n * @param payload - the JSON body.\n * @param onFrame - receives every frame as it lands.\n */\n private async streamJob(path: string, payload: unknown, onFrame: (frame: JobFrame) => void): Promise<void> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('job: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: JobFrame\n try {\n frame = JSON.parse(line) as JobFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') {\n throw new NovelApiError(frame.message)\n }\n }\n }\n }\n\n /** Generate one chapter. */\n async generate(chapterNo: number, skipReview: boolean, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.generate, { chapterNo, skipReview }, onFrame)\n }\n\n /** Rewrite one chapter (whole-chapter, or local when `target` is given). */\n async rewrite(chapterNo: number, instructions: string, target: string, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.rewrite, { chapterNo, instructions, target }, onFrame)\n }\n\n /** Polish (de-AI-ify) one chapter. */\n async polish(chapterNo: number, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.polish, { chapterNo }, onFrame)\n }\n\n /** Run one assistant turn (NDJSON stream). */\n async assistant(message: string, onFrame: (frame: import('../protocol.ts').AssistantFrame) => void): Promise<void> {\n const response = await fetch(NOVEL_API.assistant, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message }),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('assistant: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: import('../protocol.ts').AssistantFrame\n try {\n frame = JSON.parse(line) as import('../protocol.ts').AssistantFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') throw new NovelApiError(frame.message)\n }\n }\n }\n\n /** Load the persisted assistant conversation. */\n async assistantHistory(): Promise<import('../protocol.ts').AssistantMessage[]> {\n const response = await fetch(NOVEL_API.assistantHistory)\n const body = await readJson<{ messages: import('../protocol.ts').AssistantMessage[] }>(response)\n return body.messages\n }\n}\n","/**\n * dsh-novel-forge — locale dictionaries (zh / en).\n */\n\n/** zh dictionary. */\nexport const zh = {\n 'entry.label': '小说工坊',\n 'entry.tooltip': 'AI 编译小说工作台:大纲 → 设定圣经 → 卷计划 → 章节计划 → 逐章生成+审稿',\n 'panel.title': '小说工坊',\n 'common.close': '关闭',\n 'common.loading': '加载中…',\n 'common.save': '保存',\n 'common.error': '错误',\n 'common.success': '成功',\n 'common.generating': '生成中…',\n 'common.chars': '字',\n 'tab.workflow': '工作流',\n 'tab.overview': '大纲',\n 'tab.plan': '章节',\n 'tab.bible': '设定库',\n 'tab.foreshadow': '伏笔',\n 'tab.assistant': 'AI 助手',\n 'tab.settings': '设置',\n 'workflow.title': '创作工作流',\n 'workflow.step1': '① 加载大纲',\n 'workflow.step2': '② 提炼设定圣经',\n 'workflow.step3': '③ 规划卷',\n 'workflow.step4': '④ 生成章节计划',\n 'workflow.step5': '⑤ 逐章写作 + AI 审稿',\n 'workflow.step6': '⑥ 润色 / 导出',\n 'workflow.loadOutline': '读取大纲',\n 'workflow.genBible': '提炼设定圣经',\n 'workflow.genVolumes': '生成卷计划',\n 'workflow.genPlan': '生成章节计划',\n 'workflow.done': '已完成',\n 'workflow.todo': '待办',\n 'workflow.bibleDone': '设定圣经已生成({n} 条规则 / {c} 个角色 / {r} 条红线)',\n 'workflow.volumesDone': '卷计划已生成({n} 卷)',\n 'workflow.planDone': '章节计划已生成({n} 章)',\n 'workflow.progress': '进度:大纲 ✓ · 设定 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章',\n 'overview.loadDocx': '从 docx 读取大纲',\n 'overview.loadDocxDefault': '读取默认大纲',\n 'overview.loadingOutline': '正在解析 docx…',\n 'overview.outlineHint': '大纲文本(可编辑)',\n 'overview.outlineChars': '大纲字数',\n 'overview.saveOutline': '保存大纲',\n 'overview.saved': '大纲已保存',\n 'overview.bookName': '书名',\n 'overview.loadCustom': '指定 docx 路径',\n 'overview.loadCustomHint': '绝对路径,留空使用默认',\n 'plan.generate': '生成章节计划',\n 'plan.generateHint': '章节数量',\n 'plan.count': '章',\n 'plan.empty': '暂无章节计划,请先生成',\n 'plan.chapter': '章',\n 'plan.pending': '待生成',\n 'plan.generating': '生成中',\n 'plan.written': '待审稿',\n 'plan.reviewing': '审稿中',\n 'plan.approved': '已通过',\n 'plan.rejected': '待修订',\n 'plan.error': '失败',\n 'plan.write': '生成本章',\n 'plan.rewrite': '修订',\n 'plan.review': '审稿',\n 'plan.polish': '去AI味',\n 'plan.writeAll': '批量生成全部',\n 'plan.writeAllPending': '批量生成剩余',\n 'plan.generated': '已生成',\n 'plan.progress': '进度',\n 'plan.beats': '剧情要点',\n 'plan.reviewReport': '审稿报告',\n 'plan.reviewScore': '评分',\n 'plan.reviewVerdict': '总评',\n 'plan.reviewIssues': '问题清单',\n 'plan.reviewPass': '通过',\n 'plan.reviewFail': '未通过',\n 'plan.approve': '手动通过',\n 'plan.summary': '章节摘要',\n 'plan.volumes': '卷',\n 'plan.noVolume': '未分卷',\n 'bible.title': '设定圣经',\n 'bible.gen': 'AI 提炼设定圣经',\n 'bible.genre': '题材基调',\n 'bible.worldRules': '世界规则',\n 'bible.characters': '角色卡',\n 'bible.redLines': '写作红线',\n 'bible.style': '风格要求',\n 'bible.none': '尚未生成设定圣经。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。',\n 'foreshadow.title': '伏笔管理',\n 'foreshadow.suggest': 'AI 建议伏笔',\n 'foreshadow.none': '暂无伏笔',\n 'foreshadow.status': '状态',\n 'foreshadow.planned': '计划中',\n 'foreshadow.planted': '已埋设',\n 'foreshadow.progressing': '推进中',\n 'foreshadow.resolved': '已回收',\n 'foreshadow.abandoned': '已放弃',\n 'foreshadow.target': '预计回收',\n 'foreshadow.plantedAt': '埋设于',\n 'foreshadow.setPlanted': '标记已埋设',\n 'foreshadow.setResolved': '标记已回收',\n 'settings.title': '设置',\n 'settings.outlinePath': '默认大纲路径',\n 'settings.outputDir': '输出目录',\n 'settings.provider': '模型提供商',\n 'settings.model': '模型',\n 'settings.chapterChars': '每章目标字数',\n 'settings.maxTokens': '单章最大输出 tokens',\n 'settings.reviewPassScore': '审稿通过分数(0-100)',\n 'settings.autoReview': '生成后自动审稿',\n 'settings.save': '保存设置',\n 'settings.saved': '设置已保存',\n 'settings.openFolder': '打开输出文件夹',\n 'settings.export': '导出',\n 'settings.exportTxt': '导出 TXT',\n 'settings.exportMd': '导出 Markdown',\n 'settings.exported': '已导出:{file}({chars} 字,{chapters} 章)',\n 'progress.generating': '正在生成第 {no} 章《{title}》…',\n 'progress.done': '第 {no} 章完成({chars} 字)→ {file}',\n 'progress.reviewed': '第 {no} 章审稿:{score} 分 — {verdict}',\n 'progress.error': '第 {no} 章失败:{message}',\n 'progress.rewriting': '正在修订第 {no} 章…',\n 'progress.polishing': '正在润色第 {no} 章…',\n 'progress.empty': '生成/审稿进度将显示在这里',\n 'assistant.hint': '和 AI 编辑讨论剧情、人设、伏笔;达成一致后可让它直接修改大纲、设定圣经、章节内容。',\n 'assistant.placeholder': '例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…',\n 'assistant.send': '发送',\n 'assistant.toolStart': '⚙ 执行操作:{name}…',\n 'assistant.toolDone': '✓ {name} 完成:{detail}',\n 'assistant.toolError': '✗ {name} 失败:{detail}',\n 'assistant.empty': '还没有对话。和 AI 编辑聊聊剧情吧。',\n 'status.projectNone': '输出目录中还没有项目。请先加载大纲。',\n 'status.files': '已生成文件',\n 'api.error': '请求失败',\n} as const\n\n/** en dictionary (fallback). */\nexport const en: Record<string, string> = {\n 'entry.label': 'Novel Forge',\n 'entry.tooltip': 'AI novel workbench: outline → bible → volumes → plan → write + review',\n 'panel.title': 'Novel Forge',\n 'common.close': 'Close',\n 'common.loading': 'Loading…',\n 'common.save': 'Save',\n 'common.error': 'Error',\n 'common.success': 'Success',\n 'common.generating': 'Generating…',\n 'common.chars': ' chars',\n 'tab.workflow': 'Workflow',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workflow',\n 'workflow.step1': '① Load outline',\n 'workflow.step2': '② Extract story bible',\n 'workflow.step3': '③ Plan volumes',\n 'workflow.step4': '④ Plan chapters',\n 'workflow.step5': '⑤ Write + AI review',\n 'workflow.step6': '⑥ Polish / export',\n 'workflow.loadOutline': 'Load outline',\n 'workflow.genBible': 'Extract bible',\n 'workflow.genVolumes': 'Plan volumes',\n 'workflow.genPlan': 'Plan chapters',\n 'workflow.done': 'done',\n 'workflow.todo': 'todo',\n 'workflow.bibleDone': 'Bible ready ({n} rules / {c} characters / {r} red lines)',\n 'workflow.volumesDone': 'Volumes ready ({n})',\n 'workflow.planDone': 'Plan ready ({n} chapters)',\n 'workflow.progress': 'Outline ✓ · bible {bible} · volumes {volumes} · plan {plan} · {done}/{total} chapters',\n 'overview.loadDocx': 'Load outline from docx',\n 'overview.loadDocxDefault': 'Load default outline',\n 'overview.loadingOutline': 'Parsing docx…',\n 'overview.outlineHint': 'Outline text (editable)',\n 'overview.outlineChars': 'Outline length',\n 'overview.saveOutline': 'Save outline',\n 'overview.saved': 'Outline saved',\n 'overview.bookName': 'Book',\n 'overview.loadCustom': 'Custom docx path',\n 'overview.loadCustomHint': 'Absolute path; empty = default',\n 'plan.generate': 'Plan chapters',\n 'plan.generateHint': 'Chapter count',\n 'plan.count': ' chapters',\n 'plan.empty': 'No plan yet — generate one first',\n 'plan.chapter': 'Ch.',\n 'plan.pending': 'pending',\n 'plan.generating': 'writing',\n 'plan.written': 'to review',\n 'plan.reviewing': 'reviewing',\n 'plan.approved': 'approved',\n 'plan.rejected': 'to revise',\n 'plan.error': 'failed',\n 'plan.write': 'Write',\n 'plan.rewrite': 'Revise',\n 'plan.review': 'Review',\n 'plan.polish': 'De-AI',\n 'plan.writeAll': 'Write all',\n 'plan.writeAllPending': 'Write remaining',\n 'plan.generated': 'generated',\n 'plan.progress': 'progress',\n 'plan.beats': 'Beats',\n 'plan.reviewReport': 'Review report',\n 'plan.reviewScore': 'Score',\n 'plan.reviewVerdict': 'Verdict',\n 'plan.reviewIssues': 'Issues',\n 'plan.reviewPass': 'Passed',\n 'plan.reviewFail': 'Failed',\n 'plan.approve': 'Approve',\n 'plan.summary': 'Summary',\n 'plan.volumes': 'Volumes',\n 'plan.noVolume': 'No volume',\n 'bible.title': 'Story bible',\n 'bible.gen': 'Extract bible with AI',\n 'bible.genre': 'Genre',\n 'bible.worldRules': 'World rules',\n 'bible.characters': 'Characters',\n 'bible.redLines': 'Red lines',\n 'bible.style': 'Style',\n 'bible.none': 'No bible yet. Generation and review follow it strictly once extracted.',\n 'foreshadow.title': 'Foreshadowing',\n 'foreshadow.suggest': 'Suggest with AI',\n 'foreshadow.none': 'No foreshadows',\n 'foreshadow.status': 'Status',\n 'foreshadow.planned': 'planned',\n 'foreshadow.planted': 'planted',\n 'foreshadow.progressing': 'progressing',\n 'foreshadow.resolved': 'resolved',\n 'foreshadow.abandoned': 'abandoned',\n 'foreshadow.target': 'target',\n 'foreshadow.plantedAt': 'planted at',\n 'foreshadow.setPlanted': 'Mark planted',\n 'foreshadow.setResolved': 'Mark resolved',\n 'settings.title': 'Settings',\n 'settings.outlinePath': 'Default outline path',\n 'settings.outputDir': 'Output directory',\n 'settings.provider': 'Provider',\n 'settings.model': 'Model',\n 'settings.chapterChars': 'Chars per chapter',\n 'settings.maxTokens': 'Max output tokens',\n 'settings.reviewPassScore': 'Review pass score (0-100)',\n 'settings.autoReview': 'Auto-review after writing',\n 'settings.save': 'Save settings',\n 'settings.saved': 'Settings saved',\n 'settings.openFolder': 'Open output folder',\n 'settings.export': 'Export',\n 'settings.exportTxt': 'Export TXT',\n 'settings.exportMd': 'Export Markdown',\n 'settings.exported': 'Exported: {file} ({chars} chars, {chapters} chapters)',\n 'progress.generating': 'Writing chapter {no} “{title}”…',\n 'progress.done': 'Chapter {no} done ({chars} chars) → {file}',\n 'progress.reviewed': 'Chapter {no} review: {score} — {verdict}',\n 'progress.error': 'Chapter {no} failed: {message}',\n 'progress.rewriting': 'Revising chapter {no}…',\n 'progress.polishing': 'Polishing chapter {no}…',\n 'progress.empty': 'Generation/review progress appears here',\n 'assistant.hint': 'Discuss plot, characters, foreshadowing with the AI editor; once agreed, let it edit the outline, bible, or chapters directly.',\n 'assistant.placeholder': 'e.g. Add a hook at the end of chapter 2…',\n 'assistant.send': 'Send',\n 'assistant.toolStart': '⚙ Running {name}…',\n 'assistant.toolDone': '✓ {name} done: {detail}',\n 'assistant.toolError': '✗ {name} failed: {detail}',\n 'assistant.empty': 'No conversation yet. Chat with the AI editor.',\n 'status.projectNone': 'No project in the output directory yet. Load an outline first.',\n 'status.files': 'Generated files',\n 'api.error': 'Request failed',\n}\n\n/** Keys type for the zh dictionary. */\nexport type NovelKey = keyof typeof zh\n","/**\n * Tiny translation helper for the panel: reads the zh dict with the en dict\n * as fallback (the family plugins use a full locale registry; the panel keeps\n * a dependency-free helper so the client bundle stays self-contained).\n */\nimport { zh, en, type NovelKey } from '../locales.ts'\n\n/** Translate one key with optional {placeholder} substitution. */\nexport function tt(key: NovelKey, params?: Record<string, string | number>): string {\n let text: string = zh[key] ?? en[key] ?? key\n if (params !== undefined) {\n for (const [name, value] of Object.entries(params)) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n }\n return text\n}\n","/**\n * AI 助手页签:与 AI 编辑对话讨论剧情,助手可通过动作指令直接修改\n * 大纲 / 设定圣经 / 章节。流式渲染回复,工具调用以事件行展示。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AssistantFrame, AssistantMessage } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** One chat bubble (either side). */\ninterface ChatLine {\n id: number\n role: 'user' | 'assistant'\n text: string\n /** Tool events interleaved with the assistant reply. */\n tools: Array<{ name: string; status: 'start' | 'done' | 'error'; detail?: string }>\n /** Live output while a tool runs (generated text streamed into the bubble). */\n live?: string\n}\n\n/** Props. */\nexport interface AssistantTabProps {\n api: NovelApi\n}\n\n/** The assistant conversation tab. */\nexport function AssistantTab({ api }: AssistantTabProps) {\n const [lines, setLines] = useState<ChatLine[]>([])\n const [input, setInput] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const idRef = useRef(0)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n\n /** Append a bubble (or extend the current assistant bubble). */\n const pushLine = useCallback((line: Omit<ChatLine, 'id'>) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n // Extend the live assistant bubble while streaming.\n if (line.role === 'assistant' && last !== undefined && last.role === 'assistant' && last.tools.length === 0) {\n return [...prev.slice(0, -1), { ...last, text: last.text + line.text }]\n }\n return [...prev, { ...line, id: idRef.current++ }]\n })\n }, [])\n\n /** Push a tool event onto the current assistant bubble. */\n const pushTool = useCallback((tool: ChatLine['tools'][number]) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') {\n return [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [tool] }]\n }\n return [...prev.slice(0, -1), { ...last, tools: [...last.tools, tool], live: undefined }]\n })\n }, [])\n\n /** Append live tool output onto the current assistant bubble. */\n const pushToolDelta = useCallback((text: string) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') return prev\n return [...prev.slice(0, -1), { ...last, live: (last.live ?? '') + text }]\n })\n }, [])\n\n /** Load persisted history on mount. */\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const history = await api.assistantHistory()\n if (cancelled) return\n const restored: ChatLine[] = []\n for (const entry of history) {\n if (entry.role === 'user') {\n restored.push({ id: idRef.current++, role: 'user', text: entry.content, tools: [] })\n } else if (entry.role === 'assistant') {\n restored.push({ id: idRef.current++, role: 'assistant', text: entry.content, tools: [] })\n } else if (entry.role === 'tool') {\n const last = restored[restored.length - 1]\n if (last !== undefined && last.role === 'assistant') {\n last.tools.push({ name: entry.tool ?? 'tool', status: 'done', detail: entry.content.slice(0, 120) })\n }\n }\n }\n setLines(restored)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => { cancelled = true }\n }, [api])\n\n /** Auto-scroll to the newest line. */\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight })\n }, [lines])\n\n /** Send one message. */\n const handleSend = async (): Promise<void> => {\n const message = input.trim()\n if (message === '' || busy) return\n setInput('')\n setError('')\n pushLine({ role: 'user', text: message, tools: [] })\n // Start an empty assistant bubble.\n setLines(prev => [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [] }])\n setBusy(true)\n try {\n await api.assistant(message, (frame: AssistantFrame) => {\n if (frame.type === 'delta') {\n pushLine({ role: 'assistant', text: frame.text, tools: [] })\n } else if (frame.type === 'tool') {\n pushTool({\n name: frame.name,\n status: frame.status,\n detail: frame.detail,\n })\n } else if (frame.type === 'toolDelta') {\n pushToolDelta(frame.text)\n } else if (frame.type === 'error') {\n pushTool({ name: 'error', status: 'error', detail: frame.message })\n }\n })\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n <span className={css.cardTitle}>{tt('tab.assistant')}</span>\n <span className={css.meta}>{tt('assistant.hint')}</span>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{tt('common.error')}: {error}</span>}\n <div\n ref={scrollRef}\n className={css.chatScroll}\n >\n {lines.length === 0 && <span className={css.meta}>{tt('assistant.empty')}</span>}\n {lines.map(line => (\n <div key={line.id} className={line.role === 'user' ? css.chatBubbleUser : css.chatBubbleAssistant}>\n {line.role === 'user' && <div className={css.chatRole}>你</div>}\n {line.text !== '' && <div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{line.text}</div>}\n {line.live !== undefined && line.live !== '' && (\n <div className={css.toolLive}>{line.live}</div>\n )}\n {line.tools.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, marginTop: 4, fontSize: 11 }}>\n {line.tools.map((tool, i) => (\n <span key={i} style={{ color: tool.status === 'error' ? 'var(--nf-error)' : tool.status === 'start' ? 'var(--nf-accent)' : 'var(--nf-success)' }}>\n {tool.status === 'start'\n ? tt('assistant.toolStart', { name: tool.name })\n : tool.status === 'done'\n ? tt('assistant.toolDone', { name: tool.name, detail: tool.detail ?? '' })\n : tt('assistant.toolError', { name: tool.name, detail: tool.detail ?? '' })}\n </span>\n ))}\n </div>\n )}\n </div>\n ))}\n {busy && <span className={css.meta} style={{ color: 'var(--nf-accent)' }}>…</span>}\n </div>\n <div className={css.row} style={{ marginTop: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 64, flex: 1 }}\n placeholder={tt('assistant.placeholder')}\n value={input}\n onChange={e => { setInput(e.target.value) }}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n void handleSend()\n }\n }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || input.trim() === ''} onClick={() => { void handleSend() }}>\n {tt('assistant.send')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * 写作资产页签:题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎。\n * 学习自 AI-Novel-Writing-Assistant 的四大资产模块,注入到生成与审稿提示词中。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AntiAiRule, AssetsResponse, GenreNode, ProgressionMode, StyleAsset, StyleTemplate } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface AssetsTabProps {\n api: NovelApi\n}\n\n/** 渲染题材树(带勾选当前题材)。 */\nfunction GenreTree({ node, selected, onSelect }: { node: GenreNode; selected: string; onSelect: (node: GenreNode) => void }) {\n return (\n <div>\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 6, cursor: 'pointer' }}>\n <input type=\"radio\" name=\"genre\" checked={selected === node.name} onChange={() => { onSelect(node) }} />\n <span>\n <b>{node.name}</b>\n {node.description !== '' && <span className={css.meta}> — {node.description}</span>}\n </span>\n </label>\n {node.children.length > 0 && (\n <div style={{ marginLeft: 22, display: 'flex', flexDirection: 'column', gap: 4 }}>\n {node.children.map(child => (\n <GenreTree key={child.name} node={child} selected={selected} onSelect={onSelect} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 写作资产子页签。 */\ntype AssetSubTab = 'genre' | 'progression' | 'templates' | 'rules' | 'style'\n\n/** 子页签定义。 */\nconst SUB_TABS: ReadonlyArray<{ id: AssetSubTab; label: string }> = [\n { id: 'genre', label: '题材基底' },\n { id: 'progression', label: '推进模式' },\n { id: 'templates', label: '预置写法' },\n { id: 'rules', label: '反 AI 规则' },\n { id: 'style', label: '自定义写法' },\n]\n\n/** 写作资产页签。 */\nexport function AssetsTab({ api }: AssetsTabProps) {\n const [assetTab, setAssetTab] = useState<AssetSubTab>('genre')\n const [data, setData] = useState<AssetsResponse | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [sampleText, setSampleText] = useState('')\n const [styleName, setStyleName] = useState('')\n const [newRule, setNewRule] = useState('')\n const [newProgression, setNewProgression] = useState('')\n const loadId = useRef(0)\n\n /** Load assets (or reset from a new call). */\n const refresh = useCallback(async () => {\n try {\n const result = await api.assets()\n setData(result)\n } catch (err) {\n setError((err as Error).message)\n }\n }, [api])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n /** Patch assets and refresh. */\n const patch = async (patch: Parameters<NovelApi['patchAssets']>[0]): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.patchAssets(patch)\n setData(result)\n setNotice('已保存')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 提取写法资产。 */\n const handleExtractStyle = async (): Promise<void> => {\n if (sampleText.trim().length < 50) {\n setError(tt('settings.exported') === '' ? '样本文本过短' : '样本文本过短(<50 字符)')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.styleEngine({ sampleText, name: styleName })\n setData(prev => prev === null ? prev : {\n ...prev,\n projectAssets: {\n ...prev.projectAssets,\n styleAssets: [...(prev.projectAssets.styleAssets ?? []), result.styleAsset],\n updatedAt: new Date().toISOString(),\n },\n })\n setNotice(`写法资产「${result.styleAsset.name}」已提取并绑定`)\n setSampleText('')\n setStyleName('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 添加自定义反 AI 规则(一行 \"名称:要避免的\" 简单格式由用户填写 JSON)。 */\n const handleAddRule = async (): Promise<void> => {\n const text = newRule.trim()\n if (text === '') return\n let rule: AntiAiRule\n try {\n const parsed = JSON.parse(text) as AntiAiRule\n rule = { name: parsed.name ?? '自定义规则', avoid: parsed.avoid ?? '', fix: parsed.fix ?? '' }\n } catch {\n // Fallback: treat as \"避免什么\" text.\n rule = { name: `自定义规则 ${(data?.projectAssets.antiAiRules ?? []).length + 1}`, avoid: text, fix: '' }\n }\n if (rule.avoid === '' && rule.fix === '') return\n const next = [...(data?.projectAssets.antiAiRules ?? []), rule]\n await patch({ antiAiRules: next })\n setNewRule('')\n }\n\n /** 设置题材。 */\n const handleSelectGenre = (node: GenreNode): void => {\n void patch({ genre: node })\n }\n\n /** 添加推进模式(从内置库选择)。 */\n const handleAddProgression = async (mode: ProgressionMode): Promise<void> => {\n const current = data?.projectAssets\n const isPrimary = (data?.projectAssets.primaryProgression ?? undefined) === undefined\n if (isPrimary) {\n await patch({ primaryProgression: { ...mode, primary: true } })\n } else {\n await patch({ auxiliaryProgressions: [...(current?.auxiliaryProgressions ?? []), { ...mode, primary: false }] })\n }\n }\n\n if (data === null) {\n return <div className={css.card}><span className={css.meta}>{tt('common.loading')}</span></div>\n }\n\n const assets = data.projectAssets\n const builtinRules = data.antiAiLibrary\n const customRules = assets.antiAiRules ?? []\n const genreLibrary = data.genreLibrary\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 子页签栏 */}\n <div className={css.tabBar} role=\"tablist\" style={{ padding: '0 0 8px', borderBottom: '1px solid var(--nf-border)' }}>\n {SUB_TABS.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={assetTab === tab.id}\n data-active={assetTab === tab.id ? '' : undefined}\n className={css.tab}\n onClick={() => { setAssetTab(tab.id) }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* 题材基底库 */}\n {assetTab === 'genre' && (\n <div className={css.card}>\n <span className={css.cardTitle}>题材基底库</span>\n <span className={css.meta}>这本书属于哪个阅读市场?题材定位会注入章节生成与审稿提示词。</span>\n {assets.genre !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>当前题材:{assets.genre.name}</b> — {assets.genre.description}\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, maxHeight: 340, overflowY: 'auto' }}>\n {genreLibrary.map(root => <GenreTree key={root.name} node={root} selected={assets.genre?.name ?? ''} onSelect={handleSelectGenre} />)}\n </div>\n </div>\n )}\n\n {/* 推进模式库 */}\n {assetTab === 'progression' && (\n <div className={css.card}>\n <span className={css.cardTitle}>推进模式库</span>\n <span className={css.meta}>读者为什么继续看下一章?主模式 + 辅助模式注入卷规划与章节生成。</span>\n {assets.primaryProgression !== undefined && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12, color: 'var(--nf-accent)' }}>\n <b>主推进:{assets.primaryProgression.name}</b> — {assets.primaryProgression.driver}\n </div>\n )}\n {assets.auxiliaryProgressions.map(mode => (\n <div key={mode.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{mode.name}</b> — {mode.driver}\n </div>\n ))}\n <span className={css.meta}>从内置推进模式库选择添加(第一个设为主推进):</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, maxHeight: 260, overflowY: 'auto' }}>\n {data.progressionLibrary.map(mode => {\n const alreadyPrimary = assets.primaryProgression?.name === mode.name\n const alreadyAux = assets.auxiliaryProgressions.some(m => m.name === mode.name)\n if (alreadyPrimary || alreadyAux) return null\n return (\n <button key={mode.name} className={css.button} disabled={busy} onClick={() => { void handleAddProgression(mode) }}>\n + {assets.primaryProgression === undefined ? `主推进:` : '辅助:'}{mode.name} — {mode.driver.slice(0, 40)}…\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 预置写法模板(一键绑定) */}\n {assetTab === 'templates' && (\n <div className={css.card}>\n <span className={css.cardTitle}>预置写法模板</span>\n <span className={css.meta}>从内置 8 套叙事风格模板中一键选用(来自 AI-Novel-Writing-Assistant 写法引擎),无需样本文本;绑定后生成与润色都遵循该风格。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, maxHeight: 420, overflowY: 'auto' }}>\n {data.styleTemplates.map(template => {\n const bound = assets.styleAssets.some(s => s.name === template.name)\n return (\n <div key={template.key} style={{ border: `1px solid ${bound ? 'var(--nf-accent)' : 'var(--nf-border)'}`, borderRadius: 6, padding: '8px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span><b>{template.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>{template.category}</span></span>\n <button\n className={`${css.button} ${css.buttonSmall} ${bound ? '' : css.buttonPrimary}`}\n disabled={busy || bound}\n onClick={() => {\n const styleAsset: StyleAsset = {\n name: template.name,\n proseRules: [...template.proseRules, ...template.rhythmRules.map(r => `节奏:${r}`)],\n dialogueRules: template.dialogueRules,\n descriptionRules: template.languageRules,\n boundaries: [`模板「${template.name}」适用题材:${template.applicableGenres.join('、')}`, '不要违背模板的叙事单元结构与节奏约束'],\n createdAt: new Date().toISOString(),\n }\n void patch({ styleAssets: [...(data.projectAssets.styleAssets ?? []), styleAsset] })\n }}\n >\n {bound ? '✓ 已绑定' : '+ 绑定'}\n </button>\n </div>\n <div className={css.meta}>{template.description}</div>\n <div className={css.meta}>叙述:{template.proseRules.slice(0, 2).join(';')}</div>\n <div className={css.meta}>台词:{template.dialogueRules.slice(0, 1).join(';')}</div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 反 AI 规则 */}\n {assetTab === 'rules' && (\n <div className={css.card}>\n <span className={css.cardTitle}>反 AI 规则</span>\n <span className={css.meta}>写作时必须遵守的表达边界(内置全局 + 项目自定义),生成与审稿都会检查。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, maxHeight: 280, overflowY: 'auto' }}>\n {builtinRules.map(rule => (\n <div key={rule.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{rule.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>内置</span>\n <div className={css.meta}>避免:{rule.avoid}</div>\n <div className={css.meta}>修正:{rule.fix}</div>\n </div>\n ))}\n {customRules.map(rule => (\n <div key={rule.name} style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{rule.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>自定义</span>\n <div className={css.meta}>避免:{rule.avoid}</div>\n {rule.fix !== '' && <div className={css.meta}>修正:{rule.fix}</div>}\n </div>\n ))}\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder='新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)'\n value={newRule}\n onChange={e => { setNewRule(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || newRule.trim() === ''} onClick={() => { void handleAddRule() }}>+ 添加</button>\n </div>\n </div>\n )}\n\n {/* 自定义写法引擎 */}\n {assetTab === 'style' && (\n <div className={css.card}>\n <span className={css.cardTitle}>自定义写法引擎</span>\n <span className={css.meta}>粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。</span>\n {assets.styleAssets.map(style => (\n <div key={style.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{style.name}</b>\n <div className={css.meta}>叙述:{style.proseRules.slice(0, 3).join(';')}</div>\n {style.dialogueRules.length > 0 && <div className={css.meta}>台词:{style.dialogueRules.slice(0, 2).join(';')}</div>}\n </div>\n ))}\n <textarea\n className={css.textarea}\n style={{ minHeight: 90 }}\n placeholder=\"粘贴样本文本(一段能代表目标风格的文字,50 字以上)…\"\n value={sampleText}\n onChange={e => { setSampleText(e.target.value) }}\n />\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"写法资产名(可选)\"\n value={styleName}\n onChange={e => { setStyleName(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sampleText.trim().length < 50} onClick={() => { void handleExtractStyle() }}>\n 提取并绑定\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * 书架条:显示所有书,点击切换当前书(继续编译),+ 新建。\n */\nimport { useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface BookshelfBarProps {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 刷新整个面板(切换书后重新拉状态)。 */\n onSwitch: () => void\n}\n\n/** 书架条。 */\nexport function BookshelfBar({ api, shelf, onSwitch }: BookshelfBarProps) {\n const [creating, setCreating] = useState(false)\n const [name, setName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const handleCreate = async (): Promise<void> => {\n const bookName = name.trim()\n if (bookName === '') return\n setBusy(true)\n setError('')\n try {\n await api.bookCreate(bookName)\n setCreating(false)\n setName('')\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleActivate = async (id: string): Promise<void> => {\n if (id === shelf.activeBookId) return\n setBusy(true)\n try {\n await api.bookActivate(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleRemove = async (id: string): Promise<void> => {\n setBusy(true)\n try {\n await api.bookRemove(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.bookshelf}>\n <span className={css.bookshelfLabel}>书架</span>\n <div className={css.bookshelfList}>\n {shelf.books.map(book => (\n <div\n key={book.id}\n className={`${css.bookChip} ${book.id === shelf.activeBookId ? css.bookChipActive : ''}`}\n onClick={() => { void handleActivate(book.id) }}\n title={book.outputDir}\n >\n <span className={css.bookChipName}>{book.bookName}</span>\n <span className={css.bookChipMeta}>{book.hasProject ? `${book.done}/${book.total} 章` : '未开书'}</span>\n <button\n type=\"button\"\n className={css.bookChipRemove}\n title=\"从书架移除\"\n onClick={(e) => { e.stopPropagation(); void handleRemove(book.id) }}\n >\n ×\n </button>\n </div>\n ))}\n {!creating ? (\n <button type=\"button\" className={css.bookAdd} onClick={() => { setCreating(true) }}>\n + 新书\n </button>\n ) : (\n <div className={css.bookCreateForm}>\n <input\n className={css.input}\n style={{ width: 140 }}\n placeholder=\"书名\"\n value={name}\n onChange={e => { setName(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}\n autoFocus\n />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || name.trim() === ''} onClick={() => { void handleCreate() }}>\n 创建\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setCreating(false) }}>\n 取消\n </button>\n </div>\n )}\n </div>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>}\n </div>\n )\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/**\n * Browser-side docx outline extraction: a .docx is a zip whose\n * word/document.xml holds the body text in <w:t> runs inside <w:p> paragraphs.\n * Uses fflate (inlined into the client bundle) so the user can pick or drag a\n * docx without any server upload.\n *\n * Import from 'fflate/browser' (not 'fflate'): the default entry resolves to\n * the Node build (esm/index.mjs), which calls module.createRequire() for the\n * optional worker_threads path — inlining that into the browser bundle leaves\n * a bare require(\"module\") the client-modules table cannot answer.\n */\n\nimport { unzipSync, strFromU8 } from 'fflate/browser'\n\n/** Decode the handful of XML entities docx bodies actually use. */\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&')\n .replace(/&nbsp;/g, ' ')\n}\n\n/** Extract plain text from a docx buffer: one line per <w:p> paragraph. */\nexport function extractDocxTextFromBuffer(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n let files: ReturnType<typeof unzipSync>\n try {\n files = unzipSync(bytes)\n } catch (error) {\n throw new Error(`不是有效的 docx(zip 解压失败):${(error as Error).message}`)\n }\n const document = files['word/document.xml']\n if (document === undefined) {\n throw new Error('不是有效的 docx(缺少 word/document.xml)')\n }\n const xml = strFromU8(document)\n\n const paragraphs: string[] = []\n const parts = xml.split(/<w:p\\b[^>]*>/)\n for (let i = 1; i < parts.length; i++) {\n const segment = parts[i]!\n const runs: string[] = []\n const runRe = /<w:t(?:\\s[^>]*)?>([\\s\\S]*?)<\\/w:t>|<w:tab\\b[^>]*\\/>|<w:br\\b[^>]*\\/>/g\n for (const match of segment.matchAll(runRe)) {\n if (match[0].startsWith('<w:tab')) {\n runs.push('\\t')\n } else if (match[0].startsWith('<w:br')) {\n runs.push('\\n')\n } else {\n runs.push(decodeEntities(match[1] ?? ''))\n }\n }\n paragraphs.push(runs.join('').replace(/\\u00a0/g, ' ').trimEnd())\n }\n\n const text = paragraphs.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim()\n if (text.length === 0) {\n throw new Error('docx 中没有可提取的文本')\n }\n return text\n}\n\n/** Read a File as ArrayBuffer. */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return file.arrayBuffer()\n}\n","/**\n * The novel-forge workbench panel: tabs — 工作流 (guided pipeline), 大纲\n * (outline), 章节 (chapter plan + per-chapter write/review/rewrite/polish),\n * 设定库 (story bible), 伏笔 (foreshadows), 设置 (config). Generation and\n * review streams land in the progress console.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { PanelController } from './controller.ts'\nimport { tt } from './helpers.ts'\nimport { AssistantTab } from './AssistantTab.tsx'\nimport { AssetsTab } from './AssetsTab.tsx'\nimport { BookshelfBar } from './BookshelfBar.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n ProjectState,\n ReviewReport,\n StoryBible,\n Volume,\n} from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** The panel's tab identifiers. */\nexport type NovelTab = 'workflow' | 'overview' | 'plan' | 'bible' | 'assets' | 'foreshadow' | 'assistant' | 'settings'\n\n/** Panel shell props. */\nexport interface NovelPanelProps {\n /** The panel state owner (open/close/toggle). */\n controller: PanelController\n /** The API client every tab operates through. */\n api: NovelApi\n}\n\n/** One progress console line. */\ninterface ProgressLine {\n id: number\n text: string\n kind: 'info' | 'done' | 'error'\n}\n\n/** The tab bar definition. */\nconst TABS: ReadonlyArray<{ id: NovelTab; label: string }> = [\n { id: 'workflow', label: tt('tab.workflow') },\n { id: 'overview', label: tt('tab.overview') },\n { id: 'plan', label: tt('tab.plan') },\n { id: 'bible', label: tt('tab.bible') },\n { id: 'assets', label: '写作资产' },\n { id: 'foreshadow', label: tt('tab.foreshadow') },\n { id: 'assistant', label: tt('tab.assistant') },\n { id: 'settings', label: tt('tab.settings') },\n]\n\n/** Whether any chapter is being generated right now. */\nfunction anyGenerating(chapters: ChapterPlan[] | undefined): boolean {\n return (chapters ?? []).some(c => c.status === 'generating' || c.status === 'reviewing')\n}\n\n/** Status badge class + label. */\nfunction statusBadge(chapter: ChapterPlan): { cls: string; label: string } {\n switch (chapter.status) {\n case 'pending': return { cls: css.badgePending, label: tt('plan.pending') }\n case 'generating': return { cls: css.badgeGenerating, label: tt('plan.generating') }\n case 'written': return { cls: css.badgeWritten, label: tt('plan.written') }\n case 'reviewing': return { cls: css.badgeGenerating, label: tt('plan.reviewing') }\n case 'approved': return { cls: css.badgeDone, label: tt('plan.approved') }\n case 'rejected': return { cls: css.badgeRejected, label: tt('plan.rejected') }\n case 'error': return { cls: css.badgeError, label: tt('plan.error') }\n }\n}\n\n/** One review issue line (severity-colored, theme-aware). */\nfunction severityColor(severity: string): string {\n return severity === 'high' ? 'var(--nf-error)' : severity === 'medium' ? 'var(--nf-warn)' : 'var(--nf-info)'\n}\n\n/** The novel-forge panel. */\nexport function NovelPanel({ controller, api }: NovelPanelProps) {\n const [activeTab, setActiveTab] = useState<NovelTab>('workflow')\n const [config, setConfig] = useState<NovelConfig | null>(null)\n const [project, setProject] = useState<ProjectState | null>(null)\n const [generatedFiles, setGeneratedFiles] = useState<string[]>([])\n const [outlineText, setOutlineText] = useState('')\n const [customDocxPath, setCustomDocxPath] = useState('')\n const [shelf, setShelf] = useState<BookshelfSnapshot | null>(null)\n const [dragActive, setDragActive] = useState(false)\n const fileInputRef = useRef<HTMLInputElement | null>(null)\n const [planCount, setPlanCount] = useState(30)\n const [busy, setBusy] = useState(false)\n const [busyLabel, setBusyLabel] = useState('')\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [progress, setProgress] = useState<ProgressLine[]>([])\n const [configDraft, setConfigDraft] = useState<NovelConfig | null>(null)\n const [expandedChapter, setExpandedChapter] = useState<number | null>(null)\n const [chapterText, setChapterText] = useState('')\n const [rewriteInstruction, setRewriteInstruction] = useState('')\n const [localTarget, setLocalTarget] = useState('')\n const progressId = useRef(0)\n\n /** Refresh bookshelf. */\n const refreshShelf = useCallback(async () => {\n try {\n const snapshot = await api.bookshelf()\n setShelf(snapshot)\n } catch { /* shelf is best-effort */ }\n }, [api])\n\n /** Append a progress console line. */\n const pushProgress = useCallback((text: string, kind: ProgressLine['kind'] = 'info') => {\n setProgress(prev => [...prev.slice(-300), { id: progressId.current++, text, kind }])\n }, [])\n\n /** Refresh status (config + project + files). */\n const refresh = useCallback(async (showError = true) => {\n try {\n const status = await api.status()\n setConfig(status.config)\n setConfigDraft(status.config)\n setProject(status.project ?? null)\n setGeneratedFiles(status.generatedFiles)\n const nextOutline = status.project?.outline\n if (nextOutline !== undefined && outlineText === '') {\n setOutlineText(nextOutline)\n }\n } catch (err) {\n if (showError) setError((err as Error).message)\n }\n }, [api, outlineText])\n\n /** Handle a docx file (pick or drag): parse locally, save outline. */\n const handleDocxFile = useCallback(async (file: File) => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const buffer = await file.arrayBuffer()\n const outline = extractDocxTextFromBuffer(buffer)\n if (outline.length < 50) {\n throw new Error('大纲内容过短(<50 字符),请检查文件')\n }\n setOutlineText(outline)\n await api.saveOutline(outline)\n await refresh(false)\n pushProgress(`已从「${file.name}」读取大纲(${outline.length} 字)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }, [api, pushProgress, refresh])\n\n useEffect(() => {\n void refresh()\n void refreshShelf()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** Load the outline from docx (default path or custom). */\n const handleLoadDocx = async (useCustom: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const result = await api.loadOutline(useCustom ? customDocxPath || undefined : undefined)\n setOutlineText(result.outline)\n // Persist into the project (load-or-create).\n await api.saveOutline(result.outline)\n await refresh(false)\n pushProgress(`大纲已读取(${result.chars} 字):${result.bookName}${result.path !== undefined ? ` ← ${result.path}` : ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the edited outline. */\n const handleSaveOutline = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.saveOutline(outlineText)\n setNotice(tt('overview.saved'))\n pushProgress(tt('overview.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Extract the story bible. */\n const handleBible = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('bible.gen'))\n setError('')\n try {\n const result = await api.bible(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n const bible: StoryBible = result.bible\n pushProgress(tt('workflow.bibleDone', {\n n: bible.worldRules.length,\n c: bible.characters.length,\n r: bible.redLines.length,\n }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提炼设定圣经失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Plan volumes. */\n const handleVolumes = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('workflow.genVolumes'))\n setError('')\n try {\n const result = await api.volumes(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, volumes: result.volumes, updatedAt: new Date().toISOString() })\n pushProgress(tt('workflow.volumesDone', { n: result.volumes.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成卷计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Generate the chapter plan via LLM. */\n const handlePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('plan.generate'))\n setError('')\n try {\n const result = await api.plan(outlineText || undefined, planCount)\n setProject(prev => {\n const base = prev ?? {\n bookName: '', outline: outlineText, chapters: [] as ChapterPlan[],\n foreshadows: [] as Foreshadow[], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),\n }\n return { ...base, chapters: [...base.chapters, ...result.chapters], updatedAt: new Date().toISOString() }\n })\n pushProgress(tt('workflow.planDone', { n: result.chapters.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成章节计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Shared frame handler for generate/rewrite/polish streams. */\n const applyJobFrame = useCallback((frame: JobFrame, label: (no: number) => string) => {\n if (frame.type === 'start') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'generating', error: undefined } : c),\n })\n pushProgress(label(frame.no))\n } else if (frame.type === 'delta') {\n if (frame.text.length % 3000 < 600) {\n pushProgress(`…已生成 ${frame.text.length} 字`)\n }\n } else if (frame.type === 'done' || frame.type === 'rewritten') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'written', chars: frame.chars, file: frame.file, review: undefined } : c),\n })\n pushProgress(tt('progress.done', { no: frame.no, chars: frame.chars, file: frame.file }), 'done')\n setGeneratedFiles(prev => prev.includes(frame.file) ? prev : [...prev, frame.file])\n } else if (frame.type === 'review') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: frame.report.passed ? 'approved' : 'rejected', review: frame.report } : c),\n })\n pushProgress(tt('progress.reviewed', {\n no: frame.no,\n score: frame.report.score,\n verdict: frame.report.verdict,\n }), frame.report.passed ? 'done' : 'error')\n } else if (frame.type === 'error') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'error', error: frame.message } : c),\n })\n pushProgress(tt('progress.error', { no: frame.no, message: frame.message }), 'error')\n }\n }, [pushProgress])\n\n /** Generate one chapter, streaming frames into the console. */\n const handleWriteChapter = async (no: number, skipReview: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.write')} 第${no}章`)\n setError('')\n try {\n await api.generate(no, skipReview, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Batch-write all remaining chapters in sequence. */\n const handleWriteAll = async (): Promise<void> => {\n const remaining = chapters.filter(c => c.status === 'pending' || c.status === 'error')\n if (remaining.length === 0) return\n setBusy(true)\n setBusyLabel(`${tt('plan.writeAllPending')}(共 ${remaining.length} 章)`)\n setError('')\n let failed = 0\n for (const chapter of remaining) {\n pushProgress(`▶ 开始生成第 ${chapter.no} 章《${chapter.title}》`)\n try {\n await api.generate(chapter.no, true, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n } catch (err) {\n failed++\n pushProgress(`第 ${chapter.no} 章失败:${(err as Error).message}`, 'error')\n }\n }\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n pushProgress(failed === 0\n ? `批量生成完成:${remaining.length} 章全部完成`\n : `批量生成结束:${remaining.length - failed} 章完成,${failed} 章失败`, failed === 0 ? 'done' : 'error')\n }\n\n /** Review one chapter. */\n const handleReview = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.review')} 第${no}章`)\n setError('')\n try {\n const result = await api.review(no)\n const report: ReviewReport = result.report\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: report.passed ? 'approved' : 'rejected', review: report } : c),\n })\n pushProgress(tt('progress.reviewed', { no, score: report.score, verdict: report.verdict }), report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Rewrite one chapter (whole-chapter or local target). */\n const handleRewrite = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${no}章`)\n setError('')\n try {\n await api.rewrite(no, rewriteInstruction, localTarget, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n setRewriteInstruction('')\n setLocalTarget('')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Polish one chapter. */\n const handlePolish = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.polish')} 第${no}章`)\n setError('')\n try {\n await api.polish(no, frame => { applyJobFrame(frame, n => tt('progress.polishing', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章润色失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Approve a chapter manually. */\n const handleApprove = (no: number): void => {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n updatedAt: new Date().toISOString(),\n })\n }\n\n /** Toggle chapter preview. */\n const handleToggleChapter = async (no: number): Promise<void> => {\n if (expandedChapter === no) {\n setExpandedChapter(null)\n setChapterText('')\n return\n }\n setExpandedChapter(no)\n setChapterText('')\n try {\n const result = await api.chapter(no)\n setChapterText(result.markdown)\n } catch (err) {\n setChapterText(`(${(err as Error).message})`)\n }\n }\n\n /** Suggest foreshadows via LLM. */\n const handleSuggestForeshadows = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('foreshadow.suggest'))\n setError('')\n try {\n const result = await api.foreshadow({ suggest: true })\n setProject(prev => prev === null ? prev : { ...prev, foreshadows: [...(prev?.foreshadows ?? []), ...result.foreshadows], updatedAt: new Date().toISOString() })\n pushProgress(`AI 已建议 ${result.foreshadows.length} 条伏笔`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`伏笔建议失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the settings draft. */\n const handleSaveConfig = async (): Promise<void> => {\n if (configDraft === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.patchConfig({\n outlinePath: configDraft.outlinePath,\n outputDir: configDraft.outputDir,\n provider: configDraft.provider,\n model: configDraft.model,\n chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\n })\n setConfig(result.config)\n setConfigDraft(result.config)\n setNotice(tt('settings.saved'))\n pushProgress(tt('settings.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the book. */\n const handleExport = async (format: 'txt' | 'md'): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.exportBook(format)\n setNotice(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }))\n pushProgress(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }), 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const busyAny = anyGenerating(project?.chapters)\n const chapters = project?.chapters ?? []\n const doneCount = chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n const pendingCount = chapters.filter(c => c.status === 'pending' || c.status === 'error').length\n const bible: StoryBible | undefined = project?.bible\n const volumes: Volume[] | undefined = project?.volumes\n const foreshadows: Foreshadow[] = project?.foreshadows ?? []\n\n /** Workflow timeline row: step dot + connector + label + optional action. */\n const workflowRow = (stepNo: number, done: boolean, label: string, hint: string, buttonLabel: string, onClick: () => void, disabled: boolean) => (\n <div className={css.workflowRow}>\n <span className={`${css.workflowDot} ${done ? css.workflowDotDone : css.workflowDotActive}`}>{done ? '✓' : stepNo}</span>\n <div className={css.workflowBody}>\n <span className={css.workflowLabel}>{label}</span>\n <span className={css.workflowHint}>{hint}</span>\n </div>\n {!done && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={disabled || busy} onClick={onClick}>\n {buttonLabel}\n </button>\n )}\n </div>\n )\n\n return (\n <div className={css.panel}>\n <div className={css.panelHeader}>\n <h2 className={css.panelTitle}>\n {tt('panel.title')}\n {project?.bookName !== '' && project?.bookName !== undefined && (\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)', fontSize: 11 }}>{project.bookName}</span>\n )}\n </h2>\n <button type=\"button\" className={css.iconButton} title={tt('common.close')} aria-label={tt('common.close')} onClick={() => { controller.close() }}>×</button>\n </div>\n {shelf !== null && (\n <BookshelfBar\n api={api}\n shelf={shelf}\n onSwitch={() => {\n void refreshShelf()\n // 切换书后重置本地编辑状态,重新拉取目标书。\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n void refresh(false)\n }}\n />\n )}\n <div className={css.tabBar} role=\"tablist\">\n {TABS.map(tab => (\n <button key={tab.id} type=\"button\" role=\"tab\" aria-selected={activeTab === tab.id} data-active={activeTab === tab.id ? '' : undefined} className={css.tab} onClick={() => { setActiveTab(tab.id) }}>\n {tab.label}\n </button>\n ))}\n </div>\n <div className={css.panelContent}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n {busy && busyLabel !== '' && <div className={css.card}><span style={{ color: 'var(--nf-accent)' }}>{busyLabel}…</span></div>}\n\n {activeTab === 'workflow' && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('workflow.title')}</span>\n <div className={css.meta}>{tt('workflow.progress', {\n bible: bible !== undefined ? '✓' : '—',\n volumes: volumes !== undefined ? '✓' : '—',\n plan: chapters.length > 0 ? '✓' : '—',\n done: doneCount,\n total: chapters.length,\n })}</div>\n <div className={css.workflowList}>\n {workflowRow(1, project !== null, tt('workflow.step1'), '从 docx 或粘贴文本导入全书大纲', tt('workflow.loadOutline'), () => { void handleLoadDocx(false) }, false)}\n {workflowRow(2, bible !== undefined, tt('workflow.step2'), '提炼人设 / 世界观 / 金手指规则 / 写作红线', tt('workflow.genBible'), () => { void handleBible() }, project === null)}\n {workflowRow(3, volumes !== undefined, tt('workflow.step3'), '按剧情弧线划分全书卷结构', tt('workflow.genVolumes'), () => { void handleVolumes() }, project === null)}\n {workflowRow(4, chapters.length > 0, tt('workflow.step4'), '每章标题 + 剧情要点 + 字数目标', tt('workflow.genPlan'), () => { void handlePlan() }, project === null)}\n {workflowRow(5, doneCount > 0, tt('workflow.step5'), '逐章生成,自动摘要 + AI 审稿', tt('plan.write'), () => { setActiveTab('plan') }, false)}\n {workflowRow(6, doneCount > 0, tt('workflow.step6'), '去 AI 味润色 / 导出全本', tt('settings.exportTxt'), () => { void handleExport('txt') }, false)}\n </div>\n </div>\n )}\n\n {activeTab === 'overview' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.overview')}</span>\n {project !== null && <span className={css.meta}>{tt('overview.bookName')}: {project.bookName}</span>}\n </div>\n {/* 拖拽 / 文件选择导入 docx */}\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { fileInputRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>点击选择本机 docx 大纲,或将文件拖到这里</span>\n <span className={css.meta}>也支持粘贴文本到下方编辑区</span>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n e.target.value = ''\n }}\n />\n </div>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>{tt('overview.outlineChars')}: {outlineText.length}</span>\n <button type=\"button\" className={css.button} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n {tt('overview.saveOutline')}\n </button>\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder={tt('overview.outlineHint')}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </div>\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('status.files')}({generatedFiles.length})</span>\n <div className={css.fileList}>\n {generatedFiles.length === 0 && <span>{tt('status.projectNone')}</span>}\n {generatedFiles.map(file => <span key={file}>{file}</span>)}\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'plan' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.plan')}</span>\n <div className={css.row}>\n <span className={css.meta}>{tt('plan.generateHint')}</span>\n <input\n className={css.input}\n style={{ width: 72 }}\n type=\"number\"\n min={1}\n max={200}\n value={planCount}\n onChange={e => { const v = Number(e.target.value); if (Number.isInteger(v)) setPlanCount(v) }}\n />\n <span className={css.meta}>{tt('plan.count')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handlePlan() }}>\n {tt('plan.generate')}\n </button>\n </div>\n </div>\n {volumes !== undefined && volumes.length > 0 && (\n <div className={css.row}>\n {volumes.map(v => (\n <span key={v.no} className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>\n {v.no}. {v.title}({v.chapterStart}-{v.chapterEnd})\n </span>\n ))}\n </div>\n )}\n </div>\n\n {chapters.length > 0 && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>共 {chapters.length} 章 · 已完成 {doneCount} · 待生成 {pendingCount}</span>\n {pendingCount > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWriteAll() }}>\n {tt('plan.writeAllPending')}({pendingCount})\n </button>\n )}\n </div>\n <div className={css.chapterList}>\n {chapters.map(chapter => {\n const badge = statusBadge(chapter)\n const expanded = expandedChapter === chapter.no\n const review: ReviewReport | undefined = chapter.review\n return (\n <div key={chapter.no} className={css.chapter}>\n <span className={css.chapterNum}>{chapter.no}</span>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ padding: '1px 6px' }} onClick={() => { void handleToggleChapter(chapter.no) }}>\n {expanded ? '−' : '+'}\n </button>\n <span>{chapter.title}</span>\n {chapter.status === 'approved' && chapter.chars !== undefined && (\n <span className={css.meta}>{chapter.chars}{tt('common.chars')}</span>\n )}\n {chapter.volume > 0 && <span className={css.meta}>{tt('plan.volumes')}{chapter.volume}</span>}\n </div>\n {!expanded && <div className={css.chapterBeats} title={chapter.beats}>{chapter.beats}</div>}\n {expanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta}><b>{tt('plan.beats')}:</b> {chapter.beats}</div>\n {chapter.summary !== undefined && chapter.summary !== '' && (\n <div className={css.meta}><b>{tt('plan.summary')}:</b> {chapter.summary}</div>\n )}\n <pre className={css.chapterPreview}>{chapterText || `(${tt('common.loading')})`}</pre>\n {review !== undefined && (\n <div className={css.reviewBox}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('plan.reviewReport')}</b>\n <span style={{ color: review.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {tt('plan.reviewScore')}: {review.score} — {review.passed ? tt('plan.reviewPass') : tt('plan.reviewFail')}\n </span>\n </div>\n <div className={css.meta}><b>{tt('plan.reviewVerdict')}:</b> {review.verdict}</div>\n {review.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>\n {review.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity) }}>\n [{issue.severity}] {issue.item} → {issue.suggestion}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {(chapter.status === 'rejected' || chapter.status === 'written' || chapter.status === 'approved') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta} style={{ fontWeight: 600 }}>修订(可整章或局部)</div>\n <div className={css.field}>\n <label className={css.fieldLabel}>要修改的原文片段(从上面正文复制一段;留空 = 整章修订)</label>\n <textarea\n className={css.textarea}\n style={{ minHeight: 56 }}\n placeholder=\"例如:林越咬紧牙关:…(复制正文中的原句)\"\n value={localTarget}\n onChange={e => { setLocalTarget(e.target.value) }}\n />\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"修订指令(如:这段对话太生硬,改得更口语化)\"\n value={rewriteInstruction}\n onChange={e => { setRewriteInstruction(e.target.value) }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || busyAny} onClick={() => { void handleRewrite(chapter.no) }}>\n {tt('plan.rewrite')}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n <span className={`${css.badge} ${badge.cls}`}>{badge.label}</span>\n <div className={css.chapterActions}>\n {(chapter.status === 'pending' || chapter.status === 'error') && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || busyAny}\n onClick={() => { void handleWriteChapter(chapter.no, true) }}\n >\n {tt('plan.write')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReview(chapter.no) }}>\n {tt('plan.review')}\n </button>\n )}\n {chapter.status === 'written' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { handleApprove(chapter.no) }}>\n {tt('plan.approve')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handlePolish(chapter.no) }}>\n {tt('plan.polish')}\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleWriteChapter(chapter.no, true) }}>\n {tt('plan.rewrite')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('plan.progress')}</span>\n <div className={css.progress}>\n {progress.length === 0 && <span className={css.meta}>{tt('progress.empty')}</span>}\n {progress.map(line => (\n <div key={line.id} className={line.kind === 'done' ? css.progressLineDone : line.kind === 'error' ? css.progressLineError : css.progressLine}>\n {line.text}\n </div>\n ))}\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'bible' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('bible.title')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBible() }}>\n {tt('bible.gen')}\n </button>\n </div>\n {bible === undefined ? (\n <span className={css.meta}>{tt('bible.none')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {bible.genre !== '' && (\n <div><b>{tt('bible.genre')}:</b> <span className={css.meta}>{bible.genre}</span></div>\n )}\n {bible.worldRules.length > 0 && (\n <div>\n <b>{tt('bible.worldRules')}({bible.worldRules.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.worldRules.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n {bible.characters.length > 0 && (\n <div>\n <b>{tt('bible.characters')}({bible.characters.length})</b>\n {bible.characters.map(card => (\n <div key={card.name} style={{ marginTop: 4, fontSize: 12 }}>\n <b>{card.name}</b> <span className={css.meta}>[{card.role}] {card.traits.join('、')}</span>\n {card.goals !== '' && <div className={css.meta}>目标:{card.goals}</div>}\n {card.relations !== '' && <div className={css.meta}>关系:{card.relations}</div>}\n </div>\n ))}\n </div>\n )}\n {bible.redLines.length > 0 && (\n <div>\n <b>{tt('bible.redLines')}({bible.redLines.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12, color: 'var(--nf-error)' }}>{bible.redLines.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n {bible.style.length > 0 && (\n <div>\n <b>{tt('bible.style')}({bible.style.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.style.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'assets' && (\n <AssetsTab api={api} />\n )}\n\n {activeTab === 'foreshadow' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('foreshadow.title')}({foreshadows.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSuggestForeshadows() }}>\n {tt('foreshadow.suggest')}\n </button>\n </div>\n {foreshadows.length === 0 ? (\n <span className={css.meta}>{tt('foreshadow.none')}</span>\n ) : (\n <div className={css.chapterList}>\n {foreshadows.map(f => {\n const statusLabel = { planned: tt('foreshadow.planned'), planted: tt('foreshadow.planted'), progressing: tt('foreshadow.progressing'), resolved: tt('foreshadow.resolved'), abandoned: tt('foreshadow.abandoned') }[f.status]\n const statusColor = f.status === 'resolved' ? 'var(--nf-success)' : f.status === 'planted' || f.status === 'progressing' ? 'var(--nf-accent)' : f.status === 'abandoned' ? 'var(--nf-text-3)' : 'var(--nf-info)'\n return (\n <div key={f.id} className={css.chapter}>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <span>{f.description}</span>\n </div>\n <div className={css.meta}>\n {f.plantedChapter !== undefined && <span>{tt('foreshadow.plantedAt')} 第{f.plantedChapter}章 · </span>}\n {f.targetChapter !== undefined && <span>{tt('foreshadow.target')} 第{f.targetChapter}章 · </span>}\n {f.resolvedNote !== undefined && f.resolvedNote !== '' && <span>回收:{f.resolvedNote} · </span>}\n </div>\n </div>\n <span className={css.badge} style={{ borderColor: statusColor, color: statusColor }}>{statusLabel}</span>\n <div className={css.row} style={{ gap: 4 }}>\n {f.status === 'planned' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'planted', plantedChapter: doneCount + 1 }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setPlanted')}\n </button>\n )}\n {(f.status === 'planted' || f.status === 'progressing') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'resolved', resolvedNote: `第${doneCount}章回收` }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setResolved')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'assistant' && (\n <AssistantTab api={api} />\n )}\n\n {activeTab === 'settings' && configDraft !== null && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.title')}</span>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outlinePath')}</label>\n <input className={css.input} value={configDraft.outlinePath} onChange={e => { setConfigDraft({ ...configDraft, outlinePath: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outputDir')}</label>\n <input className={css.input} value={configDraft.outputDir} onChange={e => { setConfigDraft({ ...configDraft, outputDir: e.target.value }) }} />\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.provider')}</label>\n <input className={css.input} value={configDraft.provider} onChange={e => { setConfigDraft({ ...configDraft, provider: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <input className={css.input} value={configDraft.model} onChange={e => { setConfigDraft({ ...configDraft, model: e.target.value }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.chapterChars')}</label>\n <input className={css.input} type=\"number\" min={1000} max={20000} value={configDraft.chapterChars} onChange={e => { setConfigDraft({ ...configDraft, chapterChars: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.maxTokens')}</label>\n <input className={css.input} type=\"number\" min={2000} max={64000} value={configDraft.maxTokens} onChange={e => { setConfigDraft({ ...configDraft, maxTokens: Number(e.target.value) }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reviewPassScore')}</label>\n <input className={css.input} type=\"number\" min={0} max={100} value={configDraft.reviewPassScore} onChange={e => { setConfigDraft({ ...configDraft, reviewPassScore: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n </div>\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveConfig() }}>\n {tt('settings.save')}\n </button>\n <button type=\"button\" className={css.button} onClick={() => { void api.openFolder() }}>\n {tt('settings.openFolder')}\n </button>\n <span className={css.meta}>当前:{config?.provider} / {config?.model} · {config?.outputDir}</span>\n </div>\n <div className={css.row}>\n <span className={css.cardTitle}>{tt('settings.export')}</span>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('txt') }}>\n {tt('settings.exportTxt')}\n </button>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('md') }}>\n {tt('settings.exportMd')}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Panel view mounting — mirrors the family plugins: a container appended\n * inside the conversation grid item, hidden while inactive; toggling is a\n * data attribute on <html>, with cross-plugin activation events.\n */\nimport { createRoot, type Root } from 'react-dom/client'\nimport type { NovelApi } from './api.ts'\nimport type { PanelController } from './panel/controller.ts'\nimport { NovelPanel } from './panel/NovelPanel.tsx'\nimport css from './panel/panel.module.css'\n\n/** The injected panel container. */\nexport const PANEL_VIEW_SELECTOR = '[data-dsh-novelforge-view]'\n\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"]'\nconst ACTIVE_ATTR = 'data-dsh-novelforge-active'\n/** Sibling panels' activation attributes (evicted when this panel opens). */\nconst OTHER_ACTIVE_ATTRS = ['data-dsh-taskboard-active', 'data-dsh-ssh-active']\n/** Cross-plugin activation event; detail is the activating panel name. */\nconst ACTIVATE_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'novelforge'\n\n/** Find the center column, or undefined while the frame is not mounted. */\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\n/**\n * Mount the panel React tree into the center column and bind visibility to\n * the controller.\n */\nexport function mountPanel(controller: PanelController, api: NovelApi): () => void {\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n\n const ensure = (): void => {\n if (container !== undefined) {\n if (container.isConnected) return\n root?.unmount()\n root = undefined\n container.remove()\n container = undefined\n }\n const column = conversationColumn()\n if (column === undefined) return\n container = document.createElement('div')\n container.dataset.dshNovelforgeView = 'true'\n container.className = css.view\n column.appendChild(container)\n root = createRoot(container)\n root.render(<NovelPanel controller={controller} api={api} />)\n }\n\n const waitObserver = new MutationObserver(() => { ensure() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const applyActive = (): void => {\n if (controller.getSnapshot().panelOpen) {\n for (const attr of OTHER_ACTIVE_ATTRS) document.documentElement.removeAttribute(attr)\n document.documentElement.setAttribute(ACTIVE_ATTR, '')\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n }\n }\n const onOtherActivate = (event: Event): void => {\n const detail = (event as CustomEvent).detail\n if ((detail === 'taskboard' || detail === 'ssh') && controller.getSnapshot().panelOpen) {\n controller.close()\n }\n }\n // Jump out on sidebar context clicks.\n const SIDEBAR_ROW_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n const onClickSidebarRow = (event: MouseEvent): void => {\n if (!controller.getSnapshot().panelOpen) return\n const target = event.target as HTMLElement | null\n if (target === null) return\n if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) controller.close()\n }\n document.addEventListener('click', onClickSidebarRow, true)\n document.addEventListener(ACTIVATE_EVENT, onOtherActivate)\n const unsubscribe = controller.subscribe(applyActive)\n applyActive()\n ensure()\n\n return () => {\n document.removeEventListener('click', onClickSidebarRow, true)\n document.removeEventListener(ACTIVATE_EVENT, onOtherActivate)\n waitObserver.disconnect()\n unsubscribe()\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n}\n","/**\n * Novel-forge panel controller: the single owner of the panel's open/closed\n * state (framework-free, mirroring the family plugins' controllers).\n */\n\n/** Immutable controller snapshot for UI subscriptions. */\nexport interface PanelControllerSnapshot {\n panelOpen: boolean\n}\n\n/** The panel state owner the sidebar entry toggles and the view renders from. */\nexport class PanelController {\n private panelOpen = false\n private listeners = new Set<() => void>()\n\n getSnapshot(): PanelControllerSnapshot {\n return { panelOpen: this.panelOpen }\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn)\n return () => { this.listeners.delete(fn) }\n }\n\n open(): void {\n if (this.panelOpen) return\n this.panelOpen = true\n this.notify()\n }\n\n close(): void {\n if (!this.panelOpen) return\n this.panelOpen = false\n this.notify()\n }\n\n toggle(): void {\n if (this.panelOpen) this.close()\n else this.open()\n }\n\n private notify(): void {\n for (const fn of [...this.listeners]) fn()\n }\n}\n","/**\n * Sidebar entry injection — mirrors the family plugins' DOM-level pattern:\n * the shell exposes no external slot, so the entry row is injected after the\n * sibling plugin entries and self-heals via MutationObserver.\n */\nimport type { PanelController } from './panel/controller.ts'\nimport { tt } from './panel/helpers.ts'\nimport css from './panel/panel.module.css'\n\n/** Stable data attribute identifying the injected entry row. */\nexport const ENTRY_SELECTOR = '[data-dsh-novelforge-entry]'\n\n/** Inline icon: an open book / writing glyph. */\nconst ICON = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 3.5h4a2 2 0 0 1 2 2v7a2 2 0 0 0-2-2h-4z\"/><path d=\"M13.5 3.5h-4a2 2 0 0 0-2 2v7a2 2 0 0 1 2-2h4z\"/><path d=\"M8 5.5v7\"/></svg>'\n\n/** Find the sidebar shell root element. */\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>('[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]')\n if (column === null) return undefined\n const logoOwner = column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n return logoOwner ?? (column.firstElementChild as HTMLElement | undefined)\n}\n\n/** The New Session button (nested in the logo row on current shells). */\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child.tagName === 'BUTTON') return child as HTMLButtonElement\n }\n return undefined\n}\n\n/** Build the entry row (a detached button; insert once the shell is up). */\nfunction createEntry(controller: PanelController): HTMLButtonElement {\n const entry = document.createElement('button')\n entry.type = 'button'\n entry.dataset.dshNovelforgeEntry = 'true'\n entry.className = css.entry\n entry.setAttribute('aria-label', tt('entry.label'))\n entry.setAttribute('title', tt('entry.tooltip'))\n entry.innerHTML = '<span class=\"' + css.entryIcon + '\">' + ICON + '</span><span class=\"' + css.entryLabel + '\">' + tt('entry.label') + '</span>'\n entry.addEventListener('click', () => { controller.toggle() })\n return entry\n}\n\n/** Re-insert the entry after the sibling plugin entry block. */\nfunction placeEntry(root: HTMLElement, entry: HTMLButtonElement): boolean {\n const button = newSessionButton(root)\n if (button === undefined) return false\n if (entry.parentElement !== root) {\n const row = button.closest('[class*=\"logoRow\"]')\n const base = (row !== null && row.parentElement === root) ? row : button\n const family = Array.from(root.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.matches('[data-dsh-taskboard-entry], [data-dsh-ssh-entry], [data-dsh-novelforge-entry]'),\n )\n const last = family.length > 0 ? family[family.length - 1] : undefined\n const anchor = last !== undefined ? last.nextElementSibling : base.nextElementSibling\n root.insertBefore(entry, anchor)\n }\n return true\n}\n\n/**\n * Mount the sidebar entry, waiting for the shell and self-healing on\n * re-renders.\n */\nexport function mountSidebarEntry(controller: PanelController): () => void {\n const entry = createEntry(controller)\n let root: HTMLElement | undefined\n let placed = false\n\n const tryPlace = (): void => {\n if (root !== undefined && !root.isConnected) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n if (placed) {\n if (document.body.contains(entry)) return\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n root ??= sidebarRoot()\n if (root === undefined) return\n placed = placeEntry(root, entry)\n if (placed) {\n rootObserver.observe(root, { childList: true, subtree: true })\n }\n }\n\n const waitObserver = new MutationObserver(() => { tryPlace() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const rootObserver = new MutationObserver(() => {\n if (root === undefined || !root.isConnected) {\n placed = false\n tryPlace()\n return\n }\n if (!root.contains(entry)) {\n placed = placeEntry(root, entry)\n }\n })\n\n const syncActive = () => {\n if (controller.getSnapshot().panelOpen) entry.dataset.active = 'true'\n else delete entry.dataset.active\n }\n const unsubscribe = controller.subscribe(syncActive)\n syncActive()\n\n tryPlace()\n\n return () => {\n waitObserver.disconnect()\n rootObserver.disconnect()\n unsubscribe()\n entry.remove()\n }\n}\n","/**\n * Browser-half entry for the dsh-novel-forge plugin — runs inside the dsh web\n * GUI. Registers the sidebar entry row and the workbench panel. DOM mounting\n * problems are logged, never thrown — the web shell fails the whole boot when\n * a plugin apply throws.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport { NovelApi } from './api.ts'\nimport { mountPanel } from './mount.tsx'\nimport { PanelController } from './panel/controller.ts'\nimport { mountSidebarEntry } from './sidebar-entry.ts'\n\n/** Required services (fiber inject waiting). */\nexport const inject = ['slots', 'locale']\n\n/**\n * Mount the novel-forge workbench.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n const controller = new PanelController()\n const api = new NovelApi()\n const disposers: Array<() => void> = []\n try {\n disposers.push(mountSidebarEntry(controller))\n disposers.push(mountPanel(controller, api))\n } catch (error) {\n // DOM failures degrade the panel, never the GUI.\n console.warn('[dsh-novel-forge] mount failed:', error)\n }\n ctx.effect(() => () => {\n for (const dispose of disposers.splice(0)) dispose()\n }, 'dsh-novel-forge: ui mounts')\n}\n"],"x_google_ignoreList":[7],"mappings":";;;;;;;;;;;;;;;;;EAQA,MAAa,YAAY;GACvB,QAAQ;GACR,aAAa;GACb,aAAa;GACb,MAAM;GACN,SAAS;GACT,OAAO;GACP,QAAQ;GACR,aAAa;GACb,UAAU;GACV,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,SAAS;GACT,WAAW;GACX,kBAAkB;GAClB,WAAW;GACX,QAAQ;GACR,YAAY;EACd;;;;;;;;;ECFA,IAAa,gBAAb,cAAmC,MAAM;GACvC,YAAY,SAAiB;IAC3B,MAAM,OAAO;IACb,KAAK,OAAO;GACd;EACF;;EAGA,eAAe,SAAY,UAAgC;GACzD,IAAI;GACJ,IAAI;IACF,OAAO,MAAM,SAAS,KAAK;GAC7B,QAAQ;IACN,MAAM,IAAI,cAAc,QAAQ,SAAS,OAAO,wBAAwB;GAC1E;GACA,IAAI,CAAC,SAAS,IAIZ,MAAM,IAAI,cAHM,OAAO,SAAS,YAAY,SAAS,QAAQ,OAAQ,KAA6B,UAAU,WACvG,KAA2B,QAC5B,QAAQ,SAAS,QACU;GAEjC,OAAO;EACT;;EAGA,eAAe,SAAY,MAAc,SAA8B;GAMrE,OAAO,SAAY,MALI,MAAM,MAAM;IACjC,QAAQ;IACR,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU,OAAO;GAC9B,CAAC,CAC0B;EAC7B;;EAGA,IAAa,WAAb,MAAsB;GACpB,MAAM,SAAkC;IAEtC,OAAO,SAAyB,MADT,MAAM,UAAU,MAAM,CACL;GAC1C;GAEA,MAAM,YAAY,MAAe,MAA6C;IAC5E,OAAO,SAA8B,UAAU,aAAa;KAAE;KAAM;IAAK,CAAC;GAC5E;GAEA,MAAM,YAAY,MAA0D;IAC1E,OAAO,SAA4C,UAAU,aAAa,EAAE,KAAK,CAAC;GACpF;GAEA,MAAM,KAAK,SAAkB,cAAuB,QAAwC;IAC1F,OAAO,SAAuB,UAAU,MAAM;KAAE;KAAS;KAAc;IAAO,CAAC;GACjF;GAEA,MAAM,QAAQ,SAA4C;IACxD,OAAO,SAA0B,UAAU,SAAS,EAAE,QAAQ,CAAC;GACjE;GAEA,MAAM,MAAM,SAA0C;IACpD,OAAO,SAAwB,UAAU,OAAO,EAAE,QAAQ,CAAC;GAC7D;GAEA,MAAM,OAAO,WAAsD;IACjE,OAAO,SAAmC,UAAU,QAAQ,EAAE,UAAU,CAAC;GAC3E;GAEA,MAAM,UAAU,WAAiD;IAC/D,OAAO,SAA8B,UAAU,SAAS,EAAE,UAAU,CAAC;GACvE;GAEA,MAAM,WAAW,KAAqD;IACpE,OAAO,SAA6B,UAAU,YAAY,GAAG;GAC/D;GAEA,MAAM,WAAW,QAA+C;IAC9D,OAAO,SAAyB,UAAU,YAAY,EAAE,OAAO,CAAC;GAClE;GAEA,MAAM,QAAQ,IAAsC;IAElD,OAAO,SAA0B,MADV,MAAM,GAAG,UAAU,QAAQ,MAAM,IAAI,CACnB;GAC3C;GAEA,MAAM,YAAY,OAAsD;IACtE,OAAO,SAAkC,UAAU,QAAQ,KAAK;GAClE;GAEA,MAAM,aAA4B;IAChC,MAAM,MAAM,UAAU,YAAY;KAAE,QAAQ;KAAQ,SAAS,EAAE,gBAAgB,mBAAmB;KAAG,MAAM;IAAK,CAAC;GACnH;;GAGA,MAAM,YAAiE;IAErE,OAAO,SAAqD,MADrC,MAAM,UAAU,SAAS,CACoB;GACtE;;GAGA,MAAM,WAAW,UAAkB,WAAyE;IAC1G,OAAO,SAAqD,UAAU,WAAW;KAAE;KAAU;IAAU,CAAC;GAC1G;;GAGA,MAAM,aAAa,IAAiE;IAClF,OAAO,SAAqD,2CAA2C,EAAE,GAAG,CAAC;GAC/G;;GAGA,MAAM,WAAW,IAAiE;IAChF,OAAO,SAAqD,yCAAyC,EAAE,GAAG,CAAC;GAC7G;;GAGA,MAAM,SAAkC;IAEtC,OAAO,SAAyB,MADT,MAAM,UAAU,MAAM,CACL;GAC1C;;GAGA,MAAM,YAAY,OAA6C;IAC7D,OAAO,SAAyB,UAAU,QAAQ,KAAK;GACzD;;GAGA,MAAM,YAAY,KAA8D;IAC9E,OAAO,SAAqC,UAAU,aAAa,GAAG;GACxE;;;;;;;GAQA,MAAc,UAAU,MAAc,SAAkB,SAAmD;IACzG,MAAM,WAAW,MAAM,MAAM,MAAM;KACjC,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;IACD,IAAI,CAAC,SAAS,IAAI;KAChB,MAAM,SAA6B,QAAQ;KAC3C;IACF;IACA,IAAI,SAAS,SAAS,MAAM,MAAM,IAAI,cAAc,uBAAuB;IAC3E,MAAM,SAAS,SAAS,KAAK,UAAU;IACvC,MAAM,UAAU,IAAI,YAAY;IAChC,IAAI,SAAS;IACb,SAAS;KACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;KAC1C,IAAI,MAAM;KACV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;KAChD,MAAM,QAAQ,OAAO,MAAM,IAAI;KAC/B,SAAS,MAAM,IAAI,KAAK;KACxB,KAAK,MAAM,QAAQ,OAAO;MACxB,IAAI,KAAK,KAAK,MAAM,IAAI;MACxB,IAAI;MACJ,IAAI;OACF,QAAQ,KAAK,MAAM,IAAI;MACzB,QAAQ;OACN;MACF;MACA,QAAQ,KAAK;MACb,IAAI,MAAM,SAAS,SACjB,MAAM,IAAI,cAAc,MAAM,OAAO;KAEzC;IACF;GACF;;GAGA,MAAM,SAAS,WAAmB,YAAqB,SAAmD;IACxG,MAAM,KAAK,UAAU,UAAU,UAAU;KAAE;KAAW;IAAW,GAAG,OAAO;GAC7E;;GAGA,MAAM,QAAQ,WAAmB,cAAsB,QAAgB,SAAmD;IACxH,MAAM,KAAK,UAAU,UAAU,SAAS;KAAE;KAAW;KAAc;IAAO,GAAG,OAAO;GACtF;;GAGA,MAAM,OAAO,WAAmB,SAAmD;IACjF,MAAM,KAAK,UAAU,UAAU,QAAQ,EAAE,UAAU,GAAG,OAAO;GAC/D;;GAGA,MAAM,UAAU,SAAiB,SAAkF;IACjH,MAAM,WAAW,MAAM,MAAM,UAAU,WAAW;KAChD,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,SAAS,IAAI;KAChB,MAAM,SAA6B,QAAQ;KAC3C;IACF;IACA,IAAI,SAAS,SAAS,MAAM,MAAM,IAAI,cAAc,6BAA6B;IACjF,MAAM,SAAS,SAAS,KAAK,UAAU;IACvC,MAAM,UAAU,IAAI,YAAY;IAChC,IAAI,SAAS;IACb,SAAS;KACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;KAC1C,IAAI,MAAM;KACV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;KAChD,MAAM,QAAQ,OAAO,MAAM,IAAI;KAC/B,SAAS,MAAM,IAAI,KAAK;KACxB,KAAK,MAAM,QAAQ,OAAO;MACxB,IAAI,KAAK,KAAK,MAAM,IAAI;MACxB,IAAI;MACJ,IAAI;OACF,QAAQ,KAAK,MAAM,IAAI;MACzB,QAAQ;OACN;MACF;MACA,QAAQ,KAAK;MACb,IAAI,MAAM,SAAS,SAAS,MAAM,IAAI,cAAc,MAAM,OAAO;KACnE;IACF;GACF;;GAGA,MAAM,mBAAyE;IAG7E,QAAO,MADY,SAAoE,MADhE,MAAM,UAAU,gBAAgB,CACwC,EAAA,CACnF;GACd;EACF;;;;;;;ECxPA,MAAaA,OAAK;GAChB,eAAe;GACf,iBAAiB;GACjB,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,YAAY;GACZ,aAAa;GACb,kBAAkB;GAClB,iBAAiB;GACjB,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,wBAAwB;GACxB,qBAAqB;GACrB,uBAAuB;GACvB,oBAAoB;GACpB,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,wBAAwB;GACxB,qBAAqB;GACrB,qBAAqB;GACrB,qBAAqB;GACrB,4BAA4B;GAC5B,2BAA2B;GAC3B,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,kBAAkB;GAClB,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,iBAAiB;GACjB,qBAAqB;GACrB,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,gBAAgB;GAChB,kBAAkB;GAClB,iBAAiB;GACjB,iBAAiB;GACjB,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,eAAe;GACf,eAAe;GACf,iBAAiB;GACjB,wBAAwB;GACxB,kBAAkB;GAClB,iBAAiB;GACjB,cAAc;GACd,qBAAqB;GACrB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,mBAAmB;GACnB,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,aAAa;GACb,eAAe;GACf,oBAAoB;GACpB,oBAAoB;GACpB,kBAAkB;GAClB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,sBAAsB;GACtB,mBAAmB;GACnB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,0BAA0B;GAC1B,uBAAuB;GACvB,wBAAwB;GACxB,qBAAqB;GACrB,wBAAwB;GACxB,yBAAyB;GACzB,0BAA0B;GAC1B,kBAAkB;GAClB,wBAAwB;GACxB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,yBAAyB;GACzB,sBAAsB;GACtB,4BAA4B;GAC5B,uBAAuB;GACvB,iBAAiB;GACjB,kBAAkB;GAClB,uBAAuB;GACvB,mBAAmB;GACnB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,iBAAiB;GACjB,qBAAqB;GACrB,kBAAkB;GAClB,sBAAsB;GACtB,sBAAsB;GACtB,kBAAkB;GAClB,kBAAkB;GAClB,yBAAyB;GACzB,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,uBAAuB;GACvB,mBAAmB;GACnB,sBAAsB;GACtB,gBAAgB;GAChB,aAAa;EACf;;EAGA,MAAa,KAA6B;GACxC,eAAe;GACf,iBAAiB;GACjB,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,gBAAgB;GAChB,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,YAAY;GACZ,aAAa;GACb,kBAAkB;GAClB,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,kBAAkB;GAClB,wBAAwB;GACxB,qBAAqB;GACrB,uBAAuB;GACvB,oBAAoB;GACpB,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,wBAAwB;GACxB,qBAAqB;GACrB,qBAAqB;GACrB,qBAAqB;GACrB,4BAA4B;GAC5B,2BAA2B;GAC3B,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,kBAAkB;GAClB,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,iBAAiB;GACjB,qBAAqB;GACrB,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,gBAAgB;GAChB,kBAAkB;GAClB,iBAAiB;GACjB,iBAAiB;GACjB,cAAc;GACd,cAAc;GACd,gBAAgB;GAChB,eAAe;GACf,eAAe;GACf,iBAAiB;GACjB,wBAAwB;GACxB,kBAAkB;GAClB,iBAAiB;GACjB,cAAc;GACd,qBAAqB;GACrB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,mBAAmB;GACnB,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,aAAa;GACb,eAAe;GACf,oBAAoB;GACpB,oBAAoB;GACpB,kBAAkB;GAClB,eAAe;GACf,cAAc;GACd,oBAAoB;GACpB,sBAAsB;GACtB,mBAAmB;GACnB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,0BAA0B;GAC1B,uBAAuB;GACvB,wBAAwB;GACxB,qBAAqB;GACrB,wBAAwB;GACxB,yBAAyB;GACzB,0BAA0B;GAC1B,kBAAkB;GAClB,wBAAwB;GACxB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,yBAAyB;GACzB,sBAAsB;GACtB,4BAA4B;GAC5B,uBAAuB;GACvB,iBAAiB;GACjB,kBAAkB;GAClB,uBAAuB;GACvB,mBAAmB;GACnB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,iBAAiB;GACjB,qBAAqB;GACrB,kBAAkB;GAClB,sBAAsB;GACtB,sBAAsB;GACtB,kBAAkB;GAClB,kBAAkB;GAClB,yBAAyB;GACzB,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,uBAAuB;GACvB,mBAAmB;GACnB,sBAAsB;GACtB,gBAAgB;GAChB,aAAa;EACf;;;;;;;;;ECnQA,SAAgB,GAAG,KAAe,QAAkD;GAClF,IAAI,OAAeC,KAAG,QAAQ,GAAG,QAAQ;GACzC,IAAI,WAAW,KAAA,GACb,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,GAC/C,OAAO,KAAK,WAAW,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC;GAGrD,OAAO;EACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECWA,SAAgB,aAAa,EAAE,OAA0B;GACvD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAiC,CAAC,CAAC;GACjD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,SAAA,GAAA,MAAA,OAAA,CAAe,CAAC;GACtB,MAAM,aAAA,GAAA,MAAA,OAAA,CAA0C,IAAI;;GAGpD,MAAM,YAAA,GAAA,MAAA,YAAA,EAAwB,SAA+B;IAC3D,UAAS,SAAQ;KACf,MAAM,OAAO,KAAK,KAAK,SAAS;KAEhC,IAAI,KAAK,SAAS,eAAe,SAAS,KAAA,KAAa,KAAK,SAAS,eAAe,KAAK,MAAM,WAAW,GACxG,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG;MAAE,GAAG;MAAM,MAAM,KAAK,OAAO,KAAK;KAAK,CAAC;KAExE,OAAO,CAAC,GAAG,MAAM;MAAE,GAAG;MAAM,IAAI,MAAM;KAAU,CAAC;IACnD,CAAC;GACH,GAAG,CAAC,CAAC;;GAGL,MAAM,YAAA,GAAA,MAAA,YAAA,EAAwB,SAAoC;IAChE,UAAS,SAAQ;KACf,MAAM,OAAO,KAAK,KAAK,SAAS;KAChC,IAAI,SAAS,KAAA,KAAa,KAAK,SAAS,aACtC,OAAO,CAAC,GAAG,MAAM;MAAE,IAAI,MAAM;MAAW,MAAM;MAAa,MAAM;MAAI,OAAO,CAAC,IAAI;KAAE,CAAC;KAEtF,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG;MAAE,GAAG;MAAM,OAAO,CAAC,GAAG,KAAK,OAAO,IAAI;MAAG,MAAM,KAAA;KAAU,CAAC;IAC1F,CAAC;GACH,GAAG,CAAC,CAAC;;GAGL,MAAM,iBAAA,GAAA,MAAA,YAAA,EAA6B,SAAiB;IAClD,UAAS,SAAQ;KACf,MAAM,OAAO,KAAK,KAAK,SAAS;KAChC,IAAI,SAAS,KAAA,KAAa,KAAK,SAAS,aAAa,OAAO;KAC5D,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG;MAAE,GAAG;MAAM,OAAO,KAAK,QAAQ,MAAM;KAAK,CAAC;IAC3E,CAAC;GACH,GAAG,CAAC,CAAC;;GAGL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,YAAY;IAChB,CAAM,YAAY;KAChB,IAAI;MACF,MAAM,UAAU,MAAM,IAAI,iBAAiB;MAC3C,IAAI,WAAW;MACf,MAAM,WAAuB,CAAC;MAC9B,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,SAAS,QACjB,SAAS,KAAK;OAAE,IAAI,MAAM;OAAW,MAAM;OAAQ,MAAM,MAAM;OAAS,OAAO,CAAC;MAAE,CAAC;WAC9E,IAAI,MAAM,SAAS,aACxB,SAAS,KAAK;OAAE,IAAI,MAAM;OAAW,MAAM;OAAa,MAAM,MAAM;OAAS,OAAO,CAAC;MAAE,CAAC;WACnF,IAAI,MAAM,SAAS,QAAQ;OAChC,MAAM,OAAO,SAAS,SAAS,SAAS;OACxC,IAAI,SAAS,KAAA,KAAa,KAAK,SAAS,aACtC,KAAK,MAAM,KAAK;QAAE,MAAM,MAAM,QAAQ;QAAQ,QAAQ;QAAQ,QAAQ,MAAM,QAAQ,MAAM,GAAG,GAAG;OAAE,CAAC;MAEvG;MAEF,SAAS,QAAQ;KACnB,SAAS,KAAK;MACZ,IAAI,CAAC,WAAW,SAAU,IAAc,OAAO;KACjD;IACF,EAAA,CAAG;IACH,aAAa;KAAE,YAAY;IAAK;GAClC,GAAG,CAAC,GAAG,CAAC;;GAGR,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,UAAU,SAAS,SAAS,EAAE,KAAK,UAAU,QAAQ,aAAa,CAAC;GACrE,GAAG,CAAC,KAAK,CAAC;;GAGV,MAAM,aAAa,YAA2B;IAC5C,MAAM,UAAU,MAAM,KAAK;IAC3B,IAAI,YAAY,MAAM,MAAM;IAC5B,SAAS,EAAE;IACX,SAAS,EAAE;IACX,SAAS;KAAE,MAAM;KAAQ,MAAM;KAAS,OAAO,CAAC;IAAE,CAAC;IAEnD,UAAS,SAAQ,CAAC,GAAG,MAAM;KAAE,IAAI,MAAM;KAAW,MAAM;KAAa,MAAM;KAAI,OAAO,CAAC;IAAE,CAAC,CAAC;IAC3F,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,IAAI,UAAU,UAAU,UAA0B;MACtD,IAAI,MAAM,SAAS,SACjB,SAAS;OAAE,MAAM;OAAa,MAAM,MAAM;OAAM,OAAO,CAAC;MAAE,CAAC;WACtD,IAAI,MAAM,SAAS,QACxB,SAAS;OACP,MAAM,MAAM;OACZ,QAAQ,MAAM;OACd,QAAQ,MAAM;MAChB,CAAC;WACI,IAAI,MAAM,SAAS,aACxB,cAAc,MAAM,IAAI;WACnB,IAAI,MAAM,SAAS,SACxB,SAAS;OAAE,MAAM;OAAS,QAAQ;OAAS,QAAQ,MAAM;MAAQ,CAAC;KAEtE,CAAC;IACH,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,yBAAI;IAAM,OAAO;KAAE,MAAM;KAAG,WAAW;KAAG,SAAS;KAAQ,eAAe;IAAS;cAAnG;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,yBAAI;gBAAY,GAAG,eAAe;KAAQ,CAAA;KAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,yBAAI;gBAAO,GAAG,gBAAgB;KAAQ,CAAA;KACtD,UAAU,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,OAAO;OAAE,OAAO;OAAmB,UAAU;MAAG;gBAAtD;OAA0D,GAAG,cAAc;OAAE;OAAG;MAAY;;KAC7G,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,KAAK;MACL,WAAWA,yBAAI;gBAFjB;OAIG,MAAM,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAO,GAAG,iBAAiB;OAAQ,CAAA;OAC9E,MAAM,KAAI,SACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAmB,WAAW,KAAK,SAAS,SAASA,yBAAI,iBAAiBA,yBAAI;kBAA9E;SACG,KAAK,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAAU;SAAM,CAAA;SAC5D,KAAK,SAAS,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,OAAO;WAAE,YAAY;WAAY,WAAW;UAAa;oBAAI,KAAK;SAAU,CAAA;SACrG,KAAK,SAAS,KAAA,KAAa,KAAK,SAAS,MACxC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAAW,KAAK;SAAU,CAAA;SAE/C,KAAK,MAAM,SAAS,KACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,eAAe;WAAU,KAAK;WAAG,WAAW;WAAG,UAAU;UAAG;oBACxF,KAAK,MAAM,KAAK,MAAM,MACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAc,OAAO,EAAE,OAAO,KAAK,WAAW,UAAU,oBAAoB,KAAK,WAAW,UAAU,qBAAqB,oBAAoB;qBAC5I,KAAK,WAAW,UACb,GAAG,uBAAuB,EAAE,MAAM,KAAK,KAAK,CAAC,IAC7C,KAAK,WAAW,SACd,GAAG,sBAAsB;YAAE,MAAM,KAAK;YAAM,QAAQ,KAAK,UAAU;WAAG,CAAC,IACvE,GAAG,uBAAuB;YAAE,MAAM,KAAK;YAAM,QAAQ,KAAK,UAAU;WAAG,CAAC;UAC1E,GANK,CAML,CACP;SACE,CAAA;QAEJ;UAnBK,KAAK,EAmBV,CACN;OACA,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;QAAM,OAAO,EAAE,OAAO,mBAAmB;kBAAG;OAAO,CAAA;MAC9E;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAAK,OAAO,EAAE,WAAW,EAAE;gBAA/C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OACE,WAAWA,yBAAI;OACf,OAAO;QAAE,WAAW;QAAI,MAAM;OAAE;OAChC,aAAa,GAAG,uBAAuB;OACvC,OAAO;OACP,WAAU,MAAK;QAAE,SAAS,EAAE,OAAO,KAAK;OAAE;OAC1C,YAAW,MAAK;QACd,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;SACpC,EAAE,eAAe;SACjB,WAAgB;QAClB;OACF;MACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;OAAiB,UAAU,QAAQ,MAAM,KAAK,MAAM;OAAI,eAAe;QAAE,WAAgB;OAAE;iBAC9I,GAAG,gBAAgB;MACd,CAAA,CACL;;IACF;;EAET;;;;;;;;EC3KA,SAAS,UAAU,EAAE,MAAM,UAAU,YAAwF;GAC3H,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAc,KAAK;KAAG,QAAQ;IAAU;cAArF,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,MAAK;KAAQ,MAAK;KAAQ,SAAS,aAAa,KAAK;KAAM,gBAAgB;MAAE,SAAS,IAAI;KAAE;IAAI,CAAA,GACvG,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,KAAQ,CAAA,GAChB,KAAK,gBAAgB,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAWC,yBAAI;eAArB,CAA2B,OAAI,KAAK,WAAkB;MAC9E,EAAA,CAAA,CACD;OACN,KAAK,SAAS,SAAS,KACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,OAAO;KAAE,YAAY;KAAI,SAAS;KAAQ,eAAe;KAAU,KAAK;IAAE;cAC5E,KAAK,SAAS,KAAI,UACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAA4B,MAAM;KAAiB;KAAoB;IAAW,GAAlE,MAAM,IAA4D,CACnF;GACE,CAAA,CAEJ,EAAA,CAAA;EAET;;EAMA,MAAM,WAA8D;GAClE;IAAE,IAAI;IAAS,OAAO;GAAO;GAC7B;IAAE,IAAI;IAAe,OAAO;GAAO;GACnC;IAAE,IAAI;IAAa,OAAO;GAAO;GACjC;IAAE,IAAI;IAAS,OAAO;GAAU;GAChC;IAAE,IAAI;IAAS,OAAO;GAAQ;EAChC;;EAGA,SAAgB,UAAU,EAAE,OAAuB;GACjD,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAqC,OAAO;GAC7D,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAA2C,IAAI;GAC5D,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GACvC,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA0B,EAAE;GAC/C,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,EAAE;GAC7C,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,EAAE;GACzC,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAA8B,EAAE;GACxC,CAAA,GAAA,MAAA,OAAA,CAAO,CAAC;;GAGvB,MAAM,WAAA,GAAA,MAAA,YAAA,CAAsB,YAAY;IACtC,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,OAAO;KAChC,QAAQ,MAAM;IAChB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC;GACF,GAAG,CAAC,GAAG,CAAC;GAER,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,QAAa;GACf,GAAG,CAAC,OAAO,CAAC;;GAGZ,MAAM,QAAQ,OAAO,UAAiE;IACpF,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,YAAY,KAAK;KAC1C,QAAQ,MAAM;KACd,UAAU,KAAK;IACjB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;;GAGA,MAAM,qBAAqB,YAA2B;IACpD,IAAI,WAAW,KAAK,CAAC,CAAC,SAAS,IAAI;KACjC,SAAS,GAAG,mBAAmB,MAAM,KAAK,WAAW,gBAAgB;KACrE;IACF;IACA,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,YAAY;MAAE;MAAY,MAAM;KAAU,CAAC;KACpE,SAAQ,SAAQ,SAAS,OAAO,OAAO;MACrC,GAAG;MACH,eAAe;OACb,GAAG,KAAK;OACR,aAAa,CAAC,GAAI,KAAK,cAAc,eAAe,CAAC,GAAI,OAAO,UAAU;OAC1E,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;MACpC;KACF,CAAC;KACD,UAAU,QAAQ,OAAO,WAAW,KAAK,QAAQ;KACjD,cAAc,EAAE;KAChB,aAAa,EAAE;IACjB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;;GAGA,MAAM,gBAAgB,YAA2B;IAC/C,MAAM,OAAO,QAAQ,KAAK;IAC1B,IAAI,SAAS,IAAI;IACjB,IAAI;IACJ,IAAI;KACF,MAAM,SAAS,KAAK,MAAM,IAAI;KAC9B,OAAO;MAAE,MAAM,OAAO,QAAQ;MAAS,OAAO,OAAO,SAAS;MAAI,KAAK,OAAO,OAAO;KAAG;IAC1F,QAAQ;KAEN,OAAO;MAAE,MAAM,UAAU,MAAM,cAAc,eAAe,CAAC,EAAA,CAAG,SAAS;MAAK,OAAO;MAAM,KAAK;KAAG;IACrG;IACA,IAAI,KAAK,UAAU,MAAM,KAAK,QAAQ,IAAI;IAC1C,MAAM,OAAO,CAAC,GAAI,MAAM,cAAc,eAAe,CAAC,GAAI,IAAI;IAC9D,MAAM,MAAM,EAAE,aAAa,KAAK,CAAC;IACjC,WAAW,EAAE;GACf;;GAGA,MAAM,qBAAqB,SAA0B;IACnD,MAAW,EAAE,OAAO,KAAK,CAAC;GAC5B;;GAGA,MAAM,uBAAuB,OAAO,SAAyC;IAC3E,MAAM,UAAU,MAAM;IAEtB,KADmB,MAAM,cAAc,sBAAsB,KAAA,OAAe,KAAA,GAE1E,MAAM,MAAM,EAAE,oBAAoB;KAAE,GAAG;KAAM,SAAS;IAAK,EAAE,CAAC;SAE9D,MAAM,MAAM,EAAE,uBAAuB,CAAC,GAAI,SAAS,yBAAyB,CAAC,GAAI;KAAE,GAAG;KAAM,SAAS;IAAM,CAAC,EAAE,CAAC;GAEnH;GAEA,IAAI,SAAS,MACX,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWA,yBAAI;cAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,yBAAI;eAAO,GAAG,gBAAgB;IAAQ,CAAA;GAAM,CAAA;GAGhG,MAAM,SAAS,KAAK;GACpB,MAAM,eAAe,KAAK;GAC1B,MAAM,cAAc,OAAO,eAAe,CAAC;GAC3C,MAAM,eAAe,KAAK;GAE1B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,eAAe;KAAU,KAAK;IAAG;cAAhE;KACG,UAAU,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAAM,OAAO,EAAE,aAAa,kBAAkB;gBAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,OAAO,EAAE,OAAO,kBAAkB;iBAAxC;QAA4C,GAAG,cAAc;QAAE;QAAG;OAAY;;KAAM,CAAA;KACzK,WAAW,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,OAAO,EAAE,OAAO,oBAAoB;iBAAI;MAAa,CAAA;KAAM,CAAA;KAG7G,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAAQ,MAAK;MAAU,OAAO;OAAE,SAAS;OAAW,cAAc;MAA6B;gBAChH,SAAS,KAAI,QACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAEE,MAAK;OACL,MAAK;OACL,iBAAe,aAAa,IAAI;OAChC,eAAa,aAAa,IAAI,KAAK,KAAK,KAAA;OACxC,WAAWA,yBAAI;OACf,eAAe;QAAE,YAAY,IAAI,EAAE;OAAE;iBAEpC,IAAI;MACC,GATD,IAAI,EASH,CACT;KACE,CAAA;KAGJ,aAAa,WACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAW;OAAW,CAAA;OAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAAoC,CAAA;OAC9D,OAAO,UAAU,KAAA,KAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,QAAQ;SAA8B,cAAc;SAAG,SAAS;SAAY,UAAU;QAAG;kBAAvG;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAG,SAAM,OAAO,MAAM,IAAQ,EAAA,CAAA;SAAC;SAAI,OAAO,MAAM;QAC7C;;OAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;SAAG,WAAW;SAAK,WAAW;QAAO;kBAC/F,aAAa,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAA2B,MAAM;SAAM,UAAU,OAAO,OAAO,QAAQ;SAAI,UAAU;QAAoB,GAAzF,KAAK,IAAoF,CAAC;OACjI,CAAA;MACF;;KAIN,aAAa,iBACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAW;OAAW,CAAA;OAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAAuC,CAAA;OACjE,OAAO,uBAAuB,KAAA,KAC7B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,QAAQ;SAA8B,cAAc;SAAG,SAAS;SAAY,UAAU;SAAI,OAAO;QAAmB;kBAAlI;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAG,QAAK,OAAO,mBAAmB,IAAQ,EAAA,CAAA;SAAC;SAAI,OAAO,mBAAmB;QACtE;;OAEN,OAAO,sBAAsB,KAAI,SAChC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAqB,OAAO;SAAE,QAAQ;SAA8B,cAAc;SAAG,SAAS;SAAY,UAAU;QAAG;kBAAvH;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,KAAQ,CAAA;SAAC;SAAI,KAAK;QACxB;UAFK,KAAK,IAEV,CACN;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAA6B,CAAA;OACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;SAAG,WAAW;SAAK,WAAW;QAAO;kBAC/F,KAAK,mBAAmB,KAAI,SAAQ;SACnC,MAAM,iBAAiB,OAAO,oBAAoB,SAAS,KAAK;SAChE,MAAM,aAAa,OAAO,sBAAsB,MAAK,MAAK,EAAE,SAAS,KAAK,IAAI;SAC9E,IAAI,kBAAkB,YAAY,OAAO;SACzC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAwB,WAAWA,yBAAI;UAAQ,UAAU;UAAM,eAAe;WAAE,qBAA0B,IAAI;UAAE;oBAAhH;WAAmH;WAC9G,OAAO,uBAAuB,KAAA,IAAY,SAAS;WAAO,KAAK;WAAK;WAAI,KAAK,OAAO,MAAM,GAAG,EAAE;WAAE;UAC9F;YAFK,KAAK,IAEV;QAEZ,CAAC;OACE,CAAA;MACF;;KAIN,aAAa,eACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAW;OAAY,CAAA;OAC5C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAAmF,CAAA;OAC9G,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;SAAG,WAAW;SAAK,WAAW;QAAO;kBAC/F,KAAK,eAAe,KAAI,aAAY;SACnC,MAAM,QAAQ,OAAO,YAAY,MAAK,MAAK,EAAE,SAAS,SAAS,IAAI;SACnE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAwB,OAAO;WAAE,QAAQ,aAAa,QAAQ,qBAAqB;WAAsB,cAAc;WAAG,SAAS;WAAY,UAAU;UAAG;oBAA5J;WACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,OAAO;aAAE,SAAS;aAAQ,YAAY;aAAU,gBAAgB;aAAiB,KAAK;YAAE;sBAA7F,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;aAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,SAAS,KAAQ,CAAA;aAAC;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAWA,yBAAI;cAAO,OAAO;eAAE,aAAa;eAAoB,OAAO;cAAmB;wBAAI,SAAS;aAAe,CAAA;YAAO,EAAA,CAAA,GAChK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI,YAAY,GAAG,QAAQ,KAAKA,yBAAI;aAChE,UAAU,QAAQ;aAClB,eAAe;cACb,MAAM,aAAyB;eAC7B,MAAM,SAAS;eACf,YAAY,CAAC,GAAG,SAAS,YAAY,GAAG,SAAS,YAAY,KAAI,MAAK,MAAM,GAAG,CAAC;eAChF,eAAe,SAAS;eACxB,kBAAkB,SAAS;eAC3B,YAAY,CAAC,MAAM,SAAS,KAAK,QAAQ,SAAS,iBAAiB,KAAK,GAAG,KAAK,oBAAoB;eACpG,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;cACpC;cACA,MAAW,EAAE,aAAa,CAAC,GAAI,KAAK,cAAc,eAAe,CAAC,GAAI,UAAU,EAAE,CAAC;aACrF;uBAEC,QAAQ,UAAU;YACb,CAAA,CACL;;WACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;YAAK,WAAWA,yBAAI;sBAAO,SAAS;WAAiB,CAAA;WACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAWA,yBAAI;sBAApB,CAA0B,OAAI,SAAS,WAAW,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAO;;WAC7E,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAWA,yBAAI;sBAApB,CAA0B,OAAI,SAAS,cAAc,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAO;;UAC7E;YAxBK,SAAS,GAwBd;QAET,CAAC;OACE,CAAA;MACF;;KAIN,aAAa,WACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAW;OAAa,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAA2C,CAAA;OACtE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;SAAG,WAAW;SAAK,WAAW;QAAO;kBAAlG,CACG,aAAa,KAAI,SAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAqB,OAAO;UAAE,QAAQ;UAA8B,cAAc;UAAG,SAAS;UAAY,UAAU;SAAG;mBAAvH;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,KAAQ,CAAA;UAAC;UAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;WAAO,OAAO;YAAE,aAAa;YAAoB,OAAO;WAAmB;qBAAG;UAAQ,CAAA;UAC9H,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;qBAApB,CAA0B,OAAI,KAAK,KAAW;;UAC9C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;qBAApB,CAA0B,OAAI,KAAK,GAAS;;SACzC;WAJK,KAAK,IAIV,CACN,GACA,YAAY,KAAI,SACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAqB,OAAO;UAAE,QAAQ;UAA8B,cAAc;UAAG,SAAS;UAAY,UAAU;SAAG;mBAAvH;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,KAAQ,CAAA;UAAC;UAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;WAAO,OAAO;YAAE,aAAa;YAAoB,OAAO;WAAmB;qBAAG;UAAS,CAAA;UAC/H,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;qBAApB,CAA0B,OAAI,KAAK,KAAW;;UAC7C,KAAK,QAAQ,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;qBAApB,CAA0B,OAAI,KAAK,GAAS;;SAC7D;WAJK,KAAK,IAIV,CACN,CACE;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SACE,WAAWA,yBAAI;SACf,OAAO,EAAE,MAAM,EAAE;SACjB,aAAY;SACZ,OAAO;SACP,WAAU,MAAK;UAAE,WAAW,EAAE,OAAO,KAAK;SAAE;QAC7C,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;SAAiB,UAAU,QAAQ,QAAQ,KAAK,MAAM;SAAI,eAAe;UAAE,cAAmB;SAAE;mBAAG;QAAY,CAAA,CACpJ;;MACF;;KAIJ,aAAa,WACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAW;OAAa,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;kBAAM;OAAgD,CAAA;OAC1E,OAAO,YAAY,KAAI,UACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAsB,OAAO;SAAE,QAAQ;SAA8B,cAAc;SAAG,SAAS;SAAY,UAAU;QAAG;kBAAxH;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,MAAM,KAAQ,CAAA;SAClB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CAA0B,OAAI,MAAM,WAAW,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAO;;SACzE,MAAM,cAAc,SAAS,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CAA0B,OAAI,MAAM,cAAc,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAO;;QAC7G;UAJK,MAAM,IAIX,CACN;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,yBAAI;QACf,OAAO,EAAE,WAAW,GAAG;QACvB,aAAY;QACZ,OAAO;QACP,WAAU,MAAK;SAAE,cAAc,EAAE,OAAO,KAAK;QAAE;OAChD,CAAA;OACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SACE,WAAWA,yBAAI;SACf,OAAO,EAAE,MAAM,EAAE;SACjB,aAAY;SACZ,OAAO;SACP,WAAU,MAAK;UAAE,aAAa,EAAE,OAAO,KAAK;SAAE;QAC/C,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;SAAiB,UAAU,QAAQ,WAAW,KAAK,CAAC,CAAC,SAAS;SAAI,eAAe;UAAE,mBAAwB;SAAE;mBAAG;QAEhJ,CAAA,CACL;;MACF;;IAEJ;;EAET;;;;;;;ECnUA,SAAgB,aAAa,EAAE,KAAK,OAAO,YAA+B;GACxE,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,KAAK;GAC9C,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,EAAE;GACnC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GAErC,MAAM,eAAe,YAA2B;IAC9C,MAAM,WAAW,KAAK,KAAK;IAC3B,IAAI,aAAa,IAAI;IACrB,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,IAAI,WAAW,QAAQ;KAC7B,YAAY,KAAK;KACjB,QAAQ,EAAE;KACV,SAAS;IACX,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,MAAM,iBAAiB,OAAO,OAA8B;IAC1D,IAAI,OAAO,MAAM,cAAc;IAC/B,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,IAAI,aAAa,EAAE;KACzB,SAAS;IACX,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,MAAM,eAAe,OAAO,OAA8B;IACxD,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,IAAI,WAAW,EAAE;KACvB,SAAS;IACX,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,yBAAI;cAApB;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,yBAAI;gBAAgB;KAAQ,CAAA;KAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB,CACG,MAAM,MAAM,KAAI,SACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAEE,WAAW,GAAGA,yBAAI,SAAS,GAAG,KAAK,OAAO,MAAM,eAAeA,yBAAI,iBAAiB;OACpF,eAAe;QAAE,eAAoB,KAAK,EAAE;OAAE;OAC9C,OAAO,KAAK;iBAJd;QAME,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;mBAAe,KAAK;QAAe,CAAA;QACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;mBAAe,KAAK,aAAa,GAAG,KAAK,KAAK,GAAG,KAAK,MAAM,MAAM;QAAY,CAAA;QACnG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAWA,yBAAI;SACf,OAAM;SACN,UAAU,MAAM;UAAE,EAAE,gBAAgB;UAAG,aAAkB,KAAK,EAAE;SAAE;mBACnE;QAEO,CAAA;OACL;SAfE,KAAK,EAeP,CACN,GACA,CAAC,WACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,yBAAI;OAAS,eAAe;QAAE,YAAY,IAAI;OAAE;iBAAG;MAE5E,CAAA,IAER,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,yBAAI;iBAApB;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SACE,WAAWA,yBAAI;SACf,OAAO,EAAE,OAAO,IAAI;SACpB,aAAY;SACZ,OAAO;SACP,WAAU,MAAK;UAAE,QAAQ,EAAE,OAAO,KAAK;SAAE;SACzC,YAAW,MAAK;UAAE,IAAI,EAAE,QAAQ,SAAS,aAAkB;SAAE;SAC7D,WAAA;QACD,CAAA;QACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI,YAAY,GAAGA,yBAAI;SAAiB,UAAU,QAAQ,KAAK,KAAK,MAAM;SAAI,eAAe;UAAE,aAAkB;SAAE;mBAAG;QAEhK,CAAA;QACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;SAAe,eAAe;UAAE,YAAY,KAAK;SAAE;mBAAG;QAEpG,CAAA;OACL;QAEJ;;KACJ,UAAU,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,OAAO;OAAE,OAAO;OAAmB,UAAU;MAAG;gBAAI;KAAY,CAAA;IACpF;;EAET;;;ECrFA,IAAI,KAAK;MAAY,MAAM;MAAa,MAAM;EAE9C,IAAI,OAAO,IAAI,GAAG;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAgB;GAAG;GAAoB;EAAC,CAAC;EAEhJ,IAAI,OAAO,IAAI,GAAG;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAiB;GAAG;EAAC,CAAC;EAEvI,IAAI,OAAO,IAAI,GAAG;GAAC;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAG;EAAE,CAAC;EAEpF,IAAI,OAAO,SAAU,IAAI,OAAO;GAC5B,IAAI,IAAI,IAAI,IAAI,EAAE;GAClB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,GACtB,EAAE,KAAK,SAAS,KAAK,GAAG,IAAI;GAGhC,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG;GACrB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,GACtB,KAAK,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GAC/B,EAAE,KAAO,IAAI,EAAE,MAAO,IAAK;GAGnC,OAAO;IAAK;IAAM;GAAE;EACxB;EACA,IAAI,KAAK,KAAK,MAAM,CAAC;MAAG,KAAK,GAAG;MAAG,QAAQ,GAAG;EAE9C,GAAG,MAAM,KAAK,MAAM,OAAO;EAC3B,IAAI,KAAK,KAAK,MAAM,CAAC;MAAG,KAAK,GAAG;EAAW,GAAG;EAE9C,IAAI,MAAM,IAAI,IAAI,KAAK;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,GAAG;GAE5B,IAAI,KAAM,IAAI,UAAW,KAAO,IAAI,UAAW;GAC/C,KAAM,IAAI,UAAW,KAAO,IAAI,UAAW;GAC3C,KAAM,IAAI,UAAW,KAAO,IAAI,SAAW;GAC3C,IAAI,OAAQ,IAAI,UAAW,KAAO,IAAI,QAAW,MAAO;EAC5D;EAIA,IAAI,QAAQ,SAAU,IAAI,IAAI,GAAG;GAC7B,IAAI,IAAI,GAAG;GAEX,IAAI,IAAI;GAER,IAAI,IAAI,IAAI,IAAI,EAAE;GAElB,OAAO,IAAI,GAAG,EAAE,GACZ,IAAI,GAAG,IACH,EAAE,EAAE,GAAG,KAAK;GAGpB,IAAI,KAAK,IAAI,IAAI,EAAE;GACnB,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE,GAClB,GAAG,KAAM,GAAG,IAAI,KAAK,EAAE,IAAI,MAAO;GAEtC,IAAI;GACJ,IAAI,GAAG;IAEH,KAAK,IAAI,IAAI,KAAK,EAAE;IAEpB,IAAI,MAAM,KAAK;IACf,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,GAEjB,IAAI,GAAG,IAAI;KAEP,IAAI,KAAM,KAAK,IAAK,GAAG;KAEvB,IAAI,MAAM,KAAK,GAAG;KAElB,IAAI,IAAI,GAAG,GAAG,KAAK,EAAE,MAAM;KAE3B,KAAK,IAAI,IAAI,KAAM,KAAK,OAAO,GAAI,KAAK,GAAG,EAAE,GAEzC,GAAG,IAAI,MAAM,OAAO;IAE5B;GAER,OACK;IACD,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,GACjB,IAAI,GAAG,IACH,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,EAAE,OAAQ,KAAK,GAAG;GAGrD;GACA,OAAO;EACX;EAEA,IAAI,MAAM,IAAI,GAAG,GAAG;EACpB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,GACvB,IAAI,KAAK;EACb,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,GACzB,IAAI,KAAK;EACb,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,GACzB,IAAI,KAAK;EACb,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,GACzB,IAAI,KAAK;EAEb,IAAI,MAAM,IAAI,GAAG,EAAE;EACnB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,GACtB,IAAI,KAAK;MAE4B,OAAqB,mBAAK,KAAK,GAAG,CAAC;MAEnC,OAAqB,mBAAK,KAAK,GAAG,CAAC;EAE5E,IAAI,MAAM,SAAU,GAAG;GACnB,IAAI,IAAI,EAAE;GACV,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,GAC5B,IAAI,EAAE,KAAK,GACP,IAAI,EAAE;GAEd,OAAO;EACX;EAEA,IAAI,OAAO,SAAU,GAAG,GAAG,GAAG;GAC1B,IAAI,IAAK,IAAI,IAAK;GAClB,QAAS,EAAE,KAAM,EAAE,IAAI,MAAM,OAAQ,IAAI,KAAM;EACnD;EAEA,IAAI,SAAS,SAAU,GAAG,GAAG;GACzB,IAAI,IAAK,IAAI,IAAK;GAClB,QAAS,EAAE,KAAM,EAAE,IAAI,MAAM,IAAM,EAAE,IAAI,MAAM,QAAS,IAAI;EAChE;EAEA,IAAI,OAAO,SAAU,GAAG;GAAE,QAAS,IAAI,KAAK,IAAK;EAAG;EAGpD,IAAI,MAAM,SAAU,GAAG,GAAG,GAAG;GACzB,IAAI,KAAK,QAAQ,IAAI,GACjB,IAAI;GACR,IAAI,KAAK,QAAQ,IAAI,EAAE,QACnB,IAAI,EAAE;GAEV,OAAO,IAAI,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC;EAClC;EAsBA,IAAI,KAAK;GACL;GACA;GACA;GACA;GACA;GACA;;GAEA;GACA;GACA;GACA;GACA;GACA;GACA;EAEJ;EAEA,IAAI,MAAM,SAAU,KAAK,KAAK,IAAI;GAC9B,IAAI,IAAI,IAAI,MAAM,OAAO,GAAG,IAAI;GAChC,EAAE,OAAO;GACT,IAAI,MAAM,mBACN,MAAM,kBAAkB,GAAG,GAAG;GAClC,IAAI,CAAC,IACD,MAAM;GACV,OAAO;EACX;EAEA,IAAI,QAAQ,SAAU,KAAK,IAAI,KAAK,MAAM;GAEtC,IAAI,KAAK,IAAI,QAAQ,KAAK,OAAO,KAAK,SAAS;GAC/C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GACnB,OAAO,OAAO,IAAI,GAAG,CAAC;GAC1B,IAAI,QAAQ,CAAC;GAEb,IAAI,SAAS,SAAS,GAAG,KAAK;GAE9B,IAAI,OAAO,GAAG;GAEd,IAAI,OACA,MAAM,IAAI,GAAG,KAAK,CAAC;GAEvB,IAAI,OAAO,SAAU,GAAG;IACpB,IAAI,KAAK,IAAI;IAEb,IAAI,IAAI,IAAI;KAER,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;KACrC,KAAK,IAAI,GAAG;KACZ,MAAM;IACV;GACJ;GAEA,IAAI,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG;GAEnG,IAAI,OAAO,KAAK;GAChB,GAAG;IACC,IAAI,CAAC,IAAI;KAEL,QAAQ,KAAK,KAAK,KAAK,CAAC;KAExB,IAAI,OAAO,KAAK,KAAK,MAAM,GAAG,CAAC;KAC/B,OAAO;KACP,IAAI,CAAC,MAAM;MAEP,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,KAAM,IAAI,IAAI,MAAM,GAAI,IAAI,IAAI;MACnE,IAAI,IAAI,IAAI;OACR,IAAI,MACA,IAAI,CAAC;OACT;MACJ;MAEA,IAAI,QACA,KAAK,KAAK,CAAC;MAEf,IAAI,IAAI,IAAI,SAAS,GAAG,CAAC,GAAG,EAAE;MAE9B,GAAG,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,IAAI;MAC3C;KACJ,OACK,IAAI,QAAQ,GACb,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,MAAM;UACpC,IAAI,QAAQ,GAAG;MAEhB,IAAI,OAAO,KAAK,KAAK,KAAK,EAAE,IAAI,KAAK,QAAQ,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI;MACvE,IAAI,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI;MACzC,OAAO;MAEP,IAAI,MAAM,IAAI,GAAG,EAAE;MAEnB,IAAI,MAAM,IAAI,GAAG,EAAE;MACnB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,GAEzB,IAAI,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC;MAE3C,OAAO,QAAQ;MAEf,IAAI,MAAM,IAAI,GAAG,GAAG,UAAU,KAAK,OAAO;MAE1C,IAAI,MAAM,KAAK,KAAK,KAAK,CAAC;MAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK;OACrB,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM;OAEjC,OAAO,IAAI;OAEX,IAAI,IAAI,KAAK;OAEb,IAAI,IAAI,IACJ,IAAI,OAAO;YAEV;QAED,IAAI,IAAI,GAAG,IAAI;QACf,IAAI,KAAK,IACL,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,IAAI,IAAI;aAChD,IAAI,KAAK,IACV,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,OAAO;aACjC,IAAI,KAAK,IACV,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO;QACzC,OAAO,KACH,IAAI,OAAO;OACnB;MACJ;MAEA,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI;MAEtD,MAAM,IAAI,EAAE;MAEZ,MAAM,IAAI,EAAE;MACZ,KAAK,KAAK,IAAI,KAAK,CAAC;MACpB,KAAK,KAAK,IAAI,KAAK,CAAC;KACxB,OAEI,IAAI,CAAC;KACT,IAAI,MAAM,MAAM;MACZ,IAAI,MACA,IAAI,CAAC;MACT;KACJ;IACJ;IAGA,IAAI,QACA,KAAK,KAAK,MAAM;IACpB,IAAI,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,OAAO;IAC7C,IAAI,OAAO;IACX,QAAQ,OAAO,KAAK;KAEhB,IAAI,IAAI,GAAG,OAAO,KAAK,GAAG,IAAI,MAAM,MAAM,KAAK;KAC/C,OAAO,IAAI;KACX,IAAI,MAAM,MAAM;MACZ,IAAI,MACA,IAAI,CAAC;MACT;KACJ;KACA,IAAI,CAAC,GACD,IAAI,CAAC;KACT,IAAI,MAAM,KACN,IAAI,QAAQ;UACX,IAAI,OAAO,KAAK;MACjB,OAAO,KAAK,KAAK;MACjB;KACJ,OACK;MACD,IAAI,MAAM,MAAM;MAEhB,IAAI,MAAM,KAAK;OAEX,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK;OAC5B,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,GAAG;OACxC,OAAO;MACX;MAEA,IAAI,IAAI,GAAG,OAAO,KAAK,GAAG,IAAI,MAAM,OAAO,KAAK;MAChD,IAAI,CAAC,GACD,IAAI,CAAC;MACT,OAAO,IAAI;MACX,IAAI,KAAK,GAAG;MACZ,IAAI,OAAO,GAAG;OACV,IAAI,IAAI,KAAK;OACb,MAAM,OAAO,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG,OAAO;MAClD;MACA,IAAI,MAAM,MAAM;OACZ,IAAI,MACA,IAAI,CAAC;OACT;MACJ;MACA,IAAI,QACA,KAAK,KAAK,MAAM;MACpB,IAAI,MAAM,KAAK;MACf,IAAI,KAAK,IAAI;OACT,IAAI,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG;OAC5C,IAAI,QAAQ,KAAK,GACb,IAAI,CAAC;OACT,OAAO,KAAK,MAAM,EAAE,IAChB,IAAI,MAAM,KAAK,QAAQ;MAC/B;MACA,OAAO,KAAK,KAAK,EAAE,IACf,IAAI,MAAM,IAAI,KAAK;KAC3B;IACJ;IACA,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI;IAC1C,IAAI,IACA,QAAQ,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI;GACjD,SAAS,CAAC;GAEV,OAAO,MAAM,IAAI,UAAU,QAAQ,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI,SAAS,GAAG,EAAE;EAC3E;EAoOA,IAAI,mBAAmB,IAAI,GAAG,CAAC;EA6U/B,IAAI,KAAK,SAAU,GAAG,GAAG;GAAE,OAAO,EAAE,KAAM,EAAE,IAAI,MAAM;EAAI;EAE1D,IAAI,KAAK,SAAU,GAAG,GAAG;GAAE,QAAQ,EAAE,KAAM,EAAE,IAAI,MAAM,IAAM,EAAE,IAAI,MAAM,KAAO,EAAE,IAAI,MAAM,QAAS;EAAG;EAExG,IAAI,KAAK,SAAU,GAAG,GAAG;GAAE,OAAO,GAAG,GAAG,CAAC,IAAK,GAAG,GAAG,IAAI,CAAC,IAAI;EAAa;EAqQ1E,SAAgB,YAAY,MAAM,MAAM;GACpC,OAAO,MAAM,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,KAAK,KAAK,QAAQ,KAAK,UAAU;EAC1E;EAubA,IAAI,KAAK,OAAO,eAAe,6BAA6B,IAAI,YAAY;EAG5E,IAAI;GACA,GAAG,OAAO,IAAI,EAAE,QAAQ,KAAK,CAAC;EAElC,SACO,GAAG,CAAE;EAEZ,IAAI,QAAQ,SAAU,GAAG;GACrB,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK;IACtB,IAAI,IAAI,EAAE;IACV,IAAI,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI;IACtC,IAAI,IAAI,KAAK,EAAE,QACX,OAAO;KAAE,GAAG;KAAG,GAAG,IAAI,GAAG,IAAI,CAAC;IAAE;IACpC,IAAI,CAAC,IACD,KAAK,OAAO,aAAa,CAAC;SACzB,IAAI,MAAM,GACX,MAAM,IAAI,OAAO,MAAM,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,OAAO,IAAK,EAAE,OAAO,MAAO,OAC9E,KAAK,OAAO,aAAa,QAAS,KAAK,IAAK,QAAS,IAAI,IAAK;SAEjE,IAAI,KAAK,GACV,KAAK,OAAO,cAAc,IAAI,OAAO,IAAK,EAAE,OAAO,EAAG;SAEtD,KAAK,OAAO,cAAc,IAAI,OAAO,MAAM,EAAE,OAAO,OAAO,IAAK,EAAE,OAAO,EAAG;GACpF;EACJ;;;;;;;;EA4HA,SAAgB,UAAU,KAAK,QAAQ;GACnC,IAAI,QAAQ;IACR,IAAI,IAAI;IACR,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,OACjC,KAAK,OAAO,aAAa,MAAM,MAAM,IAAI,SAAS,GAAG,IAAI,KAAK,CAAC;IACnE,OAAO;GACX,OACK,IAAI,IACL,OAAO,GAAG,OAAO,GAAG;QAEnB;IACD,IAAI,KAAK,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG;IACtC,IAAI,EAAE,QACF,IAAI,CAAC;IACT,OAAO;GACX;EACJ;EAKA,IAAI,OAAO,SAAU,GAAG,GAAG;GAAE,OAAO,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE;EAAG;EAE5E,IAAI,KAAK,SAAU,GAAG,GAAG,GAAG;GACxB,IAAI,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,KAAK,UAAU,EAAE,SAAS,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK;GACtI,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,MAAM,GAAG;GAC7G,OAAO;IAAC,GAAG,GAAG,IAAI,EAAE;IAAG;IAAI;IAAI;IAAI,KAAK,MAAM,GAAG,GAAG,IAAI,EAAE;IAAG;GAAG;EACpE;EAEA,IAAI,QAAQ,SAAU,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK;GAC3C,IAAI,MAAM,MAAM,YAAY,MAAM,MAAM,YAAY,OAAO,OAAO,YAAY,IAAI,IAAI;GACtF,IAAI,KAAK,MAAM,MAAM;GACrB,IAAI,KAAK,IAAI;IACT,OAAO,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,GAClC,IAAI,GAAG,GAAG,CAAC,KAAK,GACZ,OAAO;KACH,MAAM,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;KAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI;KACrB,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI;KACxC;IACJ;IAIR,IAAI,IAAI,GACJ,IAAI,EAAE;GACd;GACA,OAAO;IAAC;IAAI;IAAI;IAAK;GAAC;EAC1B;;;;;;;;EAwxBA,SAAgB,UAAU,MAAM,MAAM;GAClC,IAAI,QAAQ,CAAC;GACb,IAAI,IAAI,KAAK,SAAS;GACtB,OAAO,GAAG,MAAM,CAAC,KAAK,WAAW,EAAE,GAC/B,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OACxB,IAAI,EAAE;GAGd,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC;GACtB,IAAI,CAAC,GACD,OAAO,CAAC;GACZ,IAAI,IAAI,GAAG,MAAM,IAAI,EAAE;GACvB,IAAI,IAAI,GAAG,MAAM,IAAI,EAAE,KAAK;GAC5B,IAAI,GAAG;IACH,IAAI,KAAK,GAAG,MAAM,IAAI,EAAE;IACxB,IAAI,GAAG,MAAM,EAAE,KAAK;IACpB,IAAI,GAAG;KACH,IAAI,GAAG,MAAM,KAAK,EAAE;KACpB,IAAI,GAAG,MAAM,KAAK,EAAE;IACxB;GACJ;GACA,IAAI,OAAO,QAAQ,KAAK;GACxB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;IACxB,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;IACrH,IAAI;IACJ,IAAI,CAAC,QAAQ,KAAK;KACd,MAAM;KACN,MAAM;KACN,cAAc;KACd,aAAa;IACjB,CAAC,GACG,IAAI,CAAC,KACD,MAAM,MAAM,IAAI,MAAM,GAAG,IAAI,EAAE;SAC9B,IAAI,OAAO,GACZ,MAAM,MAAM,YAAY,KAAK,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;SAErE,IAAI,IAAI,8BAA8B,GAAG;GAErD;GACA,OAAO;EACX;;;;;;;;;;;;;;;ECpnFA,SAAS,eAAe,MAAsB;GAC5C,OAAO,KACJ,QAAQ,SAAS,GAAG,CAAC,CACrB,QAAQ,SAAS,GAAG,CAAC,CACrB,QAAQ,WAAW,IAAG,CAAC,CACvB,QAAQ,WAAW,GAAG,CAAC,CACvB,QAAQ,UAAU,GAAG,CAAC,CACtB,QAAQ,WAAW,GAAG;EAC3B;;EAGA,SAAgB,0BAA0B,QAA0C;GAClF,MAAM,QAAQ,kBAAkB,aAAa,SAAS,IAAI,WAAW,MAAM;GAC3E,IAAI;GACJ,IAAI;IACF,QAAQ,UAAU,KAAK;GACzB,SAAS,OAAO;IACd,MAAM,IAAI,MAAM,wBAAyB,MAAgB,SAAS;GACpE;GACA,MAAM,WAAW,MAAM;GACvB,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,kCAAkC;GAEpD,MAAM,MAAM,UAAU,QAAQ;GAE9B,MAAM,aAAuB,CAAC;GAC9B,MAAM,QAAQ,IAAI,MAAM,cAAc;GACtC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,UAAU,MAAM;IACtB,MAAM,OAAiB,CAAC;IAExB,KAAK,MAAM,SAAS,QAAQ,SAAS,sEAAK,GACxC,IAAI,MAAM,EAAE,CAAC,WAAW,QAAQ,GAC9B,KAAK,KAAK,GAAI;SACT,IAAI,MAAM,EAAE,CAAC,WAAW,OAAO,GACpC,KAAK,KAAK,IAAI;SAEd,KAAK,KAAK,eAAe,MAAM,MAAM,EAAE,CAAC;IAG5C,WAAW,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,QAAQ,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC;GACjE;GAEA,MAAM,OAAO,WAAW,KAAK,IAAI,CAAC,CAAC,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK;GACnE,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,gBAAgB;GAElC,OAAO;EACT;;;;;;;;;;ECjBA,MAAM,OAAuD;GAC3D;IAAE,IAAI;IAAY,OAAO,GAAG,cAAc;GAAE;GAC5C;IAAE,IAAI;IAAY,OAAO,GAAG,cAAc;GAAE;GAC5C;IAAE,IAAI;IAAQ,OAAO,GAAG,UAAU;GAAE;GACpC;IAAE,IAAI;IAAS,OAAO,GAAG,WAAW;GAAE;GACtC;IAAE,IAAI;IAAU,OAAO;GAAO;GAC9B;IAAE,IAAI;IAAc,OAAO,GAAG,gBAAgB;GAAE;GAChD;IAAE,IAAI;IAAa,OAAO,GAAG,eAAe;GAAE;GAC9C;IAAE,IAAI;IAAY,OAAO,GAAG,cAAc;GAAE;EAC9C;;EAGA,SAAS,cAAc,UAA8C;GACnE,QAAQ,YAAY,CAAC,EAAA,CAAG,MAAK,MAAK,EAAE,WAAW,gBAAgB,EAAE,WAAW,WAAW;EACzF;;EAGA,SAAS,YAAY,SAAsD;GACzE,QAAQ,QAAQ,QAAhB;IACE,KAAK,WAAW,OAAO;KAAE,KAAKC,yBAAI;KAAc,OAAO,GAAG,cAAc;IAAE;IAC1E,KAAK,cAAc,OAAO;KAAE,KAAKA,yBAAI;KAAiB,OAAO,GAAG,iBAAiB;IAAE;IACnF,KAAK,WAAW,OAAO;KAAE,KAAKA,yBAAI;KAAc,OAAO,GAAG,cAAc;IAAE;IAC1E,KAAK,aAAa,OAAO;KAAE,KAAKA,yBAAI;KAAiB,OAAO,GAAG,gBAAgB;IAAE;IACjF,KAAK,YAAY,OAAO;KAAE,KAAKA,yBAAI;KAAW,OAAO,GAAG,eAAe;IAAE;IACzE,KAAK,YAAY,OAAO;KAAE,KAAKA,yBAAI;KAAe,OAAO,GAAG,eAAe;IAAE;IAC7E,KAAK,SAAS,OAAO;KAAE,KAAKA,yBAAI;KAAY,OAAO,GAAG,YAAY;IAAE;GACtE;EACF;;EAGA,SAAS,cAAc,UAA0B;GAC/C,OAAO,aAAa,SAAS,oBAAoB,aAAa,WAAW,mBAAmB;EAC9F;;EAGA,SAAgB,WAAW,EAAE,YAAY,OAAwB;GAC/D,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAmC,UAAU;GAC/D,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA0C,IAAI;GAC7D,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAA4C,IAAI;GAChE,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAAwC,CAAC,CAAC;GACjE,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,EAAE;GACjD,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAA8B,EAAE;GACvD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA+C,IAAI;GACjE,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA0B,KAAK;GAClD,MAAM,gBAAA,GAAA,MAAA,OAAA,CAA+C,IAAI;GACzD,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,EAAE;GAC7C,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,EAAE;GAC7C,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GACvC,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwC,CAAC,CAAC;GAC3D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA+C,IAAI;GACvE,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,SAAA,CAA8C,IAAI;GAC1E,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,EAAE;GACjD,MAAM,CAAC,oBAAoB,0BAAA,GAAA,MAAA,SAAA,CAAkC,EAAE;GAC/D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,EAAE;GACjD,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,CAAC;;GAG3B,MAAM,gBAAA,GAAA,MAAA,YAAA,CAA2B,YAAY;IAC3C,IAAI;KACF,MAAM,WAAW,MAAM,IAAI,UAAU;KACrC,SAAS,QAAQ;IACnB,QAAQ,CAA6B;GACvC,GAAG,CAAC,GAAG,CAAC;;GAGR,MAAM,gBAAA,GAAA,MAAA,YAAA,EAA4B,MAAc,OAA6B,WAAW;IACtF,aAAY,SAAQ,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG;KAAE,IAAI,WAAW;KAAW;KAAM;IAAK,CAAC,CAAC;GACrF,GAAG,CAAC,CAAC;;GAGL,MAAM,WAAA,GAAA,MAAA,YAAA,CAAsB,OAAO,YAAY,SAAS;IACtD,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,OAAO;KAChC,UAAU,OAAO,MAAM;KACvB,eAAe,OAAO,MAAM;KAC5B,WAAW,OAAO,WAAW,IAAI;KACjC,kBAAkB,OAAO,cAAc;KACvC,MAAM,cAAc,OAAO,SAAS;KACpC,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,IAC/C,eAAe,WAAW;IAE9B,SAAS,KAAK;KACZ,IAAI,WAAW,SAAU,IAAc,OAAO;IAChD;GACF,GAAG,CAAC,KAAK,WAAW,CAAC;;GAGrB,MAAM,kBAAA,GAAA,MAAA,YAAA,CAA6B,OAAO,SAAe;IACvD,QAAQ,IAAI;IACZ,aAAa,GAAG,yBAAyB,CAAC;IAC1C,SAAS,EAAE;IACX,IAAI;KAEF,MAAM,UAAU,0BAA0B,MADrB,KAAK,YAAY,CACU;KAChD,IAAI,QAAQ,SAAS,IACnB,MAAM,IAAI,MAAM,sBAAsB;KAExC,eAAe,OAAO;KACtB,MAAM,IAAI,YAAY,OAAO;KAC7B,MAAM,QAAQ,KAAK;KACnB,aAAa,MAAM,KAAK,KAAK,QAAQ,QAAQ,OAAO,MAAM,MAAM;IAClE,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,UAAW,IAAc,WAAW,OAAO;IAC1D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF,GAAG;IAAC;IAAK;IAAc;GAAO,CAAC;GAE/B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,QAAa;IACb,aAAkB;GAEpB,GAAG,CAAC,CAAC;;GAGL,MAAM,iBAAiB,OAAO,cAAsC;IAClE,QAAQ,IAAI;IACZ,aAAa,GAAG,yBAAyB,CAAC;IAC1C,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,YAAY,YAAY,kBAAkB,KAAA,IAAY,KAAA,CAAS;KACxF,eAAe,OAAO,OAAO;KAE7B,MAAM,IAAI,YAAY,OAAO,OAAO;KACpC,MAAM,QAAQ,KAAK;KACnB,aAAa,SAAS,OAAO,MAAM,MAAM,OAAO,WAAW,OAAO,SAAS,KAAA,IAAY,MAAM,OAAO,SAAS,MAAM,MAAM;IAC3H,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,UAAW,IAAc,WAAW,OAAO;IAC1D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,oBAAoB,YAA2B;IACnD,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,IAAI,YAAY,WAAW;KACjC,UAAU,GAAG,gBAAgB,CAAC;KAC9B,aAAa,GAAG,gBAAgB,GAAG,MAAM;KACzC,MAAM,QAAQ,KAAK;IACrB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;;GAGA,MAAM,cAAc,YAA2B;IAC7C,QAAQ,IAAI;IACZ,aAAa,GAAG,WAAW,CAAC;IAC5B,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,MAAM,eAAe,KAAA,CAAS;KACvD,YAAW,SAAQ,SAAS,OAAO,OAAO;MAAE,GAAG;MAAM,OAAO,OAAO;MAAO,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;KAAE,CAAC;KAC/G,MAAM,QAAoB,OAAO;KACjC,aAAa,GAAG,sBAAsB;MACpC,GAAG,MAAM,WAAW;MACpB,GAAG,MAAM,WAAW;MACpB,GAAG,MAAM,SAAS;KACpB,CAAC,GAAG,MAAM;IACZ,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,YAAa,IAAc,WAAW,OAAO;IAC5D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,gBAAgB,YAA2B;IAC/C,QAAQ,IAAI;IACZ,aAAa,GAAG,qBAAqB,CAAC;IACtC,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,QAAQ,eAAe,KAAA,CAAS;KACzD,YAAW,SAAQ,SAAS,OAAO,OAAO;MAAE,GAAG;MAAM,SAAS,OAAO;MAAS,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;KAAE,CAAC;KACnH,aAAa,GAAG,wBAAwB,EAAE,GAAG,OAAO,QAAQ,OAAO,CAAC,GAAG,MAAM;IAC/E,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,WAAY,IAAc,WAAW,OAAO;IAC3D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,aAAa,YAA2B;IAC5C,QAAQ,IAAI;IACZ,aAAa,GAAG,eAAe,CAAC;IAChC,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,KAAK,eAAe,KAAA,GAAW,SAAS;KACjE,YAAW,SAAQ;MACjB,MAAM,OAAO,QAAQ;OACnB,UAAU;OAAI,SAAS;OAAa,UAAU,CAAC;OAC/C,aAAa,CAAC;OAAmB,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;OAAG,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;MAC1G;MACA,OAAO;OAAE,GAAG;OAAM,UAAU,CAAC,GAAG,KAAK,UAAU,GAAG,OAAO,QAAQ;OAAG,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;MAAE;KAC1G,CAAC;KACD,aAAa,GAAG,qBAAqB,EAAE,GAAG,OAAO,SAAS,OAAO,CAAC,GAAG,MAAM;IAC7E,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,YAAa,IAAc,WAAW,OAAO;IAC5D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,iBAAA,GAAA,MAAA,YAAA,EAA6B,OAAiB,UAAkC;IACpF,IAAI,MAAM,SAAS,SAAS;KAC1B,YAAW,SAAQ,SAAS,OAAO,OAAO;MACxC,GAAG;MACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,MAAM,KAAK;OAAE,GAAG;OAAG,QAAQ;OAAc,OAAO,KAAA;MAAU,IAAI,CAAC;KAC3G,CAAC;KACD,aAAa,MAAM,MAAM,EAAE,CAAC;IAC9B,OAAO,IAAI,MAAM,SAAS;SACpB,MAAM,KAAK,SAAS,MAAO,KAC7B,aAAa,QAAQ,MAAM,KAAK,OAAO,GAAG;IAAA,OAEvC,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,aAAa;KAC9D,YAAW,SAAQ,SAAS,OAAO,OAAO;MACxC,GAAG;MACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,MAAM,KAAK;OAAE,GAAG;OAAG,QAAQ;OAAW,OAAO,MAAM;OAAO,MAAM,MAAM;OAAM,QAAQ,KAAA;MAAU,IAAI,CAAC;KAC/I,CAAC;KACD,aAAa,GAAG,iBAAiB;MAAE,IAAI,MAAM;MAAI,OAAO,MAAM;MAAO,MAAM,MAAM;KAAK,CAAC,GAAG,MAAM;KAChG,mBAAkB,SAAQ,KAAK,SAAS,MAAM,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC;IACpF,OAAO,IAAI,MAAM,SAAS,UAAU;KAClC,YAAW,SAAQ,SAAS,OAAO,OAAO;MACxC,GAAG;MACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,MAAM,KAAK;OAAE,GAAG;OAAG,QAAQ,MAAM,OAAO,SAAS,aAAa;OAAY,QAAQ,MAAM;MAAO,IAAI,CAAC;KAChJ,CAAC;KACD,aAAa,GAAG,qBAAqB;MACnC,IAAI,MAAM;MACV,OAAO,MAAM,OAAO;MACpB,SAAS,MAAM,OAAO;KACxB,CAAC,GAAG,MAAM,OAAO,SAAS,SAAS,OAAO;IAC5C,OAAO,IAAI,MAAM,SAAS,SAAS;KACjC,YAAW,SAAQ,SAAS,OAAO,OAAO;MACxC,GAAG;MACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,MAAM,KAAK;OAAE,GAAG;OAAG,QAAQ;OAAS,OAAO,MAAM;MAAQ,IAAI,CAAC;KAC1G,CAAC;KACD,aAAa,GAAG,kBAAkB;MAAE,IAAI,MAAM;MAAI,SAAS,MAAM;KAAQ,CAAC,GAAG,OAAO;IACtF;GACF,GAAG,CAAC,YAAY,CAAC;;GAGjB,MAAM,qBAAqB,OAAO,IAAY,eAAuC;IACnF,QAAQ,IAAI;IACZ,aAAa,GAAG,GAAG,YAAY,EAAE,IAAI,GAAG,EAAE;IAC1C,SAAS,EAAE;IACX,IAAI;KACF,MAAM,IAAI,SAAS,IAAI,aAAY,UAAS;MAAE,cAAc,QAAO,MAAK,GAAG,uBAAuB;OAAE,IAAI;OAAG,OAAQ,SAAS,SAAS,MAAK,MAAK,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;MAAI,CAAC,CAAC;KAAE,CAAC;IAChL,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,KAAK,GAAG,OAAQ,IAAc,WAAW,OAAO;IAC/D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;KACf,MAAM,QAAQ,KAAK;IACrB;GACF;;GAGA,MAAM,iBAAiB,YAA2B;IAChD,MAAM,YAAY,SAAS,QAAO,MAAK,EAAE,WAAW,aAAa,EAAE,WAAW,OAAO;IACrF,IAAI,UAAU,WAAW,GAAG;IAC5B,QAAQ,IAAI;IACZ,aAAa,GAAG,GAAG,sBAAsB,EAAE,KAAK,UAAU,OAAO,IAAI;IACrE,SAAS,EAAE;IACX,IAAI,SAAS;IACb,KAAK,MAAM,WAAW,WAAW;KAC/B,aAAa,WAAW,QAAQ,GAAG,KAAK,QAAQ,MAAM,EAAE;KACxD,IAAI;MACF,MAAM,IAAI,SAAS,QAAQ,IAAI,OAAM,UAAS;OAAE,cAAc,QAAO,MAAK,GAAG,uBAAuB;QAAE,IAAI;QAAG,OAAQ,SAAS,SAAS,MAAK,MAAK,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;OAAI,CAAC,CAAC;MAAE,CAAC;KAClL,SAAS,KAAK;MACZ;MACA,aAAa,KAAK,QAAQ,GAAG,OAAQ,IAAc,WAAW,OAAO;KACvE;IACF;IACA,QAAQ,KAAK;IACb,aAAa,EAAE;IACf,MAAM,QAAQ,KAAK;IACnB,aAAa,WAAW,IACpB,UAAU,UAAU,OAAO,UAC3B,UAAU,UAAU,SAAS,OAAO,OAAO,OAAO,OAAO,WAAW,IAAI,SAAS,OAAO;GAC9F;;GAGA,MAAM,eAAe,OAAO,OAA8B;IACxD,QAAQ,IAAI;IACZ,aAAa,GAAG,GAAG,aAAa,EAAE,IAAI,GAAG,EAAE;IAC3C,SAAS,EAAE;IACX,IAAI;KAEF,MAAM,UAAuB,MADR,IAAI,OAAO,EAAE,EAAA,CACE;KACpC,YAAW,SAAQ,SAAS,OAAO,OAAO;MACxC,GAAG;MACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,KAAK;OAAE,GAAG;OAAG,QAAQ,OAAO,SAAS,aAAa;OAAY,QAAQ;MAAO,IAAI,CAAC;KAC9H,CAAC;KACD,aAAa,GAAG,qBAAqB;MAAE;MAAI,OAAO,OAAO;MAAO,SAAS,OAAO;KAAQ,CAAC,GAAG,OAAO,SAAS,SAAS,OAAO;IAC9H,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,gBAAgB,OAAO,OAA8B;IACzD,QAAQ,IAAI;IACZ,aAAa,GAAG,GAAG,cAAc,EAAE,IAAI,GAAG,EAAE;IAC5C,SAAS,EAAE;IACX,IAAI;KACF,MAAM,IAAI,QAAQ,IAAI,oBAAoB,cAAa,UAAS;MAAE,cAAc,QAAO,MAAK,GAAG,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;KAAE,CAAC;KAClI,sBAAsB,EAAE;KACxB,eAAe,EAAE;IACnB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,KAAK,GAAG,SAAU,IAAc,WAAW,OAAO;IACjE,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;KACf,MAAM,QAAQ,KAAK;IACrB;GACF;;GAGA,MAAM,eAAe,OAAO,OAA8B;IACxD,QAAQ,IAAI;IACZ,aAAa,GAAG,GAAG,aAAa,EAAE,IAAI,GAAG,EAAE;IAC3C,SAAS,EAAE;IACX,IAAI;KACF,MAAM,IAAI,OAAO,KAAI,UAAS;MAAE,cAAc,QAAO,MAAK,GAAG,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;KAAE,CAAC;IAClG,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,KAAK,GAAG,SAAU,IAAc,WAAW,OAAO;IACjE,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;KACf,MAAM,QAAQ,KAAK;IACrB;GACF;;GAGA,MAAM,iBAAiB,OAAqB;IAC1C,YAAW,SAAQ,SAAS,OAAO,OAAO;KACxC,GAAG;KACH,UAAU,KAAK,SAAS,KAAI,MAAK,EAAE,OAAO,KAAK;MAAE,GAAG;MAAG,QAAQ;KAAW,IAAI,CAAC;KAC/E,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;IACpC,CAAC;GACH;;GAGA,MAAM,sBAAsB,OAAO,OAA8B;IAC/D,IAAI,oBAAoB,IAAI;KAC1B,mBAAmB,IAAI;KACvB,eAAe,EAAE;KACjB;IACF;IACA,mBAAmB,EAAE;IACrB,eAAe,EAAE;IACjB,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,QAAQ,EAAE;KACnC,eAAe,OAAO,QAAQ;IAChC,SAAS,KAAK;KACZ,eAAe,IAAK,IAAc,QAAQ,EAAE;IAC9C;GACF;;GAGA,MAAM,2BAA2B,YAA2B;IAC1D,QAAQ,IAAI;IACZ,aAAa,GAAG,oBAAoB,CAAC;IACrC,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,WAAW,EAAE,SAAS,KAAK,CAAC;KACrD,YAAW,SAAQ,SAAS,OAAO,OAAO;MAAE,GAAG;MAAM,aAAa,CAAC,GAAI,MAAM,eAAe,CAAC,GAAI,GAAG,OAAO,WAAW;MAAG,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;KAAE,CAAC;KAC9J,aAAa,UAAU,OAAO,YAAY,OAAO,OAAO,MAAM;IAChE,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;KAC/B,aAAa,UAAW,IAAc,WAAW,OAAO;IAC1D,UAAU;KACR,QAAQ,KAAK;KACb,aAAa,EAAE;IACjB;GACF;;GAGA,MAAM,mBAAmB,YAA2B;IAClD,IAAI,gBAAgB,MAAM;IAC1B,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,YAAY;MACnC,aAAa,YAAY;MACzB,WAAW,YAAY;MACvB,UAAU,YAAY;MACtB,OAAO,YAAY;MACnB,cAAc,YAAY;MAC1B,WAAW,YAAY;MACvB,iBAAiB,YAAY;MAC7B,YAAY,YAAY;KAC1B,CAAC;KACD,UAAU,OAAO,MAAM;KACvB,eAAe,OAAO,MAAM;KAC5B,UAAU,GAAG,gBAAgB,CAAC;KAC9B,aAAa,GAAG,gBAAgB,GAAG,MAAM;KACzC,MAAM,QAAQ,KAAK;IACrB,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;;GAGA,MAAM,eAAe,OAAO,WAAwC;IAClE,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,IAAI;KACF,MAAM,SAAS,MAAM,IAAI,WAAW,MAAM;KAC1C,UAAU,GAAG,qBAAqB;MAAE,MAAM,OAAO;MAAM,OAAO,OAAO;MAAO,UAAU,OAAO;KAAS,CAAC,CAAC;KACxG,aAAa,GAAG,qBAAqB;MAAE,MAAM,OAAO;MAAM,OAAO,OAAO;MAAO,UAAU,OAAO;KAAS,CAAC,GAAG,MAAM;IACrH,SAAS,KAAK;KACZ,SAAU,IAAc,OAAO;IACjC,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,MAAM,UAAU,cAAc,SAAS,QAAQ;GAC/C,MAAM,WAAW,SAAS,YAAY,CAAC;GACvC,MAAM,YAAY,SAAS,QAAO,MAAK,EAAE,WAAW,cAAc,EAAE,WAAW,aAAa,EAAE,WAAW,UAAU,CAAC,CAAC;GACrH,MAAM,eAAe,SAAS,QAAO,MAAK,EAAE,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC,CAAC;GAC1F,MAAM,QAAgC,SAAS;GAC/C,MAAM,UAAgC,SAAS;GAC/C,MAAM,cAA4B,SAAS,eAAe,CAAC;;GAG3D,MAAM,eAAe,QAAgB,MAAe,OAAe,MAAc,aAAqB,SAAqB,aACzH,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,yBAAI;cAApB;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAW,GAAGA,yBAAI,YAAY,GAAG,OAAOA,yBAAI,kBAAkBA,yBAAI;gBAAsB,OAAO,MAAM;KAAa,CAAA;KACxH,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,yBAAI;iBAAgB;MAAY,CAAA,GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,yBAAI;iBAAe;MAAW,CAAA,CAC5C;;KACJ,CAAC,QACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI,YAAY,GAAGA,yBAAI;MAAiB,UAAU,YAAY;MAAe;gBAC5H;KACK,CAAA;IAEP;;GAGP,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,yBAAI;cAApB;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;OAAI,WAAWA,yBAAI;iBAAnB,CACG,GAAG,aAAa,GAChB,SAAS,aAAa,MAAM,SAAS,aAAa,KAAA,KACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;QAAO,OAAO;SAAE,aAAa;SAAoB,OAAO;SAAoB,UAAU;QAAG;kBAAI,QAAQ;OAAe,CAAA,CAEzI;UACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,yBAAI;OAAY,OAAO,GAAG,cAAc;OAAG,cAAY,GAAG,cAAc;OAAG,eAAe;QAAE,WAAW,MAAM;OAAE;iBAAG;MAAS,CAAA,CACzJ;;KACJ,UAAU,QACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MACO;MACE;MACP,gBAAgB;OACd,aAAkB;OAElB,eAAe,EAAE;OACjB,WAAW,IAAI;OACf,kBAAkB,CAAC,CAAC;OACpB,eAAe,EAAE;OACjB,mBAAmB,IAAI;OACvB,YAAY,CAAC,CAAC;OACd,QAAa,KAAK;MACpB;KACD,CAAA;KAEH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAAQ,MAAK;gBAC9B,KAAK,KAAI,QACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAqB,MAAK;OAAS,MAAK;OAAM,iBAAe,cAAc,IAAI;OAAI,eAAa,cAAc,IAAI,KAAK,KAAK,KAAA;OAAW,WAAWA,yBAAI;OAAK,eAAe;QAAE,aAAa,IAAI,EAAE;OAAE;iBAC9L,IAAI;MACC,GAFK,IAAI,EAET,CACT;KACE,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;gBAApB;OACG,UAAU,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;QAAM,OAAO,EAAE,aAAa,kBAAkB;kBAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,OAAO,EAAE,OAAO,kBAAkB;mBAAxC;UAA4C,GAAG,cAAc;UAAE;UAAG;SAAY;;OAAM,CAAA;OACzK,WAAW,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,OAAO,EAAE,OAAO,oBAAoB;mBAAI;QAAa,CAAA;OAAM,CAAA;OAC5G,QAAQ,cAAc,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,OAAO,EAAE,OAAO,mBAAmB;mBAAzC,CAA6C,WAAU,GAAO;;OAAM,CAAA;OAE1H,cAAc,cACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,yBAAI;oBAAY,GAAG,gBAAgB;SAAQ,CAAA;SAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAAO,GAAG,qBAAqB;WACjD,OAAO,UAAU,KAAA,IAAY,MAAM;WACnC,SAAS,YAAY,KAAA,IAAY,MAAM;WACvC,MAAM,SAAS,SAAS,IAAI,MAAM;WAClC,MAAM;WACN,OAAO,SAAS;UAClB,CAAC;SAAO,CAAA;SACR,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB;WACG,YAAY,GAAG,YAAY,MAAM,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,sBAAsB,SAAS;YAAE,eAAoB,KAAK;WAAE,GAAG,KAAK;WACpJ,YAAY,GAAG,UAAU,KAAA,GAAW,GAAG,gBAAgB,GAAG,6BAA6B,GAAG,mBAAmB,SAAS;YAAE,YAAiB;WAAE,GAAG,YAAY,IAAI;WAC9J,YAAY,GAAG,YAAY,KAAA,GAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,qBAAqB,SAAS;YAAE,cAAmB;WAAE,GAAG,YAAY,IAAI;WACvJ,YAAY,GAAG,SAAS,SAAS,GAAG,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,kBAAkB,SAAS;YAAE,WAAgB;WAAE,GAAG,YAAY,IAAI;WACrJ,YAAY,GAAG,YAAY,GAAG,GAAG,gBAAgB,GAAG,qBAAqB,GAAG,YAAY,SAAS;YAAE,aAAa,MAAM;WAAE,GAAG,KAAK;WAChI,YAAY,GAAG,YAAY,GAAG,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,oBAAoB,SAAS;YAAE,aAAkB,KAAK;WAAE,GAAG,KAAK;UACxI;;QACF;;OAGN,cAAc,cACb,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;UAAK,OAAO,EAAE,gBAAgB,gBAAgB;oBAAlE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAAY,GAAG,cAAc;UAAQ,CAAA,GACzD,YAAY,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAArB;YAA4B,GAAG,mBAAmB;YAAE;YAAG,QAAQ;WAAe;YAChG;;SAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UACE,WAAW,GAAGA,yBAAI,SAAS,GAAG,aAAaA,yBAAI,iBAAiB;UAChE,eAAe;WAAE,aAAa,SAAS,MAAM;UAAE;UAC/C,aAAY,MAAK;WAAE,EAAE,eAAe;WAAG,cAAc,IAAI;UAAE;UAC3D,mBAAmB;WAAE,cAAc,KAAK;UAAE;UAC1C,SAAQ,MAAK;WACX,EAAE,eAAe;WACjB,cAAc,KAAK;WACnB,MAAM,OAAO,EAAE,aAAa,QAAQ;WACpC,IAAI,SAAS,KAAA,GAAW,eAAoB,IAAI;UAClD;oBAVF;WAYE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,yBAAI;sBAAc;WAAQ,CAAA;WAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,0BAA6B,CAAA;WACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,yBAAI;sBAAM;WAAmB,CAAA;WAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YACE,KAAK;YACL,MAAK;YACL,QAAO;YACP,OAAO,EAAE,SAAS,OAAO;YACzB,WAAU,MAAK;aACb,MAAM,OAAO,EAAE,OAAO,QAAQ;aAC9B,IAAI,SAAS,KAAA,GAAW,eAAoB,IAAI;aAChD,EAAE,OAAO,QAAQ;YACnB;WACD,CAAA;UACE;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;UAAK,OAAO,EAAE,gBAAgB,gBAAgB;oBAAlE,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAArB;YAA4B,GAAG,uBAAuB;YAAE;YAAG,YAAY;WAAa;cACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,yBAAI;WAAQ,UAAU,QAAQ,YAAY,SAAS;WAAI,eAAe;YAAE,kBAAuB;WAAE;qBAC/H,GAAG,sBAAsB;UACpB,CAAA,CACL;;SACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UACE,WAAWA,yBAAI;UACf,OAAO;UACP,aAAa,GAAG,sBAAsB;UACtC,WAAU,MAAK;WAAE,eAAe,EAAE,OAAO,KAAK;UAAE;UAChD,YAAY;SACb,CAAA;QACE;WACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;mBAArB;UAAiC,GAAG,cAAc;UAAE;UAAE,eAAe;UAAO;SAAO;YACnF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;mBAApB,CACG,eAAe,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,GAAG,oBAAoB,EAAQ,CAAA,GACrE,eAAe,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAkB,KAAW,GAAlB,IAAkB,CAAC,CACvD;UACF;SACL,EAAA,CAAA;OAGH,cAAc,UACb,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;mBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;UAAK,OAAO,EAAE,gBAAgB,gBAAgB;oBAAlE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAAY,GAAG,UAAU;UAAQ,CAAA,GACtD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;qBAApB;YACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAWA,yBAAI;uBAAO,GAAG,mBAAmB;YAAQ,CAAA;YAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;aACE,WAAWA,yBAAI;aACf,OAAO,EAAE,OAAO,GAAG;aACnB,MAAK;aACL,KAAK;aACL,KAAK;aACL,OAAO;aACP,WAAU,MAAK;cAAE,MAAM,IAAI,OAAO,EAAE,OAAO,KAAK;cAAG,IAAI,OAAO,UAAU,CAAC,GAAG,aAAa,CAAC;aAAE;YAC7F,CAAA;YACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAWA,yBAAI;uBAAO,GAAG,YAAY;YAAQ,CAAA;YACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,MAAK;aAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;aAAiB,UAAU,QAAQ,YAAY,SAAS;aAAI,eAAe;cAAE,WAAgB;aAAE;uBAClJ,GAAG,eAAe;YACb,CAAA;WACL;YACF;aACJ,YAAY,KAAA,KAAa,QAAQ,SAAS,KACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBACjB,QAAQ,KAAI,MACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAiB,WAAWA,yBAAI;WAAO,OAAO;YAAE,aAAa;YAAoB,OAAO;WAAmB;qBAA3G;YACG,EAAE;YAAG;YAAG,EAAE;YAAM;YAAE,EAAE;YAAa;YAAE,EAAE;YAAW;WAC7C;aAFK,EAAE,EAEP,CACP;SACE,CAAA,CAEJ;;QAEJ,SAAS,SAAS,KACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;mBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;UAAK,OAAO,EAAE,gBAAgB,gBAAgB;oBAAlE,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAArB;YAA2B;YAAG,SAAS;YAAO;YAAU;YAAU;YAAQ;WAAmB;cAC5F,eAAe,KACd,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;WAAiB,UAAU;WAAM,eAAe;YAAE,eAAoB;WAAE;qBAA9H;YACG,GAAG,sBAAsB;YAAE;YAAE;YAAa;WACrC;YAEP;aACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBACjB,SAAS,KAAI,YAAW;WACvB,MAAM,QAAQ,YAAY,OAAO;WACjC,MAAM,WAAW,oBAAoB,QAAQ;WAC7C,MAAM,SAAmC,QAAQ;WACjD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAsB,WAAWA,yBAAI;sBAArC;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAWA,yBAAI;wBAAa,QAAQ;aAAS,CAAA;aACnD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAWA,yBAAI;wBAApB;eACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;gBAAK,WAAWA,yBAAI;0BAApB;iBACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;kBAAQ,MAAK;kBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;kBAAe,OAAO,EAAE,SAAS,UAAU;kBAAG,eAAe;mBAAE,oBAAyB,QAAQ,EAAE;kBAAE;4BACvJ,WAAW,MAAM;iBACZ,CAAA;iBACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,MAAY,CAAA;iBAC1B,QAAQ,WAAW,cAAc,QAAQ,UAAU,KAAA,KAClD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;kBAAM,WAAWA,yBAAI;4BAArB,CAA4B,QAAQ,OAAO,GAAG,cAAc,CAAQ;;iBAErE,QAAQ,SAAS,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;kBAAM,WAAWA,yBAAI;4BAArB,CAA4B,GAAG,cAAc,GAAG,QAAQ,MAAa;;gBACzF;;eACJ,CAAC,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;gBAAK,WAAWA,yBAAI;gBAAc,OAAO,QAAQ;0BAAQ,QAAQ;eAAW,CAAA;eACzF,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;gBAAK,OAAO;iBAAE,SAAS;iBAAQ,eAAe;iBAAU,KAAK;gBAAE;0BAA/D;iBACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;kBAAK,WAAWA,yBAAI;4BAApB;mBAA0B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAI,GAAG,YAAY,GAAE,GAAI,EAAA,CAAA;mBAAC;mBAAE,QAAQ;kBAAW;;iBACxE,QAAQ,YAAY,KAAA,KAAa,QAAQ,YAAY,MACpD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;kBAAK,WAAWA,yBAAI;4BAApB;mBAA0B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAI,GAAG,cAAc,GAAE,GAAI,EAAA,CAAA;mBAAC;mBAAE,QAAQ;kBAAa;;iBAE/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;kBAAK,WAAWA,yBAAI;4BAAiB,eAAe,IAAI,GAAG,gBAAgB,EAAE;iBAAQ,CAAA;iBACpF,WAAW,KAAA,KACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;kBAAK,WAAWA,yBAAI;4BAApB;mBACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;oBAAK,WAAWA,yBAAI;oBAAK,OAAO,EAAE,gBAAgB,gBAAgB;8BAAlE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,GAAG,mBAAmB,EAAK,CAAA,GAC/B,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;qBAAM,OAAO,EAAE,OAAO,OAAO,SAAS,sBAAsB,kBAAkB;+BAA9E;sBACG,GAAG,kBAAkB;sBAAE;sBAAG,OAAO;sBAAM;sBAAI,OAAO,SAAS,GAAG,iBAAiB,IAAI,GAAG,iBAAiB;qBACpG;sBACH;;mBACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;oBAAK,WAAWA,yBAAI;8BAApB;qBAA0B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAI,GAAG,oBAAoB,GAAE,GAAI,EAAA,CAAA;qBAAC;qBAAE,OAAO;oBAAa;;mBACjF,OAAO,OAAO,SAAS,KACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;oBAAI,OAAO;qBAAE,QAAQ;qBAAG,aAAa;qBAAI,UAAU;oBAAG;8BACnD,OAAO,OAAO,KAAK,OAAO,MACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;qBAAY,OAAO,EAAE,OAAO,cAAc,MAAM,QAAQ,EAAE;+BAA1D;sBAA6D;sBACzD,MAAM;sBAAS;sBAAG,MAAM;sBAAK;sBAAI,MAAM;qBACvC;uBAFK,CAEL,CACL;mBACC,CAAA;kBAEH;;kBAEL,QAAQ,WAAW,cAAc,QAAQ,WAAW,aAAa,QAAQ,WAAW,eACpF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;kBAAK,OAAO;mBAAE,SAAS;mBAAQ,eAAe;mBAAU,KAAK;kBAAE;4BAA/D;mBACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;oBAAK,WAAWA,yBAAI;oBAAM,OAAO,EAAE,YAAY,IAAI;8BAAG;mBAAe,CAAA;mBACrE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;oBAAK,WAAWA,yBAAI;8BAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;qBAAO,WAAWA,yBAAI;+BAAY;oBAAoC,CAAA,GACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;qBACE,WAAWA,yBAAI;qBACf,OAAO,EAAE,WAAW,GAAG;qBACvB,aAAY;qBACZ,OAAO;qBACP,WAAU,MAAK;sBAAE,eAAe,EAAE,OAAO,KAAK;qBAAE;oBACjD,CAAA,CACE;;mBACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;oBAAK,WAAWA,yBAAI;8BAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;qBACE,WAAWA,yBAAI;qBACf,OAAO,EAAE,MAAM,EAAE;qBACjB,aAAY;qBACZ,OAAO;qBACP,WAAU,MAAK;sBAAE,sBAAsB,EAAE,OAAO,KAAK;qBAAE;oBACxD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;qBAAQ,MAAK;qBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;qBAAiB,UAAU,QAAQ;qBAAS,eAAe;sBAAE,cAAmB,QAAQ,EAAE;qBAAE;+BAC/I,GAAG,cAAc;oBACZ,CAAA,CACL;;kBACF;;gBAEJ;;cAEJ;;aACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAW,GAAGA,yBAAI,MAAM,GAAG,MAAM;wBAAQ,MAAM;aAAY,CAAA;aACjE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAWA,yBAAI;wBAApB;gBACI,QAAQ,WAAW,aAAa,QAAQ,WAAW,YACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBACE,MAAK;gBACL,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI,YAAY,GAAGA,yBAAI;gBACnD,UAAU,QAAQ;gBAClB,eAAe;iBAAE,mBAAwB,QAAQ,IAAI,IAAI;gBAAE;0BAE1D,GAAG,YAAY;eACV,CAAA;gBAER,QAAQ,WAAW,aAAa,QAAQ,WAAW,eACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBAAQ,MAAK;gBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;gBAAe,UAAU,QAAQ;gBAAS,eAAe;iBAAE,aAAkB,QAAQ,EAAE;gBAAE;0BAC5I,GAAG,aAAa;eACX,CAAA;eAET,QAAQ,WAAW,aAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBAAQ,MAAK;gBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;gBAAe,UAAU,QAAQ;gBAAS,eAAe;iBAAE,cAAc,QAAQ,EAAE;gBAAE;0BACxI,GAAG,cAAc;eACZ,CAAA;gBAER,QAAQ,WAAW,aAAa,QAAQ,WAAW,cAAc,QAAQ,WAAW,eACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBAAQ,MAAK;gBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;gBAAe,UAAU,QAAQ;gBAAS,eAAe;iBAAE,aAAkB,QAAQ,EAAE;gBAAE;0BAC5I,GAAG,aAAa;eACX,CAAA;eAET,QAAQ,WAAW,cAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBAAQ,MAAK;gBAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;gBAAe,UAAU,QAAQ;gBAAS,eAAe;iBAAE,mBAAwB,QAAQ,IAAI,IAAI;gBAAE;0BACxJ,GAAG,cAAc;eACZ,CAAA;cAEP;;YACF;cAxGK,QAAQ,EAwGb;UAET,CAAC;SACE,CAAA,CACF;;QAGP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;mBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,yBAAI;oBAAY,GAAG,eAAe;SAAQ,CAAA,GAC3D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACG,SAAS,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,yBAAI;qBAAO,GAAG,gBAAgB;UAAQ,CAAA,GAChF,SAAS,KAAI,SACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;WAAmB,WAAW,KAAK,SAAS,SAASA,yBAAI,mBAAmB,KAAK,SAAS,UAAUA,yBAAI,oBAAoBA,yBAAI;qBAC7H,KAAK;UACH,GAFK,KAAK,EAEV,CACN,CACE;WACF;;OACL,EAAA,CAAA;OAGH,cAAc,WACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;SAAK,OAAO,EAAE,gBAAgB,gBAAgB;mBAAlE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,yBAAI;oBAAY,GAAG,aAAa;SAAQ,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;UAAiB,UAAU;UAAM,eAAe;WAAE,YAAiB;UAAE;oBACxH,GAAG,WAAW;SACT,CAAA,CACL;YACJ,UAAU,KAAA,IACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;mBAAO,GAAG,YAAY;QAAQ,CAAA,IAEnD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,eAAe;UAAU,KAAK;SAAG;mBAAhE;UACG,MAAM,UAAU,MACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;WAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAI,GAAG,aAAa,GAAE,GAAI,EAAA,CAAA;WAAC;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,yBAAI;sBAAO,MAAM;WAAY,CAAA;UAAM,EAAA,CAAA;UAEtF,MAAM,WAAW,SAAS,KACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;WAAI,GAAG,kBAAkB;WAAE;WAAE,MAAM,WAAW;WAAO;UAAI,EAAA,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;WAAI,OAAO;YAAE,QAAQ;YAAG,aAAa;YAAI,UAAU;WAAG;qBAAI,MAAM,WAAW,KAAK,GAAG,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAa,EAAM,GAAV,CAAU,CAAC;UAAM,CAAA,CAChH,EAAA,CAAA;UAEN,MAAM,WAAW,SAAS,KACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;WAAI,GAAG,kBAAkB;WAAE;WAAE,MAAM,WAAW;WAAO;UAAI,EAAA,CAAA,GACxD,MAAM,WAAW,KAAI,SACpB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAqB,OAAO;YAAE,WAAW;YAAG,UAAU;WAAG;qBAAzD;YACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,KAAQ,CAAA;YAAC;YAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,WAAWA,yBAAI;uBAArB;cAA2B;cAAE,KAAK;cAAK;cAAG,KAAK,OAAO,KAAK,GAAG;aAAQ;;YACxF,KAAK,UAAU,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,yBAAI;uBAApB,CAA0B,OAAI,KAAK,KAAW;;YACnE,KAAK,cAAc,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,yBAAI;uBAApB,CAA0B,OAAI,KAAK,SAAe;;WACzE;aAJK,KAAK,IAIV,CACN,CACE,EAAA,CAAA;UAEN,MAAM,SAAS,SAAS,KACvB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;WAAI,GAAG,gBAAgB;WAAE;WAAE,MAAM,SAAS;WAAO;UAAI,EAAA,CAAA,GACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;WAAI,OAAO;YAAE,QAAQ;YAAG,aAAa;YAAI,UAAU;YAAI,OAAO;WAAkB;qBAAI,MAAM,SAAS,KAAK,GAAG,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAa,EAAM,GAAV,CAAU,CAAC;UAAM,CAAA,CACxI,EAAA,CAAA;UAEN,MAAM,MAAM,SAAS,KACpB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;WAAI,GAAG,aAAa;WAAE;WAAE,MAAM,MAAM;WAAO;UAAI,EAAA,CAAA,GAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;WAAI,OAAO;YAAE,QAAQ;YAAG,aAAa;YAAI,UAAU;WAAG;qBAAI,MAAM,MAAM,KAAK,GAAG,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAa,EAAM,GAAV,CAAU,CAAC;UAAM,CAAA,CAC3G,EAAA,CAAA;SAEJ;UAEJ;;OAGN,cAAc,YACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAgB,IAAM,CAAA;OAGvB,cAAc,gBACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;SAAK,OAAO,EAAE,gBAAgB,gBAAgB;mBAAlE,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,yBAAI;oBAArB;WAAiC,GAAG,kBAAkB;WAAE;WAAE,YAAY;WAAO;UAAO;aACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;UAAiB,UAAU;UAAM,eAAe;WAAE,yBAA8B;UAAE;oBACrI,GAAG,oBAAoB;SAClB,CAAA,CACL;YACJ,YAAY,WAAW,IACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;mBAAO,GAAG,iBAAiB;QAAQ,CAAA,IAExD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;mBACjB,YAAY,KAAI,MAAK;UACpB,MAAM,cAAc;WAAE,SAAS,GAAG,oBAAoB;WAAG,SAAS,GAAG,oBAAoB;WAAG,aAAa,GAAG,wBAAwB;WAAG,UAAU,GAAG,qBAAqB;WAAG,WAAW,GAAG,sBAAsB;UAAE,EAAE,EAAE;UACtN,MAAM,cAAc,EAAE,WAAW,aAAa,sBAAsB,EAAE,WAAW,aAAa,EAAE,WAAW,gBAAgB,qBAAqB,EAAE,WAAW,cAAc,qBAAqB;UAChM,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAgB,WAAWA,yBAAI;qBAA/B;YACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,yBAAI;uBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;cAAK,WAAWA,yBAAI;wBAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,YAAkB,CAAA;aACxB,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAWA,yBAAI;wBAApB;eACG,EAAE,mBAAmB,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;gBAAO,GAAG,sBAAsB;gBAAE;gBAAG,EAAE;gBAAe;eAAU,EAAA,CAAA;eAClG,EAAE,kBAAkB,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;gBAAO,GAAG,mBAAmB;gBAAE;gBAAG,EAAE;gBAAc;eAAU,EAAA,CAAA;eAC7F,EAAE,iBAAiB,KAAA,KAAa,EAAE,iBAAiB,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;gBAAM;gBAAI,EAAE;gBAAa;eAAS,EAAA,CAAA;cACzF;eACF;;YACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAWA,yBAAI;aAAO,OAAO;cAAE,aAAa;cAAa,OAAO;aAAY;uBAAI;YAAkB,CAAA;YACxG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,yBAAI;aAAK,OAAO,EAAE,KAAK,EAAE;uBAAzC,CACG,EAAE,WAAW,aACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;cAAe,UAAU;cAAM,eAAe;eAClG,IAAS,WAAW;gBAAE,IAAI,EAAE;gBAAI,QAAQ;gBAAW,gBAAgB,YAAY;eAAE,CAAC,CAAC,CAAC,MAAK,MAAK,YAAW,SAAQ,SAAS,OAAO,OAAO;gBAAE,GAAG;gBAAM,aAAa,EAAE;eAAY,CAAC,CAAC;cAClL;wBACG,GAAG,uBAAuB;aACrB,CAAA,IAER,EAAE,WAAW,aAAa,EAAE,WAAW,kBACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;cAAe,UAAU;cAAM,eAAe;eAClG,IAAS,WAAW;gBAAE,IAAI,EAAE;gBAAI,QAAQ;gBAAY,cAAc,IAAI,UAAU;eAAK,CAAC,CAAC,CAAC,MAAK,MAAK,YAAW,SAAQ,SAAS,OAAO,OAAO;gBAAE,GAAG;gBAAM,aAAa,EAAE;eAAY,CAAC,CAAC;cACtL;wBACG,GAAG,wBAAwB;aACtB,CAAA,CAEP;;WACF;aA5BK,EAAE,EA4BP;SAET,CAAC;QACE,CAAA,CAEJ;;OAGN,cAAc,eACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD,EAAmB,IAAM,CAAA;OAG1B,cAAc,cAAc,gBAAgB,QAC3C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,yBAAI;kBAApB;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,yBAAI;oBAAY,GAAG,gBAAgB;SAAQ,CAAA;SAC5D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,yBAAI;qBAAa,GAAG,sBAAsB;UAAS,CAAA,GACrE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,yBAAI;WAAO,OAAO,YAAY;WAAa,WAAU,MAAK;YAAE,eAAe;aAAE,GAAG;aAAa,aAAa,EAAE,OAAO;YAAM,CAAC;WAAE;UAAI,CAAA,CAC/I;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,yBAAI;qBAAa,GAAG,oBAAoB;UAAS,CAAA,GACnE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,yBAAI;WAAO,OAAO,YAAY;WAAW,WAAU,MAAK;YAAE,eAAe;aAAE,GAAG;aAAa,WAAW,EAAE,OAAO;YAAM,CAAC;WAAE;UAAI,CAAA,CAC3I;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,mBAAmB;WAAS,CAAA,GAClE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;YAAO,OAAO,YAAY;YAAU,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,UAAU,EAAE,OAAO;aAAM,CAAC;YAAE;WAAI,CAAA,CACzI;cACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,gBAAgB;WAAS,CAAA,GAC/D,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;YAAO,OAAO,YAAY;YAAO,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,OAAO,EAAE,OAAO;aAAM,CAAC;YAAE;WAAI,CAAA,CACnI;YACF;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,uBAAuB;WAAS,CAAA,GACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;YAAO,MAAK;YAAS,KAAK;YAAM,KAAK;YAAO,OAAO,YAAY;YAAc,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,cAAc,OAAO,EAAE,OAAO,KAAK;aAAE,CAAC;YAAE;WAAI,CAAA,CAC9L;cACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,oBAAoB;WAAS,CAAA,GACnE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;YAAO,MAAK;YAAS,KAAK;YAAM,KAAK;YAAO,OAAO,YAAY;YAAW,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,WAAW,OAAO,EAAE,OAAO,KAAK;aAAE,CAAC;YAAE;WAAI,CAAA,CACxL;YACF;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,0BAA0B;WAAS,CAAA,GACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;YAAO,MAAK;YAAS,KAAK;YAAG,KAAK;YAAK,OAAO,YAAY;YAAiB,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,iBAAiB,OAAO,EAAE,OAAO,KAAK;aAAE,CAAC;YAAE;WAAI,CAAA,CAC/L;cACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAWA,yBAAI;WAAO,OAAO,EAAE,MAAM,EAAE;qBAA5C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,yBAAI;sBAAa,GAAG,qBAAqB;WAAS,CAAA,GACpE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;YACE,WAAWA,yBAAI;YACf,OAAO,YAAY,aAAa,MAAM;YACtC,WAAU,MAAK;aAAE,eAAe;cAAE,GAAG;cAAa,YAAY,EAAE,OAAO,UAAU;aAAI,CAAC;YAAE;sBAH1F,CAKE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,OAAM;uBAAI;YAAW,CAAA,GAC7B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,OAAM;uBAAI;YAAW,CAAA,CACvB;aACL;YACF;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB;WACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAW,GAAGA,yBAAI,OAAO,GAAGA,yBAAI;YAAiB,UAAU;YAAM,eAAe;aAAE,iBAAsB;YAAE;sBAC7H,GAAG,eAAe;WACb,CAAA;WACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAWA,yBAAI;YAAQ,eAAe;aAAE,IAAS,WAAW;YAAE;sBACjF,GAAG,qBAAqB;WACnB,CAAA;WACR,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAWA,yBAAI;sBAArB;aAA2B;aAAI,QAAQ;aAAS;aAAI,QAAQ;aAAM;aAAI,QAAQ;YAAgB;;UAC3F;;SACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,yBAAI;oBAApB;WACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,yBAAI;sBAAY,GAAG,iBAAiB;WAAQ,CAAA;WAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAWA,yBAAI;YAAQ,UAAU,QAAQ,SAAS,WAAW;YAAG,eAAe;aAAE,aAAkB,KAAK;YAAE;sBAC7H,GAAG,oBAAoB;WAClB,CAAA;WACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAWA,yBAAI;YAAQ,UAAU,QAAQ,SAAS,WAAW;YAAG,eAAe;aAAE,aAAkB,IAAI;YAAE;sBAC5H,GAAG,mBAAmB;WACjB,CAAA;UACL;;QACF;;MAEJ;;IACF;;EAET;;;;;;;;EC/8BA,MAAM,+BAA+B;EACrC,MAAM,cAAc;;EAEpB,MAAM,qBAAqB,CAAC,6BAA6B,qBAAqB;;EAE9E,MAAM,iBAAiB;EACvB,MAAM,aAAa;;EAGnB,SAAS,qBAA8C;GACrD,OAAO,SAAS,cAA2B,4BAA4B,KAAK,KAAA;EAC9E;;;;;EAMA,SAAgB,WAAW,YAA6B,KAA2B;GACjF,IAAI;GACJ,IAAI;GAEJ,MAAM,eAAqB;IACzB,IAAI,cAAc,KAAA,GAAW;KAC3B,IAAI,UAAU,aAAa;KAC3B,MAAM,QAAQ;KACd,OAAO,KAAA;KACP,UAAU,OAAO;KACjB,YAAY,KAAA;IACd;IACA,MAAM,SAAS,mBAAmB;IAClC,IAAI,WAAW,KAAA,GAAW;IAC1B,YAAY,SAAS,cAAc,KAAK;IACxC,UAAU,QAAQ,oBAAoB;IACtC,UAAU,YAAYC,yBAAI;IAC1B,OAAO,YAAY,SAAS;IAC5B,QAAA,GAAA,iBAAA,WAAA,CAAkB,SAAS;IAC3B,KAAK,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAwB;KAAiB;IAAM,CAAA,CAAC;GAC9D;GAEA,MAAM,eAAe,IAAI,uBAAuB;IAAE,OAAO;GAAE,CAAC;GAC5D,aAAa,QAAQ,SAAS,MAAM;IAAE,WAAW;IAAM,SAAS;GAAK,CAAC;GAEtE,MAAM,oBAA0B;IAC9B,IAAI,WAAW,YAAY,CAAC,CAAC,WAAW;KACtC,KAAK,MAAM,QAAQ,oBAAoB,SAAS,gBAAgB,gBAAgB,IAAI;KACpF,SAAS,gBAAgB,aAAa,aAAa,EAAE;KACrD,SAAS,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,WAAW,CAAC,CAAC;IAChF,OACE,SAAS,gBAAgB,gBAAgB,WAAW;GAExD;GACA,MAAM,mBAAmB,UAAuB;IAC9C,MAAM,SAAU,MAAsB;IACtC,KAAK,WAAW,eAAe,WAAW,UAAU,WAAW,YAAY,CAAC,CAAC,WAC3E,WAAW,MAAM;GAErB;GAEA,MAAM,uBAAuB;GAC7B,MAAM,qBAAqB,UAA4B;IACrD,IAAI,CAAC,WAAW,YAAY,CAAC,CAAC,WAAW;IACzC,MAAM,SAAS,MAAM;IACrB,IAAI,WAAW,MAAM;IACrB,IAAI,OAAO,QAAQ,oBAAoB,MAAM,MAAM,WAAW,MAAM;GACtE;GACA,SAAS,iBAAiB,SAAS,mBAAmB,IAAI;GAC1D,SAAS,iBAAiB,gBAAgB,eAAe;GACzD,MAAM,cAAc,WAAW,UAAU,WAAW;GACpD,YAAY;GACZ,OAAO;GAEP,aAAa;IACX,SAAS,oBAAoB,SAAS,mBAAmB,IAAI;IAC7D,SAAS,oBAAoB,gBAAgB,eAAe;IAC5D,aAAa,WAAW;IACxB,YAAY;IACZ,SAAS,gBAAgB,gBAAgB,WAAW;IACpD,MAAM,QAAQ;IACd,OAAO,KAAA;IACP,WAAW,OAAO;IAClB,YAAY,KAAA;GACd;EACF;;;;ECrFA,IAAa,kBAAb,MAA6B;GAC3B,YAAoB;GACpB,4BAAoB,IAAI,IAAgB;GAExC,cAAuC;IACrC,OAAO,EAAE,WAAW,KAAK,UAAU;GACrC;GAEA,UAAU,IAA4B;IACpC,KAAK,UAAU,IAAI,EAAE;IACrB,aAAa;KAAE,KAAK,UAAU,OAAO,EAAE;IAAE;GAC3C;GAEA,OAAa;IACX,IAAI,KAAK,WAAW;IACpB,KAAK,YAAY;IACjB,KAAK,OAAO;GACd;GAEA,QAAc;IACZ,IAAI,CAAC,KAAK,WAAW;IACrB,KAAK,YAAY;IACjB,KAAK,OAAO;GACd;GAEA,SAAe;IACb,IAAI,KAAK,WAAW,KAAK,MAAM;SAC1B,KAAK,KAAK;GACjB;GAEA,SAAuB;IACrB,KAAK,MAAM,MAAM,CAAC,GAAG,KAAK,SAAS,GAAG,GAAG;GAC3C;EACF;;;;EC5BA,SAAS,cAAuC;GAC9C,MAAM,SAAS,SAAS,cAA2B,kDAA8C;GACjG,IAAI,WAAW,MAAM,OAAO,KAAA;GAE5B,OADkB,OAAO,cAA2B,sBAAoB,CAAC,EAAE,iBACtD,OAAO;EAC9B;;EAGA,SAAS,iBAAiB,MAAkD;GAC1E,MAAM,SAAS,KAAK,cAAiC,+BAA6B;GAClF,IAAI,WAAW,MAAM,OAAO;GAC5B,KAAK,MAAM,SAAS,KAAK,UACvB,IAAI,MAAM,YAAY,UAAU,OAAO;EAG3C;;EAGA,SAAS,YAAY,YAAgD;GACnE,MAAM,QAAQ,SAAS,cAAc,QAAQ;GAC7C,MAAM,OAAO;GACb,MAAM,QAAQ,qBAAqB;GACnC,MAAM,YAAYC,yBAAI;GACtB,MAAM,aAAa,cAAc,GAAG,aAAa,CAAC;GAClD,MAAM,aAAa,SAAS,GAAG,eAAe,CAAC;GAC/C,MAAM,YAAY,mBAAkBA,yBAAI,YAAY,uWAAuCA,yBAAI,aAAa,QAAO,GAAG,aAAa,IAAI;GACvI,MAAM,iBAAiB,eAAe;IAAE,WAAW,OAAO;GAAE,CAAC;GAC7D,OAAO;EACT;;EAGA,SAAS,WAAW,MAAmB,OAAmC;GACxE,MAAM,SAAS,iBAAiB,IAAI;GACpC,IAAI,WAAW,KAAA,GAAW,OAAO;GACjC,IAAI,MAAM,kBAAkB,MAAM;IAChC,MAAM,MAAM,OAAO,QAAQ,sBAAoB;IAC/C,MAAM,OAAQ,QAAQ,QAAQ,IAAI,kBAAkB,OAAQ,MAAM;IAClE,MAAM,SAAS,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QACtC,OAA0B,cAAc,eAAe,GAAG,QAAQ,+EAA+E,CACpJ;IACA,MAAM,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,KAAK,KAAA;IAC7D,MAAM,SAAS,SAAS,KAAA,IAAY,KAAK,qBAAqB,KAAK;IACnE,KAAK,aAAa,OAAO,MAAM;GACjC;GACA,OAAO;EACT;;;;;EAMA,SAAgB,kBAAkB,YAAyC;GACzE,MAAM,QAAQ,YAAY,UAAU;GACpC,IAAI;GACJ,IAAI,SAAS;GAEb,MAAM,iBAAuB;IAC3B,IAAI,SAAS,KAAA,KAAa,CAAC,KAAK,aAAa;KAC3C,aAAa,WAAW;KACxB,OAAO,KAAA;KACP,SAAS;IACX;IACA,IAAI,QAAQ;KACV,IAAI,SAAS,KAAK,SAAS,KAAK,GAAG;KACnC,aAAa,WAAW;KACxB,OAAO,KAAA;KACP,SAAS;IACX;IACA,SAAS,YAAY;IACrB,IAAI,SAAS,KAAA,GAAW;IACxB,SAAS,WAAW,MAAM,KAAK;IAC/B,IAAI,QACF,aAAa,QAAQ,MAAM;KAAE,WAAW;KAAM,SAAS;IAAK,CAAC;GAEjE;GAEA,MAAM,eAAe,IAAI,uBAAuB;IAAE,SAAS;GAAE,CAAC;GAC9D,aAAa,QAAQ,SAAS,MAAM;IAAE,WAAW;IAAM,SAAS;GAAK,CAAC;GAEtE,MAAM,eAAe,IAAI,uBAAuB;IAC9C,IAAI,SAAS,KAAA,KAAa,CAAC,KAAK,aAAa;KAC3C,SAAS;KACT,SAAS;KACT;IACF;IACA,IAAI,CAAC,KAAK,SAAS,KAAK,GACtB,SAAS,WAAW,MAAM,KAAK;GAEnC,CAAC;GAED,MAAM,mBAAmB;IACvB,IAAI,WAAW,YAAY,CAAC,CAAC,WAAW,MAAM,QAAQ,SAAS;SAC1D,OAAO,MAAM,QAAQ;GAC5B;GACA,MAAM,cAAc,WAAW,UAAU,UAAU;GACnD,WAAW;GAEX,SAAS;GAET,aAAa;IACX,aAAa,WAAW;IACxB,aAAa,WAAW;IACxB,YAAY;IACZ,MAAM,OAAO;GACf;EACF;;;;EC5GA,MAAa,SAAS,CAAC,SAAS,QAAQ;;;;;EAMxC,SAAgB,MAAM,KAA0B;GAC9C,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,MAAM,IAAI,SAAS;GACzB,MAAM,YAA+B,CAAC;GACtC,IAAI;IACF,UAAU,KAAK,kBAAkB,UAAU,CAAC;IAC5C,UAAU,KAAK,WAAW,YAAY,GAAG,CAAC;GAC5C,SAAS,OAAO;IAEd,QAAQ,KAAK,mCAAmC,KAAK;GACvD;GACA,IAAI,mBAAmB;IACrB,KAAK,MAAM,WAAW,UAAU,OAAO,CAAC,GAAG,QAAQ;GACrD,GAAG,4BAA4B;EACjC"}
1
+ {"version":3,"file":"client.js","names":["zh","zh","css","css","css","css","css","css"],"sources":["../src/protocol.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/panel/helpers.ts","../src/client/panel/AssistantTab.tsx","../src/client/panel/AssetsTab.tsx","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/client/docx.ts","../src/client/panel/BookshelfBar.tsx","../src/client/panel/NovelPanel.tsx","../src/client/mount.tsx","../src/client/panel/controller.ts","../src/client/sidebar-entry.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-novel-forge — shared protocol between the host half (Node) and the\n * browser half (web GUI). Route paths, request/response shapes, the project\n * state file format, and the NDJSON generation stream frames all live here so\n * both halves spell exactly one vocabulary.\n */\n\n/** The /api/dsh-novel-forge route family (same-origin, loopback-fenced). */\nexport const NOVEL_API = {\n status: '/api/dsh-novel-forge/status',\n loadOutline: '/api/dsh-novel-forge/load-outline',\n saveOutline: '/api/dsh-novel-forge/save-outline',\n plan: '/api/dsh-novel-forge/plan',\n volumes: '/api/dsh-novel-forge/volumes',\n bible: '/api/dsh-novel-forge/bible',\n assets: '/api/dsh-novel-forge/assets',\n styleEngine: '/api/dsh-novel-forge/style-engine',\n generate: '/api/dsh-novel-forge/generate',\n review: '/api/dsh-novel-forge/review',\n rewrite: '/api/dsh-novel-forge/rewrite',\n polish: '/api/dsh-novel-forge/polish',\n /** 采纳待确认草稿(润色/重写产物)覆盖正文文件。 */\n draftApply: '/api/dsh-novel-forge/draft/apply',\n /** 放弃待确认草稿,保留原稿。 */\n draftDiscard: '/api/dsh-novel-forge/draft/discard',\n summary: '/api/dsh-novel-forge/summary',\n foreshadow: '/api/dsh-novel-forge/foreshadow',\n exportBook: '/api/dsh-novel-forge/export',\n chapter: '/api/dsh-novel-forge/chapter',\n assistant: '/api/dsh-novel-forge/assistant',\n assistantHistory: '/api/dsh-novel-forge/assistant-history',\n bookshelf: '/api/dsh-novel-forge/bookshelf',\n /** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */\n reset: '/api/dsh-novel-forge/reset',\n /** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */\n audit: '/api/dsh-novel-forge/audit',\n /** 角色卡刷新:基于事实库与各章摘要聚合角色当前状态。 */\n charactersRefresh: '/api/dsh-novel-forge/characters/refresh',\n /** 事实库回填:对历史已生成章节批量抽取事实(旧章节无事实记录时用)。 */\n factsBackfill: '/api/dsh-novel-forge/facts/backfill',\n /** 设定圣经局部修补(如世界观规则编辑)。 */\n biblePatch: '/api/dsh-novel-forge/bible/patch',\n config: '/api/dsh-novel-forge/config',\n openFolder: '/api/dsh-novel-forge/open-folder',\n} as const\n\n/** 书架:一本书的条目。 */\nexport interface BookEntry {\n /** 稳定 id。 */\n id: string\n /** 书名。 */\n bookName: string\n /** 该书输出目录(独立项目目录)。 */\n outputDir: string\n /** 创建时间。 */\n createdAt: string\n /** 最后活动时间。 */\n updatedAt: string\n}\n\n/** 书架快照(含每本书的进度摘要)。 */\nexport interface BookshelfSnapshot {\n books: Array<BookEntry & { done: number; total: number; hasProject: boolean }>\n /** 当前激活的书 id(无则 null)。 */\n activeBookId: string | null\n}\n\n/** POST /bookshelf 请求:创建新书。 */\nexport interface BookCreateRequest {\n bookName: string\n outputDir?: string\n /** 开书向导:创建时直接导入的大纲文本(提供则立即建立项目)。 */\n outline?: string\n}\n\n/** POST /reset 请求:重置项目(可选更新大纲)。 */\nexport interface ResetRequest {\n /** 新大纲文本;提供则替换 outline,否则保留原大纲。 */\n outline?: string\n}\n\n/** POST /bookshelf/activate 请求:切换当前书。 */\nexport interface BookActivateRequest {\n id: string\n}\n\n/** POST /bookshelf/remove 请求:移除书架条目。 */\nexport interface BookRemoveRequest {\n id: string\n}\n\n/** Chapter lifecycle states (the writing pipeline's state machine). */\nexport type ChapterStatus =\n | 'pending' // planned, not started\n | 'generating' // LLM writing right now\n | 'written' // body on disk, awaiting review\n | 'reviewing' // review in progress\n | 'approved' // passed review (or user-approved)\n | 'rejected' // review found problems\n | 'error' // generation failed\n\n/** One chapter in the plan. */\nexport interface ChapterPlan {\n /** 1-based chapter number (stable identity; files are named from it). */\n no: number\n /** Volume this chapter belongs to (1-based; 0 = unassigned). */\n volume: number\n /** Chapter title, decided by the LLM plan step. */\n title: string\n /** Story beats / plot points for this chapter (model-facing guidance). */\n beats: string\n /** Target character count (defaults to the configured chapter size). */\n targetChars: number\n /** Generation/review state. */\n status: ChapterStatus\n /** Actual character count once generated. */\n chars?: number\n /** Failure message when status is 'error'. */\n error?: string\n /** Output file name once generated (relative to the output dir). */\n file?: string\n /** LLM summary of the chapter (narrative memory for later chapters). */\n summary?: string\n /** Latest review report (present once reviewed). */\n review?: ReviewReport\n /**\n * 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,\n * 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。\n */\n pendingDraft?: string\n}\n\n/** One review finding. */\nexport interface ReviewIssue {\n /** Severity: high = must fix, medium = should fix, low = suggestion. */\n severity: 'high' | 'medium' | 'low'\n /** What the problem is. */\n item: string\n /** Concrete suggestion for fixing it. */\n suggestion: string\n}\n\n/** AI review report for one chapter. */\nexport interface ReviewReport {\n /** Overall score 0-100. */\n score: number\n /** Pass threshold (config; 70 default). */\n passed: boolean\n /** One-line verdict. */\n verdict: string\n /** Individual findings. */\n issues: ReviewIssue[]\n /** When the review ran. */\n reviewedAt: string\n}\n\n/** A volume of the book. */\nexport interface Volume {\n /** 1-based volume number. */\n no: number\n /** Volume title. */\n title: string\n /** Volume positioning / summary. */\n summary: string\n /** First chapter number of this volume. */\n chapterStart: number\n /** Last chapter number (inclusive). */\n chapterEnd: number\n}\n\n/** A character card from the story bible. */\nexport interface CharacterCard {\n name: string\n role: 'protagonist' | 'supporting' | 'antagonist' | 'other'\n /** Personality / traits (short lines). */\n traits: string[]\n /** Goals and motivations. */\n goals: string\n /** Key relations to other characters. */\n relations: string\n}\n\n/** The structured story bible (worldbuilding extracted from the outline). */\nexport interface StoryBible {\n /** Genre + tone tags. */\n genre: string\n /** Worldbuilding rules (power system, geography, factions...). */\n worldRules: string[]\n /** Character cards. */\n characters: CharacterCard[]\n /** Writing red lines (forbidden content / must-avoid tropes). */\n redLines: string[]\n /** Style guidance (pacing, pov, tone). */\n style: string[]\n /** When the bible was generated. */\n generatedAt?: string\n}\n\n/** A planted/active/resolved foreshadowing thread. */\nexport interface Foreshadow {\n /** Stable id. */\n id: string\n /** What the foreshadow is. */\n description: string\n /** Chapter where it was planted (undefined = planned). */\n plantedChapter?: number\n /** Chapter where it should be paid off. */\n targetChapter?: number\n /** Lifecycle state. */\n status: 'planned' | 'planted' | 'progressing' | 'resolved' | 'abandoned'\n /** Resolution note when resolved. */\n resolvedNote?: string\n}\n\n/** 一条已确立的叙事事实(事实库/时间线,注入后续章节生成)。 */\nexport interface ChapterFact {\n /** 来源章节号。 */\n chapterNo: number\n /** 事实文本(人物状态/境界资源/关系变化/伏笔落地等)。 */\n text: string\n}\n\n/** 一条全书质检发现的问题(一致性矛盾,定位到章)。 */\nexport interface AuditIssue {\n /** 问题所在章节号(无法定位时 0)。 */\n chapterNo: number\n severity: 'high' | 'medium' | 'low'\n /** 矛盾描述。 */\n item: string\n /** 修改建议。 */\n suggestion: string\n}\n\n/** POST /audit 响应。 */\nexport interface AuditResponse {\n issues: AuditIssue[]\n /** 参与质检的章节数。 */\n auditedChapters: number\n /** 质检时间。 */\n auditedAt: string\n}\n\n/** 角色卡:角色当前状态(从事实库聚合)。 */\nexport interface RoleStatusCard {\n name: string\n /** protagonist / supporting / antagonist / other。 */\n role: string\n /** 当前状态一句话(境界/资源/伤势/心境)。 */\n status: string\n /** 最近出场章节。 */\n lastChapter: number\n /** 出场次数。 */\n appearances: number\n}\n\n/** POST /bible/patch 请求:局部修补设定圣经。 */\nexport interface BiblePatchRequest {\n worldRules?: string[]\n redLines?: string[]\n style?: string[]\n}\n\n/** The persisted project: outline + bible + plan + progress. */\nexport interface ProjectState {\n /** Book title (first non-empty line of the outline, usually). */\n bookName: string\n /** Full outline text (docx-extracted or pasted). */\n outline: string\n /** Source outline path when loaded from a docx. */\n outlinePath?: string\n /** Structured story bible (worldbuilding), if generated. */\n bible?: StoryBible\n /** Volumes, if planned. */\n volumes?: Volume[]\n /** Chapter plan. */\n chapters: ChapterPlan[]\n /** Foreshadowing threads. */\n foreshadows: Foreshadow[]\n /** 写作资产(题材基底/推进模式/反AI规则/写法资产)。 */\n assets?: ProjectAssets\n /** 事实库/时间线:每章生成后抽取,注入后续章节保持一致性。 */\n facts?: ChapterFact[]\n /** ISO timestamps. */\n createdAt: string\n updatedAt: string\n}\n\n/** Runtime config surface exposed to the panel (subset of plugin Config). */\nexport interface NovelConfig {\n /** Absolute path of the default docx outline to load. */\n outlinePath: string\n /** Absolute output directory for chapters + project state. */\n outputDir: string\n /** LLM provider route (e.g. deepseek-official). */\n provider: string\n /** LLM model id (e.g. deepseek-v4-flash). */\n model: string\n /** Target characters per chapter. */\n chapterChars: number\n /** Max output tokens per chapter call. */\n maxTokens: number\n /** Review pass threshold (0-100). */\n reviewPassScore: number\n /** Whether generation auto-runs review after writing. */\n autoReview: boolean\n}\n\n/** GET /status response. */\nexport interface StatusResponse {\n config: NovelConfig\n /** The persisted project, when one exists in the output dir. */\n project?: ProjectState\n /** Chapter files already on disk (basenames, sorted). */\n generatedFiles: string[]\n}\n\n/** POST /load-outline request: either a docx path or raw text. */\nexport interface LoadOutlineRequest {\n /** Absolute docx path; defaults to the configured outline path. */\n path?: string\n /** Raw outline text (takes precedence over path when present). */\n text?: string\n}\n\n/** POST /load-outline response. */\nexport interface LoadOutlineResponse {\n outline: string\n bookName: string\n chars: number\n path?: string\n}\n\n/** POST /plan request. */\nexport interface PlanRequest {\n /** Outline to plan from; defaults to the persisted project's outline. */\n outline?: string\n /** Number of chapters to plan (default: 30). */\n chapterCount?: number\n /** Volume to plan (1-based); when given, plans only that volume's chapters. */\n volume?: number\n}\n\n/** POST /plan response. */\nexport interface PlanResponse {\n chapters: ChapterPlan[]\n volumes?: Volume[]\n}\n\n/** POST /volumes request/response. */\nexport interface VolumesRequest {\n /** Outline to split into volumes; defaults to the project outline. */\n outline?: string\n}\nexport interface VolumesResponse {\n volumes: Volume[]\n}\n\n/** POST /bible request/response. */\nexport interface BibleRequest {\n /** Outline to extract from; defaults to the project outline. */\n outline?: string\n}\nexport interface BibleResponse {\n bible: StoryBible\n}\n\n/** POST /generate request: one chapter of the current project. */\nexport interface GenerateRequest {\n chapterNo: number\n /** When true, skips the auto-review step. */\n skipReview?: boolean\n}\n\n/** One NDJSON frame of a generation/review/rewrite stream. */\nexport type JobFrame =\n | { type: 'start'; no: number; title: string }\n | { type: 'delta'; text: string }\n | { type: 'progress'; chars: number }\n | { type: 'done'; no: number; file: string; chars: number; title: string }\n | { type: 'review'; no: number; report: ReviewReport }\n | { type: 'rewritten'; no: number; file: string; chars: number }\n /** 润色/重写完成,产物作为待确认草稿(尚未覆盖正文)。 */\n | { type: 'drafted'; no: number; chars: number; draft: string }\n | { type: 'error'; no: number; message: string }\n\n/** POST /review request: review one written chapter. */\nexport interface ReviewRequest {\n chapterNo: number\n}\n\n/** POST /rewrite request: rewrite one chapter (optionally per review issues). */\nexport interface RewriteRequest {\n chapterNo: number\n /** Free-form instructions; defaults to fixing the review's high issues. */\n instructions?: string\n /**\n * 局部修订:正文中的一段原文(无需完全精确,取一个自然段内的片段即可)。\n * 提供时只重写该段,其余正文保持不变;不提供时整章重写。\n */\n target?: string\n}\n\n/** POST /polish request: de-AI-ify one chapter. */\nexport interface PolishRequest {\n chapterNo: number\n}\n\n/** POST /draft/apply | /draft/discard request: 采纳或放弃待确认草稿。 */\nexport interface DraftDecisionRequest {\n chapterNo: number\n}\n\n/** POST /summary request: (re)generate a chapter summary. */\nexport interface SummaryRequest {\n chapterNo: number\n}\n\n/** POST /foreshadow request: create, update, or AI-suggest foreshadows. */\nexport interface ForeshadowRequest {\n /** When true, runs the LLM suggestion pass (ignores other fields). */\n suggest?: boolean\n /** When given, updates that foreshadow instead of creating one. */\n id?: string\n description?: string\n plantedChapter?: number\n targetChapter?: number\n status?: Foreshadow['status']\n resolvedNote?: string\n}\nexport interface ForeshadowResponse {\n foreshadows: Foreshadow[]\n}\n\n/** GET /chapter response. */\nexport interface ChapterResponse {\n no: number\n title: string\n markdown: string\n}\n\n/** POST /export request/response. */\nexport interface ExportRequest {\n format: 'txt' | 'md'\n}\nexport interface ExportResponse {\n file: string\n chars: number\n chapters: number\n}\n\n/** POST /config request: patch any subset of the runtime config. */\nexport interface ConfigPatch {\n outlinePath?: string\n outputDir?: string\n provider?: string\n model?: string\n chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: boolean\n}\n\n// ------------------------------------------------------------ assistant\n\n/** One assistant conversation message (persisted per project). */\nexport interface AssistantMessage {\n role: 'user' | 'assistant' | 'tool'\n /** Message text (tool messages carry the tool result). */\n content: string\n /** ISO timestamp. */\n ts: string\n /** For tool messages: which tool ran. */\n tool?: string\n}\n\n/** POST /assistant request: one user turn. */\nexport interface AssistantRequest {\n message: string\n}\n\n/** One NDJSON frame of the assistant stream. */\nexport type AssistantFrame =\n | { type: 'delta'; text: string }\n | { type: 'tool'; name: string; status: 'start' | 'done' | 'error'; detail?: string }\n /** Live output while a tool runs (e.g. chapter text being generated). */\n | { type: 'toolDelta'; name: string; text: string }\n | { type: 'done' }\n | { type: 'error'; message: string }\n\n/** GET /assistant-history response. */\nexport interface AssistantHistoryResponse {\n messages: AssistantMessage[]\n}\n\n// ---------------------------------------------------------- writing assets\n\n/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */\nexport interface GenreNode {\n /** 题材名称(标签,如「仙侠修真」「都市异能」)。 */\n name: string\n /** 题材特征、常见爽点、叙事重心或读者期待。 */\n description: string\n /** 子题材。 */\n children: GenreNode[]\n}\n\n/** 推进模式库:读者为什么继续看下一章。 */\nexport interface ProgressionMode {\n /** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */\n name: string\n /** 核心驱动力:靠什么制造追读动力。 */\n driver: string\n /** 读者期待:每隔几章获得什么变化或回报。 */\n readerExpectation: string\n /** 常见兑现方式(爽点如何落地)。 */\n payoffs: string[]\n /** 节奏风险:最怕什么(重复升级、冲突变弱、谜题拖太久…)。 */\n risks: string[]\n /** 主模式或辅助模式。 */\n primary: boolean\n}\n\n/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */\nexport interface AntiAiRule {\n /** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */\n name: string\n /** 要避免的表达问题,具体可检查。 */\n avoid: string\n /** 推荐修正方向。 */\n fix: string\n /** 命中即告警的具体表达模式(用于审稿逐条核对与去 AI 味检测)。 */\n detectPatterns?: string[]\n /** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */\n builtin?: boolean\n}\n\n/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */\nexport interface StyleTemplate {\n /** 模板 key(如 power-up-escalation)。 */\n key: string\n /** 模板名(如「爽文递进推进流」)。 */\n name: string\n /** 模板说明。 */\n description: string\n /** 分类(如「爽文流」「悬疑流」)。 */\n category: string\n /** 适用题材。 */\n applicableGenres: string[]\n /** 叙述规则。 */\n proseRules: string[]\n /** 角色/台词规则。 */\n dialogueRules: string[]\n /** 语言规则。 */\n languageRules: string[]\n /** 节奏规则。 */\n rhythmRules: string[]\n /** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */\n defaultAntiAiRuleKeys: string[]\n}\n\n/** 写法引擎:从样本文本提取的叙事风格资产。 */\nexport interface StyleAsset {\n /** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */\n name: string\n /** 叙述视角与句式节奏。 */\n proseRules: string[]\n /** 角色台词风格。 */\n dialogueRules: string[]\n /** 描写密度与情绪表达。 */\n descriptionRules: string[]\n /** 表达边界(不要做什么)。 */\n boundaries: string[]\n /** 来源样本文本(可空)。 */\n sourceText?: string\n /** 创建时间。 */\n createdAt: string\n}\n\n/** 项目写作资产(题材基底 + 推进模式 + 反 AI 规则 + 写法资产)。 */\nexport interface ProjectAssets {\n /** 本书选用的题材(可以是题材基底库中某节点名)。 */\n genre?: GenreNode\n /** 主推进模式。 */\n primaryProgression?: ProgressionMode\n /** 辅助推进模式。 */\n auxiliaryProgressions: ProgressionMode[]\n /** 生效的反 AI 规则(内置 + 自定义)。 */\n antiAiRules: AntiAiRule[]\n /** 绑定的写法资产。 */\n styleAssets: StyleAsset[]\n /** 资产更新时间。 */\n updatedAt?: string\n}\n\n/** GET /assets response(含全局题材库与反 AI 规则库)。 */\nexport interface AssetsResponse {\n projectAssets: ProjectAssets\n /** 全局题材基底库(可复用资产,跨书)。 */\n genreLibrary: GenreNode[]\n /** 全局反 AI 规则库(内置默认规则)。 */\n antiAiLibrary: AntiAiRule[]\n /** 预置写法模板(一键绑定,无需样本文本)。 */\n styleTemplates: StyleTemplate[]\n /** 内置推进模式候选。 */\n progressionLibrary: ProgressionMode[]\n}\n\n/** POST /assets request:更新项目写作资产(部分字段可选)。 */\nexport interface AssetsPatch {\n genre?: GenreNode\n primaryProgression?: ProgressionMode\n auxiliaryProgressions?: ProgressionMode[]\n antiAiRules?: AntiAiRule[]\n styleAssets?: StyleAsset[]\n}\n\n/** POST /style-engine request:从样本文本提取写法资产。 */\nexport interface StyleEngineRequest {\n /** 样本文本(风格来源)。 */\n sampleText: string\n /** 资产名(可选,默认「风格资产 N」)。 */\n name?: string\n}\n","/**\n * Browser-side API client for the /api/dsh-novel-forge route family. Plain\n * fetch, same origin; generation/rewrite/polish ride NDJSON streams read\n * incrementally.\n */\n\nimport {\n NOVEL_API,\n type AssetsPatch,\n type AssetsResponse,\n type BibleResponse,\n type ChapterResponse,\n type ConfigPatch,\n type ExportResponse,\n type ForeshadowRequest,\n type ForeshadowResponse,\n type JobFrame,\n type LoadOutlineResponse,\n type NovelConfig,\n type PlanResponse,\n type ReviewReport,\n type StatusResponse,\n type StyleEngineRequest,\n type StyleAsset,\n type VolumesResponse,\n} from '../protocol.ts'\n\n/** Error carrying the route's JSON error message. */\nexport class NovelApiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NovelApiError'\n }\n}\n\n/** Parse a JSON response or throw a NovelApiError. */\nasync function readJson<T>(response: Response): Promise<T> {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n throw new NovelApiError(`HTTP ${response.status}: invalid JSON response`)\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `HTTP ${response.status}`\n throw new NovelApiError(message)\n }\n return body as T\n}\n\n/** POST JSON, return parsed JSON. */\nasync function postJson<T>(path: string, payload: unknown): Promise<T> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return readJson<T>(response)\n}\n\n/** The browser half's only data entry point. */\nexport class NovelApi {\n async status(): Promise<StatusResponse> {\n const response = await fetch(NOVEL_API.status)\n return readJson<StatusResponse>(response)\n }\n\n async loadOutline(path?: string, text?: string): Promise<LoadOutlineResponse> {\n return postJson<LoadOutlineResponse>(NOVEL_API.loadOutline, { path, text })\n }\n\n async saveOutline(text: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.saveOutline, { text })\n }\n\n async plan(outline?: string, chapterCount?: number, volume?: number): Promise<PlanResponse> {\n return postJson<PlanResponse>(NOVEL_API.plan, { outline, chapterCount, volume })\n }\n\n async volumes(outline?: string): Promise<VolumesResponse> {\n return postJson<VolumesResponse>(NOVEL_API.volumes, { outline })\n }\n\n async bible(outline?: string): Promise<BibleResponse> {\n return postJson<BibleResponse>(NOVEL_API.bible, { outline })\n }\n\n async review(chapterNo: number): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.review, { chapterNo })\n }\n\n async summarize(chapterNo: number): Promise<{ summary: string }> {\n return postJson<{ summary: string }>(NOVEL_API.summary, { chapterNo })\n }\n\n async foreshadow(req: ForeshadowRequest): Promise<ForeshadowResponse> {\n return postJson<ForeshadowResponse>(NOVEL_API.foreshadow, req)\n }\n\n async exportBook(format: 'txt' | 'md'): Promise<ExportResponse> {\n return postJson<ExportResponse>(NOVEL_API.exportBook, { format })\n }\n\n async chapter(no: number): Promise<ChapterResponse> {\n const response = await fetch(`${NOVEL_API.chapter}?no=${no}`)\n return readJson<ChapterResponse>(response)\n }\n\n async patchConfig(patch: ConfigPatch): Promise<{ config: NovelConfig }> {\n return postJson<{ config: NovelConfig }>(NOVEL_API.config, patch)\n }\n\n async openFolder(): Promise<void> {\n await fetch(NOVEL_API.openFolder, { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' })\n }\n\n /** 书架快照。 */\n async bookshelf(): Promise<import('../protocol.ts').BookshelfSnapshot> {\n const response = await fetch(NOVEL_API.bookshelf)\n return readJson<import('../protocol.ts').BookshelfSnapshot>(response)\n }\n\n /** 新建书并激活(开书向导:可携带大纲文本,创建即建项目)。 */\n async bookCreate(bookName: string, outputDir?: string, outline?: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>(NOVEL_API.bookshelf, { bookName, outputDir, outline })\n }\n\n /** 重置项目(清空进度;可携带新大纲)。 */\n async reset(outline?: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.reset, { outline })\n }\n\n /** 全书一致性质检。 */\n async audit(): Promise<import('../protocol.ts').AuditResponse> {\n return postJson<import('../protocol.ts').AuditResponse>(NOVEL_API.audit, {})\n }\n\n /** 角色卡刷新(基于事实库聚合)。 */\n async charactersRefresh(): Promise<{ cards: import('../protocol.ts').RoleStatusCard[] }> {\n return postJson<{ cards: import('../protocol.ts').RoleStatusCard[] }>(NOVEL_API.charactersRefresh, {})\n }\n\n /** 事实库回填:对历史已生成章节批量抽取事实。 */\n async factsBackfill(): Promise<{ ok: boolean; filled: number }> {\n return postJson<{ ok: boolean; filled: number }>(NOVEL_API.factsBackfill, {})\n }\n\n /** 设定圣经局部修补。 */\n async biblePatch(patch: import('../protocol.ts').BiblePatchRequest): Promise<{ bible: import('../protocol.ts').StoryBible }> {\n return postJson<{ bible: import('../protocol.ts').StoryBible }>(NOVEL_API.biblePatch, patch)\n }\n\n /** 切换当前书。 */\n async bookActivate(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/activate', { id })\n }\n\n /** 移除书架条目。 */\n async bookRemove(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/remove', { id })\n }\n\n /** Get project writing assets + built-in libraries. */\n async assets(): Promise<AssetsResponse> {\n const response = await fetch(NOVEL_API.assets)\n return readJson<AssetsResponse>(response)\n }\n\n /** Patch project writing assets. */\n async patchAssets(patch: AssetsPatch): Promise<AssetsResponse> {\n return postJson<AssetsResponse>(NOVEL_API.assets, patch)\n }\n\n /** Extract a style asset from sample text. */\n async styleEngine(req: StyleEngineRequest): Promise<{ styleAsset: StyleAsset }> {\n return postJson<{ styleAsset: StyleAsset }>(NOVEL_API.styleEngine, req)\n }\n\n /**\n * Consume an NDJSON job stream (generate / rewrite / polish).\n * @param path - the route to POST to.\n * @param payload - the JSON body.\n * @param onFrame - receives every frame as it lands.\n */\n private async streamJob(path: string, payload: unknown, onFrame: (frame: JobFrame) => void): Promise<void> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('job: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: JobFrame\n try {\n frame = JSON.parse(line) as JobFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') {\n throw new NovelApiError(frame.message)\n }\n }\n }\n }\n\n /** Generate one chapter. */\n async generate(chapterNo: number, skipReview: boolean, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.generate, { chapterNo, skipReview }, onFrame)\n }\n\n /** Rewrite one chapter (whole-chapter, or local when `target` is given). */\n async rewrite(chapterNo: number, instructions: string, target: string, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.rewrite, { chapterNo, instructions, target }, onFrame)\n }\n\n /** Polish (de-AI-ify) one chapter. */\n async polish(chapterNo: number, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.polish, { chapterNo }, onFrame)\n }\n\n /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。 */\n async draftApply(chapterNo: number): Promise<{ ok: boolean; chars: number; file: string }> {\n return postJson<{ ok: boolean; chars: number; file: string }>(NOVEL_API.draftApply, { chapterNo })\n }\n\n /** 放弃待确认草稿,保留原稿。 */\n async draftDiscard(chapterNo: number): Promise<{ ok: boolean }> {\n return postJson<{ ok: boolean }>(NOVEL_API.draftDiscard, { chapterNo })\n }\n\n /** Run one assistant turn (NDJSON stream). */\n async assistant(message: string, onFrame: (frame: import('../protocol.ts').AssistantFrame) => void): Promise<void> {\n const response = await fetch(NOVEL_API.assistant, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message }),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('assistant: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: import('../protocol.ts').AssistantFrame\n try {\n frame = JSON.parse(line) as import('../protocol.ts').AssistantFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') throw new NovelApiError(frame.message)\n }\n }\n }\n\n /** Load the persisted assistant conversation. */\n async assistantHistory(): Promise<import('../protocol.ts').AssistantMessage[]> {\n const response = await fetch(NOVEL_API.assistantHistory)\n const body = await readJson<{ messages: import('../protocol.ts').AssistantMessage[] }>(response)\n return body.messages\n }\n}\n","/**\n * dsh-novel-forge — locale dictionaries (zh / en).\n */\n\n/** zh dictionary. */\nexport const zh = {\n 'entry.label': '小说工坊',\n 'entry.tooltip': 'AI 编译小说工作台:大纲 → 设定圣经 → 卷计划 → 章节计划 → 逐章生成+审稿',\n 'panel.title': '小说工坊',\n 'common.close': '关闭',\n 'common.loading': '加载中…',\n 'common.save': '保存',\n 'common.error': '错误',\n 'common.success': '成功',\n 'common.generating': '生成中…',\n 'common.chars': '字',\n 'tab.workflow': '工作流',\n 'tab.overview': '大纲',\n 'tab.plan': '章节',\n 'tab.bible': '设定库',\n 'tab.foreshadow': '伏笔',\n 'tab.assistant': 'AI 助手',\n 'tab.settings': '设置',\n 'workflow.title': '创作工作流',\n 'workflow.step1': '① 加载大纲',\n 'workflow.step2': '② 提炼设定圣经',\n 'workflow.step3': '③ 规划卷',\n 'workflow.step4': '④ 生成章节计划',\n 'workflow.step5': '⑤ 逐章写作 + AI 审稿',\n 'workflow.step6': '⑥ 润色 / 导出',\n 'workflow.loadOutline': '读取大纲',\n 'workflow.genBible': '提炼设定圣经',\n 'workflow.genVolumes': '生成卷计划',\n 'workflow.genPlan': '生成章节计划',\n 'workflow.done': '已完成',\n 'workflow.todo': '待办',\n 'workflow.bibleDone': '设定圣经已生成({n} 条规则 / {c} 个角色 / {r} 条红线)',\n 'workflow.volumesDone': '卷计划已生成({n} 卷)',\n 'workflow.planDone': '章节计划已生成({n} 章)',\n 'workflow.progress': '进度:大纲 ✓ · 设定 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章',\n 'overview.loadDocx': '从 docx 读取大纲',\n 'overview.loadDocxDefault': '读取默认大纲',\n 'overview.loadingOutline': '正在解析 docx…',\n 'overview.outlineHint': '大纲文本(可编辑)',\n 'overview.outlineChars': '大纲字数',\n 'overview.saveOutline': '保存大纲',\n 'overview.saved': '大纲已保存',\n 'overview.bookName': '书名',\n 'overview.loadCustom': '指定 docx 路径',\n 'overview.loadCustomHint': '绝对路径,留空使用默认',\n 'plan.generate': '生成章节计划',\n 'plan.generateHint': '章节数量',\n 'plan.count': '章',\n 'plan.empty': '暂无章节计划,请先生成',\n 'plan.chapter': '章',\n 'plan.pending': '待生成',\n 'plan.generating': '生成中',\n 'plan.written': '待审稿',\n 'plan.reviewing': '审稿中',\n 'plan.approved': '已通过',\n 'plan.rejected': '待修订',\n 'plan.error': '失败',\n 'plan.write': '生成本章',\n 'plan.rewrite': '修订',\n 'plan.review': '审稿',\n 'plan.polish': '去AI味',\n 'plan.writeAll': '批量生成全部',\n 'plan.writeAllPending': '批量生成剩余',\n 'plan.generated': '已生成',\n 'plan.progress': '进度',\n 'plan.beats': '剧情要点',\n 'plan.reviewReport': '审稿报告',\n 'plan.reviewScore': '评分',\n 'plan.reviewVerdict': '总评',\n 'plan.reviewIssues': '问题清单',\n 'plan.reviewPass': '通过',\n 'plan.reviewFail': '未通过',\n 'plan.approve': '手动通过',\n 'plan.summary': '章节摘要',\n 'plan.volumes': '卷',\n 'plan.noVolume': '未分卷',\n 'bible.title': '设定圣经',\n 'bible.gen': 'AI 提炼设定圣经',\n 'bible.genre': '题材基调',\n 'bible.worldRules': '世界规则',\n 'bible.characters': '角色卡',\n 'bible.redLines': '写作红线',\n 'bible.style': '风格要求',\n 'bible.none': '尚未生成设定圣经。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。',\n 'foreshadow.title': '伏笔管理',\n 'foreshadow.suggest': 'AI 建议伏笔',\n 'foreshadow.none': '暂无伏笔',\n 'foreshadow.status': '状态',\n 'foreshadow.planned': '计划中',\n 'foreshadow.planted': '已埋设',\n 'foreshadow.progressing': '推进中',\n 'foreshadow.resolved': '已回收',\n 'foreshadow.abandoned': '已放弃',\n 'foreshadow.target': '预计回收',\n 'foreshadow.plantedAt': '埋设于',\n 'foreshadow.setPlanted': '标记已埋设',\n 'foreshadow.setResolved': '标记已回收',\n 'settings.title': '设置',\n 'settings.outlinePath': '默认大纲路径',\n 'settings.outputDir': '输出目录',\n 'settings.provider': '模型提供商',\n 'settings.model': '模型',\n 'settings.chapterChars': '每章目标字数',\n 'settings.maxTokens': '单章最大输出 tokens',\n 'settings.reviewPassScore': '审稿通过分数(0-100)',\n 'settings.autoReview': '生成后自动审稿',\n 'settings.save': '保存设置',\n 'settings.saved': '设置已保存',\n 'settings.openFolder': '打开输出文件夹',\n 'settings.export': '导出',\n 'settings.exportTxt': '导出 TXT',\n 'settings.exportMd': '导出 Markdown',\n 'settings.exported': '已导出:{file}({chars} 字,{chapters} 章)',\n 'progress.generating': '正在生成第 {no} 章《{title}》…',\n 'progress.done': '第 {no} 章完成({chars} 字)→ {file}',\n 'progress.reviewed': '第 {no} 章审稿:{score} 分 — {verdict}',\n 'progress.error': '第 {no} 章失败:{message}',\n 'progress.rewriting': '正在修订第 {no} 章…',\n 'progress.polishing': '正在润色第 {no} 章…',\n 'progress.empty': '生成/审稿进度将显示在这里',\n 'assistant.hint': '和 AI 编辑讨论剧情、人设、伏笔;达成一致后可让它直接修改大纲、设定圣经、章节内容。',\n 'assistant.placeholder': '例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…',\n 'assistant.send': '发送',\n 'assistant.toolStart': '⚙ 执行操作:{name}…',\n 'assistant.toolDone': '✓ {name} 完成:{detail}',\n 'assistant.toolError': '✗ {name} 失败:{detail}',\n 'assistant.empty': '还没有对话。和 AI 编辑聊聊剧情吧。',\n 'status.projectNone': '输出目录中还没有项目。请先加载大纲。',\n 'status.files': '已生成文件',\n 'api.error': '请求失败',\n} as const\n\n/** en dictionary (fallback). */\nexport const en: Record<string, string> = {\n 'entry.label': 'Novel Forge',\n 'entry.tooltip': 'AI novel workbench: outline → bible → volumes → plan → write + review',\n 'panel.title': 'Novel Forge',\n 'common.close': 'Close',\n 'common.loading': 'Loading…',\n 'common.save': 'Save',\n 'common.error': 'Error',\n 'common.success': 'Success',\n 'common.generating': 'Generating…',\n 'common.chars': ' chars',\n 'tab.workflow': 'Workflow',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workflow',\n 'workflow.step1': '① Load outline',\n 'workflow.step2': '② Extract story bible',\n 'workflow.step3': '③ Plan volumes',\n 'workflow.step4': '④ Plan chapters',\n 'workflow.step5': '⑤ Write + AI review',\n 'workflow.step6': '⑥ Polish / export',\n 'workflow.loadOutline': 'Load outline',\n 'workflow.genBible': 'Extract bible',\n 'workflow.genVolumes': 'Plan volumes',\n 'workflow.genPlan': 'Plan chapters',\n 'workflow.done': 'done',\n 'workflow.todo': 'todo',\n 'workflow.bibleDone': 'Bible ready ({n} rules / {c} characters / {r} red lines)',\n 'workflow.volumesDone': 'Volumes ready ({n})',\n 'workflow.planDone': 'Plan ready ({n} chapters)',\n 'workflow.progress': 'Outline ✓ · bible {bible} · volumes {volumes} · plan {plan} · {done}/{total} chapters',\n 'overview.loadDocx': 'Load outline from docx',\n 'overview.loadDocxDefault': 'Load default outline',\n 'overview.loadingOutline': 'Parsing docx…',\n 'overview.outlineHint': 'Outline text (editable)',\n 'overview.outlineChars': 'Outline length',\n 'overview.saveOutline': 'Save outline',\n 'overview.saved': 'Outline saved',\n 'overview.bookName': 'Book',\n 'overview.loadCustom': 'Custom docx path',\n 'overview.loadCustomHint': 'Absolute path; empty = default',\n 'plan.generate': 'Plan chapters',\n 'plan.generateHint': 'Chapter count',\n 'plan.count': ' chapters',\n 'plan.empty': 'No plan yet — generate one first',\n 'plan.chapter': 'Ch.',\n 'plan.pending': 'pending',\n 'plan.generating': 'writing',\n 'plan.written': 'to review',\n 'plan.reviewing': 'reviewing',\n 'plan.approved': 'approved',\n 'plan.rejected': 'to revise',\n 'plan.error': 'failed',\n 'plan.write': 'Write',\n 'plan.rewrite': 'Revise',\n 'plan.review': 'Review',\n 'plan.polish': 'De-AI',\n 'plan.writeAll': 'Write all',\n 'plan.writeAllPending': 'Write remaining',\n 'plan.generated': 'generated',\n 'plan.progress': 'progress',\n 'plan.beats': 'Beats',\n 'plan.reviewReport': 'Review report',\n 'plan.reviewScore': 'Score',\n 'plan.reviewVerdict': 'Verdict',\n 'plan.reviewIssues': 'Issues',\n 'plan.reviewPass': 'Passed',\n 'plan.reviewFail': 'Failed',\n 'plan.approve': 'Approve',\n 'plan.summary': 'Summary',\n 'plan.volumes': 'Volumes',\n 'plan.noVolume': 'No volume',\n 'bible.title': 'Story bible',\n 'bible.gen': 'Extract bible with AI',\n 'bible.genre': 'Genre',\n 'bible.worldRules': 'World rules',\n 'bible.characters': 'Characters',\n 'bible.redLines': 'Red lines',\n 'bible.style': 'Style',\n 'bible.none': 'No bible yet. Generation and review follow it strictly once extracted.',\n 'foreshadow.title': 'Foreshadowing',\n 'foreshadow.suggest': 'Suggest with AI',\n 'foreshadow.none': 'No foreshadows',\n 'foreshadow.status': 'Status',\n 'foreshadow.planned': 'planned',\n 'foreshadow.planted': 'planted',\n 'foreshadow.progressing': 'progressing',\n 'foreshadow.resolved': 'resolved',\n 'foreshadow.abandoned': 'abandoned',\n 'foreshadow.target': 'target',\n 'foreshadow.plantedAt': 'planted at',\n 'foreshadow.setPlanted': 'Mark planted',\n 'foreshadow.setResolved': 'Mark resolved',\n 'settings.title': 'Settings',\n 'settings.outlinePath': 'Default outline path',\n 'settings.outputDir': 'Output directory',\n 'settings.provider': 'Provider',\n 'settings.model': 'Model',\n 'settings.chapterChars': 'Chars per chapter',\n 'settings.maxTokens': 'Max output tokens',\n 'settings.reviewPassScore': 'Review pass score (0-100)',\n 'settings.autoReview': 'Auto-review after writing',\n 'settings.save': 'Save settings',\n 'settings.saved': 'Settings saved',\n 'settings.openFolder': 'Open output folder',\n 'settings.export': 'Export',\n 'settings.exportTxt': 'Export TXT',\n 'settings.exportMd': 'Export Markdown',\n 'settings.exported': 'Exported: {file} ({chars} chars, {chapters} chapters)',\n 'progress.generating': 'Writing chapter {no} “{title}”…',\n 'progress.done': 'Chapter {no} done ({chars} chars) → {file}',\n 'progress.reviewed': 'Chapter {no} review: {score} — {verdict}',\n 'progress.error': 'Chapter {no} failed: {message}',\n 'progress.rewriting': 'Revising chapter {no}…',\n 'progress.polishing': 'Polishing chapter {no}…',\n 'progress.empty': 'Generation/review progress appears here',\n 'assistant.hint': 'Discuss plot, characters, foreshadowing with the AI editor; once agreed, let it edit the outline, bible, or chapters directly.',\n 'assistant.placeholder': 'e.g. Add a hook at the end of chapter 2…',\n 'assistant.send': 'Send',\n 'assistant.toolStart': '⚙ Running {name}…',\n 'assistant.toolDone': '✓ {name} done: {detail}',\n 'assistant.toolError': '✗ {name} failed: {detail}',\n 'assistant.empty': 'No conversation yet. Chat with the AI editor.',\n 'status.projectNone': 'No project in the output directory yet. Load an outline first.',\n 'status.files': 'Generated files',\n 'api.error': 'Request failed',\n}\n\n/** Keys type for the zh dictionary. */\nexport type NovelKey = keyof typeof zh\n","/**\n * Tiny translation helper for the panel: reads the zh dict with the en dict\n * as fallback (the family plugins use a full locale registry; the panel keeps\n * a dependency-free helper so the client bundle stays self-contained).\n */\nimport { zh, en, type NovelKey } from '../locales.ts'\n\n/** Translate one key with optional {placeholder} substitution. */\nexport function tt(key: NovelKey, params?: Record<string, string | number>): string {\n let text: string = zh[key] ?? en[key] ?? key\n if (params !== undefined) {\n for (const [name, value] of Object.entries(params)) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n }\n return text\n}\n","/**\n * AI 助手页签:与 AI 编辑对话讨论剧情,助手可通过动作指令直接修改\n * 大纲 / 设定圣经 / 章节。流式渲染回复,工具调用以事件行展示。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AssistantFrame, AssistantMessage } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** One chat bubble (either side). */\ninterface ChatLine {\n id: number\n role: 'user' | 'assistant'\n text: string\n /** Tool events interleaved with the assistant reply. */\n tools: Array<{ name: string; status: 'start' | 'done' | 'error'; detail?: string }>\n /** Live output while a tool runs (generated text streamed into the bubble). */\n live?: string\n}\n\n/** Props. */\nexport interface AssistantTabProps {\n api: NovelApi\n}\n\n/** The assistant conversation tab. */\nexport function AssistantTab({ api }: AssistantTabProps) {\n const [lines, setLines] = useState<ChatLine[]>([])\n const [input, setInput] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const idRef = useRef(0)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n\n /** Append a bubble (or extend the current assistant bubble). */\n const pushLine = useCallback((line: Omit<ChatLine, 'id'>) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n // Extend the live assistant bubble while streaming.\n if (line.role === 'assistant' && last !== undefined && last.role === 'assistant' && last.tools.length === 0) {\n return [...prev.slice(0, -1), { ...last, text: last.text + line.text }]\n }\n return [...prev, { ...line, id: idRef.current++ }]\n })\n }, [])\n\n /** Push a tool event onto the current assistant bubble. */\n const pushTool = useCallback((tool: ChatLine['tools'][number]) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') {\n return [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [tool] }]\n }\n return [...prev.slice(0, -1), { ...last, tools: [...last.tools, tool], live: undefined }]\n })\n }, [])\n\n /** Append live tool output onto the current assistant bubble. */\n const pushToolDelta = useCallback((text: string) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') return prev\n return [...prev.slice(0, -1), { ...last, live: (last.live ?? '') + text }]\n })\n }, [])\n\n /** Load persisted history on mount. */\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const history = await api.assistantHistory()\n if (cancelled) return\n const restored: ChatLine[] = []\n for (const entry of history) {\n if (entry.role === 'user') {\n restored.push({ id: idRef.current++, role: 'user', text: entry.content, tools: [] })\n } else if (entry.role === 'assistant') {\n restored.push({ id: idRef.current++, role: 'assistant', text: entry.content, tools: [] })\n } else if (entry.role === 'tool') {\n const last = restored[restored.length - 1]\n if (last !== undefined && last.role === 'assistant') {\n last.tools.push({ name: entry.tool ?? 'tool', status: 'done', detail: entry.content.slice(0, 120) })\n }\n }\n }\n setLines(restored)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => { cancelled = true }\n }, [api])\n\n /** Auto-scroll to the newest line. */\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight })\n }, [lines])\n\n /** Send one message. */\n const handleSend = async (): Promise<void> => {\n const message = input.trim()\n if (message === '' || busy) return\n setInput('')\n setError('')\n pushLine({ role: 'user', text: message, tools: [] })\n // Start an empty assistant bubble.\n setLines(prev => [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [] }])\n setBusy(true)\n try {\n await api.assistant(message, (frame: AssistantFrame) => {\n if (frame.type === 'delta') {\n pushLine({ role: 'assistant', text: frame.text, tools: [] })\n } else if (frame.type === 'tool') {\n pushTool({\n name: frame.name,\n status: frame.status,\n detail: frame.detail,\n })\n } else if (frame.type === 'toolDelta') {\n pushToolDelta(frame.text)\n } else if (frame.type === 'error') {\n pushTool({ name: 'error', status: 'error', detail: frame.message })\n }\n })\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n <span className={css.cardTitle}>{tt('tab.assistant')}</span>\n <span className={css.meta}>{tt('assistant.hint')}</span>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{tt('common.error')}: {error}</span>}\n <div\n ref={scrollRef}\n className={css.chatScroll}\n >\n {lines.length === 0 && <span className={css.meta}>{tt('assistant.empty')}</span>}\n {lines.map(line => (\n <div key={line.id} className={line.role === 'user' ? css.chatBubbleUser : css.chatBubbleAssistant}>\n {line.role === 'user' && <div className={css.chatRole}>你</div>}\n {line.text !== '' && <div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{line.text}</div>}\n {line.live !== undefined && line.live !== '' && (\n <div className={css.toolLive}>{line.live}</div>\n )}\n {line.tools.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, marginTop: 4, fontSize: 11 }}>\n {line.tools.map((tool, i) => (\n <span key={i} style={{ color: tool.status === 'error' ? 'var(--nf-error)' : tool.status === 'start' ? 'var(--nf-accent)' : 'var(--nf-success)' }}>\n {tool.status === 'start'\n ? tt('assistant.toolStart', { name: tool.name })\n : tool.status === 'done'\n ? tt('assistant.toolDone', { name: tool.name, detail: tool.detail ?? '' })\n : tt('assistant.toolError', { name: tool.name, detail: tool.detail ?? '' })}\n </span>\n ))}\n </div>\n )}\n </div>\n ))}\n {busy && <span className={css.meta} style={{ color: 'var(--nf-accent)' }}>…</span>}\n </div>\n <div className={css.row} style={{ marginTop: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 64, flex: 1 }}\n placeholder={tt('assistant.placeholder')}\n value={input}\n onChange={e => { setInput(e.target.value) }}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n void handleSend()\n }\n }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || input.trim() === ''} onClick={() => { void handleSend() }}>\n {tt('assistant.send')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * 写作资产页签:题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎。\n * 学习自 AI-Novel-Writing-Assistant 的四大资产模块,注入到生成与审稿提示词中。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AntiAiRule, AssetsResponse, GenreNode, ProgressionMode, StyleAsset, StyleTemplate } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface AssetsTabProps {\n api: NovelApi\n /** 初始子页(左侧导航直达对应资产分类)。 */\n initialTab?: AssetSubTab\n}\n\n/** 渲染题材树(带勾选当前题材)。 */\nfunction GenreTree({ node, selected, onSelect }: { node: GenreNode; selected: string; onSelect: (node: GenreNode) => void }) {\n return (\n <div>\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 6, cursor: 'pointer' }}>\n <input type=\"radio\" name=\"genre\" checked={selected === node.name} onChange={() => { onSelect(node) }} />\n <span>\n <b>{node.name}</b>\n {node.description !== '' && (\n <span\n className={`${css.meta} ${css.genreDesc}`}\n title={node.description}\n >\n — {node.description}\n </span>\n )}\n </span>\n </label>\n {node.children.length > 0 && (\n <div style={{ marginLeft: 22, display: 'flex', flexDirection: 'column', gap: 4 }}>\n {node.children.map(child => (\n <GenreTree key={child.name} node={child} selected={selected} onSelect={onSelect} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 写作资产子页签。 */\ntype AssetSubTab = 'genre' | 'progression' | 'templates' | 'rules' | 'style'\n\n/** 子页签定义。 */\nconst SUB_TABS: ReadonlyArray<{ id: AssetSubTab; label: string }> = [\n { id: 'genre', label: '题材基底' },\n { id: 'progression', label: '推进模式' },\n { id: 'templates', label: '预置写法' },\n { id: 'rules', label: '反 AI 规则' },\n { id: 'style', label: '自定义写法' },\n]\n\n/** 写作资产页签。 */\nexport function AssetsTab({ api, initialTab = 'genre' }: AssetsTabProps) {\n const [assetTab, setAssetTab] = useState<AssetSubTab>(initialTab)\n const [data, setData] = useState<AssetsResponse | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [sampleText, setSampleText] = useState('')\n const [styleName, setStyleName] = useState('')\n const [newRule, setNewRule] = useState('')\n const [newProgression, setNewProgression] = useState('')\n /** 正在行内编辑的自定义反 AI 规则(下标 + 草稿字段)。 */\n const [editingRule, setEditingRule] = useState<{ index: number; name: string; avoid: string; fix: string } | null>(null)\n const loadId = useRef(0)\n\n /** Load assets (or reset from a new call). */\n const refresh = useCallback(async () => {\n try {\n const result = await api.assets()\n setData(result)\n } catch (err) {\n setError((err as Error).message)\n }\n }, [api])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n /** Patch assets and refresh. */\n const patch = async (patch: Parameters<NovelApi['patchAssets']>[0]): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.patchAssets(patch)\n setData(result)\n setNotice('已保存')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 提取写法资产。 */\n const handleExtractStyle = async (): Promise<void> => {\n if (sampleText.trim().length < 50) {\n setError(tt('settings.exported') === '' ? '样本文本过短' : '样本文本过短(<50 字符)')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.styleEngine({ sampleText, name: styleName })\n setData(prev => prev === null ? prev : {\n ...prev,\n projectAssets: {\n ...prev.projectAssets,\n styleAssets: [...(prev.projectAssets.styleAssets ?? []), result.styleAsset],\n updatedAt: new Date().toISOString(),\n },\n })\n setNotice(`写法资产「${result.styleAsset.name}」已提取并绑定`)\n setSampleText('')\n setStyleName('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 添加自定义反 AI 规则(一行 \"名称:要避免的\" 简单格式由用户填写 JSON)。 */\n const handleAddRule = async (): Promise<void> => {\n const text = newRule.trim()\n if (text === '') return\n let rule: AntiAiRule\n try {\n const parsed = JSON.parse(text) as AntiAiRule\n rule = { name: parsed.name ?? '自定义规则', avoid: parsed.avoid ?? '', fix: parsed.fix ?? '' }\n } catch {\n // Fallback: treat as \"避免什么\" text.\n rule = { name: `自定义规则 ${(data?.projectAssets.antiAiRules ?? []).length + 1}`, avoid: text, fix: '' }\n }\n if (rule.avoid === '' && rule.fix === '') return\n const next = [...(data?.projectAssets.antiAiRules ?? []), rule]\n await patch({ antiAiRules: next })\n setNewRule('')\n }\n\n /** 保存行内编辑的自定义规则。 */\n const handleSaveRuleEdit = async (): Promise<void> => {\n if (editingRule === null) return\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n if (editingRule.index < 0 || editingRule.index >= rules.length) return\n const name = editingRule.name.trim() || rules[editingRule.index]!.name\n if (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '') return\n rules[editingRule.index] = { name, avoid: editingRule.avoid.trim(), fix: editingRule.fix.trim() }\n await patch({ antiAiRules: rules })\n setEditingRule(null)\n }\n\n /** 删除一条自定义规则。 */\n const handleRemoveRule = async (index: number): Promise<void> => {\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n rules.splice(index, 1)\n setEditingRule(null)\n await patch({ antiAiRules: rules })\n }\n\n /** 把内置规则复制为自定义副本(同名覆盖生效),并打开行内编辑。 */\n const handleOverrideBuiltin = (rule: AntiAiRule): void => {\n const rules = data?.projectAssets.antiAiRules ?? []\n const existing = rules.findIndex(r => r.name === rule.name)\n if (existing >= 0) {\n setEditingRule({ index: existing, name: rules[existing]!.name, avoid: rules[existing]!.avoid, fix: rules[existing]!.fix ?? '' })\n } else {\n const next = [...rules, { ...rule, fix: rule.fix ?? '' }]\n setEditingRule({ index: next.length - 1, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' })\n void patch({ antiAiRules: next })\n }\n }\n\n /** 设置题材。 */\n const handleSelectGenre = (node: GenreNode): void => {\n void patch({ genre: node })\n }\n\n /** 添加推进模式(从内置库选择)。 */\n const handleAddProgression = async (mode: ProgressionMode): Promise<void> => {\n const current = data?.projectAssets\n const isPrimary = (data?.projectAssets.primaryProgression ?? undefined) === undefined\n if (isPrimary) {\n await patch({ primaryProgression: { ...mode, primary: true } })\n } else {\n await patch({ auxiliaryProgressions: [...(current?.auxiliaryProgressions ?? []), { ...mode, primary: false }] })\n }\n }\n\n if (data === null) {\n return <div className={css.card}><span className={css.meta}>{tt('common.loading')}</span></div>\n }\n\n const assets = data.projectAssets\n const builtinRules = data.antiAiLibrary\n const customRules = assets.antiAiRules ?? []\n const genreLibrary = data.genreLibrary\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 资产状态总览(参照 AI-Novel-Writing-Assistant 状态网格) */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>当前题材</span>\n <span className={css.assetStatValue}>{assets.genre?.name ?? '未设置'}</span>\n {assets.genre !== undefined && <span className={css.assetStatDetail} title={assets.genre.description}>{assets.genre.description}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>主推进模式</span>\n <span className={css.assetStatValue}>{assets.primaryProgression?.name ?? '未设置'}</span>\n {assets.primaryProgression !== undefined && <span className={css.assetStatDetail} title={assets.primaryProgression.driver}>{assets.primaryProgression.driver}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已绑定写法</span>\n <span className={css.assetStatValue}>{assets.styleAssets?.length ?? 0} 套</span>\n <span className={css.assetStatDetail} title={(assets.styleAssets ?? []).map(s => s.name).join('、')}>\n {(assets.styleAssets ?? []).map(s => s.name).join('、') || '未绑定(可在「预置写法」一键选用)'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>反 AI 规则</span>\n <span className={css.assetStatValue}>{builtinRules.length} 内置 + {(assets.antiAiRules ?? []).length} 自定义</span>\n <span className={css.assetStatDetail}>全部生效于生成与审稿提示词</span>\n </div>\n </div>\n\n {/* 子页签栏 */}\n <div className={css.tabBar} role=\"tablist\" style={{ padding: '0 0 8px', borderBottom: '1px solid var(--nf-border)' }}>\n {SUB_TABS.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={assetTab === tab.id}\n data-active={assetTab === tab.id ? '' : undefined}\n className={css.tab}\n onClick={() => { setAssetTab(tab.id) }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* 题材基底库 */}\n {assetTab === 'genre' && (\n <div className={css.card}>\n <span className={css.cardTitle}>题材基底库</span>\n <span className={css.meta}>这本书属于哪个阅读市场?题材定位会注入章节生成与审稿提示词。</span>\n {assets.genre !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>当前题材:{assets.genre.name}</b> — {assets.genre.description}\n </div>\n )}\n {/* 题材基底库:自然展开,不套内部滚动条(描述两行截断,悬停看全文) */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {genreLibrary.map(root => <GenreTree key={root.name} node={root} selected={assets.genre?.name ?? ''} onSelect={handleSelectGenre} />)}\n </div>\n </div>\n )}\n\n {/* 推进模式库 */}\n {assetTab === 'progression' && (\n <div className={css.card}>\n <span className={css.cardTitle}>推进模式库</span>\n <span className={css.meta}>读者为什么继续看下一章?主模式 + 辅助模式注入卷规划与章节生成。</span>\n {assets.primaryProgression !== undefined && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12, color: 'var(--nf-accent)' }}>\n <b>主推进:{assets.primaryProgression.name}</b> — {assets.primaryProgression.driver}\n </div>\n )}\n {assets.auxiliaryProgressions.map(mode => (\n <div key={mode.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{mode.name}</b> — {mode.driver}\n </div>\n ))}\n <span className={css.meta}>从内置推进模式库选择添加(第一个设为主推进):</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, maxHeight: 260, overflowY: 'auto' }}>\n {data.progressionLibrary.map(mode => {\n const alreadyPrimary = assets.primaryProgression?.name === mode.name\n const alreadyAux = assets.auxiliaryProgressions.some(m => m.name === mode.name)\n if (alreadyPrimary || alreadyAux) return null\n return (\n <button key={mode.name} className={css.button} disabled={busy} onClick={() => { void handleAddProgression(mode) }}>\n + {assets.primaryProgression === undefined ? `主推进:` : '辅助:'}{mode.name} — {mode.driver.slice(0, 40)}…\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 预置写法模板(一键绑定) */}\n {assetTab === 'templates' && (\n <div className={css.card}>\n <span className={css.cardTitle}>预置写法模板</span>\n <span className={css.meta}>从内置 8 套叙事风格模板中一键选用(来自 AI-Novel-Writing-Assistant 写法引擎),无需样本文本;绑定后生成与润色都遵循该风格。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, maxHeight: 420, overflowY: 'auto' }}>\n {data.styleTemplates.map(template => {\n const bound = assets.styleAssets.some(s => s.name === template.name)\n return (\n <div key={template.key} style={{ border: `1px solid ${bound ? 'var(--nf-accent)' : 'var(--nf-border)'}`, borderRadius: 6, padding: '8px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span><b>{template.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>{template.category}</span></span>\n <button\n className={`${css.button} ${css.buttonSmall} ${bound ? '' : css.buttonPrimary}`}\n disabled={busy || bound}\n onClick={() => {\n const styleAsset: StyleAsset = {\n name: template.name,\n proseRules: [...template.proseRules, ...template.rhythmRules.map(r => `节奏:${r}`)],\n dialogueRules: template.dialogueRules,\n descriptionRules: template.languageRules,\n boundaries: [`模板「${template.name}」适用题材:${template.applicableGenres.join('、')}`, '不要违背模板的叙事单元结构与节奏约束'],\n createdAt: new Date().toISOString(),\n }\n void patch({ styleAssets: [...(data.projectAssets.styleAssets ?? []), styleAsset] })\n }}\n >\n {bound ? '✓ 已绑定' : '+ 绑定'}\n </button>\n </div>\n <div className={css.meta}>{template.description}</div>\n <div className={css.meta}>叙述:{template.proseRules.slice(0, 2).join(';')}</div>\n <div className={css.meta}>台词:{template.dialogueRules.slice(0, 1).join(';')}</div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 反 AI 规则 */}\n {assetTab === 'rules' && (\n <div className={css.card}>\n <span className={css.cardTitle}>反 AI 规则</span>\n <span className={css.meta}>写作时必须遵守的表达边界(内置全局 + 项目自定义),生成与审稿都会检查。内置规则可用「覆盖编辑」复制为自定义版本调整。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, maxHeight: 280, overflowY: 'auto' }}>\n {builtinRules.map(rule => {\n const overridden = customRules.some(r => r.name === rule.name)\n return (\n <div key={rule.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)', color: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)' }}>\n {overridden ? '自定义覆盖中' : '内置'}\n </span>\n </span>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { handleOverrideBuiltin(rule) }}>\n {overridden ? '✎ 编辑覆盖' : '+ 覆盖编辑'}\n </button>\n </div>\n <div className={css.meta}>避免:{rule.avoid}</div>\n <div className={css.meta}>修正:{rule.fix}</div>\n </div>\n )\n })}\n {customRules.map((rule, index) => (\n <div key={`${rule.name}-${index}`} style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>自定义</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { setEditingRule({ index, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' }) }}>\n 编辑\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRemoveRule(index) }}>\n 删除\n </button>\n </span>\n </div>\n {editingRule !== null && editingRule.index === index ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <input className={css.input} placeholder=\"规则名\" value={editingRule.name} onChange={e => { setEditingRule({ ...editingRule, name: e.target.value }) }} />\n <input className={css.input} placeholder=\"避免(要杜绝的表达)\" value={editingRule.avoid} onChange={e => { setEditingRule({ ...editingRule, avoid: e.target.value }) }} />\n <input className={css.input} placeholder=\"修正(改写方向,可留空)\" value={editingRule.fix} onChange={e => { setEditingRule({ ...editingRule, fix: e.target.value }) }} />\n <div className={css.row}>\n <button className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '')} onClick={() => { void handleSaveRuleEdit() }}>\n 保存\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} onClick={() => { setEditingRule(null) }}>\n 取消\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className={css.meta}>避免:{rule.avoid}</div>\n {rule.fix !== '' && <div className={css.meta}>修正:{rule.fix}</div>}\n </>\n )}\n </div>\n ))}\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder='新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)'\n value={newRule}\n onChange={e => { setNewRule(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || newRule.trim() === ''} onClick={() => { void handleAddRule() }}>+ 添加</button>\n </div>\n </div>\n )}\n\n {/* 自定义写法引擎 */}\n {assetTab === 'style' && (\n <div className={css.card}>\n <span className={css.cardTitle}>自定义写法引擎</span>\n <span className={css.meta}>粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。</span>\n {assets.styleAssets.map(style => (\n <div key={style.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{style.name}</b>\n <div className={css.meta}>叙述:{style.proseRules.slice(0, 3).join(';')}</div>\n {style.dialogueRules.length > 0 && <div className={css.meta}>台词:{style.dialogueRules.slice(0, 2).join(';')}</div>}\n </div>\n ))}\n <textarea\n className={css.textarea}\n style={{ minHeight: 90 }}\n placeholder=\"粘贴样本文本(一段能代表目标风格的文字,50 字以上)…\"\n value={sampleText}\n onChange={e => { setSampleText(e.target.value) }}\n />\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"写法资产名(可选)\"\n value={styleName}\n onChange={e => { setStyleName(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sampleText.trim().length < 50} onClick={() => { void handleExtractStyle() }}>\n 提取并绑定\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/**\n * Browser-side docx outline extraction: a .docx is a zip whose\n * word/document.xml holds the body text in <w:t> runs inside <w:p> paragraphs.\n * Uses fflate (inlined into the client bundle) so the user can pick or drag a\n * docx without any server upload.\n *\n * Import from 'fflate/browser' (not 'fflate'): the default entry resolves to\n * the Node build (esm/index.mjs), which calls module.createRequire() for the\n * optional worker_threads path — inlining that into the browser bundle leaves\n * a bare require(\"module\") the client-modules table cannot answer.\n */\n\nimport { unzipSync, strFromU8 } from 'fflate/browser'\n\n/** Decode the handful of XML entities docx bodies actually use. */\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&')\n .replace(/&nbsp;/g, ' ')\n}\n\n/** Extract plain text from a docx buffer: one line per <w:p> paragraph. */\nexport function extractDocxTextFromBuffer(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n let files: ReturnType<typeof unzipSync>\n try {\n files = unzipSync(bytes)\n } catch (error) {\n throw new Error(`不是有效的 docx(zip 解压失败):${(error as Error).message}`)\n }\n const document = files['word/document.xml']\n if (document === undefined) {\n throw new Error('不是有效的 docx(缺少 word/document.xml)')\n }\n const xml = strFromU8(document)\n\n const paragraphs: string[] = []\n const parts = xml.split(/<w:p\\b[^>]*>/)\n for (let i = 1; i < parts.length; i++) {\n const segment = parts[i]!\n const runs: string[] = []\n const runRe = /<w:t(?:\\s[^>]*)?>([\\s\\S]*?)<\\/w:t>|<w:tab\\b[^>]*\\/>|<w:br\\b[^>]*\\/>/g\n for (const match of segment.matchAll(runRe)) {\n if (match[0].startsWith('<w:tab')) {\n runs.push('\\t')\n } else if (match[0].startsWith('<w:br')) {\n runs.push('\\n')\n } else {\n runs.push(decodeEntities(match[1] ?? ''))\n }\n }\n paragraphs.push(runs.join('').replace(/\\u00a0/g, ' ').trimEnd())\n }\n\n const text = paragraphs.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim()\n if (text.length === 0) {\n throw new Error('docx 中没有可提取的文本')\n }\n return text\n}\n\n/** Read a File as ArrayBuffer. */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return file.arrayBuffer()\n}\n","/**\n * 书架条:显示所有书,点击切换当前书(继续编译),+ 新建。\n * 新建 = 开书向导:书名 + 大纲(拖拽/选择 docx 或粘贴文本),创建即建项目。\n */\nimport { useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface BookshelfBarProps {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 刷新整个面板(切换书后重新拉状态)。 */\n onSwitch: () => void\n}\n\n/** 书架条。 */\nexport function BookshelfBar({ api, shelf, onSwitch }: BookshelfBarProps) {\n const [creating, setCreating] = useState(false)\n const [name, setName] = useState('')\n const [outlineText, setOutlineText] = useState('')\n const [outlineName, setOutlineName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const outlineFileRef = useRef<HTMLInputElement | null>(null)\n\n const handlePickOutlineFile = async (file: File | undefined): Promise<void> => {\n if (file === undefined) return\n try {\n const buffer = await file.arrayBuffer()\n const text = extractDocxTextFromBuffer(buffer)\n if (text.length < 50) {\n setError('大纲内容过短(<50 字符),请检查文件')\n return\n }\n setOutlineText(text)\n setOutlineName(file.name)\n setError('')\n } catch (err) {\n setError(`读取大纲失败:${(err as Error).message}`)\n }\n }\n\n const handleCreate = async (): Promise<void> => {\n const bookName = name.trim()\n if (bookName === '') return\n setBusy(true)\n setError('')\n try {\n await api.bookCreate(bookName, undefined, outlineText.trim() !== '' ? outlineText.trim() : undefined)\n setCreating(false)\n setName('')\n setOutlineText('')\n setOutlineName('')\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleActivate = async (id: string): Promise<void> => {\n if (id === shelf.activeBookId) return\n setBusy(true)\n try {\n await api.bookActivate(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleRemove = async (id: string): Promise<void> => {\n setBusy(true)\n try {\n await api.bookRemove(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.bookshelf}>\n <span className={css.bookshelfLabel}>书架</span>\n <div className={css.bookshelfList}>\n {shelf.books.map(book => (\n <div\n key={book.id}\n className={`${css.bookChip} ${book.id === shelf.activeBookId ? css.bookChipActive : ''}`}\n onClick={() => { void handleActivate(book.id) }}\n title={book.outputDir}\n >\n <span className={css.bookChipName}>{book.bookName}</span>\n <span className={css.bookChipMeta}>{book.hasProject ? `${book.done}/${book.total} 章` : '未开书'}</span>\n <button\n type=\"button\"\n className={css.bookChipRemove}\n title=\"从书架移除\"\n onClick={(e) => { e.stopPropagation(); void handleRemove(book.id) }}\n >\n ×\n </button>\n </div>\n ))}\n {!creating ? (\n <button type=\"button\" className={css.bookAdd} onClick={() => { setCreating(true) }}>\n + 新书\n </button>\n ) : (\n <div className={css.bookCreateForm}>\n <input\n className={css.input}\n style={{ width: 140 }}\n placeholder=\"书名\"\n value={name}\n onChange={e => { setName(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}\n autoFocus\n />\n {/* 开书向导:大纲(可选,推荐) */}\n <div className={css.bookCreateOutline}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n onClick={() => { outlineFileRef.current?.click() }}\n >\n {outlineName !== '' ? `✓ ${outlineName}` : '📄 选择大纲 docx'}\n </button>\n <input\n ref={outlineFileRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n void handlePickOutlineFile(e.target.files?.[0])\n e.target.value = ''\n }}\n />\n <textarea\n className={css.input}\n style={{ width: 280, minHeight: 64, resize: 'vertical' }}\n placeholder=\"或直接粘贴大纲文本(提供大纲后开书即建立项目,书名自动从大纲首行识别)\"\n value={outlineText}\n onChange={e => { setOutlineText(e.target.value) }}\n />\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || name.trim() === ''} onClick={() => { void handleCreate() }}>\n 开书\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setCreating(false) }}>\n 取消\n </button>\n <span className={css.meta}>{outlineText.length > 0 ? `大纲 ${outlineText.length} 字` : '未提供大纲(稍后在大纲页导入)'}</span>\n </div>\n </div>\n )}\n </div>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>}\n </div>\n )\n}\n","/**\n * The novel-forge workbench panel: tabs — 工作流 (guided pipeline), 大纲\n * (outline), 章节 (chapter plan + per-chapter write/review/rewrite/polish),\n * 设定库 (story bible), 伏笔 (foreshadows), 设置 (config). Generation and\n * review streams land in the progress console.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { PanelController } from './controller.ts'\nimport { tt } from './helpers.ts'\nimport { AssistantTab } from './AssistantTab.tsx'\nimport { AssetsTab } from './AssetsTab.tsx'\nimport { BookshelfBar } from './BookshelfBar.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n ProjectState,\n ReviewReport,\n StoryBible,\n Volume,\n} from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** The panel's tab identifiers. */\nexport type NovelTab =\n | 'workflow' | 'overview' | 'plan' | 'bible' | 'foreshadow' | 'assistant' | 'settings'\n | 'characters'\n | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle'\n\n/** Panel shell props. */\nexport interface NovelPanelProps {\n /** The panel state owner (open/close/toggle). */\n controller: PanelController\n /** The API client every tab operates through. */\n api: NovelApi\n}\n\n/** One progress console line. */\ninterface ProgressLine {\n id: number\n text: string\n kind: 'info' | 'done' | 'error'\n /** Live line: a single in-place-updating row (generation counter + bar). */\n live?: boolean\n /** 0..1 completion ratio for the live line's progress bar. */\n ratio?: number\n}\n\n/** The navigation groups (AI-Novel-Writing-Assistant style grouping). */\nconst NAV_GROUPS: ReadonlyArray<{ id: string; label: string; items: ReadonlyArray<{ id: NovelTab; label: string; icon: string }> }> = [\n {\n id: 'create',\n label: '创作',\n items: [\n { id: 'workflow', label: tt('tab.workflow'), icon: '🛠️' },\n { id: 'plan', label: tt('tab.plan'), icon: '📚' },\n { id: 'overview', label: tt('tab.overview'), icon: '📄' },\n ],\n },\n {\n id: 'tools',\n label: '工具',\n items: [\n { id: 'assistant', label: tt('tab.assistant'), icon: '💬' },\n ],\n },\n {\n id: 'db',\n label: '数据库',\n items: [\n { id: 'bible', label: tt('tab.bible'), icon: '📖' },\n { id: 'characters', label: '角色卡', icon: '👥' },\n { id: 'foreshadow', label: tt('tab.foreshadow'), icon: '🔮' },\n { id: 'assetsGenre', label: '题材基底', icon: '🏷️' },\n { id: 'assetsProgression', label: '推进模式', icon: '📈' },\n { id: 'assetsTemplates', label: '预置写法', icon: '🖋️' },\n { id: 'assetsRules', label: '反 AI 规则', icon: '🚫' },\n { id: 'assetsStyle', label: '自定义写法', icon: '🎨' },\n ],\n },\n]\n\n/** Settings tab — pinned to the bottom of the nav rail. */\nconst SETTINGS_TAB: { id: NovelTab; label: string; icon: string } = { id: 'settings', label: tt('tab.settings'), icon: '⚙️' }\n\n/** Whether any chapter is being generated right now. */\nfunction anyGenerating(chapters: ChapterPlan[] | undefined): boolean {\n return (chapters ?? []).some(c => c.status === 'generating' || c.status === 'reviewing')\n}\n\n/** Status badge class + label. */\nfunction statusBadge(chapter: ChapterPlan): { cls: string; label: string } {\n switch (chapter.status) {\n case 'pending': return { cls: css.badgePending, label: tt('plan.pending') }\n case 'generating': return { cls: css.badgeGenerating, label: tt('plan.generating') }\n case 'written': return { cls: css.badgeWritten, label: tt('plan.written') }\n case 'reviewing': return { cls: css.badgeGenerating, label: tt('plan.reviewing') }\n case 'approved': return { cls: css.badgeDone, label: tt('plan.approved') }\n case 'rejected': return { cls: css.badgeRejected, label: tt('plan.rejected') }\n case 'error': return { cls: css.badgeError, label: tt('plan.error') }\n }\n}\n\n/** One review issue line (severity-colored, theme-aware). */\nfunction severityColor(severity: string): string {\n return severity === 'high' ? 'var(--nf-error)' : severity === 'medium' ? 'var(--nf-warn)' : 'var(--nf-info)'\n}\n\n/** One row of a chapter-level diff (paragraph granularity). */\ntype DiffRow =\n | { kind: 'same'; text: string }\n | { kind: 'change'; old: string; neu: string }\n | { kind: 'del'; text: string }\n | { kind: 'add'; text: string }\n\n/**\n * Paragraph-level LCS diff between an original chapter body and its\n * rewrite/polish draft. Adjacent delete+add runs merge into \"change\" pairs\n * (the common case: a reworded paragraph shown as old → new).\n */\nfunction paragraphDiff(oldText: string, newText: string): DiffRow[] {\n const split = (t: string): string[] =>\n t.replace(/^#\\s+.*$/m, '').trim().split(/\\n{2,}/).map(p => p.trim()).filter(p => p !== '')\n const a = split(oldText)\n const b = split(newText)\n const n = a.length\n const m = b.length\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0))\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!)\n }\n }\n const rows: DiffRow[] = []\n let i = 0\n let j = 0\n while (i < n || j < m) {\n if (i < n && j < m && a[i] === b[j]) {\n rows.push({ kind: 'same', text: a[i]! })\n i++\n j++\n } else if (i < n && (j >= m || dp[i + 1]![j]! >= dp[i]![j + 1]!)) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else if (j < m) {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n } else if (i < n) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n }\n }\n // Merge adjacent del/add runs into change pairs.\n const merged: DiffRow[] = []\n let k = 0\n while (k < rows.length) {\n const row = rows[k]!\n if (row.kind !== 'del' && row.kind !== 'add') {\n merged.push(row)\n k++\n continue\n }\n const dels: string[] = []\n const adds: string[] = []\n while (k < rows.length && (rows[k]!.kind === 'del' || rows[k]!.kind === 'add')) {\n if (rows[k]!.kind === 'del') dels.push((rows[k] as { text: string }).text)\n else adds.push((rows[k] as { text: string }).text)\n k++\n }\n if (dels.length > 0 && adds.length > 0) {\n merged.push({ kind: 'change', old: dels.join('\\n\\n'), neu: adds.join('\\n\\n') })\n } else if (dels.length > 0) {\n for (const d of dels) merged.push({ kind: 'del', text: d })\n } else {\n for (const ad of adds) merged.push({ kind: 'add', text: ad })\n }\n }\n return merged\n}\n\n/** 把章节 beats 按结构标签渲染(本章目标/剧情要点/爽点/结尾钩子 等)。 */\nfunction renderBeats(beats: string): ReactElement {\n const lines = beats.split('\\n')\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {lines.map((line, i) => {\n const trimmed = line.trim()\n const match = /^([^::]{2,14})[::]/.exec(trimmed)\n if (match !== null) {\n return (\n <div key={i}>\n <b style={{ color: 'var(--nf-accent)' }}>{match[1]}</b>\n {trimmed.slice(match[0].length)}\n </div>\n )\n }\n return <div key={i}>{line}</div>\n })}\n </div>\n )\n}\n\n/** The diff list of a draft-vs-original comparison (scrollable). */\nfunction DiffList({ original, draft }: { original: string; draft: string }): ReactElement { const rows = useMemo(() => paragraphDiff(original, draft), [original, draft])\n const changed = rows.filter(r => r.kind === 'change').length\n const added = rows.filter(r => r.kind === 'add').length\n const removed = rows.filter(r => r.kind === 'del').length\n const [onlyChanges, setOnlyChanges] = useState(false)\n const shown = onlyChanges ? rows.filter(r => r.kind !== 'same') : rows\n return (\n <>\n <div className={css.diffLegend}>\n <span className={css.legendOld}>■ 原稿</span>\n <span className={css.legendNew}>■ 新稿</span>\n <span className={css.meta}>\n 原 {original.length} 字 → 新 {draft.length} 字 · 修改 {changed} · 新增 {added} · 删除 {removed}\n </span>\n <label className={css.onlyChanges}>\n <input\n type=\"checkbox\"\n checked={onlyChanges}\n onChange={e => { setOnlyChanges(e.target.checked) }}\n />\n 只看改动\n </label>\n </div>\n <div className={css.diffList}>\n {shown.map((row, idx) => {\n if (row.kind === 'same') {\n return (\n <details key={idx} className={css.diffSame}>\n <summary>第 {idx + 1} 段 · 未改动(点击展开)</summary>\n <div className={css.diffSameBody}>{row.text}</div>\n </details>\n )\n }\n if (row.kind === 'change') {\n return (\n <div key={idx} className={css.diffChange}>\n <div className={css.diffColumn}>\n <span className={css.diffTagOld}>原稿</span>\n <div className={css.diffOld}>{row.old}</div>\n </div>\n <div className={css.diffColumn}>\n <span className={css.diffTagNew}>新稿</span>\n <div className={css.diffNew}>{row.neu}</div>\n </div>\n </div>\n )\n }\n if (row.kind === 'del') {\n return (\n <div key={idx} className={css.diffDel}>\n <span className={css.diffTagOld}>原稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n }\n return (\n <div key={idx} className={css.diffAdd}>\n <span className={css.diffTagNew}>新稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n })}\n </div>\n </>\n )\n}\n\n/** The novel-forge panel. */\nexport function NovelPanel({ controller, api }: NovelPanelProps) {\n const [activeTab, setActiveTab] = useState<NovelTab>('workflow')\n const [config, setConfig] = useState<NovelConfig | null>(null)\n const [project, setProject] = useState<ProjectState | null>(null)\n const [generatedFiles, setGeneratedFiles] = useState<string[]>([])\n const [outlineText, setOutlineText] = useState('')\n const [customDocxPath, setCustomDocxPath] = useState('')\n const [shelf, setShelf] = useState<BookshelfSnapshot | null>(null)\n const [dragActive, setDragActive] = useState(false)\n const fileInputRef = useRef<HTMLInputElement | null>(null)\n const [planCount, setPlanCount] = useState(30)\n const [busy, setBusy] = useState(false)\n const [busyLabel, setBusyLabel] = useState('')\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [progress, setProgress] = useState<ProgressLine[]>([])\n const [configDraft, setConfigDraft] = useState<NovelConfig | null>(null)\n const [expandedChapter, setExpandedChapter] = useState<number | null>(null)\n const [chapterText, setChapterText] = useState('')\n const progressId = useRef(0)\n /** id of the single live progress row (generation counter), if any. */\n const liveProgressId = useRef<number | null>(null)\n /** last chars value rendered into the live row (throttle for streaming). */\n const lastDeltaChars = useRef(0)\n /** cumulative chars received this job (delta frames carry increments). */\n const liveChars = useRef(0)\n /** chapter no of the job currently streaming (delta frames carry no `no`). */\n const currentJobNo = useRef(0)\n /** prominent top-of-panel progress bar while a chapter is being written. */\n const [liveBar, setLiveBar] = useState<{ text: string; ratio?: number } | null>(null)\n /** 润色/修订工作区:左栏原文(可选中局部目标)+ 右栏指令/预览/应用。 */\n const [workspace, setWorkspace] = useState<{\n no: number\n title: string\n original: string\n instruction: string\n draft: string | null\n } | null>(null)\n /** 工作区左栏当前选中的文字(局部修订目标)。 */\n const [wsSelected, setWsSelected] = useState('')\n /** 工作区预览区:diff 对比视图开关。 */\n const [wsShowDiff, setWsShowDiff] = useState(false)\n /** 工作区原文 textarea 引用(用于捕获选中文字)。 */\n const wsEditorRef = useRef<HTMLTextAreaElement | null>(null)\n /** 有未采纳草稿的章节号(refresh 后检测到遗留草稿时提示)。 */\n const [draftNo, setDraftNo] = useState<number | null>(null)\n /** 大纲页「更新大纲」编辑区是否展开。 */\n const [updatingOutline, setUpdatingOutline] = useState(false)\n /** 全书质检结果(null = 未运行)。 */\n const [auditIssues, setAuditIssues] = useState<import('../../protocol.ts').AuditIssue[] | null>(null)\n /** 角色卡(从事实库聚合)。 */\n const [charCards, setCharCards] = useState<import('../../protocol.ts').RoleStatusCard[] | null>(null)\n /** 世界观规则编辑草稿(bible tab,每行一条)。 */\n const [worldRulesDraft, setWorldRulesDraft] = useState('')\n /** AI 助手悬浮窗:是否打开。 */\n const [assistantOpen, setAssistantOpen] = useState(false)\n /** 悬浮窗位置(相对面板,localStorage 记忆)。 */\n const [assistantPos, setAssistantPos] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.float')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown }\n return { x: typeof parsed.x === 'number' ? parsed.x : 260, y: typeof parsed.y === 'number' ? parsed.y : 60 }\n }\n } catch { /* ignore */ }\n return { x: 260, y: 60 }\n })\n /** 悬浮窗尺寸(localStorage 记忆)。 */\n const [assistantSize, setAssistantSize] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.size')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { w?: unknown; h?: unknown }\n return { w: typeof parsed.w === 'number' ? parsed.w : 420, h: typeof parsed.h === 'number' ? parsed.h : 460 }\n }\n } catch { /* ignore */ }\n return { w: 420, h: 460 }\n })\n /** 拖拽/缩放状态。 */\n const dragState = useRef<{ type: 'move' | 'resize'; startX: number; startY: number; origX: number; origY: number; origW: number; origH: number } | null>(null)\n\n /** 悬浮窗位置/尺寸持久化。 */\n useEffect(() => {\n try {\n window.localStorage.setItem('dsh-novel-forge.assistant.float', JSON.stringify(assistantPos))\n window.localStorage.setItem('dsh-novel-forge.assistant.size', JSON.stringify(assistantSize))\n } catch { /* ignore */ }\n }, [assistantPos, assistantSize])\n\n /** 全局拖拽/缩放监听(挂一次,靠 dragState 判断)。 */\n useEffect(() => {\n const onMove = (e: MouseEvent): void => {\n const s = dragState.current\n if (s === null) return\n if (s.type === 'move') {\n setAssistantPos({\n x: Math.max(-340, Math.min(s.origX + e.clientX - s.startX, 3000)),\n y: Math.max(0, Math.min(s.origY + e.clientY - s.startY, 3000)),\n })\n } else {\n setAssistantSize({\n w: Math.max(320, Math.min(s.origW + e.clientX - s.startX, 1400)),\n h: Math.max(220, Math.min(s.origH + e.clientY - s.startY, 1200)),\n })\n }\n }\n const onUp = (): void => { dragState.current = null }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n }, [])\n /** 左侧导航折叠状态(localStorage 记忆,参照 AI-Novel-Writing-Assistant 侧边栏)。 */\n const [navCollapsed, setNavCollapsed] = useState(() => {\n try { return window.localStorage.getItem('dsh-novel-forge.nav.collapsed') === 'true' } catch { return false }\n })\n\n /** Refresh bookshelf. */\n const refreshShelf = useCallback(async () => {\n try {\n const snapshot = await api.bookshelf()\n setShelf(snapshot)\n } catch { /* shelf is best-effort */ }\n }, [api])\n\n /** Append a progress console line. */\n const pushProgress = useCallback((text: string, kind: ProgressLine['kind'] = 'info') => {\n setProgress(prev => [...prev.slice(-300), { id: progressId.current++, text, kind }])\n }, [])\n\n /** Update the single live progress row in place (create it on first call). */\n const setLiveProgress = useCallback((text: string, ratio?: number) => {\n setProgress(prev => {\n if (liveProgressId.current !== null) {\n return prev.map(l => l.id === liveProgressId.current ? { ...l, text, ratio } : l)\n }\n const id = progressId.current++\n liveProgressId.current = id\n return [...prev.slice(-300), { id, text, kind: 'info', live: true, ratio }]\n })\n }, [])\n\n /** Remove the live progress row (a job finished / failed). */\n const clearLiveProgress = useCallback(() => {\n if (liveProgressId.current === null) return\n const id = liveProgressId.current\n liveProgressId.current = null\n setProgress(prev => prev.filter(l => l.id !== id))\n }, [])\n\n /** Refresh status (config + project + files). */\n const refresh = useCallback(async (showError = true) => {\n try {\n const status = await api.status()\n setConfig(status.config)\n setConfigDraft(status.config)\n setProject(status.project ?? null)\n setGeneratedFiles(status.generatedFiles)\n const withDraft = status.project?.chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n setDraftNo(withDraft?.no ?? null)\n const nextOutline = status.project?.outline\n if (nextOutline !== undefined && outlineText === '') {\n setOutlineText(nextOutline)\n }\n } catch (err) {\n if (showError) setError((err as Error).message)\n }\n }, [api, outlineText])\n\n /** Handle a docx file (pick or drag): parse locally, save outline. */\n const handleDocxFile = useCallback(async (file: File) => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const buffer = await file.arrayBuffer()\n const outline = extractDocxTextFromBuffer(buffer)\n if (outline.length < 50) {\n throw new Error('大纲内容过短(<50 字符),请检查文件')\n }\n setOutlineText(outline)\n await api.saveOutline(outline)\n await refresh(false)\n pushProgress(`已从「${file.name}」读取大纲(${outline.length} 字)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }, [api, pushProgress, refresh])\n\n useEffect(() => {\n void refresh()\n void refreshShelf()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** Load the outline from docx (default path or custom). */\n const handleLoadDocx = async (useCustom: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const result = await api.loadOutline(useCustom ? customDocxPath || undefined : undefined)\n setOutlineText(result.outline)\n // Persist into the project (load-or-create).\n await api.saveOutline(result.outline)\n await refresh(false)\n pushProgress(`大纲已读取(${result.chars} 字):${result.bookName}${result.path !== undefined ? ` ← ${result.path}` : ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the edited outline. */\n const handleSaveOutline = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.saveOutline(outlineText)\n setNotice(tt('overview.saved'))\n pushProgress(tt('overview.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */\n const handleToggleUpdateOutline = (): void => {\n if (!updatingOutline && project !== null) setOutlineText(project.outline)\n setUpdatingOutline(v => !v)\n }\n\n /** 重置项目:清空全部进度,从新大纲重新开始(二次确认)。 */\n const handleResetProject = async (): Promise<void> => {\n if (project === null) return\n if (!window.confirm('将清空本书全部进度(设定圣经/卷计划/章节计划/已生成章节/伏笔/写作资产/事实库),且不可恢复。确定用新大纲重置?')) return\n setBusy(true)\n setError('')\n try {\n const result = await api.reset(outlineText)\n setUpdatingOutline(false)\n pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`重置失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 全书一致性质检(LLM 扫描已生成章节)。 */\n const handleAudit = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('全书一致性质检中…')\n setError('')\n try {\n const result = await api.audit()\n setAuditIssues(result.issues)\n pushProgress(result.issues.length === 0\n ? `全书质检完成:${result.auditedChapters} 章未发现矛盾 🎉`\n : `全书质检完成:发现 ${result.issues.length} 处疑似矛盾`, result.issues.length === 0 ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`全书质检失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 角色卡刷新。 */\n const handleCharactersRefresh = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('聚合角色卡中…')\n setError('')\n try {\n const result = await api.charactersRefresh()\n setCharCards(result.cards)\n pushProgress(`角色卡已刷新:${result.cards.length} 个角色`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`角色卡刷新失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 事实库回填(历史章节批量抽取)。 */\n const handleFactsBackfill = async (): Promise<void> => {\n if (doneCount === 0) return\n setBusy(true)\n setBusyLabel('回填历史章节事实中…')\n setError('')\n try {\n const result = await api.factsBackfill()\n pushProgress(result.filled > 0\n ? `事实库回填完成:${result.filled} 章已抽取事实`\n : '事实库无需回填(所有章节都已有事实记录)', 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`事实库回填失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 保存世界观规则编辑(bible tab,每行一条)。 */\n const handleSaveWorldRules = async (): Promise<void> => {\n if (bible === undefined) return\n const rules = worldRulesDraft.split('\\n').map(line => line.trim()).filter(line => line !== '')\n setBusy(true)\n setError('')\n try {\n const result = await api.biblePatch({ worldRules: rules })\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n pushProgress(`世界观规则已保存(${rules.length} 条)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Extract the story bible. */\n const handleBible = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('bible.gen'))\n setError('')\n try {\n const result = await api.bible(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n const bible: StoryBible = result.bible\n pushProgress(tt('workflow.bibleDone', {\n n: bible.worldRules.length,\n c: bible.characters.length,\n r: bible.redLines.length,\n }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提炼设定圣经失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Plan volumes. */\n const handleVolumes = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('workflow.genVolumes'))\n setError('')\n try {\n const result = await api.volumes(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, volumes: result.volumes, updatedAt: new Date().toISOString() })\n pushProgress(tt('workflow.volumesDone', { n: result.volumes.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成卷计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Generate the chapter plan via LLM. */\n const handlePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('plan.generate'))\n setError('')\n try {\n const result = await api.plan(outlineText || undefined, planCount)\n setProject(prev => {\n const base = prev ?? {\n bookName: '', outline: outlineText, chapters: [] as ChapterPlan[],\n foreshadows: [] as Foreshadow[], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),\n }\n return { ...base, chapters: [...base.chapters, ...result.chapters], updatedAt: new Date().toISOString() }\n })\n pushProgress(tt('workflow.planDone', { n: result.chapters.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成章节计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 打开某章的工作区(读取服务器原文;有遗留草稿时预载草稿;可预填修订指令)。 */\n const openWorkspace = useCallback(async (no: number, instruction = ''): Promise<void> => {\n try {\n const [chapterRes, statusRes] = await Promise.all([api.chapter(no), api.status()])\n const chapter = statusRes.project?.chapters.find(c => c.no === no)\n if (chapter === undefined) return\n setWorkspace({\n no,\n title: chapter.title,\n original: chapterRes.markdown,\n instruction,\n draft: chapter.pendingDraft !== undefined && chapter.pendingDraft !== '' ? chapter.pendingDraft : null,\n })\n setWsSelected('')\n setWsShowDiff(false)\n } catch { /* best-effort */ }\n }, [api])\n\n /** 捕获工作区原文 textarea 中选中的文字(局部修订目标)。 */\n const captureWsSelection = (): void => {\n const el = wsEditorRef.current\n if (el === null) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n if (end > start) setWsSelected(el.value.slice(start, end).trim())\n else setWsSelected('')\n }\n\n /** 工作区:去 AI 味润色(流式 → 预览草稿)。 */\n const handleWsPolish = async (): Promise<void> => {\n if (workspace === null) return\n setBusy(true)\n setBusyLabel(`${tt('plan.polish')} 第${workspace.no}章`)\n setError('')\n try {\n await api.polish(workspace.no, frame => { applyJobFrame(frame, n => tt('progress.polishing', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${workspace.no} 章润色失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 工作区:按指令修订(whole=true 整章,false 仅修订选中片段)。 */\n const handleWsRewrite = async (whole: boolean): Promise<void> => {\n if (workspace === null) return\n const target = whole ? '' : wsSelected\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${workspace.no}章`)\n setError('')\n try {\n await api.rewrite(workspace.no, workspace.instruction, target, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${workspace.no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 采纳草稿:覆盖正文文件并刷新。 */\n const handleDraftApply = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.draftApply(no)\n setWorkspace(null)\n setDraftNo(null)\n pushProgress(`已采纳第 ${no} 章新稿(${result.chars} 字)→ ${result.file}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`采纳第 ${no} 章草稿失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 放弃草稿:保留原稿,仅清空草稿。 */\n const handleDraftDiscard = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.draftDiscard(no)\n setWorkspace(null)\n setDraftNo(null)\n pushProgress(`已放弃第 ${no} 章草稿,保留原稿`, 'info')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`放弃第 ${no} 章草稿失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Shared frame handler for generate/rewrite/polish streams. */\n const applyJobFrame = useCallback((frame: JobFrame, label: (no: number) => string) => {\n if (frame.type === 'start') {\n clearLiveProgress()\n setLiveBar(null)\n lastDeltaChars.current = 0\n liveChars.current = 0\n currentJobNo.current = frame.no\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'generating', error: undefined } : c),\n })\n pushProgress(label(frame.no))\n } else if (frame.type === 'delta') {\n // One live row updated in place — no per-token console spam. The\n // server streams incremental text, so accumulate locally.\n const chars = (liveChars.current += frame.text.length)\n const target = project?.chapters.find(c => c.no === currentJobNo.current)?.targetChars ?? 0\n if (chars < 50 || chars - lastDeltaChars.current >= 200) {\n lastDeltaChars.current = chars\n const text = target > 0 ? `已生成 ${chars} / ${target} 字` : `已生成 ${chars} 字`\n const ratio = target > 0 ? Math.min(chars / target, 1) : undefined\n setLiveProgress(text, ratio)\n setLiveBar({ text, ratio })\n }\n } else if (frame.type === 'done' || frame.type === 'rewritten') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'written', chars: frame.chars, file: frame.file, review: undefined } : c),\n })\n pushProgress(tt('progress.done', { no: frame.no, chars: frame.chars, file: frame.file }), 'done')\n setGeneratedFiles(prev => prev.includes(frame.file) ? prev : [...prev, frame.file])\n } else if (frame.type === 'review') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: frame.report.passed ? 'approved' : 'rejected', review: frame.report } : c),\n })\n pushProgress(tt('progress.reviewed', {\n no: frame.no,\n score: frame.report.score,\n verdict: frame.report.verdict,\n }), frame.report.passed ? 'done' : 'error')\n } else if (frame.type === 'drafted') {\n // 润色/重写完成:产物作为待确认草稿,展示在工作区预览,由用户决定。\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, pendingDraft: frame.draft } : c),\n })\n pushProgress(`第 ${frame.no} 章润色完成(${frame.chars} 字),请查看预览后应用或放弃`)\n setDraftNo(frame.no)\n setWsShowDiff(false)\n setWorkspace(prev => prev !== null && prev.no === frame.no ? { ...prev, draft: frame.draft } : prev)\n } else if (frame.type === 'error') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'error', error: frame.message } : c),\n })\n pushProgress(tt('progress.error', { no: frame.no, message: frame.message }), 'error')\n }\n }, [pushProgress, setLiveProgress, clearLiveProgress, project])\n\n /** Generate one chapter, streaming frames into the console. */\n const handleWriteChapter = async (no: number, skipReview: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.write')} 第${no}章`)\n setError('')\n try {\n await api.generate(no, skipReview, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Batch-write all remaining chapters in sequence (auto-retry once per chapter). */\n const handleWriteAll = async (): Promise<void> => {\n const remaining = chapters.filter(c => c.status === 'pending' || c.status === 'error')\n if (remaining.length === 0) return\n setBusy(true)\n setBusyLabel(`${tt('plan.writeAllPending')}(共 ${remaining.length} 章)`)\n setError('')\n let failed = 0\n const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms))\n for (const chapter of remaining) {\n pushProgress(`▶ 开始生成第 ${chapter.no} 章《${chapter.title}》`)\n let lastError: unknown = null\n // 失败自动重试:最多尝试 2 次,间隔 3 秒(网络抖动/LLM 偶发失败自愈)。\n for (let attempt = 1; attempt <= 2; attempt++) {\n try {\n await api.generate(chapter.no, true, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n lastError = null\n break\n } catch (err) {\n lastError = err\n if (attempt < 2) {\n pushProgress(`第 ${chapter.no} 章第 ${attempt} 次尝试失败(${(err as Error).message}),3 秒后自动重试…`, 'error')\n await sleep(3000)\n }\n }\n }\n if (lastError !== null) {\n failed++\n pushProgress(`第 ${chapter.no} 章失败:${(lastError as Error).message}`, 'error')\n }\n }\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n pushProgress(failed === 0\n ? `批量生成完成:${remaining.length} 章全部完成`\n : `批量生成结束:${remaining.length - failed} 章完成,${failed} 章失败`, failed === 0 ? 'done' : 'error')\n }\n\n /** Review one chapter. */\n const handleReview = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.review')} 第${no}章`)\n setError('')\n try {\n const result = await api.review(no)\n const report: ReviewReport = result.report\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: report.passed ? 'approved' : 'rejected', review: report } : c),\n })\n pushProgress(tt('progress.reviewed', { no, score: report.score, verdict: report.verdict }), report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Approve a chapter manually. */\n const handleApprove = (no: number): void => {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n updatedAt: new Date().toISOString(),\n })\n }\n\n /** Toggle chapter preview. */\n const handleToggleChapter = async (no: number): Promise<void> => {\n if (expandedChapter === no) {\n setExpandedChapter(null)\n setChapterText('')\n return\n }\n setExpandedChapter(no)\n setChapterText('')\n try {\n const result = await api.chapter(no)\n setChapterText(result.markdown)\n } catch (err) {\n setChapterText(`(${(err as Error).message})`)\n }\n }\n\n /** Suggest foreshadows via LLM. */\n const handleSuggestForeshadows = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('foreshadow.suggest'))\n setError('')\n try {\n const result = await api.foreshadow({ suggest: true })\n setProject(prev => prev === null ? prev : { ...prev, foreshadows: [...(prev?.foreshadows ?? []), ...result.foreshadows], updatedAt: new Date().toISOString() })\n pushProgress(`AI 已建议 ${result.foreshadows.length} 条伏笔`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`伏笔建议失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the settings draft. */\n const handleSaveConfig = async (): Promise<void> => {\n if (configDraft === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.patchConfig({\n outlinePath: configDraft.outlinePath,\n outputDir: configDraft.outputDir,\n provider: configDraft.provider,\n model: configDraft.model,\n chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\n })\n setConfig(result.config)\n setConfigDraft(result.config)\n setNotice(tt('settings.saved'))\n pushProgress(tt('settings.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the book. */\n const handleExport = async (format: 'txt' | 'md'): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.exportBook(format)\n setNotice(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }))\n pushProgress(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }), 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const busyAny = anyGenerating(project?.chapters)\n const chapters = project?.chapters ?? []\n const doneCount = chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n const pendingCount = chapters.filter(c => c.status === 'pending' || c.status === 'error').length\n const bible: StoryBible | undefined = project?.bible\n const volumes: Volume[] | undefined = project?.volumes\n const foreshadows: Foreshadow[] = project?.foreshadows ?? []\n\n // --------------------------------------------------- dashboard (workflow)\n const approvedCount = chapters.filter(c => c.status === 'approved').length\n const reviewPendingCount = chapters.filter(c => c.status === 'written' || c.status === 'rejected').length\n const totalChars = chapters.reduce((sum, c) => sum + (c.chars ?? 0), 0)\n const firstChapter = chapters[0]\n const currentVolumeName = (() => {\n if (firstChapter === undefined || volumes === undefined || volumes.length === 0) return '—'\n const vol = volumes.find(v => v.no === firstChapter.volume)\n return vol !== undefined ? vol.title : `第 ${firstChapter.volume} 卷`\n })()\n const lastUpdated = project?.updatedAt !== undefined\n ? new Date(project.updatedAt).toLocaleString('zh-CN', { month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n : '—'\n\n /** 创作旅程 6 阶段(完成/当前/未到)。 */\n const journeyStages: Array<{ id: string; label: string; done: boolean }> = [\n { id: 'outline', label: '大纲', done: project !== null },\n { id: 'bible', label: '设定', done: bible !== undefined },\n { id: 'volumes', label: '卷计划', done: volumes !== undefined },\n { id: 'plan', label: '章节计划', done: chapters.length > 0 },\n { id: 'write', label: '正文', done: chapters.some(c => (c.chars ?? 0) > 0) },\n { id: 'review', label: '审稿', done: approvedCount > 0 },\n ]\n const journeyDoneCount = journeyStages.filter(s => s.done).length\n const journeyPercent = Math.round((journeyDoneCount / journeyStages.length) * 100)\n const currentStageId = journeyStages.find(s => !s.done)?.id\n\n /** 主行动卡片:推荐下一步(AI-Novel-Writing-Assistant 首页主卡模式)。 */\n const nextAction = useMemo((): { eyebrow: string; title: string; reason: string; actionLabel: string; onClick: () => void } | null => {\n if (project === null) {\n return {\n eyebrow: '开始你的第一本书',\n title: '导入小说大纲',\n reason: '从 docx 文件或粘贴文本开始,AI 会把一份大纲「编译」成完整的小说。',\n actionLabel: '导入大纲',\n onClick: () => { setActiveTab('overview') },\n }\n }\n if (bible === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '提炼设定圣经',\n reason: '人设、世界观、金手指规则、写作红线是后续所有生成的地基,越完整质量越高。',\n actionLabel: '生成设定圣经',\n onClick: () => { void handleBible() },\n }\n }\n if (volumes === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '规划全书卷结构',\n reason: '按剧情弧线划分卷,章节计划才有骨架可依。',\n actionLabel: '生成卷计划',\n onClick: () => { void handleVolumes() },\n }\n }\n if (chapters.length === 0) {\n return {\n eyebrow: '推荐下一步',\n title: '生成章节计划',\n reason: 'LLM 根据大纲拆解每章标题与剧情要点,然后就可以逐章生成正文。',\n actionLabel: '生成章节计划',\n onClick: () => { void handlePlan() },\n }\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined) {\n return {\n eyebrow: '需要你确认',\n title: `第 ${drafting.no} 章有未采纳的润色草稿`,\n reason: '打开工作区查看对比,决定采纳新稿或保留原稿(原稿未被改动)。',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n }\n }\n if (pendingCount > 0) {\n return {\n eyebrow: '继续创作',\n title: `还有 ${pendingCount} 章待生成`,\n reason: '批量生成剩余章节,顶部进度条会实时显示每章字数与进度。',\n actionLabel: `批量生成(${pendingCount})`,\n onClick: () => { void handleWriteAll() },\n }\n }\n if (reviewPendingCount > 0) {\n return {\n eyebrow: '推荐下一步',\n title: `${reviewPendingCount} 章待审稿`,\n reason: '审稿通过后章节才算完成;不通过的可按意见在工作区修订。',\n actionLabel: '去审稿',\n onClick: () => { setActiveTab('plan') },\n }\n }\n return {\n eyebrow: '全部完成 🎉',\n title: '《' + project.bookName + '》已全部生成',\n reason: '可以去 AI 味润色(对比后采纳)、按卷复查或导出全本(TXT/MD)。',\n actionLabel: '导出全本',\n onClick: () => { void handleExport('txt') },\n }\n }, [project, bible, volumes, chapters, pendingCount, reviewPendingCount, openWorkspace])\n\n /** 待办队列(失败/草稿/待审稿,点击直达)。 */\n const todos = useMemo(() => {\n const items: Array<{ tone: 'danger' | 'warning' | 'info' | 'success'; title: string; description: string; actionLabel: string; onClick: () => void }> = []\n for (const chapter of chapters) {\n if (chapter.status === 'error') {\n items.push({\n tone: 'danger',\n title: `第 ${chapter.no} 章《${chapter.title}》生成失败`,\n description: chapter.error ?? '',\n actionLabel: '去处理',\n onClick: () => { setActiveTab('plan') },\n })\n }\n if (items.length >= 3) return items\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined && items.length < 3) {\n items.push({\n tone: 'warning',\n title: `第 ${drafting.no} 章《${drafting.title}》有未采纳草稿`,\n description: '原稿未被改动,采纳或放弃由你决定',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n })\n }\n for (const chapter of chapters) {\n if ((chapter.status === 'written' || chapter.status === 'rejected') && items.length < 3) {\n items.push({\n tone: 'info',\n title: `第 ${chapter.no} 章《${chapter.title}》待审稿`,\n description: chapter.status === 'rejected' ? '审稿未通过,可按意见修订' : '等待 AI 审稿确认',\n actionLabel: '去审稿',\n onClick: () => { setActiveTab('plan') },\n })\n }\n }\n return items\n }, [chapters, openWorkspace])\n\n /** 资产健康(设定/卷/写作资产/伏笔)。 */\n const assetSummary = (() => {\n const assets = project?.assets\n const parts: string[] = []\n if (assets?.genre !== undefined) parts.push(`题材:${assets.genre.name}`)\n if (assets?.primaryProgression !== undefined) parts.push(`推进:${assets.primaryProgression.name}`)\n if ((assets?.styleAssets?.length ?? 0) > 0) parts.push(`写法:${assets!.styleAssets!.length} 套`)\n return parts.length > 0 ? parts.join(' · ') : '题材 / 推进 / 写法未绑定'\n })()\n const assetCount = (() => {\n const assets = project?.assets\n let n = 0\n if (assets?.genre !== undefined) n++\n if (assets?.primaryProgression !== undefined) n++\n n += assets?.auxiliaryProgressions?.length ?? 0\n n += assets?.styleAssets?.length ?? 0\n n += assets?.antiAiRules?.length ?? 0\n return n\n })()\n\n return (\n <div className={css.panel}>\n <div className={css.panelHeader}>\n <h2 className={css.panelTitle}>\n {tt('panel.title')}\n {project?.bookName !== '' && project?.bookName !== undefined && (\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)', fontSize: 11 }}>{project.bookName}</span>\n )}\n {chapters.length > 0 && (\n <span className={css.headerProgress}>\n 已完成 <b>{doneCount}</b>/{chapters.length} 章\n <span className={css.headerProgressDot} />\n 通过 <b>{chapters.filter(c => c.status === 'approved').length}</b>\n </span>\n )}\n </h2>\n <div style={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <button\n type=\"button\"\n className={css.iconButton}\n title={navCollapsed ? '展开导航栏' : '收起导航栏'}\n aria-label={navCollapsed ? '展开导航栏' : '收起导航栏'}\n onClick={() => {\n setNavCollapsed(prev => {\n const next = !prev\n try { window.localStorage.setItem('dsh-novel-forge.nav.collapsed', String(next)) } catch { /* ignore */ }\n return next\n })\n }}\n >\n {navCollapsed ? '▸' : '◂'}\n </button>\n <button type=\"button\" className={css.iconButton} title={tt('common.close')} aria-label={tt('common.close')} onClick={() => { controller.close() }}>×</button>\n </div>\n </div>\n {shelf !== null && (\n <BookshelfBar\n api={api}\n shelf={shelf}\n onSwitch={() => {\n void refreshShelf()\n // 切换书后重置本地编辑状态,重新拉取目标书。\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n void refresh(false)\n }}\n />\n )}\n <div className={css.panelBody}>\n <nav className={`${css.panelNav} ${navCollapsed ? css.panelNavCollapsed : ''}`} role=\"tablist\" aria-label=\"工作台导航\">\n {/* 分组导航(创作 / 工具 / 数据库) */}\n {NAV_GROUPS.map(group => (\n <div key={group.id} className={css.navGroup}>\n {!navCollapsed && <div className={css.navGroupLabel}>{group.label}</div>}\n {group.items.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen)}\n data-active={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) ? '' : undefined}\n className={css.navTab}\n title={tab.label}\n onClick={() => {\n if (tab.id === 'assistant') {\n setAssistantOpen(true)\n } else {\n setActiveTab(tab.id)\n }\n }}\n >\n <span className={css.navTabIcon}>{tab.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{tab.label}</span>}\n {/* 状态角标:章节待办 / 伏笔待埋 / 工作流进度 */}\n {tab.id === 'plan' && (pendingCount > 0 || reviewPendingCount > 0) && (\n <span className={`${css.navTabBadge} ${chapters.some(c => c.status === 'error') ? css.navTabBadgeDanger : css.navTabBadgeWarn}`}>\n {chapters.some(c => c.status === 'error') ? `!${pendingCount + reviewPendingCount}` : pendingCount + reviewPendingCount}\n </span>\n )}\n {tab.id === 'foreshadow' && foreshadows.some(f => f.status === 'planned') && (\n <span className={css.navTabBadge}>{foreshadows.filter(f => f.status === 'planned').length}</span>\n )}\n {tab.id === 'workflow' && chapters.length > 0 && (\n <span className={`${css.navTabBadge} ${css.navTabBadgeDone}`}>{journeyPercent}%</span>\n )}\n </button>\n ))}\n {!navCollapsed && <div className={css.navGroupSep} />}\n </div>\n ))}\n {/* 设置沉底 */}\n <div className={css.navSpacer} />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === SETTINGS_TAB.id}\n data-active={activeTab === SETTINGS_TAB.id ? '' : undefined}\n className={css.navTab}\n title={SETTINGS_TAB.label}\n onClick={() => { setActiveTab(SETTINGS_TAB.id) }}\n >\n <span className={css.navTabIcon}>{SETTINGS_TAB.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{SETTINGS_TAB.label}</span>}\n </button>\n </nav>\n <div className={css.panelContent}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n {busy && busyLabel !== '' && (\n <div className={css.card}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-accent)' }}>{busyLabel}…</span>\n {liveBar !== null && <span className={css.liveText}>{liveBar.text}</span>}\n </div>\n {liveBar?.ratio !== undefined && (\n <div className={css.bigProgressBar}>\n <div className={css.bigProgressBarFill} style={{ width: `${Math.round(liveBar.ratio * 100)}%` }} />\n </div>\n )}\n </div>\n )}\n\n {/* 遗留草稿提示:刷新页面后仍有未采纳的润色/修订草稿 */}\n {workspace === null && draftNo !== null && (\n <div className={css.card} style={{ borderColor: 'var(--nf-info)' }}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-info)' }}>第 {draftNo} 章有未采纳的润色/修订草稿(原稿未被改动)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void openWorkspace(draftNo) }}>\n 打开工作区\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(draftNo) }}>\n 放弃\n </button>\n </span>\n </div>\n </div>\n )}\n\n {/* 润色/修订工作区:左栏原文(可选中局部目标)+ 右栏指令/预览/应用 */}\n {workspace !== null && (\n <div className={css.card} style={{ borderColor: 'var(--nf-accent)' }}>\n <div className={css.busyRow}>\n <span className={css.cardTitle}>第 {workspace.no} 章《{workspace.title}》润色/修订</span>\n <button type=\"button\" className={css.iconButton} title=\"关闭工作区\" aria-label=\"关闭工作区\" onClick={() => { setWorkspace(null) }}>×</button>\n </div>\n <div className={css.wsColumns}>\n <div className={css.wsColumn}>\n <div className={css.meta}>\n 原文({workspace.original.length} 字)— 在正文中选中文字可作为「修订选中」的局部目标\n </div>\n <textarea\n ref={wsEditorRef}\n className={`${css.textarea} ${css.wsEditor}`}\n value={workspace.original}\n onChange={e => { setWorkspace({ ...workspace, original: e.target.value }) }}\n onMouseUp={captureWsSelection}\n onKeyUp={captureWsSelection}\n onSelect={captureWsSelection}\n spellCheck={false}\n />\n </div>\n <div className={css.wsColumn}>\n <div className={css.meta} style={{ fontWeight: 600 }}>AI 修正指令</div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 60 }}\n placeholder=\"输入修正要求,例如:压缩冗余、加强冲突、这段对话更口语化…(可留空)\"\n value={workspace.instruction}\n onChange={e => { setWorkspace({ ...workspace, instruction: e.target.value }) }}\n />\n {wsSelected !== '' ? (\n <div className={css.wsSelected}>\n <div className={css.meta}>当前选中内容(将用于精准修订)</div>\n <div className={css.wsSelectedText}>{wsSelected}</div>\n </div>\n ) : (\n <div className={css.meta}>未选中内容时仅支持整章润色/修订。</div>\n )}\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWsPolish() }}>\n ✨ 去AI味润色\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.instruction.trim() === ''} onClick={() => { void handleWsRewrite(true) }}>\n 整章修订\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || wsSelected === ''} onClick={() => { void handleWsRewrite(false) }}>\n 修订选中\n </button>\n </div>\n {workspace.draft !== null && (\n <div className={css.wsPreview}>\n <div className={css.busyRow}>\n <span className={css.meta}>优化预览({workspace.draft.length} 字)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWsShowDiff(v => !v) }}>\n {wsShowDiff ? '显示文本' : '查看对比'}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleDraftApply(workspace.no) }}>\n ✅ 应用预览\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(workspace.no) }}>\n ↩️ 放弃\n </button>\n </span>\n </div>\n {wsShowDiff\n ? <DiffList original={workspace.original} draft={workspace.draft} />\n : <pre className={css.wsPreviewText}>{workspace.draft}</pre>}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'workflow' && (\n <>\n {/* ⭐ 主行动大卡片 */}\n <div className={css.dashHero}>\n <div className={css.dashHeroEyebrow}>\n <span className={css.dashHeroSparkle}>✨</span>\n {nextAction?.eyebrow ?? '开始'}\n </div>\n {project !== null && (\n <div className={css.dashHeroTitle}>\n <span className={css.meta}>正在创作</span>\n <h3 className={css.dashHeroBook}>《{project.bookName}》</h3>\n </div>\n )}\n {nextAction !== null && (\n <div className={css.dashHeroAction}>\n <span className={css.dashHeroArrow}>→</span>\n <div className={css.dashHeroActionBody}>\n <div className={css.dashHeroActionTitle}>{nextAction.title}</div>\n <div className={css.meta}>{nextAction.reason}</div>\n </div>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { nextAction.onClick() }}>\n {nextAction.actionLabel}\n </button>\n </div>\n )}\n {/* 创作旅程进度 */}\n <div className={css.dashJourney}>\n <div className={css.busyRow}>\n <span className={css.meta} style={{ fontWeight: 600 }}>创作旅程</span>\n <span className={css.meta}>{journeyPercent}% · 已完成 {journeyDoneCount}/{journeyStages.length} 步</span>\n </div>\n <div className={css.dashJourneyBar}>\n <div className={css.dashJourneyFill} style={{ width: `${journeyPercent}%` }} />\n </div>\n <div className={css.dashJourneyStages}>\n {journeyStages.map(stage => (\n <span\n key={stage.id}\n className={`${css.dashStage} ${stage.done ? css.dashStageDone : stage.id === currentStageId ? css.dashStageCurrent : ''}`}\n >\n <span className={css.dashStageDot}>{stage.done ? '✓' : stage.id === currentStageId ? '●' : '○'}</span>\n {stage.label}\n </span>\n ))}\n </div>\n </div>\n {/* HeroFact 4 格 */}\n <div className={css.dashFacts}>\n <div className={css.dashFact}><span className={css.meta}>已沉淀章节</span><b>{doneCount} 章</b></div>\n <div className={css.dashFact}><span className={css.meta}>累计字数</span><b>{totalChars} 字</b></div>\n <div className={css.dashFact}><span className={css.meta}>当前卷</span><b>{currentVolumeName}</b></div>\n <div className={css.dashFact}><span className={css.meta}>最近创作</span><b>{lastUpdated}</b></div>\n </div>\n </div>\n\n {/* 状态摘要条 */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已通过审稿</span>\n <span className={css.assetStatValue} style={{ color: approvedCount > 0 ? 'var(--nf-success)' : undefined }}>{approvedCount}</span>\n <span className={css.assetStatDetail}>章节已 approved</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待生成</span>\n <span className={css.assetStatValue} style={{ color: pendingCount > 0 ? 'var(--nf-warn)' : undefined }}>{pendingCount}</span>\n <span className={css.assetStatDetail}>pending + error</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待审稿</span>\n <span className={css.assetStatValue} style={{ color: reviewPendingCount > 0 ? 'var(--nf-info)' : undefined }}>{reviewPendingCount}</span>\n <span className={css.assetStatDetail}>written + rejected</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>总字数</span>\n <span className={css.assetStatValue}>{totalChars}</span>\n <span className={css.assetStatDetail}>已生成正文累计</span>\n </div>\n </div>\n\n {/* 双栏:左待办队列 + 右资产健康 */}\n <div className={css.dashGrid}>\n <div className={css.card}>\n <span className={css.cardTitle}>待办队列</span>\n {todos.length === 0 ? (\n <span className={css.meta}>🎉 暂无待办,一切顺畅</span>\n ) : (\n todos.map((todo, i) => (\n <div key={i} className={`${css.todoItem} ${todo.tone === 'danger' ? css.todoDanger : todo.tone === 'warning' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n {todo.title}\n {todo.description !== '' && <span className={css.meta}> — {todo.description}</span>}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { todo.onClick() }}>\n {todo.actionLabel}\n </button>\n </div>\n ))\n )}\n </div>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>资产健康</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleAudit() }} title=\"LLM 扫描全本已生成章节,检查人名/境界/资源/时间线矛盾\">\n 🔍 全书质检\n </button>\n </div>\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>设定圣经</span>\n <span className={css.assetStatValue} style={{ color: bible !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {bible !== undefined ? `✓ ${bible.worldRules.length} 条规则` : '未生成'}\n </span>\n <span className={css.assetStatDetail}>\n {bible !== undefined ? `${bible.characters.length} 角色 · ${bible.redLines.length} 红线` : '提炼人设 / 世界观 / 金手指'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>卷计划</span>\n <span className={css.assetStatValue} style={{ color: volumes !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {volumes !== undefined ? `${volumes.length} 卷` : '未生成'}\n </span>\n <span className={css.assetStatDetail} title={volumes?.map(v => v.title).join(' / ')}>\n {volumes !== undefined ? volumes.map(v => v.title).join(' / ') : '按剧情弧线划分全书'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>写作资产</span>\n <span className={css.assetStatValue} style={{ color: assetCount > 0 ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {assetCount} 项\n </span>\n <span className={css.assetStatDetail} title={assetSummary}>{assetSummary}</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>伏笔</span>\n <span className={css.assetStatValue}>{foreshadows.length} 条</span>\n <span className={css.assetStatDetail}>\n {foreshadows.filter(f => f.status === 'planned').length} 待埋 · {foreshadows.filter(f => f.status === 'resolved').length} 已回收\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* 全书质检结果 */}\n {auditIssues !== null && (\n <div className={css.card} style={{ borderColor: auditIssues.length > 0 ? 'var(--nf-error)' : 'var(--nf-success)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>\n 🔍 全书质检{auditIssues.length === 0 ? ':未发现矛盾 🎉' : `:${auditIssues.length} 处疑似矛盾`}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setAuditIssues(null) }}>\n 收起\n </button>\n </div>\n {auditIssues.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {auditIssues.map((issue, i) => (\n <div key={i} className={`${css.todoItem} ${issue.severity === 'high' ? css.todoDanger : issue.severity === 'medium' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n <span>\n {issue.chapterNo > 0 ? `第 ${issue.chapterNo} 章` : '未定位章节'} · [{issue.severity}] {issue.item}\n </span>\n {issue.suggestion !== '' && <span className={css.meta}>建议:{issue.suggestion}</span>}\n </span>\n {issue.chapterNo > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void openWorkspace(issue.chapterNo, `按质检意见修订:${issue.item}(建议:${issue.suggestion})`) }}\n >\n 去修订\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n\n {activeTab === 'overview' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.overview')}</span>\n {project !== null && (\n <div className={css.row}>\n <span className={css.meta}>\n {tt('overview.bookName')}: {project.bookName} · {project.outline.length} 字\n {project.outlinePath !== undefined && <span> · {project.outlinePath}</span>}\n </span>\n <button type=\"button\" className={css.button} disabled={busy} onClick={() => { handleToggleUpdateOutline() }}>\n {updatingOutline ? '收起' : '更新大纲'}\n </button>\n </div>\n )}\n </div>\n {project === null ? (\n <>\n {/* 未开书:导入大纲(开书动作) */}\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { fileInputRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>点击选择本机 docx 大纲,或将文件拖到这里</span>\n <span className={css.meta}>也支持粘贴文本到下方编辑区</span>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n e.target.value = ''\n }}\n />\n </div>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>{tt('overview.outlineChars')}: {outlineText.length}</span>\n <button type=\"button\" className={css.button} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n {tt('overview.saveOutline')}\n </button>\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder={tt('overview.outlineHint')}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </>\n ) : updatingOutline ? (\n <>\n <div className={css.meta}>\n 大纲是本书的「出生证明」。更新时请二选一:<b>仅更新文本</b>(保留设定/章节/正文全部进度),或\n <b>重置项目</b>(从新大纲重新开始,清空设定/卷/章节/正文/伏笔/资产/事实库,不可恢复)。\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder=\"粘贴新版大纲文本…\"\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n 仅更新文本(保留进度)\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonDanger}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleResetProject() }}>\n 重置项目并更新(清空进度)\n </button>\n <span className={css.meta}>{outlineText.length} 字</span>\n </div>\n </>\n ) : (\n /* 只读展示:大纲是开书时的出生证明 */\n <pre className={css.outlineReadonly}>{project.outline}</pre>\n )}\n </div>\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('status.files')}({generatedFiles.length})</span>\n <div className={css.fileList}>\n {generatedFiles.length === 0 && <span>{tt('status.projectNone')}</span>}\n {generatedFiles.map(file => <span key={file}>{file}</span>)}\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'plan' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.plan')}</span>\n <div className={css.row}>\n <span className={css.meta}>{tt('plan.generateHint')}</span>\n <input\n className={css.input}\n style={{ width: 72 }}\n type=\"number\"\n min={1}\n max={200}\n value={planCount}\n onChange={e => { const v = Number(e.target.value); if (Number.isInteger(v)) setPlanCount(v) }}\n />\n <span className={css.meta}>{tt('plan.count')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handlePlan() }}>\n {tt('plan.generate')}\n </button>\n </div>\n </div>\n {volumes !== undefined && volumes.length > 0 && (\n <div className={css.row}>\n {volumes.map(v => (\n <span key={v.no} className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>\n {v.no}. {v.title}({v.chapterStart}-{v.chapterEnd})\n </span>\n ))}\n </div>\n )}\n </div>\n\n {chapters.length > 0 && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>共 {chapters.length} 章 · 已完成 {doneCount} · 待生成 {pendingCount}</span>\n {pendingCount > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWriteAll() }}>\n {tt('plan.writeAllPending')}({pendingCount})\n </button>\n )}\n </div>\n <div className={css.chapterList}>\n {chapters.map(chapter => {\n const badge = statusBadge(chapter)\n const expanded = expandedChapter === chapter.no\n const review: ReviewReport | undefined = chapter.review\n return (\n <div key={chapter.no} className={css.chapter}>\n <span className={css.chapterNum}>{chapter.no}</span>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ padding: '1px 6px' }} onClick={() => { void handleToggleChapter(chapter.no) }}>\n {expanded ? '−' : '+'}\n </button>\n <span>{chapter.title}</span>\n {chapter.status === 'approved' && chapter.chars !== undefined && (\n <span className={css.meta}>{chapter.chars}{tt('common.chars')}</span>\n )}\n {chapter.volume > 0 && <span className={css.meta}>{tt('plan.volumes')}{chapter.volume}</span>}\n </div>\n {!expanded && <div className={css.chapterBeats} title={chapter.beats}>{chapter.beats}</div>}\n {expanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta}><b>{tt('plan.beats')}:</b></div>\n <div className={css.meta}>{renderBeats(chapter.beats)}</div>\n {chapter.summary !== undefined && chapter.summary !== '' && (\n <div className={css.meta}><b>{tt('plan.summary')}:</b> {chapter.summary}</div>\n )}\n <pre className={css.chapterPreview}>{chapterText || `(${tt('common.loading')})`}</pre>\n {review !== undefined && (\n <div className={css.reviewBox}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('plan.reviewReport')}</b>\n <span style={{ color: review.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {tt('plan.reviewScore')}: {review.score} — {review.passed ? tt('plan.reviewPass') : tt('plan.reviewFail')}\n </span>\n </div>\n <div className={css.meta}><b>{tt('plan.reviewVerdict')}:</b> {review.verdict}</div>\n {review.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>\n {review.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity) }}>\n [{issue.severity}] {issue.item} → {issue.suggestion}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {(chapter.status === 'rejected' || chapter.status === 'written' || chapter.status === 'approved') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta} style={{ fontWeight: 600 }}>\n 润色 / 修订 — 在右上角打开工作区:左栏原文可直接选中文字做局部修订,右栏输入指令后预览,确认后再应用(未应用不改动原稿)\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.rewrite')} / {tt('plan.polish')}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n <span className={`${css.badge} ${badge.cls}`}>{badge.label}</span>\n <div className={css.chapterActions}>\n {(chapter.status === 'pending' || chapter.status === 'error') && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || busyAny}\n onClick={() => { void handleWriteChapter(chapter.no, true) }}\n >\n {tt('plan.write')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReview(chapter.no) }}>\n {tt('plan.review')}\n </button>\n )}\n {chapter.status === 'written' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { handleApprove(chapter.no) }}>\n {tt('plan.approve')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.polish')}\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleWriteChapter(chapter.no, true) }}>\n {tt('plan.rewrite')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('plan.progress')}</span>\n <div className={css.progress}>\n {progress.length === 0 && <span className={css.meta}>{tt('progress.empty')}</span>}\n {progress.map(line => (\n <div key={line.id} className={line.kind === 'done' ? css.progressLineDone : line.kind === 'error' ? css.progressLineError : line.live === true ? css.progressLineLive : css.progressLine}>\n {line.live === true && (\n <span className={css.progressBar}>\n <span className={css.progressBarFill} style={{ width: `${Math.round((line.ratio ?? 0) * 100)}%` }} />\n </span>\n )}\n {line.text}\n </div>\n ))}\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'bible' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('bible.title')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBible() }}>\n {tt('bible.gen')}\n </button>\n </div>\n {bible === undefined ? (\n <span className={css.meta}>{tt('bible.none')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {bible.genre !== '' && (\n <div><b>{tt('bible.genre')}:</b> <span className={css.meta}>{bible.genre}</span></div>\n )}\n {/* 世界观规则独立卡片(可编辑,每行一条) */}\n {bible.worldRules.length > 0 && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 10px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('bible.worldRules')}({bible.worldRules.length})</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft(bible.worldRules.join('\\n')) }}>\n 编辑\n </button>\n </div>\n {worldRulesDraft !== '' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 120 }}\n value={worldRulesDraft}\n onChange={e => { setWorldRulesDraft(e.target.value) }}\n placeholder=\"每条规则一行…\"\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveWorldRules() }}>\n 保存规则\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft('') }}>\n 取消\n </button>\n </div>\n </div>\n )}\n {worldRulesDraft === '' && (\n <ul style={{ margin: '4px 0 0', paddingLeft: 18, fontSize: 12 }}>{bible.worldRules.map((r, i) => <li key={i}>{r}</li>)}</ul>\n )}\n </div>\n )}\n {bible.characters.length > 0 && (\n <div>\n <b>{tt('bible.characters')}({bible.characters.length})</b>\n {bible.characters.map(card => (\n <div key={card.name} style={{ marginTop: 4, fontSize: 12 }}>\n <b>{card.name}</b> <span className={css.meta}>[{card.role}] {card.traits.join('、')}</span>\n {card.goals !== '' && <div className={css.meta}>目标:{card.goals}</div>}\n {card.relations !== '' && <div className={css.meta}>关系:{card.relations}</div>}\n </div>\n ))}\n </div>\n )}\n {bible.redLines.length > 0 && (\n <div>\n <b>{tt('bible.redLines')}({bible.redLines.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12, color: 'var(--nf-error)' }}>{bible.redLines.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n {bible.style.length > 0 && (\n <div>\n <b>{tt('bible.style')}({bible.style.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.style.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* 角色卡:从事实库聚合的当前状态(独立导航页) */}\n {activeTab === 'characters' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>角色卡(当前状态)</span>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleFactsBackfill() }} title=\"历史章节(事实库功能上线前生成的)批量抽取事实\">\n 📥 回填事实库\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (project?.facts ?? []).length === 0} onClick={() => { void handleCharactersRefresh() }}>\n ↻ 从事实库刷新\n </button>\n </div>\n </div>\n {charCards === null ? (\n <span className={css.meta}>\n {(project?.facts ?? []).length === 0\n ? '暂无事实库(生成章节后自动积累人物状态/境界/资源/关系等事实),刷新按钮将在有事实后可用。'\n : '点击「从事实库刷新」聚合各角色当前状态(境界/资源/伤势/心境)。'}\n </span>\n ) : charCards.length === 0 ? (\n <span className={css.meta}>未识别到角色信息。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {charCards.map(card => (\n <div key={card.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{card.name}</b>\n <span className={css.meta}>\n {card.role === 'protagonist' ? '主角' : card.role === 'supporting' ? '配角' : card.role === 'antagonist' ? '反派' : '其他'}\n {' · 出场 '}{card.appearances} 次 · 最近 第 {card.lastChapter} 章\n </span>\n </div>\n {card.status !== '' && <div className={css.meta}>状态:{card.status}</div>}\n </div>\n ))}\n </div>\n )}\n <span className={css.meta}>角色卡由「设定圣经」角色名单 + 「事实库」聚合而来,随章节生成自动保持最新。</span>\n </div>\n )}\n\n {/* 写作资产 5 个子分类(左侧导航直达) */}\n {activeTab === 'assetsGenre' && <AssetsTab api={api} initialTab=\"genre\" />}\n {activeTab === 'assetsProgression' && <AssetsTab api={api} initialTab=\"progression\" />}\n {activeTab === 'assetsTemplates' && <AssetsTab api={api} initialTab=\"templates\" />}\n {activeTab === 'assetsRules' && <AssetsTab api={api} initialTab=\"rules\" />}\n {activeTab === 'assetsStyle' && <AssetsTab api={api} initialTab=\"style\" />}\n\n {activeTab === 'foreshadow' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('foreshadow.title')}({foreshadows.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSuggestForeshadows() }}>\n {tt('foreshadow.suggest')}\n </button>\n </div>\n {foreshadows.length === 0 ? (\n <span className={css.meta}>{tt('foreshadow.none')}</span>\n ) : (\n <div className={css.chapterList}>\n {foreshadows.map(f => {\n const statusLabel = { planned: tt('foreshadow.planned'), planted: tt('foreshadow.planted'), progressing: tt('foreshadow.progressing'), resolved: tt('foreshadow.resolved'), abandoned: tt('foreshadow.abandoned') }[f.status]\n const statusColor = f.status === 'resolved' ? 'var(--nf-success)' : f.status === 'planted' || f.status === 'progressing' ? 'var(--nf-accent)' : f.status === 'abandoned' ? 'var(--nf-text-3)' : 'var(--nf-info)'\n return (\n <div key={f.id} className={css.chapter}>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <span>{f.description}</span>\n </div>\n <div className={css.meta}>\n {f.plantedChapter !== undefined && <span>{tt('foreshadow.plantedAt')} 第{f.plantedChapter}章 · </span>}\n {f.targetChapter !== undefined && <span>{tt('foreshadow.target')} 第{f.targetChapter}章 · </span>}\n {f.resolvedNote !== undefined && f.resolvedNote !== '' && <span>回收:{f.resolvedNote} · </span>}\n </div>\n </div>\n <span className={css.badge} style={{ borderColor: statusColor, color: statusColor }}>{statusLabel}</span>\n <div className={css.row} style={{ gap: 4 }}>\n {f.status === 'planned' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'planted', plantedChapter: doneCount + 1 }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setPlanted')}\n </button>\n )}\n {(f.status === 'planted' || f.status === 'progressing') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'resolved', resolvedNote: `第${doneCount}章回收` }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setResolved')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'settings' && configDraft !== null && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.title')}</span>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outlinePath')}</label>\n <input className={css.input} value={configDraft.outlinePath} onChange={e => { setConfigDraft({ ...configDraft, outlinePath: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outputDir')}</label>\n <input className={css.input} value={configDraft.outputDir} onChange={e => { setConfigDraft({ ...configDraft, outputDir: e.target.value }) }} />\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.provider')}</label>\n <input className={css.input} value={configDraft.provider} onChange={e => { setConfigDraft({ ...configDraft, provider: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <input className={css.input} value={configDraft.model} onChange={e => { setConfigDraft({ ...configDraft, model: e.target.value }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.chapterChars')}</label>\n <input className={css.input} type=\"number\" min={1000} max={20000} value={configDraft.chapterChars} onChange={e => { setConfigDraft({ ...configDraft, chapterChars: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.maxTokens')}</label>\n <input className={css.input} type=\"number\" min={2000} max={64000} value={configDraft.maxTokens} onChange={e => { setConfigDraft({ ...configDraft, maxTokens: Number(e.target.value) }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reviewPassScore')}</label>\n <input className={css.input} type=\"number\" min={0} max={100} value={configDraft.reviewPassScore} onChange={e => { setConfigDraft({ ...configDraft, reviewPassScore: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n </div>\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveConfig() }}>\n {tt('settings.save')}\n </button>\n <button type=\"button\" className={css.button} onClick={() => { void api.openFolder() }}>\n {tt('settings.openFolder')}\n </button>\n <span className={css.meta}>当前:{config?.provider} / {config?.model} · {config?.outputDir}</span>\n </div>\n <div className={css.row}>\n <span className={css.cardTitle}>{tt('settings.export')}</span>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('txt') }}>\n {tt('settings.exportTxt')}\n </button>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('md') }}>\n {tt('settings.exportMd')}\n </button>\n </div>\n {/* 事实库 / 时间线 */}\n {(project?.facts ?? []).length > 0 && (\n <div className={css.card}>\n <span className={css.cardTitle}>事实库 / 时间线({(project?.facts ?? []).length} 条)</span>\n <span className={css.meta}>\n 每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: 300, overflowY: 'auto', fontSize: 12 }}>\n {[...(project?.facts ?? [])].reverse().slice(0, 60).map((fact, i) => (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)', flex: 'none', marginTop: 1 }}>\n 第 {fact.chapterNo} 章\n </span>\n <span className={css.meta}>{fact.text}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* AI 助手悬浮窗:可拖动、可拉大小,不占用工作台 */}\n {assistantOpen && (\n <div\n className={css.assistantFloat}\n style={{ left: assistantPos.x, top: assistantPos.y, width: assistantSize.w, height: assistantSize.h }}\n >\n <div\n className={css.assistantFloatHeader}\n onMouseDown={e => {\n e.preventDefault()\n dragState.current = { type: 'move', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n >\n <span>💬 AI 助手 <span className={css.meta}>(拖动标题栏移动 · 右下角拉大小)</span></span>\n <button type=\"button\" className={css.iconButton} title=\"关闭\" aria-label=\"关闭 AI 助手\" onClick={() => { setAssistantOpen(false) }}>×</button>\n </div>\n <div className={css.assistantFloatBody}>\n <AssistantTab api={api} />\n </div>\n <div\n className={css.assistantResize}\n onMouseDown={e => {\n e.preventDefault()\n e.stopPropagation()\n dragState.current = { type: 'resize', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n />\n </div>\n )}\n </div>\n )\n}\n","/**\n * Panel view mounting — mirrors the family plugins: a container appended\n * inside the conversation grid item, hidden while inactive; toggling is a\n * data attribute on <html>, with cross-plugin activation events.\n */\nimport { createRoot, type Root } from 'react-dom/client'\nimport type { NovelApi } from './api.ts'\nimport type { PanelController } from './panel/controller.ts'\nimport { NovelPanel } from './panel/NovelPanel.tsx'\nimport css from './panel/panel.module.css'\n\n/** The injected panel container. */\nexport const PANEL_VIEW_SELECTOR = '[data-dsh-novelforge-view]'\n\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"]'\nconst ACTIVE_ATTR = 'data-dsh-novelforge-active'\n/** Sibling panels' activation attributes (evicted when this panel opens). */\nconst OTHER_ACTIVE_ATTRS = ['data-dsh-taskboard-active', 'data-dsh-ssh-active']\n/** Cross-plugin activation event; detail is the activating panel name. */\nconst ACTIVATE_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'novelforge'\n\n/** Find the center column, or undefined while the frame is not mounted. */\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\n/**\n * Mount the panel React tree into the center column and bind visibility to\n * the controller.\n */\nexport function mountPanel(controller: PanelController, api: NovelApi): () => void {\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n\n const ensure = (): void => {\n if (container !== undefined) {\n if (container.isConnected) return\n root?.unmount()\n root = undefined\n container.remove()\n container = undefined\n }\n const column = conversationColumn()\n if (column === undefined) return\n container = document.createElement('div')\n container.dataset.dshNovelforgeView = 'true'\n container.className = css.view\n column.appendChild(container)\n root = createRoot(container)\n root.render(<NovelPanel controller={controller} api={api} />)\n }\n\n const waitObserver = new MutationObserver(() => { ensure() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const applyActive = (): void => {\n if (controller.getSnapshot().panelOpen) {\n for (const attr of OTHER_ACTIVE_ATTRS) document.documentElement.removeAttribute(attr)\n document.documentElement.setAttribute(ACTIVE_ATTR, '')\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n }\n }\n const onOtherActivate = (event: Event): void => {\n const detail = (event as CustomEvent).detail\n if ((detail === 'taskboard' || detail === 'ssh') && controller.getSnapshot().panelOpen) {\n controller.close()\n }\n }\n // Jump out on sidebar context clicks.\n const SIDEBAR_ROW_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n const onClickSidebarRow = (event: MouseEvent): void => {\n if (!controller.getSnapshot().panelOpen) return\n const target = event.target as HTMLElement | null\n if (target === null) return\n if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) controller.close()\n }\n document.addEventListener('click', onClickSidebarRow, true)\n document.addEventListener(ACTIVATE_EVENT, onOtherActivate)\n const unsubscribe = controller.subscribe(applyActive)\n applyActive()\n ensure()\n\n return () => {\n document.removeEventListener('click', onClickSidebarRow, true)\n document.removeEventListener(ACTIVATE_EVENT, onOtherActivate)\n waitObserver.disconnect()\n unsubscribe()\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n}\n","/**\n * Novel-forge panel controller: the single owner of the panel's open/closed\n * state (framework-free, mirroring the family plugins' controllers).\n */\n\n/** Immutable controller snapshot for UI subscriptions. */\nexport interface PanelControllerSnapshot {\n panelOpen: boolean\n}\n\n/** The panel state owner the sidebar entry toggles and the view renders from. */\nexport class PanelController {\n private panelOpen = false\n private listeners = new Set<() => void>()\n\n getSnapshot(): PanelControllerSnapshot {\n return { panelOpen: this.panelOpen }\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn)\n return () => { this.listeners.delete(fn) }\n }\n\n open(): void {\n if (this.panelOpen) return\n this.panelOpen = true\n this.notify()\n }\n\n close(): void {\n if (!this.panelOpen) return\n this.panelOpen = false\n this.notify()\n }\n\n toggle(): void {\n if (this.panelOpen) this.close()\n else this.open()\n }\n\n private notify(): void {\n for (const fn of [...this.listeners]) fn()\n }\n}\n","/**\n * Sidebar entry injection — mirrors the family plugins' DOM-level pattern:\n * the shell exposes no external slot, so the entry row is injected after the\n * sibling plugin entries and self-heals via MutationObserver.\n */\nimport type { PanelController } from './panel/controller.ts'\nimport { tt } from './panel/helpers.ts'\nimport css from './panel/panel.module.css'\n\n/** Stable data attribute identifying the injected entry row. */\nexport const ENTRY_SELECTOR = '[data-dsh-novelforge-entry]'\n\n/** Inline icon: an open book / writing glyph. */\nconst ICON = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 3.5h4a2 2 0 0 1 2 2v7a2 2 0 0 0-2-2h-4z\"/><path d=\"M13.5 3.5h-4a2 2 0 0 0-2 2v7a2 2 0 0 1 2-2h4z\"/><path d=\"M8 5.5v7\"/></svg>'\n\n/** Find the sidebar shell root element. */\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>('[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]')\n if (column === null) return undefined\n const logoOwner = column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n return logoOwner ?? (column.firstElementChild as HTMLElement | undefined)\n}\n\n/** The New Session button (nested in the logo row on current shells). */\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child.tagName === 'BUTTON') return child as HTMLButtonElement\n }\n return undefined\n}\n\n/** Build the entry row (a detached button; insert once the shell is up). */\nfunction createEntry(controller: PanelController): HTMLButtonElement {\n const entry = document.createElement('button')\n entry.type = 'button'\n entry.dataset.dshNovelforgeEntry = 'true'\n entry.className = css.entry\n entry.setAttribute('aria-label', tt('entry.label'))\n entry.setAttribute('title', tt('entry.tooltip'))\n entry.innerHTML = '<span class=\"' + css.entryIcon + '\">' + ICON + '</span><span class=\"' + css.entryLabel + '\">' + tt('entry.label') + '</span>'\n entry.addEventListener('click', () => { controller.toggle() })\n return entry\n}\n\n/** Re-insert the entry after the sibling plugin entry block. */\nfunction placeEntry(root: HTMLElement, entry: HTMLButtonElement): boolean {\n const button = newSessionButton(root)\n if (button === undefined) return false\n if (entry.parentElement !== root) {\n const row = button.closest('[class*=\"logoRow\"]')\n const base = (row !== null && row.parentElement === root) ? row : button\n const family = Array.from(root.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.matches('[data-dsh-taskboard-entry], [data-dsh-ssh-entry], [data-dsh-novelforge-entry]'),\n )\n const last = family.length > 0 ? family[family.length - 1] : undefined\n const anchor = last !== undefined ? last.nextElementSibling : base.nextElementSibling\n root.insertBefore(entry, anchor)\n }\n return true\n}\n\n/**\n * Mount the sidebar entry, waiting for the shell and self-healing on\n * re-renders.\n */\nexport function mountSidebarEntry(controller: PanelController): () => void {\n const entry = createEntry(controller)\n let root: HTMLElement | undefined\n let placed = false\n\n const tryPlace = (): void => {\n if (root !== undefined && !root.isConnected) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n if (placed) {\n if (document.body.contains(entry)) return\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n root ??= sidebarRoot()\n if (root === undefined) return\n placed = placeEntry(root, entry)\n if (placed) {\n rootObserver.observe(root, { childList: true, subtree: true })\n }\n }\n\n const waitObserver = new MutationObserver(() => { tryPlace() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const rootObserver = new MutationObserver(() => {\n if (root === undefined || !root.isConnected) {\n placed = false\n tryPlace()\n return\n }\n if (!root.contains(entry)) {\n placed = placeEntry(root, entry)\n }\n })\n\n const syncActive = () => {\n if (controller.getSnapshot().panelOpen) entry.dataset.active = 'true'\n else delete entry.dataset.active\n }\n const unsubscribe = controller.subscribe(syncActive)\n syncActive()\n\n tryPlace()\n\n return () => {\n waitObserver.disconnect()\n rootObserver.disconnect()\n unsubscribe()\n entry.remove()\n }\n}\n","/**\n * Browser-half entry for the dsh-novel-forge plugin — runs inside the dsh web\n * GUI. Registers the sidebar entry row and the workbench panel. DOM mounting\n * problems are logged, never thrown — the web shell fails the whole boot when\n * a plugin apply throws.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport { NovelApi } from './api.ts'\nimport { mountPanel } from './mount.tsx'\nimport { PanelController } from './panel/controller.ts'\nimport { mountSidebarEntry } from './sidebar-entry.ts'\n\n/** Required services (fiber inject waiting). */\nexport const inject = ['slots', 'locale']\n\n/**\n * Mount the novel-forge workbench.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n const controller = new PanelController()\n const api = new NovelApi()\n const disposers: Array<() => void> = []\n try {\n disposers.push(mountSidebarEntry(controller))\n disposers.push(mountPanel(controller, api))\n } catch (error) {\n // DOM failures degrade the panel, never the GUI.\n console.warn('[dsh-novel-forge] mount failed:', error)\n }\n ctx.effect(() => () => {\n for (const dispose of disposers.splice(0)) dispose()\n }, 'dsh-novel-forge: ui mounts')\n}\n"],"x_google_ignoreList":[6],"mappings":"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"}