@liustack/pptfast 0.1.0 → 0.4.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/version.ts","../src/errors.ts","../src/ir/index.ts","../src/icons.ts","../src/api.ts","../src/platform/inline-assets.ts","../src/themes/tokens.ts","../src/themes/consulting.ts","../src/themes/enterprise.ts","../src/themes/academic.ts","../src/themes/insight.ts","../src/themes/campaign.ts","../src/themes/bloom.ts","../src/themes/classroom.ts","../src/themes/ink.ts","../src/themes/tech.ts","../src/themes/runway.ts","../src/themes/journal.ts","../src/themes/luxe.ts","../src/themes/heritage.ts","../src/themes/index.ts","../src/pptx/master-builder.ts","../src/pptx/svg2pptx/render.ts","../src/pptx/svg2pptx/gradient.ts","../src/pptx/pptx-animations.ts","../src/svg/render-slide.tsx","../src/constants.ts","../src/pptx/svg2pptx/color.ts","../src/pptx/svg2pptx/style.ts","../src/pptx/svg2pptx/rect.ts","../src/pptx/svg2pptx/ellipse.ts","../src/pptx/svg2pptx/text.ts","../src/pptx/svg2pptx/line.ts","../src/pptx/svg2pptx/path.ts","../src/pptx/svg2pptx/image.ts","../src/pptx/svg2pptx/transform.ts","../src/pptx/svg2pptx/dispatch.ts","../src/svg/fonts.ts","../src/svg/gradient-bands.ts","../src/svg/Background.tsx","../src/lib/conf-labels.ts","../src/themes/manifest.ts","../src/svg/variety.ts","../src/svg/MasterChrome.tsx","../src/svg/SlideDecor.tsx","../src/svg/ImagePages.tsx","../src/lib/svg-text-layout.ts","../src/svg/emphasis.ts","../src/svg/blocks/paragraph.tsx","../src/svg/blocks/bullets.tsx","../src/svg/blocks/quote.tsx","../src/svg/icons.tsx","../src/svg/blocks/callout.tsx","../src/svg/blocks/code.tsx","../src/svg/blocks/kpi.tsx","../src/svg/blocks/image.tsx","../src/svg/blocks/image-grid.tsx","../src/svg/blocks/image-compare.tsx","../src/svg/blocks/chart-svg.tsx","../src/svg/blocks/chart.tsx","../src/svg/blocks/flowchart.tsx","../src/svg/blocks/architecture.tsx","../src/svg/blocks/timeline.tsx","../src/svg/blocks/comparison.tsx","../src/svg/blocks/icon-cards.tsx","../src/svg/blocks/numbered-cards.tsx","../src/svg/blocks/rings.tsx","../src/svg/blocks/row-cards.tsx","../src/svg/blocks/steps.tsx","../src/svg/blocks/roadmap.tsx","../src/svg/blocks/matrix.tsx","../src/svg/blocks/insight_panel.tsx","../src/svg/blocks/verdict-banner.tsx","../src/svg/blocks/citation.tsx","../src/svg/blocks/index.tsx","../src/svg/layout.ts","../src/svg/archetypes/cover-banner-title.tsx","../src/svg/heading-fit.ts","../src/svg/archetypes/cover-poster-center.tsx","../src/svg/archetypes/cover-split-diagonal.tsx","../src/svg/archetypes/cover-left-anchor.tsx","../src/svg/archetypes/cover-constellation.tsx","../src/svg/archetypes/cover-editorial-masthead.tsx","../src/svg/archetypes/cover-tone-adaptive-header.tsx","../src/svg/archetypes/cover-fashion-masthead.tsx","../src/svg/archetypes/index.ts","../src/lib/derive.ts","../src/svg/archetypes/chapter-masthead-chapter.tsx","../src/svg/archetypes/chapter-constellation-chapter.tsx","../src/svg/archetypes/chapter-rail-chapter.tsx","../src/svg/archetypes/chapter-banner-chapter.tsx","../src/svg/archetypes/chapter-poster-chapter.tsx","../src/svg/archetypes/chapter-roman-chapter.tsx","../src/svg/archetypes/chapter-tone-adaptive-chapter.tsx","../src/svg/archetypes/chapter-fashion-chapter.tsx","../src/svg/archetypes/index-chapter.ts","../src/svg/AssertionEvidence.tsx","../src/svg/BigNumber.tsx","../src/svg/ImageSplit.tsx","../src/svg/SvgContent.tsx","../src/svg/archetypes/content-narrow-column.tsx","../src/svg/archetypes/content-two-column.tsx","../src/svg/archetypes/content-rail-numbered.tsx","../src/svg/archetypes/content-banner-heading.tsx","../src/svg/archetypes/content-stacked-poster.tsx","../src/svg/archetypes/content-tone-adaptive-content.tsx","../src/svg/bento-layout.ts","../src/svg/archetypes/content-bento-panel.tsx","../src/svg/archetypes/index-content.ts","../src/svg/archetypes/ending-masthead-ending.tsx","../src/svg/archetypes/ending-constellation-ending.tsx","../src/svg/archetypes/ending-rail-ending.tsx","../src/svg/archetypes/ending-banner-ending.tsx","../src/svg/archetypes/ending-poster-ending.tsx","../src/svg/archetypes/ending-tone-adaptive-ending.tsx","../src/svg/archetypes/ending-fashion-ending.tsx","../src/svg/archetypes/index-ending.ts","../src/svg/archetypes/motif-corner-ornament-motif.tsx","../src/svg/archetypes/motif-rail-motif.tsx","../src/svg/archetypes/motif-banner-motif.tsx","../src/svg/archetypes/motif-poster-motif.tsx","../src/svg/archetypes/motif-tone-adaptive-motif.tsx","../src/svg/archetypes/motif-constellation-motif.tsx","../src/svg/archetypes/motif-campaign-motif.tsx","../src/svg/archetypes/motif-bloom-motif.tsx","../src/svg/archetypes/motif-classroom-motif.tsx","../src/svg/archetypes/motif-ink-motif.tsx","../src/svg/archetypes/motif-luxe-motif.tsx","../src/svg/archetypes/motif-enterprise-motif.tsx","../src/svg/archetypes/motif-heritage-motif.tsx","../src/svg/archetypes/index-motif.ts","../src/svg/FullSlideSvg.tsx","../src/svg/serialize.ts","../src/pptx/pptx-dedupe-media.ts","../src/pptx/generate.ts","../src/svg/audit/capacity.ts","../src/svg/ir-quality.ts"],"sourcesContent":["export const VERSION = \"0.1.0\"\n","/** Error class thrown by pptfast's public API surface (validation, rendering, export). */\nexport class PptfastError extends Error {}\n","import { z } from \"zod\"\nimport { PPTX_ICON_NAMES } from \"@/icons\"\n\nexport const THEME_IDS = [\n \"consulting\",\n \"enterprise\",\n \"academic\",\n \"insight\",\n \"campaign\",\n \"bloom\",\n \"classroom\",\n \"ink\",\n \"tech\",\n \"runway\",\n \"journal\",\n \"luxe\",\n \"heritage\",\n] as const\n\nconst Hex = z.string().regex(/^#[0-9A-Fa-f]{3,8}$/)\n\n// ── Background(slide 级受限覆写)──\n\nconst BackgroundSpecSchema = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"color\"), value: Hex }).strict(),\n z\n .object({\n kind: z.literal(\"gradient\"),\n from: Hex,\n to: Hex,\n direction: z.enum([\"tb\", \"lr\", \"diagonal\"]).optional(),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"asset\"),\n asset_id: z.string(),\n overlay: z\n .object({ color: Hex, opacity: z.number().min(0).max(1) })\n .strict()\n .optional(),\n fit: z.enum([\"cover\", \"contain\"]).optional(),\n })\n .strict(),\n])\n\n// ── Theme / Meta / Assets / Brand ──\n\nconst ThemeSchema = z\n .object({\n id: z.enum(THEME_IDS),\n override: z\n .object({\n primary: Hex.optional(),\n accent: Hex.optional(),\n font_heading: z.array(z.string()).optional(),\n font_body: z.array(z.string()).optional(),\n })\n .strict()\n .optional(),\n })\n .strict()\n\nconst MetaSchema = z\n .object({\n organization: z.string().optional(),\n authors: z\n .array(\n z\n .object({\n name: z.string(),\n role: z.string().optional(),\n org: z.string().optional(),\n })\n .strict()\n )\n .optional(),\n date: z.string().optional(),\n version: z.string().optional(),\n confidentiality: z\n .enum([\"public\", \"internal\", \"confidential\", \"restricted\"])\n .optional(),\n contact: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n phone: z.string().optional(),\n website: z.string().optional(),\n })\n .strict()\n .optional(),\n copyright: z.string().optional(),\n // Deck-level animation switch (波次 C). Omitted entirely = default\n // behavior: page-transition fade on, per-block entrance animations off.\n // `transition: \"none\"` opts a deck out of the default fade transition.\n // `elements: \"auto\"` opts into per-block entrance animations (S3, wired —\n // see `pptx-generate.ts`'s `applyElementAnimations` call, gated on this\n // exact flag).\n animation: z\n .object({\n transition: z.enum([\"fade\", \"push\", \"wipe\", \"none\"]).optional(),\n elements: z.enum([\"none\", \"auto\"]).optional(),\n })\n .strict()\n .optional(),\n })\n .strict()\n\nconst AssetSchema = z\n .object({\n src: z.string(),\n alt: z.string().optional(),\n error: z.string().optional(),\n })\n .strict()\n\nconst AssetsSchema = z\n .object({ images: z.record(z.string(), AssetSchema).default({}) })\n .strict()\n\nconst BrandSchema = z\n .object({\n logo_asset_id: z.string().optional(),\n position: z.enum([\"tl\", \"tr\", \"bl\", \"br\"]).optional(),\n })\n .strict()\n\n// ── Blocks(19 种)──\n\nconst BlockSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"bullets\"),\n items: z.array(z.string()),\n style: z.enum([\"default\", \"checklist\", \"numbered\", \"plain\", \"divided\"]).optional(),\n })\n .strict(),\n z.object({ type: z.literal(\"paragraph\"), text: z.string() }).strict(),\n z\n .object({\n type: z.literal(\"quote\"),\n text: z.string(),\n attribution: z.string().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"callout\"),\n variant: z.enum([\"info\", \"warn\", \"tip\"]),\n text: z.string(),\n icon: z.enum(PPTX_ICON_NAMES).optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"code\"),\n language: z.string(),\n code: z.string(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"kpi_cards\"),\n items: z.array(\n z\n .object({\n value: z.string(),\n unit: z.string().optional(),\n label: z.string(),\n delta: z.enum([\"up\", \"down\", \"flat\"]).optional(),\n icon: z.enum(PPTX_ICON_NAMES).optional(),\n /** 数据来源小字(财经信任语言,2026-07-12 借鉴),如\n * 「来源: Crunchbase」。 */\n source: z.string().optional(),\n })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"chart\"),\n /** dumbbell(2026-07-12 借鉴):哑铃变化图——series[0]=起点值、\n * series[1]=终点值(等长同 x 标签),每行「起点●———●终点」显变化。\n * bar 可加 direction:\"horizontal\" 横条排名(长标签友好)。\n * pie 可加 style:\"donut\" 环形+中心总值。 */\n chart_type: z.enum([\"bar\", \"line\", \"pie\", \"funnel\", \"dumbbell\"]),\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n style: z.enum([\"donut\"]).optional(),\n axes: z\n .object({\n x_title: z.string().optional(),\n y_title: z.string().optional(),\n show_grid: z.boolean().optional(),\n })\n .strict()\n .optional(),\n series: z.array(\n z\n .object({\n name: z.string(),\n data: z.array(\n z\n .object({\n x: z.union([z.string(), z.number()]),\n y: z.number(),\n })\n .strict()\n ),\n })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"flowchart\"),\n nodes: z\n .array(\n z\n .object({\n id: z.string(),\n label: z.string(),\n kind: z.enum([\"rect\", \"diamond\", \"round\"]).optional(),\n })\n .strict()\n )\n .max(20),\n edges: z.array(\n z\n .object({\n from: z.string(),\n to: z.string(),\n label: z.string().optional(),\n })\n .strict()\n ),\n direction: z.enum([\"TB\", \"TD\", \"BT\", \"LR\", \"RL\"]).optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"architecture\"),\n layers: z.array(\n z\n .object({ title: z.string(), items: z.array(z.string()) })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"timeline\"),\n /** 版式:缺省 horizontal(存量语义)。vertical=左 date/中轴圆点/右\n * 标题描述的编辑部竖排时间线,适合 4-8 个叙事型节点。 */\n layout: z.enum([\"horizontal\", \"vertical\"]).optional(),\n milestones: z.array(\n z\n .object({\n date: z.string(),\n title: z.string(),\n desc: z.string().optional(),\n /** 强调节点:accent 色 + 大圆点(时间线上的「转折点」语义)。 */\n highlight: z.boolean().optional(),\n })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"comparison\"),\n columns: z.array(z.string()),\n rows: z.array(\n z\n .object({ label: z.string(), cells: z.array(z.string()) })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"icon_cards\"),\n /** 2-4 项单行并列,5-6 项自动 2 行 3 列宫格(2026-07-11 用户借鉴)。 */\n items: z\n .array(\n z\n .object({\n icon: z.enum(PPTX_ICON_NAMES),\n title: z.string(),\n text: z.string(),\n })\n .strict()\n )\n .min(2)\n .max(6),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"row_cards\"),\n /** 全宽横向长卡列表(编号圆圈 + 可选图标 + 三级文字),3-6 项纵向\n * 堆叠,highlight 项 accent 描边强调。适合成果一览/贡献清单/议题列表\n * 这类每项信息量较大的枚举。 */\n items: z\n .array(\n z\n .object({\n icon: z.enum(PPTX_ICON_NAMES).optional(),\n title: z.string(),\n text: z.string().optional(),\n sub: z.string().optional(),\n highlight: z.boolean().optional(),\n })\n .strict()\n )\n .min(3)\n .max(6),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"steps\"),\n items: z\n .array(\n z\n .object({\n title: z.string(),\n text: z.string(),\n })\n .strict()\n )\n .min(2)\n .max(5),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"rings\"),\n /** 分层同心圆环(洋葱模型):items 从内核到外层排序(items[0]=内核\n * 实心圆)。每层引线标注到右侧(label 短词 ≤8 字,desc 一句话)。 */\n items: z\n .array(\n z\n .object({\n label: z.string(),\n desc: z.string().optional(),\n })\n .strict()\n )\n .min(2)\n .max(4),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"numbered_cards\"),\n /** 编号网格列表(编辑部大数字目录):自动编号 01..N,无卡壳左竖线\n * 分栏,适合并列名录/作品集/要点集。≤4 项单行,5-8 项两行网格。 */\n items: z\n .array(\n z\n .object({\n title: z.string(),\n text: z.string().optional(),\n sub: z.string().optional(),\n })\n .strict()\n )\n .min(3)\n .max(8),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"roadmap\"),\n /** 阶段路线图卡:2-4 个阶段横排,自动编号 01..N,每阶段含标题、\n * 可选时段(如「0-6 个月」)与若干 label:value 指标行。适合分阶段\n * 推进/路线图/里程碑规划。 */\n items: z\n .array(\n z\n .object({\n title: z.string(),\n period: z.string().optional(),\n rows: z\n .array(z.object({ label: z.string(), value: z.string() }).strict())\n .max(4)\n .optional(),\n })\n .strict()\n )\n .min(2)\n .max(4),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"matrix\"),\n /** 二维定位矩阵:带可选 XY 轴标签的色格网格,items 按行优先填格,\n * tone 决定象限底色。适合定位矩阵/象限分析/组合分类。 */\n x_title: z.string().optional(),\n y_title: z.string().optional(),\n cols: z.number().int().min(2).max(3),\n items: z\n .array(\n z\n .object({\n title: z.string(),\n tag: z.string().optional(),\n tone: z.enum([\"neutral\", \"accent\", \"info\"]).optional(),\n })\n .strict()\n )\n .min(2)\n .max(9),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"insight_panel\"),\n /** 带标题的策略/观点面板:标题压色条 + 若干 label/描述行 + 可选贴底\n * 脚注。常作 aside 侧栏块与数据并置(观点/纪律/结论)。 */\n title: z.string(),\n rows: z\n .array(z.object({ label: z.string(), text: z.string() }).strict())\n .min(1)\n .max(5),\n footnote: z.string().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"verdict_banner\"),\n text: z.string(),\n tone: z.enum([\"positive\", \"warning\", \"neutral\"]),\n icon: z.enum(PPTX_ICON_NAMES).optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"citation\"),\n sources: z.array(\n z\n .object({\n label: z.string(),\n url: z.string().optional(),\n ref: z.string().optional(),\n })\n .strict()\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"image\"),\n asset_id: z.string(),\n caption: z.string().optional(),\n // 默认 cover(2026-07-09 用户反馈:模型常选 contain letterbox 不铺满\n // ——照片一律等比铺满裁切;contain 留给图表截图等不可裁切的图)\n fit: z.enum([\"contain\", \"cover\"]).default(\"cover\"),\n })\n .strict(),\n // 图片排版 P2(2026-07-08):多图网格与双图对比。\n z\n .object({\n type: z.literal(\"image_grid\"),\n items: z\n .array(\n z\n .object({\n asset_id: z.string(),\n caption: z.string().optional(),\n })\n .strict()\n )\n .min(2)\n .max(4),\n emphasis: z.enum([\"none\", \"first\"]).optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"image_compare\"),\n left: z.object({ asset_id: z.string(), label: z.string() }).strict(),\n right: z.object({ asset_id: z.string(), label: z.string() }).strict(),\n style: z.enum([\"vs\", \"before_after\"]).optional(),\n })\n .strict(),\n])\n\n// ── Slide ──\n\nconst SlideSchema = z\n .object({\n type: z.enum([\"cover\", \"chapter\", \"content\", \"ending\"]),\n variant: z\n .enum([\n \"single\",\n \"two_column\",\n \"kpi_focus\",\n \"image_focus\",\n \"code\",\n \"quote\",\n \"big_number\",\n \"assertion_evidence\",\n // 图片排版 P3:半版大图 + 侧栏文字(第一个 image 块为图源)\n \"image_split\",\n // 图文范式族(2026-07-09,研究 ppt-master showcase):\n // image_top = 顶图三栏(上半全幅出血图 + 下方文字分列)\n // image_bottom = 上文下图(对称对话)\n // image_annotate = 中心图 + 四角放射标注(showcase P16 矩形版,\n // 不依赖 clipPath。bullets 前 4 条按「:」拆标题/说明做标注)\n \"image_top\",\n \"image_bottom\",\n \"image_annotate\",\n // aside(2026-07-12 借鉴财经简报 EDITORIAL NOTE):主内容 2/3 +\n // 观点侧栏 1/3——末位块进侧栏(放 callout/quote/kpi 巨号观点),\n // 数据与观点并置。<2 块退化 single。\n \"aside\",\n ])\n .optional(),\n heading: z.string().optional(),\n subheading: z.string().optional(),\n blocks: z.array(BlockSchema).default([]),\n background: BackgroundSpecSchema.optional(),\n // 图片排版 P4:受控装饰原语——模型只有选择权(kind + 强度 + corner_tag\n // 的文本),绘制由渲染层手写 SVG 按主题 token 着色,不接受任意图形。\n decor: z\n .object({\n kind: z.enum([\"big_number\", \"corner_tag\", \"rule_line\", \"quote_marks\", \"geo_dots\"]),\n intensity: z.enum([\"subtle\", \"normal\"]).optional(),\n text: z.string().max(12).optional(),\n })\n .strict()\n .optional(),\n // 仅 image_split 用:图列在左还是右(缺省 left;ppt-master P04 右图出血)\n image_side: z.enum([\"left\", \"right\"]).optional(),\n footnote: z.string().optional(),\n })\n .strict()\n\n// ── 顶层 IR ──\n\nexport const PptxIRSchema = z\n .object({\n version: z.literal(\"2\"),\n filename: z.string(),\n theme: ThemeSchema,\n meta: MetaSchema.default({}),\n assets: AssetsSchema.default({ images: {} }),\n brand: BrandSchema.optional(),\n slides: z.array(SlideSchema),\n })\n .strict()\n\nexport type PptxIR = z.infer<typeof PptxIRSchema>\nexport type Block = z.infer<typeof BlockSchema>\nexport type BackgroundSpec = z.infer<typeof BackgroundSpecSchema>\nexport type Slide = z.infer<typeof SlideSchema>\nexport type Assets = z.infer<typeof AssetsSchema>\nexport type Meta = z.infer<typeof MetaSchema>\nexport type Brand = z.infer<typeof BrandSchema>\n\n// Block sub-types (extracted from BlockSchema union members)\nexport type KpiItem = {\n value: string\n unit?: string\n label: string\n delta?: \"up\" | \"down\" | \"flat\"\n}\nexport type ChartSeries = {\n name: string\n data: { x: string | number; y: number }[]\n}\nexport type FlowNode = {\n id: string\n label: string\n kind?: \"rect\" | \"diamond\" | \"round\"\n}\nexport type FlowEdge = { from: string; to: string; label?: string }\nexport type ArchitectureLayer = { title: string; items: string[] }\nexport type TimelineMilestone = { date: string; title: string; desc?: string }\nexport type ComparisonRow = { label: string; cells: string[] }\nexport type CitationSource = { label: string; url?: string; ref?: string }\n\nexport function parsePptxIR(\n json: unknown\n): { success: true; data: PptxIR } | { success: false; error: string } {\n const result = PptxIRSchema.safeParse(json)\n if (result.success) return { success: true, data: result.data }\n return {\n success: false,\n error: result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\"),\n }\n}\n","/**\n * PPTX 图标目录(生成文件,勿手改)。\n * 由 scripts/gen-pptx-icons.mts 从 lucide-react v1.7.0(ISC License)提取。\n * 单源:zod 枚举(IR)与 svg 渲染共用。ops-kb pydantic Literal 手工镜像。\n * 重新生成:pnpm exec tsx scripts/gen-pptx-icons.mts\n */\n\n/** SVG 原语:与 svg2pptx 受控子集一致(path 含贝塞尔、circle/rect/line/polyline/polygon)。 */\nexport type PptxIconPrimitive = readonly [tag: string, attrs: Readonly<Record<string, string>>]\n\nexport const PPTX_ICONS: Readonly<Record<string, readonly PptxIconPrimitive[]>> = {\n \"info\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M12 16v-4\"}],[\"path\",{\"d\":\"M12 8h.01\"}]],\n \"triangle-alert\": [[\"path\",{\"d\":\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"}],[\"path\",{\"d\":\"M12 9v4\"}],[\"path\",{\"d\":\"M12 17h.01\"}]],\n \"lightbulb\": [[\"path\",{\"d\":\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"}],[\"path\",{\"d\":\"M9 18h6\"}],[\"path\",{\"d\":\"M10 22h4\"}]],\n \"check\": [[\"path\",{\"d\":\"M20 6 9 17l-5-5\"}]],\n \"circle-check\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"m9 12 2 2 4-4\"}]],\n \"circle-x\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"m15 9-6 6\"}],[\"path\",{\"d\":\"m9 9 6 6\"}]],\n \"circle-alert\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"8\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12.01\",\"y1\":\"16\",\"y2\":\"16\"}]],\n \"trending-up\": [[\"path\",{\"d\":\"M16 7h6v6\"}],[\"path\",{\"d\":\"m22 7-8.5 8.5-5-5L2 17\"}]],\n \"trending-down\": [[\"path\",{\"d\":\"M16 17h6v-6\"}],[\"path\",{\"d\":\"m22 17-8.5-8.5-5 5L2 7\"}]],\n \"activity\": [[\"path\",{\"d\":\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\"}]],\n \"chart-column\": [[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"M18 17V9\"}],[\"path\",{\"d\":\"M13 17V5\"}],[\"path\",{\"d\":\"M8 17v-3\"}]],\n \"chart-line\": [[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"m19 9-5 5-4-4-3 3\"}]],\n \"chart-pie\": [[\"path\",{\"d\":\"M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z\"}],[\"path\",{\"d\":\"M21.21 15.89A10 10 0 1 1 8 2.83\"}]],\n \"gauge\": [[\"path\",{\"d\":\"m12 14 4-4\"}],[\"path\",{\"d\":\"M3.34 19a10 10 0 1 1 17.32 0\"}]],\n \"server\": [[\"rect\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"2\",\"rx\":\"2\",\"ry\":\"2\"}],[\"rect\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\",\"ry\":\"2\"}],[\"line\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"6\",\"y2\":\"6\"}],[\"line\",{\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"18\",\"y2\":\"18\"}]],\n \"database\": [[\"ellipse\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],[\"path\",{\"d\":\"M3 5V19A9 3 0 0 0 21 19V5\"}],[\"path\",{\"d\":\"M3 12A9 3 0 0 0 21 12\"}]],\n \"hard-drive\": [[\"path\",{\"d\":\"M10 16h.01\"}],[\"path\",{\"d\":\"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"}],[\"path\",{\"d\":\"M21.946 12.013H2.054\"}],[\"path\",{\"d\":\"M6 16h.01\"}]],\n \"cpu\": [[\"path\",{\"d\":\"M12 20v2\"}],[\"path\",{\"d\":\"M12 2v2\"}],[\"path\",{\"d\":\"M17 20v2\"}],[\"path\",{\"d\":\"M17 2v2\"}],[\"path\",{\"d\":\"M2 12h2\"}],[\"path\",{\"d\":\"M2 17h2\"}],[\"path\",{\"d\":\"M2 7h2\"}],[\"path\",{\"d\":\"M20 12h2\"}],[\"path\",{\"d\":\"M20 17h2\"}],[\"path\",{\"d\":\"M20 7h2\"}],[\"path\",{\"d\":\"M7 20v2\"}],[\"path\",{\"d\":\"M7 2v2\"}],[\"rect\",{\"x\":\"4\",\"y\":\"4\",\"width\":\"16\",\"height\":\"16\",\"rx\":\"2\"}],[\"rect\",{\"x\":\"8\",\"y\":\"8\",\"width\":\"8\",\"height\":\"8\",\"rx\":\"1\"}]],\n \"cloud\": [[\"path\",{\"d\":\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\"}]],\n \"network\": [[\"rect\",{\"x\":\"16\",\"y\":\"16\",\"width\":\"6\",\"height\":\"6\",\"rx\":\"1\"}],[\"rect\",{\"x\":\"2\",\"y\":\"16\",\"width\":\"6\",\"height\":\"6\",\"rx\":\"1\"}],[\"rect\",{\"x\":\"9\",\"y\":\"2\",\"width\":\"6\",\"height\":\"6\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\"}],[\"path\",{\"d\":\"M12 12V8\"}]],\n \"globe\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"}],[\"path\",{\"d\":\"M2 12h20\"}]],\n \"layers\": [[\"path\",{\"d\":\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"}],[\"path\",{\"d\":\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\"}],[\"path\",{\"d\":\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\"}]],\n \"package\": [[\"path\",{\"d\":\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\"}],[\"path\",{\"d\":\"M12 22V12\"}],[\"polyline\",{\"points\":\"3.29 7 12 12 20.71 7\"}],[\"path\",{\"d\":\"m7.5 4.27 9 5.15\"}]],\n \"boxes\": [[\"path\",{\"d\":\"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z\"}],[\"path\",{\"d\":\"m7 16.5-4.74-2.85\"}],[\"path\",{\"d\":\"m7 16.5 5-3\"}],[\"path\",{\"d\":\"M7 16.5v5.17\"}],[\"path\",{\"d\":\"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z\"}],[\"path\",{\"d\":\"m17 16.5-5-3\"}],[\"path\",{\"d\":\"m17 16.5 4.74-2.85\"}],[\"path\",{\"d\":\"M17 16.5v5.17\"}],[\"path\",{\"d\":\"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z\"}],[\"path\",{\"d\":\"M12 8 7.26 5.15\"}],[\"path\",{\"d\":\"m12 8 4.74-2.85\"}],[\"path\",{\"d\":\"M12 13.5V8\"}]],\n \"shield\": [[\"path\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}]],\n \"shield-check\": [[\"path\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}],[\"path\",{\"d\":\"m9 12 2 2 4-4\"}]],\n \"lock\": [[\"rect\",{\"width\":\"18\",\"height\":\"11\",\"x\":\"3\",\"y\":\"11\",\"rx\":\"2\",\"ry\":\"2\"}],[\"path\",{\"d\":\"M7 11V7a5 5 0 0 1 10 0v4\"}]],\n \"key\": [[\"path\",{\"d\":\"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\"}],[\"path\",{\"d\":\"m21 2-9.6 9.6\"}],[\"circle\",{\"cx\":\"7.5\",\"cy\":\"15.5\",\"r\":\"5.5\"}]],\n \"users\": [[\"path\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"path\",{\"d\":\"M16 3.128a4 4 0 0 1 0 7.744\"}],[\"path\",{\"d\":\"M22 21v-2a4 4 0 0 0-3-3.87\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}]],\n \"user\": [[\"path\",{\"d\":\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"7\",\"r\":\"4\"}]],\n \"handshake\": [[\"path\",{\"d\":\"m11 17 2 2a1 1 0 1 0 3-3\"}],[\"path\",{\"d\":\"m14 14 2.5 2.5a1 1 0 1 0 3-3l-3.88-3.88a3 3 0 0 0-4.24 0l-.88.88a1 1 0 1 1-3-3l2.81-2.81a5.79 5.79 0 0 1 7.06-.87l.47.28a2 2 0 0 0 1.42.25L21 4\"}],[\"path\",{\"d\":\"m21 3 1 11h-2\"}],[\"path\",{\"d\":\"M3 3 2 14l6.5 6.5a1 1 0 1 0 3-3\"}],[\"path\",{\"d\":\"M3 4h8\"}]],\n \"target\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"6\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}]],\n \"rocket\": [[\"path\",{\"d\":\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"}],[\"path\",{\"d\":\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\"}],[\"path\",{\"d\":\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\"}],[\"path\",{\"d\":\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"}]],\n \"flag\": [[\"path\",{\"d\":\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\"}]],\n \"zap\": [[\"path\",{\"d\":\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"}]],\n \"wrench\": [[\"path\",{\"d\":\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"}]],\n \"settings\": [[\"path\",{\"d\":\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}]],\n \"search\": [[\"path\",{\"d\":\"m21 21-4.34-4.34\"}],[\"circle\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}]],\n \"git-branch\": [[\"path\",{\"d\":\"M15 6a9 9 0 0 0-9 9V3\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"6\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"18\",\"r\":\"3\"}]],\n \"refresh-cw\": [[\"path\",{\"d\":\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"}],[\"path\",{\"d\":\"M21 3v5h-5\"}],[\"path\",{\"d\":\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"}],[\"path\",{\"d\":\"M8 16H3v5\"}]],\n \"clock\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M12 6v6l4 2\"}]],\n \"calendar\": [[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 10h18\"}]],\n \"download\": [[\"path\",{\"d\":\"M12 15V3\"}],[\"path\",{\"d\":\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"}],[\"path\",{\"d\":\"m7 10 5 5 5-5\"}]],\n \"upload\": [[\"path\",{\"d\":\"M12 3v12\"}],[\"path\",{\"d\":\"m17 8-5-5-5 5\"}],[\"path\",{\"d\":\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"}]],\n \"link\": [[\"path\",{\"d\":\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"}],[\"path\",{\"d\":\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"}]],\n \"dollar-sign\": [[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"2\",\"y2\":\"22\"}],[\"path\",{\"d\":\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"}]],\n \"percent\": [[\"line\",{\"x1\":\"19\",\"x2\":\"5\",\"y1\":\"5\",\"y2\":\"19\"}],[\"circle\",{\"cx\":\"6.5\",\"cy\":\"6.5\",\"r\":\"2.5\"}],[\"circle\",{\"cx\":\"17.5\",\"cy\":\"17.5\",\"r\":\"2.5\"}]],\n \"briefcase\": [[\"path\",{\"d\":\"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"}],[\"rect\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"6\",\"rx\":\"2\"}]],\n \"file-text\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M10 9H8\"}],[\"path\",{\"d\":\"M16 13H8\"}],[\"path\",{\"d\":\"M16 17H8\"}]],\n \"folder\": [[\"path\",{\"d\":\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"}]],\n \"monitor\": [[\"rect\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"3\",\"rx\":\"2\"}],[\"line\",{\"x1\":\"8\",\"x2\":\"16\",\"y1\":\"21\",\"y2\":\"21\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"17\",\"y2\":\"21\"}]],\n \"laptop\": [[\"path\",{\"d\":\"M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z\"}],[\"path\",{\"d\":\"M20.054 15.987H3.946\"}]],\n \"smartphone\": [[\"rect\",{\"width\":\"14\",\"height\":\"20\",\"x\":\"5\",\"y\":\"2\",\"rx\":\"2\",\"ry\":\"2\"}],[\"path\",{\"d\":\"M12 18h.01\"}]],\n \"terminal\": [[\"path\",{\"d\":\"M12 19h8\"}],[\"path\",{\"d\":\"m4 17 6-6-6-6\"}]],\n \"bug\": [[\"path\",{\"d\":\"M12 20v-9\"}],[\"path\",{\"d\":\"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\"}],[\"path\",{\"d\":\"M14.12 3.88 16 2\"}],[\"path\",{\"d\":\"M21 21a4 4 0 0 0-3.81-4\"}],[\"path\",{\"d\":\"M21 5a4 4 0 0 1-3.55 3.97\"}],[\"path\",{\"d\":\"M22 13h-4\"}],[\"path\",{\"d\":\"M3 21a4 4 0 0 1 3.81-4\"}],[\"path\",{\"d\":\"M3 5a4 4 0 0 0 3.55 3.97\"}],[\"path\",{\"d\":\"M6 13H2\"}],[\"path\",{\"d\":\"m8 2 1.88 1.88\"}],[\"path\",{\"d\":\"M9 7.13V6a3 3 0 1 1 6 0v1.13\"}]],\n \"code\": [[\"path\",{\"d\":\"m16 18 6-6-6-6\"}],[\"path\",{\"d\":\"m8 6-6 6 6 6\"}]],\n \"workflow\": [[\"rect\",{\"width\":\"8\",\"height\":\"8\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M7 11v4a2 2 0 0 0 2 2h4\"}],[\"rect\",{\"width\":\"8\",\"height\":\"8\",\"x\":\"13\",\"y\":\"13\",\"rx\":\"2\"}]],\n \"git-merge\": [[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M6 21V9a9 9 0 0 0 9 9\"}]],\n \"git-pull-request\": [[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M13 6h3a2 2 0 0 1 2 2v7\"}],[\"line\",{\"x1\":\"6\",\"x2\":\"6\",\"y1\":\"9\",\"y2\":\"21\"}]],\n \"component\": [[\"path\",{\"d\":\"M15.536 11.293a1 1 0 0 0 0 1.414l2.376 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z\"}],[\"path\",{\"d\":\"M2.297 11.293a1 1 0 0 0 0 1.414l2.377 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414L6.088 8.916a1 1 0 0 0-1.414 0z\"}],[\"path\",{\"d\":\"M8.916 17.912a1 1 0 0 0 0 1.415l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.415l-2.377-2.376a1 1 0 0 0-1.414 0z\"}],[\"path\",{\"d\":\"M8.916 4.674a1 1 0 0 0 0 1.414l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z\"}]],\n \"blocks\": [[\"path\",{\"d\":\"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2\"}],[\"rect\",{\"x\":\"14\",\"y\":\"2\",\"width\":\"8\",\"height\":\"8\",\"rx\":\"1\"}]],\n \"container\": [[\"path\",{\"d\":\"M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z\"}],[\"path\",{\"d\":\"M10 21.9V14L2.1 9.1\"}],[\"path\",{\"d\":\"m10 14 11.9-6.9\"}],[\"path\",{\"d\":\"M14 19.8v-8.1\"}],[\"path\",{\"d\":\"M18 17.5V9.4\"}]],\n \"cog\": [[\"path\",{\"d\":\"M11 10.27 7 3.34\"}],[\"path\",{\"d\":\"m11 13.73-4 6.93\"}],[\"path\",{\"d\":\"M12 22v-2\"}],[\"path\",{\"d\":\"M12 2v2\"}],[\"path\",{\"d\":\"M14 12h8\"}],[\"path\",{\"d\":\"m17 20.66-1-1.73\"}],[\"path\",{\"d\":\"m17 3.34-1 1.73\"}],[\"path\",{\"d\":\"M2 12h2\"}],[\"path\",{\"d\":\"m20.66 17-1.73-1\"}],[\"path\",{\"d\":\"m20.66 7-1.73 1\"}],[\"path\",{\"d\":\"m3.34 17 1.73-1\"}],[\"path\",{\"d\":\"m3.34 7 1.73 1\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"8\"}]],\n \"puzzle\": [[\"path\",{\"d\":\"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\"}]],\n \"list-checks\": [[\"path\",{\"d\":\"M13 5h8\"}],[\"path\",{\"d\":\"M13 12h8\"}],[\"path\",{\"d\":\"M13 19h8\"}],[\"path\",{\"d\":\"m3 17 2 2 4-4\"}],[\"path\",{\"d\":\"m3 7 2 2 4-4\"}]],\n \"clipboard-list\": [[\"rect\",{\"width\":\"8\",\"height\":\"4\",\"x\":\"8\",\"y\":\"2\",\"rx\":\"1\",\"ry\":\"1\"}],[\"path\",{\"d\":\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"}],[\"path\",{\"d\":\"M12 11h4\"}],[\"path\",{\"d\":\"M12 16h4\"}],[\"path\",{\"d\":\"M8 11h.01\"}],[\"path\",{\"d\":\"M8 16h.01\"}]],\n \"clipboard-check\": [[\"rect\",{\"width\":\"8\",\"height\":\"4\",\"x\":\"8\",\"y\":\"2\",\"rx\":\"1\",\"ry\":\"1\"}],[\"path\",{\"d\":\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"}],[\"path\",{\"d\":\"m9 14 2 2 4-4\"}]],\n \"book-open\": [[\"path\",{\"d\":\"M12 7v14\"}],[\"path\",{\"d\":\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"}]],\n \"files\": [[\"path\",{\"d\":\"M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8\"}],[\"path\",{\"d\":\"M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706z\"}],[\"path\",{\"d\":\"M5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1\"}]],\n \"archive\": [[\"rect\",{\"width\":\"20\",\"height\":\"5\",\"x\":\"2\",\"y\":\"3\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\"}],[\"path\",{\"d\":\"M10 12h4\"}]],\n \"file-check\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"m9 15 2 2 4-4\"}]],\n \"file-plus\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M9 15h6\"}],[\"path\",{\"d\":\"M12 18v-6\"}]],\n \"file-search\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"circle\",{\"cx\":\"11.5\",\"cy\":\"14.5\",\"r\":\"2.5\"}],[\"path\",{\"d\":\"M13.3 16.3 15 18\"}]],\n \"inbox\": [[\"polyline\",{\"points\":\"22 12 16 12 14 15 10 15 8 12 2 12\"}],[\"path\",{\"d\":\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"}]],\n \"send\": [[\"path\",{\"d\":\"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\"}],[\"path\",{\"d\":\"m21.854 2.147-10.94 10.939\"}]],\n \"list\": [[\"path\",{\"d\":\"M3 5h.01\"}],[\"path\",{\"d\":\"M3 12h.01\"}],[\"path\",{\"d\":\"M3 19h.01\"}],[\"path\",{\"d\":\"M8 5h13\"}],[\"path\",{\"d\":\"M8 12h13\"}],[\"path\",{\"d\":\"M8 19h13\"}]],\n \"list-ordered\": [[\"path\",{\"d\":\"M11 5h10\"}],[\"path\",{\"d\":\"M11 12h10\"}],[\"path\",{\"d\":\"M11 19h10\"}],[\"path\",{\"d\":\"M4 4h1v5\"}],[\"path\",{\"d\":\"M4 9h2\"}],[\"path\",{\"d\":\"M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02\"}]],\n \"table\": [[\"path\",{\"d\":\"M12 3v18\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 9h18\"}],[\"path\",{\"d\":\"M3 15h18\"}]],\n \"award\": [[\"path\",{\"d\":\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"8\",\"r\":\"6\"}]],\n \"trophy\": [[\"path\",{\"d\":\"M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978\"}],[\"path\",{\"d\":\"M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978\"}],[\"path\",{\"d\":\"M18 9h1.5a1 1 0 0 0 0-5H18\"}],[\"path\",{\"d\":\"M4 22h16\"}],[\"path\",{\"d\":\"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z\"}],[\"path\",{\"d\":\"M6 9H4.5a1 1 0 0 1 0-5H6\"}]],\n \"medal\": [[\"path\",{\"d\":\"M7.21 15 2.66 7.14a2 2 0 0 1 .13-2.2L4.4 2.8A2 2 0 0 1 6 2h12a2 2 0 0 1 1.6.8l1.6 2.14a2 2 0 0 1 .14 2.2L16.79 15\"}],[\"path\",{\"d\":\"M11 12 5.12 2.2\"}],[\"path\",{\"d\":\"m13 12 5.88-9.8\"}],[\"path\",{\"d\":\"M8 7h8\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"17\",\"r\":\"5\"}],[\"path\",{\"d\":\"M12 18v-2h-.5\"}]],\n \"star\": [[\"path\",{\"d\":\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"}]],\n \"heart\": [[\"path\",{\"d\":\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\"}]],\n \"thumbs-up\": [[\"path\",{\"d\":\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\"}],[\"path\",{\"d\":\"M7 10v12\"}]],\n \"crown\": [[\"path\",{\"d\":\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\"}],[\"path\",{\"d\":\"M5 21h14\"}]],\n \"badge-check\": [[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"}],[\"path\",{\"d\":\"m9 12 2 2 4-4\"}]],\n \"bell\": [[\"path\",{\"d\":\"M10.268 21a2 2 0 0 0 3.464 0\"}],[\"path\",{\"d\":\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\"}]],\n \"megaphone\": [[\"path\",{\"d\":\"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\"}],[\"path\",{\"d\":\"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\"}],[\"path\",{\"d\":\"M8 6v8\"}]],\n \"mail\": [[\"path\",{\"d\":\"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"}],[\"rect\",{\"x\":\"2\",\"y\":\"4\",\"width\":\"20\",\"height\":\"16\",\"rx\":\"2\"}]],\n \"message-square\": [[\"path\",{\"d\":\"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\"}]],\n \"phone\": [[\"path\",{\"d\":\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\"}]],\n \"video\": [[\"path\",{\"d\":\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\"}],[\"rect\",{\"x\":\"2\",\"y\":\"6\",\"width\":\"14\",\"height\":\"12\",\"rx\":\"2\"}]],\n \"camera\": [[\"path\",{\"d\":\"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"13\",\"r\":\"3\"}]],\n \"mic\": [[\"path\",{\"d\":\"M12 19v3\"}],[\"path\",{\"d\":\"M19 10v2a7 7 0 0 1-14 0v-2\"}],[\"rect\",{\"x\":\"9\",\"y\":\"2\",\"width\":\"6\",\"height\":\"13\",\"rx\":\"3\"}]],\n \"share-2\": [[\"circle\",{\"cx\":\"18\",\"cy\":\"5\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"12\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"19\",\"r\":\"3\"}],[\"line\",{\"x1\":\"8.59\",\"x2\":\"15.42\",\"y1\":\"13.51\",\"y2\":\"17.49\"}],[\"line\",{\"x1\":\"15.41\",\"x2\":\"8.59\",\"y1\":\"6.51\",\"y2\":\"10.49\"}]],\n \"external-link\": [[\"path\",{\"d\":\"M15 3h6v6\"}],[\"path\",{\"d\":\"M10 14 21 3\"}],[\"path\",{\"d\":\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"}]],\n \"qr-code\": [[\"rect\",{\"width\":\"5\",\"height\":\"5\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"5\",\"height\":\"5\",\"x\":\"16\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"5\",\"height\":\"5\",\"x\":\"3\",\"y\":\"16\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M21 16h-3a2 2 0 0 0-2 2v3\"}],[\"path\",{\"d\":\"M21 21v.01\"}],[\"path\",{\"d\":\"M12 7v3a2 2 0 0 1-2 2H7\"}],[\"path\",{\"d\":\"M3 12h.01\"}],[\"path\",{\"d\":\"M12 3h.01\"}],[\"path\",{\"d\":\"M12 16v.01\"}],[\"path\",{\"d\":\"M16 12h1\"}],[\"path\",{\"d\":\"M21 12v.01\"}],[\"path\",{\"d\":\"M12 21v-1\"}]],\n \"hash\": [[\"line\",{\"x1\":\"4\",\"x2\":\"20\",\"y1\":\"9\",\"y2\":\"9\"}],[\"line\",{\"x1\":\"4\",\"x2\":\"20\",\"y1\":\"15\",\"y2\":\"15\"}],[\"line\",{\"x1\":\"10\",\"x2\":\"8\",\"y1\":\"3\",\"y2\":\"21\"}],[\"line\",{\"x1\":\"16\",\"x2\":\"14\",\"y1\":\"3\",\"y2\":\"21\"}]],\n \"at-sign\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"4\"}],[\"path\",{\"d\":\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"}]],\n \"wifi\": [[\"path\",{\"d\":\"M12 20h.01\"}],[\"path\",{\"d\":\"M2 8.82a15 15 0 0 1 20 0\"}],[\"path\",{\"d\":\"M5 12.859a10 10 0 0 1 14 0\"}],[\"path\",{\"d\":\"M8.5 16.429a5 5 0 0 1 7 0\"}]],\n \"signal\": [[\"path\",{\"d\":\"M2 20h.01\"}],[\"path\",{\"d\":\"M7 20v-4\"}],[\"path\",{\"d\":\"M12 20v-8\"}],[\"path\",{\"d\":\"M17 20V8\"}],[\"path\",{\"d\":\"M22 4v16\"}]],\n \"plug\": [[\"path\",{\"d\":\"M12 22v-5\"}],[\"path\",{\"d\":\"M15 8V2\"}],[\"path\",{\"d\":\"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z\"}],[\"path\",{\"d\":\"M9 8V2\"}]],\n \"power\": [[\"path\",{\"d\":\"M12 2v10\"}],[\"path\",{\"d\":\"M18.4 6.6a9 9 0 1 1-12.77.04\"}]],\n \"sun\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"4\"}],[\"path\",{\"d\":\"M12 2v2\"}],[\"path\",{\"d\":\"M12 20v2\"}],[\"path\",{\"d\":\"m4.93 4.93 1.41 1.41\"}],[\"path\",{\"d\":\"m17.66 17.66 1.41 1.41\"}],[\"path\",{\"d\":\"M2 12h2\"}],[\"path\",{\"d\":\"M20 12h2\"}],[\"path\",{\"d\":\"m6.34 17.66-1.41 1.41\"}],[\"path\",{\"d\":\"m19.07 4.93-1.41 1.41\"}]],\n \"moon\": [[\"path\",{\"d\":\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"}]],\n \"flame\": [[\"path\",{\"d\":\"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4\"}]],\n \"droplets\": [[\"path\",{\"d\":\"M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z\"}],[\"path\",{\"d\":\"M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97\"}]],\n \"snowflake\": [[\"path\",{\"d\":\"m10 20-1.25-2.5L6 18\"}],[\"path\",{\"d\":\"M10 4 8.75 6.5 6 6\"}],[\"path\",{\"d\":\"m14 20 1.25-2.5L18 18\"}],[\"path\",{\"d\":\"m14 4 1.25 2.5L18 6\"}],[\"path\",{\"d\":\"m17 21-3-6h-4\"}],[\"path\",{\"d\":\"m17 3-3 6 1.5 3\"}],[\"path\",{\"d\":\"M2 12h6.5L10 9\"}],[\"path\",{\"d\":\"m20 10-1.5 2 1.5 2\"}],[\"path\",{\"d\":\"M22 12h-6.5L14 15\"}],[\"path\",{\"d\":\"m4 10 1.5 2L4 14\"}],[\"path\",{\"d\":\"m7 21 3-6-1.5-3\"}],[\"path\",{\"d\":\"m7 3 3 6h4\"}]],\n \"wind\": [[\"path\",{\"d\":\"M12.8 19.6A2 2 0 1 0 14 16H2\"}],[\"path\",{\"d\":\"M17.5 8a2.5 2.5 0 1 1 2 4H2\"}],[\"path\",{\"d\":\"M9.8 4.4A2 2 0 1 1 11 8H2\"}]],\n \"thermometer\": [[\"path\",{\"d\":\"M14 4v10.54a4 4 0 1 1-4 0V4a2 2 0 0 1 4 0Z\"}]],\n \"infinity\": [[\"path\",{\"d\":\"M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8\"}]],\n \"map\": [[\"path\",{\"d\":\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\"}],[\"path\",{\"d\":\"M15 5.764v15\"}],[\"path\",{\"d\":\"M9 3.236v15\"}]],\n \"map-pin\": [[\"path\",{\"d\":\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"10\",\"r\":\"3\"}]],\n \"compass\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\"}]],\n \"navigation\": [[\"polygon\",{\"points\":\"3 11 22 2 13 21 11 13 3 11\"}]],\n \"route\": [[\"circle\",{\"cx\":\"6\",\"cy\":\"19\",\"r\":\"3\"}],[\"path\",{\"d\":\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"5\",\"r\":\"3\"}]],\n \"truck\": [[\"path\",{\"d\":\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\"}],[\"path\",{\"d\":\"M15 18H9\"}],[\"path\",{\"d\":\"M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\"}],[\"circle\",{\"cx\":\"17\",\"cy\":\"18\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"7\",\"cy\":\"18\",\"r\":\"2\"}]],\n \"plane\": [[\"path\",{\"d\":\"M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z\"}]],\n \"ship\": [[\"path\",{\"d\":\"M12 10.189V14\"}],[\"path\",{\"d\":\"M12 2v3\"}],[\"path\",{\"d\":\"M19 13V7a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v6\"}],[\"path\",{\"d\":\"M19.38 20A11.6 11.6 0 0 0 21 14l-8.188-3.639a2 2 0 0 0-1.624 0L3 14a11.6 11.6 0 0 0 2.81 7.76\"}],[\"path\",{\"d\":\"M2 21c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}]],\n \"building\": [[\"path\",{\"d\":\"M12 10h.01\"}],[\"path\",{\"d\":\"M12 14h.01\"}],[\"path\",{\"d\":\"M12 6h.01\"}],[\"path\",{\"d\":\"M16 10h.01\"}],[\"path\",{\"d\":\"M16 14h.01\"}],[\"path\",{\"d\":\"M16 6h.01\"}],[\"path\",{\"d\":\"M8 10h.01\"}],[\"path\",{\"d\":\"M8 14h.01\"}],[\"path\",{\"d\":\"M8 6h.01\"}],[\"path\",{\"d\":\"M9 22v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3\"}],[\"rect\",{\"x\":\"4\",\"y\":\"2\",\"width\":\"16\",\"height\":\"20\",\"rx\":\"2\"}]],\n \"building-2\": [[\"path\",{\"d\":\"M10 12h4\"}],[\"path\",{\"d\":\"M10 8h4\"}],[\"path\",{\"d\":\"M14 21v-3a2 2 0 0 0-4 0v3\"}],[\"path\",{\"d\":\"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2\"}],[\"path\",{\"d\":\"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"}]],\n \"factory\": [[\"path\",{\"d\":\"M12 16h.01\"}],[\"path\",{\"d\":\"M16 16h.01\"}],[\"path\",{\"d\":\"M3 19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8.5a.5.5 0 0 0-.769-.422l-4.462 2.844A.5.5 0 0 1 15 10.5v-2a.5.5 0 0 0-.769-.422L9.77 10.922A.5.5 0 0 1 9 10.5V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2z\"}],[\"path\",{\"d\":\"M8 16h.01\"}]],\n \"warehouse\": [[\"path\",{\"d\":\"M18 21V10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1v11\"}],[\"path\",{\"d\":\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 1.132-1.803l7.95-3.974a2 2 0 0 1 1.837 0l7.948 3.974A2 2 0 0 1 22 8z\"}],[\"path\",{\"d\":\"M6 13h12\"}],[\"path\",{\"d\":\"M6 17h12\"}]],\n \"store\": [[\"path\",{\"d\":\"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5\"}],[\"path\",{\"d\":\"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244\"}],[\"path\",{\"d\":\"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05\"}]],\n \"home\": [[\"path\",{\"d\":\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\"}],[\"path\",{\"d\":\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"}]],\n \"landmark\": [[\"path\",{\"d\":\"M10 18v-7\"}],[\"path\",{\"d\":\"M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z\"}],[\"path\",{\"d\":\"M14 18v-7\"}],[\"path\",{\"d\":\"M18 18v-7\"}],[\"path\",{\"d\":\"M3 22h18\"}],[\"path\",{\"d\":\"M6 18v-7\"}]],\n \"banknote\": [[\"rect\",{\"width\":\"20\",\"height\":\"12\",\"x\":\"2\",\"y\":\"6\",\"rx\":\"2\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}],[\"path\",{\"d\":\"M6 12h.01M18 12h.01\"}]],\n \"credit-card\": [[\"rect\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"5\",\"rx\":\"2\"}],[\"line\",{\"x1\":\"2\",\"x2\":\"22\",\"y1\":\"10\",\"y2\":\"10\"}]],\n \"wallet\": [[\"path\",{\"d\":\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\"}],[\"path\",{\"d\":\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\"}]],\n \"coins\": [[\"path\",{\"d\":\"M13.744 17.736a6 6 0 1 1-7.48-7.48\"}],[\"path\",{\"d\":\"M15 6h1v4\"}],[\"path\",{\"d\":\"m6.134 14.768.866-.5 2 3.464\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"8\",\"r\":\"6\"}]],\n \"piggy-bank\": [[\"path\",{\"d\":\"M11 17h3v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3a3.16 3.16 0 0 0 2-2h1a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1h-1a5 5 0 0 0-2-4V3a4 4 0 0 0-3.2 1.6l-.3.4H11a6 6 0 0 0-6 6v1a5 5 0 0 0 2 4v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1z\"}],[\"path\",{\"d\":\"M16 10h.01\"}],[\"path\",{\"d\":\"M2 8v1a2 2 0 0 0 2 2h1\"}]],\n \"receipt\": [[\"path\",{\"d\":\"M12 17V7\"}],[\"path\",{\"d\":\"M16 8h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8\"}],[\"path\",{\"d\":\"M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z\"}]],\n \"calculator\": [[\"rect\",{\"width\":\"16\",\"height\":\"20\",\"x\":\"4\",\"y\":\"2\",\"rx\":\"2\"}],[\"line\",{\"x1\":\"8\",\"x2\":\"16\",\"y1\":\"6\",\"y2\":\"6\"}],[\"line\",{\"x1\":\"16\",\"x2\":\"16\",\"y1\":\"14\",\"y2\":\"18\"}],[\"path\",{\"d\":\"M16 10h.01\"}],[\"path\",{\"d\":\"M12 10h.01\"}],[\"path\",{\"d\":\"M8 10h.01\"}],[\"path\",{\"d\":\"M12 14h.01\"}],[\"path\",{\"d\":\"M8 14h.01\"}],[\"path\",{\"d\":\"M12 18h.01\"}],[\"path\",{\"d\":\"M8 18h.01\"}]],\n \"scale\": [[\"path\",{\"d\":\"M12 3v18\"}],[\"path\",{\"d\":\"m19 8 3 8a5 5 0 0 1-6 0zV7\"}],[\"path\",{\"d\":\"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\"}],[\"path\",{\"d\":\"m5 8 3 8a5 5 0 0 1-6 0zV7\"}],[\"path\",{\"d\":\"M7 21h10\"}]],\n \"timer\": [[\"line\",{\"x1\":\"10\",\"x2\":\"14\",\"y1\":\"2\",\"y2\":\"2\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"15\",\"y1\":\"14\",\"y2\":\"11\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"14\",\"r\":\"8\"}]],\n \"hourglass\": [[\"path\",{\"d\":\"M5 22h14\"}],[\"path\",{\"d\":\"M5 2h14\"}],[\"path\",{\"d\":\"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22\"}],[\"path\",{\"d\":\"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2\"}]],\n \"alarm-clock\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"13\",\"r\":\"8\"}],[\"path\",{\"d\":\"M12 9v4l2 2\"}],[\"path\",{\"d\":\"M5 3 2 6\"}],[\"path\",{\"d\":\"m22 6-3-3\"}],[\"path\",{\"d\":\"M6.38 18.7 4 21\"}],[\"path\",{\"d\":\"M17.64 18.67 20 21\"}]],\n \"history\": [[\"path\",{\"d\":\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"}],[\"path\",{\"d\":\"M3 3v5h5\"}],[\"path\",{\"d\":\"M12 7v5l4 2\"}]],\n \"filter\": [[\"path\",{\"d\":\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\"}]],\n \"sliders-horizontal\": [[\"path\",{\"d\":\"M10 5H3\"}],[\"path\",{\"d\":\"M12 19H3\"}],[\"path\",{\"d\":\"M14 3v4\"}],[\"path\",{\"d\":\"M16 17v4\"}],[\"path\",{\"d\":\"M21 12h-9\"}],[\"path\",{\"d\":\"M21 19h-5\"}],[\"path\",{\"d\":\"M21 5h-7\"}],[\"path\",{\"d\":\"M8 10v4\"}],[\"path\",{\"d\":\"M8 12H3\"}]],\n \"layout-grid\": [[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"14\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"14\",\"y\":\"14\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"3\",\"y\":\"14\",\"rx\":\"1\"}]],\n \"eye\": [[\"path\",{\"d\":\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}]],\n \"play\": [[\"path\",{\"d\":\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"}]],\n \"pause\": [[\"rect\",{\"x\":\"14\",\"y\":\"3\",\"width\":\"5\",\"height\":\"18\",\"rx\":\"1\"}],[\"rect\",{\"x\":\"5\",\"y\":\"3\",\"width\":\"5\",\"height\":\"18\",\"rx\":\"1\"}]],\n \"repeat\": [[\"path\",{\"d\":\"m17 2 4 4-4 4\"}],[\"path\",{\"d\":\"M3 11v-1a4 4 0 0 1 4-4h14\"}],[\"path\",{\"d\":\"m7 22-4-4 4-4\"}],[\"path\",{\"d\":\"M21 13v1a4 4 0 0 1-4 4H3\"}]],\n \"undo-2\": [[\"path\",{\"d\":\"M9 14 4 9l5-5\"}],[\"path\",{\"d\":\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\"}]],\n \"redo-2\": [[\"path\",{\"d\":\"m15 14 5-5-5-5\"}],[\"path\",{\"d\":\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\"}]],\n \"maximize-2\": [[\"path\",{\"d\":\"M15 3h6v6\"}],[\"path\",{\"d\":\"m21 3-7 7\"}],[\"path\",{\"d\":\"m3 21 7-7\"}],[\"path\",{\"d\":\"M9 21H3v-6\"}]],\n \"zoom-in\": [[\"circle\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}],[\"line\",{\"x1\":\"21\",\"x2\":\"16.65\",\"y1\":\"21\",\"y2\":\"16.65\"}],[\"line\",{\"x1\":\"11\",\"x2\":\"11\",\"y1\":\"8\",\"y2\":\"14\"}],[\"line\",{\"x1\":\"8\",\"x2\":\"14\",\"y1\":\"11\",\"y2\":\"11\"}]],\n \"user-check\": [[\"path\",{\"d\":\"m16 11 2 2 4-4\"}],[\"path\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}]],\n \"user-plus\": [[\"path\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}],[\"line\",{\"x1\":\"19\",\"x2\":\"19\",\"y1\":\"8\",\"y2\":\"14\"}],[\"line\",{\"x1\":\"22\",\"x2\":\"16\",\"y1\":\"11\",\"y2\":\"11\"}]],\n \"gift\": [[\"path\",{\"d\":\"M12 7v14\"}],[\"path\",{\"d\":\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\"}],[\"path\",{\"d\":\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\"}],[\"rect\",{\"x\":\"3\",\"y\":\"7\",\"width\":\"18\",\"height\":\"4\",\"rx\":\"1\"}]],\n \"stethoscope\": [[\"path\",{\"d\":\"M11 2v2\"}],[\"path\",{\"d\":\"M5 2v2\"}],[\"path\",{\"d\":\"M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1\"}],[\"path\",{\"d\":\"M8 15a6 6 0 0 0 12 0v-3\"}],[\"circle\",{\"cx\":\"20\",\"cy\":\"10\",\"r\":\"2\"}]],\n \"pill\": [[\"path\",{\"d\":\"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\"}],[\"path\",{\"d\":\"m8.5 8.5 7 7\"}]],\n \"syringe\": [[\"path\",{\"d\":\"m18 2 4 4\"}],[\"path\",{\"d\":\"m17 7 3-3\"}],[\"path\",{\"d\":\"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\"}],[\"path\",{\"d\":\"m9 11 4 4\"}],[\"path\",{\"d\":\"m5 19-3 3\"}],[\"path\",{\"d\":\"m14 4 6 6\"}]],\n \"heart-pulse\": [[\"path\",{\"d\":\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\"}],[\"path\",{\"d\":\"M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27\"}]],\n \"ambulance\": [[\"path\",{\"d\":\"M10 10H6\"}],[\"path\",{\"d\":\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\"}],[\"path\",{\"d\":\"M19 18h2a1 1 0 0 0 1-1v-3.28a1 1 0 0 0-.684-.948l-1.923-.641a1 1 0 0 1-.578-.502l-1.539-3.076A1 1 0 0 0 16.382 8H14\"}],[\"path\",{\"d\":\"M8 8v4\"}],[\"path\",{\"d\":\"M9 18h6\"}],[\"circle\",{\"cx\":\"17\",\"cy\":\"18\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"7\",\"cy\":\"18\",\"r\":\"2\"}]],\n \"hospital\": [[\"path\",{\"d\":\"M12 7v4\"}],[\"path\",{\"d\":\"M14 21v-3a2 2 0 0 0-4 0v3\"}],[\"path\",{\"d\":\"M14 9h-4\"}],[\"path\",{\"d\":\"M18 11h2a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2h2\"}],[\"path\",{\"d\":\"M18 21V5a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16\"}]],\n \"dna\": [[\"path\",{\"d\":\"m10 16 1.5 1.5\"}],[\"path\",{\"d\":\"m14 8-1.5-1.5\"}],[\"path\",{\"d\":\"M15 2c-1.798 1.998-2.518 3.995-2.807 5.993\"}],[\"path\",{\"d\":\"m16.5 10.5 1 1\"}],[\"path\",{\"d\":\"m17 6-2.891-2.891\"}],[\"path\",{\"d\":\"M2 15c6.667-6 13.333 0 20-6\"}],[\"path\",{\"d\":\"m20 9 .891.891\"}],[\"path\",{\"d\":\"M3.109 14.109 4 15\"}],[\"path\",{\"d\":\"m6.5 12.5 1 1\"}],[\"path\",{\"d\":\"m7 18 2.891 2.891\"}],[\"path\",{\"d\":\"M9 22c1.798-1.998 2.518-3.995 2.807-5.993\"}]],\n \"brain\": [[\"path\",{\"d\":\"M12 18V5\"}],[\"path\",{\"d\":\"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\"}],[\"path\",{\"d\":\"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\"}],[\"path\",{\"d\":\"M17.997 5.125a4 4 0 0 1 2.526 5.77\"}],[\"path\",{\"d\":\"M18 18a4 4 0 0 0 2-7.464\"}],[\"path\",{\"d\":\"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\"}],[\"path\",{\"d\":\"M6 18a4 4 0 0 1-2-7.464\"}],[\"path\",{\"d\":\"M6.003 5.125a4 4 0 0 0-2.526 5.77\"}]],\n \"bandage\": [[\"path\",{\"d\":\"M10 10.01h.01\"}],[\"path\",{\"d\":\"M10 14.01h.01\"}],[\"path\",{\"d\":\"M14 10.01h.01\"}],[\"path\",{\"d\":\"M14 14.01h.01\"}],[\"path\",{\"d\":\"M18 6v12\"}],[\"path\",{\"d\":\"M6 6v12\"}],[\"rect\",{\"x\":\"2\",\"y\":\"6\",\"width\":\"20\",\"height\":\"12\",\"rx\":\"2\"}]],\n \"microscope\": [[\"path\",{\"d\":\"M6 18h8\"}],[\"path\",{\"d\":\"M3 22h18\"}],[\"path\",{\"d\":\"M14 22a7 7 0 1 0 0-14h-1\"}],[\"path\",{\"d\":\"M9 14h2\"}],[\"path\",{\"d\":\"M9 12a2 2 0 0 1-2-2V6h6v4a2 2 0 0 1-2 2Z\"}],[\"path\",{\"d\":\"M12 6V3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3\"}]],\n \"graduation-cap\": [[\"path\",{\"d\":\"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z\"}],[\"path\",{\"d\":\"M22 10v6\"}],[\"path\",{\"d\":\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\"}]],\n \"school\": [[\"path\",{\"d\":\"M14 21v-3a2 2 0 0 0-4 0v3\"}],[\"path\",{\"d\":\"M18 4.933V21\"}],[\"path\",{\"d\":\"m4 6 7.106-3.79a2 2 0 0 1 1.788 0L20 6\"}],[\"path\",{\"d\":\"m6 11-3.52 2.147a1 1 0 0 0-.48.854V19a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5a1 1 0 0 0-.48-.853L18 11\"}],[\"path\",{\"d\":\"M6 4.933V21\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"9\",\"r\":\"2\"}]],\n \"university\": [[\"path\",{\"d\":\"M14 21v-3a2 2 0 0 0-4 0v3\"}],[\"path\",{\"d\":\"M18 12h.01\"}],[\"path\",{\"d\":\"M18 16h.01\"}],[\"path\",{\"d\":\"M22 7a1 1 0 0 0-1-1h-2a2 2 0 0 1-1.143-.359L13.143 2.36a2 2 0 0 0-2.286-.001L6.143 5.64A2 2 0 0 1 5 6H3a1 1 0 0 0-1 1v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2z\"}],[\"path\",{\"d\":\"M6 12h.01\"}],[\"path\",{\"d\":\"M6 16h.01\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"10\",\"r\":\"2\"}]],\n \"library\": [[\"path\",{\"d\":\"m16 6 4 14\"}],[\"path\",{\"d\":\"M12 6v14\"}],[\"path\",{\"d\":\"M8 8v12\"}],[\"path\",{\"d\":\"M4 4v16\"}]],\n \"book\": [[\"path\",{\"d\":\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20\"}]],\n \"flask-conical\": [[\"path\",{\"d\":\"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\"}],[\"path\",{\"d\":\"M6.453 15h11.094\"}],[\"path\",{\"d\":\"M8.5 2h7\"}]],\n \"test-tube\": [[\"path\",{\"d\":\"M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2\"}],[\"path\",{\"d\":\"M8.5 2h7\"}],[\"path\",{\"d\":\"M14.5 16h-5\"}]],\n \"beaker\": [[\"path\",{\"d\":\"M4.5 3h15\"}],[\"path\",{\"d\":\"M6 3v16a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V3\"}],[\"path\",{\"d\":\"M6 14h12\"}]],\n \"atom\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"1\"}],[\"path\",{\"d\":\"M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5Z\"}],[\"path\",{\"d\":\"M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5Z\"}]],\n \"telescope\": [[\"path\",{\"d\":\"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44\"}],[\"path\",{\"d\":\"m13.56 11.747 4.332-.924\"}],[\"path\",{\"d\":\"m16 21-3.105-6.21\"}],[\"path\",{\"d\":\"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z\"}],[\"path\",{\"d\":\"m6.158 8.633 1.114 4.456\"}],[\"path\",{\"d\":\"m8 21 3.105-6.21\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"13\",\"r\":\"2\"}]],\n \"notebook\": [[\"path\",{\"d\":\"M2 6h4\"}],[\"path\",{\"d\":\"M2 10h4\"}],[\"path\",{\"d\":\"M2 14h4\"}],[\"path\",{\"d\":\"M2 18h4\"}],[\"rect\",{\"width\":\"16\",\"height\":\"20\",\"x\":\"4\",\"y\":\"2\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M16 2v20\"}]],\n \"pencil\": [[\"path\",{\"d\":\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\"}],[\"path\",{\"d\":\"m15 5 4 4\"}]],\n \"ruler\": [[\"path\",{\"d\":\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\"}],[\"path\",{\"d\":\"m14.5 12.5 2-2\"}],[\"path\",{\"d\":\"m11.5 9.5 2-2\"}],[\"path\",{\"d\":\"m8.5 6.5 2-2\"}],[\"path\",{\"d\":\"m17.5 15.5 2-2\"}]],\n \"brain-circuit\": [[\"path\",{\"d\":\"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\"}],[\"path\",{\"d\":\"M9 13a4.5 4.5 0 0 0 3-4\"}],[\"path\",{\"d\":\"M6.003 5.125A3 3 0 0 0 6.401 6.5\"}],[\"path\",{\"d\":\"M3.477 10.896a4 4 0 0 1 .585-.396\"}],[\"path\",{\"d\":\"M6 18a4 4 0 0 1-1.967-.516\"}],[\"path\",{\"d\":\"M12 13h4\"}],[\"path\",{\"d\":\"M12 18h6a2 2 0 0 1 2 2v1\"}],[\"path\",{\"d\":\"M12 8h8\"}],[\"path\",{\"d\":\"M16 8V5a2 2 0 0 1 2-2\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"13\",\"r\":\".5\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"3\",\"r\":\".5\"}],[\"circle\",{\"cx\":\"20\",\"cy\":\"21\",\"r\":\".5\"}],[\"circle\",{\"cx\":\"20\",\"cy\":\"8\",\"r\":\".5\"}]],\n \"bot\": [[\"path\",{\"d\":\"M12 8V4H8\"}],[\"rect\",{\"width\":\"16\",\"height\":\"12\",\"x\":\"4\",\"y\":\"8\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M2 14h2\"}],[\"path\",{\"d\":\"M20 14h2\"}],[\"path\",{\"d\":\"M15 13v2\"}],[\"path\",{\"d\":\"M9 13v2\"}]],\n \"sparkles\": [[\"path\",{\"d\":\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\"}],[\"path\",{\"d\":\"M20 2v4\"}],[\"path\",{\"d\":\"M22 4h-4\"}],[\"circle\",{\"cx\":\"4\",\"cy\":\"20\",\"r\":\"2\"}]],\n \"binary\": [[\"rect\",{\"x\":\"14\",\"y\":\"14\",\"width\":\"4\",\"height\":\"6\",\"rx\":\"2\"}],[\"rect\",{\"x\":\"6\",\"y\":\"4\",\"width\":\"4\",\"height\":\"6\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M6 20h4\"}],[\"path\",{\"d\":\"M14 10h4\"}],[\"path\",{\"d\":\"M6 14h2v6\"}],[\"path\",{\"d\":\"M14 4h2v6\"}]],\n \"braces\": [[\"path\",{\"d\":\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\"}],[\"path\",{\"d\":\"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\"}]],\n \"regex\": [[\"path\",{\"d\":\"M17 3v10\"}],[\"path\",{\"d\":\"m12.67 5.5 8.66 5\"}],[\"path\",{\"d\":\"m12.67 10.5 8.66-5\"}],[\"path\",{\"d\":\"M9 17a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-2z\"}]],\n \"variable\": [[\"path\",{\"d\":\"M8 21s-4-3-4-9 4-9 4-9\"}],[\"path\",{\"d\":\"M16 3s4 3 4 9-4 9-4 9\"}],[\"line\",{\"x1\":\"15\",\"x2\":\"9\",\"y1\":\"9\",\"y2\":\"15\"}],[\"line\",{\"x1\":\"9\",\"x2\":\"15\",\"y1\":\"9\",\"y2\":\"15\"}]],\n \"sigma\": [[\"path\",{\"d\":\"M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2\"}]],\n \"pi\": [[\"line\",{\"x1\":\"9\",\"x2\":\"9\",\"y1\":\"4\",\"y2\":\"20\"}],[\"path\",{\"d\":\"M4 7c0-1.7 1.3-3 3-3h13\"}],[\"path\",{\"d\":\"M18 20c-1.7 0-3-1.3-3-3V4\"}]],\n \"microchip\": [[\"path\",{\"d\":\"M10 12h4\"}],[\"path\",{\"d\":\"M10 17h4\"}],[\"path\",{\"d\":\"M10 7h4\"}],[\"path\",{\"d\":\"M18 12h2\"}],[\"path\",{\"d\":\"M18 18h2\"}],[\"path\",{\"d\":\"M18 6h2\"}],[\"path\",{\"d\":\"M4 12h2\"}],[\"path\",{\"d\":\"M4 18h2\"}],[\"path\",{\"d\":\"M4 6h2\"}],[\"rect\",{\"x\":\"6\",\"y\":\"2\",\"width\":\"12\",\"height\":\"20\",\"rx\":\"2\"}]],\n \"memory-stick\": [[\"path\",{\"d\":\"M12 12v-2\"}],[\"path\",{\"d\":\"M12 18v-2\"}],[\"path\",{\"d\":\"M16 12v-2\"}],[\"path\",{\"d\":\"M16 18v-2\"}],[\"path\",{\"d\":\"M2 11h1.5\"}],[\"path\",{\"d\":\"M20 18v-2\"}],[\"path\",{\"d\":\"M20.5 11H22\"}],[\"path\",{\"d\":\"M4 18v-2\"}],[\"path\",{\"d\":\"M8 12v-2\"}],[\"path\",{\"d\":\"M8 18v-2\"}],[\"rect\",{\"x\":\"2\",\"y\":\"6\",\"width\":\"20\",\"height\":\"10\",\"rx\":\"2\"}]],\n \"gpu\": [[\"path\",{\"d\":\"M2 17h18a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2H2\"}],[\"path\",{\"d\":\"M2 21V3\"}],[\"path\",{\"d\":\"M7 17v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-3\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"11\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"8\",\"cy\":\"11\",\"r\":\"2\"}]],\n \"circuit-board\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M11 9h4a2 2 0 0 0 2-2V3\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"9\",\"r\":\"2\"}],[\"path\",{\"d\":\"M7 21v-4a2 2 0 0 1 2-2h4\"}],[\"circle\",{\"cx\":\"15\",\"cy\":\"15\",\"r\":\"2\"}]],\n \"scan\": [[\"path\",{\"d\":\"M3 7V5a2 2 0 0 1 2-2h2\"}],[\"path\",{\"d\":\"M17 3h2a2 2 0 0 1 2 2v2\"}],[\"path\",{\"d\":\"M21 17v2a2 2 0 0 1-2 2h-2\"}],[\"path\",{\"d\":\"M7 21H5a2 2 0 0 1-2-2v-2\"}]],\n \"radar\": [[\"path\",{\"d\":\"M19.07 4.93A10 10 0 0 0 6.99 3.34\"}],[\"path\",{\"d\":\"M4 6h.01\"}],[\"path\",{\"d\":\"M2.29 9.62A10 10 0 1 0 21.31 8.35\"}],[\"path\",{\"d\":\"M16.24 7.76A6 6 0 1 0 8.23 16.67\"}],[\"path\",{\"d\":\"M12 18h.01\"}],[\"path\",{\"d\":\"M17.99 11.66A6 6 0 0 1 15.77 16.67\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}],[\"path\",{\"d\":\"m13.41 10.59 5.66-5.66\"}]],\n \"orbit\": [[\"path\",{\"d\":\"M20.341 6.484A10 10 0 0 1 10.266 21.85\"}],[\"path\",{\"d\":\"M3.659 17.516A10 10 0 0 1 13.74 2.152\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"19\",\"cy\":\"5\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"5\",\"cy\":\"19\",\"r\":\"2\"}]],\n \"satellite\": [[\"path\",{\"d\":\"m13.5 6.5-3.148-3.148a1.205 1.205 0 0 0-1.704 0L6.352 5.648a1.205 1.205 0 0 0 0 1.704L9.5 10.5\"}],[\"path\",{\"d\":\"M16.5 7.5 19 5\"}],[\"path\",{\"d\":\"m17.5 10.5 3.148 3.148a1.205 1.205 0 0 1 0 1.704l-2.296 2.296a1.205 1.205 0 0 1-1.704 0L13.5 14.5\"}],[\"path\",{\"d\":\"M9 21a6 6 0 0 0-6-6\"}],[\"path\",{\"d\":\"M9.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l4.296-4.296a1.205 1.205 0 0 0 0-1.704l-2.296-2.296a1.205 1.205 0 0 0-1.704 0z\"}]],\n \"satellite-dish\": [[\"path\",{\"d\":\"M4 10a7.31 7.31 0 0 0 10 10Z\"}],[\"path\",{\"d\":\"m9 15 3-3\"}],[\"path\",{\"d\":\"M17 13a6 6 0 0 0-6-6\"}],[\"path\",{\"d\":\"M21 13A10 10 0 0 0 11 3\"}]],\n \"webhook\": [[\"path\",{\"d\":\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\"}],[\"path\",{\"d\":\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\"}],[\"path\",{\"d\":\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\"}]],\n \"waypoints\": [[\"path\",{\"d\":\"m10.586 5.414-5.172 5.172\"}],[\"path\",{\"d\":\"m18.586 13.414-5.172 5.172\"}],[\"path\",{\"d\":\"M6 12h12\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"20\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"4\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"20\",\"cy\":\"12\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"4\",\"cy\":\"12\",\"r\":\"2\"}]],\n \"chart-area\": [[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z\"}]],\n \"chart-bar\": [[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"M7 16h8\"}],[\"path\",{\"d\":\"M7 11h12\"}],[\"path\",{\"d\":\"M7 6h3\"}]],\n \"chart-scatter\": [[\"circle\",{\"cx\":\"7.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"18.5\",\"cy\":\"5.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"11.5\",\"cy\":\"11.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"7.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"17.5\",\"cy\":\"14.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}]],\n \"chart-spline\": [[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"M7 16c.5-2 1.5-7 4-7 2 0 2 3 4 3 2.5 0 4.5-5 5-7\"}]],\n \"chart-gantt\": [[\"path\",{\"d\":\"M10 6h8\"}],[\"path\",{\"d\":\"M12 16h6\"}],[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"path\",{\"d\":\"M8 11h7\"}]],\n \"chart-candlestick\": [[\"path\",{\"d\":\"M9 5v4\"}],[\"rect\",{\"width\":\"4\",\"height\":\"6\",\"x\":\"7\",\"y\":\"9\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M9 15v2\"}],[\"path\",{\"d\":\"M17 3v2\"}],[\"rect\",{\"width\":\"4\",\"height\":\"8\",\"x\":\"15\",\"y\":\"5\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M17 13v3\"}],[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}]],\n \"chart-network\": [[\"path\",{\"d\":\"m13.11 7.664 1.78 2.672\"}],[\"path\",{\"d\":\"m14.162 12.788-3.324 1.424\"}],[\"path\",{\"d\":\"m20 4-6.06 1.515\"}],[\"path\",{\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"6\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"12\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"15\",\"r\":\"2\"}]],\n \"chart-no-axes-combined\": [[\"path\",{\"d\":\"M12 16v5\"}],[\"path\",{\"d\":\"M16 14v7\"}],[\"path\",{\"d\":\"M20 10v11\"}],[\"path\",{\"d\":\"m22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15\"}],[\"path\",{\"d\":\"M4 18v3\"}],[\"path\",{\"d\":\"M8 14v7\"}]],\n \"trending-up-down\": [[\"path\",{\"d\":\"M14.828 14.828 21 21\"}],[\"path\",{\"d\":\"M21 16v5h-5\"}],[\"path\",{\"d\":\"m21 3-9 9-4-4-6 6\"}],[\"path\",{\"d\":\"M21 8V3h-5\"}]],\n \"goal\": [[\"path\",{\"d\":\"M12 13V2l8 4-8 4\"}],[\"path\",{\"d\":\"M20.561 10.222a9 9 0 1 1-12.55-5.29\"}],[\"path\",{\"d\":\"M8.002 9.997a5 5 0 1 0 8.9 2.02\"}]],\n \"crosshair\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"line\",{\"x1\":\"22\",\"x2\":\"18\",\"y1\":\"12\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"6\",\"x2\":\"2\",\"y1\":\"12\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"6\",\"y2\":\"2\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"22\",\"y2\":\"18\"}]],\n \"server-cog\": [[\"path\",{\"d\":\"m10.852 14.772-.383.923\"}],[\"path\",{\"d\":\"M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923\"}],[\"path\",{\"d\":\"m13.148 9.228.383-.923\"}],[\"path\",{\"d\":\"m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544\"}],[\"path\",{\"d\":\"m14.772 10.852.923-.383\"}],[\"path\",{\"d\":\"m14.772 13.148.923.383\"}],[\"path\",{\"d\":\"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5\"}],[\"path\",{\"d\":\"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5\"}],[\"path\",{\"d\":\"M6 18h.01\"}],[\"path\",{\"d\":\"M6 6h.01\"}],[\"path\",{\"d\":\"m9.228 10.852-.923-.383\"}],[\"path\",{\"d\":\"m9.228 13.148-.923.383\"}]],\n \"server-crash\": [[\"path\",{\"d\":\"M6 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-2\"}],[\"path\",{\"d\":\"M6 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-2\"}],[\"path\",{\"d\":\"M6 6h.01\"}],[\"path\",{\"d\":\"M6 18h.01\"}],[\"path\",{\"d\":\"m13 6-4 6h6l-4 6\"}]],\n \"server-off\": [[\"path\",{\"d\":\"M7 2h13a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-5\"}],[\"path\",{\"d\":\"M10 10 2.5 2.5C2 2 2 2.5 2 5v3a2 2 0 0 0 2 2h6z\"}],[\"path\",{\"d\":\"M22 17v-1a2 2 0 0 0-2-2h-1\"}],[\"path\",{\"d\":\"M4 14a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16.5l1-.5.5.5-8-8H4z\"}],[\"path\",{\"d\":\"M6 18h.01\"}],[\"path\",{\"d\":\"m2 2 20 20\"}]],\n \"database-backup\": [[\"ellipse\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],[\"path\",{\"d\":\"M3 12a9 3 0 0 0 5 2.69\"}],[\"path\",{\"d\":\"M21 9.3V5\"}],[\"path\",{\"d\":\"M3 5v14a9 3 0 0 0 6.47 2.88\"}],[\"path\",{\"d\":\"M12 12v4h4\"}],[\"path\",{\"d\":\"M13 20a5 5 0 0 0 9-3 4.5 4.5 0 0 0-4.5-4.5c-1.33 0-2.54.54-3.41 1.41L12 16\"}]],\n \"database-search\": [[\"path\",{\"d\":\"M21 11.693V5\"}],[\"path\",{\"d\":\"m22 22-1.875-1.875\"}],[\"path\",{\"d\":\"M3 12a9 3 0 0 0 8.697 2.998\"}],[\"path\",{\"d\":\"M3 5v14a9 3 0 0 0 9.28 2.999\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"3\"}],[\"ellipse\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}]],\n \"database-zap\": [[\"ellipse\",{\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],[\"path\",{\"d\":\"M3 5V19A9 3 0 0 0 15 21.84\"}],[\"path\",{\"d\":\"M21 5V8\"}],[\"path\",{\"d\":\"M21 12L18 17H22L19 22\"}],[\"path\",{\"d\":\"M3 12A9 3 0 0 0 14.59 14.87\"}]],\n \"monitor-check\": [[\"path\",{\"d\":\"m9 10 2 2 4-4\"}],[\"rect\",{\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M12 17v4\"}],[\"path\",{\"d\":\"M8 21h8\"}]],\n \"monitor-cog\": [[\"path\",{\"d\":\"M12 17v4\"}],[\"path\",{\"d\":\"m14.305 7.53.923-.382\"}],[\"path\",{\"d\":\"m15.228 4.852-.923-.383\"}],[\"path\",{\"d\":\"m16.852 3.228-.383-.924\"}],[\"path\",{\"d\":\"m16.852 8.772-.383.923\"}],[\"path\",{\"d\":\"m19.148 3.228.383-.924\"}],[\"path\",{\"d\":\"m19.53 9.696-.382-.924\"}],[\"path\",{\"d\":\"m20.772 4.852.924-.383\"}],[\"path\",{\"d\":\"m20.772 7.148.924.383\"}],[\"path\",{\"d\":\"M22 13v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7\"}],[\"path\",{\"d\":\"M8 21h8\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"6\",\"r\":\"3\"}]],\n \"ethernet-port\": [[\"path\",{\"d\":\"m15 20 3-3h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h2l3 3z\"}],[\"path\",{\"d\":\"M6 8v1\"}],[\"path\",{\"d\":\"M10 8v1\"}],[\"path\",{\"d\":\"M14 8v1\"}],[\"path\",{\"d\":\"M18 8v1\"}]],\n \"router\": [[\"rect\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M6.01 18H6\"}],[\"path\",{\"d\":\"M10.01 18H10\"}],[\"path\",{\"d\":\"M15 10v4\"}],[\"path\",{\"d\":\"M17.84 7.17a4 4 0 0 0-5.66 0\"}],[\"path\",{\"d\":\"M20.66 4.34a8 8 0 0 0-11.31 0\"}]],\n \"cable\": [[\"path\",{\"d\":\"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z\"}],[\"path\",{\"d\":\"M17 21v-2\"}],[\"path\",{\"d\":\"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10\"}],[\"path\",{\"d\":\"M21 21v-2\"}],[\"path\",{\"d\":\"M3 5V3\"}],[\"path\",{\"d\":\"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M7 5V3\"}]],\n \"usb\": [[\"circle\",{\"cx\":\"10\",\"cy\":\"7\",\"r\":\"1\"}],[\"circle\",{\"cx\":\"4\",\"cy\":\"20\",\"r\":\"1\"}],[\"path\",{\"d\":\"M4.7 19.3 19 5\"}],[\"path\",{\"d\":\"m21 3-3 1 2 2Z\"}],[\"path\",{\"d\":\"M9.26 7.68 5 12l2 5\"}],[\"path\",{\"d\":\"m10 14 5 2 3.5-3.5\"}],[\"path\",{\"d\":\"m18 12 1-1 1 1-1 1Z\"}]],\n \"unplug\": [[\"path\",{\"d\":\"m19 5 3-3\"}],[\"path\",{\"d\":\"m2 22 3-3\"}],[\"path\",{\"d\":\"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\"}],[\"path\",{\"d\":\"M7.5 13.5 10 11\"}],[\"path\",{\"d\":\"M10.5 16.5 13 14\"}],[\"path\",{\"d\":\"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z\"}]],\n \"hard-drive-download\": [[\"path\",{\"d\":\"M12 2v8\"}],[\"path\",{\"d\":\"m16 6-4 4-4-4\"}],[\"rect\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M6 18h.01\"}],[\"path\",{\"d\":\"M10 18h.01\"}]],\n \"hard-drive-upload\": [[\"path\",{\"d\":\"m16 6-4-4-4 4\"}],[\"path\",{\"d\":\"M12 2v8\"}],[\"rect\",{\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M6 18h.01\"}],[\"path\",{\"d\":\"M10 18h.01\"}]],\n \"cloud-cog\": [[\"path\",{\"d\":\"m10.852 19.772-.383.924\"}],[\"path\",{\"d\":\"m13.148 14.228.383-.923\"}],[\"path\",{\"d\":\"M13.148 19.772a3 3 0 1 0-2.296-5.544l-.383-.923\"}],[\"path\",{\"d\":\"m13.53 20.696-.382-.924a3 3 0 1 1-2.296-5.544\"}],[\"path\",{\"d\":\"m14.772 15.852.923-.383\"}],[\"path\",{\"d\":\"m14.772 18.148.923.383\"}],[\"path\",{\"d\":\"M4.2 15.1a7 7 0 1 1 9.93-9.858A7 7 0 0 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.2\"}],[\"path\",{\"d\":\"m9.228 15.852-.923-.383\"}],[\"path\",{\"d\":\"m9.228 18.148-.923.383\"}]],\n \"cloud-off\": [[\"path\",{\"d\":\"M10.94 5.274A7 7 0 0 1 15.71 10h1.79a4.5 4.5 0 0 1 4.222 6.057\"}],[\"path\",{\"d\":\"M18.796 18.81A4.5 4.5 0 0 1 17.5 19H9A7 7 0 0 1 5.79 5.78\"}],[\"path\",{\"d\":\"m2 2 20 20\"}]],\n \"cloud-upload\": [[\"path\",{\"d\":\"M12 13v8\"}],[\"path\",{\"d\":\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\"}],[\"path\",{\"d\":\"m8 17 4-4 4 4\"}]],\n \"cloud-download\": [[\"path\",{\"d\":\"M12 13v8l-4-4\"}],[\"path\",{\"d\":\"m12 21 4-4\"}],[\"path\",{\"d\":\"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284\"}]],\n \"cloud-check\": [[\"path\",{\"d\":\"m17 15-5.5 5.5L9 18\"}],[\"path\",{\"d\":\"M5.516 16.07A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 3.501 7.327\"}]],\n \"cloud-alert\": [[\"path\",{\"d\":\"M12 12v4\"}],[\"path\",{\"d\":\"M12 20h.01\"}],[\"path\",{\"d\":\"M8.128 16.949A7 7 0 1 1 15.71 8h1.79a1 1 0 0 1 0 9h-1.642\"}]],\n \"wifi-off\": [[\"path\",{\"d\":\"M12 20h.01\"}],[\"path\",{\"d\":\"M8.5 16.429a5 5 0 0 1 7 0\"}],[\"path\",{\"d\":\"M5 12.859a10 10 0 0 1 5.17-2.69\"}],[\"path\",{\"d\":\"M19 12.859a10 10 0 0 0-2.007-1.523\"}],[\"path\",{\"d\":\"M2 8.82a15 15 0 0 1 4.177-2.643\"}],[\"path\",{\"d\":\"M22 8.82a15 15 0 0 0-11.288-3.764\"}],[\"path\",{\"d\":\"m2 2 20 20\"}]],\n \"logs\": [[\"path\",{\"d\":\"M3 5h1\"}],[\"path\",{\"d\":\"M3 12h1\"}],[\"path\",{\"d\":\"M3 19h1\"}],[\"path\",{\"d\":\"M8 5h1\"}],[\"path\",{\"d\":\"M8 12h1\"}],[\"path\",{\"d\":\"M8 19h1\"}],[\"path\",{\"d\":\"M13 5h8\"}],[\"path\",{\"d\":\"M13 12h8\"}],[\"path\",{\"d\":\"M13 19h8\"}]],\n \"git-commit\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}],[\"line\",{\"x1\":\"3\",\"x2\":\"9\",\"y1\":\"12\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"15\",\"x2\":\"21\",\"y1\":\"12\",\"y2\":\"12\"}]],\n \"git-compare\": [[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M13 6h3a2 2 0 0 1 2 2v7\"}],[\"path\",{\"d\":\"M11 18H8a2 2 0 0 1-2-2V9\"}]],\n \"git-fork\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"18\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"6\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9\"}],[\"path\",{\"d\":\"M12 12v3\"}]],\n \"git-graph\": [[\"circle\",{\"cx\":\"5\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M5 9v6\"}],[\"circle\",{\"cx\":\"5\",\"cy\":\"18\",\"r\":\"3\"}],[\"path\",{\"d\":\"M12 3v18\"}],[\"circle\",{\"cx\":\"19\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M16 15.7A9 9 0 0 0 19 9\"}]],\n \"square-terminal\": [[\"path\",{\"d\":\"m7 11 2-2-2-2\"}],[\"path\",{\"d\":\"M11 13h4\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\",\"ry\":\"2\"}]],\n \"bug-off\": [[\"path\",{\"d\":\"M12 20v-8\"}],[\"path\",{\"d\":\"M12.656 7H14a4 4 0 0 1 4 4v1.344\"}],[\"path\",{\"d\":\"M14.12 3.88 16 2\"}],[\"path\",{\"d\":\"M17.123 17.123A6 6 0 0 1 6 14v-3a4 4 0 0 1 1.72-3.287\"}],[\"path\",{\"d\":\"m2 2 20 20\"}],[\"path\",{\"d\":\"M21 5a4 4 0 0 1-3.55 3.97\"}],[\"path\",{\"d\":\"M22 13h-3.344\"}],[\"path\",{\"d\":\"M3 21a4 4 0 0 1 3.81-4\"}],[\"path\",{\"d\":\"M3 5a4 4 0 0 0 3.55 3.97\"}],[\"path\",{\"d\":\"M6 13H2\"}],[\"path\",{\"d\":\"m8 2 1.88 1.88\"}],[\"path\",{\"d\":\"M9.712 4.06A3 3 0 0 1 15 6v1.13\"}]],\n \"shield-alert\": [[\"path\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}],[\"path\",{\"d\":\"M12 8v4\"}],[\"path\",{\"d\":\"M12 16h.01\"}]],\n \"shield-x\": [[\"path\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}],[\"path\",{\"d\":\"m14.5 9.5-5 5\"}],[\"path\",{\"d\":\"m9.5 9.5 5 5\"}]],\n \"shield-off\": [[\"path\",{\"d\":\"m2 2 20 20\"}],[\"path\",{\"d\":\"M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71\"}],[\"path\",{\"d\":\"M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264\"}]],\n \"shield-plus\": [[\"path\",{\"d\":\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"}],[\"path\",{\"d\":\"M9 12h6\"}],[\"path\",{\"d\":\"M12 9v6\"}]],\n \"lock-open\": [[\"rect\",{\"width\":\"18\",\"height\":\"11\",\"x\":\"3\",\"y\":\"11\",\"rx\":\"2\",\"ry\":\"2\"}],[\"path\",{\"d\":\"M7 11V7a5 5 0 0 1 9.9-1\"}]],\n \"key-round\": [[\"path\",{\"d\":\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"}],[\"circle\",{\"cx\":\"16.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}]],\n \"siren\": [[\"path\",{\"d\":\"M7 18v-6a5 5 0 1 1 10 0v6\"}],[\"path\",{\"d\":\"M5 21a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2z\"}],[\"path\",{\"d\":\"M21 12h1\"}],[\"path\",{\"d\":\"M18.5 4.5 18 5\"}],[\"path\",{\"d\":\"M2 12h1\"}],[\"path\",{\"d\":\"M12 2v1\"}],[\"path\",{\"d\":\"m4.929 4.929.707.707\"}],[\"path\",{\"d\":\"M12 12v6\"}]],\n \"ban\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M4.929 4.929 19.07 19.071\"}]],\n \"cctv\": [[\"path\",{\"d\":\"M16.75 12h3.632a1 1 0 0 1 .894 1.447l-2.034 4.069a1 1 0 0 1-1.708.134l-2.124-2.97\"}],[\"path\",{\"d\":\"M17.106 9.053a1 1 0 0 1 .447 1.341l-3.106 6.211a1 1 0 0 1-1.342.447L3.61 12.3a2.92 2.92 0 0 1-1.3-3.91L3.69 5.6a2.92 2.92 0 0 1 3.92-1.3z\"}],[\"path\",{\"d\":\"M2 19h3.76a2 2 0 0 0 1.8-1.1L9 15\"}],[\"path\",{\"d\":\"M2 21v-4\"}],[\"path\",{\"d\":\"M7 9h.01\"}]],\n \"fire-extinguisher\": [[\"path\",{\"d\":\"M15 6.5V3a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3.5\"}],[\"path\",{\"d\":\"M9 18h8\"}],[\"path\",{\"d\":\"M18 3h-3\"}],[\"path\",{\"d\":\"M11 3a6 6 0 0 0-6 6v11\"}],[\"path\",{\"d\":\"M5 13h4\"}],[\"path\",{\"d\":\"M17 10a4 4 0 0 0-8 0v10a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2Z\"}]],\n \"door-closed\": [[\"path\",{\"d\":\"M10 12h.01\"}],[\"path\",{\"d\":\"M18 20V6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14\"}],[\"path\",{\"d\":\"M2 20h20\"}]],\n \"door-open\": [[\"path\",{\"d\":\"M11 20H2\"}],[\"path\",{\"d\":\"M11 4.562v16.157a1 1 0 0 0 1.242.97L19 20V5.562a2 2 0 0 0-1.515-1.94l-4-1A2 2 0 0 0 11 4.561z\"}],[\"path\",{\"d\":\"M11 4H8a2 2 0 0 0-2 2v14\"}],[\"path\",{\"d\":\"M14 12h.01\"}],[\"path\",{\"d\":\"M22 20h-3\"}]],\n \"vault\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"circle\",{\"cx\":\"7.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"path\",{\"d\":\"m7.9 7.9 2.7 2.7\"}],[\"circle\",{\"cx\":\"16.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"path\",{\"d\":\"m13.4 10.6 2.7-2.7\"}],[\"circle\",{\"cx\":\"7.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"path\",{\"d\":\"m7.9 16.1 2.7-2.7\"}],[\"circle\",{\"cx\":\"16.5\",\"cy\":\"16.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"path\",{\"d\":\"m13.4 13.4 2.7 2.7\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"2\"}]],\n \"file-code\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M10 12.5 8 15l2 2.5\"}],[\"path\",{\"d\":\"m14 12.5 2 2.5-2 2.5\"}]],\n \"file-json\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\"}],[\"path\",{\"d\":\"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\"}]],\n \"file-spreadsheet\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M8 13h2\"}],[\"path\",{\"d\":\"M14 13h2\"}],[\"path\",{\"d\":\"M8 17h2\"}],[\"path\",{\"d\":\"M14 17h2\"}]],\n \"file-archive\": [[\"path\",{\"d\":\"M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M8 12v-1\"}],[\"path\",{\"d\":\"M8 18v-2\"}],[\"path\",{\"d\":\"M8 7V6\"}],[\"circle\",{\"cx\":\"8\",\"cy\":\"20\",\"r\":\"2\"}]],\n \"file-diff\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M9 10h6\"}],[\"path\",{\"d\":\"M12 13V7\"}],[\"path\",{\"d\":\"M9 17h6\"}]],\n \"file-clock\": [[\"path\",{\"d\":\"M16 22h2a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v2.85\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M8 14v2.2l1.6 1\"}],[\"circle\",{\"cx\":\"8\",\"cy\":\"16\",\"r\":\"6\"}]],\n \"file-warning\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M12 9v4\"}],[\"path\",{\"d\":\"M12 17h.01\"}]],\n \"file-x\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"m14.5 12.5-5 5\"}],[\"path\",{\"d\":\"m9.5 12.5 5 5\"}]],\n \"file-down\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M12 18v-6\"}],[\"path\",{\"d\":\"m9 15 3 3 3-3\"}]],\n \"file-up\": [[\"path\",{\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],[\"path\",{\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],[\"path\",{\"d\":\"M12 12v6\"}],[\"path\",{\"d\":\"m15 15-3-3-3 3\"}]],\n \"file-stack\": [[\"path\",{\"d\":\"M11 21a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1\"}],[\"path\",{\"d\":\"M16 16a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1\"}],[\"path\",{\"d\":\"M21 6a2 2 0 0 0-.586-1.414l-2-2A2 2 0 0 0 17 2h-3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1z\"}]],\n \"folder-open\": [[\"path\",{\"d\":\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\"}]],\n \"folder-tree\": [[\"path\",{\"d\":\"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\"}],[\"path\",{\"d\":\"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\"}],[\"path\",{\"d\":\"M3 5a2 2 0 0 0 2 2h3\"}],[\"path\",{\"d\":\"M3 3v13a2 2 0 0 0 2 2h3\"}]],\n \"folder-cog\": [[\"path\",{\"d\":\"M10.3 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.98a2 2 0 0 1 1.69.9l.66 1.2A2 2 0 0 0 12 6h8a2 2 0 0 1 2 2v3.3\"}],[\"path\",{\"d\":\"m14.305 19.53.923-.382\"}],[\"path\",{\"d\":\"m15.228 16.852-.923-.383\"}],[\"path\",{\"d\":\"m16.852 15.228-.383-.923\"}],[\"path\",{\"d\":\"m16.852 20.772-.383.924\"}],[\"path\",{\"d\":\"m19.148 15.228.383-.923\"}],[\"path\",{\"d\":\"m19.53 21.696-.382-.924\"}],[\"path\",{\"d\":\"m20.772 16.852.924-.383\"}],[\"path\",{\"d\":\"m20.772 19.148.924.383\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"3\"}]],\n \"folder-check\": [[\"path\",{\"d\":\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"}],[\"path\",{\"d\":\"m9 13 2 2 4-4\"}]],\n \"save\": [[\"path\",{\"d\":\"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\"}],[\"path\",{\"d\":\"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\"}],[\"path\",{\"d\":\"M7 3v4a1 1 0 0 0 1 1h7\"}]],\n \"scroll-text\": [[\"path\",{\"d\":\"M15 12h-5\"}],[\"path\",{\"d\":\"M15 8h-5\"}],[\"path\",{\"d\":\"M19 17V5a2 2 0 0 0-2-2H4\"}],[\"path\",{\"d\":\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"}]],\n \"sticky-note\": [[\"path\",{\"d\":\"M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z\"}],[\"path\",{\"d\":\"M15 3v5a1 1 0 0 0 1 1h5\"}]],\n \"notepad-text\": [[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M12 2v4\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"rect\",{\"width\":\"16\",\"height\":\"18\",\"x\":\"4\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M8 10h6\"}],[\"path\",{\"d\":\"M8 14h8\"}],[\"path\",{\"d\":\"M8 18h5\"}]],\n \"newspaper\": [[\"path\",{\"d\":\"M15 18h-5\"}],[\"path\",{\"d\":\"M18 14h-8\"}],[\"path\",{\"d\":\"M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2\"}],[\"rect\",{\"width\":\"8\",\"height\":\"4\",\"x\":\"10\",\"y\":\"6\",\"rx\":\"1\"}]],\n \"signature\": [[\"path\",{\"d\":\"m21 17-2.156-1.868A.5.5 0 0 0 18 15.5v.5a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1c0-2.545-3.991-3.97-8.5-4a1 1 0 0 0 0 5c4.153 0 4.745-11.295 5.708-13.5a2.5 2.5 0 1 1 3.31 3.284\"}],[\"path\",{\"d\":\"M3 21h18\"}]],\n \"stamp\": [[\"path\",{\"d\":\"M14 13V8.5C14 7 15 7 15 5a3 3 0 0 0-6 0c0 2 1 2 1 3.5V13\"}],[\"path\",{\"d\":\"M20 15.5a2.5 2.5 0 0 0-2.5-2.5h-11A2.5 2.5 0 0 0 4 15.5V17a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1z\"}],[\"path\",{\"d\":\"M5 22h14\"}]],\n \"paperclip\": [[\"path\",{\"d\":\"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\"}]],\n \"pin\": [[\"path\",{\"d\":\"M12 17v5\"}],[\"path\",{\"d\":\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"}]],\n \"bookmark\": [[\"path\",{\"d\":\"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z\"}]],\n \"shopping-cart\": [[\"circle\",{\"cx\":\"8\",\"cy\":\"21\",\"r\":\"1\"}],[\"circle\",{\"cx\":\"19\",\"cy\":\"21\",\"r\":\"1\"}],[\"path\",{\"d\":\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\"}]],\n \"shopping-bag\": [[\"path\",{\"d\":\"M16 10a4 4 0 0 1-8 0\"}],[\"path\",{\"d\":\"M3.103 6.034h17.794\"}],[\"path\",{\"d\":\"M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z\"}]],\n \"gem\": [[\"path\",{\"d\":\"M10.5 3 8 9l4 13 4-13-2.5-6\"}],[\"path\",{\"d\":\"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\"}],[\"path\",{\"d\":\"M2 9h20\"}]],\n \"euro\": [[\"path\",{\"d\":\"M4 10h12\"}],[\"path\",{\"d\":\"M4 14h9\"}],[\"path\",{\"d\":\"M19 6a7.7 7.7 0 0 0-5.2-2A7.9 7.9 0 0 0 6 12c0 4.4 3.5 8 7.8 8 2 0 3.8-.8 5.2-2\"}]],\n \"bitcoin\": [[\"path\",{\"d\":\"M11.767 19.089c4.924.868 6.14-6.025 1.216-6.894m-1.216 6.894L5.86 18.047m5.908 1.042-.347 1.97m1.563-8.864c4.924.869 6.14-6.025 1.215-6.893m-1.215 6.893-3.94-.694m5.155-6.2L8.29 4.26m5.908 1.042.348-1.97M7.48 20.364l3.126-17.727\"}]],\n \"japanese-yen\": [[\"path\",{\"d\":\"M12 9.5V21m0-11.5L6 3m6 6.5L18 3\"}],[\"path\",{\"d\":\"M6 15h12\"}],[\"path\",{\"d\":\"M6 11h12\"}]],\n \"currency\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"8\"}],[\"line\",{\"x1\":\"3\",\"x2\":\"6\",\"y1\":\"3\",\"y2\":\"6\"}],[\"line\",{\"x1\":\"21\",\"x2\":\"18\",\"y1\":\"3\",\"y2\":\"6\"}],[\"line\",{\"x1\":\"3\",\"x2\":\"6\",\"y1\":\"21\",\"y2\":\"18\"}],[\"line\",{\"x1\":\"21\",\"x2\":\"18\",\"y1\":\"21\",\"y2\":\"18\"}]],\n \"badge-dollar-sign\": [[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"}],[\"path\",{\"d\":\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"}],[\"path\",{\"d\":\"M12 18V6\"}]],\n \"badge-percent\": [[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"}],[\"path\",{\"d\":\"m15 9-6 6\"}],[\"path\",{\"d\":\"M9 9h.01\"}],[\"path\",{\"d\":\"M15 15h.01\"}]],\n \"gavel\": [[\"path\",{\"d\":\"m14 13-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381\"}],[\"path\",{\"d\":\"m16 16 6-6\"}],[\"path\",{\"d\":\"m21.5 10.5-8-8\"}],[\"path\",{\"d\":\"m8 8 6-6\"}],[\"path\",{\"d\":\"m8.5 7.5 8 8\"}]],\n \"tag\": [[\"path\",{\"d\":\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"}],[\"circle\",{\"cx\":\"7.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}]],\n \"tags\": [[\"path\",{\"d\":\"M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z\"}],[\"path\",{\"d\":\"M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193\"}],[\"circle\",{\"cx\":\"10.5\",\"cy\":\"6.5\",\"r\":\".5\",\"fill\":\"currentColor\"}]],\n \"ticket\": [[\"path\",{\"d\":\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\"}],[\"path\",{\"d\":\"M13 5v2\"}],[\"path\",{\"d\":\"M13 17v2\"}],[\"path\",{\"d\":\"M13 11v2\"}]],\n \"barcode\": [[\"path\",{\"d\":\"M3 5v14\"}],[\"path\",{\"d\":\"M8 5v14\"}],[\"path\",{\"d\":\"M12 5v14\"}],[\"path\",{\"d\":\"M17 5v14\"}],[\"path\",{\"d\":\"M21 5v14\"}]],\n \"users-round\": [[\"path\",{\"d\":\"M18 21a8 8 0 0 0-16 0\"}],[\"circle\",{\"cx\":\"10\",\"cy\":\"8\",\"r\":\"5\"}],[\"path\",{\"d\":\"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3\"}]],\n \"user-cog\": [[\"path\",{\"d\":\"M10 15H6a4 4 0 0 0-4 4v2\"}],[\"path\",{\"d\":\"m14.305 16.53.923-.382\"}],[\"path\",{\"d\":\"m15.228 13.852-.923-.383\"}],[\"path\",{\"d\":\"m16.852 12.228-.383-.923\"}],[\"path\",{\"d\":\"m16.852 17.772-.383.924\"}],[\"path\",{\"d\":\"m19.148 12.228.383-.923\"}],[\"path\",{\"d\":\"m19.53 18.696-.382-.924\"}],[\"path\",{\"d\":\"m20.772 13.852.924-.383\"}],[\"path\",{\"d\":\"m20.772 16.148.924.383\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"15\",\"r\":\"3\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}]],\n \"user-search\": [[\"circle\",{\"cx\":\"10\",\"cy\":\"7\",\"r\":\"4\"}],[\"path\",{\"d\":\"M10.3 15H7a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"17\",\"cy\":\"17\",\"r\":\"3\"}],[\"path\",{\"d\":\"m21 21-1.9-1.9\"}]],\n \"user-x\": [[\"path\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}],[\"line\",{\"x1\":\"17\",\"x2\":\"22\",\"y1\":\"8\",\"y2\":\"13\"}],[\"line\",{\"x1\":\"22\",\"x2\":\"17\",\"y1\":\"8\",\"y2\":\"13\"}]],\n \"user-minus\": [[\"path\",{\"d\":\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}],[\"line\",{\"x1\":\"22\",\"x2\":\"16\",\"y1\":\"11\",\"y2\":\"11\"}]],\n \"id-card\": [[\"path\",{\"d\":\"M16 10h2\"}],[\"path\",{\"d\":\"M16 14h2\"}],[\"path\",{\"d\":\"M6.17 15a3 3 0 0 1 5.66 0\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"11\",\"r\":\"2\"}],[\"rect\",{\"x\":\"2\",\"y\":\"5\",\"width\":\"20\",\"height\":\"14\",\"rx\":\"2\"}]],\n \"speech\": [[\"path\",{\"d\":\"M8.8 20v-4.1l1.9.2a2.3 2.3 0 0 0 2.164-2.1V8.3A5.37 5.37 0 0 0 2 8.25c0 2.8.656 3.054 1 4.55a5.77 5.77 0 0 1 .029 2.758L2 20\"}],[\"path\",{\"d\":\"M19.8 17.8a7.5 7.5 0 0 0 .003-10.603\"}],[\"path\",{\"d\":\"M17 15a3.5 3.5 0 0 0-.025-4.975\"}]],\n \"messages-square\": [[\"path\",{\"d\":\"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\"}],[\"path\",{\"d\":\"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1\"}]],\n \"message-circle\": [[\"path\",{\"d\":\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\"}]],\n \"reply\": [[\"path\",{\"d\":\"M20 18v-2a4 4 0 0 0-4-4H4\"}],[\"path\",{\"d\":\"m9 17-5-5 5-5\"}]],\n \"heart-handshake\": [[\"path\",{\"d\":\"M19.414 14.414C21 12.828 22 11.5 22 9.5a5.5 5.5 0 0 0-9.591-3.676.6.6 0 0 1-.818.001A5.5 5.5 0 0 0 2 9.5c0 2.3 1.5 4 3 5.5l5.535 5.362a2 2 0 0 0 2.879.052 2.12 2.12 0 0 0-.004-3 2.124 2.124 0 1 0 3-3 2.124 2.124 0 0 0 3.004 0 2 2 0 0 0 0-2.828l-1.881-1.882a2.41 2.41 0 0 0-3.409 0l-1.71 1.71a2 2 0 0 1-2.828 0 2 2 0 0 1 0-2.828l2.823-2.762\"}]],\n \"hand-helping\": [[\"path\",{\"d\":\"M11 12h2a2 2 0 1 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 14\"}],[\"path\",{\"d\":\"m7 18 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a2 2 0 0 0-2.75-2.91l-4.2 3.9\"}],[\"path\",{\"d\":\"m2 13 6 6\"}]],\n \"hand-coins\": [[\"path\",{\"d\":\"M11 15h2a2 2 0 1 0 0-4h-3c-.6 0-1.1.2-1.4.6L3 17\"}],[\"path\",{\"d\":\"m7 21 1.6-1.4c.3-.4.8-.6 1.4-.6h4c1.1 0 2.1-.4 2.8-1.2l4.6-4.4a2 2 0 0 0-2.75-2.91l-4.2 3.9\"}],[\"path\",{\"d\":\"m2 16 6 6\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"9\",\"r\":\"2.9\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"5\",\"r\":\"3\"}]],\n \"phone-call\": [[\"path\",{\"d\":\"M13 2a9 9 0 0 1 9 9\"}],[\"path\",{\"d\":\"M13 6a5 5 0 0 1 5 5\"}],[\"path\",{\"d\":\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\"}]],\n \"headset\": [[\"path\",{\"d\":\"M3 11h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-5Zm0 0a9 9 0 1 1 18 0m0 0v5a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3Z\"}],[\"path\",{\"d\":\"M21 16v2a4 4 0 0 1-4 4h-5\"}]],\n \"headphones\": [[\"path\",{\"d\":\"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3\"}]],\n \"presentation\": [[\"path\",{\"d\":\"M2 3h20\"}],[\"path\",{\"d\":\"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3\"}],[\"path\",{\"d\":\"m7 21 5-5 5 5\"}]],\n \"projector\": [[\"path\",{\"d\":\"M5 7 3 5\"}],[\"path\",{\"d\":\"M9 6V3\"}],[\"path\",{\"d\":\"m13 7 2-2\"}],[\"circle\",{\"cx\":\"9\",\"cy\":\"13\",\"r\":\"3\"}],[\"path\",{\"d\":\"M11.83 12H20a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h2.17\"}],[\"path\",{\"d\":\"M16 16h2\"}]],\n \"printer\": [[\"path\",{\"d\":\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"}],[\"path\",{\"d\":\"M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6\"}],[\"rect\",{\"x\":\"6\",\"y\":\"14\",\"width\":\"12\",\"height\":\"8\",\"rx\":\"1\"}]],\n \"screen-share\": [[\"path\",{\"d\":\"M13 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-3\"}],[\"path\",{\"d\":\"M8 21h8\"}],[\"path\",{\"d\":\"M12 17v4\"}],[\"path\",{\"d\":\"m17 8 5-5\"}],[\"path\",{\"d\":\"M17 3h5v5\"}]],\n \"cast\": [[\"path\",{\"d\":\"M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\"}],[\"path\",{\"d\":\"M2 12a9 9 0 0 1 8 8\"}],[\"path\",{\"d\":\"M2 16a5 5 0 0 1 4 4\"}],[\"line\",{\"x1\":\"2\",\"x2\":\"2.01\",\"y1\":\"20\",\"y2\":\"20\"}]],\n \"car\": [[\"path\",{\"d\":\"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\"}],[\"circle\",{\"cx\":\"7\",\"cy\":\"17\",\"r\":\"2\"}],[\"path\",{\"d\":\"M9 17h6\"}],[\"circle\",{\"cx\":\"17\",\"cy\":\"17\",\"r\":\"2\"}]],\n \"bus\": [[\"path\",{\"d\":\"M8 6v6\"}],[\"path\",{\"d\":\"M15 6v6\"}],[\"path\",{\"d\":\"M2 12h19.6\"}],[\"path\",{\"d\":\"M18 18h3s.5-1.7.8-2.8c.1-.4.2-.8.2-1.2 0-.4-.1-.8-.2-1.2l-1.4-5C20.1 6.8 19.1 6 18 6H4a2 2 0 0 0-2 2v10h3\"}],[\"circle\",{\"cx\":\"7\",\"cy\":\"18\",\"r\":\"2\"}],[\"path\",{\"d\":\"M9 18h5\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"18\",\"r\":\"2\"}]],\n \"train\": [[\"rect\",{\"width\":\"16\",\"height\":\"16\",\"x\":\"4\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M4 11h16\"}],[\"path\",{\"d\":\"M12 3v8\"}],[\"path\",{\"d\":\"m8 19-2 3\"}],[\"path\",{\"d\":\"m18 22-2-3\"}],[\"path\",{\"d\":\"M8 15h.01\"}],[\"path\",{\"d\":\"M16 15h.01\"}]],\n \"bike\": [[\"circle\",{\"cx\":\"18.5\",\"cy\":\"17.5\",\"r\":\"3.5\"}],[\"circle\",{\"cx\":\"5.5\",\"cy\":\"17.5\",\"r\":\"3.5\"}],[\"circle\",{\"cx\":\"15\",\"cy\":\"5\",\"r\":\"1\"}],[\"path\",{\"d\":\"M12 17.5V14l-3-3 4-3 2 3h2\"}]],\n \"sailboat\": [[\"path\",{\"d\":\"M10 2v15\"}],[\"path\",{\"d\":\"M7 22a4 4 0 0 1-4-4 1 1 0 0 1 1-1h16a1 1 0 0 1 1 1 4 4 0 0 1-4 4z\"}],[\"path\",{\"d\":\"M9.159 2.46a1 1 0 0 1 1.521-.193l9.977 8.98A1 1 0 0 1 20 13H4a1 1 0 0 1-.824-1.567z\"}]],\n \"anchor\": [[\"path\",{\"d\":\"M12 6v16\"}],[\"path\",{\"d\":\"m19 13 2-1a9 9 0 0 1-18 0l2 1\"}],[\"path\",{\"d\":\"M9 11h6\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"4\",\"r\":\"2\"}]],\n \"fuel\": [[\"path\",{\"d\":\"M14 13h2a2 2 0 0 1 2 2v2a2 2 0 0 0 4 0v-6.998a2 2 0 0 0-.59-1.42L18 5\"}],[\"path\",{\"d\":\"M14 21V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v16\"}],[\"path\",{\"d\":\"M2 21h13\"}],[\"path\",{\"d\":\"M3 9h11\"}]],\n \"traffic-cone\": [[\"path\",{\"d\":\"M16.05 10.966a5 2.5 0 0 1-8.1 0\"}],[\"path\",{\"d\":\"m16.923 14.049 4.48 2.04a1 1 0 0 1 .001 1.831l-8.574 3.9a2 2 0 0 1-1.66 0l-8.574-3.91a1 1 0 0 1 0-1.83l4.484-2.04\"}],[\"path\",{\"d\":\"M16.949 14.14a5 2.5 0 1 1-9.9 0L10.063 3.5a2 2 0 0 1 3.874 0z\"}],[\"path\",{\"d\":\"M9.194 6.57a5 2.5 0 0 0 5.61 0\"}]],\n \"milestone\": [[\"path\",{\"d\":\"M12 13v8\"}],[\"path\",{\"d\":\"M12 3v3\"}],[\"path\",{\"d\":\"M18.172 6a2 2 0 0 1 1.414.586l2.06 2.06a1.207 1.207 0 0 1 0 1.708l-2.06 2.06a2 2 0 0 1-1.414.586H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z\"}]],\n \"signpost\": [[\"path\",{\"d\":\"M12 13v8\"}],[\"path\",{\"d\":\"M12 3v3\"}],[\"path\",{\"d\":\"M2.354 10.354a1.207 1.207 0 0 1 0-1.708l2.06-2.06A2 2 0 0 1 5.828 6h12.344a2 2 0 0 1 1.414.586l2.06 2.06a1.207 1.207 0 0 1 0 1.708l-2.06 2.06a2 2 0 0 1-1.414.586H5.828a2 2 0 0 1-1.414-.586z\"}]],\n \"luggage\": [[\"path\",{\"d\":\"M6 20a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2\"}],[\"path\",{\"d\":\"M8 18V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v14\"}],[\"path\",{\"d\":\"M10 20h4\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"20\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"8\",\"cy\":\"20\",\"r\":\"2\"}]],\n \"helicopter\": [[\"path\",{\"d\":\"M11 17v4\"}],[\"path\",{\"d\":\"M14 3v8a2 2 0 0 0 2 2h5.865\"}],[\"path\",{\"d\":\"M17 17v4\"}],[\"path\",{\"d\":\"M18 17a4 4 0 0 0 4-4 8 6 0 0 0-8-6 6 5 0 0 0-6 5v3a2 2 0 0 0 2 2z\"}],[\"path\",{\"d\":\"M2 10v5\"}],[\"path\",{\"d\":\"M6 3h16\"}],[\"path\",{\"d\":\"M7 21h14\"}],[\"path\",{\"d\":\"M8 13H2\"}]],\n \"forklift\": [[\"path\",{\"d\":\"M12 12H5a2 2 0 0 0-2 2v5\"}],[\"path\",{\"d\":\"M15 19h7\"}],[\"path\",{\"d\":\"M16 19V2\"}],[\"path\",{\"d\":\"M6 12V7a2 2 0 0 1 2-2h2.172a2 2 0 0 1 1.414.586l3.828 3.828A2 2 0 0 1 16 10.828\"}],[\"path\",{\"d\":\"M7 19h4\"}],[\"circle\",{\"cx\":\"13\",\"cy\":\"19\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"5\",\"cy\":\"19\",\"r\":\"2\"}]],\n \"tractor\": [[\"path\",{\"d\":\"m10 11 11 .9a1 1 0 0 1 .8 1.1l-.665 4.158a1 1 0 0 1-.988.842H20\"}],[\"path\",{\"d\":\"M16 18h-5\"}],[\"path\",{\"d\":\"M18 5a1 1 0 0 0-1 1v5.573\"}],[\"path\",{\"d\":\"M3 4h8.129a1 1 0 0 1 .99.863L13 11.246\"}],[\"path\",{\"d\":\"M4 11V4\"}],[\"path\",{\"d\":\"M7 15h.01\"}],[\"path\",{\"d\":\"M8 10.1V4\"}],[\"circle\",{\"cx\":\"18\",\"cy\":\"18\",\"r\":\"2\"}],[\"circle\",{\"cx\":\"7\",\"cy\":\"15\",\"r\":\"5\"}]],\n \"drone\": [[\"path\",{\"d\":\"M10 10 7 7\"}],[\"path\",{\"d\":\"m10 14-3 3\"}],[\"path\",{\"d\":\"m14 10 3-3\"}],[\"path\",{\"d\":\"m14 14 3 3\"}],[\"path\",{\"d\":\"M14.205 4.139a4 4 0 1 1 5.439 5.863\"}],[\"path\",{\"d\":\"M19.637 14a4 4 0 1 1-5.432 5.868\"}],[\"path\",{\"d\":\"M4.367 10a4 4 0 1 1 5.438-5.862\"}],[\"path\",{\"d\":\"M9.795 19.862a4 4 0 1 1-5.429-5.873\"}],[\"rect\",{\"x\":\"10\",\"y\":\"8\",\"width\":\"4\",\"height\":\"8\",\"rx\":\"1\"}]],\n \"package-check\": [[\"path\",{\"d\":\"M12 22V12\"}],[\"path\",{\"d\":\"m16 17 2 2 4-4\"}],[\"path\",{\"d\":\"M21 11.127V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.32-.753\"}],[\"path\",{\"d\":\"M3.29 7 12 12l8.71-5\"}],[\"path\",{\"d\":\"m7.5 4.27 8.997 5.148\"}]],\n \"package-search\": [[\"path\",{\"d\":\"M12 22V12\"}],[\"path\",{\"d\":\"M20.27 18.27 22 20\"}],[\"path\",{\"d\":\"M21 10.498V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l.98-.559\"}],[\"path\",{\"d\":\"M3.29 7 12 12l8.71-5\"}],[\"path\",{\"d\":\"m7.5 4.27 8.997 5.148\"}],[\"circle\",{\"cx\":\"18.5\",\"cy\":\"16.5\",\"r\":\"2.5\"}]],\n \"package-open\": [[\"path\",{\"d\":\"M12 22v-9\"}],[\"path\",{\"d\":\"M15.17 2.21a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.655 1.655 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z\"}],[\"path\",{\"d\":\"M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13\"}],[\"path\",{\"d\":\"M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36l12.18 6.86a1.636 1.636 0 0 0 1.63 0z\"}]],\n \"leaf\": [[\"path\",{\"d\":\"M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z\"}],[\"path\",{\"d\":\"M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12\"}]],\n \"sprout\": [[\"path\",{\"d\":\"M14 9.536V7a4 4 0 0 1 4-4h1.5a.5.5 0 0 1 .5.5V5a4 4 0 0 1-4 4 4 4 0 0 0-4 4c0 2 1 3 1 5a5 5 0 0 1-1 3\"}],[\"path\",{\"d\":\"M4 9a5 5 0 0 1 8 4 5 5 0 0 1-8-4\"}],[\"path\",{\"d\":\"M5 21h14\"}]],\n \"recycle\": [[\"path\",{\"d\":\"M7 19H4.815a1.83 1.83 0 0 1-1.57-.881 1.785 1.785 0 0 1-.004-1.784L7.196 9.5\"}],[\"path\",{\"d\":\"M11 19h8.203a1.83 1.83 0 0 0 1.556-.89 1.784 1.784 0 0 0 0-1.775l-1.226-2.12\"}],[\"path\",{\"d\":\"m14 16-3 3 3 3\"}],[\"path\",{\"d\":\"M8.293 13.596 7.196 9.5 3.1 10.598\"}],[\"path\",{\"d\":\"m9.344 5.811 1.093-1.892A1.83 1.83 0 0 1 11.985 3a1.784 1.784 0 0 1 1.546.888l3.943 6.843\"}],[\"path\",{\"d\":\"m13.378 9.633 4.096 1.098 1.097-4.096\"}]],\n \"solar-panel\": [[\"path\",{\"d\":\"M11 2h2\"}],[\"path\",{\"d\":\"m14.28 14-4.56 8\"}],[\"path\",{\"d\":\"m21 22-1.558-4H4.558\"}],[\"path\",{\"d\":\"M3 10v2\"}],[\"path\",{\"d\":\"M6.245 15.04A2 2 0 0 1 8 14h12a1 1 0 0 1 .864 1.505l-3.11 5.457A2 2 0 0 1 16 22H4a1 1 0 0 1-.863-1.506z\"}],[\"path\",{\"d\":\"M7 2a4 4 0 0 1-4 4\"}],[\"path\",{\"d\":\"m8.66 7.66 1.41 1.41\"}]],\n \"battery\": [[\"path\",{\"d\":\"M 22 14 L 22 10\"}],[\"rect\",{\"x\":\"2\",\"y\":\"6\",\"width\":\"16\",\"height\":\"12\",\"rx\":\"2\"}]],\n \"battery-charging\": [[\"path\",{\"d\":\"m11 7-3 5h4l-3 5\"}],[\"path\",{\"d\":\"M14.856 6H16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.935\"}],[\"path\",{\"d\":\"M22 14v-4\"}],[\"path\",{\"d\":\"M5.14 18H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2.936\"}]],\n \"ev-charger\": [[\"path\",{\"d\":\"M14 13h2a2 2 0 0 1 2 2v2a2 2 0 0 0 4 0v-6.998a2 2 0 0 0-.59-1.42L18 5\"}],[\"path\",{\"d\":\"M14 21V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v16\"}],[\"path\",{\"d\":\"M2 21h13\"}],[\"path\",{\"d\":\"M3 7h11\"}],[\"path\",{\"d\":\"m9 11-2 3h3l-2 3\"}]],\n \"dam\": [[\"path\",{\"d\":\"M11 11.31c1.17.56 1.54 1.69 3.5 1.69 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}],[\"path\",{\"d\":\"M11.75 18c.35.5 1.45 1 2.75 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}],[\"path\",{\"d\":\"M2 10h4\"}],[\"path\",{\"d\":\"M2 14h4\"}],[\"path\",{\"d\":\"M2 18h4\"}],[\"path\",{\"d\":\"M2 6h4\"}],[\"path\",{\"d\":\"M7 3a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1L10 4a1 1 0 0 0-1-1z\"}]],\n \"radiation\": [[\"path\",{\"d\":\"M12 12h.01\"}],[\"path\",{\"d\":\"M14 15.4641a4 4 0 0 1-4 0L7.52786 19.74597 A 1 1 0 0 0 7.99303 21.16211 10 10 0 0 0 16.00697 21.16211 1 1 0 0 0 16.47214 19.74597z\"}],[\"path\",{\"d\":\"M16 12a4 4 0 0 0-2-3.464l2.472-4.282a1 1 0 0 1 1.46-.305 10 10 0 0 1 4.006 6.94A1 1 0 0 1 21 12z\"}],[\"path\",{\"d\":\"M8 12a4 4 0 0 1 2-3.464L7.528 4.254a1 1 0 0 0-1.46-.305 10 10 0 0 0-4.006 6.94A1 1 0 0 0 3 12z\"}]],\n \"mountain\": [[\"path\",{\"d\":\"m8 3 4 8 5-5 5 15H2L8 3z\"}]],\n \"trees\": [[\"path\",{\"d\":\"M10 10v.2A3 3 0 0 1 8.9 16H5a3 3 0 0 1-1-5.8V10a3 3 0 0 1 6 0Z\"}],[\"path\",{\"d\":\"M7 16v6\"}],[\"path\",{\"d\":\"M13 19v3\"}],[\"path\",{\"d\":\"M12 19h8.3a1 1 0 0 0 .7-1.7L18 14h.3a1 1 0 0 0 .7-1.7L16 9h.2a1 1 0 0 0 .8-1.7L13 3l-1.4 1.5\"}]],\n \"waves\": [[\"path\",{\"d\":\"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}],[\"path\",{\"d\":\"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}],[\"path\",{\"d\":\"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\"}]],\n \"earth\": [[\"path\",{\"d\":\"M21.54 15H17a2 2 0 0 0-2 2v4.54\"}],[\"path\",{\"d\":\"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17\"}],[\"path\",{\"d\":\"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}]],\n \"sunrise\": [[\"path\",{\"d\":\"M12 2v8\"}],[\"path\",{\"d\":\"m4.93 10.93 1.41 1.41\"}],[\"path\",{\"d\":\"M2 18h2\"}],[\"path\",{\"d\":\"M20 18h2\"}],[\"path\",{\"d\":\"m19.07 10.93-1.41 1.41\"}],[\"path\",{\"d\":\"M22 22H2\"}],[\"path\",{\"d\":\"m8 6 4-4 4 4\"}],[\"path\",{\"d\":\"M16 18a4 4 0 0 0-8 0\"}]],\n \"sunset\": [[\"path\",{\"d\":\"M12 10V2\"}],[\"path\",{\"d\":\"m4.93 10.93 1.41 1.41\"}],[\"path\",{\"d\":\"M2 18h2\"}],[\"path\",{\"d\":\"M20 18h2\"}],[\"path\",{\"d\":\"m19.07 10.93-1.41 1.41\"}],[\"path\",{\"d\":\"M22 22H2\"}],[\"path\",{\"d\":\"m16 6-4 4-4-4\"}],[\"path\",{\"d\":\"M16 18a4 4 0 0 0-8 0\"}]],\n \"cloud-rain\": [[\"path\",{\"d\":\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\"}],[\"path\",{\"d\":\"M16 14v6\"}],[\"path\",{\"d\":\"M8 14v6\"}],[\"path\",{\"d\":\"M12 16v6\"}]],\n \"cloud-snow\": [[\"path\",{\"d\":\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\"}],[\"path\",{\"d\":\"M8 15h.01\"}],[\"path\",{\"d\":\"M8 19h.01\"}],[\"path\",{\"d\":\"M12 17h.01\"}],[\"path\",{\"d\":\"M12 21h.01\"}],[\"path\",{\"d\":\"M16 15h.01\"}],[\"path\",{\"d\":\"M16 19h.01\"}]],\n \"cloud-lightning\": [[\"path\",{\"d\":\"M6 16.326A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 .5 8.973\"}],[\"path\",{\"d\":\"m13 12-3 5h4l-3 5\"}]],\n \"umbrella\": [[\"path\",{\"d\":\"M12 13v7a2 2 0 0 0 4 0\"}],[\"path\",{\"d\":\"M12 2v2\"}],[\"path\",{\"d\":\"M20.992 13a1 1 0 0 0 .97-1.274 10.284 10.284 0 0 0-19.923 0A1 1 0 0 0 3 13z\"}]],\n \"tornado\": [[\"path\",{\"d\":\"M21 4H3\"}],[\"path\",{\"d\":\"M18 8H6\"}],[\"path\",{\"d\":\"M19 12H9\"}],[\"path\",{\"d\":\"M16 16h-6\"}],[\"path\",{\"d\":\"M11 20H9\"}]],\n \"coffee\": [[\"path\",{\"d\":\"M10 2v2\"}],[\"path\",{\"d\":\"M14 2v2\"}],[\"path\",{\"d\":\"M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1\"}],[\"path\",{\"d\":\"M6 2v2\"}]],\n \"utensils\": [[\"path\",{\"d\":\"M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2\"}],[\"path\",{\"d\":\"M7 2v20\"}],[\"path\",{\"d\":\"M21 15V2a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7\"}]],\n \"chef-hat\": [[\"path\",{\"d\":\"M17 21a1 1 0 0 0 1-1v-5.35c0-.457.316-.844.727-1.041a4 4 0 0 0-2.134-7.589 5 5 0 0 0-9.186 0 4 4 0 0 0-2.134 7.588c.411.198.727.585.727 1.041V20a1 1 0 0 0 1 1Z\"}],[\"path\",{\"d\":\"M6 17h12\"}]],\n \"wheat\": [[\"path\",{\"d\":\"M2 22 16 8\"}],[\"path\",{\"d\":\"M3.47 12.53 5 11l1.53 1.53a3.5 3.5 0 0 1 0 4.94L5 19l-1.53-1.53a3.5 3.5 0 0 1 0-4.94Z\"}],[\"path\",{\"d\":\"M7.47 8.53 9 7l1.53 1.53a3.5 3.5 0 0 1 0 4.94L9 15l-1.53-1.53a3.5 3.5 0 0 1 0-4.94Z\"}],[\"path\",{\"d\":\"M11.47 4.53 13 3l1.53 1.53a3.5 3.5 0 0 1 0 4.94L13 11l-1.53-1.53a3.5 3.5 0 0 1 0-4.94Z\"}],[\"path\",{\"d\":\"M20 2h2v2a4 4 0 0 1-4 4h-2V6a4 4 0 0 1 4-4Z\"}],[\"path\",{\"d\":\"M11.47 17.47 13 19l-1.53 1.53a3.5 3.5 0 0 1-4.94 0L5 19l1.53-1.53a3.5 3.5 0 0 1 4.94 0Z\"}],[\"path\",{\"d\":\"M15.47 13.47 17 15l-1.53 1.53a3.5 3.5 0 0 1-4.94 0L9 15l1.53-1.53a3.5 3.5 0 0 1 4.94 0Z\"}],[\"path\",{\"d\":\"M19.47 9.47 21 11l-1.53 1.53a3.5 3.5 0 0 1-4.94 0L13 11l1.53-1.53a3.5 3.5 0 0 1 4.94 0Z\"}]],\n \"apple\": [[\"path\",{\"d\":\"M12 6.528V3a1 1 0 0 1 1-1h0\"}],[\"path\",{\"d\":\"M18.237 21A15 15 0 0 0 22 11a6 6 0 0 0-10-4.472A6 6 0 0 0 2 11a15.1 15.1 0 0 0 3.763 10 3 3 0 0 0 3.648.648 5.5 5.5 0 0 1 5.178 0A3 3 0 0 0 18.237 21\"}]],\n \"dumbbell\": [[\"path\",{\"d\":\"M17.596 12.768a2 2 0 1 0 2.829-2.829l-1.768-1.767a2 2 0 0 0 2.828-2.829l-2.828-2.828a2 2 0 0 0-2.829 2.828l-1.767-1.768a2 2 0 1 0-2.829 2.829z\"}],[\"path\",{\"d\":\"m2.5 21.5 1.4-1.4\"}],[\"path\",{\"d\":\"m20.1 3.9 1.4-1.4\"}],[\"path\",{\"d\":\"M5.343 21.485a2 2 0 1 0 2.829-2.828l1.767 1.768a2 2 0 1 0 2.829-2.829l-6.364-6.364a2 2 0 1 0-2.829 2.829l1.768 1.767a2 2 0 0 0-2.828 2.829z\"}],[\"path\",{\"d\":\"m9.6 14.4 4.8-4.8\"}]],\n \"calendar-days\": [[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 10h18\"}],[\"path\",{\"d\":\"M8 14h.01\"}],[\"path\",{\"d\":\"M12 14h.01\"}],[\"path\",{\"d\":\"M16 14h.01\"}],[\"path\",{\"d\":\"M8 18h.01\"}],[\"path\",{\"d\":\"M12 18h.01\"}],[\"path\",{\"d\":\"M16 18h.01\"}]],\n \"calendar-clock\": [[\"path\",{\"d\":\"M16 14v2.2l1.6 1\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"path\",{\"d\":\"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5\"}],[\"path\",{\"d\":\"M3 10h5\"}],[\"path\",{\"d\":\"M8 2v4\"}],[\"circle\",{\"cx\":\"16\",\"cy\":\"16\",\"r\":\"6\"}]],\n \"calendar-check\": [[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 10h18\"}],[\"path\",{\"d\":\"m9 16 2 2 4-4\"}]],\n \"calendar-x\": [[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 10h18\"}],[\"path\",{\"d\":\"m14 14-4 4\"}],[\"path\",{\"d\":\"m10 14 4 4\"}]],\n \"calendar-range\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M16 2v4\"}],[\"path\",{\"d\":\"M3 10h18\"}],[\"path\",{\"d\":\"M8 2v4\"}],[\"path\",{\"d\":\"M17 14h-6\"}],[\"path\",{\"d\":\"M13 18H7\"}],[\"path\",{\"d\":\"M7 14h.01\"}],[\"path\",{\"d\":\"M17 18h.01\"}]],\n \"clock-alert\": [[\"path\",{\"d\":\"M12 6v6l4 2\"}],[\"path\",{\"d\":\"M20 12v5\"}],[\"path\",{\"d\":\"M20 21h.01\"}],[\"path\",{\"d\":\"M21.25 8.2A10 10 0 1 0 16 21.16\"}]],\n \"watch\": [[\"path\",{\"d\":\"M12 10v2.2l1.6 1\"}],[\"path\",{\"d\":\"m16.13 7.66-.81-4.05a2 2 0 0 0-2-1.61h-2.68a2 2 0 0 0-2 1.61l-.78 4.05\"}],[\"path\",{\"d\":\"m7.88 16.36.8 4a2 2 0 0 0 2 1.61h2.72a2 2 0 0 0 2-1.61l.81-4.05\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"6\"}]],\n \"layout-dashboard\": [[\"rect\",{\"width\":\"7\",\"height\":\"9\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"5\",\"x\":\"14\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"9\",\"x\":\"14\",\"y\":\"12\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"5\",\"x\":\"3\",\"y\":\"16\",\"rx\":\"1\"}]],\n \"layout-list\": [[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"7\",\"height\":\"7\",\"x\":\"3\",\"y\":\"14\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M14 4h7\"}],[\"path\",{\"d\":\"M14 9h7\"}],[\"path\",{\"d\":\"M14 15h7\"}],[\"path\",{\"d\":\"M14 20h7\"}]],\n \"layout-template\": [[\"rect\",{\"width\":\"18\",\"height\":\"7\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"9\",\"height\":\"7\",\"x\":\"3\",\"y\":\"14\",\"rx\":\"1\"}],[\"rect\",{\"width\":\"5\",\"height\":\"7\",\"x\":\"16\",\"y\":\"14\",\"rx\":\"1\"}]],\n \"kanban\": [[\"path\",{\"d\":\"M5 3v14\"}],[\"path\",{\"d\":\"M12 3v8\"}],[\"path\",{\"d\":\"M19 3v18\"}]],\n \"columns-3\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M9 3v18\"}],[\"path\",{\"d\":\"M15 3v18\"}]],\n \"rows-3\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M21 9H3\"}],[\"path\",{\"d\":\"M21 15H3\"}]],\n \"grid-3x3\": [[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}],[\"path\",{\"d\":\"M3 9h18\"}],[\"path\",{\"d\":\"M3 15h18\"}],[\"path\",{\"d\":\"M9 3v18\"}],[\"path\",{\"d\":\"M15 3v18\"}]],\n \"list-todo\": [[\"path\",{\"d\":\"M13 5h8\"}],[\"path\",{\"d\":\"M13 12h8\"}],[\"path\",{\"d\":\"M13 19h8\"}],[\"path\",{\"d\":\"m3 17 2 2 4-4\"}],[\"rect\",{\"x\":\"3\",\"y\":\"4\",\"width\":\"6\",\"height\":\"6\",\"rx\":\"1\"}]],\n \"list-tree\": [[\"path\",{\"d\":\"M8 5h13\"}],[\"path\",{\"d\":\"M13 12h8\"}],[\"path\",{\"d\":\"M13 19h8\"}],[\"path\",{\"d\":\"M3 10a2 2 0 0 0 2 2h3\"}],[\"path\",{\"d\":\"M3 5v12a2 2 0 0 0 2 2h3\"}]],\n \"list-filter\": [[\"path\",{\"d\":\"M2 5h20\"}],[\"path\",{\"d\":\"M6 12h12\"}],[\"path\",{\"d\":\"M9 19h6\"}]],\n \"eye-off\": [[\"path\",{\"d\":\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\"}],[\"path\",{\"d\":\"M14.084 14.158a3 3 0 0 1-4.242-4.242\"}],[\"path\",{\"d\":\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\"}],[\"path\",{\"d\":\"m2 2 20 20\"}]],\n \"focus\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}],[\"path\",{\"d\":\"M3 7V5a2 2 0 0 1 2-2h2\"}],[\"path\",{\"d\":\"M17 3h2a2 2 0 0 1 2 2v2\"}],[\"path\",{\"d\":\"M21 17v2a2 2 0 0 1-2 2h-2\"}],[\"path\",{\"d\":\"M7 21H5a2 2 0 0 1-2-2v-2\"}]],\n \"locate-fixed\": [[\"line\",{\"x1\":\"2\",\"x2\":\"5\",\"y1\":\"12\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"19\",\"x2\":\"22\",\"y1\":\"12\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"2\",\"y2\":\"5\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"19\",\"y2\":\"22\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"7\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}]],\n \"minimize-2\": [[\"path\",{\"d\":\"m14 10 7-7\"}],[\"path\",{\"d\":\"M20 10h-6V4\"}],[\"path\",{\"d\":\"m3 21 7-7\"}],[\"path\",{\"d\":\"M4 14h6v6\"}]],\n \"zoom-out\": [[\"circle\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}],[\"line\",{\"x1\":\"21\",\"x2\":\"16.65\",\"y1\":\"21\",\"y2\":\"16.65\"}],[\"line\",{\"x1\":\"8\",\"x2\":\"14\",\"y1\":\"11\",\"y2\":\"11\"}]],\n \"mouse-pointer\": [[\"path\",{\"d\":\"M12.586 12.586 19 19\"}],[\"path\",{\"d\":\"M3.688 3.037a.497.497 0 0 0-.651.651l6.5 15.999a.501.501 0 0 0 .947-.062l1.569-6.083a2 2 0 0 1 1.448-1.479l6.124-1.579a.5.5 0 0 0 .063-.947z\"}]],\n \"mouse-pointer-click\": [[\"path\",{\"d\":\"M14 4.1 12 6\"}],[\"path\",{\"d\":\"m5.1 8-2.9-.8\"}],[\"path\",{\"d\":\"m6 12-1.9 2\"}],[\"path\",{\"d\":\"M7.2 2.2 8 5.1\"}],[\"path\",{\"d\":\"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\"}]],\n \"keyboard\": [[\"path\",{\"d\":\"M10 8h.01\"}],[\"path\",{\"d\":\"M12 12h.01\"}],[\"path\",{\"d\":\"M14 8h.01\"}],[\"path\",{\"d\":\"M16 12h.01\"}],[\"path\",{\"d\":\"M18 8h.01\"}],[\"path\",{\"d\":\"M6 8h.01\"}],[\"path\",{\"d\":\"M7 16h10\"}],[\"path\",{\"d\":\"M8 12h.01\"}],[\"rect\",{\"width\":\"20\",\"height\":\"16\",\"x\":\"2\",\"y\":\"4\",\"rx\":\"2\"}]],\n \"mouse\": [[\"rect\",{\"x\":\"5\",\"y\":\"2\",\"width\":\"14\",\"height\":\"20\",\"rx\":\"7\"}],[\"path\",{\"d\":\"M12 6v4\"}]],\n \"loader-circle\": [[\"path\",{\"d\":\"M21 12a9 9 0 1 1-6.219-8.56\"}]],\n \"shuffle\": [[\"path\",{\"d\":\"m18 14 4 4-4 4\"}],[\"path\",{\"d\":\"m18 2 4 4-4 4\"}],[\"path\",{\"d\":\"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\"}],[\"path\",{\"d\":\"M2 6h1.972a4 4 0 0 1 3.6 2.2\"}],[\"path\",{\"d\":\"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\"}]],\n \"merge\": [[\"path\",{\"d\":\"m8 6 4-4 4 4\"}],[\"path\",{\"d\":\"M12 2v10.3a4 4 0 0 1-1.172 2.872L4 22\"}],[\"path\",{\"d\":\"m20 22-5-5\"}]],\n \"split\": [[\"path\",{\"d\":\"M16 3h5v5\"}],[\"path\",{\"d\":\"M8 3H3v5\"}],[\"path\",{\"d\":\"M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3\"}],[\"path\",{\"d\":\"m15 9 6-6\"}]],\n \"shapes\": [[\"path\",{\"d\":\"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z\"}],[\"rect\",{\"x\":\"3\",\"y\":\"14\",\"width\":\"7\",\"height\":\"7\",\"rx\":\"1\"}],[\"circle\",{\"cx\":\"17.5\",\"cy\":\"17.5\",\"r\":\"3.5\"}]],\n \"box\": [[\"path\",{\"d\":\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"}],[\"path\",{\"d\":\"m3.3 7 8.7 5 8.7-5\"}],[\"path\",{\"d\":\"M12 22V12\"}]],\n \"pyramid\": [[\"path\",{\"d\":\"M2.5 16.88a1 1 0 0 1-.32-1.43l9-13.02a1 1 0 0 1 1.64 0l9 13.01a1 1 0 0 1-.32 1.44l-8.51 4.86a2 2 0 0 1-1.98 0Z\"}],[\"path\",{\"d\":\"M12 2v20\"}]],\n \"arrow-right\": [[\"path\",{\"d\":\"M5 12h14\"}],[\"path\",{\"d\":\"m12 5 7 7-7 7\"}]],\n \"arrow-left\": [[\"path\",{\"d\":\"m12 19-7-7 7-7\"}],[\"path\",{\"d\":\"M19 12H5\"}]],\n \"arrow-up\": [[\"path\",{\"d\":\"m5 12 7-7 7 7\"}],[\"path\",{\"d\":\"M12 19V5\"}]],\n \"arrow-down\": [[\"path\",{\"d\":\"M12 5v14\"}],[\"path\",{\"d\":\"m19 12-7 7-7-7\"}]],\n \"arrow-up-right\": [[\"path\",{\"d\":\"M7 7h10v10\"}],[\"path\",{\"d\":\"M7 17 17 7\"}]],\n \"arrow-down-right\": [[\"path\",{\"d\":\"m7 7 10 10\"}],[\"path\",{\"d\":\"M17 7v10H7\"}]],\n \"arrow-left-right\": [[\"path\",{\"d\":\"M8 3 4 7l4 4\"}],[\"path\",{\"d\":\"M4 7h16\"}],[\"path\",{\"d\":\"m16 21 4-4-4-4\"}],[\"path\",{\"d\":\"M20 17H4\"}]],\n \"arrow-up-down\": [[\"path\",{\"d\":\"m21 16-4 4-4-4\"}],[\"path\",{\"d\":\"M17 20V4\"}],[\"path\",{\"d\":\"m3 8 4-4 4 4\"}],[\"path\",{\"d\":\"M7 4v16\"}]],\n \"chevron-right\": [[\"path\",{\"d\":\"m9 18 6-6-6-6\"}]],\n \"chevrons-right\": [[\"path\",{\"d\":\"m6 17 5-5-5-5\"}],[\"path\",{\"d\":\"m13 17 5-5-5-5\"}]],\n \"corner-down-right\": [[\"path\",{\"d\":\"m15 10 5 5-5 5\"}],[\"path\",{\"d\":\"M4 4v7a4 4 0 0 0 4 4h12\"}]],\n \"iteration-cw\": [[\"path\",{\"d\":\"M4 10a8 8 0 1 1 8 8H4\"}],[\"path\",{\"d\":\"m8 22-4-4 4-4\"}]],\n \"rotate-cw\": [[\"path\",{\"d\":\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"}],[\"path\",{\"d\":\"M21 3v5h-5\"}]],\n \"rotate-ccw\": [[\"path\",{\"d\":\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"}],[\"path\",{\"d\":\"M3 3v5h5\"}]],\n \"refresh-ccw\": [[\"path\",{\"d\":\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"}],[\"path\",{\"d\":\"M3 3v5h5\"}],[\"path\",{\"d\":\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\"}],[\"path\",{\"d\":\"M16 16h5v5\"}]],\n \"expand\": [[\"path\",{\"d\":\"m15 15 6 6\"}],[\"path\",{\"d\":\"m15 9 6-6\"}],[\"path\",{\"d\":\"M21 16v5h-5\"}],[\"path\",{\"d\":\"M21 8V3h-5\"}],[\"path\",{\"d\":\"M3 16v5h5\"}],[\"path\",{\"d\":\"m3 21 6-6\"}],[\"path\",{\"d\":\"M3 8V3h5\"}],[\"path\",{\"d\":\"M9 9 3 3\"}]],\n \"shrink\": [[\"path\",{\"d\":\"m15 15 6 6m-6-6v4.8m0-4.8h4.8\"}],[\"path\",{\"d\":\"M9 19.8V15m0 0H4.2M9 15l-6 6\"}],[\"path\",{\"d\":\"M15 4.2V9m0 0h4.8M15 9l6-6\"}],[\"path\",{\"d\":\"M9 4.2V9m0 0H4.2M9 9 3 3\"}]],\n \"log-in\": [[\"path\",{\"d\":\"m10 17 5-5-5-5\"}],[\"path\",{\"d\":\"M15 12H3\"}],[\"path\",{\"d\":\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"}]],\n \"log-out\": [[\"path\",{\"d\":\"m16 17 5-5-5-5\"}],[\"path\",{\"d\":\"M21 12H9\"}],[\"path\",{\"d\":\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"}]],\n \"star-half\": [[\"path\",{\"d\":\"M12 18.338a2.1 2.1 0 0 0-.987.244L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16l2.309-4.679A.53.53 0 0 1 12 2\"}]],\n \"thumbs-down\": [[\"path\",{\"d\":\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\"}],[\"path\",{\"d\":\"M17 14V2\"}]],\n \"smile\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M8 14s1.5 2 4 2 4-2 4-2\"}],[\"line\",{\"x1\":\"9\",\"x2\":\"9.01\",\"y1\":\"9\",\"y2\":\"9\"}],[\"line\",{\"x1\":\"15\",\"x2\":\"15.01\",\"y1\":\"9\",\"y2\":\"9\"}]],\n \"frown\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M16 16s-1.5-2-4-2-4 2-4 2\"}],[\"line\",{\"x1\":\"9\",\"x2\":\"9.01\",\"y1\":\"9\",\"y2\":\"9\"}],[\"line\",{\"x1\":\"15\",\"x2\":\"15.01\",\"y1\":\"9\",\"y2\":\"9\"}]],\n \"meh\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"line\",{\"x1\":\"8\",\"x2\":\"16\",\"y1\":\"15\",\"y2\":\"15\"}],[\"line\",{\"x1\":\"9\",\"x2\":\"9.01\",\"y1\":\"9\",\"y2\":\"9\"}],[\"line\",{\"x1\":\"15\",\"x2\":\"15.01\",\"y1\":\"9\",\"y2\":\"9\"}]],\n \"party-popper\": [[\"path\",{\"d\":\"M5.8 11.3 2 22l10.7-3.79\"}],[\"path\",{\"d\":\"M4 3h.01\"}],[\"path\",{\"d\":\"M22 8h.01\"}],[\"path\",{\"d\":\"M15 2h.01\"}],[\"path\",{\"d\":\"M22 20h.01\"}],[\"path\",{\"d\":\"m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10\"}],[\"path\",{\"d\":\"m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17\"}],[\"path\",{\"d\":\"m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7\"}],[\"path\",{\"d\":\"M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z\"}]],\n \"ribbon\": [[\"path\",{\"d\":\"M12 11.22C11 9.997 10 9 10 8a2 2 0 0 1 4 0c0 1-.998 2.002-2.01 3.22\"}],[\"path\",{\"d\":\"m12 18 2.57-3.5\"}],[\"path\",{\"d\":\"M6.243 9.016a7 7 0 0 1 11.507-.009\"}],[\"path\",{\"d\":\"M9.35 14.53 12 11.22\"}],[\"path\",{\"d\":\"M9.35 14.53C7.728 12.246 6 10.221 6 7a6 5 0 0 1 12 0c-.005 3.22-1.778 5.235-3.43 7.5l3.557 4.527a1 1 0 0 1-.203 1.43l-1.894 1.36a1 1 0 0 1-1.384-.215L12 18l-2.679 3.593a1 1 0 0 1-1.39.213l-1.865-1.353a1 1 0 0 1-.203-1.422z\"}]],\n \"hammer\": [[\"path\",{\"d\":\"m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9\"}],[\"path\",{\"d\":\"m18 15 4-4\"}],[\"path\",{\"d\":\"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\"}]],\n \"anvil\": [[\"path\",{\"d\":\"M7 10H6a4 4 0 0 1-4-4 1 1 0 0 1 1-1h4\"}],[\"path\",{\"d\":\"M7 5a1 1 0 0 1 1-1h13a1 1 0 0 1 1 1 7 7 0 0 1-7 7H8a1 1 0 0 1-1-1z\"}],[\"path\",{\"d\":\"M9 12v5\"}],[\"path\",{\"d\":\"M15 12v5\"}],[\"path\",{\"d\":\"M5 20a3 3 0 0 1 3-3h8a3 3 0 0 1 3 3 1 1 0 0 1-1 1H6a1 1 0 0 1-1-1\"}]],\n \"drill\": [[\"path\",{\"d\":\"M10 18a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H5a3 3 0 0 1-3-3 1 1 0 0 1 1-1z\"}],[\"path\",{\"d\":\"M13 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1l-.81 3.242a1 1 0 0 1-.97.758H8\"}],[\"path\",{\"d\":\"M14 4h3a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-3\"}],[\"path\",{\"d\":\"M18 6h4\"}],[\"path\",{\"d\":\"m5 10-2 8\"}],[\"path\",{\"d\":\"m7 18 2-8\"}]],\n \"pickaxe\": [[\"path\",{\"d\":\"m14 13-8.381 8.38a1 1 0 0 1-3.001-3L11 9.999\"}],[\"path\",{\"d\":\"M15.973 4.027A13 13 0 0 0 5.902 2.373c-1.398.342-1.092 2.158.277 2.601a19.9 19.9 0 0 1 5.822 3.024\"}],[\"path\",{\"d\":\"M16.001 11.999a19.9 19.9 0 0 1 3.024 5.824c.444 1.369 2.26 1.676 2.603.278A13 13 0 0 0 20 8.069\"}],[\"path\",{\"d\":\"M18.352 3.352a1.205 1.205 0 0 0-1.704 0l-5.296 5.296a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l5.296-5.296a1.205 1.205 0 0 0 0-1.704z\"}]],\n \"hard-hat\": [[\"path\",{\"d\":\"M10 10V5a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v5\"}],[\"path\",{\"d\":\"M14 6a6 6 0 0 1 6 6v3\"}],[\"path\",{\"d\":\"M4 15v-3a6 6 0 0 1 6-6\"}],[\"rect\",{\"x\":\"2\",\"y\":\"15\",\"width\":\"20\",\"height\":\"4\",\"rx\":\"1\"}]],\n \"construction\": [[\"rect\",{\"x\":\"2\",\"y\":\"6\",\"width\":\"20\",\"height\":\"8\",\"rx\":\"1\"}],[\"path\",{\"d\":\"M17 14v7\"}],[\"path\",{\"d\":\"M7 14v7\"}],[\"path\",{\"d\":\"M17 3v3\"}],[\"path\",{\"d\":\"M7 3v3\"}],[\"path\",{\"d\":\"M10 14 2.3 6.3\"}],[\"path\",{\"d\":\"m14 6 7.7 7.7\"}],[\"path\",{\"d\":\"m8 6 8 8\"}]],\n \"magnet\": [[\"path\",{\"d\":\"m12 15 4 4\"}],[\"path\",{\"d\":\"M2.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.029-6.029a1 1 0 1 1 3 3l-6.029 6.029a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.365-6.367A1 1 0 0 0 8.716 4.282z\"}],[\"path\",{\"d\":\"m5 8 4 4\"}]],\n \"bolt\": [[\"path\",{\"d\":\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"4\"}]],\n \"paintbrush\": [[\"path\",{\"d\":\"m14.622 17.897-10.68-2.913\"}],[\"path\",{\"d\":\"M18.376 2.622a1 1 0 1 1 3.002 3.002L17.36 9.643a.5.5 0 0 0 0 .707l.944.944a2.41 2.41 0 0 1 0 3.408l-.944.944a.5.5 0 0 1-.707 0L8.354 7.348a.5.5 0 0 1 0-.707l.944-.944a2.41 2.41 0 0 1 3.408 0l.944.944a.5.5 0 0 0 .707 0z\"}],[\"path\",{\"d\":\"M9 8c-1.804 2.71-3.97 3.46-6.583 3.948a.507.507 0 0 0-.302.819l7.32 8.883a1 1 0 0 0 1.185.204C12.735 20.405 16 16.792 16 15\"}]],\n \"palette\": [[\"path\",{\"d\":\"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z\"}],[\"circle\",{\"cx\":\"13.5\",\"cy\":\"6.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"17.5\",\"cy\":\"10.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"6.5\",\"cy\":\"12.5\",\"r\":\".5\",\"fill\":\"currentColor\"}],[\"circle\",{\"cx\":\"8.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}]],\n \"scissors\": [[\"circle\",{\"cx\":\"6\",\"cy\":\"6\",\"r\":\"3\"}],[\"path\",{\"d\":\"M8.12 8.12 12 12\"}],[\"path\",{\"d\":\"M20 4 8.12 15.88\"}],[\"circle\",{\"cx\":\"6\",\"cy\":\"18\",\"r\":\"3\"}],[\"path\",{\"d\":\"M14.8 14.8 20 20\"}]],\n \"flashlight\": [[\"path\",{\"d\":\"M12 13v1\"}],[\"path\",{\"d\":\"M17 2a1 1 0 0 1 1 1v4a3 3 0 0 1-.6 1.8l-.6.8A4 4 0 0 0 16 12v8a2 2 0 0 1-2 2H10a2 2 0 0 1-2-2v-8a4 4 0 0 0-.8-2.4l-.6-.8A3 3 0 0 1 6 7V3a1 1 0 0 1 1-1z\"}],[\"path\",{\"d\":\"M6 6h12\"}]],\n \"life-buoy\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"m4.93 4.93 4.24 4.24\"}],[\"path\",{\"d\":\"m14.83 9.17 4.24-4.24\"}],[\"path\",{\"d\":\"m14.83 14.83 4.24 4.24\"}],[\"path\",{\"d\":\"m9.17 14.83-4.24 4.24\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"4\"}]],\n \"octagon-alert\": [[\"path\",{\"d\":\"M12 16h.01\"}],[\"path\",{\"d\":\"M12 8v4\"}],[\"path\",{\"d\":\"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z\"}]],\n \"octagon-x\": [[\"path\",{\"d\":\"m15 9-6 6\"}],[\"path\",{\"d\":\"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\"}],[\"path\",{\"d\":\"m9 9 6 6\"}]],\n \"badge-alert\": [[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"8\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12.01\",\"y1\":\"16\",\"y2\":\"16\"}]],\n \"badge-info\": [[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"16\",\"y2\":\"12\"}],[\"line\",{\"x1\":\"12\",\"x2\":\"12.01\",\"y1\":\"8\",\"y2\":\"8\"}]],\n \"circle-help\": [[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],[\"path\",{\"d\":\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"}],[\"path\",{\"d\":\"M12 17h.01\"}]],\n \"bell-ring\": [[\"path\",{\"d\":\"M10.268 21a2 2 0 0 0 3.464 0\"}],[\"path\",{\"d\":\"M22 8c0-2.3-.8-4.3-2-6\"}],[\"path\",{\"d\":\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\"}],[\"path\",{\"d\":\"M4 2C2.8 3.7 2 5.7 2 8\"}]],\n \"bell-off\": [[\"path\",{\"d\":\"M10.268 21a2 2 0 0 0 3.464 0\"}],[\"path\",{\"d\":\"M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742\"}],[\"path\",{\"d\":\"m2 2 20 20\"}],[\"path\",{\"d\":\"M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\"}]],\n} as const\n\nexport const PPTX_ICON_NAMES = Object.keys(PPTX_ICONS) as [string, ...string[]]\n","import { z } from \"zod\"\nimport { PptfastError } from \"./errors\"\nimport { PptxIRSchema, type PptxIR } from \"./ir\"\nimport { generatePptxBlob } from \"./pptx/generate\"\nimport { CAPACITY } from \"./svg/audit/capacity\"\nimport { checkIrQuality, type QualityIssue } from \"./svg/ir-quality\"\nimport { slideToSvgMarkup } from \"./svg/render-slide\"\nimport { CANONICAL_THEME_IDS, THEME_LABELS, THEME_TOKENS } from \"./themes\"\n\nexport interface ValidationIssue {\n path: string\n message: string\n /** 1-based slide number when the issue is scoped to a slide. */\n page?: number\n}\n\nexport interface ValidateResult {\n ok: boolean\n ir?: PptxIR\n errors: ValidationIssue[]\n}\n\n/**\n * English rendering of a `checkIrQuality` finding. `ir-quality.ts` writes its\n * `message` field for a (Chinese-language) content-authoring UI; once wired\n * into `validateIr` those findings become part of the public CLI/API error\n * surface, which must stay English. Translate by `code` here instead of\n * changing `ir-quality.ts` itself (and its already-green test suite, which\n * asserts on the Chinese wording directly). Unknown/future codes fall back to\n * a generic English string rather than leaking the untranslated Chinese text.\n */\nfunction describeQualityIssue(issue: QualityIssue, themeId: string): string {\n switch (issue.code) {\n case \"empty_deck\":\n return \"deck has no slides\"\n case \"missing_heading\":\n return \"slide is missing a heading\"\n case \"long_heading\":\n return `heading exceeds ${CAPACITY.headingMaxChars} characters — tighten it into a short, assertive phrase`\n case \"density\": {\n const limit = CAPACITY.maxBlocksPerSlideOverrides[themeId] ?? CAPACITY.maxBlocksPerSlide\n return `too many blocks on this slide (max ~${limit}) — split into multiple slides`\n }\n case \"bullets_overflow\":\n return `bullet list has too many items (max ${CAPACITY.bullets.maxItems}) — trim it or split into multiple slides`\n case \"bullet_item_long\":\n return \"a bullet item is too long — keep it within about 2 lines\"\n case \"big_number_no_kpi\":\n return \"big_number variant is missing a kpi_cards block\"\n default:\n return `content quality issue (${issue.code})`\n }\n}\n\n/**\n * Validate raw JSON against the IR schema, then — once it parses — run the\n * content-quality gate (`checkIrQuality`) against the parsed IR. Both stages\n * must pass for `ok: true`. Quality findings are reported the same way as\n * schema errors (page-scoped, 1-based). `checkIrQuality` itself tags findings\n * \"warn\" vs \"error\", but that split was designed for its original consumer\n * (surfacing informational warnings in a UI after generation, per its own\n * docstring) — here it is the pre-generation hard gate, so any finding blocks\n * (`ok: false`), not only \"error\"-severity ones. Treating \"warn\" findings\n * (e.g. a cover with no heading) as advisory-only would defeat the point of\n * wiring this in: the spec's core principle is a hard protocol gate, not\n * hoped-for prompt compliance.\n */\nexport function validateIr(input: unknown): ValidateResult {\n const r = PptxIRSchema.safeParse(input)\n if (!r.success) {\n const errors = r.error.issues.map((issue) => {\n const path = issue.path.join(\".\")\n const m = /^slides\\.(\\d+)/.exec(path)\n return { path, message: issue.message, page: m ? Number(m[1]) + 1 : undefined }\n })\n return { ok: false, errors }\n }\n const quality = checkIrQuality(r.data)\n if (quality.length === 0) return { ok: true, ir: r.data, errors: [] }\n const errors: ValidationIssue[] = quality.map((issue) =>\n issue.code === \"empty_deck\"\n ? { path: \"slides\", message: describeQualityIssue(issue, r.data.theme.id) }\n : {\n path: `slides.${issue.slide}`,\n message: describeQualityIssue(issue, r.data.theme.id),\n page: issue.slide + 1,\n },\n )\n return { ok: false, errors }\n}\n\nexport function formatIssues(errors: ValidationIssue[]): string {\n return errors\n .map((e) => (e.page ? `page ${e.page} — ${e.path}: ${e.message}` : `${e.path}: ${e.message}`))\n .join(\"\\n\")\n}\n\n/** Render a single slide to standalone SVG markup (preview / self-check). */\nexport function renderSlideSvg(ir: PptxIR, slideIndex: number): string {\n const slide = ir.slides[slideIndex]\n if (!slide) {\n throw new PptfastError(`slide index ${slideIndex} out of range — deck has ${ir.slides.length} slides`)\n }\n return slideToSvgMarkup(ir, slide, slideIndex)\n}\n\n/** Full pipeline: validate → SVG → DrawingML → animation patches → pptx bytes. */\nexport async function generatePptx(input: unknown): Promise<Uint8Array> {\n const v = validateIr(input)\n if (!v.ok) throw new PptfastError(`invalid IR:\\n${formatIssues(v.errors)}`)\n const blob = await generatePptxBlob(v.ir!)\n return new Uint8Array(await blob.arrayBuffer())\n}\n\nexport interface ThemeInfo {\n id: string\n label: string\n colors: Record<string, unknown>\n}\n\n/** Built-in theme catalog with labels and color tokens. */\nexport function listThemes(): ThemeInfo[] {\n return CANONICAL_THEME_IDS.map((id) => ({\n id,\n label: THEME_LABELS[id],\n colors: { ...THEME_TOKENS[id].colors } as Record<string, unknown>,\n }))\n}\n\n/** JSON Schema for the IR — feed this to a model before it writes IR. */\nexport function irJsonSchema(): Record<string, unknown> {\n return z.toJSONSchema(PptxIRSchema) as Record<string, unknown>\n}\n","/**\n * 导出前的资产内联:把 ir.assets.images 里的 http(s) 图片取回并替换为\n * data URL。预览用 <image href=签名URL> 由浏览器直接加载,而 pptxgenjs 的\n * addImage 需要真实字节(data URI)——单源重构时丢了这一步,URL 资产在\n * 导出产物里整体缺失(页面只剩遮罩,视觉上是黑/灰底)。\n *\n * 失败语义与 image-export 一致:显式抛错,不生成残缺文档。\n *\n * 另做 Office 安全 MIME 归一化:webp 等非 png/jpeg/gif 资产(典型是\n * ref:upload 上传图的 1600w webp 预览变体)重编码为 PNG——pptxgenjs 把\n * data URL 的 MIME 原样写进 pptx,PowerPoint 打不开 webp。\n */\nimport type { PptxIR } from \"@/ir\"\nimport { PptfastError } from \"../errors\"\nimport { getPlatform } from \"./registry\"\n\n/**\n * 手工构造 data URL(不走 FileReader):MIME 取 Content-Type,兜底 image/png。\n * pptxgenjs 依赖 data URL 的 MIME 头识别媒体类型,不能容忍 octet-stream。\n */\nasync function responseToDataUrl(resp: Response): Promise<string> {\n const mime = resp.headers.get(\"content-type\")?.split(\";\")[0] || \"image/png\"\n const bytes = new Uint8Array(await resp.arrayBuffer())\n let bin = \"\"\n const CHUNK = 0x8000\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK))\n }\n return `data:${mime};base64,${btoa(bin)}`\n}\n\n/** 收集所有被 slide.background 引用的 asset id(仅这些参与背景压缩)。 */\nexport function backgroundAssetIds(ir: PptxIR): Set<string> {\n const ids = new Set<string>()\n for (const slide of ir.slides) {\n const bg = slide.background\n if (bg && bg.kind === \"asset\" && bg.asset_id) ids.add(bg.asset_id)\n }\n return ids\n}\n\n/** 背景图重编码阈值:小于此字节数不值得有损压缩。 */\nconst COMPRESS_MIN_BYTES = 400 * 1024\n/** 背景图重编码目标:全幅铺图 + 遮罩场景,JPEG 0.85 视觉无感。 */\nconst COMPRESS_QUALITY = 0.85\nconst COMPRESS_MAX_W = 1920\n\n/**\n * data URL → 已解码 HTMLImageElement。jsdom 等无解码环境 onload 永不触发——\n * 3s 超时报错,绝不挂死导出。调用方自行决定失败语义(压缩=回退原图,\n * mime 归一化=fail-loud)。\n */\nasync function decodeDataUrlImage(dataUrl: string): Promise<HTMLImageElement> {\n const img = new Image()\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"decode timeout\")), 3000)\n img.onload = () => {\n clearTimeout(timer)\n resolve()\n }\n img.onerror = () => {\n clearTimeout(timer)\n reject(new Error(\"image decode failed\"))\n }\n img.src = dataUrl\n })\n return img\n}\n\n/** pptxgenjs/PowerPoint 安全的位图 MIME;其余(webp/avif 等)导出前必须重编码。 */\nconst OFFICE_SAFE_MIME = new Set([\"image/png\", \"image/jpeg\", \"image/gif\"])\n\nfunction dataUrlMime(dataUrl: string): string {\n const semi = dataUrl.indexOf(\";\")\n return semi > 5 ? dataUrl.slice(5, semi) : \"\"\n}\n\n/**\n * 非 Office 安全 MIME 的资产(典型:上传图的 1600w webp 预览变体,走\n * ref:upload 进 IR)重编码为 PNG。这是正确性变换而非优化:pptxgenjs 会把\n * data URL 的 MIME 原样写进 pptx,PowerPoint 打不开 webp——失败必须抛错,\n * 与本文件「显式抛错,不生成残缺文档」的语义一致。\n */\nasync function reencodeToPng(dataUrl: string): Promise<string> {\n const canvas = document.createElement(\"canvas\")\n const ctx2d = canvas.getContext(\"2d\")\n if (!ctx2d || typeof canvas.toDataURL !== \"function\") {\n throw new Error(\"canvas unavailable, cannot re-encode\")\n }\n const img = await decodeDataUrlImage(dataUrl)\n if (!img.naturalWidth) throw new Error(\"image decode failed\")\n canvas.width = img.naturalWidth\n canvas.height = img.naturalHeight\n ctx2d.drawImage(img, 0, 0)\n const png = canvas.toDataURL(\"image/png\")\n if (!png.startsWith(\"data:image/png\")) throw new Error(\"PNG encode failed\")\n return png\n}\n\n/** 资产 src 若是非 Office 安全 MIME 的 data URL → PNG;其余原样返回。 */\nasync function normalizeAssetDataUrl(id: string, dataUrl: string): Promise<string> {\n const mime = dataUrlMime(dataUrl)\n if (!mime.startsWith(\"image/\") || OFFICE_SAFE_MIME.has(mime)) return dataUrl\n try {\n const recode = getPlatform().recodeImageToPng\n return recode ? await recode(dataUrl) : await reencodeToPng(dataUrl)\n } catch (e) {\n throw new PptfastError(\n `background/illustration asset \"${id}\" format conversion failed (${mime}→png: ${e instanceof Error ? e.message : String(e)}), cannot produce a complete PPT — please retry or regenerate the image`,\n )\n }\n}\n\n/**\n * 大体积 PNG 背景重编码为 JPEG(graphic_create 产 1920×1080 无损 PNG\n * 常见 2-5MB,作为遮罩下的背景无须无损)。canvas 不可用(如测试环境)\n * 或重编码失败/更大时原样返回——只做优化,不改变正确性。\n */\nexport async function maybeCompressBackground(dataUrl: string): Promise<string> {\n if (!dataUrl.startsWith(\"data:image/png;base64,\")) return dataUrl\n const approxBytes = (dataUrl.length - 22) * 0.75\n if (approxBytes < COMPRESS_MIN_BYTES) return dataUrl\n try {\n const canvas = document.createElement(\"canvas\")\n const ctx2d = canvas.getContext(\"2d\")\n if (!ctx2d || typeof canvas.toDataURL !== \"function\") return dataUrl\n const img = await decodeDataUrlImage(dataUrl)\n if (!img.naturalWidth) return dataUrl\n const scale = Math.min(1, COMPRESS_MAX_W / img.naturalWidth)\n canvas.width = Math.round(img.naturalWidth * scale)\n canvas.height = Math.round(img.naturalHeight * scale)\n ctx2d.drawImage(img, 0, 0, canvas.width, canvas.height)\n const jpeg = canvas.toDataURL(\"image/jpeg\", COMPRESS_QUALITY)\n return jpeg.startsWith(\"data:image/jpeg\") && jpeg.length < dataUrl.length\n ? jpeg\n : dataUrl\n } catch {\n return dataUrl\n }\n}\n\nexport async function inlinePptxAssets(ir: PptxIR): Promise<PptxIR> {\n const entries = Object.entries(ir.assets?.images ?? {})\n const bgIds = backgroundAssetIds(ir)\n const needsWork = entries.some(\n ([id, v]) =>\n (v.src && !v.src.startsWith(\"data:\")) ||\n (bgIds.has(id) && v.src?.startsWith(\"data:image/png\")) ||\n (v.src?.startsWith(\"data:image/\") &&\n !OFFICE_SAFE_MIME.has(dataUrlMime(v.src))),\n )\n if (!needsWork) return ir\n\n const images: Record<string, (typeof entries)[number][1]> = {}\n await Promise.all(\n entries.map(async ([id, asset]) => {\n if (!asset.src || asset.src.startsWith(\"data:\")) {\n if (!asset.src) {\n images[id] = asset\n return\n }\n const normalized = await normalizeAssetDataUrl(id, asset.src)\n images[id] = bgIds.has(id)\n ? { ...asset, src: await maybeCompressBackground(normalized) }\n : normalized === asset.src\n ? asset\n : { ...asset, src: normalized }\n return\n }\n let dataUrl: string\n try {\n const resp = await fetch(asset.src)\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`)\n }\n dataUrl = await responseToDataUrl(resp)\n } catch (e) {\n throw new PptfastError(\n `background/illustration asset \"${id}\" fetch failed (${e instanceof Error ? e.message : String(e)}), cannot produce a complete PPT — please retry or regenerate the image`,\n )\n }\n dataUrl = await normalizeAssetDataUrl(id, dataUrl)\n images[id] = {\n ...asset,\n src: bgIds.has(id) ? await maybeCompressBackground(dataUrl) : dataUrl,\n }\n }),\n )\n return { ...ir, assets: { ...ir.assets, images } }\n}\n","import type { BackgroundSpec } from \"@/ir\";\n\nexport type LayoutType = \"cover\" | \"chapter\" | \"content\" | \"ending\";\n\nexport interface ThemeColors {\n bg: string;\n surface: string;\n panel?: string;\n primary: string;\n accent: string;\n text: string;\n muted: string;\n border?: string;\n chartPalette: string[];\n /**\n * Optional accent color pool for themes whose layout grammar cycles through\n * multiple accent colors (e.g. tech card corner stripes). Themes that\n * only use a single accent color can omit this.\n */\n accentPool?: string[];\n /**\n * Optional hairline stroke color for the shared \"surface card\" shells\n * (kpi_cards / icon_cards / callout — see blocks/kpi.tsx,\n * blocks/icon-cards.tsx, blocks/callout.tsx). Those block renderers are\n * shared across every theme and must stay theme-agnostic (no\n * `if (themeId === ...)` branching), so a theme that wants its cards\n * outlined sets this token instead — the renderers just consult it and add\n * a 1px stroke when it's defined. Omitted (`undefined`, the default) draws\n * no stroke, so every theme that doesn't set it keeps its current\n * fill-only card unchanged.\n */\n cardStroke?: string;\n}\n\nexport interface ThemeFonts {\n heading: string[];\n body: string[];\n mono?: string[];\n}\n\nexport interface ThemeTokens {\n id: string;\n allowCustomBackground?: boolean;\n colors: ThemeColors;\n fonts: ThemeFonts;\n shape?: ThemeShape;\n defaultBackgrounds: Record<LayoutType, BackgroundSpec>;\n}\n\n/**\n * 主题细节 shape token(2026-07-10 用户立项,spec:\n * .issues/specs/2026-07-10-pptx-theme-detail-tokens-design.md)。\n * 全部可选——缺省时各消费点沿用自己的 baked 值(零观感)。\n */\nexport interface ThemeShape {\n /** 卡片/横幅圆角 px(统一值)。缺省=各消费点原 baked 值(kpi 8/architecture 6/白卡 14 等)。 */\n radius?: number\n /** 块间距缩放(1=现 BLOCK_GAP)。建议范围 [0.8, 1.3]。 */\n gapScale?: number\n}\n\nexport interface ThemeOverride {\n primary?: string;\n accent?: string;\n font_heading?: string[];\n font_body?: string[];\n}\n\nexport function applyOverride(\n base: ThemeTokens,\n override?: ThemeOverride,\n): ThemeTokens {\n if (!override) return base;\n return {\n ...base,\n colors: {\n ...base.colors,\n primary: override.primary ?? base.colors.primary,\n accent: override.accent ?? base.colors.accent,\n },\n fonts: {\n ...base.fonts,\n heading: override.font_heading ?? base.fonts.heading,\n body: override.font_body ?? base.fonts.body,\n },\n };\n}\n","import type { ThemeTokens } from \"./tokens\";\n\nexport const CONSULTING_TOKENS: ThemeTokens = {\n id: \"consulting\",\n colors: {\n bg: \"#F7F7F2\",\n surface: \"#FFFFFF\",\n primary: \"#051C2C\",\n accent: \"#FFC72C\",\n text: \"#051C2C\",\n muted: \"#6C6C6C\",\n border: \"#D5D5CB\",\n chartPalette: [\"#051C2C\", \"#FFC72C\", \"#00A9E0\", \"#6C6C6C\"],\n },\n fonts: {\n heading: [\"Bower\", \"Georgia\", \"Source Han Serif SC\", \"serif\"],\n body: [\"Bower\", \"Georgia\", \"Source Han Serif SC\", \"serif\"],\n },\n shape: { radius: 2, gapScale: 1 }, // 微圆克制(咨询报告利落,全推广批次 2026-07-10)\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#F7F7F2\" },\n chapter: { kind: \"color\", value: \"#051C2C\" },\n content: { kind: \"color\", value: \"#F7F7F2\" },\n ending: { kind: \"color\", value: \"#F7F7F2\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * enterprise(企业蓝)——原 custom→gallery→avant 的最终定名\n * (2026-07-10 用户四轮裁决收官:转企业风后 avant「先锋设计」名实不符,\n * 改 enterprise,场景词「企业介绍/产品方案/商务提案」)。以下沿革注释保留:\n * avant——原 custom→gallery 改造的形态(2026-07-10 用户视觉伴侣\n * 三轮裁决):白墙 + 正宗国际克莱因蓝 IKB + 天蓝单色系辅助,企业风\n * (炸橘撞色版被否:橘只在小元素出现无大色块,名不副实且不好看)。\n * 演化链:custom(自定义,白底黑字)→ gallery(克莱因蓝 v1,冷白底\n * #F8F9FC + #1F3BC4,tone-adaptive 低色彩版式)→ avant(本形态)。\n * gallery v1 被否原因:①冷白底灰调显脏 ②撞色弱——根因是 tone-adaptive\n * 版式家族本身低色彩(巨号是浅灰水印、主题色少有上场机会),色值再艳也\n * 出不来。故 avant 同时换 tokens(白墙/正 IKB #002FA7)和\n * manifest 版式(IKB 斜切封面/IKB 巨号章节/IKB 横幅内容/IKB 大字结尾)。\n * 名字随之从 gallery 改 avant:大色块撞色是先锋气质,不是白盒画廊的素雅。\n * 2026-07-10 三轮:炸橘辅助被否(橘只在小元素出现无大色块,「撞色」名不\n * 副实且不好看)——转企业单色系:点缀用 IKB 本色、图表天蓝/蓝灰渐次。\n * 存量 custom/gallery deck 经 LEGACY_THEME_MAP 兜底到本主题。\n * **零版式代码**:全部借用现有 archetype(split-diagonal 在 IKB 上\n * readableOn 出白字,banner-heading 横幅 baked 白字在 IKB 上对比充足)。\n */\nexport const ENTERPRISE_TOKENS: ThemeTokens = {\n id: \"enterprise\",\n colors: {\n bg: \"#FFFFFF\", // 画廊白墙\n surface: \"#FFFFFF\",\n panel: \"#F4F4F6\",\n primary: \"#002FA7\", // 国际克莱因蓝(IKB)\n accent: \"#002FA7\", // 点缀直接用 IKB 本色(2026-07-10 用户裁决),天蓝/蓝灰留给图表\n text: \"#14161F\",\n muted: \"#878B96\",\n border: \"#E8E8EC\",\n cardStroke: \"#E4E4E9\", // 白墙上白卡靠描边区分(沿自 custom 存量语义)\n chartPalette: [\"#002FA7\", \"#5B8DEF\", \"#8FA3C8\", \"#C9D3E8\"], // IKB→天蓝→蓝灰渐次(企业单色系)\n },\n fonts: {\n heading: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n body: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n },\n shape: { radius: 8 }, // 企业圆润(spec 提案)\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#FFFFFF\" },\n chapter: { kind: \"color\", value: \"#FFFFFF\" },\n content: { kind: \"color\", value: \"#FFFFFF\" },\n ending: { kind: \"color\", value: \"#FFFFFF\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\nexport const ACADEMIC_TOKENS: ThemeTokens = {\n id: \"academic\",\n colors: {\n bg: \"#FAFAF6\",\n surface: \"#FFFFFF\",\n primary: \"#006A4E\",\n accent: \"#00A878\",\n text: \"#1A2421\",\n muted: \"#5D6B65\",\n border: \"#D5D5CB\",\n chartPalette: [\"#006A4E\", \"#00A878\", \"#5D6B65\", \"#D5D5CB\"],\n },\n fonts: {\n heading: [\"Sectra\", \"Georgia\", \"Source Han Serif SC\", \"serif\"],\n body: [\"Inter\", \"PingFang SC\", \"system-ui\"],\n },\n shape: { radius: 2, gapScale: 1.05 }, // 学术严谨微圆+论文留白\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#FAFAF6\" },\n chapter: { kind: \"color\", value: \"#006A4E\" },\n content: { kind: \"color\", value: \"#FAFAF6\" },\n ending: { kind: \"color\", value: \"#FAFAF6\" },\n },\n};\n","// insight(深度洞察)——原 creative 改名(2026-07-10 用户裁决:深底红金\n// 气质其实是 Bloomberg/Economist 财经信息图风,不配叫 creative;真正的\n// 创意子类由 doodle/ink 两新主题承接)。tokens 全套不动,观感零变化。\nimport type { ThemeTokens } from \"./tokens\";\n\nexport const INSIGHT_TOKENS: ThemeTokens = {\n id: \"insight\",\n colors: {\n bg: \"#0A0A0C\",\n surface: \"#14141A\",\n primary: \"#E63946\",\n accent: \"#D4A57C\",\n text: \"#F5F5F5\",\n muted: \"#888892\",\n border: \"#2A2A2E\",\n chartPalette: [\"#E63946\", \"#D4A57C\", \"#888892\", \"#F5F5F5\"],\n },\n fonts: {\n heading: [\"Lora\", \"Georgia\", \"Source Han Serif SC\", \"serif\"],\n body: [\"Inter\", \"system-ui\"],\n },\n shape: { radius: 2, gapScale: 0.95 }, // 信息图利落+数据密度\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#0A0A0C\" },\n chapter: { kind: \"color\", value: \"#0A0A0C\" },\n content: { kind: \"color\", value: \"#0A0A0C\" },\n ending: { kind: \"color\", value: \"#0A0A0C\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * campaign(活力营销)——2026-07-13 memphis 拆分主题 A(用户拍板:场景\n * 命名 campaign + 深紫底多彩笔刷方向,参考「炫彩简约活动策划」类模板)。\n * 深紫底 + 品红/湖蓝/柠檬黄/薄荷四彩笔刷涂鸦,面向活动策划/营销\n * campaign/发布会/年轻化品牌。紫色系是全主题色域唯一空位(盘点先例:\n * 新主题配色必须先盘全主题色域找空位)。存量 memphis/doodle deck 经\n * LEGACY_THEME_MAP 兜底到本主题。\n * **零版式代码**:借 luxe 同款深底家族(poster 系 + stacked-poster/\n * two-column),气质由专属 campaign-motif(笔刷涂鸦)+ tokens 承载。\n * 对比度约束:banner-heading 横幅 baked 白字在品红横幅上仅 ~3.2:1——\n * 与 luxe 同理 content 集禁配 banner-heading。\n * chartPalette 即笔刷四色(motif 从 ctx 取色的零 hex 纪律:图表与装饰\n * 同色语言)。\n */\nexport const CAMPAIGN_TOKENS: ThemeTokens = {\n id: \"campaign\",\n colors: {\n bg: \"#3D2E78\", // 深紫\n surface: \"#4A3A8E\", // 卡底(略浅一档)\n primary: \"#F0559E\", // 品红(主强调)\n accent: \"#F7D23E\", // 柠檬黄(次强调)\n text: \"#FFFFFF\",\n muted: \"#B8AFD9\", // 浅紫灰\n border: \"#5A4AA0\",\n chartPalette: [\"#F0559E\", \"#3EC1E8\", \"#F7D23E\", \"#7FE0C3\"], // 品红/湖蓝/柠檬黄/薄荷=笔刷四色\n },\n fonts: {\n heading: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n },\n shape: { radius: 10, gapScale: 1.0 }, // 活力圆润(tech 同档)\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#3D2E78\" },\n chapter: { kind: \"color\", value: \"#3D2E78\" },\n content: { kind: \"color\", value: \"#3D2E78\" },\n ending: { kind: \"color\", value: \"#3D2E78\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * bloom(柔美庆典)——2026-07-13 memphis 拆分主题 B(用户拍板:命名\n * bloom + 紫粉杏水彩方向,参考「素雅水彩风婚庆策划」类模板)。暖奶白\n * 底 + 紫藤/杏粉/干玫瑰水彩晕染 + 宋体衬线标题 + 细线植物,面向婚庆\n * 策划/庆典邀约/花艺母婴美妆等柔美生活方式品牌。粉彩水彩质感是全主题\n * 色域空位;与 campaign 的深紫同族但明度两极不混淆。\n * **零版式代码**:借 heritage 同款浅底家族(poster cover/chapter +\n * banner content/ending + two-column 轮换),气质由专属 bloom-motif\n * (水彩晕染斑块+植物细线)+ tokens 承载。\n * 对比度:banner 横幅 primary #6F6190 上白字 ~6:1 ✓ 可配 banner-heading。\n * poster-chapter 标题 colors.text 直画——奶白底 ✓(chapter 底必须浅色\n * 的先例约束满足)。\n * chartPalette 即水彩四色(motif 零 hex 纪律)。\n */\nexport const BLOOM_TOKENS: ThemeTokens = {\n id: \"bloom\",\n colors: {\n bg: \"#F6F1EA\", // 暖奶白\n surface: \"#FFFFFF\",\n primary: \"#6F6190\", // 紫藤(标题/横幅)\n accent: \"#D89A8E\", // 杏粉\n text: \"#4A4258\", // 深紫灰\n muted: \"#9C93A8\",\n border: \"#E8E0D8\",\n chartPalette: [\"#8A7BA8\", \"#D89A8E\", \"#C9A0B0\", \"#A8B8CC\"], // 紫藤/杏粉/干玫瑰/雾蓝=水彩四色\n },\n fonts: {\n // 婚庆衬线报题气质:SimSun 前置(CJK 安全衬线白名单唯一选择,journal 先例)\n heading: [\"SimSun\", \"宋体\", \"Georgia\", \"serif\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n },\n shape: { radius: 6, gapScale: 1.1 }, // 柔和圆角+呼吸感\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#F6F1EA\" },\n chapter: { kind: \"color\", value: \"#F6F1EA\" },\n content: { kind: \"color\", value: \"#F6F1EA\" },\n ending: { kind: \"color\", value: \"#F6F1EA\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * classroom(教学课堂)——2026-07-13 第 13 主题(用户参考三张莫兰迪教学\n * 模板拍板新增教育培训类)。莫兰迪灰调(雾蓝/藕粉/灰绿薄荷/奶咖)+\n * 米白纸调底,柔润亲和的课堂课件气质,面向教学课件/课堂授课/培训机构/\n * K12 儿童教育。与 academic(深绿严肃学术研究/答辩)场景切分:classroom\n * 主打「亲和的教与学」,academic 主打「严谨的学术」。\n * 色域盘点:莫兰迪灰调(低饱和加灰色系)此前完全空缺。\n * **零版式代码**:借 academic 的 rail 编号家族(左轨圆徽章与参考图的\n * 圆形编号徽章语言天然契合)+ 共享 cover/two-column,气质由专属\n * classroom-motif(平滑有机斑块+手绘点线装饰,与 bloom 的水彩纹理\n * 刻意区分——参考图斑块是平滑的)+ tokens 承载。\n * 对比度:雾蓝 #7A98A6 横幅白字仅 ~2.9:1——content 禁配 banner-heading\n * (luxe 先例),rail-numbered 徽章数字白字在雾蓝上是小元素大字重可读。\n * chartPalette 即莫兰迪装饰四色(motif 零 hex 纪律)。\n */\nexport const CLASSROOM_TOKENS: ThemeTokens = {\n id: \"classroom\",\n colors: {\n bg: \"#F4F1EB\", // 米白纸调\n surface: \"#FFFFFF\",\n primary: \"#6E8E9E\", // 雾蓝(标题/徽章)\n accent: \"#D89A88\", // 藕粉珊瑚\n text: \"#48545C\", // 灰蓝黑\n muted: \"#98A2A6\",\n border: \"#E2DDD4\",\n chartPalette: [\"#7A98A6\", \"#D89A88\", \"#AEBCA4\", \"#C9B49C\"], // 雾蓝/藕粉/灰绿薄荷/奶咖=莫兰迪装饰四色\n },\n fonts: {\n heading: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n },\n shape: { radius: 12, gapScale: 1.1 }, // 全主题最圆润档(课堂亲和)+呼吸感\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#F4F1EB\" },\n // chapter 走 primary 雾蓝底(rail-chapter 标题是白字,academic 同款\n // per-type 深底约定——米白底会白字不可见)\n chapter: { kind: \"color\", value: \"#6E8E9E\" },\n content: { kind: \"color\", value: \"#F4F1EB\" },\n ending: { kind: \"color\", value: \"#F4F1EB\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * ink(水墨国风)——2026-07-10 用户裁决新增的「真创意」子类之二(用户\n * 点名的古风/中国风例子)。宣纸米底 + 墨黑 + 朱砂红 + 楷体标题(KaiTi\n * 在 CJK 导出安全白名单内),面向传统文化/节日/国潮/茶酒场景。专属\n * ink-motif 画古籍双线框 + 朱砂印章 + 淡墨山形。\n */\nexport const INK_TOKENS: ThemeTokens = {\n id: \"ink\",\n colors: {\n bg: \"#F5F0E6\", // 宣纸米\n surface: \"#FBF8F1\",\n primary: \"#2B2B2B\", // 墨\n accent: \"#C3272B\", // 朱砂\n text: \"#262421\",\n muted: \"#8A8071\",\n border: \"#DED5C2\",\n chartPalette: [\"#2B2B2B\", \"#C3272B\", \"#8A8071\", \"#B5A36F\"],\n },\n fonts: {\n heading: [\"KaiTi\", \"楷体\", \"SimSun\", \"宋体\", \"serif\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"system-ui\"],\n },\n shape: { radius: 8, gapScale: 1.15 }, // 圆角柔和(水墨无锋,用户裁决)+留白\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#F5F0E6\" },\n chapter: { kind: \"color\", value: \"#F5F0E6\" },\n content: { kind: \"color\", value: \"#F5F0E6\" },\n ending: { kind: \"color\", value: \"#F5F0E6\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\nexport const TECH_TOKENS: ThemeTokens = {\n id: \"tech\",\n colors: {\n bg: \"#060A13\",\n surface: \"#0A101C\",\n // No `panel` override (Task 1, electric-cyan single-accent redesign):\n // the old lighter-than-surface \"card-on-card\" tier read as a muddy\n // blue-grey that fought the new near-black system, so bento now falls\n // back to `colors.surface` for its card fill like most of the other\n // theme token files already do (only `custom` sets a distinct `panel`).\n primary: \"#2DD4E6\",\n accent: \"#2DD4E6\",\n text: \"#F2F6FA\",\n muted: \"#8A94A6\",\n border: \"#2C3140\",\n // Single-accent redesign (Task 1): the old accentPool cycle is gone —\n // charts still need real hue separation between data series though, so\n // chartPalette stays a multi-color pool, just led by the theme's own\n // electric-cyan accent instead of an unrelated blue.\n chartPalette: [\"#2DD4E6\", \"#3ECF8E\", \"#F5A623\", \"#B78CFF\", \"#4A5568\"],\n },\n fonts: {\n // Microsoft YaHei 前置:导出的 pptx 单字体无法回退,纯拉丁 sans 无 CJK\n // 字形会渲染成豆腐块。雅黑承担 tech 的科技感无衬线气质。\n heading: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Helvetica\", \"Inter\", \"Arial\", \"system-ui\"],\n body: [\n \"Microsoft YaHei\",\n \"Helvetica Neue\",\n \"Helvetica\",\n \"Inter\",\n \"Arial\",\n \"system-ui\",\n ],\n mono: [\"Consolas\", \"Courier New\"],\n },\n // 重设计(2026-07-09):死黑纯色底是「空腔感」的放大器——换深蓝黑对角\n // 渐变(左上略亮、右下沉底),页面获得纵深,装饰光晕也有了依托。\n shape: { radius: 10, gapScale: 1 }, // bento 圆润(科技卡片感)\n defaultBackgrounds: {\n cover: { kind: \"gradient\", from: \"#0D1526\", to: \"#05070E\", direction: \"diagonal\" },\n chapter: { kind: \"gradient\", from: \"#0D1526\", to: \"#05070E\", direction: \"diagonal\" },\n content: { kind: \"gradient\", from: \"#0A111F\", to: \"#060A13\", direction: \"diagonal\" },\n ending: { kind: \"gradient\", from: \"#0D1526\", to: \"#05070E\", direction: \"diagonal\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * runway(时尚秀场)——2026-07-10 拆分后的新主题(初名 magazine,用户\n * 裁决时尚主题不叫 magazine;magazine 转为 legacy id 指向 journal,存量\n * 人文观感 deck 回放不再突变)(原 magazine 的人文\n * 气质拆去 journal)。高对比时尚大片风:纯白底 + 纯黑报头 + 正红点缀\n * (Vogue 语法),面向时尚品牌/潮流生活/品牌大片场景。\n * **零版式代码**:与 journal 共享 masthead 报头家族(报头体正是时尚杂志\n * 的语言,同版式不同 tokens 气质大变——luxe 借 creative 家族的同款先例),\n * corner-ornament 角饰是人文感,本主题不带 motif。\n * 报头字体保持衬线(SimSun 承载 CJK,Didot 类报头是时尚杂志国际惯例),\n * 正文无衬线。\n */\nexport const RUNWAY_TOKENS: ThemeTokens = {\n id: \"runway\",\n colors: {\n bg: \"#FFFFFF\",\n surface: \"#FFFFFF\",\n primary: \"#0A0A0A\", // 纯黑报头\n accent: \"#D80027\", // 正红(口红红)点缀\n text: \"#111417\",\n muted: \"#77787D\",\n border: \"#E8E8E8\",\n cardStroke: \"#E8E8E8\", // 纯白底白卡靠描边区分\n chartPalette: [\"#0A0A0A\", \"#D80027\", \"#77787D\", \"#C9C9CC\"],\n },\n fonts: {\n heading: [\"SimSun\", \"宋体\", \"Georgia\", \"serif\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n },\n shape: { radius: 0, gapScale: 0.95 }, // 时尚硬朗+密排(spec 提案)\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#FFFFFF\" },\n chapter: { kind: \"color\", value: \"#FFFFFF\" },\n content: { kind: \"color\", value: \"#FFFFFF\" },\n ending: { kind: \"color\", value: \"#FFFFFF\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * journal(人文期刊)——原 magazine 主题纯改名(2026-07-10 用户裁决拆分:\n * 「现在的人文叙事/年度回顾风格配色和版式根本不是人们潜意识里对杂志的\n * 印象」——暖纸+砖红+宋体报头其实是人文期刊气质,magazine 名字腾给新的\n * 时尚杂志主题)。tokens/版式全套继承,观感零变化。存量 editorial-serif/\n * anthropic-clay 旧 deck 的 legacy 链随迁指向本主题。\n */\n\nexport const JOURNAL_TOKENS: ThemeTokens = {\n id: \"journal\",\n colors: {\n bg: \"#FAF7F2\",\n surface: \"#FFFFFF\",\n primary: \"#1A1A1A\",\n accent: \"#C0392B\",\n text: \"#1F1F1F\",\n muted: \"#6E6259\",\n border: \"#E4DCD0\",\n // Warm, low-saturation set (brick red accent + warm neutrals) to match\n // the editorial paper aesthetic — no saturated chart colors.\n chartPalette: [\"#C0392B\", \"#A67B5B\", \"#6E6259\", \"#8C7B6B\"],\n },\n fonts: {\n // SimSun 前置:导出的 pptx 单字体无法回退。Georgia/serif 是纯拉丁衬线,\n // 无 CJK 字形,中文标题会渲染成豆腐块。CJK 安全衬线白名单里唯一合适\n // 的是 SimSun/宋体,用它承担 magazine 的报题气质。\n heading: [\"SimSun\", \"宋体\", \"Georgia\", \"serif\"],\n body: [\"Microsoft YaHei\", \"PingFang SC\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n mono: [\"Consolas\", \"Courier New\"],\n },\n shape: { radius: 6, gapScale: 1.1 }, // 期刊温和+杂志留白\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#FAF7F2\" },\n chapter: { kind: \"color\", value: \"#FAF7F2\" },\n content: { kind: \"color\", value: \"#FAF7F2\" },\n ending: { kind: \"color\", value: \"#FAF7F2\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * luxe(高端品牌)——原 retail 主题改名+黑金重定位(2026-07-10 用户视觉\n * 伴侣裁决:配色选「高级黑金」方向,且 retail 名字不够高级)。\n * 深炭底 + 香槟金,奢侈品/美妆大牌/年会盛典气质。深底主题中与\n * creative(黑+红)、tech(黑蓝+青)以金色拉开。\n * 历史:retail v1 暖橙(撞 magazine)→ v2 莓红紫(否)→ v3 珊瑚青(否)\n * → luxe 黑金(视觉伴侣六方向对比后定案)。存量 retail deck 经\n * LEGACY_THEME_MAP 兜底解析到本主题。\n * **零版式代码**:全部借用 creative 家族深底版式(poster 系)+ 共享\n * two-column/split-diagonal。\n * 对比度约束:banner-heading 的横幅文字是 baked 白字,金色横幅上白字\n * 不可读——manifest 的 content 集**禁配 banner-heading**,用深底安全的\n * stacked-poster/two-column。\n */\nexport const LUXE_TOKENS: ThemeTokens = {\n id: \"luxe\",\n colors: {\n bg: \"#161310\", // 深炭\n surface: \"#211D18\", // 卡底(略浅一档)\n primary: \"#D4B876\", // 香槟金\n accent: \"#A67B45\", // 深铜金(层次)\n text: \"#F4EDDF\", // 象牙白\n muted: \"#9A9184\",\n border: \"#3A342C\",\n chartPalette: [\"#D4B876\", \"#A67B45\", \"#8C9A8E\", \"#6E7B8C\"],\n },\n fonts: {\n // 黑金排印:无衬线大字重承载,雅黑前置保 CJK 导出。\n heading: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n body: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n },\n shape: { radius: 0, gapScale: 1.1 }, // 黑金直角凌厉+呼吸感(spec 提案,2026-07-10)\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#161310\" },\n chapter: { kind: \"color\", value: \"#161310\" },\n content: { kind: \"color\", value: \"#161310\" },\n ending: { kind: \"color\", value: \"#161310\" },\n },\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/**\n * heritage(典藏传承)——第 8 主题(2026-07-10 用户从视觉伴侣六方向中\n * 追加拍板「勃艮第×焦糖也不错,再加一个」)。putty 暖米底 + 勃艮第酒红 +\n * 焦糖铜,轻奢老钱质感,面向品牌传承/周年庆典/文化品鉴/高端定制场景。\n * 检索依据:「reds trending darker——old money 质感」+「putty 配黑白是\n * 当下 presentation 专用的高级感」(2026 趋势检索,见 luxe 同批调研)。\n * 与 magazine 暖纸的区分:主色勃艮第酒红大面积出现(banner/巨号数字)vs\n * magazine 黑标题+砖红点缀,无衬线 vs 报题衬线。\n * **零版式代码**:沿用原 retail v1 验证过的浅底混搭(creative 家族\n * cover/chapter + consulting 家族 content/ending + two-column 轮换)——\n * 酒红横幅上 baked 白字对比度充足(deep red ≈ 0.06 明度)。\n */\nexport const HERITAGE_TOKENS: ThemeTokens = {\n id: \"heritage\",\n colors: {\n bg: \"#F6F2EC\", // putty 暖米\n surface: \"#FFFFFF\",\n primary: \"#7D2A3C\", // 勃艮第酒红\n accent: \"#C98A4B\", // 焦糖铜\n text: \"#33262A\", // 深酒褐\n muted: \"#8C7A72\",\n border: \"#E8DFD3\",\n chartPalette: [\"#7D2A3C\", \"#C98A4B\", \"#4A6670\", \"#A3A38C\"],\n },\n fonts: {\n heading: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n body: [\"Microsoft YaHei\", \"Helvetica Neue\", \"Arial\", \"system-ui\"],\n },\n shape: { radius: 4, gapScale: 1.05 }, // 传统装帧微圆+沉稳\n defaultBackgrounds: {\n cover: { kind: \"color\", value: \"#F6F2EC\" },\n chapter: { kind: \"color\", value: \"#F6F2EC\" },\n content: { kind: \"color\", value: \"#F6F2EC\" },\n ending: { kind: \"color\", value: \"#F6F2EC\" },\n },\n};\n","import {\n applyOverride,\n type ThemeOverride,\n type ThemeTokens,\n} from \"./tokens\";\nimport { CONSULTING_TOKENS } from \"./consulting\";\nimport { ENTERPRISE_TOKENS } from \"./enterprise\";\nimport { ACADEMIC_TOKENS } from \"./academic\";\nimport { INSIGHT_TOKENS } from \"./insight\";\nimport { CAMPAIGN_TOKENS } from \"./campaign\";\nimport { BLOOM_TOKENS } from \"./bloom\";\nimport { CLASSROOM_TOKENS } from \"./classroom\";\nimport { INK_TOKENS } from \"./ink\";\nimport { TECH_TOKENS } from \"./tech\";\nimport { RUNWAY_TOKENS } from \"./runway\";\nimport { JOURNAL_TOKENS } from \"./journal\";\nimport { LUXE_TOKENS } from \"./luxe\";\nimport { HERITAGE_TOKENS } from \"./heritage\";\n\n/**\n * The 13 canonical themes, registered/renderable. 场景化命名:对外 theme.id\n * 按内容场景命名(consulting Business Consulting / enterprise Enterprise /\n * academic Academic / insight Financial Insight / campaign Marketing Campaign /\n * bloom Soft Bloom / classroom Classroom / ink Ink Wash / tech Tech /\n * runway Fashion Runway / journal Editorial Journal / luxe Luxe /\n * heritage Heritage)。pptfast 是独立分叉,无存量 deck 兼容包袱,不维护 legacy id\n * 映射表(resolveThemeId 对未知 id 一律回落 consulting)。\n */\nexport const CANONICAL_THEME_IDS = [\n \"consulting\",\n \"enterprise\",\n \"academic\",\n \"insight\",\n \"campaign\",\n \"bloom\",\n \"classroom\",\n \"ink\",\n \"tech\",\n \"runway\",\n \"journal\",\n \"luxe\",\n \"heritage\",\n] as const;\n\nexport type CanonicalThemeId = (typeof CANONICAL_THEME_IDS)[number];\n\n/** 场景 id → 英文场景名(plan 卡片徽章等对用户展示处用,接口统一英文)。 */\nexport const THEME_LABELS: Record<CanonicalThemeId, string> = {\n consulting: \"Business Consulting\",\n academic: \"Academic\",\n insight: \"Financial Insight\",\n campaign: \"Marketing Campaign\",\n bloom: \"Soft Bloom\",\n classroom: \"Classroom\",\n ink: \"Ink Wash\",\n tech: \"Tech\",\n runway: \"Fashion Runway\",\n journal: \"Editorial Journal\",\n enterprise: \"Enterprise\",\n luxe: \"Luxe\",\n heritage: \"Heritage\",\n};\n\n/** Map any theme id onto a canonical, registered theme id. Unknown ids fall back to consulting. */\nexport function resolveThemeId(id: string): CanonicalThemeId {\n return (CANONICAL_THEME_IDS as readonly string[]).includes(id)\n ? (id as CanonicalThemeId)\n : \"consulting\";\n}\n\nexport const THEME_TOKENS: Record<CanonicalThemeId, ThemeTokens> = {\n consulting: CONSULTING_TOKENS,\n enterprise: ENTERPRISE_TOKENS,\n academic: ACADEMIC_TOKENS,\n insight: INSIGHT_TOKENS,\n campaign: CAMPAIGN_TOKENS,\n bloom: BLOOM_TOKENS,\n classroom: CLASSROOM_TOKENS,\n ink: INK_TOKENS,\n tech: TECH_TOKENS,\n runway: RUNWAY_TOKENS,\n journal: JOURNAL_TOKENS,\n luxe: LUXE_TOKENS,\n heritage: HERITAGE_TOKENS,\n};\n\nexport function getTheme(\n id: string,\n override?: ThemeOverride,\n): ThemeTokens {\n const base = THEME_TOKENS[resolveThemeId(id)];\n if (!base) throw new Error(`Unknown theme id: ${id}`);\n return applyOverride(base, override);\n}\n\nexport type {\n ThemeTokens,\n ThemeColors,\n ThemeFonts,\n ThemeOverride,\n LayoutType,\n} from \"./tokens\";\nexport { applyOverride } from \"./tokens\";\n","/**\n * v3 master-builder — single-source SVG era.\n *\n * The full-page SVG (FullSlideSvg → svg2pptx) now paints background, brand logo\n * and footer chrome on every slide, so the masters are intentionally near-empty.\n * The one thing that must stay a native PowerPoint object is the dynamic slide\n * number (it renumbers itself when slides are added/removed), so content masters\n * keep it; the SVG preview draws its own static page number instead.\n */\nimport type pptxgen from \"pptxgenjs\"\nimport type { ThemeTokens, LayoutType } from \"../themes\"\n\nconst SLIDE_TYPES: LayoutType[] = [\"cover\", \"chapter\", \"content\", \"ending\"]\n\n/** Define one master per slide type. 页码占位已删(2026-07-09 用户裁决)。 */\nexport function defineMastersForIR(pptx: pptxgen, _tokens: ThemeTokens) {\n for (const type of SLIDE_TYPES) {\n pptx.defineSlideMaster({ title: type })\n }\n}\n","import JSZip from \"jszip\"\nimport type { Op } from \"./dispatch\"\nimport type { TextRunData } from \"./text\"\nimport { gradientFillXml } from \"./gradient\"\nimport { blockMarker } from \"../pptx-animations\"\n\n/**\n * The subset of a pptxgenjs `Slide` that the render layer uses. Keeping it\n * narrow lets us unit-test the op→call translation against a spy without\n * pulling in the whole pptxgenjs runtime.\n */\nexport interface SlideLike {\n addText(text: unknown, opts: unknown): unknown\n addShape(shape: string, opts: unknown): unknown\n addImage(opts: unknown): unknown\n}\n\n/**\n * A pending `a:gradFill` swap for one shape, keyed by the unique `objectName`\n * (`p:cNvPr name=`) `renderOp` assigned it. Produced by `renderOps`, consumed\n * by `applyGradientFills` after the whole presentation has been written.\n */\nexport interface GradientFillPatch {\n objectName: string\n xml: string\n}\n\n/**\n * A short random token, freshly generated per *shape* (each call site below\n * calls this once per gradient op it processes, not once per `renderOps`\n * call) and folded into that shape's `objectName`. `renderOps` runs once per\n * slide, but a caller building a multi-slide deck (see `pptx-generate.ts`)\n * accumulates patches from every slide's `renderOps` call into one array\n * before patching the finished multi-slide pptx (`pptx.write()` happens once,\n * for the whole deck). Plain 0-based names would collide across slides; a\n * fresh token per shape (rather than one shared token per call) makes any\n * collision — within a slide or across slides — astronomically unlikely,\n * without `renderOps` needing to know its own slide index.\n */\nfunction randomToken(): string {\n return Math.random().toString(36).slice(2, 8)\n}\n\n/**\n * Fold wave-C S3's `blk{slideIndex}-{blockIndex}` marker into `opts.objectName`\n * (mutating `opts` in place), if `op` carries a `blockIndex` (set by\n * `svg2pptx/dispatch.ts`'s `walk` when this op's source `<g>` was tagged\n * `data-blk` — only happens when `meta.animation.elements === \"auto\"`, see\n * `BlockCtx.blockIndex`'s doc comment). A no-op whenever `op.blockIndex` or\n * `slideIndex` is absent, which is always true on the default (`elements`\n * unset/`\"none\"`) export path — the whole point being that path never emits\n * `data-blk` in the first place, so this never fires and `objectName` stays\n * exactly what it already was (untouched, or the gradient patch's own name).\n *\n * Appended as a suffix rather than replacing any existing gradient-patch\n * `objectName` so the two markers coexist on one shape (S3: \"与渐变的\n * objectName 标记兼容共存\"); when there's no existing name, a fresh one is\n * minted the same way the gradient patch does (`svg2pptx-` + a random token)\n * so every block-tagged shape still gets a legible, distinguishable name in\n * PowerPoint's Selection Pane.\n */\nfunction withBlockMarker(\n opts: Record<string, unknown>,\n op: Op,\n slideIndex: number | undefined,\n): void {\n if (op.blockIndex == null || slideIndex == null) return\n const marker = blockMarker(slideIndex, op.blockIndex)\n const existing = opts.objectName as string | undefined\n opts.objectName = existing ? `${existing}-${marker}` : `svg2pptx-${randomToken()}-${marker}`\n}\n\n/** Map a styled text run to a pptxgenjs `{ text, options }` entry. */\nfunction runToProp(run: TextRunData): { text: string; options: Record<string, unknown> } {\n const options: Record<string, unknown> = {}\n if (run.bold) options.bold = true\n if (run.italic) options.italic = true\n if (run.underline) options.underline = true\n if (run.color) options.color = run.color\n if (run.fontSize != null) options.fontSize = run.fontSize\n return { text: run.text, options }\n}\n\n/**\n * Apply a single op to a slide as the matching pptxgenjs call.\n *\n * `patches` collects any gradient fill this op carries: pptxgenjs has no\n * gradient-fill API (see vc-task-6 report, pre-check A), so a gradient shape\n * is written with its solid placeholder `fill` (already computed by\n * `style.ts`'s `applyFill`) plus a unique `objectName`, and the real\n * `<a:gradFill>` is recorded here for `applyGradientFills` to swap in later,\n * once the whole presentation has been written to a .pptx zip.\n *\n * `slideIndex` is this op's slide's 0-based position in the deck — only used\n * (via `withBlockMarker`) to fold wave-C S3's block marker into `objectName`\n * when `op.blockIndex` is set; omit it and block-tagged ops just keep\n * whatever `objectName` they'd otherwise get (i.e. the gradient patch's, or\n * none).\n */\nexport function renderOp(\n slide: SlideLike,\n op: Op,\n patches: GradientFillPatch[] = [],\n slideIndex?: number,\n): void {\n switch (op.kind) {\n case \"shape\": {\n const opts: Record<string, unknown> = { x: op.x, y: op.y, w: op.w, h: op.h }\n if (op.fill) opts.fill = op.fill\n if (op.line) opts.line = op.line\n if (\"rectRadius\" in op && op.rectRadius != null) opts.rectRadius = op.rectRadius\n if (op.gradientFill) opts.objectName = `svg2pptx-gradient-${randomToken()}-${patches.length}`\n // Must run before the gradient patch is recorded below: it may append\n // the blk marker onto `opts.objectName`, and the patch has to target\n // whatever name actually ends up in the written XML, not the\n // pre-marker one (`applyGradientFills`'s lookup is an exact match).\n withBlockMarker(opts, op, slideIndex)\n if (op.gradientFill) {\n patches.push({ objectName: opts.objectName as string, xml: gradientFillXml(op.gradientFill) })\n }\n slide.addShape(op.shape, opts)\n break\n }\n case \"line\": {\n const opts: Record<string, unknown> = {\n x: op.x,\n y: op.y,\n w: op.w,\n h: op.h,\n line: op.line,\n }\n if (op.flipH) opts.flipH = true\n if (op.flipV) opts.flipV = true\n withBlockMarker(opts, op, slideIndex)\n slide.addShape(\"line\", opts)\n break\n }\n case \"path\": {\n const opts: Record<string, unknown> = {\n x: op.x,\n y: op.y,\n w: op.w,\n h: op.h,\n points: op.points,\n }\n if (op.fill) opts.fill = op.fill\n if (op.line) opts.line = op.line\n if (op.gradientFill) opts.objectName = `svg2pptx-gradient-${randomToken()}-${patches.length}`\n // See the \"shape\" case above: must run before the patch is recorded.\n withBlockMarker(opts, op, slideIndex)\n if (op.gradientFill) {\n patches.push({ objectName: opts.objectName as string, xml: gradientFillXml(op.gradientFill) })\n }\n slide.addShape(\"custGeom\", opts)\n break\n }\n case \"text\": {\n const opts: Record<string, unknown> = {\n x: op.x,\n y: op.y,\n w: op.w,\n h: op.h,\n align: op.align,\n valign: \"top\",\n fontSize: op.fontSize,\n margin: 0,\n }\n if (op.fontFace) opts.fontFace = op.fontFace\n if (op.color) opts.color = op.color\n if (op.transparency != null) opts.transparency = op.transparency\n // SVG <text> 是逐行预排的单行文本——pptx 文本框的自动换行只会在\n // 字体回退/charSpacing 使字宽变化时把行内文字挤到第二行并被单行高\n // 的框裁掉(2026-07-10 全主题导出审计:runway 6 处截断的根因)。\n // 关闭换行让超宽文字横向溢出显示,与 SVG 语义一致。\n opts.wrap = false\n withBlockMarker(opts, op, slideIndex)\n slide.addText(op.runs.map(runToProp), opts)\n break\n }\n case \"image\": {\n const opts: Record<string, unknown> = { x: op.x, y: op.y, w: op.w, h: op.h, data: op.data }\n if (op.sizing) opts.sizing = op.sizing\n withBlockMarker(opts, op, slideIndex)\n slide.addImage(opts)\n break\n }\n }\n}\n\n/**\n * Apply every op to a slide, in order. Returns any gradient fill patches\n * collected along the way — pass them to `applyGradientFills` once the whole\n * presentation has been written (see that function's doc comment).\n *\n * `slideIndex` (this slide's 0-based deck position) is threaded straight\n * through to `renderOp`/`withBlockMarker` — see `renderOp`'s doc comment.\n */\nexport function renderOps(slide: SlideLike, ops: Op[], slideIndex?: number): GradientFillPatch[] {\n const patches: GradientFillPatch[] = []\n for (const op of ops) renderOp(slide, op, patches, slideIndex)\n return patches\n}\n\n/** A `.pptx`'s own slide part path, e.g. `ppt/slides/slide1.xml`. */\nconst SLIDE_PART_RE = /^ppt\\/slides\\/slide\\d+\\.xml$/\n\n/**\n * Match a shape's own fill — the first `<a:solidFill>…</a:solidFill>` (or\n * `<a:noFill/>`, not produced here since a gradient op always sets a\n * placeholder `fill`) inside its `<p:spPr>`. It is always first: pptxgenjs\n * writes fill immediately after the shape's geometry and before its `<a:ln>`\n * (stroke), so a stroke's own `<a:solidFill>` — if any — always comes later.\n */\nconst SOLID_FILL_RE = /<a:solidFill>.*?<\\/a:solidFill>/s\n\n/**\n * Patch a finished `.pptx`'s slide XML, swapping each gradient shape's solid\n * placeholder fill for its real `<a:gradFill>`.\n *\n * Pre-check A (vc-task-6 report) found pptxgenjs 4.0.1 has no gradient-fill\n * API at all: `ShapeFillProps.type` is typed `'none' | 'solid'` and the\n * internal `genXmlColorSelection` has no branch for anything else, so there\n * is no hook — public or private — to ask it to emit `a:gradFill`. Patching\n * the written XML directly is the same shape of fix as the sibling\n * `dedupePptxMedia` (open the zip with JSZip, rewrite parts, re-zip).\n *\n * Unlike that dedupe pass, this one fails loud instead of swallowing errors:\n * a dedupe miss just leaves the file a little larger, but a patch miss would\n * silently ship a solid placeholder where a gradient was authored — a wrong\n * visual, not a crash, and exactly the kind of silent divergence this whole\n * feature exists to prevent.\n */\nexport async function applyGradientFills(\n pptx: Blob | ArrayBuffer | Uint8Array,\n patches: GradientFillPatch[],\n): Promise<Blob> {\n const PPTX_MIME = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n if (patches.length === 0) {\n return pptx instanceof Blob ? pptx : new Blob([pptx as BlobPart], { type: PPTX_MIME })\n }\n\n const zip = await JSZip.loadAsync(pptx instanceof Blob ? await pptx.arrayBuffer() : pptx)\n const slidePaths = Object.keys(zip.files).filter(\n (p) => SLIDE_PART_RE.test(p) && !zip.files[p].dir,\n )\n\n const pending = new Map(patches.map((p) => [p.objectName, p]))\n for (const path of slidePaths) {\n let xml = await zip.files[path].async(\"string\")\n let changed = false\n for (const [objectName, patch] of pending) {\n const anchor = xml.indexOf(`name=\"${objectName}\"`)\n if (anchor === -1) continue // this shape lives on a different slide part\n\n const spStart = xml.lastIndexOf(\"<p:sp>\", anchor)\n const spEnd = xml.indexOf(\"</p:sp>\", anchor)\n if (spStart === -1 || spEnd === -1) {\n throw new Error(\n `svg2pptx: gradient patch target \"${objectName}\" is not inside a <p:sp>…</p:sp>`,\n )\n }\n\n const block = xml.slice(spStart, spEnd)\n let replaced = false\n const patched = block.replace(SOLID_FILL_RE, () => {\n replaced = true\n return patch.xml\n })\n if (!replaced) {\n throw new Error(\n `svg2pptx: gradient patch target \"${objectName}\" has no <a:solidFill> to replace`,\n )\n }\n\n xml = xml.slice(0, spStart) + patched + xml.slice(spEnd)\n pending.delete(objectName)\n changed = true\n }\n if (changed) zip.file(path, xml)\n }\n\n if (pending.size > 0) {\n throw new Error(\n `svg2pptx: gradient patch target(s) not found in any slide: ${Array.from(pending.keys()).join(\", \")}`,\n )\n }\n\n const ab = await zip.generateAsync({ type: \"arraybuffer\", compression: \"DEFLATE\" })\n return new Blob([ab], { type: PPTX_MIME })\n}\n","/**\n * SVG `<linearGradient>`/`<radialGradient>` → DrawingML `a:gradFill`.\n *\n * Not used by slide backgrounds today: `svg/Background.tsx`'s\n * `kind:\"gradient\"` case approximates a gradient with 24 solid-fill `<rect>`\n * bands (`gradient-bands.ts`) instead of a real `<linearGradient>`, so it\n * never produces the `fill=\"url(#...)\"` input this module looks for — the\n * two don't overlap or conflict. This module is separate, currently-unwired\n * infrastructure for arbitrary shapes (rect/circle/ellipse/polygon/polyline/\n * path) that *do* carry a real gradient `url(#...)` fill — groundwork for a\n * future theme decoration layer / chart gradients (see vc-task-6 brief), not\n * a replacement for the background band approximation.\n *\n * Scope (controlled subset, see vc-task-6 brief):\n * - `gradientUnits` only supports the SVG default `objectBoundingBox`.\n * `userSpaceOnUse` has no meaningful 1:1 DrawingML mapping under this\n * renderer's px→in flattening (no viewBox/user-space concept survives the\n * conversion), so it throws. `svg/subset-validate.ts` already rejects\n * it as an independent dev-time tripwire on the preview side — this throw\n * is the converter's own defense so a direct/future caller that skips that\n * tripwire still fails loud instead of silently mis-rendering.\n * - Radial gradients only carry stops. `cx`/`cy`/`r` are ignored: DrawingML's\n * `<a:path path=\"circle\">` + `fillToRect` model describes a *rectangle*\n * collapsing to a focal point, which isn't a 1:1 match for SVG's focal-point\n * circle model. Modeling that correctly is real work with no current\n * consumer (YAGNI) — every radial gradient renders as a centered circle\n * (`fillToRect l/t/r/b = 50000`, matching the SVG default cx=cy=r=50%).\n */\n\n/** One color stop, already normalized to a 0–1 position. */\nexport interface GradientStop {\n pos: number\n /** Hash-less uppercase RRGGBB, matching this module's other hex conventions. */\n hex: string\n /** 0–1; absent means the SVG default of fully opaque (1). */\n alpha?: number\n}\n\nexport type GradientDef =\n | { kind: \"linear\"; angleDeg: number; stops: GradientStop[] }\n | { kind: \"radial\"; stops: GradientStop[] }\n\nfunction num(el: Element, name: string, fallback: number): number {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n const n = parseFloat(v)\n return Number.isNaN(n) ? fallback : n\n}\n\nfunction clamp01(v: number): number {\n return Math.min(1, Math.max(0, v))\n}\n\n/** Parse a gradient `<stop>`'s `offset` (\"0–1\" or \"N%\") into a 0–1 fraction. */\nfunction parseOffset(raw: string | null): number {\n if (!raw) return 0\n const v = raw.trim()\n const isPct = v.endsWith(\"%\")\n const n = parseFloat(isPct ? v.slice(0, -1) : v)\n if (Number.isNaN(n)) return 0\n return clamp01(isPct ? n / 100 : n)\n}\n\n/**\n * Parse a `<stop>`'s `stop-color`. Scoped to hex per the brief (this feature\n * serves generated/template SVG, not arbitrary author input) — deliberately\n * stricter than `./color`'s `svgColorToHex`, which silently falls back to\n * black on an unrecognized format. A gradient stop silently going black is a\n * much easier bug to ship unnoticed than a whole shape going black, so this\n * fails loud instead.\n */\nfunction parseStopColor(raw: string | null, gradientId: string): string {\n if (!raw) {\n throw new Error(`svg2pptx: gradient \"${gradientId}\" has a <stop> with no stop-color`)\n }\n const v = raw.trim()\n if (!v.startsWith(\"#\")) {\n throw new Error(\n `svg2pptx: gradient \"${gradientId}\" stop-color \"${raw}\" is not a hex color`,\n )\n }\n const hex = v.slice(1)\n if (hex.length === 3) {\n return hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n .toUpperCase()\n }\n return hex.toUpperCase()\n}\n\nfunction parseStops(gradEl: Element, gradientId: string): GradientStop[] {\n const stops: GradientStop[] = []\n for (const child of Array.from(gradEl.children)) {\n if (child.tagName.toLowerCase() !== \"stop\") continue\n const pos = parseOffset(child.getAttribute(\"offset\"))\n const hex = parseStopColor(child.getAttribute(\"stop-color\"), gradientId)\n const alphaRaw = child.getAttribute(\"stop-opacity\")\n const stop: GradientStop = { pos, hex }\n if (alphaRaw != null) {\n const alpha = parseFloat(alphaRaw)\n if (!Number.isNaN(alpha)) stop.alpha = clamp01(alpha)\n }\n stops.push(stop)\n }\n if (stops.length === 0) {\n throw new Error(`svg2pptx: gradient \"${gradientId}\" has no <stop> children`)\n }\n return stops\n}\n\nfunction assertObjectBoundingBox(el: Element, gradientId: string): void {\n const units = el.getAttribute(\"gradientUnits\")\n if (units && units !== \"objectBoundingBox\") {\n throw new Error(\n `svg2pptx: gradient \"${gradientId}\" uses gradientUnits=\"${units}\" — only the default objectBoundingBox is supported`,\n )\n }\n}\n\n/** SVG (x1,y1)→(x2,y2) vector to a DrawingML angle in degrees, 0–360, clockwise from 3 o'clock. */\nfunction linearAngleDeg(el: Element): number {\n const x1 = num(el, \"x1\", 0)\n const y1 = num(el, \"y1\", 0)\n const x2 = num(el, \"x2\", 1)\n const y2 = num(el, \"y2\", 0)\n const dx = x2 - x1\n const dy = y2 - y1\n return ((Math.atan2(dy, dx) * 180) / Math.PI + 360) % 360\n}\n\n/** Parse every `<linearGradient>`/`<radialGradient>` inside a `<defs>`, keyed by id. */\nexport function collectGradients(svgRoot: Element): Map<string, GradientDef> {\n const out = new Map<string, GradientDef>()\n for (const defs of Array.from(svgRoot.querySelectorAll(\"defs\"))) {\n for (const el of Array.from(defs.querySelectorAll(\"*\"))) {\n const tag = el.tagName.toLowerCase()\n if (tag !== \"lineargradient\" && tag !== \"radialgradient\") continue\n const id = el.getAttribute(\"id\")\n if (!id) continue // unreferenceable — nothing keys it, so nothing can use it\n\n assertObjectBoundingBox(el, id)\n const stops = parseStops(el, id)\n out.set(\n id,\n tag === \"lineargradient\"\n ? { kind: \"linear\", angleDeg: linearAngleDeg(el), stops }\n : { kind: \"radial\", stops },\n )\n }\n }\n return out\n}\n\n/**\n * Fold an element-level opacity (SVG `opacity` × `fill-opacity`, 0–1 — see\n * `style.ts`'s `elementOpacity`) into every stop's own alpha.\n *\n * DrawingML's `<a:gradFill>` has no whole-fill alpha, only per-stop\n * `<a:alpha>` — so an element's own opacity (e.g. a template watermark's\n * `opacity=\"0.06\"`) has to be multiplied into each stop individually.\n * Without this, that opacity is silently dropped: it lives on the placeholder\n * `<a:solidFill>` that `style.ts` computes for the pre-patch shape, but\n * `render.ts`'s `applyGradientFills` replaces that *entire* element with this\n * module's `<a:gradFill>` output, which never looked at element opacity.\n *\n * Returns a new `GradientDef` (or `def` itself when `opacity` is 1, since\n * there's nothing to fold in) — never mutates `def` in place, because it's\n * the shared, parsed-once-per-document object from `collectGradients`'s Map,\n * and two different elements can reference the same gradient id with two\n * different opacities.\n */\nexport function withElementOpacity(def: GradientDef, opacity: number): GradientDef {\n if (opacity >= 1) return def\n return {\n ...def,\n stops: def.stops.map((s) => ({ ...s, alpha: clamp01((s.alpha ?? 1) * opacity) })),\n }\n}\n\nfunction gsXml(stop: GradientStop): string {\n const pos = Math.round(stop.pos * 100000)\n const hasAlpha = stop.alpha !== undefined && stop.alpha < 1\n if (!hasAlpha) {\n return `<a:gs pos=\"${pos}\"><a:srgbClr val=\"${stop.hex}\"/></a:gs>`\n }\n const alphaVal = Math.round((stop.alpha as number) * 100000)\n return `<a:gs pos=\"${pos}\"><a:srgbClr val=\"${stop.hex}\"><a:alpha val=\"${alphaVal}\"/></a:srgbClr></a:gs>`\n}\n\n/**\n * Serialize a `GradientDef` to a DrawingML `<a:gradFill>` fragment.\n *\n * `rotWithShape=\"1\"` and `scaled=\"1\"` mirror SVG `objectBoundingBox` semantics,\n * where the gradient vector/circle is defined relative to the shape's own\n * bounding box regardless of the shape's own transform.\n */\nexport function gradientFillXml(def: GradientDef): string {\n const gsLst = `<a:gsLst>${def.stops.map(gsXml).join(\"\")}</a:gsLst>`\n if (def.kind === \"linear\") {\n const ang = Math.round(def.angleDeg * 60000) % 21600000\n return `<a:gradFill rotWithShape=\"1\">${gsLst}<a:lin ang=\"${ang}\" scaled=\"1\"/></a:gradFill>`\n }\n return `<a:gradFill rotWithShape=\"1\">${gsLst}<a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill>`\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n return [\n parseInt(hex.slice(0, 2), 16),\n parseInt(hex.slice(2, 4), 16),\n parseInt(hex.slice(4, 6), 16),\n ]\n}\n\nfunction toHexByte(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, \"0\").toUpperCase()\n}\n\n/**\n * Blend a gradient's first and last stop into one solid hex color.\n *\n * Used as the shape's placeholder `fill` until the post-write JSZip pass\n * (`render.ts`'s `applyGradientFills`) swaps in the real `<a:gradFill>` — see\n * that function's doc comment and the vc-task-6 report's pre-check A for why\n * pptxgenjs needs a real solid fill up front. Also doubles as the \"first/last\n * stop midpoint\" YAGNI fallback the brief calls for if a shape's gradFill\n * patch is ever skipped.\n */\nexport function gradientMidpointHex(def: GradientDef): string {\n const first = def.stops[0]\n const last = def.stops[def.stops.length - 1]\n const [r1, g1, b1] = hexToRgb(first.hex)\n const [r2, g2, b2] = hexToRgb(last.hex)\n return toHexByte((r1 + r2) / 2) + toHexByte((g1 + g2) / 2) + toHexByte((b1 + b2) / 2)\n}\n","import JSZip from \"jszip\"\nimport type { Block } from \"@/ir\"\n\n/**\n * Deck-level slide-transition effect (S1 in the wave-C plan). `\"none\"` opts a\n * deck out of the default fade transition entirely — no `<p:transition>` is\n * injected. Element-level entrance animations (`meta.animation.elements`)\n * are a separate switch (S3, wired further down in this file —\n * `applyElementAnimations`) and don't live in this section.\n */\nexport type SlideTransitionEffect = \"fade\" | \"push\" | \"wipe\" | \"none\"\n\nconst PPTX_MIME = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n\n/** A `.pptx`'s own slide part path, e.g. `ppt/slides/slide1.xml`. */\nconst SLIDE_PART_RE = /^ppt\\/slides\\/slide\\d+\\.xml$/\n\n/**\n * Any previously-injected `<p:transition>…</p:transition>` block, matched\n * non-greedily so a slide already carrying one is replaced rather than\n * duplicated — the idempotency `applySlideTransitions` relies on.\n */\nconst TRANSITION_RE = /<p:transition[\\s\\S]*?<\\/p:transition>/\n\n/**\n * The Office-2010 `p14:dur` extension namespace, in milliseconds. Matches\n * `~/projects/claw/DSpark-科普版-动画版.pptx`'s own unpacked slide XML byte\n * for byte on the `fade` case (only effect that real sample deck exercises);\n * `push`/`wipe` extrapolate from the same namespace and element-naming\n * convention per ECMA-376 §19.5.10 (`CT_SideDirectionTransition`) and\n * `~/.claude/ppt-master/skills/ppt-master/scripts/pptx_animations.py`\n * (`TRANSITIONS` table), the wave-C plan's named blueprint for the two\n * effects the sample deck doesn't cover. Both take an explicit `dir=\"r\"` —\n * the schema default is `\"l\"`, but pptx_animations.py picks `\"r\"` for a more\n * legible left-to-right reading-order motion, and this module mirrors that\n * choice for consistency with the blueprint.\n */\nconst TRANSITION_ELEMENT: Record<Exclude<SlideTransitionEffect, \"none\">, string> = {\n fade: \"<p:fade/>\",\n push: '<p:push dir=\"r\"/>',\n wipe: '<p:wipe dir=\"r\"/>',\n}\n\n/**\n * Generate a `<p:transition>` fragment for one of the three supported\n * effects. `durMs` defaults to 400 — the wave-C plan's S2 default and the\n * exact value the DSpark sample deck uses for its fade transitions.\n */\nexport function transitionXml(\n effect: Exclude<SlideTransitionEffect, \"none\">,\n durMs = 400\n): string {\n return `<p:transition p14:dur=\"${durMs}\" xmlns:p14=\"http://schemas.microsoft.com/office/powerpoint/2010/main\">${TRANSITION_ELEMENT[effect]}</p:transition>`\n}\n\n/**\n * Patch a finished `.pptx`'s slide XML, injecting the deck's transition\n * effect into every slide part.\n *\n * Same JSZip-write-after-patch shape as the sibling `render.ts`'s\n * `applyGradientFills` and `pptx-dedupe-media.ts`'s `dedupePptxMedia` (open\n * the zip, rewrite parts, re-zip) — reusing that basis rather than teaching\n * pptxgenjs about transitions, which has no API for them (same shape of gap\n * as the gradient-fill one `applyGradientFills`'s doc comment describes).\n *\n * Insertion point: immediately before each slide part's closing `</p:sld>`.\n * Per ECMA-376's `CT_Slide` child order (`p:cSld`, `p:clrMapOvr`,\n * `p:transition`, `p:timing`, `p:extLst`, all optional after `p:cSld`) and\n * pptxgenjs's own output (verified by unzipping a real `generatePptxBlob`\n * result: every slide part ends `...</p:cSld><p:clrMapOvr>...</p:clrMapOvr></p:sld>`,\n * no `p:timing`), appending right before `</p:sld>` lands `p:transition` in\n * the only schema-valid slot without needing to locate `</p:clrMapOvr>`\n * (which pptxgenjs always emits, but isn't a documented contract).\n *\n * Idempotent: any transition block already present on a slide (from a prior\n * call on the same blob) is stripped before the new one is inserted, so\n * repeated calls never stack multiple `<p:transition>` elements.\n *\n * Defensive like `dedupePptxMedia` (not fail-loud like `applyGradientFills`):\n * a bad/non-zip input just comes back unchanged. That asymmetry is\n * deliberate — `applyGradientFills` fails loud because a missed per-shape\n * patch would silently ship the wrong *visual* (a solid fill where a\n * gradient was authored). A missed transition has no such failure mode: it\n * is deck-wide and uniform, not keyed to any per-shape target that could go\n * missing, so the only realistic failure is a malformed/mock zip (as\n * `pptx-generate.test.ts`'s `FakePptx.write()` stub produces) — exactly the\n * case `dedupePptxMedia` already treats as a no-op passthrough so export\n * never breaks.\n */\nexport async function applySlideTransitions(\n pptx: Blob | ArrayBuffer | Uint8Array,\n effect: SlideTransitionEffect = \"fade\",\n durMs = 400\n): Promise<Blob> {\n const asBlob = pptx instanceof Blob ? pptx : new Blob([pptx as BlobPart], { type: PPTX_MIME })\n if (effect === \"none\") return asBlob\n\n try {\n const zip = await JSZip.loadAsync(await asBlob.arrayBuffer())\n const slidePaths = Object.keys(zip.files).filter(\n (p) => SLIDE_PART_RE.test(p) && !zip.files[p].dir\n )\n if (slidePaths.length === 0) return asBlob\n\n const fragment = transitionXml(effect, durMs)\n for (const path of slidePaths) {\n const raw = await zip.files[path].async(\"string\")\n const stripped = raw.replace(TRANSITION_RE, \"\")\n const closeIdx = stripped.lastIndexOf(\"</p:sld>\")\n if (closeIdx === -1) continue // not a well-formed slide part — leave untouched\n const xml = stripped.slice(0, closeIdx) + fragment + stripped.slice(closeIdx)\n zip.file(path, xml)\n }\n\n const ab = await zip.generateAsync({ type: \"arraybuffer\", compression: \"DEFLATE\" })\n return new Blob([ab], { type: PPTX_MIME })\n } catch {\n return asBlob\n }\n}\n\n// ============================================================================\n// S3 — per-block entrance animations (opt-in, meta.animation.elements=\"auto\")\n// ============================================================================\n\n/**\n * Zero-pad to 4 digits (`2` → `\"0002\"`). Every `blockMarker` this file\n * produces is therefore exactly the same length, which is what makes a plain\n * `.includes(marker)` substring check safe in `collectSpidsForBlock` below —\n * two *different* markers can never be a substring of one another (unlike,\n * say, `\"blk0-2\"` inside `\"blk0-20\"`) because same-length strings are only\n * substrings of each other when they're identical. Four digits comfortably\n * covers any realistic deck (thousands of slides/blocks); if a deck ever\n * exceeded it the marker just gets wider and stays internally consistent —\n * it would only collide with a *different* over-9999 index, not with any\n * normal one.\n */\nfunction pad4(n: number): string {\n return String(n).padStart(4, \"0\")\n}\n\n/**\n * The `blk{slideIndex}-{blockIndex}` token `renderOps` (svg2pptx/render.ts)\n * folds into a block-tagged shape's `objectName`, and this module's own\n * `collectSpidsForBlock` searches for to reverse-lookup that block's spids\n * from the exported slide XML's `<p:cNvPr id=\"…\" name=\"…\">` entries.\n */\nexport function blockMarker(slideIndex: number, blockIndex: number): string {\n return `blk${pad4(slideIndex)}-${pad4(blockIndex)}`\n}\n\n/** Semantic entrance effect chosen per block type (wave-C plan, S3). */\nexport type ElementAnimationEffect = \"fade\" | \"wipe\" | \"fly\"\n\n/**\n * Block type → entrance effect, per the wave-C plan's S3 semantic mapping:\n * `chart` → wipe, `steps` → fly, everything else (`kpi_cards`/`icon_cards`/\n * `verdict_banner` explicitly called out in the plan, plus every other block\n * type) → fade.\n */\nexport function blockAnimationEffect(blockType: Block[\"type\"]): ElementAnimationEffect {\n if (blockType === \"chart\") return \"wipe\"\n if (blockType === \"steps\") return \"fly\"\n return \"fade\"\n}\n\n/**\n * `filter`/`presetID`/`presetSubtype` triples for each effect, keyed to real,\n * already-shipped PowerPoint XML rather than invented values:\n *\n * - `fade` matches the DSpark sample deck's own byte-verified `<p:animEffect\n * filter=\"fade\">` + `presetID=\"10\" presetClass=\"entr\" presetSubtype=\"0\"`\n * (`~/projects/claw/DSpark-科普版-动画版.pptx`, slide3.xml).\n * - `wipe` and `fly` aren't in the sample (it only exercises fade + a\n * bottom-rising slide effect), and the plan asks for specific directions —\n * chart's wipe \"rising from the bottom\", steps' fly \"entering from the\n * left\" — that ppt-master's own *default* `wipe`/`fly` table entries don't\n * have (`wipe`'s default is `wipe(left)`, `fly`'s is `slide(fromBottom)`).\n * Rather than inventing a new presetID/subtype pairing for those specific\n * directions (unverifiable without a live PowerPoint to reverse-engineer\n * against), both reuse a *different*, already-verified entry from\n * `~/.claude/ppt-master/skills/ppt-master/scripts/pptx_animations.py`'s\n * `ANIMATIONS` table that already carries the direction the plan wants:\n * `wipe` here is ppt-master's `peek` (`wipe(down)`, presetID 12, subtype\n * 4 — \"Peek In, From Bottom\" in PowerPoint's own gallery), and `fly` here\n * is ppt-master's `cut` (`slide(fromLeft)`, presetID 42, subtype 8 —\n * \"Cut In, From Left\"). The OOXML bytes are exactly what that blueprint\n * ships; only which of *our* semantic block types triggers them differs.\n */\nconst ELEMENT_EFFECT_PRESET: Record<\n ElementAnimationEffect,\n { filter: string; presetID: number; presetSubtype: number }\n> = {\n fade: { filter: \"fade\", presetID: 10, presetSubtype: 0 },\n wipe: { filter: \"wipe(down)\", presetID: 12, presetSubtype: 4 },\n fly: { filter: \"slide(fromLeft)\", presetID: 42, presetSubtype: 8 },\n}\n\n/** One block's entrance: the shapes (spids) that enter together, and how. */\nexport interface ElementAnimationEntry {\n effect: ElementAnimationEffect\n /** Shape ids from `<p:cNvPr id=\"…\">`, in document order. */\n spids: number[]\n}\n\n/** `<p:set>` (visibility) + `<p:animEffect>` pair for one target spid. */\nfunction setAnimEffectPairXml(spid: number, filter: string, nextId: () => number): string {\n const setId = nextId()\n const effId = nextId()\n return (\n `<p:set><p:cBhvr><p:cTn id=\"${setId}\" dur=\"1\" fill=\"hold\">` +\n `<p:stCondLst><p:cond delay=\"0\"/></p:stCondLst></p:cTn>` +\n `<p:tgtEl><p:spTgt spid=\"${spid}\"/></p:tgtEl>` +\n `<p:attrNameLst><p:attrName>style.visibility</p:attrName></p:attrNameLst></p:cBhvr>` +\n `<p:to><p:strVal val=\"visible\"/></p:to></p:set>` +\n `<p:animEffect transition=\"in\" filter=\"${filter}\"><p:cBhvr>` +\n `<p:cTn id=\"${effId}\" dur=\"400\"/><p:tgtEl><p:spTgt spid=\"${spid}\"/></p:tgtEl>` +\n `</p:cBhvr></p:animEffect>`\n )\n}\n\n/**\n * One block's `<p:par>`, chained `delayMs` after the shared outer wrapper\n * begins. Single-spid blocks match the DSpark sample's own structure\n * byte-for-byte (modulo ids/delay/filter): wrapper → presetID leaf\n * (`nodeType=\"afterEffect\"`) → one set+animEffect pair. Multi-spid blocks\n * (\"块内 shape 同时入场\" — S3) add one `nodeType=\"withEffect\"` leaf per spid,\n * *siblings* directly under this wrapper — `withEffect` (not `afterEffect`)\n * because these targets start *together*, not chained after one another.\n * `<p:par>` children already play concurrently, so no extra grouping layer\n * is needed to make that happen.\n *\n * PowerPoint compatibility invariant (do not reintroduce a 4th layer here):\n * this function's caller (`elementTimingXml`) nests exactly\n * `mainSeq → click par → this wrapper → effect leaf`, three `<p:par>` deep.\n * An earlier revision wrapped the multi-spid leaves in one more `<p:par>`\n * \"group\" (a plain delay=0 par whose only job was bundling siblings — which\n * `<p:par>`'s own concurrent-children semantics already provide for free),\n * producing a 4th nesting level. PowerPoint's `mainSeq` timing tree does not\n * tolerate that: opening the file triggered its \"repair\" prompt every time\n * (confirmed via a real PowerPoint automation probe — see the\n * \"mainSeq par-nesting depth\" regression suite in `pptx-animations.test.ts`,\n * which asserts the resulting tree structurally rather than by string\n * content, precisely to catch this class of regression).\n */\nfunction blockParXml(\n entry: ElementAnimationEntry,\n delayMs: number,\n nextId: () => number,\n): string {\n const preset = ELEMENT_EFFECT_PRESET[entry.effect]\n const wrapperId = nextId()\n\n let inner: string\n if (entry.spids.length === 1) {\n const leafId = nextId()\n inner =\n `<p:par><p:cTn id=\"${leafId}\" presetID=\"${preset.presetID}\" presetClass=\"entr\" ` +\n `presetSubtype=\"${preset.presetSubtype}\" fill=\"hold\" nodeType=\"afterEffect\">` +\n `<p:stCondLst><p:cond delay=\"0\"/></p:stCondLst>` +\n `<p:childTnLst>${setAnimEffectPairXml(entry.spids[0], preset.filter, nextId)}</p:childTnLst>` +\n `</p:cTn></p:par>`\n } else {\n inner = entry.spids\n .map((spid) => {\n const leafId = nextId()\n return (\n `<p:par><p:cTn id=\"${leafId}\" presetID=\"${preset.presetID}\" presetClass=\"entr\" ` +\n `presetSubtype=\"${preset.presetSubtype}\" fill=\"hold\" nodeType=\"withEffect\">` +\n `<p:stCondLst><p:cond delay=\"0\"/></p:stCondLst>` +\n `<p:childTnLst>${setAnimEffectPairXml(spid, preset.filter, nextId)}</p:childTnLst>` +\n `</p:cTn></p:par>`\n )\n })\n .join(\"\")\n }\n\n return (\n `<p:par><p:cTn id=\"${wrapperId}\" fill=\"hold\">` +\n `<p:stCondLst><p:cond delay=\"${delayMs}\"/></p:stCondLst>` +\n `<p:childTnLst>${inner}</p:childTnLst></p:cTn></p:par>`\n )\n}\n\n/**\n * Generate a `<p:timing>` fragment: one `mainSeq` containing one `par` per\n * block, chained `staggerMs` apart (S3's \"块间 after-previous 错峰 200ms\"),\n * each internally doing \"set visibility → animEffect\" per spid (S3's unit\n * test alignment target). Structurally mirrors the DSpark sample deck's own\n * `ppt/slides/slide3.xml` `<p:timing>` tree: `tmRoot` (id 1) → `mainSeq`\n * (id 2, `concurrent=\"1\" nextAc=\"seek\"`) → one shared outer wrapper (id 3,\n * `delay=\"indefinite\"` + `onBegin` on the mainSeq id) → one chained `<p:par>`\n * per block → `<p:prevCondLst>`/`<p:nextCondLst>` siblings on `<p:seq>` and a\n * trailing `<p:bldLst>` — all present in the sample and reproduced here\n * verbatim (see this file's `pptx-animations.test.ts` for the structural\n * diff against the unpacked sample).\n *\n * Entries with no spids (block never got rendered — dropped by overflow, or\n * the theme routed it through a path that predates this feature) are\n * dropped silently; if *nothing* has spids, returns `\"\"` so the caller skips\n * injection for that slide entirely rather than writing an empty, pointless\n * `<p:timing>`.\n */\nexport function elementTimingXml(entries: ElementAnimationEntry[], staggerMs = 200): string {\n const withSpids = entries.filter((e) => e.spids.length > 0)\n if (withSpids.length === 0) return \"\"\n\n let id = 3 // 1 = tmRoot, 2 = mainSeq, 3 = the shared outer wrapper below\n const nextId = () => ++id\n\n const blockPars = withSpids\n .map((entry, i) => blockParXml(entry, i * staggerMs, nextId))\n .join(\"\")\n const bldLst = withSpids\n .flatMap((e) => e.spids)\n .map((spid) => `<p:bldP spid=\"${spid}\" grpId=\"0\"/>`)\n .join(\"\")\n\n return (\n `<p:timing><p:tnLst><p:par><p:cTn id=\"1\" dur=\"indefinite\" restart=\"never\" nodeType=\"tmRoot\">` +\n `<p:childTnLst><p:seq concurrent=\"1\" nextAc=\"seek\"><p:cTn id=\"2\" dur=\"indefinite\" nodeType=\"mainSeq\">` +\n `<p:childTnLst><p:par><p:cTn id=\"3\" fill=\"hold\">` +\n `<p:stCondLst><p:cond delay=\"indefinite\"/><p:cond evt=\"onBegin\" delay=\"0\"><p:tn val=\"2\"/></p:cond></p:stCondLst>` +\n `<p:childTnLst>${blockPars}</p:childTnLst>` +\n `</p:cTn></p:par></p:childTnLst></p:cTn>` +\n `<p:prevCondLst><p:cond evt=\"onPrev\" delay=\"0\"><p:tgtEl><p:sldTgt/></p:tgtEl></p:cond></p:prevCondLst>` +\n `<p:nextCondLst><p:cond evt=\"onNext\" delay=\"0\"><p:tgtEl><p:sldTgt/></p:tgtEl></p:cond></p:nextCondLst>` +\n `</p:seq></p:childTnLst></p:cTn></p:par></p:tnLst>` +\n `<p:bldLst>${bldLst}</p:bldLst></p:timing>`\n )\n}\n\n/** Any previously-injected `<p:timing>…</p:timing>` block (idempotency, mirrors `TRANSITION_RE`). */\nconst TIMING_RE = /<p:timing>[\\s\\S]*?<\\/p:timing>/\n\n/**\n * Renumber duplicate `<p:cNvPr id=\"…\">` values within one slide part's XML so\n * every shape id is unique before this module reverse-looks-up spids and\n * writes `<p:spTgt spid>`/`<p:bldP spid>` references to them.\n *\n * Why this is needed: pptxgenjs's own STEP1-3 per-shape id counter\n * (`idx + 2`, sequential from 2 — `node_modules/pptxgenjs/dist/pptxgen.cjs.js`,\n * `case SLIDE_OBJECT_TYPES.text/image/chart`) is completely independent of a\n * *hardcoded* `<p:cNvPr id=\"25\" name=\"Slide Number Placeholder 0\"/>` that\n * same file appends afterwards, as the last shape on the slide, whenever a\n * slide's master carries `slideNumber` (\"STEP 4: Add slide numbers (if any)\n * last\", same file, ~line 5660) — which `master-builder.ts` turns on for\n * every `content`-type master, the only slide type this module ever injects\n * a `<p:timing>` onto. A content slide with ~24+ real shapes (routine for a\n * `chart` + `steps`/`kpi_cards` combo — svg2pptx explodes each bar/badge/\n * label/gradient into its own shape) pushes that STEP1-3 counter to 25 too,\n * so the slide part ends up with *two* `<p:cNvPr id=\"25\">` elements. Ids are\n * required unique per ECMA-376 (`CT_ShapeNonVisual`'s `id` is a `ST_DrawingElementId`,\n * document-scoped); once duplicated, a `<p:spTgt spid=\"25\"/>` this module\n * writes is an ambiguous reference PowerPoint/WPS may resolve to either\n * shape, and does resolve inconsistently in practice (this was found by\n * unzipping a real `generatePptxBlob` output — see this file's own tests).\n *\n * The fix doesn't special-case \"25\": pptxgenjs (or a future version of it)\n * could hardcode other ids too, and a `<p:cNvPr id>` value's only structural\n * role in a `.pptx` is as the target of a `spid` reference — nothing else in\n * ECMA-376's shape tree cross-references it (unlike, say, `<a:stCxn>`/\n * `<a:endCxn>` on connector shapes, which svg2pptx never emits — it only\n * ever produces `<p:sp>`/`<p:pic>`/`<p:graphicFrame>`, never `<p:cxnSp>`).\n * So any duplicate is safe to renumber unconditionally: this scans the whole\n * slide XML once for every `<p:cNvPr id=\"…\">`, keeps each id's *first*\n * occurrence untouched (document order — the real STEP1-3 content shapes,\n * always emitted before STEP4's trailing placeholder) and assigns every\n * later occurrence of an already-seen id a fresh value above the highest id\n * anywhere on the slide, so the result has zero duplicates and every\n * previously-unique id (i.e. every real, marker-tagged shape this module\n * cares about) keeps exactly the id it already had.\n */\nfunction dedupeShapeIds(xml: string): string {\n const ID_RE = /<p:cNvPr id=\"(\\d+)\"/g\n let maxId = 0\n let scan: RegExpExecArray | null\n while ((scan = ID_RE.exec(xml))) {\n const id = Number(scan[1])\n if (id > maxId) maxId = id\n }\n if (maxId === 0) return xml // no cNvPr at all (malformed/empty part) — nothing to do\n\n const seen = new Set<number>()\n let nextFreeId = maxId\n return xml.replace(/(<p:cNvPr id=\")(\\d+)(\")/g, (full, pre: string, idStr: string, post: string) => {\n const id = Number(idStr)\n if (!seen.has(id)) {\n seen.add(id)\n return full\n }\n nextFreeId += 1\n return `${pre}${nextFreeId}${post}`\n })\n}\n\n/** `slide{N}.xml` → `N`, for sorting slide parts into IR order (`Object.keys` order is not numeric). */\nfunction slidePartNumber(path: string): number {\n return Number(/slide(\\d+)\\.xml$/.exec(path)?.[1] ?? 0)\n}\n\n/** Every `<p:cNvPr id=\"…\" name=\"…\">` containing `marker`, in document order, as its numeric id (spid). */\nfunction collectSpidsForBlock(xml: string, marker: string): number[] {\n const spids: number[] = []\n const re = /<p:cNvPr id=\"(\\d+)\" name=\"([^\"]*)\"/g\n let m: RegExpExecArray | null\n while ((m = re.exec(xml))) {\n if (m[2].includes(marker)) spids.push(Number(m[1]))\n }\n return spids\n}\n\n/**\n * Order a slide's block indices for the entrance sequence: original\n * `slide.blocks` order, except `verdict_banner` block(s) move to the end\n * regardless of where they sit in that order (S3: \"顺序压轴:verdict 块排\n * 最后不论块序\"). Stable otherwise.\n *\n * Exported (in addition to its own use in `applyElementAnimations` below)\n * so `lib/animation.test.ts` can assert its local\n * `orderBlocksForEntrance` stays byte-for-byte in sync with this, the\n * source of truth — see that test file's own comment for why the preview\n * doesn't import this module's *values* at runtime (bundle isolation),\n * only compares against them in tests.\n */\nexport function orderedBlockIndices(blockTypes: readonly Block[\"type\"][]): number[] {\n const indices = blockTypes.map((_, i) => i)\n const normal = indices.filter((i) => blockTypes[i] !== \"verdict_banner\")\n const verdict = indices.filter((i) => blockTypes[i] === \"verdict_banner\")\n return [...normal, ...verdict]\n}\n\n/**\n * Patch a finished `.pptx`'s slide XML, injecting each slide's per-block\n * entrance-animation `<p:timing>` tree (wave-C S3). Same JSZip-write-after-patch\n * shape as `applySlideTransitions` above (open the zip, rewrite parts, re-zip);\n * defensive like it too — a bad/non-zip input just comes back unchanged, since\n * a missed injection has no worse failure mode than \"no animation,\" not a\n * wrong visual.\n *\n * `slidesBlockTypes[i]` is slide `i`'s `slide.blocks.map(b => b.type)`, in\n * original IR order — the same order `blockMarker`'s `blockIndex` was\n * assigned against when `renderOps` tagged each shape's `objectName`\n * (svg2pptx/render.ts). Callers should only invoke this when\n * `meta.animation.elements === \"auto\"`; there is no internal on/off switch\n * here; an empty `slidesBlockTypes[i]` (cover/chapter/ending slides, or any\n * slide with no blocks) just skips that slide.\n *\n * Insertion point matches `applySlideTransitions`: immediately before each\n * slide part's closing `</p:sld>`. Per ECMA-376's `CT_Slide` child order\n * (`cSld, clrMapOvr, transition, timing, extLst`), this always lands\n * `<p:timing>` after any `<p:transition>` already injected by that function\n * — both insert at the same \"right before `</p:sld>`\" point, and\n * `applySlideTransitions` always runs first in the `pptx-generate.ts`\n * pipeline, so by the time this function sees the XML any transition is\n * already the last thing before `</p:sld>`.\n *\n * Idempotent: any `<p:timing>` already present on a slide is stripped before\n * the new one is inserted.\n */\nexport async function applyElementAnimations(\n pptx: Blob | ArrayBuffer | Uint8Array,\n slidesBlockTypes: ReadonlyArray<ReadonlyArray<Block[\"type\"]>>,\n staggerMs = 200,\n): Promise<Blob> {\n const asBlob = pptx instanceof Blob ? pptx : new Blob([pptx as BlobPart], { type: PPTX_MIME })\n\n try {\n const zip = await JSZip.loadAsync(await asBlob.arrayBuffer())\n const slidePaths = Object.keys(zip.files)\n .filter((p) => SLIDE_PART_RE.test(p) && !zip.files[p].dir)\n .sort((a, b) => slidePartNumber(a) - slidePartNumber(b))\n if (slidePaths.length === 0) return asBlob\n\n for (let slideIndex = 0; slideIndex < slidePaths.length; slideIndex++) {\n const blockTypes = slidesBlockTypes[slideIndex] ?? []\n if (blockTypes.length === 0) continue\n\n const path = slidePaths[slideIndex]\n // Dedupe *before* the spid reverse-lookup below: `<p:spTgt>`/`<p:bldP>`\n // will shortly reference whatever id `collectSpidsForBlock` finds, so\n // any collision with pptxgenjs's own hardcoded placeholder ids (see\n // `dedupeShapeIds`'s doc comment) must be resolved first, not patched\n // up after the fact.\n const raw = dedupeShapeIds(await zip.files[path].async(\"string\"))\n\n const entries: ElementAnimationEntry[] = orderedBlockIndices(blockTypes).map(\n (blockIndex) => ({\n effect: blockAnimationEffect(blockTypes[blockIndex]),\n spids: collectSpidsForBlock(raw, blockMarker(slideIndex, blockIndex)),\n }),\n )\n\n const timing = elementTimingXml(entries, staggerMs)\n if (!timing) continue // nothing on this slide actually got tagged\n\n const stripped = raw.replace(TIMING_RE, \"\")\n const closeIdx = stripped.lastIndexOf(\"</p:sld>\")\n if (closeIdx === -1) continue // not a well-formed slide part — leave untouched\n const xml = stripped.slice(0, closeIdx) + timing + stripped.slice(closeIdx)\n zip.file(path, xml)\n }\n\n const ab = await zip.generateAsync({ type: \"arraybuffer\", compression: \"DEFLATE\" })\n return new Blob([ab], { type: PPTX_MIME })\n } catch {\n return asBlob\n }\n}\n","import { createElement } from \"react\"\nimport type { PptxIR, Slide } from \"@/ir\"\nimport { svgToOps, type Op } from \"../pptx/svg2pptx/dispatch\"\nimport { FullSlideSvg } from \"./FullSlideSvg\"\nimport { renderSvgMarkup, parseSvgRoot } from \"./serialize\"\n\n/**\n * Export-side entry: render one slide through the single source. `FullSlideSvg`\n * is the same component the preview mounts, so the exported DrawingML matches the\n * preview by construction. Lives in a `.tsx` so `pptx-generate.ts` stays JSX-free.\n */\nexport function slideToSvgMarkup(ir: PptxIR, slide: Slide, index: number): string {\n return renderSvgMarkup(createElement(FullSlideSvg, { ir, slide, index }))\n}\n\n/** Render a slide to pptxgenjs ops via single-source SVG → svg2pptx. */\nexport function slideToOps(ir: PptxIR, slide: Slide, index: number): Op[] {\n return svgToOps(parseSvgRoot(slideToSvgMarkup(ir, slide, index)))\n}\n","/**\n * Shared canvas / coordinate contract for the PPTX preview and the svg2pptx\n * exporter. The SVG render layer works in a 1280×720 px viewBox; PowerPoint\n * works in inches (LAYOUT_WIDE = 13.333×7.5\"). The bridge is exactly 96 px/in.\n *\n * Centralizing these removes the previous fragility where the preview viewBox\n * and the exporter's inch dimensions were kept aligned by hand across\n * master-builder / decorations / meta-blocks.\n */\n\nexport const PX_PER_IN = 96\n\nexport const CANVAS_W_PX = 1280\nexport const CANVAS_H_PX = 720\n\nexport const SLIDE_W_IN = CANVAS_W_PX / PX_PER_IN // 13.333…\nexport const SLIDE_H_IN = CANVAS_H_PX / PX_PER_IN // 7.5\n\n/** Convert a px length in the 1280×720 canvas to PowerPoint inches. */\nexport function pxToIn(px: number): number {\n return px / PX_PER_IN\n}\n\n/** Points per px (72 pt/in ÷ 96 px/in). For stroke widths and font sizes. */\nexport const PT_PER_PX = 0.75\n\n/** Convert a px length to PowerPoint points (stroke width, font size). */\nexport function pxToPt(px: number): number {\n return px * PT_PER_PX\n}\n","/**\n * SVG color → pptxgenjs color helpers.\n *\n * pptxgenjs wants a hash-less uppercase hex for `color` / `fill.color`, and a\n * separate `transparency` percent (0–100) for alpha — it has no rgba() concept\n * (see `ShapeFillProps`). These two helpers split an SVG color string into\n * those two pieces.\n */\n\nfunction clampByte(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n)))\n}\n\nfunction toHexByte(n: number): string {\n return clampByte(n).toString(16).padStart(2, \"0\").toUpperCase()\n}\n\ninterface Rgb {\n r: number\n g: number\n b: number\n a: number | null\n}\n\n/** Parse \"rgb(...)\" / \"rgba(...)\" into channel numbers, or null. */\nfunction parseRgb(color: string): Rgb | null {\n const m = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i,\n )\n if (!m) return null\n return {\n r: parseFloat(m[1]),\n g: parseFloat(m[2]),\n b: parseFloat(m[3]),\n a: m[4] !== undefined ? parseFloat(m[4]) : null,\n }\n}\n\n/** SVG color string → uppercase hash-less hex (e.g. \"1A4A8A\"). */\nexport function svgColorToHex(color: string): string {\n const c = color.trim()\n if (c.startsWith(\"#\")) {\n const hex = c.slice(1)\n if (hex.length === 3) {\n return hex\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n .toUpperCase()\n }\n return hex.toUpperCase()\n }\n const rgb = parseRgb(c)\n if (rgb) return toHexByte(rgb.r) + toHexByte(rgb.g) + toHexByte(rgb.b)\n // Unknown format: fall back to black so the export never crashes.\n return \"000000\"\n}\n\n/** rgba alpha → pptxgenjs transparency percent, or null when fully opaque. */\nexport function svgColorTransparency(color: string): number | null {\n const rgb = parseRgb(color.trim())\n if (!rgb || rgb.a === null || rgb.a >= 1) return null\n return Math.round((1 - rgb.a) * 100)\n}\n","import { pxToPt } from \"../../constants\"\nimport { svgColorToHex, svgColorTransparency } from \"./color\"\nimport { gradientMidpointHex, withElementOpacity, type GradientDef } from \"./gradient\"\n\n/** A pptxgenjs fill spec (hash-less hex + optional transparency percent). */\nexport interface FillSpec {\n color: string\n transparency?: number\n}\n\n/**\n * Result of resolving an SVG `fill`: either a plain solid, or a gradient\n * reference — carrying both the real `GradientDef` (for the post-write\n * `a:gradFill` patch, see `render.ts`'s `applyGradientFills`) and a solid\n * placeholder `fill` (the fallback midpoint color) so the op always has a\n * real, renderable fill even before that patch runs.\n */\nexport interface ResolvedFill {\n fill: FillSpec\n gradient?: GradientDef\n}\n\n/** Anything an op can carry a resolved fill onto (shape/ellipse/path ops). */\ninterface FillableOp {\n fill?: FillSpec\n gradientFill?: GradientDef\n}\n\n/** Match `fill=\"url(#id)\"` (with or without quotes around the fragment). */\nfunction matchUrlId(value: string): string | null {\n const m = value.trim().match(/^url\\(([\"']?)#([^\"')]+)\\1\\)$/)\n return m ? m[2] : null\n}\n\n/** A pptxgenjs line/stroke spec (hash-less hex + width in points). */\nexport interface LineSpec {\n color: string\n width: number\n transparency?: number\n}\n\nfunction num(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n return parseFloat(v) || fallback\n}\n\n/**\n * Element opacity in [0,1]: `opacity` × `fill-opacity`(各自缺省 1)。\n * 模板水印(如章节巨号数字 opacity=0.06)依赖它——预览由浏览器合成,\n * 导出必须译成 DrawingML 透明度,否则实心覆盖正文。\n */\nexport function elementOpacity(el: Element, extra = \"fill-opacity\"): number {\n const o = clamp01(num(el, \"opacity\", 1))\n const fo = clamp01(num(el, extra, 1))\n return o * fo\n}\n\nfunction clamp01(v: number): number {\n return Math.min(1, Math.max(0, v))\n}\n\n/** Combine an rgba-derived transparency percent with element opacity. */\nfunction combineTransparency(\n rgbaTransparency: number | null,\n opacity: number,\n): number | undefined {\n const alpha = (rgbaTransparency !== null ? 1 - rgbaTransparency / 100 : 1) * opacity\n const t = Math.round((1 - alpha) * 100)\n return t > 0 ? t : undefined\n}\n\n/**\n * Read an SVG `fill` (undefined when none/absent). Plain colors resolve to a\n * solid `FillSpec`. `url(#id)` resolves through `gradients` (from\n * `collectGradients`) to a `GradientDef` — with a solid midpoint placeholder\n * fill alongside it, since pptxgenjs itself cannot render a gradient (see\n * `render.ts`'s `applyGradientFills` for the post-write patch that swaps it\n * in). A `url(#id)` that doesn't resolve fails loud: `svg/subset-validate.ts`\n * is supposed to catch this earlier, so reaching here means that guard was\n * skipped or out of sync with this converter.\n */\nexport function extractFill(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): ResolvedFill | undefined {\n const fill = el.getAttribute(\"fill\")\n if (!fill || fill === \"none\") return undefined\n\n const urlId = matchUrlId(fill)\n if (urlId !== null) {\n const gradientDef = gradients?.get(urlId)\n if (!gradientDef) {\n throw new Error(`svg2pptx: fill=\"${fill}\" does not match any collected gradient`)\n }\n const opacity = elementOpacity(el)\n // DrawingML gradFill has no whole-fill alpha — fold this element's own\n // opacity into every stop now, so it survives render.ts's JSZip patch\n // (which replaces the whole placeholder <a:solidFill> wholesale and\n // otherwise has no other way to see this element's opacity).\n const gradient = withElementOpacity(gradientDef, opacity)\n const out: FillSpec = { color: gradientMidpointHex(gradient) }\n const transparency = combineTransparency(null, opacity)\n if (transparency !== undefined) out.transparency = transparency\n return { fill: out, gradient }\n }\n\n const out: FillSpec = { color: svgColorToHex(fill) }\n const transparency = combineTransparency(\n svgColorTransparency(fill),\n elementOpacity(el),\n )\n if (transparency !== undefined) out.transparency = transparency\n return { fill: out }\n}\n\n/** Resolve `el`'s `fill` and apply it (plus any gradient) onto `op`. No-op when absent. */\nexport function applyFill<T extends FillableOp>(\n op: T,\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): void {\n const resolved = extractFill(el, gradients)\n if (!resolved) return\n op.fill = resolved.fill\n if (resolved.gradient) op.gradientFill = resolved.gradient\n}\n\n/** Read an SVG `stroke` into a pptxgenjs line spec (undefined when none/absent). */\nexport function extractStroke(el: Element): LineSpec | undefined {\n const stroke = el.getAttribute(\"stroke\")\n if (!stroke || stroke === \"none\") return undefined\n const out: LineSpec = {\n color: svgColorToHex(stroke),\n width: pxToPt(num(el, \"stroke-width\", 1) || 1),\n }\n const transparency = combineTransparency(\n svgColorTransparency(stroke),\n elementOpacity(el, \"stroke-opacity\"),\n )\n if (transparency !== undefined) out.transparency = transparency\n return out\n}\n","import { pxToIn } from \"../../constants\"\nimport { applyFill, extractStroke, type FillSpec, type LineSpec } from \"./style\"\nimport type { GradientDef } from \"./gradient\"\n\n/**\n * A pptxgenjs shape draw, produced from an SVG `<rect>` / `<circle>` / `<ellipse>`.\n * Rendered later via `slide.addText(\"\", { shape, x, y, w, h, fill, line, rectRadius })`\n * — pptxgenjs merges shape + text in one call, so a bare shape is empty text.\n * All positions are in inches; line width is in points.\n */\nexport interface ShapeOp {\n kind: \"shape\"\n text: string\n shape: \"rect\" | \"roundRect\"\n x: number\n y: number\n w: number\n h: number\n fill?: FillSpec\n /** Set alongside `fill` (a solid placeholder) when `fill` was `url(#id)`. */\n gradientFill?: GradientDef\n line?: LineSpec\n rectRadius?: number\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\nfunction num(el: Element, name: string): number {\n return parseFloat(el.getAttribute(name) ?? \"0\") || 0\n}\n\n/** Convert an SVG `<rect>` element to a pptxgenjs shape op. */\nexport function rectToOp(el: Element, gradients?: ReadonlyMap<string, GradientDef>): ShapeOp {\n const rx = num(el, \"rx\")\n const op: ShapeOp = {\n kind: \"shape\",\n text: \"\",\n shape: rx > 0 ? \"roundRect\" : \"rect\",\n x: pxToIn(num(el, \"x\")),\n y: pxToIn(num(el, \"y\")),\n w: pxToIn(num(el, \"width\")),\n h: pxToIn(num(el, \"height\")),\n }\n if (rx > 0) op.rectRadius = pxToIn(rx)\n\n applyFill(op, el, gradients)\n const line = extractStroke(el)\n if (line) op.line = line\n\n return op\n}\n","import { pxToIn } from \"../../constants\"\nimport { applyFill, extractStroke, type FillSpec, type LineSpec } from \"./style\"\nimport type { GradientDef } from \"./gradient\"\n\n/**\n * A pptxgenjs shape draw op for an ellipse/circle.\n * pptxgenjs \"ellipse\" preset uses the same x/y/w/h bounding-box model as\n * \"rect\" (see pptxgen.cjs.js line 5416-5418 for xfrm, line 5465 for prstGeom).\n * All positions are in inches. Line width is in points.\n */\nexport interface EllipseOp {\n kind: \"shape\"\n text: string\n shape: \"ellipse\"\n x: number\n y: number\n w: number\n h: number\n fill?: FillSpec\n /** Set alongside `fill` (a solid placeholder) when `fill` was `url(#id)`. */\n gradientFill?: GradientDef\n line?: LineSpec\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\nfunction num(el: Element, name: string): number {\n return parseFloat(el.getAttribute(name) ?? \"0\") || 0\n}\n\n/** Convert an SVG `<circle>` element to a pptxgenjs ellipse shape op. */\nexport function circleToOp(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): EllipseOp {\n const cx = num(el, \"cx\")\n const cy = num(el, \"cy\")\n const r = num(el, \"r\")\n\n const op: EllipseOp = {\n kind: \"shape\",\n text: \"\",\n shape: \"ellipse\",\n x: pxToIn(cx - r),\n y: pxToIn(cy - r),\n w: pxToIn(2 * r),\n h: pxToIn(2 * r),\n }\n\n applyFill(op, el, gradients)\n const line = extractStroke(el)\n if (line) op.line = line\n\n return op\n}\n\n/** Convert an SVG `<ellipse>` element to a pptxgenjs ellipse shape op. */\nexport function ellipseToOp(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): EllipseOp {\n const cx = num(el, \"cx\")\n const cy = num(el, \"cy\")\n const rx = num(el, \"rx\")\n const ry = num(el, \"ry\")\n\n const op: EllipseOp = {\n kind: \"shape\",\n text: \"\",\n shape: \"ellipse\",\n x: pxToIn(cx - rx),\n y: pxToIn(cy - ry),\n w: pxToIn(2 * rx),\n h: pxToIn(2 * ry),\n }\n\n applyFill(op, el, gradients)\n const line = extractStroke(el)\n if (line) op.line = line\n\n return op\n}\n","import { pxToIn, pxToPt, SLIDE_W_IN, CANVAS_W_PX } from \"../../constants\"\nimport { svgColorToHex } from \"./color\"\nimport { elementOpacity } from \"./style\"\n\n/** One styled run inside a text op (maps to a pptxgenjs TextProps entry). */\nexport interface TextRunData {\n text: string\n bold?: boolean\n italic?: boolean\n underline?: boolean\n color?: string\n fontSize?: number\n}\n\n/**\n * A pptxgenjs text draw from an SVG `<text>`. Rendered via\n * `slide.addText(runs, { x, y, w, h, fontFace, fontSize, color, align, valign:\"top\", inset:0 })`.\n * Positions are inches, font sizes are points.\n */\nexport interface TextOp {\n kind: \"text\"\n runs: TextRunData[]\n x: number\n y: number\n w: number\n h: number\n fontFace?: string\n fontSize: number\n color?: string\n transparency?: number\n align: \"left\" | \"center\" | \"right\"\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\n// SVG `dominant-baseline:alphabetic` puts y at the text baseline; the box top\n// sits roughly one ascent (≈0.8em) above it. Approximate — calibrate against a\n// real PPT render during stage 4 (whole-slide assembly).\nconst ASCENT_RATIO = 0.8\n\nfunction num(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n return parseFloat(v) || fallback\n}\n\nfunction isBold(weight: string | null): boolean {\n if (!weight) return false\n if (weight === \"bold\" || weight === \"bolder\") return true\n return parseInt(weight, 10) >= 600\n}\n\n/** font-style italic/oblique → italic(2026-07-12 导出审计抓漏:TextRunData\n * 与 render.ts 消费端一直就绪,此前从未解析该属性——全仓 23 处斜体导出\n * 后静默变正体)。 */\nfunction isItalic(style: string | null): boolean {\n return style === \"italic\" || style === \"oblique\"\n}\n\nfunction firstFontFamily(family: string | null): string | undefined {\n if (!family) return undefined\n return family.split(\",\")[0].replace(/['\"]/g, \"\").trim() || undefined\n}\n\nfunction anchorToAlign(anchor: string | null): \"left\" | \"center\" | \"right\" {\n if (anchor === \"middle\") return \"center\"\n if (anchor === \"end\") return \"right\"\n return \"left\"\n}\n\nfunction buildRuns(el: Element, baseBold: boolean, baseItalic: boolean): TextRunData[] {\n const tspans = el.querySelectorAll(\"tspan\")\n if (tspans.length === 0) {\n const run: TextRunData = { text: (el.textContent ?? \"\").trim() }\n if (baseBold) run.bold = true\n if (baseItalic) run.italic = true\n return [run]\n }\n // 按 childNodes 顺序遍历:直接文本节点是基础 run(如 KPI 的\n // \"99.95<tspan>%</tspan>\"——丢掉文本节点会导出成只剩单位)。\n const runs: TextRunData[] = []\n el.childNodes.forEach((node) => {\n if (node.nodeType === 3) {\n const text = (node.textContent ?? \"\").trim()\n if (!text) return\n const run: TextRunData = { text }\n if (baseBold) run.bold = true\n if (baseItalic) run.italic = true\n runs.push(run)\n return\n }\n if (node.nodeType !== 1) return\n const child = node as Element\n if (child.tagName.toLowerCase() !== \"tspan\") return\n const run: TextRunData = { text: child.textContent ?? \"\" }\n if (isBold(child.getAttribute(\"font-weight\")) || baseBold) run.bold = true\n if (isItalic(child.getAttribute(\"font-style\")) || baseItalic) run.italic = true\n const fill = child.getAttribute(\"fill\")\n if (fill && fill !== \"none\") run.color = svgColorToHex(fill)\n const fs = child.getAttribute(\"font-size\")\n if (fs) run.fontSize = pxToPt(parseFloat(fs))\n runs.push(run)\n })\n return runs\n}\n\n/** Convert an SVG `<text>` element to a pptxgenjs text op. */\nexport function textToOp(el: Element): TextOp {\n const fontSizePx = num(el, \"font-size\", 16)\n const align = anchorToAlign(el.getAttribute(\"text-anchor\"))\n const xPx = num(el, \"x\")\n const yPx = num(el, \"y\")\n\n // Box placement: trust the SVG's pre-laid-out text — give a wide-enough box\n // and let `align` anchor it, instead of measuring text width here.\n let x: number\n let w: number\n if (align === \"right\") {\n x = 0\n w = pxToIn(xPx)\n } else if (align === \"center\") {\n const half = Math.min(xPx, CANVAS_W_PX - xPx)\n x = pxToIn(xPx - half)\n w = pxToIn(2 * half)\n } else {\n x = pxToIn(xPx)\n w = SLIDE_W_IN - pxToIn(xPx)\n }\n\n const op: TextOp = {\n kind: \"text\",\n runs: buildRuns(\n el,\n isBold(el.getAttribute(\"font-weight\")),\n isItalic(el.getAttribute(\"font-style\")),\n ),\n x,\n y: pxToIn(yPx - ASCENT_RATIO * fontSizePx),\n w,\n h: pxToIn(fontSizePx * 1.2),\n fontSize: pxToPt(fontSizePx),\n align,\n }\n const fontFace = firstFontFamily(el.getAttribute(\"font-family\"))\n if (fontFace) op.fontFace = fontFace\n const fill = el.getAttribute(\"fill\")\n if (fill && fill !== \"none\") op.color = svgColorToHex(fill)\n const opacity = elementOpacity(el)\n if (opacity < 1) op.transparency = Math.round((1 - opacity) * 100)\n // letter-spacing 故意不映射(2026-07-10 全主题导出审计定案):曾映射为\n // charSpacing(spc),但 LibreOffice 对 spc+CJK 的宽度计算与渲染不一致,\n // **裁掉每段文字的尾字符**(runway 6 处丢字实锤,A/B 剥离 spc 后全部\n // 复原)。丢字是内容事故、字距只是排印细节——导出端不发 spc,预览保留\n // letter-spacing。若未来确认真实 Office/WPS 无此 bug 可再评估。\n\n return op\n}\n","import { pxToIn, pxToPt } from \"../../constants\"\nimport { svgColorToHex, svgColorTransparency } from \"./color\"\nimport { elementOpacity } from \"./style\"\n\n/**\n * pptxgenjs line dash type.\n * Valid values from pptxgenjs types/index.d.ts line 1040:\n * 'solid' | 'dash' | 'dashDot' | 'lgDash' | 'lgDashDot' | 'lgDashDotDot' | 'sysDash' | 'sysDot'\n */\ntype DashType =\n | \"solid\"\n | \"dash\"\n | \"dashDot\"\n | \"lgDash\"\n | \"lgDashDot\"\n | \"lgDashDotDot\"\n | \"sysDash\"\n | \"sysDot\"\n\n/**\n * A pptxgenjs line draw op, produced from an SVG `<line>`.\n *\n * Rendered via `slide.addShape(pptxgen.shapes.LINE, { x, y, w, h, line, flipH, flipV })`.\n * All positions in inches. line.width in points.\n *\n * **Direction (from pptxgen.cjs.js source):**\n * - pptxgenjs emits `<a:xfrm flipH=\"1\">` / `<a:xfrm flipV=\"1\">` as attributes\n * of the xfrm element (lines 5162-5165, 5416 in pptxgen.cjs.js).\n * - A `line` preset geometry (`prstGeom prst=\"line\"`) draws the default\n * diagonal from the top-left corner of the bounding box to the bottom-right.\n * - `flipV` mirrors the line vertically within its bounding box, producing a\n * bottom-left → top-right diagonal.\n *\n * So: when the SVG line's dx and dy have opposite signs (one positive, one\n * negative), the line runs along the anti-diagonal and we need `flipV = true`.\n * When they share the same sign (or either is zero), no flip is needed.\n */\nexport interface LineOp {\n kind: \"line\"\n x: number\n y: number\n w: number\n h: number\n line: {\n color: string\n width: number\n dashType?: DashType\n transparency?: number\n }\n flipH?: boolean\n flipV?: boolean\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\nfunction num(el: Element, name: string, fallback = 0): number {\n const v = el.getAttribute(name)\n if (v == null) return fallback\n return parseFloat(v) || fallback\n}\n\n/**\n * Map SVG `stroke-dasharray` to a pptxgenjs `dashType`.\n *\n * Minimal mapping (not attempting to cover every SVG pattern):\n * - absent / empty → undefined (solid, omitted from op)\n * - dash length ≤ 2 (dot-like, e.g. \"1,3\" / \"2,4\") → \"sysDot\"\n * - anything else → \"dash\"\n *\n * pptxgenjs valid dashType values (types/index.d.ts line 1040):\n * 'solid' | 'dash' | 'dashDot' | 'lgDash' | 'lgDashDot' | 'lgDashDotDot' | 'sysDash' | 'sysDot'\n */\nfunction mapDashArray(el: Element): DashType | undefined {\n const raw = el.getAttribute(\"stroke-dasharray\")\n if (!raw || raw === \"none\") return undefined\n const parts = raw.split(/[\\s,]+/).map(Number).filter((n) => !isNaN(n))\n if (parts.length === 0) return undefined\n // First value is the dash/dot length. If ≤ 2px it looks like a dot pattern.\n return parts[0] <= 2 ? \"sysDot\" : \"dash\"\n}\n\n/** Convert an SVG `<line>` element to a pptxgenjs line op. */\nexport function lineToOp(el: Element): LineOp {\n const x1 = num(el, \"x1\")\n const y1 = num(el, \"y1\")\n const x2 = num(el, \"x2\")\n const y2 = num(el, \"y2\")\n\n const dx = x2 - x1\n const dy = y2 - y1\n\n const strokeColor = el.getAttribute(\"stroke\") || \"#000000\"\n const strokeWidth = num(el, \"stroke-width\", 1) || 1\n\n const op: LineOp = {\n kind: \"line\",\n x: pxToIn(Math.min(x1, x2)),\n y: pxToIn(Math.min(y1, y2)),\n w: pxToIn(Math.abs(dx)),\n h: pxToIn(Math.abs(dy)),\n line: {\n color: svgColorToHex(strokeColor),\n width: pxToPt(strokeWidth),\n },\n }\n\n const dashType = mapDashArray(el)\n if (dashType) op.line.dashType = dashType\n\n const alpha =\n (1 - (svgColorTransparency(strokeColor) ?? 0) / 100) *\n elementOpacity(el, \"stroke-opacity\")\n const transparency = Math.round((1 - alpha) * 100)\n if (transparency > 0) op.line.transparency = transparency\n\n // When dx and dy have opposite signs the line runs along the anti-diagonal\n // (bottom-left ↔ top-right). pptxgenjs default is top-left → bottom-right,\n // so we flip vertically to get the correct direction.\n // Zero dx or dy means a horizontal/vertical line. no flip needed.\n if (dx !== 0 && dy !== 0 && Math.sign(dx) !== Math.sign(dy)) {\n op.flipV = true\n }\n\n return op\n}\n","import { pxToIn } from \"../../constants\"\nimport { applyFill, extractStroke } from \"./style\"\nimport type { GradientDef } from \"./gradient\"\n\n/**\n * A point inside a custom-geometry path. The shape matches pptxgenjs's\n * `ShapeProps.points` entries exactly, so the render layer passes them straight\n * to `slide.addShape(\"custGeom\", { points })`. Coordinates are inches relative\n * to the shape's bounding-box origin.\n */\n/** Center-parameterized arc segment (pptxgenjs `curve.type === \"arc\"`). */\nexport interface PathArc {\n type: \"arc\"\n hR: number\n wR: number\n stAng: number\n swAng: number\n}\n\nexport type PathPoint =\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: PathArc }\n | {\n x: number\n y: number\n curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number }\n }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { close: true }\n\n/**\n * A pptxgenjs custom-geometry draw, produced from an SVG\n * `<polygon>` / `<polyline>` / `<path>`. Rendered via\n * `slide.addShape(\"custGeom\", { x, y, w, h, points, fill, line })`.\n * Bounding box is in inches; line width is in points.\n */\nexport interface PathOp {\n kind: \"path\"\n x: number\n y: number\n w: number\n h: number\n points: PathPoint[]\n fill?: { color: string; transparency?: number }\n /** Set alongside `fill` (a solid placeholder) when `fill` was `url(#id)`. */\n gradientFill?: GradientDef\n line?: { color: string; width: number }\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\ninterface Pt {\n x: number\n y: number\n}\n\n/** Parse an SVG `points` attribute (\"x,y x,y\" or \"x y x y\") into px points. */\nfunction parsePoints(attr: string | null): Pt[] {\n if (!attr) return []\n const nums = attr\n .trim()\n .split(/[\\s,]+/)\n .map(Number)\n .filter((n) => !Number.isNaN(n))\n const pts: Pt[] = []\n for (let i = 0; i + 1 < nums.length; i += 2) {\n pts.push({ x: nums[i], y: nums[i + 1] })\n }\n return pts\n}\n\n/** Build a PathOp from absolute px vertices, with a tight bbox + fill/stroke. */\nfunction buildOp(\n pts: Pt[],\n closed: boolean,\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): PathOp {\n const xs = pts.map((p) => p.x)\n const ys = pts.map((p) => p.y)\n const minX = Math.min(...xs)\n const minY = Math.min(...ys)\n // 零尺寸 custGeom 在渲染端归一化时除零(曾表现为图标被拉成穿页巨柱)\n const maxX = Math.max(Math.max(...xs), minX + 0.75)\n const maxY = Math.max(Math.max(...ys), minY + 0.75)\n\n const points: PathPoint[] = pts.map((p, i) => ({\n x: pxToIn(p.x - minX),\n y: pxToIn(p.y - minY),\n ...(i === 0 ? { moveTo: true } : {}),\n }))\n if (closed) points.push({ close: true })\n\n const op: PathOp = {\n kind: \"path\",\n x: pxToIn(minX),\n y: pxToIn(minY),\n w: pxToIn(maxX - minX),\n h: pxToIn(maxY - minY),\n points,\n }\n applyFill(op, el, gradients)\n const line = extractStroke(el)\n if (line) op.line = line\n return op\n}\n\n/** Convert an SVG `<polygon>` to a closed custGeom op. */\nexport function polygonToOp(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): PathOp {\n return buildOp(parsePoints(el.getAttribute(\"points\")), true, el, gradients)\n}\n\n/** Convert an SVG `<polyline>` to an open custGeom op. */\nexport function polylineToOp(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): PathOp {\n return buildOp(parsePoints(el.getAttribute(\"points\")), false, el, gradients)\n}\n\n/** One resolved path segment in absolute px (or a subpath close marker). */\ntype Seg =\n | { x: number; y: number; moveTo: boolean }\n | { x: number; y: number; arc: { rx: number; ry: number; stAng: number; swAng: number; cx: number; cy: number } }\n | { x: number; y: number; cubic: { x1: number; y1: number; x2: number; y2: number } }\n | { x: number; y: number; quad: { x1: number; y1: number } }\n | { close: true }\n\n/**\n * Convert an SVG endpoint-parameterized arc to a center parameterization,\n * per the W3C SVG implementation notes (appendix B.2.4), assuming\n * x-axis-rotation = 0 (all arcs our renderer emits are axis-aligned).\n * Returns px radii plus start/sweep angles in degrees (y-down, clockwise),\n * which match DrawingML's stAng/swAng directly.\n */\nfunction svgArcToCenter(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rxIn: number,\n ryIn: number,\n fA: number,\n fS: number,\n): { rx: number; ry: number; stAng: number; swAng: number; cx: number; cy: number } {\n let rx = Math.abs(rxIn)\n let ry = Math.abs(ryIn)\n const x1p = (x1 - x2) / 2\n const y1p = (y1 - y2) / 2\n // Scale up radii if they're too small to span the chord.\n const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry)\n if (lambda > 1) {\n const s = Math.sqrt(lambda)\n rx *= s\n ry *= s\n }\n const sign = fA !== fS ? 1 : -1\n const num = rx * rx * ry * ry - rx * rx * y1p * y1p - ry * ry * x1p * x1p\n const den = rx * rx * y1p * y1p + ry * ry * x1p * x1p\n const coef = sign * Math.sqrt(Math.max(0, num / den))\n const cxp = (coef * (rx * y1p)) / ry\n const cyp = (coef * -(ry * x1p)) / rx\n\n const ux = (x1p - cxp) / rx\n const uy = (y1p - cyp) / ry\n const vx = (-x1p - cxp) / rx\n const vy = (-y1p - cyp) / ry\n const angleBetween = (ax: number, ay: number, bx: number, by: number) => {\n const dot = ax * bx + ay * by\n const len = Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by))\n let a = Math.acos(Math.min(1, Math.max(-1, dot / len)))\n if (ax * by - ay * bx < 0) a = -a\n return a\n }\n const theta1 = angleBetween(1, 0, ux, uy)\n let dTheta = angleBetween(ux, uy, vx, vy)\n if (fS === 0 && dTheta > 0) dTheta -= 2 * Math.PI\n if (fS === 1 && dTheta < 0) dTheta += 2 * Math.PI\n\n const toDeg = (r: number) => (r * 180) / Math.PI\n const stAng = ((toDeg(theta1) % 360) + 360) % 360\n // 圆心(x-axis-rotation=0):中点坐标系平移回原坐标\n const cx = cxp + (x1 + x2) / 2\n const cy = cyp + (y1 + y2) / 2\n return { rx, ry, stAng, swAng: toDeg(dTheta), cx, cy }\n}\n\n/** Tokenize a `d` string into command letters and numeric operands. */\nfunction tokenizePath(d: string): string[] {\n return d.match(/[a-zA-Z]|-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/gi) ?? []\n}\n\n/**\n * Walk an SVG `d` path (M/L/H/V/Z, absolute and relative) into absolute-px\n * segments. Extra coordinate pairs after M/L are implicit lineTos, per spec.\n */\nfunction parsePathData(d: string): Seg[] {\n const tokens = tokenizePath(d)\n const segs: Seg[] = []\n let cx = 0\n let cy = 0\n let sx = 0\n let sy = 0\n let lastCtrl: { x: number; y: number; kind: \"cubic\" | \"quad\" } | null = null\n let i = 0\n let cmd = \"\"\n const next = () => parseFloat(tokens[i++])\n\n while (i < tokens.length) {\n if (/[a-zA-Z]/.test(tokens[i])) {\n cmd = tokens[i++]\n } else if (cmd === \"M\") {\n cmd = \"L\"\n } else if (cmd === \"m\") {\n cmd = \"l\"\n }\n const rel = cmd === cmd.toLowerCase()\n switch (cmd.toUpperCase()) {\n case \"M\": {\n const x = next()\n const y = next()\n cx = rel ? cx + x : x\n cy = rel ? cy + y : y\n sx = cx\n sy = cy\n segs.push({ x: cx, y: cy, moveTo: true })\n break\n }\n case \"L\": {\n const x = next()\n const y = next()\n cx = rel ? cx + x : x\n cy = rel ? cy + y : y\n segs.push({ x: cx, y: cy, moveTo: false })\n break\n }\n case \"H\": {\n const x = next()\n cx = rel ? cx + x : x\n segs.push({ x: cx, y: cy, moveTo: false })\n break\n }\n case \"V\": {\n const y = next()\n cy = rel ? cy + y : y\n segs.push({ x: cx, y: cy, moveTo: false })\n break\n }\n case \"A\": {\n const rx = next()\n const ry = next()\n next() // x-axis-rotation (assumed 0)\n const fA = next()\n const fS = next()\n const tx = next()\n const ty = next()\n const ex = rel ? cx + tx : tx\n const ey = rel ? cy + ty : ty\n const arc = svgArcToCenter(cx, cy, ex, ey, rx, ry, fA, fS)\n segs.push({ x: ex, y: ey, arc })\n cx = ex\n cy = ey\n break\n }\n case \"C\": {\n const x1 = next()\n const y1 = next()\n const x2 = next()\n const y2 = next()\n const tx = next()\n const ty = next()\n const c = rel\n ? { x1: cx + x1, y1: cy + y1, x2: cx + x2, y2: cy + y2 }\n : { x1, y1, x2, y2 }\n cx = rel ? cx + tx : tx\n cy = rel ? cy + ty : ty\n segs.push({ x: cx, y: cy, cubic: c })\n lastCtrl = { x: c.x2, y: c.y2, kind: \"cubic\" }\n continue\n }\n case \"S\": {\n const x2 = next()\n const y2 = next()\n const tx = next()\n const ty = next()\n // 反射前一 cubic 的第二控制点,无前控制点时取当前点\n const refX: number = lastCtrl?.kind === \"cubic\" ? 2 * cx - lastCtrl.x : cx\n const refY: number = lastCtrl?.kind === \"cubic\" ? 2 * cy - lastCtrl.y : cy\n const c = rel\n ? { x1: refX, y1: refY, x2: cx + x2, y2: cy + y2 }\n : { x1: refX, y1: refY, x2, y2 }\n cx = rel ? cx + tx : tx\n cy = rel ? cy + ty : ty\n segs.push({ x: cx, y: cy, cubic: c })\n lastCtrl = { x: c.x2, y: c.y2, kind: \"cubic\" }\n continue\n }\n case \"Q\": {\n const x1 = next()\n const y1 = next()\n const tx = next()\n const ty = next()\n const q = rel ? { x1: cx + x1, y1: cy + y1 } : { x1, y1 }\n cx = rel ? cx + tx : tx\n cy = rel ? cy + ty : ty\n segs.push({ x: cx, y: cy, quad: q })\n lastCtrl = { x: q.x1, y: q.y1, kind: \"quad\" }\n continue\n }\n case \"T\": {\n const tx = next()\n const ty = next()\n const refX: number = lastCtrl?.kind === \"quad\" ? 2 * cx - lastCtrl.x : cx\n const refY: number = lastCtrl?.kind === \"quad\" ? 2 * cy - lastCtrl.y : cy\n cx = rel ? cx + tx : tx\n cy = rel ? cy + ty : ty\n segs.push({ x: cx, y: cy, quad: { x1: refX, y1: refY } })\n lastCtrl = { x: refX, y: refY, kind: \"quad\" }\n continue\n }\n case \"Z\": {\n segs.push({ close: true })\n cx = sx\n cy = sy\n break\n }\n default:\n // Unsupported command — skip its tokens defensively.\n i++\n }\n // 曲线命令以 continue 跳过此行。其余命令重置平滑反射基准(SVG 规范)。\n lastCtrl = null\n }\n return segs\n}\n\n/** Build a PathOp from absolute-px segments, with a tight bbox + fill/stroke. */\nfunction segsToOp(\n segs: Seg[],\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): PathOp {\n const anchors = segs.filter((s): s is Extract<Seg, { x: number }> => \"x\" in s)\n const xs = anchors.map((p) => p.x)\n const ys = anchors.map((p) => p.y)\n for (const seg of segs) {\n if (\"cubic\" in seg) {\n xs.push(seg.cubic.x1, seg.cubic.x2)\n ys.push(seg.cubic.y1, seg.cubic.y2)\n } else if (\"quad\" in seg) {\n xs.push(seg.quad.x1)\n ys.push(seg.quad.y1)\n } else if (\"arc\" in seg) {\n // 弧的鼓出可越过锚点连线(如扁平弧 M3 12 A9 3 ... 21 12 的下缘),\n // 仅当扫掠覆盖 0/90/180/270° 时计入该轴向极值(角度为 y 向下顺时针,\n // 与 DrawingML stAng/swAng 一致),避免 bbox 塌成零高又不粗放过界。\n const { rx, ry, stAng, swAng, cx, cy } = seg.arc\n const within = (deg: number) => {\n const delta = (((deg - stAng) % 360) + 360) % 360\n return swAng >= 0 ? delta <= swAng : delta - 360 >= swAng\n }\n if (within(0)) xs.push(cx + rx)\n if (within(180)) xs.push(cx - rx)\n if (within(90)) ys.push(cy + ry)\n if (within(270)) ys.push(cy - ry)\n }\n }\n const minX = Math.min(...xs)\n const minY = Math.min(...ys)\n const maxX = Math.max(...xs)\n const maxY = Math.max(...ys)\n\n const points: PathPoint[] = segs.map((s) => {\n if (\"close\" in s) return { close: true }\n if (\"cubic\" in s) {\n return {\n x: pxToIn(s.x - minX),\n y: pxToIn(s.y - minY),\n curve: {\n type: \"cubic\",\n x1: pxToIn(s.cubic.x1 - minX),\n y1: pxToIn(s.cubic.y1 - minY),\n x2: pxToIn(s.cubic.x2 - minX),\n y2: pxToIn(s.cubic.y2 - minY),\n },\n }\n }\n if (\"quad\" in s) {\n return {\n x: pxToIn(s.x - minX),\n y: pxToIn(s.y - minY),\n curve: {\n type: \"quadratic\",\n x1: pxToIn(s.quad.x1 - minX),\n y1: pxToIn(s.quad.y1 - minY),\n },\n }\n }\n if (\"arc\" in s) {\n return {\n x: pxToIn(s.x - minX),\n y: pxToIn(s.y - minY),\n curve: {\n type: \"arc\",\n wR: pxToIn(s.arc.rx),\n hR: pxToIn(s.arc.ry),\n stAng: s.arc.stAng,\n swAng: s.arc.swAng,\n },\n }\n }\n return {\n x: pxToIn(s.x - minX),\n y: pxToIn(s.y - minY),\n ...(s.moveTo ? { moveTo: true } : {}),\n }\n })\n\n const op: PathOp = {\n kind: \"path\",\n x: pxToIn(minX),\n y: pxToIn(minY),\n w: pxToIn(maxX - minX),\n h: pxToIn(maxY - minY),\n points,\n }\n applyFill(op, el, gradients)\n const line = extractStroke(el)\n if (line) op.line = line\n return op\n}\n\n/** Convert an SVG `<path>` (M/L/H/V/Z) to a custGeom op. */\nexport function pathToOp(\n el: Element,\n gradients?: ReadonlyMap<string, GradientDef>,\n): PathOp {\n return segsToOp(parsePathData(el.getAttribute(\"d\") ?? \"\"), el, gradients)\n}\n","import { pxToIn } from \"../../constants\"\n\n/**\n * A pptxgenjs image draw, produced from an SVG `<image>` element.\n * Rendered later via `slide.addImage({ data, x, y, w, h })`.\n * `data` is a base64 data-URI string (e.g. \"data:image/png;base64,...\").\n * All positions are in inches.\n */\nexport interface ImageOp {\n kind: \"image\"\n x: number\n y: number\n w: number\n h: number\n data: string\n /**\n * pptxgenjs sizing(2026-07-09 用户报导出拉伸):SVG 预览的\n * preserveAspectRatio 语义必须翻译到导出,否则 addImage 按 w/h 拉伸。\n * slice→cover(居中裁剪出血,pptxgenjs 对称 srcRect)、meet/缺省→contain\n * (SVG 规范缺省即 xMidYMid meet)、显式 none→不设(保持拉伸)。\n */\n sizing?: { type: \"cover\" | \"contain\"; w: number; h: number }\n /** Set by `svg2pptx/dispatch.ts` when this leaf lives under a `data-blk`-tagged `<g>` (wave-C S3, `elements === \"auto\"` only). */\n blockIndex?: number\n}\n\nconst XLINK_NS = \"http://www.w3.org/1999/xlink\"\n\nfunction num(el: Element, name: string): number {\n return parseFloat(el.getAttribute(name) ?? \"0\") || 0\n}\n\n/**\n * Resolve the image source from an SVG `<image>` element.\n * Priority: `href` attribute > `xlink:href` (namespaced) > `xlink:href` (raw).\n */\nfunction resolveHref(el: Element): string {\n return (\n el.getAttribute(\"href\") ??\n el.getAttributeNS(XLINK_NS, \"href\") ??\n el.getAttribute(\"xlink:href\") ??\n \"\"\n )\n}\n\n/**\n * 从 data URI 头同步嗅探图片原始像素尺寸(png/jpeg/gif——导出链在\n * pptx-inline-assets 已把其他格式重编码为 png)。识别不了返回 null。\n *\n * 为什么需要:pptxgenjs 的 sizing 用「addImage 的 w/h(应传图片原始尺寸)\n * 与 sizing.w/h(目标框)」的比值算 srcRect 裁剪量——两者传同值会得到\n * 零裁剪(srcRect 全 0),图仍被拉伸(2026-07-09 实拍 XML 证据)。\n */\nexport function dataUriDimensions(uri: string): { w: number; h: number } | null {\n const m = /^data:image\\/(png|jpeg|jpg|gif);base64,/.exec(uri)\n if (!m) return null\n // JPEG 的 SOF 段可能在 EXIF 之后,解码前 256KB 足够覆盖真实病例\n const b64 = uri.slice(m[0].length, m[0].length + 262144)\n let bytes: Uint8Array\n try {\n const bin = atob(b64.slice(0, b64.length - (b64.length % 4)))\n bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n } catch {\n return null\n }\n const be16 = (i: number) => (bytes[i] << 8) | bytes[i + 1]\n const be32 = (i: number) =>\n ((bytes[i] << 24) | (bytes[i + 1] << 16) | (bytes[i + 2] << 8) | bytes[i + 3]) >>> 0\n // PNG: 8 字节签名 + IHDR(宽高在 16/20,big-endian 32 位)\n if (bytes.length > 24 && bytes[0] === 0x89 && bytes[1] === 0x50) {\n return { w: be32(16), h: be32(20) }\n }\n // GIF: \"GIF\" + 宽高在 6/8(little-endian 16 位)\n if (bytes.length > 10 && bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46) {\n return { w: bytes[6] | (bytes[7] << 8), h: bytes[8] | (bytes[9] << 8) }\n }\n // JPEG: 扫描 SOF0/1/2 标记(高在 +5、宽在 +7,big-endian 16 位)\n if (bytes.length > 4 && bytes[0] === 0xff && bytes[1] === 0xd8) {\n let i = 2\n while (i + 9 < bytes.length) {\n if (bytes[i] !== 0xff) {\n i++\n continue\n }\n const marker = bytes[i + 1]\n if (marker === 0xc0 || marker === 0xc1 || marker === 0xc2) {\n return { w: be16(i + 7), h: be16(i + 5) }\n }\n i += 2 + be16(i + 2)\n }\n }\n return null\n}\n\n/** Convert an SVG `<image>` element to a pptxgenjs image op. */\nexport function imageToOp(el: Element): ImageOp {\n const boxW = pxToIn(num(el, \"width\"))\n const boxH = pxToIn(num(el, \"height\"))\n const data = resolveHref(el)\n const op: ImageOp = {\n kind: \"image\",\n x: pxToIn(num(el, \"x\")),\n y: pxToIn(num(el, \"y\")),\n w: boxW,\n h: boxH,\n data,\n }\n const par = el.getAttribute(\"preserveAspectRatio\") ?? \"\"\n if (par !== \"none\") {\n // slice→cover(居中裁剪出血);meet/缺省→contain(SVG 规范缺省即\n // xMidYMid meet)。pptxgenjs 契约:w/h 传图片原始尺寸、sizing.w/h 传\n // 目标框(单位一致即可,比值运算)。嗅探不到原始尺寸时保持拉伸\n // (不比修复前更糟,且 aspect 相同时拉伸=无损)。\n const natural = dataUriDimensions(data)\n if (natural && natural.w > 0 && natural.h > 0) {\n op.w = pxToIn(natural.w)\n op.h = pxToIn(natural.h)\n op.sizing = { type: par.includes(\"slice\") ? \"cover\" : \"contain\", w: boxW, h: boxH }\n }\n }\n return op\n}\n","/**\n * SVG 2D affine transform utilities.\n *\n * Represents the SVG `matrix(a,b,c,d,e,f)` as a 6-tuple:\n *\n * | a c e |\n * | b d f |\n * | 0 0 1 |\n *\n * Point mapping: x' = a*x + c*y + e, y' = b*x + d*y + f.\n *\n * SVG transform-list composition direction (per SVG 1.1 §7.6):\n * \"translate(10,0) scale(2)\" compiles to T_translate · T_scale.\n * When applied to a point p, this equals T_translate(T_scale(p)),\n * i.e. scale is applied first, translate second.\n * Implementation: left-fold the list with `multiply`.\n */\n\n/** A 2D affine matrix stored as [a, b, c, d, e, f]. */\nexport type Matrix = [number, number, number, number, number, number]\n\n/** The identity matrix — leaves every point unchanged. */\nexport const IDENTITY: Matrix = [1, 0, 0, 1, 0, 0]\n\n/**\n * Multiply two affine matrices: result = m1 · m2.\n *\n * For point application this means m2 acts first, then m1:\n * applyPoint(multiply(m1, m2), x, y) === applyPoint(m1, ...applyPoint(m2, x, y))\n */\nexport function multiply(m1: Matrix, m2: Matrix): Matrix {\n const [a1, b1, c1, d1, e1, f1] = m1\n const [a2, b2, c2, d2, e2, f2] = m2\n return [\n a1 * a2 + c1 * b2,\n b1 * a2 + d1 * b2,\n a1 * c2 + c1 * d2,\n b1 * c2 + d1 * d2,\n a1 * e2 + c1 * f2 + e1,\n b1 * e2 + d1 * f2 + f1,\n ]\n}\n\n/** Apply an affine matrix to a 2D point. */\nexport function applyPoint(\n m: Matrix,\n x: number,\n y: number,\n): { x: number; y: number } {\n return {\n x: m[0] * x + m[2] * y + m[4],\n y: m[1] * x + m[3] * y + m[5],\n }\n}\n\n// ---------------------------------------------------------------------------\n// Parsing helpers\n// ---------------------------------------------------------------------------\n\nconst DEG_TO_RAD = Math.PI / 180\n\n/**\n * Regex that matches a single SVG transform function.\n * Captures: (1) function name, (2) the raw parameter string inside parens.\n */\nconst TRANSFORM_RE = /\\b(translate|scale|rotate|matrix)\\s*\\(([^)]*)\\)/g\n\n/** Split the parameter string on commas and/or whitespace, returning numbers. */\nfunction parseArgs(raw: string): number[] {\n return raw\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean)\n .map(Number)\n}\n\n/**\n * Parse an SVG `transform` attribute string into a single affine Matrix.\n *\n * Supports: translate, scale, rotate, matrix.\n *\n * **Composition direction** (SVG 1.1 §7.6, also SVG 2 §8.8):\n * > \"The individual transform definitions are separated by whitespace and/or\n * > a comma. … the net effect is as if each transform had been specified\n * > separately in the order given.\"\n *\n * Concretely, `transform=\"T1 T2 T3\"` is equivalent to the matrix product\n * T1 · T2 · T3. When this product is applied to a point p, T3 acts first\n * (innermost), then T2, then T1 (outermost). We build the result by\n * left-folding with `multiply`: result = ((I · T1) · T2) · T3.\n */\nexport function parseTransform(attr: string): Matrix {\n let result: Matrix = [...IDENTITY]\n\n // Reset lastIndex because the regex is global and reused.\n TRANSFORM_RE.lastIndex = 0\n\n let match: RegExpExecArray | null\n while ((match = TRANSFORM_RE.exec(attr)) !== null) {\n const fn = match[1]\n const args = parseArgs(match[2])\n let m: Matrix\n\n switch (fn) {\n case \"translate\": {\n const tx = args[0] ?? 0\n const ty = args[1] ?? 0\n m = [1, 0, 0, 1, tx, ty]\n break\n }\n case \"scale\": {\n const sx = args[0] ?? 1\n const sy = args[1] ?? sx\n m = [sx, 0, 0, sy, 0, 0]\n break\n }\n case \"rotate\": {\n const deg = args[0] ?? 0\n const rad = deg * DEG_TO_RAD\n const cos = Math.cos(rad)\n const sin = Math.sin(rad)\n if (args.length >= 3) {\n // rotate(deg, cx, cy) = translate(cx,cy) · rotate(deg) · translate(-cx,-cy)\n const cx = args[1]\n const cy = args[2]\n m = multiply(\n multiply([1, 0, 0, 1, cx, cy], [cos, sin, -sin, cos, 0, 0]),\n [1, 0, 0, 1, -cx, -cy],\n )\n } else {\n m = [cos, sin, -sin, cos, 0, 0]\n }\n break\n }\n case \"matrix\": {\n m = [\n args[0] ?? 1,\n args[1] ?? 0,\n args[2] ?? 0,\n args[3] ?? 1,\n args[4] ?? 0,\n args[5] ?? 0,\n ]\n break\n }\n default:\n continue\n }\n\n result = multiply(result, m)\n }\n\n return result\n}\n","import { pxToIn } from \"../../constants\"\nimport { rectToOp, type ShapeOp } from \"./rect\"\nimport { circleToOp, ellipseToOp, type EllipseOp } from \"./ellipse\"\nimport { textToOp, type TextOp } from \"./text\"\nimport { lineToOp, type LineOp } from \"./line\"\nimport { polygonToOp, polylineToOp, pathToOp, type PathOp, type PathPoint } from \"./path\"\nimport { imageToOp, type ImageOp } from \"./image\"\nimport { collectGradients, type GradientDef } from \"./gradient\"\nimport {\n IDENTITY,\n multiply,\n applyPoint,\n parseTransform,\n type Matrix,\n} from \"./transform\"\n\n/** Any pptxgenjs draw op, discriminated by `kind`. */\nexport type Op = ShapeOp | EllipseOp | TextOp | LineOp | PathOp | ImageOp\n\n/**\n * Subtrees that define reusable content rather than render inline. We skip\n * them entirely (do not descend), matching how a browser paints the SVG.\n */\nconst SKIP_TAGS = new Set([\n \"defs\",\n \"clipPath\",\n \"mask\",\n \"marker\",\n \"pattern\",\n \"symbol\",\n \"linearGradient\",\n \"radialGradient\",\n \"filter\",\n \"style\",\n \"title\",\n \"desc\",\n \"metadata\",\n])\n\n/** Containers we descend into, composing any transform they carry. */\nconst CONTAINER_TAGS = new Set([\"svg\", \"g\", \"a\"])\n\n/** Shift an op's anchor by an inch offset (a flattened translate). */\nfunction translateOp<T extends Op>(op: T, dx: number, dy: number): T {\n return { ...op, x: op.x + dx, y: op.y + dy }\n}\n\n/**\n * Apply a uniform-ish scale to an op's local geometry (icons emit\n * `translate(...) scale(...)`——此前 scale 在叶子被丢弃,图标始终按 24px\n * 原始坐标渲染)。仅处理无旋转矩阵(本渲染器只发 translate/scale)。\n */\nfunction scaleOp(op: Op, sx: number, sy: number): Op {\n if (sx === 1 && sy === 1) return op\n const avg = (sx + sy) / 2\n const box = { x: op.x * sx, y: op.y * sy, w: op.w * sx, h: op.h * sy }\n switch (op.kind) {\n case \"text\":\n return {\n ...op,\n ...box,\n fontSize: op.fontSize * avg,\n runs: op.runs.map((r) =>\n r.fontSize != null ? { ...r, fontSize: r.fontSize * avg } : r,\n ),\n }\n case \"path\":\n return {\n ...op,\n ...box,\n ...(op.line ? { line: { ...op.line, width: op.line.width * avg } } : {}),\n points: op.points.map((pt): PathPoint => {\n if (\"close\" in pt) return pt\n if (\"curve\" in pt) {\n if (pt.curve.type === \"arc\") {\n return {\n x: pt.x * sx,\n y: pt.y * sy,\n curve: { ...pt.curve, wR: pt.curve.wR * sx, hR: pt.curve.hR * sy },\n }\n }\n if (pt.curve.type === \"cubic\") {\n return {\n x: pt.x * sx,\n y: pt.y * sy,\n curve: {\n type: \"cubic\",\n x1: pt.curve.x1 * sx,\n y1: pt.curve.y1 * sy,\n x2: pt.curve.x2 * sx,\n y2: pt.curve.y2 * sy,\n },\n }\n }\n return {\n x: pt.x * sx,\n y: pt.y * sy,\n curve: { type: \"quadratic\", x1: pt.curve.x1 * sx, y1: pt.curve.y1 * sy },\n }\n }\n return { ...pt, x: pt.x * sx, y: pt.y * sy }\n }),\n }\n case \"line\":\n return { ...op, ...box, line: { ...op.line, width: op.line.width * avg } }\n case \"shape\":\n return {\n ...op,\n ...box,\n ...(op.line ? { line: { ...op.line, width: op.line.width * avg } } : {}),\n ...(\"rectRadius\" in op && op.rectRadius != null\n ? { rectRadius: op.rectRadius * avg }\n : {}),\n }\n default:\n return { ...op, ...box }\n }\n}\n\n/** Convert a single leaf element to an op, or null if it isn't drawable. */\nfunction leafToOp(el: Element, gradients: ReadonlyMap<string, GradientDef>): Op | null {\n switch (el.tagName.toLowerCase()) {\n case \"rect\":\n return rectToOp(el, gradients)\n case \"circle\":\n return circleToOp(el, gradients)\n case \"ellipse\":\n return ellipseToOp(el, gradients)\n case \"text\":\n return textToOp(el)\n case \"line\":\n return lineToOp(el)\n case \"polygon\":\n return polygonToOp(el, gradients)\n case \"polyline\":\n return polylineToOp(el, gradients)\n case \"path\":\n return pathToOp(el, gradients)\n case \"image\":\n return imageToOp(el)\n default:\n return null\n }\n}\n\nfunction walk(\n el: Element,\n parent: Matrix,\n out: Op[],\n gradients: ReadonlyMap<string, GradientDef>,\n blockIndex: number | undefined,\n): void {\n const tag = el.tagName.toLowerCase()\n if (SKIP_TAGS.has(tag)) return\n\n // Compose this element's own transform onto the inherited one.\n const own = el.getAttribute(\"transform\")\n const ctm = own ? multiply(parent, parseTransform(own)) : parent\n\n // Wave-C S3 (elements === \"auto\" only): `blocks/index.tsx`'s `renderBlock`\n // wraps a block's content in `<g data-blk=\"{index}\">`. Once entered, every\n // descendant leaf inherits that index — a block can nest its own `<g>`s\n // (icon groups, card rows) without losing the tag — until a *different*\n // `data-blk` is encountered, which overrides it for its own subtree.\n const dataBlk = el.getAttribute(\"data-blk\")\n const ownBlockIndex = dataBlk != null ? Number(dataBlk) : blockIndex\n\n if (CONTAINER_TAGS.has(tag)) {\n for (const child of Array.from(el.children)) walk(child, ctm, out, gradients, ownBlockIndex)\n return\n }\n\n const op = leafToOp(el, gradients)\n if (!op) return\n // 本渲染器只发 translate/scale:先按矩阵对角项缩放局部几何,再平移到\n // 原点像。旋转/斜切不在受控子集内(出现时按未缩放处理并靠门测试拦截)。\n const origin = applyPoint(ctm, 0, 0)\n const positioned = translateOp(scaleOp(op, ctm[0], ctm[3]), pxToIn(origin.x), pxToIn(origin.y))\n out.push(ownBlockIndex != null ? { ...positioned, blockIndex: ownBlockIndex } : positioned)\n}\n\n/**\n * Walk an SVG element tree depth-first (document order) and convert every\n * drawable leaf into a pptxgenjs op, flattening inherited `<g>` translate\n * transforms into each leaf's coordinates.\n *\n * Gradients are collected once up front from `<defs>` (`collectGradients`) so\n * any leaf's `fill=\"url(#id)\"` can resolve regardless of document order.\n */\nexport function svgToOps(root: Element): Op[] {\n const gradients = collectGradients(root)\n const out: Op[] = []\n walk(root, IDENTITY, out, gradients, undefined)\n return out\n}\n","/**\n * Safe-font resolution for the single-source SVG renderer.\n *\n * pptxgenjs writes a single `fontFace` name into the .pptx; whatever the target\n * machine lacks gets silently substituted by PowerPoint. The 6 themes lead with\n * designer fonts (Sectra / Inter / Lora …) that are absent on a stock Windows\n * install, so we resolve each font stack down to the first member PowerPoint can\n * actually render, falling back to a CJK+Latin-covering default by role.\n *\n * The set is intentionally Windows-guaranteed. Latin faces here (Georgia, Arial,\n * Consolas …) also ship on macOS, but Mac-only faces (PingFang SC) are excluded\n * so a deck authored on a Mac still renders predictably on Windows.\n */\n\nexport type FontRole = \"heading\" | \"body\" | \"mono\"\n\n/** Lower-cased names of fonts preinstalled on a stock Windows (and, for Latin, macOS). */\nexport const SAFE_FONTS: Set<string> = new Set(\n [\n // Latin sans\n \"Arial\",\n \"Calibri\",\n \"Tahoma\",\n \"Verdana\",\n \"Segoe UI\",\n // Latin serif\n \"Georgia\",\n \"Times New Roman\",\n \"Cambria\",\n // Latin mono\n \"Consolas\",\n \"Courier New\",\n \"Lucida Console\",\n // CJK (Windows)\n \"Microsoft YaHei\",\n \"微软雅黑\",\n \"SimSun\",\n \"宋体\",\n \"SimHei\",\n \"黑体\",\n \"KaiTi\",\n \"楷体\",\n \"FangSong\",\n \"仿宋\",\n ].map((f) => f.toLowerCase()),\n)\n\nconst ROLE_DEFAULT: Record<FontRole, string> = {\n heading: \"Microsoft YaHei\",\n body: \"Microsoft YaHei\",\n mono: \"Consolas\",\n}\n\n/**\n * Pick the first font in `stack` that PowerPoint can render on a stock machine,\n * or the role default when none qualify.\n */\nexport function resolveFontFace(stack: string[], role: FontRole): string {\n for (const raw of stack) {\n const name = raw.replace(/['\"]/g, \"\").trim()\n if (SAFE_FONTS.has(name.toLowerCase())) return name\n }\n return ROLE_DEFAULT[role]\n}\n\n/** Lower-cased safe faces that read as serif, used to pick a preview fallback family below. */\nconst SERIF_SAFE_FACES = new Set(\n [\"Georgia\", \"Times New Roman\", \"Cambria\", \"SimSun\", \"宋体\", \"FangSong\", \"仿宋\", \"KaiTi\", \"楷体\"].map(\n (f) => f.toLowerCase(),\n ),\n)\n\n/** Preview-only fallback families, keyed by the resolved face's rendered look. */\nconst PREVIEW_FALLBACK = {\n serif: \"Songti SC, STSong, serif\",\n sans: \"PingFang SC, Helvetica Neue, sans-serif\",\n mono: \"Menlo, monospace\",\n} as const\n\n/**\n * Resolve `stack` to a CSS font-family list: the Windows-safe face `resolveFontFace`\n * picks (unchanged — svg2pptx's `firstFontFamily` still reads this as the exported\n * `fontFace`) followed by a macOS-available fallback so the in-app SVG preview\n * doesn't silently drop to a generic sans-serif when the resolved face (e.g.\n * SimSun) isn't installed on the machine rendering the preview.\n */\nexport function resolveFontStack(stack: string[], role: FontRole): string {\n const face = resolveFontFace(stack, role)\n const fallback =\n role === \"mono\"\n ? PREVIEW_FALLBACK.mono\n : SERIF_SAFE_FACES.has(face.toLowerCase())\n ? PREVIEW_FALLBACK.serif\n : PREVIEW_FALLBACK.sans\n return `${face}, ${fallback}`\n}\n","/**\n * Linear colour interpolation between two hex colours, producing `n` evenly\n * spaced band colours (including the endpoints). Used by the SVG background\n * renderer to approximate a gradient with solid-fill <rect> bands — every\n * output is a plain #RRGGBB hex string so the svg2pptx bridge can map each\n * band to a native DrawingML solid-fill rect.\n */\n\nfunction parseHex(hex: string): [number, number, number] {\n const h = hex.replace(\"#\", \"\")\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ]\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)))\n return (\n \"#\" +\n [clamp(r), clamp(g), clamp(b)]\n .map((v) => v.toString(16).toUpperCase().padStart(2, \"0\"))\n .join(\"\")\n )\n}\n\n/**\n * Return `n` hex colours linearly interpolated from `from` to `to`.\n * The first element equals `from` and the last equals `to`.\n * @param from Start colour as #RRGGBB (case-insensitive).\n * @param to End colour as #RRGGBB (case-insensitive).\n * @param n Number of bands (must be >= 2).\n */\nexport function gradientBands(from: string, to: string, n: number): string[] {\n if (n < 2) throw new Error(\"gradientBands requires n >= 2\")\n\n const [r1, g1, b1] = parseHex(from)\n const [r2, g2, b2] = parseHex(to)\n\n const result: string[] = []\n for (let i = 0; i < n; i++) {\n const t = i / (n - 1)\n result.push(toHex(r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t))\n }\n return result\n}\n","import type { BackgroundSpec } from \"@/ir\"\nimport { CANVAS_W_PX, CANVAS_H_PX } from \"../constants\"\nimport { gradientBands } from \"./gradient-bands\"\n\n/** Number of solid-fill rect bands used to approximate a gradient. */\nconst GRADIENT_BAND_COUNT = 24\n\n/**\n * Full-bleed slide background as pure SVG. Solid colors and asset images map\n * cleanly to DrawingML. Gradients are approximated with multiple solid-fill\n * <rect> bands (no linearGradient/defs/url()) so each band converts to a\n * native DrawingML rect — preview and export stay consistent.\n *\n * This band approximation never emits `<linearGradient>`/`url(#...)`, so it\n * never touches `pptx/svg2pptx/gradient.ts`'s native `<a:gradFill>`\n * converter — that converter is separate, currently-unwired infrastructure\n * for arbitrary shapes (rect/circle/ellipse/polygon/polyline/path) that carry\n * a real gradient `url(#...)` fill, meant as groundwork for a future theme\n * decoration layer / chart gradients, not for slide backgrounds. The two\n * approaches coexist without conflict simply because this component never\n * produces the `url(#...)` input the other one looks for — if this band\n * approximation is ever replaced with a real `<linearGradient>`, it would\n * start flowing through that converter instead (see its doc comment for the\n * reverse pointer back here).\n */\n/**\n * Auto-scrim opacity。设计主题上「背景图」的语义是**加了图像纹理的主题\n * 底色**——模板文字色是为各页型默认底色 baked 的(不走 ctx.colors、无法\n * 反色),scrim 把图拉回那个底色保证文字可读。0.8 时用户裁决「看不清\n * 背景」(2026-07-09),降 0.66:矩阵最坏组合(浅主题深字 × 暗照片)\n * 实测仍可读,图像内容清晰可辨。均匀单 rect:opacity 渐变 bands 叠在\n * 图像上会在每条边界产生肉眼可见的透出率突变(实色 gradient bands 无此\n * 问题),实测有横纹,弃用。\n */\nconst AUTO_SCRIM_OPACITY = 0.66\n\nexport function Background({\n spec,\n images,\n autoScrimColor,\n}: {\n spec: BackgroundSpec\n images?: Record<string, { src: string }>\n /**\n * 图片排版 P1:设计主题传主题 surface 色——asset 背景**未显式给 overlay**\n * 时自动叠上浅下深的对比度遮罩(把图往主题底色拉,保证前景 tokens 文字\n * 可读)。custom 主题不传(保持裸背景,兼容存量行为)。显式 overlay 永远\n * 优先于自动 scrim。\n */\n autoScrimColor?: string\n}) {\n const W = CANVAS_W_PX\n const H = CANVAS_H_PX\n\n if (spec.kind === \"color\") {\n return <rect x={0} y={0} width={W} height={H} fill={spec.value} />\n }\n\n if (spec.kind === \"gradient\") {\n const n = GRADIENT_BAND_COUNT\n const bands = gradientBands(spec.from, spec.to, n)\n const isLR = spec.direction === \"lr\"\n\n // tb (default) & diagonal → horizontal bands stacked top-to-bottom.\n // lr → vertical bands placed left-to-right.\n // Each band slightly oversized (+1 px) to avoid sub-pixel seams.\n if (isLR) {\n const bandW = W / n\n return (\n <>\n {bands.map((fill, i) => (\n <rect\n key={i}\n x={Math.round(bandW * i)}\n y={0}\n width={Math.ceil(bandW) + 1}\n height={H}\n fill={fill}\n />\n ))}\n </>\n )\n }\n\n // tb / diagonal: horizontal bands\n const bandH = H / n\n return (\n <>\n {bands.map((fill, i) => (\n <rect\n key={i}\n x={0}\n y={Math.round(bandH * i)}\n width={W}\n height={Math.ceil(bandH) + 1}\n fill={fill}\n />\n ))}\n </>\n )\n }\n\n // asset\n const src = images?.[spec.asset_id]?.src\n return (\n <>\n {src ? (\n <image\n href={src}\n x={0}\n y={0}\n width={W}\n height={H}\n preserveAspectRatio={spec.fit === \"contain\" ? \"xMidYMid meet\" : \"xMidYMid slice\"}\n />\n ) : (\n <rect x={0} y={0} width={W} height={H} fill=\"#1A1A1A\" />\n )}\n {spec.overlay ? (\n <rect\n x={0}\n y={0}\n width={W}\n height={H}\n fill={spec.overlay.color}\n fillOpacity={spec.overlay.opacity}\n />\n ) : autoScrimColor ? (\n <rect\n x={0}\n y={0}\n width={W}\n height={H}\n fill={autoScrimColor}\n fillOpacity={AUTO_SCRIM_OPACITY}\n />\n ) : null}\n </>\n )\n}\n","/**\n * Shared confidentiality label map.\n * Used by all v2 theme templates to render the Chinese confidentiality badge.\n */\nexport const CONF_LABEL: Record<string, string> = {\n public: \"公开\",\n internal: \"内部\",\n confidential: \"机密\",\n restricted: \"受限\",\n}\n","import type {\n ChapterArchetypeId,\n ContentArchetypeId,\n CoverArchetypeId,\n EndingArchetypeId,\n MotifArchetypeId,\n} from \"../svg/archetypes/types\"\nimport { resolveThemeId, type CanonicalThemeId } from \"./index\"\n\n/**\n * Personality manifest(spec §3.3):主题的「选择权」配置——允许哪些\n * archetype。排印/色彩在 tokens,这里只放集合。P2 扩展到四页型 + motif。\n * 页型空集 = 该页型回落调用侧兜底(Wave 5 删旧模板后六主题四页型均非空)。\n */\nexport interface PersonalityManifest {\n archetypes: {\n cover: readonly CoverArchetypeId[]\n chapter: readonly ChapterArchetypeId[]\n content: readonly ContentArchetypeId[]\n ending: readonly EndingArchetypeId[]\n }\n /** Motif:单值,非 allowed-set(spec §3.3 示意 YAML 的形态)。undefined = 该主题无 motif 装饰(Wave 5 后六主题均已设 motif)。 */\n motif?: MotifArchetypeId\n /** MasterChrome 页脚行为的主题级开关(P2 Task 25)。undefined = 各字段默认 false。 */\n chrome?: {\n /** content 页背景图 + 卡片态时整页抑制页脚(custom 主题的存量语义)。默认 false。 */\n suppressFooterOnCardContent?: boolean\n /** 不画页脚分隔线(meta 文字照排)——主题自带版框线时避免双线(ink,2026-07-10)。默认 false。 */\n suppressFooterRule?: boolean\n }\n}\n\nexport const THEME_MANIFESTS: Record<CanonicalThemeId, PersonalityManifest> = {\n // Wave 4 Task 23:六主题四页型 + motif 全量接线(迁移完成、观感不变)。\n // consulting 的 cover 保留双元素 [\"banner-title\",\"poster-center\"]——P2 首个\n // 增量(2026-07-09)已人工审通过的多样性增量,不在本任务收窄回单元素。\n // 其余五主题、以及 consulting 的 chapter/content/ending 均填各自「原生」\n // 单 archetype:不引入跨主题多样化(P3 item①②的范围)。\n consulting: {\n archetypes: {\n cover: [\"banner-title\", \"poster-center\", \"split-diagonal\"],\n chapter: [\"banner-chapter\"],\n content: [\"banner-heading\", \"two-column\"],\n ending: [\"banner-ending\"],\n },\n motif: \"banner-motif\",\n },\n insight: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n // 2026-07-12 财经借鉴:章节页升级罗马数字+圆环光晕(roman-chapter)\n chapter: [\"roman-chapter\"],\n content: [\"stacked-poster\", \"two-column\"],\n ending: [\"poster-ending\"],\n },\n motif: \"poster-motif\",\n },\n academic: {\n archetypes: {\n cover: [\"left-anchor\", \"split-diagonal\"],\n chapter: [\"rail-chapter\"],\n content: [\"rail-numbered\", \"two-column\"],\n ending: [\"rail-ending\"],\n },\n motif: \"rail-motif\",\n },\n tech: {\n archetypes: {\n cover: [\"constellation\", \"split-diagonal\"],\n chapter: [\"constellation-chapter\"],\n content: [\"bento-panel\", \"two-column\"],\n ending: [\"constellation-ending\"],\n },\n motif: \"constellation-motif\",\n },\n // magazine(时尚杂志,2026-07-10 拆分):与 journal 共享 masthead 报头\n // 家族(同版式不同 tokens 气质大变),角饰是人文感故不带 motif。\n // 2026-07-10 冲击力返工(用户否三个换皮色板):冲击力=超大排印+满版\n // 色块(检索背书),fashion-masthead/fashion-chapter 是 magazine 专属新表达。\n // 2026-07-10 二轮返工(用户裁决「不同页型不能全白底」):满版-留白节奏\n // ——黑封面→红章节→白内容(黑横幅压顶)→黑结尾,黑红交替是杂志语法。\n runway: {\n archetypes: {\n cover: [\"fashion-masthead\"],\n chapter: [\"fashion-chapter\"],\n content: [\"banner-heading\", \"two-column\"],\n ending: [\"fashion-ending\"],\n },\n // motif 刻意不配(2026-07-10 全覆盖时曾加「时尚编辑标记」,两版均被\n // 用户裁难看后撤销):runway 的语言=满版色块+超大排印+留白,content\n // 页已有黑色大横幅,任何附加装饰都是画蛇添足——排印至上是终审裁决。\n },\n // journal(人文期刊,原 magazine 纯改名):全套继承,观感零变化。\n journal: {\n archetypes: {\n cover: [\"editorial-masthead\"],\n chapter: [\"masthead-chapter\"],\n content: [\"narrow-column\", \"two-column\"],\n ending: [\"masthead-ending\"],\n },\n motif: \"corner-ornament-motif\",\n },\n // avant(原 custom→gallery 二次返工,2026-07-10):白墙+正 IKB+炸橘的\n // 高色彩版式组合——gallery v1 撞色弱的根因是 tone-adaptive 家族本身低\n // 色彩,故版式整体换 IKB 斜切封面/巨号章节/横幅内容/大字结尾(banner\n // 横幅 baked 白字在 IKB #002FA7 上对比充足)。motif 留空(白墙不加装饰)。\n enterprise: {\n archetypes: {\n cover: [\"split-diagonal\"],\n chapter: [\"poster-chapter\"],\n content: [\"banner-heading\", \"two-column\"],\n ending: [\"banner-ending\"],\n },\n // 原 custom 存量语义(P2 Task 25):content 页背景图 + 卡片态时整页\n // 抑制页脚。存量 custom/gallery deck 经 legacy map 落到本主题,保留。\n chrome: { suppressFooterOnCardContent: true },\n // 2026-07-10 motif 全覆盖:IKB 方块秩序\n motif: \"enterprise-motif\",\n },\n // luxe(原 retail 黑金重定位,2026-07-10):零版式代码——全借 creative\n // 家族深底 poster 版式 + two-column 轮换 + split-diagonal(金斜切块封面,\n // readableOn 出深字)。**content 禁配 banner-heading**:其横幅文字是\n // baked 白字,香槟金横幅上白字不可读。motif 留空(验证可选性的先例保留)。\n luxe: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n chapter: [\"poster-chapter\"],\n content: [\"stacked-poster\", \"two-column\"],\n ending: [\"poster-ending\"],\n },\n // 2026-07-10 motif 全覆盖:烫金细线(原 P3「motif 可选」验证品,补齐)\n motif: \"luxe-motif\",\n },\n // campaign(活力营销,2026-07-13 memphis 拆分 A):零版式代码——深紫\n // 底多彩笔刷由专属 campaign-motif 承载,版式借 luxe 同款深底家族。\n // 品红横幅白字对比不足(~3.2:1)——content 禁配 banner-heading(luxe 先例)。\n campaign: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n chapter: [\"poster-chapter\"],\n content: [\"stacked-poster\", \"two-column\"],\n ending: [\"poster-ending\"],\n },\n motif: \"campaign-motif\",\n },\n // classroom(教学课堂,2026-07-13 第 13 主题):零版式代码——莫兰迪\n // 灰调+平滑斑块手绘点线由专属 classroom-motif 承载,版式借 academic\n // 的 rail 编号家族(圆徽章与参考图编号语言契合)。雾蓝横幅白字\n // ~2.9:1 不足——content 禁配 banner-heading(luxe 先例)。\n classroom: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n chapter: [\"rail-chapter\"],\n content: [\"rail-numbered\", \"two-column\"],\n ending: [\"rail-ending\"],\n },\n motif: \"classroom-motif\",\n },\n // bloom(柔美庆典,2026-07-13 memphis 拆分 B):零版式代码——奶白底\n // 水彩晕染+植物细线由专属 bloom-motif 承载,版式借 heritage 同款浅底\n // 家族(紫藤横幅白字 ~6:1 可配 banner-heading)。\n bloom: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n chapter: [\"poster-chapter\"],\n content: [\"banner-heading\", \"two-column\"],\n ending: [\"banner-ending\"],\n },\n motif: \"bloom-motif\",\n },\n // ink(水墨国风,2026-07-10 真创意子类②,用户点名例子):零版式代码——\n // 宣纸/墨/朱砂/楷体靠 tokens + 专属 ink-motif(古籍版框+朱砂印章+淡墨\n // 远山),content 用窄栏(文人排版)+two-column 轮换。\n ink: {\n archetypes: {\n cover: [\"poster-center\"],\n chapter: [\"poster-chapter\"],\n content: [\"narrow-column\", \"two-column\"],\n ending: [\"banner-ending\"],\n },\n motif: \"ink-motif\",\n // ink-motif 自带古籍版框线,MasterChrome 的页脚分隔线会形成双线\n // (2026-07-10 用户截图指出)——抑制分隔线,meta 文字照排。\n chrome: { suppressFooterRule: true },\n },\n // heritage(第 8 主题,2026-07-10):勃艮第×焦糖 putty,零版式代码——\n // 沿用原 retail v1 验证过的浅底混搭(creative cover/chapter + consulting\n // content/ending + two-column 轮换)。酒红横幅上 baked 白字对比充足。\n heritage: {\n archetypes: {\n cover: [\"poster-center\", \"split-diagonal\"],\n chapter: [\"poster-chapter\"],\n content: [\"banner-heading\", \"two-column\"],\n ending: [\"banner-ending\"],\n },\n // 2026-07-10 motif 全覆盖:典藏纹饰(徽记/角花/页缘线)\n motif: \"heritage-motif\",\n },\n}\n\nexport function getManifest(id: string): PersonalityManifest {\n return THEME_MANIFESTS[resolveThemeId(id)] ?? THEME_MANIFESTS.enterprise\n}\n","import type { PptxIR } from \"@/ir\"\n\n/**\n * djb2 哈希(与 blocks/chart-svg.tsx 的 stableHash 同算法,那处是文件私有\n * 未导出,此处按同样理由本地实现)。恒返回非负整数。\n */\nfunction stableHash(s: string): number {\n let h = 5381\n for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0\n return Math.abs(h)\n}\n\n/**\n * deck 级多样性种子:IR 内容的确定性哈希(spec §3.4)。不新增 IR 字段——\n * 预览/导出/重渲染天然一致,存量 deck 同样有稳定 seed。\n */\nexport function deckSeed(ir: PptxIR): number {\n const parts = [ir.filename ?? \"\", ...ir.slides.map((s) => s.heading ?? \"\")]\n return stableHash(parts.join(\"\\n\"))\n}\n\n/**\n * murmur3 定点终混(finalizer)。djb2 的低位是逐字符奇偶性的异或和,字符集\n * 不同的 salt 字符串可能巧合同奇偶(如 \"cover\" 与 \"motif\"),导致\n * `% 2` 时 salt 隔离失效——此步把高位也搅进低位,避免这类巧合碰撞。\n */\nfunction avalanche(h: number): number {\n h = Math.imul(h ^ (h >>> 16), 2246822507)\n h = Math.imul(h ^ (h >>> 13), 3266489909)\n h ^= h >>> 16\n return Math.abs(h)\n}\n\n/**\n * `deckSeed` 记忆化(原住 FullSlideSvg,2026-07-10 迁here——MasterChrome\n * 也要消费,住渲染组件里会循环 import):`ir` 对象引用在同一渲染批次内\n * 稳定,跨批次新 IR 对象天然失效,WeakMap 无需手动清理。\n */\nconst deckSeedCache = new WeakMap<PptxIR, number>()\nexport function cachedDeckSeed(ir: PptxIR): number {\n let seed = deckSeedCache.get(ir)\n if (seed === undefined) {\n seed = deckSeed(ir)\n deckSeedCache.set(ir, seed)\n }\n return seed\n}\n\n/** 在 manifest 允许集(白名单)内按 seed+salt 确定性取一项。 */\nexport function pickBySeed<T>(seed: number, salt: string, items: readonly T[]): T {\n if (items.length === 0) throw new Error(`pickBySeed: empty allowed set (salt=${salt})`)\n return items[avalanche(stableHash(`${seed}:${salt}`)) % items.length]\n}\n\n/**\n * 同 deck 内轮换选择(P3 Item ②,spec §3.4「相邻页轮换」):allowed 有 2+\n * 元素时,按该页在同类型页面里的序号 `ordinal` 在集合内轮转——base 起点由\n * (seed,salt) 决定(deck 级随机性),ordinal 提供页面级步进,故同一 deck 相邻\n * content 页拿到集合内相邻的不同 archetype(打破 deck 内雷同)。ordinal=0 与\n * pickBySeed 起点一致,deck 级基准不变。rhythm 不参与(rhythm 是 ops-kb 规划\n * 期字段,不在渲染 IR 里,与 seed 正交,见 spec §3.4)。\n */\nexport function pickBySeedRotating<T>(\n seed: number,\n salt: string,\n items: readonly T[],\n ordinal: number,\n): T {\n if (items.length === 0) throw new Error(`pickBySeedRotating: empty allowed set (salt=${salt})`)\n const base = avalanche(stableHash(`${seed}:${salt}`)) % items.length\n return items[(base + ordinal) % items.length]\n}\n","import type { PptxIR, Slide } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { CONF_LABEL } from \"../lib/conf-labels\"\nimport { getManifest } from \"../themes/manifest\"\nimport { cachedDeckSeed, pickBySeed } from \"./variety\"\n\n/**\n * Shared footer/logo chrome as an SVG fragment. Ported from MasterFrame so the\n * footer divider, confidentiality/org, version/date and brand logo are part of\n * the single-source svg (and thus exported). 页码已整体移除(2026-07-09 用户\n * 裁决「页码区块完全多此一举」):预览静态页码与导出的原生动态页码一并删。\n */\nexport function MasterChrome({\n ir,\n slide,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n ctx: BlockCtx\n}) {\n const { meta, brand, assets } = ir\n const conf = meta.confidentiality\n const org = meta.organization\n const version = meta.version\n const date = meta.date\n\n const logo = brand?.logo_asset_id ? assets.images[brand.logo_asset_id] : null\n const pos = brand?.position ?? \"br\"\n const logoBox =\n pos === \"tl\"\n ? { x: 64, y: 48 }\n : pos === \"tr\"\n ? { x: 1120, y: 48 }\n : pos === \"bl\"\n ? { x: 64, y: 630 }\n : { x: 1120, y: 630 }\n\n const muted = ctx.colors.muted\n const border = ctx.colors.border ?? ctx.colors.muted\n const font = ctx.fonts.body\n\n // 背景图 + 卡片态 content 页整页抑制页脚——是否生效由 manifest.chrome\n // 驱动(P2 Task 25:custom 主题的存量语义,其余五主题不设 = 默认 false)。\n const bgAsset =\n slide.background?.kind === \"asset\" ? assets.images[slide.background.asset_id] : null\n const chrome = getManifest(ir.theme.id).chrome\n const cardBgSuppressesFooter =\n Boolean(chrome?.suppressFooterOnCardContent) &&\n slide.type === \"content\" &&\n !!(bgAsset?.src && !bgAsset.error)\n\n // image_split 通栏页(2026-07-09 用户裁决图列垂直铺满):图占整列到页底,\n // 页脚分隔线与文字会压图——同 cardBgSuppressesFooter 先例整页抑制页脚\n // (org 已在该版式的 kicker 里,无信息损失)。\n const imageSplitBleed =\n slide.variant === \"image_split\" && slide.blocks.some((b) => b.type === \"image\")\n\n // image_bottom 通栏页(2026-07-09 用户裁决):底图铺满页缘,meta 信息\n // 改用遮罩浮层 footer(暗条白字压图),无 meta 则什么都不画。\n const imageBottomBleed =\n slide.variant === \"image_bottom\" && slide.blocks.some((b) => b.type === \"image\")\n\n const showFooter =\n slide.type === \"content\" && !cardBgSuppressesFooter && !imageSplitBleed && !imageBottomBleed\n const showOverlayFooter =\n slide.type === \"content\" && imageBottomBleed && Boolean(conf || org || version || date)\n\n return (\n <>\n {logo?.src && !logo.error ? (\n <image\n href={logo.src}\n x={logoBox.x}\n y={logoBox.y}\n width=\"96\"\n height=\"40\"\n preserveAspectRatio=\"xMidYMid meet\"\n />\n ) : null}\n\n {showFooter && (\n <>\n {/* 分隔线可被 manifest.chrome.suppressFooterRule 抑制(主题自带\n 版框线时避免双线,ink 先例,2026-07-10 用户裁决) */}\n {!chrome?.suppressFooterRule && (\n <line x1=\"56\" y1=\"664\" x2=\"1224\" y2=\"664\" stroke={border} strokeWidth=\"1.2\" />\n )}\n {/* meta 两端排布(2026-07-10 用户裁决:时间居中而右侧空很奇怪):\n org 组与 date 组各占一端,左右归属随 deck seed 交换(多样性——\n 固定位置会千篇一律) */}\n {(() => {\n const orgGroup = [conf ? CONF_LABEL[conf] : null, org].filter(Boolean).join(\" · \")\n const dateGroup = [version, date].filter(Boolean).join(\" · \")\n const swapped = pickBySeed(cachedDeckSeed(ir), \"footer-side\", [false, true])\n const leftText = swapped ? dateGroup : orgGroup\n const rightText = swapped ? orgGroup : dateGroup\n return (\n <>\n {leftText && (\n <text x=\"56\" y=\"700\" fontSize=\"20\" fill={muted} fontFamily={font} dominantBaseline=\"alphabetic\">\n {leftText}\n </text>\n )}\n {rightText && (\n <text\n x=\"1224\"\n y=\"700\"\n fontSize=\"20\"\n textAnchor=\"end\"\n fill={muted}\n fontFamily={font}\n dominantBaseline=\"alphabetic\"\n >\n {rightText}\n </text>\n )}\n </>\n )\n })()}\n </>\n )}\n\n {showOverlayFooter && (\n <>\n <rect x={0} y={680} width={1280} height={40} fill=\"#0A0E14\" fillOpacity={0.55} />\n {(conf || org) && (\n <text\n x=\"56\"\n y=\"705\"\n fontSize=\"18\"\n fill=\"#FFFFFF\"\n fillOpacity={0.92}\n fontFamily={font}\n dominantBaseline=\"alphabetic\"\n >\n {[conf ? CONF_LABEL[conf] : null, org].filter(Boolean).join(\" · \")}\n </text>\n )}\n {(version || date) && (\n <text\n x=\"1224\"\n y=\"705\"\n fontSize=\"18\"\n textAnchor=\"end\"\n fill=\"#FFFFFF\"\n fillOpacity={0.92}\n fontFamily={font}\n dominantBaseline=\"alphabetic\"\n >\n {[version, date].filter(Boolean).join(\" · \")}\n </text>\n )}\n </>\n )}\n </>\n )\n}\n","import type { PptxIR, Slide } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { CANVAS_W_PX, CANVAS_H_PX } from \"../constants\"\n\n/**\n * 受控装饰原语(图片排版 P4)。模型只有选择权(kind + intensity +\n * corner_tag 的 text),绘制全部在这里手写、按主题 token 着色——不存在\n * 「模型直出 SVG path」的通道。仅 slide.decor 显式声明时渲染,画在\n * Background 之上、Body 之下(不遮字),位置固定在角部/边缘。\n */\nconst W = CANVAS_W_PX\nconst H = CANVAS_H_PX\n\nfunction alpha(intensity: \"subtle\" | \"normal\" | undefined, subtle: number, normal: number): number {\n return (intensity ?? \"normal\") === \"subtle\" ? subtle : normal\n}\n\n/** 本页在全 deck 里的章节序(第 N 个 chapter;非 chapter 页取所在章节)。 */\nfunction chapterNumber(ir: PptxIR, index: number): number {\n let n = 0\n for (let i = 0; i <= index && i < ir.slides.length; i++) {\n if (ir.slides[i].type === \"chapter\") n++\n }\n return Math.max(1, n)\n}\n\nexport function SlideDecor({\n ir,\n slide,\n index,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n index: number\n ctx: BlockCtx\n}) {\n const decor = slide.decor\n if (!decor) return null\n const { colors, fonts } = ctx\n\n switch (decor.kind) {\n case \"big_number\": {\n // 章节大序号 + 细线(建筑 deck「01/04」形态):右下角超大编号\n const num = String(chapterNumber(ir, index)).padStart(2, \"0\")\n return (\n <g>\n <text\n x={W - 72}\n y={H - 92}\n textAnchor=\"end\"\n fontSize={140}\n fontWeight={700}\n fontFamily={fonts.heading}\n fill={colors.primary}\n fillOpacity={alpha(decor.intensity, 0.08, 0.14)}\n dominantBaseline=\"alphabetic\"\n >\n {num}\n </text>\n <rect\n x={W - 210}\n y={H - 78}\n width={138}\n height={2}\n fill={colors.accent}\n fillOpacity={alpha(decor.intensity, 0.5, 0.85)}\n />\n </g>\n )\n }\n case \"corner_tag\": {\n // 页角色块小标签(text 由模型给,如栏目名/kicker)\n const label = (decor.text ?? \"\").slice(0, 12)\n if (!label) return null\n const w = 24 + label.length * 15\n return (\n <g>\n <rect\n x={W - 96 - w}\n y={64}\n width={w}\n height={30}\n fill={colors.accent}\n fillOpacity={alpha(decor.intensity, 0.75, 1)}\n />\n <text\n x={W - 96 - w / 2}\n y={84}\n textAnchor=\"middle\"\n fontSize={14}\n fontWeight={600}\n fontFamily={fonts.body}\n fill={colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n </g>\n )\n }\n case \"rule_line\": {\n // booktabs 风格分隔线组:顶部粗+细双线\n const o = alpha(decor.intensity, 0.35, 0.7)\n return (\n <g>\n <rect x={96} y={56} width={W - 192} height={3} fill={colors.primary} fillOpacity={o} />\n <rect x={96} y={64} width={W - 192} height={1} fill={colors.border} fillOpacity={o} />\n </g>\n )\n }\n case \"quote_marks\": {\n // 大引号饰(家居 #9 引言页形态):左上巨型引号\n return (\n <text\n x={72}\n y={230}\n fontSize={220}\n fontFamily={fonts.heading}\n fill={colors.accent}\n fillOpacity={alpha(decor.intensity, 0.14, 0.24)}\n dominantBaseline=\"alphabetic\"\n >\n “\n </text>\n )\n }\n case \"geo_dots\": {\n // 几何点缀:右上角 4×4 圆点网格\n const o = alpha(decor.intensity, 0.18, 0.35)\n const dots = []\n for (let r = 0; r < 4; r++) {\n for (let c = 0; c < 4; c++) {\n dots.push(\n <circle\n key={`${r}-${c}`}\n cx={W - 150 + c * 22}\n cy={70 + r * 22}\n r={3}\n fill={colors.primary}\n fillOpacity={o}\n />,\n )\n }\n }\n return <g>{dots}</g>\n }\n default: {\n void (decor.kind satisfies never)\n return null\n }\n }\n}\n","import { Fragment } from \"react\"\nimport type { PptxIR, Slide } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { renderBlock } from \"./blocks\"\nimport { layoutContentFit, stackBottom } from \"./layout\"\nimport { CANVAS_W_PX, CANVAS_H_PX } from \"../constants\"\nimport { layoutSvgText, fitSvgLine } from \"../lib/svg-text-layout\"\n\n/**\n * 压图页与出血 split 页(图片排版 polish,2026-07-09 用户反馈驱动)。\n *\n * 模板文字色是各主题 baked 常量、无法反色,因此压图场景不走模板 Body,\n * 由这里的 bespoke 全页版式接管(MasterChrome/Decor 照常)——参考 ppt-master\n * 的压图页版式本就趋同:暗遮罩 + 白字大标题,主题个性保留在 accent 细节。\n */\nconst W = CANVAS_W_PX\nconst H = CANVAS_H_PX\n\n/** 暗 scrim:上浅下深三段(文字集中在中下部),图保持清晰可辨。 */\nfunction DarkScrim() {\n return (\n <>\n <rect x={0} y={0} width={W} height={H} fill=\"#0A0E14\" fillOpacity={0.3} />\n <rect x={0} y={Math.round(H * 0.55)} width={W} height={Math.round(H * 0.45)} fill=\"#0A0E14\" fillOpacity={0.28} />\n <rect x={0} y={Math.round(H * 0.78)} width={W} height={Math.round(H * 0.22)} fill=\"#0A0E14\" fillOpacity={0.3} />\n </>\n )\n}\n\n/**\n * cover/chapter 的 asset 背景页:清晰大图 + 暗遮罩 + 白字(左下构图)。\n */\nexport function ImageCoverPage({\n ir,\n slide,\n index,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n index: number\n ctx: BlockCtx\n}) {\n const accent = ctx.colors.accent\n const isChapter = slide.type === \"chapter\"\n const org = ir.meta.organization\n const date = ir.meta.date\n\n const title = layoutSvgText(slide.heading, {\n maxWidth: 1030,\n fontSize: isChapter ? 60 : 68,\n maxLines: 2,\n lineHeightRatio: 1.12,\n })\n const sub = layoutSvgText(slide.subheading, {\n maxWidth: 980,\n fontSize: 27,\n maxLines: 2,\n lineHeightRatio: 1.25,\n })\n // 左下构图:从底部往上倒推(页脚区 ~88px 留给 MasterChrome)\n const subH = sub.lines.length ? sub.lines.length * sub.lineHeight + 18 : 0\n const titleH = title.lines.length * title.lineHeight\n const baseY = H - 118 - subH\n const titleTopY = baseY - titleH + title.lineHeight - 10\n\n // chapter 大序号(第 N 个 chapter)\n let chapterNo = 0\n for (let i = 0; i <= index && i < ir.slides.length; i++) {\n if (ir.slides[i].type === \"chapter\") chapterNo++\n }\n\n return (\n <g>\n <DarkScrim />\n {isChapter && (\n <text\n x={96}\n y={titleTopY - titleH - 34}\n fontSize={30}\n fontWeight={700}\n fontFamily={ctx.fonts.heading}\n fill={accent}\n dominantBaseline=\"alphabetic\"\n >\n {String(Math.max(1, chapterNo)).padStart(2, \"0\")}\n </text>\n )}\n {org && (\n <text\n x={96}\n y={104}\n fontSize={21}\n fontFamily={ctx.fonts.body}\n fill=\"#FFFFFF\"\n fillOpacity={0.85}\n letterSpacing={2}\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={96}\n y={titleTopY + i * title.lineHeight}\n fontSize={title.fontSize}\n fontWeight={700}\n fontFamily={ctx.fonts.heading}\n fill=\"#FFFFFF\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n <rect x={96} y={baseY + 16} width={92} height={5} fill={accent} />\n {sub.lines.map((line, i) => (\n <text\n key={i}\n x={96}\n y={baseY + 52 + i * sub.lineHeight}\n fontSize={sub.fontSize}\n fontFamily={ctx.fonts.body}\n fill=\"#FFFFFF\"\n fillOpacity={0.88}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {!isChapter && date && (\n <text\n x={W - 96}\n y={104}\n textAnchor=\"end\"\n fontSize={19}\n fontFamily={ctx.fonts.body}\n fill=\"#FFFFFF\"\n fillOpacity={0.75}\n dominantBaseline=\"alphabetic\"\n >\n {date}\n </text>\n )}\n </g>\n )\n}\n\nconst SPLIT_IMG_W = 540\nconst SPLIT_TEXT_X = 620\nconst SPLIT_TEXT_W = W - SPLIT_TEXT_X - 96\n/** 图列垂直通栏(2026-07-09 用户裁决):MasterChrome 对 image_split 页\n * 已整页抑制页脚,无压图问题。 */\nconst SPLIT_IMG_H = H\n\n/**\n * image_split 出血版式:左列全高出血大图(页顶到页底、贴左缘,无框线),\n * 右栏 kicker + 大标题 + accent 短线 + 副题 + blocks 的排印层次。\n * 无 image 块时回落 null(调用方走模板正常路径)。\n */\nexport function ImageSplitPage({\n ir,\n slide,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n ctx: BlockCtx\n}) {\n const imageBlock = slide.blocks.find(\n (b): b is Extract<Slide[\"blocks\"][number], { type: \"image\" }> => b.type === \"image\",\n )\n if (!imageBlock) return null\n // 图文范式族(ppt-master P04 右图出血):image_side=right 时整页镜像——\n // 图列贴右缘、文字区在左。\n const rightSide = slide.image_side === \"right\"\n const imgX = rightSide ? W - SPLIT_IMG_W : 0\n const textX = rightSide ? 96 : SPLIT_TEXT_X\n const src = ctx.images?.[imageBlock.asset_id]?.src\n const rest = slide.blocks.filter((b) => b !== imageBlock)\n const org = ir.meta.organization\n\n // fontWeight 600 而非 700:magazine/creative 的衬线 heading(SimSun/Lora)\n // 被 700 合成加粗抹掉衬线特征——降字重提字号保气势\n const title = layoutSvgText(slide.heading, {\n maxWidth: SPLIT_TEXT_W,\n fontSize: 44,\n maxLines: 3,\n lineHeightRatio: 1.18,\n })\n const sub = layoutSvgText(slide.subheading, {\n maxWidth: SPLIT_TEXT_W,\n fontSize: 21,\n maxLines: 2,\n lineHeightRatio: 1.3,\n })\n let cursor = 128\n const kickerY = cursor\n cursor += 46\n const titleY = cursor + title.lineHeight - 12\n cursor += title.lines.length * title.lineHeight + 18\n const ruleY = cursor\n cursor += 30\n const subY = cursor + 6\n if (sub.lines.length) cursor += sub.lines.length * sub.lineHeight + 24\n const blocksTop = cursor + 8\n const blocksH = H - 96 - blocksTop\n const { placed, dropped } = layoutContentFit(\n \"single\",\n rest,\n { x: textX, y: blocksTop, w: SPLIT_TEXT_W, h: Math.max(120, blocksH) },\n ctx,\n )\n\n return (\n <g>\n {src ? (\n <image\n href={src}\n x={imgX}\n y={0}\n width={SPLIT_IMG_W}\n height={SPLIT_IMG_H}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <rect x={imgX} y={0} width={SPLIT_IMG_W} height={SPLIT_IMG_H} fill={ctx.colors.surface} />\n )}\n {imageBlock.caption &&\n (() => {\n const fitted = fitSvgLine(imageBlock.caption, {\n maxWidth: SPLIT_IMG_W - 48,\n fontSize: 15,\n minFontSize: 12,\n })\n return (\n <>\n <rect x={imgX} y={SPLIT_IMG_H - 44} width={SPLIT_IMG_W} height={44} fill=\"#0A0E14\" fillOpacity={0.62} />\n <text\n x={imgX + 24}\n y={SPLIT_IMG_H - 17}\n fontSize={fitted.fontSize}\n fontFamily={ctx.fonts.body}\n fill=\"#FFFFFF\"\n fillOpacity={0.92}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n </>\n )\n })()}\n {org && <rect x={textX} y={kickerY - 13} width={13} height={13} fill={ctx.colors.accent} />}\n {org && (\n <text\n x={textX + 24}\n y={kickerY}\n fontSize={17}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n letterSpacing={2}\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={textX}\n y={titleY + i * title.lineHeight}\n fontSize={title.fontSize}\n fontWeight={600}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n <rect x={textX} y={ruleY} width={72} height={4} fill={ctx.colors.accent} />\n {sub.lines.map((line, i) => (\n <text\n key={i}\n x={textX}\n y={subY + i * sub.lineHeight}\n fontSize={sub.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {dropped > 0 && (\n <text\n x={W - 96}\n y={H - 76}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </g>\n )\n}\n\nconst TOP_IMG_H = 356\nconst BAND_PAD_X = 96\n\n/**\n * image_top 顶图分栏(ppt-master P05):上半全幅出血图(贴顶三边)+\n * 图下细标题行 + 下方文字 blocks 自动分列(2-3 块横排,1 块单栏)。\n * 无 image 块回落 null(调用方走模板路径)。\n */\nexport function ImageTopPage({\n ir: _ir,\n slide,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n ctx: BlockCtx\n}) {\n const imageBlock = slide.blocks.find(\n (b): b is Extract<Slide[\"blocks\"][number], { type: \"image\" }> => b.type === \"image\",\n )\n if (!imageBlock) return null\n const src = ctx.images?.[imageBlock.asset_id]?.src\n const rest = slide.blocks.filter((b) => b !== imageBlock)\n\n const title = layoutSvgText(slide.heading, {\n maxWidth: W - BAND_PAD_X * 2 - 120,\n fontSize: 30,\n maxLines: 1,\n lineHeightRatio: 1.2,\n })\n const bandY = TOP_IMG_H + 52\n const blocksTop = bandY + 34\n const blocksH = H - 84 - blocksTop\n // 2-3 个文字块横向分列(P05 三栏),单块全宽\n const n = Math.max(1, Math.min(rest.length, 3))\n const colGap = 40\n const colW = (W - BAND_PAD_X * 2 - colGap * (n - 1)) / n\n const cols = rest.slice(0, 3).map((b, i) => {\n const rect = {\n x: BAND_PAD_X + i * (colW + colGap),\n y: blocksTop,\n w: colW,\n h: Math.max(100, blocksH),\n }\n const { placed } = layoutContentFit(\"single\", [b], rect, ctx)\n return placed\n })\n\n return (\n <g>\n {src ? (\n <image\n href={src}\n x={0}\n y={0}\n width={W}\n height={TOP_IMG_H}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <rect x={0} y={0} width={W} height={TOP_IMG_H} fill={ctx.colors.surface} />\n )}\n {/* 标题行:kicker 点 + 标题 + 贯穿细线(图眉/脚注的杂志结构) */}\n <rect x={BAND_PAD_X} y={bandY - 22} width={13} height={13} fill={ctx.colors.accent} />\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={BAND_PAD_X + 26}\n y={bandY - 10}\n fontSize={title.fontSize}\n fontWeight={600}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n <rect x={BAND_PAD_X} y={bandY + 2} width={W - BAND_PAD_X * 2} height={1} fill={ctx.colors.border} />\n {cols.map((placed, ci) => (\n <Fragment key={ci}>\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n </Fragment>\n ))}\n </g>\n )\n}\n\n// ── image_annotate 中心图 + 四角放射标注(ppt-master P09/P16)──\n// P16 证明矩形中心图即可成立,不依赖圆形 clipPath(导出链未验证 clipPath)。\nconst ANN_IMG_W = 470\nconst ANN_IMG_H = 300\nconst ANN_IMG_X = (W - ANN_IMG_W) / 2\nconst ANN_IMG_Y = 218\nconst ANN_FRAME_PAD = 10\n/** 左/右列标注文字的锚点 x(左列 anchor=end,右列 anchor=start)。 */\nconst ANN_LEFT_X = 330\nconst ANN_RIGHT_X = W - ANN_LEFT_X\nconst ANN_TEXT_W = 250\n\ntype AnnotationCorner = {\n anchor: \"start\" | \"end\"\n textX: number\n titleY: number\n /** 引线:文字端 → 图框端(图端画 accent 圆点)。 */\n line: { x1: number; y1: number; x2: number; y2: number }\n}\n\nconst ANN_CORNERS: AnnotationCorner[] = [\n {\n anchor: \"end\",\n textX: ANN_LEFT_X,\n titleY: 182,\n line: { x1: ANN_LEFT_X + 14, y1: 188, x2: ANN_IMG_X + 16, y2: ANN_IMG_Y + 46 },\n },\n {\n anchor: \"start\",\n textX: ANN_RIGHT_X,\n titleY: 182,\n line: { x1: ANN_RIGHT_X - 14, y1: 188, x2: ANN_IMG_X + ANN_IMG_W - 16, y2: ANN_IMG_Y + 46 },\n },\n {\n anchor: \"end\",\n textX: ANN_LEFT_X,\n titleY: 512,\n line: { x1: ANN_LEFT_X + 14, y1: 506, x2: ANN_IMG_X + 16, y2: ANN_IMG_Y + ANN_IMG_H - 46 },\n },\n {\n anchor: \"start\",\n textX: ANN_RIGHT_X,\n titleY: 512,\n line: { x1: ANN_RIGHT_X - 14, y1: 506, x2: ANN_IMG_X + ANN_IMG_W - 16, y2: ANN_IMG_Y + ANN_IMG_H - 46 },\n },\n]\n\n/** bullets 条目按「:/:」拆 标题+说明(无冒号时整条做标题换行)。 */\nfunction splitAnnotation(item: string): { title: string; desc: string } {\n const m = item.match(/^(.{1,18}?)[::]\\s*(.+)$/)\n if (m) return { title: m[1], desc: m[2] }\n return { title: item, desc: \"\" }\n}\n\n/**\n * image_annotate 中心图 + 四角放射标注:heading 居中在顶、白框中心图、\n * bullets 前 4 条按 tl/tr/bl/br 放射排布(粗标题+弱说明+细引线+accent 点)。\n * 无 image 块回落 null(调用方走模板路径)。\n */\nexport function ImageAnnotatePage({\n ir: _ir,\n slide,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n ctx: BlockCtx\n}) {\n const imageBlock = slide.blocks.find(\n (b): b is Extract<Slide[\"blocks\"][number], { type: \"image\" }> => b.type === \"image\",\n )\n if (!imageBlock) return null\n const src = ctx.images?.[imageBlock.asset_id]?.src\n const bulletsBlock = slide.blocks.find(\n (b): b is Extract<Slide[\"blocks\"][number], { type: \"bullets\" }> => b.type === \"bullets\",\n )\n const annotations = (bulletsBlock?.items ?? []).slice(0, 4).map(splitAnnotation)\n\n const title = layoutSvgText(slide.heading, {\n maxWidth: 900,\n fontSize: 32,\n maxLines: 1,\n lineHeightRatio: 1.2,\n })\n const sub = fitSvgLine(slide.subheading ?? \"\", {\n maxWidth: 860,\n fontSize: 17,\n minFontSize: 14,\n })\n\n return (\n <g>\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={W / 2}\n y={82 + i * title.lineHeight}\n textAnchor=\"middle\"\n fontSize={title.fontSize}\n fontWeight={600}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n <rect x={W / 2 - 28} y={98} width={56} height={3} fill={ctx.colors.accent} />\n {slide.subheading && (\n <text\n x={W / 2}\n y={132}\n textAnchor=\"middle\"\n fontSize={sub.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {sub.text}\n </text>\n )}\n {/* 白框照片卡(showcase 的 photo-print 质感,深浅主题通用) */}\n <rect\n x={ANN_IMG_X - ANN_FRAME_PAD}\n y={ANN_IMG_Y - ANN_FRAME_PAD}\n width={ANN_IMG_W + ANN_FRAME_PAD * 2}\n height={ANN_IMG_H + ANN_FRAME_PAD * 2}\n fill=\"#FFFFFF\"\n stroke={ctx.colors.border}\n strokeWidth={1}\n />\n {src ? (\n <image\n href={src}\n x={ANN_IMG_X}\n y={ANN_IMG_Y}\n width={ANN_IMG_W}\n height={ANN_IMG_H}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <rect x={ANN_IMG_X} y={ANN_IMG_Y} width={ANN_IMG_W} height={ANN_IMG_H} fill={ctx.colors.surface} />\n )}\n {imageBlock.caption && (\n <text\n x={W / 2}\n y={ANN_IMG_Y + ANN_IMG_H + ANN_FRAME_PAD + 30}\n textAnchor=\"middle\"\n fontSize={14}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {fitSvgLine(imageBlock.caption, { maxWidth: 620, fontSize: 14, minFontSize: 12 }).text}\n </text>\n )}\n {annotations.map((ann, i) => {\n const corner = ANN_CORNERS[i]\n const desc = ann.desc\n ? layoutSvgText(ann.desc, {\n maxWidth: ANN_TEXT_W,\n fontSize: 15,\n maxLines: 2,\n lineHeightRatio: 1.35,\n })\n : null\n const annTitle = layoutSvgText(ann.title, {\n maxWidth: ANN_TEXT_W,\n fontSize: 22,\n maxLines: desc ? 1 : 2,\n lineHeightRatio: 1.2,\n })\n return (\n <g key={i}>\n <line\n x1={corner.line.x1}\n y1={corner.line.y1}\n x2={corner.line.x2}\n y2={corner.line.y2}\n stroke={ctx.colors.border}\n strokeWidth={1.5}\n />\n <circle cx={corner.line.x2} cy={corner.line.y2} r={4} fill={ctx.colors.accent} />\n {annTitle.lines.map((line, li) => (\n <text\n key={li}\n x={corner.textX}\n y={corner.titleY + li * annTitle.lineHeight}\n textAnchor={corner.anchor}\n fontSize={annTitle.fontSize}\n fontWeight={700}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {desc?.lines.map((line, li) => (\n <text\n key={li}\n x={corner.textX}\n y={corner.titleY + annTitle.lines.length * annTitle.lineHeight + 6 + li * desc.lineHeight}\n textAnchor={corner.anchor}\n fontSize={desc.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </g>\n )\n })}\n </g>\n )\n}\n\n// 底图高自适应区间(2026-07-14 内容优先):短内容大图、长内容小图,\n// 正文实际底部之下才放图,绝不碰撞。\nconst MIN_BOTTOM_IMG = 240\nconst MAX_BOTTOM_IMG = 360\n\n/**\n * image_bottom 上文下图(ppt-master P15 对等对话):上半 heading/副题/\n * blocks 居中排布,下半全幅出血图(贴底三边)。\n */\nexport function ImageBottomPage({\n ir,\n slide,\n ctx,\n}: {\n ir: PptxIR\n slide: Slide\n ctx: BlockCtx\n}) {\n const imageBlock = slide.blocks.find(\n (b): b is Extract<Slide[\"blocks\"][number], { type: \"image\" }> => b.type === \"image\",\n )\n if (!imageBlock) return null\n const src = ctx.images?.[imageBlock.asset_id]?.src\n const rest = slide.blocks.filter((b) => b !== imageBlock)\n\n const title = layoutSvgText(slide.heading, {\n maxWidth: 900,\n fontSize: 44,\n maxLines: 2,\n lineHeightRatio: 1.15,\n })\n const sub = layoutSvgText(slide.subheading, {\n maxWidth: 860,\n fontSize: 21,\n maxLines: 2,\n lineHeightRatio: 1.3,\n })\n // 底图垂直通栏到页缘(2026-07-09 用户裁决:绝不拉伸,slice 裁剪出血)。\n // meta 页脚由 MasterChrome 以遮罩浮层压图渲染,caption 条相应上移让位。\n const meta = ir.meta\n const hasMetaFooter = Boolean(\n meta.confidentiality || meta.organization || meta.version || meta.date,\n )\n const captionBottom = hasMetaFooter ? H - 40 : H\n let cursor = 96\n const titleY = cursor + title.lineHeight - 10\n cursor += title.lines.length * title.lineHeight + 14\n const ruleY = cursor\n cursor += 26\n const subY = cursor + 4\n if (sub.lines.length) cursor += sub.lines.length * sub.lineHeight + 18\n const blocksTop = cursor + 6\n // 内容优先(2026-07-14 用户截图:固定底图高把正文区压太小、numbered\n // 内容溢进图片被裁):正文先排在「到最小底图上缘」的大区,图片起点落\n // 正文实际底部下方,图高 MIN_BOTTOM_IMG..MAX_BOTTOM_IMG 自适应——短内容\n // 大图、长内容小图,正文与图永不碰撞。\n const contentZoneBottom = H - MIN_BOTTOM_IMG - 20\n const { placed } = layoutContentFit(\n \"single\",\n rest,\n { x: 240, y: blocksTop, w: W - 480, h: Math.max(60, contentZoneBottom - blocksTop) },\n ctx,\n )\n const contentBottom = placed.length ? stackBottom(placed, ctx) : blocksTop\n const imgTop = Math.min(\n Math.max(contentBottom + 24, H - MAX_BOTTOM_IMG),\n H - MIN_BOTTOM_IMG,\n )\n const imgH = H - imgTop\n\n return (\n <g>\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={W / 2}\n y={titleY + i * title.lineHeight}\n textAnchor=\"middle\"\n fontSize={title.fontSize}\n fontWeight={600}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n <rect x={W / 2 - 42} y={ruleY} width={84} height={4} fill={ctx.colors.accent} />\n {sub.lines.map((line, i) => (\n <text\n key={i}\n x={W / 2}\n y={subY + i * sub.lineHeight}\n textAnchor=\"middle\"\n fontSize={sub.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {src ? (\n <image\n href={src}\n x={0}\n y={imgTop}\n width={W}\n height={imgH}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <rect x={0} y={imgTop} width={W} height={imgH} fill={ctx.colors.surface} />\n )}\n {imageBlock.caption &&\n (() => {\n const fitted = fitSvgLine(imageBlock.caption, {\n maxWidth: W - 240,\n fontSize: 15,\n minFontSize: 12,\n })\n return (\n <>\n <rect x={0} y={captionBottom - 40} width={W} height={40} fill=\"#0A0E14\" fillOpacity={0.55} />\n <text\n x={W / 2}\n y={captionBottom - 15}\n textAnchor=\"middle\"\n fontSize={fitted.fontSize}\n fontFamily={ctx.fonts.body}\n fill=\"#FFFFFF\"\n fillOpacity={0.92}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n </>\n )\n })()}\n </g>\n )\n}\n","export interface SvgTextLayoutOptions {\n maxWidth: number\n fontSize: number\n maxLines?: number\n lineHeightRatio?: number\n /**\n * Widow avoidance (opt-in, heading call sites via `fitHeadingLines`): after\n * the greedy wrap, if the last line is much shorter than the widest one\n * (「年度战略回」+「顾」), re-wrap at the balanced per-line budget so the same\n * line count splits evenly. Off by default so body/subtitle layouts keep\n * their established greedy geometry.\n */\n balanceLines?: boolean\n}\n\nexport interface SvgTextLayout {\n lines: string[]\n fontSize: number\n lineHeight: number\n}\n\n// S3c fix. User-reported bug: a bento callout with a long em-dash-separated\n// sentence wrapped its line one character too wide, so the real glyphs then\n// overran the box and clipped the trailing \"60%\". CJK fonts render the em\n// dash and the curly-quote block at full ideographic width, same as the\n// ideographs, ideographic punctuation, and fullwidth forms this class\n// already covered. Two sub-ranges, though, sat outside the two ranges below\n// and used to fall through to the 0.46 \"other\" weight, underestimating their\n// rendered width by more than half:\n// - U+2014 (EM DASH): doubled up, it is the idiomatic CJK long-dash mark.\n// That underestimate is exactly what let `wrapWithUnits` accept one more\n// character per line than actually fits.\n// - U+2018 through U+201F: the quotation-mark sub-block of General\n// Punctuation (left/right single and double quotes, plus the low-9 and\n// reversed-9 variants).\n//\n// Ideographic punctuation (U+3000 through U+303F: the ideographic comma,\n// full stop, corner brackets, book-title marks, etc.) and fullwidth forms\n// (U+FF00 through U+FFEF: fullwidth colon, percent sign, Latin letters,\n// etc.) were already covered: the first range below spans 0x2E80-0x9FFF, a\n// superset of 0x3000-0x303F, and the second range below is 0xFF00-0xFFEF\n// itself. So only the two sub-ranges named above needed adding; nothing here\n// duplicates coverage the class already had.\n//\n// Half-width ASCII punctuation (period, comma, colon, parens, the ASCII\n// hyphen, etc.) intentionally stays in the \"other\" 0.46 bucket below: it\n// really does render narrower than a CJK glyph.\nconst WIDE_CHAR_RE = /[\\u2014\\u2018-\\u201f\\u2e80-\\u9fff\\uff00-\\uffef]/\n\nexport function measureTextUnits(text: string): number {\n return Array.from(text).reduce((sum, char) => {\n if (/\\s/.test(char)) return sum + 0.35\n if (WIDE_CHAR_RE.test(char)) return sum + 1\n if (/[A-Z]/.test(char)) return sum + 0.66\n if (/[a-z0-9]/.test(char)) return sum + 0.56\n return sum + 0.46\n }, 0)\n}\n\nfunction splitLongToken(token: string, maxUnits: number): string[] {\n const chunks: string[] = []\n let current = \"\"\n\n for (const char of Array.from(token)) {\n const candidate = `${current}${char}`\n if (current && measureTextUnits(candidate) > maxUnits) {\n chunks.push(current)\n current = char\n } else {\n current = candidate\n }\n }\n\n if (current) chunks.push(current)\n return chunks\n}\n\nfunction tokenize(text: string): { tokens: string[]; spaceDelimited: boolean } {\n const normalized = text.trim().replace(/\\s+/g, \" \")\n if (!normalized) return { tokens: [], spaceDelimited: false }\n const spaceDelimited = normalized.includes(\" \")\n return {\n tokens: spaceDelimited ? normalized.split(\" \") : Array.from(normalized),\n spaceDelimited,\n }\n}\n\nfunction wrapWithUnits(text: string, maxUnits: number): string[] {\n const lines: string[] = []\n\n for (const paragraph of text.split(/\\n+/)) {\n const { tokens, spaceDelimited } = tokenize(paragraph)\n let current = \"\"\n\n for (const token of tokens) {\n const tokenChunks =\n measureTextUnits(token) > maxUnits\n ? splitLongToken(token, maxUnits)\n : [token]\n\n for (const [chunkIndex, chunk] of tokenChunks.entries()) {\n const prefix = current && spaceDelimited && chunkIndex === 0 ? \" \" : \"\"\n const candidate = `${current}${prefix}${chunk}`\n if (current && measureTextUnits(candidate) > maxUnits) {\n lines.push(current)\n current = chunk\n } else {\n current = candidate\n }\n }\n }\n\n if (current) lines.push(current)\n }\n\n return lines\n}\n\n/**\n * Re-wrap `content` so its lines split evenly instead of greedy-filling, when\n * the greedy result ends in a widow (last line < half the widest line).\n *\n * The balanced budget starts at `max(total/N, longest token)` — flooring at\n * the longest whitespace-delimited token guarantees `splitLongToken` never\n * fires, so balancing can shorten lines but never split a word mid-way (for\n * CJK the \"tokens\" are single chars, so the floor is a no-op). The budget\n * steps up ×1.06 until the re-wrap stops exceeding the original line count;\n * if 8 steps can't get there, the greedy result stands. Explicit newlines are\n * the author's own breaks — those layouts are returned untouched.\n */\nfunction balanceWrappedLines(content: string, lines: string[]): string[] {\n if (lines.length < 2 || content.includes(\"\\n\")) return lines\n const units = lines.map(measureTextUnits)\n const widest = Math.max(...units)\n if (units[units.length - 1] >= widest * 0.5) return lines\n const total = units.reduce((sum, u) => sum + u, 0)\n // Token floor must mirror `tokenize`: space-delimited text wraps by words,\n // so flooring at the longest word keeps `splitLongToken` from ever firing;\n // unspaced (CJK) text wraps per character, so no floor is needed — flooring\n // at the whole string there would collapse the wrap to one oversized line.\n const { tokens } = tokenize(content)\n const longestToken = Math.max(...tokens.map(measureTextUnits), 0)\n let target = Math.max(total / lines.length, longestToken)\n for (let i = 0; i < 8; i += 1) {\n const candidate = wrapWithUnits(content, target)\n // Same line count, evenly split — that's the goal. Fewer lines means the\n // token floor out-widened the greedy budget (giant word): keep greedy.\n if (candidate.length === lines.length) return candidate\n if (candidate.length < lines.length) return lines\n target *= 1.06\n }\n return lines\n}\n\nexport function truncateToUnits(text: string, maxUnits: number): string {\n if (measureTextUnits(text) <= maxUnits) return text\n const budget = maxUnits - 1 // 预留省略号\n let out = \"\"\n for (const ch of Array.from(text)) {\n if (measureTextUnits(out + ch) > budget) break\n out += ch\n }\n if (out === \"\") {\n return measureTextUnits(\"…\") > maxUnits ? \"\" : \"…\"\n }\n return `${out}…`\n}\n\nexport function fitSvgLine(\n text: string,\n opts: { maxWidth: number; fontSize: number; minFontSize?: number; letterSpacing?: number },\n): { text: string; fontSize: number } {\n const minFontSize = opts.minFontSize ?? 12\n // `letterSpacing` is an SVG attribute in absolute px, independent of\n // font-size — unlike `measureTextUnits`' per-character weights, it doesn't\n // scale down when the line shrinks to fit. A caller that renders this\n // line with `letterSpacing` (kicker/section labels across every theme do)\n // adds (charCount - 1) * letterSpacing extra px that this estimator was\n // previously blind to — real getBBox measurement on long CJK section\n // labels showed exactly this drift (real bbox ~80-220px wider than the\n // declared maxWidth). Budget it out of maxWidth up front so the fitted\n // font-size/truncation account for it.\n const letterSpacing = opts.letterSpacing ?? 0\n const units = measureTextUnits(text)\n if (units <= 0) return { text, fontSize: opts.fontSize }\n const charCount = Array.from(text).length\n const spacingBudget = Math.max(0, charCount - 1) * letterSpacing\n const availableWidth = Math.max(0, opts.maxWidth - spacingBudget)\n const fitted = Math.min(opts.fontSize, Math.floor(availableWidth / units))\n if (fitted >= minFontSize) return { text, fontSize: fitted }\n return {\n text: truncateToUnits(text, availableWidth / minFontSize),\n fontSize: minFontSize,\n }\n}\n\nexport function layoutSvgText(\n text: string | undefined,\n options: SvgTextLayoutOptions\n): SvgTextLayout {\n const content = text?.trim() ?? \"\"\n const maxLines = options.maxLines ?? 2\n const lineHeightRatio = options.lineHeightRatio ?? 1.08\n\n if (!content) {\n return { lines: [], fontSize: options.fontSize, lineHeight: 0 }\n }\n\n const baseUnits = options.maxWidth / options.fontSize\n let maxUnits = baseUnits\n let lines = wrapWithUnits(content, maxUnits)\n\n for (let i = 0; lines.length > maxLines && i < 8; i += 1) {\n maxUnits *= 1.14\n lines = wrapWithUnits(content, maxUnits)\n }\n\n if (lines.length > maxLines) {\n lines = [\n ...lines.slice(0, maxLines - 1),\n lines.slice(maxLines - 1).join(\"\"),\n ]\n }\n\n // After the merge fallback a too-long text's last line is long, not a\n // widow, so balancing naturally skips it — only genuine widows re-wrap.\n if (options.balanceLines) {\n lines = balanceWrappedLines(content, lines)\n }\n\n const longest = Math.max(...lines.map(measureTextUnits), 1)\n const fittedFontSize = Math.min(\n options.fontSize,\n Math.floor(options.maxWidth / longest)\n )\n const fontSize = Math.max(1, fittedFontSize)\n\n return {\n lines,\n fontSize,\n lineHeight: Math.round(fontSize * lineHeightRatio),\n }\n}\n","import React from \"react\"\nimport { fitSvgLine, truncateToUnits } from \"../lib/svg-text-layout\"\n\n/** One run of text with its emphasis state, in source (unmarked) text order. */\nexport interface EmphasisSegment {\n text: string\n emphasized: boolean\n}\n\n/** `**bold**` markdown subset — non-greedy so adjacent pairs don't merge. */\nconst EMPHASIS_RE = /\\*\\*(.+?)\\*\\*/g\n\n/**\n * Splits `text` on a `**bold**` markdown subset into ordered segments whose\n * concatenated `.text` reconstructs the original text with the `**` markers\n * removed (see `stripEmphasis`, which relies on exactly this).\n *\n * Nesting isn't supported — the regex matches left to right, so\n * `\"**a **b** c**\"` treats the first `**` it can close as one emphasized run,\n * not a nested one. An unclosed `**` (no matching close) never matches, so it\n * falls through untouched as literal text; the same is true of an empty pair\n * (`\"****\"`) since `(.+?)` requires at least one character between markers.\n */\nexport function parseEmphasis(text: string): EmphasisSegment[] {\n const segments: EmphasisSegment[] = []\n let lastIndex = 0\n for (const match of text.matchAll(EMPHASIS_RE)) {\n const index = match.index ?? 0\n if (index > lastIndex) {\n segments.push({ text: text.slice(lastIndex, index), emphasized: false })\n }\n segments.push({ text: match[1], emphasized: true })\n lastIndex = index + match[0].length\n }\n if (lastIndex < text.length) {\n segments.push({ text: text.slice(lastIndex), emphasized: false })\n }\n return segments\n}\n\n/** Strips `**` markers, returning plain text — the fit chain's (measure/wrap/truncate) input. */\nexport function stripEmphasis(text: string): string {\n return parseEmphasis(text)\n .map((s) => s.text)\n .join(\"\")\n}\n\n/**\n * Renders segments as SVG `tspan`s: plain runs get `fill={baseFill}`,\n * emphasized runs get `fill={accent} fontWeight={opts.fontWeight ?? \"600\"}`.\n * When there's a single non-emphasized segment (the common case — no `**` in\n * the source text) this returns the bare string instead of wrapping it in a\n * `tspan`, so unmarked text renders byte-identical to before this primitive\n * existed.\n *\n * `fontWeight` defaults to `\"600\"` — the weight paragraph/bullets/callout\n * have always used — so those three existing callers are unaffected by\n * passing no `fontWeight` at all. Pass an explicit value (e.g. `\"700\"`) for a\n * caller whose own base weight is heavier than 600 and wants its emphasized\n * runs to stand out a full step above that (verdict_banner; template\n * subheadings).\n */\nexport function renderEmphasisTspans(\n segments: EmphasisSegment[],\n opts: { accent: string; baseFill: string; fontWeight?: string },\n): React.ReactNode {\n if (segments.length === 0) return \"\"\n if (segments.length === 1 && !segments[0].emphasized) {\n return segments[0].text\n }\n return segments.map((seg, i) =>\n seg.emphasized\n ? React.createElement(\"tspan\", { key: i, fill: opts.accent, fontWeight: opts.fontWeight ?? \"600\" }, seg.text)\n : React.createElement(\"tspan\", { key: i, fill: opts.baseFill }, seg.text),\n )\n}\n\ninterface EmphasisChar {\n char: string\n emphasized: boolean\n}\n\nfunction flattenSegments(segments: EmphasisSegment[]): EmphasisChar[] {\n const chars: EmphasisChar[] = []\n for (const seg of segments) {\n for (const char of Array.from(seg.text)) {\n chars.push({ char, emphasized: seg.emphasized })\n }\n }\n return chars\n}\n\nfunction collapseChars(chars: EmphasisChar[]): EmphasisSegment[] {\n const segments: EmphasisSegment[] = []\n for (const c of chars) {\n const last = segments[segments.length - 1]\n if (last && last.emphasized === c.emphasized) {\n last.text += c.char\n } else {\n segments.push({ text: c.char, emphasized: c.emphasized })\n }\n }\n return segments\n}\n\n/**\n * Re-attaches emphasis flags from `segments` (parsed from the original\n * `**marked**` source, whose concatenated text is the plain string the fit\n * chain — `layoutSvgText` — wrapped into `lines`) onto each already-wrapped\n * line.\n *\n * `lines` must be a gap-free partition of `segments`' concatenated text (i.e.\n * the direct, not-yet-truncated output of the wrap step) — every source\n * character has to show up in some line, just possibly with whitespace\n * trimmed/collapsed at trim or line-break boundaries. If a line was already\n * cut short by `truncateToUnits` (its tail replaced with `…`), the source\n * characters that got discarded are simply missing from `lines` with no\n * trace of how many there were, so later lines would desync against a\n * cursor stuck mid-discard. Call this on the pre-truncation lines and use\n * `truncateEmphasisSegments` afterward to reproduce per-line truncation.\n *\n * Implementation: walks the flattened source characters and each line's\n * characters in lockstep; a source character not present at the cursor is\n * only skipped if it's whitespace (the collapsed/dropped case). A run split\n * across a line break continues its emphasis on both resulting lines.\n */\nexport function sliceEmphasisForLines(segments: EmphasisSegment[], lines: string[]): EmphasisSegment[][] {\n const chars = flattenSegments(segments)\n let cursor = 0\n return lines.map((line) => {\n const lineChars: EmphasisChar[] = []\n let lastEmphasized = false\n for (const ch of Array.from(line)) {\n while (cursor < chars.length && chars[cursor].char !== ch && /\\s/.test(chars[cursor].char)) {\n cursor += 1\n }\n if (cursor < chars.length && chars[cursor].char === ch) {\n lastEmphasized = chars[cursor].emphasized\n lineChars.push({ char: ch, emphasized: lastEmphasized })\n cursor += 1\n } else {\n // Not found verbatim at the cursor — carry forward whatever emphasis\n // was last matched (covers a caller passing an already-truncated\n // line's trailing \"…\", though `truncateEmphasisSegments` is the\n // correct way to produce per-line truncation).\n lineChars.push({ char: ch, emphasized: lastEmphasized })\n }\n }\n return collapseChars(lineChars)\n })\n}\n\n/**\n * Truncates one line's segment table to `maxUnits`, mirroring\n * `truncateToUnits`'s budget/ellipsis behavior exactly (it's used\n * internally to decide *whether* and *where* to cut) but keeping each kept\n * character's emphasis flag, and giving the appended `…` the emphasis of\n * the last character kept before it — so truncation landing inside an\n * emphasized run stays emphasized through the `…`.\n *\n * Safe to call per-line, independently, on the output of\n * `sliceEmphasisForLines` — unlike truncating the line text first and then\n * slicing, this never desyncs later lines because it only ever looks at\n * this one line's own (gap-free) segment table.\n */\nexport function truncateEmphasisSegments(segments: EmphasisSegment[], maxUnits: number): EmphasisSegment[] {\n const text = segments.map((s) => s.text).join(\"\")\n const truncated = truncateToUnits(text, maxUnits)\n if (truncated === text) return segments\n\n const hasEllipsis = truncated.endsWith(\"…\")\n const keptLen = Array.from(truncated).length - (hasEllipsis ? 1 : 0)\n const chars = flattenSegments(segments)\n const kept = chars.slice(0, keptLen)\n const result = collapseChars(kept)\n\n if (hasEllipsis) {\n const lastEmphasized = kept.length > 0 ? kept[kept.length - 1].emphasized : false\n const last = result[result.length - 1]\n if (last && last.emphasized === lastEmphasized) {\n last.text += \"…\"\n } else {\n result.push({ text: \"…\", emphasized: lastEmphasized })\n }\n }\n return result\n}\n\n/**\n * Single-line counterpart to the `sliceEmphasisForLines` + `truncateEmphasisSegments`\n * pair above: fits `text`'s plain (emphasis-stripped) form via `fitSvgLine`\n * (shrink-then-truncate, never wrap — unlike `layoutSvgText`'s multi-line fit\n * chain, so there is no per-line slicing step here) and re-attaches emphasis\n * flags onto the result, including on the truncation ellipsis if the line had\n * to be cut.\n *\n * The truncation budget passed to `truncateEmphasisSegments` (`maxWidth /\n * minFontSize`) mirrors `fitSvgLine`'s own internal truncate-branch budget\n * exactly for the no-`letterSpacing` case this helper is scoped to (every\n * current caller is a plain accent sentence, not a letter-spaced label) —\n * `fitSvgLine` only reaches its truncate branch when the natural fit would\n * drop below `minFontSize`, which is precisely when the plain text's measured\n * units exceed this same budget, so `truncateEmphasisSegments` no-ops\n * (returns `segments` unchanged) in exactly the cases `fitSvgLine` leaves\n * `text` unchanged, and cuts at the same point otherwise.\n *\n * Returns `null` for empty/whitespace-only text, mirroring the\n * `slide.xxx ? fitSvgLine(...) : null` guard every other single-line caller\n * in this codebase already uses.\n */\nexport function fitEmphasisLine(\n text: string | undefined,\n opts: { maxWidth: number; fontSize: number; minFontSize?: number },\n): { fontSize: number; segments: EmphasisSegment[] } | null {\n if (!text || !text.trim()) return null\n const minFontSize = opts.minFontSize ?? 12\n const fitted = fitSvgLine(stripEmphasis(text), {\n maxWidth: opts.maxWidth,\n fontSize: opts.fontSize,\n minFontSize,\n })\n const maxUnits = opts.maxWidth / minFontSize\n const segments = truncateEmphasisSegments(parseEmphasis(text), maxUnits)\n return { fontSize: fitted.fontSize, segments }\n}\n","import type { Block } from \"@/ir\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { parseEmphasis, renderEmphasisTspans, sliceEmphasisForLines, stripEmphasis } from \"../emphasis\"\nimport type { SvgBlock } from \"./types\"\n\ntype ParagraphBlock = Extract<Block, { type: \"paragraph\" }>\n\nconst FONT_SIZE = 20\nconst LINE_RATIO = 1.4\n\nfunction lay(text: string, w: number) {\n return layoutSvgText(stripEmphasis(text), {\n maxWidth: w,\n fontSize: FONT_SIZE,\n maxLines: 99, // wrap freely; never shrink/truncate a body paragraph\n lineHeightRatio: LINE_RATIO,\n })\n}\n\nexport const paragraph: SvgBlock<ParagraphBlock> = {\n measure(block, w) {\n const l = lay(block.text, w)\n return l.lines.length * l.lineHeight\n },\n render(block, box, ctx) {\n const l = lay(block.text, box.w)\n const lineSegments = sliceEmphasisForLines(parseEmphasis(block.text), l.lines)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {lineSegments.map((segments, i) => (\n <text\n key={i}\n x=\"0\"\n y={i * l.lineHeight + l.fontSize}\n fontFamily={ctx.fonts.body}\n fontSize={l.fontSize}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(segments, { accent: ctx.colors.accent, baseFill: ctx.colors.text })}\n </text>\n ))}\n </g>\n )\n },\n}\n","import { Fragment } from \"react\"\nimport type { Block } from \"@/ir\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport {\n parseEmphasis,\n renderEmphasisTspans,\n sliceEmphasisForLines,\n stripEmphasis,\n truncateEmphasisSegments,\n type EmphasisSegment,\n} from \"../emphasis\"\nimport type { SvgBlock } from \"./types\"\n\ntype BulletsBlock = Extract<Block, { type: \"bullets\" }>\n\nconst FONT_SIZE = 20\nconst MIN_FONT = 14\nconst ITEM_GAP = 8\nconst TEXT_INDENT = 26\n\ninterface LaidItem {\n lines: string[]\n lineSegments: EmphasisSegment[][]\n firstLineY: number\n}\n\n/** Non-emphasized prefix prepended ahead of an item's (stripped) text. */\nfunction itemPrefix(style: NonNullable<BulletsBlock[\"style\"]>, index: number): string {\n if (style === \"numbered\") return `${index + 1}. `\n if (style === \"checklist\") return \"☐ \"\n return \"\"\n}\n\ninterface ItemsLayout {\n items: LaidItem[]\n fontSize: number\n lineHeight: number\n height: number\n /** divided 样式的项间分隔线 y(严格位于上一项文字底与下一项文字顶的中点)。 */\n dividers: number[]\n}\n\n/**\n * Wraps every bullet item to at most 2 lines within `w`, then unifies all items\n * onto a single fitted font size (floored at `MIN_FONT`) so items don't render\n * with visually inconsistent sizes. Any line still too wide at the clamped\n * size is truncated with an ellipsis. `measure` and `render` both call this so\n * the reported height always matches what's actually drawn.\n */\nfunction layoutItems(block: BulletsBlock, w: number): ItemsLayout {\n const style = block.style ?? \"plain\"\n const indent = style === \"default\" ? TEXT_INDENT : 0\n const maxWidth = Math.max(60, w - indent)\n const prefixes = block.items.map((_, i) => itemPrefix(style, i))\n const texts = block.items.map((item, i) => `${prefixes[i]}${stripEmphasis(item)}`)\n const layouts = texts.map((t) => layoutSvgText(t, { maxWidth, fontSize: FONT_SIZE, maxLines: 2 }))\n const fontSize = Math.max(MIN_FONT, Math.min(...layouts.map((l) => l.fontSize), FONT_SIZE))\n const lineHeight = Math.round(fontSize * 1.4)\n\n // Re-layout once at the unified font size so every item shares the same size.\n const relaid = texts.map((t) => layoutSvgText(t, { maxWidth, fontSize, maxLines: 2 }))\n const maxUnits = maxWidth / fontSize\n\n let y = Math.round(fontSize * 1.1)\n const dividers: number[] = []\n const items: LaidItem[] = relaid.map((l, i) => {\n // The prefix (numbering/checklist marker) is never emphasized; only the\n // original item text can carry `**marks**`.\n const segments: EmphasisSegment[] = prefixes[i]\n ? [{ text: prefixes[i], emphasized: false }, ...parseEmphasis(block.items[i])]\n : parseEmphasis(block.items[i])\n // Map emphasis onto the pre-truncation wrapped lines (a gap-free\n // partition of `segments`) before truncating, so truncating one line\n // can't desync the emphasis cursor for a later line.\n const wrappedLineSegments = sliceEmphasisForLines(segments, l.lines)\n // At the clamped floor, layoutSvgText's own shrink may not have been able\n // to bring the longest line under maxWidth. Truncate any such line.\n const lineSegments = wrappedLineSegments.map((segs) => truncateEmphasisSegments(segs, maxUnits))\n const lines = lineSegments.map((segs) => segs.map((s) => s.text).join(\"\"))\n const item: LaidItem = { lines, lineSegments, firstLineY: y }\n // divided 需要更大项间距容纳分隔线(设计感留白);分隔线 y 取上一项\n // 文字底(末行 baseline+descent≈0.2em)与下一项文字顶(首行\n // baseline-ascent≈0.8em)的几何中点——贴边不居中是 v1 被用户裁\n // 「粗糙」的原因(2026-07-10)。\n const gapAfter = style === \"divided\" ? Math.round(fontSize * 1.9) : ITEM_GAP\n const lastBaseline = y + (lines.length - 1) * lineHeight\n y += lines.length * lineHeight + gapAfter\n if (style === \"divided\" && i < relaid.length - 1) {\n const textBottom = lastBaseline + fontSize * 0.2\n const nextTextTop = y - fontSize * 0.8\n dividers.push(Math.round((textBottom + nextTextTop) / 2))\n }\n return item\n })\n\n return { items, fontSize, lineHeight, height: y - (style === \"divided\" ? Math.round(fontSize * 1.9) : ITEM_GAP), dividers }\n}\n\nexport const bullets: SvgBlock<BulletsBlock> = {\n measure(block, w) {\n return layoutItems(block, w).height\n },\n render(block, box, ctx) {\n const style = block.style ?? \"plain\"\n const { items, fontSize, lineHeight, dividers } = layoutItems(block, box.w)\n const indent = style === \"default\" ? TEXT_INDENT : 0\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {items.map((item, i) => (\n <Fragment key={i}>\n {style === \"default\" && (\n <circle cx={5} cy={item.firstLineY - fontSize * 0.3} r={3} fill={ctx.colors.primary} />\n )}\n {style === \"divided\" && i < items.length - 1 && (\n <line\n x1={0}\n y1={dividers[i]}\n x2={box.w}\n y2={dividers[i]}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth={1}\n />\n )}\n {item.lineSegments.map((segments, li) => (\n <text\n key={li}\n x={indent}\n y={item.firstLineY + li * lineHeight}\n fontFamily={ctx.fonts.body}\n fontSize={fontSize}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(segments, { accent: ctx.colors.accent, baseFill: ctx.colors.text })}\n </text>\n ))}\n </Fragment>\n ))}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype QuoteBlock = Extract<Block, { type: \"quote\" }>\n\n/** Height of the decorative open-quote region (character baseline at 44, plus gap). */\nconst QUOTE_ZONE = 60\nconst BODY_FONT_SIZE = 26\nconst BODY_LINE_RATIO = 1.35\nconst BODY_INDENT = 20\nconst ATTR_FONT_SIZE = 20\nconst ATTR_MIN_FONT_SIZE = 13\nconst ATTR_GAP = 8\nconst BOTTOM_PAD = 12\n\nfunction layBody(text: string, w: number) {\n return layoutSvgText(text, {\n maxWidth: w - BODY_INDENT * 2,\n fontSize: BODY_FONT_SIZE,\n maxLines: 99,\n lineHeightRatio: BODY_LINE_RATIO,\n })\n}\n\nexport const quote: SvgBlock<QuoteBlock> = {\n measure(block, w, _ctx) {\n const l = layBody(block.text, w)\n const bodyHeight = l.lines.length * l.lineHeight\n const attrHeight = block.attribution ? l.lineHeight + ATTR_GAP : 0\n return QUOTE_ZONE + bodyHeight + attrHeight + BOTTOM_PAD\n },\n\n render(block, box, ctx) {\n const l = layBody(block.text, box.w)\n\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {/* decorative open-quote mark */}\n <text\n x={0}\n y={44}\n fontSize={64}\n fill={ctx.colors.accent}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {\"“\"}\n </text>\n\n {/* body lines (italic) */}\n {l.lines.map((line, i) => (\n <text\n key={i}\n x={BODY_INDENT}\n y={QUOTE_ZONE + i * l.lineHeight + l.fontSize}\n fontFamily={ctx.fonts.body}\n fontSize={l.fontSize}\n fontStyle=\"italic\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* attribution: single line, shrunk/truncated to the box width — a\n narrow theme column (e.g. magazine's 880 content column)\n can't fit an unbounded \"— {attribution}\" at fixed size. */}\n {block.attribution && (() => {\n const attr = fitSvgLine(`— ${block.attribution}`, {\n maxWidth: box.w - BODY_INDENT * 2,\n fontSize: ATTR_FONT_SIZE,\n minFontSize: ATTR_MIN_FONT_SIZE,\n })\n return (\n <text\n x={BODY_INDENT}\n y={QUOTE_ZONE + l.lines.length * l.lineHeight + ATTR_GAP + ATTR_FONT_SIZE}\n fontFamily={ctx.fonts.body}\n fontSize={attr.fontSize}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {attr.text}\n </text>\n )\n })()}\n </g>\n )\n },\n}\n","/**\n * PPTX 幻灯片图标渲染。目录数据来自共享单源 `@/icons`\n * (lucide 提取,zod 枚举同源),本文件只负责把原语渲染进受控 SVG 子集:\n * path(含贝塞尔)/circle/ellipse/rect/line/polyline/polygon + g(translate/scale)。\n * 不产出嵌套 svg、foreignObject、渐变或 var()。\n */\nimport type React from \"react\"\nimport {\n PPTX_ICONS,\n type PptxIconPrimitive,\n} from \"@/icons\"\n\nexport interface IconProps {\n /** Logical icon name (must exist in the shared catalogue). */\n name: string\n /** Translate-x in the parent coordinate space. */\n x: number\n /** Translate-y in the parent coordinate space. */\n y: number\n /** Rendered size in px (the 24×24 viewbox is uniformly scaled to this). */\n size: number\n /** Stroke colour — must be a hex string (no CSS var / gradient). */\n color: string\n}\n\nconst STROKE_PROPS = {\n fill: \"none\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n} as const\n\nfunction renderPrimitive(\n prim: PptxIconPrimitive,\n i: number,\n color: string,\n): React.ReactElement {\n const [tag, attrs] = prim\n // 目录里 fill 只会是 \"currentColor\"(codegen 逐值校验):散点类图标的\n // 实心小圆点,映射成图标颜色实心填充;其余原语保持 stroke-only。\n const common = {\n key: i,\n stroke: color,\n ...STROKE_PROPS,\n ...(attrs.fill === \"currentColor\" ? { fill: color } : {}),\n }\n switch (tag) {\n case \"path\":\n return <path {...common} d={attrs.d} />\n case \"circle\":\n return <circle {...common} cx={attrs.cx} cy={attrs.cy} r={attrs.r} />\n case \"ellipse\":\n return (\n <ellipse {...common} cx={attrs.cx} cy={attrs.cy} rx={attrs.rx} ry={attrs.ry} />\n )\n case \"rect\":\n return (\n <rect\n {...common}\n x={attrs.x}\n y={attrs.y}\n width={attrs.width}\n height={attrs.height}\n rx={attrs.rx}\n ry={attrs.ry}\n />\n )\n case \"line\":\n return <line {...common} x1={attrs.x1} y1={attrs.y1} x2={attrs.x2} y2={attrs.y2} />\n case \"polyline\":\n return <polyline {...common} points={attrs.points} />\n case \"polygon\":\n return <polygon {...common} points={attrs.points} />\n default:\n throw new Error(`Icon: 目录含不支持的原语 <${tag}>`)\n }\n}\n\n/**\n * Render a lucide-style stroke icon as a `<g>` suitable for the controlled\n * SVG subset. The icon is scaled from its native 24px coordinate space to\n * `size` and placed at `(x, y)`.\n */\nexport function Icon({ name, x, y, size, color }: IconProps): React.ReactElement {\n const primitives = PPTX_ICONS[name]\n if (!primitives) {\n throw new Error(`Icon: unknown icon name \"${name}\"`)\n }\n const scale = size / 24\n return (\n <g transform={`translate(${x},${y}) scale(${scale})`}>\n {primitives.map((prim, i) => renderPrimitive(prim, i, color))}\n </g>\n )\n}\n","import type { Block } from \"@/ir\"\nimport { Icon } from \"../icons\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { parseEmphasis, renderEmphasisTspans, sliceEmphasisForLines, stripEmphasis } from \"../emphasis\"\nimport type { SvgBlock } from \"./types\"\n\ntype CalloutBlock = Extract<Block, { type: \"callout\" }>\n\nconst FONT_SIZE = 20\nconst LINE_RATIO = 1.4\nconst PAD_Y = 16\nconst BAR_WIDTH = 4\nconst RX = 6\nconst MIN_HEIGHT = 56\n\n/** Icon rendering constants — icon lives inside the left padding zone. */\nconst ICON_SIZE = 20\nconst ICON_LEFT = BAR_WIDTH + 8\nconst TEXT_X = ICON_LEFT + ICON_SIZE + 8\n\n/** Map callout variant to icon name. */\nconst VARIANT_ICON: Record<CalloutBlock[\"variant\"], string> = {\n info: \"info\",\n warn: \"triangle-alert\",\n tip: \"lightbulb\",\n}\n\nfunction lay(text: string, w: number) {\n return layoutSvgText(stripEmphasis(text), {\n maxWidth: w - 48,\n fontSize: FONT_SIZE,\n maxLines: 99,\n lineHeightRatio: LINE_RATIO,\n })\n}\n\nfunction accentColor(variant: CalloutBlock[\"variant\"], ctx: { colors: { primary: string; accent: string } }): string {\n if (variant === \"warn\") return \"#DC2626\"\n if (variant === \"tip\") return ctx.colors.accent\n return ctx.colors.primary\n}\n\nexport const callout: SvgBlock<CalloutBlock> = {\n measure(block, w) {\n const l = lay(block.text, w)\n return Math.max(l.lines.length * l.lineHeight + 2 * PAD_Y, MIN_HEIGHT)\n },\n render(block, box, ctx) {\n const l = lay(block.text, box.w)\n const lineSegments = sliceEmphasisForLines(parseEmphasis(block.text), l.lines)\n const h = Math.max(l.lines.length * l.lineHeight + 2 * PAD_Y, MIN_HEIGHT)\n const accent = accentColor(block.variant, ctx)\n const iconY = (h - ICON_SIZE) / 2\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n <rect\n x={0}\n y={0}\n width={box.w}\n height={h}\n rx={ctx.shape?.radius ?? RX}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke\n ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 }\n : {})}\n />\n <rect x={0} y={0} width={BAR_WIDTH} height={h} fill={accent} />\n <Icon name={block.icon ?? VARIANT_ICON[block.variant]} x={ICON_LEFT} y={iconY} size={ICON_SIZE} color={accent} />\n {lineSegments.map((segments, i) => (\n <text\n key={i}\n x={TEXT_X}\n y={PAD_Y + i * l.lineHeight + l.fontSize}\n fontFamily={ctx.fonts.body}\n fontSize={l.fontSize}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(segments, { accent: ctx.colors.accent, baseFill: ctx.colors.text })}\n </text>\n ))}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport {\n measureTextUnits,\n truncateToUnits,\n} from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype CodeBlock = Extract<Block, { type: \"code\" }>\n\nconst BASE_FONT_SIZE = 15\nconst BASE_LINE_HEIGHT = 22\nconst PADDING = 14\nconst LINE_NUM_COL = 40\nconst MIN_FONT_SIZE = 9\nconst BG_COLOR = \"#1E1E1E\"\nconst TEXT_COLOR = \"#D4D4D4\"\nconst LINE_NUM_COLOR = \"#6A737D\"\nconst BORDER_RADIUS = 6\nconst LINE_HEIGHT_RATIO = 1.45\n// `measureTextUnits` per-character weights (0.46-0.66 by character class) were\n// calibrated against proportional (variable-width) fonts. Code renders in\n// `ctx.fonts.mono` — a real monospace face (Menlo on the Mac audit rig, once\n// the font-stack fallback in fonts.ts made it reachable) whose fixed advance\n// width per character runs ~5-6% wider than that average for typical\n// identifier-heavy code (more lowercase/underscore/digit characters than the\n// heuristic's mixed-case assumption). Shave the fitting budget by the same\n// margin so the shrink-to-fit and truncate-at-floor math stay accurate for\n// the font that's actually rendering, not just the estimator's model of it.\nconst MONO_WIDTH_SAFETY = 0.9\n\nfunction resolveLayout(lines: string[], w: number) {\n const contentW = (w - 2 * PADDING - LINE_NUM_COL) * MONO_WIDTH_SAFETY\n const longestUnits = Math.max(...lines.map(measureTextUnits), 0)\n\n let fontSize = BASE_FONT_SIZE\n let lineHeight = BASE_LINE_HEIGHT\n\n if (longestUnits * fontSize > contentW && longestUnits > 0) {\n fontSize = Math.max(MIN_FONT_SIZE, Math.floor(contentW / longestUnits))\n lineHeight = Math.round(fontSize * LINE_HEIGHT_RATIO)\n }\n\n // Shrinking alone bottoms out at MIN_FONT_SIZE. A single unbroken token\n // (no spaces to wrap on, e.g. a long identifier) can still be wider than\n // the box at that floor — truncate per line instead of letting it escape.\n // Code lines must not re-wrap mid-token, so truncation (not wrapping) is\n // the code-appropriate degradation here.\n const maxUnitsAtFloor = contentW / fontSize\n const renderLines = lines.map((line) =>\n measureTextUnits(line) > maxUnitsAtFloor\n ? truncateToUnits(line, maxUnitsAtFloor)\n : line,\n )\n\n const textStartX = PADDING + LINE_NUM_COL\n const height = lines.length * lineHeight + 2 * PADDING\n\n return { fontSize, lineHeight, textStartX, height, renderLines }\n}\n\nexport const code: SvgBlock<CodeBlock> = {\n measure(block, w) {\n const lines = block.code.split(\"\\n\")\n const { height } = resolveLayout(lines, w)\n return height\n },\n render(block, box, ctx) {\n const lines = block.code.split(\"\\n\")\n const { fontSize, lineHeight, textStartX, height, renderLines } =\n resolveLayout(lines, box.w)\n\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n <rect\n x={0}\n y={0}\n width={box.w}\n height={height}\n rx={BORDER_RADIUS}\n fill={BG_COLOR}\n />\n {renderLines.map((line, i) => (\n <g key={i}>\n <text\n x={PADDING + LINE_NUM_COL - 8}\n y={PADDING + i * lineHeight + fontSize}\n fontFamily={ctx.fonts.mono}\n fontSize={fontSize}\n fill={LINE_NUM_COLOR}\n dominantBaseline=\"alphabetic\"\n textAnchor=\"end\"\n >\n {i + 1}\n </text>\n <text\n x={textStartX}\n y={PADDING + i * lineHeight + fontSize}\n fontFamily={ctx.fonts.mono}\n fontSize={fontSize}\n fill={TEXT_COLOR}\n dominantBaseline=\"alphabetic\"\n xmlSpace=\"preserve\"\n >\n {line}\n </text>\n </g>\n ))}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport {\n fitSvgLine,\n measureTextUnits,\n truncateToUnits,\n} from \"../../lib/svg-text-layout\"\nimport { Icon } from \"../icons\"\nimport type { SvgBlock } from \"./types\"\n\ntype KpiBlock = Extract<Block, { type: \"kpi_cards\" }>\n\nconst GAP = 16\nconst CARD_H = 120\n\n// Exported for tech.tsx's own per-item KPI cards (`renderKpiCard` in\n// templates/tech.tsx) — same delta arrow/color mapping, just laid out\n// into a compact bento cell instead of this file's wide row card.\nexport function deltaProps(delta: \"up\" | \"down\" | \"flat\") {\n if (delta === \"up\") return { arrow: \"↑\", color: \"#16A34A\" }\n if (delta === \"down\") return { arrow: \"↓\", color: \"#DC2626\" }\n return { arrow: \"→\", color: \"\" } // color filled by caller with ctx.colors.muted\n}\n\n// Exported for tech.tsx's `renderKpiCardBody` — same value/unit width\n// split technique (see the comment at its call site below), reused verbatim\n// so the two KPI renderers can't drift on this overflow-safety math.\nexport function splitKpiValueWidths(\n value: string,\n unit: string | undefined,\n availableWidth: number,\n): { valueMaxWidth: number; unitMaxWidth: number } {\n const valueUnits = measureTextUnits(value)\n const unitUnits = unit ? measureTextUnits(unit) : 0\n const valueMaxWidth =\n unitUnits > 0 && valueUnits > 0\n ? Math.floor((availableWidth * valueUnits) / (valueUnits + unitUnits))\n : availableWidth\n return { valueMaxWidth, unitMaxWidth: availableWidth - valueMaxWidth }\n}\n\n/**\n * 弱模型冗余单位去重(2026-07-10 无图矩阵真机抓到:tech 4/4、magazine 1/4\n * KPI 卡渲成「35%%」):模型常把 \"35%\" 填进 value 后又把 \"%\" 填进 unit,\n * 拼接即重复。value 已以 unit 结尾时丢弃 unit。导出供 bento KPI 卡\n * (content-bento-panel)同源复用,两条 KPI 渲染路径不漂移。\n */\nexport function dedupeKpiUnit(\n value: string,\n unit: string | undefined,\n): string | undefined {\n if (!unit) return unit\n const u = unit.trim()\n return u && value.trim().endsWith(u) ? undefined : unit\n}\n\n/** 任一 item 带 source 来源行时卡加高(label 下再排一行 11px 小字)。 */\nfunction baseCardH(block: KpiBlock): number {\n return block.items.some((it) => it.source) ? CARD_H + 18 : CARD_H\n}\n\nexport const kpi: SvgBlock<KpiBlock> = {\n measure(block) {\n return baseCardH(block)\n },\n render(block, box, ctx) {\n const n = block.items.length\n const cardW = (box.w - GAP * (n - 1)) / n\n const measured = baseCardH(block)\n // 密度拉伸(box.h 由布局分配):卡片撑到分配高度,内容组垂直居中\n const cardH = Math.max(measured, box.h ?? measured)\n const contentShift = (cardH - measured) / 2\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.map((item, i) => {\n const cardX = i * (cardW + GAP)\n const dp = item.delta ? deltaProps(item.delta) : null\n const deltaColor = dp\n ? dp.color || ctx.colors.muted\n : ctx.colors.muted\n // The overflow auditor measures a `<text>`'s whole textContent\n // (value + unit tspan concatenated) at the outer element's\n // font-size — it can't see that the unit tspan renders smaller. So\n // the value's width budget is shrunk in proportion to how much of\n // the combined text the unit accounts for, instead of a flat\n // pixel reserve, to keep the auditor's (over)estimate inside the\n // card. The unit itself has no length limit from the schema, so\n // its actual rendered text is separately truncated to fit the\n // width share it was allotted at its own (smaller) font size —\n // together the two bounds keep the card from overflowing at any\n // value/unit length.\n const valueStr = String(item.value)\n const unit = dedupeKpiUnit(valueStr, item.unit)\n const availableWidth = cardW - 40\n const { valueMaxWidth, unitMaxWidth } = splitKpiValueWidths(\n valueStr,\n unit,\n availableWidth,\n )\n const fittedValue = fitSvgLine(valueStr, {\n maxWidth: valueMaxWidth,\n fontSize: 40,\n minFontSize: 22,\n })\n const unitFontSize = Math.round(fittedValue.fontSize * 0.45)\n const fittedUnit = unit\n ? truncateToUnits(unit, unitMaxWidth / unitFontSize)\n : null\n const fittedLabel = fitSvgLine(item.label, {\n maxWidth: cardW - 40,\n fontSize: 16,\n minFontSize: 12,\n })\n return (\n <g key={i}>\n <rect\n x={cardX}\n y={0}\n width={cardW}\n height={cardH}\n rx={ctx.shape?.radius ?? 8}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke\n ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 }\n : {})}\n />\n {item.icon && (\n <Icon\n name={item.icon}\n x={cardX + 20}\n y={12 + contentShift}\n size={18}\n color={ctx.colors.primary}\n />\n )}\n <text\n x={cardX + 20}\n y={(item.icon ? 64 : 58) + contentShift}\n fontSize={fittedValue.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {fittedValue.text}\n {fittedUnit != null && (\n <tspan fontSize={unitFontSize} fill={ctx.colors.muted}>\n {fittedUnit}\n </tspan>\n )}\n </text>\n {dp && (\n <text\n x={cardX + cardW - 20}\n y={36 + contentShift}\n textAnchor=\"end\"\n fontSize={20}\n fill={deltaColor}\n dominantBaseline=\"alphabetic\"\n >\n {dp.arrow}\n </text>\n )}\n <text\n x={cardX + 20}\n y={96 + contentShift}\n fontSize={fittedLabel.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {fittedLabel.text}\n </text>\n {item.source && (\n <text\n x={cardX + 20}\n y={114 + contentShift}\n fontSize={11}\n fill={ctx.colors.muted}\n fillOpacity={0.7}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {fitSvgLine(item.source, { maxWidth: cardW - 40, fontSize: 11, minFontSize: 9 }).text}\n </text>\n )}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype ImageBlock = Extract<Block, { type: \"image\" }>\n\n/**\n * Cap on the image's own height (px), independent of caption. The smallest\n * theme content-rect height is ~380px minus the caption's ~32px allowance —\n * uncapped `w * 0.5` at a full-width single-variant image (≈560-600px)\n * exceeds every theme's content rect, so `layoutContentFit`'s overflow guard\n * drops the block entirely, rendering a blank slide. The SVG `<image>`'s\n * default `preserveAspectRatio` (xMidYMid meet) letterboxes gracefully when\n * the source doesn't fill the capped box.\n */\nconst MAX_IMAGE_H = 340\n\nexport const image: SvgBlock<ImageBlock> = {\n measure(_block, w) {\n // caption 画在图内底部色带(P3 卡片化),不再额外占图片下方空间\n return Math.min(Math.round(w * 0.5), MAX_IMAGE_H)\n },\n render(block, box, ctx) {\n const imgH = Math.min(Math.round(box.w * 0.5), MAX_IMAGE_H)\n const src = ctx.images?.[block.asset_id]?.src\n\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {src ? (\n <image\n href={src}\n x={0}\n y={0}\n width={box.w}\n height={imgH}\n preserveAspectRatio={\n block.fit === \"cover\" ? \"xMidYMid slice\" : \"xMidYMid meet\"\n }\n />\n ) : (\n <>\n <rect\n x={0}\n y={0}\n width={box.w}\n height={imgH}\n fill={ctx.colors.surface}\n />\n <text\n textAnchor=\"middle\"\n x={box.w / 2}\n y={imgH / 2}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n 图片缺失\n </text>\n </>\n )}\n {/* 卡片化(图片排版 P3):1px 主题框线,与 image_grid/compare 一致 */}\n <rect\n x={0.5}\n y={0.5}\n width={box.w - 1}\n height={imgH - 1}\n fill=\"none\"\n stroke={ctx.colors.border}\n strokeWidth={1}\n />\n {block.caption &&\n (() => {\n const fittedCaption = fitSvgLine(block.caption, {\n maxWidth: box.w - 24,\n fontSize: 15,\n minFontSize: 12,\n })\n return (\n // caption 底部色带(家居参考图 #3 的图卡形态):主题主色半透明\n // 压在图片底边内,白字居中——不再吃图片下方 32px 的外部空间\n <>\n <rect\n x={0}\n y={imgH - 32}\n width={box.w}\n height={32}\n fill={ctx.colors.primary}\n fillOpacity={0.88}\n />\n <text\n x={box.w / 2}\n y={imgH - 11}\n textAnchor=\"middle\"\n fontSize={fittedCaption.fontSize}\n fill={ctx.colors.surface}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {fittedCaption.text}\n </text>\n </>\n )\n })()}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype ImageGridBlock = Extract<Block, { type: \"image_grid\" }>\n\n/** 网格总高上限(px),与单图块的 MAX_IMAGE_H 同一预算量级。 */\nconst MAX_GRID_H = 340\nconst GAP = 10\nconst CAPTION_H = 26\n\n/**\n * 每格的几何布局(box 相对坐标)。布局形态:\n * - 2 图:双列一行;3 图:三列一行\n * - 4 图:2×2\n * - emphasis=\"first\" 且 3-4 图:首图独占左半、其余纵排右半(1 大 N 小)\n */\nfunction gridCells(\n n: number,\n emphasis: ImageGridBlock[\"emphasis\"],\n w: number,\n h: number,\n): { x: number; y: number; w: number; h: number }[] {\n if (emphasis === \"first\" && n >= 3) {\n const heroW = Math.round((w - GAP) * 0.56)\n const sideW = w - GAP - heroW\n const rest = n - 1\n const sideH = (h - GAP * (rest - 1)) / rest\n return [\n { x: 0, y: 0, w: heroW, h },\n ...Array.from({ length: rest }, (_, i) => ({\n x: heroW + GAP,\n y: Math.round((sideH + GAP) * i),\n w: sideW,\n h: Math.floor(sideH),\n })),\n ]\n }\n if (n === 4) {\n const cw = (w - GAP) / 2\n const ch = (h - GAP) / 2\n return [0, 1, 2, 3].map((i) => ({\n x: Math.round((cw + GAP) * (i % 2)),\n y: Math.round((ch + GAP) * Math.floor(i / 2)),\n w: Math.floor(cw),\n h: Math.floor(ch),\n }))\n }\n const cw = (w - GAP * (n - 1)) / n\n return Array.from({ length: n }, (_, i) => ({\n x: Math.round((cw + GAP) * i),\n y: 0,\n w: Math.floor(cw),\n h,\n }))\n}\n\nfunction gridImageAreaH(block: ImageGridBlock, w: number): number {\n const n = block.items.length\n if (block.emphasis === \"first\" && n >= 3) return MAX_GRID_H\n if (n === 4) return MAX_GRID_H\n // 单行:按格宽 16:10 比例,封顶 MAX_GRID_H\n const cw = (w - GAP * (n - 1)) / n\n return Math.min(Math.round(cw * 0.62), MAX_GRID_H)\n}\n\n/**\n * caption 仅在单行网格显示:多行形态(4 图 2×2、emphasis=first 的 1 大\n * N 小)里格下 caption 会与下一行图重叠,直接忽略(measure 同步不留白)。\n */\nfunction captionsVisible(block: ImageGridBlock): boolean {\n const multiRow = block.items.length === 4 || (block.emphasis === \"first\" && block.items.length >= 3)\n return !multiRow && block.items.some((it) => it.caption)\n}\n\nfunction renderCell({\n src,\n cell,\n ctx,\n}: {\n src: string | undefined\n cell: { x: number; y: number; w: number; h: number }\n ctx: BlockCtx\n}) {\n return (\n <g transform={`translate(${cell.x},${cell.y})`}>\n {src ? (\n <image\n href={src}\n x={0}\n y={0}\n width={cell.w}\n height={cell.h}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <>\n <rect x={0} y={0} width={cell.w} height={cell.h} fill={ctx.colors.surface} />\n <text\n textAnchor=\"middle\"\n x={cell.w / 2}\n y={cell.h / 2}\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n 图片缺失\n </text>\n </>\n )}\n <rect\n x={0.5}\n y={0.5}\n width={cell.w - 1}\n height={cell.h - 1}\n fill=\"none\"\n stroke={ctx.colors.border}\n strokeWidth={1}\n />\n </g>\n )\n}\n\nexport const imageGrid: SvgBlock<ImageGridBlock> = {\n measure(block, w) {\n return gridImageAreaH(block, w) + (captionsVisible(block) ? CAPTION_H : 0)\n },\n render(block, box, ctx) {\n const areaH = gridImageAreaH(block, box.w)\n const cells = gridCells(block.items.length, block.emphasis, box.w, areaH)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.map((item, i) => {\n const cell = cells[i]\n const src = ctx.images?.[item.asset_id]?.src\n return (\n <g key={i}>\n {renderCell({ src, cell, ctx })}\n {captionsVisible(block) && item.caption &&\n (() => {\n const fitted = fitSvgLine(item.caption, {\n maxWidth: cell.w - 26,\n fontSize: 14,\n minFontSize: 11,\n })\n return (\n // caption 左对齐 + accent 短线前缀(杂志图注惯例),\n // 弃居中 muted 的\"占位感\"\n <>\n <rect\n x={cell.x}\n y={cell.y + cell.h + 10}\n width={16}\n height={3}\n fill={ctx.colors.accent}\n />\n <text\n x={cell.x + 24}\n y={cell.y + cell.h + 20}\n fontSize={fitted.fontSize}\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n </>\n )\n })()}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype ImageCompareBlock = Extract<Block, { type: \"image_compare\" }>\n\n/** 图区高度上限(px),标签条另计。 */\nconst MAX_IMAGE_H = 320\nconst GAP = 10\nconst LABEL_H = 40\n\nfunction imageAreaH(w: number): number {\n const half = (w - GAP) / 2\n return Math.min(Math.round(half * 0.66), MAX_IMAGE_H)\n}\n\nfunction renderSide({\n asset_id,\n label,\n x,\n w,\n h,\n ctx,\n}: {\n asset_id: string\n label: string\n x: number\n w: number\n h: number\n ctx: BlockCtx\n}) {\n const src = ctx.images?.[asset_id]?.src\n const fitted = fitSvgLine(label, { maxWidth: w - 16, fontSize: 15, minFontSize: 12 })\n return (\n <g transform={`translate(${x},0)`}>\n {src ? (\n <image\n href={src}\n x={0}\n y={0}\n width={w}\n height={h}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <>\n <rect x={0} y={0} width={w} height={h} fill={ctx.colors.surface} />\n <text\n textAnchor=\"middle\"\n x={w / 2}\n y={h / 2}\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n 图片缺失\n </text>\n </>\n )}\n <rect\n x={0.5}\n y={0.5}\n width={w - 1}\n height={h - 1}\n fill=\"none\"\n stroke={ctx.colors.border}\n strokeWidth={1}\n />\n <text\n x={w / 2}\n y={h + 22}\n textAnchor=\"middle\"\n fontSize={fitted.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.text}\n fontWeight={600}\n letterSpacing={1}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n <rect x={w / 2 - 14} y={h + 30} width={28} height={3} fill={ctx.colors.accent} />\n </g>\n )\n}\n\nexport const imageCompare: SvgBlock<ImageCompareBlock> = {\n measure(_block, w) {\n return imageAreaH(w) + LABEL_H\n },\n render(block, box, ctx) {\n const h = imageAreaH(box.w)\n const half = Math.floor((box.w - GAP) / 2)\n const isVs = (block.style ?? \"vs\") === \"vs\"\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {renderSide({ asset_id: block.left.asset_id, label: block.left.label, x: 0, w: half, h, ctx })}\n {renderSide({\n asset_id: block.right.asset_id,\n label: block.right.label,\n x: half + GAP,\n w: half,\n h,\n ctx,\n })}\n {isVs ? (\n // 中缝圆徽章「VS」(压在两图接缝上)\n <g>\n <circle\n cx={box.w / 2}\n cy={h / 2}\n r={26}\n fill={ctx.colors.primary}\n stroke=\"#FFFFFF\"\n strokeWidth={2.5}\n />\n <text\n x={box.w / 2}\n y={h / 2 + 6}\n textAnchor=\"middle\"\n fontSize={18}\n fontWeight={700}\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.surface}\n dominantBaseline=\"alphabetic\"\n >\n VS\n </text>\n </g>\n ) : (\n // before/after 左上角标(各一枚小色块标签)\n <>\n {[0, half + GAP].map((x, i) => (\n <g key={i} transform={`translate(${x + 10},10)`}>\n <rect\n x={0}\n y={0}\n width={i === 0 ? 66 : 52}\n height={24}\n fill={i === 0 ? ctx.colors.muted : ctx.colors.accent}\n />\n <text\n x={i === 0 ? 33 : 26}\n y={17}\n textAnchor=\"middle\"\n fontSize={13}\n fontWeight={600}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.surface}\n dominantBaseline=\"alphabetic\"\n >\n {i === 0 ? \"BEFORE\" : \"AFTER\"}\n </text>\n </g>\n ))}\n </>\n )}\n </g>\n )\n },\n}\n","import type { ReactElement } from \"react\"\nimport type { ChartSeries } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * Chart renderers for the page-coordinate SVG pipeline.\n *\n * Each function receives an absolute region (x0, y0, w, h) and returns SVG\n * elements positioned in page coordinates (no nested <svg viewBox>).\n */\n\n/** Label font size (px) for category/value labels on bar and line charts. */\nconst LABEL_FONT_SIZE = 11\nconst LABEL_MIN_FONT_SIZE = 8\n/** Space (px) reserved at the top of `h` for value labels above the plot. */\nconst LABEL_TOP_PAD = 14\n/** Space (px) reserved at the bottom of `h` for category labels below the plot. */\nconst LABEL_BOTTOM_PAD = 18\n\n/** Bar gradient's lower stop keeps this fraction of the accent's original\n * per-channel brightness (0.7 → \"70% 亮度变体\" per the Task 8 brief). */\nconst BAR_GRADIENT_SHADE_FACTOR = 0.7\n/** Count of horizontal reference lines dividing the plot's value range —\n * shared by bar and line, both of which already compute an identical\n * plotTop/plotH plot area. */\nconst GRIDLINE_COUNT = 3\n/** Line chart endpoint-emphasis geometry: inner solid dot / outer soft ring. */\nconst ENDPOINT_DOT_R = 4\nconst ENDPOINT_RING_R = 8\nconst ENDPOINT_RING_OPACITY = 0.3\n/** Line-under-curve area fill: alpha at the line (top) fading to fully\n * transparent at the baseline (bottom). */\nconst AREA_FILL_TOP_ALPHA = 0.2\nconst AREA_FILL_BOTTOM_ALPHA = 0\n\n/**\n * A center-anchored label at a series' first/last point straddles the plot's\n * left/right edge and overflows it by half its own width. Anchor the first\n * point's label to grow rightward and the last point's leftward instead —\n * interior points keep the centered anchor.\n */\nfunction edgeAnchor(i: number, n: number): \"start\" | \"middle\" | \"end\" {\n if (n <= 1) return \"middle\"\n if (i === 0) return \"start\"\n if (i === n - 1) return \"end\"\n return \"middle\"\n}\n\n/**\n * djb2 string hash — deterministic and platform-independent (same algorithm\n * as `@/shared/lib/color`'s private `hash()`, re-implemented locally since\n * that one isn't exported and this file has no reason to import from it).\n */\nfunction stableHash(seed: string): number {\n let h = 5381\n for (let i = 0; i < seed.length; i++) {\n h = ((h << 5) + h + seed.charCodeAt(i)) | 0\n }\n return Math.abs(h)\n}\n\n/**\n * Deterministic id for a chart instance's gradient defs. `renderBar`/\n * `renderLine` never receive the block's page position — `chart.tsx` always\n * calls them with x0=y0=0 and translates the whole result via an outer `<g>`\n * — so there is no coordinate prop to key an id off. Hash the series data\n * actually in scope instead: stable for identical input (required for\n * preview/export to reproduce the exact same markup) and distinct whenever\n * two charts placed on the same page differ in data, which two\n * independently-authored charts always do (SVG ids are document-scoped, so\n * two chart instances on one slide must never collide).\n */\nfunction chartGradientId(prefix: string, w: number, h: number, seed: unknown): string {\n return `${prefix}-${stableHash(`${w}x${h}:${JSON.stringify(seed)}`)}`\n}\n\n/**\n * Scale a `#RRGGBB` hex color's channels to `factor` of their original value\n * (e.g. 0.7 → a darker 70%-brightness shade). Theme tokens are always baked\n * hex by the time they reach block renderers (`themes/tokens.ts`'s\n * `ThemeColors`), so no other CSS color syntax needs handling here.\n */\nfunction scaleHexBrightness(hex: string, factor: number): string {\n const match = /^#([0-9a-fA-F]{6})$/.exec(hex)\n if (!match) return hex\n const value = parseInt(match[1], 16)\n const scale = (channel: number) => Math.round(Math.min(255, Math.max(0, channel * factor)))\n const r = scale((value >> 16) & 0xff)\n const g = scale((value >> 8) & 0xff)\n const b = scale(value & 0xff)\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\").toUpperCase()}`\n}\n\n/**\n * Horizontal reference lines dividing the plot's value range into\n * GRIDLINE_COUNT+1 equal bands (3 lines → quarter/half/three-quarter of the\n * plot height). Skips any candidate that lands on the x-axis baseline — this\n * only actually fires when `plotH` has collapsed to 0 (h too small for the\n * label paddings), in which case every candidate coincides with plotTop and\n * the baseline alike.\n */\nfunction renderGridlines(\n x0: number,\n w: number,\n plotTop: number,\n plotH: number,\n mutedColor: string,\n): ReactElement {\n const baselineY = plotTop + plotH\n const ys: number[] = []\n for (let i = 1; i <= GRIDLINE_COUNT; i++) {\n const y = plotTop + (plotH * i) / (GRIDLINE_COUNT + 1)\n if (Math.abs(y - baselineY) > 0.01) ys.push(y)\n }\n return (\n <>\n {ys.map((y, i) => (\n <line\n key={i}\n x1={x0}\n y1={y}\n x2={x0 + w}\n y2={y}\n stroke={mutedColor}\n strokeOpacity={0.1}\n strokeWidth={1}\n />\n ))}\n </>\n )\n}\n\nexport function renderBar(\n series: ChartSeries[],\n _palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n mutedColor: string,\n textColor: string,\n accentColor: string,\n): ReactElement {\n const all = series.flatMap((s) => s.data.map((d) => d.y))\n const max = Math.max(...all, 1)\n const points = series[0]?.data ?? []\n const groupW = w / Math.max(points.length, 1)\n const plotTop = y0 + LABEL_TOP_PAD\n const plotH = Math.max(0, h - LABEL_TOP_PAD - LABEL_BOTTOM_PAD)\n // One shared gradient per chart instance — every non-max bar reuses it via\n // the same `url(#…)` reference, so it's declared once, not per bar.\n const gradientId = chartGradientId(\"chart-bar-grad\", w, h, series)\n const gradientShade = scaleHexBrightness(accentColor, BAR_GRADIENT_SHADE_FACTOR)\n return (\n <>\n <defs>\n <linearGradient id={gradientId} x1={0} y1={0} x2={0} y2={1}>\n <stop offset=\"0%\" stopColor={accentColor} />\n <stop offset=\"100%\" stopColor={gradientShade} />\n </linearGradient>\n </defs>\n {renderGridlines(x0, w, plotTop, plotH, mutedColor)}\n {points.map((d, i) => {\n const barH = (d.y / max) * plotH\n const barX = x0 + i * groupW + 4\n const barW = groupW - 8\n const barY = plotTop + plotH - barH\n // The tallest bar (or bars tied for tallest) stands out as a solid\n // accent fill instead of the gradient — \"无渐变突出\" per the brief.\n const isMax = d.y === max\n const category = fitSvgLine(String(d.x), {\n maxWidth: barW,\n fontSize: LABEL_FONT_SIZE,\n minFontSize: LABEL_MIN_FONT_SIZE,\n })\n return (\n <g key={i}>\n <rect\n x={barX}\n y={barY}\n width={barW}\n height={barH}\n fill={isMax ? accentColor : `url(#${gradientId})`}\n opacity={isMax ? 1 : 0.75}\n />\n <text\n x={barX + barW / 2}\n y={barY - 4}\n textAnchor=\"middle\"\n fontSize={LABEL_FONT_SIZE}\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {d.y}\n </text>\n <text\n x={barX + barW / 2}\n y={y0 + h - 4}\n textAnchor=\"middle\"\n fontSize={category.fontSize}\n fill={mutedColor}\n dominantBaseline=\"alphabetic\"\n >\n {category.text}\n </text>\n </g>\n )\n })}\n </>\n )\n}\n\nexport function renderLine(\n series: ChartSeries[],\n palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n mutedColor: string,\n textColor: string,\n accentColor: string,\n): ReactElement {\n const plotTop = y0 + LABEL_TOP_PAD\n const plotH = Math.max(0, h - LABEL_TOP_PAD - LABEL_BOTTOM_PAD)\n const baselineY = plotTop + plotH\n const categoryPoints = series[0]?.data ?? []\n const categoryMaxWidth = w / Math.max(categoryPoints.length - 1, 1)\n return (\n <>\n {renderGridlines(x0, w, plotTop, plotH, mutedColor)}\n {series.map((s, sIdx) => {\n const max = Math.max(...s.data.map((d) => d.y), 1)\n const coords = s.data.map((d, i) => ({\n x: x0 + (i / Math.max(s.data.length - 1, 1)) * w,\n y: plotTop + plotH - (d.y / max) * plotH,\n y_value: d.y,\n }))\n const pts = coords.map((c) => `${c.x},${c.y}`).join(\" \")\n const first = coords[0]\n const last = coords[coords.length - 1]\n // Per-series area-under-curve gradient — each series gets its own\n // declared id (folding sIdx into the seed) since each traces a\n // different shape and must not share a def with another series.\n const areaId = chartGradientId(`chart-line-area-${sIdx}`, w, h, s)\n return (\n <g key={sIdx}>\n {first && last && (\n <>\n <defs>\n <linearGradient id={areaId} x1={0} y1={0} x2={0} y2={1}>\n <stop offset=\"0%\" stopColor={accentColor} stopOpacity={AREA_FILL_TOP_ALPHA} />\n <stop offset=\"100%\" stopColor={accentColor} stopOpacity={AREA_FILL_BOTTOM_ALPHA} />\n </linearGradient>\n </defs>\n <polygon\n points={`${pts} ${last.x},${baselineY} ${first.x},${baselineY}`}\n fill={`url(#${areaId})`}\n stroke=\"none\"\n />\n </>\n )}\n <polyline\n points={pts}\n fill=\"none\"\n stroke={palette[sIdx % palette.length]}\n strokeWidth={2}\n />\n {/* Category labels sit under the x-axis once, off series[0]'s data\n points — repeating them per series would stack duplicate\n labels on the shared x-axis. */}\n {sIdx === 0 &&\n coords.map((c, i) => {\n const category = fitSvgLine(String(categoryPoints[i]?.x ?? \"\"), {\n maxWidth: categoryMaxWidth,\n fontSize: LABEL_FONT_SIZE,\n minFontSize: LABEL_MIN_FONT_SIZE,\n })\n return (\n <text\n key={`cat-${i}`}\n x={c.x}\n y={y0 + h - 4}\n textAnchor={edgeAnchor(i, coords.length)}\n fontSize={category.fontSize}\n fill={mutedColor}\n dominantBaseline=\"alphabetic\"\n >\n {category.text}\n </text>\n )\n })}\n {/* Value labels only at each series' endpoints — every point would\n clutter a many-point line, unlike bar's one-label-per-bar. */}\n {first && (\n <text\n x={first.x}\n y={first.y - 6}\n textAnchor={edgeAnchor(0, coords.length)}\n fontSize={LABEL_FONT_SIZE}\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {first.y_value}\n </text>\n )}\n {last && last !== first && (\n <text\n x={last.x}\n y={last.y - 6}\n textAnchor={edgeAnchor(coords.length - 1, coords.length)}\n fontSize={LABEL_FONT_SIZE}\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {last.y_value}\n </text>\n )}\n {/* Endpoint emphasis: a soft outer ring plus a solid accent dot,\n always at the series' last point (even a single-point series,\n where it coincides with `first`). */}\n {last && (\n <>\n <circle\n cx={last.x}\n cy={last.y}\n r={ENDPOINT_RING_R}\n fill=\"none\"\n stroke={accentColor}\n strokeOpacity={ENDPOINT_RING_OPACITY}\n />\n <circle cx={last.x} cy={last.y} r={ENDPOINT_DOT_R} fill={accentColor} />\n </>\n )}\n </g>\n )\n })}\n </>\n )\n}\n\nexport function renderPie(\n series: ChartSeries[],\n palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n _mutedColor?: string,\n _textColor?: string,\n _accentColor?: string,\n): ReactElement {\n const data = series[0]?.data ?? []\n const total = data.reduce((s, d) => s + d.y, 0)\n if (total === 0) return <></>\n let acc = 0\n const cx = x0 + w / 2\n const cy = y0 + h / 2\n const r = Math.min(w, h) / 2 - 4\n return (\n <>\n {data.map((d, i) => {\n const startA = (acc / total) * Math.PI * 2 - Math.PI / 2\n acc += d.y\n const endA = (acc / total) * Math.PI * 2 - Math.PI / 2\n const large = endA - startA > Math.PI ? 1 : 0\n const x1 = cx + Math.cos(startA) * r\n const y1 = cy + Math.sin(startA) * r\n const x2 = cx + Math.cos(endA) * r\n const y2 = cy + Math.sin(endA) * r\n return (\n <path\n key={i}\n d={`M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`}\n fill={palette[i % palette.length]}\n />\n )\n })}\n </>\n )\n}\n\nexport function renderFunnel(\n series: ChartSeries[],\n palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n _mutedColor?: string,\n _textColor?: string,\n _accentColor?: string,\n): ReactElement {\n const data = series[0]?.data ?? []\n const max = Math.max(...data.map((d) => d.y), 1)\n const stepH = h / Math.max(data.length, 1)\n return (\n <>\n {data.map((d, i) => {\n const ratio = d.y / max\n const barW = w * ratio\n const barX = x0 + (w - barW) / 2\n return (\n <rect\n key={i}\n x={barX}\n y={y0 + i * stepH + 2}\n width={barW}\n height={stepH - 4}\n fill={palette[i % palette.length]}\n />\n )\n })}\n </>\n )\n}\n\n/**\n * dumbbell 哑铃变化图(2026-07-12 借鉴财经简报):series[0]=起点值、\n * series[1]=终点值(等长同 x),每行「muted 起点●——线——accent 终点●」+\n * 双端数值标签,行标签左侧右对齐。表达「从 A 到 B 的变化」。\n */\nconst DUMBBELL_LABEL_W = 96\nconst DUMBBELL_DOT_R = 5\n\nexport function renderDumbbell(\n series: ChartSeries[],\n _palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n mutedColor: string,\n textColor: string,\n accentColor: string,\n): ReactElement {\n const fromData = series[0]?.data ?? []\n const toData = series[1]?.data ?? []\n const rows = Math.min(fromData.length, toData.length)\n if (rows === 0) return <></>\n const all = [...fromData, ...toData].map((d) => d.y)\n const max = Math.max(...all, 1)\n const plotX = x0 + DUMBBELL_LABEL_W + 12\n const plotW = Math.max(1, w - DUMBBELL_LABEL_W - 12 - 56)\n const rowH = h / rows\n const vx = (v: number) => plotX + (v / max) * plotW\n return (\n <>\n {Array.from({ length: rows }, (_, i) => {\n const from = fromData[i]\n const to = toData[i]\n const cy = y0 + i * rowH + rowH / 2\n const label = fitSvgLine(String(from.x), {\n maxWidth: DUMBBELL_LABEL_W,\n fontSize: 13,\n minFontSize: 10,\n })\n const x1 = vx(from.y)\n const x2 = vx(to.y)\n return (\n <g key={i}>\n <text\n x={x0 + DUMBBELL_LABEL_W}\n y={cy + 4}\n textAnchor=\"end\"\n fontSize={label.fontSize}\n fontWeight=\"600\"\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {label.text}\n </text>\n <line x1={x1} y1={cy} x2={x2} y2={cy} stroke={mutedColor} strokeWidth={2} strokeOpacity={0.55} />\n <circle cx={x1} cy={cy} r={DUMBBELL_DOT_R} fill={mutedColor} />\n <circle cx={x2} cy={cy} r={DUMBBELL_DOT_R + 1.5} fill={accentColor} />\n <text\n x={x1}\n y={cy - 11}\n textAnchor=\"middle\"\n fontSize={LABEL_FONT_SIZE}\n fill={mutedColor}\n dominantBaseline=\"alphabetic\"\n >\n {from.y}\n </text>\n <text\n x={x2 + DUMBBELL_DOT_R + 8}\n y={cy + 4}\n fontSize={12.5}\n fontWeight=\"bold\"\n fill={accentColor}\n dominantBaseline=\"alphabetic\"\n >\n {to.y}\n </text>\n </g>\n )\n })}\n </>\n )\n}\n\n/**\n * bar 横向模式(2026-07-12 借鉴):行式横条排名——类目标签左侧右对齐、\n * 条自左起、端值标签在条右。长标签(公司名/条目名)比竖柱友好。\n * 最大条实色 accent,其余同竖版走渐变(横向)。\n */\nconst BAR_H_LABEL_W = 110\n\nexport function renderBarHorizontal(\n series: ChartSeries[],\n _palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n mutedColor: string,\n textColor: string,\n accentColor: string,\n): ReactElement {\n const points = series[0]?.data ?? []\n if (points.length === 0) return <></>\n const max = Math.max(...points.map((d) => d.y), 1)\n const rowH = h / points.length\n const plotX = x0 + BAR_H_LABEL_W + 12\n const plotW = Math.max(1, w - BAR_H_LABEL_W - 12 - 64)\n const gradientId = chartGradientId(\"chart-barh-grad\", w, h, series)\n const gradientShade = scaleHexBrightness(accentColor, BAR_GRADIENT_SHADE_FACTOR)\n return (\n <>\n <defs>\n <linearGradient id={gradientId} x1={0} y1={0} x2={1} y2={0}>\n <stop offset=\"0%\" stopColor={gradientShade} />\n <stop offset=\"100%\" stopColor={accentColor} />\n </linearGradient>\n </defs>\n {points.map((d, i) => {\n const barW = (d.y / max) * plotW\n const barY = y0 + i * rowH + 5\n const barH = Math.max(4, rowH - 10)\n const isMax = d.y === max\n const label = fitSvgLine(String(d.x), {\n maxWidth: BAR_H_LABEL_W,\n fontSize: 13,\n minFontSize: 10,\n })\n return (\n <g key={i}>\n <text\n x={x0 + BAR_H_LABEL_W}\n y={barY + barH / 2 + 4}\n textAnchor=\"end\"\n fontSize={label.fontSize}\n fontWeight=\"600\"\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {label.text}\n </text>\n <rect\n x={plotX}\n y={barY}\n width={barW}\n height={barH}\n fill={isMax ? accentColor : `url(#${gradientId})`}\n opacity={isMax ? 1 : 0.75}\n />\n <text\n x={plotX + barW + 8}\n y={barY + barH / 2 + 4}\n fontSize={12.5}\n fontWeight=\"bold\"\n fill={isMax ? accentColor : mutedColor}\n dominantBaseline=\"alphabetic\"\n >\n {d.y}\n </text>\n </g>\n )\n })}\n </>\n )\n}\n\n/**\n * donut 环形图(2026-07-12 借鉴):pie 的环形变体——环形扇区 path\n * (外弧+内弧,不依赖背景色圆覆盖)+ 中心总值大字 +「总计」小字。\n */\nconst DONUT_HOLE_RATIO = 0.62\n\nexport function renderDonut(\n series: ChartSeries[],\n palette: string[],\n x0: number,\n y0: number,\n w: number,\n h: number,\n mutedColor?: string,\n textColor?: string,\n _accentColor?: string,\n): ReactElement {\n const data = series[0]?.data ?? []\n const total = data.reduce((s, d) => s + d.y, 0)\n if (total === 0) return <></>\n let acc = 0\n const cx = x0 + w / 2\n const cy = y0 + h / 2\n const r = Math.min(w, h) / 2 - 4\n const ri = r * DONUT_HOLE_RATIO\n const totalLabel = Number.isInteger(total) ? String(total) : total.toFixed(1)\n const fitted = fitSvgLine(totalLabel, { maxWidth: ri * 1.5, fontSize: 30, minFontSize: 16 })\n return (\n <>\n {data.map((d, i) => {\n const startA = (acc / total) * Math.PI * 2 - Math.PI / 2\n acc += d.y\n const endA = (acc / total) * Math.PI * 2 - Math.PI / 2\n const large = endA - startA > Math.PI ? 1 : 0\n const ox1 = cx + Math.cos(startA) * r\n const oy1 = cy + Math.sin(startA) * r\n const ox2 = cx + Math.cos(endA) * r\n const oy2 = cy + Math.sin(endA) * r\n const ix1 = cx + Math.cos(endA) * ri\n const iy1 = cy + Math.sin(endA) * ri\n const ix2 = cx + Math.cos(startA) * ri\n const iy2 = cy + Math.sin(startA) * ri\n return (\n <path\n key={i}\n d={`M ${ox1} ${oy1} A ${r} ${r} 0 ${large} 1 ${ox2} ${oy2} L ${ix1} ${iy1} A ${ri} ${ri} 0 ${large} 0 ${ix2} ${iy2} Z`}\n fill={palette[i % palette.length]}\n />\n )\n })}\n <text\n x={cx}\n y={cy + fitted.fontSize * 0.15}\n textAnchor=\"middle\"\n fontSize={fitted.fontSize}\n fontWeight=\"bold\"\n fill={textColor}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n <text\n x={cx}\n y={cy + fitted.fontSize * 0.15 + 18}\n textAnchor=\"middle\"\n fontSize={12}\n fill={mutedColor}\n dominantBaseline=\"alphabetic\"\n >\n 总计\n </text>\n </>\n )\n}\n","import type { Block } from \"@/ir\"\nimport type { SvgBlock } from \"./types\"\nimport {\n renderBar,\n renderBarHorizontal,\n renderDonut,\n renderDumbbell,\n renderLine,\n renderPie,\n renderFunnel,\n} from \"./chart-svg\"\n\ntype ChartBlock = Extract<Block, { type: \"chart\" }>\n\nconst CHART_H = 240\n\nconst renderers = {\n bar: renderBar,\n line: renderLine,\n pie: renderPie,\n funnel: renderFunnel,\n dumbbell: renderDumbbell,\n} as const\n\n/** 变体分发:bar+direction=horizontal 走横条,pie+style=donut 走环形。 */\nfunction resolveRenderer(block: ChartBlock) {\n if (block.chart_type === \"bar\" && block.direction === \"horizontal\") {\n return renderBarHorizontal\n }\n if (block.chart_type === \"pie\" && block.style === \"donut\") {\n return renderDonut\n }\n return renderers[block.chart_type]\n}\n\nexport const chart: SvgBlock<ChartBlock> = {\n measure() {\n return CHART_H\n },\n render(block, box, ctx) {\n const renderer = resolveRenderer(block)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {renderer(\n block.series,\n ctx.colors.chartPalette,\n 0,\n 0,\n box.w,\n CHART_H,\n ctx.colors.muted,\n ctx.colors.text,\n ctx.colors.accent,\n )}\n </g>\n )\n },\n}\n","import { Fragment } from \"react\"\nimport dagre from \"dagre\"\nimport type { Block } from \"@/ir\"\nimport {\n fitSvgLine,\n measureTextUnits,\n} from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype FlowchartBlock = Extract<Block, { type: \"flowchart\" }>\n\ntype FlowDirection = \"TB\" | \"TD\" | \"BT\" | \"LR\" | \"RL\"\n\n/** dagre accepts TB/BT/LR/RL. Mermaid \"TD\" is an alias for \"TB\". */\nfunction toRankdir(d: FlowDirection): \"TB\" | \"BT\" | \"LR\" | \"RL\" {\n return d === \"TD\" ? \"TB\" : d\n}\n\nconst NODE_MIN_W = 80\nconst NODE_MAX_W = 260\n/**\n * Horizontal breathing room per side, in *local* (dagre) units so it scales\n * with the diagram. It enters the box-width budget (`nodeWidth`) AND the\n * render-time fitting budget (`usableW`) with the same value — the two used\n * to disagree (budget 10px, render-time only 6px fixed) while the render\n * font ran 1.15× hotter than the sizing font, so `fitSvgLine` quietly shrank\n * the text until it filled everything but ~6px per side (user-reported\n * \"贴边没有呼吸感\").\n */\nconst NODE_PAD_X = 16\nconst NODE_H = 56\n/** Extra local height per label line beyond the first (multi-line nodes). */\nconst NODE_LINE_PITCH = 18\n/** Defensive cap — a node card is not a paragraph; extra lines merge into the last. */\nconst NODE_MAX_LINES = 3\nconst NODE_SEP = 30\nconst RANK_SEP = 48\nconst FONT_SIZE = 12\nconst MIN_FONT_SIZE = 9\nconst STROKE_W = 1.5\nconst ARROW_SIZE = 6\n/**\n * Max height (px) the flowchart may occupy in the content area. The dagre layout\n * is scaled to fit BOTH the target width and this height, so a tall top-to-bottom\n * chart shrinks to fit instead of scaling by width alone and overflowing the slide.\n */\nconst MAX_FLOW_HEIGHT = 360\n/**\n * Fixed *local* (pre-scale, dagre-coordinate) clearance subtracted from an\n * edge's raw gap before it becomes an edge label's fitting budget (see\n * `computeEdgeLabel`) — kept in the same unit space as `NODE_SEP`/`RANK_SEP`\n * so it shrinks right along with the gap at low scale.\n *\n * This used to be subtracted *after* scaling (`spanLocal * scale - 16`), i.e.\n * a page-space pixel amount independent of `scale`. That is only equivalent\n * to a local-space margin at scale=1 — `fitScale` shrinks `scale` well below\n * 1 for any diagram tall enough to hit `MAX_FLOW_HEIGHT` or wide enough to\n * hit the box width (verified empirically: a straight chain hits this by 6\n * TB nodes or 8 LR nodes), and at low scale a flat 16px post-scale bite could\n * consume most or all of `availableWidth` — pushing `fitSvgLine` into\n * `truncateToUnits`'s floor: a bare \"…\" or (once the budget went negative)\n * an empty string, for every single edge label, regardless of how short the\n * label text was. Subtracting the margin *before* scaling keeps the ratio of\n * clearance-to-gap constant across every scale — the two formulas agree\n * exactly at scale=1 (`(spanLocal-16)*1 == spanLocal*1-16`), so this is a\n * pure fix for the scale coupling, not a behavior change at 1:1.\n */\nconst LABEL_FIT_MARGIN = 16\n/** Backing chip behind an edge label (see `computeEdgeLabel`) — keeps the\n * label legible whether it ends up floating over a node card or a crossing\n * line once labels render as their own layer above the nodes. */\nconst LABEL_CHIP_PAD_X = 4\nconst LABEL_CHIP_PAD_Y = 2\nconst LABEL_CHIP_RX = 2\n/**\n * Below this width, `computeEdgeLabel` omits the label instead of fitting it.\n *\n * `truncateToUnits` (svg-text-layout.ts) reserves a flat 1.0-unit budget for\n * the ellipsis before deciding which characters survive, regardless of the\n * ellipsis's actual (~0.46-unit) rendered weight — so at `minFontSize` (9px),\n * even the single heaviest character (a CJK glyph, weight 1.0) only survives\n * that reservation once the caller's budget is at least `2 * minFontSize`\n * (one full-weight char + the reserved unit). Below that, every fit degrades\n * to a bare \"…\" or, once the budget goes negative, \"\" — neither of which\n * reads as a label. A missing edge label is still a valid, readable\n * flowchart; a floating \"…\" (or a chip with nothing legible behind it) reads\n * as a rendering bug, so we skip straight to \"no label\" instead.\n */\nconst MIN_LABEL_WIDTH = 2 * MIN_FONT_SIZE\n\n/** Uniform scale that fits the dagre layout within width `w` and MAX_FLOW_HEIGHT. */\nfunction fitScale(layout: Layout, w: number): number {\n // 允许适度放大填充画布(上限 1.4,避免 3 节点小图膨胀失真)\n return Math.min(w / layout.width, MAX_FLOW_HEIGHT / layout.height, 1.4)\n}\n\n/**\n * Split a node label into display lines. Models steadily write mermaid-style\n * `<br/>` inside flowchart labels (the system prompt legitimately teaches it\n * for the *mermaid* tool, and the habit crosses over) — the SVG renderer used\n * to draw the tag literally. `<br>`/`<br/>` and `\\n` all break lines; blank\n * segments drop; anything beyond NODE_MAX_LINES merges into the last line\n * (fitSvgLine then shrinks/truncates it like any long line).\n */\nexport function normalizeLabelLines(label: string): string[] {\n const lines = label\n .split(/<br\\s*\\/?>|\\n/i)\n .map((s) => s.trim())\n .filter(Boolean)\n if (lines.length === 0) return [\"\"]\n if (lines.length <= NODE_MAX_LINES) return lines\n return [...lines.slice(0, NODE_MAX_LINES - 1), lines.slice(NODE_MAX_LINES - 1).join(\" \")]\n}\n\n/** Node box width sized by the widest line's estimated width (units × font size). */\nfunction nodeWidth(lines: string[]): number {\n const maxUnits = Math.max(...lines.map(measureTextUnits), 0)\n const textW = maxUnits * FONT_SIZE + NODE_PAD_X * 2\n return Math.min(NODE_MAX_W, Math.max(NODE_MIN_W, textW))\n}\n\n/** Node box height grows with the label's line count. */\nfunction nodeHeight(lines: string[]): number {\n return NODE_H + (lines.length - 1) * NODE_LINE_PITCH\n}\n\n/**\n * Resolve layout direction. An explicit `direction` on the block is respected.\n * When unspecified, lay out both TB and LR and keep the orientation that fits\n * the wide slide canvas with the larger scale (ties prefer LR — the 1280×720\n * page is landscape, so long chains read better horizontally).\n */\nfunction resolveLayout(block: FlowchartBlock, w: number): {\n layout: Layout\n scale: number\n} {\n // \"TB\" 是 schema 的历史默认值(存量 deck 全部烤死了 TB),视为自动候选。\n // 只有 TD/BT/LR/RL 这类刻意写出的方向才原样尊重。\n if (block.direction && block.direction !== \"TB\") {\n const layout = computeLayout(block, block.direction)\n return { layout, scale: fitScale(layout, w) }\n }\n const tb = computeLayout(block, \"TB\")\n const lr = computeLayout(block, \"LR\")\n const tbScale = fitScale(tb, w)\n const lrScale = fitScale(lr, w)\n return lrScale >= tbScale\n ? { layout: lr, scale: lrScale }\n : { layout: tb, scale: tbScale }\n}\n\ninterface LayoutNode {\n id: string\n x: number\n y: number\n w: number\n h: number\n lines: string[]\n kind: \"rect\" | \"diamond\" | \"round\"\n}\n\ninterface LayoutEdge {\n points: { x: number; y: number }[]\n label: string\n}\n\ninterface Layout {\n nodes: LayoutNode[]\n edges: LayoutEdge[]\n width: number\n height: number\n}\n\nfunction computeLayout(block: FlowchartBlock, direction: FlowDirection): Layout {\n const g = new dagre.graphlib.Graph()\n g.setGraph({\n rankdir: toRankdir(direction),\n nodesep: NODE_SEP,\n ranksep: RANK_SEP,\n })\n g.setDefaultEdgeLabel(() => ({}))\n\n for (const n of block.nodes) {\n const lines = normalizeLabelLines(n.label)\n g.setNode(n.id, {\n width: nodeWidth(lines),\n height: nodeHeight(lines),\n lines,\n kind: n.kind ?? \"rect\",\n })\n }\n for (const e of block.edges) {\n // 边标签是单行元素:换行标记(<br/>、\\n)归一化成空格。\n g.setEdge(e.from, e.to, {\n label: (e.label ?? \"\").replace(/<br\\s*\\/?>|\\n/gi, \" \").trim(),\n })\n }\n\n dagre.layout(g)\n\n const graphLabel = g.graph()\n const width = graphLabel.width ?? 400\n const height = graphLabel.height ?? 200\n\n const nodes: LayoutNode[] = g.nodes().map((id) => {\n const n = g.node(id) as dagre.Node & {\n lines: string[]\n kind: \"rect\" | \"diamond\" | \"round\"\n }\n return {\n id,\n x: n.x - n.width / 2,\n y: n.y - n.height / 2,\n w: n.width,\n h: n.height,\n lines: n.lines,\n kind: n.kind,\n }\n })\n\n const edges: LayoutEdge[] = g.edges().map((e) => {\n const edge = g.edge(e) as { points: { x: number; y: number }[]; label?: string }\n return {\n points: edge.points,\n label: edge.label ?? \"\",\n }\n })\n\n return { nodes, edges, width, height }\n}\n\n/** Build a polygon arrowhead at the end of an edge path. */\nfunction arrowPolygon(\n points: { x: number; y: number }[],\n scaleX: number,\n scaleY: number,\n color: string,\n): React.ReactElement | null {\n if (points.length < 2) return null\n const tip = points[points.length - 1]\n const prev = points[points.length - 2]\n const dx = tip.x - prev.x\n const dy = tip.y - prev.y\n const len = Math.sqrt(dx * dx + dy * dy)\n if (len === 0) return null\n\n const ux = dx / len\n const uy = dy / len\n // perpendicular\n const px = -uy\n const py = ux\n\n const s = ARROW_SIZE\n const tx = tip.x * scaleX\n const ty = tip.y * scaleY\n const sx = s * scaleX\n const sy = s * scaleY\n\n // Three points: tip, and two base corners\n const p1x = tx\n const p1y = ty\n const p2x = tx - ux * sx + px * sy * 0.5\n const p2y = ty - uy * sy + py * sx * 0.5\n const p3x = tx - ux * sx - px * sy * 0.5\n const p3y = ty - uy * sy - py * sx * 0.5\n\n return (\n <polygon\n points={`${p1x},${p1y} ${p2x},${p2y} ${p3x},${p3y}`}\n fill={color}\n />\n )\n}\n\ninterface EdgeLabelVisual {\n x: number\n y: number\n text: string\n fontSize: number\n chipX: number\n chipY: number\n chipW: number\n chipH: number\n /** Left edge / width of the *physical gap* (not the fitted chip) in the\n * same local pre-offset space as the fields above — independent of\n * whatever margin/padding choices the fit made, this is `computeLayout`'s\n * own geometry, so it is what `render()` bakes into the label's\n * `data-audit-box` (see the render-time comment for why that has to be a\n * different number than `chipX`/`chipW`). */\n boxX: number\n boxW: number\n}\n\n/**\n * Fit an edge's label to the gap it actually has to live in and lay out its\n * backing chip. `mid` (the label's anchor, `text-anchor=\"middle\"`) is one of\n * the polyline's own vertices, not an interpolated point — for the common\n * direct-edge case dagre emits exactly 3 points (source boundary, true gap\n * midpoint, target boundary), so the points flanking the midpoint (skipping\n * over it) bound the *whole* visual gap the label sits in, not half of it.\n * That matches a horizontal (LR/RL) layout's node-to-node gap exactly; for a\n * vertical (TB/BT) layout it degrades to the rank gap, which is tighter but\n * still workable since TB diagrams are typically decision trees with short\n * 是/否-style labels rather than the long descriptive labels LR pipelines use.\n *\n * Returns `null` both when the edge has no label and when the gap is too\n * narrow for even one character to survive `fitSvgLine`'s shrink-then-\n * truncate fallback (see `MIN_LABEL_WIDTH`) — physically no room for\n * anything legible, so the label is omitted rather than rendered as a bare\n * \"…\" or empty string.\n */\nfunction computeEdgeLabel(edge: LayoutEdge, scale: number): EdgeLabelVisual | null {\n if (!edge.label) return null\n const { points } = edge\n const midIdx = Math.floor(points.length / 2)\n const mid = points[midIdx]\n if (!mid) return null\n\n const before = points[Math.max(0, midIdx - 1)]\n const after = points[Math.min(points.length - 1, midIdx + 1)]\n const spanLocal = Math.hypot(after.x - before.x, after.y - before.y)\n // Margin subtracted in local space *before* scaling (see LABEL_FIT_MARGIN)\n // so it shrinks together with the gap instead of eating a scale-independent\n // bite out of an already-scaled-down span.\n const availableWidth = Math.max(0, (spanLocal - LABEL_FIT_MARGIN) * scale)\n if (availableWidth < MIN_LABEL_WIDTH) return null\n\n const idealFont = Math.max(9, Math.min(16, Math.round(FONT_SIZE * scale)))\n const fitted = fitSvgLine(edge.label, {\n maxWidth: availableWidth,\n fontSize: idealFont,\n minFontSize: MIN_FONT_SIZE,\n })\n\n const labelW = measureTextUnits(fitted.text) * fitted.fontSize\n const chipW = labelW + LABEL_CHIP_PAD_X * 2\n const chipH = fitted.fontSize + LABEL_CHIP_PAD_Y * 2\n const x = mid.x * scale\n const y = mid.y * scale - 4\n // The *un-margined* gap, centered on the same point as the chip/text —\n // deliberately wider than `availableWidth` (which already has the fit\n // margin taken out): this is the real physical space neighboring nodes\n // leave for the label, so auditing against it (rather than against the\n // chip's own self-referential size, which would always trivially pass)\n // actually re-checks the constraint the original bug violated — a label\n // spilling into a neighboring node card.\n const gapWidth = spanLocal * scale\n\n return {\n x,\n y,\n text: fitted.text,\n fontSize: fitted.fontSize,\n chipX: x - chipW / 2,\n chipY: y - chipH / 2,\n chipW,\n chipH,\n boxX: x - gapWidth / 2,\n boxW: gapWidth,\n }\n}\n\n/**\n * 平滑 edge 路径(2026-07-14 用户裁决:流程图连线用曲线不用折线):把\n * dagre 路由的折点用 Catmull-Rom → 三次贝塞尔连成平滑曲线。端点钳制\n * (首/末点重复)使起止切线沿首/末段方向,箭头(用末两点算方向)仍贴合。\n * 共线折点得到的曲线退化为直线(不硬弯),<3 点直连。svg2pptx 支持 C。\n */\nfunction smoothEdgePath(\n points: { x: number; y: number }[],\n sx: number,\n sy: number,\n): string {\n const p = points.map((q) => ({ x: q.x * sx, y: q.y * sy }))\n if (p.length < 3) {\n return p.map((q, j) => `${j === 0 ? \"M\" : \"L\"} ${q.x} ${q.y}`).join(\" \")\n }\n let d = `M ${p[0].x} ${p[0].y}`\n for (let i = 0; i < p.length - 1; i++) {\n const p0 = p[i === 0 ? 0 : i - 1]\n const p1 = p[i]\n const p2 = p[i + 1]\n const p3 = p[i + 2 < p.length ? i + 2 : p.length - 1]\n const c1x = p1.x + (p2.x - p0.x) / 6\n const c1y = p1.y + (p2.y - p0.y) / 6\n const c2x = p2.x - (p3.x - p1.x) / 6\n const c2y = p2.y - (p3.y - p1.y) / 6\n d += ` C ${c1x} ${c1y} ${c2x} ${c2y} ${p2.x} ${p2.y}`\n }\n return d\n}\n\nexport const flowchart: SvgBlock<FlowchartBlock> = {\n measure(block, w) {\n const { layout, scale } = resolveLayout(block, w)\n // Fit within both width and the height cap so the chart never overflows.\n return layout.height * scale\n },\n\n render(block, box, ctx) {\n const { layout, scale } = resolveLayout(block, box.w)\n const scaleX = scale\n const scaleY = scale // uniform scale, bounded by width AND height\n // 宽屏画布下水平居中,避免整图贴左留出大片死白\n const dx = Math.max(0, (box.w - layout.width * scale) / 2)\n\n return (\n <g transform={`translate(${box.x + dx},${box.y})`}>\n {/* Edges: lines + arrowheads only. Labels render in their own layer\n after the nodes (below) so a node card can never cover one. */}\n {layout.edges.map((edge, i) => {\n const d = smoothEdgePath(edge.points, scaleX, scaleY)\n\n return (\n <Fragment key={`e${i}`}>\n <path\n d={d}\n fill=\"none\"\n stroke={ctx.colors.muted}\n strokeWidth={STROKE_W}\n />\n {arrowPolygon(edge.points, scaleX, scaleY, ctx.colors.muted)}\n </Fragment>\n )\n })}\n\n {/* Nodes */}\n {layout.nodes.map((n) => {\n const nx = n.x * scaleX\n const ny = n.y * scaleY\n const nw = n.w * scaleX\n const nh = n.h * scaleY\n // 呼吸感:留白在局部预算(nodeWidth 的 NODE_PAD_X)与渲染预算里\n // 同值同源,并随 scale 缩放——旧实现只扣固定 6px/边,且渲染字号\n // 比预算字号大 1.15×,fitSvgLine 会把文字缩到贴满「盒宽-12px」。\n // diamond 的可用文本宽只有中线附近约 60%。\n const padX = NODE_PAD_X * scaleX\n const usableW = (n.kind === \"diamond\" ? nw * 0.6 : nw) - padX * 2\n // 字号与盒宽预算同源(FONT_SIZE × scale):图缩小时框和字同步小\n //(保底 10),放大时最大 18——不再额外 ×1.15 吃掉预算外的留白。\n const scaledFont = Math.max(10, Math.min(18, Math.round(FONT_SIZE * scale)))\n const fits = n.lines.map((line) =>\n fitSvgLine(line, {\n maxWidth: Math.max(24, usableW),\n fontSize: scaledFont,\n minFontSize: MIN_FONT_SIZE,\n }),\n )\n // 多行共用同一字号(取各行 fit 的最小值):小字号下更短的行天然放得下。\n const sharedFont = Math.min(...fits.map((f) => f.fontSize))\n const pitch = NODE_LINE_PITCH * scaleY\n const firstLineY =\n ny + nh / 2 - ((n.lines.length - 1) * pitch) / 2\n\n return (\n <g\n key={n.id}\n data-audit-box={`${box.x + dx + nx},${box.y + ny},${nw}`}\n >\n {n.kind === \"diamond\" ? (\n <polygon\n points={`${nx + nw / 2},${ny} ${nx + nw},${ny + nh / 2} ${nx + nw / 2},${ny + nh} ${nx},${ny + nh / 2}`}\n fill={ctx.colors.surface}\n stroke={ctx.colors.primary}\n strokeWidth={STROKE_W}\n />\n ) : (\n <rect\n x={nx}\n y={ny}\n width={nw}\n height={nh}\n rx={n.kind === \"round\" ? 20 : 6}\n fill={ctx.colors.surface}\n stroke={ctx.colors.primary}\n strokeWidth={STROKE_W}\n />\n )}\n {fits.map((fitted, i) => (\n <text\n key={i}\n x={nx + nw / 2}\n y={firstLineY + i * pitch}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={sharedFont}\n fill={ctx.colors.text}\n >\n {fitted.text}\n </text>\n ))}\n </g>\n )\n })}\n\n {/* Edge labels: own layer above the nodes, each fit to its gap and\n backed by a small chip so it stays legible whether it lands over\n open space, a crossing line, or (pre-fit, the reported bug) a\n neighboring node card. */}\n {layout.edges.map((edge, i) => {\n const label = computeEdgeLabel(edge, scale)\n if (!label) return null\n return (\n <Fragment key={`l${i}`}>\n {/* `data-audit-box` carries the *gap's* geometry (label.boxX/\n boxW), not the chip's own — the chip is sized from the\n already-fitted text, so auditing text-against-its-own-chip\n would always trivially pass. Auditing against the physical\n gap re-checks the constraint this whole block exists for\n (a label spilling past its gap into a neighboring node\n card), the same way each node's own `data-audit-box` below\n checks its label against the node's real box rather than\n a self-fitted one. Baked in absolute page coordinates\n (box.x + dx + local) to match `svg-audit.ts`'s contract:\n it composes `<text>` coordinates against the accumulated\n ancestor transform, but reads `data-audit-box` values\n literally. */}\n <rect\n data-audit-box={`${box.x + dx + label.boxX},${box.y + label.chipY},${label.boxW}`}\n x={label.chipX}\n y={label.chipY}\n width={label.chipW}\n height={label.chipH}\n rx={LABEL_CHIP_RX}\n fill={ctx.colors.bg}\n />\n <text\n x={label.x}\n y={label.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={label.fontSize}\n fill={ctx.colors.muted}\n >\n {label.text}\n </text>\n </Fragment>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype ArchitectureBlock = Extract<Block, { type: \"architecture\" }>\n\nconst LAYER_H = 72\nconst GAP = 12\nconst TITLE_X = 16\nconst TITLE_FONT_SIZE = 18\nconst ITEMS_FONT_SIZE = 16\nconst TITLE_BASELINE_Y = 42\nconst ITEMS_BASELINE_Y = 44\n/** Approximate width reserved for the title label before items text starts. */\nconst ITEMS_X = 180\nconst SEPARATOR = \" · \"\n/** Right-edge padding matching the 6px padding budget used on the left. */\nconst PAD = 6\nconst MIN_FONT_SIZE = 10\n\nexport const architecture: SvgBlock<ArchitectureBlock> = {\n measure(block) {\n return block.layers.length * (LAYER_H + GAP) - GAP\n },\n render(block, box, ctx) {\n const layerFill = ctx.colors.panel ?? ctx.colors.surface\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.layers.map((layer, i) => {\n const layerY = i * (LAYER_H + GAP)\n const title = fitSvgLine(layer.title, {\n maxWidth: ITEMS_X - TITLE_X - PAD,\n fontSize: TITLE_FONT_SIZE,\n minFontSize: MIN_FONT_SIZE,\n })\n const items = fitSvgLine(layer.items.join(SEPARATOR), {\n maxWidth: box.w - ITEMS_X - PAD,\n fontSize: ITEMS_FONT_SIZE,\n minFontSize: MIN_FONT_SIZE,\n })\n return (\n <g key={i}>\n <rect\n x={0}\n y={layerY}\n width={box.w}\n height={LAYER_H}\n rx={ctx.shape?.radius ?? 6}\n fill={layerFill}\n />\n <text\n x={TITLE_X}\n y={layerY + TITLE_BASELINE_Y}\n fontSize={title.fontSize}\n fontWeight=\"bold\"\n fontFamily={ctx.fonts.heading}\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n <text\n x={ITEMS_X}\n y={layerY + ITEMS_BASELINE_Y}\n fontSize={items.fontSize}\n fontFamily={ctx.fonts.body}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {items.text}\n </text>\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type React from \"react\"\nimport type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport type { BlockBox, BlockCtx, SvgBlock } from \"./types\"\n\ntype TimelineBlock = Extract<Block, { type: \"timeline\" }>\n\nconst AXIS_Y = 100\nconst PAD = 20\n/** Reserved gap on each side of a milestone label before it would collide\n * with its neighbor's label. */\nconst LABEL_GAP = 12\nconst MIN_FONT_SIZE = 10\nconst TITLE_SIZE = 16\nconst DESC_SIZE = 13\nconst TITLE_TOP = AXIS_Y + 28\nconst BOTTOM_PAD = 18\n\ntype Anchor = \"start\" | \"middle\" | \"end\"\n\n/**\n * Per-milestone label 布局(度量与渲染共用)。首/尾节点贴 box 边缘,居中\n * 排布会把宽度压到 2×PAD≈40px(2026-07-09 真机实测首尾 label 竖条化)——\n * 改为首节点左对齐、尾节点右对齐,宽度按邻距算。\n */\nfunction labelPlacement(\n i: number,\n x: number,\n n: number,\n w: number,\n step: number,\n): { maxWidth: number; anchor: Anchor; tx: number } {\n const distToNeighbor = n > 1 ? step - LABEL_GAP : w - 2 * PAD\n if (n > 1 && i === 0) {\n return { maxWidth: Math.max(1, Math.min(distToNeighbor, w - x - PAD)), anchor: \"start\", tx: x - 8 }\n }\n if (n > 1 && i === n - 1) {\n return { maxWidth: Math.max(1, Math.min(distToNeighbor, x - PAD)), anchor: \"end\", tx: x + 8 }\n }\n const distToBoxEdge = 2 * Math.min(x, w - x)\n return { maxWidth: Math.max(1, Math.min(distToBoxEdge, distToNeighbor)), anchor: \"middle\", tx: x }\n}\n\n/**\n * title 2 行 / desc 3 行换行排布(2026-07-09 用户反馈:版面宽却单行截断\n * 加省略号——所有主题共用本块,一处修复全主题生效)。\n */\nfunction milestoneLayout(block: TimelineBlock, w: number) {\n const n = block.milestones.length\n const span = w - 2 * PAD\n const step = n > 1 ? span / (n - 1) : 0\n return block.milestones.map((m, i) => {\n const x = n === 1 ? w / 2 : PAD + i * step\n const { maxWidth, anchor, tx } = labelPlacement(i, x, n, w, step)\n const title = layoutSvgText(m.title, {\n maxWidth,\n fontSize: TITLE_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.25,\n })\n const desc = m.desc\n ? layoutSvgText(m.desc, {\n maxWidth,\n fontSize: DESC_SIZE,\n maxLines: 3,\n lineHeightRatio: 1.3,\n })\n : null\n const titleH = title.lines.length * title.lineHeight\n const descH = desc ? desc.lines.length * desc.lineHeight + 6 : 0\n return { m, x, maxWidth, anchor, tx, title, desc, belowH: 28 + titleH + descH }\n })\n}\n\n// ── 竖排版式(2026-07-11 用户借鉴编辑部竖排时间线):左 date 右对齐、\n// 中轴竖线圆点、右 title/desc,highlight 节点 accent 色 + 大圆点。──\nconst V_DATE_COL_W = 118\nconst V_AXIS_GAP = 26\nconst V_AXIS_X = V_DATE_COL_W + V_AXIS_GAP\nconst V_TEXT_GAP = 30\nconst V_TEXT_X = V_AXIS_X + V_TEXT_GAP\nconst V_TITLE_SIZE = 18\nconst V_DESC_SIZE = 14\nconst V_ROW_GAP = 26\nconst V_TOP_PAD = 8\n\nfunction verticalLayout(block: TimelineBlock, w: number) {\n const textW = Math.max(1, w - V_TEXT_X)\n return block.milestones.map((m) => {\n const title = fitSvgLine(m.title, {\n maxWidth: textW,\n fontSize: V_TITLE_SIZE,\n minFontSize: 13,\n })\n const desc = m.desc\n ? layoutSvgText(m.desc, {\n maxWidth: textW,\n fontSize: V_DESC_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.35,\n })\n : null\n const rowH =\n Math.round(V_TITLE_SIZE * 1.3) +\n (desc ? desc.lines.length * desc.lineHeight + 4 : 0)\n return { m, title, desc, rowH }\n })\n}\n\nfunction renderVertical(\n block: TimelineBlock,\n box: BlockBox,\n ctx: BlockCtx,\n): React.ReactElement {\n const rows = verticalLayout(block, box.w)\n const rowTops: number[] = []\n let cursor = V_TOP_PAD\n for (const r of rows) {\n rowTops.push(cursor)\n cursor += r.rowH + V_ROW_GAP\n }\n const axisTop = rowTops[0] + 8\n const axisBottom = rowTops[rowTops.length - 1] + 8\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {rows.length > 1 && (\n <line\n x1={V_AXIS_X}\n y1={axisTop}\n x2={V_AXIS_X}\n y2={axisBottom}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth={2}\n />\n )}\n {rows.map(({ m, title, desc }, i) => {\n const top = rowTops[i]\n const nodeCy = top + 8\n const hl = Boolean(m.highlight)\n const keyColor = hl ? ctx.colors.accent : ctx.colors.text\n const date = fitSvgLine(m.date, {\n maxWidth: V_DATE_COL_W,\n fontSize: 20,\n minFontSize: MIN_FONT_SIZE,\n })\n return (\n <g key={i}>\n <text\n x={V_DATE_COL_W}\n y={nodeCy + 7}\n textAnchor=\"end\"\n fontSize={date.fontSize}\n fontWeight=\"bold\"\n fill={hl ? ctx.colors.accent : ctx.colors.muted}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {date.text}\n </text>\n <circle\n cx={V_AXIS_X}\n cy={nodeCy}\n r={hl ? 10 : 7}\n fill={hl ? ctx.colors.accent : ctx.colors.primary}\n />\n <text\n x={V_TEXT_X}\n y={nodeCy + 7}\n fontSize={title.fontSize}\n fontWeight=\"bold\"\n fill={keyColor}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {desc\n ? desc.lines.map((line, li) => (\n <text\n key={li}\n x={V_TEXT_X}\n y={nodeCy + 7 + Math.round(V_TITLE_SIZE * 1.3) + li * desc.lineHeight}\n fontSize={desc.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n </g>\n )\n })}\n </g>\n )\n}\n\nexport const timeline: SvgBlock<TimelineBlock> = {\n measure(block, w, _ctx: BlockCtx) {\n if (block.layout === \"vertical\") {\n const rows = verticalLayout(block, w)\n const total = rows.reduce((sum, r) => sum + r.rowH + V_ROW_GAP, V_TOP_PAD)\n return total - V_ROW_GAP + BOTTOM_PAD\n }\n const rows = milestoneLayout(block, w)\n const maxBelow = rows.reduce((mx, r) => Math.max(mx, r.belowH), 48)\n return AXIS_Y + maxBelow + BOTTOM_PAD\n },\n render(block, box, ctx) {\n if (block.layout === \"vertical\") return renderVertical(block, box, ctx)\n const rows = milestoneLayout(block, box.w)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n <line\n x1={PAD}\n y1={AXIS_Y}\n x2={box.w - PAD}\n y2={AXIS_Y}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth={2}\n />\n {rows.map(({ m, x, maxWidth, anchor, tx, title, desc }, i) => {\n const date = fitSvgLine(m.date, {\n maxWidth,\n fontSize: 16,\n minFontSize: MIN_FONT_SIZE,\n })\n const descTop = TITLE_TOP + title.lines.length * title.lineHeight + 2\n return (\n <g key={i}>\n <circle cx={x} cy={AXIS_Y} r={8} fill={ctx.colors.primary} />\n <text\n x={tx}\n y={AXIS_Y - 24}\n textAnchor={anchor}\n fill={ctx.colors.accent}\n fontSize={date.fontSize}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {date.text}\n </text>\n {title.lines.map((line, li) => (\n <text\n key={li}\n x={tx}\n y={TITLE_TOP + li * title.lineHeight}\n textAnchor={anchor}\n fill={ctx.colors.text}\n fontSize={title.fontSize}\n fontWeight=\"bold\"\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {desc\n ? desc.lines.map((line, li) => (\n <text\n key={li}\n x={tx}\n y={descTop + li * desc.lineHeight}\n textAnchor={anchor}\n fill={ctx.colors.muted}\n fontSize={desc.fontSize}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import { Fragment } from \"react\"\nimport type { Block } from \"@/ir\"\nimport { measureTextUnits } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype ComparisonBlock = Extract<Block, { type: \"comparison\" }>\n\nconst ROW = 44\nconst MIN_COL_W = 80\nconst PAD_X = 12\nconst HEADER_FONT_SIZE = 18\nconst CELL_FONT_SIZE = 16\n// 缩字号地板:到 12px 仍放不下才走 truncate(backlog#5 截断策略——\n// 「先缩后截」,全表统一字号避免逐列参差)。12px 两行进 44px 行高都够,\n// 单行居中更无风险。\nconst MIN_FONT_SIZE = 12\n\n/**\n * Build logical columns: [label column, ...data columns].\n * Header titles: first column header is empty (row labels), rest are block.columns.\n */\nfunction headerTitles(block: ComparisonBlock, labelHeader = \"\"): string[] {\n return [labelHeader, ...block.columns]\n}\n\n/**\n * 弱模型首列重复归一化(2026-07-10 无图矩阵真机抓到:consulting 对比表\n * 「维度」值逐行双渲):模型把行标签又抄进 cells[0](cells.length 等于\n * columns.length 而非 columns.length-1)。全部行都命中时判定为该病型:\n * 丢每行 cells[0],columns[0](如「维度」)移作标签列表头。非全行命中\n * 不归一——可能是真实数据巧合,宁可保守。\n */\nfunction dedupeLabelColumn(block: ComparisonBlock): {\n labelHeader: string\n block: ComparisonBlock\n} {\n const dup =\n block.columns.length > 1 &&\n block.rows.length > 0 &&\n block.rows.every(\n (r) =>\n r.cells.length === block.columns.length &&\n (r.cells[0] ?? \"\").trim() === r.label.trim(),\n )\n if (!dup) return { labelHeader: \"\", block }\n return {\n labelHeader: block.columns[0],\n block: {\n ...block,\n columns: block.columns.slice(1),\n rows: block.rows.map((r) => ({ ...r, cells: r.cells.slice(1) })),\n },\n }\n}\n\n/**\n * Gather all text values for a given logical column index.\n * Column 0 = row labels. Column 1..n = cells[i-1].\n */\nfunction columnTexts(block: ComparisonBlock, colIdx: number): string[] {\n if (colIdx === 0) {\n return block.rows.map((r) => r.label)\n }\n return block.rows.map((r) => r.cells[colIdx - 1] ?? \"\")\n}\n\n/**\n * Compute column widths by proportional text-unit weight with a minimum width.\n *\n * For each logical column, measure the max text-unit width across header + all\n * cell values. That gives a \"weight\" per column. Then distribute `totalW` in\n * proportion to those weights, clamping each column to at least `MIN_COL_W`.\n *\n * Returns `{ widths, offsets }` where offsets[i] is the x position of column i.\n */\nfunction computeColumns(\n block: ComparisonBlock,\n totalW: number,\n labelHeader = \"\",\n): { widths: number[]; offsets: number[] } {\n const headers = headerTitles(block, labelHeader)\n const colCount = headers.length\n\n // Measure weight per column\n const weights: number[] = []\n for (let c = 0; c < colCount; c++) {\n const texts = [headers[c], ...columnTexts(block, c)]\n const maxUnits = Math.max(...texts.map(measureTextUnits), 1)\n weights.push(maxUnits)\n }\n\n const totalWeight = weights.reduce((s, w) => s + w, 0)\n\n // Initial proportional allocation\n const raw = weights.map((w) => (totalWeight > 0 ? (w / totalWeight) * totalW : totalW / colCount))\n\n // Enforce minimum width. Clamp small columns up, then redistribute surplus\n // from larger columns proportionally.\n const widths = raw.map((r) => Math.max(r, MIN_COL_W))\n const excess = widths.reduce((s, w) => s + w, 0) - totalW\n if (excess > 0) {\n // Shrink only columns above minimum proportionally\n const shrinkable = widths.filter((w) => w > MIN_COL_W)\n const shrinkTotal = shrinkable.reduce((s, w) => s + w, 0)\n for (let c = 0; c < widths.length; c++) {\n if (widths[c] > MIN_COL_W) {\n widths[c] -= excess * (widths[c] / shrinkTotal)\n widths[c] = Math.max(widths[c], MIN_COL_W)\n }\n }\n }\n\n // Compute cumulative x offsets\n const offsets: number[] = []\n let x = 0\n for (const w of widths) {\n offsets.push(x)\n x += w\n }\n\n return { widths, offsets }\n}\n\n/**\n * Largest font size (clamped to [MIN_FONT_SIZE, base]) at which `text` fits\n * the column's padded width on one line.\n */\nfunction shrinkToFit(text: string, colW: number, base: number): number {\n const units = measureTextUnits(text)\n if (units <= 0) return base\n const avail = colW - PAD_X * 2\n return Math.max(MIN_FONT_SIZE, Math.min(base, Math.floor(avail / units)))\n}\n\n/**\n * Table-wide fitted font size: the minimum per-column `shrinkToFit` across\n * all (text, column) pairs, so every header (or every cell) shares one size\n * instead of shrinking raggedly column by column.\n */\nfunction fittedFontSize(\n pairs: Array<{ text: string; colW: number }>,\n base: number,\n): number {\n return Math.min(base, ...pairs.map(({ text, colW }) => shrinkToFit(text, colW, base)))\n}\n\n/**\n * Truncate text to fit within available pixel width at the given font size.\n * If the rendered text exceeds the column, trim and append \"...\".\n */\nfunction truncate(text: string, colW: number, fontSize: number): string {\n const availableUnits = (colW - PAD_X * 2) / fontSize\n if (measureTextUnits(text) <= availableUnits) return text\n\n const chars = Array.from(text)\n const ellipsis = \"…\"\n const ellipsisUnits = measureTextUnits(ellipsis)\n let result = \"\"\n let units = 0\n\n for (const ch of chars) {\n const chUnits = measureTextUnits(ch)\n if (units + chUnits + ellipsisUnits > availableUnits) break\n result += ch\n units += chUnits\n }\n\n return result + ellipsis\n}\n\nexport const comparison: SvgBlock<ComparisonBlock> = {\n measure(block) {\n return (block.rows.length + 1) * ROW\n },\n\n render(rawBlock, box, ctx) {\n const { labelHeader, block } = dedupeLabelColumn(rawBlock)\n const headers = headerTitles(block, labelHeader)\n const colCount = headers.length\n const { widths, offsets } = computeColumns(block, box.w, labelHeader)\n const borderColor = ctx.colors.border ?? ctx.colors.muted\n const totalRows = block.rows.length + 1 // header + data rows\n\n const headerFontSize = fittedFontSize(\n headers.flatMap((title, c) => (title ? [{ text: title, colW: widths[c] }] : [])),\n HEADER_FONT_SIZE,\n )\n const cellFontSize = fittedFontSize(\n block.rows.flatMap((row) =>\n [row.label, ...row.cells]\n .slice(0, colCount)\n .map((cell, c) => ({ text: cell, colW: widths[c] })),\n ),\n CELL_FONT_SIZE,\n )\n // 基线补偿随字号走(0.35×字号),18/16 时与旧常量 +6 完全一致。\n const headerBaseline = Math.round(headerFontSize * 0.35)\n const cellBaseline = Math.round(cellFontSize * 0.35)\n\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {/* 表头不做任何填充(booktabs 惯例):surface 色带在米色/深色页面上\n 都是一块割裂的色块(2026-07-08 用户复验,全主题中招)。层级由\n 加粗表头文字 + 下方一条正文色重规则线表达,天然融入任意主题底色。 */}\n\n {/* Header texts */}\n {headers.map((title, c) => {\n if (!title) return null\n return (\n <text\n key={`h-${c}`}\n x={offsets[c] + PAD_X}\n y={ROW / 2 + headerBaseline}\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.body}\n fontSize={headerFontSize}\n fontWeight=\"bold\"\n dominantBaseline=\"alphabetic\"\n >\n {truncate(title, widths[c], headerFontSize)}\n </text>\n )\n })}\n\n {/* 规则线三级:表头下重线(2px 正文色,midrule)、数据行间细线\n (1px border)、收尾底线(1px border,bottomrule)。无顶线——\n 表头直接坐在页面底色上。 */}\n <line\n x1={0}\n y1={ROW}\n x2={box.w}\n y2={ROW}\n stroke={ctx.colors.text}\n strokeWidth={2}\n />\n {Array.from({ length: block.rows.length - 1 }, (_, k) => (\n <line\n key={`sep-${k}`}\n x1={0}\n y1={(k + 2) * ROW}\n x2={box.w}\n y2={(k + 2) * ROW}\n stroke={borderColor}\n strokeWidth={1}\n />\n ))}\n <line\n x1={0}\n y1={totalRows * ROW}\n x2={box.w}\n y2={totalRows * ROW}\n stroke={borderColor}\n strokeWidth={1}\n />\n\n\n {/* Data rows */}\n {block.rows.map((row, r) => {\n const rowY = (r + 1) * ROW\n const cells = [row.label, ...row.cells]\n return (\n <Fragment key={`r-${r}`}>\n {cells.map((cell, c) => {\n if (c >= colCount) return null\n return (\n <text\n key={`c-${r}-${c}`}\n x={offsets[c] + PAD_X}\n y={rowY + ROW / 2 + cellBaseline}\n fill={c === 0 ? ctx.colors.muted : ctx.colors.text}\n fontFamily={ctx.fonts.body}\n fontSize={cellFontSize}\n fontWeight={c === 0 ? \"bold\" : \"normal\"}\n dominantBaseline=\"alphabetic\"\n >\n {truncate(cell, widths[c], cellFontSize)}\n </text>\n )\n })}\n </Fragment>\n )\n })}\n </g>\n )\n },\n}\n","import type React from \"react\"\nimport type { Block } from \"@/ir\"\nimport {\n fitSvgLine,\n layoutSvgText,\n truncateToUnits,\n} from \"../../lib/svg-text-layout\"\nimport { Icon } from \"../icons\"\nimport type { BlockBox, BlockCtx, SvgBlock } from \"./types\"\n\ntype IconCardsBlock = Extract<Block, { type: \"icon_cards\" }>\n/** A single `icon_cards` item, keyed off the schema so `icon` stays in sync\n * — same technique as `bento-layout.ts`'s `KpiItem`. */\nexport type IconCardItem = IconCardsBlock[\"items\"][number]\n\nconst GAP = 16\n\nconst ICON_SIZE = 24\nconst GAP_ICON_TITLE = 12\nconst TITLE_FONT_SIZE = 20\nconst TITLE_MIN_FONT_SIZE = 14\n// Matches callout.tsx/bullets.tsx's own line-height convention for\n// body-weight text (`LINE_RATIO` / the 1.4 used in `layoutItems`) — title\n// never wraps (`fitSvgLine` only shrinks/truncates a single line), so this\n// is a fixed \"line box\" height reserved for it, not a measured value.\n// `titleLineHeight` is derived from this ratio at each call site (default\n// TITLE_FONT_SIZE * 1.4 = 28, unless a caller's `titleFontSize` opt overrides\n// it — see `IconCardLayoutOptions`), not hoisted to its own module constant.\nconst TITLE_LINE_HEIGHT_RATIO = 1.4\nconst GAP_TITLE_TEXT = 8\nconst TEXT_FONT_SIZE = 15\n// 15 * 1.4 = 21, matching the brief's stated line height for the 2-line\n// description text.\nconst TEXT_LINE_HEIGHT_RATIO = 1.4\nconst TEXT_MAX_LINES = 2\n\n// This file's own row-layout padding — used both by `measure`/`render` below\n// to inset the standalone (non-bento) card. `templates/tech.tsx` uses\n// its *own* BENTO_CARD_PAD/TOP_PAD/BOTTOM_PAD constants instead when it\n// explodes an `icon_cards` item into a bento tile (same split as\n// `kpi.tsx` vs. bento's own `renderKpiCardBody` padding).\nconst PAD_X = 24\nconst PAD_TOP = 20\nconst PAD_BOTTOM = 20\n\nconst ACCENT_W = 32\nconst ACCENT_H = 3\nconst CARD_RADIUS = 8\n\ninterface IconCardTextLayout {\n title: { text: string; fontSize: number }\n text: { lines: string[]; fontSize: number; lineHeight: number }\n}\n\n/**\n * Bento-only injection point (tech.tsx's `BENTO_ICON_CARD_TITLE_SIZE`):\n * lets a caller bump the title's *requested* font size without touching this\n * file's own `TITLE_FONT_SIZE` module constant, which `iconCards.render`'s\n * standalone row-card layout (used by the other 5 themes) still reads\n * directly and must stay byte-identical to. Omitted (`undefined`) falls back\n * to `TITLE_FONT_SIZE` everywhere below, so every existing call site is\n * unaffected.\n */\ninterface IconCardLayoutOptions {\n titleFontSize?: number\n /** 图标尺寸覆盖(tech bento 卡传更大值增强存在感),缺省共享 ICON_SIZE。 */\n iconSize?: number\n}\n\nfunction layoutIconCard(\n item: IconCardItem,\n contentW: number,\n opts: IconCardLayoutOptions = {}\n): IconCardTextLayout {\n const titleFontSize = opts.titleFontSize ?? TITLE_FONT_SIZE\n const title = fitSvgLine(item.title, {\n maxWidth: contentW,\n fontSize: titleFontSize,\n minFontSize: TITLE_MIN_FONT_SIZE,\n })\n const wrapped = layoutSvgText(item.text, {\n maxWidth: contentW,\n fontSize: TEXT_FONT_SIZE,\n maxLines: TEXT_MAX_LINES,\n lineHeightRatio: TEXT_LINE_HEIGHT_RATIO,\n })\n // `layoutSvgText` shrinks its returned font size so the *widest wrapped*\n // line fits `contentW`, but that shrink floors at 1px (its own\n // `Math.max(1, ...)`). Text long enough that the post-`maxLines` merged\n // tail line still exceeds `contentW` even at 1px/unit comes back unfit —\n // truncate defensively at the fitted size, the same floor-size fallback\n // bullets.tsx applies locally.\n const maxUnits = contentW / wrapped.fontSize\n const text = {\n ...wrapped,\n lines: wrapped.lines.map((line) => truncateToUnits(line, maxUnits)),\n }\n return { title, text }\n}\n\n/**\n * Pure content height (icon + gaps + title's single line + text's 1-2\n * lines) — deliberately excludes any padding, so a caller with its own\n * padding convention (this file's PAD_TOP/PAD_BOTTOM, or tech.tsx's\n * BENTO_CARD_TOP_PAD/BOTTOM_PAD) can subtract its own budget and compare,\n * exactly mirroring `kpi.tsx`/tech.tsx's `kpiContentHeight` split.\n */\nexport function iconCardContentHeight(\n item: IconCardItem,\n contentW: number,\n opts: IconCardLayoutOptions = {}\n): number {\n const titleFontSize = opts.titleFontSize ?? TITLE_FONT_SIZE\n const iconSize = opts.iconSize ?? ICON_SIZE\n const titleLineHeight = Math.round(titleFontSize * TITLE_LINE_HEIGHT_RATIO)\n const { text } = layoutIconCard(item, contentW, opts)\n return (\n iconSize +\n GAP_ICON_TITLE +\n titleLineHeight +\n GAP_TITLE_TEXT +\n text.lines.length * text.lineHeight\n )\n}\n\n/**\n * Render one card's icon/title/text inside `box` — `box` is already the\n * *padded content area* (its top-left is where the icon starts, its width is\n * the text-wrap budget). Does not paint the card shell or accent bar —\n * callers compose those separately (this file's `iconCards.render` paints a\n * single-accent shell; `templates/tech.tsx`'s exploded tiles paint\n * their own outline shell instead), mirroring `renderKpiCardBody`'s\n * content-only contract in tech.tsx.\n */\nexport function renderIconCardBody(\n item: IconCardItem,\n box: BlockBox,\n ctx: BlockCtx,\n opts: IconCardLayoutOptions = {}\n): React.ReactElement {\n const titleFontSize = opts.titleFontSize ?? TITLE_FONT_SIZE\n const iconSize = opts.iconSize ?? ICON_SIZE\n const titleLineHeight = Math.round(titleFontSize * TITLE_LINE_HEIGHT_RATIO)\n const { title, text } = layoutIconCard(item, box.w, opts)\n const titleTopY = box.y + iconSize + GAP_ICON_TITLE\n const titleBaselineY = titleTopY + titleFontSize\n const textTopY = titleTopY + titleLineHeight + GAP_TITLE_TEXT\n return (\n <>\n <Icon\n name={item.icon}\n x={box.x}\n y={box.y}\n size={iconSize}\n color={ctx.colors.primary}\n />\n <text\n x={box.x}\n y={titleBaselineY}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {text.lines.map((line, li) => (\n <text\n key={li}\n x={box.x}\n y={textTopY + li * text.lineHeight + text.fontSize}\n fontSize={text.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </>\n )\n}\n\nfunction cardGeometry(block: IconCardsBlock, w: number) {\n const n = block.items.length\n // 2-4 项单行 n 列,5-6 项 2 行 3 列宫格(2026-07-11 用户借鉴 6 宫格)\n const cols = n <= 4 ? n : 3\n const rows = Math.ceil(n / cols)\n const cardW = (w - GAP * (cols - 1)) / cols\n const contentW = cardW - PAD_X * 2\n const cardH = Math.max(\n ...block.items.map(\n (item) => PAD_TOP + iconCardContentHeight(item, contentW) + PAD_BOTTOM\n )\n )\n return { cols, rows, cardW, contentW, cardH }\n}\n\nexport const iconCards: SvgBlock<IconCardsBlock> = {\n measure(block, w) {\n const { rows, cardH } = cardGeometry(block, w)\n return rows * cardH + (rows - 1) * GAP\n },\n render(block, box, ctx) {\n const { cols, rows, cardW, contentW, cardH } = cardGeometry(block, box.w)\n // 密度拉伸(box.h 由布局分配):每行卡壳均分增量,内容组垂直居中\n const measuredH = rows * cardH + (rows - 1) * GAP\n const perRowGrow = Math.max(0, ((box.h ?? measuredH) - measuredH) / rows)\n const shellH = cardH + perRowGrow\n const contentShift = perRowGrow / 2\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.map((item, i) => {\n const cardX = (i % cols) * (cardW + GAP)\n const cardY = Math.floor(i / cols) * (shellH + GAP)\n return (\n <g key={i} data-audit-box={`${box.x + cardX},${box.y + cardY},${cardW}`}>\n <rect\n x={cardX}\n y={cardY}\n width={cardW}\n height={shellH}\n rx={ctx.shape?.radius ?? CARD_RADIUS}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke\n ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 }\n : {})}\n />\n <rect\n x={cardX + PAD_X}\n y={cardY}\n width={ACCENT_W}\n height={ACCENT_H}\n rx={1.5}\n fill={ctx.colors.accent}\n />\n {renderIconCardBody(\n item,\n { x: cardX + PAD_X, y: cardY + PAD_TOP + contentShift, w: contentW },\n ctx\n )}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype NumberedCardsBlock = Extract<Block, { type: \"numbered_cards\" }>\n\n/**\n * 编号网格列表(2026-07-11 用户借鉴编辑部大数字目录页):自动编号\n * 01..N,无卡壳设计——每格左缘细竖线 + accent 大编号 + title 粗体 +\n * text/sub 两级描述。≤4 项单行 n 列,5-8 项两行 ceil(n/2) 列。\n */\nconst COL_GAP = 28\nconst ROW_GAP = 36\nconst INDENT = 22\nconst NUM_SIZE = 34\nconst TITLE_SIZE = 18\nconst TEXT_SIZE = 14\nconst SUB_SIZE = 12.5\nconst NUM_BLOCK_H = 48\nconst TITLE_BLOCK_H = 30\nconst CELL_PAD_BOTTOM = 8\n\nfunction grid(block: NumberedCardsBlock, w: number) {\n const n = block.items.length\n const cols = n <= 4 ? n : Math.ceil(n / 2)\n const rows = n <= 4 ? 1 : 2\n const cellW = (w - COL_GAP * (cols - 1)) / cols\n const contentW = cellW - INDENT\n return { n, cols, rows, cellW, contentW }\n}\n\nfunction cellLayout(\n item: NumberedCardsBlock[\"items\"][number],\n contentW: number,\n) {\n const title = fitSvgLine(item.title, {\n maxWidth: contentW,\n fontSize: TITLE_SIZE,\n minFontSize: 13,\n })\n const text = item.text\n ? layoutSvgText(item.text, {\n maxWidth: contentW,\n fontSize: TEXT_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.35,\n })\n : null\n const sub = item.sub\n ? fitSvgLine(item.sub, { maxWidth: contentW, fontSize: SUB_SIZE, minFontSize: 10 })\n : null\n const h =\n NUM_BLOCK_H +\n TITLE_BLOCK_H +\n (text ? text.lines.length * text.lineHeight + 4 : 0) +\n (sub ? Math.round(SUB_SIZE * 1.5) : 0) +\n CELL_PAD_BOTTOM\n return { title, text, sub, h }\n}\n\nfunction rowHeights(block: NumberedCardsBlock, w: number, _ctx: BlockCtx) {\n const { cols, rows, contentW } = grid(block, w)\n const heights: number[] = []\n for (let r = 0; r < rows; r++) {\n const rowItems = block.items.slice(r * cols, (r + 1) * cols)\n heights.push(Math.max(...rowItems.map((it) => cellLayout(it, contentW).h)))\n }\n return heights\n}\n\nexport const numberedCards: SvgBlock<NumberedCardsBlock> = {\n measure(block, w, ctx) {\n const heights = rowHeights(block, w, ctx)\n return heights.reduce((sum, h) => sum + h, 0) + (heights.length - 1) * ROW_GAP\n },\n render(block, box, ctx) {\n const { cols, contentW, cellW } = grid(block, box.w)\n const heights = rowHeights(block, box.w, ctx)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.map((item, i) => {\n const row = Math.floor(i / cols)\n const col = i % cols\n const cellX = col * (cellW + COL_GAP)\n const cellY = heights.slice(0, row).reduce((s, h) => s + h + ROW_GAP, 0)\n const cellH = heights[row]\n const { title, text, sub } = cellLayout(item, contentW)\n const num = String(i + 1).padStart(2, \"0\")\n const numBaseline = cellY + NUM_SIZE\n const titleBaseline = cellY + NUM_BLOCK_H + TITLE_SIZE\n const textTop = cellY + NUM_BLOCK_H + TITLE_BLOCK_H\n return (\n <g key={i}>\n {/* 左缘细竖线(贯穿格高) */}\n <line\n x1={cellX + 1}\n y1={cellY + 4}\n x2={cellX + 1}\n y2={cellY + cellH - CELL_PAD_BOTTOM}\n stroke={ctx.colors.accent}\n strokeWidth={2}\n opacity={0.65}\n />\n <text\n x={cellX + INDENT}\n y={numBaseline}\n fontSize={NUM_SIZE}\n fontWeight=\"bold\"\n fontStyle=\"italic\"\n fill={ctx.colors.accent}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {num}\n </text>\n <text\n x={cellX + INDENT}\n y={titleBaseline}\n fontSize={title.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {text\n ? text.lines.map((line, li) => (\n <text\n key={li}\n x={cellX + INDENT}\n y={textTop + (li + 1) * text.lineHeight}\n fontSize={text.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n {sub ? (\n <text\n x={cellX + INDENT}\n y={\n textTop +\n (text ? text.lines.length * text.lineHeight + 4 : 0) +\n Math.round(SUB_SIZE * 1.4)\n }\n fontSize={sub.fontSize}\n fill={ctx.colors.muted}\n opacity={0.75}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {sub.text}\n </text>\n ) : null}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype RingsBlock = Extract<Block, { type: \"rings\" }>\n\n/**\n * 分层同心圆环(洋葱模型,2026-07-11 用户借鉴 CMT 体系页):items 从内核\n * 到外层。圆环组靠左(内核实心 primary、外环递淡 fill + 细描边),每层\n * 从环缘拉引线到右侧标注列(label 粗体 + desc muted)。全部 circle/path/\n * text 原语,导出安全。\n */\nconst H_PER_RING: Record<number, number> = { 2: 300, 3: 340, 4: 380 }\nconst PAD = 10\nconst LABEL_GAP = 40\nconst DESC_SIZE = 13.5\nconst LABEL_SIZE = 17\n\nfunction geometry(block: RingsBlock, w: number) {\n const n = block.items.length\n const h = H_PER_RING[n] ?? 340\n const maxR = h / 2 - PAD\n const cx = maxR + PAD\n const cy = h / 2\n const coreR = maxR * 0.36\n const ringStep = n > 1 ? (maxR - coreR) / (n - 1) : 0\n const radii = block.items.map((_, i) => coreR + i * ringStep)\n const textX = cx + maxR + LABEL_GAP\n const textW = Math.max(1, w - textX)\n return { n, h, maxR, cx, cy, radii, textX, textW }\n}\n\nexport const rings: SvgBlock<RingsBlock> = {\n measure(block, _w) {\n return geometry(block, _w).h\n },\n render(block, box, ctx) {\n const { n, cx, cy, radii, textX, textW, h } = geometry(block, box.w)\n // 标注行从上往下 = 外层环到内核(外环在页面上方更外侧,读序自然)\n const rowStep = n > 1 ? (h - 2 * PAD - 56) / (n - 1) : 0\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {/* 外层环先画(从外到内叠放,内核最后盖顶) */}\n {[...block.items.keys()].reverse().map((idx) => {\n const r = radii[idx]\n if (idx === 0) {\n return <circle key={idx} cx={cx} cy={cy} r={r} fill={ctx.colors.primary} />\n }\n return (\n <circle\n key={idx}\n cx={cx}\n cy={cy}\n r={r}\n fill={ctx.colors.primary}\n fillOpacity={idx === 1 ? 0.14 : idx === 2 ? 0.08 : 0.05}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth={1}\n />\n )\n })}\n {/* 内核 label 圆心居中 */}\n {(() => {\n const core = block.items[0]\n const fitted = fitSvgLine(core.label, {\n maxWidth: radii[0] * 1.7,\n fontSize: 18,\n minFontSize: 12,\n })\n return (\n <text\n x={cx}\n y={cy + fitted.fontSize * 0.35}\n textAnchor=\"middle\"\n fontSize={fitted.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.surface}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {fitted.text}\n </text>\n )\n })()}\n {/* 引线 + 右侧标注列:行序 = 外层在上、内核在下 */}\n {block.items.map((item, idx) => {\n const rowIdx = n - 1 - idx\n const rowY = PAD + 28 + rowIdx * rowStep\n const r = radii[idx]\n // 引线起点:环缘上朝各自标注行方向的点(行在圆上方 → 起点取\n // 环右上缘,行在下方 → 右下缘),线最短且互不交叉\n const angle = Math.atan2(rowY - 5 - cy, textX - 18 - cx)\n const sx = cx + r * Math.cos(angle)\n const sy = cy + r * Math.sin(angle)\n const label = fitSvgLine(item.label, {\n maxWidth: textW,\n fontSize: LABEL_SIZE,\n minFontSize: 13,\n })\n const desc = item.desc\n ? layoutSvgText(item.desc, {\n maxWidth: textW,\n fontSize: DESC_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.35,\n })\n : null\n return (\n <g key={idx}>\n <path\n d={`M ${sx.toFixed(1)} ${sy.toFixed(1)} L ${textX - 18} ${rowY - 5} H ${textX - 8}`}\n fill=\"none\"\n stroke={ctx.colors.muted}\n strokeWidth={1}\n opacity={0.6}\n />\n <circle cx={sx} cy={sy} r={3} fill={idx === 0 ? ctx.colors.primary : ctx.colors.accent} />\n <text\n x={textX}\n y={rowY}\n fontSize={label.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {label.text}\n </text>\n {desc\n ? desc.lines.map((line, li) => (\n <text\n key={li}\n x={textX}\n y={rowY + 8 + (li + 1) * desc.lineHeight}\n fontSize={desc.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { Icon } from \"../icons\"\nimport type { SvgBlock } from \"./types\"\n\ntype RowCardsBlock = Extract<Block, { type: \"row_cards\" }>\n\n/**\n * 全宽横向长卡列表(2026-07-11 用户借鉴学术贡献一览页):每项一张全宽\n * 卡——左编号圆圈 + 可选图标 + 标题 + 主/次两级描述,highlight 项 accent\n * 描边强调。3-6 项纵向堆叠,适合每项信息量较大的枚举(成果一览/贡献\n * 清单/议题列表)。可拉伸(box.h 均分给各卡,内容居中)。\n */\nconst CARD_GAP = 14\nconst PAD_Y = 16\nconst NUM_CX = 46\nconst NUM_R = 19\nconst TEXT_X = 88\nconst TITLE_SIZE = 19\nconst TEXT_SIZE = 15\nconst SUB_SIZE = 13.5\nconst TITLE_LH = 26\nconst ICON_SIZE = 20\n\nfunction cardLayout(item: RowCardsBlock[\"items\"][number], w: number) {\n const contentW = Math.max(1, w - TEXT_X - 24)\n const titleW = item.icon ? contentW - ICON_SIZE - 10 : contentW\n const title = fitSvgLine(item.title, {\n maxWidth: titleW,\n fontSize: TITLE_SIZE,\n minFontSize: 14,\n })\n const text = item.text\n ? layoutSvgText(item.text, {\n maxWidth: contentW,\n fontSize: TEXT_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.4,\n })\n : null\n const sub = item.sub\n ? fitSvgLine(item.sub, { maxWidth: contentW, fontSize: SUB_SIZE, minFontSize: 10 })\n : null\n const contentH =\n TITLE_LH +\n (text ? text.lines.length * text.lineHeight + 2 : 0) +\n (sub ? Math.round(SUB_SIZE * 1.5) : 0)\n const cardH = PAD_Y * 2 + Math.max(NUM_R * 2, contentH)\n return { title, text, sub, contentH, cardH }\n}\n\nexport const rowCards: SvgBlock<RowCardsBlock> = {\n measure(block, w) {\n return (\n block.items.reduce((sum, item) => sum + cardLayout(item, w).cardH, 0) +\n (block.items.length - 1) * CARD_GAP\n )\n },\n render(block, box, ctx) {\n const layouts = block.items.map((item) => cardLayout(item, box.w))\n const measuredH =\n layouts.reduce((s, l) => s + l.cardH, 0) + (layouts.length - 1) * CARD_GAP\n // 密度拉伸:box.h 增量均分给各卡,内容组卡内垂直居中\n const perCardGrow = Math.max(0, ((box.h ?? measuredH) - measuredH) / layouts.length)\n // 截断预算(box.h < 测量高,layoutContentFit 单块超高兜底):只画放\n // 得下的卡,尾部自画「+N 项未展示」——存量超预算 deck 不再画出页外。\n const truncBudget =\n box.h != null && box.h < measuredH ? box.h - 20 : Number.POSITIVE_INFINITY\n let visible = block.items.length\n if (truncBudget !== Number.POSITIVE_INFINITY) {\n let acc = 0\n visible = 0\n for (const l of layouts) {\n const next = acc + (visible > 0 ? CARD_GAP : 0) + l.cardH\n if (next > truncBudget) break\n acc = next\n visible++\n }\n visible = Math.max(1, visible)\n }\n const hidden = block.items.length - visible\n let cursor = 0\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.slice(0, visible).map((item, i) => {\n const { title, text, sub, contentH, cardH } = layouts[i]\n const shellH = cardH + perCardGrow\n const cardY = cursor\n cursor += shellH + CARD_GAP\n const hl = Boolean(item.highlight)\n const contentTop = cardY + (shellH - contentH) / 2\n const numCy = cardY + shellH / 2\n const titleBaseline = contentTop + TITLE_SIZE\n const textTop = contentTop + TITLE_LH\n return (\n <g key={i} data-audit-box={`${box.x},${box.y + cardY},${box.w}`}>\n <rect\n x={0}\n y={cardY}\n width={box.w}\n height={shellH}\n rx={ctx.shape?.radius ?? 8}\n fill={ctx.colors.surface}\n stroke={hl ? ctx.colors.accent : (ctx.colors.cardStroke ?? \"none\")}\n strokeWidth={hl ? 1.5 : 1}\n />\n <circle\n cx={NUM_CX}\n cy={numCy}\n r={NUM_R}\n fill=\"none\"\n stroke={hl ? ctx.colors.accent : ctx.colors.muted}\n strokeWidth={1.5}\n />\n <text\n x={NUM_CX}\n y={numCy + 6}\n textAnchor=\"middle\"\n fontSize={16}\n fontWeight=\"bold\"\n fill={hl ? ctx.colors.accent : ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {i + 1}\n </text>\n {item.icon && (\n <Icon\n name={item.icon}\n x={TEXT_X}\n y={titleBaseline - ICON_SIZE + 3}\n size={ICON_SIZE}\n color={ctx.colors.accent}\n />\n )}\n <text\n x={item.icon ? TEXT_X + ICON_SIZE + 10 : TEXT_X}\n y={titleBaseline}\n fontSize={title.fontSize}\n fontWeight=\"bold\"\n fill={hl ? ctx.colors.accent : ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {text\n ? text.lines.map((line, li) => (\n <text\n key={li}\n x={TEXT_X}\n y={textTop + (li + 1) * text.lineHeight - 4}\n fontSize={text.fontSize}\n fill={ctx.colors.text}\n fillOpacity={0.85}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n {sub ? (\n <text\n x={TEXT_X}\n y={\n textTop +\n (text ? text.lines.length * text.lineHeight + 2 : 0) +\n Math.round(SUB_SIZE * 1.3)\n }\n fontSize={sub.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {sub.text}\n </text>\n ) : null}\n </g>\n )\n })}\n {hidden > 0 && (\n <text\n x={box.w}\n y={cursor + 14}\n textAnchor=\"end\"\n fontSize={13}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${hidden} 项未展示`}\n </text>\n )}\n </g>\n )\n },\n}\n","import type React from \"react\"\nimport type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText, truncateToUnits } from \"../../lib/svg-text-layout\"\nimport type { BlockBox, BlockCtx, SvgBlock } from \"./types\"\n\ntype StepsBlock = Extract<Block, { type: \"steps\" }>\ntype StepItem = StepsBlock[\"items\"][number]\n\n/* ── Horizontal (default) mode constants ──\n * Card shell (surface fill, rx 8) is the same family as icon-cards.tsx's\n * card — see that file's own PAD_X/CARD_RADIUS comment for the split\n * rationale (this file's own row-layout padding vs. tech.tsx's own\n * padding convention when a block is dropped into a bento cell, which does\n * NOT happen for `steps` — see the \"not exploded\" note on the block dispatch\n * side, `bento-layout.ts`'s `explodeIntoUnits` default path).\n */\nconst PAD_X = 24\nconst PAD_TOP = 24\nconst PAD_BOTTOM = 20\nconst CARD_RADIUS = 8\n// Gap between cards — doubles as the \"arrow corridor\" the connecting\n// line+triangle is centered in, and as the per-item width budget in the\n// vertical-degrade threshold check below.\nconst GAP = 40\n\nconst BADGE_R = 14\nconst BADGE_BAND = BADGE_R * 2 // 28 — vertical space the badge occupies\nconst BADGE_FONT_SIZE = 16\n// Same \"pivotY + round(fontSize * 0.32)\" single-line vertical-centering trick\n// as academic.tsx's rail badge (see that file's BASELINE_FUDGE_RATIO\n// comment) — lands the digit's baseline visually centered on the badge's cy.\nconst BASELINE_FUDGE_RATIO = 0.32\n// Gap between the badge band and the title (horizontal mode, vertical\n// spacing) — reused as the *horizontal* gap between the badge column and the\n// text column in vertical mode (badge right edge at PAD_X + BADGE_BAND = 52,\n// + 12 = 64 = vertical mode's TEXT_X_VERTICAL below).\nconst GAP_BADGE_TITLE = 12\n\nconst TITLE_FONT_SIZE = 18\nconst TITLE_MIN_FONT_SIZE = 13\n// Same fixed \"line box\" convention as icon-cards.tsx's own TITLE_LINE_HEIGHT\n// (title never wraps — fitSvgLine only shrinks/truncates a single line — so\n// this is a reserved box height, not a measured value).\nconst TITLE_LINE_HEIGHT_RATIO = 1.4\nconst TITLE_LINE_HEIGHT = Math.round(TITLE_FONT_SIZE * TITLE_LINE_HEIGHT_RATIO) // 25\nconst GAP_TITLE_TEXT = 8\n\nconst TEXT_FONT_SIZE = 14\nconst TEXT_MAX_LINES = 2\nconst TEXT_LINE_HEIGHT_RATIO = 1.4\n\n/* ── Vertical (degrade) mode constants ── */\n// Narrowest a horizontal card may get before this block switches to a\n// left-badge-column + full-width-text vertical stack instead.\nconst MIN_CARD_W = 180\n// Horizontal gap between the badge column and the text column, vertical\n// mode: badge bounding-box right edge (PAD_X + BADGE_BAND = 52) + the same\n// GAP_BADGE_TITLE(12) reused from horizontal mode = 64.\nconst TEXT_X_VERTICAL = PAD_X + BADGE_BAND + GAP_BADGE_TITLE // 64\nconst GAP_TITLE_TEXT_VERTICAL = 24\nconst ROW_GAP = 16\n\nconst ARROW_LEN = 24\nconst ARROW_HEAD_LEN = 8\nconst ARROW_HEAD_HALF_H = 4\nconst ARROW_STROKE_W = 1.5\nconst CONNECTOR_STROKE_W = 1.5\n\ninterface StepItemTextLayout {\n title: { text: string; fontSize: number }\n text: { lines: string[]; fontSize: number; lineHeight: number }\n}\n\n/** Fit an item's title (single line, shrink-to-fit) and text (up to 2 lines)\n * within `contentW` — shared by both horizontal (per-card) and vertical\n * (per-row) modes, same technique as icon-cards.tsx's `layoutIconCard`\n * (including that file's defensive post-wrap truncation — see the comment\n * there: `layoutSvgText`'s own font-shrink floors at 1px, which text long\n * enough can still overflow `contentW` at). */\nfunction layoutStepItem(item: StepItem, contentW: number): StepItemTextLayout {\n const title = fitSvgLine(item.title, {\n maxWidth: contentW,\n fontSize: TITLE_FONT_SIZE,\n minFontSize: TITLE_MIN_FONT_SIZE,\n })\n const wrapped = layoutSvgText(item.text, {\n maxWidth: contentW,\n fontSize: TEXT_FONT_SIZE,\n maxLines: TEXT_MAX_LINES,\n lineHeightRatio: TEXT_LINE_HEIGHT_RATIO,\n })\n const maxUnits = contentW / wrapped.fontSize\n const text = {\n ...wrapped,\n lines: wrapped.lines.map((line) => truncateToUnits(line, maxUnits)),\n }\n return { title, text }\n}\n\n/** Numbered badge (circle, primary fill, white centered digit) shared by\n * both modes — `cx`/`cy` are the caller's already-resolved badge center. */\nfunction renderBadge(cx: number, cy: number, n: number, ctx: BlockCtx): React.ReactElement {\n return (\n <>\n <circle cx={cx} cy={cy} r={BADGE_R} fill={ctx.colors.primary} />\n <text\n x={cx}\n y={cy + Math.round(BADGE_FONT_SIZE * BASELINE_FUDGE_RATIO)}\n textAnchor=\"middle\"\n fontSize={BADGE_FONT_SIZE}\n fontWeight=\"700\"\n fill=\"#FFFFFF\"\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {n}\n </text>\n </>\n )\n}\n\n/* ── Horizontal mode ── */\n\n/** Pure content height (badge band + gaps + title's line + text's 1-2 lines)\n * — excludes PAD_TOP/PAD_BOTTOM, mirroring icon-cards.tsx's\n * `iconCardContentHeight` split (a caller with its own padding convention\n * subtracts its own budget and compares). */\nfunction stepContentHeight(item: StepItem, contentW: number): number {\n const { text } = layoutStepItem(item, contentW)\n return (\n BADGE_BAND +\n GAP_BADGE_TITLE +\n TITLE_LINE_HEIGHT +\n GAP_TITLE_TEXT +\n text.lines.length * text.lineHeight\n )\n}\n\n/** Render one card's badge/title/text inside `box` — `box` is already the\n * padded content area (top-left is where the badge band starts, width is\n * the text-wrap budget), mirroring icon-cards.tsx's `renderIconCardBody`\n * contract. Does not paint the card shell. */\nfunction renderStepCardBody(\n item: StepItem,\n index: number,\n box: BlockBox,\n ctx: BlockCtx,\n): React.ReactElement {\n const { title, text } = layoutStepItem(item, box.w)\n const badgeCx = box.x + BADGE_R\n const badgeCy = box.y + BADGE_R\n const titleTopY = box.y + BADGE_BAND + GAP_BADGE_TITLE\n const titleBaselineY = titleTopY + TITLE_FONT_SIZE\n const textTopY = titleTopY + TITLE_LINE_HEIGHT + GAP_TITLE_TEXT\n return (\n <>\n {renderBadge(badgeCx, badgeCy, index + 1, ctx)}\n <text\n x={box.x}\n y={titleBaselineY}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {text.lines.map((line, li) => (\n <text\n key={li}\n x={box.x}\n y={textTopY + li * text.lineHeight + text.fontSize}\n fontSize={text.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </>\n )\n}\n\nfunction cardGeometry(block: StepsBlock, w: number) {\n const n = block.items.length\n const cardW = (w - GAP * (n - 1)) / n\n const contentW = cardW - PAD_X * 2\n const cardH = Math.max(\n ...block.items.map((item) => PAD_TOP + stepContentHeight(item, contentW) + PAD_BOTTOM),\n )\n return { cardW, contentW, cardH }\n}\n\n/** A horizontal-line + solid-triangle arrow, `ARROW_LEN` px long, `x` is its\n * left (tail) end and `y` its vertical center. */\nfunction renderArrow(x: number, y: number, color: string): React.ReactElement {\n const tipX = x + ARROW_LEN\n const baseX = tipX - ARROW_HEAD_LEN\n return (\n <>\n <line x1={x} y1={y} x2={baseX} y2={y} stroke={color} strokeWidth={ARROW_STROKE_W} />\n <polygon\n points={`${tipX},${y} ${baseX},${y - ARROW_HEAD_HALF_H} ${baseX},${y + ARROW_HEAD_HALF_H}`}\n fill={color}\n />\n </>\n )\n}\n\n/* ── Vertical mode ──\n * Triggers when even the narrowest allowed horizontal card (MIN_CARD_W=180)\n * wouldn't fit — items×180 + (items-1)×GAP > w. Badges form a left column\n * (x=24, same PAD_X as horizontal mode) connected by thin vertical lines;\n * title+text move to a full-width column starting after the badge (x=64).\n */\nfunction needsVerticalLayout(n: number, w: number): boolean {\n return n * MIN_CARD_W + (n - 1) * GAP > w\n}\n\n/** Row height (title + gap + tallest text) shared by all rows — mirrors\n * horizontal mode's \"tallest card wins\" convention (`cardGeometry`'s\n * `Math.max`), applied to rows instead of cards. */\nfunction verticalRowGeometry(block: StepsBlock, w: number) {\n const contentW = Math.max(1, w - TEXT_X_VERTICAL)\n const rowH =\n Math.max(\n ...block.items.map((item) => {\n const { text } = layoutStepItem(item, contentW)\n return TITLE_LINE_HEIGHT + GAP_TITLE_TEXT_VERTICAL + text.lines.length * text.lineHeight\n }),\n ) + ROW_GAP\n return { contentW, rowH }\n}\n\nfunction renderVertical(block: StepsBlock, box: BlockBox, ctx: BlockCtx): React.ReactElement {\n const { contentW, rowH } = verticalRowGeometry(block, box.w)\n const badgeCx = PAD_X + BADGE_R\n const badgeCy = (i: number) => i * rowH + TITLE_LINE_HEIGHT / 2\n\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {/* Connecting lines drawn first so each badge layers on top of the\n line ends, same ordering as timeline.tsx's axis-then-milestones. */}\n {block.items.slice(1).map((_, i) => (\n <line\n key={`connector-${i}`}\n x1={badgeCx}\n y1={badgeCy(i)}\n x2={badgeCx}\n y2={badgeCy(i + 1)}\n stroke={ctx.colors.muted}\n strokeWidth={CONNECTOR_STROKE_W}\n />\n ))}\n {block.items.map((item, i) => {\n const rowTop = i * rowH\n const { title, text } = layoutStepItem(item, contentW)\n const titleBaselineY = rowTop + TITLE_FONT_SIZE\n const textTopY = rowTop + TITLE_LINE_HEIGHT + GAP_TITLE_TEXT_VERTICAL\n return (\n <g key={i} data-audit-box={`${box.x},${box.y + rowTop},${box.w}`}>\n {renderBadge(badgeCx, badgeCy(i), i + 1, ctx)}\n <text\n x={TEXT_X_VERTICAL}\n y={titleBaselineY}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {title.text}\n </text>\n {text.lines.map((line, li) => (\n <text\n key={li}\n x={TEXT_X_VERTICAL}\n y={textTopY + li * text.lineHeight + text.fontSize}\n fontSize={text.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </g>\n )\n })}\n </g>\n )\n}\n\nexport const steps: SvgBlock<StepsBlock> = {\n measure(block, w) {\n const n = block.items.length\n if (needsVerticalLayout(n, w)) {\n return n * verticalRowGeometry(block, w).rowH\n }\n return cardGeometry(block, w).cardH\n },\n render(block, box, ctx) {\n const n = block.items.length\n if (needsVerticalLayout(n, box.w)) {\n return renderVertical(block, box, ctx)\n }\n const { cardW, contentW, cardH } = cardGeometry(block, box.w)\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.items.map((item, i) => {\n const cardX = i * (cardW + GAP)\n return (\n <g key={i} data-audit-box={`${box.x + cardX},${box.y},${cardW}`}>\n <rect\n x={cardX}\n y={0}\n width={cardW}\n height={cardH}\n rx={CARD_RADIUS}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke\n ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 }\n : {})}\n />\n {renderStepCardBody(item, i, { x: cardX + PAD_X, y: PAD_TOP, w: contentW }, ctx)}\n </g>\n )\n })}\n {block.items.slice(1).map((_, i) => {\n const cardRightEdge = i * (cardW + GAP) + cardW\n const arrowX = cardRightEdge + (GAP - ARROW_LEN) / 2\n return (\n <g key={`arrow-${i}`}>{renderArrow(arrowX, cardH / 2, ctx.colors.muted)}</g>\n )\n })}\n </g>\n )\n },\n}\n","import type React from \"react\"\nimport type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText, measureTextUnits } from \"../../lib/svg-text-layout\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype RoadmapBlock = Extract<Block, { type: \"roadmap\" }>\ntype RoadmapItem = RoadmapBlock[\"items\"][number]\n\n/**\n * 阶段路线图卡(2026-07-14 用户 showcase deck 借鉴,取代手绘补页):2-4 个\n * 阶段横排圆角卡,自动编号 01..N。每卡=顶部 accent 条(上圆角,随卡片\n * 圆角,修手绘直角戳圆角的旧缺陷)+ 圆形深色编号徽章 + 可选时段 + 粗标题\n * + 若干 `label:value` 指标行。文本全实测决定卡高。\n */\nconst GAP = 24\nconst PAD_X = 22\nconst PAD_BOTTOM = 18\nconst CARD_RADIUS = 8\nconst BAR_H = 8\n\nconst BADGE_R = 19\nconst BADGE_FONT = 15\nconst BASELINE_FUDGE = 0.32\nconst BADGE_TOP = BAR_H + 16 // 徽章顶到卡顶\n\nconst PERIOD_SIZE = 14\nconst TITLE_SIZE = 19\nconst TITLE_LH = Math.round(TITLE_SIZE * 1.4)\nconst GAP_BADGE_TITLE = 14\nconst GAP_TITLE_ROWS = 16\n\nconst LABEL_SIZE = 13\nconst VALUE_SIZE = 14.5\nconst VALUE_LH = Math.round(VALUE_SIZE * 1.4)\nconst ROW_GAP = 12\nconst LABEL_VALUE_GAP = 12\n\ninterface RowLayout {\n label: { text: string; fontSize: number }\n value: { lines: string[]; fontSize: number; lineHeight: number }\n height: number\n}\ninterface CardLayout {\n period: { text: string; fontSize: number } | null\n title: { text: string; fontSize: number }\n rows: RowLayout[]\n labelColW: number\n contentH: number\n cardH: number\n}\n\n/** Rounded-top, square-bottom bar path — top corners follow the card radius\n * so the accent bar never overhangs the card's rounded corners (the手绘 bug).\n * svg2pptx 的 A(弧) 段已支持,导出为 custGeom 圆角。 */\nfunction roundedTopBarPath(x: number, y: number, w: number, h: number, r: number): string {\n const rr = Math.min(r, w / 2, h)\n return (\n `M ${x} ${y + rr} ` +\n `A ${rr} ${rr} 0 0 1 ${x + rr} ${y} ` +\n `L ${x + w - rr} ${y} ` +\n `A ${rr} ${rr} 0 0 1 ${x + w} ${y + rr} ` +\n `L ${x + w} ${y + h} ` +\n `L ${x} ${y + h} Z`\n )\n}\n\nfunction cardLayout(item: RoadmapItem, cardW: number): CardLayout {\n const contentW = cardW - PAD_X * 2\n const period = item.period\n ? fitSvgLine(item.period, {\n maxWidth: contentW - BADGE_R * 2 - 12,\n fontSize: PERIOD_SIZE,\n minFontSize: 11,\n })\n : null\n const title = fitSvgLine(item.title, {\n maxWidth: contentW,\n fontSize: TITLE_SIZE,\n minFontSize: 14,\n })\n const rowItems = item.rows ?? []\n // Label column width = widest fitted label, clamped so the value column keeps\n // a usable width.\n const labelWidths = rowItems.map((r) => measureTextUnits(r.label) * LABEL_SIZE)\n const labelColW = rowItems.length\n ? Math.min(Math.max(48, Math.max(...labelWidths) + LABEL_VALUE_GAP), Math.round(contentW * 0.42))\n : 0\n const valueW = Math.max(40, contentW - labelColW)\n const rows: RowLayout[] = rowItems.map((r) => {\n const label = fitSvgLine(r.label, { maxWidth: labelColW, fontSize: LABEL_SIZE, minFontSize: 10 })\n const value = layoutSvgText(r.value, {\n maxWidth: valueW,\n fontSize: VALUE_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.4,\n })\n return { label, value, height: Math.max(VALUE_LH, value.lines.length * value.lineHeight) }\n })\n const rowsH = rows.reduce((s, r) => s + r.height, 0) + Math.max(0, rows.length - 1) * ROW_GAP\n const contentH =\n BADGE_TOP +\n BADGE_R * 2 +\n GAP_BADGE_TITLE +\n TITLE_LH +\n (rows.length ? GAP_TITLE_ROWS + rowsH : 0)\n return {\n period,\n title,\n rows,\n labelColW,\n contentH,\n cardH: contentH + PAD_BOTTOM,\n }\n}\n\nfunction renderCard(\n layout: CardLayout,\n index: number,\n x: number,\n y: number,\n cardW: number,\n cardH: number,\n ctx: BlockCtx,\n): React.ReactElement {\n const r = ctx.shape?.radius ?? CARD_RADIUS\n const cx = x + PAD_X + BADGE_R\n const cy = y + BADGE_TOP + BADGE_R\n const num = String(index + 1).padStart(2, \"0\")\n const titleBaseline = y + BADGE_TOP + BADGE_R * 2 + GAP_BADGE_TITLE + TITLE_SIZE\n let rowY = titleBaseline + GAP_TITLE_ROWS\n return (\n <g key={index}>\n <rect\n x={x}\n y={y}\n width={cardW}\n height={cardH}\n rx={r}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 } : {})}\n />\n <path d={roundedTopBarPath(x, y, cardW, BAR_H, r)} fill={ctx.colors.accent} />\n <circle cx={cx} cy={cy} r={BADGE_R} fill={ctx.colors.primary} />\n <text\n x={cx}\n y={cy + Math.round(BADGE_FONT * BASELINE_FUDGE)}\n textAnchor=\"middle\"\n fontSize={BADGE_FONT}\n fontWeight=\"700\"\n fill=\"#FFFFFF\"\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {num}\n </text>\n {layout.period ? (\n <text\n x={x + PAD_X + BADGE_R * 2 + 12}\n y={cy + Math.round(layout.period.fontSize * BASELINE_FUDGE)}\n fontSize={layout.period.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.accent}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {layout.period.text}\n </text>\n ) : null}\n <text\n x={x + PAD_X}\n y={titleBaseline}\n fontSize={layout.title.fontSize}\n fontWeight=\"700\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {layout.title.text}\n </text>\n {layout.rows.map((row, ri) => {\n const rowTop = rowY\n rowY += row.height + ROW_GAP\n return (\n <g key={ri}>\n <text\n x={x + PAD_X}\n y={rowTop + LABEL_SIZE}\n fontSize={row.label.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {row.label.text}\n </text>\n {row.value.lines.map((line, li) => (\n <text\n key={li}\n x={x + PAD_X + layout.labelColW}\n y={rowTop + VALUE_SIZE + li * row.value.lineHeight}\n fontSize={row.value.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </g>\n )\n })}\n </g>\n )\n}\n\nexport const roadmap: SvgBlock<RoadmapBlock> = {\n measure(block, w) {\n const n = block.items.length\n const cardW = (w - GAP * (n - 1)) / n\n return Math.max(...block.items.map((it) => cardLayout(it, cardW).cardH))\n },\n render(block, box, ctx) {\n const n = block.items.length\n const cardW = (box.w - GAP * (n - 1)) / n\n const layouts = block.items.map((it) => cardLayout(it, cardW))\n const measuredH = Math.max(...layouts.map((l) => l.cardH))\n // 均分密度拉伸:box.h 由布局分配时,卡高吃满(内容顶对齐,底部留白)。\n const cardH = Math.max(measuredH, box.h ?? measuredH)\n return (\n <g>\n {layouts.map((layout, i) =>\n renderCard(layout, i, box.x + i * (cardW + GAP), box.y, cardW, cardH, ctx),\n )}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype MatrixBlock = Extract<Block, { type: \"matrix\" }>\ntype MatrixItem = MatrixBlock[\"items\"][number]\n\n/**\n * 二维定位矩阵(2026-07-14 用户 showcase deck 借鉴,取代手绘补页):可选\n * XY 轴标签 + 色格网格。items 按行优先填格,`tone` 决定象限底色(中性/\n * accent 金调/info 冷调,从主题 token 派生实底色,Chrome 103 安全)。每格\n * 标题 + 可选 tag,文本实测。\n */\nconst CARD_GAP = 16\nconst PAD_X = 18\nconst PAD_TOP = 16\nconst CARD_RADIUS = 8\nconst X_TITLE_H = 30\nconst Y_TITLE_W = 34\nconst TITLE_SIZE = 17\nconst TITLE_LH = Math.round(TITLE_SIZE * 1.35)\nconst TAG_SIZE = 13\nconst TAG_LH = Math.round(TAG_SIZE * 1.35)\nconst AXIS_SIZE = 13\nconst GAP_TITLE_TAG = 6\nconst PAD_BOTTOM = 16\n\n/** Blend hex `a` toward hex `b` by t∈[0,1] → solid #RRGGBB (no alpha, exports\n * cleanly + Chrome 103 safe). */\nfunction mixHex(a: string, b: string, t: number): string {\n const pa = parseHex(a)\n const pb = parseHex(b)\n if (!pa || !pb) return a\n const ch = (x: number, y: number) => Math.round(x + (y - x) * t)\n const hex = (n: number) => n.toString(16).padStart(2, \"0\")\n return `#${hex(ch(pa[0], pb[0]))}${hex(ch(pa[1], pb[1]))}${hex(ch(pa[2], pb[2]))}`\n}\nfunction parseHex(h: string): [number, number, number] | null {\n const m = /^#?([0-9a-fA-F]{6})$/.exec(h.trim())\n if (!m) return null\n const n = parseInt(m[1], 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction toneFill(tone: MatrixItem[\"tone\"], ctx: BlockCtx): string {\n switch (tone) {\n case \"accent\":\n return mixHex(ctx.colors.surface, ctx.colors.accent, 0.16)\n case \"info\":\n return mixHex(ctx.colors.surface, ctx.colors.primary, 0.08)\n default:\n return mixHex(ctx.colors.surface, ctx.colors.muted, 0.08)\n }\n}\n\ninterface CellLayout {\n title: { text: string; fontSize: number }\n tag: { text: string; fontSize: number } | null\n contentH: number\n}\n\nfunction cellLayout(item: MatrixItem, cardW: number): CellLayout {\n const contentW = cardW - PAD_X * 2\n const title = fitSvgLine(item.title, { maxWidth: contentW, fontSize: TITLE_SIZE, minFontSize: 12 })\n const tag = item.tag\n ? fitSvgLine(item.tag, { maxWidth: contentW, fontSize: TAG_SIZE, minFontSize: 10 })\n : null\n const contentH = TITLE_LH + (tag ? GAP_TITLE_TAG + TAG_LH : 0)\n return { title, tag, contentH }\n}\n\nfunction gridGeom(block: MatrixBlock, w: number) {\n const cols = block.cols\n const rows = Math.ceil(block.items.length / cols)\n const gridX0 = block.y_title ? Y_TITLE_W : 0\n const gridW = w - gridX0\n const cardW = (gridW - CARD_GAP * (cols - 1)) / cols\n const contentH = Math.max(\n ...block.items.map((it) => cellLayout(it, cardW).contentH),\n TITLE_LH,\n )\n const cardH = PAD_TOP + contentH + PAD_BOTTOM\n return { cols, rows, gridX0, cardW, cardH }\n}\n\nexport const matrix: SvgBlock<MatrixBlock> = {\n measure(block, w) {\n const { rows, cardH } = gridGeom(block, w)\n return (\n (block.x_title ? X_TITLE_H : 0) + rows * cardH + (rows - 1) * CARD_GAP\n )\n },\n render(block, box, ctx) {\n const { cols, rows, gridX0, cardW, cardH } = gridGeom(block, box.w)\n const gridTop = box.y + (block.x_title ? X_TITLE_H : 0)\n // 按 box.h 把每行卡等分拉伸(内容顶对齐),铺满可用高。\n const measuredGridH = rows * cardH + (rows - 1) * CARD_GAP\n const availGridH = (box.h ?? measuredGridH) - (block.x_title ? X_TITLE_H : 0)\n const rowH = Math.max(cardH, (availGridH - (rows - 1) * CARD_GAP) / rows)\n const r = ctx.shape?.radius ?? CARD_RADIUS\n return (\n <g>\n {block.x_title ? (\n <text\n x={box.x + gridX0}\n y={box.y + AXIS_SIZE + 4}\n fontSize={AXIS_SIZE}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`${block.x_title} →`}\n </text>\n ) : null}\n {block.y_title\n ? block.y_title.split(\"\").map((chr, i) => (\n <text\n key={i}\n x={box.x + Y_TITLE_W / 2}\n y={gridTop + 20 + i * (AXIS_SIZE + 2)}\n textAnchor=\"middle\"\n fontSize={AXIS_SIZE}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {chr}\n </text>\n ))\n : null}\n {block.items.map((item, i) => {\n const col = i % cols\n const row = Math.floor(i / cols)\n const x = box.x + gridX0 + col * (cardW + CARD_GAP)\n const y = gridTop + row * (rowH + CARD_GAP)\n const cell = cellLayout(item, cardW)\n const titleBaseline = y + PAD_TOP + TITLE_SIZE\n return (\n <g key={i}>\n <rect\n x={x}\n y={y}\n width={cardW}\n height={rowH}\n rx={r}\n fill={toneFill(item.tone, ctx)}\n {...(ctx.colors.cardStroke\n ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 }\n : {})}\n />\n <text\n x={x + PAD_X}\n y={titleBaseline}\n fontSize={cell.title.fontSize}\n fontWeight=\"700\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {cell.title.text}\n </text>\n {cell.tag ? (\n <text\n x={x + PAD_X}\n y={titleBaseline + GAP_TITLE_TAG + TAG_SIZE}\n fontSize={cell.tag.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {cell.tag.text}\n </text>\n ) : null}\n </g>\n )\n })}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { fitSvgLine, layoutSvgText, measureTextUnits } from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype InsightPanelBlock = Extract<Block, { type: \"insight_panel\" }>\n\n/**\n * 带标题的策略/观点面板(2026-07-14 用户 showcase deck 借鉴,取代手绘补\n * 页):圆角面板 + 标题压 accent 条 + 若干 `label / 描述` 行 + 可选贴底脚\n * 注。常作 aside 侧栏块与数据并置。**全文实测**决定面板高度,脚注恒在卡\n * 内(修手绘脚本假设固定行数导致的溢出)。\n */\nconst PAD_X = 22\nconst PAD_TOP = 20\nconst PAD_BOTTOM = 18\nconst CARD_RADIUS = 10\nconst BAR_H = 6\n\nconst TITLE_SIZE = 17\nconst TITLE_LH = Math.round(TITLE_SIZE * 1.4)\nconst GAP_TITLE_ROWS = 18\n\nconst LABEL_SIZE = 14\nconst TEXT_SIZE = 13.5\nconst TEXT_LH = Math.round(TEXT_SIZE * 1.45)\nconst ROW_GAP = 16\nconst LABEL_COL_MIN = 56\n\nconst FOOT_SIZE = 12\nconst GAP_ROWS_FOOT = 16\n\n/** Rounded-top, square-bottom bar path (top corners follow the panel radius). */\nfunction roundedTopBarPath(x: number, y: number, w: number, h: number, r: number): string {\n const rr = Math.min(r, w / 2, h)\n return (\n `M ${x} ${y + rr} A ${rr} ${rr} 0 0 1 ${x + rr} ${y} ` +\n `L ${x + w - rr} ${y} A ${rr} ${rr} 0 0 1 ${x + w} ${y + rr} ` +\n `L ${x + w} ${y + h} L ${x} ${y + h} Z`\n )\n}\n\ninterface RowLayout {\n label: { text: string; fontSize: number }\n text: { lines: string[]; fontSize: number; lineHeight: number }\n height: number\n}\ninterface PanelLayout {\n title: { text: string; fontSize: number }\n rows: RowLayout[]\n labelColW: number\n foot: { lines: string[]; fontSize: number; lineHeight: number } | null\n contentH: number\n}\n\nfunction panelLayout(block: InsightPanelBlock, w: number): PanelLayout {\n const contentW = w - PAD_X * 2\n const title = fitSvgLine(block.title, {\n maxWidth: contentW,\n fontSize: TITLE_SIZE,\n minFontSize: 13,\n })\n const labelColW = Math.min(\n Math.max(LABEL_COL_MIN, Math.max(...block.rows.map((r) => measureTextUnits(r.label) * LABEL_SIZE)) + 14),\n Math.round(contentW * 0.4),\n )\n const textW = Math.max(60, contentW - labelColW)\n const rows: RowLayout[] = block.rows.map((r) => {\n const label = fitSvgLine(r.label, { maxWidth: labelColW, fontSize: LABEL_SIZE, minFontSize: 11 })\n const text = layoutSvgText(r.text, {\n maxWidth: textW,\n fontSize: TEXT_SIZE,\n maxLines: 3,\n lineHeightRatio: 1.45,\n })\n return { label, text, height: Math.max(TEXT_LH, text.lines.length * text.lineHeight) }\n })\n const foot = block.footnote\n ? layoutSvgText(block.footnote, {\n maxWidth: contentW,\n fontSize: FOOT_SIZE,\n maxLines: 2,\n lineHeightRatio: 1.4,\n })\n : null\n const rowsH = rows.reduce((s, r) => s + r.height, 0) + Math.max(0, rows.length - 1) * ROW_GAP\n const contentH =\n PAD_TOP +\n TITLE_LH +\n GAP_TITLE_ROWS +\n rowsH +\n (foot ? GAP_ROWS_FOOT + foot.lines.length * foot.lineHeight : 0) +\n PAD_BOTTOM\n return { title, rows, labelColW, foot, contentH }\n}\n\nexport const insightPanel: SvgBlock<InsightPanelBlock> = {\n measure(block, w) {\n return panelLayout(block, w).contentH\n },\n render(block, box, ctx) {\n const layout = panelLayout(block, box.w)\n const r = ctx.shape?.radius ?? CARD_RADIUS\n // 面板高度取实测与分配的较大者——脚注按内容实测底定位,恒在卡内。\n const panelH = Math.max(layout.contentH, box.h ?? layout.contentH)\n const titleBaseline = box.y + PAD_TOP + TITLE_SIZE\n let rowY = titleBaseline + GAP_TITLE_ROWS\n return (\n <g>\n <rect\n x={box.x}\n y={box.y}\n width={box.w}\n height={panelH}\n rx={r}\n fill={ctx.colors.surface}\n {...(ctx.colors.cardStroke ? { stroke: ctx.colors.cardStroke, strokeWidth: 1 } : {})}\n />\n <path d={roundedTopBarPath(box.x, box.y, box.w, BAR_H, r)} fill={ctx.colors.accent} />\n <text\n x={box.x + PAD_X}\n y={titleBaseline}\n fontSize={layout.title.fontSize}\n fontWeight=\"700\"\n fill={ctx.colors.accent}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {layout.title.text}\n </text>\n {layout.rows.map((row, ri) => {\n const rowTop = rowY\n rowY += row.height + ROW_GAP\n return (\n <g key={ri}>\n <text\n x={box.x + PAD_X}\n y={rowTop + LABEL_SIZE}\n fontSize={row.label.fontSize}\n fontWeight=\"700\"\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {row.label.text}\n </text>\n {row.text.lines.map((line, li) => (\n <text\n key={li}\n x={box.x + PAD_X + layout.labelColW}\n y={rowTop + TEXT_SIZE + li * row.text.lineHeight}\n fontSize={row.text.fontSize}\n fill={ctx.colors.text}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </g>\n )\n })}\n {layout.foot\n ? layout.foot.lines.map((line, li) => (\n <text\n key={`f${li}`}\n x={box.x + PAD_X}\n y={box.y + panelH - PAD_BOTTOM - (layout.foot!.lines.length - 1 - li) * layout.foot!.lineHeight - 2}\n fontSize={FOOT_SIZE}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))\n : null}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport {\n parseEmphasis,\n renderEmphasisTspans,\n sliceEmphasisForLines,\n stripEmphasis,\n truncateEmphasisSegments,\n type EmphasisSegment,\n} from \"../emphasis\"\nimport { Icon } from \"../icons\"\nimport type { BlockCtx, SvgBlock } from \"./types\"\n\ntype VerdictBannerBlock = Extract<Block, { type: \"verdict_banner\" }>\n\n/* ── Geometry ──\n * A full-width, more-prominent sibling of callout.tsx's left-bar treatment:\n * a bordered, tinted rounded strip instead of a surface card + accent bar —\n * \"page-level conclusion\", not \"margin note\" (mirrors the ppt-master green\n * verdict banner this task's brief describes — one full-bleed strip stating\n * the page's takeaway, vs. callout's smaller margin-note treatment).\n */\nconst RX = 10\nconst PAD_X = 24\nconst ICON_SIZE = 20\nconst GAP_ICON_TEXT = 12\nconst STROKE_WIDTH = 1.5\nconst FILL_OPACITY = 0.08\n\nconst FONT_SIZE = 18\nconst MAX_LINES = 2\n// Bar height is a literal 2-state lookup (64 / 88px), not a grow-with-content\n// measurement like callout's — chosen so the gap between the two states\n// (88-64=24) is exactly one line box, i.e. PAD_Y(20)*2 + n*LINE_HEIGHT(24):\n// 1 line -> 40+24=64, 2 lines -> 40+48=88.\nconst LINE_HEIGHT = 24\nconst PAD_Y = 20\nconst HEIGHT_ONE_LINE = PAD_Y * 2 + LINE_HEIGHT // 64\nconst HEIGHT_TWO_LINE = PAD_Y * 2 + 2 * LINE_HEIGHT // 88\n\n/** tone -> hex color. Only positive/warning have a light/dark pair here —\n * neutral deliberately bypasses this table (see `toneColor`) and reuses\n * whatever `muted` the active theme already resolved, so it never needs its\n * own light/dark variant. */\nconst TONE_COLORS: Record<\n \"positive\" | \"warning\",\n { base: string; dark: string }\n> = {\n positive: { base: \"#2E9E6B\", dark: \"#4FBF8B\" },\n warning: { base: \"#D9822B\", dark: \"#E8A159\" },\n}\n\n/**\n * Perceived brightness (0-255) of a `#RRGGBB` hex color — a simple weighted-RGB\n * relative luminance. `ThemeColors` (themes/tokens.ts) has no explicit\n * dark/light flag, and no luminance/brightness utility exists elsewhere in the\n * repo (checked before writing this), so this is the \"relative luminance 简式\"\n * fallback the brief calls for. Only used to pick the tone's light/dark variant\n * below — not exported, not a general-purpose color utility.\n */\nfunction perceivedBrightness(hex: string): number {\n const clean = hex.replace(\"#\", \"\")\n const r = parseInt(clean.slice(0, 2), 16)\n const g = parseInt(clean.slice(2, 4), 16)\n const b = parseInt(clean.slice(4, 6), 16)\n return 0.299 * r + 0.587 * g + 0.114 * b\n}\n\n/** Dark-background themes in the current 6-theme set: tech (#060A13)\n * and creative (#0A0A0C), both far below the midpoint threshold; every\n * other theme's `bg` is a light neutral far above it (consulting #F7F7F2,\n * academic #FAFAF6, custom #FFFFFF, magazine #FAF7F2) — checked\n * against every theme token file before picking 128 as the threshold. */\nfunction isDarkTheme(colors: { bg: string }): boolean {\n return perceivedBrightness(colors.bg) < 128\n}\n\n/** Resolve `tone` to a hex color, theme-darkness-aware for positive/warning.\n * `neutral` bypasses the table entirely — `ctx.colors.muted` is already the\n * right color for either light or dark themes, so there's nothing to switch. */\nfunction toneColor(tone: VerdictBannerBlock[\"tone\"], ctx: BlockCtx): string {\n if (tone === \"neutral\") return ctx.colors.muted\n const entry = TONE_COLORS[tone]\n return isDarkTheme(ctx.colors) ? entry.dark : entry.base\n}\n\n/** Text start x — shifts left to flush with PAD_X when there's no icon. */\nfunction textX(hasIcon: boolean): number {\n return hasIcon ? PAD_X + ICON_SIZE + GAP_ICON_TEXT : PAD_X\n}\n\ninterface Laid {\n lineSegments: EmphasisSegment[][]\n height: number\n}\n\n/**\n * Shared measure/render layout: wraps `block.text` (strip-emphasis'd) to at\n * most `MAX_LINES` via `layoutSvgText`, then maps emphasis back onto those\n * *pre-truncation* lines and truncates each one — in that order, per Task 1's\n * established contract (see `emphasis.ts`'s `sliceEmphasisForLines` docstring:\n * slice-for-lines first, `truncateEmphasisSegments` after, never the reverse).\n *\n * Deliberately ignores `layoutSvgText`'s own returned `fontSize`/`lineHeight`\n * — this block always renders at a fixed 18px (unlike icon-cards/steps, whose\n * title/text may shrink), so a line `layoutSvgText` had to loosen past its\n * natural per-line budget (to squeeze long content into MAX_LINES) can still\n * be too wide at our fixed FONT_SIZE. `truncateEmphasisSegments` against\n * `textW / FONT_SIZE` catches exactly that case — same fix bullets.tsx applies\n * at its own clamped floor font size.\n */\nfunction lay(block: VerdictBannerBlock, w: number): Laid {\n const hasIcon = Boolean(block.icon)\n const tx = textX(hasIcon)\n const textW = Math.max(1, w - tx - PAD_X)\n const l = layoutSvgText(stripEmphasis(block.text), {\n maxWidth: textW,\n fontSize: FONT_SIZE,\n maxLines: MAX_LINES,\n lineHeightRatio: LINE_HEIGHT / FONT_SIZE,\n })\n const maxUnits = textW / FONT_SIZE\n const lineSegments = sliceEmphasisForLines(\n parseEmphasis(block.text),\n l.lines\n ).map((segs) => truncateEmphasisSegments(segs, maxUnits))\n const height = lineSegments.length <= 1 ? HEIGHT_ONE_LINE : HEIGHT_TWO_LINE\n return { lineSegments, height }\n}\n\nexport const verdictBanner: SvgBlock<VerdictBannerBlock> = {\n measure(block, w) {\n return lay(block, w).height\n },\n render(block, box, ctx) {\n const { lineSegments, height } = lay(block, box.w)\n const hasIcon = Boolean(block.icon)\n const tone = toneColor(block.tone, ctx)\n const tx = textX(hasIcon)\n const textBlockH = lineSegments.length * LINE_HEIGHT\n const textTopY = (height - textBlockH) / 2\n return (\n <g\n transform={`translate(${box.x},${box.y})`}\n data-audit-box={`${box.x},${box.y},${box.w}`}\n data-audit-rect={`${box.x},${box.y},${box.w},${height}`}\n >\n <rect\n x={0}\n y={0}\n width={box.w}\n height={height}\n rx={RX}\n fill={tone}\n fillOpacity={FILL_OPACITY}\n stroke={tone}\n strokeWidth={STROKE_WIDTH}\n />\n {block.icon && (\n <Icon\n name={block.icon}\n x={PAD_X}\n y={(height - ICON_SIZE) / 2}\n size={ICON_SIZE}\n color={tone}\n />\n )}\n {lineSegments.map((segments, i) => (\n <text\n key={i}\n x={tx}\n y={textTopY + i * LINE_HEIGHT + FONT_SIZE}\n fontFamily={ctx.fonts.body}\n fontSize={FONT_SIZE}\n fontWeight=\"600\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(segments, {\n accent: tone,\n baseFill: ctx.colors.text,\n fontWeight: \"700\",\n })}\n </text>\n ))}\n </g>\n )\n },\n}\n","import type { Block } from \"@/ir\"\nimport {\n fitSvgLine,\n measureTextUnits,\n truncateToUnits,\n} from \"../../lib/svg-text-layout\"\nimport type { SvgBlock } from \"./types\"\n\ntype CitationBlock = Extract<Block, { type: \"citation\" }>\n\nconst ROW = 28\nconst LABEL_FONT_SIZE = 18\nconst LABEL_MIN_FONT_SIZE = 13\nconst URL_FONT_SIZE = 14\n\n/** Baseline y for source row `i`, relative to the block group origin. */\nfunction baselineY(i: number): number {\n return i * ROW + 18\n}\n\nexport const citation: SvgBlock<CitationBlock> = {\n measure(block) {\n return block.sources.length * ROW\n },\n render(block, box, ctx) {\n return (\n <g transform={`translate(${box.x},${box.y})`}>\n {block.sources.map((source, i) => {\n const fittedLabel = fitSvgLine(`[${i + 1}] ${source.label}`, {\n maxWidth: box.w * 0.6,\n fontSize: LABEL_FONT_SIZE,\n minFontSize: LABEL_MIN_FONT_SIZE,\n })\n const labelWidth =\n measureTextUnits(fittedLabel.text) * fittedLabel.fontSize\n const remainingWidth = box.w - labelWidth\n const fittedUrl = source.url\n ? truncateToUnits(source.url, remainingWidth / URL_FONT_SIZE)\n : null\n return (\n <text\n key={i}\n x=\"0\"\n y={baselineY(i)}\n fontFamily={ctx.fonts.body}\n fontSize={fittedLabel.fontSize}\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {fittedLabel.text}\n {fittedUrl && (\n <tspan\n fill={ctx.colors.muted}\n fontSize={URL_FONT_SIZE}\n >\n {` ${fittedUrl}`}\n </tspan>\n )}\n </text>\n )\n })}\n </g>\n )\n },\n}\n","import type React from \"react\"\nimport type { Block } from \"@/ir\"\nimport type { BlockBox, BlockCtx } from \"./types\"\nimport { paragraph } from \"./paragraph\"\nimport { bullets } from \"./bullets\"\nimport { quote } from \"./quote\"\nimport { callout } from \"./callout\"\nimport { code } from \"./code\"\nimport { kpi } from \"./kpi\"\nimport { image } from \"./image\"\nimport { imageGrid } from \"./image-grid\"\nimport { imageCompare } from \"./image-compare\"\nimport { chart } from \"./chart\"\nimport { flowchart } from \"./flowchart\"\nimport { architecture } from \"./architecture\"\nimport { timeline } from \"./timeline\"\nimport { comparison } from \"./comparison\"\nimport { iconCards } from \"./icon-cards\"\nimport { numberedCards } from \"./numbered-cards\"\nimport { rings } from \"./rings\"\nimport { rowCards } from \"./row-cards\"\nimport { steps } from \"./steps\"\nimport { roadmap } from \"./roadmap\"\nimport { matrix } from \"./matrix\"\nimport { insightPanel } from \"./insight_panel\"\nimport { verdictBanner } from \"./verdict-banner\"\nimport { citation } from \"./citation\"\n\n/** Height (px) a block needs at a given width. */\nexport function measureBlock(block: Block, w: number, ctx: BlockCtx): number {\n switch (block.type) {\n case \"paragraph\":\n return paragraph.measure(block, w, ctx)\n case \"bullets\":\n return bullets.measure(block, w, ctx)\n case \"quote\":\n return quote.measure(block, w, ctx)\n case \"callout\":\n return callout.measure(block, w, ctx)\n case \"code\":\n return code.measure(block, w, ctx)\n case \"kpi_cards\":\n return kpi.measure(block, w, ctx)\n case \"image\":\n return image.measure(block, w, ctx)\n case \"image_grid\":\n return imageGrid.measure(block, w, ctx)\n case \"image_compare\":\n return imageCompare.measure(block, w, ctx)\n case \"chart\":\n return chart.measure(block, w, ctx)\n case \"flowchart\":\n return flowchart.measure(block, w, ctx)\n case \"architecture\":\n return architecture.measure(block, w, ctx)\n case \"timeline\":\n return timeline.measure(block, w, ctx)\n case \"comparison\":\n return comparison.measure(block, w, ctx)\n case \"icon_cards\":\n return iconCards.measure(block, w, ctx)\n case \"numbered_cards\":\n return numberedCards.measure(block, w, ctx)\n case \"rings\":\n return rings.measure(block, w, ctx)\n case \"row_cards\":\n return rowCards.measure(block, w, ctx)\n case \"steps\":\n return steps.measure(block, w, ctx)\n case \"roadmap\":\n return roadmap.measure(block, w, ctx)\n case \"matrix\":\n return matrix.measure(block, w, ctx)\n case \"insight_panel\":\n return insightPanel.measure(block, w, ctx)\n case \"verdict_banner\":\n return verdictBanner.measure(block, w, ctx)\n case \"citation\":\n return citation.measure(block, w, ctx)\n default: {\n void (block satisfies never)\n return 0\n }\n }\n}\n\n/** Render a block's own content — the `renderBlock` switch, unwrapped. */\nfunction renderBlockContent(block: Block, box: BlockBox, ctx: BlockCtx): React.ReactElement {\n switch (block.type) {\n case \"paragraph\":\n return paragraph.render(block, box, ctx)\n case \"bullets\":\n return bullets.render(block, box, ctx)\n case \"quote\":\n return quote.render(block, box, ctx)\n case \"callout\":\n return callout.render(block, box, ctx)\n case \"code\":\n return code.render(block, box, ctx)\n case \"kpi_cards\":\n return kpi.render(block, box, ctx)\n case \"image\":\n return image.render(block, box, ctx)\n case \"image_grid\":\n return imageGrid.render(block, box, ctx)\n case \"image_compare\":\n return imageCompare.render(block, box, ctx)\n case \"chart\":\n return chart.render(block, box, ctx)\n case \"flowchart\":\n return flowchart.render(block, box, ctx)\n case \"architecture\":\n return architecture.render(block, box, ctx)\n case \"timeline\":\n return timeline.render(block, box, ctx)\n case \"comparison\":\n return comparison.render(block, box, ctx)\n case \"icon_cards\":\n return iconCards.render(block, box, ctx)\n case \"numbered_cards\":\n return numberedCards.render(block, box, ctx)\n case \"rings\":\n return rings.render(block, box, ctx)\n case \"row_cards\":\n return rowCards.render(block, box, ctx)\n case \"steps\":\n return steps.render(block, box, ctx)\n case \"roadmap\":\n return roadmap.render(block, box, ctx)\n case \"matrix\":\n return matrix.render(block, box, ctx)\n case \"insight_panel\":\n return insightPanel.render(block, box, ctx)\n case \"verdict_banner\":\n return verdictBanner.render(block, box, ctx)\n case \"citation\":\n return citation.render(block, box, ctx)\n default: {\n void (block satisfies never)\n return <g />\n }\n }\n}\n\n/**\n * Render a block as a positioned SVG `<g>` at `box`.\n *\n * When `ctx.blockIndex` carries this exact block reference (wave-C S3,\n * `elements === \"auto\"` only — see `BlockCtx.blockIndex`'s doc comment), the\n * content is wrapped in one more `<g data-blk=\"{index}\">` so\n * `svg2pptx/dispatch.ts` can tag every shape underneath with its source\n * block. This is the single chokepoint every template/variant renders a\n * block through (`SvgContent`, `BigNumber`, `AssertionEvidence`,\n * tech's own non-exploded-block cell, creative's poster slot),\n * so tagging happens here once rather than at each call site — the one\n * exception is tech's exploded `kpi-item`/`icon-card-item` cells,\n * which bypass this function entirely and tag themselves directly (see\n * `templates/tech.tsx`'s `renderCell`).\n */\nexport function renderBlock(block: Block, box: BlockBox, ctx: BlockCtx): React.ReactElement {\n const content = renderBlockContent(block, box, ctx)\n const blockIndex = ctx.blockIndex?.get(block)\n return blockIndex != null ? <g data-blk={blockIndex}>{content}</g> : content\n}\n","import type { Block, Slide } from \"@/ir\"\nimport type { BlockBox, BlockCtx } from \"./blocks/types\"\nimport { measureBlock } from \"./blocks\"\n\nexport type Variant = NonNullable<Slide[\"variant\"]>\n\n/** The content region rect (px) a slide gives its blocks to lay out within. */\nexport interface ContentRect {\n x: number\n y: number\n w: number\n h: number\n}\n\n/** A block paired with the page-coordinate box the layout assigned it. */\nexport interface PlacedBlock {\n block: Block\n box: BlockBox\n}\n\n/** Vertical gap (px) between stacked blocks. */\nexport const BLOCK_GAP = 16\n/** Horizontal gap (px) between layout columns. */\nexport const COLUMN_GAP = 32\n\n/** aside 版式的几何拆分(主 2/3 + 侧栏 1/3)——SvgContent 画侧栏分隔\n * 线时复用同一公式,两处不漂移。 */\nexport function asideSplit(rect: ContentRect): {\n mainW: number\n asideX: number\n asideW: number\n dividerX: number\n} {\n const asideW = Math.round((rect.w - COLUMN_GAP) / 3)\n const mainW = rect.w - COLUMN_GAP - asideW\n const asideX = rect.x + mainW + COLUMN_GAP\n return { mainW, asideX, asideW, dividerX: rect.x + mainW + COLUMN_GAP / 2 }\n}\n\n/** Stack blocks top-to-bottom from (x,y) at width w; report the next free y. */\nfunction stackFrom(\n blocks: Block[],\n x: number,\n y: number,\n w: number,\n ctx: BlockCtx,\n gap: number = BLOCK_GAP,\n): { placed: PlacedBlock[]; endY: number } {\n let cursor = y\n const placed: PlacedBlock[] = []\n for (const block of blocks) {\n placed.push({ block, box: { x, y: cursor, w } })\n cursor += measureBlock(block, w, ctx) + gap\n }\n return { placed, endY: blocks.length ? cursor - gap : y }\n}\n\n/** Lay out a content slide's blocks into page-coordinate boxes per variant. */\nexport function layoutContent(\n variant: Variant | undefined,\n blocks: Block[],\n rect: ContentRect,\n ctx: BlockCtx,\n gap: number = BLOCK_GAP,\n): PlacedBlock[] {\n let v = variant ?? \"single\"\n // 双列类版式只有 1 个块时退化为单栏全宽,否则内容被塞进半宽列浪费一半版面\n if ((v === \"two_column\" || v === \"image_focus\" || v === \"aside\") && blocks.length < 2) {\n v = \"single\"\n }\n switch (v) {\n case \"aside\": {\n // 主内容 2/3 + 观点侧栏 1/3(末位块进侧栏)——财经简报的\n // EDITORIAL NOTE 语义:数据与观点并置(2026-07-12 借鉴)。\n const { mainW, asideX, asideW } = asideSplit(rect)\n const main = stackFrom(blocks.slice(0, -1), rect.x, rect.y, mainW, ctx, gap)\n const aside = stackFrom(blocks.slice(-1), asideX, rect.y, asideW, ctx, gap)\n return [...main.placed, ...aside.placed]\n }\n case \"two_column\": {\n const colW = (rect.w - COLUMN_GAP) / 2\n const mid = Math.ceil(blocks.length / 2)\n const left = stackFrom(blocks.slice(0, mid), rect.x, rect.y, colW, ctx, gap)\n const right = stackFrom(\n blocks.slice(mid),\n rect.x + colW + COLUMN_GAP,\n rect.y,\n colW,\n ctx,\n gap,\n )\n return [...left.placed, ...right.placed]\n }\n case \"image_focus\": {\n const colW = (rect.w - COLUMN_GAP) / 2\n const imgs = blocks.filter((b) => b.type === \"image\")\n const rest = blocks.filter((b) => b.type !== \"image\")\n const left = stackFrom(imgs, rect.x, rect.y, colW, ctx, gap)\n const right = stackFrom(rest, rect.x + colW + COLUMN_GAP, rect.y, colW, ctx, gap)\n return [...left.placed, ...right.placed]\n }\n case \"kpi_focus\": {\n const kpis = blocks.filter((b) => b.type === \"kpi_cards\")\n const rest = blocks.filter((b) => b.type !== \"kpi_cards\")\n const top = stackFrom(kpis, rect.x, rect.y, rect.w, ctx, gap)\n const restY = top.endY + (kpis.length ? gap : 0)\n const bottom = stackFrom(rest, rect.x, restY, rect.w, ctx, gap)\n return [...top.placed, ...bottom.placed]\n }\n case \"quote\": {\n // Measure the stack, then center it vertically in the rect.\n const measured = stackFrom(blocks, rect.x, 0, rect.w, ctx, gap)\n const totalH = measured.endY\n const offsetY = rect.y + Math.max(0, (rect.h - totalH) / 2)\n return stackFrom(blocks, rect.x, offsetY, rect.w, ctx, gap).placed\n }\n case \"code\":\n case \"single\":\n default:\n return stackFrom(blocks, rect.x, rect.y, rect.w, ctx, gap).placed\n }\n}\n\n/** Gap tiers tried in order (widest first) before resorting to dropping blocks. */\nconst GAP_TIERS = [BLOCK_GAP, 10, 6]\n\n/** The lowest bottom edge (page px) any placed block's content reaches.\n * 拉伸过的 block(box.h)以分配高度为准。 */\nexport function stackBottom(placed: PlacedBlock[], ctx: BlockCtx): number {\n return placed.reduce(\n (max, p) => Math.max(max, p.box.y + (p.box.h ?? measureBlock(p.block, p.box.w, ctx))),\n 0,\n )\n}\n\n/** 卡壳类 block:布局可把列内剩余高度分给它们本体拉伸(密度铺满)。 */\nconst STRETCHABLE_TYPES = new Set<Block[\"type\"]>([\"kpi_cards\", \"icon_cards\", \"row_cards\"])\n/** 单个卡片 block 至多拉到测量高度的这个倍数,防止矮内容页卡片畸高。 */\nconst STRETCH_CAP_RATIO = 1.7\n/** 剩余低于此值不做拉伸——与 SURPLUS_MIN_REMAINING 同值,保持「剩余 ≤80px\n * 时整个后处理链 byte-identical」的回归锁语义。 */\nconst STRETCH_MIN_REMAINING = 80\n\n/**\n * 卡片密度拉伸(2026-07-11 用户「带卡片的区块页面总是空腔」痛点):布局\n * 成功后,把每列底部的剩余高度分给列内卡壳类 block(box.h = 测量高 +\n * 份额,封顶 STRETCH_CAP_RATIO×),列内后续 block 相应下移。剩余没吃完\n * 的部分留给 distributeSurplus 继续做间距呼吸。与 distributeSurplus 同款\n * 列条件:列首块必须贴 rect 顶(quote 居中版式不动)。\n */\nfunction growStretchables(\n placed: PlacedBlock[],\n rect: ContentRect,\n ctx: BlockCtx,\n): PlacedBlock[] {\n if (placed.length === 0) return placed\n const columns = new Map<number, number[]>()\n placed.forEach((p, i) => {\n const col = columns.get(p.box.x)\n if (col) col.push(i)\n else columns.set(p.box.x, [i])\n })\n const next = placed.map((p) => p)\n let grew = false\n for (const idxs of columns.values()) {\n if (Math.abs(placed[idxs[0]].box.y - rect.y) > 0.5) continue\n const colBottom = idxs.reduce(\n (max, i) => Math.max(max, placed[i].box.y + measureBlock(placed[i].block, placed[i].box.w, ctx)),\n 0,\n )\n const remaining = rect.y + rect.h - colBottom\n if (remaining <= STRETCH_MIN_REMAINING) continue\n const stretchIdxs = idxs.filter((i) => STRETCHABLE_TYPES.has(placed[i].block.type))\n if (stretchIdxs.length === 0) continue\n const perBlock = remaining / stretchIdxs.length\n let shift = 0\n for (const i of idxs) {\n const p = next[i]\n if (shift > 0) next[i] = { ...p, box: { ...p.box, y: p.box.y + shift } }\n if (STRETCHABLE_TYPES.has(p.block.type)) {\n const measured = measureBlock(p.block, p.box.w, ctx)\n const granted = Math.min(perBlock, measured * (STRETCH_CAP_RATIO - 1))\n if (granted > 1) {\n next[i] = {\n ...next[i],\n box: { ...next[i].box, h: measured + granted },\n }\n shift += granted\n grew = true\n }\n }\n }\n }\n return grew ? next : placed\n}\n\n/** Below this much leftover space, surplus distribution is a no-op (regression lock). */\nconst SURPLUS_MIN_REMAINING = 80\n/** Share of the leftover space spent growing gaps; the rest sinks to the bottom. */\nconst SURPLUS_SHARE = 0.6\n/** A gap may grow by at most this many times its original (pre-surplus) size. */\nconst SURPLUS_GAP_CAP_RATIO = 1.5\n\n/**\n * \"Breathing room, not falling apart\" (wave-B S4): once a working gap tier\n * lays every block out top-aligned, a short slide can leave a large dead\n * strip below the last block. Spend `SURPLUS_SHARE` of that leftover growing\n * the gaps *between* blocks — evenly, capped so no single gap balloons past\n * `SURPLUS_GAP_CAP_RATIO`× its original size — and leave the rest as bottom\n * margin.\n *\n * Operates per stacked column (blocks sharing the same `box.x` — `stackFrom`\n * assigns one x per column and pushes each column's blocks contiguously, so\n * `two_column`/`image_focus`'s two columns and `kpi_focus`'s\n * hoisted-then-rest column each contribute their own gaps), but the leftover\n * budget and the per-gap increment are both computed once, globally, and\n * applied uniformly to every eligible gap — \"均匀摊\" means every gap grows by\n * the same amount, not that each column re-derives its own share.\n *\n * Left untouched (returns `placed` unchanged, same object references):\n * - fewer than 2 placed blocks (no gap exists to grow)\n * - `remaining <= SURPLUS_MIN_REMAINING` (regression lock: byte-identical)\n * - a column whose first block isn't flush with the rect's top edge (e.g.\n * `quote`, which already centers its whole stack — growing its internal\n * gaps after the fact would just push it off-center instead of \"breathing\")\n */\nfunction distributeSurplus(\n placed: PlacedBlock[],\n rect: ContentRect,\n gap: number,\n bottom: number,\n): PlacedBlock[] {\n if (placed.length < 2) return placed\n const remaining = rect.y + rect.h - bottom\n if (remaining <= SURPLUS_MIN_REMAINING) return placed\n\n const columns = new Map<number, number[]>()\n placed.forEach((p, i) => {\n const col = columns.get(p.box.x)\n if (col) col.push(i)\n else columns.set(p.box.x, [i])\n })\n const eligibleColumns = Array.from(columns.values()).filter(\n (idxs) => idxs.length >= 2 && Math.abs(placed[idxs[0]].box.y - rect.y) < 0.5,\n )\n const totalGaps = eligibleColumns.reduce((n, idxs) => n + idxs.length - 1, 0)\n if (totalGaps === 0) return placed\n\n const perGapIncrement = Math.min(\n (remaining * SURPLUS_SHARE) / totalGaps,\n gap * SURPLUS_GAP_CAP_RATIO,\n )\n\n const shiftByIndex = new Map<number, number>()\n for (const idxs of eligibleColumns) {\n idxs.forEach((i, k) => {\n if (k > 0) shiftByIndex.set(i, k * perGapIncrement)\n })\n }\n return placed.map((p, i) => {\n const shift = shiftByIndex.get(i)\n return shift ? { ...p, box: { ...p.box, y: p.box.y + shift } } : p\n })\n}\n\n/**\n * Vertical overflow guard: retries `layoutContent` with progressively tighter\n * gaps, then — if the tightest gap still overflows — keeps only the blocks\n * whose bottom edge fits the rect and reports how many were dropped so the\n * caller can render a \"+N 项未展示\" marker. Quality gates upstream (ir-quality\n * warn, backend lint) are meant to keep real decks from ever reaching the\n * drop path — this is the last line of defense.\n *\n * On success, hands the placement through `distributeSurplus` so any leftover\n * space below a short stack gets spent as gap growth rather than sitting\n * dead at the bottom (wave-B S4) — callers (`SvgContent`, `BigNumber`,\n * `AssertionEvidence`) render/annotate straight from the returned boxes, so\n * the audit annotations follow automatically.\n */\nexport function layoutContentFit(\n variant: Variant | undefined,\n blocks: Block[],\n rect: ContentRect,\n ctx: BlockCtx,\n): { placed: PlacedBlock[]; dropped: number } {\n // gapScale(shape token,2026-07-10):只作用于首选档(BLOCK_GAP×scale),\n // 紧缩 fallback 档(10/6)不乘——主题偏好只影响有余量时的呼吸感,空间\n // 紧张时的回落行为全主题一致。\n const scaledTiers =\n ctx.shape?.gapScale && ctx.shape.gapScale !== 1\n ? [Math.round(BLOCK_GAP * ctx.shape.gapScale), ...GAP_TIERS.slice(1)]\n : GAP_TIERS\n for (const gap of scaledTiers) {\n const placed = layoutContent(variant, blocks, rect, ctx, gap)\n const bottom = stackBottom(placed, ctx)\n if (bottom <= rect.y + rect.h + 1) {\n // 先做卡片密度拉伸(吃大头),剩余交给间距呼吸\n const grown = growStretchables(placed, rect, ctx)\n const grownBottom = grown === placed ? bottom : stackBottom(grown, ctx)\n return { placed: distributeSurplus(grown, rect, gap, grownBottom), dropped: 0 }\n }\n }\n const placed = layoutContent(variant, blocks, rect, ctx, GAP_TIERS[GAP_TIERS.length - 1])\n const kept = placed.filter(\n (p) => p.box.y + measureBlock(p.block, p.box.w, ctx) <= rect.y + rect.h + 1,\n )\n // A slide degraded to nothing but the \"+N 项未展示\" marker is worse than\n // one with a single overflowing block — keep the first placed block even\n // if it alone doesn't fit the rect (upstream quality gates make this rare).\n // 保留块带上剩余可用高(box.h < 测量高 = 截断预算,2026-07-11 存量\n // deck 5 项长卡画出页外实锤):可分割块(row_cards)据此块内截断并\n // 自画「+N 项未展示」,不感知 box.h 的块行为不变(照旧溢出渲染)。\n if (kept.length === 0 && placed.length > 0) {\n const first = placed[0]\n const avail = rect.y + rect.h - first.box.y\n return {\n placed: [{ ...first, box: { ...first.box, h: Math.max(80, avail) } }],\n dropped: placed.length - 1,\n }\n }\n return { placed: kept, dropped: placed.length - kept.length }\n}\n","// GF/svg/archetypes/cover-banner-title.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * banner-title cover archetype(spec §3.2):结论横幅式封面——org 圆点标、\n * 大标题、accent 短粗条、meta 分隔线。自 templates/consulting.tsx 的\n * MckinseyNavyCover 提炼,baked 常量全部换 ctx.colors(替换表见 P1 计划\n * Task 4)。纪律:本文件禁 theme id、禁颜色 hex 字面量。\n *\n * 2026-07-09(Wave 3 Task 21b,独立 commit):P1 逐字节提炼把旧\n * MckinseyNavyCover 的一个既有瑕疵原样搬了进来——accent 条与副题首行轻微\n * 叠压(旧模板 titleLastY+68 vs. accent 条 [+40,+48],见下方 subtitleY 的\n * 注释)。本任务有意偏离旧模板修掉它,只改了 subtitleY 一个间距常量\n * (68→96),不动 accent 条自身的 40/8。这是本文件与旧模板唯一的几何差异\n * ——cover-banner-title.test.tsx 里对旧模板的 toBe 逐字节断言相应改为观感\n * 等价断言(结构/文本/token 化仍锁),详见该测试文件注释。\n */\nexport function BannerTitleCover({ ir, slide, ctx }: SvgTemplateProps) {\n const title = layoutSvgText(slide.heading, {\n maxWidth: 1088,\n fontSize: 84,\n maxLines: 2,\n lineHeightRatio: 1.08,\n })\n const subtitle = layoutSvgText(slide.subheading, {\n maxWidth: 1040,\n fontSize: 34,\n maxLines: 2,\n lineHeightRatio: 1.2,\n })\n const titleY = title.lines.length > 1 ? 322 : 362\n const titleLastY =\n titleY + Math.max(0, title.lines.length - 1) * title.lineHeight\n // 2026-07-09 有意偏离旧模板修叠压 bug:旧 MckinseyNavyCover\n // (templates/consulting.tsx 29-183 行)用 titleLastY+68,但下方 accent 条\n // 占 [titleLastY+40, titleLastY+48](40 gap + 8 height),只给条底到副题\n // 基线留了 20px(68-48)。副题是 34px 中文 sans body 字(dominantBaseline\n // =\"alphabetic\")——按本仓库其余 archetype 已反复验证的\"六主题统一公式\"\n // 惯例(见 content-rail-numbered.tsx/academic.tsx 等 subheadingY 注释:\n // 22px 副题的可视 ascent 按其字号本身估算,即 ascent≈fontSize,外加 14px\n // 目标可视间距),34px 副题的可视 ascent≈34,所以条底到副题基线至少要留\n // 34+14=48px 才不叠压,20px 远远不够,字形顶部与 accent 条底边重叠。这里\n // 的锚点是矩形色块(accent 条),不是文字基线,没有\"标题自身 descent\"要\n // 清(做法同 content-banner-heading.tsx 的 bannerBottom 锚点,不套六主题\n // 公式里 round(0.12*titleFontSize) 那一项)。改后:\n // titleLastY + 48(条底) + 34(副题 ascent) + 14(目标间距) = titleLastY + 96\n // 只动这一个间距常量(68→96),条本身的定位(40/8,见下方 rect 注释)不变。\n const subtitleY = titleLastY + 96\n\n const org = ir.meta.organization\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const author = ir.meta.authors?.[0]\n const authorText = author\n ? [author.name, author.role].filter(Boolean).join(\" · \")\n : null\n const date = ir.meta.date\n const version = ir.meta.version\n\n const metaDividerY =\n subtitleY +\n (subtitle.lines.length > 0\n ? subtitle.lines.length * subtitle.lineHeight + 24\n : 60)\n const metaTextY = metaDividerY + 48\n\n return (\n <>\n {/* Organization label */}\n <g transform=\"translate(96, 136)\">\n <circle cx=\"12\" cy=\"-12\" r=\"12\" fill={ctx.colors.accent} />\n {org && (\n <text\n x=\"48\"\n y=\"0\"\n fontFamily={ctx.fonts.body}\n fontSize=\"32\"\n fill={ctx.colors.primary}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n </g>\n\n {/* Confidentiality badge (top right) */}\n {confLabel && (\n <g>\n <rect\n x=\"1058\"\n y=\"100\"\n width=\"126\"\n height=\"48\"\n rx=\"4\"\n fill=\"none\"\n stroke={ctx.colors.primary}\n strokeWidth=\"2\"\n />\n <rect x=\"1058\" y=\"100\" width=\"8\" height=\"48\" fill={ctx.colors.accent} />\n <text\n x=\"1128\"\n y=\"131\"\n fontFamily={ctx.fonts.body}\n fontSize=\"26\"\n fill={ctx.colors.primary}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {confLabel}\n </text>\n </g>\n )}\n\n {/* Main heading lines */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={titleY + i * title.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Short, thick navy bar under the title — echoes the Content page's\n assertion banner so Cover reads as the same theme. The 40px gap\n clears the 84px CJK title's own glyph descent so the bar doesn't\n read as an underline; the 8px height is unchanged from the legacy\n template. 2026-07-09: subtitleY (above) grew from titleLastY+68 to\n titleLastY+96 to clear this bar's bottom edge without touching the\n bar's own 40/8 — see subtitleY's own comment for the full math. */}\n <rect x=\"96\" y={titleLastY + 40} width=\"96\" height=\"8\" fill={ctx.colors.primary} />\n\n {/* Subheading (italic) */}\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={subtitleY + i * subtitle.lineHeight}\n fontFamily={ctx.fonts.body}\n fontSize={subtitle.fontSize}\n fill={ctx.colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Meta divider + meta row (author / date / version) */}\n {(authorText || date || version) && (\n <>\n <line\n x1=\"96\"\n y1={metaDividerY}\n x2=\"820\"\n y2={metaDividerY}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth=\"1.4\"\n />\n <text\n x=\"96\"\n y={metaTextY}\n fontFamily={ctx.fonts.body}\n fontSize=\"26\"\n dominantBaseline=\"alphabetic\"\n >\n {authorText && <tspan fill={ctx.colors.primary}>{authorText}</tspan>}\n {date && (\n <tspan fill={ctx.colors.muted}>{`${authorText ? \" · \" : \"\"}${date}`}</tspan>\n )}\n {version && (\n <tspan fill={ctx.colors.muted}>{`${authorText || date ? \" · \" : \"\"}${version}`}</tspan>\n )}\n </text>\n </>\n )}\n </>\n )\n}\n","/**\n * Heading auto-sizing for the single-source SVG renderer. Ported from the\n * exporter's `text-fit.ts` (deleted once the legacy export path is removed) so\n * the SVG templates own their heading metric. Sizes a heading from its visual\n * length so a long title shrinks to fit instead of overflowing.\n */\n\nimport {\n layoutSvgText,\n truncateToUnits,\n type SvgTextLayout,\n} from \"../lib/svg-text-layout\"\n\n// CJK punctuation/symbols (U+3000 ideographic space .. U+303F), ideographs\n// (ext-A + unified), compatibility ideographs, and full-width forms — each\n// renders ~1 em square. Built from an escaped string so no literal irregular\n// whitespace (U+3000) ends up in the source.\n//\n// S3e fix (same class as S3c's fix to svg-text-layout.ts's WIDE_CHAR_RE —\n// see 3f752de0's diff). This file keeps its own, independent CJK-weight\n// table (visualUnits' CJK weight is 1.2, vs. measureTextUnits' 1.0 — see\n// capacity.ts's own note on the two tables being separate), so S3c's fix\n// to the *other* file's regex didn't touch this one — this table had the\n// identical gap: U+2014 (EM DASH, doubled as \"——\", the idiomatic CJK\n// long-dash mark) and U+2018 through U+201F (the quotation-mark sub-block\n// of General Punctuation) fell through to the narrow \"other\" 0.56 weight\n// below instead of the full CJK-wide 1.2 weight every other ideograph/\n// ideographic-punctuation/fullwidth-form character in this range already\n// gets. Ideographic punctuation (U+3000-U+303F) and fullwidth forms\n// (U+FF00-U+FFEF) were already covered by this regex before this fix —\n// only the two sub-ranges named above needed adding.\nconst CJK_WIDE = new RegExp(\n \"[\\\\u2014\\\\u2018-\\\\u201f\\\\u3000-\\\\u303f\\\\u3400-\\\\u9fff\\\\uf900-\\\\ufaff\\\\uff00-\\\\uffef]\",\n)\n\n/** Approximate width of a string in em units (CJK≈1.2, ascii≈0.56, space≈0.3). */\nexport function visualUnits(text: string): number {\n let u = 0\n for (const ch of text) {\n if (/\\s/.test(ch)) u += 0.3\n else if (CJK_WIDE.test(ch)) u += 1.2\n else u += 0.56\n }\n return u\n}\n\n/**\n * Largest font size (pt, clamped to [minPt, maxPt]) at which `text` fits within\n * `widthIn` inches across `lines` line(s). 1pt ≈ 1/72 in; one em ≈ fontSize pt.\n */\nexport function fitHeadingPt(\n text: string,\n opts: { widthIn: number; maxPt: number; minPt?: number; lines?: number },\n): number {\n const { widthIn, maxPt, minPt = 28, lines = 1 } = opts\n const u = visualUnits(text)\n if (u <= 0) return maxPt\n const pt = Math.floor((72 * widthIn * lines) / u)\n return Math.max(minPt, Math.min(maxPt, pt))\n}\n\n/**\n * Multi-line heading fit: wraps and shrinks like `layoutSvgText`, but when\n * even `minPt` can't make the (possibly pathologically long) full text fit\n * within `maxLines`, truncates the source text first so the final layout\n * still respects the floor. Supersedes single-line `fitHeadingPt` at call\n * sites where the heading may need to wrap — a single `min-Pt`-floored line\n * can still overflow width when the text is long enough (stress content),\n * since `fitHeadingPt` never wraps or truncates.\n *\n * Uses `measureTextUnits`'s CJK weighting (via `layoutSvgText`), the same\n * model the overflow auditor uses, so the returned layout is guaranteed to\n * fit `maxWidth` regardless of whether the `minPt` floor was honored.\n */\nexport function fitHeadingLines(\n text: string | undefined,\n opts: {\n maxWidth: number\n fontSize: number\n maxLines?: number\n minPt?: number\n lineHeightRatio?: number\n },\n): SvgTextLayout {\n const { maxWidth, fontSize, maxLines = 2, minPt = 28, lineHeightRatio } = opts\n const content = text ?? \"\"\n // balanceLines: headings are the hero surface where a widow line\n // (「年度战略回」+「顾」) reads broken — body/subtitle call sites keep the\n // greedy default (see SvgTextLayoutOptions).\n const first = layoutSvgText(content, {\n maxWidth,\n fontSize,\n maxLines,\n lineHeightRatio,\n balanceLines: true,\n })\n if (!content.trim() || first.fontSize >= minPt) return first\n const budget = (maxWidth / minPt) * maxLines\n const truncated = truncateToUnits(content, budget)\n return layoutSvgText(truncated, {\n maxWidth,\n fontSize: minPt,\n maxLines,\n lineHeightRatio,\n balanceLines: true,\n })\n}\n","// GF/svg/archetypes/cover-poster-center.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * poster-center cover archetype(spec §3.2):全居中\"海报\"式封面——超大居中标题、\n * 短横条、斜体副标题、底部单行合并 meta。自 templates/creative.tsx 的\n * EditorialDarkCover 提炼,baked 常量全部换 ctx.colors(替换表见 P1 计划\n * Task 5)。纪律:本文件禁 theme id、禁颜色 hex 字面量。\n *\n * 与 Task 4(banner-title)的差异:creative 源文件里 Cover 的底部 meta 行用了\n * 一个比 MUTED 更深的次要灰(META_MUTED),在 token 表里没有对应项——两者若\n * 都映射到 ctx.colors.muted,会在 creative 主题下产生与旧模板不同的输出(旧\n * 模板两种灰各异,token 化后合一)。这是本任务裁决的语义收窄:META_MUTED 并\n * 入 muted,接受 creative 下观感等价而非逐字节一致(旧模板中两者只是同一\n * \"次要文本\"语义的两级深浅,不值得为其单开一个 token)。\n *\n * 映射订正(审查修复):源文件的 RED 常量与 creative token 表的 `primary`\n * 逐字节相同,与 `accent`(暖棕,另一个不同的色值)不同——RED 实际语义是\n * \"主强调色\"而非\"accent 语义位\",故短横条 fill 映射到 `ctx.colors.primary`\n * 而非 `ctx.colors.accent`,才能满足「creative tokens 下逐字节观感等价」的\n * 锚点(P1 计划替换表原写 RED→accent 系笔误)。\n *\n * 全黑全居中\"海报\"式主视觉:超大标题、短横条、斜体副标题、底部单行合并\n * meta——取代了旧版散落四角的元信息(原本还挤在 MasterChrome 的 logo 条带\n * x 64-160/1120-1216, y 48-88 内)。把每个元素都居中在 CENTER_X 上,能让\n * 其 x 延伸范围稳定落在 [190,1090],无论 y 是多少都避开四个 logo 条带。\n */\n\n/** Center-x of the 1280-wide canvas — every poster-mode element anchors here. */\nconst CENTER_X = 640\n\n/** Short hairline under the title: the *only* decorative accent-weight\n * element on this page — a pure decoration, never a text color, per the\n * poster grammar. */\nconst ACCENT_BAR_W = 60\nconst ACCENT_BAR_H = 4\n\nexport function PosterCenterCover({ ir, slide, ctx }: SvgTemplateProps) {\n const org = ir.meta.organization\n const date = ir.meta.date\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const author = ir.meta.authors?.[0]\n const authorText = author\n ? [author.name, author.role].filter(Boolean).join(\" · \")\n : null\n const version = ir.meta.version\n\n const title = fitHeadingLines(slide.heading, {\n maxWidth: 1100,\n fontSize: 100,\n maxLines: 2,\n minPt: 52,\n })\n // Fixed first-line baseline regardless of 1 vs. 2 lines: at fontSize 100 a\n // 2-line title's first glyph top (baseline - ~0.75*fontSize ≈ 205) still\n // clears y=0 comfortably, and the accent bar below is positioned off the\n // *last* line so it never depends on this choice. This archetype only\n // covers Cover (no shared Content-page `TITLE_Y` in this file), so\n // `COVER_TITLE_Y` is simply this page's own baseline, not disambiguating\n // against a sibling constant the way the source module needed to.\n const COVER_TITLE_Y = 280\n const titleLastY = COVER_TITLE_Y + Math.max(0, title.lines.length - 1) * title.lineHeight\n\n // +56→+70(2026-07-10 导出审计:导出端字体回退行高更高,56 时字底压线)\n const accentY = titleLastY + 70\n\n const subtitle = layoutSvgText(slide.subheading || \"\", {\n maxWidth: 900,\n fontSize: 32,\n maxLines: 2,\n lineHeightRatio: 1.2,\n })\n const subtitleY = accentY + 64\n const subtitleLastY =\n subtitleY + Math.max(0, subtitle.lines.length - 1) * subtitle.lineHeight\n\n const metaParts = [org, confLabel, date, authorText, version].filter(\n (v): v is string => Boolean(v),\n )\n const metaLine =\n metaParts.length > 0\n ? fitSvgLine(metaParts.join(\" · \"), {\n maxWidth: 900,\n fontSize: 20,\n minFontSize: 14,\n })\n : null\n // Bottom meta line: fixed at 650 for the common case, pushed down only if a\n // long (2-line) title + 2-line subtitle combo would otherwise run into it.\n const metaY = Math.max(650, subtitleLastY + 56)\n\n return (\n <>\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={CENTER_X}\n y={COVER_TITLE_Y + i * title.lineHeight}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"800\"\n fill={ctx.colors.text}\n letterSpacing=\"-1\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n <rect\n x={CENTER_X - ACCENT_BAR_W / 2}\n y={accentY}\n width={ACCENT_BAR_W}\n height={ACCENT_BAR_H}\n rx=\"2\"\n fill={ctx.colors.primary}\n />\n\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x={CENTER_X}\n y={subtitleY + i * subtitle.lineHeight}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={subtitle.fontSize}\n fill={ctx.colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {metaLine && (\n <text\n x={CENTER_X}\n y={metaY}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={metaLine.fontSize}\n fill={ctx.colors.muted}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {metaLine.text}\n </text>\n )}\n </>\n )\n}\n","import type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * split-diagonal cover archetype(P3 Item ①,spec §3.2):左侧 primary 色块以\n * 斜切线收边,org 竖排压在色块上、标题在右侧净空区跨近斜切线。这是 P3「新\n * 表达一次全主题生效」的流程验收对象——纯新写(无源模板可提炼),从零按\n * archetype 纪律(零 theme id、零 baked 主题色 hex,颜色只来自 ctx)实现。\n *\n * 与 P1/P2 六个 cover archetype 的新问题:色块上的文字色不能像其余六个那样\n * 假设固定(它们的文字都画在页型默认底色上),色块用 ctx.colors.primary、\n * 而 primary 的明暗随主题/override 变(academic 深绿 → 浅字,tech 亮青 →\n * 深字)。故引入 readableOn(primary) 按相对明度自适应选前景色。**这正是\n * spec §3.1 tokens 扩展的第一个真实触发信号(P3 Item ④ 输入)**:若后续更\n * 多 archetype 需要「某 token 的明度标记」,应把这个内联计算提升为 token\n * 字段;目前仅本 archetype 需要,保持内联、不预先开 token。\n */\n\n/** 斜切色块几何:顶宽 560、底宽 460(向下内收,形成右倾斜切线)。 */\nconst BLOCK_TOP_W = 560\nconst BLOCK_BOTTOM_W = 460\nconst BLOCK_PATH = `M 0,0 L ${BLOCK_TOP_W},0 L ${BLOCK_BOTTOM_W},720 L 0,720 Z`\n/** 标题净空区左缘:躲开斜切线在标题基线高度的 x(约 500),留 96 边距。 */\nconst TITLE_X = 596\nconst TITLE_MAX_W = 1280 - TITLE_X - 96\n\n/**\n * sRGB 相对明度(WCAG 定义):0(黑)~1(白)。IR 的 HexColor 允许 3~8 位\n * (#RGB/#RGBA/#RRGGBB/#RRGGBBAA,见 pptx-ir schema)——3/4 位先按位翻倍\n * 展开、8 位裁掉 alpha(2026-07-10 深度自查修复:原实现只认 6 位,override\n * 传 #FFC 这类亮色短写会当 0 明度处理、错配白字)。\n */\nfunction relativeLuminance(hex: string): number {\n let h = hex.trim().replace(/^#/, \"\")\n if (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\")\n if (h.length === 8) h = h.slice(0, 6)\n if (!/^[0-9a-fA-F]{6}$/.test(h)) return 0\n const n = parseInt(h, 16)\n const chan = [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * chan[0] + 0.7152 * chan[1] + 0.0722 * chan[2]\n}\n\n/**\n * 压在给定背景色上的可读前景色:明度高的背景配深字、明度低配浅字。阈值\n * 0.4 略偏向浅字(大色块上浅字观感更稳)。返回中性黑/白,不引主题色。\n */\nexport function readableOn(bgHex: string): \"#FFFFFF\" | \"#0A0E14\" {\n return relativeLuminance(bgHex) > 0.4 ? \"#0A0E14\" : \"#FFFFFF\"\n}\n\nexport function SplitDiagonalCover({ ir, slide, ctx }: SvgTemplateProps) {\n const org = ir.meta.organization\n const date = ir.meta.date\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const author = ir.meta.authors?.[0]\n const authorText = author ? [author.name, author.role].filter(Boolean).join(\" · \") : null\n const version = ir.meta.version\n\n const onBlock = readableOn(ctx.colors.primary)\n\n const title = fitHeadingLines(slide.heading, {\n maxWidth: TITLE_MAX_W,\n fontSize: 76,\n maxLines: 3,\n minPt: 44,\n })\n const TITLE_Y = 300\n const titleLastY = TITLE_Y + Math.max(0, title.lines.length - 1) * title.lineHeight\n\n const accentY = titleLastY + 40\n\n const subtitle = layoutSvgText(slide.subheading || \"\", {\n maxWidth: TITLE_MAX_W,\n fontSize: 26,\n maxLines: 2,\n lineHeightRatio: 1.25,\n })\n const subtitleY = accentY + 44\n\n const metaParts = [org, confLabel, date, authorText, version].filter(\n (v): v is string => Boolean(v),\n )\n const metaLine =\n metaParts.length > 0\n ? fitSvgLine(metaParts.join(\" · \"), {\n maxWidth: TITLE_MAX_W,\n fontSize: 19,\n minFontSize: 14,\n })\n : null\n\n return (\n <>\n {/* 斜切色块 */}\n <path d={BLOCK_PATH} fill={ctx.colors.primary} />\n\n {/* org 标签压在色块上(readableOn 自适应前景色) */}\n {org && (\n <text\n x={96}\n y={128}\n fontFamily={ctx.fonts.body}\n fontSize={22}\n fill={onBlock}\n fillOpacity={0.92}\n letterSpacing={2}\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* 色块上的大留白装饰点(accent 强调,避 logo 带位置) */}\n <circle cx={96} cy={620} r={10} fill={onBlock} fillOpacity={0.92} />\n\n {/* 标题:右侧净空区,跨近斜切线,用页型默认文字色 */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={TITLE_X}\n y={TITLE_Y + i * title.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"700\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* accent 短条 */}\n <rect x={TITLE_X} y={accentY} width={72} height={5} fill={ctx.colors.primary} />\n\n {/* 副题 */}\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x={TITLE_X}\n y={subtitleY + i * subtitle.lineHeight}\n fontFamily={ctx.fonts.body}\n fontSize={subtitle.fontSize}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* meta 行:右下 */}\n {metaLine && (\n <text\n x={TITLE_X}\n y={662}\n fontFamily={ctx.fonts.body}\n fontSize={metaLine.fontSize}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {metaLine.text}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/cover-left-anchor.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * left-anchor cover archetype(spec §3.2):左侧 40%宽通栏色块 + 右侧留白面板——\n * 色块内嵌白色主标题,org / 保密标 / 副标题 / meta 全部挪到右侧白面板。自\n * templates/academic.tsx 的 BCGEmeraldCover(62-234 行)提炼,无随迁 helper。\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——本文件有两处豁免(白字 + 装饰\n * 深色三角),均在下方点名理由并有测试锁住,grep 清零门预期恰好命中这两处。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/academic.ts 的 colors。\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,核实过程见\n * w1t1 任务报告):\n * - `colors.primary` / `colors.accent`:源函数已直接消费 `ctx.colors`,未\n * 烤死,原样保留。\n * - 源文件私有常量 `TEXT` → `ctx.colors.text` —— 与 academic token 表逐\n * 字符精确匹配。\n * - 源文件私有常量 `MUTED` → `ctx.colors.muted` —— 精确匹配。\n * - 源文件私有常量 `HAIRLINE` → `ctx.colors.border ?? ctx.colors.muted` ——\n * 精确匹配 academic 的 border 字段,`??` 兜底沿用 cover-banner-title.tsx\n * 的既有写法(`border` 在 ThemeColors 上是可选字段)。\n *\n * 装饰色豁免(修订,取代最初的\"孤儿色并入 primary\"方案——见下方修复记录):\n * 源文件私有常量 `TRIANGLE_DEEP` 是色块角落三角形的填色,其自身注释写明是\n * \"one shade darker than colors.primary\",语义上就是\"与 primary 同色系但更深\n * 一号\"的纯装饰对比色,不代表 token 表里任何一个语义字段(不是 primary、不是\n * accent,也没有 primaryDark 这类字段)——若强行并入 primary,三角形会与背景\n * 色块同色而彻底隐形,等于删除了一个可见装饰元素,不是\"观感等价的降级\"而是\n * \"观感被破坏\"。比照计划 Wave 3 Task 22(tech 主题 Decor 的渐变款私有装饰常量\n * 先例:装饰性数值留在 archetype 文件内、不进 ctx.colors),本文件原样保留\n * `TRIANGLE_DEEP` 的十六进制值作为文件私有装饰常量(不导出、不进 token 替换\n * 表),在测试里用同白字豁免一样的锁法断言其值出现在输出中。\n *\n * 白字例外(Global Constraints \"产品逻辑白字\"豁免,同 custom.tsx withBg 分支\n * 先例):主标题固定画在不透明的 40%宽 `colors.primary` 色块内部,为保证在\n * 任意主题色下都可读,标题字色写死为纯白——这不是某个主题的烤死色(它不随\n * 主题变化,也不在任何 token 字段里),是\"色块上必须白字\"的结构性产品逻辑,\n * 故不进上面的替换表,予以保留并在测试里锁死(跨主题渲染时仍应固定为纯白,\n * 不会变成任何主题的 primary/accent/text)。\n *\n * 修复记录(协调方 review 后订正):初版把 `TRIANGLE_DEEP` 当孤儿色并入了\n * `colors.primary`,判定为\"观感等价档的可接受降级\"。协调方指出这个判断不\n * 成立——装饰元素从可见变为完全隐形是观感被破坏,不是等价,遂改为上面的\n * \"装饰色豁免\"方案:原样保留私有 hex 常量,不做 token 映射。\n */\n\nconst COVER_BLOCK_W = 512 // 40% of the 1280-wide canvas\nconst COVER_TITLE_X = 64\nconst COVER_TITLE_MAX_W = 360\nconst COVER_BLOCK_CENTER_Y = 360 // vertical center of the full-height block\nconst COVER_RIGHT_X = COVER_BLOCK_W + 64 // 576\nconst COVER_RIGHT_EDGE = 1184 // mirrors the 96px page margin used elsewhere (1280 - 96)\nconst COVER_RIGHT_MAX_W = COVER_RIGHT_EDGE - COVER_RIGHT_X\n\n// Shared vertical-centering convention (see consulting.tsx's assertion\n// banner for the original derivation): for a single line at `fontSize`,\n// `pivotY + round(fontSize * 0.32)` lands the baseline visually centered on\n// `pivotY`; multi-line blocks spread symmetrically around the same pivot.\nconst BASELINE_FUDGE_RATIO = 0.32\n\n// Decoration-only swatch (see file header's \"装饰色豁免\"): one shade darker\n// than `colors.primary`, used solely for the corner triangle's same-hue\n// contrast. Deliberately NOT mapped to any `ctx.colors` field — there is no\n// token for \"primary but darker\", and merging it into `primary` would make\n// the triangle invisible against the block it sits on (see the header's\n// fix-record). Ported verbatim from templates/academic.tsx.\nconst TRIANGLE_DEEP = \"#004C38\"\n\nexport function LeftAnchorCover({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n\n // Narrow (420px) in-block column: a CJK title routinely wraps to 2-3 lines\n // at hero scale, and the block runs the full 720px page height so there's\n // room — hence maxLines 3 here vs. the usual 2, with a 32pt floor to stay\n // legible even for a pathologically long title.\n const title = fitHeadingLines(slide.heading, {\n maxWidth: COVER_TITLE_MAX_W,\n fontSize: 64,\n maxLines: 3,\n minPt: 32,\n })\n const titleFudge = Math.round(title.fontSize * BASELINE_FUDGE_RATIO)\n const titleFirstY =\n COVER_BLOCK_CENTER_Y -\n ((title.lines.length - 1) * title.lineHeight) / 2 +\n titleFudge\n\n const subtitle = layoutSvgText(slide.subheading, {\n maxWidth: COVER_RIGHT_MAX_W,\n fontSize: 30,\n maxLines: 3,\n lineHeightRatio: 1.2,\n })\n\n const org = ir.meta.organization\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const author = ir.meta.authors?.[0]\n const authorText = author\n ? [author.name, author.role].filter(Boolean).join(\" · \")\n : null\n const date = ir.meta.date\n const version = ir.meta.version\n\n const orgY = 168\n const subtitleY = orgY + 64\n const subtitleLastY =\n subtitleY + Math.max(0, subtitle.lines.length - 1) * subtitle.lineHeight\n const metaDividerY =\n subtitle.lines.length > 0 ? subtitleLastY + subtitle.lineHeight + 24 : orgY + 56\n const metaTextY = metaDividerY + 44\n\n return (\n <>\n {/* Left 40%-width primary color block, full page height */}\n <rect x=\"0\" y=\"0\" width={COVER_BLOCK_W} height=\"720\" fill={colors.primary} />\n\n {/* Decor: deeper-green corner triangle, private decoration-only swatch\n (see file header's \"装饰色豁免\" — `TRIANGLE_DEEP`, not a token).\n Drawn here (body), not in a Decor slot, mirroring the source: it\n must paint *after* the block above to actually show (a decor-slot\n shape at this position would be painted over by the opaque block,\n which always renders after Decor). */}\n <polygon points=\"0,720 0,520 200,720\" fill={TRIANGLE_DEEP} />\n\n {/* Heading set inside the block — fixed white (see file header's\n \"白字例外\"), not a theme color. */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={COVER_TITLE_X}\n y={titleFirstY + i * title.lineHeight}\n fontFamily={fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill=\"#FFFFFF\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Right panel: org label */}\n <g transform={`translate(${COVER_RIGHT_X}, ${orgY})`}>\n <circle cx=\"12\" cy=\"-12\" r=\"12\" fill={colors.accent} />\n {org && (\n <text\n x=\"48\"\n y=\"0\"\n fontFamily={fonts.body}\n fontSize=\"32\"\n fill={colors.text}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n </g>\n\n {/* Confidentiality badge (top right, over the white panel). y=104 keeps\n it clear of MasterChrome's tr logo band (x 1120-1216, y 48-88) —\n same safety margin as consulting's y=100 equivalent badge. */}\n {confLabel && (\n <g>\n <rect\n x=\"1064\"\n y=\"104\"\n width=\"120\"\n height=\"48\"\n rx=\"6\"\n fill=\"none\"\n stroke={colors.primary}\n strokeWidth=\"2\"\n />\n <text\n x=\"1124\"\n y=\"135\"\n fontFamily={fonts.body}\n fontSize=\"26\"\n fill={colors.text}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {confLabel}\n </text>\n </g>\n )}\n\n {/* Subheading (italic) */}\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x={COVER_RIGHT_X}\n y={subtitleY + i * subtitle.lineHeight}\n fontFamily={fonts.body}\n fontSize={subtitle.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Meta divider + meta row (author / date / version) */}\n {(authorText || date || version) && (\n <>\n <line\n x1={COVER_RIGHT_X}\n y1={metaDividerY}\n x2={COVER_RIGHT_EDGE}\n y2={metaDividerY}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.4\"\n />\n <text\n x={COVER_RIGHT_X}\n y={metaTextY}\n fontFamily={fonts.body}\n fontSize=\"26\"\n dominantBaseline=\"alphabetic\"\n >\n {authorText && <tspan fill={colors.text}>{authorText}</tspan>}\n {date && <tspan fill={colors.muted}>{`${authorText ? \" · \" : \"\"}${date}`}</tspan>}\n {version && (\n <tspan fill={colors.muted}>{`${authorText || date ? \" · \" : \"\"}${version}`}</tspan>\n )}\n </text>\n </>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/cover-constellation.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * constellation cover archetype(spec §3.2):底锚英雄标题 + 右侧半区的 9 点\n * 星座光点 motif(hero 点带三层同心光晕)。自 templates/tech.tsx 的\n * `BentoTechCover`(703-864 行)提炼,无随迁 helper——函数体本身消费的两处\n * 模块级私有常量(`COVER_MOTIF_POINTS`/`COVER_MOTIF_HERO_POINT`,687-700 行,\n * 星座坐标几何)与三个不透明度/描边宽度常量(`BENTO_CARD_STROKE_WIDTH`\n * 56 行、`BENTO_KPI_GLOW_RING1_OPACITY`/`BENTO_KPI_GLOW_RING2_OPACITY`\n * 170-171 行,光晕环复用 KPI 卡片同款视觉语言)随迁为本文件私有常量(不导出、\n * 不建公共 util)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/tech.ts 的 colors):\n * Step A 对函数区间(687-864 行)复核 grep 未命中任何 `#XXXXXX` 字面量或\n * theme id 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.text`/`colors.muted`/`colors.accent`),无烤死颜色常量。随迁的\n * 三个不透明度/线宽私有常量(\"1\"/\"0.18\"/\"0.07\")是数值字符串不是颜色,\n * 不在 Step B 替换表范围内,原样随迁。**档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\n\n// Ported verbatim from templates/tech.tsx (56/170-171 行) — opacity/stroke\n// width constants consumed by the glow rings below, not colors.\nconst BENTO_CARD_STROKE_WIDTH = \"1\"\nconst BENTO_KPI_GLOW_RING1_OPACITY = \"0.18\"\nconst BENTO_KPI_GLOW_RING2_OPACITY = \"0.07\"\n\n/**\n * Cover's signature node-line motif: 9 fixed points of varying radius (an\n * organic \"constellation\" rather than a uniform dot grid), connected in\n * order by one polyline. Geometry is IR-independent, so this is a plain\n * constant, not something computed per-render. Ported verbatim from\n * templates/tech.tsx(687-697 行).\n */\nconst COVER_MOTIF_POINTS = [\n { x: 700, y: 300, r: 2 },\n { x: 800, y: 218, r: 3 },\n { x: 902, y: 296, r: 2.5 },\n { x: 940, y: 150, r: 2.5 },\n { x: 1030, y: 110, r: 4 },\n { x: 1004, y: 368, r: 3.5 },\n { x: 1100, y: 170, r: 3 },\n { x: 1148, y: 430, r: 2.5 },\n { x: 1180, y: 128, r: 5 },\n]\n/** The largest node (last in `COVER_MOTIF_POINTS`) — the one that earns the\n * extra concentric glow rings. Ported verbatim from templates/tech.tsx(700 行). */\nconst COVER_MOTIF_HERO_POINT = COVER_MOTIF_POINTS[COVER_MOTIF_POINTS.length - 1]\n\nexport function ConstellationCover({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const org = ir.meta.organization\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const date = ir.meta.date\n const metaParts = [confLabel, date].filter((v): v is string => Boolean(v))\n\n const title = fitHeadingLines(slide.heading, {\n maxWidth: 900,\n fontSize: 88,\n maxLines: 2,\n minPt: 44,\n })\n // Bottom-anchored hero title: the *last* line always sits on baseline 520\n // regardless of 1 vs. 2 lines, so the meta row below it never moves.\n const TITLE_BASELINE = 520\n const titleY =\n TITLE_BASELINE - Math.max(0, title.lines.length - 1) * title.lineHeight\n\n const subtitle = slide.subheading\n ? fitSvgLine(slide.subheading, {\n maxWidth: 900,\n fontSize: 30,\n minFontSize: 18,\n })\n : null\n\n return (\n <>\n {/* Top-left kicker: organization name */}\n {org && (\n <text\n x=\"96\"\n y=\"120\"\n fontFamily={fonts.body}\n fontSize=\"22\"\n fill={colors.muted}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* Subtitle sits directly under the title — accent short bar + subtitle.\n Layering: kicker → [constellation zone] → title → bar → subtitle → meta. */}\n {subtitle && (\n <>\n <rect x=\"96\" y=\"548\" width=\"84\" height=\"4\" fill={colors.accent} />\n <text\n x=\"96\"\n y=\"596\"\n fontFamily={fonts.body}\n fontSize={subtitle.fontSize}\n fill={colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {subtitle.text}\n </text>\n </>\n )}\n\n {/* Bottom-left hero title */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={titleY + i * title.lineHeight}\n fontFamily={fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Bottom meta row: confidentiality / date */}\n {metaParts.length > 0 && (\n <text\n x=\"96\"\n y=\"660\"\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {metaParts.join(\" · \")}\n </text>\n )}\n\n {/* Signature node-line motif: 9 nodes at varying radii (not a uniform\n dot grid) connected by a single faint polyline, with the largest\n node picking up a soft concentric glow — same glow technique the\n bento KPI card body uses (no SVG filter; Chrome 103's controlled\n subset has none). */}\n <polyline\n points={COVER_MOTIF_POINTS.map((p) => `${p.x},${p.y}`).join(\" \")}\n fill=\"none\"\n stroke={colors.accent}\n strokeWidth=\"1\"\n strokeOpacity=\"0.25\"\n />\n {COVER_MOTIF_POINTS.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={p.r} fill={colors.accent} />\n ))}\n {/* Glow around the largest node only (last in COVER_MOTIF_POINTS,\n r=5) — same +4/+8 ring offsets and opacity convention as the KPI\n glow, reused here so the theme's \"glow\" visual language reads as\n one signature, not two unrelated effects. */}\n <circle\n cx={COVER_MOTIF_HERO_POINT.x}\n cy={COVER_MOTIF_HERO_POINT.y}\n r={COVER_MOTIF_HERO_POINT.r + 4}\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity={BENTO_KPI_GLOW_RING1_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n <circle\n cx={COVER_MOTIF_HERO_POINT.x}\n cy={COVER_MOTIF_HERO_POINT.y}\n r={COVER_MOTIF_HERO_POINT.r + 8}\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity={BENTO_KPI_GLOW_RING2_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n <circle\n cx={COVER_MOTIF_HERO_POINT.x}\n cy={COVER_MOTIF_HERO_POINT.y}\n r={COVER_MOTIF_HERO_POINT.r + 18}\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity=\"0.1\"\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n <circle\n cx={COVER_MOTIF_HERO_POINT.x}\n cy={COVER_MOTIF_HERO_POINT.y}\n r={COVER_MOTIF_HERO_POINT.r + 30}\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity=\"0.05\"\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n </>\n )\n}\n","// GF/svg/archetypes/cover-editorial-masthead.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * editorial-masthead cover archetype(spec §3.2):居中报头式标题 + 短下划线\n * + 斜体副标题 + 底部一行 meta(组织/日期/密级)。自 templates/magazine.tsx 的\n * `EditorialSerifCover`(23-110 行)提炼,无随迁 helper——Step A 复核该函数\n * 区间未发现任何模块级私有常量被消费(`HAIRLINE_STROKE`〔20 行〕/\n * `ORNAMENT_*`〔475-477 行〕均只在 Chapter/Ending/CornerOrnament 里使用,\n * 与本 Cover 函数无关,不随迁)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/magazine.ts 的 colors):\n * Step A 对函数区间(23-110 行)复核 grep 未命中任何 `#XXXXXX` 字面量或\n * theme id 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.text`/`colors.accent`/`colors.muted`),无烤死颜色常量,无孤儿色。\n * **档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function EditorialMastheadCover({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const org = ir.meta.organization\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const date = ir.meta.date\n const metaParts = [org, date, confLabel].filter((v): v is string => Boolean(v))\n\n // Last-line-anchored: whether the title wraps to 1 or 2 lines, its final\n // baseline always lands on 340 so the underline/subtitle/meta stack below\n // never shifts.\n const HEADING_LAST_BASELINE = 340\n const title = fitHeadingLines(slide.heading, {\n maxWidth: 1040,\n fontSize: 92,\n maxLines: 2,\n minPt: 48,\n })\n const titleY =\n HEADING_LAST_BASELINE - Math.max(0, title.lines.length - 1) * title.lineHeight\n const headingLastY = HEADING_LAST_BASELINE\n\n const underlineY = headingLastY + 56\n const subtitleY = underlineY + 52\n\n const subtitle = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 900, fontSize: 28, minFontSize: 16 })\n : null\n\n return (\n <>\n {title.lines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={titleY + i * title.lineHeight}\n fontFamily={fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n <line\n x1=\"560\"\n y1={underlineY}\n x2=\"720\"\n y2={underlineY}\n stroke={colors.accent}\n strokeWidth=\"1.6\"\n />\n\n {subtitle && (\n <text\n x=\"640\"\n y={subtitleY}\n fontFamily={fonts.heading}\n fontSize={subtitle.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {subtitle.text}\n </text>\n )}\n\n {metaParts.length > 0 && (\n <text\n x=\"640\"\n y=\"656\"\n fontFamily={fonts.body}\n fontSize=\"13\"\n fill={colors.muted}\n letterSpacing=\"2\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {metaParts.join(\" · \")}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/cover-tone-adaptive-header.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\n\n/**\n * tone-adaptive-header cover archetype(spec §3.2):全宽版式——顶部 org 标签 +\n * 保密徽标,居左超大标题 + 斜体副标题,底部分隔线 + 作者/日期/版本 meta 行。\n * 有背景图时整体切换为白字 + 黑色半透明幕布模式。自 templates/custom.tsx 的\n * `CustomCover`(68-248 行)提炼,随迁 helper `hasBgImage`(36-44 行,私有\n * 复制,签名/实现原样不变)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/custom.ts 的 colors。十\n * 六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,核实过程见上):\n * - 源文件私有常量 `INK` —— 与 custom token 表当前的 `primary`、`text`\n * 两个字段精确匹配(custom.ts 里 accent 已从 text/primary 拆分独立,\n * 但 text/primary 二者彼此仍是同一个值,尚未拆分)。INK 在源函数体内\n * 混用于两种语境,不能笼统映射到同一字段:\n * - 文字填色语境(标题、保密徽标文案、作者名)→ `ctx.colors.text`\n * (下方 `textFg`)\n * - 强调/描边语境(保密徽标描边,唯一一处)→ `ctx.colors.primary`\n * (下方 `strokeFg`)\n * 当前两者数值相同,不影响本文件的观感等价断言;**若 custom 主题未来把\n * text/primary 拆开,`textFg`/`strokeFg` 会分道渲染出不同颜色,需回来\n * 重新核实每一处引用点选的是哪个语境**——这是本文件唯一需要长期盯防的\n * 假设,其余映射都是精确值匹配、无歧义。\n * - 源文件私有常量 `MUTED` → `ctx.colors.muted` —— 精确匹配。源函数三处\n * 引用:org 标签、副标题、无背景图模式下右下角 meta 文本(该处源码是\n * 直接写 `MUTED` 常量而非经 `withBg` 派生的变量,机械复制为直接引用\n * `colors.muted`,行为等价——因为该 JSX 分支本就只在 `!withBg` 下渲染,\n * `MUTED` 与派生变量在那里数值恒等)。\n * - 源文件私有常量 `BORDER` → `ctx.colors.border` —— 精确匹配,用于无背\n * 景图模式下的底部分隔线。`border` 在 `ThemeColors` 上是可选字段,\n * `?? colors.muted` 兜底沿用 cover-left-anchor.tsx 的既有写法。\n *\n * withBg 白字/黑幕豁免(Global Constraints 产品逻辑白字豁免,同\n * cover-left-anchor.tsx 白字例外先例):`hasBgImage` 为真时,\n * `textFg`/`strokeFg`/`mutedFg`/`borderColor` 四个派生变量、以及底部单行\n * meta 文本,都固定切到纯白(各自搭配不同 opacity)——这是背景图上强制白字\n * 的结构性产品逻辑,不随主题变化,不进上面的替换表。顶部黑色半透明幕布\n * (scrim for bg-image readability,替代原 linearGradient)同属此类:不是\n * 任何主题 token 的烤色,是固定可读性遮罩——且不是与全局机制重复的遗留\n * 代码:FullSlideSvg.tsx 的全局 auto-scrim 机制通过 `isDesignTheme` 显式\n * 把当前主题排除在外(该文件 ~83/88 行注释:当前主题维持裸背景 + 模型\n * overlay 直通),所以这个局部幕布是本主题封面在有背景图时唯一起作用的\n * 遮罩,必须原样保留。\n *\n * `borderColor` 三元表达式里 withBg 为真那一分支是死分支(机械搬运保留):\n * `borderColor` 只在 `!withBg` 的 JSX 分支里被消费,运行时永远取不到\n * `withBg` 为真那一半,源文件本就如此,不属于 Step C 的映射范畴,不在本次\n * 提炼里顺手\"修掉\"。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量(除上述白字/黑幕两类豁免——\n * grep 清零门预期命中的 hex 全部落在文件头点名的豁免范围内,逐行可核对)。\n */\n\n/** Check whether the slide has a valid background image asset. Ported\n * verbatim from templates/custom.tsx(36-44 行),私有复制,签名/实现不变。*/\nfunction hasBgImage(\n ir: SvgTemplateProps[\"ir\"],\n slide: SvgTemplateProps[\"slide\"],\n): boolean {\n if (slide.background?.kind !== \"asset\") return false\n const assetId = slide.background.asset_id\n const asset = ir.assets.images[assetId]\n return !!(asset?.src && !asset.error)\n}\n\nexport function ToneAdaptiveHeaderCover({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const withBg = hasBgImage(ir, slide)\n // INK 语境映射(见文件头「替换表」):文字填色 → text,强调/描边 → primary。\n const textFg = withBg ? \"#FFFFFF\" : colors.text\n const strokeFg = withBg ? \"#FFFFFF\" : colors.primary\n const mutedFg = withBg ? \"#FFFFFF\" : colors.muted\n const borderColor = withBg ? \"#FFFFFF\" : (colors.border ?? colors.muted)\n const borderOpacity = withBg ? 0.18 : 1\n\n const org = ir.meta.organization\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const author = ir.meta.authors?.[0]\n const authorText = author\n ? [author.name, author.role].filter(Boolean).join(\" · \")\n : null\n const date = ir.meta.date\n const version = ir.meta.version\n\n const title = layoutSvgText(slide.heading || \"\", {\n maxWidth: 1120,\n fontSize: 92,\n maxLines: 2,\n lineHeightRatio: 1.08,\n })\n\n const titleY = withBg\n ? title.lines.length > 1\n ? 480\n : 520\n : title.lines.length > 1\n ? 348\n : 392\n const titleLastY =\n titleY + Math.max(0, title.lines.length - 1) * title.lineHeight\n const subtitleY = titleLastY + 58\n const subtitle = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 1120, fontSize: 34, minFontSize: 18 })\n : null\n\n return (\n <>\n {/* Scrim for bg-image readability (replaces linearGradient) — see file\n header's withBg 白字/黑幕豁免. */}\n {withBg && (\n <rect width=\"1280\" height=\"720\" fill=\"#000000\" opacity=\"0.38\" />\n )}\n\n {/* Top left: organization */}\n {org && (\n <text\n x=\"64\"\n y=\"74\"\n fontFamily={fonts.heading}\n fontSize=\"22\"\n fill={mutedFg}\n opacity={withBg ? 0.8 : 1}\n letterSpacing=\"3\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* Top right: confidentiality badge */}\n {confLabel && (\n <g>\n <rect\n x=\"1086\"\n y=\"50\"\n width=\"130\"\n height=\"44\"\n rx=\"6\"\n fill=\"none\"\n stroke={strokeFg}\n strokeWidth=\"2\"\n strokeOpacity={withBg ? 0.6 : 1}\n />\n <text\n x=\"1151\"\n y=\"79\"\n fontFamily={fonts.heading}\n fontSize=\"24\"\n fill={textFg}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {confLabel}\n </text>\n </g>\n )}\n\n {/* Title */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x=\"64\"\n y={titleY + i * title.lineHeight}\n fontFamily={fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"700\"\n fill={textFg}\n letterSpacing=\"-2\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subtitle */}\n {subtitle && (\n <text\n x=\"64\"\n y={subtitleY}\n fontFamily={fonts.body}\n fontSize={subtitle.fontSize}\n fill={mutedFg}\n opacity={withBg ? 0.82 : 1}\n dominantBaseline=\"alphabetic\"\n >\n {subtitle.text}\n </text>\n )}\n\n {/* Bottom divider + meta row (no-bg mode) */}\n {!withBg && (\n <>\n <line\n x1=\"64\"\n y1=\"600\"\n x2=\"1216\"\n y2=\"600\"\n stroke={borderColor}\n strokeOpacity={borderOpacity}\n strokeWidth=\"1.6\"\n />\n {authorText && (\n <text\n x=\"64\"\n y=\"650\"\n fontFamily={fonts.body}\n fontSize=\"26\"\n fill={textFg}\n dominantBaseline=\"alphabetic\"\n >\n {authorText}\n </text>\n )}\n <text\n x=\"1216\"\n y=\"650\"\n fontFamily={fonts.body}\n fontSize=\"24\"\n fill={colors.muted}\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {[date, version].filter(Boolean).join(\" · \")}\n </text>\n </>\n )}\n\n {/* Bottom meta (bg mode, single line) — see file header's withBg\n 白字/黑幕豁免. */}\n {withBg && (authorText || date || version) && (\n <text\n x=\"64\"\n y=\"684\"\n fontFamily={fonts.body}\n fontSize=\"24\"\n fill=\"#FFFFFF\"\n opacity=\"0.7\"\n dominantBaseline=\"alphabetic\"\n >\n {[authorText, date, version].filter(Boolean).join(\" · \")}\n </text>\n )}\n </>\n )\n}\n","import type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\nimport { readableOn } from \"./cover-split-diagonal\"\n\n/**\n * fashion-masthead cover archetype(2026-07-10 时尚 runway 专属表达,\n * 纯新写):**满版 primary 色块 + 超大报头排印**——检索结论(Dazed/NYLON/\n * 大胆现代风):时尚杂志的视觉冲击力来自排印尺度(极粗字重、极大字号、\n * 大小极端对比)与满版色块。二轮返工(用户裁决「封面不能白底」):白底\n * 版升级为满版 primary 底(runway 纯黑 → 黑色大片封面),前景经\n * readableOn(primary) 自适应(黑→白字,其他浅 primary 主题借用时同样\n * 安全),满宽 accent 粗色带保持。页面节奏:黑封面→红章节→白内容→黑\n * 结尾,满版-留白交替是杂志语法。\n * 纪律:零 theme id、零 hex(readableOn 中性黑白豁免),颜色全部来自 ctx。\n */\nexport function FashionMastheadCover({ ir, slide, ctx }: SvgTemplateProps) {\n const org = ir.meta.organization\n const date = ir.meta.date\n const conf = ir.meta.confidentiality\n const confLabel = conf ? CONF_LABEL[conf] : null\n const version = ir.meta.version\n const fg = readableOn(ctx.colors.primary)\n\n const title = fitHeadingLines(slide.heading, {\n maxWidth: 1168,\n fontSize: 150,\n maxLines: 2,\n minPt: 72,\n })\n const TITLE_Y = 330\n const titleLastY = TITLE_Y + Math.max(0, title.lines.length - 1) * title.lineHeight\n\n // 满宽粗色带:报头下的「大而鲜艳」元素\n const bandY = titleLastY + 52\n const BAND_H = 20\n\n const subtitle = layoutSvgText(slide.subheading || \"\", {\n maxWidth: 1168,\n fontSize: 30,\n maxLines: 2,\n lineHeightRatio: 1.3,\n })\n const subtitleY = bandY + BAND_H + 58\n\n const metaParts = [org, confLabel, date, version].filter((v): v is string => Boolean(v))\n const metaLine =\n metaParts.length > 0\n ? fitSvgLine(metaParts.join(\" · \"), { maxWidth: 1100, fontSize: 19, minFontSize: 14 })\n : null\n\n return (\n <>\n {/* 满版 primary 色块(黑色大片封面底) */}\n <rect x={0} y={0} width={1280} height={720} fill={ctx.colors.primary} />\n\n {/* 顶部刊头信息行:时装刊小字排印(大 letterSpacing) */}\n {org && (\n <text\n x={640}\n y={86}\n fontFamily={ctx.fonts.body}\n fontSize={20}\n fill={fg}\n textAnchor=\"middle\"\n letterSpacing={10}\n fontWeight=\"600\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n {/* 报头上方规则线(刊头惯例) */}\n <line x1={56} y1={116} x2={1224} y2={116} stroke={fg} strokeWidth={3} />\n\n {/* 超大报头 */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={56}\n y={TITLE_Y + i * title.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"900\"\n fill={fg}\n letterSpacing={-2}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 满宽粗色带(accent 正红压黑底) */}\n <rect x={56} y={bandY} width={1168} height={BAND_H} fill={ctx.colors.accent} />\n\n {/* 副题 */}\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x={56}\n y={subtitleY + i * subtitle.lineHeight}\n fontFamily={ctx.fonts.body}\n fontSize={subtitle.fontSize}\n fill={fg}\n fillOpacity={0.72}\n letterSpacing={4}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 底部 meta */}\n {metaLine && (\n <text\n x={640}\n y={668}\n fontFamily={ctx.fonts.body}\n fontSize={metaLine.fontSize}\n fill={fg}\n fillOpacity={0.6}\n textAnchor=\"middle\"\n letterSpacing={3}\n dominantBaseline=\"alphabetic\"\n >\n {metaLine.text}\n </text>\n )}\n </>\n )\n}\n","import type { CoverArchetype, CoverArchetypeId } from \"./types\"\nimport { BannerTitleCover } from \"./cover-banner-title\"\nimport { PosterCenterCover } from \"./cover-poster-center\"\nimport { SplitDiagonalCover } from \"./cover-split-diagonal\"\nimport { LeftAnchorCover } from \"./cover-left-anchor\"\nimport { ConstellationCover } from \"./cover-constellation\"\nimport { EditorialMastheadCover } from \"./cover-editorial-masthead\"\nimport { ToneAdaptiveHeaderCover } from \"./cover-tone-adaptive-header\"\nimport { FashionMastheadCover } from \"./cover-fashion-masthead\"\n\nexport type { CoverArchetype, CoverArchetypeId } from \"./types\"\n\n// Wave 1 收尾:六个 CoverArchetypeId 字面量全覆盖,收紧回完整 Record(P1\n// Task4→5 起过渡态到此结束,不再是 Partial)。\nexport const COVER_ARCHETYPES: Record<CoverArchetypeId, CoverArchetype> = {\n \"banner-title\": BannerTitleCover,\n \"poster-center\": PosterCenterCover,\n \"left-anchor\": LeftAnchorCover,\n constellation: ConstellationCover,\n \"editorial-masthead\": EditorialMastheadCover,\n \"tone-adaptive-header\": ToneAdaptiveHeaderCover,\n \"fashion-masthead\": FashionMastheadCover,\n \"split-diagonal\": SplitDiagonalCover,\n}\n","import type { Slide } from \"@/ir\"\n\nexport function chapterNumberFor(slides: Slide[], index: number): number {\n let n = 0\n for (let i = 0; i <= index && i < slides.length; i++) {\n if (slides[i].type === \"chapter\") n++\n }\n return n\n}\n\nexport function sectionNameFor(slides: Slide[], index: number): string | null {\n for (let i = index; i >= 0; i--) {\n if (slides[i].type === \"chapter\") return slides[i].heading ?? null\n }\n return null\n}\n\nexport function pageInfo(slides: Slide[], index: number): { page: number; total: number } {\n return { page: index + 1, total: slides.length }\n}\n\n/**\n * 1-indexed position of the `content` slide at `index` within its chapter —\n * i.e. how many `content` slides (this one included) sit between the nearest\n * preceding `chapter` slide and `index`. Walking backward from `index`,\n * counting only `content`-typed slides and stopping at the first `chapter`\n * boundary (or the deck start, if there is no chapter before `index` at\n * all) — so the count resets to 1 right after every chapter, and slides of\n * other types in between (e.g. an interleaved `cover`) don't affect it.\n */\nexport function contentIndexInChapter(slides: Slide[], index: number): number {\n let n = 0\n for (let i = index; i >= 0 && slides[i].type !== \"chapter\"; i--) {\n if (slides[i].type === \"content\") n++\n }\n return n\n}\n","// GF/svg/archetypes/chapter-masthead-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * masthead-chapter archetype(spec §3.2):顶/底两条 hairline 夹住左对齐大标\n * 题 + 斜体副标题,右下角是巨大的半透明章节序号水印。自\n * templates/magazine.tsx 的 `EditorialSerifChapter`(113-209 行)提炼。\n * 随迁 helper:无——`chapterNumberFor` 是 `../../lib/derive` 的公共\n * derive helper(经 import 消费,非 templates 文件私有),照常 import,不复制。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/magazine.ts 的 colors):\n * Step A 对函数区间(113-209 行)grep 未命中任何 `#XXXXXX` 字面量或 theme id\n * 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.border ?? colors.muted`/`colors.accent`/`colors.text`/\n * `colors.muted`),无烤死颜色常量,无孤儿色。**档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function MastheadChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n\n const TOP_HAIRLINE_Y = 200\n const BOTTOM_HAIRLINE_Y = 520\n const HEADING_X = 96\n const HEADING_BASELINE = 380\n // Upper bound on the title's wrap width keeps its right edge (96 + 720 =\n // 816) clear of the watermark digit's left edge — \"08\" at 220px is the\n // widest 2-digit label (~2 * 0.56 * 220 ≈ 246px), so the digit starts no\n // earlier than 1184 - 246 = 938, well past 816.\n const HEADING_MAX_WIDTH = 720\n const NUMBER_BASELINE = 640\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: HEADING_MAX_WIDTH,\n fontSize: 64,\n maxLines: 2,\n minPt: 36,\n })\n const headingLastY =\n HEADING_BASELINE + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: HEADING_MAX_WIDTH, fontSize: 24, minFontSize: 14 })\n : null\n const subheadingY = headingLastY + 48\n\n return (\n <>\n <line\n x1=\"96\"\n y1={TOP_HAIRLINE_Y}\n x2=\"1184\"\n y2={TOP_HAIRLINE_Y}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.4\"\n />\n\n {/* Bottom-right watermark digit, kept clear of the title by\n HEADING_MAX_WIDTH above. Baseline 640 + ~0.22 * 220 ≈ 688px descent\n stays inside the 712px safe bottom margin. */}\n <text\n x=\"1184\"\n y={NUMBER_BASELINE}\n fontFamily={fonts.heading}\n fontSize=\"220\"\n fontWeight=\"700\"\n fill={colors.accent}\n opacity=\"0.12\"\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={HEADING_X}\n y={HEADING_BASELINE + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {subheading && (\n <text\n x={HEADING_X}\n y={subheadingY}\n fontFamily={fonts.heading}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n <line\n x1=\"96\"\n y1={BOTTOM_HAIRLINE_Y}\n x2=\"1184\"\n y2={BOTTOM_HAIRLINE_Y}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.4\"\n />\n </>\n )\n}\n","// GF/svg/archetypes/chapter-constellation-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * constellation-chapter archetype(spec §3.2):左侧巨大 accent 色章节序号 +\n * 右侧左对齐大标题/副标题 + 底部一条 hairline 分隔线。自\n * templates/tech.tsx 的 `BentoTechChapter`(867-957 行)提炼。随迁 helper:\n * 无——`chapterNumberFor` 是 `../../lib/derive` 的公共 derive\n * helper(经 import 消费,非 templates 文件私有),照常 import,不复制。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/tech.ts 的 colors):\n * Step A 对函数区间(867-957 行)grep 未命中任何 `#XXXXXX` 字面量或 theme id\n * 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`(`colors.accent`/\n * `colors.text`/`colors.muted`/`colors.border ?? colors.muted`),无烤死颜色\n * 常量,无孤儿色。**档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function ConstellationChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n // Task 1(tech): was accentFor(colors, chNum - 1) — cycled a hue per\n // chapter number. Single-accent redesign: every chapter number is the\n // same color.\n const numberColor = colors.accent\n\n const NUMBER_BASELINE = 400\n const HEADING_BASELINE = 392\n const HEADING_X = 320\n const DIVIDER_Y = 560\n // Content's right content margin (96 + 1088) so the title never runs past\n // the page's established right edge.\n const headingMaxWidth = 1184 - HEADING_X\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: headingMaxWidth,\n fontSize: 56,\n maxLines: 2,\n minPt: 28,\n })\n const headingLastY =\n HEADING_BASELINE +\n Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, {\n maxWidth: headingMaxWidth,\n fontSize: 26,\n minFontSize: 16,\n })\n : null\n const subheadingY = headingLastY + 56\n\n return (\n <>\n {/* Left accent-colored chapter number. \"08\" at 160px is the widest\n 2-digit label (~2 * 0.56 * 160 ≈ 180px) — 96 + 180 = 276 < 320, so\n it never collides with the title regardless of chapter count. */}\n <text\n x=\"96\"\n y={NUMBER_BASELINE}\n fontFamily={fonts.heading}\n fontSize=\"160\"\n fontWeight=\"700\"\n fill={numberColor}\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={HEADING_X}\n y={HEADING_BASELINE + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {subheading && (\n <text\n x={HEADING_X}\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n <line\n x1=\"96\"\n y1={DIVIDER_Y}\n x2=\"1184\"\n y2={DIVIDER_Y}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.4\"\n />\n </>\n )\n}\n","// GF/svg/archetypes/chapter-rail-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * rail-chapter archetype(spec §3.2):巨幅居中标题 + 斜体副标题,压在整页\n * 通栏 `colors.primary` 色块上(色块本身由 FullSlideSvg 按\n * `themes/academic.ts` 的 `defaultBackgrounds.chapter` 绘制,本文件不\n * 画背景),底部一条水平章节进度点轨(`totalChapters` 只有 1 时收起轨道\n * 线,只留单点)。自 templates/academic.tsx 的 `BCGEmeraldChapter`\n * (235-328 行)提炼。随迁 helper:`CH_DOT_Y`/`CH_DOT_SPACING`\n * (源文件 232-233 行的模块级私有常量,grep 确认整个 academic.tsx 里只有\n * 本函数消费,随函数体一并复制为本文件私有常量,不建公共 util)。\n *\n * Step A 复核(现状表标\"烤色同款\",逐字核实后订正——十六进制值本身不抄进\n * 本注释,避免污染本文件的 grep 清零门,同 cover-left-anchor.tsx 先例):\n * 对函数区间(235-328 行)grep 具名烤色常量,函数体内一次也没有出现\n * `DEEP_GREEN`/`EMERALD`/`TEXT`/`MUTED`/`HAIRLINE` 这些 academic.tsx\n * 模块级烤色常量,也没有任何 `ctx.colors.*` 消费——本函数唯一读取的 ctx\n * 字段是 `ctx.fonts.heading`。函数体内出现的颜色字面量只有一种取值\n * (代码里能看到的那个纯白字面量,出现 5 处:水印章节号 / 主标题 / 副标题\n * / 进度轨道线 / 进度点)。故现状表\"烤色同款\"的判断不成立,本函数没有需要\n * 建立映射的具名烤色,**档位一・逐字节等价**。\n *\n * 白字处理(同 cover-left-anchor.tsx 的\"白字例外\"先例,非徽章场景但同一\n * 类产品逻辑):这 5 处不是\"徽章白字\",是画在整页不透明 `colors.primary`\n * 色块之上的水印数字/主标题/副标题/进度点——用于保证在任意主题的\n * `primary` 色值下都可读。**注意一个逐字节陷阱**:这个白色字面量恰好与\n * academic 自己的 `colors.surface` 逐字符相同,但 `surface` 字段在别的\n * 主题里并不是白色(creative/tech 是深色,custom 是浅灰——见\n * themes/*.ts),若机械地把这个字面量映射进 `colors.surface`,在\n * creative/tech 下这些主题的章节页背景同样是深色,文字会变成深色-on-深色\n * 而隐形——这不是\"观感等价\"而是\"观感被破坏\",同 left-anchor 文件头记录的\n * `TRIANGLE_DEEP` 教训同一类陷阱(十六进制凑巧相等 ≠ 语义相同)。核实同款\n * 先例:consulting 的 `MckinseyNavyChapter`(184-324 行)同样对其章节大\n * 标题写死同一个纯白字面量,不是 academic 独有写法,是\"章节页压在整页深色\n * 主色块上\"这一构图共享的结构性产品逻辑。故该字面量不进下面的替换表,保留\n * 原样,并在测试里跨主题锁死。\n *\n * 替换表:无——本函数不消费任何 token 字段,只有上述白字例外一项。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试\n * 锁死的纯白字面量(代码里的 5 处 `fill`/`stroke`),grep 清零门预期恰好\n * 命中这 5 处。\n */\n\n// Horizontal chapter-progress dot row's fixed y and per-dot spacing. Ported\n// verbatim from templates/academic.tsx module scope (232-233 行)——only\n// BCGEmeraldChapter consumed them there, so they move here as file-private\n// constants rather than staying module-level in the shared templates file.\nconst CH_DOT_Y = 600\nconst CH_DOT_SPACING = 40\n\nexport function RailChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n const totalChapters = ir.slides.filter((s) => s.type === \"chapter\").length\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1088,\n fontSize: 84,\n maxLines: 2,\n minPt: 40,\n })\n const headingY = heading.lines.length > 1 ? 352 : 392\n const headingLastY =\n headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 1088, fontSize: 34, minFontSize: 18 })\n : null\n const subheadingY = headingLastY + 46\n\n // Horizontal chapter-progress dot row, centered under the heading. Single-\n // chapter decks collapse to one dot at the midpoint and skip the track line\n // (nothing to show progress \"along\").\n const dotsWidth = Math.max(0, totalChapters - 1) * CH_DOT_SPACING\n const dotsStartX = 640 - dotsWidth / 2\n\n return (\n <>\n <text\n x=\"1224\"\n y=\"650\"\n fontFamily={ctx.fonts.heading}\n fontSize=\"260\"\n fontWeight=\"700\"\n fill=\"#FFFFFF\"\n opacity=\"0.06\"\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill=\"#FFFFFF\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n {subheading && (\n <text\n x=\"640\"\n y={subheadingY}\n fontFamily={ctx.fonts.heading}\n fontSize={subheading.fontSize}\n fill=\"#FFFFFF\"\n opacity=\"0.7\"\n textAnchor=\"middle\"\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* Horizontal chapter-progress dots */}\n {totalChapters > 1 && (\n <line\n x1={dotsStartX}\n y1={CH_DOT_Y}\n x2={dotsStartX + dotsWidth}\n y2={CH_DOT_Y}\n stroke=\"#FFFFFF\"\n strokeOpacity=\"0.3\"\n strokeWidth=\"1.6\"\n />\n )}\n {Array.from({ length: totalChapters }, (_, i) => i + 1).map((n) => (\n <circle\n key={n}\n cx={dotsStartX + (n - 1) * CH_DOT_SPACING}\n cy={CH_DOT_Y}\n r={n === chNum ? 7 : 5}\n fill=\"#FFFFFF\"\n fillOpacity={n === chNum ? 1 : 0.35}\n />\n ))}\n </>\n )\n}\n","// GF/svg/archetypes/chapter-banner-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * banner-chapter archetype(spec §3.2):巨幅居中章节号水印 + 白字主标题/副\n * 标题,压在整页通栏 `colors.primary` 色块上(色块由 FullSlideSvg 按\n * `themes/consulting.ts` 的 `defaultBackgrounds.chapter` 绘制,本文件\n * 不画背景),底部一条 accent 色短装饰线。自 templates/consulting.tsx 的\n * `MckinseyNavyChapter`(184-265 行,非计划原文估计的 184-324——已按 Step A\n * 用 `awk` 精确定位函数起止)提炼。无随迁 helper。\n *\n * 替换表(沿用 P1 已验证的 consulting 替换表,先例 cover-banner-title.tsx,\n * 十六进制值本身不抄进本注释,避免污染本文件的 grep 清零门,同\n * chapter-rail-chapter.tsx 先例):\n * YELLOW → ctx.colors.accent(逐字符核对 themes/consulting.ts 的\n * accent 字段值,精确匹配)。函数区间内未出现 NAVY/MUTED/DIVIDER。\n *\n * 白字例外(同 chapter-rail-chapter.tsx 文件头记录的同一类产品逻辑,且该\n * 文件头本身已点名本函数为同款先例):函数体内 3 处纯白字面量\n * `fill`(章节号水印 / 主标题 / 副标题,代码里能看到的那个纯白字面量)\n * 不是烤死的主题色,是画在整页不透明 `colors.primary` 色块之上的对比色\n * 文字,用于保证在任意主题的 `primary` 色值下都可读。若机械映射进\n * `colors.surface`(consulting 自己的 surface 恰好与之逐字节相同),在\n * tech/creative 等 surface 为深色的主题下会让文字在深色背景上隐形——同\n * rail-chapter.tsx 记录的\"逐字节陷阱\"(十六进制凑巧相等 ≠ 语义相同)。故\n * 这 3 处不进替换表,保留原样,并在测试里跨主题锁死。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试锁\n * 死的纯白字面量,grep 清零门预期恰好命中这 3 处。\n */\nexport function BannerChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1088,\n fontSize: 84,\n maxLines: 2,\n minPt: 40,\n })\n const headingY = heading.lines.length > 1 ? 364 : 404\n const headingLastY =\n headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 1088, fontSize: 36, minFontSize: 18 })\n : null\n const subheadingY = headingLastY + 56\n const hairlineY = headingLastY + 48\n\n return (\n <>\n {/* Large semi-transparent chapter number */}\n <text\n x=\"1224\"\n y=\"650\"\n fontFamily={ctx.fonts.heading}\n fontSize=\"260\"\n fontWeight=\"700\"\n fill=\"#FFFFFF\"\n opacity=\"0.05\"\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {/* Chapter heading (white, centered) */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill=\"#FFFFFF\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Optional subheading */}\n {subheading && (\n <text\n x=\"640\"\n y={subheadingY}\n fontFamily={ctx.fonts.body}\n fontSize={subheading.fontSize}\n fill=\"#FFFFFF\"\n opacity=\"0.7\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* Decorative hairline */}\n <line\n x1=\"560\"\n y1={hairlineY}\n x2=\"720\"\n y2={hairlineY}\n stroke={ctx.colors.accent}\n strokeWidth=\"1.6\"\n opacity=\"0.6\"\n />\n </>\n )\n}\n","// GF/svg/archetypes/chapter-poster-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\n\n/**\n * poster-chapter archetype(spec §3.2):左对齐巨幅章节数字(accent 红)+\n * 800-weight 大标题,上下各一条 hairline 分隔线,右上角组织名。自\n * templates/creative.tsx 的 `EditorialDarkChapter`(179-266 行,非计划原文\n * 估计的 179-346——Step A 用 Read 精确定位函数起止,346 行落在紧随其后的\n * Content 页型模块注释区间内,不属于本函数体)提炼。\n *\n * 随迁 helper:**无**。计划原文列了 `AccentBar`(49-69 行),但 Step A 复核\n * 确认 `EditorialDarkChapter` 函数体内并未调用 `AccentBar`——该 helper 只\n * 被 Cover(142 行)、Content(627 行)、Ending(773 行)引用,Chapter 走的\n * 是自己的左对齐大数字构图,没有短横条装饰。故本文件不内联 `AccentBar`,\n * 避免引入死代码。\n *\n * 替换表(对照 GF/themes/creative.ts 的 `colors` 逐字符核实,全部精确\n * 匹配,无孤儿色——档位一。十六进制值本身不抄进本注释,避免污染本文件的\n * grep 清零门,同 chapter-banner-chapter.tsx / chapter-rail-chapter.tsx 先例):\n * RED → ctx.colors.primary(逐字节等于 creative 的 `primary`,**不是**\n * `accent`——`accent` 是另一个完全不同的暖棕色,沿用 P1\n * cover-poster-center.tsx 已订正的映射结论,不重犯\"RED→accent\"的误判)。\n * FG → ctx.colors.text(逐字节匹配)。\n * MUTED → ctx.colors.muted(逐字节匹配)。\n * BORDER → ctx.colors.border(逐字节匹配,creative token 表本身有 border\n * 字段,无需 `?? muted` 兜底)。\n * 函数体内未出现 `META_MUTED`,无需归并。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function PosterChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n const org = ir.meta.organization\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1168,\n fontSize: 56,\n maxLines: 2,\n minPt: 28,\n })\n // 章节数字基线 400、字号 224,下伸部至 ~463px。标题起点须留出\n // 显式间距(含导出 ascent 近似 ±20px 缓冲),否则数字与标题叠压。\n const headingY = heading.lines.length > 1 ? 500 : 532\n const headingLastY =\n headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const dividerY = headingLastY + 110\n\n return (\n <>\n {/* Top right: organization */}\n {org && (\n <text\n x=\"1224\"\n y=\"56\"\n fontFamily={ctx.fonts.body}\n fontSize=\"22\"\n fill={ctx.colors.muted}\n textAnchor=\"end\"\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* Top divider */}\n <line\n x1=\"56\"\n y1=\"80\"\n x2=\"1224\"\n y2=\"80\"\n stroke={ctx.colors.border}\n strokeWidth=\"1.6\"\n />\n\n {/* Large chapter number */}\n <text\n x=\"56\"\n y=\"400\"\n fontFamily={ctx.fonts.heading}\n fontSize=\"224\"\n fontWeight=\"800\"\n fill={ctx.colors.primary}\n letterSpacing=\"-8\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {/* Chapter heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"56\"\n y={headingY + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"800\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Bottom divider */}\n <line\n x1=\"56\"\n y1={dividerY}\n x2=\"1224\"\n y2={dividerY}\n stroke={ctx.colors.border}\n strokeWidth=\"1.6\"\n />\n </>\n )\n}\n","// GF/svg/archetypes/chapter-roman-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * roman-chapter archetype(2026-07-12 借鉴财经简报章节页,新表达非提炼):\n * 左侧巨幅罗马数字(primary 色带句点)+ 大标题 + 可选斜体副题,右侧\n * 圆弧意象装饰。\n * v2(用户两连裁决):①霓虹光晕环被裁「不好看」——改细线质感(参考\n * 页是日食弧/唱片密纹,不是发光甜甜圈)。②固定装饰章节间千篇一律——\n * 同一圆弧语法做三构图变体,**按章节序号轮换**(deck 内章章不同),\n * deck 间起点由 seed 决定:variant = (seedBase + 章节号) % 3。\n * A 日食弧:大圆细亮边只亮 3/4 弧 + 端点高光\n * B 同心细环组:4 圈不等距细圆(唱片密纹)+ 单段 accent 短弧\n * C 页缘切弧:更大的圆右缘出血只露左弧,弦切构图\n * 共享 archetype——manifest 决定谁用(先挂 insight)。\n * 纪律:零 theme id、零 hex(描边全部 ctx 色)。\n */\n/** 标准减法记数罗马数字转换(1-3999),非查表——章节数不设上限假设。\n * 越界(≤0 或 ≥4000,实际 deck 不可能出现)回落阿拉伯数字。 */\nconst ROMAN_PAIRS: [number, string][] = [\n [1000, \"M\"], [900, \"CM\"], [500, \"D\"], [400, \"CD\"],\n [100, \"C\"], [90, \"XC\"], [50, \"L\"], [40, \"XL\"],\n [10, \"X\"], [9, \"IX\"], [5, \"V\"], [4, \"IV\"], [1, \"I\"],\n]\n\nexport function toRoman(n: number): string {\n if (!Number.isInteger(n) || n <= 0 || n >= 4000) return String(n)\n let rest = n\n let out = \"\"\n for (const [value, glyph] of ROMAN_PAIRS) {\n while (rest >= value) {\n out += glyph\n rest -= value\n }\n }\n return out\n}\n\n/** 圆弧上 (cx,cy,r) 从 a0 到 a1(度,0=右 90=下)的弧 path。 */\nfunction arcPath(cx: number, cy: number, r: number, a0: number, a1: number): string {\n const rad = (d: number) => (d * Math.PI) / 180\n const x0 = cx + r * Math.cos(rad(a0))\n const y0 = cy + r * Math.sin(rad(a0))\n const x1 = cx + r * Math.cos(rad(a1))\n const y1 = cy + r * Math.sin(rad(a1))\n const large = Math.abs(a1 - a0) > 180 ? 1 : 0\n return `M ${x0.toFixed(1)} ${y0.toFixed(1)} A ${r} ${r} 0 ${large} 1 ${x1.toFixed(1)} ${y1.toFixed(1)}`\n}\n\nexport function RomanChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const chNum = chapterNumberFor(ir.slides, index)\n const org = ir.meta.organization\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 620,\n fontSize: 60,\n maxLines: 2,\n minPt: 32,\n })\n const headingY = 388\n const headingLastY = headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subY = headingLastY + 52\n\n // 装饰构图:deck 级 seed 定起点,章节号步进——deck 内章章不同\n const seedBase = pickBySeed(cachedDeckSeed(ir), \"roman-chapter-decor\", [0, 1, 2])\n const variant = ([\"eclipse\", \"grooves\", \"chord\"] as const)[(seedBase + chNum - 1) % 3]\n const accent = ctx.colors.primary\n\n return (\n <>\n {/* 右侧圆弧意象装饰(细线质感,三构图按章节轮换) */}\n {variant === \"eclipse\" && (\n <>\n {/* 日食弧:3/4 细亮弧 + 端点高光 + 内侧极淡整圆 */}\n <circle cx={990} cy={392} r={218} fill=\"none\" stroke={ctx.colors.border} strokeWidth={0.8} strokeOpacity={0.35} />\n <path d={arcPath(990, 392, 246, -160, 65)} fill=\"none\" stroke={accent} strokeWidth={2} strokeOpacity={0.85} strokeLinecap=\"round\" />\n <path d={arcPath(990, 392, 246, 65, 88)} fill=\"none\" stroke={accent} strokeWidth={1} strokeOpacity={0.3} strokeLinecap=\"round\" />\n <circle cx={990 + 246 * Math.cos((65 * Math.PI) / 180)} cy={392 + 246 * Math.sin((65 * Math.PI) / 180)} r={5} fill={accent} />\n </>\n )}\n {variant === \"grooves\" && (\n <>\n {/* 同心细环组(唱片密纹)+ 单段 accent 短弧 */}\n <circle cx={1000} cy={392} r={252} fill=\"none\" stroke={ctx.colors.border} strokeWidth={0.8} strokeOpacity={0.4} />\n <circle cx={1000} cy={392} r={224} fill=\"none\" stroke={ctx.colors.border} strokeWidth={0.8} strokeOpacity={0.3} />\n <circle cx={1000} cy={392} r={206} fill=\"none\" stroke={ctx.colors.muted} strokeWidth={0.6} strokeOpacity={0.25} />\n <circle cx={1000} cy={392} r={162} fill=\"none\" stroke={ctx.colors.border} strokeWidth={0.8} strokeOpacity={0.35} />\n <path d={arcPath(1000, 392, 238, -74, -18)} fill=\"none\" stroke={accent} strokeWidth={2.5} strokeOpacity={0.9} strokeLinecap=\"round\" />\n </>\n )}\n {variant === \"chord\" && (\n <>\n {/* 页缘切弧:大圆右缘出血只露左弧,双细线 + accent 弧段 */}\n <path d={arcPath(1385, 392, 360, 128, 232)} fill=\"none\" stroke={ctx.colors.border} strokeWidth={1} strokeOpacity={0.45} />\n <path d={arcPath(1385, 392, 322, 132, 228)} fill=\"none\" stroke={ctx.colors.muted} strokeWidth={0.7} strokeOpacity={0.3} />\n <path d={arcPath(1385, 392, 360, 154, 176)} fill=\"none\" stroke={accent} strokeWidth={2.2} strokeOpacity={0.85} strokeLinecap=\"round\" />\n </>\n )}\n\n {/* 右上组织名(圆环顶部之上留白区) */}\n {org && (\n <text\n x=\"1224\"\n y=\"56\"\n fontFamily={ctx.fonts.body}\n fontSize=\"22\"\n fill={ctx.colors.muted}\n textAnchor=\"end\"\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* 巨幅罗马数字 + 句点 */}\n <text\n x=\"56\"\n y=\"264\"\n fontFamily={ctx.fonts.heading}\n fontSize=\"176\"\n fontWeight=\"800\"\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {toRoman(chNum)}\n <tspan fill={ctx.colors.primary} fillOpacity={0.85}>\n .\n </tspan>\n </text>\n\n {/* 大标题 */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"56\"\n y={headingY + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"800\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 可选副题(斜体,财经简报的双语排印感) */}\n {slide.subheading && (\n <>\n <text\n x=\"56\"\n y={subY}\n fontFamily={ctx.fonts.body}\n fontSize=\"24\"\n fontStyle=\"italic\"\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {slide.subheading}\n </text>\n <line\n x1=\"56\"\n y1={subY + 34}\n x2=\"216\"\n y2={subY + 34}\n stroke={ctx.colors.border}\n strokeWidth=\"1.4\"\n />\n </>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/chapter-tone-adaptive-chapter.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\n\n/**\n * tone-adaptive-chapter archetype(spec §3.2):整页居中版式——右下角巨幅半\n * 透明章节序号水印 + 居中章节标题(1-2 行自适应)。有背景图时叠加黑色半透明\n * 幕布并整体切换为白字。自 templates/custom.tsx 的 `CustomChapter`\n * (251-320 行)提炼,随迁 helper `hasBgImage`(36-44 行,私有复制,签名/\n * 实现原样不变)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/custom.ts 的\n * colors):\n * - 源文件私有常量 `INK` —— 与 custom token 表当前的 `primary`、`text`\n * 两个字段精确匹配(同 cover-tone-adaptive-header.tsx 已核实的现状:\n * custom.ts 里二者尚未拆分,仍是同一个值)。与 cover 那个函数不同,本\n * 函数体内 `INK`/派生变量 `fg` **只在一种语境下被消费**——两处都是\n * `fill={fg}`(章节号水印、章节标题),没有任何描边/stroke 用法,因此\n * 没有语境歧义,统一映射到「文字填色」语境 → `ctx.colors.text`(下方\n * `textFg`)。**若 custom 主题未来把 text/primary 拆开,这里不需要回\n * 来重新判断语境——本函数天然只有一种语境**,这点与 cover 版本的长期\n * 盯防点不同,特此记录以免误用 cover 文件头的双语境结论直接套用本文件。\n * - 本函数不消费 `MUTED`/`BORDER`(CustomChapter 源码本就没有引用这两个\n * 模块级常量),替换表到此为止。\n *\n * withBg 白字/黑幕豁免(Global Constraints 产品逻辑白字豁免,同\n * cover-tone-adaptive-header.tsx 先例):`hasBgImage` 为真时 `textFg` 固定\n * 切到纯白,不随主题变化——背景图上强制白字的结构性产品逻辑,不进上面的替\n * 换表。整页黑色半透明幕布(scrim for bg-image readability,替代原\n * linearGradient)同属此类:不是任何主题 token 的烤色,是固定可读性遮罩,\n * 原样保留(同 cover 版本引用的 FullSlideSvg.tsx `isDesignTheme` 排除逻\n * 辑,custom 主题维持裸背景 + 局部 scrim 直通)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量(除上述白字/黑幕两类豁免——\n * grep 清零门预期命中的 hex 全部落在文件头点名的豁免范围内,逐行可核对)。\n */\n\n/** Check whether the slide has a valid background image asset. Ported\n * verbatim from templates/custom.tsx(36-44 行),私有复制,签名/实现不变。*/\nfunction hasBgImage(\n ir: SvgTemplateProps[\"ir\"],\n slide: SvgTemplateProps[\"slide\"],\n): boolean {\n if (slide.background?.kind !== \"asset\") return false\n const assetId = slide.background.asset_id\n const asset = ir.assets.images[assetId]\n return !!(asset?.src && !asset.error)\n}\n\nexport function ToneAdaptiveChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const withBg = hasBgImage(ir, slide)\n // INK 语境映射(见文件头「替换表」):本函数唯一语境是文字填色 → text。\n const textFg = withBg ? \"#FFFFFF\" : ctx.colors.text\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1152,\n fontSize: 88,\n maxLines: 2,\n minPt: 40,\n })\n const headingY = heading.lines.length > 1 ? 368 : 408\n\n return (\n <>\n {/* Scrim for bg-image mode (replaces linearGradient) — see file\n header's withBg 白字/黑幕豁免. */}\n {withBg && (\n <rect width=\"1280\" height=\"720\" fill=\"#000000\" opacity=\"0.32\" />\n )}\n\n {/* Large semi-transparent chapter number. y is nudged up from the\n naive vertical center (600) — real getBBox measurement showed this\n glyph's descender reach past the 720px page bottom depending on\n which font in the heading stack actually resolves, so a fixed\n margin here is safer than the 6-8px overflow tolerance. Ported\n verbatim from templates/custom.tsx's CustomChapter comment. */}\n <text\n x=\"1224\"\n y=\"610\"\n fontFamily={ctx.fonts.heading}\n fontSize=\"260\"\n fontWeight=\"800\"\n fill={textFg}\n opacity=\"0.05\"\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {/* Chapter heading (centered) */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={textFg}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </>\n )\n}\n","import type { SvgTemplateProps } from \"./types\"\nimport { chapterNumberFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { readableOn } from \"./cover-split-diagonal\"\n\n/**\n * fashion-chapter archetype(2026-07-10 时尚 runway 专属表达,纯新写):\n * **满版 accent 色块 + 巨型章节数字水印**——检索结论:满版型高饱和色块是\n * 时尚杂志内页冲击力的核心手法。\n *\n * 导出一致性返工(2026-07-10 用户抓到预览/导出不一致):初版用出血\n * (x=760 溢出右缘)+ 负 letterSpacing + fillOpacity 半透明——svg2pptx 的\n * 左对齐文本框宽度止于画布右缘,520px 大字「02」在框内换行致「2」被裁;\n * 负字距无 pptx 对应。故改**导出安全实现**:右对齐贴右缘(anchor=end 的\n * 文本框从 0 到 x,宽度充裕不换行)、去负字距、水印色用 fg 与满版底的\n * **实色混合**(mixHex 22%,不依赖 transparency 的跨渲染器表现)。\n * 前景色经 readableOn(accent) 自适应(正红→白字,其他主题借用同样安全)。\n * 纪律:零 theme id、零 baked 主题色 hex(readableOn 中性黑白豁免,\n * mixHex 是两个 ctx 色的插值非字面量),颜色全部来自 ctx。\n */\n\n/** 两个 hex 颜色的线性插值(t=0 全 a,t=1 全 b),输出实色。 */\nfunction mixHex(a: string, b: string, t: number): string {\n const pa = parseInt(a.replace(\"#\", \"\"), 16)\n const pb = parseInt(b.replace(\"#\", \"\"), 16)\n const ch = (sa: number, sb: number) => Math.round(sa + (sb - sa) * t)\n const r = ch((pa >> 16) & 255, (pb >> 16) & 255)\n const g = ch((pa >> 8) & 255, (pb >> 8) & 255)\n const bl = ch(pa & 255, pb & 255)\n return `#${((r << 16) | (g << 8) | bl).toString(16).padStart(6, \"0\").toUpperCase()}`\n}\n\nexport function FashionChapter({ ir, slide, index, ctx }: SvgTemplateProps) {\n const chNum = chapterNumberFor(ir.slides, index)\n const label = String(chNum).padStart(2, \"0\")\n const org = ir.meta.organization\n const fg = readableOn(ctx.colors.accent)\n // 水印色:前景与满版底的 22% 实色混合(导出安全,无 transparency 依赖)\n const watermark = mixHex(ctx.colors.accent, fg, 0.22)\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1100,\n fontSize: 54,\n maxLines: 2,\n minPt: 30,\n })\n\n return (\n <>\n {/* 满版 accent 色块(画在版式内,不依赖页背景) */}\n <rect x={0} y={0} width={1280} height={720} fill={ctx.colors.accent} />\n\n {/* 巨型章节数字水印:右对齐贴右缘(anchor=end 导出文本框宽度充裕,\n 不换行不裁字),实色混合替代半透明 */}\n <text\n x={1224}\n y={560}\n fontFamily={ctx.fonts.heading}\n fontSize={420}\n fontWeight=\"900\"\n fill={watermark}\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {label}\n </text>\n\n {/* 章节小号(实色,与水印大号形成大小极端对比) */}\n <text\n x={56}\n y={140}\n fontFamily={ctx.fonts.body}\n fontSize={24}\n fill={fg}\n letterSpacing={8}\n fontWeight=\"600\"\n dominantBaseline=\"alphabetic\"\n >\n {`CHAPTER ${label}`}\n </text>\n\n {/* 章节标题:大字重压满版色块 */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={56}\n y={420 + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"900\"\n fill={fg}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 底部细线 + org */}\n <line x1={56} y1={636} x2={1224} y2={636} stroke={fg} strokeWidth={1.5} opacity={0.5} />\n {org && (\n <text\n x={56}\n y={676}\n fontFamily={ctx.fonts.body}\n fontSize={19}\n fill={fg}\n fillOpacity={0.85}\n letterSpacing={3}\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n </>\n )\n}\n","import type { ChapterArchetype, ChapterArchetypeId } from \"./types\"\nimport { MastheadChapter } from \"./chapter-masthead-chapter\"\nimport { ConstellationChapter } from \"./chapter-constellation-chapter\"\nimport { RailChapter } from \"./chapter-rail-chapter\"\nimport { BannerChapter } from \"./chapter-banner-chapter\"\nimport { PosterChapter } from \"./chapter-poster-chapter\"\nimport { RomanChapter } from \"./chapter-roman-chapter\"\nimport { ToneAdaptiveChapter } from \"./chapter-tone-adaptive-chapter\"\nimport { FashionChapter } from \"./chapter-fashion-chapter\"\n\nexport type { ChapterArchetype, ChapterArchetypeId } from \"./types\"\n\n// Wave 2 chapter 页型注册表:六个 ChapterArchetypeId 已全部补齐(本任务收尾\n// tone-adaptive-chapter,custom 主题),收紧回完整 Record(沿用 cover 页型\n// 在 Wave 1 收尾时的同一模式,见 index.ts)。\nexport const CHAPTER_ARCHETYPES: Record<ChapterArchetypeId, ChapterArchetype> = {\n \"masthead-chapter\": MastheadChapter,\n \"constellation-chapter\": ConstellationChapter,\n \"rail-chapter\": RailChapter,\n \"banner-chapter\": BannerChapter,\n \"poster-chapter\": PosterChapter,\n \"roman-chapter\": RomanChapter,\n \"tone-adaptive-chapter\": ToneAdaptiveChapter,\n \"fashion-chapter\": FashionChapter,\n}\n","import { Fragment } from \"react\"\nimport type { Block } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { renderBlock, measureBlock } from \"./blocks\"\nimport { BLOCK_GAP, layoutContentFit, type ContentRect } from \"./layout\"\n\n/** Block types considered \"evidence\" in priority order. */\nconst EVIDENCE_TYPES = [\n \"chart\",\n \"image\",\n \"comparison\",\n \"kpi_cards\",\n] as const satisfies readonly Block[\"type\"][]\n\n/**\n * `assertion_evidence` variant — \"full-sentence heading + single enlarged evidence\".\n *\n * The slide heading (rendered by the template layer) states an assertion. The\n * content area picks the single strongest evidence block (chart > image >\n * comparison > kpi_cards > first block) and renders it enlarged, vertically\n * centred in the available rect. Any remaining blocks are stacked compactly\n * below it in a smaller supporting region.\n */\nexport function AssertionEvidence({\n blocks,\n rect,\n ctx,\n}: {\n blocks: Block[]\n rect: ContentRect\n ctx: BlockCtx\n}) {\n if (blocks.length === 0) {\n return <></>\n }\n\n // Find the first evidence block by priority.\n let evidence: Block | undefined\n for (const t of EVIDENCE_TYPES) {\n evidence = blocks.find((b) => b.type === t)\n if (evidence) break\n }\n\n // No recognised evidence type — fall back to normal single-column layout.\n if (!evidence) {\n const { placed, dropped } = layoutContentFit(\"single\", blocks, rect, ctx)\n return (\n <>\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {dropped > 0 && (\n <text\n x={rect.x + rect.w}\n y={rect.y + rect.h - 6}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </>\n )\n }\n\n const others = blocks.filter((b) => b !== evidence)\n\n // Measure the evidence block at the full content width.\n const evidenceH = measureBlock(evidence, rect.w, ctx)\n\n if (others.length === 0) {\n // Only the evidence block — centre it vertically in the entire rect.\n const centredY = rect.y + Math.max(0, (rect.h - evidenceH) / 2)\n return <>{renderBlock(evidence, { x: rect.x, y: centredY, w: rect.w }, ctx)}</>\n }\n\n // Evidence + supporting blocks: give evidence the majority of the rect,\n // then stack the rest below.\n const SUPPORT_FONT = 14\n const SUPPORT_GAP = 8\n // Reserve space for supporting blocks: at least a compact one-line-each\n // guess, but grown to fit what the blocks actually measure at (they render\n // at their normal block size, not SUPPORT_FONT — a fixed compact guess\n // undersizes real (e.g. wrapped paragraph/bullets) content and forces\n // layoutContentFit's last-resort \"keep it anyway\" branch to render an\n // overflowing block instead of cleanly dropping it). Capped so evidence\n // still keeps the majority of the rect.\n const measuredSupportH = others.reduce(\n (h, b) => h + measureBlock(b, rect.w, ctx) + BLOCK_GAP,\n -BLOCK_GAP,\n )\n const compactSupportH = others.length * (SUPPORT_FONT + SUPPORT_GAP)\n const supportH = Math.min(\n Math.max(measuredSupportH, compactSupportH),\n rect.h * 0.4,\n )\n const availableForEvidence = rect.h - supportH - SUPPORT_GAP\n const centredY =\n rect.y + Math.max(0, (availableForEvidence - evidenceH) / 2)\n\n const supportY = rect.y + availableForEvidence + SUPPORT_GAP\n\n const { placed, dropped } = layoutContentFit(\n \"single\",\n others,\n { x: rect.x, y: supportY, w: rect.w, h: supportH },\n ctx,\n )\n\n return (\n <>\n {renderBlock(evidence, { x: rect.x, y: centredY, w: rect.w }, ctx)}\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {dropped > 0 && (\n <text\n x={rect.x + rect.w}\n y={rect.y + rect.h - 6}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </>\n )\n}\n","import { Fragment } from \"react\"\nimport type { Block } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { renderBlock } from \"./blocks\"\nimport { layoutContentFit, type ContentRect } from \"./layout\"\nimport {\n fitSvgLine,\n measureTextUnits,\n truncateToUnits,\n} from \"../lib/svg-text-layout\"\n\ntype KpiCardsBlock = Extract<Block, { type: \"kpi_cards\" }>\n\nconst HERO_SIZE = 200\nconst HERO_MIN_FONT_SIZE = 48\nconst LABEL_FONT_SIZE = 28\nconst LABEL_MIN_FONT_SIZE = 14\n\n/**\n * `big_number` variant — a \"giant metric stage\": the first KPI's value fills the\n * top as a hero number, with its label beneath and the remaining blocks stacked\n * below as supporting context. Gives a deck visual rhythm (a breather page that\n * lands one number hard) instead of every content page looking the same.\n */\nexport function BigNumber({\n blocks,\n rect,\n ctx,\n}: {\n blocks: Block[]\n rect: ContentRect\n ctx: BlockCtx\n}) {\n const kpi = blocks.find(\n (b): b is KpiCardsBlock => b.type === \"kpi_cards\" && b.items.length > 0,\n )\n const hero = kpi?.items[0]\n const others = blocks.filter((b) => b !== kpi)\n\n // Supporting blocks sit below the hero block.\n const heroBlockH = Math.round(HERO_SIZE * 1.25)\n const supportRect: ContentRect = {\n x: rect.x,\n y: rect.y + (hero ? heroBlockH : 0),\n w: rect.w,\n h: Math.max(0, rect.h - (hero ? heroBlockH : 0)),\n }\n const { placed, dropped } = layoutContentFit(\"single\", others, supportRect, ctx)\n const valueBaseline = rect.y + HERO_SIZE * 0.85\n\n // The hero value and its unit tspan share one budget (see kpi.tsx for the\n // same reasoning): the auditor measures the whole `<text>`'s textContent\n // (value + unit tspan concatenated) at the OUTER element's font-size — it\n // can't see that the unit tspan renders smaller. So the value's width share\n // is proportioned by how much of the combined text the unit accounts for,\n // and the unit is truncated against its width share measured at the OUTER\n // (value) font-size too, not its own smaller rendered size — otherwise a\n // disproportionately long unit renders small enough to fit visually while\n // still making the auditor's concatenated-at-outer-size estimate exceed\n // rect.w.\n let fittedValue: { text: string; fontSize: number } | null = null\n let unitFontSize = 0\n let fittedUnit: string | null = null\n if (hero) {\n const valueStr = String(hero.value)\n const valueUnits = measureTextUnits(valueStr)\n const unitUnits = hero.unit ? measureTextUnits(hero.unit) : 0\n const valueMaxWidth =\n unitUnits > 0 && valueUnits > 0\n ? Math.floor((rect.w * valueUnits) / (valueUnits + unitUnits))\n : rect.w\n fittedValue = fitSvgLine(valueStr, {\n maxWidth: valueMaxWidth,\n fontSize: HERO_SIZE,\n minFontSize: HERO_MIN_FONT_SIZE,\n })\n unitFontSize = Math.round(fittedValue.fontSize * 0.4)\n const unitMaxWidth = rect.w - valueMaxWidth\n fittedUnit = hero.unit\n ? truncateToUnits(hero.unit, unitMaxWidth / fittedValue.fontSize)\n : null\n }\n const fittedLabel = hero\n ? fitSvgLine(hero.label, {\n maxWidth: rect.w,\n fontSize: LABEL_FONT_SIZE,\n minFontSize: LABEL_MIN_FONT_SIZE,\n })\n : null\n\n return (\n <>\n {hero && fittedValue && (\n <g>\n <text\n x={rect.x}\n y={valueBaseline}\n fontFamily={ctx.fonts.heading}\n fontSize={fittedValue.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {fittedValue.text}\n {fittedUnit != null && (\n <tspan fontSize={unitFontSize} fill={ctx.colors.accent}>\n {fittedUnit}\n </tspan>\n )}\n </text>\n <text\n x={rect.x}\n y={valueBaseline + 44}\n fontFamily={ctx.fonts.body}\n fontSize={fittedLabel!.fontSize}\n fill={ctx.colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {fittedLabel!.text}\n </text>\n </g>\n )}\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {dropped > 0 && (\n <text\n x={supportRect.x + supportRect.w}\n y={supportRect.y + supportRect.h - 6}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </>\n )\n}\n","import { Fragment } from \"react\"\nimport type { Block } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { renderBlock } from \"./blocks\"\nimport { COLUMN_GAP, layoutContentFit, type ContentRect } from \"./layout\"\n\n/** Share of the content rect the image column takes (参考图章节页 ~42%). */\nconst IMAGE_COL_RATIO = 0.42\n\n/**\n * `image_split` variant(图片排版 P3)——半版大图 + 侧栏文字。\n *\n * 第一个 `image` 块作为图源,占左列(42% 宽)并撑满内容区全高(slice\n * 裁剪,竖向大图,区别于 `image_focus` 里按块高度渲染的横图卡);其余\n * 块单栏排进右列。没有 image 块时退化为单栏(与 two_column 缺块退化\n * 同思路——半版留白毫无意义)。\n */\nexport function ImageSplit({\n blocks,\n rect,\n ctx,\n}: {\n blocks: Block[]\n rect: ContentRect\n ctx: BlockCtx\n}) {\n const imageBlock = blocks.find(\n (b): b is Extract<Block, { type: \"image\" }> => b.type === \"image\",\n )\n\n if (!imageBlock) {\n const { placed } = layoutContentFit(\"single\", blocks, rect, ctx)\n return (\n <>\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n </>\n )\n }\n\n const imgW = Math.round(rect.w * IMAGE_COL_RATIO)\n const textX = rect.x + imgW + COLUMN_GAP\n const textW = rect.w - imgW - COLUMN_GAP\n const rest = blocks.filter((b) => b !== imageBlock)\n const { placed, dropped } = layoutContentFit(\n \"single\",\n rest,\n { x: textX, y: rect.y, w: textW, h: rect.h },\n ctx,\n )\n const src = ctx.images?.[imageBlock.asset_id]?.src\n\n return (\n <>\n <g>\n {src ? (\n <image\n href={src}\n x={rect.x}\n y={rect.y}\n width={imgW}\n height={rect.h}\n preserveAspectRatio=\"xMidYMid slice\"\n />\n ) : (\n <>\n <rect x={rect.x} y={rect.y} width={imgW} height={rect.h} fill={ctx.colors.surface} />\n <text\n textAnchor=\"middle\"\n x={rect.x + imgW / 2}\n y={rect.y + rect.h / 2}\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n 图片缺失\n </text>\n </>\n )}\n <rect\n x={rect.x + 0.5}\n y={rect.y + 0.5}\n width={imgW - 1}\n height={rect.h - 1}\n fill=\"none\"\n stroke={ctx.colors.border}\n strokeWidth={1}\n />\n {imageBlock.caption && (\n <>\n <rect\n x={rect.x}\n y={rect.y + rect.h - 34}\n width={imgW}\n height={34}\n fill={ctx.colors.primary}\n fillOpacity={0.88}\n />\n <text\n x={rect.x + imgW / 2}\n y={rect.y + rect.h - 12}\n textAnchor=\"middle\"\n fontSize={14}\n fill={ctx.colors.surface}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {imageBlock.caption}\n </text>\n </>\n )}\n </g>\n {placed.map((p, i) => (\n <Fragment key={i}>{renderBlock(p.block, p.box, ctx)}</Fragment>\n ))}\n {dropped > 0 && (\n <text\n x={rect.x + rect.w}\n y={rect.y + rect.h - 6}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </>\n )\n}\n","import type { Block } from \"@/ir\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport { measureBlock, renderBlock } from \"./blocks\"\nimport { asideSplit, layoutContentFit, type ContentRect, type Variant } from \"./layout\"\nimport { AssertionEvidence } from \"./AssertionEvidence\"\nimport { BigNumber } from \"./BigNumber\"\nimport { ImageSplit } from \"./ImageSplit\"\n\nexport interface SvgContentProps {\n variant?: Variant\n blocks: Block[]\n rect: ContentRect\n ctx: BlockCtx\n}\n\n/**\n * The content region of a slide: lays the blocks out into page-coordinate boxes\n * and renders each as a positioned `<g>`. Emits pure SVG (no foreignObject) so\n * the same output drives both preview and the svg2pptx exporter.\n */\nexport function SvgContent({ variant, blocks, rect, ctx }: SvgContentProps) {\n const auditRect = `${rect.x},${rect.y},${rect.w},${rect.h}`\n // `big_number` is a bespoke hero-metric layout rather than block stacking.\n if (variant === \"big_number\") {\n return (\n <g data-audit-rect={auditRect}>\n <BigNumber blocks={blocks} rect={rect} ctx={ctx} />\n </g>\n )\n }\n // `image_split`:半版全高大图 + 侧栏文字(图片排版 P3)。\n if (variant === \"image_split\") {\n return (\n <g data-audit-rect={auditRect}>\n <ImageSplit blocks={blocks} rect={rect} ctx={ctx} />\n </g>\n )\n }\n // `assertion_evidence` enlarges a single evidence block to fill the content area.\n if (variant === \"assertion_evidence\") {\n return (\n <g data-audit-rect={auditRect}>\n <AssertionEvidence blocks={blocks} rect={rect} ctx={ctx} />\n </g>\n )\n }\n const { placed, dropped } = layoutContentFit(variant, blocks, rect, ctx)\n // 单块页(一张图/一张表占整页)垂直分布:38% 黄金位(2026-07-10 用户\n // 裁决)——50% 居中时矮块在高内容区里上下各悬 150px+,标题与内容断裂\n // 感明显(无图矩阵真机审出的跨主题共性)。重心偏上贴近标题,底部自然\n // 留白。\n let dy = 0\n if (placed.length === 1 && dropped === 0) {\n // 黄金位偏移必须按拉伸后的实际高度算(box.h 由 growStretchables 分配)\n // ——按原始测量高算会与拉伸叠加把块底顶出 rect(2026-07-11 用户截图\n // 实锤:6 宫格/长卡单块页穿 footer 分割线)。拉满时 dy 自然归零。\n const h = placed[0].box.h ?? measureBlock(placed[0].block, placed[0].box.w, ctx)\n dy = Math.max(0, (rect.h - h) * 0.38)\n }\n // aside 版式的侧栏分隔竖线(几何与 layoutContent 同源 asideSplit)——\n // 退化条件与 layoutContent 一致(<2 块走 single 不画线)。\n const asideDivider =\n variant === \"aside\" && blocks.length >= 2 ? asideSplit(rect).dividerX : null\n return (\n <g data-audit-rect={auditRect}>\n {asideDivider != null && (\n <line\n x1={asideDivider}\n y1={rect.y + 4}\n x2={asideDivider}\n y2={rect.y + rect.h - 4}\n stroke={ctx.colors.border ?? ctx.colors.muted}\n strokeWidth={1}\n strokeOpacity={0.6}\n />\n )}\n {placed.map((p, i) => (\n <g key={i} data-audit-box={`${p.box.x},${p.box.y + dy},${p.box.w}`}>\n {renderBlock(p.block, { ...p.box, y: p.box.y + dy }, ctx)}\n </g>\n ))}\n {dropped > 0 && (\n <text\n x={rect.x + rect.w}\n y={rect.y + rect.h - 6}\n textAnchor=\"end\"\n fontSize={14}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {`+${dropped} 项未展示`}\n </text>\n )}\n </g>\n )\n}\n","// GF/svg/archetypes/content-narrow-column.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { SvgContent } from \"../SvgContent\"\nimport { sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * narrow-column content archetype(spec §3.2,Wave 3 Task 17):trades the\n * usual full-width block stack for a magazine-style narrow column (w=880 of\n * the page's 1088 content width), leaving a deliberate 208px whitespace\n * gutter on the right that carries only a large muted serif page number.\n * Kicker (section name) sits italic+accent above the heading; an optional\n * accent-italic subheading slots in below it. Extracted from\n * templates/magazine.tsx 的 `EditorialSerifContent`(212-380 行)。\n * 随迁 helper:无——本函数消费的 `SvgContent`/`sectionNameFor`/\n * `fitHeadingLines`/`fitSvgLine`/`fitEmphasisLine`/`renderEmphasisTspans`\n * 均是 svg 或 pptx-preview 下的公共 helper(经 import 消费,非\n * templates 文件私有),照常 import,不复制。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/magazine.ts 的 colors):\n * Step A 对函数区间(212-380 行)grep 未命中任何 `#XXXXXX` 字面量或 theme id\n * 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.border ?? colors.muted`/`colors.accent`/`colors.text`/\n * `colors.muted`),无烤死颜色常量,无孤儿色。**档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function NarrowColumnContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const section = sectionNameFor(ir.slides, index)\n\n const TOP_HAIRLINE_Y = 88\n const KICKER_Y = 124\n const HEADING_BASELINE = 190\n // Deliberately narrow: 880 of the page's usual 1088 content width, leaving\n // a 208px right-hand whitespace gutter (x 1000-1184) that carries nothing\n // but the big page number below.\n const COLUMN_X = 96\n const COLUMN_W = 880\n const COLUMN_BOTTOM = 640\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: COLUMN_W,\n fontSize: 60,\n maxLines: 2,\n minPt: 32,\n })\n const headingLastY =\n HEADING_BASELINE + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n\n // Subheading (Task 5): a 22px accent, italic so-what sentence below the\n // heading (matching the kicker's own italic+accent treatment above it).\n // Occupies a slot added to the narrow column's own y *only* when\n // `slide.subheading` is set, so a slide without one gets byte-identical\n // geometry to before this feature existed.\n //\n // S3b spacing fix, corrected (2026-07-07): this theme's subheading uses\n // the *heading* font (`fonts.heading` = \"SimSun, Songti SC, STSong,\n // serif\"), not the sans body font the other four generic-formula themes\n // use — the six-theme formula's 0.12*fontSize glyph-descent assumption\n // (calibrated against those sans-body subheadings) badly underestimates\n // real SimSun-family CJK descent. A first pass landed on +44\n // (22+14+round(0.12*60)) and *looked* separated for a short/no-wrap\n // heading, but real getBBox measurement of an actually-wrapped 2-line\n // heading (a real-world repro, not a synthetic worst case) showed the\n // title's real glyph descent is ~0.34*fontSize (~20px at nominal 60,\n // ~15.5px at the 46px this specific heading shrinks to) — 3x the generic\n // assumption — leaving the subheading touching/overlapping the title at\n // +44 (measured ~0-5px real gap, confirmed in a Chromium 104 render, not\n // just estimated). Recalibrated from real measurements: subheading's own\n // real ascent ≈24px, title's real descent ≈round(0.34*60)=20px at the\n // (worst-case, largest) nominal 60px size, +18px target gap (a few px\n // above the six-theme 14px floor for headroom against per-character\n // descent variance, e.g. glyphs with low-reaching strokes) ⇒\n // 24+18+20=62, rounded to +64. Verified via getBBox: ~20-25px real gap\n // across both the nominal-60 and shrunk-46 cases. Slot grows by the same\n // +34 the baseline grew (30->64) so the subheading-to-column gap doesn't\n // shrink.\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: COLUMN_W,\n fontSize: 22,\n minFontSize: 16,\n })\n const subheadingY = headingLastY + 64\n const subheadingBudget = subheading ? 68 : 0\n\n const columnY = headingLastY + 40 + subheadingBudget\n const columnH = Math.max(0, COLUMN_BOTTOM - columnY)\n\n const pageLabel = String(index + 1).padStart(2, \"0\")\n\n const kicker = section\n ? fitSvgLine(section, { maxWidth: COLUMN_W, fontSize: 16, minFontSize: 12 })\n : null\n\n // 980 = conservative left edge of the page-number digits (1112) minus the\n // footnote's own start x (96) minus a 36px safety gap, so a\n // maximally-fitted footnote never runs into the large muted page number in\n // the right gutter.\n const footnote = slide.footnote\n ? fitSvgLine(slide.footnote, { maxWidth: 980, fontSize: 20, minFontSize: 13 })\n : null\n\n return (\n <>\n <line\n x1=\"96\"\n y1={TOP_HAIRLINE_Y}\n x2=\"1184\"\n y2={TOP_HAIRLINE_Y}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.2\"\n />\n\n {kicker && (\n <text\n x=\"96\"\n y={KICKER_Y}\n fontFamily={fonts.heading}\n fontSize={kicker.fontSize}\n fill={colors.accent}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {kicker.text}\n </text>\n )}\n\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={HEADING_BASELINE + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent italic so-what sentence below the heading (Task 5) */}\n {subheading && (\n <text\n x=\"96\"\n y={subheadingY}\n fontFamily={fonts.heading}\n fontSize={subheading.fontSize}\n fill={colors.accent}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: colors.text, baseFill: colors.accent, fontWeight: \"700\" })}\n </text>\n )}\n\n <SvgContent\n variant={slide.variant}\n blocks={slide.blocks}\n rect={{ x: COLUMN_X, y: columnY, w: COLUMN_W, h: columnH }}\n ctx={ctx}\n />\n\n {/* Right-hand whitespace gutter: nothing but the large muted page\n number lives here, anchored to the page's right content margin. */}\n <text\n x=\"1184\"\n y=\"628\"\n fontFamily={fonts.heading}\n fontSize=\"64\"\n fill={colors.muted}\n opacity=\"0.3\"\n textAnchor=\"end\"\n dominantBaseline=\"alphabetic\"\n >\n {pageLabel}\n </text>\n\n {footnote && (\n <text\n x=\"96\"\n y=\"652\"\n fontFamily={fonts.body}\n fontSize={footnote.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {footnote.text}\n </text>\n )}\n </>\n )\n}\n","import type { SvgTemplateProps } from \"./types\"\nimport { SvgContent } from \"../SvgContent\"\nimport { sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * two-column content archetype(P3 Item ②,spec §3.2/§3.4):跨主题通用的\n * 双栏内容页——顶部 kicker + heading + accent 短条 + 贯穿细线,下方内容区用\n * SvgContent 的 `two_column` 版式把 blocks 分左右两栏铺排。这是 Item ② 轮换\n * 需要的「第二种 content 版式」:与各主题原生 content archetype(bento 拼盘/\n * 海报堆叠/横幅/编号导轨/窄栏)的单栏语法明显不同,故同一 deck 内相邻\n * content 页轮换到它时视觉分化明显。\n *\n * 纯新写(非提炼),token 驱动(颜色/字体只来自 ctx),零 theme id、零主题色\n * hex。不覆写 slide.variant——强制走 two_column 铺排是本 archetype 的语义\n * (blocks<2 时 SvgContent 的 two_column 自动回落单栏,安全)。\n */\nexport function TwoColumnContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const section = sectionNameFor(ir.slides, index)\n\n const KICKER_Y = 96\n const HEADING_BASELINE = 150\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1088,\n fontSize: 46,\n maxLines: 2,\n minPt: 30,\n })\n const headingLastY =\n HEADING_BASELINE + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n\n // subheading 槽位(2026-07-10 深度自查修复:上线版静默丢 slide.subheading,\n // 轮换进本版式的页面副题信息丢失)。有副题时其余元素整体下移。\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 1088, fontSize: 22, minFontSize: 16 })\n : null\n const subheadingY = headingLastY + 42\n const accentY = (subheading ? subheadingY : headingLastY) + 22\n const ruleY = accentY + 22\n const contentY = ruleY + 34\n const contentH = 640 - contentY\n\n return (\n <>\n {/* kicker:章节名(accent 方块 + muted 文字) */}\n {section && (\n <>\n <rect x={96} y={KICKER_Y - 13} width={13} height={13} fill={colors.accent} />\n <text\n x={120}\n y={KICKER_Y}\n fontFamily={fonts.body}\n fontSize={17}\n fill={colors.muted}\n letterSpacing={2}\n dominantBaseline=\"alphabetic\"\n >\n {fitSvgLine(section, { maxWidth: 900, fontSize: 17, minFontSize: 13 }).text}\n </text>\n </>\n )}\n\n {/* heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={96}\n y={HEADING_BASELINE + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* subheading:primary 强调(与 banner-heading 的副题语义一致) */}\n {subheading && (\n <text\n x={96}\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* accent 短条 + 贯穿细线 */}\n <rect x={96} y={accentY} width={72} height={4} fill={colors.accent} />\n <line x1={96} y1={ruleY} x2={1184} y2={ruleY} stroke={colors.border ?? colors.muted} strokeWidth={1} />\n\n {/* 双栏内容区 */}\n <SvgContent\n variant=\"two_column\"\n blocks={slide.blocks}\n rect={{ x: 96, y: contentY, w: 1088, h: Math.max(120, contentH) }}\n ctx={ctx}\n />\n </>\n )\n}\n","// GF/svg/archetypes/content-rail-numbered.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { SvgContent } from \"../SvgContent\"\nimport { chapterNumberFor, contentIndexInChapter } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * rail-numbered content archetype(spec §3.2,Wave 3 Task 18):grammar break\n * (\"换骨\") vs. the other legacy themes' section-name-kicker + plain-heading\n * layout. Instead: a fixed left \"numbered rail\" (a vertical track with a node\n * marking how far through the deck's chapters the slide currently sits —\n * proportional to `(chapter - 1) / (totalChapters - 1)`, collapsing to the\n * top for a single-chapter deck) plus a \"{chapter}.{content-in-chapter}\"\n * number badge that replaces the old kicker (the content-in-chapter index\n * comes from `contentIndexInChapter`, derive.ts). The heading sits to the\n * right of the badge, vertically centered on it. Extracted from\n * templates/academic.tsx 的 `BCGEmeraldContent`(390-531 行,Step A 实测边界,\n * 比 brief 给出的 390-558 短——558 行已进入下一节\"Ending\"的头注释)。随迁\n * helper:无——本函数消费的 `SvgContent`/`chapterNumberFor`/\n * `contentIndexInChapter`/`fitHeadingLines`/`fitSvgLine`/`fitEmphasisLine`/\n * `renderEmphasisTspans` 均是 svg 或 pptx-preview 下的公共 helper(经\n * import 消费,非 templates 文件私有),照常 import,不复制。函数消费的模块\n * 级私有几何常量(`RAIL_*`/`BADGE_*`/`TITLE_*`/`CONTENT_*`/`SUBHEADING_*`/\n * `BASELINE_FUDGE_RATIO`——均是像素/比例数值,非颜色)随函数体一并复制为本\n * 文件私有常量,不建公共 util(同 chapter-rail-chapter.tsx 对 `CH_DOT_*`\n * 的处理)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/academic.ts 的 colors。\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * cover-left-anchor.tsx 先例):\n * - `colors.primary`:源函数已直接消费 `ctx.colors.primary`(rail 轨道/\n * 节点/徽章底色),未烤死,原样保留。\n * - 源文件私有常量 `TEXT` → `ctx.colors.text` —— 逐字符精确匹配。\n * - 源文件私有常量 `MUTED` → `ctx.colors.muted` —— 逐字符精确匹配。\n * - `colors.text`/`colors.primary`(`renderEmphasisTspans` 的\n * accent/baseFill 入参):源函数已直接消费,未烤死,原样保留。\n * 两处烤死常量都在 academic 的 token 表里有精确匹配,**无孤儿色**。\n *\n * 白字例外(同 chapter-rail-chapter.tsx / cover-left-anchor.tsx 先例):徽章\n * 文字固定写死纯白字面量——徽章底色是不透明的 `colors.primary`,为保证在\n * 任意主题色下都可读,这不是某个主题的烤死色(不随主题变化,也不在任何\n * token 字段里),是\"色块上必须白字\"的结构性产品逻辑,故不进上面的替换表,\n * 予以保留并在测试里跨主题锁死。\n *\n * **档位一・逐字节等价**(两处烤死常量都精确匹配 token 值,无孤儿色)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试锁死\n * 的徽章纯白字面量,grep 清零门预期恰好命中这一处。\n */\n\n// Shared vertical-centering convention (see consulting.tsx's assertion\n// banner for the original derivation, also copied privately into\n// cover-left-anchor.tsx): for a single line at `fontSize`, `pivotY +\n// round(fontSize * 0.32)` lands the baseline visually centered on `pivotY`;\n// multi-line blocks spread symmetrically around the same pivot.\nconst BASELINE_FUDGE_RATIO = 0.32\n\nconst RAIL_X = 48\nconst RAIL_Y = 96\nconst RAIL_W = 4\nconst RAIL_H = 544\nconst RAIL_NODE_R = 7\n\n// BADGE_Y=96 (not 64) keeps the badge clear of MasterChrome's tl logo band\n// (x 64-160, y 48-88) — mirrors the Cover confLabel fix (see\n// cover-left-anchor.tsx's own y=104 equivalent).\nconst BADGE_X = 96\nconst BADGE_Y = 96\nconst BADGE_W = 64\nconst BADGE_H = 32\nconst BADGE_RADIUS = 6\nconst BADGE_CENTER_X = BADGE_X + BADGE_W / 2\nconst BADGE_CENTER_Y = BADGE_Y + BADGE_H / 2 // 112\nconst BADGE_FONT_SIZE = 14\n// Inner padding so long labels (e.g. \"12.10\") don't touch the badge's rounded\n// corners before fitSvgLine kicks in.\nconst BADGE_TEXT_MAX_W = BADGE_W - 8\n\nconst TITLE_X = 180\nconst TITLE_MAX_W = 1000\n\nconst CONTENT_X = 96\nconst CONTENT_W = 1088\nconst CONTENT_BOTTOM = 640\nconst CONTENT_GAP = 36 // gap between the title's last line and the content rect\n\n// Subheading: a 22px accent \"so-what\" sentence below the badge/title row.\n// Occupies a slot (22px line + gap) added to the content rect's y *only*\n// when `slide.subheading` is set, so a slide without one gets byte-identical\n// geometry to before this feature existed. subheadingY = titleLastY + 41\n// (subheading ascent + target visual gap + glyph-descent fudge, six-theme\n// unified formula — see templates/academic.tsx's own S3b note for the\n// full derivation this was ported from).\nconst SUBHEADING_FONT_SIZE = 22\nconst SUBHEADING_MIN_FONT_SIZE = 16\nconst SUBHEADING_SLOT = 45\n\nexport function RailNumberedContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n\n const totalChapters = ir.slides.filter((s) => s.type === \"chapter\").length\n // A content slide with no chapter before it (malformed/edge-case deck) is\n // clamped to chapter 1 rather than showing \"0.n\" or a negative rail ratio.\n const chNum = Math.max(1, chapterNumberFor(ir.slides, index))\n const contentNum = contentIndexInChapter(ir.slides, index)\n const badgeLabel = fitSvgLine(`${chNum}.${contentNum}`, {\n maxWidth: BADGE_TEXT_MAX_W,\n fontSize: BADGE_FONT_SIZE,\n minFontSize: 10,\n })\n\n const railNodeCy =\n totalChapters <= 1\n ? RAIL_Y\n : RAIL_Y + RAIL_H * ((chNum - 1) / (totalChapters - 1))\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: TITLE_MAX_W,\n fontSize: 40,\n maxLines: 2,\n minPt: 24,\n })\n const headingFudge = Math.round(heading.fontSize * BASELINE_FUDGE_RATIO)\n const titleLastY =\n BADGE_CENTER_Y + ((heading.lines.length - 1) * heading.lineHeight) / 2 + headingFudge\n\n // academic's own `colors.accent` (emerald) measures well below even WCAG\n // AA's 3:1 floor for *large* text against the off-white content bg, let\n // alone the 4.5:1 floor this 22px/regular-weight line actually needs — so,\n // like navy, this theme substitutes `colors.primary` (measured\n // sufficient contrast) as the subheading's base color instead of the usual\n // `colors.accent` (see the task report's contrast table).\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: TITLE_MAX_W,\n fontSize: SUBHEADING_FONT_SIZE,\n minFontSize: SUBHEADING_MIN_FONT_SIZE,\n })\n const subheadingY = titleLastY + 41\n\n const contentRectY = titleLastY + CONTENT_GAP + (subheading ? SUBHEADING_SLOT : 0)\n const contentRect = {\n x: CONTENT_X,\n y: contentRectY,\n w: CONTENT_W,\n h: Math.max(0, CONTENT_BOTTOM - contentRectY),\n }\n\n const footnote = slide.footnote\n ? fitSvgLine(slide.footnote, { maxWidth: CONTENT_W, fontSize: 14, minFontSize: 11 })\n : null\n\n return (\n <>\n {/* Left numbered rail: fixed track + a node marking chapter progress */}\n <rect x={RAIL_X} y={RAIL_Y} width={RAIL_W} height={RAIL_H} fill={colors.primary} />\n <circle cx={RAIL_X + RAIL_W / 2} cy={railNodeCy} r={RAIL_NODE_R} fill={colors.primary} />\n\n {/* \"{chapter}.{content}\" number badge, replacing the old section kicker */}\n <rect\n x={BADGE_X}\n y={BADGE_Y}\n width={BADGE_W}\n height={BADGE_H}\n rx={BADGE_RADIUS}\n fill={colors.primary}\n />\n <text\n x={BADGE_CENTER_X}\n y={BADGE_CENTER_Y + Math.round(badgeLabel.fontSize * BASELINE_FUDGE_RATIO)}\n fontFamily={fonts.body}\n fontSize={badgeLabel.fontSize}\n fontWeight=\"700\"\n fill=\"#FFFFFF\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {badgeLabel.text}\n </text>\n\n {/* Heading, vertically centered against the badge row */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={TITLE_X}\n y={\n BADGE_CENTER_Y -\n ((heading.lines.length - 1) * heading.lineHeight) / 2 +\n i * heading.lineHeight +\n headingFudge\n }\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the badge/title row */}\n {subheading && (\n <text\n x={TITLE_X}\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: colors.text, baseFill: colors.primary, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Content blocks below the title row (was a divider + foreignObject) */}\n <SvgContent variant={slide.variant} blocks={slide.blocks} rect={contentRect} ctx={ctx} />\n\n {/* Footnote only — MasterChrome already renders the y=664 footer\n * hairline for content pages, so this archetype must not draw its own\n * line down there (see consulting.tsx's fix-wave note on the same\n * double-hairline bug). */}\n {footnote && (\n <text\n x={CONTENT_X}\n y=\"656\"\n fontFamily={fonts.body}\n fontSize={footnote.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {footnote.text}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/content-banner-heading.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport type { PptxIR } from \"@/ir\"\nimport { SvgContent } from \"../SvgContent\"\nimport { sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * banner-heading content archetype(spec §3.2,Wave 3 Task 19):consulting\n * 主题 content 页型的\"换骨\"语法——不是「kicker + 标题 + 分隔线」,而是全宽的\n * \"assertion banner\":一块不透明 `colors.primary` 色块承载白字标题(McKinsey\n * 式\"先结论后证据\"),banner 高度随标题折成 1/2 行变化,下方内容矩形随之\n * 下移,二者永不重叠。自 templates/consulting.tsx 的 `MckinseyNavyContent`\n * 提炼(351-483 行,Step A 用 `sed -n '351,483p'` 摘录核实——与 brief 给出的\n * 351-503 行不同,503 行已进入下一节 Ending 的头注释,函数体实际到 483 行\n * 为止)。随迁 helper:`hasTlLogo`(源文件 325-330 行,私有复制,判断 IR 里\n * 是否真的存在 tl 位 logo 资产,决定 kicker 要不要为 logo 让位,而不是静态\n * 假设最坏情况)。\n *\n * 替换表(Step B,逐函数实测——同 W2-8/W2-14 的发现,同一源文件里\n * NAVY/YELLOW/MUTED/DIVIDER 这 4 个模块级烤死常量并非每个函数都消费):\n * - 对函数区间 351-483 行(含随迁的 hasTlLogo 325-330 行)逐行核对,\n * NAVY/YELLOW/MUTED/DIVIDER **零命中**——本函数一次也没有引用它们。\n * 源代码里出现的颜色全部已经是 `colors.primary`/`colors.muted`/\n * `colors.text` 直接消费(kicker 用 muted、banner 填色/subheading 用\n * primary、subheading 强调段用 text、footnote 用 muted),未烤死。\n * - 唯一的颜色字面量是 banner 标题文字的纯白 `fill`,处理见下方\"白字\n * 例外\",不进替换表。\n * 结论:**无孤儿色**(没有替换表要核实的烤死常量,自然无孤儿),也没有\n * 需要做映射决策的 token 替换——本文件的 Step B 核实结果是\"确认源函数已\n * 完全 token 化,无需改动颜色表达式\"。\n *\n * 白字例外(同 chapter-banner-chapter.tsx / content-rail-numbered.tsx 记录\n * 的同一类产品逻辑):banner 标题文字固定写死纯白字面量——banner 底色是\n * 不透明的 `colors.primary`,为保证任意主题色下都可读,这不是随主题变化\n * 的烤死色,也不在任何 token 字段里,是\"色块上必须白字\"的结构性产品逻辑,\n * 不进替换表,予以保留并在测试里跨主题锁死。\n *\n * **档位一・逐字节等价**(函数区间内无烤死主题常量需要映射,唯一的颜色\n * 字面量是上面点名并测试锁死的白字例外)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试\n * 锁死的 banner 标题纯白字面量,grep 清零门预期恰好命中这一处。\n */\n\nconst BANNER_X = 96\nconst BANNER_Y = 72\nconst BANNER_W = 1088\nconst BANNER_H_1LINE = 88\nconst BANNER_H_2LINE = 132\nconst BANNER_RADIUS = 4\nconst BANNER_TITLE_X = 120\n// Baseline vertical-centering fudge: for a single line at the nominal 34px\n// heading size this yields a baseline of 72 + 88/2 + round(34*0.32) = 127,\n// matching the spec's fixed reference point, while staying proportional if\n// the heading shrinks toward its 22px floor on pathologically long titles.\nconst BANNER_BASELINE_FUDGE_RATIO = 0.32\nconst SOURCE_LINE_Y = 648\nconst CONTENT_RECT_BOTTOM = 620\n\n// Kicker (section-name label) sits above the banner, fully inside\n// MasterChrome's tl/tr logo bands' y-range (48-88) regardless of BANNER_Y.\n// `brand.logo_asset_id` is unset (no image at all) unless a deck explicitly\n// opts a logo into `position: \"tl\"` — so `hasTlLogo` mirrors MasterChrome's\n// own `logo?.src && !logo.error` gate to check the *real* IR instead of\n// assuming the worst: align with the banner's own left edge (BANNER_X)\n// whenever no tl logo actually resolves, and only fall back to the sideways\n// dodge (x=176) when one genuinely does.\nconst KICKER_Y = 52\n\nfunction hasTlLogo(ir: PptxIR): boolean {\n const { brand, assets } = ir\n if (brand?.position !== \"tl\" || !brand.logo_asset_id) return false\n const asset = assets.images[brand.logo_asset_id]\n return !!asset?.src && !asset.error\n}\n\n// Subheading: a 22px \"so-what\" sentence rendered directly below the banner.\n// Occupies a slot (22px line + gap) that only exists when `slide.subheading`\n// is set — SUBHEADING_SLOT is added to the content rect's y *only* in that\n// case, so a slide without a subheading gets byte-identical geometry to\n// before this feature existed. Unlike the other five themes' subheading,\n// this one anchors off `bannerBottom` (a filled color block with no CJK\n// glyph descent), not a title baseline, so it gets its own flat slot value\n// rather than a title-font-size-driven formula.\nconst SUBHEADING_FONT_SIZE = 22\nconst SUBHEADING_MIN_FONT_SIZE = 16\nconst SUBHEADING_SLOT = 38\n\nexport function BannerHeadingContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const section = sectionNameFor(ir.slides, index)\n\n // See KICKER_Y's doc comment: aligned with the banner's own left edge\n // (BANNER_X) unless a real tl-positioned logo is present, in which case\n // it falls back to the old sideways dodge.\n const kickerX = hasTlLogo(ir) ? 176 : BANNER_X\n const kickerMaxW = 1120 - 16 - kickerX\n const kicker = section\n ? fitSvgLine(section, { maxWidth: kickerMaxW, fontSize: 12, minFontSize: 9, letterSpacing: 4 })\n : null\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1040,\n fontSize: 34,\n maxLines: 2,\n minPt: 22,\n })\n const bannerH = heading.lines.length > 1 ? BANNER_H_2LINE : BANNER_H_1LINE\n const bannerBottom = BANNER_Y + bannerH\n const bannerCenterY = BANNER_Y + bannerH / 2\n const baselineFudge = Math.round(heading.fontSize * BANNER_BASELINE_FUDGE_RATIO)\n\n // Rendered outside/below the banner (the banner is the white-on-primary\n // assertion; this is a separate accent beat under it), at the banner's\n // bottom + 24 baseline. This theme's own `colors.accent` measures far\n // under WCAG AA's 4.5:1 floor for normal-weight text against the off-white\n // content background, so it substitutes `colors.primary` (measured\n // sufficient contrast) as the subheading's base color instead of the\n // usual `colors.accent` — same substitution content-rail-numbered.tsx\n // makes for academic.\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1040,\n fontSize: SUBHEADING_FONT_SIZE,\n minFontSize: SUBHEADING_MIN_FONT_SIZE,\n })\n const subheadingY = bannerBottom + 24\n\n const contentRectY = bannerBottom + 32 + (subheading ? SUBHEADING_SLOT : 0)\n const contentRect = {\n x: BANNER_X,\n y: contentRectY,\n w: BANNER_W,\n h: Math.max(0, CONTENT_RECT_BOTTOM - contentRectY),\n }\n\n const footnote = slide.footnote\n ? fitSvgLine(slide.footnote, { maxWidth: BANNER_W, fontSize: 14, minFontSize: 11 })\n : null\n\n return (\n <>\n {/* Kicker: section name */}\n {kicker && (\n <text\n x={kickerX}\n y={KICKER_Y}\n fontFamily={fonts.body}\n fontSize={kicker.fontSize}\n fill={colors.muted}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {kicker.text}\n </text>\n )}\n\n {/* Assertion banner: filled primary bar carrying the white heading */}\n <rect\n x={BANNER_X}\n y={BANNER_Y}\n width={BANNER_W}\n height={bannerH}\n rx={ctx.shape?.radius ?? BANNER_RADIUS}\n fill={colors.primary}\n />\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={BANNER_TITLE_X}\n y={\n bannerCenterY -\n ((heading.lines.length - 1) * heading.lineHeight) / 2 +\n i * heading.lineHeight +\n baselineFudge\n }\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill=\"#FFFFFF\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the banner */}\n {subheading && (\n <text\n x={BANNER_X}\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: colors.text, baseFill: colors.primary, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Content blocks below the banner (was a divider + foreignObject) */}\n <SvgContent variant={slide.variant} blocks={slide.blocks} rect={contentRect} ctx={ctx} />\n\n {/* Footnote only — MasterChrome already renders the y=664 footer\n * hairline for content pages, so this archetype must not draw its own\n * source line at y=648 (16px apart, doubled hairline). */}\n {footnote && (\n <text\n x={BANNER_X}\n y={SOURCE_LINE_Y + 28}\n fontFamily={fonts.body}\n fontSize={footnote.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {footnote.text}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/content-stacked-poster.tsx\nimport type { Block } from \"@/ir\"\nimport type { SvgTemplateProps } from \"./types\"\nimport type { ContentRect } from \"../layout\"\nimport type { BlockCtx } from \"../blocks/types\"\nimport { SvgContent } from \"../SvgContent\"\nimport { measureBlock, renderBlock } from \"../blocks\"\nimport { chapterNumberFor, sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * stacked-poster content archetype(spec §3.2,Wave 3 Task 20):creative\n * 主题 content 页型的\"换骨\"语法——不是「kicker + 标题 + 分隔线 +\n * 满宽内容」,而是全居中\"海报\":共享的居中 kicker(88 行小号 muted 章节标签 +\n * 104 行 accent 短横条)+ 800-weight 居中大标题,随 block 数分三档:\n * - 1 块:单个居中\"主视觉\" rect(x=190 w=900),从标题一路延伸到 y=640。\n * - 2 块:同一主视觉 rect 在 y=520 让位,hairline 分隔线,第二块进\n * \"标注条\" rect(x=190 w=900,y=532→640)。\n * - ≥3 块 / 0 块 / 主视觉或标注条放不下的块:整页降级为该主题*原始*的\n * 左对齐 kicker/标题 + 满宽 SvgContent 堆叠构图,逐字节原样保留(见\n * `renderStackedContent`)。\n * 自 templates/creative.tsx 的 `EditorialDarkContent`(522-694 行,Step A\n * 用 `grep -n` 实测边界——比 brief 给出的 522-696 短,695 行为空行,696 行\n * 起是紧随其后的 Ending 页型模块注释,不属于本函数体)提炼,随迁其消费的\n * 三个私有 helper:\n * - `renderPosterSlot`(347-365 行):把单个 block 渲染进一个海报\"槽位\"\n * (主视觉或标注条),chart/image 类走 bento 同款的等比缩放到填满槽位\n * (额外允许放大,封顶 1.3x),其余类型走 `SvgContent`。\n * - `blockFitsSlot`(374-377 行):判断某个 block 是否能不溢出地放进给定\n * 槽位——可缩放类型恒真,其余类型比较其在槽位宽度下的自然高度与槽位\n * 高度。\n * - `renderStackedContent`(383-520 行):Step A 复核确认本函数(≥3 块等\n * 降级路径 `if (!fits) return renderStackedContent(props)`)确实调用\n * 它,随迁为本文件私有函数,逐字节保留其构图(含它自己消费的\n * RED/FG/BORDER/META_MUTED 烤死常量,一并按下方替换表映射)。\n * - `AccentBar`(49-60 行):Step A 复核确认 `EditorialDarkContent` 的海报\n * 路径调用了它(源 627 行 `<AccentBar y={ACCENT_Y} />`)——内联为一个裸\n * `<rect>` 字面量(同 cover-poster-center.tsx / ending-poster-ending.tsx\n * 对同一 helper 的处理方式,不额外包一层组件函数)。`renderStackedContent`\n * 降级路径不调用 `AccentBar`,故降级路径没有短横条装饰。\n *\n * 替换表(Step B,逐十六进制核对 GF/themes/creative.ts 的 `colors`,\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * chapter-poster-chapter.tsx / ending-poster-ending.tsx 先例):\n * RED → ctx.colors.primary(逐字节精确匹配——**不是** `accent`,`accent`\n * 是另一个完全不同的暖棕色值,沿用 P1 cover-poster-center.tsx 已订正的\n * 映射结论,不重犯\"RED→accent\"的误判)。本函数区间内 RED 只有两个消费点:\n * `renderStackedContent` 的顶部 section label、`AccentBar`(海报路径的\n * accent 短横条)。\n * FG → ctx.colors.text(逐字节精确匹配,两条路径的标题都消费它)。\n * MUTED → ctx.colors.muted(逐字节精确匹配,仅海报路径的居中 kicker\n * 消费它——`renderStackedContent` 降级路径不消费 MUTED)。\n * BORDER → ctx.colors.border(逐字节精确匹配,creative token 表本身有\n * `border` 字段,无需 `?? muted` 兜底,同 chapter-poster-chapter.tsx /\n * ending-poster-ending.tsx 先例——两条路径各有一条分隔线消费它)。\n * 函数体内已直接消费 `ctx.colors.accent`/`ctx.colors.text`(subheading\n * 强调段落,两条路径都有),本就是 token 而非烤死常量,原样保留不进\n * 替换表。\n *\n * 孤儿色处理(**档位二・观感等价**,唯一孤儿色,沿用 P1\n * cover-poster-center.tsx / ending-poster-ending.tsx 已核实过的同一结论):\n * `META_MUTED` 在 creative token 表里没有精确匹配(既不等于 `muted` 也不\n * 等于任何其它字段),语义上与 `MUTED` 是同一\"次要文本\"角色的两级深浅,\n * 不是对比性装饰色——并入 `ctx.colors.muted`。该函数区间内 `META_MUTED`\n * 有两个消费点(海报路径与降级路径各自的 footnote),均随之改为\n * `ctx.colors.muted`,接受 creative 下观感等价而非逐字节一致。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\n\n/** Center-x of the 1280-wide canvas — every poster-mode element anchors here. */\nconst CENTER_X = 640\n\n/** Accent short hairline (AccentBar helper inlined): the *only* place accent\n * primary red is used outside the degrade path's section label — a pure\n * decoration, never a text color, per the poster grammar. */\nconst ACCENT_BAR_W = 60\nconst ACCENT_BAR_H = 4\n\nconst SECTION_LABEL_Y = 88\nconst ACCENT_Y = 104\nconst TITLE_Y = 184\nconst HERO_X = 190\nconst HERO_W = 900\nconst HERO_TITLE_GAP = 48\n// Full-budget poster bottom edge (1-block hero rect's floor, and 2-block\n// caption strip's floor) — every value below that used to be a bare `640`\n// keys off this single constant, so the footnote shrink (see `posterBottom`\n// below) only has one spot to touch.\nconst POSTER_BOTTOM_BASE = 640\n// When `slide.footnote` is set, the poster/strip floor pulls up by this much\n// so the footnote (rendered at y=656, per the old stacked path's 420-vs-460\n// contentH precedent) gets clear room instead of the full-budget block\n// running straight into it.\nconst POSTER_BOTTOM_FOOTNOTE_SHRINK = 40\nconst HERO_BOTTOM_HALF = 520 // 2-block: hero gives up the bottom 120px\nconst STRIP_DIVIDER_Y = 520\nconst STRIP_Y = 532\n\n// Subheading: a 22px accent \"so-what\" sentence below the title, on both the\n// poster and degrade paths. Occupies a slot (22px line + gap) added to\n// whichever y a path's content region already derives *only* when\n// `slide.subheading` is set, so a slide without one gets byte-identical\n// geometry to before this feature existed. The two paths' `subheadingY`\n// baselines don't move by the same amount, so they don't share one slot\n// constant — `SUBHEADING_SLOT` is the poster path's own slot,\n// `SUBHEADING_SLOT_STACKED` is the degrade path's.\nconst SUBHEADING_FONT_SIZE = 22\nconst SUBHEADING_MIN_FONT_SIZE = 16\nconst SUBHEADING_SLOT = 34\nconst SUBHEADING_SLOT_STACKED = 46\n\n// Block types whose content is a rendered graphic (chart/image) rather than\n// reflowable text — safe to uniformly scale to *fill* a poster slot (both\n// enlarging and shrinking), unlike text blocks which can't scale without\n// becoming illegible. Poster mode additionally allows scaling *up* (bento\n// only ever shrinks) since the hero is meant to read as a dominant image,\n// capped at 1.3x so it stays close to the page's usual safe margin.\nconst SCALABLE_TYPES = new Set([\"chart\", \"image\"])\nconst HERO_SCALE_MAX = 1.3\n\n/**\n * Render a single block into `rect` as one poster \"slot\" (hero or caption\n * strip). Scalable blocks (chart/image) get bento's uniform-scale-to-fit\n * technique, generalized to also scale *up* to HERO_SCALE_MAX so the slot is\n * always filled; everything else goes through `SvgContent`, which already\n * vertically centers a lone block — so every slot gets exactly one\n * `data-audit-rect` wrapper either way.\n */\nfunction renderPosterSlot(block: Block, rect: ContentRect, ctx: BlockCtx) {\n if (!SCALABLE_TYPES.has(block.type)) {\n return <SvgContent variant=\"single\" blocks={[block]} rect={rect} ctx={ctx} />\n }\n const auditRect = `${rect.x},${rect.y},${rect.w},${rect.h}`\n const measured = measureBlock(block, rect.w, ctx)\n const scale = measured > 0 ? Math.min(rect.h / measured, HERO_SCALE_MAX) : 1\n const scaledW = rect.w * scale\n const offsetX = rect.x + (rect.w - scaledW) / 2\n return (\n <g data-audit-rect={auditRect}>\n <g data-audit-box={`${offsetX},${rect.y},${scaledW}`}>\n <g transform={`translate(${offsetX},${rect.y}) scale(${scale})`}>\n {renderBlock(block, { x: 0, y: 0, w: rect.w }, ctx)}\n </g>\n </g>\n </g>\n )\n}\n\n/** Whether `block` will fit `rect` without overflowing. Scalable types always\n * \"fit\" (they scale to the slot by construction); everything else needs its\n * natural height, at the slot's width, to stay within budget. */\nfunction blockFitsSlot(block: Block, rect: ContentRect, ctx: BlockCtx): boolean {\n if (SCALABLE_TYPES.has(block.type)) return true\n return measureBlock(block, rect.w, ctx) <= rect.h\n}\n\n/** The original (pre-poster) left-aligned content construction — the\n * degrade path (>=3 blocks, no blocks, or a hero/strip block too tall for its\n * slot), kept byte-identical (modulo the token replacement table above) so\n * its geometry is unaffected by this theme's grammar change. */\nfunction renderStackedContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const section = sectionNameFor(ir.slides, index)\n const chNum = chapterNumberFor(ir.slides, index)\n const rawSectionLabel = section\n ? `章节 ${String(chNum).padStart(2, \"0\")} · ${section}`\n : null\n const sectionLabel = rawSectionLabel\n ? fitSvgLine(rawSectionLabel, {\n maxWidth: 1168,\n fontSize: 20,\n minFontSize: 12,\n letterSpacing: 4,\n })\n : null\n const contentH = slide.footnote ? 420 : 460\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1168,\n fontSize: 50,\n maxLines: 2,\n minPt: 26,\n })\n const headingExtra = Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = 150 + headingExtra\n\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1168,\n fontSize: SUBHEADING_FONT_SIZE,\n minFontSize: SUBHEADING_MIN_FONT_SIZE,\n })\n const subheadingY = headingLastY + 50\n const subheadingBudget = subheading ? SUBHEADING_SLOT_STACKED : 0\n\n const contentRectY = 180 + headingExtra + subheadingBudget\n const contentRectH = Math.max(120, contentH - headingExtra - subheadingBudget)\n\n return (\n <>\n {/* Top section label */}\n {sectionLabel && (\n <text\n x=\"56\"\n y=\"56\"\n fontFamily={ctx.fonts.body}\n fontSize={sectionLabel.fontSize}\n fontWeight=\"600\"\n fill={ctx.colors.primary}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {sectionLabel.text}\n </text>\n )}\n\n {/* Top divider */}\n <line\n x1=\"56\"\n y1=\"80\"\n x2=\"1224\"\n y2=\"80\"\n stroke={ctx.colors.border}\n strokeWidth=\"1.6\"\n />\n\n {/* Heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"56\"\n y={150 + i * heading.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"500\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the heading */}\n {subheading && (\n <text\n x=\"56\"\n y={subheadingY}\n fontFamily={ctx.fonts.heading}\n fontSize={subheading.fontSize}\n fill={ctx.colors.accent}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: ctx.colors.text, baseFill: ctx.colors.accent, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Content blocks (was a foreignObject) */}\n <SvgContent\n variant={slide.variant}\n blocks={slide.blocks}\n rect={{ x: 56, y: contentRectY, w: 1168, h: contentRectH }}\n ctx={ctx}\n />\n\n {/* Footnote */}\n {slide.footnote && (\n <text\n x=\"56\"\n y=\"688\"\n fontFamily={ctx.fonts.body}\n fontSize=\"20\"\n fill={ctx.colors.muted}\n letterSpacing=\"4\"\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {slide.footnote}\n </text>\n )}\n </>\n )\n}\n\nexport function StackedPosterContent(props: SvgTemplateProps) {\n const { ir, slide, index, ctx } = props\n\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1000,\n fontSize: 64,\n maxLines: 2,\n minPt: 36,\n })\n const titleLastY = TITLE_Y + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1000,\n fontSize: SUBHEADING_FONT_SIZE,\n minFontSize: SUBHEADING_MIN_FONT_SIZE,\n })\n const subheadingY = titleLastY + 46\n const heroY = titleLastY + HERO_TITLE_GAP + (subheading ? SUBHEADING_SLOT : 0)\n const isPair = slide.blocks.length === 2\n // Mirrors the stacked degrade path's `contentH = footnote ? 420 : 460`:\n // shrink the poster's full-budget floor when a footnote is present so it\n // doesn't run straight into the footnote rendered at y=656.\n const posterBottom = slide.footnote\n ? POSTER_BOTTOM_BASE - POSTER_BOTTOM_FOOTNOTE_SHRINK\n : POSTER_BOTTOM_BASE\n const heroBottom = isPair ? HERO_BOTTOM_HALF : posterBottom\n const heroRect: ContentRect = {\n x: HERO_X,\n y: heroY,\n w: HERO_W,\n h: Math.max(0, heroBottom - heroY),\n }\n const stripRect: ContentRect = {\n x: HERO_X,\n y: STRIP_Y,\n w: HERO_W,\n h: Math.max(0, posterBottom - STRIP_Y),\n }\n\n // Poster grammar only ever applies to exactly 1 or 2 blocks that actually\n // fit their hero/strip slot — >=3 blocks, 0 blocks, or a slot-busting block\n // (e.g. a many-item bullets list too tall for the 108px caption strip) all\n // fall back to the original full-width stack, which has its own, much more\n // generous, content rect.\n const fits =\n slide.blocks.length > 0 &&\n slide.blocks.length <= 2 &&\n blockFitsSlot(slide.blocks[0], heroRect, ctx) &&\n (!isPair || blockFitsSlot(slide.blocks[1], stripRect, ctx))\n if (!fits) return renderStackedContent(props)\n\n const section = sectionNameFor(ir.slides, index)\n const chNum = chapterNumberFor(ir.slides, index)\n const rawSectionLabel = section\n ? `章节 ${String(chNum).padStart(2, \"0\")} · ${section}`\n : null\n const sectionLabel = rawSectionLabel\n ? fitSvgLine(rawSectionLabel, {\n maxWidth: 900,\n fontSize: 16,\n minFontSize: 11,\n letterSpacing: 3,\n })\n : null\n\n const footnote = slide.footnote\n ? fitSvgLine(slide.footnote, { maxWidth: 1000, fontSize: 20, minFontSize: 14 })\n : null\n\n return (\n <>\n {/* Kicker: small centered section label (no accent color — see below) */}\n {sectionLabel && (\n <text\n x={CENTER_X}\n y={SECTION_LABEL_Y}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={sectionLabel.fontSize}\n fill={ctx.colors.muted}\n letterSpacing=\"3\"\n dominantBaseline=\"alphabetic\"\n >\n {sectionLabel.text}\n </text>\n )}\n\n {/* Kicker: accent hairline (AccentBar helper inlined) — pure\n decoration, replaces the old text kicker's accent color entirely\n (accent red is used nowhere else on this poster path). */}\n <rect\n x={CENTER_X - ACCENT_BAR_W / 2}\n y={ACCENT_Y}\n width={ACCENT_BAR_W}\n height={ACCENT_BAR_H}\n rx=\"2\"\n fill={ctx.colors.primary}\n />\n\n {/* Centered 800-weight title */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={CENTER_X}\n y={TITLE_Y + i * heading.lineHeight}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"800\"\n fill={ctx.colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: centered accent so-what sentence below the title */}\n {subheading && (\n <text\n x={CENTER_X}\n y={subheadingY}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={subheading.fontSize}\n fill={ctx.colors.accent}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: ctx.colors.text, baseFill: ctx.colors.accent, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Hero slot */}\n {renderPosterSlot(slide.blocks[0], heroRect, ctx)}\n\n {isPair && (\n <>\n <line\n x1={HERO_X}\n y1={STRIP_DIVIDER_Y}\n x2={HERO_X + HERO_W}\n y2={STRIP_DIVIDER_Y}\n stroke={ctx.colors.border}\n strokeWidth=\"1.4\"\n />\n {renderPosterSlot(slide.blocks[1], stripRect, ctx)}\n </>\n )}\n\n {footnote && (\n <text\n x={CENTER_X}\n y=\"656\"\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={footnote.fontSize}\n fill={ctx.colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {footnote.text}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/content-tone-adaptive-content.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { SvgContent } from \"../SvgContent\"\nimport { chapterNumberFor, sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\nimport { CONF_LABEL } from \"../../lib/conf-labels\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * tone-adaptive-content archetype(spec §3.2,Wave 3 Task 21):custom 主题\n * content 页型语法上的\"双色态\"——不像 cover/chapter/ending 三个已提炼的 custom\n * 兄弟页型那样在有背景图时整页切白字,而是改画一张浮在图片上的不透明白色\n * 卡片,卡片内部仍是与无背景图模式完全相同的墨色/静音色文字(卡片本身已提供\n * 对比度基底,不需要再切白字)。两分支坐标系不同(卡片内 x=92 起排、无背景\n * 图 x=64 起排)但颜色语义相同。自 templates/custom.tsx 的 `CustomContent`\n * (323-612 行,Step A 用 `grep -n` 实测边界——比 brief 给出的 323-614 短,\n * 613 行是空行,614 行起是下一节 Ending 的头注释,不属于本函数体)提炼,\n * 随迁 helper `hasBgImage`(36-44 行,私有复制,签名/实现原样不变,同\n * cover-tone-adaptive-header.tsx / chapter-tone-adaptive-chapter.tsx /\n * ending-tone-adaptive-ending.tsx 先例)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/custom.ts 的 colors。十\n * 六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同三个已提炼的\n * custom 兄弟页型先例):\n * - 源文件私有常量 `INK` —— 与 custom token 表当前的 `primary`、`text`\n * 两个字段精确匹配(custom.ts 里二者尚未拆分,仍是同一个值)。逐行核对\n * 本函数区间内 `INK` 的两处引用(两分支各一处标题 `fill={INK}`),均为\n * 文字填色语境,没有任何描边/stroke 用法——同 chapter-tone-adaptive-\n * chapter.tsx / ending-tone-adaptive-ending.tsx 同构、与 cover-tone-\n * adaptive-header.tsx 的双语境不同,统一映射到 `ctx.colors.text`(下方\n * 直接以 `colors.text` 引用)。**若 custom 主题未来把 text/primary 拆\n * 开,这里不需要回来重新判断语境——本函数天然只有一种语境**,与三个\n * 已提炼的 custom 兄弟页型的记录结论一致。\n * - 源文件私有常量 `MUTED` → `ctx.colors.muted` —— 精确匹配。两处引用\n * (卡片内 footer meta、无背景图模式 footnote),均是直接写死常量而非\n * 经 `withBg` 派生的变量——因为本函数的 `withBg` 分支不做白字切换(见\n * 下方\"两分支同色,非白字豁免\"一节),两处原样映射为 `colors.muted`。\n * - 源文件私有常量 `BORDER` → `ctx.colors.border ?? ctx.colors.muted` ——\n * 精确匹配,两分支各一处 divider 第二段描边。`??` 兜底沿用\n * ending-tone-adaptive-ending.tsx 的既有写法(`border` 在 `ThemeColors`\n * 上是可选字段)。\n * - `ctx.colors.accent`/`ctx.colors.text`:函数体内已直接消费(两分支的\n * section label、subheading 及其 `renderEmphasisTspans` 强调段落、\n * divider 第一段短横条),本就是 token 而非烤死常量,原样保留不进\n * 替换表。\n * 三个烤死常量全部精确匹配 token 值,**无孤儿色**。\n *\n * 两分支同色,非白字豁免(与三个已提炼的 custom 兄弟页型的关键结构差异,\n * 务必不要照抄它们的\"withBg 白字\"结论):`CustomContent` 的 `withBg` 分支\n * 不做 cover/chapter/ending 那种\"整页切白字\"处理——它改画一张不透明白色\n * 卡片浮在背景图上,卡片内部文字沿用与无背景图模式完全相同的墨色/静音色/\n * 描边色(`INK`/`MUTED`/`BORDER` 在两分支里映射到同一组 token,没有随\n * `withBg` 切换成白色字面量的三元表达式)。逐行核对过 323-612 行区间:\n * 唯一随 `withBg` 变化的颜色只有下面点名的白色卡片本身。\n *\n * 白色卡片豁免(Global Constraints 产品逻辑字面量豁免,与三个已提炼的\n * custom 兄弟页型的\"背景图上白字\"同属一类产品逻辑,但落点不同——这里落在\n * 卡片背景而非文字):`withBg` 为真时渲染的浮动卡片固定填充纯白——它扮演\n * \"浮在任意背景图片之上的不透明纸片\"角色,任意主题下都必须是不透明白色才\n * 能保证卡片内文字的可读性,不随主题变化,也不在任何 token 字段里,故不\n * 进上面的替换表,予以保留并在测试里跨主题锁死。\n *\n * **档位一・逐字节等价**(三个烤死常量都精确匹配 token 值,无孤儿色;唯一\n * 颜色字面量是上面点名并测试锁死的白色卡片豁免)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试锁\n * 死的白色卡片纯白字面量,grep 清零门预期恰好命中这一处。\n */\n\n/** Check whether the slide has a valid background image asset. Ported\n * verbatim from templates/custom.tsx(36-44 行),私有复制,签名/实现不变。*/\nfunction hasBgImage(\n ir: SvgTemplateProps[\"ir\"],\n slide: SvgTemplateProps[\"slide\"],\n): boolean {\n if (slide.background?.kind !== \"asset\") return false\n const assetId = slide.background.asset_id\n const asset = ir.assets.images[assetId]\n return !!(asset?.src && !asset.error)\n}\n\n/** Wave-B Task 5c: length (px) of the accent-colored lead-in segment on the\n * heading divider. Pure geometry (not a color), copied verbatim as a private\n * constant — not a candidate for the replacement table. */\nconst TITLE_BAR_LEN = 48\n\nexport function ToneAdaptiveContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const withBg = hasBgImage(ir, slide)\n const section = sectionNameFor(ir.slides, index)\n const chNum = chapterNumberFor(ir.slides, index)\n const rawSectionLabel = section\n ? `章节 ${String(chNum).padStart(2, \"0\")} · ${section}`\n : null\n\n if (withBg) {\n const sectionLabel = rawSectionLabel\n ? fitSvgLine(rawSectionLabel, {\n maxWidth: 1096,\n fontSize: 22,\n minFontSize: 12,\n letterSpacing: 2,\n })\n : null\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1096,\n fontSize: 44,\n maxLines: 2,\n minPt: 22,\n })\n const headingExtra = Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = 168 + headingExtra\n\n // Subheading (Task 5): a 22px accent so-what sentence below the heading.\n // Occupies a slot added to the divider/content region's y *only* when\n // `slide.subheading` is set, so a slide without one gets byte-identical\n // geometry to before this feature existed.\n //\n // S3b spacing fix (2026-07-07): the original generic +30 baseline left\n // only ~1px of clearance for this 44px title (titleLastY+round(0.12*44)=\n // titleLastY+5 vs. subheadingY-20=titleLastY+10). Unified formula:\n // headingLastY + 22(ascent) + 14(target gap) + round(0.12*44) =\n // headingLastY + 36+6 = +42. Slot grows by the same +12 the baseline\n // grew (30->42) so the subheading-to-divider gap doesn't shrink.\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1096,\n fontSize: 22,\n minFontSize: 16,\n })\n const subheadingY = headingLastY + 42\n const subheadingBudget = subheading ? 46 : 0\n const dividerY = 198 + headingExtra + subheadingBudget\n const contentRectY = 216 + headingExtra + subheadingBudget\n const contentRectH = Math.max(120, 400 - headingExtra - subheadingBudget)\n\n /* White content card floating on the background image — see file\n header's \"白色卡片豁免\". */\n return (\n <>\n {/* White card */}\n <rect\n x=\"48\"\n y=\"44\"\n width=\"1184\"\n height=\"632\"\n rx={ctx.shape?.radius ?? 14}\n fill=\"#FFFFFF\"\n />\n\n {/* Section label (kicker) inside card — Task 5b: accent, not muted */}\n {sectionLabel && (\n <text\n x=\"92\"\n y=\"104\"\n fontFamily={fonts.heading}\n fontSize={sectionLabel.fontSize}\n fill={colors.accent}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {sectionLabel.text}\n </text>\n )}\n\n {/* Heading inside card */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"92\"\n y={168 + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the heading (Task 5) */}\n {subheading && (\n <text\n x=\"92\"\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.accent}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: colors.text, baseFill: colors.accent, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Divider inside card: accent short bar (Task 5c, candidate ①) +\n thin rule — same x1/x2/y span as the pre-Task-5 single line, just\n split into two segments (zero geometry change). */}\n <line\n x1=\"92\"\n y1={dividerY}\n x2={92 + TITLE_BAR_LEN}\n y2={dividerY}\n stroke={colors.accent}\n strokeWidth=\"4\"\n />\n <line\n x1={92 + TITLE_BAR_LEN}\n y1={dividerY}\n x2=\"1188\"\n y2={dividerY}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.6\"\n />\n\n {/* Content area inside card (SvgContent replaces foreignObject) */}\n <SvgContent\n variant={slide.variant}\n blocks={slide.blocks}\n rect={{ x: 92, y: contentRectY, w: 1096, h: contentRectH }}\n ctx={ctx}\n />\n\n {/* Footer meta inside card */}\n <text\n x=\"92\"\n y=\"636\"\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {[\n ir.meta.confidentiality\n ? CONF_LABEL[ir.meta.confidentiality]\n : null,\n ir.meta.organization,\n ir.meta.version,\n ]\n .filter(Boolean)\n .join(\" · \")}\n </text>\n </>\n )\n }\n\n /* White background mode (no bg image). */\n const contentH = slide.footnote ? 420 : 460\n const sectionLabel = rawSectionLabel\n ? fitSvgLine(rawSectionLabel, {\n maxWidth: 1152,\n fontSize: 22,\n minFontSize: 12,\n letterSpacing: 2,\n })\n : null\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1152,\n fontSize: 46,\n maxLines: 2,\n minPt: 22,\n })\n const headingExtra = Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = 130 + headingExtra\n\n // Subheading (Task 5): a 22px accent so-what sentence below the heading.\n // Occupies a slot added to the divider/content region's y *only* when\n // `slide.subheading` is set, so a slide without one gets byte-identical\n // geometry to before this feature existed.\n //\n // S3b spacing fix (2026-07-07): the original generic +30 baseline left\n // only ~1px of clearance for this 46px title (titleLastY+round(0.12*46)=\n // titleLastY+6 vs. subheadingY-20=titleLastY+10). Unified formula:\n // headingLastY + 22(ascent) + 14(target gap) + round(0.12*46) =\n // headingLastY + 36+6 = +42. Slot grows by the same +12 the baseline\n // grew (30->42) so the subheading-to-divider gap doesn't shrink.\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1152,\n fontSize: 22,\n minFontSize: 16,\n })\n const subheadingY = headingLastY + 42\n const subheadingBudget = subheading ? 46 : 0\n const dividerY = 162 + headingExtra + subheadingBudget\n const contentRectY = 180 + headingExtra + subheadingBudget\n const contentRectH = Math.max(120, contentH - headingExtra - subheadingBudget)\n\n return (\n <>\n {/* Section label (kicker) — Task 5b: accent, not muted */}\n {sectionLabel && (\n <text\n x=\"64\"\n y=\"62\"\n fontFamily={fonts.heading}\n fontSize={sectionLabel.fontSize}\n fill={colors.accent}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {sectionLabel.text}\n </text>\n )}\n\n {/* Heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"64\"\n y={130 + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the heading (Task 5) */}\n {subheading && (\n <text\n x=\"64\"\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.accent}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, { accent: colors.text, baseFill: colors.accent, fontWeight: \"700\" })}\n </text>\n )}\n\n {/* Divider: accent short bar (Task 5c, candidate ①) + thin rule — same\n x1/x2/y span as the pre-Task-5 single line, just split into two\n segments (zero geometry change). */}\n <line\n x1=\"64\"\n y1={dividerY}\n x2={64 + TITLE_BAR_LEN}\n y2={dividerY}\n stroke={colors.accent}\n strokeWidth=\"4\"\n />\n <line\n x1={64 + TITLE_BAR_LEN}\n y1={dividerY}\n x2=\"1216\"\n y2={dividerY}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.6\"\n />\n\n {/* Content blocks (SvgContent replaces foreignObject) */}\n <SvgContent\n variant={slide.variant}\n blocks={slide.blocks}\n rect={{ x: 64, y: contentRectY, w: 1152, h: contentRectH }}\n ctx={ctx}\n />\n\n {/* Footnote */}\n {slide.footnote && (\n <text\n x=\"64\"\n y=\"688\"\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {slide.footnote}\n </text>\n )}\n </>\n )\n}\n","import type { Block } from \"@/ir\"\nimport type { ContentRect } from \"./layout\"\n\n/** Gap (px) between bento cards, both horizontal and vertical. */\nexport const BENTO_GAP = 16\n\ntype KpiCardsBlock = Extract<Block, { type: \"kpi_cards\" }>\n/** A single `kpi_cards` item, keyed off the schema so `icon`/`delta` stay in sync. */\nexport type KpiItem = KpiCardsBlock[\"items\"][number]\n\ntype IconCardsBlock = Extract<Block, { type: \"icon_cards\" }>\n/** A single `icon_cards` item, keyed off the schema so `icon` stays in sync. */\nexport type IconCardItem = IconCardsBlock[\"items\"][number]\n\n/**\n * A single bento tile: either a whole block, or one item exploded out of a\n * `kpi_cards`/`icon_cards` block (see `explodeIntoUnits`) — each item gets\n * its own card instead of the whole block sharing a single card. The\n * exploded variants still carry their *source* block (not just the one\n * item) — `renderCell` (`templates/tech.tsx`) needs it to resolve\n * `ctx.blockIndex` and tag the cell `data-blk`, since exploded units bypass\n * `renderBlock` (the usual tagging chokepoint) entirely.\n */\nexport type BentoUnit =\n | { kind: \"block\"; block: Block }\n | { kind: \"kpi-item\"; item: KpiItem; block: KpiCardsBlock }\n | { kind: \"icon-card-item\"; item: IconCardItem; block: IconCardsBlock }\n\n/** A unit paired with the page-coordinate card box the bento layout assigned it. */\nexport interface BentoCell {\n unit: BentoUnit\n box: { x: number; y: number; w: number; h: number }\n}\n\n/**\n * Explode a slide's blocks into bento tiles: every `kpi_cards`/`icon_cards`\n * block becomes one `kpi-item`/`icon-card-item` unit per item (so each item\n * reads as its own card instead of a card-in-a-card row squeezed into one\n * bento cell), every other block type passes through as a single `block`\n * unit unchanged. Order is preserved — a block's items land at that block's\n * position in the sequence. A `kpi_cards` block with zero items contributes\n * no units (`icon_cards` schema-enforces >=2 items, so it always contributes\n * at least 2).\n */\nexport function explodeIntoUnits(blocks: Block[]): BentoUnit[] {\n const units: BentoUnit[] = []\n for (const block of blocks) {\n if (block.type === \"kpi_cards\") {\n for (const item of block.items) units.push({ kind: \"kpi-item\", item, block })\n } else if (block.type === \"icon_cards\") {\n for (const item of block.items)\n units.push({ kind: \"icon-card-item\", item, block })\n } else {\n units.push({ kind: \"block\", block })\n }\n }\n return units\n}\n\n/**\n * Lay out up to 6 units into a \"bento\" card grid inside `rect`. Boxes are\n * card outer frames (no inner padding — that's the template renderer's job).\n * 7th unit and beyond are returned as `overflow` for the caller to render via\n * a full-width fallback (single-stack layout).\n */\nexport function layoutBento(\n units: BentoUnit[],\n rect: ContentRect\n): { cells: BentoCell[]; overflow: BentoUnit[] } {\n const { x, y, w, h } = rect\n\n if (units.length === 0) return { cells: [], overflow: [] }\n\n if (units.length === 1) {\n return { cells: [{ unit: units[0], box: { x, y, w, h } }], overflow: [] }\n }\n\n if (units.length === 2) {\n const usableW = w - BENTO_GAP\n const leftW = usableW * 0.58\n const rightW = usableW * 0.42\n return {\n cells: [\n { unit: units[0], box: { x, y, w: leftW, h } },\n { unit: units[1], box: { x: x + leftW + BENTO_GAP, y, w: rightW, h } },\n ],\n overflow: [],\n }\n }\n\n if (units.length === 3) {\n const usableW = w - BENTO_GAP\n const leftW = usableW * 0.6\n const rightW = usableW * 0.4\n const rightX = x + leftW + BENTO_GAP\n const rightH = (h - BENTO_GAP) / 2\n return {\n cells: [\n { unit: units[0], box: { x, y, w: leftW, h } },\n { unit: units[1], box: { x: rightX, y, w: rightW, h: rightH } },\n {\n unit: units[2],\n box: { x: rightX, y: y + rightH + BENTO_GAP, w: rightW, h: rightH },\n },\n ],\n overflow: [],\n }\n }\n\n if (units.length === 4) {\n // 2x2 grid (top row 60/40, bottom row 40/60 — unequal, offset).\n const usableW = w - BENTO_GAP\n const rowH = (h - BENTO_GAP) / 2\n const topLeftW = usableW * 0.6\n const topRightW = usableW * 0.4\n const bottomLeftW = usableW * 0.4\n const bottomRightW = usableW * 0.6\n const bottomY = y + rowH + BENTO_GAP\n\n return {\n cells: [\n { unit: units[0], box: { x, y, w: topLeftW, h: rowH } },\n {\n unit: units[1],\n box: { x: x + topLeftW + BENTO_GAP, y, w: topRightW, h: rowH },\n },\n { unit: units[2], box: { x, y: bottomY, w: bottomLeftW, h: rowH } },\n {\n unit: units[3],\n box: {\n x: x + bottomLeftW + BENTO_GAP,\n y: bottomY,\n w: bottomRightW,\n h: rowH,\n },\n },\n ],\n overflow: [],\n }\n }\n\n if (units.length === 5) {\n // Upper row of 3 equal-width cards, lower row of 2 equal-width cards —\n // both rows independently fill the full rect width (the 2-card row\n // isn't just the 3-card row's columns merged pairwise).\n const rowH = (h - BENTO_GAP) / 2\n const topW = (w - 2 * BENTO_GAP) / 3\n const bottomW = (w - BENTO_GAP) / 2\n const bottomY = y + rowH + BENTO_GAP\n\n return {\n cells: [\n { unit: units[0], box: { x, y, w: topW, h: rowH } },\n {\n unit: units[1],\n box: { x: x + topW + BENTO_GAP, y, w: topW, h: rowH },\n },\n {\n unit: units[2],\n box: { x: x + 2 * (topW + BENTO_GAP), y, w: topW, h: rowH },\n },\n { unit: units[3], box: { x, y: bottomY, w: bottomW, h: rowH } },\n {\n unit: units[4],\n box: { x: x + bottomW + BENTO_GAP, y: bottomY, w: bottomW, h: rowH },\n },\n ],\n overflow: [],\n }\n }\n\n if (units.length === 6) {\n // Equal-width 3x2 grid — no unequal-column bento asymmetry once every\n // slot is full, since there's no \"hero\" cell left to emphasize.\n const rowH = (h - BENTO_GAP) / 2\n const colW = (w - 2 * BENTO_GAP) / 3\n const bottomY = y + rowH + BENTO_GAP\n const colX = (i: number) => x + i * (colW + BENTO_GAP)\n\n return {\n cells: [\n { unit: units[0], box: { x: colX(0), y, w: colW, h: rowH } },\n { unit: units[1], box: { x: colX(1), y, w: colW, h: rowH } },\n { unit: units[2], box: { x: colX(2), y, w: colW, h: rowH } },\n { unit: units[3], box: { x: colX(0), y: bottomY, w: colW, h: rowH } },\n { unit: units[4], box: { x: colX(1), y: bottomY, w: colW, h: rowH } },\n { unit: units[5], box: { x: colX(2), y: bottomY, w: colW, h: rowH } },\n ],\n overflow: [],\n }\n }\n\n // 7+ units: the bento grid only ever has 6 cells — lay out the first 6 per\n // the 6-unit tier above and report the rest as overflow for the caller's\n // full-width fallback.\n const { cells } = layoutBento(units.slice(0, 6), rect)\n return { cells, overflow: units.slice(6) }\n}\n\n/**\n * Block types that already paint their own card/frame — callout's\n * left-bar-and-fill, code's dark panel, comparison's header row + rule\n * lines, quote's decorative mark/attribution treatment, verdict_banner's own\n * bordered/tinted conclusion strip. Lives here (not only in\n * `templates/tech.tsx`, which also renders against this exact set)\n * because `heroWeight` below needs the identical classification to rank a\n * self-visual block's hero weight — a single shared source of truth so the\n * \"which blocks are self-visual\" list can't drift between the two files.\n */\nexport const SELF_VISUAL_TYPES = new Set([\n \"callout\",\n \"code\",\n \"comparison\",\n \"quote\",\n \"verdict_banner\",\n])\n\n/**\n * \"Visual weight\" tiers consumed by `sortUnitsByHeroWeight`. `chart` and\n * `kpi-item` are *tied* at the top (the brief's \"chart ≥ kpi-item\" — both\n * are hero-worthy; when a slide has both, original IR order breaks the tie,\n * not a hard chart-over-kpi rule). `icon-card-item` ranks next, a\n * self-visual block (already carries its own chrome/tone — see\n * `SELF_VISUAL_TYPES`) above a plain block, which ranks lowest.\n */\nconst HERO_WEIGHT = {\n chartOrKpi: 3,\n iconCard: 2,\n selfVisual: 1,\n block: 0,\n} as const\n\nfunction heroWeight(unit: BentoUnit): number {\n if (unit.kind === \"kpi-item\") return HERO_WEIGHT.chartOrKpi\n if (unit.kind === \"icon-card-item\") return HERO_WEIGHT.iconCard\n if (unit.block.type === \"chart\") return HERO_WEIGHT.chartOrKpi\n if (SELF_VISUAL_TYPES.has(unit.block.type)) return HERO_WEIGHT.selfVisual\n return HERO_WEIGHT.block\n}\n\n/**\n * `layoutBento`'s cell **array positions**, per unit count, ordered from\n * largest box area to smallest (ties keep their natural index order). This\n * is *not* always `[0, 1, 2, ...]` — it is derived straight from the box\n * math in `layoutBento`'s own per-count branches above, not a stylistic\n * guess:\n *\n * - 2/3-unit tiers: index 0 (the wide-left / full-height-left card) is\n * unambiguously the single biggest cell.\n * - **4-unit tier**: indices 0 and 3 are the *diagonal* pair of \"big\" 0.6w\n * cells (top-left, bottom-right) — tied with each other, both bigger than\n * 1/2. Index 3 is not \"the last, least important\" slot; it's a second\n * hero-sized cell.\n * - **5-unit tier**: the bottom row (indices 3, 4 — `bottomW=(w-GAP)/2`) is\n * *wider*, and thus larger-area, than the top row (indices 0, 1, 2 —\n * `topW=(w-2*GAP)/3`) at the same row height — the top row is not the\n * \"hero\" row despite coming first.\n * - 6-unit tier: every cell is equal-area — no cell is a \"hero\" cell, order\n * is arbitrary (kept as identity).\n *\n * Verified numerically against `layoutBento`'s actual box formulas (not just\n * read off the source) before being hard-coded here — see bento-layout.test.ts.\n */\nconst CELL_AREA_RANK: Record<number, number[]> = {\n 0: [],\n 1: [0],\n 2: [0, 1],\n 3: [0, 1, 2],\n 4: [0, 3, 1, 2],\n 5: [3, 4, 0, 1, 2],\n 6: [0, 1, 2, 3, 4, 5],\n}\n\n/**\n * Reorder units so units with a *strictly higher* hero-weight than the rest\n * land in `layoutBento`'s largest-area cell(s) for that unit count (per\n * `CELL_AREA_RANK`). Units tied at the same weight are never redistributed\n * against each other — two branches handle this:\n *\n * - If every unit shares the same weight, there's nothing to promote: return\n * the array unchanged (identity cell mapping). This isn't just a\n * performance short-circuit — `CELL_AREA_RANK` is *not* the identity\n * permutation for the 4- and 5-unit tiers (see that table's own comment),\n * so without this branch a same-weight set would still get scattered\n * across cells for no reason (e.g. 4 equal-weight units would come out\n * reordered even though none of them outrank another).\n * - Otherwise, only units *above* the minimum weight present (\"promoted\"\n * units) claim `rank`'s largest-area cells — each weight tier, in\n * descending order, taking the next-biggest still-unclaimed cell(s) in\n * `rank`'s own order. The *lowest*-weight tier (everything left over)\n * isn't being promoted past anything, so instead of handing it whatever\n * `rank` entries remain in `rank`'s own (tie-agnostic) order, those\n * leftover cell indices are sorted back into ascending order first — this\n * keeps that tier's units in the same relative left-to-right/\n * top-to-bottom order they started in, rather than being scattered by\n * `rank`'s ordering. (Worked example: 1 chart among 3 equal-weight blocks\n * must promote only the chart into the biggest cell, leaving the 3 blocks\n * in their original relative order in the remaining cells — see this\n * file's tests.)\n *\n * `layoutBento` itself is untouched: it only ever fills `cells[i]` from\n * `units[i]`, so permuting its *input* is the entire mechanism — the grid\n * math needs no unit-kind awareness at all.\n *\n * Stable: units of equal weight keep their original relative order among\n * themselves (an explicit index tiebreaker, not a reliance on\n * `Array.prototype.sort`'s post-ES2019 stability guarantee) — deterministic,\n * reproducible output for the same input, per the SVG single-source\n * requirement (a render must not depend on sort-implementation happenstance).\n *\n * Unit counts outside 0-6 (the `explodeIntoUnits` caller's >6-unit case)\n * fall through unchanged — `BentoTechContent` always abandons the bento grid\n * for >6 units (see that file's degrade gate), so their order is never\n * actually turned into cell geometry; returning them as-is rather than\n * guessing a ranking avoids inventing behavior for an input shape this\n * function was never designed to place.\n */\nexport function sortUnitsByHeroWeight(units: BentoUnit[]): BentoUnit[] {\n const rank = CELL_AREA_RANK[units.length]\n if (!rank) return units.slice()\n\n const weights = units.map(heroWeight)\n if (weights.every((weight) => weight === weights[0])) return units.slice()\n\n const byWeightDesc = units\n .map((unit, index) => ({ unit, index }))\n .sort((a, b) => {\n const byWeight = weights[b.index] - weights[a.index]\n return byWeight !== 0 ? byWeight : a.index - b.index\n })\n .map((entry) => entry.unit)\n\n // `byWeightDesc` is sorted descending, so the lowest-weight tier is a\n // contiguous run at its tail. Everything strictly above `minWeight` is\n // \"promoted\" and gets a `rank`-ordered (biggest-remaining-cell-first)\n // slot; the tail inherits whatever cells are left, sorted back into\n // ascending cell-index order (see the doc comment above for why).\n const minWeight = Math.min(...weights)\n const promotedCount = weights.filter((weight) => weight > minWeight).length\n const leftoverCells = rank.slice(promotedCount).sort((a, b) => a - b)\n\n const result = new Array<BentoUnit>(units.length)\n byWeightDesc.forEach((unit, weightRank) => {\n const cellIndex =\n weightRank < promotedCount\n ? rank[weightRank]\n : leftoverCells[weightRank - promotedCount]\n result[cellIndex] = unit\n })\n return result\n}\n","// GF/svg/archetypes/content-bento-panel.tsx\nimport type React from \"react\"\nimport type { SvgTemplateProps } from \"./types\"\nimport type { ContentRect } from \"../layout\"\nimport type { ThemeColors } from \"../../themes/tokens\"\nimport type { BlockCtx } from \"../blocks/types\"\nimport { SvgContent } from \"../SvgContent\"\nimport {\n layoutBento,\n explodeIntoUnits,\n sortUnitsByHeroWeight,\n SELF_VISUAL_TYPES,\n type BentoCell,\n type KpiItem,\n type IconCardItem,\n} from \"../bento-layout\"\nimport { measureBlock, renderBlock } from \"../blocks\"\nimport { sectionNameFor } from \"../../lib/derive\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport {\n fitSvgLine,\n measureTextUnits,\n truncateToUnits,\n} from \"../../lib/svg-text-layout\"\nimport { Icon } from \"../icons\"\nimport { dedupeKpiUnit, deltaProps, splitKpiValueWidths } from \"../blocks/kpi\"\nimport { iconCardContentHeight, renderIconCardBody } from \"../blocks/icon-cards\"\nimport { fitEmphasisLine, renderEmphasisTspans } from \"../emphasis\"\n\n/**\n * bento-panel content archetype(spec §3.2,Wave 3 Task 22,本 wave 体量最大\n * 的一个):tech 主题 content 页型的\"换骨\"语法——不是「kicker + 标题 + 分隔线 +\n * 满宽内容」,而是把 block 序列炸成一组不等宽的 bento 卡片网格(最多 6 格),\n * `kpi_cards`/`icon_cards` 先炸成逐 item 独立卡片,再按\"英雄权重\"重排进最大\n * 的网格位。自 templates/tech.tsx 的 `BentoTechContent`(959-1163 行,Step A\n * 用 `grep -n` 实测边界——与 brief 给出的 959-1173 略有出入:959-1163 是函数\n * 体本身,1165-1180 行是 Ending 页型的私有 helper `splitTrailingPeriod` 的头\n * 注释与实现,不属于 Content 函数,未随迁)提炼。\n *\n * **6 个私有 helper 整体随迁**(Step A 用 `grep -n` 实测边界,与 brief 给出的\n * 行号一致):\n * - `kpiContentHeight`(227-234 行)\n * - `renderKpiCardBody`(252-417 行)\n * - `renderKpiCard`(421-444 行)\n * - `renderIconCard`(479-515 行)\n * - `cellOverBudget`(525-551 行)\n * - `renderCell`(560-672 行)\n * 连同这些 helper 与主函数共同消费的模块级私有常量(48-211 行,`BENTO_CYAN`\n * 除外——该常量只被 `BentoTechCover` 的 2x2 角标消费,Step A 复核 227-702 行\n * ∪ 959-1163 行区间内 grep 未命中 `BENTO_CYAN`,故不随迁,避免引入未使用的\n * 死代码)一并复制为本文件私有:`BENTO_CARD_RADIUS`/`BENTO_CARD_PAD`/\n * `BENTO_CARD_STROKE_OPACITY`/`BENTO_CARD_STROKE_WIDTH`/`BENTO_CARD_TOP_PAD`/\n * `BENTO_CARD_BOTTOM_PAD`/`SCALABLE_TYPES`/`PASSTHROUGH_SHELL_TYPES` 与全部\n * `BENTO_KPI_*`/`SINGLE_KPI_CARD_*`/`SINGLE_ICON_CARD_*`/\n * `BENTO_ICON_CARD_*` 尺寸常量。`SELF_VISUAL_TYPES` 本身已是 `../bento-layout`\n * 导出的公共模块(非 templates 私有),照常 import,不复制。\n *\n * 依赖公共模块核实(Step A 关键项):Step A 对 227-702 行 ∪ 959-1163 行区间\n * 逐一核对每个引用标识符的定义来源——`layoutBento`/`explodeIntoUnits`/\n * `sortUnitsByHeroWeight`/`SELF_VISUAL_TYPES`/`BentoCell`/`KpiItem`/\n * `IconCardItem` 均定义于 `../bento-layout`(已导出的公共模块);\n * `measureBlock`/`renderBlock` 定义于 `../blocks`;`sectionNameFor` 定义于\n * `../../lib/derive`(`chapterNumberFor` 未被本区间引用,未\n * import——那是 `BentoTechChapter` 专属);`fitHeadingLines` 定义于\n * `../heading-fit`;`fitSvgLine`/`measureTextUnits`/`truncateToUnits` 定义于\n * `../../lib/svg-text-layout`;`Icon` 定义于 `../icons`;\n * `deltaProps`/`splitKpiValueWidths` 定义于 `../blocks/kpi`;\n * `iconCardContentHeight`/`renderIconCardBody` 定义于 `../blocks/icon-cards`;\n * `fitEmphasisLine`/`renderEmphasisTspans` 定义于 `../emphasis`——全部是已\n * 公开导出的模块,没有任何一个又回头依赖 `templates/tech.tsx` 文件私有的\n * 其它符号(`CONF_LABEL`/`chapterNumberFor` 等 Cover/Chapter 专属依赖均未\n * 被此区间引用)。本文件不 import `../templates/tech`。\n *\n * 替换表(Step B):Step A 对 227-702 行 ∪ 959-1163 行区间执行 Global\n * Constraints 第 4 条给出的 hex/主题 id 字符串扫描(零命中,具体正则不抄进\n * 本注释——避免污染本文件自己的 grep 清零门,同 content-stacked-poster.tsx\n * 先例)——函数体与全部随迁 helper 已直接消费\n * `ctx.colors`/`colors`/`ctx.fonts`/`fonts`(`colors.surface`/\n * `colors.accent`/`colors.text`/`colors.muted`/`colors.primary`),无任何\n * 烤死颜色常量,无孤儿色。**档位一・逐字节等价**(tech 是零烤色主题,与 brief\n * 表格标注一致)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\n\nconst BENTO_CARD_RADIUS = 6\nconst BENTO_CARD_PAD = 20\n// Task 2's outline-card treatment: every bento shell (KPI/icon_cards\n// exploded tile, ordinary block cell) shares this fill/stroke — no separate\n// per-card-kind styling. `colors.panel` (bento's old distinct card-fill tier)\n// was retired in Task 1, so this is a literal `colors.surface`, not a\n// `colors.panel ?? colors.surface` fallback.\nconst BENTO_CARD_STROKE_OPACITY = \"0.3\"\nconst BENTO_CARD_STROKE_WIDTH = \"1\"\n// Content budget inside a card: renderBlock starts at box.y + BENTO_CARD_TOP_PAD\n// (clears the card's rounded top edge/stroke) and leaves BENTO_CARD_BOTTOM_PAD\n// of breathing room at the bottom before the card's own rounded edge.\nconst BENTO_CARD_TOP_PAD = 24\nconst BENTO_CARD_BOTTOM_PAD = 16\n\n// Block types whose content is a rendered graphic (no text-fit / truncation\n// semantics of its own) rather than reflowable text — safe to shrink\n// uniformly to fit a card's budget instead of forcing the whole slide to\n// degrade out of the bento grammar.\nconst SCALABLE_TYPES = new Set([\"chart\", \"image\"])\n\n// Block types that already paint their own card/frame — callout's\n// left-bar-and-fill, code's dark panel, comparison's header row + rule\n// lines, quote's decorative mark/attribution treatment, verdict_banner's own\n// bordered/tinted conclusion strip. Stacking bento's own outline shell\n// underneath one of these is a redundant \"卡中卡\" (card-in-a-card): the\n// block's own chrome is the card. These render bare inside their bento cell\n// instead — the cell's box *is* their render rect, with no extra inset\n// padding or shell paint.\n//\n// `SELF_VISUAL_TYPES` itself now lives in `../bento-layout` (Task 3):\n// `sortUnitsByHeroWeight`'s hero-ranking needs the exact same classification\n// to rank a self-visual block, so it's a single shared set rather than two\n// lists that could drift.\n\n// Task 2's \"双壳治理\" (double-shell governance): steps/flowchart/architecture/\n// timeline each already draw their own internal chrome per node — steps'\n// numbered-badge cards, flowchart's bordered node boxes, architecture's\n// filled layer bands, timeline's axis/dots — so a bento panel+stroke shell\n// painted *behind* the whole diagram is a redundant second shell around an\n// already-carded picture. Unlike `SELF_VISUAL_TYPES`, these still render\n// through `renderCell`'s ordinary-block branch (same grid box, same\n// BENTO_CARD_PAD/TOP_PAD/BOTTOM_PAD content inset, same audit annotations) —\n// they aren't single-block-centered via `SvgContent` — only the shell rect\n// itself is skipped (no fill, no stroke; effectively an invisible cell). Kept\n// as a separate set rather than folded into `SELF_VISUAL_TYPES` because that\n// set's *rendering path* (bare via `SvgContent`) is deliberately unchanged\n// here — only the shell paint differs.\nconst PASSTHROUGH_SHELL_TYPES = new Set([\n \"steps\",\n \"flowchart\",\n \"architecture\",\n \"timeline\",\n // 重设计(2026-07-09):段落被装进空壳大卡是真机审计的三大丑点之一——\n // 纯文本以无框形态存在(现代 bento 通行做法),与卡片形成疏密对比。\n \"paragraph\",\n \"quote\",\n])\n\n/* ── KPI single-card rendering (bento's own, not kpi.tsx's row layout) ──\n * kpi.tsx lays out N items side-by-side in one wide card — bento explodes\n * items into individual cards instead, so each needs its own compact\n * icon/value/unit/label/delta layout sized to a bento cell rather than a\n * fixed 120px-tall row card. Placement semantics (value+unit tspan split,\n * delta arrow, icon slot) intentionally mirror kpi.tsx's — `deltaProps` and\n * `splitKpiValueWidths` are imported straight from ../blocks/kpi.tsx (not\n * re-implemented here) so the two renderers can't drift on that math; only\n * the sizing constants below and the centered-in-cell layout are bento's own.\n */\nconst BENTO_KPI_ICON_SIZE = 18\nconst BENTO_KPI_ICON_GAP = 10\n// Task 2 \"display 级\": 32 -> 56, plus the value's fill switches from\n// colors.text to colors.accent (see renderKpiCardBody) — the value is now\n// the card's visual lead, not just bold body text. unit/label sizes are\n// untouched (label \"muted 不变\" per brief; unit stays proportional to the\n// *fitted* value size via the 0.45 ratio below, so it auto-scales with this\n// bump without a separate constant).\nconst BENTO_KPI_VALUE_SIZE = 56\nconst BENTO_KPI_VALUE_MIN_SIZE = 20\nconst BENTO_KPI_LABEL_SIZE = 16\nconst BENTO_KPI_LABEL_MIN_SIZE = 11\nconst BENTO_KPI_DELTA_SIZE = 16\n// Baseline-to-baseline distance from the value to the label — a real\n// line-gap, not the label's own font-size. Regression fix (pre-Task-2): the\n// label baseline used to sit at valueBaselineY + BENTO_KPI_LABEL_SIZE (only\n// 13px), which is barely more than the label's own ascent and left no room\n// at all for the value's glyph height/descenders — soffice real-render\n// exposed it as the label stamping over the value (\"99.95%\" over \"可用率\").\n// The resulting 34px was tuned for a 32px value; Task 2 scales it\n// proportionally (34 * 56/32 = 59.5, rounded to 60) alongside the value-size\n// bump above so the two can't drift back out of sync — a taller value needs\n// proportionally more clearance before the label, not the same fixed gap.\n// 重设计(2026-07-09):60px 的 value→label 空隙把卡内内容「上下拉散」\n// (真机审计:label 贴卡底、中部空洞)——收紧成呼吸距离,label 提大与\n// 56px value 建立合理对比。\nconst BENTO_KPI_VALUE_LABEL_GAP = 22\n// Task 2 \"发光点缀\": a solid dot + two concentric stroked rings anchored just\n// past the value (+unit) text's estimated right edge, simulating a glow\n// without an actual SVG filter (Chrome 103 / the controlled subset has\n// none) — see renderKpiCardBody's glowCx/glowCy math. Radii/opacities are\n// brief-literal values, not derived from anything else.\nconst BENTO_KPI_GLOW_DOT_R = 3\nconst BENTO_KPI_GLOW_RING1_R = 7\nconst BENTO_KPI_GLOW_RING2_R = 11\nconst BENTO_KPI_GLOW_RING1_OPACITY = \"0.18\"\nconst BENTO_KPI_GLOW_RING2_OPACITY = \"0.07\"\n// Gap from the value(+unit) text's estimated right edge to the glow\n// cluster's center point (not its visible edge — the dot's own r=3 sits\n// inside this gap, so the visible clearance from the last glyph is ~9px).\nconst BENTO_KPI_GLOW_GAP = 12\n// vc-task-7 review (Important #1): the horizontal clamp below only kept the\n// glow cluster inside the card's own right padding — it didn't know a delta\n// arrow (drawn separately, right-anchored at the same padding edge, see the\n// `dp &&` text below) also lives in that corner. With no icon, the value's\n// row sits at the same height as the delta row (no icon block pushing it\n// down), so a long value that shrinks to the clamp puts ring2 right where\n// the delta arrow renders. Reserve extra clearance in the clamp whenever a\n// delta is present (regardless of icon — icon presence only changes whether\n// the *natural* (unclamped) position would ever reach the clamp in the\n// first place, not whether the clamp itself is safe once reached).\nconst BENTO_KPI_GLOW_DELTA_RESERVE = 20\n\n// Task 3 \"视觉主角\": a kpi-item exploded into a cell taller than this (the\n// 2-unit tier's full-height cells, or the 3-unit tier's hero left cell —\n// see bento-layout.ts's CELL_AREA_RANK) earns one more display step, on top\n// of Task 2's 32->56 bump: 56->72, plus the glow rings grow +2/+3 in lockstep\n// (dot stays r=3 — only the two *rings* are called out in the brief). The\n// label/value gap is scaled by the same ratio Task 2 used to derive 60 from\n// 34 (34*56/32=59.5->60): 60*72/56=77.14, rounded to 77 — the taller value's\n// descenders need proportionally more clearance before the label baseline,\n// or the Task 2 label-stamped-on-value regression (see\n// BENTO_KPI_VALUE_LABEL_GAP's own comment) comes back at the new size.\n// 重设计(2026-07-09):300 的阈值让 2×2 布局(卡高 ~200)永远吃不到\n// 72px 大数字档——KPI 的价值就是数字冲击力,降到 190。\nconst BENTO_KPI_HERO_MIN_CELL_H = 190\nconst BENTO_KPI_HERO_VALUE_SIZE = 72\nconst BENTO_KPI_HERO_VALUE_LABEL_GAP = 28\nconst BENTO_KPI_HERO_GLOW_RING1_R = 9\nconst BENTO_KPI_HERO_GLOW_RING2_R = 14\n\n// A lone KPI item on an otherwise-empty Content page still reads as \"one\n// card\", not a giant shell stretched to the full bento rect (that's exactly\n// the empty-shell-card look this redesign removes for plain blocks) — fixed\n// at a modest width and centered instead of filling the rect.\nconst SINGLE_KPI_CARD_W = 400\nconst SINGLE_KPI_CARD_H = 160\n\n/**\n * The vertical space (px, from the card's inner top edge to the label's\n * baseline) a KPI item's content needs — icon (if any) + value line +\n * the fixed value→label gap, at each element's *unshrunk* font size. Used\n * both to position the value/label baselines (`renderKpiCardBody` derives\n * both baselines off this same offset math) and as the degrade-gate's\n * budget check (kept in one place so the two can never drift apart).\n *\n * `hero` (Task 3) selects the display-level 72px tier (see\n * `BENTO_KPI_HERO_MIN_CELL_H`'s own comment) — callers must derive it from\n * the *same* `box.h` the degrade gate and the render path both see, so the\n * budget check and the actual paint can never disagree about which size a\n * given cell renders at.\n */\nfunction kpiContentHeight(hasIcon: boolean, hero: boolean): number {\n const iconBlockH = hasIcon ? BENTO_KPI_ICON_SIZE + BENTO_KPI_ICON_GAP : 0\n const valueSize = hero ? BENTO_KPI_HERO_VALUE_SIZE : BENTO_KPI_VALUE_SIZE\n const valueLabelGap = hero\n ? BENTO_KPI_HERO_VALUE_LABEL_GAP\n : BENTO_KPI_VALUE_LABEL_GAP\n return iconBlockH + valueSize + valueLabelGap\n}\n\n/**\n * Render one KPI item's content (icon/value/unit/label/delta/glow) inside\n * `box`, at bento card padding. Does not paint the card shell (surface fill +\n * accent stroke) — callers compose that separately, mirroring how ordinary\n * block cells separate \"shell\" from \"content\".\n *\n * The content block is vertically centered in the card's fit budget (not\n * anchored to the top) — a KPI item exploded into a 2/3-unit bento tier\n * lands in a tall cell (h up to ~454px) while its own content is a fixed\n * ~113px, so top-anchoring left a large dead gap below it. Centering shifts\n * icon/value/label together by one `offsetY` added into `innerY` — their\n * *relative* spacing is fixed regardless of offsetY: icon flush at the top,\n * value's baseline `BENTO_KPI_VALUE_SIZE` below that, label's baseline a\n * further `BENTO_KPI_VALUE_LABEL_GAP` (>=30px) below the value's — enough\n * clearance that the label never sits under the value's glyphs.\n */\nfunction renderKpiCardBody(\n item: KpiItem,\n box: { x: number; y: number; w: number; h: number },\n ctx: BlockCtx\n): React.ReactElement {\n const innerX = box.x + BENTO_CARD_PAD\n const innerW = box.w - BENTO_CARD_PAD * 2\n const hasIcon = Boolean(item.icon)\n const iconBlockH = hasIcon ? BENTO_KPI_ICON_SIZE + BENTO_KPI_ICON_GAP : 0\n\n // Task 3 \"视觉主角\": a hero-sized cell (see BENTO_KPI_HERO_MIN_CELL_H's own\n // comment) bumps the value one more display step, 56->72, with the glow\n // rings and label gap scaling in lockstep — derived from `box.h` (the same\n // value `cellOverBudget` sees), never from `fittedValue.fontSize`, so the\n // degrade-gate budget check and this render can't disagree about which\n // tier a given cell is in.\n const hero = box.h > BENTO_KPI_HERO_MIN_CELL_H\n const valueSize = hero ? BENTO_KPI_HERO_VALUE_SIZE : BENTO_KPI_VALUE_SIZE\n const valueLabelGap = hero\n ? BENTO_KPI_HERO_VALUE_LABEL_GAP\n : BENTO_KPI_VALUE_LABEL_GAP\n const ring1R = hero ? BENTO_KPI_HERO_GLOW_RING1_R : BENTO_KPI_GLOW_RING1_R\n const ring2R = hero ? BENTO_KPI_HERO_GLOW_RING2_R : BENTO_KPI_GLOW_RING2_R\n\n // Same budget the degrade gate checks in `cellOverBudget` — centering off\n // it (rather than off raw box.h) keeps the content clear of the top\n // padding and the bottom breathing room in every case, including cells too\n // short to have any slack (offsetY floors at 0).\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n const offsetY = Math.max(0, (budgetH - kpiContentHeight(hasIcon, hero)) / 2)\n const innerY = box.y + BENTO_CARD_TOP_PAD + offsetY\n\n const dp = item.delta ? deltaProps(item.delta) : null\n const deltaColor = dp ? dp.color || ctx.colors.muted : ctx.colors.muted\n\n // Same value/unit width-split technique as kpi.tsx (shared via\n // `splitKpiValueWidths`, see blocks/kpi.tsx): the overflow auditor\n // measures a <text>'s whole textContent at the outer element's font-size,\n // so the value's width budget is shrunk in proportion to the unit's share\n // of the combined text instead of a flat pixel reserve.\n const valueStr = String(item.value)\n // 冗余单位去重(同 blocks/kpi.tsx:value 已含 unit 结尾时丢弃,防 \"35%%\")。\n const unit = dedupeKpiUnit(valueStr, item.unit)\n const { valueMaxWidth, unitMaxWidth } = splitKpiValueWidths(\n valueStr,\n unit,\n innerW\n )\n const fittedValue = fitSvgLine(valueStr, {\n maxWidth: valueMaxWidth,\n fontSize: valueSize,\n minFontSize: BENTO_KPI_VALUE_MIN_SIZE,\n })\n const unitFontSize = Math.round(fittedValue.fontSize * 0.45)\n const fittedUnit = unit\n ? truncateToUnits(unit, unitMaxWidth / unitFontSize)\n : null\n const fittedLabel = fitSvgLine(item.label, {\n maxWidth: innerW,\n fontSize: BENTO_KPI_LABEL_SIZE,\n minFontSize: BENTO_KPI_LABEL_MIN_SIZE,\n })\n\n const valueBaselineY = innerY + iconBlockH + valueSize\n const labelBaselineY = valueBaselineY + valueLabelGap\n\n // Glow cluster anchor: just past the value(+unit) text's estimated right\n // edge (same measureTextUnits-based width estimate the overflow auditor\n // itself uses elsewhere in this file — not real getBBox measurement, but\n // consistent with how every other width budget in this codebase is\n // computed), vertically at the value's own cap-height band (a fixed\n // fraction of the line's fixed slot, mirroring valueBaselineY/labelBaselineY\n // always deriving off the *unshrunk* value size rather than\n // fittedValue.fontSize). Clamped so the outer ring never crosses the card's\n // right padding — a very long value's estimated end would otherwise push\n // the glow past the card edge instead of just sitting near it. When a\n // delta arrow is also present, the clamp additionally reserves\n // `BENTO_KPI_GLOW_DELTA_RESERVE` px so a shrunk-to-the-clamp value's glow\n // can't visually collide with it (see that constant's own comment —\n // vc-task-7 review Important #1).\n const valueRenderedW =\n measureTextUnits(fittedValue.text) * fittedValue.fontSize\n const unitRenderedW =\n fittedUnit != null ? measureTextUnits(fittedUnit) * unitFontSize : 0\n const deltaReserve = dp ? BENTO_KPI_GLOW_DELTA_RESERVE : 0\n const glowMaxCx = box.x + box.w - BENTO_CARD_PAD - ring2R - deltaReserve\n const glowCx = Math.min(\n innerX + valueRenderedW + unitRenderedW + BENTO_KPI_GLOW_GAP,\n glowMaxCx\n )\n const glowCy = valueBaselineY - valueSize * 0.75\n\n return (\n <>\n {item.icon && (\n <Icon\n name={item.icon}\n x={innerX}\n y={innerY}\n size={BENTO_KPI_ICON_SIZE}\n color={ctx.colors.primary}\n />\n )}\n <text\n x={innerX}\n y={valueBaselineY}\n fontSize={fittedValue.fontSize}\n fontWeight=\"bold\"\n fill={ctx.colors.accent}\n fontFamily={ctx.fonts.heading}\n dominantBaseline=\"alphabetic\"\n >\n {fittedValue.text}\n {fittedUnit != null && (\n <tspan fontSize={unitFontSize} fill={ctx.colors.muted}>\n {fittedUnit}\n </tspan>\n )}\n </text>\n <circle\n cx={glowCx}\n cy={glowCy}\n r={BENTO_KPI_GLOW_DOT_R}\n fill={ctx.colors.accent}\n />\n <circle\n cx={glowCx}\n cy={glowCy}\n r={ring1R}\n fill=\"none\"\n stroke={ctx.colors.accent}\n strokeOpacity={BENTO_KPI_GLOW_RING1_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n <circle\n cx={glowCx}\n cy={glowCy}\n r={ring2R}\n fill=\"none\"\n stroke={ctx.colors.accent}\n strokeOpacity={BENTO_KPI_GLOW_RING2_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n {dp && (\n <text\n x={box.x + box.w - BENTO_CARD_PAD}\n y={innerY + BENTO_KPI_DELTA_SIZE}\n textAnchor=\"end\"\n fontSize={BENTO_KPI_DELTA_SIZE}\n fill={deltaColor}\n dominantBaseline=\"alphabetic\"\n >\n {dp.arrow}\n </text>\n )}\n <text\n x={innerX}\n y={labelBaselineY}\n fontSize={fittedLabel.fontSize}\n fill={ctx.colors.muted}\n fontFamily={ctx.fonts.body}\n dominantBaseline=\"alphabetic\"\n >\n {fittedLabel.text}\n </text>\n </>\n )\n}\n\n/** Paint a KPI card's shell (Task 2 outline: surface fill + accent stroke, no\n * corner stripe) and its content. */\nfunction renderKpiCard(\n item: KpiItem,\n box: { x: number; y: number; w: number; h: number },\n ctx: BlockCtx,\n colors: ThemeColors\n): React.ReactElement {\n return (\n <>\n <rect\n data-bento-shell=\"true\"\n x={box.x}\n y={box.y}\n width={box.w}\n height={box.h}\n rx={BENTO_CARD_RADIUS}\n fill={colors.surface}\n stroke={colors.accent}\n strokeOpacity={BENTO_CARD_STROKE_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n {renderKpiCardBody(item, box, ctx)}\n </>\n )\n}\n\n/* ── icon_cards single-card rendering (bento's own shell around the shared\n * content renderer) ──\n * `icon_cards` items explode the same way `kpi_cards` items do (see\n * `explodeIntoUnits`) — each item earns its own bento tile. Unlike the KPI\n * path, the card's *content* drawing (icon/title/text placement + text-fit)\n * is genuinely shared with `blocks/icon-cards.tsx` via `renderIconCardBody`/\n * `iconCardContentHeight` rather than reimplemented here — only the shell\n * (Task 2 outline: surface fill + accent stroke, no corner stripe) and this\n * cell's own padding convention are bento's own, matching every other bento\n * card.\n */\n\n// A lone icon-card item on an otherwise-empty Content page reads as one\n// modest centered card, mirroring `SINGLE_KPI_CARD_W/H` above — schema\n// enforces `icon_cards.items.length >= 2` so this is unreachable in\n// practice, but the type union still needs an explicit branch (see the\n// `onlyUnit` handling in `BentoPanelContent` below).\nconst SINGLE_ICON_CARD_W = 480\nconst SINGLE_ICON_CARD_H = 200\n\n// Task 2 \"层级拉开\": bento's icon-card title bumps 20 -> 22px, bento-only —\n// `blocks/icon-cards.tsx`'s own standalone row layout (used by the other 5\n// themes) keeps its default 20px. Threaded through as an explicit\n// `titleFontSize` opt (see `renderIconCardBody`/`iconCardContentHeight`'s\n// signatures in that file) rather than changing that file's module-level\n// `TITLE_FONT_SIZE` constant, so this is a bento-only parameter injection,\n// not a shared-renderer behavior change.\nconst BENTO_ICON_CARD_TITLE_SIZE = 22\n// 重设计(2026-07-09):24px 共享图标在 200px 高的 bento 卡里存在感太弱\nconst BENTO_ICON_CARD_ICON_SIZE = 30\n\n/** Paint an icon-card's shell (Task 2 outline: surface fill + accent stroke,\n * no corner stripe) and its shared content. */\nfunction renderIconCard(\n item: IconCardItem,\n box: { x: number; y: number; w: number; h: number },\n ctx: BlockCtx,\n colors: ThemeColors\n): React.ReactElement {\n const innerX = box.x + BENTO_CARD_PAD\n const innerW = box.w - BENTO_CARD_PAD * 2\n // 重设计(2026-07-09):icon/title/text 组垂直居中(原顶锚让卡下半空洞)\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n const contentH = iconCardContentHeight(item, innerW, {\n titleFontSize: BENTO_ICON_CARD_TITLE_SIZE,\n iconSize: BENTO_ICON_CARD_ICON_SIZE,\n })\n const innerY =\n box.y + BENTO_CARD_TOP_PAD + Math.max(0, (budgetH - contentH) / 2)\n return (\n <>\n <rect\n data-bento-shell=\"true\"\n x={box.x}\n y={box.y}\n width={box.w}\n height={box.h}\n rx={BENTO_CARD_RADIUS}\n fill={colors.surface}\n stroke={colors.accent}\n strokeOpacity={BENTO_CARD_STROKE_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n {renderIconCardBody(item, { x: innerX, y: innerY, w: innerW }, ctx, {\n titleFontSize: BENTO_ICON_CARD_TITLE_SIZE,\n iconSize: BENTO_ICON_CARD_ICON_SIZE,\n })}\n </>\n )\n}\n\n/** Whether a cell's content will overflow its box's fit budget — the same\n * degrade gate as before, generalized to `BentoUnit`s: a KPI item's budget\n * is its fixed content height (see `kpiContentHeight`); an icon-card item's\n * budget is `iconCardContentHeight` against the card's padded inner width\n * (shared with `blocks/icon-cards.tsx`, same split as the KPI case); a\n * self-visual block's budget is its own box (no shell padding to subtract,\n * since it renders bare — see `SELF_VISUAL_TYPES`); an ordinary block's\n * budget is `measureBlock` against the card's padded inner box. */\nfunction cellOverBudget(cell: BentoCell, ctx: BlockCtx): boolean {\n const { unit, box } = cell\n if (unit.kind === \"kpi-item\") {\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n const hero = box.h > BENTO_KPI_HERO_MIN_CELL_H\n return kpiContentHeight(Boolean(unit.item.icon), hero) > budgetH\n }\n if (unit.kind === \"icon-card-item\") {\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n // titleFontSize opt must match what renderIconCard actually paints\n // (BENTO_ICON_CARD_TITLE_SIZE) — otherwise this gate would measure\n // against the shared file's default 20px while the real render paints\n // 22px, letting a genuinely-overflowing card slip past the degrade check.\n return (\n iconCardContentHeight(unit.item, box.w - BENTO_CARD_PAD * 2, {\n titleFontSize: BENTO_ICON_CARD_TITLE_SIZE,\n iconSize: BENTO_ICON_CARD_ICON_SIZE,\n }) > budgetH\n )\n }\n if (SCALABLE_TYPES.has(unit.block.type)) return false\n if (SELF_VISUAL_TYPES.has(unit.block.type)) {\n return measureBlock(unit.block, box.w, ctx) > box.h\n }\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n return measureBlock(unit.block, box.w - BENTO_CARD_PAD * 2, ctx) > budgetH\n}\n\n/** Render one bento cell — shell (Task 2 outline: surface fill + accent\n * stroke, no corner stripe) plus its unit's content. Non-scalable blocks that\n * are over budget never reach here (the `degraded` gate in\n * `BentoPanelContent` catches them first); scalable blocks (chart/image) are\n * uniformly shrunk to fit instead; `PASSTHROUGH_SHELL_TYPES` blocks\n * (steps/flowchart/architecture/timeline) skip the shell rect entirely (see\n * that set's own doc comment — \"双壳治理\"). */\nfunction renderCell(\n cell: BentoCell,\n i: number,\n ctx: BlockCtx,\n colors: ThemeColors\n): React.ReactElement {\n const { unit, box } = cell\n // Card-level rect (h = box.h) so svg-audit's v-overflow check treats each\n // card as its own bottom boundary instead of inheriting the whole bento\n // region's rect — box and rect are independent walker vars in\n // svg-audit.ts, so both attributes coexist on the same <g> without one\n // clobbering the other: data-audit-box still drives the h-overflow\n // (left/right) check.\n const auditAttrs = {\n \"data-audit-box\": `${box.x},${box.y},${box.w}`,\n \"data-audit-rect\": `${box.x},${box.y},${box.w},${box.h}`,\n }\n // Wave-C S3: every unit variant now carries its source `block` (see\n // `BentoUnit`'s doc comment). kpi-item/icon-card-item cells call\n // `renderKpiCard`/`renderIconCard` directly below instead of `renderBlock`\n // (the usual `data-blk` tagging chokepoint — see `blocks/index.tsx`), so\n // this cell's own wrapping `<g>` is their only tagging point. The plain\n // \"block\" branch further down does *not* need this: it calls `renderBlock`\n // itself, which already tags its own output — adding it here too would\n // just double-nest the identical marker.\n const blk = ctx.blockIndex?.get(unit.block)\n const blkAttr = blk != null ? { \"data-blk\": blk } : {}\n\n if (unit.kind === \"kpi-item\") {\n return (\n <g key={i} {...auditAttrs} {...blkAttr}>\n {renderKpiCard(unit.item, box, ctx, colors)}\n </g>\n )\n }\n\n if (unit.kind === \"icon-card-item\") {\n return (\n <g key={i} {...auditAttrs} {...blkAttr}>\n {renderIconCard(unit.item, box, ctx, colors)}\n </g>\n )\n }\n\n const { block } = unit\n if (SELF_VISUAL_TYPES.has(block.type)) {\n // These blocks already paint their own card/frame — stacking bento's own\n // outline shell underneath would be the exact \"卡中卡\" nesting this\n // redesign removes. `SvgContent` already knows how to center a lone\n // block in a rect (and carries its own overflow guard as a safety net),\n // so reuse it verbatim with the cell's box as the render rect instead of\n // hand-rolling a bare-render/centering path here.\n return (\n <SvgContent\n key={i}\n variant=\"single\"\n blocks={[block]}\n rect={box}\n ctx={ctx}\n />\n )\n }\n\n const innerX = box.x + BENTO_CARD_PAD\n const innerW = box.w - BENTO_CARD_PAD * 2\n const budgetH = box.h - BENTO_CARD_TOP_PAD - BENTO_CARD_BOTTOM_PAD\n const measured = measureBlock(block, innerW, ctx)\n // 重设计(2026-07-09):内容垂直居中(原顶锚让短内容下方大片空洞)\n const centerOffset = Math.max(0, (budgetH - measured) / 2)\n const innerY = box.y + BENTO_CARD_TOP_PAD + centerOffset\n const scale =\n SCALABLE_TYPES.has(block.type) && measured > budgetH && measured > 0\n ? budgetH / measured\n : 1\n // steps/flowchart/architecture/timeline already draw their own internal\n // chrome (numbered-badge cards, bordered nodes, filled layer bands,\n // axis/dots) — painting bento's own shell underneath would be a redundant\n // second shell around an already-carded diagram. The cell's box/padding/\n // audit annotations are otherwise identical to any other ordinary block.\n const passthroughShell = PASSTHROUGH_SHELL_TYPES.has(block.type)\n\n return (\n <g key={i} {...auditAttrs}>\n {!passthroughShell && (\n <rect\n data-bento-shell=\"true\"\n x={box.x}\n y={box.y}\n width={box.w}\n height={box.h}\n rx={BENTO_CARD_RADIUS}\n fill={colors.surface}\n stroke={colors.accent}\n strokeOpacity={BENTO_CARD_STROKE_OPACITY}\n strokeWidth={BENTO_CARD_STROKE_WIDTH}\n />\n )}\n {scale >= 1 ? (\n renderBlock(block, { x: innerX, y: innerY, w: innerW }, ctx)\n ) : (\n // Render the block at its natural (unscaled) width, then shrink the\n // whole group uniformly and re-center it horizontally in the card's\n // inner width — the scaled-down width (innerW * scale) is narrower\n // than innerW, so the gap is split evenly on both sides.\n <g\n transform={`translate(${innerX + (innerW - innerW * scale) / 2},${innerY}) scale(${scale})`}\n >\n {renderBlock(block, { x: 0, y: 0, w: innerW }, ctx)}\n </g>\n )}\n </g>\n )\n}\n\nexport function BentoPanelContent({ ir, slide, index, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const section = sectionNameFor(ir.slides, index)\n // CJK has no case distinction, so the \"uppercase kicker\" convention just\n // keeps the letter-spacing/size treatment and leaves the text as-is.\n const kicker = section\n ? fitSvgLine(section, {\n maxWidth: 1088,\n fontSize: 12,\n minFontSize: 9,\n letterSpacing: 4,\n })\n : null\n\n const HEADING_BASELINE = 150\n const heading = fitHeadingLines(slide.heading, {\n maxWidth: 1088,\n fontSize: 44,\n maxLines: 2,\n minPt: 24,\n })\n const headingLastY =\n HEADING_BASELINE +\n Math.max(0, heading.lines.length - 1) * heading.lineHeight\n\n // Subheading (Task 5): a 22px accent so-what sentence below the heading.\n // Occupies a slot (22px line + gap) added to the bento grid's own y *only*\n // when `slide.subheading` is set, so a slide without one gets\n // byte-identical geometry to before this feature existed.\n //\n // S3b spacing fix (2026-07-07): the original generic +30 baseline left\n // only ~1px of clearance for this 44px title (titleLastY+round(0.12*44)=\n // titleLastY+5 vs. subheadingY-20=titleLastY+10 — nearly touching).\n // Unified formula: titleLastY + 22(ascent) + 14(target gap) +\n // round(0.12*44) = titleLastY + 36+6 = +42. Slot grows by the same +12\n // the baseline grew (30->42) so the subheading-to-grid gap doesn't shrink.\n const subheading = fitEmphasisLine(slide.subheading, {\n maxWidth: 1088,\n fontSize: 22,\n minFontSize: 16,\n })\n const subheadingY = headingLastY + 42\n const subheadingBudget = subheading ? 46 : 0\n\n const bentoRect: ContentRect = {\n x: 96,\n y: headingLastY + 36 + subheadingBudget,\n w: 1088,\n h: Math.max(0, 640 - (headingLastY + 36 + subheadingBudget)),\n }\n\n // Explode kpi_cards blocks into one bento tile per item *before* the grid\n // math runs — the grid's input is a mixed sequence of units (KPI items +\n // ordinary blocks), not raw `slide.blocks`.\n const units = explodeIntoUnits(slide.blocks)\n\n // A single-unit page never earns the bento *grid* grammar (there's\n // nothing to arrange into a grid), and a lone ordinary block additionally\n // drops the shell card entirely — rendering a full-bento-rect panel\n // around one block is exactly the \"整页空壳巨卡\" (page-filling empty-shell\n // card) this redesign removes. `SvgContent` already centers a lone block\n // in a rect, so this is the same degrade path used below, just not\n // labeled a degrade (nothing is overflowing). A lone KPI item is the one\n // exception: it keeps a card look, just a modest centered one instead of\n // a rect-filling shell (see `SINGLE_KPI_CARD_W/H`).\n let body: React.ReactElement\n const onlyUnit = units.length === 1 ? units[0] : null\n if (onlyUnit && onlyUnit.kind === \"kpi-item\") {\n const box = {\n x: bentoRect.x + (bentoRect.w - SINGLE_KPI_CARD_W) / 2,\n y: bentoRect.y + Math.max(0, (bentoRect.h - SINGLE_KPI_CARD_H) / 2),\n w: SINGLE_KPI_CARD_W,\n h: SINGLE_KPI_CARD_H,\n }\n body = renderCell({ unit: onlyUnit, box }, 0, ctx, colors)\n } else if (onlyUnit && onlyUnit.kind === \"icon-card-item\") {\n // Unreachable in practice — `icon_cards.items` schema-enforces >=2, so\n // an `icon_cards` block always explodes into >=2 units — but the type\n // union still needs an explicit branch (see `SINGLE_ICON_CARD_W/H`).\n const box = {\n x: bentoRect.x + (bentoRect.w - SINGLE_ICON_CARD_W) / 2,\n y: bentoRect.y + Math.max(0, (bentoRect.h - SINGLE_ICON_CARD_H) / 2),\n w: SINGLE_ICON_CARD_W,\n h: SINGLE_ICON_CARD_H,\n }\n body = renderCell({ unit: onlyUnit, box }, 0, ctx, colors)\n } else if (onlyUnit) {\n body = (\n <SvgContent\n variant=\"single\"\n blocks={[onlyUnit.block]}\n rect={bentoRect}\n ctx={ctx}\n />\n )\n } else {\n // Task 3 \"视觉主角\": reorder units by hero weight (chart/kpi-item highest,\n // then icon-card-item, then a self-visual block, then a plain block)\n // *before* the grid math runs, so the highest-weight unit(s) land in\n // whichever cell(s) `layoutBento` makes largest for this unit count —\n // `layoutBento` itself stays kind-agnostic; only its input order changes.\n const heroOrdered = sortUnitsByHeroWeight(units)\n const { cells } = layoutBento(heroOrdered, bentoRect)\n // Two independent reasons a slide can't use the bento grammar, merged\n // into one mutually-exclusive degrade gate so a slide never partially\n // renders bento cards:\n // - >6 units: the bento grid only ever has 6 cells. Rather than\n // cramming the rest into the same rect (overlapping cards) or\n // bolting on an ad-hoc \"+N\" card, abandon the bento grammar for this\n // slide entirely.\n // - any unit's content overflows its card's fit budget (see\n // `cellOverBudget`) — a text block can't scroll or truncate, so an\n // over-height block would either overflow the rounded card or get\n // silently clipped. A scalable block (chart/image) instead gets\n // uniformly shrunk to fit at render time below, so it never forces\n // this degrade; a KPI item's fixed-height content practically never\n // does either.\n // Both fall back to the same existing single-stack layout, which\n // already carries its own overflow guard — no overlap, guaranteed\n // either way.\n const degraded =\n units.length > 6 || cells.some((cell) => cellOverBudget(cell, ctx))\n body = degraded ? (\n <SvgContent\n variant=\"single\"\n blocks={slide.blocks}\n rect={bentoRect}\n ctx={ctx}\n />\n ) : (\n <g\n data-audit-rect={`${bentoRect.x},${bentoRect.y},${bentoRect.w},${bentoRect.h}`}\n >\n {cells.map((cell, i) => renderCell(cell, i, ctx, colors))}\n </g>\n )\n }\n\n return (\n <>\n {kicker && (\n <text\n x=\"96\"\n y=\"104\"\n fontFamily={fonts.body}\n fontSize={kicker.fontSize}\n fill={colors.muted}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n {kicker.text}\n </text>\n )}\n\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={HEADING_BASELINE + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Subheading: accent so-what sentence below the heading (Task 5) */}\n {subheading && (\n <text\n x=\"96\"\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.accent}\n dominantBaseline=\"alphabetic\"\n >\n {renderEmphasisTspans(subheading.segments, {\n accent: colors.text,\n baseFill: colors.accent,\n fontWeight: \"700\",\n })}\n </text>\n )}\n\n {body}\n\n {slide.footnote && (\n <text\n x=\"96\"\n y=\"652\"\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {slide.footnote}\n </text>\n )}\n </>\n )\n}\n","import type { ContentArchetype, ContentArchetypeId } from \"./types\"\nimport { NarrowColumnContent } from \"./content-narrow-column\"\nimport { TwoColumnContent } from \"./content-two-column\"\nimport { RailNumberedContent } from \"./content-rail-numbered\"\nimport { BannerHeadingContent } from \"./content-banner-heading\"\nimport { StackedPosterContent } from \"./content-stacked-poster\"\nimport { ToneAdaptiveContent } from \"./content-tone-adaptive-content\"\nimport { BentoPanelContent } from \"./content-bento-panel\"\n\nexport type { ContentArchetype, ContentArchetypeId } from \"./types\"\n\n// Wave 3 content 页型注册表:六主题四页型的 content 段已全部到位(tech 的\n// bento-panel 是最后一个,见 Wave 3 Task 22)——收紧回完整 Record,不再是\n// Partial 过渡态(沿用 chapter 页型在 Wave 2 收尾任务的同一模式)。\nexport const CONTENT_ARCHETYPES: Record<ContentArchetypeId, ContentArchetype> = {\n \"narrow-column\": NarrowColumnContent,\n \"rail-numbered\": RailNumberedContent,\n \"banner-heading\": BannerHeadingContent,\n \"stacked-poster\": StackedPosterContent,\n \"bento-panel\": BentoPanelContent,\n \"tone-adaptive-content\": ToneAdaptiveContent,\n \"two-column\": TwoColumnContent,\n}\n","// GF/svg/archetypes/ending-masthead-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * masthead-ending archetype(spec §3.2):居中大标题 + 斜体副标题 + 底部一行\n * 元信息(机构 / 联系方式 / 日期),无边框无水印,与 masthead-chapter 呼应同\n * 一\"报刊 masthead\"气质。自 templates/magazine.tsx 的 `EditorialSerifEnding`\n * (383-460 行)提炼。\n * 随迁 helper:无——`fitHeadingLines`/`fitSvgLine` 是公共 layout helper,照常\n * import,不复制。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/magazine.ts 的 colors):\n * Step A 对函数区间(383-460 行)grep 未命中任何 `#XXXXXX` 字面量或 theme id\n * 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.text`/`colors.muted`),无烤死颜色常量,无孤儿色。**档位\n * 一・逐字节等价**。\n *\n * 副题兜底逻辑(按当前源码实际行为原样迁移,不改语义):\n * `slide.subheading || (slide.heading ? \"\" : \"谢谢。\")`——仅当 `slide.heading`\n * 也缺省时才兜底显示\"谢谢。\";若 heading 有值但 subheading 缺省,则不显示副\n * 题(同 2026-07-09 consulting 去重裁决,见源码同一行注释)。测试覆盖有\n * heading(无兜底)与无 heading(兜底\"谢谢。\")两种 ir。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nexport function MastheadEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n\n const HEADING_LAST_BASELINE = 340\n const heading = fitHeadingLines(slide.heading || \"致谢\", {\n maxWidth: 1088,\n fontSize: 76,\n maxLines: 2,\n minPt: 36,\n })\n const headingY =\n HEADING_LAST_BASELINE - Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = HEADING_LAST_BASELINE\n\n // 兜底只服务完全默认的 ending 页(同 consulting 2026-07-09 去重裁决)\n const subheading = fitSvgLine(slide.subheading || (slide.heading ? \"\" : \"谢谢。\"), {\n maxWidth: 1088,\n fontSize: 28,\n minFontSize: 16,\n })\n const subheadingY = headingLastY + 56\n\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const contactText = contact ? [contact.name, contact.email].filter(Boolean).join(\" · \") : null\n const date = ir.meta.date\n const metaParts = [org, contactText, date].filter((v): v is string => Boolean(v))\n\n return (\n <>\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {subheading.text && (\n <text\n x=\"640\"\n y={subheadingY}\n fontFamily={fonts.heading}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {metaParts.length > 0 && (\n <text\n x=\"640\"\n y=\"640\"\n fontFamily={fonts.body}\n fontSize=\"13\"\n fill={colors.muted}\n letterSpacing=\"2\"\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {metaParts.join(\" · \")}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/ending-constellation-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * constellation-ending archetype(spec §3.2):底部收束的大号\"谢谢。\"式标题\n * (末尾句号单独染 accent 色)+ 可选副题 + 短 accent 签名条 + 居中机构/联系\n * 方式/日期元信息,呼应 constellation cover/chapter 同一\"星座科技\"气质。自\n * templates/tech.tsx 的 `BentoTechEnding`(实测边界 1183-1339 行,brief 给的\n * 1183-1404 含了其后的 Decor 注释块,Step A 复核后收窄)提炼。\n *\n * 随迁 helper:`splitTrailingPeriod`(tech.tsx 1174-1180 行,私有复制,函数\n * 体本身与颜色无关,纯字符串处理,逐字符原样迁移,未改一处逻辑)——用于把\n * 结束标题末尾的中文句号拆出来单独渲染为 accent 色的 tspan。\n *\n * 星座/光晕模块常量随迁核查(同 cover-constellation.tsx 先例的检查项):\n * Step A 对函数体逐行核查,`BentoTechEnding` **未引用**任何模块级私有常量\n * (`COVER_MOTIF_POINTS`/`COVER_MOTIF_HERO_POINT`/`BENTO_KPI_GLOW_RING*_OPACITY`\n * /`BENTO_CARD_STROKE_WIDTH`/`ENDING_MOTIF_POINTS` 等均属于 `BentoTechCover`\n * 或 `BentoTechDecor`,不属于本函数)——本函数体内没有星座点位/光晕环渲染,\n * 因此本任务无常量需要随迁,仅 `splitTrailingPeriod` 一项。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/tech.ts 的 colors):\n * Step A 对函数区间(1174-1339 行)grep 未命中任何 `#XXXXXX` 字面量或 theme\n * id 字符串——源函数体已直接消费 `ctx.colors`/`ctx.fonts`\n * (`colors.text`/`colors.accent`/`colors.muted`),无烤死颜色常量,无孤儿\n * 色。**档位一・逐字节等价**。\n *\n * 副题兜底语义(同 W2-11 masthead-ending 的裁决,按当前源码实际行为原样迁\n * 移,不改语义):源码是 `slide.subheading ? fitSvgLine(...) : null`——**没有\n * 兜底文案**,subheading 缺省时整块副题(包括其占位间距)直接不渲染,与\n * masthead-ending「heading 缺省才兜底副题文案」的语义不同,这里是纯粹的\n * \"有就渲染、没有就不渲染\",无兜底分支。heading 本身有兜底:\"谢谢。\"\n * (`slide.heading || \"谢谢。\"`)。测试覆盖有 heading(不触发 heading 兜底,\n * 因此不含分裂的句号 tspan 逻辑触发点也不同)与无 heading(触发\"谢谢。\"\n * 兜底,句号被拆分渲染为 accent 色)两种 ir。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\n\n// Ported verbatim from templates/tech.tsx(1174-1180 行)— pure string\n// helper, no color/theme dependency. Splits a trailing CJK full stop off a\n// line of text so the Ending heading's closing \"。\" can render in accent\n// color while the rest of the line stays `colors.text`.\nfunction splitTrailingPeriod(line: string): {\n rest: string\n period: string | null\n} {\n if (line.endsWith(\"。\")) return { rest: line.slice(0, -1), period: \"。\" }\n return { rest: line, period: null }\n}\n\nexport function ConstellationEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n\n const HEADING_LAST_BASELINE = 330\n const heading = fitHeadingLines(slide.heading || \"谢谢。\", {\n maxWidth: 1088,\n fontSize: 88,\n maxLines: 2,\n minPt: 44,\n })\n const headingY =\n HEADING_LAST_BASELINE -\n Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = HEADING_LAST_BASELINE\n const lastLineIndex = heading.lines.length - 1\n\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, {\n maxWidth: 1088,\n fontSize: 24,\n minFontSize: 16,\n })\n : null\n const subheadingY = headingLastY + 44\n\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const contactText = contact\n ? [contact.name, contact.email].filter(Boolean).join(\" · \")\n : null\n const date = ir.meta.date\n\n const metaLines: string[] = []\n if (org) metaLines.push(org)\n if (contactText) metaLines.push(contactText)\n if (metaLines.length === 0 && date) metaLines.push(date)\n\n const BAR_W = 60\n const BAR_H = 3\n const BAR_X = 640 - BAR_W / 2\n const BAR_Y = Math.max(\n 420,\n headingLastY + 68,\n subheading ? subheadingY + 68 : 0\n )\n const META_GAP = 40\n const META_LINE_HEIGHT = 22\n const metaFirstBaselineY = BAR_Y + BAR_H + META_GAP\n\n return (\n <>\n {heading.lines.map((line, i) => {\n if (i !== lastLineIndex) {\n return (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n )\n }\n // Signature detail: only the closing line's trailing \"。\" (if any)\n // splits into an accent-colored tspan.\n const { rest, period } = splitTrailingPeriod(line)\n return (\n <text\n key={i}\n x=\"640\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={colors.text}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {rest}\n {period && <tspan fill={colors.accent}>{period}</tspan>}\n </text>\n )\n })}\n\n {subheading && (\n <text\n x=\"640\"\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* Signature bar + meta text are omitted entirely (no orphaned bar,\n no empty card) when the deck carries no organization, contact, or\n date. */}\n {metaLines.length > 0 && (\n <>\n <rect\n x={BAR_X}\n y={BAR_Y}\n width={BAR_W}\n height={BAR_H}\n fill={colors.accent}\n />\n {metaLines.map((line, i) => (\n <text\n key={i}\n x=\"640\"\n y={metaFirstBaselineY + i * META_LINE_HEIGHT}\n fontFamily={fonts.body}\n fontSize=\"13\"\n fill={colors.muted}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n </>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/ending-rail-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * rail-ending archetype(spec §3.2):左下角两块深浅同色系矩形(呼应\n * cover 的通栏色块 / chapter 的进度轨道 motif),巨幅居中标题 + 斜体副标题 +\n * 一条 hairline 分隔的\"联系\"区块 + 版权行。自 templates/academic.tsx 的\n * `BCGEmeraldEnding` 提炼。\n *\n * Step A 实测边界(订正 brief 的\"约 559-712 行\"):函数体实际是\n * **559-664 行**(`export function BCGEmeraldEnding` 起,到其闭合 `}` 止)。\n * 719 行往后是 `BcgEmeraldDecor`(chapter/content/ending 共用的一个 Decor\n * 函数,不是 Ending 专属,且已被 cover-left-anchor.tsx 处理过它在 Cover 上\n * 的等价物 `TRIANGLE_DEEP`,其余部分排入 Wave 3 motif 迁移)——不在本次\n * BCGEmeraldEnding 的提炼范围内。随迁的只有函数体正上方 555-557 行的三个\n * 模块级私有数值常量(`ENDING_HEADING_LAST_BASELINE` /\n * `ENDING_TWO_LINE_SHIFT_MAX` / `ENDING_TWO_LINE_HAIRLINE_GAP`,整个\n * academic.tsx 里只有本函数消费),同 chapter-rail-chapter.tsx 处理\n * `CH_DOT_Y`/`CH_DOT_SPACING` 的先例,作为文件私有常量复制,不建公共 util。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/academic.ts 的 colors。\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * cover-left-anchor.tsx / chapter-rail-chapter.tsx 先例,核实过程见\n * w2t13 任务报告):\n * - 源文件私有常量 `DEEP_GREEN` → `colors.primary` —— 逐字符精确匹配。\n * - 源文件私有常量 `EMERALD` → `colors.accent` —— 精确匹配。\n * - 源文件私有常量 `TEXT` → `colors.text` —— 精确匹配。\n * - 源文件私有常量 `MUTED` → `colors.muted` —— 精确匹配。\n * - 源文件私有常量 `HAIRLINE` → `colors.border ?? colors.muted` ——\n * 精确匹配 academic 的 `border` 字段,`??` 兜底沿用\n * cover-left-anchor.tsx 的既有写法(`border` 在 `ThemeColors` 上是可选\n * 字段)。\n *\n * 孤儿色处理(**档位二・观感等价**,唯一孤儿色):版权行 fill 用的一个内联\n * 十六进制字面量,在 academic.ts 的 colors 表里没有精确匹配——整个\n * academic.tsx 文件 grep 只出现这一处(不是模块级具名常量)。判断过程\n * (Step B):\n * 1. 十六进制差值检验——该字面量相对 `colors.muted` 是几乎均匀的三通道\n * 整体调亮,同色系、同色相,只是更浅一档——这个\"数值上是某 token 的\n * 均匀偏移\"模式与 cover-left-anchor.tsx 记录的 `TRIANGLE_DEEP`\n * (`colors.primary` 均匀调暗一档)同构,不是随手取的近似灰。\n * 2. 页面内的层级证据——同一页里,\"联系\"标签与联系方式正文都用\n * `colors.muted`,版权行故意比它们更浅一档,形成\"正文 > 联系信息\n * (muted) > 版权 (更浅)\"的三级弱化梯度。若把它并入 `muted`,版权行会\n * 与上方联系信息同色,这个梯度就被抹平——不是\"元素隐形\"那种破坏,但\n * 仍是可观察的观感差异被抹掉,判定为该保留的对比性装饰色,同\n * `TRIANGLE_DEEP` 一类。\n * 3. 跨主题旁证——`templates/consulting.tsx` 的 `MckinseyNavyEnding`\n * 版权行也独立烤了一个跟自己 `muted` 不同的近似灰(consulting 自己的\n * Wave 2 Task 14 孤儿色,另案处理),两个主题各自独立地为\"版权行\"发明\n * 了一个比 `muted` 更浅的专属灰——不是巧合的抄近似值,是\"版权行天生该\n * 比其余弱化文本更淡\"这条构图惯例在多个主题里各自重复出现。\n * 结论:该字面量保留为文件私有装饰常量 `COPYRIGHT_FAINT`(十六进制值见\n * 下方代码本身),不并入 `colors.muted`,不进上面的替换表。测试用同\n * `TRIANGLE_DEEP` 一样的锁法断言其值跨主题原样出现、且不会被归并为任何\n * 主题的 `muted`。\n *\n * 副题兜底语义(按当前源码实际行为原样迁移,不改语义):只有主标题有\n * `slide.heading || \"谢谢\"` 这一层兜底——`slide.heading` 缺省时标题渲染固定\n * 文案\"谢谢\"。副标题**没有**独立兜底文案,纯粹按 `slide.subheading` 是否\n * 存在决定是否渲染(不是 masthead-ending 那种\"heading 也缺省才连带兜底副题\n * 文案\"的双重兜底模式,两个主题的源函数写法本就不同,不强行拉齐)。测试\n * 覆盖有 heading(标题原样、不触发兜底)与无 heading(兜底\"谢谢\")两种 ir。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试\n * 锁死的 `COPYRIGHT_FAINT`,grep 清零门预期恰好命中它的代码定义那一行。\n */\n\n// 随迁自 academic.tsx 模块作用域(555-557 行),只有 BCGEmeraldEnding 消费,\n// 随函数体一并复制为本文件私有常量。含义见源文件注释:两行标题时把首行上移\n// 一个 lineHeight(封顶 88px)以保持末行基线不变,hairline 间距同步收紧。\nconst ENDING_HEADING_LAST_BASELINE = 356\nconst ENDING_TWO_LINE_SHIFT_MAX = 88\nconst ENDING_TWO_LINE_HAIRLINE_GAP = 100\n\n// 装饰对比色(见文件头\"孤儿色处理\"):版权行专属的、比 `colors.muted` 浅\n// 一档的弱化灰,不对应任何 token 字段。原样保留自 templates/academic.tsx\n// 的内联字面量,不导出、不进 token 替换表。\nconst COPYRIGHT_FAINT = \"#8A968F\"\n\nexport function RailEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const copyright = ir.meta.copyright\n const contactText = [contact?.email, contact?.website].filter(Boolean).join(\" · \")\n\n const heading = fitHeadingLines(slide.heading || \"谢谢\", {\n maxWidth: 768,\n fontSize: 120,\n maxLines: 2,\n minPt: 40,\n })\n const isTwoLine = heading.lines.length > 1\n const headingY = isTwoLine\n ? ENDING_HEADING_LAST_BASELINE - Math.min(heading.lineHeight, ENDING_TWO_LINE_SHIFT_MAX)\n : ENDING_HEADING_LAST_BASELINE\n const headingLastY =\n headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const subheading = slide.subheading\n ? fitSvgLine(slide.subheading, { maxWidth: 768, fontSize: 40, minFontSize: 20 })\n : null\n const subheadingY = headingLastY + 68\n const hairlineY = headingLastY + (isTwoLine ? ENDING_TWO_LINE_HAIRLINE_GAP : 120)\n\n return (\n <>\n {/* Corner blocks — rects echoing Cover's rectangular color-block motif. */}\n <rect x=\"0\" y=\"480\" width=\"280\" height=\"240\" fill={colors.primary} />\n <rect x=\"0\" y=\"600\" width=\"140\" height=\"120\" fill={colors.accent} />\n\n <g transform=\"translate(96, 144)\">\n <circle cx=\"12\" cy=\"-12\" r=\"12\" fill={colors.accent} />\n {org && (\n <text\n x=\"48\"\n y=\"0\"\n fontFamily={fonts.body}\n fontSize=\"32\"\n fill={colors.primary}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n </g>\n\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"400\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"600\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {subheading && (\n <text\n x=\"400\"\n y={subheadingY}\n fontFamily={fonts.body}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n <line\n x1=\"400\"\n y1={hairlineY}\n x2=\"1184\"\n y2={hairlineY}\n stroke={colors.border ?? colors.muted}\n strokeWidth=\"1.4\"\n />\n\n {contactText && (\n <>\n <text\n x=\"400\"\n y={hairlineY + 52}\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n 联系\n </text>\n <text\n x=\"400\"\n y={hairlineY + 90}\n fontFamily={fonts.body}\n fontSize=\"28\"\n fill={colors.text}\n dominantBaseline=\"alphabetic\"\n >\n {contactText}\n </text>\n </>\n )}\n\n {copyright && (\n <text\n x=\"400\"\n y={hairlineY + 212}\n fontFamily={fonts.body}\n fontSize=\"22\"\n fill={COPYRIGHT_FAINT}\n dominantBaseline=\"alphabetic\"\n >\n {copyright}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/ending-banner-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * banner-ending archetype(spec §3.2):org 圆点标 + 巨幅斜体主标题 + 中文\n * 副标题 + 一条通栏分隔线 + \"联系\"区块 + 版权行,呼应 banner-title cover /\n * banner-chapter 同一\"结论横幅\"气质。自 templates/consulting.tsx 的\n * `MckinseyNavyEnding` 提炼。\n *\n * Step A 实测边界(订正 brief 的\"约 504-680 行\"):函数体实际是\n * **504-638 行**(`export function MckinseyNavyEnding` 起,到其闭合 `}`\n * 止)。639 行起是模块级 Decor 相关注释/`MckinseyNavyDecor`,不属于本函数。\n * 随迁的只有函数体正上方 500-502 行的三个模块级私有数值常量\n * (`ENDING_HEADING_LAST_BASELINE` / `ENDING_TWO_LINE_SHIFT_MAX` /\n * `ENDING_TWO_LINE_DIVIDER_GAP`,整个 consulting.tsx 里只有本函数消费),同\n * ending-rail-ending.tsx 处理 `ENDING_HEADING_LAST_BASELINE` 等三个常量的\n * 先例,作为文件私有常量复制,不建公共 util。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/consulting.ts 的\n * colors。十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * ending-rail-ending.tsx / cover-left-anchor.tsx 先例):consulting.tsx\n * 模块级共有 4 个烤死常量(`NAVY`/`YELLOW`/`MUTED`/`DIVIDER`,23-26 行),\n * 但 grep 该函数区间(504-638 行)后确认 `DIVIDER` 在本函数体内**未被\n * 使用**(分隔线用的是 `NAVY`,不是 `DIVIDER`——与 banner-title cover 的\n * meta 分隔线用 `DIVIDER` 不同,是本函数自己的构图选择,原样保留不改\n * 语义)。本函数实际消费的只有以下三个,均逐字符精确匹配\n * `themes/consulting.ts` 的对应字段:\n * - `NAVY` → `colors.primary`。\n * - `YELLOW` → `colors.accent`。\n * - `MUTED` → `colors.muted`。\n *\n * 孤儿色处理(**档位二・观感等价**,唯一孤儿色):版权行 `fill` 用的一个\n * 内联十六进制字面量(630 行,不是模块级具名常量,grep 整个\n * consulting.tsx 只出现这一处)在 consulting.ts 的 colors 表里没有精确\n * 匹配。判断过程(Step B,参照 ending-rail-ending.tsx 对 academic 同类\n * 孤儿色 `COPYRIGHT_FAINT` 的裁决):\n * 1. 十六进制差值检验——该字面量相对 `colors.muted` 是三通道几乎均匀的\n * 整体调亮,同色相、同去饱和灰调,只是更浅一档——与 academic 版权行\n * 孤儿色相对 `muted` 的偏移模式同构。\n * 2. 页面内的层级证据——同一页里,\"联系\"标签与联系方式正文都用\n * `colors.muted`(`MUTED`),版权行故意比它们更浅一档,形成\"正文 >\n * 联系信息 (muted) > 版权 (更浅)\"的三级弱化梯度,若并入 `muted` 会把\n * 这个梯度抹平。\n * 3. 跨主题旁证——ending-rail-ending.tsx 文件头已记录:`academic` 的\n * `BCGEmeraldEnding` 版权行独立烤了一个跟自己 `muted` 不同的近似灰\n * (`COPYRIGHT_FAINT`),两个主题各自独立为\"版权行\"发明一个比\n * `muted` 更浅的专属灰——不是巧合的抄近似值,是\"版权行天生该比其余\n * 弱化文本更淡\"这条构图惯例在多个主题里各自重复出现,判定为该保留\n * 的对比性装饰色,同 `COPYRIGHT_FAINT` 一类,不并入 `colors.muted`。\n * 结论:该字面量保留为文件私有装饰常量 `COPYRIGHT_FAINT`(原始值见下方\n * 代码本身,小写 hex,原样保留,不改大小写),不进上面的替换表。测试用\n * 同 ending-rail-ending.tsx 一样的锁法断言其值跨主题原样出现、且不会被\n * 归并为任何主题的 `muted`。因存在此孤儿色,本函数整体走**档位二**。\n *\n * 白字豁免:本函数区间 grep 未命中任何纯白字面量——不涉及 Global\n * Constraints 的\"产品逻辑白字\"豁免类别,无需额外点名。\n *\n * 副题兜底语义(按当前源码实际行为原样迁移,不改语义,见源码 525-526 行\n * 注释\"兜底只服务完全默认的 ending 页\"):`slide.subheading ||\n * (slide.heading ? \"\" : \"谢谢。\")`——仅当 `slide.heading` 也缺省时才兜底\n * 显示\"谢谢。\";若 `heading` 有值但 `subheading` 缺省,则不显示任何副题\n * (避免模型已填感谢语时与兜底副题语义重复)。主标题自身兜底\n * `slide.heading || \"Thank you.\"`。测试覆盖有 heading(不触发副题兜底)与\n * 无 heading(标题兜底\"Thank you.\"、副题兜底\"谢谢。\")两种 ir。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试\n * 锁死的 `COPYRIGHT_FAINT`,grep 清零门预期恰好命中它的代码定义那一行。\n */\n\n// 随迁自 consulting.tsx 模块作用域(500-502 行),只有 MckinseyNavyEnding\n// 消费,随函数体一并复制为本文件私有常量。含义见源文件注释:两行标题时把\n// 首行上移一个 lineHeight(封顶 85px)以保持末行基线不变,分隔线间距同步\n// 收紧。\nconst ENDING_HEADING_LAST_BASELINE = 356\nconst ENDING_TWO_LINE_SHIFT_MAX = 85\nconst ENDING_TWO_LINE_DIVIDER_GAP = 128\n\n// 装饰对比色(见文件头\"孤儿色处理\"):版权行专属的、比 `colors.muted` 浅\n// 一档的弱化灰,不对应任何 token 字段。原样保留自 templates/consulting.tsx\n// 的内联字面量,不导出、不进 token 替换表。\nconst COPYRIGHT_FAINT = \"#8a8a86\"\n\nexport function BannerEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const copyright = ir.meta.copyright\n const author = ir.meta.authors?.[0]\n const contactText = [author?.name, contact?.email]\n .filter(Boolean)\n .join(\" · \")\n\n const heading = fitHeadingLines(slide.heading || \"Thank you.\", {\n maxWidth: 1088,\n fontSize: 132,\n maxLines: 2,\n minPt: 40,\n })\n const isTwoLine = heading.lines.length > 1\n const headingY = isTwoLine\n ? ENDING_HEADING_LAST_BASELINE - Math.min(heading.lineHeight, ENDING_TWO_LINE_SHIFT_MAX)\n : ENDING_HEADING_LAST_BASELINE\n const headingLastY =\n headingY + Math.max(0, heading.lines.length - 1) * heading.lineHeight\n // 兜底只服务完全默认的 ending 页(模型填了 heading 时再兜底\"谢谢。\"必然\n // 语义重复,同 consulting 源码 2026-07-09 去重裁决,原样迁移)\n const subheading = fitSvgLine(slide.subheading || (slide.heading ? \"\" : \"谢谢。\"), {\n maxWidth: 1088,\n fontSize: 48,\n minFontSize: 24,\n })\n const subheadingY = headingLastY + 80\n const dividerY = headingLastY + (isTwoLine ? ENDING_TWO_LINE_DIVIDER_GAP : 164)\n\n return (\n <>\n {/* Organization label */}\n <g transform=\"translate(96, 136)\">\n <circle cx=\"12\" cy=\"-12\" r=\"12\" fill={colors.accent} />\n {org && (\n <text\n x=\"48\"\n y=\"0\"\n fontFamily={fonts.body}\n fontSize=\"32\"\n fill={colors.primary}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n </g>\n\n {/* Main heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"96\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"500\"\n fill={colors.primary}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Chinese subheading(空串=heading 已含感谢语,跳过) */}\n {subheading.text && (\n <text\n x=\"96\"\n y={subheadingY}\n fontFamily={fonts.heading}\n fontSize={subheading.fontSize}\n fill={colors.muted}\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* Horizontal divider */}\n <line\n x1=\"96\"\n y1={dividerY}\n x2=\"1184\"\n y2={dividerY}\n stroke={colors.primary}\n strokeWidth=\"1.4\"\n />\n\n {/* Contact section */}\n {contactText && (\n <>\n <text\n x=\"96\"\n y={dividerY + 52}\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={colors.muted}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n 联系\n </text>\n <text\n x=\"96\"\n y={dividerY + 90}\n fontFamily={fonts.body}\n fontSize=\"28\"\n fill={colors.primary}\n dominantBaseline=\"alphabetic\"\n >\n {contactText}\n </text>\n </>\n )}\n\n {/* Copyright */}\n {copyright && (\n <text\n x=\"96\"\n y={dividerY + 168}\n fontFamily={fonts.body}\n fontSize=\"22\"\n fill={COPYRIGHT_FAINT}\n dominantBaseline=\"alphabetic\"\n >\n {copyright}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/ending-poster-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine } from \"../../lib/svg-text-layout\"\n\n/**\n * poster-ending archetype(spec §3.2):全居中\"海报\"式收尾页——巨幅斜体居中\n * 标题、短横条(accent 红)、斜体副标题、水平分隔线、底部单行合并 meta\n * (组织 / 联系方式 / 版权)。自 templates/creative.tsx 的\n * `EditorialDarkEnding`(697-844 行,Step A 实测边界,brief 估 697-845——闭合\n * `}` 在 844 行,845 行为空行,846 行起是紧随其后的 `EditorialDarkDecor`,\n * 不属于本函数体)提炼。\n *\n * 随迁 helper:`AccentBar`(源文件 49-60 行)——Step A 复核确认本函数体内确实\n * 调用了它(`<AccentBar y={accentY} />`,源 773 行),与 chapter-poster-chapter\n * 不同(W2-9 已确认 Chapter 不调用,未内联)。本文件将其内联为一个裸 `<rect>`\n * 字面量(同 cover-poster-center.tsx 对同一 helper 的处理方式,不额外包一层\n * 组件函数,直接写在调用点)。\n *\n * 替换表(Step B,逐十六进制核对 GF/themes/creative.ts 的 `colors`,\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * chapter-poster-chapter.tsx / cover-poster-center.tsx 先例):\n * RED → ctx.colors.primary(逐字节精确匹配——**不是** `accent`,`accent`\n * 是另一个完全不同的暖棕色值,沿用 P1 cover-poster-center.tsx 已订正的\n * 映射结论,不重犯\"RED→accent\"的误判)。\n * FG → ctx.colors.text(逐字节精确匹配)。\n * MUTED → ctx.colors.muted(逐字节精确匹配)。\n * BORDER → ctx.colors.border(逐字节精确匹配,creative token 表本身有\n * `border` 字段,无需 `?? muted` 兜底)。\n *\n * 孤儿色处理(**档位二・观感等价**,唯一孤儿色,沿用 P1 cover-poster-center.tsx\n * 已核实过的同一结论):`META_MUTED` 在 creative token 表里没有精确匹配(既不\n * 等于 `muted` 也不等于任何其它字段),语义上与 `MUTED` 是同一\"次要文本\"角色\n * 的两级深浅,不是对比性装饰色——并入 `ctx.colors.muted`。该函数内 `META_MUTED`\n * 唯一的消费点(底部合并 meta 行)随之改为 `ctx.colors.muted`,接受 creative\n * 下观感等价而非逐字节一致。\n *\n * 副题兜底语义(按当前源码实际行为原样迁移,不改语义,同 consulting\n * 2026-07-09 去重裁决):`slide.subheading || (slide.heading ? \"\" : \"Questions\n * & Discussion\")`——只有 `slide.heading` 也缺省时,副标题才兜底为固定文案\n * \"Questions & Discussion\",避免用户填了标题、只是恰好没填副标题时被强行塞入\n * 一句无关的默认副题。测试覆盖有 heading(不触发兜底)与无 heading(触发副题\n * 兜底)两种 ir。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\n\n/** Center-x of the 1280-wide canvas — every poster-mode element anchors here. */\nconst CENTER_X = 640\n\n/** 短横条尺寸:本页唯一的 accent 色装饰元素,纯粹是分隔用途,从不作为文字色。 */\nconst ACCENT_BAR_W = 60\nconst ACCENT_BAR_H = 4\n\nexport function PosterEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const copyright = ir.meta.copyright\n const author = ir.meta.authors?.[0]\n\n const heading = fitHeadingLines(slide.heading || \"提问与讨论\", {\n maxWidth: 1152,\n fontSize: 150,\n maxLines: 2,\n minPt: 40,\n })\n // Last-line-anchored(同源文件 2026-07-07 addendum):把末行锚定在固定基线,\n // 无论标题是一行还是两行,下方 accent bar / 副标题 / 分隔线 / meta 的整条链路\n // 都不随行数变化,首行随行数向上让位。\n // 396→424(2026-07-13 campaign ending 用户反馈标题偏上:几何居中但\n // 光学偏上——顶部装饰压近+底部 570-720 空腔。下移 28px 光学居中,\n // 全 poster-ending 主题统一受益)\n const HEADING_LAST_BASELINE = 424\n const headingY =\n HEADING_LAST_BASELINE -\n Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = HEADING_LAST_BASELINE\n\n // +40→+54(2026-07-10 导出审计:同 cover-poster-center 的压线修正)\n const accentY = headingLastY + 64\n\n // 兜底只服务完全默认的 ending 页:仅 slide.heading 也缺省时才连带兜底副标题。\n const subheading = fitSvgLine(slide.subheading || (slide.heading ? \"\" : \"Questions & Discussion\"), {\n maxWidth: 900,\n fontSize: 40,\n minFontSize: 20,\n })\n const subheadingY = accentY + 64\n const dividerY = subheadingY + 56\n\n const contactText = [author?.name, contact?.email].filter(Boolean).join(\" · \")\n const metaParts = [org, contactText || null, copyright].filter(\n (v): v is string => Boolean(v),\n )\n const metaLine =\n metaParts.length > 0\n ? fitSvgLine(metaParts.join(\" · \"), {\n maxWidth: 1000,\n fontSize: 22,\n minFontSize: 16,\n })\n : null\n const metaY = dividerY + 52\n\n return (\n <>\n {/* Main heading (italic serif, centered) */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x={CENTER_X}\n y={headingY + i * heading.lineHeight}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"800\"\n fill={ctx.colors.text}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Accent hairline (AccentBar helper inlined, same treatment as\n cover-poster-center.tsx) */}\n <rect\n x={CENTER_X - ACCENT_BAR_W / 2}\n y={accentY}\n width={ACCENT_BAR_W}\n height={ACCENT_BAR_H}\n rx=\"2\"\n fill={ctx.colors.primary}\n />\n\n {/* Subheading */}\n {subheading.text && (\n <text\n x={CENTER_X}\n y={subheadingY}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.heading}\n fontSize={subheading.fontSize}\n fill={ctx.colors.muted}\n fontStyle=\"italic\"\n dominantBaseline=\"alphabetic\"\n >\n {subheading.text}\n </text>\n )}\n\n {/* Divider */}\n <line\n x1=\"56\"\n y1={dividerY}\n x2=\"1224\"\n y2={dividerY}\n stroke={ctx.colors.border}\n strokeWidth=\"1.6\"\n />\n\n {/* Combined centered meta line: org / contact / copyright */}\n {metaLine && (\n <text\n x={CENTER_X}\n y={metaY}\n textAnchor=\"middle\"\n fontFamily={ctx.fonts.body}\n fontSize={metaLine.fontSize}\n fill={ctx.colors.muted}\n letterSpacing=\"2\"\n dominantBaseline=\"alphabetic\"\n >\n {metaLine.text}\n </text>\n )}\n </>\n )\n}\n","// GF/svg/archetypes/ending-tone-adaptive-ending.tsx\nimport type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\n\n/**\n * tone-adaptive-ending archetype(spec §3.2):左对齐超大主标题(缺省兜底\n * \"谢谢\")+ 底部分隔线 + \"联系\"区块 + 版权行。有背景图时叠加黑色半透明幕布并\n * 整体切换为白字。自 templates/custom.tsx 的 `CustomEnding`(615-759 行,\n * Step A 实测边界,订正 brief 估的 \"615-784\"——784 行落在其后\n * `CustomDecor` 的注释块内,不属于本函数)提炼,随迁 helper `hasBgImage`\n * (36-44 行,私有复制,签名/实现原样不变)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/custom.ts 的 colors。十\n * 六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * cover-tone-adaptive-header.tsx / chapter-tone-adaptive-chapter.tsx 先\n * 例):\n * - 源文件私有常量 `INK` —— 与 custom token 表当前的 `primary`、`text`\n * 两个字段精确匹配(custom.ts 里二者尚未拆分,仍是同一个值)。本函数体\n * 内 `INK`/派生变量 `fg` **只在文字填色语境下被消费**(主标题、联系方\n * 式正文两处,均为 `fill={fg}`),没有任何描边/stroke 用法——与\n * chapter-tone-adaptive-chapter.tsx 同构、与 cover-tone-adaptive-\n * header.tsx 的双语境不同,统一映射到 `ctx.colors.text`(下方\n * `textFg`)。**若 custom 主题未来把 text/primary 拆开,这里不需要回来\n * 重新判断语境——本函数天然只有一种语境**,这点特此记录以免误用 cover\n * 文件头的双语境结论直接套用本文件。\n * - 源文件私有常量 `MUTED` → `ctx.colors.muted` —— 精确匹配。三处引用:\n * org 标签、\"联系\"标签、版权行(均经 `withBg` 派生的 `muted` 变量间接\n * 引用)。\n * - 源文件私有常量 `BORDER` → `ctx.colors.border ?? ctx.colors.muted` ——\n * 精确匹配,用于分隔线。`??` 兜底沿用 cover-left-anchor.tsx /\n * ending-rail-ending.tsx 的既有写法(`border` 在 `ThemeColors` 上是可\n * 选字段)。\n * - brief 提示\"169 行附近\"另有一个灰阶需核实归属(`CustomDecor` 的模块\n * 级常量 `BG_MIXED_6PCT_BLACK`,templates/custom.tsx 第 783 行):Step A\n * 复核确认该常量是 `CustomDecor`(180° 渐变场)专属消费,`CustomEnding`\n * 函数体 615-759 行内完全不引用它——grep 复核该常量的十六进制值全文件\n * 唯一命中就是它自己的定义那一行。**不在本次 ending 提炼范围内**,留给\n * Wave 3 motif 迁移(custom 的 Decor)处理,本文件不消费、不归并、不\n * 出现,不构成孤儿色问题(十六进制值本身不抄进本注释,同上方各条约定,\n * 避免污染下面的 grep 清零门)。\n *\n * 档位判定:以上三个烤死常量全部精确匹配 token 值,无孤儿色——**档位一・逐\n * 字节等价**(custom 自己的 tokens 下与旧 `CustomEnding` 输出 `toBe` 全\n * 等)。\n *\n * withBg 白字/黑幕豁免(Global Constraints 产品逻辑白字豁免,同\n * cover-tone-adaptive-header.tsx / chapter-tone-adaptive-chapter.tsx 先\n * 例):`hasBgImage` 为真时 `textFg`/`mutedFg`/`borderColor` 三个派生变量固\n * 定切到纯白(各自搭配不同 opacity)——背景图上强制白字的结构性产品逻辑,不\n * 随主题变化,不进上面的替换表。整页黑色半透明幕布(scrim for bg-image\n * readability,替代原 linearGradient)同属此类:不是任何主题 token 的烤\n * 色,是固定可读性遮罩,原样保留。\n *\n * 副题兜底语义(按当前源码实际行为原样迁移,不改语义):`CustomEnding` 源\n * 码里**没有 `slide.subheading` 的任何引用**——只有主标题一层兜底\n * (`slide.heading || \"谢谢\"`),不存在 ending-rail-ending.tsx /\n * ending-masthead-ending.tsx 那种独立的副标题渲染分支,也没有\"heading 缺省\n * 才连带兜底副题\"的双重兜底模式(本函数结构上没有副题可兜底)。测试仍按\n * 「有/无 heading」两种 ir 覆盖:有 heading 时标题原样、不触发兜底;无\n * heading 时兜底渲染\"谢谢\"。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量(除上述白字/黑幕两类豁免——\n * grep 清零门预期命中的 hex 全部落在文件头点名的豁免范围内,逐行可核对)。\n */\n\n/** Check whether the slide has a valid background image asset. Ported\n * verbatim from templates/custom.tsx(36-44 行),私有复制,签名/实现不变。*/\nfunction hasBgImage(\n ir: SvgTemplateProps[\"ir\"],\n slide: SvgTemplateProps[\"slide\"],\n): boolean {\n if (slide.background?.kind !== \"asset\") return false\n const assetId = slide.background.asset_id\n const asset = ir.assets.images[assetId]\n return !!(asset?.src && !asset.error)\n}\n\nexport function ToneAdaptiveEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const { colors, fonts } = ctx\n const withBg = hasBgImage(ir, slide)\n // INK 语境映射(见文件头「替换表」):本函数唯一语境是文字填色 → text。\n const textFg = withBg ? \"#FFFFFF\" : colors.text\n const mutedFg = withBg ? \"#FFFFFF\" : colors.muted\n const borderColor = withBg ? \"#FFFFFF\" : (colors.border ?? colors.muted)\n const borderOpacity = withBg ? 0.18 : 1\n\n const org = ir.meta.organization\n const contact = ir.meta.contact\n const copyright = ir.meta.copyright\n const author = ir.meta.authors?.[0]\n\n const contactParts = [author?.name, contact?.email, contact?.website].filter(\n Boolean,\n )\n const contactText = contactParts.join(\" · \")\n\n const heading = fitHeadingLines(slide.heading || \"谢谢\", {\n maxWidth: 1152,\n fontSize: 100,\n maxLines: 2,\n minPt: 40,\n })\n // Last-line-anchored(S3b addendum, 2026-07-07,机械搬运自源函数注释):锚\n // 定标题末行基线,使分隔线/联系/版权链条的 y 不随行数变化。\n const HEADING_LAST_BASELINE = 396\n const headingY =\n HEADING_LAST_BASELINE -\n Math.max(0, heading.lines.length - 1) * heading.lineHeight\n const headingLastY = HEADING_LAST_BASELINE\n const dividerY = headingLastY + 124\n const contactLabelY = dividerY + 52\n const contactTextY = dividerY + 88\n const copyrightY = dividerY + 164\n\n return (\n <>\n {/* Scrim for bg-image mode (replaces linearGradient) — see file\n header's withBg 白字/黑幕豁免. */}\n {withBg && (\n <rect width=\"1280\" height=\"720\" fill=\"#000000\" opacity=\"0.32\" />\n )}\n\n {/* Top left: organization */}\n {org && (\n <text\n x=\"64\"\n y=\"74\"\n fontFamily={fonts.body}\n fontSize=\"22\"\n fill={mutedFg}\n opacity={withBg ? 0.8 : 1}\n letterSpacing=\"3\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* Main heading */}\n {heading.lines.map((line, i) => (\n <text\n key={i}\n x=\"64\"\n y={headingY + i * heading.lineHeight}\n fontFamily={fonts.heading}\n fontSize={heading.fontSize}\n fontWeight=\"700\"\n fill={textFg}\n letterSpacing=\"-2\"\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* Divider */}\n <line\n x1=\"64\"\n y1={dividerY}\n x2=\"1216\"\n y2={dividerY}\n stroke={borderColor}\n strokeOpacity={borderOpacity}\n strokeWidth=\"1.6\"\n />\n\n {/* Contact section */}\n {contactText && (\n <>\n <text\n x=\"64\"\n y={contactLabelY}\n fontFamily={fonts.body}\n fontSize=\"20\"\n fill={mutedFg}\n opacity={withBg ? 0.6 : 1}\n letterSpacing=\"4\"\n dominantBaseline=\"alphabetic\"\n >\n 联系\n </text>\n <text\n x=\"64\"\n y={contactTextY}\n fontFamily={fonts.body}\n fontSize=\"28\"\n fill={textFg}\n dominantBaseline=\"alphabetic\"\n >\n {contactText}\n </text>\n </>\n )}\n\n {/* Copyright */}\n {copyright && (\n <text\n x=\"64\"\n y={copyrightY}\n fontFamily={fonts.body}\n fontSize=\"22\"\n fill={mutedFg}\n opacity={withBg ? 0.55 : 1}\n dominantBaseline=\"alphabetic\"\n >\n {copyright}\n </text>\n )}\n </>\n )\n}\n","import type { SvgTemplateProps } from \"./types\"\nimport { fitHeadingLines } from \"../heading-fit\"\nimport { fitSvgLine, layoutSvgText } from \"../../lib/svg-text-layout\"\nimport { readableOn } from \"./cover-split-diagonal\"\n\n/**\n * fashion-ending archetype(2026-07-10 时尚 runway 专属表达,纯新写):\n * **满版 primary 底 + 超大字收尾**——与 fashion-masthead 封面首尾呼应\n * (黑封面→红章节→白内容→黑结尾的杂志节奏)。超大 900 字重标题 +\n * 满宽 accent 色带 + 大 letterSpacing 排印。前景 readableOn(primary)\n * 自适应。兜底纪律沿 ending 家族先例:heading 缺省才兜底文案。\n * 纪律:零 theme id、零 hex(readableOn 中性黑白豁免),颜色来自 ctx。\n */\nexport function FashionEnding({ ir, slide, ctx }: SvgTemplateProps) {\n const org = ir.meta.organization\n const date = ir.meta.date\n const fg = readableOn(ctx.colors.primary)\n\n // ending 家族兜底纪律:仅 heading 缺省时兜底(模型填了 heading 时兜底\n // 必然语义重复——2026-07-09 用户裁决先例)。\n const headingText = slide.heading || \"谢谢\"\n const title = fitHeadingLines(headingText, {\n maxWidth: 1168,\n fontSize: 130,\n maxLines: 2,\n minPt: 64,\n })\n const TITLE_Y = 340\n const titleLastY = TITLE_Y + Math.max(0, title.lines.length - 1) * title.lineHeight\n\n const bandY = titleLastY + 48\n const BAND_H = 14\n\n const subtitle = layoutSvgText(slide.subheading || \"\", {\n maxWidth: 1168,\n fontSize: 28,\n maxLines: 2,\n lineHeightRatio: 1.3,\n })\n const subtitleY = bandY + BAND_H + 54\n\n const metaParts = [org, date].filter((v): v is string => Boolean(v))\n const metaLine =\n metaParts.length > 0\n ? fitSvgLine(metaParts.join(\" · \"), { maxWidth: 1100, fontSize: 19, minFontSize: 14 })\n : null\n\n return (\n <>\n {/* 满版 primary 底(与封面首尾呼应) */}\n <rect x={0} y={0} width={1280} height={720} fill={ctx.colors.primary} />\n\n {/* 顶部小字排印 */}\n {org && (\n <text\n x={56}\n y={96}\n fontFamily={ctx.fonts.body}\n fontSize={20}\n fill={fg}\n fillOpacity={0.72}\n letterSpacing={8}\n fontWeight=\"600\"\n dominantBaseline=\"alphabetic\"\n >\n {org}\n </text>\n )}\n\n {/* 超大收尾标题 */}\n {title.lines.map((line, i) => (\n <text\n key={i}\n x={56}\n y={TITLE_Y + i * title.lineHeight}\n fontFamily={ctx.fonts.heading}\n fontSize={title.fontSize}\n fontWeight=\"900\"\n fill={fg}\n letterSpacing={-2}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 满宽 accent 色带 */}\n <rect x={56} y={bandY} width={1168} height={BAND_H} fill={ctx.colors.accent} />\n\n {/* 副题 */}\n {subtitle.lines.map((line, i) => (\n <text\n key={i}\n x={56}\n y={subtitleY + i * subtitle.lineHeight}\n fontFamily={ctx.fonts.body}\n fontSize={subtitle.fontSize}\n fill={fg}\n fillOpacity={0.72}\n letterSpacing={4}\n dominantBaseline=\"alphabetic\"\n >\n {line}\n </text>\n ))}\n\n {/* 底部 meta */}\n {metaLine && (\n <text\n x={56}\n y={668}\n fontFamily={ctx.fonts.body}\n fontSize={metaLine.fontSize}\n fill={fg}\n fillOpacity={0.6}\n letterSpacing={3}\n dominantBaseline=\"alphabetic\"\n >\n {metaLine.text}\n </text>\n )}\n </>\n )\n}\n","import type { EndingArchetype, EndingArchetypeId } from \"./types\"\nimport { MastheadEnding } from \"./ending-masthead-ending\"\nimport { ConstellationEnding } from \"./ending-constellation-ending\"\nimport { RailEnding } from \"./ending-rail-ending\"\nimport { BannerEnding } from \"./ending-banner-ending\"\nimport { PosterEnding } from \"./ending-poster-ending\"\nimport { ToneAdaptiveEnding } from \"./ending-tone-adaptive-ending\"\nimport { FashionEnding } from \"./ending-fashion-ending\"\n\nexport type { EndingArchetype, EndingArchetypeId } from \"./types\"\n\n// Wave 2 ending 段收尾(w2t16):六个 EndingArchetypeId 全部注册完毕,收紧\n// 回完整 Record(不再是 Partial)——同 index-chapter.ts 末任务的过渡收尾。\nexport const ENDING_ARCHETYPES: Record<EndingArchetypeId, EndingArchetype> = {\n \"masthead-ending\": MastheadEnding,\n \"constellation-ending\": ConstellationEnding,\n \"rail-ending\": RailEnding,\n \"banner-ending\": BannerEnding,\n \"poster-ending\": PosterEnding,\n \"tone-adaptive-ending\": ToneAdaptiveEnding,\n \"fashion-ending\": FashionEnding,\n}\n","// GF/svg/archetypes/motif-corner-ornament-motif.tsx\nimport type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * corner-ornament-motif archetype(spec §3.2,Wave 3 Task 17):four L-shaped\n * double-line corner ornaments on cover/chapter (\"强\", the 4-corner\n * treatment is the tier's whole look — chapter mirrors cover, no\n * separable cover-only bonus withheld); content/ending (\"弱\", ending\n * mirrors content) keep only the top-right one. Each ornament is two\n * concentric \"L\" brackets (an outer + a 4px-inset inner one, \"双线\"), each\n * leg 20px long, the outer bracket's corner sitting 40px in from the page\n * edge — margin(40) + gap(4) + length(20) = 64 exactly matches\n * MasterChrome's logo bands' own inner edge (x 64/1216, tl/tr), a tangent\n * not an overlap. Extracted from 源 templates/magazine.tsx 的\n * `EditorialSerifDecor`(511-524 行)+ 私有 helper `CornerOrnament`\n * (484-509 行,随其常量 `ORNAMENT_MARGIN`/`ORNAMENT_LEN`/`ORNAMENT_GAP`\n * 一并复制进本文件,均非导出、非公共 util,不建公共依赖)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/magazine.ts 的 colors):\n * Step A 对函数区间(462-524 行,含 CornerOrnament + EditorialSerifDecor)\n * grep 未命中任何 `#XXXXXX` 字面量或 theme id 字符串——源函数体已直接消费\n * `ctx.colors.border ?? ctx.colors.muted`,无烤死颜色常量,无孤儿色。\n * **档位一・逐字节等价**。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nconst ORNAMENT_MARGIN = 40\nconst ORNAMENT_LEN = 20\nconst ORNAMENT_GAP = 4\n\n/**\n * One corner's double-line \"L\" bracket. `(cx,cy)` is the page's own corner\n * (0/1280, 0/720); `signX`/`signY` point the bracket inward — +1 for the\n * left/top corners, -1 for the right/bottom ones.\n */\nfunction CornerOrnament({\n cx,\n cy,\n signX,\n signY,\n stroke,\n}: {\n cx: number\n cy: number\n signX: 1 | -1\n signY: 1 | -1\n stroke: string\n}) {\n const outerX = cx + signX * ORNAMENT_MARGIN\n const outerY = cy + signY * ORNAMENT_MARGIN\n const innerX = outerX + signX * ORNAMENT_GAP\n const innerY = outerY + signY * ORNAMENT_GAP\n return (\n <>\n <line x1={outerX} y1={outerY} x2={outerX + signX * ORNAMENT_LEN} y2={outerY} stroke={stroke} strokeWidth=\"1\" />\n <line x1={outerX} y1={outerY} x2={outerX} y2={outerY + signY * ORNAMENT_LEN} stroke={stroke} strokeWidth=\"1\" />\n <line x1={innerX} y1={innerY} x2={innerX + signX * ORNAMENT_LEN} y2={innerY} stroke={stroke} strokeWidth=\"1\" />\n <line x1={innerX} y1={innerY} x2={innerX} y2={innerY + signY * ORNAMENT_LEN} stroke={stroke} strokeWidth=\"1\" />\n </>\n )\n}\n\n/**\n * 构图变体(2026-07-10 装饰多样性推广):a=四角全饰(原构图)、b=主对角\n * (左上+右下)、c=副对角(右上+左下)。弱档(content/ending)恒单角。\n */\nexport function CornerOrnamentMotif({ ir, slide, ctx }: DecorProps) {\n const stroke = ctx.colors.border ?? ctx.colors.muted\n const variant = pickBySeed(cachedDeckSeed(ir), \"corner-ornament-decor\", [\"a\", \"b\", \"c\"] as const)\n const topRight = <CornerOrnament cx={1280} cy={0} signX={-1} signY={1} stroke={stroke} />\n if (slide.type === \"content\" || slide.type === \"ending\") return topRight\n\n const topLeft = <CornerOrnament cx={0} cy={0} signX={1} signY={1} stroke={stroke} />\n const bottomLeft = <CornerOrnament cx={0} cy={720} signX={1} signY={-1} stroke={stroke} />\n const bottomRight = <CornerOrnament cx={1280} cy={720} signX={-1} signY={-1} stroke={stroke} />\n if (variant === \"b\") {\n return (\n <>\n {topLeft}\n {bottomRight}\n </>\n )\n }\n if (variant === \"c\") {\n return (\n <>\n {topRight}\n {bottomLeft}\n </>\n )\n }\n return (\n <>\n {topLeft}\n {topRight}\n {bottomLeft}\n {bottomRight}\n </>\n )\n}\n","// GF/svg/archetypes/motif-rail-motif.tsx\nimport type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * rail-motif archetype(spec §3.2,Wave 3 Task 18):a soft quarter-disc arc\n * in the page's bottom-right corner, drawn via `path` (svg2pptx's `path`\n * primitive, allowed starting P2 — see magazine's `CornerOrnamentMotif` for\n * the other P2 precedent, this file's second use). Cover gets nothing here\n * (its own deeper-green corner triangle is drawn directly in\n * `cover-left-anchor.tsx`'s body instead — see that file's own doc comment\n * for why: it must paint *after* the cover's opaque color block, and Decor\n * always renders *before* the body, so a decor-slot shape at that position\n * would be fully painted over). Chapter uses a white arc (its default\n * background is `colors.primary` itself, so a primary-tinted arc at low\n * opacity would be a no-op composite — invisible, not merely subtle);\n * content/ending use a `colors.primary`-tinted arc over their light default\n * background. Extracted from templates/academic.tsx 的 `BcgEmeraldDecor`\n * (713-720 行,Step A 实测边界,比 brief 给出的 713-729 短——722 行起是文件\n * 末尾的 `academicTemplate` 导出对象,已按任务要求排除)。随迁 helper:\n * `ARC_CX`/`ARC_CY`/`ARC_R`/`ARC_PATH`(源文件 693-711 行的模块级私有几何\n * 常量,只被本函数消费,随函数体一并复制为本文件私有常量,不建公共\n * util——同 chapter-rail-chapter.tsx 对 `CH_DOT_*` 的处理)。\n *\n * **TRIANGLE_DEEP 交叉核实(本任务的关键检查项)**:cover-left-anchor.tsx\n * 已把 academic 的装饰色 `TRIANGLE_DEEP`(源文件 691 行)处理为文件私有常量\n * 保留(不并入 `primary`,理由见该文件头的\"装饰色豁免\")。逐行核对\n * `BcgEmeraldDecor`(713-720 行)本身——`TRIANGLE_DEEP` 仅被\n * `BCGEmeraldCover`(源文件 120 行)消费,`BcgEmeraldDecor` 函数体内一次也\n * 没有引用它(`grep -n \"TRIANGLE_DEEP\" templates/academic.tsx` 只命中\n * 116/120/691 三行,均在 Cover 函数或其模块级声明内,不在 Decor 函数区间\n * 713-720 内)。故本文件**不涉及** `TRIANGLE_DEEP`、无需沿用 cover-left-anchor\n * 的私有常量保留处理——这里记录的是\"核实过、确认不适用\",不是遗漏。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/academic.ts 的 colors。\n * 十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门):\n * - `ctx.colors.primary`(content/ending 分支的 arc 填色):源函数已直接\n * 消费,未烤死,原样保留——brief 现状表标注的\"719 行 `ctx.colors.primary`\n * 直用,低风险\",核实成立。\n * 唯一的颜色字面量是 chapter 分支的白色 arc 填色,处理见下方\"白字例外\"。\n * **无孤儿色**。\n *\n * 白字例外(同 chapter-rail-chapter.tsx / content-rail-numbered.tsx /\n * cover-left-anchor.tsx 先例):chapter 分支的 arc 固定写死纯白字面量——\n * chapter 的默认背景就是不透明的 `colors.primary` 本身,\"primary 半透明叠在\n * primary 实心背景上\"在数学上是无操作(合成结果与背景完全相同,即完全隐\n * 形),故这条分支改用白色,与本文件同主题的 `chapter-rail-chapter.tsx`\n * (章节页大水印数字)共享同一条产品逻辑先例。不进上面的替换表,予以保留\n * 并在测试里跨主题锁死。\n *\n * **档位一・逐字节等价**(唯一烤死颜色字面量是上面点名的白字例外,其余全部\n * 消费 `ctx.colors.primary`,无孤儿色)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试锁死\n * 的 chapter 分支纯白字面量,grep 清零门预期恰好命中这一处。\n */\nconst ARC_CX = 1280\nconst ARC_CY = 720\nconst ARC_R = 260\n/**\n * A circle centered exactly on the page's bottom-right corner would only\n * ever show its top-left quarter (the rest clipped by the svg viewBox), with\n * no visual difference from drawing just that quarter directly. But\n * svg2pptx's ellipse conversion keeps the *full* circle's bounding box\n * (pptxgenjs has no shape-clipping concept), which would bleed ~260px past\n * both slide edges and trip render-slide.test.tsx's \"no op past the slide\n * edge\" check. Drawing just the visible quarter-disc directly — two straight\n * radii along the canvas edges plus the connecting arc (large-arc-flag=0,\n * sweep-flag=0, so the arc bulges toward the center of the page, not away\n * from it) — is pixel-identical to the full circle's visible portion while\n * keeping the shape's own bounding box exactly on-slide.\n */\nconst ARC_PATH = `M ${ARC_CX},${ARC_CY} L ${ARC_CX},${ARC_CY - ARC_R} A ${ARC_R},${ARC_R} 0 0,0 ${ARC_CX - ARC_R},${ARC_CY} Z`\n// 构图变体(2026-07-10 装饰多样性推广):b=左下角镜像、c=右上角。\nconst ARC_PATH_BL = `M 0,${ARC_CY} L 0,${ARC_CY - ARC_R} A ${ARC_R},${ARC_R} 0 0,1 ${ARC_R},${ARC_CY} Z`\nconst ARC_PATH_TR = `M ${ARC_CX},0 L ${ARC_CX},${ARC_R} A ${ARC_R},${ARC_R} 0 0,0 ${ARC_CX - ARC_R},0 Z`\nfunction arcFor(variant: \"a\" | \"b\" | \"c\"): string {\n return variant === \"b\" ? ARC_PATH_BL : variant === \"c\" ? ARC_PATH_TR : ARC_PATH\n}\n\nexport function RailMotif({ ir, slide, ctx }: DecorProps) {\n const variant = pickBySeed(cachedDeckSeed(ir), \"rail-decor\", [\"a\", \"b\", \"c\"] as const)\n // Cover's triangle lives in cover-left-anchor.tsx's body instead (see\n // that file's own doc comment).\n if (slide.type === \"cover\") return <></>\n if (slide.type === \"chapter\") {\n return <path d={arcFor(variant)} fill=\"#FFFFFF\" opacity=\"0.06\" />\n }\n return <path d={arcFor(variant)} fill={ctx.colors.primary} opacity=\"0.06\" />\n}\n","// GF/svg/archetypes/motif-banner-motif.tsx\nimport type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * banner-motif archetype(spec §3.2,Wave 3 Task 19):cover/chapter (\"强\",\n * chapter mirrors cover, no separable cover-only bonus withheld) get a\n * faint grid-line texture — 5 verticals @ 256px spacing clipped to y\n * 100-620 so none cross the header/footer logo bands, 3 candidate\n * horizontals @ 240px spacing with the one landing inside the title band\n * (y 300-480) filtered out, leaving 2. content/ending (\"弱\", ending mirrors\n * content) render nothing — a former `colors.primary` accent bar was ruled\n * deleted outright (2026-07-08) rather than redesigned, see source file's\n * own history note. Extracted from templates/consulting.tsx 的\n * `MckinseyNavyDecor`(681-719 行,Step A 用 `sed -n '681,719p'` 摘录核实——\n * 比 brief 给出的 681-728 短,722-728 行是文件尾 `consultingTemplate` 导出\n * 对象,已按任务要求排除)。随迁 helper:`GRID_STROKE_OPACITY` /\n * `GRID_STROKE_OPACITY_CHAPTER` / `GRID_V_XS` / `GRID_V_Y1` / `GRID_V_Y2` /\n * `GRID_H_CANDIDATES`(源文件 672-679 行的模块级私有几何/透明度常量,只被\n * 本函数消费,随函数体一并复制为本文件私有常量,不建公共 util)。\n *\n * 替换表(Step B,逐十六进制核实,对照 themes/consulting.ts 的\n * colors。十六进制值本身不抄进本注释——避免污染本文件的 grep 清零门,同\n * cover-banner-title.tsx / content-banner-heading.tsx 先例):\n * - 对函数区间 681-719 行逐行核对,模块级烤死常量里只有 `DIVIDER` 被\n * 本函数消费(cover 分支的 grid 描边色)——`NAVY`/`YELLOW`/`MUTED` 零\n * 命中,同 content-banner-heading.tsx 的发现一致(同一源文件不同函数\n * 消费的烤死常量集合不同,需逐函数实测,不能凭文件头统一替换表)。\n * - `DIVIDER` 逐十六进制核对 consulting 的 `colors.border` 字段,精确\n * 匹配 → 映射为 `ctx.colors.border ?? ctx.colors.muted`(`border` 是\n * `ThemeColors` 里的可选字段,`?? muted` 的兜底写法与\n * cover-banner-title.tsx / motif-corner-ornament-motif.tsx 先例一致,\n * 纯为类型层面兜底——consulting 自己的 token 表里 `border` 始终有值)。\n * - chapter 分支的 grid 描边色是纯白字面量,处理见下方\"白字例外\",\n * 不进替换表。\n * 结论:**无孤儿色**(唯一被消费的烤死常量 `DIVIDER` 有精确 token 匹配)。\n *\n * 白字例外(同 chapter-banner-chapter.tsx / motif-rail-motif.tsx 记录的\n * 同一类产品逻辑):chapter 分支的 grid 描边固定写死纯白字面量——chapter\n * 的默认背景就是不透明的 `colors.primary` 本身(见 themes/\n * consulting.ts 的 `defaultBackgrounds.chapter`),若机械映射为\n * `colors.border`,在 border 与 primary 十六进制接近的主题下网格会近乎\n * 隐形,这不是烤死的主题色,也不在任何 token 字段里,是\"深色实心背景上\n * 网格必须走白色低透明度\"的结构性产品逻辑,不进替换表,予以保留并在\n * 测试里跨主题锁死。\n *\n * **档位一・逐字节等价**(唯一烤死颜色常量 `DIVIDER` 有精确 token 匹配,\n * 唯一的颜色字面量是上面点名并测试锁死的白字例外)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试\n * 锁死的 chapter 分支纯白字面量,grep 清零门预期恰好命中这一处。\n */\nconst GRID_STROKE_OPACITY = 0.25\nconst GRID_STROKE_OPACITY_CHAPTER = 0.05\nconst GRID_V_XS = [128, 384, 640, 896, 1152]\n// 构图变体(2026-07-10 装饰多样性推广):b=稀疏三线、c=右移半格。\nconst GRID_V_XS_SPARSE = [256, 640, 1024]\nconst GRID_V_XS_SHIFTED = [192, 448, 704, 960, 1216]\nfunction gridXsFor(variant: \"a\" | \"b\" | \"c\"): number[] {\n return variant === \"b\" ? GRID_V_XS_SPARSE : variant === \"c\" ? GRID_V_XS_SHIFTED : GRID_V_XS\n}\nconst GRID_V_Y1 = 100\nconst GRID_V_Y2 = 620\n// Candidates only — the one landing inside the title band (y 300-480) is\n// filtered out below, leaving 120 and 600.\nconst GRID_H_CANDIDATES = [120, 360, 600]\n\nexport function BannerMotif({ ir, slide, ctx }: DecorProps) {\n const variant = pickBySeed(cachedDeckSeed(ir), \"banner-decor\", [\"a\", \"b\", \"c\"] as const)\n if (slide.type === \"cover\" || slide.type === \"chapter\") {\n const isChapter = slide.type === \"chapter\"\n const gridStroke = isChapter ? \"#FFFFFF\" : (ctx.colors.border ?? ctx.colors.muted)\n const gridOpacity = isChapter\n ? GRID_STROKE_OPACITY_CHAPTER\n : GRID_STROKE_OPACITY\n return (\n <>\n {gridXsFor(variant).map((x) => (\n <line\n key={`v${x}`}\n x1={x}\n y1={GRID_V_Y1}\n x2={x}\n y2={GRID_V_Y2}\n stroke={gridStroke}\n strokeWidth=\"1\"\n strokeOpacity={gridOpacity}\n />\n ))}\n {GRID_H_CANDIDATES.filter((y) => y < 300 || y > 480).map((y) => (\n <line\n key={`h${y}`}\n x1=\"0\"\n y1={y}\n x2=\"1280\"\n y2={y}\n stroke={gridStroke}\n strokeWidth=\"1\"\n strokeOpacity={gridOpacity}\n />\n ))}\n </>\n )\n }\n // content/ending:无装饰(源主题 2026-07-08 用户裁决删除 accent band)。\n return null\n}\n","// GF/svg/archetypes/motif-poster-motif.tsx\nimport type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * poster-motif archetype(spec §3.2,Wave 3 Task 20):一个共享的角落\n * 径向渐变光晕(不透明中心 → 透明边缘的单一 gradient def,强弱两档全靠\n * `<circle>` 自身的 `opacity` 承载——svg2pptx 的 `withElementOpacity` 会在\n * 导出时把元素自身 opacity 折进每个 stop,等价于直接把 12%/6% 烤进 stop,\n * 省一份要保持同步的 gradient 定义):\n * - cover/chapter(\"强\"):右上角,cx=1150 cy=80 r=420,opacity 0.12。\n * - content/ending(\"弱\",ending 与 content 同款):同一 gradient 镜像到\n * 右下角,cx=1150 cy=640 r=300,opacity 0.06(cy 80→640 是跨页面纵向\n * 中心的镜像)。\n * - Cover 额外(\"另加\")在左下角叠一个小光点装饰——一个实心圆点 + 两圈\n * 纯描边的同心环;chapter 没有这个额外装饰,因为它只是 cover 专属的\n * 叠加物,不是第二档\"强\"元素。\n * 自 templates/creative.tsx 的 `EditorialDarkDecor`(846-885 行,Step A 用\n * `grep -n` 实测边界——比 brief 给出的 846-894(EOF)短,888-894 行是文件尾\n * `creativeTemplate` 导出对象,已按任务要求排除,不属于本函数体)提炼。\n * 随迁 helper:模块级私有常量 `GLOW_GRADIENT_ID`/`GLOW_MOTIF_CX`/\n * `GLOW_MOTIF_CY`(源文件 841-844 行,只被本函数消费,随函数体一并复制为\n * 本文件私有常量,不建公共 util)——纯几何/id 值,不是颜色,不进替换表。\n *\n * 替换表(Step B,逐行核对函数体):**无**——函数体内没有任何烤死的\n * 十六进制颜色常量,唯一出现的颜色表达式是 `ctx.colors.accent`,本就是\n * 直接消费 token(径向渐变的两个 stop 色、Cover 专属光点装饰的圆点/描边色\n * 均如此),从未烤死过。故无孤儿色,也没有需要做映射决策的替换。\n *\n * **档位一・逐字节等价**(函数区间内无烤死主题常量需要映射)。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量。\n */\nconst GLOW_MOTIF_CX = 200\nconst GLOW_MOTIF_CY = 560\n\n/**\n * 构图变体(2026-07-10 装饰多样性推广;2026-07-12 用户裁决**径向光晕\n * 全部移除**——预览里 0.06-0.12 透明度几乎不可见,导出后渐变在 Office\n * 渲染变实变硬非常难看,预览/导出观感不一致的装饰不留):仅保留 cover\n * 同心光点签名(清晰的小元素,两端一致),a/c=左下、b=右下镜像。\n * chapter 的装饰由 roman-chapter 版式自带的圆弧承担,content/ending\n * 不画(正文页克制)。\n */\nexport function PosterMotif({ ir, slide, ctx }: DecorProps) {\n const { colors } = ctx\n const variant = pickBySeed(cachedDeckSeed(ir), \"poster-decor\", [\"a\", \"b\", \"c\"] as const)\n const dotCx = variant === \"b\" ? 1280 - GLOW_MOTIF_CX : GLOW_MOTIF_CX\n\n if (slide.type !== \"cover\") return null\n return (\n <>\n <circle cx={dotCx} cy={GLOW_MOTIF_CY} r=\"6\" fill={colors.accent} />\n <circle\n cx={dotCx}\n cy={GLOW_MOTIF_CY}\n r=\"12\"\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity=\"0.2\"\n />\n <circle\n cx={dotCx}\n cy={GLOW_MOTIF_CY}\n r=\"18\"\n fill=\"none\"\n stroke={colors.accent}\n strokeOpacity=\"0.08\"\n />\n </>\n )\n}\n","// GF/svg/archetypes/motif-tone-adaptive-motif.tsx\nimport type { DecorProps } from \"./types\"\n\n/**\n * tone-adaptive-motif archetype(spec §3.2,Wave 3 Task 21):全页极淡的\n * 180° 竖直渐变场(`colors.bg` → 一个固定的\"轻度混黑\"灰阶),充当所有\n * slide.type 共用的默认底色纹理,代替 Background.tsx 那块纯色矩形之上的一层\n * 微妙层次(Background.tsx 仍照常画自己的纯色矩形,本渐变场在 FullSlideSvg\n * 的 decor 插槽里画在它之上,完全覆盖,故不需要改 Background.tsx)。当 slide\n * 携带任何显式背景覆盖(`hasExplicitBackground`——比 `hasBgImage` 更宽,\n * asset/color/gradient 三种都算)时整体跳过渲染(返回 `<></>`),避免遮住\n * 那个已经画出来的真实背景。自 templates/custom.tsx 的 `CustomDecor`\n * (785-798 行,Step A 用 `grep -n` 实测边界——比 brief 给出的 785-807\n * EOF 短,799-808 行是空行 + eslint-disable 注释 + 文件尾 `customTemplate`\n * 导出对象,已按任务要求排除,不属于本函数体)提炼,随迁其依赖的\n * `hasExplicitBackground`(57-65 行,Step A 实测边界——比 brief 给出的\n * 57-67 短,66 行是空行、67 行是下一节 Cover 的头注释,不属于本函数)与\n * 后者内部消费的 `hasBgImage`(36-44 行,私有复制,签名/实现原样不变,同\n * 三个已提炼的 custom 兄弟页型先例)——两个 helper 都私有复制进本文件,不\n * 建公共 util。\n *\n * `BG_MIXED_6PCT_BLACK` 归属核实(brief 点名的孤儿色候选,W2-16 已定位、\n * 留给本任务处理——见 ending-tone-adaptive-ending.tsx 文件头\"该常量不在\n * ending 提炼范围内\"的记录。十六进制值本身不抄进本节——避免污染下面的\n * grep 清零门,同本文件其余各节约定一致):源文件模块级私有常量\n * `BG_MIXED_6PCT_BLACK`(templates/custom.tsx 第 783 行,注释写明是\n * \"colors.bg 与 6% 黑混合\"的固定计算结果,`applyOverride` 从不触碰\n * `bg`,故这是个算好的常量而非运行时计算)逐十六进制核对\n * themes/custom.ts 的 `colors`(bg/surface/panel/primary/accent/\n * text/muted/border/cardStroke 全字段):**无精确匹配**——`surface`/\n * `panel` 是与之最接近的字段,但数值不同(逐字符核对不相等)。按 W1-1\n * 裁决的归属框架二选一:\n * ①「渐变/混合底色装饰性 → 私有常量保留」vs.\n * ②「同角色近似 → 并入 surface/border 语义更贴的」。\n * 判定为①:该常量的语义是\"把 `colors.bg` 按固定比例掺黑得到的渐变终点\"——\n * 定义上就绑定 `colors.bg`(渐变起点已经是活的 `ctx.colors.bg`),不是\n * `surface`/`panel`(卡片实色背景语义)或 `border`(描边语义)里任何一个\n * 字段本来的角色。比照 cover-left-anchor.tsx 对 academic `TRIANGLE_DEEP`\n * 的处理先例(同属\"和某 token 同色系但更深/更暗一档的纯装饰计算值,语义上\n * 不对应任何字段\"),原样保留为本文件私有装饰常量,不做 token 映射,也不\n * 改写成读取 `colors.surface`(若真的换成 `colors.surface`,在其他主题的\n * `bg` 不是白色时,这个\"渐变终点\"会失去它\"由 bg 掺黑得来\"的原始设计含义,\n * 变成一个跟 bg 脱钩的随意色块,属于观感被改写而非等价迁移)。\n *\n * **档位二・观感等价**(因 `BG_MIXED_6PCT_BLACK` 是孤儿色,未并入任何 token\n * 字段——渐变起点 `ctx.colors.bg` 本身仍是活的 token 引用,唯一的烤死值是\n * 渐变终点,已按上述决策原样保留并测试锁死\"装饰未隐形\")。\n *\n * 纪律:本文件禁 theme id、禁颜色 hex 字面量——唯一豁免是上面点名并测试锁死\n * 的 `BG_MIXED_6PCT_BLACK` 私有装饰常量,grep 清零门预期恰好命中这一处\n * (该常量的十六进制值本身不抄进本注释——避免污染下面的 grep 清零门)。渐变\n * def 的 id 字符串原样保留源文件的 `decor-custom-field`(同 poster-motif.tsx\n * 保留 `decor-creative-glow` 的先例:纯几何/id 值,不是颜色字面量,字符串里\n * 嵌了主题名子串,但不是 grep 清零门检测的、独立加双引号包裹的那种精确匹配,\n * 不构成违规——若改名,会破坏与旧 `CustomDecor` 的逐字节 `toBe` 断言,得不\n * 偿失)。\n */\n\n/** Check whether the slide has a valid background image asset. Ported\n * verbatim from templates/custom.tsx(36-44 行),私有复制,签名/实现不变。*/\nfunction hasBgImage(\n ir: DecorProps[\"ir\"],\n slide: DecorProps[\"slide\"],\n): boolean {\n if (slide.background?.kind !== \"asset\") return false\n const assetId = slide.background.asset_id\n const asset = ir.assets.images[assetId]\n return !!(asset?.src && !asset.error)\n}\n\n/** Whether the slide carries an explicit background override of *any* kind\n * — broader than `hasBgImage` above (asset/color/gradient all count here,\n * `hasBgImage` is asset-only). Ported verbatim from templates/custom.tsx\n * (57-65 行),私有复制,签名/实现不变。*/\nfunction hasExplicitBackground(\n ir: DecorProps[\"ir\"],\n slide: DecorProps[\"slide\"],\n): boolean {\n const bg = slide.background\n if (!bg) return false\n if (bg.kind === \"asset\") return hasBgImage(ir, slide)\n return true\n}\n\nconst GRADIENT_FIELD_ID = \"decor-custom-field\"\n\n// Decoration-only swatch (see file header's \"`BG_MIXED_6PCT_BLACK` 归属核实\"):\n// `colors.bg` mixed with a fixed 6% black, computed once (255 * 0.94 ≈ 240 =\n// 0xF0 per channel). Deliberately NOT mapped to any `ctx.colors` field — no\n// token represents \"bg but darker\", and switching to `colors.surface` would\n// sever this value's \"derived from bg\" design intent for themes whose `bg`\n// isn't white. Ported verbatim from templates/custom.tsx (this literal is\n// the file's one intentional, test-locked grep-gate exemption).\nconst BG_MIXED_6PCT_BLACK = \"#F0F0F0\"\n\nexport function ToneAdaptiveMotif({ ir, slide, ctx }: DecorProps) {\n if (hasExplicitBackground(ir, slide)) return <></>\n return (\n <>\n <defs>\n <linearGradient id={GRADIENT_FIELD_ID} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={ctx.colors.bg} />\n <stop offset=\"100%\" stopColor={BG_MIXED_6PCT_BLACK} />\n </linearGradient>\n </defs>\n <rect x=\"0\" y=\"0\" width=\"1280\" height=\"720\" fill={`url(#${GRADIENT_FIELD_ID})`} />\n </>\n )\n}\n","// GF/svg/archetypes/motif-constellation-motif.tsx\nimport type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * constellation-motif archetype(spec §3.2,Wave 3 Task 22,motif 段收尾):\n * 全页 135° 对角深空渐变场,充当所有 slide.type 共用的默认底色纹理(同其余\n * 5 个已提炼 motif 的\"渐变场 + hasExplicitBackground 跳过\"骨架),Ending\n * 页型额外叠加一个小号 3 点星座签名 motif(Cover 自己的 9 点大星座画在\n * Cover 页型自己的函数体内,已在 Wave 1 Task 提炼为 `cover-constellation.tsx`,\n * 与本 Decor 无关,详见下方\"关联但不随迁\"一节)。自 templates/tech.tsx 的\n * `BentoTechDecor`\n * (1418-1459 行,Step A 用 `grep -n` 实测边界——与 brief 给出的 1418-1467\n * EOF 不同:1461 行起是空行 + eslint-disable 注释 + 文件尾 `TECH_TEMPLATES`\n * 导出对象,已按任务要求排除,不属于本函数体)提炼,随迁其依赖的\n * `hasExplicitBackground`(1405-1416 行,Step A 实测边界,私有复制,签名/\n * 实现原样不变,同 poster-motif.tsx / tone-adaptive-motif.tsx 等已提炼\n * motif 先例)与两个模块级私有常量:`GRADIENT_FIELD_ID`(1366 行,渐变 def\n * 的 id 字符串)、`ENDING_MOTIF_POINTS`(1389-1393 行,Ending 专属 3 点星座\n * 坐标几何,IR 无关的纯常量)。\n *\n * 关联但不随迁:源文件另有 `COVER_MOTIF_POINTS`/`COVER_MOTIF_HERO_POINT`\n * (687-700 行)与三个不透明度/描边宽度常量,那些是 `BentoTechCover`(Cover\n * 页型的函数体,非 Decor)消费的星座几何——已在 Wave 1 Task 提炼\n * `cover-constellation.tsx` 时随迁为该文件私有常量(同名常量各自私有复制,\n * 两份拷贝不共享、不冲突,同 chapter-constellation-chapter.tsx 与本文件互不\n * 依赖的既有模式)。本文件与 `cover-constellation.tsx`/\n * `chapter-constellation-chapter.tsx` 均不互相 import——三者都不 import\n * `../templates/tech`。\n *\n * 替换表(Step B):Step A 对 1405-1459 行区间执行 Global Constraints 第 4\n * 条给出的 hex/主题 id 字符串扫描——命中 4 处,全部落在渐变 stop 的两个颜色\n * 字面量上(两个 stop 色各命中 2 次:一次在 1429-1430 行的行内注释引用,\n * 一次在 1432/1433 行的实际 `stopColor` 属性值——十六进制值本身不抄进\n * 本注释,避免污染本文件的 grep 清零门)。逐十六进制核对\n * `themes/tech.ts` 的 `colors` 全字段(bg/surface/primary/accent/text/\n * muted/border/chartPalette):**均无精确匹配**——两个 stop 色都比\n * `colors.bg`(tech 自己的背景色)更深,是\"渐变场\"这一装饰性视觉效果的一部分,\n * 不对应 token 表里任何一个字段本来的角色(不是背景色本身,也不是描边/\n * 表面色)。\n *\n * 孤儿色归属裁决(按 brief 与 W1-1 归属框架,YAGNI——不新增 token 字段):\n * 该渐变的语义是\"给全页画一个固定深浅的深空对角渐变场\",两个端点色是绑定这\n * 个渐变效果本身的设计常量,不是\"某个 token 字段的近似值\"(比照\n * motif-tone-adaptive-motif.tsx 对 `BG_MIXED_6PCT_BLACK` 的同一归属框架\n * ①「渐变/混合底色装饰性 → 私有常量保留」,而非框架②「同角色近似 → 并入\n * surface/border」——这里甚至没有\"同角色\"的候选字段可并,两个 stop 色互相\n * 独立、都不是从 `ctx.colors` 某个值派生的,原样保留为本文件私有装饰常量最\n * 忠实于原设计意图)。若为这两个 stop 色新增专属 token 字段,只服务这一处\n * 渐变装饰、无其他消费点,成本明显高于保留私有常量——不新增。\n *\n * **档位:Content 段(已随本任务提炼进 `content-bento-panel.tsx`)是档位\n * 一・逐字节等价(tech 是零烤色主题);本 Decor 段因两个渐变孤儿色降级为\n * 档位二・观感等价**——断言退化为:跨 slide.type 装饰几何存在(渐变 def +\n * 满页 rect + Ending 的星座 polyline/circle)、孤儿色原样出现(装饰未隐形,\n * 而非被误删)、换一个\"他主题\" tokens 渲染时 `hasExplicitBackground` 逻辑与\n * `ctx.colors.accent`(Ending 星座颜色,真正 token 化)随主题切换,孤儿渐变\n * 色跨主题保持不变(未被并入任何字段)。\n *\n * 纪律:本文件禁 theme id 字符串字面量——唯一豁免是上面点名并测试锁死的两个\n * 渐变 stop 私有装饰常量,grep 清零门预期恰好命中这两处(十六进制值本身不抄\n * 进本注释)。渐变 def 的 id 字符串原样保留源文件的 `decor-tech-field`(同\n * poster-motif.tsx 保留 `decor-creative-glow`、tone-adaptive-motif.tsx 保留\n * `decor-custom-field` 的先例:纯几何/id 值,不是颜色字面量,字符串里嵌了\n * 主题名子串但不是 grep 清零门检测的、独立加双引号包裹的那种精确匹配,不\n * 构成违规——若改名会破坏与旧 `BentoTechDecor` 的逐字节 `toBe` 断言,得不\n * 偿失)。\n */\n\n/** Mirrors templates/custom.tsx's own `hasExplicitBackground` (same check)\n * — this theme's decor is the only other theme-decor that needs to know\n * whether the slide carries an explicit background override, to skip the\n * full-bleed decor gradient that would otherwise hide it. Any\n * override kind counts, not just `asset`: `color`/`gradient` are\n * schema-validated hex values that always render successfully in\n * Background.tsx, so presence alone is enough; `asset` still requires\n * resolving to a loadable image — an errored/missing asset falls back to\n * Background.tsx's own dark placeholder rect, which isn't a meaningful\n * override worth protecting from decor. Ported verbatim from\n * templates/tech.tsx(1405-1416 行),私有复制,签名/实现不变. */\nfunction hasExplicitBackground(\n ir: DecorProps[\"ir\"],\n slide: DecorProps[\"slide\"]\n): boolean {\n const bg = slide.background\n if (!bg) return false\n if (bg.kind === \"asset\") {\n const asset = ir.assets.images[bg.asset_id]\n return !!(asset?.src && !asset.error)\n }\n return true\n}\n\nconst GRADIENT_FIELD_ID = \"decor-tech-field\"\n\n/**\n * Ending's small signature motif — 3 fixed points, all y >= 108 (clear of\n * MasterChrome's tr logo band at `y:48-88`). Uniform r=3 and a fainter line\n * (opacity 0.25) — deliberately quieter than Cover's own (larger) motif\n * since Ending still carries a heading/meta stack, not a mostly-empty hero\n * layout. Content dropped this motif outright (its top-right corner\n * collided with a long content-page title's reachable area — see the source\n * file's own historical S3d note); only Ending still shows it. Ported\n * verbatim from templates/tech.tsx(1389-1393 行).\n */\nconst ENDING_MOTIF_POINTS = [\n { x: 1080, y: 108 },\n { x: 1140, y: 140 },\n { x: 1196, y: 118 },\n]\n// 构图变体(2026-07-10 装饰多样性推广):b=四点 W 形、c=左上三点。\nconst ENDING_MOTIF_POINTS_B = [\n { x: 1052, y: 132 },\n { x: 1104, y: 100 },\n { x: 1156, y: 136 },\n { x: 1208, y: 104 },\n]\nconst ENDING_MOTIF_POINTS_C = [\n { x: 96, y: 120 },\n { x: 152, y: 96 },\n { x: 204, y: 132 },\n]\nfunction endingPointsFor(variant: \"a\" | \"b\" | \"c\") {\n return variant === \"b\" ? ENDING_MOTIF_POINTS_B : variant === \"c\" ? ENDING_MOTIF_POINTS_C : ENDING_MOTIF_POINTS\n}\n\n// Decoration-only gradient stops (see file header's \"孤儿色归属裁决\"):\n// a fixed dark diagonal field, deliberately darker than `colors.bg` in every\n// direction — not derived from any `ctx.colors` field. Deliberately NOT\n// mapped to any token — no field represents \"bg but as a fixed dark diagonal\n// gradient\", and there is no natural token candidate to merge into (unlike\n// motif-tone-adaptive-motif.tsx's `BG_MIXED_6PCT_BLACK`, which at least\n// shares `colors.bg` as its gradient *start*, this gradient's both stops are\n// independent literals). Ported verbatim from templates/tech.tsx (this pair\n// of literals is the file's one intentional, test-locked grep-gate\n// exemption).\nconst GRADIENT_STOP_START = \"#04070E\"\nconst GRADIENT_STOP_END = \"#0A1220\"\n\nexport function ConstellationMotif({ ir, slide, ctx }: DecorProps) {\n const variant = pickBySeed(cachedDeckSeed(ir), \"constellation-decor\", [\"a\", \"b\", \"c\"] as const)\n const endingPoints = endingPointsFor(variant)\n const withBg = hasExplicitBackground(ir, slide)\n if (withBg) return <></>\n\n // S3d: content no longer shows this motif — only Ending does now.\n const showEndingMotif = slide.type === \"ending\"\n\n return (\n <>\n <defs>\n <linearGradient id={GRADIENT_FIELD_ID} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor={GRADIENT_STOP_START} />\n <stop offset=\"100%\" stopColor={GRADIENT_STOP_END} />\n </linearGradient>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"1280\"\n height=\"720\"\n fill={`url(#${GRADIENT_FIELD_ID})`}\n />\n {showEndingMotif && (\n <>\n <polyline\n points={endingPoints.map((p) => `${p.x},${p.y}`).join(\" \")}\n fill=\"none\"\n stroke={ctx.colors.accent}\n strokeWidth=\"1\"\n strokeOpacity=\"0.25\"\n />\n {endingPoints.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r=\"3\" fill={ctx.colors.accent} />\n ))}\n </>\n )}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * campaign-motif archetype v4(2026-07-13 用户裁决三轮返工:圆头 stroke\n * 弧线「没有纹理没有笔刷感」——参考图的蜡笔/干刷条是**毛糙锯齿边 +\n * 内部露底条痕 + 端头飞散颗粒**)。\n * 蜡笔条 crayon():矩形起始 + Hobbs 边中点位移变形(长边中等方差=毛边、\n * 短边高方差=端头散开)+ 三层错位低透明叠加(蜡质层次)+ 内部沿长轴\n * bg 色细条痕(露底)+ 两端飞散颗粒。\n * 另有暗斑 blot 打破纯色底、白三角/彩点散布。\n * 配色纪律(Hobbs 概率结构):品红主导、湖蓝辅、黄/薄荷点缀。\n * 构图变体(cover/ending 强档):a=左上+右下对角束、b=顶底横扫、c=四角\n * 环布。chapter 完全退让。content 弱档=贴边小条。\n * 颜色取 ctx.colors.chartPalette + bg(露底痕)+ text(白散点),零外部\n * hex(黑色暗斑为中性色豁免,split-diagonal 先例)。纯 path+opacity。\n */\n\nfunction lcg(seed: number) {\n let s = seed >>> 0\n return () => {\n s = (s * 1664525 + 1013904223) >>> 0\n return s / 4294967296\n }\n}\n\nexport function CampaignMotif({ ir, slide, ctx }: DecorProps) {\n const [pink, blue, yellow, mint] = ctx.colors.chartPalette\n const white = ctx.colors.text\n if (slide.type === \"chapter\") return null\n\n /** 蜡笔条 v5(p5.brush 图章模型,联网核实的标准做法):笔画本身由沿\n * 路径的密集粒子图章构成——每步一组粒子、沿法线高斯散布、横截面密度\n * 渐变(中心实/边缘散/少量飞屑)、两端收细散开。粒子按透明度三档分桶\n * 聚合成单 path(菱形子路径),一条笔画=4 个 path(导出 shape 预算)。 */\n const crayon = (\n x: number,\n y: number,\n angleDeg: number,\n len: number,\n w: number,\n color: string,\n seed: number,\n o = 0.85,\n ) => {\n const rnd = lcg(seed * 2654435761 + 7)\n const gauss = () => (rnd() + rnd() + rnd() - 1.5) / 1.5\n const a = (angleDeg * Math.PI) / 180\n const ca = Math.cos(a)\n const sa = Math.sin(a)\n // 主轴微弯(二次贝塞尔):控制点侧偏\n const bend = (rnd() - 0.5) * len * 0.24\n const world = (u: number, t: number) => {\n const tt = u / len\n const curve = bend * 4 * tt * (1 - tt) // 二次弯曲\n return { x: x + u * ca - (t + curve) * sa, y: y + u * sa + (t + curve) * ca }\n }\n // 三个透明度桶(中心/中带/边缘)+ 飞屑桶\n const buckets: string[] = [\"\", \"\", \"\", \"\"]\n const diamond = (px: number, py: number, r: number) => {\n const X = Math.round(px)\n const Y = Math.round(py)\n const R = Math.round(r * 10) / 10\n return `M ${X} ${Y - R} L ${X + R} ${Y} L ${X} ${Y + R} L ${X - R} ${Y} Z `\n }\n const steps = Math.max(50, Math.round(len / 1.8))\n for (let i = 0; i <= steps; i++) {\n const tt = i / steps\n const u = tt * len\n // 压力曲线:两端细、中段饱满 + 随机呼吸\n const press = (0.55 + 0.45 * Math.sin(Math.PI * Math.min(1, tt * 1.15))) * (0.85 + rnd() * 0.3)\n const halfW = (w / 2) * press\n const n = 7 + (rnd() < 0.5 ? 2 : 0)\n for (let k = 0; k < n; k++) {\n const off = gauss() * halfW * 0.78\n const q = world(u, off)\n const rel = Math.abs(off) / (halfW + 0.01)\n // 中心大粒重叠成实身、边缘细粒散(横截面密度渐变)\n const rr = rel < 0.4 ? 1.1 + rnd() * 0.9 : rel < 0.8 ? 0.6 + rnd() * 0.7 : 0.35 + rnd() * 0.45\n const endZone = tt < 0.06 || tt > 0.92\n const bi = endZone ? (rel < 0.5 ? 1 : 2) : rel < 0.4 ? 0 : rel < 0.8 ? 1 : 2\n buckets[bi] += diamond(q.x, q.y, rr)\n }\n // 飞屑(低频 outlier)\n if (rnd() < 0.11) {\n const off = (rnd() < 0.5 ? -1 : 1) * halfW * (1.2 + rnd() * 0.7)\n const q = world(u, off)\n buckets[3] += diamond(q.x, q.y, 0.4 + rnd() * 0.8)\n }\n }\n const ops = [o * 0.92, o * 0.55, o * 0.24, o * 0.15]\n return (\n <g>\n {buckets.map((d, i) => (d ? <path key={i} d={d} fill={color} opacity={ops[i]} /> : null))}\n </g>\n )\n }\n\n const diamondBg = (px: number, py: number, r: number) => {\n const X = Math.round(px)\n const Y = Math.round(py)\n const R = Math.round(r * 10) / 10\n return `M ${X} ${Y - R} L ${X + R} ${Y} L ${X} ${Y + R} L ${X - R} ${Y} Z `\n }\n /** 全页颗粒尘(纸纹/喷砂感)+ 干刷大扫痕(黑色稀粒宽痕,中性色豁免)——\n * 替代光滑暗斑(用户裁决:平滑大斑=脏,颗粒/干刷才是质感语言)。 */\n const grainBase = (seed: number) => {\n const rnd = lcg(seed * 7919 + 3)\n let dark = \"\"\n let light = \"\"\n for (let i = 0; i < 240; i++) {\n const px = rnd() * 1280\n const py = rnd() * 720\n const d = diamondBg(px, py, 0.5 + rnd() * 0.9)\n if (rnd() < 0.6) dark += d\n else light += d\n }\n // 干刷大扫痕:两道对角宽痕(稀疏大粒横扫,非光滑形)\n let sweep = \"\"\n for (let sw = 0; sw < 2; sw++) {\n const sx = sw === 0 ? 150 + rnd() * 200 : 700 + rnd() * 200\n const sy = sw === 0 ? 120 + rnd() * 120 : 420 + rnd() * 140\n const ang = -0.5 + rnd() * 1.0\n const slen = 380 + rnd() * 260\n const steps = 46\n for (let i = 0; i < steps; i++) {\n const t = i / steps\n const u = t * slen\n const off = ((rnd() + rnd() - 1) * 60) / 2\n if (rnd() < 0.55) {\n sweep += diamondBg(\n sx + Math.cos(ang) * u - Math.sin(ang) * off,\n sy + Math.sin(ang) * u + Math.cos(ang) * off,\n 0.8 + rnd() * 2.2,\n )\n }\n }\n }\n return (\n <g>\n {dark ? <path d={dark} fill=\"#000000\" opacity={0.18} /> : null}\n {light ? <path d={light} fill={white} opacity={0.1} /> : null}\n {sweep ? <path d={sweep} fill=\"#000000\" opacity={0.1} /> : null}\n </g>\n )\n }\n\n if (slide.type === \"content\") {\n // 弱档:贴边小条(右上 + 左下),不入正文区\n return (\n <>\n {grainBase(601)}\n {crayon(1140, 42, 8, 190, 44, pink, 61)}\n {crayon(-40, 678, -8, 200, 46, blue, 62, 0.7)}\n <path d=\"M 1122 78 L 1134 64 L 1144 80 Z\" fill={white} opacity={0.5} />\n <circle cx={170} cy={630} r={4} fill={white} opacity={0.4} />\n </>\n )\n }\n\n const variant = pickBySeed(cachedDeckSeed(ir), \"campaign-decor\", [\"a\", \"b\", \"c\"] as const)\n\n const splat = (cx: number, cy: number, R: number, seed: number, n = 10) => {\n const rnd = lcg(seed * 9176 + 5)\n const dots = []\n for (let i = 0; i < n; i++) {\n const ang = rnd() * Math.PI * 2\n const dist = R * (0.15 + rnd() * 0.9)\n const c = [pink, blue, yellow, mint, white][Math.floor(rnd() * 5)]\n dots.push(\n <circle key={i} cx={Math.round(cx + Math.cos(ang) * dist)} cy={Math.round(cy + Math.sin(ang) * dist)} r={Math.round((1.2 + rnd() * 3.4) * 10) / 10} fill={c} opacity={0.3 + rnd() * 0.4} />,\n )\n }\n return <g>{dots}</g>\n }\n const scatter = (\n <>\n <path d=\"M 890 120 L 906 102 L 918 124 Z\" fill={white} opacity={0.55} />\n <path d=\"M 380 590 L 394 574 L 404 596 Z\" fill={white} opacity={0.5} />\n {splat(300, 170, 120, 51, 8)}\n {splat(1000, 560, 130, 52, 9)}\n <path d=\"M 1050 640 l 14 -8 M 240 110 l -12 9\" stroke={white} strokeWidth={3} strokeLinecap=\"round\" opacity={0.4} />\n </>\n )\n\n if (variant === \"b\") {\n // 顶底横扫:蜡笔条排(品红主、湖蓝辅、黄薄荷点缀——70/20/10)\n return (\n <>\n {grainBase(701)}\n {crayon(-60, 26, 6, 420, 88, pink, 71, 0.95)}\n {crayon(300, -8, -4, 380, 64, blue, 72, 0.8)}\n {crayon(620, 30, 8, 400, 92, pink, 75, 0.9)}\n {crayon(960, -4, -6, 380, 70, mint, 74, 0.7)}\n {crayon(-50, 692, -6, 400, 84, pink, 76, 0.9)}\n {crayon(300, 716, 5, 380, 66, yellow, 77, 0.8)}\n {crayon(660, 688, -4, 400, 60, blue, 78, 0.75)}\n {crayon(1000, 708, 6, 360, 86, pink, 79, 0.85)}\n {scatter}\n </>\n )\n }\n if (variant === \"c\") {\n // 四角环布\n return (\n <>\n {grainBase(801)}\n {crayon(-50, 90, 14, 320, 78, pink, 81, 0.9)}\n {crayon(-30, 170, 24, 240, 44, yellow, 82, 0.75)}\n {crayon(1310, 84, 166, 310, 74, blue, 83, 0.85)}\n {crayon(1295, 165, 155, 230, 42, pink, 84, 0.8)}\n {crayon(-40, 630, -16, 300, 72, mint, 85, 0.8)}\n {crayon(1315, 645, -158, 310, 80, pink, 87, 0.9)}\n {crayon(1255, 700, -146, 240, 48, yellow, 88, 0.75)}\n {scatter}\n </>\n )\n }\n // a:左上 + 右下对角束(品红主导)\n return (\n <>\n {grainBase(901)}\n {crayon(-70, 130, -24, 440, 96, pink, 91, 0.95)}\n {crayon(-50, 250, -32, 350, 62, blue, 92, 0.8)}\n {crayon(-30, 40, -14, 300, 48, yellow, 93, 0.7)}\n {crayon(1340, 580, 156, 440, 94, pink, 94, 0.9)}\n {crayon(1320, 470, 148, 340, 58, mint, 95, 0.7)}\n {crayon(1310, 680, 162, 380, 68, blue, 96, 0.8)}\n {scatter}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * bloom-motif archetype v5(2026-07-13 联网核实最佳实践后重写:Tyler\n * Hobbs 水彩模拟算法——生成艺术圈标准做法,来源\n * tylerxhobbs.com/words/a-guide-to-simulating-watercolor-paint-with-generative-art\n * 与 sighack.com 的 Processing 实现)。\n * 算法四要素(v4 差距即在此):\n * - 递归边中点高斯位移变形(分形级边缘,非极坐标抖动)\n * - 每团 = base 多边形(3 轮变形)再派生 18 层(各自再 2 轮变形),每层\n * opacity ~4.5%——几十层微差累积出真羽化(v4 只叠 3 层=台阶感根源)\n * - per-edge variance 继承:起始边各自方差、子边继承×衰减——部分边缘\n * 锐利部分柔软(湿纸/干纸差异)\n * - 颜料沉积:前 1/3 层用浅变形 base(贴中心浓),后 2/3 外扩渐淡;\n * 边缘带撒深色微粒=颗粒沉积,散布微粒=纸肌理\n * 预算:起始 8 边+base 3 轮+层 2 轮=~128 点/层,18 层×4 团/页 ≈ 72 path,\n * 坐标取整控制 SVG 体积。全部实色 path+opacity(无渐变无 filter,预览/\n * 导出一致;svg2pptx path 链原生支持)。LCG 确定性可复现。\n * chapter 退让;content 弱档小团;植物细线枝保留(用户认可)。\n */\n\ntype XY = { x: number; y: number }\n\n/** 两锚点间的山脊线:不对称单峰 profile 大波浪 + 中点位移细分 + 高频细碎。\n * (nx,ny) 是凸出方向单位法线(指向页内)。 */\nfunction ridgeLine(a: XY, b: XY, nx: number, ny: number, depth: number, seed: number): XY[] {\n let sd = (seed * 2654435761 + 13) >>> 0\n const rnd = () => ((sd = (sd * 1664525 + 1013904223) >>> 0), sd / 4294967296)\n const N = 9\n const peakAt = 0.3 + rnd() * 0.4\n const pts: XY[] = []\n for (let i = 0; i <= N; i++) {\n const t = i / N\n const prof =\n t < peakAt\n ? Math.pow(t / peakAt, 0.8 + rnd() * 0.6)\n : Math.pow((1 - t) / (1 - peakAt), 0.7 + rnd() * 0.7)\n const d = depth * (0.2 + 0.8 * prof) * (0.75 + rnd() * 0.5)\n pts.push({ x: a.x + (b.x - a.x) * t + nx * d, y: a.y + (b.y - a.y) * t + ny * d })\n }\n let cur = pts\n for (let r = 0; r < 2; r++) {\n const next: XY[] = [cur[0]]\n const amp = depth * (r === 0 ? 0.15 : 0.08)\n for (let i = 1; i < cur.length; i++) {\n next.push({\n x: (cur[i - 1].x + cur[i].x) / 2 + (rnd() - 0.5) * amp * 2,\n y: (cur[i - 1].y + cur[i].y) / 2 + (rnd() - 0.5) * amp * 2,\n })\n next.push(cur[i])\n }\n cur = next\n }\n return cur.map((q) => ({ x: q.x + (rnd() - 0.5) * depth * 0.05, y: q.y + (rnd() - 0.5) * depth * 0.05 }))\n}\n\n/** 贴边大形(参考图右上大片/左下山):脊线 + 页边角点闭合。 */\nfunction ridgePath(a: XY, b: XY, spine: XY[], corners: XY[]): string {\n const f = (v: number) => Math.round(v)\n let d = `M ${f(a.x)} ${f(a.y)}`\n for (const q of spine) d += ` L ${f(q.x)} ${f(q.y)}`\n d += ` L ${f(b.x)} ${f(b.y)}`\n for (const c of corners) d += ` L ${f(c.x)} ${f(c.y)}`\n return d + \" Z\"\n}\n\nfunction lcg(seed: number) {\n let s = seed >>> 0\n return () => {\n s = (s * 1664525 + 1013904223) >>> 0\n return s / 4294967296\n }\n}\n\ntype Pt = { x: number; y: number; v: number } // v: 该点起始边的 variance\n\n/** 一轮边中点位移:每条边取中点、按边 variance 高斯位移,子边继承衰减方差。 */\nfunction deformOnce(pts: Pt[], rnd: () => number): Pt[] {\n const out: Pt[] = []\n const n = pts.length\n const gauss = () => (rnd() + rnd() + rnd() - 1.5) / 1.5 // 近似高斯 [-1,1]\n for (let i = 0; i < n; i++) {\n const a = pts[i]\n const b = pts[(i + 1) % n]\n out.push(a)\n out.push({\n x: (a.x + b.x) / 2 + gauss() * a.v,\n y: (a.y + b.y) / 2 + gauss() * a.v,\n v: a.v * (0.45 + rnd() * 0.3), // 子边继承×衰减\n })\n }\n return out\n}\n\nfunction deform(pts: Pt[], rounds: number, rnd: () => number): Pt[] {\n let cur = pts\n for (let i = 0; i < rounds; i++) cur = deformOnce(cur, rnd)\n return cur\n}\n\n/** 高频细碎抖动:每点独立小位移——水彩边缘的絮状小凸起(低通递归给\n * 不出的高频段,v6 边缘「太光滑」的解)。 */\nfunction fineJitter(pts: Pt[], amp: number, rnd: () => number): Pt[] {\n return pts.map((p) => ({\n x: p.x + (rnd() - 0.5) * amp * 2,\n y: p.y + (rnd() - 0.5) * amp * 2,\n v: p.v,\n }))\n}\n\nfunction toPathD(pts: Pt[]): string {\n let d = `M ${Math.round(pts[0].x)} ${Math.round(pts[0].y)}`\n for (let i = 1; i < pts.length; i++) d += ` L ${Math.round(pts[i].x)} ${Math.round(pts[i].y)}`\n return d + \" Z\"\n}\n\n/** 起始多边形:8 边不规则 + per-edge variance(软硬边分布)+ 方向拉伸\n * (elong/elongAngle:洇染沿角对角方向「流向页内」,圆团=无方向感)。 */\nfunction seedPolygon(\n cx: number,\n cy: number,\n R: number,\n rnd: () => number,\n elong = 1,\n elongAngle = 0,\n): Pt[] {\n const pts: Pt[] = []\n const ca = Math.cos(elongAngle)\n const sa = Math.sin(elongAngle)\n for (let i = 0; i < 8; i++) {\n const a = (i / 8) * Math.PI * 2 + rnd() * 0.3\n const r = R * (0.72 + rnd() * 0.5)\n // 局部坐标拉伸后旋转\n const lx = Math.cos(a) * r * elong\n const ly = Math.sin(a) * r\n pts.push({\n x: cx + lx * ca - ly * sa,\n y: cy + lx * sa + ly * ca,\n // 软硬边分布:约 1/3 的边低方差(锐利缘),其余高方差(羽化缘)\n v: rnd() < 0.35 ? R * 0.035 : R * (0.1 + rnd() * 0.1),\n })\n }\n return pts\n}\n\nexport function BloomMotif({ ir, slide, ctx }: DecorProps) {\n const palette = ctx.colors.chartPalette\n // 配色结构(Hobbs 概率结构 + 水彩「一深压众淡」):暖杏 apricot 为主调\n // (大团),rose/wisteria 为辅,primary(深紫藤)只做小锚团,mist 不成团\n const [wisteria, apricot, rose] = palette\n const anchorColor = ctx.colors.primary\n\n if (slide.type === \"chapter\") return null\n\n /** 一团水彩:Hobbs 分层 + 沉积微粒 + 纸肌理微粒。\n * 配色纪律(Hobbs 概率结构):main 主导 ~85% 层、deep 是**同族加深色**\n * 只占 ~15%(跨色相混层=浑浊之源)。anchor=true 为深色锚团(层少而浓、\n * 面积小——「一深压众淡」的视觉重心)。 */\n const wash = (\n cx: number,\n cy: number,\n R: number,\n seed: number,\n main: string,\n deep: string,\n strength = 1,\n elongAngle = 0,\n anchor = false,\n ) => {\n const rnd = lcg(seed * 2654435761 + 1)\n const elong = anchor ? 1.15 : 1.35 + rnd() * 0.25\n const base = deform(seedPolygon(cx, cy, R, rnd, elong, elongAngle), 3, rnd)\n const layers: React.ReactNode[] = []\n const L = anchor ? 3 : Math.max(3, Math.round(3 * strength))\n const perLayer = anchor ? 0.17 : 0.15\n for (let i = 0; i < L; i++) {\n // 颜料沉积:前 1/3 层贴中心(base 收缩 0.86 再浅变形),后 2/3 外扩\n const inner = i < L / 3\n const src = inner\n ? base.map((p) => ({ x: cx + (p.x - cx) * 0.86, y: cy + (p.y - cy) * 0.86, v: p.v * 0.8 }))\n : base\n const layer = fineJitter(deform(src, 2, rnd), R * 0.018, rnd)\n layers.push(\n <path\n key={i}\n d={toPathD(layer)}\n fill={main}\n opacity={(inner ? perLayer * 1.3 : perLayer) * strength}\n />,\n )\n }\n // 干湿不均块状痕:2-3 个局部深斑(缩小偏移的 deform 小形,非整形深版)\n const blotN = anchor ? 0 : 2 + Math.floor(rnd() * 2)\n for (let i = 0; i < blotN; i++) {\n const ox = (rnd() - 0.5) * R * 0.7\n const oy = (rnd() - 0.5) * R * 0.7\n const sc = 0.3 + rnd() * 0.22\n const src = base.map((p) => ({\n x: cx + ox + (p.x - cx) * sc,\n y: cy + oy + (p.y - cy) * sc,\n v: p.v * sc * 1.6,\n }))\n layers.push(\n <path\n key={`b${i}`}\n d={toPathD(fineJitter(deform(src, 2, rnd), R * 0.012, rnd))}\n fill={deep}\n opacity={0.06 * strength}\n />,\n )\n }\n // 边缘絮片:脱离主体悬浮的微小碎形(云絮感)\n for (let i = 0; i < (anchor ? 3 : 6); i++) {\n const ang = rnd() * Math.PI * 2\n const dist = R * (0.95 + rnd() * 0.35)\n const fx = cx + Math.cos(ang) * dist\n const fy = cy + Math.sin(ang) * dist\n const fr = R * (0.04 + rnd() * 0.05)\n const flake: Pt[] = []\n for (let k = 0; k < 5; k++) {\n const fa = (k / 5) * Math.PI * 2\n flake.push({ x: fx + Math.cos(fa) * fr * (0.6 + rnd() * 0.8), y: fy + Math.sin(fa) * fr * (0.6 + rnd() * 0.8), v: fr * 0.3 })\n }\n layers.push(\n <path key={`f${i}`} d={toPathD(deform(flake, 1, rnd))} fill={main} opacity={(0.05 + rnd() * 0.05) * strength} />,\n )\n }\n // 颗粒沉积(边缘带加密深色微粒)+ 纸肌理(内部稀疏微粒)\n // 颗粒:菱形子路径按 3 档 opacity 分桶聚合(真机导出实测逐 circle\n // =634 shapes/页会拖垮 PPT 编辑,campaign 同款分桶后 ~55/页)\n const diamond = (px: number, py: number, r: number) => {\n const X = Math.round(px)\n const Y = Math.round(py)\n const RR = Math.round(r * 10) / 10\n return `M ${X} ${Y - RR} L ${X + RR} ${Y} L ${X} ${Y + RR} L ${X - RR} ${Y} Z `\n }\n const gBuckets: [string, string, string] = [\"\", \"\", \"\"]\n const gN = Math.round(170 * strength)\n for (let i = 0; i < gN; i++) {\n const ang = rnd() * Math.PI * 2\n const edge = i < gN * 0.75\n const dist = edge ? R * (0.62 + rnd() * 0.55) : Math.sqrt(rnd()) * R * 0.62\n const d = diamond(cx + Math.cos(ang) * dist, cy + Math.sin(ang) * dist, 0.7 + rnd() * 1.7)\n const bi = rnd() < 0.2 ? 2 : edge ? 0 : 1\n gBuckets[bi] += d\n }\n // 干刷拖痕合并为单 stroke path(多段 M 子路径)\n let dryD = \"\"\n for (let i = 0; i < 14; i++) {\n const ang = rnd() * Math.PI * 2\n const dist = R * (0.72 + rnd() * 0.45)\n const fx = cx + Math.cos(ang) * dist\n const fy = cy + Math.sin(ang) * dist\n const fl = 10 + rnd() * 22\n const fa = ang + Math.PI / 2 + (rnd() - 0.5) * 0.6\n dryD += `M ${Math.round(fx)} ${Math.round(fy)} q ${Math.round(Math.cos(fa) * fl * 0.5)} ${Math.round(Math.sin(fa) * fl * 0.5 - 2)} ${Math.round(Math.cos(fa) * fl)} ${Math.round(Math.sin(fa) * fl)} `\n }\n // 干刷扫帚丝纹:2-3 组平行细线束(每束 4 条平行线合并 1 path——\n // 干刷的招牌特征)\n let broomD = \"\"\n const broomN = 2 + Math.floor(rnd() * 2)\n for (let bi = 0; bi < broomN; bi++) {\n const ang = rnd() * Math.PI * 2\n const dist = R * (0.5 + rnd() * 0.5)\n const bx = cx + Math.cos(ang) * dist\n const by = cy + Math.sin(ang) * dist\n const bl = 26 + rnd() * 40\n const ba = rnd() * Math.PI\n const pxn = Math.cos(ba + Math.PI / 2)\n const pyn = Math.sin(ba + Math.PI / 2)\n for (let li = 0; li < 4; li++) {\n const off = (li - 1.5) * (2.6 + rnd() * 1.6)\n const jl = bl * (0.7 + rnd() * 0.5)\n broomD += `M ${Math.round(bx + pxn * off)} ${Math.round(by + pyn * off)} l ${Math.round(Math.cos(ba) * jl)} ${Math.round(Math.sin(ba) * jl)} `\n }\n }\n const grains: React.ReactNode[] = [\n gBuckets[0] ? <path key=\"g0\" d={gBuckets[0]} fill={anchorColor} opacity={0.3} /> : null,\n gBuckets[1] ? <path key=\"g1\" d={gBuckets[1]} fill={main} opacity={0.2} /> : null,\n gBuckets[2] ? <path key=\"g2\" d={gBuckets[2]} fill={anchorColor} opacity={0.48} /> : null,\n dryD ? (\n <path key=\"dry\" d={dryD} stroke={anchorColor} strokeWidth={2.4} strokeLinecap=\"round\" fill=\"none\" opacity={0.32} />\n ) : null,\n broomD ? (\n <path key=\"broom\" d={broomD} stroke={anchorColor} strokeWidth={1.2} strokeLinecap=\"round\" fill=\"none\" opacity={0.3} />\n ) : null,\n ]\n return (\n <g>\n {layers}\n {grains}\n </g>\n )\n }\n\n /** 贴角大形(参考图「右上大淡片 / 左下深紫山」):两档独立色阶——\n * 浅晕大形垫底 + 深核小形压上(各自独立脊线,峰位不相似=手绘感)。 */\n const cornerWash = (\n a: XY,\n b: XY,\n nx: number,\n ny: number,\n depth: number,\n corners: XY[],\n seed: number,\n tiers: { c: string; o: number; s: number }[],\n ) => {\n let sd = (seed * 69069 + 5) >>> 0\n const rnd = () => ((sd = (sd * 1664525 + 1013904223) >>> 0), sd / 4294967296)\n return (\n <g>\n {tiers.map((t, ti) => {\n // 每档 2 层微差(近平涂色阶——晕染再降,质感全交给颗粒/干刷)\n const L = 2\n const layers = []\n for (let li = 0; li < L; li++) {\n const spine = ridgeLine(\n a,\n b,\n nx,\n ny,\n depth * t.s * (0.92 + rnd() * 0.16),\n seed + ti * 97 + li * 31,\n )\n layers.push(\n <path key={li} d={ridgePath(a, b, spine, corners)} fill={t.c} opacity={t.o / (L * 0.85)} />,\n )\n }\n return <g key={ti}>{layers}</g>\n })}\n {(() => {\n const spine = ridgeLine(a, b, nx, ny, depth * 0.96, seed + 7)\n const dia = (px: number, py: number, r: number) => {\n const X = Math.round(px)\n const Y = Math.round(py)\n const RR = Math.round(r * 10) / 10\n return `M ${X} ${Y - RR} L ${X + RR} ${Y} L ${X} ${Y + RR} L ${X - RR} ${Y} Z `\n }\n let d0 = \"\"\n let d1 = \"\"\n for (let i = 0; i < 150; i++) {\n const q = spine[Math.floor(rnd() * spine.length)]\n const d = dia(\n q.x + (rnd() - 0.5) * depth * 0.3,\n q.y + (rnd() - 0.5) * depth * 0.3,\n 0.6 + rnd() * 1.5,\n )\n if (rnd() > 0.35) d0 += d\n else d1 += d\n }\n return (\n <g>\n {d0 ? <path d={d0} fill={anchorColor} opacity={0.3} /> : null}\n {d1 ? <path d={d1} fill={tiers[0].c} opacity={0.22} /> : null}\n </g>\n )\n })()}\n </g>\n )\n }\n\n const sprig = (x: number, y: number, s: number, color: string, o: number) => (\n <>\n <path d={`M ${x} ${y} Q ${x + 14 * s} ${y - 30 * s} ${x + 10 * s} ${y - 62 * s}`} stroke={color} strokeWidth={1.2} fill=\"none\" opacity={o} />\n <path d={`M ${x + 7 * s} ${y - 20 * s} q -14 ${-4 * s} -20 ${-16 * s} q 16 ${-2 * s} 20 ${16 * s} Z`} fill={color} opacity={o * 0.8} />\n <path d={`M ${x + 11 * s} ${y - 36 * s} q 15 ${-8 * s} 24 ${-4 * s} q -8 ${12 * s} -24 ${4 * s} Z`} fill={color} opacity={o * 0.7} />\n <path d={`M ${x + 10 * s} ${y - 52 * s} q -12 ${-6 * s} -14 ${-18 * s} q 14 0 14 ${18 * s} Z`} fill={color} opacity={o * 0.75} />\n </>\n )\n\n if (slide.type === \"content\") {\n // 弱档:右上 + 左下小团(无锚团,低调纹理)\n return (\n <>\n {wash(1355, 60, 170, 11, apricot, rose, 0.7, 1.55)}\n {wash(1350, 280, 140, 13, rose, apricot, 0.55, 1.5)}\n {wash(-75, 620, 180, 12, wisteria, anchorColor, 0.55, 1.45)}\n {sprig(1155, 128, 0.6, wisteria, 0.42)}\n </>\n )\n }\n\n const variant = pickBySeed(cachedDeckSeed(ir), \"bloom-decor\", [\"a\", \"b\", \"c\"] as const)\n\n if (variant === \"b\") {\n // 左缘带(常驻)+ 顶缘横帘\n return (\n <>\n {wash(-85, 300, 230, 24, wisteria, anchorColor, 0.9, 1.4)}\n {wash(-60, 560, 190, 27, apricot, rose, 0.8, 1.5)}\n {wash(-75, 710, 160, 28, rose, apricot, 0.7, 1.45)}\n {wash(320, -100, 220, 21, apricot, rose, 0.95, 0.1)}\n {wash(700, -110, 240, 22, rose, wisteria, 0.85, -0.05)}\n {wash(1060, -95, 210, 23, apricot, rose, 0.9, 0.12)}\n {wash(1265, -85, 160, 26, wisteria, rose, 0.65, 0.05)}\n {sprig(1150, 640, 1.05, wisteria, 0.48)}\n </>\n )\n }\n if (variant === \"c\") {\n // 左右页缘纵向洇染(左紫右暖)+ 右缘深锚\n return (\n <>\n {wash(-80, 220, 250, 31, wisteria, anchorColor, 1, 1.35)}\n {wash(-50, 500, 220, 32, apricot, rose, 0.85, 1.6)}\n {wash(-70, 690, 180, 36, rose, apricot, 0.75, 1.5)}\n {wash(1360, 140, 200, 33, apricot, rose, 1, 1.55)}\n {wash(1345, 400, 180, 34, rose, apricot, 0.85, 1.6)}\n {wash(1360, 630, 170, 37, wisteria, rose, 0.8, 1.5)}\n {wash(1350, 520, 110, 35, anchorColor, wisteria, 0.55, 1.55)}\n {sprig(1180, 645, 0.9, wisteria, 0.45)}\n <path d=\"M 560 44 h 12 M 588 44 h 12 M 616 44 h 12 M 644 44 h 12 M 672 44 h 12 M 700 44 h 12\" stroke={wisteria} strokeWidth={1.4} opacity={0.35} />\n </>\n )\n }\n // a:左缘窄流淌带(用户三轮圈图认可的常驻主体)+ 右上大淡片(参考图\n // 「紫梦花园」右上)+ 左上虚线排。左缘带在三个变体中恒在,变奏只发生\n // 在右侧搭配。\n return (\n <>\n {wash(-80, 220, 250, 31, wisteria, anchorColor, 1, 1.35)}\n {wash(-50, 500, 220, 32, apricot, rose, 0.85, 1.6)}\n {wash(-70, 690, 180, 36, rose, apricot, 0.75, 1.5)}\n {cornerWash({ x: 780, y: 0 }, { x: 1280, y: 430 }, -0.62, 0.62, 230, [{ x: 1280, y: 0 }], 141, [\n { c: apricot, o: 0.3, s: 1 },\n { c: rose, o: 0.28, s: 0.52 },\n ])}\n <g opacity={0.55}>\n <path d=\"M 180 66 q 10 -4 20 0 M 212 64 q 10 -4 20 0 M 244 66 q 10 -4 20 0 M 276 63 q 10 -4 20 0\n M 168 86 q 10 -4 20 0 M 200 84 q 10 -4 20 0 M 232 86 q 10 -4 20 0\n M 180 106 q 10 -4 20 0 M 212 104 q 10 -4 20 0 M 244 106 q 10 -4 20 0 M 276 103 q 10 -4 20 0\"\n stroke={wisteria} strokeWidth={1.6} fill=\"none\" />\n </g>\n {sprig(1150, 630, 1.25, wisteria, 0.5)}\n {sprig(1235, 660, 0.85, rose, 0.42)}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * classroom-motif archetype(2026-07-13 第 13 主题):莫兰迪教学模板\n * 语言——**平滑有机斑块**(大圆润 blob,2-3 档灰调色错落,与 bloom 的\n * 水彩纹理刻意区分:参考图斑块是平滑无纹理的)+ **手绘小装饰**(点阵\n * /短线组/波浪线/空心圆线描——课堂手账气质)。\n * 构图变体(cover/ending 强档):a=四角斑块群、b=左上+右下对角大斑、\n * c=顶部斑块带。chapter 完全退让(chrome 碰撞铁律)。content 弱档=\n * 右上+左下角小斑+一组点阵。\n * 颜色取 ctx.colors.chartPalette 莫兰迪四色(零 hex)。实色 path+\n * opacity(无渐变无 filter,预览/导出一致)。LCG 确定性。\n */\n\n/** 平滑有机 blob(三形状轮换,Catmull 风格闭合贝塞尔——刻意光滑)。 */\nfunction blobPath(cx: number, cy: number, r: number, s: number): string {\n const f = (v: number) => Math.round(v * 10) / 10\n if (s === 1)\n return `M ${f(cx - r * 1.05)} ${f(cy + r * 0.15)} C ${f(cx - r)} ${f(cy - r * 0.65)} ${f(cx - r * 0.3)} ${f(cy - r * 1.1)} ${f(cx + r * 0.42)} ${f(cy - r * 0.82)} C ${f(cx + r * 1.02)} ${f(cy - r * 0.48)} ${f(cx + r * 0.98)} ${f(cy + r * 0.38)} ${f(cx + r * 0.55)} ${f(cy + r * 0.78)} C ${f(cx + r * 0.15)} ${f(cy + r * 1.12)} ${f(cx - r * 0.62)} ${f(cy + r * 0.92)} ${f(cx - r * 1.05)} ${f(cy + r * 0.15)} Z`\n if (s === 2)\n return `M ${f(cx - r * 0.88)} ${f(cy - r * 0.42)} C ${f(cx - r * 0.48)} ${f(cy - r * 1.05)} ${f(cx + r * 0.52)} ${f(cy - r)} ${f(cx + r * 0.92)} ${f(cy - r * 0.32)} C ${f(cx + r * 1.18)} ${f(cy + r * 0.18)} ${f(cx + r * 0.66)} ${f(cy + r * 0.72)} ${f(cx + r * 0.12)} ${f(cy + r * 0.92)} C ${f(cx - r * 0.48)} ${f(cy + r * 1.12)} ${f(cx - r * 1.1)} ${f(cy + r * 0.45)} ${f(cx - r * 0.88)} ${f(cy - r * 0.42)} Z`\n return `M ${f(cx - r)} ${f(cy)} C ${f(cx - r)} ${f(cy - r * 0.85)} ${f(cx - r * 0.38)} ${f(cy - r * 1.08)} ${f(cx + r * 0.22)} ${f(cy - r * 0.92)} C ${f(cx + r * 0.82)} ${f(cy - r * 0.72)} ${f(cx + r * 1.08)} ${f(cy - r * 0.12)} ${f(cx + r * 0.88)} ${f(cy + r * 0.48)} C ${f(cx + r * 0.62)} ${f(cy + r * 1.02)} ${f(cx - r * 0.12)} ${f(cy + r * 1.05)} ${f(cx - r * 0.58)} ${f(cy + r * 0.78)} C ${f(cx - r * 1.05)} ${f(cy + r * 0.48)} ${f(cx - r)} ${f(cy + r * 0.28)} ${f(cx - r)} ${f(cy)} Z`\n}\n\nexport function ClassroomMotif({ ir, slide, ctx }: DecorProps) {\n const [blue, coral, sage, latte] = ctx.colors.chartPalette\n\n if (slide.type === \"chapter\") return null\n\n const blob = (cx: number, cy: number, r: number, color: string, o: number, s = 0) => (\n <path d={blobPath(cx, cy, r, s)} fill={color} opacity={o} />\n )\n\n /** 点阵(手账点点):rows×cols 小圆点,斜向错位。 */\n const dots = (x: number, y: number, rows: number, cols: number, color: string, o = 0.5) => {\n const pts: React.ReactNode[] = []\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n pts.push(\n <circle key={`${r}-${c}`} cx={x + c * 16 + r * 5} cy={y + r * 14} r={2.2} fill={color} opacity={o} />,\n )\n }\n }\n return <g>{pts}</g>\n }\n\n /** 短线组(手绘速写线)。 */\n const ticks = (x: number, y: number, angle: number, color: string) => {\n const a = (angle * Math.PI) / 180\n const dx = Math.cos(a) * 14\n const dy = Math.sin(a) * 14\n return (\n <g stroke={color} strokeWidth={2.4} strokeLinecap=\"round\" opacity={0.55}>\n <path d={`M ${x} ${y} l ${dx} ${dy}`} fill=\"none\" />\n <path d={`M ${x + 10} ${y - 6} l ${dx} ${dy}`} fill=\"none\" />\n <path d={`M ${x + 20} ${y - 12} l ${dx} ${dy}`} fill=\"none\" />\n </g>\n )\n }\n\n /** 波浪线(手绘下划波浪)。 */\n const squiggle = (x: number, y: number, n: number, color: string) => {\n let d = `M ${x} ${y}`\n for (let i = 0; i < n; i++) d += ` q 9 ${i % 2 === 0 ? -8 : 8} 18 0`\n return <path d={d} stroke={color} strokeWidth={2.2} strokeLinecap=\"round\" fill=\"none\" opacity={0.6} />\n }\n\n /** 空心圆线描(手绘圈圈)。 */\n const ring = (cx: number, cy: number, r: number, color: string, o = 0.5) => (\n <circle cx={cx} cy={cy} r={r} fill=\"none\" stroke={color} strokeWidth={2} opacity={o} />\n )\n\n if (slide.type === \"content\") {\n // 弱档:右上小斑 + 左下小斑 + 一组点阵(贴角低调)\n return (\n <>\n {blob(1246, 26, 90, sage, 0.35, 1)}\n {blob(1280, 90, 60, coral, 0.25, 2)}\n {blob(20, 700, 84, latte, 0.35, 0)}\n {dots(1140, 92, 3, 4, blue, 0.4)}\n {squiggle(60, 660, 3, coral)}\n </>\n )\n }\n\n const variant = pickBySeed(cachedDeckSeed(ir), \"classroom-decor\", [\"a\", \"b\", \"c\"] as const)\n\n if (variant === \"b\") {\n // 左上 + 右下对角大斑(错落两档)\n return (\n <>\n {blob(70, 60, 190, blue, 0.3, 0)}\n {blob(220, 10, 120, sage, 0.35, 2)}\n {blob(20, 210, 90, coral, 0.28, 1)}\n {blob(1210, 660, 200, coral, 0.3, 2)}\n {blob(1060, 700, 120, latte, 0.4, 0)}\n {blob(1268, 520, 84, sage, 0.32, 1)}\n {dots(320, 130, 3, 5, blue, 0.4)}\n {ticks(1000, 600, -35, coral)}\n {squiggle(150, 260, 4, latte)}\n {ring(1150, 480, 14, blue, 0.45)}\n </>\n )\n }\n if (variant === \"c\") {\n // 顶部斑块带 + 左下点缀\n return (\n <>\n {blob(140, -20, 150, sage, 0.35, 1)}\n {blob(420, -50, 180, latte, 0.4, 0)}\n {blob(760, -30, 150, coral, 0.26, 2)}\n {blob(1080, -40, 170, blue, 0.28, 1)}\n {blob(1272, 60, 80, coral, 0.3, 0)}\n {blob(30, 690, 110, blue, 0.28, 2)}\n {dots(880, 70, 2, 5, blue, 0.4)}\n {squiggle(230, 100, 3, coral)}\n {ticks(60, 600, -30, sage)}\n {ring(1180, 150, 12, latte, 0.55)}\n </>\n )\n }\n // a:四角斑块群(参考图主构图——柔和环抱、中央留白)\n return (\n <>\n {blob(60, 50, 160, sage, 0.35, 0)}\n {blob(210, 0, 110, coral, 0.25, 2)}\n {blob(1230, 40, 170, coral, 0.3, 1)}\n {blob(1290, 170, 100, latte, 0.4, 0)}\n {blob(50, 680, 170, latte, 0.42, 2)}\n {blob(200, 730, 110, blue, 0.25, 1)}\n {blob(1240, 680, 180, blue, 0.28, 0)}\n {blob(1100, 730, 110, sage, 0.35, 2)}\n {dots(300, 80, 3, 5, blue, 0.42)}\n {dots(1000, 640, 2, 4, coral, 0.4)}\n {squiggle(1090, 120, 3, blue)}\n {squiggle(180, 640, 4, coral)}\n {ticks(1180, 560, -35, sage)}\n {ring(260, 170, 13, coral, 0.5)}\n {ring(1050, 90, 10, latte, 0.55)}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * ink-motif archetype v2(2026-07-10 精髓返工,检索背书):水墨的精髓是\n * **墨而非线**——「墨分五色」的大面积淡墨晕染(多层 fill 大形叠不同\n * opacity,消除边界感的气韵)+ 留白对比(疏可走马密不透风)+ **竖排\n * 落款**(竖字+印章是水墨画的完整落款语言)。v1 全是细线条(版框/线描\n * 远山/孤立印章)没有墨韵,被用户裁「还没到精髓」。\n * - cover/chapter(\"强\"):左下三层淡墨晕染远山(fill 叠加)+ 右侧\n * 竖排落款(org 逐字竖排 + 朱砂印章收尾)。\n * - content/ending(\"弱\"):仅保留顶/底细版框(正文页克制,少即是多)。\n * 竖排用逐字 text(不依赖 writing-mode,导出安全)。全部 path/rect/line/\n * text 基础原语。\n * 纪律:零 theme id、零 hex,颜色全部来自 ctx。\n */\nexport function InkMotif({ slide, ir, ctx }: DecorProps) {\n const { colors } = ctx\n const strong = slide.type === \"cover\" || slide.type === \"chapter\"\n const variant = pickBySeed(cachedDeckSeed(ir), \"ink-decor\", [\"a\", \"b\", \"c\"] as const)\n // 落款竖排:org 前 6 字(落款贵短,克制)\n const sealText = (ir.meta.organization ?? \"\").slice(0, 6)\n\n return (\n <>\n {/* 顶/底细版框(chapter 页除外——poster-chapter 自带上下 divider,\n 叠加成双线,2026-07-10 用户截图指出) */}\n {slide.type !== \"chapter\" && (\n <>\n <line x1={48} y1={34} x2={1232} y2={34} stroke={colors.border} strokeWidth={1.5} />\n {/* 底线放 MasterChrome 分隔线的语义位(y=664)——meta 文字 baseline\n 在 700,底线再低会穿字(2026-07-10 用户截图:688 时字线融在一起) */}\n <line x1={48} y1={664} x2={1232} y2={664} stroke={colors.border} strokeWidth={1.5} />\n </>\n )}\n\n {strong && (\n <>\n {/* 淡墨晕染远山(墨分五色 fill 叠加)。构图变体(2026-07-10\n 装饰多样性推广):a=左下(原构图)、b=右下镜像、c=低平远山横贯 */}\n {variant === \"a\" && (\n <>\n <path d=\"M -60 720 Q 150 545 380 630 Q 560 692 700 720 Z\" fill={colors.primary} opacity={0.1} />\n <path d=\"M -60 720 Q 110 590 300 655 Q 440 700 540 720 Z\" fill={colors.primary} opacity={0.14} />\n <path d=\"M 180 720 Q 430 585 660 665 Q 800 710 900 720 Z\" fill={colors.primary} opacity={0.06} />\n </>\n )}\n {variant === \"b\" && (\n <>\n <path d=\"M 1340 720 Q 1130 545 900 630 Q 720 692 580 720 Z\" fill={colors.primary} opacity={0.1} />\n <path d=\"M 1340 720 Q 1170 590 980 655 Q 840 700 740 720 Z\" fill={colors.primary} opacity={0.14} />\n <path d=\"M 1100 720 Q 850 585 620 665 Q 480 710 380 720 Z\" fill={colors.primary} opacity={0.06} />\n </>\n )}\n {variant === \"c\" && (\n <>\n <path d=\"M -60 720 Q 320 618 720 668 Q 1040 704 1340 690 L 1340 720 Z\" fill={colors.primary} opacity={0.09} />\n <path d=\"M -60 720 Q 240 650 560 690 Q 800 716 980 720 Z\" fill={colors.primary} opacity={0.13} />\n </>\n )}\n\n {/* 右侧竖排落款:org 逐字竖排(楷体小字) + 朱砂印章收尾。\n 仅 cover——水墨作品落款一处即可,chapter 右上已有 org 会重复。 */}\n {/* 底部锚定(2026-07-13 用户截图:org 满 6 字时印章底 664 正好\n 压版框底线 y=664)——印章底固定在线上方 24px,字列向上反推,\n 字数多少都不碰线(poster-ending last-anchored 同思路)。 */}\n {slide.type === \"cover\" && sealText.split(\"\").map((ch, i) => (\n <text\n key={i}\n x={1186}\n y={598 - (sealText.length - 1 - i) * 32}\n fontFamily={ctx.fonts.heading}\n fontSize={21}\n fill={colors.muted}\n textAnchor=\"middle\"\n dominantBaseline=\"alphabetic\"\n >\n {ch}\n </text>\n ))}\n {slide.type === \"cover\" && (\n <>\n <rect x={1170} y={608} width={32} height={32} rx={3} fill={colors.accent} />\n <rect\n x={1176}\n y={614}\n width={20}\n height={20}\n fill=\"none\"\n stroke={colors.surface}\n strokeWidth={1.6}\n />\n </>\n )}\n </>\n )}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * luxe-motif archetype(2026-07-10 motif 全覆盖补齐):奢侈品包装的烫金\n * 细线语言——细金线角饰/金点/细分隔线组,深炭底上克制的金色细节。\n * 构图变体:a=右上双细线角+左下金点、b=顶部细线横贯+双端金点、c=四角\n * 细短线。强档(仅 cover)全量,弱档(content/ending)单元素。\n * chapter 完全退让(2026-07-11 用户截图实锤:variant b 顶部金线穿过\n * poster-chapter 右上 org 文字)——memphis 先例:chapter 自带 org + 上下\n * divider + 巨号数字,没有装饰空间。\n * 纪律:零 theme id、零 hex,颜色来自 ctx(primary=香槟金)。\n */\nexport function LuxeMotif({ ir, slide, ctx }: DecorProps) {\n const gold = ctx.colors.primary\n if (slide.type === \"chapter\") return null\n const strong = slide.type === \"cover\"\n const variant = pickBySeed(cachedDeckSeed(ir), \"luxe-decor\", [\"a\", \"b\", \"c\"] as const)\n\n if (!strong) {\n // 弱档:右上一段细金线\n return <path d=\"M 1160 48 H 1232\" stroke={gold} strokeWidth={1.2} opacity={0.65} />\n }\n\n if (variant === \"b\") {\n return (\n <>\n {/* 顶部细金线横贯 + 双端金点 */}\n <path d=\"M 96 44 H 1184\" stroke={gold} strokeWidth={1} opacity={0.5} />\n <circle cx={96} cy={44} r={3.5} fill={gold} />\n <circle cx={1184} cy={44} r={3.5} fill={gold} />\n </>\n )\n }\n if (variant === \"c\") {\n return (\n <>\n {/* 四角细短线(内缩烫金框角) */}\n <path d=\"M 56 72 H 128 M 56 72 V 144\" stroke={gold} strokeWidth={1.2} fill=\"none\" opacity={0.6} />\n <path d=\"M 1224 72 H 1152 M 1224 72 V 144\" stroke={gold} strokeWidth={1.2} fill=\"none\" opacity={0.6} />\n <path d=\"M 56 648 H 128 M 56 648 V 576\" stroke={gold} strokeWidth={1.2} fill=\"none\" opacity={0.6} />\n <path d=\"M 1224 648 H 1152 M 1224 648 V 576\" stroke={gold} strokeWidth={1.2} fill=\"none\" opacity={0.6} />\n </>\n )\n }\n // a:右上双细线角 + 左下金点组\n return (\n <>\n <path d=\"M 1224 56 H 1080 M 1224 56 V 200\" stroke={gold} strokeWidth={1.2} fill=\"none\" opacity={0.6} />\n <path d=\"M 1208 72 H 1096 M 1208 72 V 184\" stroke={gold} strokeWidth={0.8} fill=\"none\" opacity={0.35} />\n <circle cx={64} cy={648} r={3.5} fill={gold} />\n <circle cx={82} cy={648} r={2.2} fill={gold} opacity={0.6} />\n <circle cx={97} cy={648} r={1.4} fill={gold} opacity={0.35} />\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * enterprise-motif archetype(2026-07-10 motif 全覆盖补齐):瑞士网格\n * 语言的 IKB 几何点缀——小方块阵/细基线/方点散点,白墙上克制的企业\n * 秩序感。构图变体:a=右上 3×3 小方块阵、b=左缘竖细条+右下方块、\n * c=对角双方块。强档(仅 cover)全量,弱档单元素。\n * chapter 完全退让(2026-07-11 用户截图实锤:variant a 3×3 方阵叠在\n * poster-chapter 右上 org 文字与顶部 divider 上)——memphis 先例。\n * 纪律:零 theme id、零 hex,颜色来自 ctx(primary=IKB)。\n */\nexport function EnterpriseMotif({ ir, slide, ctx }: DecorProps) {\n const ikb = ctx.colors.primary\n if (slide.type === \"chapter\") return null\n const strong = slide.type === \"cover\"\n const variant = pickBySeed(cachedDeckSeed(ir), \"enterprise-decor\", [\"a\", \"b\", \"c\"] as const)\n\n if (!strong) {\n // 弱档:右上小方点\n return <rect x={1216} y={44} width={10} height={10} fill={ikb} opacity={0.85} />\n }\n\n if (variant === \"b\") {\n return (\n <>\n {/* 左缘竖细条 + 右下实心方块 */}\n <rect x={0} y={180} width={6} height={360} fill={ikb} />\n <rect x={1200} y={624} width={24} height={24} fill={ikb} />\n </>\n )\n }\n if (variant === \"c\") {\n return (\n <>\n {/* 对角双方块(左上大右下小,错位秩序) */}\n <rect x={56} y={56} width={28} height={28} fill={ikb} />\n <rect x={96} y={56} width={12} height={12} fill={ikb} opacity={0.45} />\n <rect x={1196} y={632} width={28} height={28} fill={ikb} />\n <rect x={1172} y={648} width={12} height={12} fill={ikb} opacity={0.45} />\n </>\n )\n }\n // a:右上 3×3 小方块阵(透明度渐次)\n return (\n <>\n {[0, 1, 2].map((i) =>\n [0, 1, 2].map((j) => (\n <rect\n key={`${i}${j}`}\n x={1140 + i * 30}\n y={52 + j * 30}\n width={14}\n height={14}\n fill={ikb}\n opacity={1 - (i + j) * 0.14}\n />\n )),\n )}\n </>\n )\n}\n","import type { DecorProps } from \"./types\"\nimport { cachedDeckSeed, pickBySeed } from \"../variety\"\n\n/**\n * heritage-motif archetype v2(2026-07-11 用户裁决重设计:v1 四角单弧\n * 「不好看」像随手括号,且与 chapter chrome / footer 多处碰撞):典藏\n * 书籍装帧语言——扉页徽记 / 扉页双线框 / 书页缘竖线。\n * 构图变体(仅 cover):a=顶部中央菱形双线徽记+两侧延伸线、b=四角\n * 焦糖角钉小菱形(v2.1:整框与 seed 随机的 split-diagonal 封面互斥——\n * 左半框被色块吞掉、框线穿斜切缘,渲染实拍裁掉。小型角元素对任何\n * 封面版式都安全)、c=左右页缘竖双线。\n * chapter 完全退让(memphis 先例:org + 上下 divider + 巨号数字已满)。\n * 弱档(content/ending):右上小菱形双线(呼应徽记)——v1 底部中央线\n * y=690 漂在 content footer meta 带正中(用户截图实锤),废弃。\n * 纪律:零 theme id、零 hex,颜色来自 ctx(primary=勃艮第/accent=焦糖)。\n */\nexport function HeritageMotif({ ir, slide, ctx }: DecorProps) {\n const wine = ctx.colors.primary\n const caramel = ctx.colors.accent\n if (slide.type === \"chapter\") return null\n const variant = pickBySeed(cachedDeckSeed(ir), \"heritage-decor\", [\"a\", \"b\", \"c\"] as const)\n\n if (slide.type !== \"cover\") {\n // 弱档:右上小菱形双线徽记\n return (\n <>\n <path d=\"M 1216 44 L 1230 58 L 1216 72 L 1202 58 Z\" fill=\"none\" stroke={wine} strokeWidth={1.2} opacity={0.55} />\n <path d=\"M 1216 51 L 1223 58 L 1216 65 L 1209 58 Z\" fill=\"none\" stroke={caramel} strokeWidth={0.9} opacity={0.5} />\n </>\n )\n }\n\n if (variant === \"b\") {\n // 四角焦糖角钉小菱形——焦糖在勃艮第色块和米底上都可见\n const stud = (cx: number, cy: number) => `M ${cx} ${cy - 9} L ${cx + 9} ${cy} L ${cx} ${cy + 9} L ${cx - 9} ${cy} Z`\n return (\n <>\n <path d={stud(56, 56)} fill={caramel} opacity={0.7} />\n <path d={stud(1224, 56)} fill={caramel} opacity={0.7} />\n <path d={stud(56, 664)} fill={caramel} opacity={0.7} />\n <path d={stud(1224, 664)} fill={caramel} opacity={0.7} />\n </>\n )\n }\n if (variant === \"c\") {\n return (\n <>\n {/* 左右缘竖双线(典籍页缘) */}\n <path d=\"M 40 96 V 624 M 48 96 V 624\" stroke={caramel} strokeWidth={1} fill=\"none\" opacity={0.5} />\n <path d=\"M 1232 96 V 624 M 1240 96 V 624\" stroke={caramel} strokeWidth={1} fill=\"none\" opacity={0.5} />\n </>\n )\n }\n // a:顶部中央菱形双线徽记 + 两侧延伸线\n return (\n <>\n <path d=\"M 640 36 L 664 58 L 640 80 L 616 58 Z\" fill=\"none\" stroke={wine} strokeWidth={1.4} opacity={0.6} />\n <path d=\"M 640 46 L 654 58 L 640 70 L 626 58 Z\" fill=\"none\" stroke={caramel} strokeWidth={1} opacity={0.5} />\n <path d=\"M 480 58 H 600 M 680 58 H 800\" stroke={caramel} strokeWidth={1} opacity={0.4} />\n </>\n )\n}\n","import type { MotifArchetype, MotifArchetypeId } from \"./types\"\nimport { CornerOrnamentMotif } from \"./motif-corner-ornament-motif\"\nimport { RailMotif } from \"./motif-rail-motif\"\nimport { BannerMotif } from \"./motif-banner-motif\"\nimport { PosterMotif } from \"./motif-poster-motif\"\nimport { ToneAdaptiveMotif } from \"./motif-tone-adaptive-motif\"\nimport { ConstellationMotif } from \"./motif-constellation-motif\"\nimport { CampaignMotif } from \"./motif-campaign-motif\"\nimport { BloomMotif } from \"./motif-bloom-motif\"\nimport { ClassroomMotif } from \"./motif-classroom-motif\"\nimport { InkMotif } from \"./motif-ink-motif\"\nimport { LuxeMotif } from \"./motif-luxe-motif\"\nimport { EnterpriseMotif } from \"./motif-enterprise-motif\"\nimport { HeritageMotif } from \"./motif-heritage-motif\"\n\nexport type { MotifArchetype, MotifArchetypeId } from \"./types\"\n\n// Wave 3 motif 注册表:六 motif id(每主题一个)已随各自的 content 任务\n// 全部迁完,tech 的 constellation-motif 是最后一个(Wave 3 Task 22)——收紧\n// 回完整 Record,不再是 Partial 过渡态(沿用 chapter 页型在 Wave 2 收尾任务\n// 的同一模式,见 index-chapter.ts)。\nexport const MOTIF_ARCHETYPES: Record<MotifArchetypeId, MotifArchetype> = {\n \"corner-ornament-motif\": CornerOrnamentMotif,\n \"rail-motif\": RailMotif,\n \"banner-motif\": BannerMotif,\n \"poster-motif\": PosterMotif,\n \"constellation-motif\": ConstellationMotif,\n \"tone-adaptive-motif\": ToneAdaptiveMotif,\n \"campaign-motif\": CampaignMotif,\n \"bloom-motif\": BloomMotif,\n \"classroom-motif\": ClassroomMotif,\n \"ink-motif\": InkMotif,\n \"luxe-motif\": LuxeMotif,\n \"enterprise-motif\": EnterpriseMotif,\n \"heritage-motif\": HeritageMotif,\n}\n","import type React from \"react\"\nimport type { Block, PptxIR, Slide } from \"@/ir\"\nimport type { ThemeTokens } from \"../themes/tokens\"\nimport { getTheme } from \"../themes\"\nimport { CANVAS_W_PX, CANVAS_H_PX } from \"../constants\"\nimport { resolveFontStack } from \"./fonts\"\nimport type { BlockCtx } from \"./blocks/types\"\nimport type { SvgTemplateProps } from \"./archetypes/types\"\nimport { Background } from \"./Background\"\nimport { MasterChrome } from \"./MasterChrome\"\nimport { SlideDecor } from \"./SlideDecor\"\nimport {\n ImageAnnotatePage,\n ImageBottomPage,\n ImageCoverPage,\n ImageSplitPage,\n ImageTopPage,\n} from \"./ImagePages\"\nimport { getManifest, type PersonalityManifest } from \"../themes/manifest\"\nimport { COVER_ARCHETYPES } from \"./archetypes\"\nimport { CHAPTER_ARCHETYPES } from \"./archetypes/index-chapter\"\nimport { CONTENT_ARCHETYPES } from \"./archetypes/index-content\"\nimport { ENDING_ARCHETYPES } from \"./archetypes/index-ending\"\nimport { MOTIF_ARCHETYPES } from \"./archetypes/index-motif\"\nimport { cachedDeckSeed, pickBySeedRotating } from \"./variety\"\n\n/**\n * Resolve theme tokens + asset map into the render context blocks/templates use.\n * `blocks`, when passed, seeds `ctx.blockIndex` (block reference → its\n * position in that array) for wave-C S3's per-block entrance-animation\n * tagging — omit it (the default) to keep `ctx.blockIndex` undefined, which\n * is what keeps the default export path byte-identical (see `BlockCtx`'s\n * doc comment).\n */\n \nexport function buildCtx(\n tokens: ThemeTokens,\n images: PptxIR[\"assets\"][\"images\"],\n blocks?: Block[],\n): BlockCtx {\n return {\n colors: tokens.colors,\n shape: tokens.shape,\n fonts: {\n heading: resolveFontStack(tokens.fonts.heading, \"heading\"),\n body: resolveFontStack(tokens.fonts.body, \"body\"),\n mono: resolveFontStack(tokens.fonts.mono ?? [], \"mono\"),\n },\n images,\n blockIndex: blocks ? new Map(blocks.map((block, i) => [block, i])) : undefined,\n }\n}\n\nexport interface FullSlideSvgProps {\n ir: PptxIR\n slide: Slide\n index: number\n className?: string\n preserveAspectRatio?: string\n}\n\n/** 四页型 archetype 共用同一签名(archetypes/types.ts 逐个定义但结构相同)。 */\ntype PageArchetype = (p: SvgTemplateProps) => React.ReactElement\n\n/** `slide.type` → 该页型的 archetype 注册表(Wave 1-3 各自建的四张表)。 */\nconst PAGE_ARCHETYPE_REGISTRIES: Record<Slide[\"type\"], Record<string, PageArchetype>> = {\n cover: COVER_ARCHETYPES,\n chapter: CHAPTER_ARCHETYPES,\n content: CONTENT_ARCHETYPES,\n ending: ENDING_ARCHETYPES,\n}\n\n/**\n * manifest archetype 分发泛化(P2 Task 24,spec §4.2 strangler):四页型共用\n * 「查 manifest allowed set → 按 deck seed 在集合内挑一个 → 查对应页型的\n * 注册表」这段逻辑。allowed 空集返回 null(Wave 5 删旧模板后:六主题四页型\n * 已全量接线、allowed 恒非空,manifest.test「Wave 5 前置门」锁死该前提,\n * 故 null 分支不可达;保留只为类型完备与防御未来配置 bug)。salt 沿用 P1 的\n * `\"cover-archetype\"`\n * 字符串形状(`${slideType}-archetype`),对 cover 页型逐字节保持同一个\n * seed 输入,不改变既有 deck 的 archetype 选择结果。\n */\nfunction resolveArchetype(\n slideType: Slide[\"type\"],\n manifest: PersonalityManifest,\n seed: number,\n typeOrdinal: number,\n): { id: string; Component: PageArchetype } | null {\n const allowed: readonly string[] = manifest.archetypes[slideType]\n if (allowed.length === 0) return null\n // P3 Item ②:按「该页在同类型页面里的序号」轮换(pickBySeedRotating),\n // allowed 有 2+ 元素时同 deck 相邻 content 页拿到不同 archetype 打破雷同。\n // typeOrdinal=0 与 pickBySeed 起点一致,故单页型(cover/chapter/ending 通常\n // 每 deck 1 个)与单元素允许集主题行为零回归。\n const id = pickBySeedRotating(seed, `${slideType}-archetype`, allowed, typeOrdinal)\n return { id, Component: PAGE_ARCHETYPE_REGISTRIES[slideType][id] }\n}\n\n/**\n * The single source of a slide's visuals: one flat `<svg viewBox=\"0 0 1280 720\">`\n * = background + theme body + footer chrome. The preview mounts it directly; the\n * exporter serializes it and feeds svg2pptx. Same component → identical output.\n */\nexport function FullSlideSvg({\n ir,\n slide,\n index,\n className,\n preserveAspectRatio,\n}: FullSlideSvgProps) {\n const tokens = getTheme(ir.theme.id, ir.theme.override)\n const ctx = buildCtx(\n tokens,\n ir.assets.images,\n ir.meta.animation?.elements === \"auto\" ? slide.blocks : undefined,\n )\n const manifest = getManifest(ir.theme.id)\n // motif 分发(P2 Task 24→Wave5 收尾):全走 manifest.motif(六主题四页型\n // 已全量接线,旧 templates/<theme>.tsx 的 Decor 回落已随 templates 删除)。\n const Decor = manifest.motif ? MOTIF_ARCHETYPES[manifest.motif] : undefined\n let bgSpec = slide.background ?? tokens.defaultBackgrounds[slide.type]\n // 压图页接管(图片排版 polish,2026-07-09 用户反馈):cover/chapter 的\n // asset 背景 → 暗遮罩 + 白字 bespoke 版式(ImageCoverPage)——图保持清晰\n // 可辨(此前把图拉回主题底色的雾面 scrim 用户裁决太朦胧)。模板文字色是\n // baked 常量无法反色,故不走模板 Body;主题个性保留在 accent 细节。\n // 2026-07-10 custom→gallery 改造后所有主题都是设计主题,原「custom 裸\n // 背景 + 模型 overlay 直通」特判随之删除(存量 custom deck 落 gallery,\n // 压图页同享暗遮罩接管)。\n const imageCoverTakeover =\n bgSpec.kind === \"asset\" &&\n (slide.type === \"cover\" || slide.type === \"chapter\")\n // content/ending 的 asset 背景维持 P1 雾面 scrim(正文密度高,可读性优先)。\n let autoScrimColor: string | undefined\n if (bgSpec.kind === \"asset\") {\n const { overlay: _ignored, ...withoutOverlay } = bgSpec\n bgSpec = withoutOverlay\n if (!imageCoverTakeover) {\n const pageDefault = tokens.defaultBackgrounds[slide.type]\n autoScrimColor =\n pageDefault.kind === \"color\"\n ? pageDefault.value\n : pageDefault.kind === \"gradient\"\n ? pageDefault.from\n : tokens.colors.surface\n }\n }\n // 图文范式族接管(image_split/image_top/image_bottom):出血图 bespoke\n // 版式,heading 由版式自画,跳过模板 Body 防重复标题。无 image 块回落\n // 模板路径。\n const hasImageBlock = slide.blocks.some((b) => b.type === \"image\")\n const imageFamilyVariant =\n slide.variant === \"image_split\" ||\n slide.variant === \"image_top\" ||\n slide.variant === \"image_bottom\" ||\n slide.variant === \"image_annotate\"\n const splitTakeover = imageFamilyVariant && hasImageBlock\n // manifest archetype 层(P1 cover-only → P2 Task 24 泛化四页型,spec §4.2\n // strangler):允许集非空才接管(六主题四页型 Wave 5 后恒非空)。image 接管优先级更高\n // (压图页/图文版式语义不归 archetype 管,imageCoverTakeover 仅 cover/\n // chapter 生效、splitTakeover 对所有页型生效,两条优先级原样保留)。\n // 同类型页序(P3 Item ②轮换用):该页在整个 deck 同 slide.type 页面里是第\n // 几个(0 起)。content 页据此在允许集内轮换,打破同 deck 内 content 页雷同。\n let typeOrdinal = 0\n for (let i = 0; i < index && i < ir.slides.length; i++) {\n if (ir.slides[i].type === slide.type) typeOrdinal++\n }\n const archetype =\n imageCoverTakeover || splitTakeover\n ? null\n : resolveArchetype(slide.type, manifest, cachedDeckSeed(ir), typeOrdinal)\n\n return (\n <svg\n viewBox={`0 0 ${CANVAS_W_PX} ${CANVAS_H_PX}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n preserveAspectRatio={preserveAspectRatio}\n >\n <Background spec={bgSpec} images={ir.assets.images} autoScrimColor={autoScrimColor} />\n {Decor && !imageCoverTakeover && (\n <g data-decor>\n <Decor ir={ir} slide={slide} ctx={ctx} />\n </g>\n )}\n <SlideDecor ir={ir} slide={slide} index={index} ctx={ctx} />\n {imageCoverTakeover ? (\n <ImageCoverPage ir={ir} slide={slide} index={index} ctx={ctx} />\n ) : splitTakeover && slide.variant === \"image_top\" ? (\n <ImageTopPage ir={ir} slide={slide} ctx={ctx} />\n ) : splitTakeover && slide.variant === \"image_bottom\" ? (\n <ImageBottomPage ir={ir} slide={slide} ctx={ctx} />\n ) : splitTakeover && slide.variant === \"image_annotate\" ? (\n <ImageAnnotatePage ir={ir} slide={slide} ctx={ctx} />\n ) : splitTakeover ? (\n <ImageSplitPage ir={ir} slide={slide} ctx={ctx} />\n ) : archetype ? (\n <g data-archetype={archetype.id}>\n <archetype.Component ir={ir} slide={slide} index={index} ctx={ctx} />\n </g>\n ) : null /* 不可达:非 takeover 时 resolveArchetype 恒命中(六主题四页型\n allowed 全非空,manifest.test「Wave 5 前置门」锁死)。空集才返回 null,\n 渲空白而非崩溃是防御性兜底,正常运行不会到这里。 */}\n <MasterChrome ir={ir} slide={slide} ctx={ctx} />\n </svg>\n )\n}\n","import { renderToStaticMarkup } from \"react-dom/server\"\nimport type React from \"react\"\nimport { getPlatform } from \"../platform/registry\"\n\n/**\n * Serialize an SVG React tree (a full `<svg>` root) to standalone markup.\n *\n * React's server renderer omits the SVG namespace on the root element, which\n * makes the string fail to parse as `image/svg+xml`; we inject `xmlns` when the\n * component did not already provide it. This is the bridge that lets the same\n * component drive both the live preview and the svg2pptx exporter.\n */\nexport function renderSvgMarkup(node: React.ReactElement): string {\n const markup = renderToStaticMarkup(node)\n return markup.includes(\"xmlns=\")\n ? markup\n : markup.replace(/^<svg\\b/, '<svg xmlns=\"http://www.w3.org/2000/svg\"')\n}\n\n/** Parse serialized slide markup back into an `<svg>` root element for svgToOps. */\nexport function parseSvgRoot(markup: string): Element {\n const Parser = getPlatform().domParser ?? globalThis.DOMParser\n if (!Parser) {\n throw new Error(\n 'DOMParser unavailable — in Node, call installNodePlatform() from \"@liustack/pptfast/node\" first (the pptfast CLI does this automatically)'\n )\n }\n const doc = new Parser().parseFromString(markup, \"image/svg+xml\")\n const err = doc.querySelector(\"parsererror\")\n if (err) throw new Error(`failed to parse slide svg: ${err.textContent ?? \"\"}`)\n return doc.documentElement\n}\n","import JSZip from \"jszip\"\n\n/**\n * Deduplicate identical media parts in a generated .pptx.\n *\n * PptxGenJS writes one media file per addImage call (`image-<slide>-<n>.<ext>`)\n * and only dedups within a single slide — so a shared background image placed on\n * N slides is embedded N times, bloating the file. This collapses byte-identical\n * media into a single part and repoints every relationship at it (the OOXML-native\n * \"one media part, many relationships\" shape that PowerPoint itself produces).\n *\n * Defensive: any failure (e.g. a non-zip blob from a test mock) returns the\n * input unchanged so export never breaks.\n */\nexport async function dedupePptxMedia(blob: Blob): Promise<Blob> {\n try {\n const zip = await JSZip.loadAsync(await blob.arrayBuffer())\n\n const mediaFiles = Object.keys(zip.files).filter(\n (p) => p.startsWith(\"ppt/media/\") && !zip.files[p].dir,\n )\n if (mediaFiles.length < 2) return blob\n\n // 1. Hash each media part; map duplicate filenames → canonical filename.\n const byKey = new Map<string, string>() // content key → canonical path\n const remap = new Map<string, string>() // dupe basename → canonical basename\n for (const path of mediaFiles) {\n const bytes = await zip.files[path].async(\"uint8array\")\n const key = `${bytes.length}:${fnv1a(bytes)}`\n const canonical = byKey.get(key)\n if (canonical === undefined) byKey.set(key, path)\n else if (canonical !== path) remap.set(base(path), base(canonical))\n }\n if (remap.size === 0) return blob\n\n // 2. Repoint every relationship Target at the canonical media file.\n const relsFiles = Object.keys(zip.files).filter(\n (p) => p.endsWith(\".rels\") && !zip.files[p].dir,\n )\n for (const path of relsFiles) {\n let xml = await zip.files[path].async(\"string\")\n let changed = false\n for (const [dupe, canonical] of remap) {\n if (xml.includes(dupe)) {\n xml = xml.split(dupe).join(canonical)\n changed = true\n }\n }\n if (changed) zip.file(path, xml)\n }\n\n // 3. Remove the now-unreferenced duplicate media parts.\n for (const path of mediaFiles) {\n if (remap.has(base(path))) zip.remove(path)\n }\n\n // arraybuffer (not \"blob\") so this works in browser, jsdom and Node alike,\n // and is a clean BlobPart.\n const ab = await zip.generateAsync({ type: \"arraybuffer\", compression: \"DEFLATE\" })\n return new Blob([ab], {\n type: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n })\n } catch {\n return blob\n }\n}\n\nfunction base(p: string): string {\n return p.slice(p.lastIndexOf(\"/\") + 1)\n}\n\n/** FNV-1a 32-bit over bytes; paired with byte length as the dedup key. */\nfunction fnv1a(bytes: Uint8Array): string {\n let h = 0x811c9dc5\n for (let i = 0; i < bytes.length; i++) {\n h ^= bytes[i]\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(16)\n}\n","/**\n * PPTX generator v3 — single-source SVG.\n *\n * Every slide is rendered by `FullSlideSvg` (the same component the preview\n * mounts) into one flat 1280×720 SVG, then converted to native pptxgenjs objects\n * by svg2pptx. Preview and export therefore share one visual source and cannot\n * drift. The only native object kept is the dynamic slide number (on the master).\n */\nimport type pptxgen from \"pptxgenjs\"\nimport { PptxIRSchema, type PptxIR } from \"@/ir\"\nimport { inlinePptxAssets } from \"../platform/inline-assets\"\nimport { getTheme } from \"@/themes\"\nimport { defineMastersForIR } from \"./master-builder\"\nimport {\n renderOps,\n applyGradientFills,\n type GradientFillPatch,\n} from \"./svg2pptx/render\"\nimport { slideToOps } from \"@/svg/render-slide\"\nimport { dedupePptxMedia } from \"./pptx-dedupe-media\"\nimport { applySlideTransitions, applyElementAnimations } from \"./pptx-animations\"\n\nexport async function generatePptxBlob(input: PptxIR): Promise<Blob> {\n // `kind` is an optional file-type discriminator some callers attach to the\n // IR (e.g. `{ kind: \"pptx\", ...IR }`), not an IR field — the strict\n // PptxIRSchema rejects unrecognized keys, so strip it before the strict\n // parse rather than failing every caller that includes it.\n const { kind: _kind, ...irInput } = input as PptxIR & { kind?: unknown }\n // 导出需要真实字节:把签名 URL 资产取回内联成 data URL(预览不需要这一步)\n const ir = await inlinePptxAssets(PptxIRSchema.parse(irInput))\n\n const PptxGenJS = (await import(\"pptxgenjs\")).default\n const pptx: pptxgen = new PptxGenJS()\n\n pptx.defineLayout({ name: \"LAYOUT_WIDE\", width: 13.33, height: 7.5 })\n pptx.layout = \"LAYOUT_WIDE\"\n\n const tokens = getTheme(ir.theme.id, ir.theme.override)\n defineMastersForIR(pptx, tokens)\n\n const gradientPatches: GradientFillPatch[] = []\n ir.slides.forEach((slide, index) => {\n const s = pptx.addSlide({ masterName: slide.type })\n gradientPatches.push(...renderOps(s, slideToOps(ir, slide, index), index))\n })\n\n const rawBlob = (await pptx.write({ outputType: \"blob\" })) as Blob\n // pptxgenjs itself has no gradient-fill API (render.ts, vc-task-6 pre-check\n // A): every gradient shape above was written with a solid placeholder fill\n // plus a unique objectName. Patch the real `<a:gradFill>` back in now that\n // the whole presentation has been serialized to a zip.\n const gradientBlob = await applyGradientFills(rawBlob, gradientPatches)\n // Deck-level page-transition switch (wave-C S1/S2): default fade unless\n // meta.animation.transition overrides it (\"none\" skips injection). Runs\n // right after the gradient patch — both touch the same `ppt/slides/*.xml`\n // parts, so grouping them keeps slide-XML patches adjacent; ordering\n // relative to the media dedupe pass below is otherwise inert, since dedupe\n // only ever touches `ppt/media/*` and `*.rels` parts.\n const transitionBlob = await applySlideTransitions(\n gradientBlob,\n ir.meta.animation?.transition ?? \"fade\"\n )\n // Per-block entrance animations (wave-C S3): opt-in only, default off.\n // `renderOps` above only tagged shapes with a `blk{slideIndex}-{blockIndex}`\n // objectName marker when `elements === \"auto\"` (`FullSlideSvg` only builds\n // `ctx.blockIndex` in that case — see `BlockCtx`'s doc comment), so calling\n // `applyElementAnimations` is gated the same way here: every other deck\n // skips this JSZip pass entirely, keeping the default export path exactly\n // what it was before this feature existed.\n const elementAnimBlob =\n ir.meta.animation?.elements === \"auto\"\n ? await applyElementAnimations(\n transitionBlob,\n ir.slides.map((slide) => slide.blocks.map((block) => block.type))\n )\n : transitionBlob\n // Collapse identical embedded media (e.g. a shared background image) to one part.\n return dedupePptxMedia(elementAnimBlob)\n}\n","/**\n * 安全内容预算(容量表)。由 1280×720 页面几何推导,是前端 ir-quality\n * 质量门与后端 pptx_create 内容 lint(ops-kb,计划二 A-2)的共同数值来源。\n * 修改任何渲染几何常量(templates/*.tsx 的 rect、layout.ts 的 GAP、\n * blocks 内的字号/行高)后必须复核本表,并同步交接文档\n * `.issues/plans/pptx-capacity-table.md`。\n *\n * 核实过的几何输入(执行时勿凭记忆重猜):\n * - 页面像素↔英寸换算 96px = 1in(`constants.ts` PX_PER_IN,\n * 1280×720px = 13.333×7.5in)。\n * - 内容区最窄矩形:`custom.tsx` `CustomContent` 背景图态\n * (`withBg` 分支)最窄:`{ w: 1096, h: 400 }`(其余:custom 白底态\n * 1152×420|460、creative 1168×380|400|420|460)。academic 已随\n * Task 2 换骨改为编号导轨式(见下),不再是 1120×380|400 的贡献者。\n * ikb-swiss/anthropic-clay 已随主题换骨硬删(Task 5),不再计入。\n * tech 走卡片拼盘(`bento-layout.ts`),不经\n * `layoutContentFit`/两栏切分,不引入比 1096 更窄的矩形,同样不改变本表。\n * - **consulting 结论横幅式换骨(Task 1,2026-07-06)**:Content 页改为\n * `MckinseyNavyContent`(`consulting.tsx`)——顶部一条 `x=96 w=1088` 的\n * filled 断言横幅(1 行标题高 88px / 2 行 132px),`SvgContent` 内容矩形随\n * 横幅高度下移,`y = 横幅底 + 32`,底边固定 620,故 `h` 在 384px(2 行\n * 横幅)~428px(1 行横幅)之间——不再有 `contentH = footnote ? 380 : 400`\n * 的按 footnote 收窄分支(来源行改为固定 y=648 的细线 + 线下 footnote,\n * 与内容矩形高度解耦)。宽度 1088 比本表此前引用的最窄矩形 custom 1096\n * 更窄 8px,two_column 单列会算出 `(1088 - 32) / 2 = 528px`(比下面基准\n * 532px 更窄,但仍宽于 magazine 已验证过的 424px)——沿用与\n * magazine 相同的结论:`audit-baseline.test.ts` 对 consulting 在\n * 新 528px 单列下跑全部压力 fixture(含 `bullets`/`chart` 的 `two_column`\n * 变体)零溢出门 100% 通过,证明动态缩字号/换行/截断已经兜住,不需要为\n * 这一更窄场景收紧本表任何常量。高度上界(384px)仍不小于本表其余数字所\n * 依赖的 380px 基准(该基准现由 academic 单独提供,见下),故\n * `maxBlocksPerSlide`/`bullets.maxItems` 均不受影响。\n * - **magazine 窄栏复核(Task 6,2026-07-06 已做)**:内容栏刻意收窄到\n * 880(`magazine.tsx` `COLUMN_W`,杂志窄栏版式),且 `variant` 原样\n * 透传给 `SvgContent`——`two_column` 页会把这 880 再按下面的\n * `(rect.w - COLUMN_GAP) / 2` 切成两栏,得到 `(880 - 32) / 2 = 424px`,比\n * 下面 two_column 单列基准 532px 更窄。已用 `audit-baseline.test.ts` 的\n * `bullets`/`chart` 压力 fixture(均含 `two_column` 变体)在新 6 主题矩阵\n * 下对 magazine 实测:零溢出门 48/48 全绿,证明 424px 下\n * `fitSvgLine`/`layoutSvgText` 的动态缩字号 + 换行 + 截断已经兜住渲染安全,\n * 不依赖本表的经验值。**结论:不收紧 `bullets.maxUnitsPerItem`**——\n * `ir-quality.ts` 消费该常量时是主题/版式无关的单一 flat 阈值(判断时既不\n * 知道块最终落在 single 还是 two_column,也不知道目标主题),为\n * magazine 一个主题的 two_column 分支把它收紧到 42\n * (`floor(424 / 20 * 2)`),会让其余 5 套主题的 single 变体(880/1096\n * 全宽)在完全不需要的地方多报 `bullet_item_long` 警告——用渲染期已验证\n * 兜底的安全,换一个只在极端主题×版式组合下才有意义的更紧软警告阈值,不\n * 划算。若未来要做主题感知的精确预算,应先把 `ir-quality.ts` 改造成按\n * `(theme, variant)` 查表,而不是在这里硬调一个全局数字。\n * - 内容区最窄高度(含 footnote 时收窄):academic 此前的\n * `contentH = slide.footnote ? 380 : 400` → 380px 已随 Task 2 换骨废弃\n * (改为编号导轨式:`SvgContent` 矩形 `y = 标题末行 + 36`、`h = 640 - y`,\n * 标题与徽章行垂直居中在固定枢轴 `BADGE_CENTER_Y` 上)。**Fix wave 1\n * (2026-07-06,见 templates/academic.test.tsx 同批断言)**:编号徽章\n * `BADGE_Y` 从 64 下移到 96(避让 MasterChrome 左上 logo 带 x 64-160 /\n * y 48-88),`BADGE_CENTER_Y = BADGE_Y + BADGE_H/2` 随之从 80 变为\n * 112——最坏场景仍是 2 行标题、`minPt = 24`:\n * `lineHeight = round(24 * 1.08) = 26`,`headingFudge = round(24 * 0.32)\n * = 8`,`titleLastY = 112 + (2-1)*26/2 + 8 = 133`(原 101),\n * `h = 640 - (133 + 36) = 471px`(原 503px)——仍远高于 380px,不再贡献\n * 这一基准的结论不变。consulting 同样已随 Task 1 换骨改为横幅\n * 行数驱动的 384~428px(见上)。**380px 基准现仅由 creative 提供**\n * (该主题未随本轮换骨改动,仍是 `contentH` 公式最窄的贡献者),下面依赖\n * 此基准的常量(`maxBlocksPerSlide`/`bullets.maxItems`)不受影响。\n * - two_column 单列宽 `(rect.w - COLUMN_GAP) / 2`,`COLUMN_GAP = 32`\n * (`layout.ts`),代入最窄 rect.w=1096 → `(1096 - 32) / 2 = 532px`。\n * - `BLOCK_GAP = 16`(`layout.ts`,`stackFrom` 块间距)。\n *\n * **Task 5 副题句复核(2026-07-07)**:六套主题的 content 页新增消费\n * `slide.subheading`——有副题句时 contentH 再减一个「slot」(22px 行高 +\n * 与标题间距,见各 `templates/*.tsx` 的 `SUBHEADING_SLOT`\n * /`SUBHEADING_SLOT_STACKED`)。按 emerald 教训「最坏推导方向=按最大字号算」\n * (一个标题恰好换行到 2 行、而不是靠 minPt 兜底截断时,用的是未收缩的声明\n * 字号——此时 `lineHeight` 最大,对内容区的挤占也最狠,不是直觉上的\"字越小\n * 行越挤\")逐主题复核 titleLastY→内容区推导(用 `fitHeadingLines` 实测二分\n * 找出\"恰好 2 行仍是满字号\"的最长文本验证过每个数字,而非手算假设):\n * - consulting:`bannerH` 是 1/2 行的固定字面量(88/132px),不随字号\n * 变化,无最大字号歧义。2 行横幅 + 副题句最坏:\n * `h = 620 - (72+132+32+38) = 346px`。\n * - academic:`headingFudge`/`lineHeight` 都随 `heading.fontSize` 走,\n * 最大字号(40pt,而非下面 fix-wave 注释沿用的 `minPt=24`)下 2 行:\n * `lineHeight=round(40*1.08)=43`,`headingFudge=round(40*0.32)=13`,\n * `titleLastY=112+43/2+13=146.5`。+ 副题句:\n * `h=640-(146.5+36+45)=412.5px`。\n * - creative(降级堆叠分支):2 行标题最大字号 50pt(非 minPt 26)\n * 下 `lineHeight=54`。+ footnote + 副题句最坏:\n * `h=max(120,420-54-46)=320px`。\n * - magazine:2 行标题最大字号 60pt 下 `lineHeight=65`。+ 副题句:\n * `h=640-(190+65+40+68)=277px`——六主题中最紧。\n * - custom 白底态:2 行标题最大字号 46pt 下 `lineHeight=50`。+ footnote +\n * 副题句最坏:`h=max(120,420-50-46)=324px`。\n * - custom 背景图态:2 行标题最大字号 44pt 下 `lineHeight=48`。+ 副题句:\n * `h=max(120,400-48-46)=306px`。\n * - tech:不走本文件的线性堆叠预算模型(见上,网格布局靠真实渲染\n * 零溢出验证,不是公式推导)。2 行标题最大字号 44pt 下 `lineHeight=48`。\n * + 副题句:`h=640-(150+48+36+46)=360px`——仅供参考,不影响下面任何\n * 常量。\n *\n * **S3b 复核(2026-07-07)**:波次 B 统一了六主题的副题句基线公式\n * (`subheadingY = titleLastY + 22 + 14 + round(0.12*titleFontSize)`,见\n * 各 `templates/*.tsx` 自己的 S3b 注释),随基线偏移增量同步调整了对应\n * slot(34px → 各主题新值,见上)——上面每条推导已按新 slot 重算,`h` 全部\n * 比 Task 5 落地时的数字更紧(因为 slot 变大,挤占内容区的量也变大)。\n * consulting 是唯一的基线不变来源不同的例外:它的副题句锚定横幅底边\n * (无字形 descent),S3b 把 `bannerBottom+20` 改为 `+24`(flat +4,非\n * 公式推导),slot 同步从 34 到 38。\n *\n * **S3b 二次修正(同日,真机复核发现)**:creative(降级分支)与\n * magazine 的副题句都用 `fonts.heading`(衬线字体)而非其余四套主题\n * 用的 `fonts.body`(无衬线)——\"0.12×字号\" 的字形底近似是按 body 衬线字体\n * 校准的,衬线字体的真实字形 descent 远超这个假设(真机 getBBox 实测:\n * magazine 的 SimSun 系字体 descent 比例 ≈0.34×字号,creative\n * 的 Georgia/Songti SC 回退栈 ≈0.22×字号),首轮按通用公式套出的\n * magazine +44、creative +42 在真机两行标题场景下副题句仍贴字形\n * (实测间隙 0-5px,远低于 14px 目标,即用户两次截图复现的 bug)。已按\n * 真实测量重新校准:magazine → +64(slot 34→68),creative\n * 降级分支 → +50(slot 34→46,`SUBHEADING_SLOT_STACKED`,与该主题海报分支\n * 自己不变的 `SUBHEADING_SLOT`=34 分离,因为海报分支基线本轮不动,且海报\n * 分支的 +46 早先已用真机验证过)。上面「按最大字号」的两条推导已按二次\n * 修正后的 slot(46/68)重算。\n *\n * **复核顺带发现的既有偏差(非 Task 5/S3b 引入,如实记录,不在本次改动范围内\n * 回填)**:本文件此前称「380px 基准现仅由 creative 提供」,但按上面\n * 同一套「最大字号」方向重算(而非该分支自己隐含的 minPt 假设)显示:\n * creative 降级分支不带副题句时的真实最坏值是 366px(非 380px),且\n * magazine 不带副题句时已是 345px——比 380px 更紧,此前从未被计入\n * 「最窄矩形」候选。换言之「380px」这个历史基准本身已不准,Task 5 复核\n * titleLastY→内容区推导时顺带发现,留给专门复核本文件的后续任务处理(下面\n * 按新真实最坏值 277px 重算的下游常量结论不受这处历史偏差是否回填影响)。\n *\n * **按新真实最坏值(277px,magazine + 副题句,S3b 二次修正——原\n * Task 5 数字是 311px,S3b 首轮误算为 297px)复核下游常量**:\n * - `maxBlocksPerSlide`:`floor(277/80)=3`(原按 380 算得 4,与 Task 5 时\n * 的 311px 结论相同,仍是 3)\n * - `bullets.maxItems`:`floor(277/64)=4`(原按 380 算得 5,与 Task 5 时\n * 的 311px 结论相同,仍是 4)\n * - `citation.maxSources`:`floor(277/28)=9`(原按 380 算得 13,S3b 首轮\n * 误算按 297px 得 10,二次修正后再收紧 1 到 9)\n * 三者理论上都会收紧,但本任务不在这次改动里下调这三个常量,理由:\n * 1. 它们是 IR 层的软预算/lint 提示,真正的渲染期安全网是\n * `layoutContentFit` 的间距收紧+丢块兜底、以及 `fitSvgLine`/\n * `layoutSvgText` 的动态缩字号/截断,取值宽松不会导致真实溢出——\n * `citation.tsx` 是例外,见下。\n * 2. 本任务的零溢出真机门与 svg 全量 vitest 套件已跑过,正是本文件\n * 一贯依赖的\"用真实渲染验证、不依赖表内经验值\"方法论(参见上面\n * magazine/consulting 两轮复核的同一结论句式)。\n * 3. 下调是一次跨主题、跨场景的 `ir-quality.ts` lint 阈值变更,影响面覆盖\n * 所有主题的所有内容页(不止带副题句的),应作为独立评审的任务,不\n * 适合作为模板几何任务的隐性副作用捎带下调。\n * `citation.maxSources` 例外说明:`citation.tsx` 逐条按整块计量\n * (`sources.length * ROW`),不像 `bullets`/`paragraph` 那样有单块内动态\n * 换行/截断兜底——13 条源在 277px 预算下会被 `layoutContentFit` 判定整块\n * 不 fit,触发丢块保护(不会溢出,但可能比预期更早丢内容,见 `layout.ts`\n * 的 `layoutContentFit` 丢块分支)。如实记录,是否收紧留给后续任务判断。\n *\n * **S3c 标点权重复核**:`svg-text-layout.ts` 的 `measureTextUnits` 把\n * U+2014(em dash)与 U+2018 到 U+201F(引号子区段)从「其他」0.46 权重\n * 改判为 CJK 满宽 1.0(这两个子区段此前不在 `WIDE_CHAR_RE` 里,其余「CJK\n * 标点区段」——U+3000 到 U+303F、U+FF00 到 U+FFEF——其实早已覆盖,权重本就是\n * 1.0,未受本次改动影响,见该文件 `WIDE_CHAR_RE` 自己的注释)。逐条复核本表\n * 是否有推导依赖旧的 0.46:\n * - `headingMaxChars`(48):走 `heading-fit.ts` 自己的 `visualUnits`\n * (CJK 权重 1.2),与 `measureTextUnits` 是两套独立权重表(见上方推导\n * 注释原文),不受影响。\n * - `bullets.maxUnitsPerItem`(53):推导假设「纯 CJK 场景」(权重 1.0\n * 早已是满权重,不是 0.46 那档),不受影响。\n * - `kpi.valueMaxChars`(9)/`kpi.labelMaxUnits`(15):分别走数字权重\n * 0.56 与原始 units(未除以任何权重),都不是 0.46 那档,不受影响。\n * - `iconCards.titleMaxUnits`(18)/`textMaxUnits`(44)、\n * `steps.titleMaxUnits`(7)/`textMaxUnits`(30)、\n * `verdictBanner.textMaxUnits`(175):推导用的是「代表性权重」\n * (纯 CJK 1.0、数字/字母 0.56、混排折中 0.64),同样都不是 0.46 那档,\n * 算术上不需要重推。但这五个值建模的现实文本(断言短句/说明句/结论句)\n * 一旦真的夹带 em dash 或引号,运行时 `measureTextUnits` 现在会比这里\n * 假设的代表性权重多算一些——不影响安全性,因为这五个值本就是「未接入\n * `ir-quality.ts` 校验的软预算」(见各自推导注释),真正兜底渲染安全的\n * 是 `iconCards.tsx`/`steps.tsx`/`verdict-banner.tsx` 各自调用\n * `fitSvgLine`/`layoutSvgText`/`truncateEmphasisSegments` 时用的\n * 运行时权重(本就已经是修正后的新值),不是本表的经验估算。\n * - 结论:本表五个既有 units 数字都不需要因本次改动重新推导;已用\n * `pnpm exec vitest run src/modules/knowledge/chat/generated-file`\n * (909 用例 / 85 文件,含本文件覆盖的 `iconCards`/`steps`/\n * `verdictBanner` 各自 block 测试)与零溢出双门验证过修正后的估算器\n * 不引入新的渲染期溢出。\n * - **ops-kb 联动缺口(如实记录,本任务未跨仓修复)**:\n * `ops-kb/src/ops_kb/services/tools/pptx_create/content_lint.py` 的\n * `measure_text_units` 逐字符镜像了旧版 `WIDE_CHAR_RE`(其自身注释明确\n * 写着「mirrors frontend measureTextUnits char-for-char」),本次改动后\n * 该 Python 镜像仍按旧权重把 em dash/引号计成 0.46——即含这两类字符的\n * 文本,ops-kb 的 `lint_ir`/`lint_ir_warnings`(`_BULLETS_MAX_UNITS_\n * PER_ITEM`/`_KPI_LABEL_MAX_UNITS`/`_ICON_CARDS_*`/`_STEPS_*`/\n * `_VERDICT_BANNER_TEXT_MAX_UNITS` 各处调用点)会比前端实际渲染宽松\n * (低估真实宽度)。方向上是「偏松」而非「偏紧拒绝合法内容」,且前端自身\n * 的动态 fit 链仍是渲染安全的最终兜底,不构成安全回归,但两侧数值已经\n * 出现漂移,需要后续任务把这两个字符区段同步进 Python 侧的\n * `_WIDE_CHAR_RE`。\n *\n * **S3e 标点权重复核(`heading-fit.ts` 自己的独立权重表)**:`heading-\n * fit.ts` 的 `visualUnits`(`fitHeadingPt` 用)同样把 U+2014/U+2018 到\n * U+201F 从「其他」0.56 权重改判为 CJK 满宽 1.2(该文件 `CJK_WIDE` 自己的\n * 注释)——与上面 S3c 复核的 `measureTextUnits` 是完全独立的两套权重表\n * (权重值本身也不同:1.2 vs 1.0,见本表下方 `headingMaxChars` 自己的推导\n * 注释),互不影响。复核 `headingMaxChars`(48):其推导已经假设「全 CJK」\n * 场景(即每个字符都已经是 1.2 满权重),本次改动只是把此前被误判为「其他」\n * 0.56 档的两个标点子区段挪进 1.2 档,不改变 1.2 这个值本身,故推导公式\n * `floor(58.71 / 1.2) = 48` 不受影响,无需重算。另外,`fitHeadingPt`/\n * `visualUnits` 目前不被任何 `templates/*.tsx` 消费(六套模板的标题渲染\n * 全部走 `fitHeadingLines`→`layoutSvgText`→`measureTextUnits`,S3c 已修),\n * 只被本文件的 `headingMaxChars` 推导注释与 `heading-fit.test.ts` 直接测试\n * 消费——本次改动因此不改变任何模板的实际换行/缩字号渲染结果(已用\n * `pnpm vitest run src/modules/knowledge/chat/generated-file` 全量验证零\n * 回归),纯粹是权重表自身的一致性修正。\n */\nexport const CAPACITY = {\n /**\n * `fitHeadingPt`(heading-fit.ts)地板 `minPt = 28`、最窄可用宽\n * 1096px ≈ 11.4167in(96px=1in)、预算 2 行:\n * maxVisualUnits = 72 * 11.4167in * 2行 / 28pt ≈ 58.71\n * `ir-quality.ts` 的 `charLen()` 按 `.length` 计数(不区分中英文宽度),\n * 用 heading-fit.ts 自身的 CJK 权重 1.2 单位/字(`visualUnits`,与\n * svg-text-layout.ts 的 `measureTextUnits` 不同,那个 CJK 权重是 1.0)\n * 换算最保守(全 CJK 标题)场景下的字数上限:\n * headingMaxChars = floor(58.71 / 1.2) = floor(48.93) = 48\n */\n headingMaxChars: 48,\n /**\n * 内容页 blocks 上限。假设每块最小可读高度为「2 行体文字」(呼应下方\n * bullets 的 2 行预算)+ 块间距 `BLOCK_GAP = 16`:\n * perBlock = 2 * LINE_HEIGHT(32) + BLOCK_GAP(16) = 80px\n * maxBlocksPerSlide = floor(minRectH(380) / 80) = floor(4.75) = 4\n *\n * 这个推导假设的是「单列竖直堆叠」几何(每块占满宽度、纵向叠加),对 5 套\n * 线性堆叠主题(consulting/academic/creative/custom/\n * magazine)成立。\n *\n * **tech 主题差异(Task 4 拼盘扩容复核,2026-07-06)**:tech\n * 的 Content 页不走线性堆叠,而是 `layoutBento`(`bento-layout.ts`)把\n * blocks 摆成 3x2/3+2 网格(`BentoTechContent`,`templates/tech.tsx`),\n * 上面「每块 80px 竖直叠加」的推导对它不成立——网格允许多块并排。已用真实\n * 渲染 + `auditSvgMarkup` 零溢出核验(`templates/tech.test.tsx`):\n * 5 个普通段落块(3+2 网格,非 kpi_cards 展开)与 6 个普通段落块/6 个短\n * bullets 块(3x2 网格)均零溢出通过、且真实渲染为 panel 卡片网格(非降级\n * 兜底)。超出网格容量(>6 units)或单卡内容超预算时\n * `BentoTechContent` 会整页降级为单栏堆叠(`cellOverBudget`/`degraded`\n * 门,同样有测试覆盖),所以 6 不是「盲目放宽」,而是有渲染期兜底的真实\n * 上限。因此 `maxBlocksPerSlideOverrides` 下面为 tech 单独把\n * `ir-quality.ts` 的密度检查阈值从 4 提到 6,其余主题不变。\n *\n * **注意(IR block ≠ bento unit)**:`explodeIntoUnits`\n * (`bento-layout.ts`)会把一个 `kpi_cards` block 炸开成 N 个 kpi-item\n * unit,所以 bento 的真实网格容量(6 units)和这里检查的 IR\n * `slide.blocks.length` 不是同一个量纲——只有在没有 kpi_cards 块(或\n * kpi_cards 恰好 1 项)时两者才 1:1。这里的 6 只覆盖「blocks.length ==\n * units.length」这一常见情况,kpi_cards 展开后 units 更多的场景本就不受\n * 这个 IR 层面的密度检查约束(它数的是 blocks,不是 units)。\n *\n * **后端联动**:本表文件头声明是前端 ir-quality 与后端 pptx_create 内容\n * lint(ops-kb)的共同数值来源——若 ops-kb 真的直接引用这个 4,需要同步\n * 补一条 tech 例外分支到 6,否则后端会对合法的 5~6 块 tech\n * 页面重复报警/拒绝(本次改动只落地了前端 `ir-quality.ts` 一侧)。\n *\n * **Task 5/S3b 副题句复核**:新最坏 minRectH(277px,magazine +\n * 副题句,S3b 二次修正——原 Task 5 数字是 311px)按同一公式会把这个 4 降到\n * 3(三轮结论相同)——本次改动不下调,理由见文件头顶部大注释「按新真实\n * 最坏值复核下游常量」一节。\n */\n maxBlocksPerSlide: 4,\n /**\n * 按主题覆盖 `maxBlocksPerSlide`(`ir-quality.ts` 的 `checkSlide` 查此表,\n * 查不到的主题回退到上面的 flat 4)。目前只有 tech 需要覆盖,见上方\n * 推导。\n */\n maxBlocksPerSlideOverrides: {\n \"tech\": 6,\n } as Record<string, number>,\n bullets: {\n /**\n * `bullets.tsx` 当前逐条单行堆叠(`LINE_HEIGHT = 32`,条目间无额外\n * 间距,pre-fix 状态)。预算假设每条最坏情况占 2 行——呼应后续换行\n * 修复(同计划 Task 7 `layoutSvgText maxLines: 2`)将带来的排版,而非\n * 当前单行渲染:\n * perItem = 2 * LINE_HEIGHT(32) = 64px\n * maxItems = floor(minRectH(380) / 64) = floor(5.94) = 5\n * 注:早期草案曾拍 ≤6(`.issues/plans/2026-07-05-pptx-two-stage-and-\n * render-hardening.md` §2.2「一页一观点」guess),6 条 × 64px = 384px\n * 已超出最窄高度 380px(含 footnote 场景),按最窄高度严格核算收窄到\n * 5——后端 A-2 lint 须采用本值而非旧草案数字。\n *\n * **Task 5/S3b 副题句复核**:新最坏 minRectH(277px,S3b 二次修正——原\n * Task 5 数字是 311px)会把这个 5 降到 `floor(277/64)=4`(三轮结论\n * 相同)——本次改动不下调,理由见文件头顶部大注释「按新真实最坏值复核\n * 下游常量」一节。\n */\n maxItems: 5,\n /**\n * 单列最窄宽 532px(two_column,见上)、字号 20、预算 2 行:\n * maxUnits = floor(532 / 20 * 2) = floor(53.2) = 53\n * 用 `measureTextUnits`(svg-text-layout.ts,CJK 权重 = 1.0)计量,\n * 纯 CJK 场景下 ≈ 53 字等价。\n */\n maxUnitsPerItem: 53,\n },\n kpi: {\n /**\n * `kpi_focus` 变体单行铺满最窄 rect.w=1096(`layout.ts` kpi_focus 分支\n * 用 `rect.w` 整体传给 stackFrom),4 卡沿用既有约定(Task 3 压力\n * fixture `kpi_focus 1 页 4 卡`,`audit/stress-fixtures.ts`):\n * cardW = (1096 - GAP(16) * (4-1)) / 4 = 1048 / 4 = 262px\n */\n maxItems: 4,\n /**\n * value 字号 40(`kpi.tsx`),左侧留 20px 内边距(`x = cardX + 20`),\n * 右侧对称预留 20px(给可能的 unit tspan/卡片边距):\n * 可用宽 = 262 - 40 = 222px\n * maxUnits = 222 / 40 = 5.55\n * 数字权重 0.56/字(`measureTextUnits` 的 digit 权重):\n * valueMaxChars = floor(5.55 / 0.56) = floor(9.91) = 9\n */\n valueMaxChars: 9,\n /**\n * label 字号 16(`kpi.tsx`),仅左侧留 20px(`x = cardX + 20`,label 无\n * 尾随 tspan,不需对称右侧预留):\n * 可用宽 = 262 - 20 = 242px\n * labelMaxUnits = floor(242 / 16) = floor(15.125) = 15\n */\n labelMaxUnits: 15,\n },\n /**\n * `citation.tsx` 每条源单行堆叠,行高 `ROW = 28`,无额外间距,且不参与\n * 换行修复(后续修复仅缩字+截断,行数不变)。按最窄内容区高度整段占满\n * 估算物理可放条数(该值是物理上限,不代表「设计建议」条数——citation\n * 块通常与标题/其他块共页,实际可用高度更小,由 `maxBlocksPerSlide` 与\n * 「一页一观点」设计原则另行约束):\n * maxSources = floor(minRectH(380) / 28) = floor(13.57) = 13\n *\n * **Task 5/S3b 副题句复核**:新最坏 minRectH(277px,S3b 二次修正——原\n * Task 5 数字是 311px)会把这个 13 降到 `floor(277/28)=9`(比 Task 5\n * 时的 11 又收紧了 2)——本次改动不下调,理由见文件头顶部大注释「按新\n * 真实最坏值复核下游常量」一节。这一个例外不只是「更保守而已」:\n * citation.tsx 整块计量、无块内截断兜底,13 条在 277px 预算下会被\n * `layoutContentFit` 判定整块不 fit 而触发丢块保护(不会溢出,但可能比\n * 预期更早丢内容)。\n */\n citation: { maxSources: 13 },\n /**\n * `blocks/icon-cards.tsx`(Task 2,2026-07-07)。items 等宽横排,\n * `cardW = (w - GAP(16) * (n-1)) / n`——n 越大卡越窄,最坏情况是 schema\n * 允许的上限 `n=4`:取全宽内容区最窄场景 `w=1088`(同本文件其余行的\n * \"内容区最窄矩形\" 基准):\n * cardW = (1088 - 16*3) / 4 = 1040 / 4 = 260px\n * `title`/`text` 的 `maxWidth` 都是 `卡宽 - PAD_X(24)*2 = 260 - 48 = 212px`\n * (`icon-cards.tsx` `PAD_X`)。\n *\n * title(`fitSvgLine`,字号 20,minFontSize 14):先按未收缩字号折算\n * \"原始 units\"(1 unit ≈ 1 个 fontSize 宽字符):\n * rawUnits = 212 / 20 = 10.6\n * 断言短句常是中英文混排的紧凑短语(而非纯 CJK 陈述句),比照\n * `kpi.tsx`/本文件 `kpi.valueMaxChars` 对数字/字母内容的权重换算方式\n * (`measureTextUnits` 的小写字母/数字权重 0.56/字),把 rawUnits 换算成\n * \"等效字符数\":\n * titleMaxUnits = floor(rawUnits / 0.56) = floor(18.93) = 18\n *\n * text(`layoutSvgText`,字号 15,2 行,行高 21):同样先取原始 units:\n * rawUnits = (212 / 15) * 2行 = 28.27\n * \"说明\" 是较长的自然语言短句,中英文混排比例通常比 title 更偏 CJK,\n * 取纯 CJK 权重(1.0,`measureTextUnits` WIDE_CHAR)与纯数字/字母权重\n * (0.56)之间的折中权重 0.64(两者的粗略中点,偏向 CJK 一侧):\n * textMaxUnits = floor(rawUnits / 0.64) = floor(44.17) = 44\n *\n * 这两个「units 上限」都是软预算(当前未接入 `ir-quality.ts` 校验,\n * 仅供后续内容 lint / 后端 pptx_create 参考)——`icon-cards.tsx` 自身的\n * `fitSvgLine`/`layoutSvgText` 已经用动态缩字号/截断兜底渲染期不溢出,\n * 这里的数字不是渲染安全的硬约束。\n */\n iconCards: { maxItems: 4, titleMaxUnits: 18, textMaxUnits: 44 },\n /**\n * `blocks/steps.tsx`(Task 3,2026-07-07)。横排模式 items 等宽卡片,卡间留\n * `GAP(40)` 作箭头走廊——`cardW = (w - 40*(n-1)) / n`,n 越大卡越窄,最坏\n * 情况是 schema 允许的上限 `n=5`:取全宽内容区最窄场景 `w=1088`(同本文件\n * 其余行的\"内容区最窄矩形\"基准):\n * cardW = (1088 - 40*4) / 5 = 928 / 5 = 185.6px\n * `title`/`text` 的 `maxWidth` 都是 `卡宽 - PAD_X(24)*2 = 185.6 - 48 = 137.6px`\n * (`steps.tsx` `PAD_X`,与 `icon-cards.tsx` 同值)。低于 `MIN_CARD_W(180)`\n * 时切换纵排——`n=5` 恰好卡在临界点(`5*180+4*40=1060`,仅当 `w<=1060`\n * 才会纵排),本行按横排最坏场景估算,纵排走全宽文本列不受这里的窄卡宽\n * 约束(详见 `steps.tsx` `TEXT_X_VERTICAL`)。\n *\n * title(`fitSvgLine`,字号 18,minFontSize 13):先按未收缩字号折算\n * \"原始 units\":\n * rawUnits = 137.6 / 18 = 7.64\n * 步骤标题是极短的中文动宾短语(如\"注册账号\"\"发布上线\"),比 icon_cards\n * 的\"断言短句\"更纯粹是 CJK(不倾向夹杂数字/字母),取纯 CJK 权重\n * (1.0,`measureTextUnits` WIDE_CHAR):\n * titleMaxUnits = floor(rawUnits / 1.0) = floor(7.64) = 7\n *\n * text(`layoutSvgText`,字号 14,2 行,行高 20):同样先取原始 units:\n * rawUnits = (137.6 / 14) * 2行 = 19.66\n * \"说明\"同 icon_cards 的判断——较长的自然语言短句,中英文混排比例通常比\n * title 更偏 CJK,取同一折中权重 0.64:\n * textMaxUnits = floor(rawUnits / 0.64) = floor(30.71) = 30\n *\n * 同 iconCards 行——这两个「units 上限」都是软预算(当前未接入\n * `ir-quality.ts` 校验,仅供后续内容 lint / 后端 pptx_create 参考)——\n * `steps.tsx` 自身的 `fitSvgLine`/`layoutSvgText` 已经用动态缩字号/截断/\n * 纵排降级兜底渲染期不溢出,这里的数字不是渲染安全的硬约束。\n */\n steps: { maxItems: 5, titleMaxUnits: 7, textMaxUnits: 30 },\n /**\n * `blocks/verdict-banner.tsx`(Task 4,2026-07-07)。页级结论条,恒定全宽\n * 渲染——不像 icon_cards/steps 那样按 items 数切分等宽卡(这里没有 items\n * 数组,只有一条 `text`),直接取本文件\"内容区最窄矩形\"基准 `w=1088` 作为\n * 推导输入(brief 明确要求按全宽推导;IR 理论上仍可能被塞进 two_column\n * 半宽列,但那是渲染期由 `layoutSvgText`/`truncateEmphasisSegments` 兜底的\n * 安全问题,不是这里要建模的软预算——同 iconCards/steps 行的既有原则)。\n *\n * 文本区宽度按\"最坏情况\"(带 icon)推导——`verdict-banner.tsx` 的\n * `PAD_X(24)`/`ICON_SIZE(20)`/`GAP_ICON_TEXT(12)`:\n * textW = 1088 - (PAD_X + ICON_SIZE + GAP_ICON_TEXT) - PAD_X\n * = 1088 - 56 - 24 = 1008px\n * (无 icon 时文本左移到 `PAD_X=24` 起,`textW=1040px`,更宽,不是约束项)。\n *\n * text(`layoutSvgText`,字号 18,2 行,行高 24):先取原始 units:\n * rawUnits = (1008 / 18) * 2行 = 112\n * 结论句是完整的自然语言陈述(如 ppt-master 示例\"数学上严格保留目标分布 →\n * 答案分布完全不变,零质量损失\"),机制上与 icon_cards/steps 的\"说明\"字段\n * 同属 `layoutSvgText` 2 行自然语言这一类(而非 `fitSvgLine` 单行短语),\n * 沿用同一折中权重 0.64(`measureTextUnits` 纯 CJK 权重 1.0 与纯数字/字母\n * 权重 0.56 之间,偏 CJK 一侧——见 iconCards/steps 行的同一推导):\n * textMaxUnits = floor(112 / 0.64) = floor(175) = 175\n *\n * 同 iconCards/steps 行——这是软预算(未接入 `ir-quality.ts` 校验)——\n * `verdict-banner.tsx` 自身用 `truncateEmphasisSegments` 在渲染期于固定\n * 18px 字号下逐行截断超宽内容,2 行高度上限(64/88px)由字面量常量保证,\n * 不依赖这里的字数估算兜底安全。\n */\n verdictBanner: { textMaxUnits: 175 },\n} as const\n","/**\n * PPTX IR quality gate (E3): detect content-layout issues and return\n * structured warnings so the UI can surface them after generation.\n *\n * Pure function, no side-effects, never throws.\n */\n\nimport type { PptxIR, Slide } from \"@/ir\"\nimport { CAPACITY } from \"./audit/capacity\"\nimport { measureTextUnits } from \"../lib/svg-text-layout\"\n\nexport type QualityIssue = {\n slide: number\n severity: \"warn\" | \"error\"\n code: string\n message: string\n}\n\n// ── helpers ──\n\n/** Count characters. CJK characters count as 1 each (same as .length). */\nfunction charLen(s: string): number {\n return s.length\n}\n\nfunction hasKpiCardsBlock(slide: Slide): boolean {\n return slide.blocks.some((b) => b.type === \"kpi_cards\")\n}\n\n/** Per-theme `maxBlocksPerSlide` (see the derivation comment in capacity.ts —\n * tech's card-grid geometry supports more blocks per page than the\n * linear-stack themes the flat default was derived from). */\nfunction maxBlocksPerSlideFor(themeId: string): number {\n return CAPACITY.maxBlocksPerSlideOverrides[themeId] ?? CAPACITY.maxBlocksPerSlide\n}\n\n/**\n * A slide is considered a \"background-only image page\" if it has exactly one\n * block of type `image` and no heading. We skip the missing-heading check for\n * these because the image IS the content.\n */\nfunction isBackgroundImageOnly(slide: Slide): boolean {\n return (\n !slide.heading &&\n slide.blocks.length === 1 &&\n slide.blocks[0].type === \"image\"\n )\n}\n\n// ── per-slide checks ──\n\nfunction checkSlide(slide: Slide, index: number, themeId: string): QualityIssue[] {\n const issues: QualityIssue[] = []\n\n // A1-reverse: heading too long\n if (slide.heading && charLen(slide.heading) > CAPACITY.headingMaxChars) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"long_heading\",\n message: \"标题偏长,建议精炼成断言式短句\",\n })\n }\n\n // A2: density cap — only for content slides. Threshold is theme-aware\n // (tech's card grid tolerates more blocks per page than the\n // linear-stack themes the flat default was derived from — see capacity.ts).\n const maxBlocksPerSlide = maxBlocksPerSlideFor(themeId)\n if (slide.type === \"content\" && slide.blocks.length > maxBlocksPerSlide) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"density\",\n message: `每页至多 ~${maxBlocksPerSlide} 个块,建议拆页`,\n })\n }\n\n // bullets overflow + per-item length\n for (const block of slide.blocks) {\n if (block.type !== \"bullets\") continue\n if (block.items.length > CAPACITY.bullets.maxItems) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"bullets_overflow\",\n message: `要点列表条目过多(>${CAPACITY.bullets.maxItems}),建议精简或拆页`,\n })\n }\n for (const item of block.items) {\n if (measureTextUnits(item) > CAPACITY.bullets.maxUnitsPerItem) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"bullet_item_long\",\n message: \"单条要点过长,建议精简至 2 行内\",\n })\n }\n }\n }\n\n // missing heading — cover / chapter / content (skip background-image-only pages)\n const needsHeading: Slide[\"type\"][] = [\"cover\", \"chapter\", \"content\"]\n if (\n needsHeading.includes(slide.type) &&\n !slide.heading &&\n !isBackgroundImageOnly(slide)\n ) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"missing_heading\",\n message: \"此页缺少标题\",\n })\n }\n\n // big_number variant without kpi_cards block\n if (slide.variant === \"big_number\" && !hasKpiCardsBlock(slide)) {\n issues.push({\n slide: index,\n severity: \"warn\",\n code: \"big_number_no_kpi\",\n message: \"big_number 版式缺少 kpi_cards 块\",\n })\n }\n\n return issues\n}\n\n// ── entry ──\n\nexport function checkIrQuality(ir: PptxIR): QualityIssue[] {\n const issues: QualityIssue[] = []\n\n // empty deck\n if (ir.slides.length === 0) {\n issues.push({\n slide: 0,\n severity: \"error\",\n code: \"empty_deck\",\n message: \"演示文稿不包含任何页面\",\n })\n return issues\n }\n\n for (let i = 0; i < ir.slides.length; i++) {\n issues.push(...checkSlide(ir.slides[i], i, ir.theme.id))\n }\n\n return issues\n}\n"],"mappings":";;;;;AAAO,IAAM,UAAU;;;ACChB,IAAM,eAAN,cAA2B,MAAM;AAAC;;;ACDzC,SAAS,SAAS;;;ACUX,IAAM,aAAqE;AAAA,EAChF,QAAQ,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACxG,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,2EAA0E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACjK,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,uGAAsG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACtL,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,CAAC;AAAA,EAC1C,gBAAgB,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACzF,YAAY,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC3G,gBAAgB,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAClK,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EAClF,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EACtF,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,6HAA4H,CAAC,CAAC;AAAA,EACxJ,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxI,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,CAAC;AAAA,EAC3F,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,uGAAsG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,CAAC;AAAA,EACpL,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,CAAC;AAAA,EACnF,UAAU,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAC/P,YAAY,CAAC,CAAC,WAAU,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,CAAC;AAAA,EACjJ,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uJAAsJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACjR,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACjb,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,sDAAqD,CAAC,CAAC;AAAA,EAC9E,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,MAAK,KAAI,MAAK,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,MAAK,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC1R,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9I,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,+GAA8G,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,CAAC;AAAA,EAC9T,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,2HAA0H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,YAAW,EAAC,UAAS,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,CAAC;AAAA,EACjQ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,0GAAyG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yGAAwG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mGAAkG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACzoB,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,qKAAoK,CAAC,CAAC;AAAA,EAC9L,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,qKAAoK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACnO,QAAQ,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC3H,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,QAAO,KAAI,MAAK,CAAC,CAAC;AAAA,EACpK,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EACpM,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAC3G,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kJAAiJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAChU,UAAU,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACtI,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2FAA0F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2FAA0F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,CAAC;AAAA,EACnV,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,qJAAoJ,CAAC,CAAC;AAAA,EAC5K,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,8JAA6J,CAAC,CAAC;AAAA,EACpL,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,oMAAmM,CAAC,CAAC;AAAA,EAC7N,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,0UAAyU,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC9Y,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACrF,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACrI,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,qDAAoD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sDAAqD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC9M,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,CAAC;AAAA,EAChF,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACtJ,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAChI,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EAC9H,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,8DAA6D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+DAA8D,CAAC,CAAC;AAAA,EACnK,eAAe,CAAC,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oDAAmD,CAAC,CAAC;AAAA,EACpI,WAAW,CAAC,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,OAAM,KAAI,MAAK,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,CAAC,CAAC;AAAA,EACxJ,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACxI,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACnQ,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,CAAC;AAAA,EAClJ,WAAW,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAC/K,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,oJAAmJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,CAAC;AAAA,EACnN,cAAc,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAClH,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACrE,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yDAAwD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,CAAC;AAAA,EACpb,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EACtE,YAAY,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACjL,aAAa,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,CAAC;AAAA,EACpI,oBAAoB,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,CAAC,CAAC;AAAA,EAC7L,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,+HAA8H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6HAA4H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8HAA6H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6HAA4H,CAAC,CAAC;AAAA,EAChkB,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,8FAA6F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,MAAK,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACrL,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EACjU,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC3c,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,gdAA+c,CAAC,CAAC;AAAA,EACze,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EACzJ,kBAAkB,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2EAA0E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC5R,mBAAmB,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2EAA0E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAClN,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qIAAoI,CAAC,CAAC;AAAA,EAC3L,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+EAA8E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0DAAyD,CAAC,CAAC;AAAA,EAC3P,WAAW,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC7J,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACtN,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC1O,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,CAAC;AAAA,EACzQ,SAAS,CAAC,CAAC,YAAW,EAAC,UAAS,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6GAA4G,CAAC,CAAC;AAAA,EACjM,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,kIAAiI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,CAAC;AAAA,EACrM,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrK,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,CAAC;AAAA,EAC5N,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrJ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EACzL,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,0DAAyD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uDAAsD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EACnV,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,oHAAmH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAC9S,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,+WAA8W,CAAC,CAAC;AAAA,EACtY,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,wJAAuJ,CAAC,CAAC;AAAA,EAChL,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,2JAA0J,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACjN,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,2NAA0N,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC7Q,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAC/N,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gIAA+H,CAAC,CAAC;AAAA,EACrM,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8DAA6D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAClP,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAChI,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,sHAAqH,CAAC,CAAC;AAAA,EACvJ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,wNAAuN,CAAC,CAAC;AAAA,EAChP,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACnK,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,qLAAoL,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACvP,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC3I,WAAW,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,QAAO,MAAK,SAAQ,MAAK,SAAQ,MAAK,QAAO,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,SAAQ,MAAK,QAAO,MAAK,QAAO,MAAK,QAAO,CAAC,CAAC;AAAA,EAC/P,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,CAAC;AAAA,EACnJ,WAAW,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACvd,QAAQ,CAAC,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,CAAC;AAAA,EAC7M,WAAW,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,CAAC;AAAA,EAC9G,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,CAAC;AAAA,EACrK,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9I,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAC3K,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,CAAC;AAAA,EACjF,OAAO,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,CAAC;AAAA,EAClT,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,CAAC;AAAA,EACxI,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,6FAA4F,CAAC,CAAC;AAAA,EACrH,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,6IAA4I,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iGAAgG,CAAC,CAAC;AAAA,EACxR,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACza,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,CAAC;AAAA,EAC9I,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,CAAC;AAAA,EAC3E,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,+DAA8D,CAAC,CAAC;AAAA,EAC1F,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,gPAA+O,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,CAAC;AAAA,EACjU,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,uGAAsG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1K,WAAW,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8FAA6F,CAAC,CAAC;AAAA,EAClK,cAAc,CAAC,CAAC,WAAU,EAAC,UAAS,6BAA4B,CAAC,CAAC;AAAA,EAClE,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uDAAsD,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAC/J,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kFAAiF,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAChS,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,wMAAuM,CAAC,CAAC;AAAA,EAChO,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gGAA+F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yGAAwG,CAAC,CAAC;AAAA,EACjW,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC3X,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,CAAC;AAAA,EACjQ,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uLAAsL,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACpS,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wHAAuH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACpQ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oPAAmP,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mDAAkD,CAAC,CAAC;AAAA,EAC1Y,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,CAAC;AAAA,EAC3L,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uGAAsG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACvQ,YAAY,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,CAAC;AAAA,EACzJ,eAAe,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAChI,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,6GAA4G,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EACjM,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAC9K,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,gNAA+M,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EACjT,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wbAAub,CAAC,CAAC;AAAA,EACtiB,cAAc,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACjX,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9M,SAAS,CAAC,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACtJ,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8EAA6E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,CAAC;AAAA,EACrP,eAAe,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,CAAC;AAAA,EAC/M,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,oDAAmD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,CAAC;AAAA,EACrI,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,qJAAoJ,CAAC,CAAC;AAAA,EAC9K,sBAAsB,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAC9P,eAAe,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACvQ,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACvK,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,qFAAoF,CAAC,CAAC;AAAA,EAC5G,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,MAAK,KAAI,KAAI,SAAQ,KAAI,UAAS,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACtI,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC7J,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,CAAC;AAAA,EACnH,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yDAAwD,CAAC,CAAC;AAAA,EAClH,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC3H,WAAW,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,MAAK,MAAK,QAAO,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACjN,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAChJ,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACpN,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EAClP,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC5N,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,mEAAkE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EACxH,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+DAA8D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAChO,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,wJAAuJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,CAAC;AAAA,EAChP,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sHAAqH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACzX,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EAChQ,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6CAA4C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EACnb,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iDAAgD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iDAAgD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sDAAqD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,CAAC;AAAA,EACla,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACzP,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,CAAC;AAAA,EACvP,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iCAAgC,CAAC,CAAC;AAAA,EACpO,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yCAAwC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mGAAkG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAClU,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2JAA0J,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1X,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACnH,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,yFAAwF,CAAC,CAAC;AAAA,EAChH,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,0GAAyG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACtM,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,8DAA6D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,CAAC;AAAA,EACjJ,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxH,QAAQ,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+HAA8H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+HAA8H,CAAC,CAAC;AAAA,EAC7U,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oIAAmI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACzd,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxM,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,mIAAkI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACvL,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,2HAA0H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,CAAC;AAAA,EAChR,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,uFAAsF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,KAAI,CAAC,CAAC;AAAA,EAC3lB,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACvM,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,yQAAwQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC/X,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,MAAK,KAAI,MAAK,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC/O,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,uEAAsE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2EAA0E,CAAC,CAAC;AAAA,EAC1L,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0EAAyE,CAAC,CAAC;AAAA,EACnM,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,CAAC;AAAA,EAC7L,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,6GAA4G,CAAC,CAAC;AAAA,EACrI,MAAM,CAAC,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,CAAC;AAAA,EAC1I,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAChT,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC5V,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACrO,iBAAiB,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACnP,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC9K,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EAC5V,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,yCAAwC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wCAAuC,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACjP,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iGAAgG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oGAAmG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8JAA6J,CAAC,CAAC;AAAA,EACle,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC1K,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,2EAA0E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yDAAwD,CAAC,CAAC;AAAA,EACxP,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAChS,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uJAAsJ,CAAC,CAAC;AAAA,EAC9N,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAClI,iBAAiB,CAAC,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC3Y,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mDAAkD,CAAC,CAAC;AAAA,EAC5H,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACrI,qBAAqB,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC9R,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC3S,0BAA0B,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACnP,oBAAoB,CAAC,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACtJ,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sCAAqC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,CAAC;AAAA,EAChJ,aAAa,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAC/P,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gDAA+C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+EAA8E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gFAA+E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EACnnB,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,4EAA2E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6EAA4E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,CAAC;AAAA,EAC9R,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACtT,mBAAmB,CAAC,CAAC,WAAU,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6EAA4E,CAAC,CAAC;AAAA,EAC9S,mBAAmB,CAAC,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,WAAU,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EAC5Q,gBAAgB,CAAC,CAAC,WAAU,EAAC,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,CAAC;AAAA,EAC5N,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAClK,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EACpf,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,oFAAmF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACvN,UAAU,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gCAA+B,CAAC,CAAC;AAAA,EAC1P,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+CAA8C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uEAAsE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAC3V,OAAO,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,CAAC;AAAA,EACrQ,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sEAAqE,CAAC,CAAC;AAAA,EAC/S,uBAAuB,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACrM,qBAAqB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACnM,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gDAA+C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8EAA6E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EAC9d,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACpM,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACnJ,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,CAAC;AAAA,EAC7J,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gEAA+D,CAAC,CAAC;AAAA,EACnI,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,CAAC;AAAA,EAChJ,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACxT,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACzO,cAAc,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAC3J,eAAe,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAClL,YAAY,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxN,aAAa,CAAC,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC/N,mBAAmB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACpJ,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wDAAuD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,CAAC;AAAA,EACne,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,qKAAoK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACzP,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,qKAAoK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EAC7P,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0FAAyF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sIAAqI,CAAC,CAAC;AAAA,EACxS,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,qKAAoK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACrP,aAAa,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC/H,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,6KAA4K,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,CAAC;AAAA,EAC5Q,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxT,OAAO,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,CAAC;AAAA,EAC5F,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,oFAAmF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4IAA2I,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oCAAmC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC7W,qBAAqB,CAAC,CAAC,QAAO,EAAC,KAAI,+CAA8C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yDAAwD,CAAC,CAAC;AAAA,EAC/Q,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAChI,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gGAA+F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACvP,SAAS,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1gB,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,CAAC;AAAA,EACjQ,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qEAAoE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uEAAsE,CAAC,CAAC;AAAA,EAChW,oBAAoB,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACnS,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,8GAA6G,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1S,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACzN,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,yGAAwG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACxP,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACrM,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAClP,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAChP,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,CAAC;AAAA,EAC9O,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,wDAAuD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uDAAsD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mGAAkG,CAAC,CAAC;AAAA,EAC7Q,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,oLAAmL,CAAC,CAAC;AAAA,EAClN,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,qHAAoH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2HAA0H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC5W,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,4GAA2G,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1f,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACvL,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,qGAAoG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EAC/N,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6GAA4G,CAAC,CAAC;AAAA,EAC1O,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,oHAAmH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC3L,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACpO,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6FAA4F,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EAC7O,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,0KAAyK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAChO,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6FAA4F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACzN,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,2HAA0H,CAAC,CAAC;AAAA,EACvJ,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6MAA4M,CAAC,CAAC;AAAA,EAC7P,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,CAAC;AAAA,EACpJ,iBAAiB,CAAC,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mFAAkF,CAAC,CAAC;AAAA,EACpM,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kIAAiI,CAAC,CAAC;AAAA,EAC5O,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0IAAyI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACtO,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kFAAiF,CAAC,CAAC;AAAA,EAC5J,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,uOAAsO,CAAC,CAAC;AAAA,EACjQ,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACtH,YAAY,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACzP,qBAAqB,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC1R,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACnR,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,CAAC;AAAA,EAC9L,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,uJAAsJ,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,CAAC;AAAA,EAC/O,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,iJAAgJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oEAAmE,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,CAAC;AAAA,EAC9T,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9M,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC3I,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EACzJ,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EAC9c,eAAe,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,CAAC;AAAA,EAC5K,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,CAAC;AAAA,EAChN,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACnK,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EACjN,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,+HAA8H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uCAAsC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,CAAC;AAAA,EAC/P,mBAAmB,CAAC,CAAC,QAAO,EAAC,KAAI,sHAAqH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yGAAwG,CAAC,CAAC;AAAA,EAChR,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,8HAA6H,CAAC,CAAC;AAAA,EAC/J,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACnF,mBAAmB,CAAC,CAAC,QAAO,EAAC,KAAI,sVAAqV,CAAC,CAAC;AAAA,EACxX,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,mDAAkD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8FAA6F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC1N,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,mDAAkD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8FAA6F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,MAAK,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EACzS,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wNAAuN,CAAC,CAAC;AAAA,EAC/T,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,wIAAuI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,CAAC;AAAA,EAC7M,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,8HAA6H,CAAC,CAAC;AAAA,EAC3J,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAClI,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mFAAkF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9P,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,6EAA4E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,MAAK,SAAQ,MAAK,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EAC/N,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,6DAA4D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EACrM,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,4DAA2D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sBAAqB,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACjN,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,6KAA4K,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC7S,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4GAA2G,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACzT,SAAS,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACzO,QAAQ,CAAC,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,QAAO,KAAI,MAAK,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,CAAC;AAAA,EACzL,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oEAAmE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sFAAqF,CAAC,CAAC;AAAA,EAC9N,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gCAA+B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,KAAI,KAAI,IAAG,CAAC,CAAC;AAAA,EACpJ,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAC7M,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oHAAmH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gEAA+D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iCAAgC,CAAC,CAAC;AAAA,EACnU,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oIAAmI,CAAC,CAAC;AAAA,EACnN,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gMAA+L,CAAC,CAAC;AAAA,EAC9Q,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACvQ,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oEAAmE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACvS,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kFAAiF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACrT,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,kEAAiE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yCAAwC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1X,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sCAAqC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sCAAqC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,MAAK,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACpY,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,CAAC;AAAA,EACjS,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wHAAuH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,CAAC,CAAC;AAAA,EACpV,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wIAAuI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0GAAyG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sIAAqI,CAAC,CAAC;AAAA,EAChd,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,mFAAkF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mDAAkD,CAAC,CAAC;AAAA,EAC5K,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mCAAkC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC7M,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,+EAA8E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+EAA8E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4FAA2F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wCAAuC,CAAC,CAAC;AAAA,EAC7b,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0GAAyG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,CAAC;AAAA,EAC5U,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC3G,oBAAoB,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oDAAmD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iDAAgD,CAAC,CAAC;AAAA,EACpN,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,CAAC;AAAA,EACrP,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kEAAiE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0EAAyE,CAAC,CAAC;AAAA,EAC5W,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qIAAoI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mGAAkG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iGAAgG,CAAC,CAAC;AAAA,EAC/Z,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EACtD,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+FAA8F,CAAC,CAAC;AAAA,EAC1P,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,wFAAuF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2FAA0F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2FAA0F,CAAC,CAAC;AAAA,EACpU,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uFAAsF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,CAAC;AAAA,EAC1R,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,CAAC;AAAA,EACpQ,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,CAAC;AAAA,EACrQ,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrK,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,2DAA0D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC9P,mBAAmB,CAAC,CAAC,QAAO,EAAC,KAAI,0DAAyD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,CAAC;AAAA,EAC/H,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8EAA6E,CAAC,CAAC;AAAA,EAC1K,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC5I,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0FAAyF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,CAAC;AAAA,EAC7L,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,yCAAwC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kDAAiD,CAAC,CAAC;AAAA,EAC9J,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACvN,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wFAAuF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sFAAqF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yFAAwF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8CAA6C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0FAAyF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0FAAyF,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0FAAyF,CAAC,CAAC;AAAA,EACjtB,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wJAAuJ,CAAC,CAAC;AAAA,EAC7N,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,iJAAgJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8IAA6I,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oBAAmB,CAAC,CAAC;AAAA,EAClb,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACjU,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+DAA8D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EACrP,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAC3L,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAChN,kBAAkB,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EACxQ,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kCAAiC,CAAC,CAAC;AAAA,EACnJ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yEAAwE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kEAAiE,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC7P,oBAAoB,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC5Q,eAAe,CAAC,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAChP,mBAAmB,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,KAAI,UAAS,KAAI,KAAI,MAAK,KAAI,MAAK,MAAK,IAAG,CAAC,CAAC;AAAA,EAC9M,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACtF,aAAa,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC/H,UAAU,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC5H,YAAY,CAAC,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACjL,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACtL,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC1K,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAC3F,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,iGAAgG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uCAAsC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+FAA8F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC3T,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EACxN,gBAAgB,CAAC,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,KAAI,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC1S,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC7H,YAAY,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,MAAK,MAAK,QAAO,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EAChK,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+IAA8I,CAAC,CAAC;AAAA,EACrN,uBAAuB,CAAC,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gIAA+H,CAAC,CAAC;AAAA,EAChS,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,SAAQ,MAAK,UAAS,MAAK,KAAI,KAAI,KAAI,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACnS,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,MAAK,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EACjG,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,8BAA6B,CAAC,CAAC;AAAA,EAC9D,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+DAA8D,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EACjQ,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wCAAuC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC1H,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wCAAuC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAChJ,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,2FAA0F,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,MAAK,SAAQ,KAAI,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,CAAC,CAAC;AAAA,EACjO,OAAO,CAAC,CAAC,QAAO,EAAC,KAAI,yHAAwH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qBAAoB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC9M,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,iHAAgH,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrK,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACxE,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACxE,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrE,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,CAAC;AAAA,EACxE,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC1E,oBAAoB,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC5E,oBAAoB,CAAC,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACrI,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,eAAc,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAClI,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EAChD,kBAAkB,CAAC,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,CAAC;AAAA,EACjF,qBAAqB,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,CAAC;AAAA,EAC9F,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,CAAC;AAAA,EACtF,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,oDAAmD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC5G,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,oDAAmD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC3G,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,qDAAoD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,sDAAqD,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC9M,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,cAAa,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACpO,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,gCAA+B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,CAAC;AAAA,EAC7L,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,CAAC;AAAA,EAC/H,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0CAAyC,CAAC,CAAC;AAAA,EAC9H,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,iNAAgN,CAAC,CAAC;AAAA,EAC7O,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,0JAAyJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAClN,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0BAAyB,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EAClM,SAAS,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,4BAA2B,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACpM,OAAO,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,KAAI,MAAK,QAAO,MAAK,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACzM,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,2BAA0B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mGAAkG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wEAAuE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iEAAgE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kGAAiG,CAAC,CAAC;AAAA,EAChjB,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,sEAAqE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kBAAiB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qCAAoC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iOAAgO,CAAC,CAAC;AAAA,EAC1c,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,4CAA2C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mLAAkL,CAAC,CAAC;AAAA,EACnS,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,wCAAuC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qEAAoE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,oEAAmE,CAAC,CAAC;AAAA,EAC1R,SAAS,CAAC,CAAC,QAAO,EAAC,KAAI,sEAAqE,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wGAAuG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,CAAC;AAAA,EAC9V,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,+CAA8C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,qGAAoG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,kGAAiG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8JAA6J,CAAC,CAAC;AAAA,EAC3d,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,2CAA0C,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,MAAK,SAAQ,MAAK,UAAS,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACpN,gBAAgB,CAAC,CAAC,QAAO,EAAC,KAAI,KAAI,KAAI,KAAI,SAAQ,MAAK,UAAS,KAAI,MAAK,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,SAAQ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,iBAAgB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gBAAe,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC3Q,UAAU,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0NAAyN,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EACzS,QAAQ,CAAC,CAAC,QAAO,EAAC,KAAI,4HAA2H,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC5L,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,6BAA4B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6NAA4N,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,8HAA6H,CAAC,CAAC;AAAA,EACnb,WAAW,CAAC,CAAC,QAAO,EAAC,KAAI,kHAAiH,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,QAAO,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,QAAO,KAAI,MAAK,QAAO,eAAc,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,OAAM,MAAK,OAAM,KAAI,MAAK,QAAO,eAAc,CAAC,CAAC;AAAA,EACxZ,YAAY,CAAC,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,KAAI,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,KAAI,MAAK,MAAK,KAAI,IAAG,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,mBAAkB,CAAC,CAAC;AAAA,EACjM,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,0JAAyJ,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,CAAC;AAAA,EAC1O,aAAa,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uBAAsB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,wBAAuB,CAAC,GAAE,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,IAAG,CAAC,CAAC;AAAA,EAC5P,iBAAiB,CAAC,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,UAAS,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gPAA+O,CAAC,CAAC;AAAA,EACrU,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,YAAW,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6OAA4O,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,WAAU,CAAC,CAAC;AAAA,EAC9T,eAAe,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,MAAK,MAAK,KAAI,CAAC,CAAC;AAAA,EACxS,cAAc,CAAC,CAAC,QAAO,EAAC,KAAI,kKAAiK,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,MAAK,MAAK,MAAK,SAAQ,MAAK,KAAI,MAAK,IAAG,CAAC,CAAC;AAAA,EACtS,eAAe,CAAC,CAAC,UAAS,EAAC,MAAK,MAAK,MAAK,MAAK,KAAI,KAAI,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,uCAAsC,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,CAAC;AAAA,EAC3I,aAAa,CAAC,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,gIAA+H,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yBAAwB,CAAC,CAAC;AAAA,EAC1R,YAAY,CAAC,CAAC,QAAO,EAAC,KAAI,+BAA8B,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,6EAA4E,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,aAAY,CAAC,GAAE,CAAC,QAAO,EAAC,KAAI,yDAAwD,CAAC,CAAC;AAC5P;AAEO,IAAM,kBAAkB,OAAO,KAAK,UAAU;;;ADzb9C,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB;AAIlD,IAAM,uBAAuB,EAAE,mBAAmB,QAAQ;AAAA,EACxD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,OAAO,GAAG,OAAO,IAAI,CAAC,EAAE,OAAO;AAAA,EAC1D,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,WAAW,EAAE,KAAK,CAAC,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS;AAAA,EACvD,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,UAAU,EAAE,OAAO;AAAA,IACnB,SAAS,EACN,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EACxD,OAAO,EACP,SAAS;AAAA,IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,SAAS;AAAA,EAC7C,CAAC,EACA,OAAO;AACZ,CAAC;AAID,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,IAAI,EAAE,KAAK,SAAS;AAAA,EACpB,UAAU,EACP,OAAO;AAAA,IACN,SAAS,IAAI,SAAS;AAAA,IACtB,QAAQ,IAAI,SAAS;AAAA,IACrB,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAC3C,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC1C,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAEV,IAAM,aAAa,EAChB,OAAO;AAAA,EACN,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,EACN;AAAA,IACC,EACG,OAAO;AAAA,MACN,MAAM,EAAE,OAAO;AAAA,MACf,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,CAAC,EACA,OAAO;AAAA,EACZ,EACC,SAAS;AAAA,EACZ,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,iBAAiB,EACd,KAAK,CAAC,UAAU,YAAY,gBAAgB,YAAY,CAAC,EACzD,SAAS;AAAA,EACZ,SAAS,EACN,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACZ,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B,WAAW,EACR,OAAO;AAAA,IACN,YAAY,EAAE,KAAK,CAAC,QAAQ,QAAQ,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,IAC9D,UAAU,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,EAC9C,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAEV,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,KAAK,EAAE,OAAO;AAAA,EACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC,EACA,OAAO;AAEV,IAAM,eAAe,EAClB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAChE,OAAO;AAEV,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,UAAU,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AACtD,CAAC,EACA,OAAO;AAIV,IAAM,cAAc,EAAE,mBAAmB,QAAQ;AAAA,EAC/C,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,SAAS;AAAA,IACzB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IACzB,OAAO,EAAE,KAAK,CAAC,WAAW,aAAa,YAAY,SAAS,SAAS,CAAC,EAAE,SAAS;AAAA,EACnF,CAAC,EACA,OAAO;AAAA,EACV,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,WAAW,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,EACpE,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,MAAM,EAAE,OAAO;AAAA,IACf,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,SAAS;AAAA,IACzB,SAAS,EAAE,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAAA,IACvC,MAAM,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,KAAK,eAAe,EAAE,SAAS;AAAA,EACzC,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,MAAM;AAAA,IACtB,UAAU,EAAE,OAAO;AAAA,IACnB,MAAM,EAAE,OAAO;AAAA,EACjB,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,WAAW;AAAA,IAC3B,OAAO,EAAE;AAAA,MACP,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,OAAO,EAAE,OAAO;AAAA,QAChB,OAAO,EAAE,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,QAC/C,MAAM,EAAE,KAAK,eAAe,EAAE,SAAS;AAAA;AAAA;AAAA,QAGvC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,CAAC,EACA,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKvB,YAAY,EAAE,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,UAAU,CAAC;AAAA,IAC/D,WAAW,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,IACvD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS;AAAA,IAClC,MAAM,EACH,OAAO;AAAA,MACN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,IAClC,CAAC,EACA,OAAO,EACP,SAAS;AAAA,IACZ,QAAQ,EAAE;AAAA,MACR,EACG,OAAO;AAAA,QACN,MAAM,EAAE,OAAO;AAAA,QACf,MAAM,EAAE;AAAA,UACN,EACG,OAAO;AAAA,YACN,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA,YACnC,GAAG,EAAE,OAAO;AAAA,UACd,CAAC,EACA,OAAO;AAAA,QACZ;AAAA,MACF,CAAC,EACA,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,WAAW;AAAA,IAC3B,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,IAAI,EAAE,OAAO;AAAA,QACb,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC,EAAE,SAAS;AAAA,MACtD,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,MACP,EACG,OAAO;AAAA,QACN,MAAM,EAAE,OAAO;AAAA,QACf,IAAI,EAAE,OAAO;AAAA,QACb,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC,EACA,OAAO;AAAA,IACZ;AAAA,IACA,WAAW,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7D,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,cAAc;AAAA,IAC9B,QAAQ,EAAE;AAAA,MACR,EACG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EACxD,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,UAAU;AAAA;AAAA;AAAA,IAG1B,QAAQ,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,IACpD,YAAY,EAAE;AAAA,MACZ,EACG,OAAO;AAAA,QACN,MAAM,EAAE,OAAO;AAAA,QACf,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,QAE1B,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,MAClC,CAAC,EACA,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC5B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAC3B,MAAM,EAAE;AAAA,MACN,EACG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EACxD,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,YAAY;AAAA;AAAA,IAE5B,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,MAAM,EAAE,KAAK,eAAe;AAAA,QAC5B,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA,IAI3B,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,MAAM,EAAE,KAAK,eAAe,EAAE,SAAS;AAAA,QACvC,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,MAClC,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA;AAAA;AAAA,IAGvB,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,gBAAgB;AAAA;AAAA;AAAA,IAGhC,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,IAIzB,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,MAAM,EACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EACjE,IAAI,CAAC,EACL,SAAS;AAAA,MACd,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,QAAQ;AAAA;AAAA;AAAA,IAGxB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IACnC,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,MAAM,EAAE,KAAK,CAAC,WAAW,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,MACvD,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,eAAe;AAAA;AAAA;AAAA,IAG/B,OAAO,EAAE,OAAO;AAAA,IAChB,MAAM,EACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAChE,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,IACR,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,gBAAgB;AAAA,IAChC,MAAM,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,KAAK,CAAC,YAAY,WAAW,SAAS,CAAC;AAAA,IAC/C,MAAM,EAAE,KAAK,eAAe,EAAE,SAAS;AAAA,EACzC,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,UAAU;AAAA,IAC1B,SAAS,EAAE;AAAA,MACT,EACG,OAAO;AAAA,QACN,OAAO,EAAE,OAAO;AAAA,QAChB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,QACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,CAAC,EACA,OAAO;AAAA,IACZ;AAAA,EACF,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,UAAU,EAAE,OAAO;AAAA,IACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,IAG7B,KAAK,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC,EAAE,QAAQ,OAAO;AAAA,EACnD,CAAC,EACA,OAAO;AAAA;AAAA,EAEV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC5B,OAAO,EACJ;AAAA,MACC,EACG,OAAO;AAAA,QACN,UAAU,EAAE,OAAO;AAAA,QACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC,EACL,IAAI,CAAC;AAAA,IACR,UAAU,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,CAAC,EACA,OAAO;AAAA,EACV,EACG,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,eAAe;AAAA,IAC/B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,IACnE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,IACpE,OAAO,EAAE,KAAK,CAAC,MAAM,cAAc,CAAC,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AACZ,CAAC;AAID,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,MAAM,EAAE,KAAK,CAAC,SAAS,WAAW,WAAW,QAAQ,CAAC;AAAA,EACtD,SAAS,EACN,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,EACF,CAAC,EACA,SAAS;AAAA,EACZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,QAAQ,EAAE,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvC,YAAY,qBAAqB,SAAS;AAAA;AAAA;AAAA,EAG1C,OAAO,EACJ,OAAO;AAAA,IACN,MAAM,EAAE,KAAK,CAAC,cAAc,cAAc,aAAa,eAAe,UAAU,CAAC;AAAA,IACjF,WAAW,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,IACjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACpC,CAAC,EACA,OAAO,EACP,SAAS;AAAA;AAAA,EAEZ,YAAY,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC,EACA,OAAO;AAIH,IAAM,eAAe,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,GAAG;AAAA,EACtB,UAAU,EAAE,OAAO;AAAA,EACnB,OAAO;AAAA,EACP,MAAM,WAAW,QAAQ,CAAC,CAAC;AAAA,EAC3B,QAAQ,aAAa,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,EAC3C,OAAO,YAAY,SAAS;AAAA,EAC5B,QAAQ,EAAE,MAAM,WAAW;AAC7B,CAAC,EACA,OAAO;;;AE1iBV,SAAS,KAAAA,UAAS;;;ACoBlB,eAAe,kBAAkB,MAAiC;AAChE,QAAM,OAAO,KAAK,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAChE,QAAM,QAAQ,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AACrD,MAAI,MAAM;AACV,QAAM,QAAQ;AACd,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OAAO;AAC5C,WAAO,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;AAAA,EAC5D;AACA,SAAO,QAAQ,IAAI,WAAW,KAAK,GAAG,CAAC;AACzC;AAGO,SAAS,mBAAmB,IAAyB;AAC1D,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,SAAS,GAAG,QAAQ;AAC7B,UAAM,KAAK,MAAM;AACjB,QAAI,MAAM,GAAG,SAAS,WAAW,GAAG,SAAU,KAAI,IAAI,GAAG,QAAQ;AAAA,EACnE;AACA,SAAO;AACT;AAGA,IAAM,qBAAqB,MAAM;AAEjC,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AAOvB,eAAe,mBAAmB,SAA4C;AAC5E,QAAM,MAAM,IAAI,MAAM;AACtB,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,QAAQ,WAAW,MAAM,OAAO,IAAI,MAAM,gBAAgB,CAAC,GAAG,GAAI;AACxE,QAAI,SAAS,MAAM;AACjB,mBAAa,KAAK;AAClB,cAAQ;AAAA,IACV;AACA,QAAI,UAAU,MAAM;AAClB,mBAAa,KAAK;AAClB,aAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,IACzC;AACA,QAAI,MAAM;AAAA,EACZ,CAAC;AACD,SAAO;AACT;AAGA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,cAAc,WAAW,CAAC;AAEzE,SAAS,YAAY,SAAyB;AAC5C,QAAM,OAAO,QAAQ,QAAQ,GAAG;AAChC,SAAO,OAAO,IAAI,QAAQ,MAAM,GAAG,IAAI,IAAI;AAC7C;AAQA,eAAe,cAAc,SAAkC;AAC7D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,QAAQ,OAAO,WAAW,IAAI;AACpC,MAAI,CAAC,SAAS,OAAO,OAAO,cAAc,YAAY;AACpD,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,MAAM,MAAM,mBAAmB,OAAO;AAC5C,MAAI,CAAC,IAAI,aAAc,OAAM,IAAI,MAAM,qBAAqB;AAC5D,SAAO,QAAQ,IAAI;AACnB,SAAO,SAAS,IAAI;AACpB,QAAM,UAAU,KAAK,GAAG,CAAC;AACzB,QAAM,MAAM,OAAO,UAAU,WAAW;AACxC,MAAI,CAAC,IAAI,WAAW,gBAAgB,EAAG,OAAM,IAAI,MAAM,mBAAmB;AAC1E,SAAO;AACT;AAGA,eAAe,sBAAsB,IAAY,SAAkC;AACjF,QAAM,OAAO,YAAY,OAAO;AAChC,MAAI,CAAC,KAAK,WAAW,QAAQ,KAAK,iBAAiB,IAAI,IAAI,EAAG,QAAO;AACrE,MAAI;AACF,UAAM,SAAS,YAAY,EAAE;AAC7B,WAAO,SAAS,MAAM,OAAO,OAAO,IAAI,MAAM,cAAc,OAAO;AAAA,EACrE,SAAS,GAAG;AACV,UAAM,IAAI;AAAA,MACR,kCAAkC,EAAE,+BAA+B,IAAI,cAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IAC5H;AAAA,EACF;AACF;AAOA,eAAsB,wBAAwB,SAAkC;AAC9E,MAAI,CAAC,QAAQ,WAAW,wBAAwB,EAAG,QAAO;AAC1D,QAAM,eAAe,QAAQ,SAAS,MAAM;AAC5C,MAAI,cAAc,mBAAoB,QAAO;AAC7C,MAAI;AACF,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,QAAQ,OAAO,WAAW,IAAI;AACpC,QAAI,CAAC,SAAS,OAAO,OAAO,cAAc,WAAY,QAAO;AAC7D,UAAM,MAAM,MAAM,mBAAmB,OAAO;AAC5C,QAAI,CAAC,IAAI,aAAc,QAAO;AAC9B,UAAM,QAAQ,KAAK,IAAI,GAAG,iBAAiB,IAAI,YAAY;AAC3D,WAAO,QAAQ,KAAK,MAAM,IAAI,eAAe,KAAK;AAClD,WAAO,SAAS,KAAK,MAAM,IAAI,gBAAgB,KAAK;AACpD,UAAM,UAAU,KAAK,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACtD,UAAM,OAAO,OAAO,UAAU,cAAc,gBAAgB;AAC5D,WAAO,KAAK,WAAW,iBAAiB,KAAK,KAAK,SAAS,QAAQ,SAC/D,OACA;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,iBAAiB,IAA6B;AAClE,QAAM,UAAU,OAAO,QAAQ,GAAG,QAAQ,UAAU,CAAC,CAAC;AACtD,QAAM,QAAQ,mBAAmB,EAAE;AACnC,QAAM,YAAY,QAAQ;AAAA,IACxB,CAAC,CAAC,IAAI,CAAC,MACJ,EAAE,OAAO,CAAC,EAAE,IAAI,WAAW,OAAO,KAClC,MAAM,IAAI,EAAE,KAAK,EAAE,KAAK,WAAW,gBAAgB,KACnD,EAAE,KAAK,WAAW,aAAa,KAC9B,CAAC,iBAAiB,IAAI,YAAY,EAAE,GAAG,CAAC;AAAA,EAC9C;AACA,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,SAAsD,CAAC;AAC7D,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;AACjC,UAAI,CAAC,MAAM,OAAO,MAAM,IAAI,WAAW,OAAO,GAAG;AAC/C,YAAI,CAAC,MAAM,KAAK;AACd,iBAAO,EAAE,IAAI;AACb;AAAA,QACF;AACA,cAAM,aAAa,MAAM,sBAAsB,IAAI,MAAM,GAAG;AAC5D,eAAO,EAAE,IAAI,MAAM,IAAI,EAAE,IACrB,EAAE,GAAG,OAAO,KAAK,MAAM,wBAAwB,UAAU,EAAE,IAC3D,eAAe,MAAM,MACnB,QACA,EAAE,GAAG,OAAO,KAAK,WAAW;AAClC;AAAA,MACF;AACA,UAAI;AACJ,UAAI;AACF,cAAM,OAAO,MAAM,MAAM,MAAM,GAAG;AAClC,YAAI,CAAC,KAAK,IAAI;AACZ,gBAAM,IAAI,MAAM,QAAQ,KAAK,MAAM,EAAE;AAAA,QACvC;AACA,kBAAU,MAAM,kBAAkB,IAAI;AAAA,MACxC,SAAS,GAAG;AACV,cAAM,IAAI;AAAA,UACR,kCAAkC,EAAE,mBAAmB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,QACnG;AAAA,MACF;AACA,gBAAU,MAAM,sBAAsB,IAAI,OAAO;AACjD,aAAO,EAAE,IAAI;AAAA,QACX,GAAG;AAAA,QACH,KAAK,MAAM,IAAI,EAAE,IAAI,MAAM,wBAAwB,OAAO,IAAI;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,GAAG,GAAG,QAAQ,OAAO,EAAE;AACnD;;;ACzHO,SAAS,cACdC,OACA,UACa;AACb,MAAI,CAAC,SAAU,QAAOA;AACtB,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,QAAQ;AAAA,MACN,GAAGA,MAAK;AAAA,MACR,SAAS,SAAS,WAAWA,MAAK,OAAO;AAAA,MACzC,QAAQ,SAAS,UAAUA,MAAK,OAAO;AAAA,IACzC;AAAA,IACA,OAAO;AAAA,MACL,GAAGA,MAAK;AAAA,MACR,SAAS,SAAS,gBAAgBA,MAAK,MAAM;AAAA,MAC7C,MAAM,SAAS,aAAaA,MAAK,MAAM;AAAA,IACzC;AAAA,EACF;AACF;;;ACpFO,IAAM,oBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,SAAS,WAAW,uBAAuB,OAAO;AAAA,IAC5D,MAAM,CAAC,SAAS,WAAW,uBAAuB,OAAO;AAAA,EAC3D;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,EAAE;AAAA;AAAA,EAChC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACHO,IAAM,oBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,IACnE,MAAM,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,EAClE;AAAA,EACA,OAAO,EAAE,QAAQ,EAAE;AAAA;AAAA,EACnB,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;AC7CO,IAAM,kBAA+B;AAAA,EAC1C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,UAAU,WAAW,uBAAuB,OAAO;AAAA,IAC7D,MAAM,CAAC,SAAS,eAAe,WAAW;AAAA,EAC5C;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACpBO,IAAM,iBAA8B;AAAA,EACzC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,QAAQ,WAAW,uBAAuB,OAAO;AAAA,IAC3D,MAAM,CAAC,SAAS,WAAW;AAAA,EAC7B;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACZO,IAAM,kBAA+B;AAAA,EAC1C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,IACzE,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,EACxE;AAAA,EACA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAI;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACvBO,IAAM,eAA4B;AAAA,EACvC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA;AAAA,IAEL,SAAS,CAAC,UAAU,gBAAM,WAAW,OAAO;AAAA,IAC5C,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,EACxE;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI;AAAA;AAAA,EAClC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACvBO,IAAM,mBAAgC;AAAA,EAC3C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,IACzE,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,EACxE;AAAA,EACA,OAAO,EAAE,QAAQ,IAAI,UAAU,IAAI;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA;AAAA;AAAA,IAGzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;AClCO,IAAM,aAA0B;AAAA,EACrC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,SAAS,gBAAM,UAAU,gBAAM,OAAO;AAAA,IAChD,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,WAAW;AAAA,EACxE;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;AC7BO,IAAM,cAA2B;AAAA,EACtC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAKR,cAAc,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EACtE;AAAA,EACA,OAAO;AAAA;AAAA;AAAA,IAGL,SAAS,CAAC,mBAAmB,kBAAkB,aAAa,SAAS,SAAS,WAAW;AAAA,IACzF,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,YAAY,aAAa;AAAA,EAClC;AAAA;AAAA;AAAA,EAGA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE;AAAA;AAAA,EACjC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI,WAAW,WAAW,WAAW;AAAA,IACjF,SAAS,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI,WAAW,WAAW,WAAW;AAAA,IACnF,SAAS,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI,WAAW,WAAW,WAAW;AAAA,IACnF,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI,WAAW,WAAW,WAAW;AAAA,EACpF;AACF;;;AChCO,IAAM,gBAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,UAAU,gBAAM,WAAW,OAAO;AAAA,IAC5C,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,SAAS,WAAW;AAAA,EACjF;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;AC5BO,IAAM,iBAA8B;AAAA,EACzC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA;AAAA;AAAA,IAGR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,SAAS,CAAC,UAAU,gBAAM,WAAW,OAAO;AAAA,IAC5C,MAAM,CAAC,mBAAmB,eAAe,kBAAkB,SAAS,WAAW;AAAA,IAC/E,MAAM,CAAC,YAAY,aAAa;AAAA,EAClC;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI;AAAA;AAAA,EAClC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACvBO,IAAM,cAA2B;AAAA,EACtC,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA;AAAA,IAEL,SAAS,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,IACnE,MAAM,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,EAClE;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI;AAAA;AAAA,EAClC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;AC1BO,IAAM,kBAA+B;AAAA,EAC1C,IAAI;AAAA,EACJ,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW,WAAW,WAAW,SAAS;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA,IACL,SAAS,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,IACnE,MAAM,CAAC,mBAAmB,kBAAkB,SAAS,WAAW;AAAA,EAClE;AAAA,EACA,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,EACnC,oBAAoB;AAAA,IAClB,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IACzC,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC5C;AACF;;;ACTO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,eAAiD;AAAA,EAC5D,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AACZ;AAGO,SAAS,eAAe,IAA8B;AAC3D,SAAQ,oBAA0C,SAAS,EAAE,IACxD,KACD;AACN;AAEO,IAAM,eAAsD;AAAA,EACjE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AACZ;AAEO,SAAS,SACd,IACA,UACa;AACb,QAAMC,QAAO,aAAa,eAAe,EAAE,CAAC;AAC5C,MAAI,CAACA,MAAM,OAAM,IAAI,MAAM,qBAAqB,EAAE,EAAE;AACpD,SAAO,cAAcA,OAAM,QAAQ;AACrC;;;ACjFA,IAAM,cAA4B,CAAC,SAAS,WAAW,WAAW,QAAQ;AAGnE,SAAS,mBAAmB,MAAe,SAAsB;AACtE,aAAW,QAAQ,aAAa;AAC9B,SAAK,kBAAkB,EAAE,OAAO,KAAK,CAAC;AAAA,EACxC;AACF;;;ACnBA,OAAOC,YAAW;;;AC0ClB,SAAS,IAAI,IAAa,MAAc,UAA0B;AAChE,QAAM,IAAI,GAAG,aAAa,IAAI;AAC9B,MAAI,KAAK,KAAM,QAAO;AACtB,QAAM,IAAI,WAAW,CAAC;AACtB,SAAO,OAAO,MAAM,CAAC,IAAI,WAAW;AACtC;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACnC;AAGA,SAAS,YAAY,KAA4B;AAC/C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,QAAQ,EAAE,SAAS,GAAG;AAC5B,QAAM,IAAI,WAAW,QAAQ,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC;AAC/C,MAAI,OAAO,MAAM,CAAC,EAAG,QAAO;AAC5B,SAAO,QAAQ,QAAQ,IAAI,MAAM,CAAC;AACpC;AAUA,SAAS,eAAe,KAAoB,YAA4B;AACtE,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uBAAuB,UAAU,mCAAmC;AAAA,EACtF;AACA,QAAM,IAAI,IAAI,KAAK;AACnB,MAAI,CAAC,EAAE,WAAW,GAAG,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,uBAAuB,UAAU,iBAAiB,GAAG;AAAA,IACvD;AAAA,EACF;AACA,QAAM,MAAM,EAAE,MAAM,CAAC;AACrB,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO,IACJ,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE,EACP,YAAY;AAAA,EACjB;AACA,SAAO,IAAI,YAAY;AACzB;AAEA,SAAS,WAAW,QAAiB,YAAoC;AACvE,QAAM,QAAwB,CAAC;AAC/B,aAAW,SAAS,MAAM,KAAK,OAAO,QAAQ,GAAG;AAC/C,QAAI,MAAM,QAAQ,YAAY,MAAM,OAAQ;AAC5C,UAAM,MAAM,YAAY,MAAM,aAAa,QAAQ,CAAC;AACpD,UAAM,MAAM,eAAe,MAAM,aAAa,YAAY,GAAG,UAAU;AACvE,UAAM,WAAW,MAAM,aAAa,cAAc;AAClD,UAAM,OAAqB,EAAE,KAAK,IAAI;AACtC,QAAI,YAAY,MAAM;AACpB,YAAMC,SAAQ,WAAW,QAAQ;AACjC,UAAI,CAAC,OAAO,MAAMA,MAAK,EAAG,MAAK,QAAQ,QAAQA,MAAK;AAAA,IACtD;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,uBAAuB,UAAU,0BAA0B;AAAA,EAC7E;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,IAAa,YAA0B;AACtE,QAAM,QAAQ,GAAG,aAAa,eAAe;AAC7C,MAAI,SAAS,UAAU,qBAAqB;AAC1C,UAAM,IAAI;AAAA,MACR,uBAAuB,UAAU,yBAAyB,KAAK;AAAA,IACjE;AAAA,EACF;AACF;AAGA,SAAS,eAAe,IAAqB;AAC3C,QAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1B,QAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1B,QAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1B,QAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AAC1B,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,UAAS,KAAK,MAAM,IAAI,EAAE,IAAI,MAAO,KAAK,KAAK,OAAO;AACxD;AAGO,SAAS,iBAAiB,SAA4C;AAC3E,QAAM,MAAM,oBAAI,IAAyB;AACzC,aAAW,QAAQ,MAAM,KAAK,QAAQ,iBAAiB,MAAM,CAAC,GAAG;AAC/D,eAAW,MAAM,MAAM,KAAK,KAAK,iBAAiB,GAAG,CAAC,GAAG;AACvD,YAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,UAAI,QAAQ,oBAAoB,QAAQ,iBAAkB;AAC1D,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,UAAI,CAAC,GAAI;AAET,8BAAwB,IAAI,EAAE;AAC9B,YAAM,QAAQ,WAAW,IAAI,EAAE;AAC/B,UAAI;AAAA,QACF;AAAA,QACA,QAAQ,mBACJ,EAAE,MAAM,UAAU,UAAU,eAAe,EAAE,GAAG,MAAM,IACtD,EAAE,MAAM,UAAU,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAoBO,SAAS,mBAAmB,KAAkB,SAA8B;AACjF,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,SAAS,EAAE,SAAS,KAAK,OAAO,EAAE,EAAE;AAAA,EAClF;AACF;AAEA,SAAS,MAAM,MAA4B;AACzC,QAAM,MAAM,KAAK,MAAM,KAAK,MAAM,GAAM;AACxC,QAAM,WAAW,KAAK,UAAU,UAAa,KAAK,QAAQ;AAC1D,MAAI,CAAC,UAAU;AACb,WAAO,cAAc,GAAG,qBAAqB,KAAK,GAAG;AAAA,EACvD;AACA,QAAM,WAAW,KAAK,MAAO,KAAK,QAAmB,GAAM;AAC3D,SAAO,cAAc,GAAG,qBAAqB,KAAK,GAAG,mBAAmB,QAAQ;AAClF;AASO,SAAS,gBAAgB,KAA0B;AACxD,QAAM,QAAQ,YAAY,IAAI,MAAM,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;AACvD,MAAI,IAAI,SAAS,UAAU;AACzB,UAAM,MAAM,KAAK,MAAM,IAAI,WAAW,GAAK,IAAI;AAC/C,WAAO,gCAAgC,KAAK,eAAe,GAAG;AAAA,EAChE;AACA,SAAO,gCAAgC,KAAK;AAC9C;AAEA,SAAS,SAAS,KAAuC;AACvD,SAAO;AAAA,IACL,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC5B,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC5B,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC9B;AACF;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY;AAC7F;AAYO,SAAS,oBAAoB,KAA0B;AAC5D,QAAM,QAAQ,IAAI,MAAM,CAAC;AACzB,QAAM,OAAO,IAAI,MAAM,IAAI,MAAM,SAAS,CAAC;AAC3C,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,MAAM,GAAG;AACvC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,KAAK,GAAG;AACtC,SAAO,WAAW,KAAK,MAAM,CAAC,IAAI,WAAW,KAAK,MAAM,CAAC,IAAI,WAAW,KAAK,MAAM,CAAC;AACtF;;;AC3OA,OAAO,WAAW;AAYlB,IAAM,YAAY;AAGlB,IAAM,gBAAgB;AAOtB,IAAM,gBAAgB;AAetB,IAAM,qBAA6E;AAAA,EACjF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAOO,SAAS,cACd,QACA,QAAQ,KACA;AACR,SAAO,0BAA0B,KAAK,0EAA0E,mBAAmB,MAAM,CAAC;AAC5I;AAoCA,eAAsB,sBACpB,MACA,SAAgC,QAChC,QAAQ,KACO;AACf,QAAM,SAAS,gBAAgB,OAAO,OAAO,IAAI,KAAK,CAAC,IAAgB,GAAG,EAAE,MAAM,UAAU,CAAC;AAC7F,MAAI,WAAW,OAAQ,QAAO;AAE9B,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,UAAU,MAAM,OAAO,YAAY,CAAC;AAC5D,UAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,MACxC,CAAC,MAAM,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,IAChD;AACA,QAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,UAAM,WAAW,cAAc,QAAQ,KAAK;AAC5C,eAAW,QAAQ,YAAY;AAC7B,YAAM,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ;AAChD,YAAM,WAAW,IAAI,QAAQ,eAAe,EAAE;AAC9C,YAAM,WAAW,SAAS,YAAY,UAAU;AAChD,UAAI,aAAa,GAAI;AACrB,YAAM,MAAM,SAAS,MAAM,GAAG,QAAQ,IAAI,WAAW,SAAS,MAAM,QAAQ;AAC5E,UAAI,KAAK,MAAM,GAAG;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM,IAAI,cAAc,EAAE,MAAM,eAAe,aAAa,UAAU,CAAC;AAClF,WAAO,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAkBA,SAAS,KAAK,GAAmB;AAC/B,SAAO,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAClC;AAQO,SAAS,YAAY,YAAoB,YAA4B;AAC1E,SAAO,MAAM,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC;AACnD;AAWO,SAAS,qBAAqB,WAAkD;AACrF,MAAI,cAAc,QAAS,QAAO;AAClC,MAAI,cAAc,QAAS,QAAO;AAClC,SAAO;AACT;AAyBA,IAAM,wBAGF;AAAA,EACF,MAAM,EAAE,QAAQ,QAAQ,UAAU,IAAI,eAAe,EAAE;AAAA,EACvD,MAAM,EAAE,QAAQ,cAAc,UAAU,IAAI,eAAe,EAAE;AAAA,EAC7D,KAAK,EAAE,QAAQ,mBAAmB,UAAU,IAAI,eAAe,EAAE;AACnE;AAUA,SAAS,qBAAqB,MAAc,QAAgB,QAA8B;AACxF,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,OAAO;AACrB,SACE,8BAA8B,KAAK,uGAER,IAAI,sLAGU,MAAM,yBACjC,KAAK,wCAAwC,IAAI;AAGnE;AA0BA,SAAS,YACP,OACA,SACA,QACQ;AACR,QAAM,SAAS,sBAAsB,MAAM,MAAM;AACjD,QAAM,YAAY,OAAO;AAEzB,MAAI;AACJ,MAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,UAAM,SAAS,OAAO;AACtB,YACE,qBAAqB,MAAM,eAAe,OAAO,QAAQ,uCACvC,OAAO,aAAa,oGAErB,qBAAqB,MAAM,MAAM,CAAC,GAAG,OAAO,QAAQ,MAAM,CAAC;AAAA,EAEhF,OAAO;AACL,YAAQ,MAAM,MACX,IAAI,CAAC,SAAS;AACb,YAAM,SAAS,OAAO;AACtB,aACE,qBAAqB,MAAM,eAAe,OAAO,QAAQ,uCACvC,OAAO,aAAa,mGAErB,qBAAqB,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,IAGtE,CAAC,EACA,KAAK,EAAE;AAAA,EACZ;AAEA,SACE,qBAAqB,SAAS,6CACC,OAAO,kCACrB,KAAK;AAE1B;AAqBO,SAAS,iBAAiB,SAAkC,YAAY,KAAa;AAC1F,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,MAAI,KAAK;AACT,QAAM,SAAS,MAAM,EAAE;AAEvB,QAAM,YAAY,UACf,IAAI,CAAC,OAAO,MAAM,YAAY,OAAO,IAAI,WAAW,MAAM,CAAC,EAC3D,KAAK,EAAE;AACV,QAAM,SAAS,UACZ,QAAQ,CAAC,MAAM,EAAE,KAAK,EACtB,IAAI,CAAC,SAAS,iBAAiB,IAAI,eAAe,EAClD,KAAK,EAAE;AAEV,SACE,8WAIiB,SAAS,8TAKb,MAAM;AAEvB;AAGA,IAAM,YAAY;AAwClB,SAAS,eAAe,KAAqB;AAC3C,QAAM,QAAQ;AACd,MAAI,QAAQ;AACZ,MAAI;AACJ,SAAQ,OAAO,MAAM,KAAK,GAAG,GAAI;AAC/B,UAAM,KAAK,OAAO,KAAK,CAAC,CAAC;AACzB,QAAI,KAAK,MAAO,SAAQ;AAAA,EAC1B;AACA,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,aAAa;AACjB,SAAO,IAAI,QAAQ,4BAA4B,CAAC,MAAM,KAAa,OAAe,SAAiB;AACjG,UAAM,KAAK,OAAO,KAAK;AACvB,QAAI,CAAC,KAAK,IAAI,EAAE,GAAG;AACjB,WAAK,IAAI,EAAE;AACX,aAAO;AAAA,IACT;AACA,kBAAc;AACd,WAAO,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI;AAAA,EACnC,CAAC;AACH;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,OAAO,mBAAmB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;AACvD;AAGA,SAAS,qBAAqB,KAAa,QAA0B;AACnE,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK;AACX,MAAI;AACJ,SAAQ,IAAI,GAAG,KAAK,GAAG,GAAI;AACzB,QAAI,EAAE,CAAC,EAAE,SAAS,MAAM,EAAG,OAAM,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAeO,SAAS,oBAAoB,YAAgD;AAClF,QAAM,UAAU,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC;AAC1C,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,gBAAgB;AACvE,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,gBAAgB;AACxE,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAC/B;AA8BA,eAAsB,uBACpB,MACA,kBACA,YAAY,KACG;AACf,QAAM,SAAS,gBAAgB,OAAO,OAAO,IAAI,KAAK,CAAC,IAAgB,GAAG,EAAE,MAAM,UAAU,CAAC;AAE7F,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,UAAU,MAAM,OAAO,YAAY,CAAC;AAC5D,UAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EACrC,OAAO,CAAC,MAAM,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,EACxD,KAAK,CAAC,GAAG,MAAM,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,CAAC;AACzD,QAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,aAAS,aAAa,GAAG,aAAa,WAAW,QAAQ,cAAc;AACrE,YAAM,aAAa,iBAAiB,UAAU,KAAK,CAAC;AACpD,UAAI,WAAW,WAAW,EAAG;AAE7B,YAAM,OAAO,WAAW,UAAU;AAMlC,YAAM,MAAM,eAAe,MAAM,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhE,YAAM,UAAmC,oBAAoB,UAAU,EAAE;AAAA,QACvE,CAAC,gBAAgB;AAAA,UACf,QAAQ,qBAAqB,WAAW,UAAU,CAAC;AAAA,UACnD,OAAO,qBAAqB,KAAK,YAAY,YAAY,UAAU,CAAC;AAAA,QACtE;AAAA,MACF;AAEA,YAAM,SAAS,iBAAiB,SAAS,SAAS;AAClD,UAAI,CAAC,OAAQ;AAEb,YAAM,WAAW,IAAI,QAAQ,WAAW,EAAE;AAC1C,YAAM,WAAW,SAAS,YAAY,UAAU;AAChD,UAAI,aAAa,GAAI;AACrB,YAAM,MAAM,SAAS,MAAM,GAAG,QAAQ,IAAI,SAAS,SAAS,MAAM,QAAQ;AAC1E,UAAI,KAAK,MAAM,GAAG;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM,IAAI,cAAc,EAAE,MAAM,eAAe,aAAa,UAAU,CAAC;AAClF,WAAO,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFrdA,SAAS,cAAsB;AAC7B,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAC9C;AAoBA,SAAS,gBACP,MACA,IACA,YACM;AACN,MAAI,GAAG,cAAc,QAAQ,cAAc,KAAM;AACjD,QAAM,SAAS,YAAY,YAAY,GAAG,UAAU;AACpD,QAAM,WAAW,KAAK;AACtB,OAAK,aAAa,WAAW,GAAG,QAAQ,IAAI,MAAM,KAAK,YAAY,YAAY,CAAC,IAAI,MAAM;AAC5F;AAGA,SAAS,UAAU,KAAsE;AACvF,QAAM,UAAmC,CAAC;AAC1C,MAAI,IAAI,KAAM,SAAQ,OAAO;AAC7B,MAAI,IAAI,OAAQ,SAAQ,SAAS;AACjC,MAAI,IAAI,UAAW,SAAQ,YAAY;AACvC,MAAI,IAAI,MAAO,SAAQ,QAAQ,IAAI;AACnC,MAAI,IAAI,YAAY,KAAM,SAAQ,WAAW,IAAI;AACjD,SAAO,EAAE,MAAM,IAAI,MAAM,QAAQ;AACnC;AAkBO,SAAS,SACd,OACA,IACA,UAA+B,CAAC,GAChC,YACM;AACN,UAAQ,GAAG,MAAM;AAAA,IACf,KAAK,SAAS;AACZ,YAAM,OAAgC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC3E,UAAI,GAAG,KAAM,MAAK,OAAO,GAAG;AAC5B,UAAI,GAAG,KAAM,MAAK,OAAO,GAAG;AAC5B,UAAI,gBAAgB,MAAM,GAAG,cAAc,KAAM,MAAK,aAAa,GAAG;AACtE,UAAI,GAAG,aAAc,MAAK,aAAa,qBAAqB,YAAY,CAAC,IAAI,QAAQ,MAAM;AAK3F,sBAAgB,MAAM,IAAI,UAAU;AACpC,UAAI,GAAG,cAAc;AACnB,gBAAQ,KAAK,EAAE,YAAY,KAAK,YAAsB,KAAK,gBAAgB,GAAG,YAAY,EAAE,CAAC;AAAA,MAC/F;AACA,YAAM,SAAS,GAAG,OAAO,IAAI;AAC7B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAgC;AAAA,QACpC,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,MAAM,GAAG;AAAA,MACX;AACA,UAAI,GAAG,MAAO,MAAK,QAAQ;AAC3B,UAAI,GAAG,MAAO,MAAK,QAAQ;AAC3B,sBAAgB,MAAM,IAAI,UAAU;AACpC,YAAM,SAAS,QAAQ,IAAI;AAC3B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAgC;AAAA,QACpC,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,QAAQ,GAAG;AAAA,MACb;AACA,UAAI,GAAG,KAAM,MAAK,OAAO,GAAG;AAC5B,UAAI,GAAG,KAAM,MAAK,OAAO,GAAG;AAC5B,UAAI,GAAG,aAAc,MAAK,aAAa,qBAAqB,YAAY,CAAC,IAAI,QAAQ,MAAM;AAE3F,sBAAgB,MAAM,IAAI,UAAU;AACpC,UAAI,GAAG,cAAc;AACnB,gBAAQ,KAAK,EAAE,YAAY,KAAK,YAAsB,KAAK,gBAAgB,GAAG,YAAY,EAAE,CAAC;AAAA,MAC/F;AACA,YAAM,SAAS,YAAY,IAAI;AAC/B;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAgC;AAAA,QACpC,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,OAAO,GAAG;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,GAAG;AAAA,QACb,QAAQ;AAAA,MACV;AACA,UAAI,GAAG,SAAU,MAAK,WAAW,GAAG;AACpC,UAAI,GAAG,MAAO,MAAK,QAAQ,GAAG;AAC9B,UAAI,GAAG,gBAAgB,KAAM,MAAK,eAAe,GAAG;AAKpD,WAAK,OAAO;AACZ,sBAAgB,MAAM,IAAI,UAAU;AACpC,YAAM,QAAQ,GAAG,KAAK,IAAI,SAAS,GAAG,IAAI;AAC1C;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,OAAgC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK;AAC1F,UAAI,GAAG,OAAQ,MAAK,SAAS,GAAG;AAChC,sBAAgB,MAAM,IAAI,UAAU;AACpC,YAAM,SAAS,IAAI;AACnB;AAAA,IACF;AAAA,EACF;AACF;AAUO,SAAS,UAAU,OAAkB,KAAW,YAA0C;AAC/F,QAAM,UAA+B,CAAC;AACtC,aAAW,MAAM,IAAK,UAAS,OAAO,IAAI,SAAS,UAAU;AAC7D,SAAO;AACT;AAGA,IAAMC,iBAAgB;AAStB,IAAM,gBAAgB;AAmBtB,eAAsB,mBACpB,MACA,SACe;AACf,QAAMC,aAAY;AAClB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,gBAAgB,OAAO,OAAO,IAAI,KAAK,CAAC,IAAgB,GAAG,EAAE,MAAMA,WAAU,CAAC;AAAA,EACvF;AAEA,QAAM,MAAM,MAAMC,OAAM,UAAU,gBAAgB,OAAO,MAAM,KAAK,YAAY,IAAI,IAAI;AACxF,QAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,IACxC,CAAC,MAAMF,eAAc,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,EAChD;AAEA,QAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7D,aAAW,QAAQ,YAAY;AAC7B,QAAI,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ;AAC9C,QAAI,UAAU;AACd,eAAW,CAAC,YAAY,KAAK,KAAK,SAAS;AACzC,YAAM,SAAS,IAAI,QAAQ,SAAS,UAAU,GAAG;AACjD,UAAI,WAAW,GAAI;AAEnB,YAAM,UAAU,IAAI,YAAY,UAAU,MAAM;AAChD,YAAM,QAAQ,IAAI,QAAQ,WAAW,MAAM;AAC3C,UAAI,YAAY,MAAM,UAAU,IAAI;AAClC,cAAM,IAAI;AAAA,UACR,oCAAoC,UAAU;AAAA,QAChD;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,MAAM,SAAS,KAAK;AACtC,UAAI,WAAW;AACf,YAAM,UAAU,MAAM,QAAQ,eAAe,MAAM;AACjD,mBAAW;AACX,eAAO,MAAM;AAAA,MACf,CAAC;AACD,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR,oCAAoC,UAAU;AAAA,QAChD;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,GAAG,OAAO,IAAI,UAAU,IAAI,MAAM,KAAK;AACvD,cAAQ,OAAO,UAAU;AACzB,gBAAU;AAAA,IACZ;AACA,QAAI,QAAS,KAAI,KAAK,MAAM,GAAG;AAAA,EACjC;AAEA,MAAI,QAAQ,OAAO,GAAG;AACpB,UAAM,IAAI;AAAA,MACR,8DAA8D,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IACrG;AAAA,EACF;AAEA,QAAM,KAAK,MAAM,IAAI,cAAc,EAAE,MAAM,eAAe,aAAa,UAAU,CAAC;AAClF,SAAO,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,MAAMC,WAAU,CAAC;AAC3C;;;AGjSA,SAAS,qBAAqB;;;ACUvB,IAAM,YAAY;AAElB,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,IAAM,aAAa,cAAc;AACjC,IAAM,aAAa,cAAc;AAGjC,SAAS,OAAO,IAAoB;AACzC,SAAO,KAAK;AACd;AAGO,IAAM,YAAY;AAGlB,SAAS,OAAO,IAAoB;AACzC,SAAO,KAAK;AACd;;;ACpBA,SAAS,UAAU,GAAmB;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AACjD;AAEA,SAASE,WAAU,GAAmB;AACpC,SAAO,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY;AAChE;AAUA,SAAS,SAAS,OAA2B;AAC3C,QAAM,IAAI,MAAM;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,EAAG,QAAO;AACf,SAAO;AAAA,IACL,GAAG,WAAW,EAAE,CAAC,CAAC;AAAA,IAClB,GAAG,WAAW,EAAE,CAAC,CAAC;AAAA,IAClB,GAAG,WAAW,EAAE,CAAC,CAAC;AAAA,IAClB,GAAG,EAAE,CAAC,MAAM,SAAY,WAAW,EAAE,CAAC,CAAC,IAAI;AAAA,EAC7C;AACF;AAGO,SAAS,cAAc,OAAuB;AACnD,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,EAAE,WAAW,GAAG,GAAG;AACrB,UAAM,MAAM,EAAE,MAAM,CAAC;AACrB,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,IACJ,MAAM,EAAE,EACR,IAAI,CAAC,OAAO,KAAK,EAAE,EACnB,KAAK,EAAE,EACP,YAAY;AAAA,IACjB;AACA,WAAO,IAAI,YAAY;AAAA,EACzB;AACA,QAAM,MAAM,SAAS,CAAC;AACtB,MAAI,IAAK,QAAOA,WAAU,IAAI,CAAC,IAAIA,WAAU,IAAI,CAAC,IAAIA,WAAU,IAAI,CAAC;AAErE,SAAO;AACT;AAGO,SAAS,qBAAqB,OAA8B;AACjE,QAAM,MAAM,SAAS,MAAM,KAAK,CAAC;AACjC,MAAI,CAAC,OAAO,IAAI,MAAM,QAAQ,IAAI,KAAK,EAAG,QAAO;AACjD,SAAO,KAAK,OAAO,IAAI,IAAI,KAAK,GAAG;AACrC;;;AClCA,SAAS,WAAW,OAA8B;AAChD,QAAM,IAAI,MAAM,KAAK,EAAE,MAAM,8BAA8B;AAC3D,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;AASA,SAASC,KAAI,IAAa,MAAc,WAAW,GAAW;AAC5D,QAAM,IAAI,GAAG,aAAa,IAAI;AAC9B,MAAI,KAAK,KAAM,QAAO;AACtB,SAAO,WAAW,CAAC,KAAK;AAC1B;AAOO,SAAS,eAAe,IAAa,QAAQ,gBAAwB;AAC1E,QAAM,IAAIC,SAAQD,KAAI,IAAI,WAAW,CAAC,CAAC;AACvC,QAAM,KAAKC,SAAQD,KAAI,IAAI,OAAO,CAAC,CAAC;AACpC,SAAO,IAAI;AACb;AAEA,SAASC,SAAQ,GAAmB;AAClC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACnC;AAGA,SAAS,oBACP,kBACA,SACoB;AACpB,QAAMC,UAAS,qBAAqB,OAAO,IAAI,mBAAmB,MAAM,KAAK;AAC7E,QAAM,IAAI,KAAK,OAAO,IAAIA,UAAS,GAAG;AACtC,SAAO,IAAI,IAAI,IAAI;AACrB;AAYO,SAAS,YACd,IACA,WAC0B;AAC1B,QAAM,OAAO,GAAG,aAAa,MAAM;AACnC,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;AAErC,QAAM,QAAQ,WAAW,IAAI;AAC7B,MAAI,UAAU,MAAM;AAClB,UAAM,cAAc,WAAW,IAAI,KAAK;AACxC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,mBAAmB,IAAI,yCAAyC;AAAA,IAClF;AACA,UAAM,UAAU,eAAe,EAAE;AAKjC,UAAM,WAAW,mBAAmB,aAAa,OAAO;AACxD,UAAMC,OAAgB,EAAE,OAAO,oBAAoB,QAAQ,EAAE;AAC7D,UAAMC,gBAAe,oBAAoB,MAAM,OAAO;AACtD,QAAIA,kBAAiB,OAAW,CAAAD,KAAI,eAAeC;AACnD,WAAO,EAAE,MAAMD,MAAK,SAAS;AAAA,EAC/B;AAEA,QAAM,MAAgB,EAAE,OAAO,cAAc,IAAI,EAAE;AACnD,QAAM,eAAe;AAAA,IACnB,qBAAqB,IAAI;AAAA,IACzB,eAAe,EAAE;AAAA,EACnB;AACA,MAAI,iBAAiB,OAAW,KAAI,eAAe;AACnD,SAAO,EAAE,MAAM,IAAI;AACrB;AAGO,SAAS,UACd,IACA,IACA,WACM;AACN,QAAM,WAAW,YAAY,IAAI,SAAS;AAC1C,MAAI,CAAC,SAAU;AACf,KAAG,OAAO,SAAS;AACnB,MAAI,SAAS,SAAU,IAAG,eAAe,SAAS;AACpD;AAGO,SAAS,cAAc,IAAmC;AAC/D,QAAM,SAAS,GAAG,aAAa,QAAQ;AACvC,MAAI,CAAC,UAAU,WAAW,OAAQ,QAAO;AACzC,QAAM,MAAgB;AAAA,IACpB,OAAO,cAAc,MAAM;AAAA,IAC3B,OAAO,OAAOH,KAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC;AAAA,EAC/C;AACA,QAAM,eAAe;AAAA,IACnB,qBAAqB,MAAM;AAAA,IAC3B,eAAe,IAAI,gBAAgB;AAAA,EACrC;AACA,MAAI,iBAAiB,OAAW,KAAI,eAAe;AACnD,SAAO;AACT;;;ACnHA,SAASK,KAAI,IAAa,MAAsB;AAC9C,SAAO,WAAW,GAAG,aAAa,IAAI,KAAK,GAAG,KAAK;AACrD;AAGO,SAAS,SAAS,IAAa,WAAuD;AAC3F,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,KAAK,IAAI,cAAc;AAAA,IAC9B,GAAG,OAAOA,KAAI,IAAI,GAAG,CAAC;AAAA,IACtB,GAAG,OAAOA,KAAI,IAAI,GAAG,CAAC;AAAA,IACtB,GAAG,OAAOA,KAAI,IAAI,OAAO,CAAC;AAAA,IAC1B,GAAG,OAAOA,KAAI,IAAI,QAAQ,CAAC;AAAA,EAC7B;AACA,MAAI,KAAK,EAAG,IAAG,aAAa,OAAO,EAAE;AAErC,YAAU,IAAI,IAAI,SAAS;AAC3B,QAAM,OAAO,cAAc,EAAE;AAC7B,MAAI,KAAM,IAAG,OAAO;AAEpB,SAAO;AACT;;;ACxBA,SAASC,KAAI,IAAa,MAAsB;AAC9C,SAAO,WAAW,GAAG,aAAa,IAAI,KAAK,GAAG,KAAK;AACrD;AAGO,SAAS,WACd,IACA,WACW;AACX,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,IAAIA,KAAI,IAAI,GAAG;AAErB,QAAM,KAAgB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,GAAG,OAAO,KAAK,CAAC;AAAA,IAChB,GAAG,OAAO,KAAK,CAAC;AAAA,IAChB,GAAG,OAAO,IAAI,CAAC;AAAA,IACf,GAAG,OAAO,IAAI,CAAC;AAAA,EACjB;AAEA,YAAU,IAAI,IAAI,SAAS;AAC3B,QAAM,OAAO,cAAc,EAAE;AAC7B,MAAI,KAAM,IAAG,OAAO;AAEpB,SAAO;AACT;AAGO,SAAS,YACd,IACA,WACW;AACX,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AAEvB,QAAM,KAAgB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,GAAG,OAAO,KAAK,EAAE;AAAA,IACjB,GAAG,OAAO,KAAK,EAAE;AAAA,IACjB,GAAG,OAAO,IAAI,EAAE;AAAA,IAChB,GAAG,OAAO,IAAI,EAAE;AAAA,EAClB;AAEA,YAAU,IAAI,IAAI,SAAS;AAC3B,QAAM,OAAO,cAAc,EAAE;AAC7B,MAAI,KAAM,IAAG,OAAO;AAEpB,SAAO;AACT;;;AC3CA,IAAM,eAAe;AAErB,SAASC,KAAI,IAAa,MAAc,WAAW,GAAW;AAC5D,QAAM,IAAI,GAAG,aAAa,IAAI;AAC9B,MAAI,KAAK,KAAM,QAAO;AACtB,SAAO,WAAW,CAAC,KAAK;AAC1B;AAEA,SAAS,OAAO,QAAgC;AAC9C,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,WAAW,UAAU,WAAW,SAAU,QAAO;AACrD,SAAO,SAAS,QAAQ,EAAE,KAAK;AACjC;AAKA,SAAS,SAAS,OAA+B;AAC/C,SAAO,UAAU,YAAY,UAAU;AACzC;AAEA,SAAS,gBAAgB,QAA2C;AAClE,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK,KAAK;AAC7D;AAEA,SAAS,cAAc,QAAoD;AACzE,MAAI,WAAW,SAAU,QAAO;AAChC,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO;AACT;AAEA,SAAS,UAAU,IAAa,UAAmB,YAAoC;AACrF,QAAM,SAAS,GAAG,iBAAiB,OAAO;AAC1C,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,MAAmB,EAAE,OAAO,GAAG,eAAe,IAAI,KAAK,EAAE;AAC/D,QAAI,SAAU,KAAI,OAAO;AACzB,QAAI,WAAY,KAAI,SAAS;AAC7B,WAAO,CAAC,GAAG;AAAA,EACb;AAGA,QAAM,OAAsB,CAAC;AAC7B,KAAG,WAAW,QAAQ,CAAC,SAAS;AAC9B,QAAI,KAAK,aAAa,GAAG;AACvB,YAAM,QAAQ,KAAK,eAAe,IAAI,KAAK;AAC3C,UAAI,CAAC,KAAM;AACX,YAAMC,OAAmB,EAAE,KAAK;AAChC,UAAI,SAAU,CAAAA,KAAI,OAAO;AACzB,UAAI,WAAY,CAAAA,KAAI,SAAS;AAC7B,WAAK,KAAKA,IAAG;AACb;AAAA,IACF;AACA,QAAI,KAAK,aAAa,EAAG;AACzB,UAAM,QAAQ;AACd,QAAI,MAAM,QAAQ,YAAY,MAAM,QAAS;AAC7C,UAAM,MAAmB,EAAE,MAAM,MAAM,eAAe,GAAG;AACzD,QAAI,OAAO,MAAM,aAAa,aAAa,CAAC,KAAK,SAAU,KAAI,OAAO;AACtE,QAAI,SAAS,MAAM,aAAa,YAAY,CAAC,KAAK,WAAY,KAAI,SAAS;AAC3E,UAAM,OAAO,MAAM,aAAa,MAAM;AACtC,QAAI,QAAQ,SAAS,OAAQ,KAAI,QAAQ,cAAc,IAAI;AAC3D,UAAM,KAAK,MAAM,aAAa,WAAW;AACzC,QAAI,GAAI,KAAI,WAAW,OAAO,WAAW,EAAE,CAAC;AAC5C,SAAK,KAAK,GAAG;AAAA,EACf,CAAC;AACD,SAAO;AACT;AAGO,SAAS,SAAS,IAAqB;AAC5C,QAAM,aAAaD,KAAI,IAAI,aAAa,EAAE;AAC1C,QAAM,QAAQ,cAAc,GAAG,aAAa,aAAa,CAAC;AAC1D,QAAM,MAAMA,KAAI,IAAI,GAAG;AACvB,QAAM,MAAMA,KAAI,IAAI,GAAG;AAIvB,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU,SAAS;AACrB,QAAI;AACJ,QAAI,OAAO,GAAG;AAAA,EAChB,WAAW,UAAU,UAAU;AAC7B,UAAM,OAAO,KAAK,IAAI,KAAK,cAAc,GAAG;AAC5C,QAAI,OAAO,MAAM,IAAI;AACrB,QAAI,OAAO,IAAI,IAAI;AAAA,EACrB,OAAO;AACL,QAAI,OAAO,GAAG;AACd,QAAI,aAAa,OAAO,GAAG;AAAA,EAC7B;AAEA,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,MACA,OAAO,GAAG,aAAa,aAAa,CAAC;AAAA,MACrC,SAAS,GAAG,aAAa,YAAY,CAAC;AAAA,IACxC;AAAA,IACA;AAAA,IACA,GAAG,OAAO,MAAM,eAAe,UAAU;AAAA,IACzC;AAAA,IACA,GAAG,OAAO,aAAa,GAAG;AAAA,IAC1B,UAAU,OAAO,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAAW,gBAAgB,GAAG,aAAa,aAAa,CAAC;AAC/D,MAAI,SAAU,IAAG,WAAW;AAC5B,QAAM,OAAO,GAAG,aAAa,MAAM;AACnC,MAAI,QAAQ,SAAS,OAAQ,IAAG,QAAQ,cAAc,IAAI;AAC1D,QAAM,UAAU,eAAe,EAAE;AACjC,MAAI,UAAU,EAAG,IAAG,eAAe,KAAK,OAAO,IAAI,WAAW,GAAG;AAOjE,SAAO;AACT;;;ACrGA,SAASE,KAAI,IAAa,MAAc,WAAW,GAAW;AAC5D,QAAM,IAAI,GAAG,aAAa,IAAI;AAC9B,MAAI,KAAK,KAAM,QAAO;AACtB,SAAO,WAAW,CAAC,KAAK;AAC1B;AAaA,SAAS,aAAa,IAAmC;AACvD,QAAM,MAAM,GAAG,aAAa,kBAAkB;AAC9C,MAAI,CAAC,OAAO,QAAQ,OAAQ,QAAO;AACnC,QAAM,QAAQ,IAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACrE,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,MAAM,CAAC,KAAK,IAAI,WAAW;AACpC;AAGO,SAAS,SAAS,IAAqB;AAC5C,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AACvB,QAAM,KAAKA,KAAI,IAAI,IAAI;AAEvB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAEhB,QAAM,cAAc,GAAG,aAAa,QAAQ,KAAK;AACjD,QAAM,cAAcA,KAAI,IAAI,gBAAgB,CAAC,KAAK;AAElD,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,GAAG,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,IAC1B,GAAG,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,IAC1B,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;AAAA,IACtB,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;AAAA,IACtB,MAAM;AAAA,MACJ,OAAO,cAAc,WAAW;AAAA,MAChC,OAAO,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,EAAE;AAChC,MAAI,SAAU,IAAG,KAAK,WAAW;AAEjC,QAAMC,UACH,KAAK,qBAAqB,WAAW,KAAK,KAAK,OAChD,eAAe,IAAI,gBAAgB;AACrC,QAAM,eAAe,KAAK,OAAO,IAAIA,UAAS,GAAG;AACjD,MAAI,eAAe,EAAG,IAAG,KAAK,eAAe;AAM7C,MAAI,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE,GAAG;AAC3D,OAAG,QAAQ;AAAA,EACb;AAEA,SAAO;AACT;;;ACnEA,SAAS,YAAY,MAA2B;AAC9C,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,OAAO,KACV,KAAK,EACL,MAAM,QAAQ,EACd,IAAI,MAAM,EACV,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC;AACjC,QAAM,MAAY,CAAC;AACnB,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,GAAG;AAC3C,QAAI,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAGA,SAAS,QACP,KACA,QACA,IACA,WACQ;AACR,QAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AAC7B,QAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AAC7B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAE3B,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,OAAO,IAAI;AAClD,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,OAAO,IAAI;AAElD,QAAM,SAAsB,IAAI,IAAI,CAAC,GAAG,OAAO;AAAA,IAC7C,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,IACpB,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,IACpB,GAAI,MAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,EACpC,EAAE;AACF,MAAI,OAAQ,QAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAEvC,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,GAAG,OAAO,IAAI;AAAA,IACd,GAAG,OAAO,IAAI;AAAA,IACd,GAAG,OAAO,OAAO,IAAI;AAAA,IACrB,GAAG,OAAO,OAAO,IAAI;AAAA,IACrB;AAAA,EACF;AACA,YAAU,IAAI,IAAI,SAAS;AAC3B,QAAM,OAAO,cAAc,EAAE;AAC7B,MAAI,KAAM,IAAG,OAAO;AACpB,SAAO;AACT;AAGO,SAAS,YACd,IACA,WACQ;AACR,SAAO,QAAQ,YAAY,GAAG,aAAa,QAAQ,CAAC,GAAG,MAAM,IAAI,SAAS;AAC5E;AAGO,SAAS,aACd,IACA,WACQ;AACR,SAAO,QAAQ,YAAY,GAAG,aAAa,QAAQ,CAAC,GAAG,OAAO,IAAI,SAAS;AAC7E;AAiBA,SAAS,eACP,IACA,IACA,IACA,IACA,MACA,MACA,IACA,IACkF;AAClF,MAAI,KAAK,KAAK,IAAI,IAAI;AACtB,MAAI,KAAK,KAAK,IAAI,IAAI;AACtB,QAAM,OAAO,KAAK,MAAM;AACxB,QAAM,OAAO,KAAK,MAAM;AAExB,QAAM,SAAU,MAAM,OAAQ,KAAK,MAAO,MAAM,OAAQ,KAAK;AAC7D,MAAI,SAAS,GAAG;AACd,UAAM,IAAI,KAAK,KAAK,MAAM;AAC1B,UAAM;AACN,UAAM;AAAA,EACR;AACA,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,QAAMC,OAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM;AACtE,QAAM,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM;AAClD,QAAM,OAAO,OAAO,KAAK,KAAK,KAAK,IAAI,GAAGA,OAAM,GAAG,CAAC;AACpD,QAAM,MAAO,QAAQ,KAAK,OAAQ;AAClC,QAAM,MAAO,OAAO,EAAE,KAAK,OAAQ;AAEnC,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,MAAM,CAAC,MAAM,OAAO;AAC1B,QAAM,MAAM,CAAC,MAAM,OAAO;AAC1B,QAAM,eAAe,CAAC,IAAY,IAAY,IAAY,OAAe;AACvE,UAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,UAAM,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,GAAG;AAC/D,QAAI,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;AACtD,QAAI,KAAK,KAAK,KAAK,KAAK,EAAG,KAAI,CAAC;AAChC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,aAAa,GAAG,GAAG,IAAI,EAAE;AACxC,MAAI,SAAS,aAAa,IAAI,IAAI,IAAI,EAAE;AACxC,MAAI,OAAO,KAAK,SAAS,EAAG,WAAU,IAAI,KAAK;AAC/C,MAAI,OAAO,KAAK,SAAS,EAAG,WAAU,IAAI,KAAK;AAE/C,QAAM,QAAQ,CAAC,MAAe,IAAI,MAAO,KAAK;AAC9C,QAAM,SAAU,MAAM,MAAM,IAAI,MAAO,OAAO;AAE9C,QAAM,KAAK,OAAO,KAAK,MAAM;AAC7B,QAAM,KAAK,OAAO,KAAK,MAAM;AAC7B,SAAO,EAAE,IAAI,IAAI,OAAO,OAAO,MAAM,MAAM,GAAG,IAAI,GAAG;AACvD;AAGA,SAAS,aAAa,GAAqB;AACzC,SAAO,EAAE,MAAM,sCAAsC,KAAK,CAAC;AAC7D;AAMA,SAAS,cAAc,GAAkB;AACvC,QAAM,SAAS,aAAa,CAAC;AAC7B,QAAM,OAAc,CAAC;AACrB,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,WAAoE;AACxE,MAAI,IAAI;AACR,MAAI,MAAM;AACV,QAAM,OAAO,MAAM,WAAW,OAAO,GAAG,CAAC;AAEzC,SAAO,IAAI,OAAO,QAAQ;AACxB,QAAI,WAAW,KAAK,OAAO,CAAC,CAAC,GAAG;AAC9B,YAAM,OAAO,GAAG;AAAA,IAClB,WAAW,QAAQ,KAAK;AACtB,YAAM;AAAA,IACR,WAAW,QAAQ,KAAK;AACtB,YAAM;AAAA,IACR;AACA,UAAM,MAAM,QAAQ,IAAI,YAAY;AACpC,YAAQ,IAAI,YAAY,GAAG;AAAA,MACzB,KAAK,KAAK;AACR,cAAM,IAAI,KAAK;AACf,cAAM,IAAI,KAAK;AACf,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK;AACL,aAAK;AACL,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK,CAAC;AACxC;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,IAAI,KAAK;AACf,cAAM,IAAI,KAAK;AACf,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,QAAQ,MAAM,CAAC;AACzC;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,IAAI,KAAK;AACf,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,QAAQ,MAAM,CAAC;AACzC;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,IAAI,KAAK;AACf,aAAK,MAAM,KAAK,IAAI;AACpB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,QAAQ,MAAM,CAAC;AACzC;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,aAAK;AACL,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,cAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,cAAM,MAAM,eAAe,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACzD,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AAC/B,aAAK;AACL,aAAK;AACL;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,IAAI,MACN,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,IACrD,EAAE,IAAI,IAAI,IAAI,GAAG;AACrB,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AACpC,mBAAW,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,MAAM,QAAQ;AAC7C;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAEhB,cAAM,OAAe,UAAU,SAAS,UAAU,IAAI,KAAK,SAAS,IAAI;AACxE,cAAM,OAAe,UAAU,SAAS,UAAU,IAAI,KAAK,SAAS,IAAI;AACxE,cAAM,IAAI,MACN,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,IAC/C,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG;AACjC,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AACpC,mBAAW,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,MAAM,QAAQ;AAC7C;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,IAAI,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG;AACxD,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;AACnC,mBAAW,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,MAAM,OAAO;AAC5C;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,OAAe,UAAU,SAAS,SAAS,IAAI,KAAK,SAAS,IAAI;AACvE,cAAM,OAAe,UAAU,SAAS,SAAS,IAAI,KAAK,SAAS,IAAI;AACvE,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,MAAM,KAAK,KAAK;AACrB,aAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;AACxD,mBAAW,EAAE,GAAG,MAAM,GAAG,MAAM,MAAM,OAAO;AAC5C;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,aAAK,KAAK,EAAE,OAAO,KAAK,CAAC;AACzB,aAAK;AACL,aAAK;AACL;AAAA,MACF;AAAA,MACA;AAEE;AAAA,IACJ;AAEA,eAAW;AAAA,EACb;AACA,SAAO;AACT;AAGA,SAAS,SACP,MACA,IACA,WACQ;AACR,QAAM,UAAU,KAAK,OAAO,CAAC,MAAwC,OAAO,CAAC;AAC7E,QAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,QAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,aAAW,OAAO,MAAM;AACtB,QAAI,WAAW,KAAK;AAClB,SAAG,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,EAAE;AAClC,SAAG,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,EAAE;AAAA,IACpC,WAAW,UAAU,KAAK;AACxB,SAAG,KAAK,IAAI,KAAK,EAAE;AACnB,SAAG,KAAK,IAAI,KAAK,EAAE;AAAA,IACrB,WAAW,SAAS,KAAK;AAIvB,YAAM,EAAE,IAAI,IAAI,OAAO,OAAO,IAAI,GAAG,IAAI,IAAI;AAC7C,YAAM,SAAS,CAAC,QAAgB;AAC9B,cAAM,UAAW,MAAM,SAAS,MAAO,OAAO;AAC9C,eAAO,SAAS,IAAI,SAAS,QAAQ,QAAQ,OAAO;AAAA,MACtD;AACA,UAAI,OAAO,CAAC,EAAG,IAAG,KAAK,KAAK,EAAE;AAC9B,UAAI,OAAO,GAAG,EAAG,IAAG,KAAK,KAAK,EAAE;AAChC,UAAI,OAAO,EAAE,EAAG,IAAG,KAAK,KAAK,EAAE;AAC/B,UAAI,OAAO,GAAG,EAAG,IAAG,KAAK,KAAK,EAAE;AAAA,IAClC;AAAA,EACF;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAE3B,QAAM,SAAsB,KAAK,IAAI,CAAC,MAAM;AAC1C,QAAI,WAAW,EAAG,QAAO,EAAE,OAAO,KAAK;AACvC,QAAI,WAAW,GAAG;AAChB,aAAO;AAAA,QACL,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI;AAAA,UAC5B,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI;AAAA,UAC5B,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI;AAAA,UAC5B,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,QACL,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO,EAAE,KAAK,KAAK,IAAI;AAAA,UAC3B,IAAI,OAAO,EAAE,KAAK,KAAK,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,QACL,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,QACpB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO,EAAE,IAAI,EAAE;AAAA,UACnB,IAAI,OAAO,EAAE,IAAI,EAAE;AAAA,UACnB,OAAO,EAAE,IAAI;AAAA,UACb,OAAO,EAAE,IAAI;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,MACpB,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,MACpB,GAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IACrC;AAAA,EACF,CAAC;AAED,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,GAAG,OAAO,IAAI;AAAA,IACd,GAAG,OAAO,IAAI;AAAA,IACd,GAAG,OAAO,OAAO,IAAI;AAAA,IACrB,GAAG,OAAO,OAAO,IAAI;AAAA,IACrB;AAAA,EACF;AACA,YAAU,IAAI,IAAI,SAAS;AAC3B,QAAM,OAAO,cAAc,EAAE;AAC7B,MAAI,KAAM,IAAG,OAAO;AACpB,SAAO;AACT;AAGO,SAAS,SACd,IACA,WACQ;AACR,SAAO,SAAS,cAAc,GAAG,aAAa,GAAG,KAAK,EAAE,GAAG,IAAI,SAAS;AAC1E;;;AC/ZA,IAAM,WAAW;AAEjB,SAASC,KAAI,IAAa,MAAsB;AAC9C,SAAO,WAAW,GAAG,aAAa,IAAI,KAAK,GAAG,KAAK;AACrD;AAMA,SAAS,YAAY,IAAqB;AACxC,SACE,GAAG,aAAa,MAAM,KACtB,GAAG,eAAe,UAAU,MAAM,KAClC,GAAG,aAAa,YAAY,KAC5B;AAEJ;AAUO,SAAS,kBAAkB,KAA8C;AAC9E,QAAM,IAAI,0CAA0C,KAAK,GAAG;AAC5D,MAAI,CAAC,EAAG,QAAO;AAEf,QAAM,MAAM,IAAI,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,MAAM;AACvD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,KAAK,IAAI,MAAM,GAAG,IAAI,SAAU,IAAI,SAAS,CAAE,CAAC;AAC5D,YAAQ,IAAI,WAAW,IAAI,MAAM;AACjC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,OAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,OAAO,CAAC,MAAe,MAAM,CAAC,KAAK,IAAK,MAAM,IAAI,CAAC;AACzD,QAAM,OAAO,CAAC,OACV,MAAM,CAAC,KAAK,KAAO,MAAM,IAAI,CAAC,KAAK,KAAO,MAAM,IAAI,CAAC,KAAK,IAAK,MAAM,IAAI,CAAC,OAAO;AAErF,MAAI,MAAM,SAAS,MAAM,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,IAAM;AAC/D,WAAO,EAAE,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE;AAAA,EACpC;AAEA,MAAI,MAAM,SAAS,MAAM,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,IAAM;AACpF,WAAO,EAAE,GAAG,MAAM,CAAC,IAAK,MAAM,CAAC,KAAK,GAAI,GAAG,MAAM,CAAC,IAAK,MAAM,CAAC,KAAK,EAAG;AAAA,EACxE;AAEA,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,OAAQ,MAAM,CAAC,MAAM,KAAM;AAC9D,QAAI,IAAI;AACR,WAAO,IAAI,IAAI,MAAM,QAAQ;AAC3B,UAAI,MAAM,CAAC,MAAM,KAAM;AACrB;AACA;AAAA,MACF;AACA,YAAM,SAAS,MAAM,IAAI,CAAC;AAC1B,UAAI,WAAW,OAAQ,WAAW,OAAQ,WAAW,KAAM;AACzD,eAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1C;AACA,WAAK,IAAI,KAAK,IAAI,CAAC;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,UAAU,IAAsB;AAC9C,QAAM,OAAO,OAAOA,KAAI,IAAI,OAAO,CAAC;AACpC,QAAM,OAAO,OAAOA,KAAI,IAAI,QAAQ,CAAC;AACrC,QAAM,OAAO,YAAY,EAAE;AAC3B,QAAM,KAAc;AAAA,IAClB,MAAM;AAAA,IACN,GAAG,OAAOA,KAAI,IAAI,GAAG,CAAC;AAAA,IACtB,GAAG,OAAOA,KAAI,IAAI,GAAG,CAAC;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,MAAM,GAAG,aAAa,qBAAqB,KAAK;AACtD,MAAI,QAAQ,QAAQ;AAKlB,UAAM,UAAU,kBAAkB,IAAI;AACtC,QAAI,WAAW,QAAQ,IAAI,KAAK,QAAQ,IAAI,GAAG;AAC7C,SAAG,IAAI,OAAO,QAAQ,CAAC;AACvB,SAAG,IAAI,OAAO,QAAQ,CAAC;AACvB,SAAG,SAAS,EAAE,MAAM,IAAI,SAAS,OAAO,IAAI,UAAU,WAAW,GAAG,MAAM,GAAG,KAAK;AAAA,IACpF;AAAA,EACF;AACA,SAAO;AACT;;;ACpGO,IAAM,WAAmB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAQ1C,SAAS,SAAS,IAAY,IAAoB;AACvD,QAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI;AACjC,QAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI;AACjC,SAAO;AAAA,IACL,KAAK,KAAK,KAAK;AAAA,IACf,KAAK,KAAK,KAAK;AAAA,IACf,KAAK,KAAK,KAAK;AAAA,IACf,KAAK,KAAK,KAAK;AAAA,IACf,KAAK,KAAK,KAAK,KAAK;AAAA,IACpB,KAAK,KAAK,KAAK,KAAK;AAAA,EACtB;AACF;AAGO,SAAS,WACd,GACA,GACA,GAC0B;AAC1B,SAAO;AAAA,IACL,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,IAC5B,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,EAC9B;AACF;AAMA,IAAM,aAAa,KAAK,KAAK;AAM7B,IAAM,eAAe;AAGrB,SAAS,UAAU,KAAuB;AACxC,SAAO,IACJ,KAAK,EACL,MAAM,QAAQ,EACd,OAAO,OAAO,EACd,IAAI,MAAM;AACf;AAiBO,SAAS,eAAe,MAAsB;AACnD,MAAI,SAAiB,CAAC,GAAG,QAAQ;AAGjC,eAAa,YAAY;AAEzB,MAAI;AACJ,UAAQ,QAAQ,aAAa,KAAK,IAAI,OAAO,MAAM;AACjD,UAAM,KAAK,MAAM,CAAC;AAClB,UAAM,OAAO,UAAU,MAAM,CAAC,CAAC;AAC/B,QAAI;AAEJ,YAAQ,IAAI;AAAA,MACV,KAAK,aAAa;AAChB,cAAM,KAAK,KAAK,CAAC,KAAK;AACtB,cAAM,KAAK,KAAK,CAAC,KAAK;AACtB,YAAI,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACvB;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,KAAK,KAAK,CAAC,KAAK;AACtB,cAAM,KAAK,KAAK,CAAC,KAAK;AACtB,YAAI,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AACvB;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,MAAM,KAAK,CAAC,KAAK;AACvB,cAAM,MAAM,MAAM;AAClB,cAAM,MAAM,KAAK,IAAI,GAAG;AACxB,cAAM,MAAM,KAAK,IAAI,GAAG;AACxB,YAAI,KAAK,UAAU,GAAG;AAEpB,gBAAM,KAAK,KAAK,CAAC;AACjB,gBAAM,KAAK,KAAK,CAAC;AACjB,cAAI;AAAA,YACF,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAAA,YAC1D,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,UACvB;AAAA,QACF,OAAO;AACL,cAAI,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,QAChC;AACA;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,YAAI;AAAA,UACF,KAAK,CAAC,KAAK;AAAA,UACX,KAAK,CAAC,KAAK;AAAA,UACX,KAAK,CAAC,KAAK;AAAA,UACX,KAAK,CAAC,KAAK;AAAA,UACX,KAAK,CAAC,KAAK;AAAA,UACX,KAAK,CAAC,KAAK;AAAA,QACb;AACA;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAEA,aAAS,SAAS,QAAQ,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;;;AClIA,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC;AAGhD,SAAS,YAA0B,IAAO,IAAY,IAAe;AACnE,SAAO,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG;AAC7C;AAOA,SAAS,QAAQ,IAAQ,IAAY,IAAgB;AACnD,MAAI,OAAO,KAAK,OAAO,EAAG,QAAO;AACjC,QAAM,OAAO,KAAK,MAAM;AACxB,QAAM,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG;AACrE,UAAQ,GAAG,MAAM;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU,GAAG,WAAW;AAAA,QACxB,MAAM,GAAG,KAAK;AAAA,UAAI,CAAC,MACjB,EAAE,YAAY,OAAO,EAAE,GAAG,GAAG,UAAU,EAAE,WAAW,IAAI,IAAI;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAI,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,EAAE,IAAI,CAAC;AAAA,QACtE,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAkB;AACvC,cAAI,WAAW,GAAI,QAAO;AAC1B,cAAI,WAAW,IAAI;AACjB,gBAAI,GAAG,MAAM,SAAS,OAAO;AAC3B,qBAAO;AAAA,gBACL,GAAG,GAAG,IAAI;AAAA,gBACV,GAAG,GAAG,IAAI;AAAA,gBACV,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,GAAG,MAAM,KAAK,GAAG;AAAA,cACnE;AAAA,YACF;AACA,gBAAI,GAAG,MAAM,SAAS,SAAS;AAC7B,qBAAO;AAAA,gBACL,GAAG,GAAG,IAAI;AAAA,gBACV,GAAG,GAAG,IAAI;AAAA,gBACV,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,IAAI,GAAG,MAAM,KAAK;AAAA,kBAClB,IAAI,GAAG,MAAM,KAAK;AAAA,kBAClB,IAAI,GAAG,MAAM,KAAK;AAAA,kBAClB,IAAI,GAAG,MAAM,KAAK;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,cACL,GAAG,GAAG,IAAI;AAAA,cACV,GAAG,GAAG,IAAI;AAAA,cACV,OAAO,EAAE,MAAM,aAAa,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,GAAG,MAAM,KAAK,GAAG;AAAA,YACzE;AAAA,UACF;AACA,iBAAO,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,EAAE;AAAA,IAC3E,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAI,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,EAAE,IAAI,CAAC;AAAA,QACtE,GAAI,gBAAgB,MAAM,GAAG,cAAc,OACvC,EAAE,YAAY,GAAG,aAAa,IAAI,IAClC,CAAC;AAAA,MACP;AAAA,IACF;AACE,aAAO,EAAE,GAAG,IAAI,GAAG,IAAI;AAAA,EAC3B;AACF;AAGA,SAAS,SAAS,IAAa,WAAwD;AACrF,UAAQ,GAAG,QAAQ,YAAY,GAAG;AAAA,IAChC,KAAK;AACH,aAAO,SAAS,IAAI,SAAS;AAAA,IAC/B,KAAK;AACH,aAAO,WAAW,IAAI,SAAS;AAAA,IACjC,KAAK;AACH,aAAO,YAAY,IAAI,SAAS;AAAA,IAClC,KAAK;AACH,aAAO,SAAS,EAAE;AAAA,IACpB,KAAK;AACH,aAAO,SAAS,EAAE;AAAA,IACpB,KAAK;AACH,aAAO,YAAY,IAAI,SAAS;AAAA,IAClC,KAAK;AACH,aAAO,aAAa,IAAI,SAAS;AAAA,IACnC,KAAK;AACH,aAAO,SAAS,IAAI,SAAS;AAAA,IAC/B,KAAK;AACH,aAAO,UAAU,EAAE;AAAA,IACrB;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,KACP,IACA,QACA,KACA,WACA,YACM;AACN,QAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,MAAI,UAAU,IAAI,GAAG,EAAG;AAGxB,QAAM,MAAM,GAAG,aAAa,WAAW;AACvC,QAAM,MAAM,MAAM,SAAS,QAAQ,eAAe,GAAG,CAAC,IAAI;AAO1D,QAAM,UAAU,GAAG,aAAa,UAAU;AAC1C,QAAM,gBAAgB,WAAW,OAAO,OAAO,OAAO,IAAI;AAE1D,MAAI,eAAe,IAAI,GAAG,GAAG;AAC3B,eAAW,SAAS,MAAM,KAAK,GAAG,QAAQ,EAAG,MAAK,OAAO,KAAK,KAAK,WAAW,aAAa;AAC3F;AAAA,EACF;AAEA,QAAM,KAAK,SAAS,IAAI,SAAS;AACjC,MAAI,CAAC,GAAI;AAGT,QAAM,SAAS,WAAW,KAAK,GAAG,CAAC;AACnC,QAAM,aAAa,YAAY,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC;AAC9F,MAAI,KAAK,iBAAiB,OAAO,EAAE,GAAG,YAAY,YAAY,cAAc,IAAI,UAAU;AAC5F;AAUO,SAAS,SAAS,MAAqB;AAC5C,QAAM,YAAY,iBAAiB,IAAI;AACvC,QAAM,MAAY,CAAC;AACnB,OAAK,MAAM,UAAU,KAAK,WAAW,MAAS;AAC9C,SAAO;AACT;;;ACjLO,IAAM,aAA0B,IAAI;AAAA,EACzC;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAC9B;AAEA,IAAM,eAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AACR;AAMO,SAAS,gBAAgB,OAAiB,MAAwB;AACvE,aAAW,OAAO,OAAO;AACvB,UAAM,OAAO,IAAI,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC3C,QAAI,WAAW,IAAI,KAAK,YAAY,CAAC,EAAG,QAAO;AAAA,EACjD;AACA,SAAO,aAAa,IAAI;AAC1B;AAGA,IAAM,mBAAmB,IAAI;AAAA,EAC3B,CAAC,WAAW,mBAAmB,WAAW,UAAU,gBAAM,YAAY,gBAAM,SAAS,cAAI,EAAE;AAAA,IACzF,CAAC,MAAM,EAAE,YAAY;AAAA,EACvB;AACF;AAGA,IAAM,mBAAmB;AAAA,EACvB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AASO,SAAS,iBAAiB,OAAiB,MAAwB;AACxE,QAAM,OAAO,gBAAgB,OAAO,IAAI;AACxC,QAAM,WACJ,SAAS,SACL,iBAAiB,OACjB,iBAAiB,IAAI,KAAK,YAAY,CAAC,IACrC,iBAAiB,QACjB,iBAAiB;AACzB,SAAO,GAAG,IAAI,KAAK,QAAQ;AAC7B;;;ACvFA,SAAS,SAAS,KAAuC;AACvD,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE;AAC7B,SAAO;AAAA,IACL,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC5B;AACF;AAEA,SAAS,MAAM,GAAW,GAAW,GAAmB;AACtD,QAAM,QAAQ,CAAC,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AACrE,SACE,MACA,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAC1B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAAC,EACxD,KAAK,EAAE;AAEd;AASO,SAAS,cAAc,MAAc,IAAY,GAAqB;AAC3E,MAAI,IAAI,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAE1D,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,IAAI;AAClC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,EAAE;AAEhC,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,KAAK,IAAI;AACnB,WAAO,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,EAC/E;AACA,SAAO;AACT;;;ACSW,SAcH,UAdG,KAkDP,YAlDO;AAlDX,IAAM,sBAAsB;AA6B5B,IAAM,qBAAqB;AAEpB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAMC,KAAI;AACV,QAAMC,KAAI;AAEV,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,oBAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAOD,IAAG,QAAQC,IAAG,MAAM,KAAK,OAAO;AAAA,EAClE;AAEA,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAM,IAAI;AACV,UAAM,QAAQ,cAAc,KAAK,MAAM,KAAK,IAAI,CAAC;AACjD,UAAM,OAAO,KAAK,cAAc;AAKhC,QAAI,MAAM;AACR,YAAM,QAAQD,KAAI;AAClB,aACE,gCACG,gBAAM,IAAI,CAAC,MAAM,MAChB;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG,KAAK,MAAM,QAAQ,CAAC;AAAA,UACvB,GAAG;AAAA,UACH,OAAO,KAAK,KAAK,KAAK,IAAI;AAAA,UAC1B,QAAQC;AAAA,UACR;AAAA;AAAA,QALK;AAAA,MAMP,CACD,GACH;AAAA,IAEJ;AAGA,UAAM,QAAQA,KAAI;AAClB,WACE,gCACG,gBAAM,IAAI,CAAC,MAAM,MAChB;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,KAAK,MAAM,QAAQ,CAAC;AAAA,QACvB,OAAOD;AAAA,QACP,QAAQ,KAAK,KAAK,KAAK,IAAI;AAAA,QAC3B;AAAA;AAAA,MALK;AAAA,IAMP,CACD,GACH;AAAA,EAEJ;AAGA,QAAM,MAAM,SAAS,KAAK,QAAQ,GAAG;AACrC,SACE,iCACG;AAAA,UACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAOA;AAAA,QACP,QAAQC;AAAA,QACR,qBAAqB,KAAK,QAAQ,YAAY,kBAAkB;AAAA;AAAA,IAClE,IAEA,oBAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAOD,IAAG,QAAQC,IAAG,MAAK,WAAU;AAAA,IAEvD,KAAK,UACJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAOD;AAAA,QACP,QAAQC;AAAA,QACR,MAAM,KAAK,QAAQ;AAAA,QACnB,aAAa,KAAK,QAAQ;AAAA;AAAA,IAC5B,IACE,iBACF;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAOD;AAAA,QACP,QAAQC;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA;AAAA,IACf,IACE;AAAA,KACN;AAEJ;;;ACvIO,IAAM,aAAqC;AAAA,EAChD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AACd;;;ACuBO,IAAM,kBAAiE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5E,YAAY;AAAA,IACV,YAAY;AAAA,MACV,OAAO,CAAC,gBAAgB,iBAAiB,gBAAgB;AAAA,MACzD,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA;AAAA,MAEzC,SAAS,CAAC,eAAe;AAAA,MACzB,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,MACV,OAAO,CAAC,eAAe,gBAAgB;AAAA,MACvC,SAAS,CAAC,cAAc;AAAA,MACxB,SAAS,CAAC,iBAAiB,YAAY;AAAA,MACvC,QAAQ,CAAC,aAAa;AAAA,IACxB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,uBAAuB;AAAA,MACjC,SAAS,CAAC,eAAe,YAAY;AAAA,MACrC,QAAQ,CAAC,sBAAsB;AAAA,IACjC;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ;AAAA,IACN,YAAY;AAAA,MACV,OAAO,CAAC,kBAAkB;AAAA,MAC1B,SAAS,CAAC,iBAAiB;AAAA,MAC3B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,gBAAgB;AAAA,IAC3B;AAAA;AAAA;AAAA;AAAA,EAIF;AAAA;AAAA,EAEA,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO,CAAC,oBAAoB;AAAA,MAC5B,SAAS,CAAC,kBAAkB;AAAA,MAC5B,SAAS,CAAC,iBAAiB,YAAY;AAAA,MACvC,QAAQ,CAAC,iBAAiB;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AAAA,IACV,YAAY;AAAA,MACV,OAAO,CAAC,gBAAgB;AAAA,MACxB,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA;AAAA;AAAA,IAGA,QAAQ,EAAE,6BAA6B,KAAK;AAAA;AAAA,IAE5C,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACJ,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA;AAAA,IAEA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU;AAAA,IACR,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AAAA,IACT,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,cAAc;AAAA,MACxB,SAAS,CAAC,iBAAiB,YAAY;AAAA,MACvC,QAAQ,CAAC,aAAa;AAAA,IACxB;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO;AAAA,IACL,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAIA,KAAK;AAAA,IACH,YAAY;AAAA,MACV,OAAO,CAAC,eAAe;AAAA,MACvB,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,iBAAiB,YAAY;AAAA,MACvC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA;AAAA;AAAA,IAGP,QAAQ,EAAE,oBAAoB,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU;AAAA,IACR,YAAY;AAAA,MACV,OAAO,CAAC,iBAAiB,gBAAgB;AAAA,MACzC,SAAS,CAAC,gBAAgB;AAAA,MAC1B,SAAS,CAAC,kBAAkB,YAAY;AAAA,MACxC,QAAQ,CAAC,eAAe;AAAA,IAC1B;AAAA;AAAA,IAEA,OAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,IAAiC;AAC3D,SAAO,gBAAgB,eAAe,EAAE,CAAC,KAAK,gBAAgB;AAChE;;;ACpMA,SAAS,WAAW,GAAmB;AACrC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,MAAM,KAAK,KAAK,IAAI,EAAE,WAAW,CAAC,IAAK;AAC1E,SAAO,KAAK,IAAI,CAAC;AACnB;AAMO,SAAS,SAAS,IAAoB;AAC3C,QAAM,QAAQ,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;AAC1E,SAAO,WAAW,MAAM,KAAK,IAAI,CAAC;AACpC;AAOA,SAAS,UAAU,GAAmB;AACpC,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,OAAK,MAAM;AACX,SAAO,KAAK,IAAI,CAAC;AACnB;AAOA,IAAM,gBAAgB,oBAAI,QAAwB;AAC3C,SAAS,eAAe,IAAoB;AACjD,MAAI,OAAO,cAAc,IAAI,EAAE;AAC/B,MAAI,SAAS,QAAW;AACtB,WAAO,SAAS,EAAE;AAClB,kBAAc,IAAI,IAAI,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;AAGO,SAAS,WAAc,MAAc,MAAc,OAAwB;AAChF,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,uCAAuC,IAAI,GAAG;AACtF,SAAO,MAAM,UAAU,WAAW,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,MAAM;AACtE;AAUO,SAAS,mBACd,MACA,MACA,OACA,SACG;AACH,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,+CAA+C,IAAI,GAAG;AAC9F,QAAMC,QAAO,UAAU,WAAW,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;AAC9D,SAAO,OAAOA,QAAO,WAAW,MAAM,MAAM;AAC9C;;;ACAQ,SA2BM,YAAAC,WA3BN,OAAAC,MA2BM,QAAAC,aA3BN;AA3DD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,MAAM,OAAO,OAAO,IAAI;AAChC,QAAM,OAAO,KAAK;AAClB,QAAM,MAAM,KAAK;AACjB,QAAM,UAAU,KAAK;AACrB,QAAM,OAAO,KAAK;AAElB,QAAM,OAAO,OAAO,gBAAgB,OAAO,OAAO,MAAM,aAAa,IAAI;AACzE,QAAM,MAAM,OAAO,YAAY;AAC/B,QAAM,UACJ,QAAQ,OACJ,EAAE,GAAG,IAAI,GAAG,GAAG,IACf,QAAQ,OACN,EAAE,GAAG,MAAM,GAAG,GAAG,IACjB,QAAQ,OACN,EAAE,GAAG,IAAI,GAAG,IAAI,IAChB,EAAE,GAAG,MAAM,GAAG,IAAI;AAE5B,QAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,SAAS,IAAI,OAAO,UAAU,IAAI,OAAO;AAC/C,QAAM,OAAO,IAAI,MAAM;AAIvB,QAAM,UACJ,MAAM,YAAY,SAAS,UAAU,OAAO,OAAO,MAAM,WAAW,QAAQ,IAAI;AAClF,QAAM,SAAS,YAAY,GAAG,MAAM,EAAE,EAAE;AACxC,QAAM,yBACJ,QAAQ,QAAQ,2BAA2B,KAC3C,MAAM,SAAS,aACf,CAAC,EAAE,SAAS,OAAO,CAAC,QAAQ;AAK9B,QAAM,kBACJ,MAAM,YAAY,iBAAiB,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAIhF,QAAM,mBACJ,MAAM,YAAY,kBAAkB,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAEjF,QAAM,aACJ,MAAM,SAAS,aAAa,CAAC,0BAA0B,CAAC,mBAAmB,CAAC;AAC9E,QAAM,oBACJ,MAAM,SAAS,aAAa,oBAAoB,QAAQ,QAAQ,OAAO,WAAW,IAAI;AAExF,SACE,gBAAAA,MAAAF,WAAA,EACG;AAAA,UAAM,OAAO,CAAC,KAAK,QAClB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,OAAM;AAAA,QACN,QAAO;AAAA,QACP,qBAAoB;AAAA;AAAA,IACtB,IACE;AAAA,IAEH,cACC,gBAAAC,MAAAF,WAAA,EAGG;AAAA,OAAC,QAAQ,sBACR,gBAAAC,KAAC,UAAK,IAAG,MAAK,IAAG,OAAM,IAAG,QAAO,IAAG,OAAM,QAAQ,QAAQ,aAAY,OAAM;AAAA,OAK5E,MAAM;AACN,cAAM,WAAW,CAAC,OAAO,WAAW,IAAI,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AACjF,cAAM,YAAY,CAAC,SAAS,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAC5D,cAAM,UAAU,WAAW,eAAe,EAAE,GAAG,eAAe,CAAC,OAAO,IAAI,CAAC;AAC3E,cAAM,WAAW,UAAU,YAAY;AACvC,cAAM,YAAY,UAAU,WAAW;AACvC,eACE,gBAAAC,MAAAF,WAAA,EACG;AAAA,sBACC,gBAAAC,KAAC,UAAK,GAAE,MAAK,GAAE,OAAM,UAAS,MAAK,MAAM,OAAO,YAAY,MAAM,kBAAiB,cAChF,oBACH;AAAA,UAED,aACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,GAAE;AAAA,cACF,UAAS;AAAA,cACT,YAAW;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,kBAAiB;AAAA,cAEhB;AAAA;AAAA,UACH;AAAA,WAEJ;AAAA,MAEJ,GAAG;AAAA,OACL;AAAA,IAGD,qBACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC,KAAC,UAAK,GAAG,GAAG,GAAG,KAAK,OAAO,MAAM,QAAQ,IAAI,MAAK,WAAU,aAAa,MAAM;AAAA,OAC7E,QAAQ,QACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,UAAS;AAAA,UACT,MAAK;AAAA,UACL,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,kBAAiB;AAAA,UAEhB,WAAC,OAAO,WAAW,IAAI,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA;AAAA,MACnE;AAAA,OAEA,WAAW,SACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,UAAS;AAAA,UACT,YAAW;AAAA,UACX,MAAK;AAAA,UACL,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,kBAAiB;AAAA,UAEhB,WAAC,SAAS,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA;AAAA,MAC7C;AAAA,OAEJ;AAAA,KAEJ;AAEJ;;;AC/GQ,SACE,OAAAE,MADF,QAAAC,aAAA;AApCR,IAAM,IAAI;AACV,IAAM,IAAI;AAEV,SAAS,MAAM,WAA4C,QAAgB,QAAwB;AACjG,UAAQ,aAAa,cAAc,WAAW,SAAS;AACzD;AAGA,SAAS,cAAc,IAAY,OAAuB;AACxD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,OAAO,QAAQ,KAAK;AACvD,QAAI,GAAG,OAAO,CAAC,EAAE,SAAS,UAAW;AAAA,EACvC;AACA,SAAO,KAAK,IAAI,GAAG,CAAC;AACtB;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,EAAE,QAAQ,MAAM,IAAI;AAE1B,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,cAAc;AAEjB,YAAMC,OAAM,OAAO,cAAc,IAAI,KAAK,CAAC,EAAE,SAAS,GAAG,GAAG;AAC5D,aACE,gBAAAD,MAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,IAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,YAAW;AAAA,YACX,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,YAAY,MAAM;AAAA,YAClB,MAAM,OAAO;AAAA,YACb,aAAa,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA,YAC9C,kBAAiB;AAAA,YAEhB,UAAAE;AAAA;AAAA,QACH;AAAA,QACA,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,IAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,YACb,aAAa,MAAM,MAAM,WAAW,KAAK,IAAI;AAAA;AAAA,QAC/C;AAAA,SACF;AAAA,IAEJ;AAAA,IACA,KAAK,cAAc;AAEjB,YAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAC5C,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,IAAI,KAAK,MAAM,SAAS;AAC9B,aACE,gBAAAC,MAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,IAAI,KAAK;AAAA,YACZ,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,YACb,aAAa,MAAM,MAAM,WAAW,MAAM,CAAC;AAAA;AAAA,QAC7C;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,IAAI,KAAK,IAAI;AAAA,YAChB,GAAG;AAAA,YACH,YAAW;AAAA,YACX,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,YAAY,MAAM;AAAA,YAClB,MAAM,OAAO;AAAA,YACb,kBAAiB;AAAA,YAEhB;AAAA;AAAA,QACH;AAAA,SACF;AAAA,IAEJ;AAAA,IACA,KAAK,aAAa;AAEhB,YAAM,IAAI,MAAM,MAAM,WAAW,MAAM,GAAG;AAC1C,aACE,gBAAAC,MAAC,OACC;AAAA,wBAAAD,KAAC,UAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,QAAQ,GAAG,MAAM,OAAO,SAAS,aAAa,GAAG;AAAA,QACrF,gBAAAA,KAAC,UAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,QAAQ,GAAG,MAAM,OAAO,QAAQ,aAAa,GAAG;AAAA,SACtF;AAAA,IAEJ;AAAA,IACA,KAAK,eAAe;AAElB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,UAAU;AAAA,UACV,YAAY,MAAM;AAAA,UAClB,MAAM,OAAO;AAAA,UACb,aAAa,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA,UAC9C,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,IAEJ;AAAA,IACA,KAAK,YAAY;AAEf,YAAM,IAAI,MAAM,MAAM,WAAW,MAAM,IAAI;AAC3C,YAAM,OAAO,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK;AAAA,YACH,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,IAAI,MAAM,IAAI;AAAA,gBAClB,IAAI,KAAK,IAAI;AAAA,gBACb,GAAG;AAAA,gBACH,MAAM,OAAO;AAAA,gBACb,aAAa;AAAA;AAAA,cALR,GAAG,CAAC,IAAI,CAAC;AAAA,YAMhB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO,gBAAAA,KAAC,OAAG,gBAAK;AAAA,IAClB;AAAA,IACA,SAAS;AACP,WAAM,MAAM;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxJA,SAAS,YAAAG,kBAAgB;;;AC+CzB,IAAM,eAAe;AAEd,SAAS,iBAAiB,MAAsB;AACrD,SAAO,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,SAAS;AAC5C,QAAI,KAAK,KAAK,IAAI,EAAG,QAAO,MAAM;AAClC,QAAI,aAAa,KAAK,IAAI,EAAG,QAAO,MAAM;AAC1C,QAAI,QAAQ,KAAK,IAAI,EAAG,QAAO,MAAM;AACrC,QAAI,WAAW,KAAK,IAAI,EAAG,QAAO,MAAM;AACxC,WAAO,MAAM;AAAA,EACf,GAAG,CAAC;AACN;AAEA,SAAS,eAAe,OAAe,UAA4B;AACjE,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AAEd,aAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AACpC,UAAM,YAAY,GAAG,OAAO,GAAG,IAAI;AACnC,QAAI,WAAW,iBAAiB,SAAS,IAAI,UAAU;AACrD,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,QAAS,QAAO,KAAK,OAAO;AAChC,SAAO;AACT;AAEA,SAAS,SAAS,MAA6D;AAC7E,QAAM,aAAa,KAAK,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAClD,MAAI,CAAC,WAAY,QAAO,EAAE,QAAQ,CAAC,GAAG,gBAAgB,MAAM;AAC5D,QAAM,iBAAiB,WAAW,SAAS,GAAG;AAC9C,SAAO;AAAA,IACL,QAAQ,iBAAiB,WAAW,MAAM,GAAG,IAAI,MAAM,KAAK,UAAU;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAc,UAA4B;AAC/D,QAAM,QAAkB,CAAC;AAEzB,aAAWC,cAAa,KAAK,MAAM,KAAK,GAAG;AACzC,UAAM,EAAE,QAAQ,eAAe,IAAI,SAASA,UAAS;AACrD,QAAI,UAAU;AAEd,eAAW,SAAS,QAAQ;AAC1B,YAAM,cACJ,iBAAiB,KAAK,IAAI,WACtB,eAAe,OAAO,QAAQ,IAC9B,CAAC,KAAK;AAEZ,iBAAW,CAAC,YAAY,KAAK,KAAK,YAAY,QAAQ,GAAG;AACvD,cAAM,SAAS,WAAW,kBAAkB,eAAe,IAAI,MAAM;AACrE,cAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK;AAC7C,YAAI,WAAW,iBAAiB,SAAS,IAAI,UAAU;AACrD,gBAAM,KAAK,OAAO;AAClB,oBAAU;AAAA,QACZ,OAAO;AACL,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAS,OAAM,KAAK,OAAO;AAAA,EACjC;AAEA,SAAO;AACT;AAcA,SAAS,oBAAoB,SAAiB,OAA2B;AACvE,MAAI,MAAM,SAAS,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AACvD,QAAM,QAAQ,MAAM,IAAI,gBAAgB;AACxC,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK;AAChC,MAAI,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,IAAK,QAAO;AACpD,QAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AAKjD,QAAM,EAAE,OAAO,IAAI,SAAS,OAAO;AACnC,QAAM,eAAe,KAAK,IAAI,GAAG,OAAO,IAAI,gBAAgB,GAAG,CAAC;AAChE,MAAI,SAAS,KAAK,IAAI,QAAQ,MAAM,QAAQ,YAAY;AACxD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,UAAM,YAAY,cAAc,SAAS,MAAM;AAG/C,QAAI,UAAU,WAAW,MAAM,OAAQ,QAAO;AAC9C,QAAI,UAAU,SAAS,MAAM,OAAQ,QAAO;AAC5C,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAc,UAA0B;AACtE,MAAI,iBAAiB,IAAI,KAAK,SAAU,QAAO;AAC/C,QAAM,SAAS,WAAW;AAC1B,MAAI,MAAM;AACV,aAAW,MAAM,MAAM,KAAK,IAAI,GAAG;AACjC,QAAI,iBAAiB,MAAM,EAAE,IAAI,OAAQ;AACzC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,IAAI;AACd,WAAO,iBAAiB,QAAG,IAAI,WAAW,KAAK;AAAA,EACjD;AACA,SAAO,GAAG,GAAG;AACf;AAEO,SAAS,WACd,MACA,MACoC;AACpC,QAAM,cAAc,KAAK,eAAe;AAUxC,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,QAAQ,iBAAiB,IAAI;AACnC,MAAI,SAAS,EAAG,QAAO,EAAE,MAAM,UAAU,KAAK,SAAS;AACvD,QAAM,YAAY,MAAM,KAAK,IAAI,EAAE;AACnC,QAAM,gBAAgB,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI;AACnD,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,WAAW,aAAa;AAChE,QAAM,SAAS,KAAK,IAAI,KAAK,UAAU,KAAK,MAAM,iBAAiB,KAAK,CAAC;AACzE,MAAI,UAAU,YAAa,QAAO,EAAE,MAAM,UAAU,OAAO;AAC3D,SAAO;AAAA,IACL,MAAM,gBAAgB,MAAM,iBAAiB,WAAW;AAAA,IACxD,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,cACd,MACA,SACe;AACf,QAAM,UAAU,MAAM,KAAK,KAAK;AAChC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,kBAAkB,QAAQ,mBAAmB;AAEnD,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,OAAO,CAAC,GAAG,UAAU,QAAQ,UAAU,YAAY,EAAE;AAAA,EAChE;AAEA,QAAM,YAAY,QAAQ,WAAW,QAAQ;AAC7C,MAAI,WAAW;AACf,MAAI,QAAQ,cAAc,SAAS,QAAQ;AAE3C,WAAS,IAAI,GAAG,MAAM,SAAS,YAAY,IAAI,GAAG,KAAK,GAAG;AACxD,gBAAY;AACZ,YAAQ,cAAc,SAAS,QAAQ;AAAA,EACzC;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,YAAQ;AAAA,MACN,GAAG,MAAM,MAAM,GAAG,WAAW,CAAC;AAAA,MAC9B,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAIA,MAAI,QAAQ,cAAc;AACxB,YAAQ,oBAAoB,SAAS,KAAK;AAAA,EAC5C;AAEA,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB,GAAG,CAAC;AAC1D,QAAMC,kBAAiB,KAAK;AAAA,IAC1B,QAAQ;AAAA,IACR,KAAK,MAAM,QAAQ,WAAW,OAAO;AAAA,EACvC;AACA,QAAM,WAAW,KAAK,IAAI,GAAGA,eAAc;AAE3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,KAAK,MAAM,WAAW,eAAe;AAAA,EACnD;AACF;;;AClPA,OAAO,WAAW;AAUlB,IAAM,cAAc;AAab,SAAS,cAAc,MAAiC;AAC7D,QAAM,WAA8B,CAAC;AACrC,MAAI,YAAY;AAChB,aAAW,SAAS,KAAK,SAAS,WAAW,GAAG;AAC9C,UAAM,QAAQ,MAAM,SAAS;AAC7B,QAAI,QAAQ,WAAW;AACrB,eAAS,KAAK,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,GAAG,YAAY,MAAM,CAAC;AAAA,IACzE;AACA,aAAS,KAAK,EAAE,MAAM,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC;AAClD,gBAAY,QAAQ,MAAM,CAAC,EAAE;AAAA,EAC/B;AACA,MAAI,YAAY,KAAK,QAAQ;AAC3B,aAAS,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,GAAG,YAAY,MAAM,CAAC;AAAA,EAClE;AACA,SAAO;AACT;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,cAAc,IAAI,EACtB,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AACZ;AAiBO,SAAS,qBACd,UACA,MACiB;AACjB,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,SAAS,WAAW,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY;AACpD,WAAO,SAAS,CAAC,EAAE;AAAA,EACrB;AACA,SAAO,SAAS;AAAA,IAAI,CAAC,KAAK,MACxB,IAAI,aACA,MAAM,cAAc,SAAS,EAAE,KAAK,GAAG,MAAM,KAAK,QAAQ,YAAY,KAAK,cAAc,MAAM,GAAG,IAAI,IAAI,IAC1G,MAAM,cAAc,SAAS,EAAE,KAAK,GAAG,MAAM,KAAK,SAAS,GAAG,IAAI,IAAI;AAAA,EAC5E;AACF;AAOA,SAAS,gBAAgB,UAA6C;AACpE,QAAM,QAAwB,CAAC;AAC/B,aAAW,OAAO,UAAU;AAC1B,eAAW,QAAQ,MAAM,KAAK,IAAI,IAAI,GAAG;AACvC,YAAM,KAAK,EAAE,MAAM,YAAY,IAAI,WAAW,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAA0C;AAC/D,QAAM,WAA8B,CAAC;AACrC,aAAW,KAAK,OAAO;AACrB,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,QAAI,QAAQ,KAAK,eAAe,EAAE,YAAY;AAC5C,WAAK,QAAQ,EAAE;AAAA,IACjB,OAAO;AACL,eAAS,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,EAAE,WAAW,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAuBO,SAAS,sBAAsB,UAA6B,OAAsC;AACvG,QAAM,QAAQ,gBAAgB,QAAQ;AACtC,MAAI,SAAS;AACb,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,YAA4B,CAAC;AACnC,QAAI,iBAAiB;AACrB,eAAW,MAAM,MAAM,KAAK,IAAI,GAAG;AACjC,aAAO,SAAS,MAAM,UAAU,MAAM,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,MAAM,MAAM,EAAE,IAAI,GAAG;AAC1F,kBAAU;AAAA,MACZ;AACA,UAAI,SAAS,MAAM,UAAU,MAAM,MAAM,EAAE,SAAS,IAAI;AACtD,yBAAiB,MAAM,MAAM,EAAE;AAC/B,kBAAU,KAAK,EAAE,MAAM,IAAI,YAAY,eAAe,CAAC;AACvD,kBAAU;AAAA,MACZ,OAAO;AAKL,kBAAU,KAAK,EAAE,MAAM,IAAI,YAAY,eAAe,CAAC;AAAA,MACzD;AAAA,IACF;AACA,WAAO,cAAc,SAAS;AAAA,EAChC,CAAC;AACH;AAeO,SAAS,yBAAyB,UAA6B,UAAqC;AACzG,QAAM,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;AAChD,QAAM,YAAY,gBAAgB,MAAM,QAAQ;AAChD,MAAI,cAAc,KAAM,QAAO;AAE/B,QAAM,cAAc,UAAU,SAAS,QAAG;AAC1C,QAAM,UAAU,MAAM,KAAK,SAAS,EAAE,UAAU,cAAc,IAAI;AAClE,QAAM,QAAQ,gBAAgB,QAAQ;AACtC,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO;AACnC,QAAM,SAAS,cAAc,IAAI;AAEjC,MAAI,aAAa;AACf,UAAM,iBAAiB,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,EAAE,aAAa;AAC5E,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAI,QAAQ,KAAK,eAAe,gBAAgB;AAC9C,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,UAAK,YAAY,eAAe,CAAC;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAwBO,SAAS,gBACd,MACA,MAC0D;AAC1D,MAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAG,QAAO;AAClC,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,SAAS,WAAW,cAAc,IAAI,GAAG;AAAA,IAC7C,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AACD,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,WAAW,yBAAyB,cAAc,IAAI,GAAG,QAAQ;AACvE,SAAO,EAAE,UAAU,OAAO,UAAU,SAAS;AAC/C;;;AClMU,gBAAAC,YAAA;AAvBV,IAAM,YAAY;AAClB,IAAM,aAAa;AAEnB,SAAS,IAAI,MAAc,GAAW;AACpC,SAAO,cAAc,cAAc,IAAI,GAAG;AAAA,IACxC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACH;AAEO,IAAM,YAAsC;AAAA,EACjD,QAAQ,OAAO,GAAG;AAChB,UAAM,IAAI,IAAI,MAAM,MAAM,CAAC;AAC3B,WAAO,EAAE,MAAM,SAAS,EAAE;AAAA,EAC5B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,IAAI,MAAM,MAAM,IAAI,CAAC;AAC/B,UAAM,eAAe,sBAAsB,cAAc,MAAM,IAAI,GAAG,EAAE,KAAK;AAC7E,WACE,gBAAAA,KAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,uBAAa,IAAI,CAAC,UAAU,MAC3B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,IAAI,EAAE,aAAa,EAAE;AAAA,QACxB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,EAAE;AAAA,QACZ,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,+BAAqB,UAAU,EAAE,QAAQ,IAAI,OAAO,QAAQ,UAAU,IAAI,OAAO,KAAK,CAAC;AAAA;AAAA,MARnF;AAAA,IASP,CACD,GACH;AAAA,EAEJ;AACF;;;AC7CA,SAAS,YAAAC,iBAAgB;AA6Gf,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AA9FV,IAAMC,aAAY;AAClB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,cAAc;AASpB,SAAS,WAAW,OAA2C,OAAuB;AACpF,MAAI,UAAU,WAAY,QAAO,GAAG,QAAQ,CAAC;AAC7C,MAAI,UAAU,YAAa,QAAO;AAClC,SAAO;AACT;AAkBA,SAAS,YAAY,OAAqB,GAAwB;AAChE,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,SAAS,UAAU,YAAY,cAAc;AACnD,QAAM,WAAW,KAAK,IAAI,IAAI,IAAI,MAAM;AACxC,QAAM,WAAW,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,CAAC;AAC/D,QAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,cAAc,IAAI,CAAC,EAAE;AACjF,QAAM,UAAU,MAAM,IAAI,CAAC,MAAM,cAAc,GAAG,EAAE,UAAU,UAAUA,YAAW,UAAU,EAAE,CAAC,CAAC;AACjG,QAAM,WAAW,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAGA,UAAS,CAAC;AAC1F,QAAM,aAAa,KAAK,MAAM,WAAW,GAAG;AAG5C,QAAM,SAAS,MAAM,IAAI,CAAC,MAAM,cAAc,GAAG,EAAE,UAAU,UAAU,UAAU,EAAE,CAAC,CAAC;AACrF,QAAM,WAAW,WAAW;AAE5B,MAAI,IAAI,KAAK,MAAM,WAAW,GAAG;AACjC,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAoB,OAAO,IAAI,CAAC,GAAG,MAAM;AAG7C,UAAM,WAA8B,SAAS,CAAC,IAC1C,CAAC,EAAE,MAAM,SAAS,CAAC,GAAG,YAAY,MAAM,GAAG,GAAG,cAAc,MAAM,MAAM,CAAC,CAAC,CAAC,IAC3E,cAAc,MAAM,MAAM,CAAC,CAAC;AAIhC,UAAM,sBAAsB,sBAAsB,UAAU,EAAE,KAAK;AAGnE,UAAM,eAAe,oBAAoB,IAAI,CAAC,SAAS,yBAAyB,MAAM,QAAQ,CAAC;AAC/F,UAAM,QAAQ,aAAa,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzE,UAAM,OAAiB,EAAE,OAAO,cAAc,YAAY,EAAE;AAK5D,UAAM,WAAW,UAAU,YAAY,KAAK,MAAM,WAAW,GAAG,IAAI;AACpE,UAAM,eAAe,KAAK,MAAM,SAAS,KAAK;AAC9C,SAAK,MAAM,SAAS,aAAa;AACjC,QAAI,UAAU,aAAa,IAAI,OAAO,SAAS,GAAG;AAChD,YAAM,aAAa,eAAe,WAAW;AAC7C,YAAM,cAAc,IAAI,WAAW;AACnC,eAAS,KAAK,KAAK,OAAO,aAAa,eAAe,CAAC,CAAC;AAAA,IAC1D;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,OAAO,UAAU,YAAY,QAAQ,KAAK,UAAU,YAAY,KAAK,MAAM,WAAW,GAAG,IAAI,WAAW,SAAS;AAC5H;AAEO,IAAM,UAAkC;AAAA,EAC7C,QAAQ,OAAO,GAAG;AAChB,WAAO,YAAY,OAAO,CAAC,EAAE;AAAA,EAC/B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,EAAE,OAAO,UAAU,YAAY,SAAS,IAAI,YAAY,OAAO,IAAI,CAAC;AAC1E,UAAM,SAAS,UAAU,YAAY,cAAc;AACnD,WACE,gBAAAF,KAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,IAAI,CAAC,MAAM,MAChB,gBAAAC,MAACE,WAAA,EACE;AAAA,gBAAU,aACT,gBAAAH,KAAC,YAAO,IAAI,GAAG,IAAI,KAAK,aAAa,WAAW,KAAK,GAAG,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,MAEtF,UAAU,aAAa,IAAI,MAAM,SAAS,KACzC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI,SAAS,CAAC;AAAA,UACd,IAAI,IAAI;AAAA,UACR,IAAI,SAAS,CAAC;AAAA,UACd,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,UACxC,aAAa;AAAA;AAAA,MACf;AAAA,MAED,KAAK,aAAa,IAAI,CAAC,UAAU,OAChC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,GAAG,KAAK,aAAa,KAAK;AAAA,UAC1B,YAAY,IAAI,MAAM;AAAA,UACtB;AAAA,UACA,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB,+BAAqB,UAAU,EAAE,QAAQ,IAAI,OAAO,QAAQ,UAAU,IAAI,OAAO,KAAK,CAAC;AAAA;AAAA,QARnF;AAAA,MASP,CACD;AAAA,SA1BY,CA2Bf,CACD,GACH;AAAA,EAEJ;AACF;;;ACxGM,SAEE,OAAAI,MAFF,QAAAC,aAAA;AA9BN,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAC3B,IAAM,WAAW;AACjB,IAAM,aAAa;AAEnB,SAAS,QAAQ,MAAc,GAAW;AACxC,SAAO,cAAc,MAAM;AAAA,IACzB,UAAU,IAAI,cAAc;AAAA,IAC5B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACH;AAEO,IAAM,QAA8B;AAAA,EACzC,QAAQ,OAAO,GAAG,MAAM;AACtB,UAAM,IAAI,QAAQ,MAAM,MAAM,CAAC;AAC/B,UAAM,aAAa,EAAE,MAAM,SAAS,EAAE;AACtC,UAAM,aAAa,MAAM,cAAc,EAAE,aAAa,WAAW;AACjE,WAAO,aAAa,aAAa,aAAa;AAAA,EAChD;AAAA,EAEA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,QAAQ,MAAM,MAAM,IAAI,CAAC;AAEnC,WACE,gBAAAA,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KAEvC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,MAGC,EAAE,MAAM,IAAI,CAAC,MAAM,MAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,GAAG,aAAa,IAAI,EAAE,aAAa,EAAE;AAAA,UACrC,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU,EAAE;AAAA,UACZ,WAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QATI;AAAA,MAUP,CACD;AAAA,MAKA,MAAM,gBAAgB,MAAM;AAC3B,cAAM,OAAO,WAAW,UAAK,MAAM,WAAW,IAAI;AAAA,UAChD,UAAU,IAAI,IAAI,cAAc;AAAA,UAChC,UAAU;AAAA,UACV,aAAa;AAAA,QACf,CAAC;AACD,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,aAAa,EAAE,MAAM,SAAS,EAAE,aAAa,WAAW;AAAA,YAC3D,YAAY,IAAI,MAAM;AAAA,YACtB,UAAU,KAAK;AAAA,YACf,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAEhB,eAAK;AAAA;AAAA,QACR;AAAA,MAEJ,GAAG;AAAA,OACL;AAAA,EAEJ;AACF;;;AC3Ca,gBAAAE,YAAA;AAvBb,IAAM,eAAe;AAAA,EACnB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;AAEA,SAAS,gBACP,MACA,GACA,OACoB;AACpB,QAAM,CAAC,KAAK,KAAK,IAAI;AAGrB,QAAM,SAAS;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,GAAI,MAAM,SAAS,iBAAiB,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,EACzD;AACA,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,gBAAAA,KAAC,UAAM,GAAG,QAAQ,GAAG,MAAM,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,gBAAAA,KAAC,YAAQ,GAAG,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG;AAAA,IACrE,KAAK;AACH,aACE,gBAAAA,KAAC,aAAS,GAAG,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,IAEjF,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,IAAI,MAAM;AAAA,UACV,IAAI,MAAM;AAAA;AAAA,MACZ;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,KAAC,UAAM,GAAG,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,IACnF,KAAK;AACH,aAAO,gBAAAA,KAAC,cAAU,GAAG,QAAQ,QAAQ,MAAM,QAAQ;AAAA,IACrD,KAAK;AACH,aAAO,gBAAAA,KAAC,aAAS,GAAG,QAAQ,QAAQ,MAAM,QAAQ;AAAA,IACpD;AACE,YAAM,IAAI,MAAM,iEAAoB,GAAG,GAAG;AAAA,EAC9C;AACF;AAOO,SAAS,KAAK,EAAE,MAAM,GAAG,GAAG,MAAM,MAAM,GAAkC;AAC/E,QAAM,aAAa,WAAW,IAAI;AAClC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,4BAA4B,IAAI,GAAG;AAAA,EACrD;AACA,QAAM,QAAQ,OAAO;AACrB,SACE,gBAAAA,KAAC,OAAE,WAAW,aAAa,CAAC,IAAI,CAAC,WAAW,KAAK,KAC9C,qBAAW,IAAI,CAAC,MAAM,MAAM,gBAAgB,MAAM,GAAG,KAAK,CAAC,GAC9D;AAEJ;;;ACxCM,SACE,OAAAC,MADF,QAAAC,aAAA;AA9CN,IAAMC,aAAY;AAClB,IAAMC,cAAa;AACnB,IAAM,QAAQ;AACd,IAAM,YAAY;AAClB,IAAM,KAAK;AACX,IAAM,aAAa;AAGnB,IAAM,YAAY;AAClB,IAAM,YAAY,YAAY;AAC9B,IAAM,SAAS,YAAY,YAAY;AAGvC,IAAM,eAAwD;AAAA,EAC5D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AACP;AAEA,SAASC,KAAI,MAAc,GAAW;AACpC,SAAO,cAAc,cAAc,IAAI,GAAG;AAAA,IACxC,UAAU,IAAI;AAAA,IACd,UAAUF;AAAA,IACV,UAAU;AAAA,IACV,iBAAiBC;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,YAAY,SAAkC,KAA8D;AACnH,MAAI,YAAY,OAAQ,QAAO;AAC/B,MAAI,YAAY,MAAO,QAAO,IAAI,OAAO;AACzC,SAAO,IAAI,OAAO;AACpB;AAEO,IAAM,UAAkC;AAAA,EAC7C,QAAQ,OAAO,GAAG;AAChB,UAAM,IAAIC,KAAI,MAAM,MAAM,CAAC;AAC3B,WAAO,KAAK,IAAI,EAAE,MAAM,SAAS,EAAE,aAAa,IAAI,OAAO,UAAU;AAAA,EACvE;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAIA,KAAI,MAAM,MAAM,IAAI,CAAC;AAC/B,UAAM,eAAe,sBAAsB,cAAc,MAAM,IAAI,GAAG,EAAE,KAAK;AAC7E,UAAM,IAAI,KAAK,IAAI,EAAE,MAAM,SAAS,EAAE,aAAa,IAAI,OAAO,UAAU;AACxE,UAAM,SAAS,YAAY,MAAM,SAAS,GAAG;AAC7C,UAAM,SAAS,IAAI,aAAa;AAChC,WACE,gBAAAH,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACvC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,IAAI,IAAI,OAAO,UAAU;AAAA,UACzB,MAAM,IAAI,OAAO;AAAA,UAChB,GAAI,IAAI,OAAO,aACZ,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAChD,CAAC;AAAA;AAAA,MACP;AAAA,MACA,gBAAAA,KAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,WAAW,QAAQ,GAAG,MAAM,QAAQ;AAAA,MAC7D,gBAAAA,KAAC,QAAK,MAAM,MAAM,QAAQ,aAAa,MAAM,OAAO,GAAG,GAAG,WAAW,GAAG,OAAO,MAAM,WAAW,OAAO,QAAQ;AAAA,MAC9G,aAAa,IAAI,CAAC,UAAU,MAC3B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,GAAG,QAAQ,IAAI,EAAE,aAAa,EAAE;AAAA,UAChC,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU,EAAE;AAAA,UACZ,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB,+BAAqB,UAAU,EAAE,QAAQ,IAAI,OAAO,QAAQ,UAAU,IAAI,OAAO,KAAK,CAAC;AAAA;AAAA,QARnF;AAAA,MASP,CACD;AAAA,OACH;AAAA,EAEJ;AACF;;;ACXQ,gBAAAK,MASE,QAAAC,aATF;AAhER,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,UAAU;AAChB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAU1B,IAAM,oBAAoB;AAE1B,SAAS,cAAc,OAAiB,GAAW;AACjD,QAAM,YAAY,IAAI,IAAI,UAAU,gBAAgB;AACpD,QAAM,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB,GAAG,CAAC;AAE/D,MAAI,WAAW;AACf,MAAI,aAAa;AAEjB,MAAI,eAAe,WAAW,YAAY,eAAe,GAAG;AAC1D,eAAW,KAAK,IAAI,eAAe,KAAK,MAAM,WAAW,YAAY,CAAC;AACtE,iBAAa,KAAK,MAAM,WAAW,iBAAiB;AAAA,EACtD;AAOA,QAAM,kBAAkB,WAAW;AACnC,QAAM,cAAc,MAAM;AAAA,IAAI,CAAC,SAC7B,iBAAiB,IAAI,IAAI,kBACrB,gBAAgB,MAAM,eAAe,IACrC;AAAA,EACN;AAEA,QAAM,aAAa,UAAU;AAC7B,QAAM,SAAS,MAAM,SAAS,aAAa,IAAI;AAE/C,SAAO,EAAE,UAAU,YAAY,YAAY,QAAQ,YAAY;AACjE;AAEO,IAAM,OAA4B;AAAA,EACvC,QAAQ,OAAO,GAAG;AAChB,UAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,UAAM,EAAE,OAAO,IAAI,cAAc,OAAO,CAAC;AACzC,WAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,UAAM,EAAE,UAAU,YAAY,YAAY,QAAQ,YAAY,IAC5D,cAAc,OAAO,IAAI,CAAC;AAE5B,WACE,gBAAAA,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACvC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,IAAI;AAAA,UACX;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA;AAAA,MACR;AAAA,MACC,YAAY,IAAI,CAAC,MAAM,MACtB,gBAAAC,MAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,UAAU,eAAe;AAAA,YAC5B,GAAG,UAAU,IAAI,aAAa;AAAA,YAC9B,YAAY,IAAI,MAAM;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,YACN,kBAAiB;AAAA,YACjB,YAAW;AAAA,YAEV,cAAI;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,UAAU,IAAI,aAAa;AAAA,YAC9B,YAAY,IAAI,MAAM;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,YACN,kBAAiB;AAAA,YACjB,UAAS;AAAA,YAER;AAAA;AAAA,QACH;AAAA,WAtBM,CAuBR,CACD;AAAA,OACH;AAAA,EAEJ;AACF;;;ACIc,gBAAAE,OAoBA,QAAAC,aApBA;AAvGd,IAAM,MAAM;AACZ,IAAM,SAAS;AAKR,SAAS,WAAW,OAA+B;AACxD,MAAI,UAAU,KAAM,QAAO,EAAE,OAAO,UAAK,OAAO,UAAU;AAC1D,MAAI,UAAU,OAAQ,QAAO,EAAE,OAAO,UAAK,OAAO,UAAU;AAC5D,SAAO,EAAE,OAAO,UAAK,OAAO,GAAG;AACjC;AAKO,SAAS,oBACd,OACA,MACA,gBACiD;AACjD,QAAM,aAAa,iBAAiB,KAAK;AACzC,QAAM,YAAY,OAAO,iBAAiB,IAAI,IAAI;AAClD,QAAM,gBACJ,YAAY,KAAK,aAAa,IAC1B,KAAK,MAAO,iBAAiB,cAAe,aAAa,UAAU,IACnE;AACN,SAAO,EAAE,eAAe,cAAc,iBAAiB,cAAc;AACvE;AAQO,SAAS,cACd,OACA,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,KAAK,KAAK;AACpB,SAAO,KAAK,MAAM,KAAK,EAAE,SAAS,CAAC,IAAI,SAAY;AACrD;AAGA,SAAS,UAAU,OAAyB;AAC1C,SAAO,MAAM,MAAM,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,SAAS,KAAK;AAC7D;AAEO,IAAM,MAA0B;AAAA,EACrC,QAAQ,OAAO;AACb,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,MAAM,MAAM;AACtB,UAAM,SAAS,IAAI,IAAI,OAAO,IAAI,MAAM;AACxC,UAAM,WAAW,UAAU,KAAK;AAEhC,UAAM,QAAQ,KAAK,IAAI,UAAU,IAAI,KAAK,QAAQ;AAClD,UAAM,gBAAgB,QAAQ,YAAY;AAC1C,WACE,gBAAAD,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,QAAQ,KAAK,QAAQ;AAC3B,YAAM,KAAK,KAAK,QAAQ,WAAW,KAAK,KAAK,IAAI;AACjD,YAAM,aAAa,KACf,GAAG,SAAS,IAAI,OAAO,QACvB,IAAI,OAAO;AAYf,YAAM,WAAW,OAAO,KAAK,KAAK;AAClC,YAAM,OAAO,cAAc,UAAU,KAAK,IAAI;AAC9C,YAAM,iBAAiB,QAAQ;AAC/B,YAAM,EAAE,eAAe,aAAa,IAAI;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,WAAW,UAAU;AAAA,QACvC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,YAAM,eAAe,KAAK,MAAM,YAAY,WAAW,IAAI;AAC3D,YAAM,aAAa,OACf,gBAAgB,MAAM,eAAe,YAAY,IACjD;AACJ,YAAM,cAAc,WAAW,KAAK,OAAO;AAAA,QACzC,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,aACE,gBAAAC,MAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,IAAI,IAAI,OAAO,UAAU;AAAA,YACzB,MAAM,IAAI,OAAO;AAAA,YAChB,GAAI,IAAI,OAAO,aACZ,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAChD,CAAC;AAAA;AAAA,QACP;AAAA,QACC,KAAK,QACJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,GAAG,QAAQ;AAAA,YACX,GAAG,KAAK;AAAA,YACR,MAAM;AAAA,YACN,OAAO,IAAI,OAAO;AAAA;AAAA,QACpB;AAAA,QAEF,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,IAAI,KAAK,OAAO,KAAK,MAAM;AAAA,YAC3B,UAAU,YAAY;AAAA,YACtB,YAAW;AAAA,YACX,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB;AAAA,0BAAY;AAAA,cACZ,cAAc,QACb,gBAAAD,MAAC,WAAM,UAAU,cAAc,MAAM,IAAI,OAAO,OAC7C,sBACH;AAAA;AAAA;AAAA,QAEJ;AAAA,QACC,MACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ,QAAQ;AAAA,YACnB,GAAG,KAAK;AAAA,YACR,YAAW;AAAA,YACX,UAAU;AAAA,YACV,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,aAAG;AAAA;AAAA,QACN;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,GAAG,KAAK;AAAA,YACR,UAAU,YAAY;AAAA,YACtB,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,sBAAY;AAAA;AAAA,QACf;AAAA,QACC,KAAK,UACJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,GAAG,MAAM;AAAA,YACT,UAAU;AAAA,YACV,MAAM,IAAI,OAAO;AAAA,YACjB,aAAa;AAAA,YACb,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,qBAAW,KAAK,QAAQ,EAAE,UAAU,QAAQ,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC,EAAE;AAAA;AAAA,QACnF;AAAA,WAtEI,CAwER;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;AClKU,SAWA,YAAAE,WAXA,OAAAC,OAWA,QAAAC,aAXA;AAdV,IAAM,cAAc;AAEb,IAAM,QAA8B;AAAA,EACzC,QAAQ,QAAQ,GAAG;AAEjB,WAAO,KAAK,IAAI,KAAK,MAAM,IAAI,GAAG,GAAG,WAAW;AAAA,EAClD;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,IAAI,GAAG,GAAG,WAAW;AAC1D,UAAM,MAAM,IAAI,SAAS,MAAM,QAAQ,GAAG;AAE1C,WACE,gBAAAA,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,YACC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,qBACE,MAAM,QAAQ,UAAU,mBAAmB;AAAA;AAAA,MAE/C,IAEA,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR,MAAM,IAAI,OAAO;AAAA;AAAA,QACnB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAW;AAAA,YACX,GAAG,IAAI,IAAI;AAAA,YACX,GAAG,OAAO;AAAA,YACV,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAClB;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAGF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,IAAI,IAAI;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,MAAK;AAAA,UACL,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAa;AAAA;AAAA,MACf;AAAA,MACC,MAAM,YACJ,MAAM;AACL,cAAM,gBAAgB,WAAW,MAAM,SAAS;AAAA,UAC9C,UAAU,IAAI,IAAI;AAAA,UAClB,UAAU;AAAA,UACV,aAAa;AAAA,QACf,CAAC;AACD;AAAA;AAAA;AAAA,UAGE,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG;AAAA,gBACH,GAAG,OAAO;AAAA,gBACV,OAAO,IAAI;AAAA,gBACX,QAAQ;AAAA,gBACR,MAAM,IAAI,OAAO;AAAA,gBACjB,aAAa;AAAA;AAAA,YACf;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,IAAI,IAAI;AAAA,gBACX,GAAG,OAAO;AAAA,gBACV,YAAW;AAAA,gBACX,UAAU,cAAc;AAAA,gBACxB,MAAM,IAAI,OAAO;AAAA,gBACjB,YAAY,IAAI,MAAM;AAAA,gBACtB,kBAAiB;AAAA,gBAEhB,wBAAc;AAAA;AAAA,YACjB;AAAA,aACF;AAAA;AAAA,MAEJ,GAAG;AAAA,OACP;AAAA,EAEJ;AACF;;;AClBQ,SASA,YAAAE,WATA,OAAAC,OASA,QAAAC,cATA;AAhFR,IAAM,aAAa;AACnB,IAAMC,OAAM;AACZ,IAAM,YAAY;AAQlB,SAAS,UACP,GACA,UACA,GACA,GACkD;AAClD,MAAI,aAAa,WAAW,KAAK,GAAG;AAClC,UAAM,QAAQ,KAAK,OAAO,IAAIA,QAAO,IAAI;AACzC,UAAM,QAAQ,IAAIA,OAAM;AACxB,UAAM,OAAO,IAAI;AACjB,UAAM,SAAS,IAAIA,QAAO,OAAO,MAAM;AACvC,WAAO;AAAA,MACL,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AAAA,MAC1B,GAAG,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,OAAO;AAAA,QACzC,GAAG,QAAQA;AAAA,QACX,GAAG,KAAK,OAAO,QAAQA,QAAO,CAAC;AAAA,QAC/B,GAAG;AAAA,QACH,GAAG,KAAK,MAAM,KAAK;AAAA,MACrB,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,MAAM,GAAG;AACX,UAAMC,OAAM,IAAID,QAAO;AACvB,UAAM,MAAM,IAAIA,QAAO;AACvB,WAAO,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,MAC9B,GAAG,KAAK,OAAOC,MAAKD,SAAQ,IAAI,EAAE;AAAA,MAClC,GAAG,KAAK,OAAO,KAAKA,QAAO,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,MAC5C,GAAG,KAAK,MAAMC,GAAE;AAAA,MAChB,GAAG,KAAK,MAAM,EAAE;AAAA,IAClB,EAAE;AAAA,EACJ;AACA,QAAM,MAAM,IAAID,QAAO,IAAI,MAAM;AACjC,SAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO;AAAA,IAC1C,GAAG,KAAK,OAAO,KAAKA,QAAO,CAAC;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG,KAAK,MAAM,EAAE;AAAA,IAChB;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,eAAe,OAAuB,GAAmB;AAChE,QAAM,IAAI,MAAM,MAAM;AACtB,MAAI,MAAM,aAAa,WAAW,KAAK,EAAG,QAAO;AACjD,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,MAAM,IAAIA,QAAO,IAAI,MAAM;AACjC,SAAO,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG,UAAU;AACnD;AAMA,SAAS,gBAAgB,OAAgC;AACvD,QAAM,WAAW,MAAM,MAAM,WAAW,KAAM,MAAM,aAAa,WAAW,MAAM,MAAM,UAAU;AAClG,SAAO,CAAC,YAAY,MAAM,MAAM,KAAK,CAAC,OAAO,GAAG,OAAO;AACzD;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,KACxC;AAAA,UACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,MAC3E,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,YAAW;AAAA,UACX,GAAG,KAAK,IAAI;AAAA,UACZ,GAAG,KAAK,IAAI;AAAA,UACZ,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,KAAK,IAAI;AAAA,QAChB,QAAQ,KAAK,IAAI;AAAA,QACjB,MAAK;AAAA,QACL,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAa;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;AAEO,IAAM,YAAsC;AAAA,EACjD,QAAQ,OAAO,GAAG;AAChB,WAAO,eAAe,OAAO,CAAC,KAAK,gBAAgB,KAAK,IAAI,YAAY;AAAA,EAC1E;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,QAAQ,eAAe,OAAO,IAAI,CAAC;AACzC,UAAM,QAAQ,UAAU,MAAM,MAAM,QAAQ,MAAM,UAAU,IAAI,GAAG,KAAK;AACxE,WACE,gBAAAA,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,MAAM,IAAI,SAAS,KAAK,QAAQ,GAAG;AACzC,aACE,gBAAAC,OAAC,OACE;AAAA,mBAAW,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,QAC7B,gBAAgB,KAAK,KAAK,KAAK,YAC7B,MAAM;AACL,gBAAM,SAAS,WAAW,KAAK,SAAS;AAAA,YACtC,UAAU,KAAK,IAAI;AAAA,YACnB,UAAU;AAAA,YACV,aAAa;AAAA,UACf,CAAC;AACD;AAAA;AAAA;AAAA,YAGE,gBAAAA,OAAAF,WAAA,EACE;AAAA,8BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,KAAK;AAAA,kBACR,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,kBACrB,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,MAAM,IAAI,OAAO;AAAA;AAAA,cACnB;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,KAAK,IAAI;AAAA,kBACZ,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,kBACrB,UAAU,OAAO;AAAA,kBACjB,MAAM,IAAI,OAAO;AAAA,kBACjB,YAAY,IAAI,MAAM;AAAA,kBACtB,kBAAiB;AAAA,kBAEhB,iBAAO;AAAA;AAAA,cACV;AAAA,eACF;AAAA;AAAA,QAEJ,GAAG;AAAA,WAhCC,CAiCR;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;AC5IQ,SASA,YAAAI,WATA,OAAAC,OASA,QAAAC,cATA;AA7BR,IAAMC,eAAc;AACpB,IAAMC,OAAM;AACZ,IAAM,UAAU;AAEhB,SAAS,WAAW,GAAmB;AACrC,QAAM,QAAQ,IAAIA,QAAO;AACzB,SAAO,KAAK,IAAI,KAAK,MAAM,OAAO,IAAI,GAAGD,YAAW;AACtD;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,MAAM,IAAI,SAAS,QAAQ,GAAG;AACpC,QAAM,SAAS,WAAW,OAAO,EAAE,UAAU,IAAI,IAAI,UAAU,IAAI,aAAa,GAAG,CAAC;AACpF,SACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,CAAC,OACzB;AAAA,UACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,MACjE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,YAAW;AAAA,UACX,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,UACP,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,MAAK;AAAA,QACL,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAa;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,YAAW;AAAA,QACX,UAAU,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB,iBAAO;AAAA;AAAA,IACV;AAAA,IACA,gBAAAA,MAAC,UAAK,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,KACjF;AAEJ;AAEO,IAAM,eAA4C;AAAA,EACvD,QAAQ,QAAQ,GAAG;AACjB,WAAO,WAAW,CAAC,IAAI;AAAA,EACzB;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,WAAW,IAAI,CAAC;AAC1B,UAAM,OAAO,KAAK,OAAO,IAAI,IAAIG,QAAO,CAAC;AACzC,UAAM,QAAQ,MAAM,SAAS,UAAU;AACvC,WACE,gBAAAF,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,iBAAW,EAAE,UAAU,MAAM,KAAK,UAAU,OAAO,MAAM,KAAK,OAAO,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,MAC5F,WAAW;AAAA,QACV,UAAU,MAAM,MAAM;AAAA,QACtB,OAAO,MAAM,MAAM;AAAA,QACnB,GAAG,OAAOE;AAAA,QACV,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACA;AAAA;AAAA,QAEC,gBAAAF,OAAC,OACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,IAAI,IAAI;AAAA,cACZ,IAAI,IAAI;AAAA,cACR,GAAG;AAAA,cACH,MAAM,IAAI,OAAO;AAAA,cACjB,QAAO;AAAA,cACP,aAAa;AAAA;AAAA,UACf;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,IAAI,IAAI;AAAA,cACX,GAAG,IAAI,IAAI;AAAA,cACX,YAAW;AAAA,cACX,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY,IAAI,MAAM;AAAA,cACtB,MAAM,IAAI,OAAO;AAAA,cACjB,kBAAiB;AAAA,cAClB;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,QAGA,gBAAAA,MAAAD,WAAA,EACG,WAAC,GAAG,OAAOI,IAAG,EAAE,IAAI,CAAC,GAAG,MACvB,gBAAAF,OAAC,OAAU,WAAW,aAAa,IAAI,EAAE,QACvC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG;AAAA,cACH,OAAO,MAAM,IAAI,KAAK;AAAA,cACtB,QAAQ;AAAA,cACR,MAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA;AAAA,UAChD;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,MAAM,IAAI,KAAK;AAAA,cAClB,GAAG;AAAA,cACH,YAAW;AAAA,cACX,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY,IAAI,MAAM;AAAA,cACtB,MAAM,IAAI,OAAO;AAAA,cACjB,kBAAiB;AAAA,cAEhB,gBAAM,IAAI,WAAW;AAAA;AAAA,UACxB;AAAA,aAnBM,CAoBR,CACD,GACH;AAAA;AAAA,OAEJ;AAAA,EAEJ;AACF;;;AC9CI,qBAAAI,WAEI,OAAAC,OAuCA,QAAAC,cAzCJ;AAvGJ,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAE5B,IAAM,gBAAgB;AAEtB,IAAM,mBAAmB;AAIzB,IAAM,4BAA4B;AAIlC,IAAM,iBAAiB;AAEvB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAQ/B,SAAS,WAAW,GAAW,GAAuC;AACpE,MAAI,KAAK,EAAG,QAAO;AACnB,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,IAAI,EAAG,QAAO;AACxB,SAAO;AACT;AAOA,SAASC,YAAW,MAAsB;AACxC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAM,KAAK,KAAK,IAAI,KAAK,WAAW,CAAC,IAAK;AAAA,EAC5C;AACA,SAAO,KAAK,IAAI,CAAC;AACnB;AAaA,SAAS,gBAAgB,QAAgB,GAAW,GAAW,MAAuB;AACpF,SAAO,GAAG,MAAM,IAAIA,YAAW,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,EAAE,CAAC;AACrE;AAQA,SAAS,mBAAmB,KAAa,QAAwB;AAC/D,QAAM,QAAQ,sBAAsB,KAAK,GAAG;AAC5C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AACnC,QAAM,QAAQ,CAAC,YAAoB,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,UAAU,MAAM,CAAC,CAAC;AAC1F,QAAM,IAAI,MAAO,SAAS,KAAM,GAAI;AACpC,QAAM,IAAI,MAAO,SAAS,IAAK,GAAI;AACnC,QAAM,IAAI,MAAM,QAAQ,GAAI;AAC5B,SAAO,KAAM,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC;AACnF;AAUA,SAAS,gBACP,IACA,GACA,SACA,OACA,YACc;AACd,QAAMC,aAAY,UAAU;AAC5B,QAAM,KAAe,CAAC;AACtB,WAAS,IAAI,GAAG,KAAK,gBAAgB,KAAK;AACxC,UAAM,IAAI,UAAW,QAAQ,KAAM,iBAAiB;AACpD,QAAI,KAAK,IAAI,IAAIA,UAAS,IAAI,KAAM,IAAG,KAAK,CAAC;AAAA,EAC/C;AACA,SACE,gBAAAH,MAAAD,WAAA,EACG,aAAG,IAAI,CAAC,GAAG,MACV,gBAAAC;AAAA,IAAC;AAAA;AAAA,MAEC,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,aAAa;AAAA;AAAA,IAPR;AAAA,EAQP,CACD,GACH;AAEJ;AAEO,SAAS,UACd,QACA,UACA,IACA,IACA,GACA,GACA,YACA,WACAI,cACc;AACd,QAAM,MAAM,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACxD,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9B,QAAM,SAAS,OAAO,CAAC,GAAG,QAAQ,CAAC;AACnC,QAAM,SAAS,IAAI,KAAK,IAAI,OAAO,QAAQ,CAAC;AAC5C,QAAM,UAAU,KAAK;AACrB,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,gBAAgB,gBAAgB;AAG9D,QAAM,aAAa,gBAAgB,kBAAkB,GAAG,GAAG,MAAM;AACjE,QAAM,gBAAgB,mBAAmBA,cAAa,yBAAyB;AAC/E,SACE,gBAAAH,OAAAF,WAAA,EACE;AAAA,oBAAAC,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAI,YAAY,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GACvD;AAAA,sBAAAD,MAAC,UAAK,QAAO,MAAK,WAAWI,cAAa;AAAA,MAC1C,gBAAAJ,MAAC,UAAK,QAAO,QAAO,WAAW,eAAe;AAAA,OAChD,GACF;AAAA,IACC,gBAAgB,IAAI,GAAG,SAAS,OAAO,UAAU;AAAA,IACjD,OAAO,IAAI,CAAC,GAAG,MAAM;AACpB,YAAM,OAAQ,EAAE,IAAI,MAAO;AAC3B,YAAM,OAAO,KAAK,IAAI,SAAS;AAC/B,YAAM,OAAO,SAAS;AACtB,YAAM,OAAO,UAAU,QAAQ;AAG/B,YAAM,QAAQ,EAAE,MAAM;AACtB,YAAM,WAAW,WAAW,OAAO,EAAE,CAAC,GAAG;AAAA,QACvC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,aACE,gBAAAC,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM,QAAQI,eAAc,QAAQ,UAAU;AAAA,YAC9C,SAAS,QAAQ,IAAI;AAAA;AAAA,QACvB;AAAA,QACA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,OAAO,OAAO;AAAA,YACjB,GAAG,OAAO;AAAA,YACV,YAAW;AAAA,YACX,UAAU;AAAA,YACV,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,YAAE;AAAA;AAAA,QACL;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,OAAO,OAAO;AAAA,YACjB,GAAG,KAAK,IAAI;AAAA,YACZ,YAAW;AAAA,YACX,UAAU,SAAS;AAAA,YACnB,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,mBAAS;AAAA;AAAA,QACZ;AAAA,WA5BM,CA6BR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEO,SAAS,WACd,QACA,SACA,IACA,IACA,GACA,GACA,YACA,WACAI,cACc;AACd,QAAM,UAAU,KAAK;AACrB,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,gBAAgB,gBAAgB;AAC9D,QAAMD,aAAY,UAAU;AAC5B,QAAM,iBAAiB,OAAO,CAAC,GAAG,QAAQ,CAAC;AAC3C,QAAM,mBAAmB,IAAI,KAAK,IAAI,eAAe,SAAS,GAAG,CAAC;AAClE,SACE,gBAAAF,OAAAF,WAAA,EACG;AAAA,oBAAgB,IAAI,GAAG,SAAS,OAAO,UAAU;AAAA,IACjD,OAAO,IAAI,CAAC,GAAG,SAAS;AACvB,YAAM,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;AACjD,YAAM,SAAS,EAAE,KAAK,IAAI,CAAC,GAAG,OAAO;AAAA,QACnC,GAAG,KAAM,IAAI,KAAK,IAAI,EAAE,KAAK,SAAS,GAAG,CAAC,IAAK;AAAA,QAC/C,GAAG,UAAU,QAAS,EAAE,IAAI,MAAO;AAAA,QACnC,SAAS,EAAE;AAAA,MACb,EAAE;AACF,YAAM,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AACvD,YAAM,QAAQ,OAAO,CAAC;AACtB,YAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AAIrC,YAAM,SAAS,gBAAgB,mBAAmB,IAAI,IAAI,GAAG,GAAG,CAAC;AACjE,aACE,gBAAAE,OAAC,OACE;AAAA,iBAAS,QACR,gBAAAA,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GACnD;AAAA,4BAAAD,MAAC,UAAK,QAAO,MAAK,WAAWI,cAAa,aAAa,qBAAqB;AAAA,YAC5E,gBAAAJ,MAAC,UAAK,QAAO,QAAO,WAAWI,cAAa,aAAa,wBAAwB;AAAA,aACnF,GACF;AAAA,UACA,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ,GAAG,GAAG,IAAI,KAAK,CAAC,IAAIG,UAAS,IAAI,MAAM,CAAC,IAAIA,UAAS;AAAA,cAC7D,MAAM,QAAQ,MAAM;AAAA,cACpB,QAAO;AAAA;AAAA,UACT;AAAA,WACF;AAAA,QAEF,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAQ,QAAQ,OAAO,QAAQ,MAAM;AAAA,YACrC,aAAa;AAAA;AAAA,QACf;AAAA,QAIC,SAAS,KACR,OAAO,IAAI,CAAC,GAAG,MAAM;AACnB,gBAAM,WAAW,WAAW,OAAO,eAAe,CAAC,GAAG,KAAK,EAAE,GAAG;AAAA,YAC9D,UAAU;AAAA,YACV,UAAU;AAAA,YACV,aAAa;AAAA,UACf,CAAC;AACD,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG,EAAE;AAAA,cACL,GAAG,KAAK,IAAI;AAAA,cACZ,YAAY,WAAW,GAAG,OAAO,MAAM;AAAA,cACvC,UAAU,SAAS;AAAA,cACnB,MAAM;AAAA,cACN,kBAAiB;AAAA,cAEhB,mBAAS;AAAA;AAAA,YARL,OAAO,CAAC;AAAA,UASf;AAAA,QAEJ,CAAC;AAAA,QAGF,SACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,MAAM;AAAA,YACT,GAAG,MAAM,IAAI;AAAA,YACb,YAAY,WAAW,GAAG,OAAO,MAAM;AAAA,YACvC,UAAU;AAAA,YACV,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QAED,QAAQ,SAAS,SAChB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK;AAAA,YACR,GAAG,KAAK,IAAI;AAAA,YACZ,YAAY,WAAW,OAAO,SAAS,GAAG,OAAO,MAAM;AAAA,YACvD,UAAU;AAAA,YACV,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,eAAK;AAAA;AAAA,QACR;AAAA,QAKD,QACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,KAAK;AAAA,cACT,IAAI,KAAK;AAAA,cACT,GAAG;AAAA,cACH,MAAK;AAAA,cACL,QAAQI;AAAA,cACR,eAAe;AAAA;AAAA,UACjB;AAAA,UACA,gBAAAJ,MAAC,YAAO,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,gBAAgB,MAAMI,cAAa;AAAA,WACxE;AAAA,WAtFI,IAwFR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEO,SAAS,UACd,QACA,SACA,IACA,IACA,GACA,GACA,aACA,YACA,cACc;AACd,QAAM,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AACjC,QAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC;AAC9C,MAAI,UAAU,EAAG,QAAO,gBAAAJ,MAAAD,WAAA,EAAE;AAC1B,MAAI,MAAM;AACV,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI;AAC/B,SACE,gBAAAC,MAAAD,WAAA,EACG,eAAK,IAAI,CAAC,GAAG,MAAM;AAClB,UAAM,SAAU,MAAM,QAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACvD,WAAO,EAAE;AACT,UAAM,OAAQ,MAAM,QAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACrD,UAAM,QAAQ,OAAO,SAAS,KAAK,KAAK,IAAI;AAC5C,UAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI;AACnC,UAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI;AACnC,UAAM,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI;AACjC,UAAM,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI;AACjC,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;AAAA,QACnE,MAAM,QAAQ,IAAI,QAAQ,MAAM;AAAA;AAAA,MAF3B;AAAA,IAGP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEO,SAAS,aACd,QACA,SACA,IACA,IACA,GACA,GACA,aACA,YACA,cACc;AACd,QAAM,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AACjC,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;AAC/C,QAAM,QAAQ,IAAI,KAAK,IAAI,KAAK,QAAQ,CAAC;AACzC,SACE,gBAAAA,MAAAD,WAAA,EACG,eAAK,IAAI,CAAC,GAAG,MAAM;AAClB,UAAM,QAAQ,EAAE,IAAI;AACpB,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,MAAM,IAAI,QAAQ;AAC/B,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,KAAK,IAAI,QAAQ;AAAA,QACpB,OAAO;AAAA,QACP,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ,IAAI,QAAQ,MAAM;AAAA;AAAA,MAL3B;AAAA,IAMP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAOA,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AAEhB,SAAS,eACd,QACA,UACA,IACA,IACA,GACA,GACA,YACA,WACAI,cACc;AACd,QAAM,WAAW,OAAO,CAAC,GAAG,QAAQ,CAAC;AACrC,QAAM,SAAS,OAAO,CAAC,GAAG,QAAQ,CAAC;AACnC,QAAM,OAAO,KAAK,IAAI,SAAS,QAAQ,OAAO,MAAM;AACpD,MAAI,SAAS,EAAG,QAAO,gBAAAJ,MAAAD,WAAA,EAAE;AACzB,QAAM,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACnD,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9B,QAAM,QAAQ,KAAK,mBAAmB;AACtC,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,mBAAmB,KAAK,EAAE;AACxD,QAAM,OAAO,IAAI;AACjB,QAAM,KAAK,CAAC,MAAc,QAAS,IAAI,MAAO;AAC9C,SACE,gBAAAC,MAAAD,WAAA,EACG,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM;AACtC,UAAM,OAAO,SAAS,CAAC;AACvB,UAAM,KAAK,OAAO,CAAC;AACnB,UAAM,KAAK,KAAK,IAAI,OAAO,OAAO;AAClC,UAAM,QAAQ,WAAW,OAAO,KAAK,CAAC,GAAG;AAAA,MACvC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,UAAM,KAAK,GAAG,KAAK,CAAC;AACpB,UAAM,KAAK,GAAG,GAAG,CAAC;AAClB,WACE,gBAAAE,OAAC,OACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA,UACR,YAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,YAAW;AAAA,UACX,MAAM;AAAA,UACN,kBAAiB;AAAA,UAEhB,gBAAM;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA,MAAC,UAAK,IAAQ,IAAI,IAAI,IAAQ,IAAI,IAAI,QAAQ,YAAY,aAAa,GAAG,eAAe,MAAM;AAAA,MAC/F,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAQ,GAAG,gBAAgB,MAAM,YAAY;AAAA,MAC7D,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAQ,GAAG,iBAAiB,KAAK,MAAMI,cAAa;AAAA,MACpE,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG,KAAK;AAAA,UACR,YAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAM;AAAA,UACN,kBAAiB;AAAA,UAEhB,eAAK;AAAA;AAAA,MACR;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK,iBAAiB;AAAA,UACzB,GAAG,KAAK;AAAA,UACR,UAAU;AAAA,UACV,YAAW;AAAA,UACX,MAAMI;AAAA,UACN,kBAAiB;AAAA,UAEhB,aAAG;AAAA;AAAA,MACN;AAAA,SAlCM,CAmCR;AAAA,EAEJ,CAAC,GACH;AAEJ;AAOA,IAAM,gBAAgB;AAEf,SAAS,oBACd,QACA,UACA,IACA,IACA,GACA,GACA,YACA,WACAA,cACc;AACd,QAAM,SAAS,OAAO,CAAC,GAAG,QAAQ,CAAC;AACnC,MAAI,OAAO,WAAW,EAAG,QAAO,gBAAAJ,MAAAD,WAAA,EAAE;AAClC,QAAM,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;AACjD,QAAM,OAAO,IAAI,OAAO;AACxB,QAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,gBAAgB,KAAK,EAAE;AACrD,QAAM,aAAa,gBAAgB,mBAAmB,GAAG,GAAG,MAAM;AAClE,QAAM,gBAAgB,mBAAmBK,cAAa,yBAAyB;AAC/E,SACE,gBAAAH,OAAAF,WAAA,EACE;AAAA,oBAAAC,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAI,YAAY,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GACvD;AAAA,sBAAAD,MAAC,UAAK,QAAO,MAAK,WAAW,eAAe;AAAA,MAC5C,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAWI,cAAa;AAAA,OAC9C,GACF;AAAA,IACC,OAAO,IAAI,CAAC,GAAG,MAAM;AACpB,YAAM,OAAQ,EAAE,IAAI,MAAO;AAC3B,YAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,YAAM,OAAO,KAAK,IAAI,GAAG,OAAO,EAAE;AAClC,YAAM,QAAQ,EAAE,MAAM;AACtB,YAAM,QAAQ,WAAW,OAAO,EAAE,CAAC,GAAG;AAAA,QACpC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,aACE,gBAAAH,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK;AAAA,YACR,GAAG,OAAO,OAAO,IAAI;AAAA,YACrB,YAAW;AAAA,YACX,UAAU,MAAM;AAAA,YAChB,YAAW;AAAA,YACX,MAAM;AAAA,YACN,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM,QAAQI,eAAc,QAAQ,UAAU;AAAA,YAC9C,SAAS,QAAQ,IAAI;AAAA;AAAA,QACvB;AAAA,QACA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ,OAAO;AAAA,YAClB,GAAG,OAAO,OAAO,IAAI;AAAA,YACrB,UAAU;AAAA,YACV,YAAW;AAAA,YACX,MAAM,QAAQI,eAAc;AAAA,YAC5B,kBAAiB;AAAA,YAEhB,YAAE;AAAA;AAAA,QACL;AAAA,WA7BM,CA8BR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAMA,IAAM,mBAAmB;AAElB,SAAS,YACd,QACA,SACA,IACA,IACA,GACA,GACA,YACA,WACA,cACc;AACd,QAAM,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AACjC,QAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC;AAC9C,MAAI,UAAU,EAAG,QAAO,gBAAAJ,MAAAD,WAAA,EAAE;AAC1B,MAAI,MAAM;AACV,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI;AAC/B,QAAM,KAAK,IAAI;AACf,QAAM,aAAa,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC5E,QAAM,SAAS,WAAW,YAAY,EAAE,UAAU,KAAK,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC;AAC3F,SACE,gBAAAE,OAAAF,WAAA,EACG;AAAA,SAAK,IAAI,CAAC,GAAG,MAAM;AAClB,YAAM,SAAU,MAAM,QAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACvD,aAAO,EAAE;AACT,YAAM,OAAQ,MAAM,QAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACrD,YAAM,QAAQ,OAAO,SAAS,KAAK,KAAK,IAAI;AAC5C,YAAM,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;AACpC,YAAM,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;AACpC,YAAM,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI;AAClC,YAAM,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI;AAClC,YAAM,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI;AAClC,YAAM,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI;AAClC,YAAM,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;AACpC,YAAM,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;AACpC,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG;AAAA,UAClH,MAAM,QAAQ,IAAI,QAAQ,MAAM;AAAA;AAAA,QAF3B;AAAA,MAGP;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,KAAK,OAAO,WAAW;AAAA,QAC1B,YAAW;AAAA,QACX,UAAU,OAAO;AAAA,QACjB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB,iBAAO;AAAA;AAAA,IACV;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,KAAK,OAAO,WAAW,OAAO;AAAA,QACjC,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM;AAAA,QACN,kBAAiB;AAAA,QAClB;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;;;ACvmBM,gBAAAK,aAAA;AA5BN,IAAM,UAAU;AAEhB,IAAM,YAAY;AAAA,EAChB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AACZ;AAGA,SAAS,gBAAgB,OAAmB;AAC1C,MAAI,MAAM,eAAe,SAAS,MAAM,cAAc,cAAc;AAClE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,eAAe,SAAS,MAAM,UAAU,SAAS;AACzD,WAAO;AAAA,EACT;AACA,SAAO,UAAU,MAAM,UAAU;AACnC;AAEO,IAAM,QAA8B;AAAA,EACzC,UAAU;AACR,WAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,WAAW,gBAAgB,KAAK;AACtC,WACE,gBAAAA,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,MACC,MAAM;AAAA,MACN,IAAI,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA,IAAI,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,IACb,GACF;AAAA,EAEJ;AACF;;;ACzDA,SAAS,YAAAC,iBAAgB;AACzB,OAAO,WAAW;AA0Qd,gBAAAC,OAmJQ,QAAAC,cAnJR;AA7PJ,SAAS,UAAU,GAA6C;AAC9D,SAAO,MAAM,OAAO,OAAO;AAC7B;AAEA,IAAM,aAAa;AACnB,IAAM,aAAa;AAUnB,IAAM,aAAa;AACnB,IAAM,SAAS;AAEf,IAAM,kBAAkB;AAExB,IAAM,iBAAiB;AACvB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAMC,aAAY;AAClB,IAAMC,iBAAgB;AACtB,IAAM,WAAW;AACjB,IAAM,aAAa;AAMnB,IAAM,kBAAkB;AAqBxB,IAAM,mBAAmB;AAIzB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AAetB,IAAM,kBAAkB,IAAIA;AAG5B,SAAS,SAAS,QAAgB,GAAmB;AAEnD,SAAO,KAAK,IAAI,IAAI,OAAO,OAAO,kBAAkB,OAAO,QAAQ,GAAG;AACxE;AAUO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,QAAQ,MACX,MAAM,gBAAgB,EACtB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC,EAAE;AAClC,MAAI,MAAM,UAAU,eAAgB,QAAO;AAC3C,SAAO,CAAC,GAAG,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,MAAM,MAAM,iBAAiB,CAAC,EAAE,KAAK,GAAG,CAAC;AAC1F;AAGA,SAAS,UAAU,OAAyB;AAC1C,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB,GAAG,CAAC;AAC3D,QAAM,QAAQ,WAAWD,aAAY,aAAa;AAClD,SAAO,KAAK,IAAI,YAAY,KAAK,IAAI,YAAY,KAAK,CAAC;AACzD;AAGA,SAAS,WAAW,OAAyB;AAC3C,SAAO,UAAU,MAAM,SAAS,KAAK;AACvC;AAQA,SAASE,eAAc,OAAuB,GAG5C;AAGA,MAAI,MAAM,aAAa,MAAM,cAAc,MAAM;AAC/C,UAAM,SAAS,cAAc,OAAO,MAAM,SAAS;AACnD,WAAO,EAAE,QAAQ,OAAO,SAAS,QAAQ,CAAC,EAAE;AAAA,EAC9C;AACA,QAAM,KAAK,cAAc,OAAO,IAAI;AACpC,QAAM,KAAK,cAAc,OAAO,IAAI;AACpC,QAAM,UAAU,SAAS,IAAI,CAAC;AAC9B,QAAM,UAAU,SAAS,IAAI,CAAC;AAC9B,SAAO,WAAW,UACd,EAAE,QAAQ,IAAI,OAAO,QAAQ,IAC7B,EAAE,QAAQ,IAAI,OAAO,QAAQ;AACnC;AAwBA,SAAS,cAAc,OAAuB,WAAkC;AAC9E,QAAM,IAAI,IAAI,MAAM,SAAS,MAAM;AACnC,IAAE,SAAS;AAAA,IACT,SAAS,UAAU,SAAS;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AACD,IAAE,oBAAoB,OAAO,CAAC,EAAE;AAEhC,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,QAAQ,oBAAoB,EAAE,KAAK;AACzC,MAAE,QAAQ,EAAE,IAAI;AAAA,MACd,OAAO,UAAU,KAAK;AAAA,MACtB,QAAQ,WAAW,KAAK;AAAA,MACxB;AAAA,MACA,MAAM,EAAE,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AACA,aAAW,KAAK,MAAM,OAAO;AAE3B,MAAE,QAAQ,EAAE,MAAM,EAAE,IAAI;AAAA,MACtB,QAAQ,EAAE,SAAS,IAAI,QAAQ,mBAAmB,GAAG,EAAE,KAAK;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,CAAC;AAEd,QAAM,aAAa,EAAE,MAAM;AAC3B,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,SAAS,WAAW,UAAU;AAEpC,QAAM,QAAsB,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO;AAChD,UAAM,IAAI,EAAE,KAAK,EAAE;AAInB,WAAO;AAAA,MACL;AAAA,MACA,GAAG,EAAE,IAAI,EAAE,QAAQ;AAAA,MACnB,GAAG,EAAE,IAAI,EAAE,SAAS;AAAA,MACpB,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,IACV;AAAA,EACF,CAAC;AAED,QAAM,QAAsB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;AAC/C,UAAM,OAAO,EAAE,KAAK,CAAC;AACrB,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SAAO,EAAE,OAAO,OAAO,OAAO,OAAO;AACvC;AAGA,SAAS,aACP,QACA,QACA,QACA,OAC2B;AAC3B,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,QAAM,MAAM,OAAO,OAAO,SAAS,CAAC;AACpC,QAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,QAAM,KAAK,IAAI,IAAI,KAAK;AACxB,QAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACvC,MAAI,QAAQ,EAAG,QAAO;AAEtB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAEhB,QAAM,KAAK,CAAC;AACZ,QAAM,KAAK;AAEX,QAAM,IAAI;AACV,QAAM,KAAK,IAAI,IAAI;AACnB,QAAM,KAAK,IAAI,IAAI;AACnB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AAGf,QAAM,MAAM;AACZ,QAAM,MAAM;AACZ,QAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK;AACrC,QAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK;AACrC,QAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK;AACrC,QAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK;AAErC,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AAAA,MACjD,MAAM;AAAA;AAAA,EACR;AAEJ;AAuCA,SAAS,iBAAiB,MAAkB,OAAuC;AACjF,MAAI,CAAC,KAAK,MAAO,QAAO;AACxB,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,KAAK,MAAM,OAAO,SAAS,CAAC;AAC3C,QAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,SAAS,OAAO,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;AAC7C,QAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,SAAS,GAAG,SAAS,CAAC,CAAC;AAC5D,QAAM,YAAY,KAAK,MAAM,MAAM,IAAI,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC;AAInE,QAAM,iBAAiB,KAAK,IAAI,IAAI,YAAY,oBAAoB,KAAK;AACzE,MAAI,iBAAiB,gBAAiB,QAAO;AAE7C,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAME,aAAY,KAAK,CAAC,CAAC;AACzE,QAAM,SAAS,WAAW,KAAK,OAAO;AAAA,IACpC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAaC;AAAA,EACf,CAAC;AAED,QAAM,SAAS,iBAAiB,OAAO,IAAI,IAAI,OAAO;AACtD,QAAM,QAAQ,SAAS,mBAAmB;AAC1C,QAAM,QAAQ,OAAO,WAAW,mBAAmB;AACnD,QAAM,IAAI,IAAI,IAAI;AAClB,QAAM,IAAI,IAAI,IAAI,QAAQ;AAQ1B,QAAM,WAAW,YAAY;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,OAAO,IAAI,QAAQ;AAAA,IACnB,OAAO,IAAI,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA,MAAM,IAAI,WAAW;AAAA,IACrB,MAAM;AAAA,EACR;AACF;AAQA,SAAS,eACP,QACA,IACA,IACQ;AACR,QAAM,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE;AAC1D,MAAI,EAAE,SAAS,GAAG;AAChB,WAAO,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,EACzE;AACA,MAAI,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK;AACrC,UAAM,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC;AAChC,UAAM,KAAK,EAAE,CAAC;AACd,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,CAAC;AACpD,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,SAAK,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEO,IAAM,YAAsC;AAAA,EACjD,QAAQ,OAAO,GAAG;AAChB,UAAM,EAAE,QAAQ,MAAM,IAAIC,eAAc,OAAO,CAAC;AAEhD,WAAO,OAAO,SAAS;AAAA,EACzB;AAAA,EAEA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,QAAQ,MAAM,IAAIA,eAAc,OAAO,IAAI,CAAC;AACpD,UAAM,SAAS;AACf,UAAM,SAAS;AAEf,UAAM,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,QAAQ,SAAS,CAAC;AAEzD,WACE,gBAAAH,OAAC,OAAE,WAAW,aAAa,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,KAG3C;AAAA,aAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAC7B,cAAM,IAAI,eAAe,KAAK,QAAQ,QAAQ,MAAM;AAEpD,eACE,gBAAAA,OAACI,WAAA,EACC;AAAA,0BAAAL;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAK;AAAA,cACL,QAAQ,IAAI,OAAO;AAAA,cACnB,aAAa;AAAA;AAAA,UACf;AAAA,UACC,aAAa,KAAK,QAAQ,QAAQ,QAAQ,IAAI,OAAO,KAAK;AAAA,aAP9C,IAAI,CAAC,EAQpB;AAAA,MAEJ,CAAC;AAAA,MAGA,OAAO,MAAM,IAAI,CAAC,MAAM;AACvB,cAAM,KAAK,EAAE,IAAI;AACjB,cAAM,KAAK,EAAE,IAAI;AACjB,cAAM,KAAK,EAAE,IAAI;AACjB,cAAM,KAAK,EAAE,IAAI;AAKjB,cAAM,OAAO,aAAa;AAC1B,cAAM,WAAW,EAAE,SAAS,YAAY,KAAK,MAAM,MAAM,OAAO;AAGhE,cAAM,aAAa,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,MAAME,aAAY,KAAK,CAAC,CAAC;AAC3E,cAAM,OAAO,EAAE,MAAM;AAAA,UAAI,CAAC,SACxB,WAAW,MAAM;AAAA,YACf,UAAU,KAAK,IAAI,IAAI,OAAO;AAAA,YAC9B,UAAU;AAAA,YACV,aAAaC;AAAA,UACf,CAAC;AAAA,QACH;AAEA,cAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC1D,cAAM,QAAQ,kBAAkB;AAChC,cAAM,aACJ,KAAK,KAAK,KAAM,EAAE,MAAM,SAAS,KAAK,QAAS;AAEjD,eACE,gBAAAF;AAAA,UAAC;AAAA;AAAA,YAEC,kBAAgB,GAAG,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE;AAAA,YAErD;AAAA,gBAAE,SAAS,YACV,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,GAAG,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC;AAAA,kBACrG,MAAM,IAAI,OAAO;AAAA,kBACjB,QAAQ,IAAI,OAAO;AAAA,kBACnB,aAAa;AAAA;AAAA,cACf,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,IAAI,EAAE,SAAS,UAAU,KAAK;AAAA,kBAC9B,MAAM,IAAI,OAAO;AAAA,kBACjB,QAAQ,IAAI,OAAO;AAAA,kBACnB,aAAa;AAAA;AAAA,cACf;AAAA,cAED,KAAK,IAAI,CAAC,QAAQ,MACjB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,GAAG,KAAK,KAAK;AAAA,kBACb,GAAG,aAAa,IAAI;AAAA,kBACpB,YAAW;AAAA,kBACX,kBAAiB;AAAA,kBACjB,YAAY,IAAI,MAAM;AAAA,kBACtB,UAAU;AAAA,kBACV,MAAM,IAAI,OAAO;AAAA,kBAEhB,iBAAO;AAAA;AAAA,gBATH;AAAA,cAUP,CACD;AAAA;AAAA;AAAA,UAnCI,EAAE;AAAA,QAoCT;AAAA,MAEJ,CAAC;AAAA,MAMA,OAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAC7B,cAAM,QAAQ,iBAAiB,MAAM,KAAK;AAC1C,YAAI,CAAC,MAAO,QAAO;AACnB,eACE,gBAAAC,OAACI,WAAA,EAcC;AAAA,0BAAAL;AAAA,YAAC;AAAA;AAAA,cACC,kBAAgB,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,cAC/E,GAAG,MAAM;AAAA,cACT,GAAG,MAAM;AAAA,cACT,OAAO,MAAM;AAAA,cACb,QAAQ,MAAM;AAAA,cACd,IAAI;AAAA,cACJ,MAAM,IAAI,OAAO;AAAA;AAAA,UACnB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,MAAM;AAAA,cACT,GAAG,MAAM;AAAA,cACT,YAAW;AAAA,cACX,kBAAiB;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,UAAU,MAAM;AAAA,cAChB,MAAM,IAAI,OAAO;AAAA,cAEhB,gBAAM;AAAA;AAAA,UACT;AAAA,aAjCa,IAAI,CAAC,EAkCpB;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;ACvfY,SACE,OAAAM,OADF,QAAAC,cAAA;AAnCZ,IAAM,UAAU;AAChB,IAAMC,OAAM;AACZ,IAAM,UAAU;AAChB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,IAAM,UAAU;AAChB,IAAM,YAAY;AAElB,IAAM,MAAM;AACZ,IAAMC,iBAAgB;AAEf,IAAM,eAA4C;AAAA,EACvD,QAAQ,OAAO;AACb,WAAO,MAAM,OAAO,UAAU,UAAUD,QAAOA;AAAA,EACjD;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,YAAY,IAAI,OAAO,SAAS,IAAI,OAAO;AACjD,WACE,gBAAAF,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,OAAO,IAAI,CAAC,OAAO,MAAM;AAC9B,YAAM,SAAS,KAAK,UAAUE;AAC9B,YAAM,QAAQ,WAAW,MAAM,OAAO;AAAA,QACpC,UAAU,UAAU,UAAU;AAAA,QAC9B,UAAU;AAAA,QACV,aAAaC;AAAA,MACf,CAAC;AACD,YAAM,QAAQ,WAAW,MAAM,MAAM,KAAK,SAAS,GAAG;AAAA,QACpD,UAAU,IAAI,IAAI,UAAU;AAAA,QAC5B,UAAU;AAAA,QACV,aAAaA;AAAA,MACf,CAAC;AACD,aACE,gBAAAF,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR,IAAI,IAAI,OAAO,UAAU;AAAA,YACzB,MAAM;AAAA;AAAA,QACR;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,SAAS;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,YAAW;AAAA,YACX,YAAY,IAAI,MAAM;AAAA,YACtB,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,SAAS;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,YAAY,IAAI,MAAM;AAAA,YACtB,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,WA7BM,CA8BR;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;ACiDQ,gBAAAI,OAoBE,QAAAC,cApBF;AAvHR,IAAM,SAAS;AACf,IAAMC,OAAM;AAGZ,IAAM,YAAY;AAClB,IAAMC,iBAAgB;AACtB,IAAM,aAAa;AACnB,IAAM,YAAY;AAClB,IAAM,YAAY,SAAS;AAC3B,IAAMC,cAAa;AASnB,SAAS,eACP,GACA,GACA,GACA,GACA,MACkD;AAClD,QAAM,iBAAiB,IAAI,IAAI,OAAO,YAAY,IAAI,IAAIF;AAC1D,MAAI,IAAI,KAAK,MAAM,GAAG;AACpB,WAAO,EAAE,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,gBAAgB,IAAI,IAAIA,IAAG,CAAC,GAAG,QAAQ,SAAS,IAAI,IAAI,EAAE;AAAA,EACpG;AACA,MAAI,IAAI,KAAK,MAAM,IAAI,GAAG;AACxB,WAAO,EAAE,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,gBAAgB,IAAIA,IAAG,CAAC,GAAG,QAAQ,OAAO,IAAI,IAAI,EAAE;AAAA,EAC9F;AACA,QAAM,gBAAgB,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;AAC3C,SAAO,EAAE,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,cAAc,CAAC,GAAG,QAAQ,UAAU,IAAI,EAAE;AACnG;AAMA,SAAS,gBAAgB,OAAsB,GAAW;AACxD,QAAM,IAAI,MAAM,WAAW;AAC3B,QAAM,OAAO,IAAI,IAAIA;AACrB,QAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,KAAK;AACtC,SAAO,MAAM,WAAW,IAAI,CAAC,GAAG,MAAM;AACpC,UAAM,IAAI,MAAM,IAAI,IAAI,IAAIA,OAAM,IAAI;AACtC,UAAM,EAAE,UAAU,QAAQ,GAAG,IAAI,eAAe,GAAG,GAAG,GAAG,GAAG,IAAI;AAChE,UAAM,QAAQ,cAAc,EAAE,OAAO;AAAA,MACnC;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC;AACD,UAAM,OAAO,EAAE,OACX,cAAc,EAAE,MAAM;AAAA,MACpB;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC,IACD;AACJ,UAAM,SAAS,MAAM,MAAM,SAAS,MAAM;AAC1C,UAAM,QAAQ,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI;AAC/D,WAAO,EAAE,GAAG,GAAG,UAAU,QAAQ,IAAI,OAAO,MAAM,QAAQ,KAAK,SAAS,MAAM;AAAA,EAChF,CAAC;AACH;AAIA,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,WAAW,eAAe;AAChC,IAAM,aAAa;AACnB,IAAM,WAAW,WAAW;AAC5B,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,SAAS,eAAe,OAAsB,GAAW;AACvD,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,QAAQ;AACtC,SAAO,MAAM,WAAW,IAAI,CAAC,MAAM;AACjC,UAAM,QAAQ,WAAW,EAAE,OAAO;AAAA,MAChC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,UAAM,OAAO,EAAE,OACX,cAAc,EAAE,MAAM;AAAA,MACpB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC,IACD;AACJ,UAAM,OACJ,KAAK,MAAM,eAAe,GAAG,KAC5B,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI;AACpD,WAAO,EAAE,GAAG,OAAO,MAAM,KAAK;AAAA,EAChC,CAAC;AACH;AAEA,SAAS,eACP,OACA,KACA,KACoB;AACpB,QAAM,OAAO,eAAe,OAAO,IAAI,CAAC;AACxC,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,aAAW,KAAK,MAAM;AACpB,YAAQ,KAAK,MAAM;AACnB,cAAU,EAAE,OAAO;AAAA,EACrB;AACA,QAAM,UAAU,QAAQ,CAAC,IAAI;AAC7B,QAAM,aAAa,QAAQ,QAAQ,SAAS,CAAC,IAAI;AACjD,SACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,SAAK,SAAS,KACb,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,QACxC,aAAa;AAAA;AAAA,IACf;AAAA,IAED,KAAK,IAAI,CAAC,EAAE,GAAG,OAAO,KAAK,GAAG,MAAM;AACnC,YAAM,MAAM,QAAQ,CAAC;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,KAAK,QAAQ,EAAE,SAAS;AAC9B,YAAM,WAAW,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AACrD,YAAM,OAAO,WAAW,EAAE,MAAM;AAAA,QAC9B,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAaG;AAAA,MACf,CAAC;AACD,aACE,gBAAAF,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,SAAS;AAAA,YACZ,YAAW;AAAA,YACX,UAAU,KAAK;AAAA,YACf,YAAW;AAAA,YACX,MAAM,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AAAA,YAC1C,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,eAAK;AAAA;AAAA,QACR;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAG,KAAK,KAAK;AAAA,YACb,MAAM,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AAAA;AAAA,QAC5C;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,SAAS;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,YAAW;AAAA,YACX,MAAM;AAAA,YACN,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QACC,OACG,KAAK,MAAM,IAAI,CAAC,MAAM,OACpB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG;AAAA,YACH,GAAG,SAAS,IAAI,KAAK,MAAM,eAAe,GAAG,IAAI,KAAK,KAAK;AAAA,YAC3D,UAAU,KAAK;AAAA,YACf,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UARI;AAAA,QASP,CACD,IACD;AAAA,WA5CE,CA6CR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEO,IAAM,WAAoC;AAAA,EAC/C,QAAQ,OAAO,GAAG,MAAgB;AAChC,QAAI,MAAM,WAAW,YAAY;AAC/B,YAAMK,QAAO,eAAe,OAAO,CAAC;AACpC,YAAM,QAAQA,MAAK,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,WAAW,SAAS;AACzE,aAAO,QAAQ,YAAYD;AAAA,IAC7B;AACA,UAAM,OAAO,gBAAgB,OAAO,CAAC;AACrC,UAAM,WAAW,KAAK,OAAO,CAAC,IAAI,MAAM,KAAK,IAAI,IAAI,EAAE,MAAM,GAAG,EAAE;AAClE,WAAO,SAAS,WAAWA;AAAA,EAC7B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,QAAI,MAAM,WAAW,WAAY,QAAO,eAAe,OAAO,KAAK,GAAG;AACtE,UAAM,OAAO,gBAAgB,OAAO,IAAI,CAAC;AACzC,WACE,gBAAAH,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACvC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,IAAIE;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,IAAI,IAAIA;AAAA,UACZ,IAAI;AAAA,UACJ,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,UACxC,aAAa;AAAA;AAAA,MACf;AAAA,MACC,KAAK,IAAI,CAAC,EAAE,GAAG,GAAG,UAAU,QAAQ,IAAI,OAAO,KAAK,GAAG,MAAM;AAC5D,cAAM,OAAO,WAAW,EAAE,MAAM;AAAA,UAC9B;AAAA,UACA,UAAU;AAAA,UACV,aAAaC;AAAA,QACf,CAAC;AACD,cAAM,UAAU,YAAY,MAAM,MAAM,SAAS,MAAM,aAAa;AACpE,eACE,gBAAAF,OAAC,OACC;AAAA,0BAAAD,MAAC,YAAO,IAAI,GAAG,IAAI,QAAQ,GAAG,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,UAC3D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG,SAAS;AAAA,cACZ,YAAY;AAAA,cACZ,MAAM,IAAI,OAAO;AAAA,cACjB,UAAU,KAAK;AAAA,cACf,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,eAAK;AAAA;AAAA,UACR;AAAA,UACC,MAAM,MAAM,IAAI,CAAC,MAAM,OACtB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG;AAAA,cACH,GAAG,YAAY,KAAK,MAAM;AAAA,cAC1B,YAAY;AAAA,cACZ,MAAM,IAAI,OAAO;AAAA,cACjB,UAAU,MAAM;AAAA,cAChB,YAAW;AAAA,cACX,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB;AAAA;AAAA,YAVI;AAAA,UAWP,CACD;AAAA,UACA,OACG,KAAK,MAAM,IAAI,CAAC,MAAM,OACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG;AAAA,cACH,GAAG,UAAU,KAAK,KAAK;AAAA,cACvB,YAAY;AAAA,cACZ,MAAM,IAAI,OAAO;AAAA,cACjB,UAAU,KAAK;AAAA,cACf,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB;AAAA;AAAA,YATI;AAAA,UAUP,CACD,IACD;AAAA,aA3CE,CA4CR;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;ACxRA,SAAS,YAAAM,iBAAgB;AAwMnB,SASM,OAAAC,OATN,QAAAC,cAAA;AAjMN,IAAM,MAAM;AACZ,IAAM,YAAY;AAClB,IAAM,QAAQ;AACd,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AAIvB,IAAMC,iBAAgB;AAMtB,SAAS,aAAa,OAAwB,cAAc,IAAc;AACxE,SAAO,CAAC,aAAa,GAAG,MAAM,OAAO;AACvC;AASA,SAAS,kBAAkB,OAGzB;AACA,QAAM,MACJ,MAAM,QAAQ,SAAS,KACvB,MAAM,KAAK,SAAS,KACpB,MAAM,KAAK;AAAA,IACT,CAAC,MACC,EAAE,MAAM,WAAW,MAAM,QAAQ,WAChC,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK;AAAA,EAC/C;AACF,MAAI,CAAC,IAAK,QAAO,EAAE,aAAa,IAAI,MAAM;AAC1C,SAAO;AAAA,IACL,aAAa,MAAM,QAAQ,CAAC;AAAA,IAC5B,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,MAAM,QAAQ,MAAM,CAAC;AAAA,MAC9B,MAAM,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,MAAM,CAAC,EAAE,EAAE;AAAA,IACjE;AAAA,EACF;AACF;AAMA,SAAS,YAAY,OAAwB,QAA0B;AACrE,MAAI,WAAW,GAAG;AAChB,WAAO,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,EACtC;AACA,SAAO,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC,KAAK,EAAE;AACxD;AAWA,SAAS,eACP,OACA,QACA,cAAc,IAC2B;AACzC,QAAM,UAAU,aAAa,OAAO,WAAW;AAC/C,QAAM,WAAW,QAAQ;AAGzB,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,UAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC;AACnD,UAAM,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB,GAAG,CAAC;AAC3D,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,QAAM,cAAc,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAGrD,QAAM,MAAM,QAAQ,IAAI,CAAC,MAAO,cAAc,IAAK,IAAI,cAAe,SAAS,SAAS,QAAS;AAIjG,QAAM,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;AACpD,QAAM,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI;AACnD,MAAI,SAAS,GAAG;AAEd,UAAM,aAAa,OAAO,OAAO,CAAC,MAAM,IAAI,SAAS;AACrD,UAAM,cAAc,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACxD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,OAAO,CAAC,IAAI,WAAW;AACzB,eAAO,CAAC,KAAK,UAAU,OAAO,CAAC,IAAI;AACnC,eAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,SAAS;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,aAAW,KAAK,QAAQ;AACtB,YAAQ,KAAK,CAAC;AACd,SAAK;AAAA,EACP;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAMA,SAAS,YAAY,MAAc,MAAcC,OAAsB;AACrE,QAAM,QAAQ,iBAAiB,IAAI;AACnC,MAAI,SAAS,EAAG,QAAOA;AACvB,QAAM,QAAQ,OAAO,QAAQ;AAC7B,SAAO,KAAK,IAAID,gBAAe,KAAK,IAAIC,OAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC1E;AAOA,SAAS,eACP,OACAA,OACQ;AACR,SAAO,KAAK,IAAIA,OAAM,GAAG,MAAM,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,YAAY,MAAM,MAAMA,KAAI,CAAC,CAAC;AACvF;AAMA,SAAS,SAAS,MAAc,MAAc,UAA0B;AACtE,QAAM,kBAAkB,OAAO,QAAQ,KAAK;AAC5C,MAAI,iBAAiB,IAAI,KAAK,eAAgB,QAAO;AAErD,QAAM,QAAQ,MAAM,KAAK,IAAI;AAC7B,QAAM,WAAW;AACjB,QAAM,gBAAgB,iBAAiB,QAAQ;AAC/C,MAAI,SAAS;AACb,MAAI,QAAQ;AAEZ,aAAW,MAAM,OAAO;AACtB,UAAM,UAAU,iBAAiB,EAAE;AACnC,QAAI,QAAQ,UAAU,gBAAgB,eAAgB;AACtD,cAAU;AACV,aAAS;AAAA,EACX;AAEA,SAAO,SAAS;AAClB;AAEO,IAAM,aAAwC;AAAA,EACnD,QAAQ,OAAO;AACb,YAAQ,MAAM,KAAK,SAAS,KAAK;AAAA,EACnC;AAAA,EAEA,OAAO,UAAU,KAAK,KAAK;AACzB,UAAM,EAAE,aAAa,MAAM,IAAI,kBAAkB,QAAQ;AACzD,UAAM,UAAU,aAAa,OAAO,WAAW;AAC/C,UAAM,WAAW,QAAQ;AACzB,UAAM,EAAE,QAAQ,QAAQ,IAAI,eAAe,OAAO,IAAI,GAAG,WAAW;AACpE,UAAM,cAAc,IAAI,OAAO,UAAU,IAAI,OAAO;AACpD,UAAM,YAAY,MAAM,KAAK,SAAS;AAEtC,UAAM,iBAAiB;AAAA,MACrB,QAAQ,QAAQ,CAAC,OAAO,MAAO,QAAQ,CAAC,EAAE,MAAM,OAAO,MAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAE;AAAA,MAC/E;AAAA,IACF;AACA,UAAM,eAAe;AAAA,MACnB,MAAM,KAAK;AAAA,QAAQ,CAAC,QAClB,CAAC,IAAI,OAAO,GAAG,IAAI,KAAK,EACrB,MAAM,GAAG,QAAQ,EACjB,IAAI,CAAC,MAAM,OAAO,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC,EAAE,EAAE;AAAA,MACvD;AAAA,MACA;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,MAAM,iBAAiB,IAAI;AACvD,UAAM,eAAe,KAAK,MAAM,eAAe,IAAI;AAEnD,WACE,gBAAAF,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KAMtC;AAAA,cAAQ,IAAI,CAAC,OAAO,MAAM;AACzB,YAAI,CAAC,MAAO,QAAO;AACnB,eACE,gBAAAD;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,QAAQ,CAAC,IAAI;AAAA,YAChB,GAAG,MAAM,IAAI;AAAA,YACb,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,UAAU;AAAA,YACV,YAAW;AAAA,YACX,kBAAiB;AAAA,YAEhB,mBAAS,OAAO,OAAO,CAAC,GAAG,cAAc;AAAA;AAAA,UATrC,KAAK,CAAC;AAAA,QAUb;AAAA,MAEJ,CAAC;AAAA,MAKD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,IAAI;AAAA,UACR,IAAI;AAAA,UACJ,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAa;AAAA;AAAA,MACf;AAAA,MACC,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,SAAS,EAAE,GAAG,CAAC,GAAG,MACjD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI;AAAA,UACJ,KAAK,IAAI,KAAK;AAAA,UACd,IAAI,IAAI;AAAA,UACR,KAAK,IAAI,KAAK;AAAA,UACd,QAAQ;AAAA,UACR,aAAa;AAAA;AAAA,QANR,OAAO,CAAC;AAAA,MAOf,CACD;AAAA,MACD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI,YAAY;AAAA,UAChB,IAAI,IAAI;AAAA,UACR,IAAI,YAAY;AAAA,UAChB,QAAQ;AAAA,UACR,aAAa;AAAA;AAAA,MACf;AAAA,MAIC,MAAM,KAAK,IAAI,CAAC,KAAK,MAAM;AAC1B,cAAM,QAAQ,IAAI,KAAK;AACvB,cAAM,QAAQ,CAAC,IAAI,OAAO,GAAG,IAAI,KAAK;AACtC,eACE,gBAAAA,MAACI,WAAA,EACE,gBAAM,IAAI,CAAC,MAAM,MAAM;AACtB,cAAI,KAAK,SAAU,QAAO;AAC1B,iBACE,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG,QAAQ,CAAC,IAAI;AAAA,cAChB,GAAG,OAAO,MAAM,IAAI;AAAA,cACpB,MAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,cAC9C,YAAY,IAAI,MAAM;AAAA,cACtB,UAAU;AAAA,cACV,YAAY,MAAM,IAAI,SAAS;AAAA,cAC/B,kBAAiB;AAAA,cAEhB,mBAAS,MAAM,OAAO,CAAC,GAAG,YAAY;AAAA;AAAA,YATlC,KAAK,CAAC,IAAI,CAAC;AAAA,UAUlB;AAAA,QAEJ,CAAC,KAjBY,KAAK,CAAC,EAkBrB;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;ACzII,qBAAAK,YACE,OAAAC,OADF,QAAAC,cAAA;AArIJ,IAAMC,OAAM;AAEZ,IAAMC,aAAY;AAClB,IAAM,iBAAiB;AACvB,IAAMC,mBAAkB;AACxB,IAAM,sBAAsB;AAQ5B,IAAM,0BAA0B;AAChC,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAGvB,IAAM,yBAAyB;AAC/B,IAAM,iBAAiB;AAOvB,IAAMC,SAAQ;AACd,IAAM,UAAU;AAChB,IAAM,aAAa;AAEnB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,cAAc;AAsBpB,SAAS,eACP,MACA,UACA,OAA8B,CAAC,GACX;AACpB,QAAM,gBAAgB,KAAK,iBAAiBD;AAC5C,QAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,UAAU,cAAc,KAAK,MAAM;AAAA,IACvC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AAOD,QAAM,WAAW,WAAW,QAAQ;AACpC,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAC,SAAS,gBAAgB,MAAM,QAAQ,CAAC;AAAA,EACpE;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AASO,SAAS,sBACd,MACA,UACA,OAA8B,CAAC,GACvB;AACR,QAAM,gBAAgB,KAAK,iBAAiBA;AAC5C,QAAM,WAAW,KAAK,YAAYD;AAClC,QAAM,kBAAkB,KAAK,MAAM,gBAAgB,uBAAuB;AAC1E,QAAM,EAAE,KAAK,IAAI,eAAe,MAAM,UAAU,IAAI;AACpD,SACE,WACA,iBACA,kBACA,iBACA,KAAK,MAAM,SAAS,KAAK;AAE7B;AAWO,SAAS,mBACd,MACA,KACA,KACA,OAA8B,CAAC,GACX;AACpB,QAAM,gBAAgB,KAAK,iBAAiBC;AAC5C,QAAM,WAAW,KAAK,YAAYD;AAClC,QAAM,kBAAkB,KAAK,MAAM,gBAAgB,uBAAuB;AAC1E,QAAM,EAAE,OAAO,KAAK,IAAI,eAAe,MAAM,IAAI,GAAG,IAAI;AACxD,QAAM,YAAY,IAAI,IAAI,WAAW;AACrC,QAAM,iBAAiB,YAAY;AACnC,QAAM,WAAW,YAAY,kBAAkB;AAC/C,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO,IAAI,OAAO;AAAA;AAAA,IACpB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAI;AAAA,QACP,GAAG;AAAA,QACH,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,gBAAM;AAAA;AAAA,IACT;AAAA,IACC,KAAK,MAAM,IAAI,CAAC,MAAM,OACrB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,IAAI;AAAA,QACP,GAAG,WAAW,KAAK,KAAK,aAAa,KAAK;AAAA,QAC1C,UAAU,KAAK;AAAA,QACf,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MARI;AAAA,IASP,CACD;AAAA,KACH;AAEJ;AAEA,SAAS,aAAa,OAAuB,GAAW;AACtD,QAAM,IAAI,MAAM,MAAM;AAEtB,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,OAAO,KAAK,KAAK,IAAI,IAAI;AAC/B,QAAM,SAAS,IAAIE,QAAO,OAAO,MAAM;AACvC,QAAM,WAAW,QAAQG,SAAQ;AACjC,QAAM,QAAQ,KAAK;AAAA,IACjB,GAAG,MAAM,MAAM;AAAA,MACb,CAAC,SAAS,UAAU,sBAAsB,MAAM,QAAQ,IAAI;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,EAAE,MAAM,MAAM,OAAO,UAAU,MAAM;AAC9C;AAEO,IAAM,YAAsC;AAAA,EACjD,QAAQ,OAAO,GAAG;AAChB,UAAM,EAAE,MAAM,MAAM,IAAI,aAAa,OAAO,CAAC;AAC7C,WAAO,OAAO,SAAS,OAAO,KAAKH;AAAA,EACrC;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,MAAM,MAAM,OAAO,UAAU,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC;AAExE,UAAM,YAAY,OAAO,SAAS,OAAO,KAAKA;AAC9C,UAAM,aAAa,KAAK,IAAI,KAAK,IAAI,KAAK,aAAa,aAAa,IAAI;AACxE,UAAM,SAAS,QAAQ;AACvB,UAAM,eAAe,aAAa;AAClC,WACE,gBAAAF,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,QAAS,IAAI,QAAS,QAAQE;AACpC,YAAM,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,SAASA;AAC/C,aACE,gBAAAD,OAAC,OAAU,kBAAgB,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,IACnE;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,IAAI,IAAI,OAAO,UAAU;AAAA,YACzB,MAAM,IAAI,OAAO;AAAA,YAChB,GAAI,IAAI,OAAO,aACZ,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAChD,CAAC;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQK;AAAA,YACX,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,IAAI;AAAA,YACJ,MAAM,IAAI,OAAO;AAAA;AAAA,QACnB;AAAA,QACC;AAAA,UACC;AAAA,UACA,EAAE,GAAG,QAAQA,QAAO,GAAG,QAAQ,UAAU,cAAc,GAAG,SAAS;AAAA,UACnE;AAAA,QACF;AAAA,WAxBM,CAyBR;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;AC5JY,SAEE,OAAAC,OAFF,QAAAC,cAAA;AAjFZ,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAMC,cAAa;AACnB,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AAExB,SAAS,KAAK,OAA2B,GAAW;AAClD,QAAM,IAAI,MAAM,MAAM;AACtB,QAAM,OAAO,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC;AACzC,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,SAAS,IAAI,WAAW,OAAO,MAAM;AAC3C,QAAM,WAAW,QAAQ;AACzB,SAAO,EAAE,GAAG,MAAM,MAAM,OAAO,SAAS;AAC1C;AAEA,SAAS,WACP,MACA,UACA;AACA,QAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,UAAUA;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,OAAO,KAAK,OACd,cAAc,KAAK,MAAM;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC,IACD;AACJ,QAAM,MAAM,KAAK,MACb,WAAW,KAAK,KAAK,EAAE,UAAU,UAAU,UAAU,UAAU,aAAa,GAAG,CAAC,IAChF;AACJ,QAAM,IACJ,cACA,iBACC,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI,MACjD,MAAM,KAAK,MAAM,WAAW,GAAG,IAAI,KACpC;AACF,SAAO,EAAE,OAAO,MAAM,KAAK,EAAE;AAC/B;AAEA,SAAS,WAAW,OAA2B,GAAW,MAAgB;AACxE,QAAM,EAAE,MAAM,MAAM,SAAS,IAAI,KAAK,OAAO,CAAC;AAC9C,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAM,WAAW,MAAM,MAAM,MAAM,IAAI,OAAO,IAAI,KAAK,IAAI;AAC3D,YAAQ,KAAK,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,OAAO,WAAW,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAEO,IAAM,gBAA8C;AAAA,EACzD,QAAQ,OAAO,GAAG,KAAK;AACrB,UAAM,UAAU,WAAW,OAAO,GAAG,GAAG;AACxC,WAAO,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ,SAAS,KAAK;AAAA,EACzE;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,MAAM,UAAU,MAAM,IAAI,KAAK,OAAO,IAAI,CAAC;AACnD,UAAM,UAAU,WAAW,OAAO,IAAI,GAAG,GAAG;AAC5C,WACE,gBAAAF,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,YAAM,MAAM,IAAI;AAChB,YAAM,QAAQ,OAAO,QAAQ;AAC7B,YAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,SAAS,CAAC;AACvE,YAAM,QAAQ,QAAQ,GAAG;AACzB,YAAM,EAAE,OAAO,MAAM,IAAI,IAAI,WAAW,MAAM,QAAQ;AACtD,YAAMG,OAAM,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzC,YAAM,cAAc,QAAQ;AAC5B,YAAM,gBAAgB,QAAQ,cAAcD;AAC5C,YAAM,UAAU,QAAQ,cAAc;AACtC,aACE,gBAAAD,OAAC,OAEC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ,QAAQ;AAAA,YACpB,QAAQ,IAAI,OAAO;AAAA,YACnB,aAAa;AAAA,YACb,SAAS;AAAA;AAAA,QACX;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,GAAG;AAAA,YACH,UAAU;AAAA,YACV,YAAW;AAAA,YACX,WAAU;AAAA,YACV,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,UAAAG;AAAA;AAAA,QACH;AAAA,QACA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,GAAG;AAAA,YACH,UAAU,MAAM;AAAA,YAChB,YAAW;AAAA,YACX,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QACC,OACG,KAAK,MAAM,IAAI,CAAC,MAAM,OACpB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,QAAQ;AAAA,YACX,GAAG,WAAW,KAAK,KAAK,KAAK;AAAA,YAC7B,UAAU,KAAK;AAAA,YACf,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UARI;AAAA,QASP,CACD,IACD;AAAA,QACH,MACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ;AAAA,YACX,GACE,WACC,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI,KAClD,KAAK,MAAM,WAAW,GAAG;AAAA,YAE3B,UAAU,IAAI;AAAA,YACd,MAAM,IAAI,OAAO;AAAA,YACjB,SAAS;AAAA,YACT,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,cAAI;AAAA;AAAA,QACP,IACE;AAAA,WAjEE,CAkER;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;ACtHmB,gBAAAI,OA8DP,QAAAC,cA9DO;AAlCnB,IAAM,aAAqC,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AACpE,IAAMC,OAAM;AACZ,IAAMC,aAAY;AAClB,IAAMC,aAAY;AAClB,IAAM,aAAa;AAEnB,SAAS,SAAS,OAAmB,GAAW;AAC9C,QAAM,IAAI,MAAM,MAAM;AACtB,QAAM,IAAI,WAAW,CAAC,KAAK;AAC3B,QAAM,OAAO,IAAI,IAAIF;AACrB,QAAM,KAAK,OAAOA;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,QAAQ,OAAO;AACrB,QAAM,WAAW,IAAI,KAAK,OAAO,UAAU,IAAI,KAAK;AACpD,QAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM,QAAQ,IAAI,QAAQ;AAC5D,QAAMG,SAAQ,KAAK,OAAOF;AAC1B,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAIE,MAAK;AACnC,SAAO,EAAE,GAAG,GAAG,MAAM,IAAI,IAAI,OAAO,OAAAA,QAAO,MAAM;AACnD;AAEO,IAAM,QAA8B;AAAA,EACzC,QAAQ,OAAO,IAAI;AACjB,WAAO,SAAS,OAAO,EAAE,EAAE;AAAA,EAC7B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,GAAG,IAAI,IAAI,OAAO,OAAAA,QAAO,OAAO,EAAE,IAAI,SAAS,OAAO,IAAI,CAAC;AAEnE,UAAM,UAAU,IAAI,KAAK,IAAI,IAAIH,OAAM,OAAO,IAAI,KAAK;AACvD,WACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KAEtC;AAAA,OAAC,GAAG,MAAM,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;AAC9C,cAAM,IAAI,MAAM,GAAG;AACnB,YAAI,QAAQ,GAAG;AACb,iBAAO,gBAAAD,MAAC,YAAiB,IAAQ,IAAQ,GAAM,MAAM,IAAI,OAAO,WAA5C,GAAqD;AAAA,QAC3E;AACA,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAM,IAAI,OAAO;AAAA,YACjB,aAAa,QAAQ,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,YACnD,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,YACxC,aAAa;AAAA;AAAA,UAPR;AAAA,QAQP;AAAA,MAEJ,CAAC;AAAA,OAEC,MAAM;AACN,cAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,cAAM,SAAS,WAAW,KAAK,OAAO;AAAA,UACpC,UAAU,MAAM,CAAC,IAAI;AAAA,UACrB,UAAU;AAAA,UACV,aAAa;AAAA,QACf,CAAC;AACD,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG,KAAK,OAAO,WAAW;AAAA,YAC1B,YAAW;AAAA,YACX,UAAU,OAAO;AAAA,YACjB,YAAW;AAAA,YACX,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,iBAAO;AAAA;AAAA,QACV;AAAA,MAEJ,GAAG;AAAA,MAEF,MAAM,MAAM,IAAI,CAAC,MAAM,QAAQ;AAC9B,cAAM,SAAS,IAAI,IAAI;AACvB,cAAM,OAAOE,OAAM,KAAK,SAAS;AACjC,cAAM,IAAI,MAAM,GAAG;AAGnB,cAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,IAAIG,SAAQ,KAAK,EAAE;AACvD,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK;AAClC,cAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK;AAClC,cAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,UACnC,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa;AAAA,QACf,CAAC;AACD,cAAM,OAAO,KAAK,OACd,cAAc,KAAK,MAAM;AAAA,UACvB,UAAU;AAAA,UACV,UAAUD;AAAA,UACV,UAAU;AAAA,UACV,iBAAiB;AAAA,QACnB,CAAC,IACD;AACJ,eACE,gBAAAH,OAAC,OACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,MAAMK,SAAQ,EAAE,IAAI,OAAO,CAAC,MAAMA,SAAQ,CAAC;AAAA,cACjF,MAAK;AAAA,cACL,QAAQ,IAAI,OAAO;AAAA,cACnB,aAAa;AAAA,cACb,SAAS;AAAA;AAAA,UACX;AAAA,UACA,gBAAAL,MAAC,YAAO,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,MAAM,QAAQ,IAAI,IAAI,OAAO,UAAU,IAAI,OAAO,QAAQ;AAAA,UACxF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAGK;AAAA,cACH,GAAG;AAAA,cACH,UAAU,MAAM;AAAA,cAChB,YAAW;AAAA,cACX,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,gBAAM;AAAA;AAAA,UACT;AAAA,UACC,OACG,KAAK,MAAM,IAAI,CAAC,MAAM,OACpB,gBAAAL;AAAA,YAAC;AAAA;AAAA,cAEC,GAAGK;AAAA,cACH,GAAG,OAAO,KAAK,KAAK,KAAK,KAAK;AAAA,cAC9B,UAAU,KAAK;AAAA,cACf,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB;AAAA;AAAA,YARI;AAAA,UASP,CACD,IACD;AAAA,aAlCE,GAmCR;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;ACtDY,SACE,OAAAC,OADF,QAAAC,cAAA;AAlFZ,IAAM,WAAW;AACjB,IAAMC,SAAQ;AACd,IAAM,SAAS;AACf,IAAM,QAAQ;AACd,IAAMC,UAAS;AACf,IAAMC,cAAa;AACnB,IAAMC,aAAY;AAClB,IAAMC,YAAW;AACjB,IAAM,WAAW;AACjB,IAAMC,aAAY;AAElB,SAAS,WAAW,MAAsC,GAAW;AACnE,QAAM,WAAW,KAAK,IAAI,GAAG,IAAIJ,UAAS,EAAE;AAC5C,QAAM,SAAS,KAAK,OAAO,WAAWI,aAAY,KAAK;AACvD,QAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,UAAUH;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,OAAO,KAAK,OACd,cAAc,KAAK,MAAM;AAAA,IACvB,UAAU;AAAA,IACV,UAAUC;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC,IACD;AACJ,QAAM,MAAM,KAAK,MACb,WAAW,KAAK,KAAK,EAAE,UAAU,UAAU,UAAUC,WAAU,aAAa,GAAG,CAAC,IAChF;AACJ,QAAM,WACJ,YACC,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI,MACjD,MAAM,KAAK,MAAMA,YAAW,GAAG,IAAI;AACtC,QAAM,QAAQJ,SAAQ,IAAI,KAAK,IAAI,QAAQ,GAAG,QAAQ;AACtD,SAAO,EAAE,OAAO,MAAM,KAAK,UAAU,MAAM;AAC7C;AAEO,IAAM,WAAoC;AAAA,EAC/C,QAAQ,OAAO,GAAG;AAChB,WACE,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,WAAW,MAAM,CAAC,EAAE,OAAO,CAAC,KACnE,MAAM,MAAM,SAAS,KAAK;AAAA,EAE/B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,UAAU,MAAM,MAAM,IAAI,CAAC,SAAS,WAAW,MAAM,IAAI,CAAC,CAAC;AACjE,UAAM,YACJ,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,KAAK,QAAQ,SAAS,KAAK;AAEpE,UAAM,cAAc,KAAK,IAAI,KAAK,IAAI,KAAK,aAAa,aAAa,QAAQ,MAAM;AAGnF,UAAM,cACJ,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,OAAO;AAC3D,QAAI,UAAU,MAAM,MAAM;AAC1B,QAAI,gBAAgB,OAAO,mBAAmB;AAC5C,UAAI,MAAM;AACV,gBAAU;AACV,iBAAW,KAAK,SAAS;AACvB,cAAM,OAAO,OAAO,UAAU,IAAI,WAAW,KAAK,EAAE;AACpD,YAAI,OAAO,YAAa;AACxB,cAAM;AACN;AAAA,MACF;AACA,gBAAU,KAAK,IAAI,GAAG,OAAO;AAAA,IAC/B;AACA,UAAM,SAAS,MAAM,MAAM,SAAS;AACpC,QAAI,SAAS;AACb,WACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,YAAM,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,MAAM;AAC9C,cAAM,EAAE,OAAO,MAAM,KAAK,UAAU,MAAM,IAAI,QAAQ,CAAC;AACvD,cAAM,SAAS,QAAQ;AACvB,cAAM,QAAQ;AACd,kBAAU,SAAS;AACnB,cAAM,KAAK,QAAQ,KAAK,SAAS;AACjC,cAAM,aAAa,SAAS,SAAS,YAAY;AACjD,cAAM,QAAQ,QAAQ,SAAS;AAC/B,cAAM,gBAAgB,aAAaG;AACnC,cAAM,UAAU,aAAa;AAC7B,eACE,gBAAAH,OAAC,OAAU,kBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAC3D;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG;AAAA,cACH,OAAO,IAAI;AAAA,cACX,QAAQ;AAAA,cACR,IAAI,IAAI,OAAO,UAAU;AAAA,cACzB,MAAM,IAAI,OAAO;AAAA,cACjB,QAAQ,KAAK,IAAI,OAAO,SAAU,IAAI,OAAO,cAAc;AAAA,cAC3D,aAAa,KAAK,MAAM;AAAA;AAAA,UAC1B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,GAAG;AAAA,cACH,MAAK;AAAA,cACL,QAAQ,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AAAA,cAC5C,aAAa;AAAA;AAAA,UACf;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG,QAAQ;AAAA,cACX,YAAW;AAAA,cACX,UAAU;AAAA,cACV,YAAW;AAAA,cACX,MAAM,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AAAA,cAC1C,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,cAAI;AAAA;AAAA,UACP;AAAA,UACC,KAAK,QACJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,GAAGG;AAAA,cACH,GAAG,gBAAgBI,aAAY;AAAA,cAC/B,MAAMA;AAAA,cACN,OAAO,IAAI,OAAO;AAAA;AAAA,UACpB;AAAA,UAEF,gBAAAP;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,KAAK,OAAOG,UAASI,aAAY,KAAKJ;AAAA,cACzC,GAAG;AAAA,cACH,UAAU,MAAM;AAAA,cAChB,YAAW;AAAA,cACX,MAAM,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AAAA,cAC1C,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,gBAAM;AAAA;AAAA,UACT;AAAA,UACC,OACG,KAAK,MAAM,IAAI,CAAC,MAAM,OACpB,gBAAAH;AAAA,YAAC;AAAA;AAAA,cAEC,GAAGG;AAAA,cACH,GAAG,WAAW,KAAK,KAAK,KAAK,aAAa;AAAA,cAC1C,UAAU,KAAK;AAAA,cACf,MAAM,IAAI,OAAO;AAAA,cACjB,aAAa;AAAA,cACb,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB;AAAA;AAAA,YATI;AAAA,UAUP,CACD,IACD;AAAA,UACH,MACC,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,GAAGG;AAAA,cACH,GACE,WACC,OAAO,KAAK,MAAM,SAAS,KAAK,aAAa,IAAI,KAClD,KAAK,MAAMG,YAAW,GAAG;AAAA,cAE3B,UAAU,IAAI;AAAA,cACd,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,cAAI;AAAA;AAAA,UACP,IACE;AAAA,aAlFE,CAmFR;AAAA,MAEJ,CAAC;AAAA,MACA,SAAS,KACR,gBAAAN;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,IAAI;AAAA,UACP,GAAG,SAAS;AAAA,UACZ,YAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB,cAAI,MAAM;AAAA;AAAA,MACb;AAAA,OAEJ;AAAA,EAEJ;AACF;;;AC9FI,qBAAAQ,YACE,OAAAC,OADF,QAAAC,cAAA;AAvFJ,IAAMC,SAAQ;AACd,IAAMC,WAAU;AAChB,IAAMC,cAAa;AACnB,IAAMC,eAAc;AAIpB,IAAMC,OAAM;AAEZ,IAAM,UAAU;AAChB,IAAM,aAAa,UAAU;AAC7B,IAAM,kBAAkB;AAIxB,IAAM,uBAAuB;AAK7B,IAAM,kBAAkB;AAExB,IAAMC,mBAAkB;AACxB,IAAMC,uBAAsB;AAI5B,IAAMC,2BAA0B;AAChC,IAAM,oBAAoB,KAAK,MAAMF,mBAAkBE,wBAAuB;AAC9E,IAAMC,kBAAiB;AAEvB,IAAMC,kBAAiB;AACvB,IAAMC,kBAAiB;AACvB,IAAMC,0BAAyB;AAK/B,IAAM,aAAa;AAInB,IAAM,kBAAkBX,SAAQ,aAAa;AAC7C,IAAM,0BAA0B;AAChC,IAAMY,WAAU;AAEhB,IAAM,YAAY;AAClB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAa3B,SAAS,eAAe,MAAgB,UAAsC;AAC5E,QAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,UAAUP;AAAA,IACV,aAAaC;AAAA,EACf,CAAC;AACD,QAAM,UAAU,cAAc,KAAK,MAAM;AAAA,IACvC,UAAU;AAAA,IACV,UAAUG;AAAA,IACV,UAAUC;AAAA,IACV,iBAAiBC;AAAA,EACnB,CAAC;AACD,QAAM,WAAW,WAAW,QAAQ;AACpC,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAC,SAAS,gBAAgB,MAAM,QAAQ,CAAC;AAAA,EACpE;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAIA,SAAS,YAAY,IAAY,IAAY,GAAW,KAAmC;AACzF,SACE,gBAAAZ,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,YAAO,IAAQ,IAAQ,GAAG,SAAS,MAAM,IAAI,OAAO,SAAS;AAAA,IAC9D,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,KAAK,KAAK,MAAM,kBAAkB,oBAAoB;AAAA,QACzD,YAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAW;AAAA,QACX,MAAK;AAAA,QACL,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAQA,SAAS,kBAAkB,MAAgB,UAA0B;AACnE,QAAM,EAAE,KAAK,IAAI,eAAe,MAAM,QAAQ;AAC9C,SACE,aACA,kBACA,oBACAU,kBACA,KAAK,MAAM,SAAS,KAAK;AAE7B;AAMA,SAAS,mBACP,MACA,OACA,KACA,KACoB;AACpB,QAAM,EAAE,OAAO,KAAK,IAAI,eAAe,MAAM,IAAI,CAAC;AAClD,QAAM,UAAU,IAAI,IAAI;AACxB,QAAM,UAAU,IAAI,IAAI;AACxB,QAAM,YAAY,IAAI,IAAI,aAAa;AACvC,QAAM,iBAAiB,YAAYH;AACnC,QAAM,WAAW,YAAY,oBAAoBG;AACjD,SACE,gBAAAT,OAAAF,YAAA,EACG;AAAA,gBAAY,SAAS,SAAS,QAAQ,GAAG,GAAG;AAAA,IAC7C,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAI;AAAA,QACP,GAAG;AAAA,QACH,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,gBAAM;AAAA;AAAA,IACT;AAAA,IACC,KAAK,MAAM,IAAI,CAAC,MAAM,OACrB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,IAAI;AAAA,QACP,GAAG,WAAW,KAAK,KAAK,aAAa,KAAK;AAAA,QAC1C,UAAU,KAAK;AAAA,QACf,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MARI;AAAA,IASP,CACD;AAAA,KACH;AAEJ;AAEA,SAASe,cAAa,OAAmB,GAAW;AAClD,QAAM,IAAI,MAAM,MAAM;AACtB,QAAM,SAAS,IAAIT,QAAO,IAAI,MAAM;AACpC,QAAM,WAAW,QAAQJ,SAAQ;AACjC,QAAM,QAAQ,KAAK;AAAA,IACjB,GAAG,MAAM,MAAM,IAAI,CAAC,SAASC,WAAU,kBAAkB,MAAM,QAAQ,IAAIC,WAAU;AAAA,EACvF;AACA,SAAO,EAAE,OAAO,UAAU,MAAM;AAClC;AAIA,SAAS,YAAY,GAAW,GAAW,OAAmC;AAC5E,QAAM,OAAO,IAAI;AACjB,QAAM,QAAQ,OAAO;AACrB,SACE,gBAAAH,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,QAAQ,OAAO,aAAa,gBAAgB;AAAA,IAClF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,iBAAiB,IAAI,KAAK,IAAI,IAAI,iBAAiB;AAAA,QACxF,MAAM;AAAA;AAAA,IACR;AAAA,KACF;AAEJ;AAQA,SAAS,oBAAoB,GAAW,GAAoB;AAC1D,SAAO,IAAI,cAAc,IAAI,KAAKM,OAAM;AAC1C;AAKA,SAAS,oBAAoB,OAAmB,GAAW;AACzD,QAAM,WAAW,KAAK,IAAI,GAAG,IAAI,eAAe;AAChD,QAAM,OACJ,KAAK;AAAA,IACH,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS;AAC3B,YAAM,EAAE,KAAK,IAAI,eAAe,MAAM,QAAQ;AAC9C,aAAO,oBAAoB,0BAA0B,KAAK,MAAM,SAAS,KAAK;AAAA,IAChF,CAAC;AAAA,EACH,IAAIQ;AACN,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,SAASE,gBAAe,OAAmB,KAAe,KAAmC;AAC3F,QAAM,EAAE,UAAU,KAAK,IAAI,oBAAoB,OAAO,IAAI,CAAC;AAC3D,QAAM,UAAUd,SAAQ;AACxB,QAAM,UAAU,CAAC,MAAc,IAAI,OAAO,oBAAoB;AAE9D,SACE,gBAAAD,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KAGtC;AAAA,UAAM,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAC5B,gBAAAD;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI;AAAA,QACJ,IAAI,QAAQ,CAAC;AAAA,QACb,IAAI;AAAA,QACJ,IAAI,QAAQ,IAAI,CAAC;AAAA,QACjB,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAa;AAAA;AAAA,MANR,aAAa,CAAC;AAAA,IAOrB,CACD;AAAA,IACA,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,SAAS,IAAI;AACnB,YAAM,EAAE,OAAO,KAAK,IAAI,eAAe,MAAM,QAAQ;AACrD,YAAM,iBAAiB,SAASO;AAChC,YAAM,WAAW,SAAS,oBAAoB;AAC9C,aACE,gBAAAN,OAAC,OAAU,kBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAC3D;AAAA,oBAAY,SAAS,QAAQ,CAAC,GAAG,IAAI,GAAG,GAAG;AAAA,QAC5C,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,UAAU,MAAM;AAAA,YAChB,YAAW;AAAA,YACX,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,gBAAM;AAAA;AAAA,QACT;AAAA,QACC,KAAK,MAAM,IAAI,CAAC,MAAM,OACrB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG;AAAA,YACH,GAAG,WAAW,KAAK,KAAK,aAAa,KAAK;AAAA,YAC1C,UAAU,KAAK;AAAA,YACf,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UARI;AAAA,QASP,CACD;AAAA,WAzBK,CA0BR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEO,IAAM,QAA8B;AAAA,EACzC,QAAQ,OAAO,GAAG;AAChB,UAAM,IAAI,MAAM,MAAM;AACtB,QAAI,oBAAoB,GAAG,CAAC,GAAG;AAC7B,aAAO,IAAI,oBAAoB,OAAO,CAAC,EAAE;AAAA,IAC3C;AACA,WAAOe,cAAa,OAAO,CAAC,EAAE;AAAA,EAChC;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,MAAM,MAAM;AACtB,QAAI,oBAAoB,GAAG,IAAI,CAAC,GAAG;AACjC,aAAOC,gBAAe,OAAO,KAAK,GAAG;AAAA,IACvC;AACA,UAAM,EAAE,OAAO,UAAU,MAAM,IAAID,cAAa,OAAO,IAAI,CAAC;AAC5D,WACE,gBAAAd,OAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC;AAAA,YAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,cAAM,QAAQ,KAAK,QAAQK;AAC3B,eACE,gBAAAL,OAAC,OAAU,kBAAgB,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAC3D;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG;AAAA,cACH,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,IAAIK;AAAA,cACJ,MAAM,IAAI,OAAO;AAAA,cAChB,GAAI,IAAI,OAAO,aACZ,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAChD,CAAC;AAAA;AAAA,UACP;AAAA,UACC,mBAAmB,MAAM,GAAG,EAAE,GAAG,QAAQH,QAAO,GAAGC,UAAS,GAAG,SAAS,GAAG,GAAG;AAAA,aAZzE,CAaR;AAAA,MAEJ,CAAC;AAAA,MACA,MAAM,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM;AAClC,cAAM,gBAAgB,KAAK,QAAQG,QAAO;AAC1C,cAAM,SAAS,iBAAiBA,OAAM,aAAa;AACnD,eACE,gBAAAN,MAAC,OAAsB,sBAAY,QAAQ,QAAQ,GAAG,IAAI,OAAO,KAAK,KAA9D,SAAS,CAAC,EAAsD;AAAA,MAE5E,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;AChNM,gBAAAiB,OAmDI,QAAAC,cAnDJ;AAtHN,IAAMC,OAAM;AACZ,IAAMC,SAAQ;AACd,IAAMC,cAAa;AACnB,IAAMC,eAAc;AACpB,IAAM,QAAQ;AAEd,IAAMC,WAAU;AAChB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,YAAY,QAAQ;AAE1B,IAAM,cAAc;AACpB,IAAMC,cAAa;AACnB,IAAMC,YAAW,KAAK,MAAMD,cAAa,GAAG;AAC5C,IAAME,mBAAkB;AACxB,IAAM,iBAAiB;AAEvB,IAAMC,cAAa;AACnB,IAAM,aAAa;AACnB,IAAM,WAAW,KAAK,MAAM,aAAa,GAAG;AAC5C,IAAMC,WAAU;AAChB,IAAM,kBAAkB;AAmBxB,SAAS,kBAAkB,GAAW,GAAW,GAAW,GAAW,GAAmB;AACxF,QAAM,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AAC/B,SACE,KAAK,CAAC,IAAI,IAAI,EAAE,MACX,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE,IAAI,CAAC,MAC7B,IAAI,IAAI,EAAE,IAAI,CAAC,MACf,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI,EAAE,MACjC,IAAI,CAAC,IAAI,IAAI,CAAC,MACd,CAAC,IAAI,IAAI,CAAC;AAEnB;AAEA,SAASC,YAAW,MAAmB,OAA2B;AAChE,QAAM,WAAW,QAAQT,SAAQ;AACjC,QAAM,SAAS,KAAK,SAChB,WAAW,KAAK,QAAQ;AAAA,IACtB,UAAU,WAAWG,WAAU,IAAI;AAAA,IACnC,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AACJ,QAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,UAAUC;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,WAAW,KAAK,QAAQ,CAAC;AAG/B,QAAM,cAAc,SAAS,IAAI,CAAC,MAAM,iBAAiB,EAAE,KAAK,IAAIG,WAAU;AAC9E,QAAM,YAAY,SAAS,SACvB,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,eAAe,GAAG,KAAK,MAAM,WAAW,IAAI,CAAC,IAC9F;AACJ,QAAM,SAAS,KAAK,IAAI,IAAI,WAAW,SAAS;AAChD,QAAM,OAAoB,SAAS,IAAI,CAAC,MAAM;AAC5C,UAAM,QAAQ,WAAW,EAAE,OAAO,EAAE,UAAU,WAAW,UAAUA,aAAY,aAAa,GAAG,CAAC;AAChG,UAAM,QAAQ,cAAc,EAAE,OAAO;AAAA,MACnC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,KAAK,IAAI,UAAU,MAAM,MAAM,SAAS,MAAM,UAAU,EAAE;AAAA,EAC3F,CAAC;AACD,QAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAAIC;AACtF,QAAM,WACJ,YACAL,WAAU,IACVG,mBACAD,aACC,KAAK,SAAS,iBAAiB,QAAQ;AAC1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,WAAWJ;AAAA,EACpB;AACF;AAEA,SAAS,WACP,QACA,OACA,GACA,GACA,OACA,OACA,KACoB;AACpB,QAAM,IAAI,IAAI,OAAO,UAAUC;AAC/B,QAAM,KAAK,IAAIF,SAAQG;AACvB,QAAM,KAAK,IAAI,YAAYA;AAC3B,QAAMO,OAAM,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC7C,QAAM,gBAAgB,IAAI,YAAYP,WAAU,IAAIG,mBAAkBF;AACtE,MAAI,OAAO,gBAAgB;AAC3B,SACE,gBAAAN,OAAC,OACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,IAAI,OAAO;AAAA,QAChB,GAAI,IAAI,OAAO,aAAa,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAAI,CAAC;AAAA;AAAA,IACpF;AAAA,IACA,gBAAAA,MAAC,UAAK,GAAG,kBAAkB,GAAG,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,IAC5E,gBAAAA,MAAC,YAAO,IAAQ,IAAQ,GAAGM,UAAS,MAAM,IAAI,OAAO,SAAS;AAAA,IAC9D,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,KAAK,KAAK,MAAM,aAAa,cAAc;AAAA,QAC9C,YAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAW;AAAA,QACX,MAAK;AAAA,QACL,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,UAAAa;AAAA;AAAA,IACH;AAAA,IACC,OAAO,SACN,gBAAAb;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAIG,SAAQG,WAAU,IAAI;AAAA,QAC7B,GAAG,KAAK,KAAK,MAAM,OAAO,OAAO,WAAW,cAAc;AAAA,QAC1D,UAAU,OAAO,OAAO;AAAA,QACxB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,iBAAO,OAAO;AAAA;AAAA,IACjB,IACE;AAAA,IACJ,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAIG;AAAA,QACP,GAAG;AAAA,QACH,UAAU,OAAO,MAAM;AAAA,QACvB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,iBAAO,MAAM;AAAA;AAAA,IAChB;AAAA,IACC,OAAO,KAAK,IAAI,CAAC,KAAK,OAAO;AAC5B,YAAM,SAAS;AACf,cAAQ,IAAI,SAASQ;AACrB,aACE,gBAAAV,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,IAAIG;AAAA,YACP,GAAG,SAASO;AAAA,YACZ,UAAU,IAAI,MAAM;AAAA,YACpB,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,cAAI,MAAM;AAAA;AAAA,QACb;AAAA,QACC,IAAI,MAAM,MAAM,IAAI,CAAC,MAAM,OAC1B,gBAAAV;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,IAAIG,SAAQ,OAAO;AAAA,YACtB,GAAG,SAAS,aAAa,KAAK,IAAI,MAAM;AAAA,YACxC,UAAU,IAAI,MAAM;AAAA,YACpB,YAAW;AAAA,YACX,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UATI;AAAA,QAUP,CACD;AAAA,WAxBK,EAyBR;AAAA,IAEJ,CAAC;AAAA,OA/EK,KAgFR;AAEJ;AAEO,IAAM,UAAkC;AAAA,EAC7C,QAAQ,OAAO,GAAG;AAChB,UAAM,IAAI,MAAM,MAAM;AACtB,UAAM,SAAS,IAAID,QAAO,IAAI,MAAM;AACpC,WAAO,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,CAAC,OAAOU,YAAW,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,EACzE;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,IAAI,MAAM,MAAM;AACtB,UAAM,SAAS,IAAI,IAAIV,QAAO,IAAI,MAAM;AACxC,UAAM,UAAU,MAAM,MAAM,IAAI,CAAC,OAAOU,YAAW,IAAI,KAAK,CAAC;AAC7D,UAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAEzD,UAAM,QAAQ,KAAK,IAAI,WAAW,IAAI,KAAK,SAAS;AACpD,WACE,gBAAAZ,MAAC,OACE,kBAAQ;AAAA,MAAI,CAAC,QAAQ,MACpB,WAAW,QAAQ,GAAG,IAAI,IAAI,KAAK,QAAQE,OAAM,IAAI,GAAG,OAAO,OAAO,GAAG;AAAA,IAC3E,GACF;AAAA,EAEJ;AACF;;;ACrIU,gBAAAY,OAmCE,QAAAC,cAnCF;AA1FV,IAAMC,YAAW;AACjB,IAAMC,SAAQ;AACd,IAAMC,WAAU;AAChB,IAAMC,eAAc;AACpB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAMC,cAAa;AACnB,IAAMC,YAAW,KAAK,MAAMD,cAAa,IAAI;AAC7C,IAAM,WAAW;AACjB,IAAM,SAAS,KAAK,MAAM,WAAW,IAAI;AACzC,IAAM,YAAY;AAClB,IAAM,gBAAgB;AACtB,IAAME,cAAa;AAInB,SAAS,OAAO,GAAW,GAAW,GAAmB;AACvD,QAAM,KAAKC,UAAS,CAAC;AACrB,QAAM,KAAKA,UAAS,CAAC;AACrB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,QAAM,KAAK,CAAC,GAAW,MAAc,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;AAC/D,QAAM,MAAM,CAAC,MAAc,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAClF;AACA,SAASA,UAAS,GAA4C;AAC5D,QAAM,IAAI,uBAAuB,KAAK,EAAE,KAAK,CAAC;AAC9C,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE;AAC3B,SAAO,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG;AAClD;AAEA,SAAS,SAAS,MAA0B,KAAuB;AACjE,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,OAAO,IAAI,OAAO,SAAS,IAAI,OAAO,QAAQ,IAAI;AAAA,IAC3D,KAAK;AACH,aAAO,OAAO,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS,IAAI;AAAA,IAC5D;AACE,aAAO,OAAO,IAAI,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI;AAAA,EAC5D;AACF;AAQA,SAASC,YAAW,MAAkB,OAA2B;AAC/D,QAAM,WAAW,QAAQP,SAAQ;AACjC,QAAM,QAAQ,WAAW,KAAK,OAAO,EAAE,UAAU,UAAU,UAAUG,aAAY,aAAa,GAAG,CAAC;AAClG,QAAM,MAAM,KAAK,MACb,WAAW,KAAK,KAAK,EAAE,UAAU,UAAU,UAAU,UAAU,aAAa,GAAG,CAAC,IAChF;AACJ,QAAM,WAAWC,aAAY,MAAM,gBAAgB,SAAS;AAC5D,SAAO,EAAE,OAAO,KAAK,SAAS;AAChC;AAEA,SAAS,SAAS,OAAoB,GAAW;AAC/C,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,KAAK,KAAK,MAAM,MAAM,SAAS,IAAI;AAChD,QAAM,SAAS,MAAM,UAAU,YAAY;AAC3C,QAAM,QAAQ,IAAI;AAClB,QAAM,SAAS,QAAQL,aAAY,OAAO,MAAM;AAChD,QAAM,WAAW,KAAK;AAAA,IACpB,GAAG,MAAM,MAAM,IAAI,CAAC,OAAOQ,YAAW,IAAI,KAAK,EAAE,QAAQ;AAAA,IACzDH;AAAA,EACF;AACA,QAAM,QAAQH,WAAU,WAAWI;AACnC,SAAO,EAAE,MAAM,MAAM,QAAQ,OAAO,MAAM;AAC5C;AAEO,IAAM,SAAgC;AAAA,EAC3C,QAAQ,OAAO,GAAG;AAChB,UAAM,EAAE,MAAM,MAAM,IAAI,SAAS,OAAO,CAAC;AACzC,YACG,MAAM,UAAU,YAAY,KAAK,OAAO,SAAS,OAAO,KAAKN;AAAA,EAElE;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,MAAM,MAAM,QAAQ,OAAO,MAAM,IAAI,SAAS,OAAO,IAAI,CAAC;AAClE,UAAM,UAAU,IAAI,KAAK,MAAM,UAAU,YAAY;AAErD,UAAM,gBAAgB,OAAO,SAAS,OAAO,KAAKA;AAClD,UAAM,cAAc,IAAI,KAAK,kBAAkB,MAAM,UAAU,YAAY;AAC3E,UAAM,OAAO,KAAK,IAAI,QAAQ,cAAc,OAAO,KAAKA,aAAY,IAAI;AACxE,UAAM,IAAI,IAAI,OAAO,UAAUG;AAC/B,WACE,gBAAAJ,OAAC,OACE;AAAA,YAAM,UACL,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,IAAI,IAAI;AAAA,UACX,GAAG,IAAI,IAAI,YAAY;AAAA,UACvB,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB,aAAG,MAAM,OAAO;AAAA;AAAA,MACnB,IACE;AAAA,MACH,MAAM,UACH,MAAM,QAAQ,MAAM,EAAE,EAAE,IAAI,CAAC,KAAK,MAChC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG,IAAI,IAAI,YAAY;AAAA,UACvB,GAAG,UAAU,KAAK,KAAK,YAAY;AAAA,UACnC,YAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QATI;AAAA,MAUP,CACD,IACD;AAAA,MACH,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,cAAM,MAAM,IAAI;AAChB,cAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,cAAM,IAAI,IAAI,IAAI,SAAS,OAAO,QAAQE;AAC1C,cAAM,IAAI,UAAU,OAAO,OAAOA;AAClC,cAAM,OAAOQ,YAAW,MAAM,KAAK;AACnC,cAAM,gBAAgB,IAAIN,WAAUE;AACpC,eACE,gBAAAL,OAAC,OACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,IAAI;AAAA,cACJ,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,cAC5B,GAAI,IAAI,OAAO,aACZ,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAChD,CAAC;AAAA;AAAA,UACP;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,IAAIG;AAAA,cACP,GAAG;AAAA,cACH,UAAU,KAAK,MAAM;AAAA,cACrB,YAAW;AAAA,cACX,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,eAAK,MAAM;AAAA;AAAA,UACd;AAAA,UACC,KAAK,MACJ,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,IAAIG;AAAA,cACP,GAAG,gBAAgB,gBAAgB;AAAA,cACnC,UAAU,KAAK,IAAI;AAAA,cACnB,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,eAAK,IAAI;AAAA;AAAA,UACZ,IACE;AAAA,aAlCE,CAmCR;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AACF;;;ACvEQ,gBAAAQ,OAyBI,QAAAC,cAzBJ;AAhGR,IAAMC,SAAQ;AACd,IAAMC,WAAU;AAChB,IAAMC,cAAa;AACnB,IAAMC,eAAc;AACpB,IAAMC,SAAQ;AAEd,IAAMC,cAAa;AACnB,IAAMC,YAAW,KAAK,MAAMD,cAAa,GAAG;AAC5C,IAAME,kBAAiB;AAEvB,IAAMC,cAAa;AACnB,IAAMC,aAAY;AAClB,IAAM,UAAU,KAAK,MAAMA,aAAY,IAAI;AAC3C,IAAMC,WAAU;AAChB,IAAM,gBAAgB;AAEtB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAGtB,SAASC,mBAAkB,GAAW,GAAW,GAAW,GAAW,GAAmB;AACxF,QAAM,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AAC/B,SACE,KAAK,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE,IAAI,CAAC,MAC9C,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI,EAAE,MACtD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAEvC;AAeA,SAAS,YAAY,OAA0B,GAAwB;AACrE,QAAM,WAAW,IAAIX,SAAQ;AAC7B,QAAM,QAAQ,WAAW,MAAM,OAAO;AAAA,IACpC,UAAU;AAAA,IACV,UAAUK;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,YAAY,KAAK;AAAA,IACrB,KAAK,IAAI,eAAe,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,iBAAiB,EAAE,KAAK,IAAIG,WAAU,CAAC,IAAI,EAAE;AAAA,IACvG,KAAK,MAAM,WAAW,GAAG;AAAA,EAC3B;AACA,QAAM,QAAQ,KAAK,IAAI,IAAI,WAAW,SAAS;AAC/C,QAAM,OAAoB,MAAM,KAAK,IAAI,CAAC,MAAM;AAC9C,UAAM,QAAQ,WAAW,EAAE,OAAO,EAAE,UAAU,WAAW,UAAUA,aAAY,aAAa,GAAG,CAAC;AAChG,UAAM,OAAO,cAAc,EAAE,MAAM;AAAA,MACjC,UAAU;AAAA,MACV,UAAUC;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC;AACD,WAAO,EAAE,OAAO,MAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,MAAM,SAAS,KAAK,UAAU,EAAE;AAAA,EACvF,CAAC;AACD,QAAM,OAAO,MAAM,WACf,cAAc,MAAM,UAAU;AAAA,IAC5B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC,IACD;AACJ,QAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAAIC;AACtF,QAAM,WACJT,WACAK,YACAC,kBACA,SACC,OAAO,gBAAgB,KAAK,MAAM,SAAS,KAAK,aAAa,KAC9DL;AACF,SAAO,EAAE,OAAO,MAAM,WAAW,MAAM,SAAS;AAClD;AAEO,IAAM,eAA4C;AAAA,EACvD,QAAQ,OAAO,GAAG;AAChB,WAAO,YAAY,OAAO,CAAC,EAAE;AAAA,EAC/B;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,SAAS,YAAY,OAAO,IAAI,CAAC;AACvC,UAAM,IAAI,IAAI,OAAO,UAAUC;AAE/B,UAAM,SAAS,KAAK,IAAI,OAAO,UAAU,IAAI,KAAK,OAAO,QAAQ;AACjE,UAAM,gBAAgB,IAAI,IAAIF,WAAUI;AACxC,QAAI,OAAO,gBAAgBE;AAC3B,WACE,gBAAAR,OAAC,OACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,UACP,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,MAAM,IAAI,OAAO;AAAA,UAChB,GAAI,IAAI,OAAO,aAAa,EAAE,QAAQ,IAAI,OAAO,YAAY,aAAa,EAAE,IAAI,CAAC;AAAA;AAAA,MACpF;AAAA,MACA,gBAAAA,MAAC,UAAK,GAAGa,mBAAkB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAGP,QAAO,CAAC,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,MACpF,gBAAAN;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,IAAI,IAAIE;AAAA,UACX,GAAG;AAAA,UACH,UAAU,OAAO,MAAM;AAAA,UACvB,YAAW;AAAA,UACX,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB,iBAAO,MAAM;AAAA;AAAA,MAChB;AAAA,MACC,OAAO,KAAK,IAAI,CAAC,KAAK,OAAO;AAC5B,cAAM,SAAS;AACf,gBAAQ,IAAI,SAASU;AACrB,eACE,gBAAAX,OAAC,OACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,IAAI,IAAIE;AAAA,cACX,GAAG,SAASQ;AAAA,cACZ,UAAU,IAAI,MAAM;AAAA,cACpB,YAAW;AAAA,cACX,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB,cAAI,MAAM;AAAA;AAAA,UACb;AAAA,UACC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,OACzB,gBAAAV;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG,IAAI,IAAIE,SAAQ,OAAO;AAAA,cAC1B,GAAG,SAASS,aAAY,KAAK,IAAI,KAAK;AAAA,cACtC,UAAU,IAAI,KAAK;AAAA,cACnB,MAAM,IAAI,OAAO;AAAA,cACjB,YAAY,IAAI,MAAM;AAAA,cACtB,kBAAiB;AAAA,cAEhB;AAAA;AAAA,YARI;AAAA,UASP,CACD;AAAA,aAxBK,EAyBR;AAAA,MAEJ,CAAC;AAAA,MACA,OAAO,OACJ,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM,OAC3B,gBAAAX;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG,IAAI,IAAIE;AAAA,UACX,GAAG,IAAI,IAAI,SAASE,eAAc,OAAO,KAAM,MAAM,SAAS,IAAI,MAAM,OAAO,KAAM,aAAa;AAAA,UAClG,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QARI,IAAI,EAAE;AAAA,MASb,CACD,IACD;AAAA,OACN;AAAA,EAEJ;AACF;;;ACrCM,SAKE,OAAAU,OALF,QAAAC,cAAA;AAxHN,IAAMC,MAAK;AACX,IAAMC,SAAQ;AACd,IAAMC,aAAY;AAClB,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,eAAe;AAErB,IAAMC,aAAY;AAClB,IAAM,YAAY;AAKlB,IAAM,cAAc;AACpB,IAAMC,SAAQ;AACd,IAAM,kBAAkBA,SAAQ,IAAI;AACpC,IAAM,kBAAkBA,SAAQ,IAAI,IAAI;AAMxC,IAAM,cAGF;AAAA,EACF,UAAU,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EAC7C,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU;AAC9C;AAUA,SAAS,oBAAoB,KAAqB;AAChD,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE;AACjC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,SAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACzC;AAOA,SAAS,YAAY,QAAiC;AACpD,SAAO,oBAAoB,OAAO,EAAE,IAAI;AAC1C;AAKA,SAAS,UAAU,MAAkC,KAAuB;AAC1E,MAAI,SAAS,UAAW,QAAO,IAAI,OAAO;AAC1C,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO,YAAY,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM;AACtD;AAGA,SAAS,MAAM,SAA0B;AACvC,SAAO,UAAUH,SAAQC,aAAY,gBAAgBD;AACvD;AAsBA,SAASI,KAAI,OAA2B,GAAiB;AACvD,QAAM,UAAU,QAAQ,MAAM,IAAI;AAClC,QAAM,KAAK,MAAM,OAAO;AACxB,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,KAAKJ,MAAK;AACxC,QAAM,IAAI,cAAc,cAAc,MAAM,IAAI,GAAG;AAAA,IACjD,UAAU;AAAA,IACV,UAAUE;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,cAAcA;AAAA,EACjC,CAAC;AACD,QAAM,WAAW,QAAQA;AACzB,QAAM,eAAe;AAAA,IACnB,cAAc,MAAM,IAAI;AAAA,IACxB,EAAE;AAAA,EACJ,EAAE,IAAI,CAAC,SAAS,yBAAyB,MAAM,QAAQ,CAAC;AACxD,QAAM,SAAS,aAAa,UAAU,IAAI,kBAAkB;AAC5D,SAAO,EAAE,cAAc,OAAO;AAChC;AAEO,IAAM,gBAA8C;AAAA,EACzD,QAAQ,OAAO,GAAG;AAChB,WAAOE,KAAI,OAAO,CAAC,EAAE;AAAA,EACvB;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,UAAM,EAAE,cAAc,OAAO,IAAIA,KAAI,OAAO,IAAI,CAAC;AACjD,UAAM,UAAU,QAAQ,MAAM,IAAI;AAClC,UAAM,OAAO,UAAU,MAAM,MAAM,GAAG;AACtC,UAAM,KAAK,MAAM,OAAO;AACxB,UAAM,aAAa,aAAa,SAAS;AACzC,UAAM,YAAY,SAAS,cAAc;AACzC,WACE,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,QACtC,kBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,QAC1C,mBAAiB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM;AAAA,QAErD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAG;AAAA,cACH,OAAO,IAAI;AAAA,cACX;AAAA,cACA,IAAIE;AAAA,cACJ,MAAM;AAAA,cACN,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,aAAa;AAAA;AAAA,UACf;AAAA,UACC,MAAM,QACL,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,MAAM;AAAA,cACZ,GAAGG;AAAA,cACH,IAAI,SAASC,cAAa;AAAA,cAC1B,MAAMA;AAAA,cACN,OAAO;AAAA;AAAA,UACT;AAAA,UAED,aAAa,IAAI,CAAC,UAAU,MAC3B,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cAEC,GAAG;AAAA,cACH,GAAG,WAAW,IAAI,cAAcK;AAAA,cAChC,YAAY,IAAI,MAAM;AAAA,cACtB,UAAUA;AAAA,cACV,YAAW;AAAA,cACX,MAAM,IAAI,OAAO;AAAA,cACjB,kBAAiB;AAAA,cAEhB,+BAAqB,UAAU;AAAA,gBAC9B,QAAQ;AAAA,gBACR,UAAU,IAAI,OAAO;AAAA,gBACrB,YAAY;AAAA,cACd,CAAC;AAAA;AAAA,YAbI;AAAA,UAcP,CACD;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;;;ACpJY,SAWI,OAAAG,OAXJ,QAAAC,cAAA;AA9BZ,IAAMC,OAAM;AACZ,IAAMC,mBAAkB;AACxB,IAAMC,uBAAsB;AAC5B,IAAM,gBAAgB;AAGtB,SAAS,UAAU,GAAmB;AACpC,SAAO,IAAIF,OAAM;AACnB;AAEO,IAAM,WAAoC;AAAA,EAC/C,QAAQ,OAAO;AACb,WAAO,MAAM,QAAQ,SAASA;AAAA,EAChC;AAAA,EACA,OAAO,OAAO,KAAK,KAAK;AACtB,WACE,gBAAAF,MAAC,OAAE,WAAW,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,KACtC,gBAAM,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAChC,YAAM,cAAc,WAAW,IAAI,IAAI,CAAC,KAAK,OAAO,KAAK,IAAI;AAAA,QAC3D,UAAU,IAAI,IAAI;AAAA,QAClB,UAAUG;AAAA,QACV,aAAaC;AAAA,MACf,CAAC;AACD,YAAM,aACJ,iBAAiB,YAAY,IAAI,IAAI,YAAY;AACnD,YAAM,iBAAiB,IAAI,IAAI;AAC/B,YAAM,YAAY,OAAO,MACrB,gBAAgB,OAAO,KAAK,iBAAiB,aAAa,IAC1D;AACJ,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,GAAE;AAAA,UACF,GAAG,UAAU,CAAC;AAAA,UACd,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB;AAAA,wBAAY;AAAA,YACZ,aACC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,IAAI,OAAO;AAAA,gBACjB,UAAU;AAAA,gBAET,cAAI,SAAS;AAAA;AAAA,YAChB;AAAA;AAAA;AAAA,QAfG;AAAA,MAiBP;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACF;;;AC2Ea,gBAAAK,aAAA;AA9GN,SAAS,aAAa,OAAc,GAAW,KAAuB;AAC3E,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,UAAU,QAAQ,OAAO,GAAG,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,QAAQ,QAAQ,OAAO,GAAG,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,QAAQ,QAAQ,OAAO,GAAG,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,KAAK,QAAQ,OAAO,GAAG,GAAG;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,QAAQ,OAAO,GAAG,GAAG;AAAA,IAClC,KAAK;AACH,aAAO,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,UAAU,QAAQ,OAAO,GAAG,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,aAAa,QAAQ,OAAO,GAAG,GAAG;AAAA,IAC3C,KAAK;AACH,aAAO,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,UAAU,QAAQ,OAAO,GAAG,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,aAAa,QAAQ,OAAO,GAAG,GAAG;AAAA,IAC3C,KAAK;AACH,aAAO,SAAS,QAAQ,OAAO,GAAG,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,WAAW,QAAQ,OAAO,GAAG,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,UAAU,QAAQ,OAAO,GAAG,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,cAAc,QAAQ,OAAO,GAAG,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,SAAS,QAAQ,OAAO,GAAG,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,QAAQ,QAAQ,OAAO,GAAG,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,OAAO,QAAQ,OAAO,GAAG,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,aAAa,QAAQ,OAAO,GAAG,GAAG;AAAA,IAC3C,KAAK;AACH,aAAO,cAAc,QAAQ,OAAO,GAAG,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,SAAS,QAAQ,OAAO,GAAG,GAAG;AAAA,IACvC,SAAS;AACP,WAAM;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,SAAS,mBAAmB,OAAc,KAAe,KAAmC;AAC1F,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,QAAQ,OAAO,OAAO,KAAK,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,MAAM,OAAO,OAAO,KAAK,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,QAAQ,OAAO,OAAO,KAAK,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,KAAK,OAAO,OAAO,KAAK,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,IAAI,OAAO,OAAO,KAAK,GAAG;AAAA,IACnC,KAAK;AACH,aAAO,MAAM,OAAO,OAAO,KAAK,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,aAAa,OAAO,OAAO,KAAK,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,MAAM,OAAO,OAAO,KAAK,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,aAAa,OAAO,OAAO,KAAK,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,SAAS,OAAO,OAAO,KAAK,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,KAAK,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,cAAc,OAAO,OAAO,KAAK,GAAG;AAAA,IAC7C,KAAK;AACH,aAAO,MAAM,OAAO,OAAO,KAAK,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,SAAS,OAAO,OAAO,KAAK,GAAG;AAAA,IACxC,KAAK;AACH,aAAO,MAAM,OAAO,OAAO,KAAK,GAAG;AAAA,IACrC,KAAK;AACH,aAAO,QAAQ,OAAO,OAAO,KAAK,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,OAAO,OAAO,OAAO,KAAK,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,aAAa,OAAO,OAAO,KAAK,GAAG;AAAA,IAC5C,KAAK;AACH,aAAO,cAAc,OAAO,OAAO,KAAK,GAAG;AAAA,IAC7C,KAAK;AACH,aAAO,SAAS,OAAO,OAAO,KAAK,GAAG;AAAA,IACxC,SAAS;AACP,WAAM;AACN,aAAO,gBAAAA,MAAC,OAAE;AAAA,IACZ;AAAA,EACF;AACF;AAiBO,SAAS,YAAY,OAAc,KAAe,KAAmC;AAC1F,QAAM,UAAU,mBAAmB,OAAO,KAAK,GAAG;AAClD,QAAM,aAAa,IAAI,YAAY,IAAI,KAAK;AAC5C,SAAO,cAAc,OAAO,gBAAAA,MAAC,OAAE,YAAU,YAAa,mBAAQ,IAAO;AACvE;;;AC9IO,IAAM,YAAY;AAElB,IAAM,aAAa;AAInB,SAAS,WAAW,MAKzB;AACA,QAAM,SAAS,KAAK,OAAO,KAAK,IAAI,cAAc,CAAC;AACnD,QAAM,QAAQ,KAAK,IAAI,aAAa;AACpC,QAAM,SAAS,KAAK,IAAI,QAAQ;AAChC,SAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,KAAK,IAAI,QAAQ,aAAa,EAAE;AAC5E;AAGA,SAAS,UACP,QACA,GACA,GACA,GACA,KACA,MAAc,WAC2B;AACzC,MAAI,SAAS;AACb,QAAM,SAAwB,CAAC;AAC/B,aAAW,SAAS,QAAQ;AAC1B,WAAO,KAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,QAAQ,EAAE,EAAE,CAAC;AAC/C,cAAU,aAAa,OAAO,GAAG,GAAG,IAAI;AAAA,EAC1C;AACA,SAAO,EAAE,QAAQ,MAAM,OAAO,SAAS,SAAS,MAAM,EAAE;AAC1D;AAGO,SAAS,cACd,SACA,QACA,MACA,KACA,MAAc,WACC;AACf,MAAI,IAAI,WAAW;AAEnB,OAAK,MAAM,gBAAgB,MAAM,iBAAiB,MAAM,YAAY,OAAO,SAAS,GAAG;AACrF,QAAI;AAAA,EACN;AACA,UAAQ,GAAG;AAAA,IACT,KAAK,SAAS;AAGZ,YAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,WAAW,IAAI;AACjD,YAAM,OAAO,UAAU,OAAO,MAAM,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG;AAC3E,YAAM,QAAQ,UAAU,OAAO,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,KAAK,GAAG;AAC1E,aAAO,CAAC,GAAG,KAAK,QAAQ,GAAG,MAAM,MAAM;AAAA,IACzC;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,QAAQ,KAAK,IAAI,cAAc;AACrC,YAAM,MAAM,KAAK,KAAK,OAAO,SAAS,CAAC;AACvC,YAAM,OAAO,UAAU,OAAO,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,GAAG;AAC3E,YAAM,QAAQ;AAAA,QACZ,OAAO,MAAM,GAAG;AAAA,QAChB,KAAK,IAAI,OAAO;AAAA,QAChB,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,CAAC,GAAG,KAAK,QAAQ,GAAG,MAAM,MAAM;AAAA,IACzC;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,QAAQ,KAAK,IAAI,cAAc;AACrC,YAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,YAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,YAAM,OAAO,UAAU,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,GAAG;AAC3D,YAAM,QAAQ,UAAU,MAAM,KAAK,IAAI,OAAO,YAAY,KAAK,GAAG,MAAM,KAAK,GAAG;AAChF,aAAO,CAAC,GAAG,KAAK,QAAQ,GAAG,MAAM,MAAM;AAAA,IACzC;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AACxD,YAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AACxD,YAAM,MAAM,UAAU,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAC5D,YAAM,QAAQ,IAAI,QAAQ,KAAK,SAAS,MAAM;AAC9C,YAAM,SAAS,UAAU,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG,KAAK,GAAG;AAC9D,aAAO,CAAC,GAAG,IAAI,QAAQ,GAAG,OAAO,MAAM;AAAA,IACzC;AAAA,IACA,KAAK,SAAS;AAEZ,YAAM,WAAW,UAAU,QAAQ,KAAK,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9D,YAAM,SAAS,SAAS;AACxB,YAAM,UAAU,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,UAAU,CAAC;AAC1D,aAAO,UAAU,QAAQ,KAAK,GAAG,SAAS,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,IAC9D;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,UAAU,QAAQ,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,EAC/D;AACF;AAGA,IAAM,YAAY,CAAC,WAAW,IAAI,CAAC;AAI5B,SAAS,YAAY,QAAuB,KAAuB;AACxE,SAAO,OAAO;AAAA,IACZ,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAGA,IAAM,oBAAoB,oBAAI,IAAmB,CAAC,aAAa,cAAc,WAAW,CAAC;AAEzF,IAAM,oBAAoB;AAG1B,IAAM,wBAAwB;AAS9B,SAAS,iBACP,QACA,MACA,KACe;AACf,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,UAAU,oBAAI,IAAsB;AAC1C,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,MAAM,QAAQ,IAAI,EAAE,IAAI,CAAC;AAC/B,QAAI,IAAK,KAAI,KAAK,CAAC;AAAA,QACd,SAAQ,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,OAAO,IAAI,CAAC,MAAM,CAAC;AAChC,MAAI,OAAO;AACX,aAAW,QAAQ,QAAQ,OAAO,GAAG;AACnC,QAAI,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAK;AACpD,UAAM,YAAY,KAAK;AAAA,MACrB,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,IAAI,aAAa,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC;AAAA,MAC/F;AAAA,IACF;AACA,UAAM,YAAY,KAAK,IAAI,KAAK,IAAI;AACpC,QAAI,aAAa,sBAAuB;AACxC,UAAM,cAAc,KAAK,OAAO,CAAC,MAAM,kBAAkB,IAAI,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;AAClF,QAAI,YAAY,WAAW,EAAG;AAC9B,UAAM,WAAW,YAAY,YAAY;AACzC,QAAI,QAAQ;AACZ,eAAW,KAAK,MAAM;AACpB,YAAM,IAAI,KAAK,CAAC;AAChB,UAAI,QAAQ,EAAG,MAAK,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,MAAM,EAAE;AACvE,UAAI,kBAAkB,IAAI,EAAE,MAAM,IAAI,GAAG;AACvC,cAAM,WAAW,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG;AACnD,cAAM,UAAU,KAAK,IAAI,UAAU,YAAY,oBAAoB,EAAE;AACrE,YAAI,UAAU,GAAG;AACf,eAAK,CAAC,IAAI;AAAA,YACR,GAAG,KAAK,CAAC;AAAA,YACT,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,GAAG,WAAW,QAAQ;AAAA,UAC/C;AACA,mBAAS;AACT,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,OAAO;AACvB;AAGA,IAAM,wBAAwB;AAE9B,IAAM,gBAAgB;AAEtB,IAAM,wBAAwB;AAyB9B,SAAS,kBACP,QACA,MACA,KACA,QACe;AACf,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,QAAM,YAAY,KAAK,IAAI,KAAK,IAAI;AACpC,MAAI,aAAa,sBAAuB,QAAO;AAE/C,QAAM,UAAU,oBAAI,IAAsB;AAC1C,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,MAAM,QAAQ,IAAI,EAAE,IAAI,CAAC;AAC/B,QAAI,IAAK,KAAI,KAAK,CAAC;AAAA,QACd,SAAQ,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EAC/B,CAAC;AACD,QAAM,kBAAkB,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,IACnD,CAAC,SAAS,KAAK,UAAU,KAAK,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI;AAAA,EAC3E;AACA,QAAM,YAAY,gBAAgB,OAAO,CAAC,GAAG,SAAS,IAAI,KAAK,SAAS,GAAG,CAAC;AAC5E,MAAI,cAAc,EAAG,QAAO;AAE5B,QAAM,kBAAkB,KAAK;AAAA,IAC1B,YAAY,gBAAiB;AAAA,IAC9B,MAAM;AAAA,EACR;AAEA,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,QAAQ,iBAAiB;AAClC,SAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,UAAI,IAAI,EAAG,cAAa,IAAI,GAAG,IAAI,eAAe;AAAA,IACpD,CAAC;AAAA,EACH;AACA,SAAO,OAAO,IAAI,CAAC,GAAG,MAAM;AAC1B,UAAM,QAAQ,aAAa,IAAI,CAAC;AAChC,WAAO,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI;AAAA,EACnE,CAAC;AACH;AAgBO,SAAS,iBACd,SACA,QACA,MACA,KAC4C;AAI5C,QAAM,cACJ,IAAI,OAAO,YAAY,IAAI,MAAM,aAAa,IAC1C,CAAC,KAAK,MAAM,YAAY,IAAI,MAAM,QAAQ,GAAG,GAAG,UAAU,MAAM,CAAC,CAAC,IAClE;AACN,aAAW,OAAO,aAAa;AAC7B,UAAMC,UAAS,cAAc,SAAS,QAAQ,MAAM,KAAK,GAAG;AAC5D,UAAM,SAAS,YAAYA,SAAQ,GAAG;AACtC,QAAI,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG;AAEjC,YAAM,QAAQ,iBAAiBA,SAAQ,MAAM,GAAG;AAChD,YAAM,cAAc,UAAUA,UAAS,SAAS,YAAY,OAAO,GAAG;AACtE,aAAO,EAAE,QAAQ,kBAAkB,OAAO,MAAM,KAAK,WAAW,GAAG,SAAS,EAAE;AAAA,IAChF;AAAA,EACF;AACA,QAAM,SAAS,cAAc,SAAS,QAAQ,MAAM,KAAK,UAAU,UAAU,SAAS,CAAC,CAAC;AACxF,QAAM,OAAO,OAAO;AAAA,IAClB,CAAC,MAAM,EAAE,IAAI,IAAI,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,EAC5E;AAOA,MAAI,KAAK,WAAW,KAAK,OAAO,SAAS,GAAG;AAC1C,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI;AAC1C,WAAO;AAAA,MACL,QAAQ,CAAC,EAAE,GAAG,OAAO,KAAK,EAAE,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;AAAA,MACpE,SAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,MAAM,SAAS,OAAO,SAAS,KAAK,OAAO;AAC9D;;;A9B5SI,qBAAAC,YACE,OAAAC,OADF,QAAAC,cAAA;AANJ,IAAMC,KAAI;AACV,IAAMC,KAAI;AAGV,SAAS,YAAY;AACnB,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAOE,IAAG,QAAQC,IAAG,MAAK,WAAU,aAAa,KAAK;AAAA,IACxE,gBAAAH,MAAC,UAAK,GAAG,GAAG,GAAG,KAAK,MAAMG,KAAI,IAAI,GAAG,OAAOD,IAAG,QAAQ,KAAK,MAAMC,KAAI,IAAI,GAAG,MAAK,WAAU,aAAa,MAAM;AAAA,IAC/G,gBAAAH,MAAC,UAAK,GAAG,GAAG,GAAG,KAAK,MAAMG,KAAI,IAAI,GAAG,OAAOD,IAAG,QAAQ,KAAK,MAAMC,KAAI,IAAI,GAAG,MAAK,WAAU,aAAa,KAAK;AAAA,KAChH;AAEJ;AAKO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AAErB,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAU;AAAA,IACV,UAAU,YAAY,KAAK;AAAA,IAC3B,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,MAAM,cAAc,MAAM,YAAY;AAAA,IAC1C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,OAAO,IAAI,MAAM,SAAS,IAAI,MAAM,SAAS,IAAI,aAAa,KAAK;AACzE,QAAM,SAAS,MAAM,MAAM,SAAS,MAAM;AAC1C,QAAM,QAAQA,KAAI,MAAM;AACxB,QAAM,YAAY,QAAQ,SAAS,MAAM,aAAa;AAGtD,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,OAAO,QAAQ,KAAK;AACvD,QAAI,GAAG,OAAO,CAAC,EAAE,SAAS,UAAW;AAAA,EACvC;AAEA,SACE,gBAAAF,OAAC,OACC;AAAA,oBAAAD,MAAC,aAAU;AAAA,IACV,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,YAAY,SAAS;AAAA,QACxB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB,iBAAO,KAAK,IAAI,GAAG,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA;AAAA,IACjD;AAAA,IAED,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU;AAAA,QACV,YAAY,IAAI,MAAM;AAAA,QACtB,MAAK;AAAA,QACL,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAED,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,YAAY,IAAI,MAAM;AAAA,QACzB,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAK;AAAA,QACL,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IACD,gBAAAA,MAAC,UAAK,GAAG,IAAI,GAAG,QAAQ,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,QAAQ;AAAA,IAC/D,IAAI,MAAM,IAAI,CAAC,MAAM,MACpB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,YAAY,IAAI,MAAM;AAAA,QACtB,MAAK;AAAA,QACL,aAAa;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IACA,CAAC,aAAa,QACb,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,KAAI;AAAA,QACP,GAAG;AAAA,QACH,YAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY,IAAI,MAAM;AAAA,QACtB,MAAK;AAAA,QACL,aAAa;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;AAEA,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,eAAeA,KAAI,eAAe;AAGxC,IAAM,cAAcC;AAOb,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,MAAM,OAAO;AAAA,IAC9B,CAAC,MAAgE,EAAE,SAAS;AAAA,EAC9E;AACA,MAAI,CAAC,WAAY,QAAO;AAGxB,QAAM,YAAY,MAAM,eAAe;AACvC,QAAM,OAAO,YAAYD,KAAI,cAAc;AAC3C,QAAME,SAAQ,YAAY,KAAK;AAC/B,QAAM,MAAM,IAAI,SAAS,WAAW,QAAQ,GAAG;AAC/C,QAAM,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,MAAM,UAAU;AACxD,QAAM,MAAM,GAAG,KAAK;AAIpB,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,MAAM,cAAc,MAAM,YAAY;AAAA,IAC1C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,MAAI,SAAS;AACb,QAAM,UAAU;AAChB,YAAU;AACV,QAAM,SAAS,SAAS,MAAM,aAAa;AAC3C,YAAU,MAAM,MAAM,SAAS,MAAM,aAAa;AAClD,QAAM,QAAQ;AACd,YAAU;AACV,QAAM,OAAO,SAAS;AACtB,MAAI,IAAI,MAAM,OAAQ,WAAU,IAAI,MAAM,SAAS,IAAI,aAAa;AACpE,QAAM,YAAY,SAAS;AAC3B,QAAM,UAAUD,KAAI,KAAK;AACzB,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,EAAE,GAAGC,QAAO,GAAG,WAAW,GAAG,cAAc,GAAG,KAAK,IAAI,KAAK,OAAO,EAAE;AAAA,IACrE;AAAA,EACF;AAEA,SACE,gBAAAH,OAAC,OACE;AAAA,UACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAA,MAAC,UAAK,GAAG,MAAM,GAAG,GAAG,OAAO,aAAa,QAAQ,aAAa,MAAM,IAAI,OAAO,SAAS;AAAA,IAEzF,WAAW,YACT,MAAM;AACL,YAAM,SAAS,WAAW,WAAW,SAAS;AAAA,QAC5C,UAAU,cAAc;AAAA,QACxB,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,aACE,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAG,MAAM,GAAG,cAAc,IAAI,OAAO,aAAa,QAAQ,IAAI,MAAK,WAAU,aAAa,MAAM;AAAA,QACtG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,OAAO;AAAA,YACV,GAAG,cAAc;AAAA,YACjB,UAAU,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,MAAK;AAAA,YACL,aAAa;AAAA,YACb,kBAAiB;AAAA,YAEhB,iBAAO;AAAA;AAAA,QACV;AAAA,SACF;AAAA,IAEJ,GAAG;AAAA,IACJ,OAAO,gBAAAA,MAAC,UAAK,GAAGI,QAAO,GAAG,UAAU,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,QAAQ;AAAA,IACxF,OACC,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAGI,SAAQ;AAAA,QACX,GAAG;AAAA,QACH,UAAU;AAAA,QACV,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAED,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGI;AAAA,QACH,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IACD,gBAAAJ,MAAC,UAAK,GAAGI,QAAO,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,IACxE,IAAI,MAAM,IAAI,CAAC,MAAM,MACpB,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGI;AAAA,QACH,GAAG,OAAO,IAAI,IAAI;AAAA,QAClB,UAAU,IAAI;AAAA,QACd,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MARI;AAAA,IASP,CACD;AAAA,IACA,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAJ,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,IACA,UAAU,KACT,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,KAAI;AAAA,QACP,GAAGC,KAAI;AAAA,QACP,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,cAAI,OAAO;AAAA;AAAA,IACd;AAAA,KAEJ;AAEJ;AAEA,IAAM,YAAY;AAClB,IAAM,aAAa;AAOZ,SAAS,aAAa;AAAA,EAC3B,IAAI;AAAA,EACJ;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,MAAM,OAAO;AAAA,IAC9B,CAAC,MAAgE,EAAE,SAAS;AAAA,EAC9E;AACA,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,MAAM,IAAI,SAAS,WAAW,QAAQ,GAAG;AAC/C,QAAM,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,MAAM,UAAU;AAExD,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAUD,KAAI,aAAa,IAAI;AAAA,IAC/B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,QAAQ,YAAY;AAC1B,QAAM,YAAY,QAAQ;AAC1B,QAAM,UAAUC,KAAI,KAAK;AAEzB,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC9C,QAAM,SAAS;AACf,QAAM,QAAQD,KAAI,aAAa,IAAI,UAAU,IAAI,MAAM;AACvD,QAAM,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM;AAC1C,UAAM,OAAO;AAAA,MACX,GAAG,aAAa,KAAK,OAAO;AAAA,MAC5B,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,KAAK,IAAI,KAAK,OAAO;AAAA,IAC1B;AACA,UAAM,EAAE,OAAO,IAAI,iBAAiB,UAAU,CAAC,CAAC,GAAG,MAAM,GAAG;AAC5D,WAAO;AAAA,EACT,CAAC;AAED,SACE,gBAAAD,OAAC,OACE;AAAA,UACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAOE;AAAA,QACP,QAAQ;AAAA,QACR,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAF,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAOE,IAAG,QAAQ,WAAW,MAAM,IAAI,OAAO,SAAS;AAAA,IAG3E,gBAAAF,MAAC,UAAK,GAAG,YAAY,GAAG,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,QAAQ;AAAA,IACnF,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,aAAa;AAAA,QAChB,GAAG,QAAQ;AAAA,QACX,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IACD,gBAAAA,MAAC,UAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAOE,KAAI,aAAa,GAAG,QAAQ,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,IACjG,KAAK,IAAI,CAAC,QAAQ,OACjB,gBAAAF,MAACD,YAAA,EACE,iBAAO,IAAI,CAAC,GAAG,MACd,gBAAAC,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD,KAHY,EAIf,CACD;AAAA,KACH;AAEJ;AAIA,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,aAAaG,KAAI,aAAa;AACpC,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAEtB,IAAM,aAAa;AACnB,IAAM,cAAcA,KAAI;AACxB,IAAM,aAAa;AAUnB,IAAM,cAAkC;AAAA,EACtC;AAAA,IACE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM,EAAE,IAAI,aAAa,IAAI,IAAI,KAAK,IAAI,YAAY,IAAI,IAAI,YAAY,GAAG;AAAA,EAC/E;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM,EAAE,IAAI,cAAc,IAAI,IAAI,KAAK,IAAI,YAAY,YAAY,IAAI,IAAI,YAAY,GAAG;AAAA,EAC5F;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM,EAAE,IAAI,aAAa,IAAI,IAAI,KAAK,IAAI,YAAY,IAAI,IAAI,YAAY,YAAY,GAAG;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM,EAAE,IAAI,cAAc,IAAI,IAAI,KAAK,IAAI,YAAY,YAAY,IAAI,IAAI,YAAY,YAAY,GAAG;AAAA,EACxG;AACF;AAGA,SAAS,gBAAgB,MAA+C;AACtE,QAAM,IAAI,KAAK,MAAM,yBAAyB;AAC9C,MAAI,EAAG,QAAO,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;AACxC,SAAO,EAAE,OAAO,MAAM,MAAM,GAAG;AACjC;AAOO,SAAS,kBAAkB;AAAA,EAChC,IAAI;AAAA,EACJ;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,MAAM,OAAO;AAAA,IAC9B,CAAC,MAAgE,EAAE,SAAS;AAAA,EAC9E;AACA,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,MAAM,IAAI,SAAS,WAAW,QAAQ,GAAG;AAC/C,QAAM,eAAe,MAAM,OAAO;AAAA,IAChC,CAAC,MAAkE,EAAE,SAAS;AAAA,EAChF;AACA,QAAM,eAAe,cAAc,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,eAAe;AAE/E,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,MAAM,WAAW,MAAM,cAAc,IAAI;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AAED,SACE,gBAAAD,OAAC,OACE;AAAA,UAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAD;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE,KAAI;AAAA,QACP,GAAG,KAAK,IAAI,MAAM;AAAA,QAClB,YAAW;AAAA,QACX,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IACD,gBAAAF,MAAC,UAAK,GAAGE,KAAI,IAAI,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,IAC1E,MAAM,cACL,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,KAAI;AAAA,QACP,GAAG;AAAA,QACH,YAAW;AAAA,QACX,UAAU,IAAI;AAAA,QACd,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,cAAI;AAAA;AAAA,IACP;AAAA,IAGF,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,YAAY;AAAA,QACf,GAAG,YAAY;AAAA,QACf,OAAO,YAAY,gBAAgB;AAAA,QACnC,QAAQ,YAAY,gBAAgB;AAAA,QACpC,MAAK;AAAA,QACL,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAa;AAAA;AAAA,IACf;AAAA,IACC,MACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAA,MAAC,UAAK,GAAG,WAAW,GAAG,WAAW,OAAO,WAAW,QAAQ,WAAW,MAAM,IAAI,OAAO,SAAS;AAAA,IAElG,WAAW,WACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,KAAI;AAAA,QACP,GAAG,YAAY,YAAY,gBAAgB;AAAA,QAC3C,YAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,qBAAW,WAAW,SAAS,EAAE,UAAU,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC,EAAE;AAAA;AAAA,IACpF;AAAA,IAED,YAAY,IAAI,CAAC,KAAK,MAAM;AAC3B,YAAM,SAAS,YAAY,CAAC;AAC5B,YAAM,OAAO,IAAI,OACb,cAAc,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC,IACD;AACJ,YAAM,WAAW,cAAc,IAAI,OAAO;AAAA,QACxC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU,OAAO,IAAI;AAAA,QACrB,iBAAiB;AAAA,MACnB,CAAC;AACD,aACE,gBAAAD,OAAC,OACC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK;AAAA,YAChB,QAAQ,IAAI,OAAO;AAAA,YACnB,aAAa;AAAA;AAAA,QACf;AAAA,QACA,gBAAAA,MAAC,YAAO,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,QAC9E,SAAS,MAAM,IAAI,CAAC,MAAM,OACzB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,OAAO;AAAA,YACV,GAAG,OAAO,SAAS,KAAK,SAAS;AAAA,YACjC,YAAY,OAAO;AAAA,YACnB,UAAU,SAAS;AAAA,YACnB,YAAY;AAAA,YACZ,YAAY,IAAI,MAAM;AAAA,YACtB,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UAVI;AAAA,QAWP,CACD;AAAA,QACA,MAAM,MAAM,IAAI,CAAC,MAAM,OACtB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,OAAO;AAAA,YACV,GAAG,OAAO,SAAS,SAAS,MAAM,SAAS,SAAS,aAAa,IAAI,KAAK,KAAK;AAAA,YAC/E,YAAY,OAAO;AAAA,YACnB,UAAU,KAAK;AAAA,YACf,YAAY,IAAI,MAAM;AAAA,YACtB,MAAM,IAAI,OAAO;AAAA,YACjB,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UATI;AAAA,QAUP,CACD;AAAA,WAtCK,CAuCR;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAIA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAMhB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,MAAM,OAAO;AAAA,IAC9B,CAAC,MAAgE,EAAE,SAAS;AAAA,EAC9E;AACA,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,MAAM,IAAI,SAAS,WAAW,QAAQ,GAAG;AAC/C,QAAM,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,MAAM,UAAU;AAExD,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,MAAM,cAAc,MAAM,YAAY;AAAA,IAC1C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AAGD,QAAM,OAAO,GAAG;AAChB,QAAM,gBAAgB;AAAA,IACpB,KAAK,mBAAmB,KAAK,gBAAgB,KAAK,WAAW,KAAK;AAAA,EACpE;AACA,QAAM,gBAAgB,gBAAgBG,KAAI,KAAKA;AAC/C,MAAI,SAAS;AACb,QAAM,SAAS,SAAS,MAAM,aAAa;AAC3C,YAAU,MAAM,MAAM,SAAS,MAAM,aAAa;AAClD,QAAM,QAAQ;AACd,YAAU;AACV,QAAM,OAAO,SAAS;AACtB,MAAI,IAAI,MAAM,OAAQ,WAAU,IAAI,MAAM,SAAS,IAAI,aAAa;AACpE,QAAM,YAAY,SAAS;AAK3B,QAAM,oBAAoBA,KAAI,iBAAiB;AAC/C,QAAM,EAAE,OAAO,IAAI;AAAA,IACjB;AAAA,IACA;AAAA,IACA,EAAE,GAAG,KAAK,GAAG,WAAW,GAAGD,KAAI,KAAK,GAAG,KAAK,IAAI,IAAI,oBAAoB,SAAS,EAAE;AAAA,IACnF;AAAA,EACF;AACA,QAAM,gBAAgB,OAAO,SAAS,YAAY,QAAQ,GAAG,IAAI;AACjE,QAAM,SAAS,KAAK;AAAA,IAClB,KAAK,IAAI,gBAAgB,IAAIC,KAAI,cAAc;AAAA,IAC/CA,KAAI;AAAA,EACN;AACA,QAAM,OAAOA,KAAI;AAEjB,SACE,gBAAAF,OAAC,OACE;AAAA,UAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAD;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE,KAAI;AAAA,QACP,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,YAAW;AAAA,QACX,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IACD,gBAAAF,MAAC,UAAK,GAAGE,KAAI,IAAI,IAAI,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,OAAO,QAAQ;AAAA,IAC7E,IAAI,MAAM,IAAI,CAAC,MAAM,MACpB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE,KAAI;AAAA,QACP,GAAG,OAAO,IAAI,IAAI;AAAA,QAClB,YAAW;AAAA,QACX,UAAU,IAAI;AAAA,QACd,YAAY,IAAI,MAAM;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IACA,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAF,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,IACA,MACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAOE;AAAA,QACP,QAAQ;AAAA,QACR,qBAAoB;AAAA;AAAA,IACtB,IAEA,gBAAAF,MAAC,UAAK,GAAG,GAAG,GAAG,QAAQ,OAAOE,IAAG,QAAQ,MAAM,MAAM,IAAI,OAAO,SAAS;AAAA,IAE1E,WAAW,YACT,MAAM;AACL,YAAM,SAAS,WAAW,WAAW,SAAS;AAAA,QAC5C,UAAUA,KAAI;AAAA,QACd,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,aACE,gBAAAD,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,gBAAgB,IAAI,OAAOE,IAAG,QAAQ,IAAI,MAAK,WAAU,aAAa,MAAM;AAAA,QAC3F,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,GAAGE,KAAI;AAAA,YACP,GAAG,gBAAgB;AAAA,YACnB,YAAW;AAAA,YACX,UAAU,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,MAAK;AAAA,YACL,aAAa;AAAA,YACb,kBAAiB;AAAA,YAEhB,iBAAO;AAAA;AAAA,QACV;AAAA,SACF;AAAA,IAEJ,GAAG;AAAA,KACP;AAEJ;;;A+BzrBM,SAwFE,YAAAG,YAvFA,OAAAC,OADF,QAAAC,cAAA;AApDC,SAAS,iBAAiB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACrE,QAAM,QAAQ,cAAc,MAAM,SAAS;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,WAAW,cAAc,MAAM,YAAY;AAAA,IAC/C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,SAAS,MAAM,MAAM,SAAS,IAAI,MAAM;AAC9C,QAAM,aACJ,SAAS,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAevD,QAAM,YAAY,aAAa;AAE/B,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,aAAa,SACf,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IACrD;AACJ,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,UAAU,GAAG,KAAK;AAExB,QAAM,eACJ,aACC,SAAS,MAAM,SAAS,IACrB,SAAS,MAAM,SAAS,SAAS,aAAa,KAC9C;AACN,QAAM,YAAY,eAAe;AAEjC,SACE,gBAAAA,OAAAF,YAAA,EAEE;AAAA,oBAAAE,OAAC,OAAE,WAAU,sBACX;AAAA,sBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,OAAM,GAAE,MAAK,MAAM,IAAI,OAAO,QAAQ;AAAA,MACxD,OACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,IAAI,MAAM;AAAA,UACtB,UAAS;AAAA,UACT,MAAM,IAAI,OAAO;AAAA,UACjB,eAAc;AAAA,UACd,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IAGC,aACC,gBAAAC,OAAC,OACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,OAAM;AAAA,UACN,QAAO;AAAA,UACP,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA,MAAC,UAAK,GAAE,QAAO,GAAE,OAAM,OAAM,KAAI,QAAO,MAAK,MAAM,IAAI,OAAO,QAAQ;AAAA,MACtE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,IAAI,MAAM;AAAA,UACtB,UAAS;AAAA,UACT,MAAM,IAAI,OAAO;AAAA,UACjB,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAID,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IASD,gBAAAA,MAAC,UAAK,GAAE,MAAK,GAAG,aAAa,IAAI,OAAM,MAAK,QAAO,KAAI,MAAM,IAAI,OAAO,SAAS;AAAA,IAGhF,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,KAGC,cAAc,QAAQ,YACtB,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,IAAI;AAAA,UACJ,IAAG;AAAA,UACH,IAAI;AAAA,UACJ,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,UACxC,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG;AAAA,UACH,YAAY,IAAI,MAAM;AAAA,UACtB,UAAS;AAAA,UACT,kBAAiB;AAAA,UAEhB;AAAA,0BAAc,gBAAAD,MAAC,WAAM,MAAM,IAAI,OAAO,SAAU,sBAAW;AAAA,YAC3D,QACC,gBAAAA,MAAC,WAAM,MAAM,IAAI,OAAO,OAAQ,aAAG,aAAa,iBAAc,EAAE,GAAG,IAAI,IAAG;AAAA,YAE3E,WACC,gBAAAA,MAAC,WAAM,MAAM,IAAI,OAAO,OAAQ,aAAG,cAAc,OAAO,iBAAc,EAAE,GAAG,OAAO,IAAG;AAAA;AAAA;AAAA,MAEzF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC5JA,IAAM,WAAW,IAAI;AAAA,EACnB;AACF;AAyCO,SAAS,gBACd,MACA,MAOe;AACf,QAAM,EAAE,UAAU,UAAU,WAAW,GAAG,QAAQ,IAAI,gBAAgB,IAAI;AAC1E,QAAM,UAAU,QAAQ;AAIxB,QAAM,QAAQ,cAAc,SAAS;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,YAAY,MAAO,QAAO;AACvD,QAAM,SAAU,WAAW,QAAS;AACpC,QAAM,YAAY,gBAAgB,SAAS,MAAM;AACjD,SAAO,cAAc,WAAW;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACH;;;ACVI,qBAAAE,YAEI,OAAAC,OAFJ,QAAAC,cAAA;AAhEJ,IAAM,WAAW;AAKjB,IAAM,eAAe;AACrB,IAAM,eAAe;AAEd,SAAS,kBAAkB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACtE,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,aAAa,SACf,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IACrD;AACJ,QAAM,UAAU,GAAG,KAAK;AAExB,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAQD,QAAM,gBAAgB;AACtB,QAAM,aAAa,gBAAgB,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAG/E,QAAM,UAAU,aAAa;AAE7B,QAAM,WAAW,cAAc,MAAM,cAAc,IAAI;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,UAAU;AAC5B,QAAM,gBACJ,YAAY,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC,IAAI,SAAS;AAEhE,QAAM,YAAY,CAAC,KAAK,WAAW,MAAM,YAAY,OAAO,EAAE;AAAA,IAC5D,CAAC,MAAmB,QAAQ,CAAC;AAAA,EAC/B;AACA,QAAM,WACJ,UAAU,SAAS,IACf,WAAW,UAAU,KAAK,cAAW,GAAG;AAAA,IACtC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AAGN,QAAM,QAAQ,KAAK,IAAI,KAAK,gBAAgB,EAAE;AAE9C,SACE,gBAAAA,OAAAF,YAAA,EACG;AAAA,UAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,gBAAgB,IAAI,MAAM;AAAA,QAC7B,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAXI;AAAA,IAYP,CACD;AAAA,IAED,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,WAAW,eAAe;AAAA,QAC7B,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,IAAG;AAAA,QACH,MAAM,IAAI,OAAO;AAAA;AAAA,IACnB;AAAA,IAEC,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAEA,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;ACzDI,qBAAAE,YAEE,OAAAC,OAFF,QAAAC,cAAA;AA7EJ,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,aAAa,WAAW,WAAW,QAAQ,cAAc;AAE/D,IAAMC,WAAU;AAChB,IAAM,cAAc,OAAOA,WAAU;AAQrC,SAAS,kBAAkB,KAAqB;AAC9C,MAAI,IAAI,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AACnC,MAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAC1E,MAAI,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,GAAG,CAAC;AACpC,MAAI,CAAC,mBAAmB,KAAK,CAAC,EAAG,QAAO;AACxC,QAAM,IAAI,SAAS,GAAG,EAAE;AACxB,QAAM,OAAO,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,MAAM;AACjE,UAAM,IAAI,IAAI;AACd,WAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AAAA,EACrE,CAAC;AACD,SAAO,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC;AAC9D;AAMO,SAAS,WAAW,OAAsC;AAC/D,SAAO,kBAAkB,KAAK,IAAI,MAAM,YAAY;AACtD;AAEO,SAAS,mBAAmB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACvE,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,aAAa,SAAS,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IAAI;AACrF,QAAM,UAAU,GAAG,KAAK;AAExB,QAAM,UAAU,WAAW,IAAI,OAAO,OAAO;AAE7C,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAMC,WAAU;AAChB,QAAM,aAAaA,WAAU,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAEzE,QAAM,UAAU,aAAa;AAE7B,QAAM,WAAW,cAAc,MAAM,cAAc,IAAI;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,UAAU;AAE5B,QAAM,YAAY,CAAC,KAAK,WAAW,MAAM,YAAY,OAAO,EAAE;AAAA,IAC5D,CAAC,MAAmB,QAAQ,CAAC;AAAA,EAC/B;AACA,QAAM,WACJ,UAAU,SAAS,IACf,WAAW,UAAU,KAAK,cAAW,GAAG;AAAA,IACtC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AAEN,SACE,gBAAAF,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAG,YAAY,MAAM,IAAI,OAAO,SAAS;AAAA,IAG9C,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAIF,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,SAAS,aAAa,MAAM;AAAA,IAGjE,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE;AAAA,QACH,GAAGC,WAAU,IAAI,MAAM;AAAA,QACvB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGD,gBAAAH,MAAC,UAAK,GAAGE,UAAS,GAAG,SAAS,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,IAG7E,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE;AAAA,QACH,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MARI;AAAA,IASP,CACD;AAAA,IAGA,YACC,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;ACpDM,SA4FE,YAAAE,YA5FF,OAAAC,OA4BA,QAAAC,cA5BA;AArEN,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB,gBAAgB;AACtC,IAAM,mBAAmB;AACzB,IAAM,oBAAoB,mBAAmB;AAM7C,IAAMC,wBAAuB;AAQ7B,IAAM,gBAAgB;AAEf,SAAS,gBAAgB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACpE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAM1B,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,aAAa,KAAK,MAAM,MAAM,WAAWA,qBAAoB;AACnE,QAAM,cACJ,wBACE,MAAM,MAAM,SAAS,KAAK,MAAM,aAAc,IAChD;AAEF,QAAM,WAAW,cAAc,MAAM,YAAY;AAAA,IAC/C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,aAAa,SACf,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IACrD;AACJ,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,UAAU,GAAG,KAAK;AAExB,QAAM,OAAO;AACb,QAAM,YAAY,OAAO;AACzB,QAAM,gBACJ,YAAY,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC,IAAI,SAAS;AAChE,QAAM,eACJ,SAAS,MAAM,SAAS,IAAI,gBAAgB,SAAS,aAAa,KAAK,OAAO;AAChF,QAAM,YAAY,eAAe;AAEjC,SACE,gBAAAD,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAO,eAAe,QAAO,OAAM,MAAM,OAAO,SAAS;AAAA,IAQ3E,gBAAAA,MAAC,aAAQ,QAAO,uBAAsB,MAAM,eAAe;AAAA,IAI1D,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,cAAc,IAAI,MAAM;AAAA,QAC3B,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAK;AAAA,QACL,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGD,gBAAAC,OAAC,OAAE,WAAW,aAAa,aAAa,KAAK,IAAI,KAC/C;AAAA,sBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,OAAM,GAAE,MAAK,MAAM,OAAO,QAAQ;AAAA,MACpD,OACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IAKC,aACC,gBAAAC,OAAC,OACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,OAAM;AAAA,UACN,QAAO;AAAA,UACP,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAQ,OAAO;AAAA,UACf,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAID,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,KAGC,cAAc,QAAQ,YACtB,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,UAChC,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,kBAAiB;AAAA,UAEhB;AAAA,0BAAc,gBAAAD,MAAC,WAAM,MAAM,OAAO,MAAO,sBAAW;AAAA,YACpD,QAAQ,gBAAAA,MAAC,WAAM,MAAM,OAAO,OAAQ,aAAG,aAAa,iBAAc,EAAE,GAAG,IAAI,IAAG;AAAA,YAC9E,WACC,gBAAAA,MAAC,WAAM,MAAM,OAAO,OAAQ,aAAG,cAAc,OAAO,iBAAc,EAAE,GAAG,OAAO,IAAG;AAAA;AAAA;AAAA,MAErF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACtJQ,SAgBA,YAAAG,YAhBA,OAAAC,OAgBA,QAAAC,cAhBA;AA1DR,IAAM,0BAA0B;AAChC,IAAM,+BAA+B;AACrC,IAAM,+BAA+B;AASrC,IAAM,qBAAqB;AAAA,EACzB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,EACvB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,EACvB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,EAAE;AAAA,EACxB,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;AAAA,EAC1B,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,EAAE;AAAA,EACxB,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;AAAA,EAC1B,EAAE,GAAG,MAAM,GAAG,KAAK,GAAG,EAAE;AAC1B;AAGA,IAAM,yBAAyB,mBAAmB,mBAAmB,SAAS,CAAC;AAExE,SAAS,mBAAmB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACvE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AAEzE,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,iBAAiB;AACvB,QAAM,SACJ,iBAAiB,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAE/D,QAAM,WAAW,MAAM,aACnB,WAAW,MAAM,YAAY;AAAA,IAC3B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AAEJ,SACE,gBAAAA,OAAAF,YAAA,EAEG;AAAA,WACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAKD,YACC,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAE,MAAK,GAAE,OAAM,OAAM,MAAK,QAAO,KAAI,MAAM,OAAO,QAAQ;AAAA,MAChE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAU,SAAS;AAAA,UACnB,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB,mBAAS;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IAID,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,UAAU,SAAS,KAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,oBAAU,KAAK,cAAW;AAAA;AAAA,IAC7B;AAAA,IAQF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,mBAAmB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,QAC/D,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,IACC,mBAAmB,IAAI,CAAC,GAAG,MAC1B,gBAAAA,MAAC,YAAe,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,OAAO,UAA1C,CAAkD,CAChE;AAAA,IAKD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,uBAAuB;AAAA,QAC3B,IAAI,uBAAuB;AAAA,QAC3B,GAAG,uBAAuB,IAAI;AAAA,QAC9B,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,uBAAuB;AAAA,QAC3B,IAAI,uBAAuB;AAAA,QAC3B,GAAG,uBAAuB,IAAI;AAAA,QAC9B,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,uBAAuB;AAAA,QAC3B,IAAI,uBAAuB;AAAA,QAC3B,GAAG,uBAAuB,IAAI;AAAA,QAC9B,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAc;AAAA,QACd,aAAa;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,uBAAuB;AAAA,QAC3B,IAAI,uBAAuB;AAAA,QAC3B,GAAG,uBAAuB,IAAI;AAAA,QAC9B,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAc;AAAA,QACd,aAAa;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;;;ACxJI,qBAAAE,YAEI,OAAAC,OAFJ,QAAAC,cAAA;AA9BG,SAAS,uBAAuB,EAAE,IAAI,OAAO,IAAI,GAAqB;AAC3E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,CAAC,KAAK,MAAM,SAAS,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AAK9E,QAAM,wBAAwB;AAC9B,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,SACJ,wBAAwB,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AACtE,QAAM,eAAe;AAErB,QAAM,aAAa,eAAe;AAClC,QAAM,YAAY,aAAa;AAE/B,QAAM,WAAW,MAAM,aACnB,WAAW,MAAM,YAAY,EAAE,UAAU,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC,IAC7E;AAEJ,SACE,gBAAAA,OAAAF,YAAA,EACG;AAAA,UAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAED,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,aAAY;AAAA;AAAA,IACd;AAAA,IAEC,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,IAGD,UAAU,SAAS,KAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,oBAAU,KAAK,cAAW;AAAA;AAAA,IAC7B;AAAA,KAEJ;AAEJ;;;ACKQ,SAiFA,YAAAE,YAjFA,OAAAC,OAqBA,QAAAC,cArBA;AAxDR,SAAS,WACP,IACA,OACS;AACT,MAAI,MAAM,YAAY,SAAS,QAAS,QAAO;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,QAAQ,GAAG,OAAO,OAAO,OAAO;AACtC,SAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AACjC;AAEO,SAAS,wBAAwB,EAAE,IAAI,OAAO,IAAI,GAAqB;AAC5E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,SAAS,WAAW,IAAI,KAAK;AAEnC,QAAM,SAAS,SAAS,YAAY,OAAO;AAC3C,QAAM,WAAW,SAAS,YAAY,OAAO;AAC7C,QAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,QAAM,cAAc,SAAS,YAAa,OAAO,UAAU,OAAO;AAClE,QAAM,gBAAgB,SAAS,OAAO;AAEtC,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,aAAa,SACf,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IACrD;AACJ,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,UAAU,GAAG,KAAK;AAExB,QAAM,QAAQ,cAAc,MAAM,WAAW,IAAI;AAAA,IAC/C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,SACX,MAAM,MAAM,SAAS,IACnB,MACA,MACF,MAAM,MAAM,SAAS,IACnB,MACA;AACN,QAAM,aACJ,SAAS,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AACvD,QAAM,YAAY,aAAa;AAC/B,QAAM,WAAW,MAAM,aACnB,WAAW,MAAM,YAAY,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IAC9E;AAEJ,SACE,gBAAAA,OAAAF,YAAA,EAGG;AAAA,cACC,gBAAAC,MAAC,UAAK,OAAM,QAAO,QAAO,OAAM,MAAK,WAAU,SAAQ,QAAO;AAAA,IAI/D,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,SAAS,MAAM;AAAA,QACxB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAID,aACC,gBAAAC,OAAC,OACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,OAAM;AAAA,UACN,QAAO;AAAA,UACP,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAQ;AAAA,UACR,aAAY;AAAA,UACZ,eAAe,SAAS,MAAM;AAAA;AAAA,MAChC;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM;AAAA,UACN,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAID,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,SAAS,IAAI,MAAM;AAAA,QACtB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,SAAS,OAAO;AAAA,QACzB,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,IAID,CAAC,UACA,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,aAAY;AAAA;AAAA,MACd;AAAA,MACC,cACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM;AAAA,UACN,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB,WAAC,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,IAKD,WAAW,cAAc,QAAQ,YAChC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,kBAAiB;AAAA,QAEhB,WAAC,YAAY,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,UAAO;AAAA;AAAA,IAC3D;AAAA,KAEJ;AAEJ;;;ACnMI,qBAAAE,YAEE,OAAAC,OAFF,QAAAC,cAAA;AApCG,SAAS,qBAAqB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACzE,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,OAAO,WAAW,IAAI,IAAI;AAC5C,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,KAAK,WAAW,IAAI,OAAO,OAAO;AAExC,QAAM,QAAQ,gBAAgB,MAAM,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAMC,WAAU;AAChB,QAAM,aAAaA,WAAU,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAGzE,QAAM,QAAQ,aAAa;AAC3B,QAAM,SAAS;AAEf,QAAM,WAAW,cAAc,MAAM,cAAc,IAAI;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,QAAQ,SAAS;AAEnC,QAAM,YAAY,CAAC,KAAK,WAAW,MAAM,OAAO,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvF,QAAM,WACJ,UAAU,SAAS,IACf,WAAW,UAAU,KAAK,cAAW,GAAG,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IACzF;AAEN,SACE,gBAAAD,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,SAAS;AAAA,IAGrE,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,YAAW;AAAA,QACX,eAAe;AAAA,QACf,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGF,gBAAAA,MAAC,UAAK,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,IAAI,aAAa,GAAG;AAAA,IAGrE,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAGE,WAAU,IAAI,MAAM;AAAA,QACvB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGD,gBAAAF,MAAC,UAAK,GAAG,IAAI,GAAG,OAAO,OAAO,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,IAG5E,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAW;AAAA,QACX,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;ACrHO,IAAM,mBAA6D;AAAA,EACxE,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;;;ACrBO,SAAS,iBAAiB,QAAiB,OAAuB;AACvE,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK;AACpD,QAAI,OAAO,CAAC,EAAE,SAAS,UAAW;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,eAAe,QAAiB,OAA8B;AAC5E,WAAS,IAAI,OAAO,KAAK,GAAG,KAAK;AAC/B,QAAI,OAAO,CAAC,EAAE,SAAS,UAAW,QAAO,OAAO,CAAC,EAAE,WAAW;AAAA,EAChE;AACA,SAAO;AACT;AAeO,SAAS,sBAAsB,QAAiB,OAAuB;AAC5E,MAAI,IAAI;AACR,WAAS,IAAI,OAAO,KAAK,KAAK,OAAO,CAAC,EAAE,SAAS,WAAW,KAAK;AAC/D,QAAI,OAAO,CAAC,EAAE,SAAS,UAAW;AAAA,EACpC;AACA,SAAO;AACT;;;ACeI,qBAAAG,YACE,OAAAC,OADF,QAAAC,cAAA;AA9BG,SAAS,gBAAgB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC3E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAE3C,QAAM,iBAAiB;AACvB,QAAM,oBAAoB;AAC1B,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAKzB,QAAM,oBAAoB;AAC1B,QAAM,kBAAkB;AAExB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eACJ,mBAAmB,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AACrE,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY,EAAE,UAAU,mBAAmB,UAAU,IAAI,aAAa,GAAG,CAAC,IAC3F;AACJ,QAAM,cAAc,eAAe;AAEnC,SACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,IAKA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAEC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,mBAAmB,IAAI,QAAQ;AAAA,QAClC,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAEA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;;;AC5DI,qBAAAE,YAIE,OAAAC,OAJF,QAAAC,cAAA;AApCG,SAAS,qBAAqB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAChF,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAI3C,QAAM,cAAc,OAAO;AAE3B,QAAM,kBAAkB;AACxB,QAAM,mBAAmB;AACzB,QAAM,YAAY;AAClB,QAAM,YAAY;AAGlB,QAAM,kBAAkB,OAAO;AAE/B,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eACJ,mBACA,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAClD,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY;AAAA,IAC3B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AACJ,QAAM,cAAc,eAAe;AAEnC,SACE,gBAAAA,OAAAF,YAAA,EAIE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAEC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,mBAAmB,IAAI,QAAQ;AAAA,QAClC,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAEA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;;;AC9BI,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AA7BJ,IAAM,WAAW;AACjB,IAAM,iBAAiB;AAEhB,SAAS,YAAY,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AACvE,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAC3C,QAAM,gBAAgB,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE;AAEpE,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WAAW,QAAQ,MAAM,SAAS,IAAI,MAAM;AAClD,QAAM,eACJ,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAC7D,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IAC9E;AACJ,QAAM,cAAc,eAAe;AAKnC,QAAM,YAAY,KAAK,IAAI,GAAG,gBAAgB,CAAC,IAAI;AACnD,QAAM,aAAa,MAAM,YAAY;AAErC,SACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IACC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAK;AAAA,QACL,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IACA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,WAAW;AAAA,QACrB,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAID,gBAAgB,KACf,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,QAAO;AAAA,QACP,eAAc;AAAA,QACd,aAAY;AAAA;AAAA,IACd;AAAA,IAED,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,MAC3D,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI,cAAc,IAAI,KAAK;AAAA,QAC3B,IAAI;AAAA,QACJ,GAAG,MAAM,QAAQ,IAAI;AAAA,QACrB,MAAK;AAAA,QACL,aAAa,MAAM,QAAQ,IAAI;AAAA;AAAA,MAL1B;AAAA,IAMP,CACD;AAAA,KACH;AAEJ;;;ACjGI,qBAAAE,YAEE,OAAAC,OAFF,QAAAC,cAAA;AApBG,SAAS,cAAc,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AACzE,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAE3C,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WAAW,QAAQ,MAAM,SAAS,IAAI,MAAM;AAClD,QAAM,eACJ,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAC7D,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IAC9E;AACJ,QAAM,cAAc,eAAe;AACnC,QAAM,YAAY,eAAe;AAEjC,SACE,gBAAAA,OAAAF,YAAA,EAEE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAK;AAAA,QACL,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,WAAW;AAAA,QACrB,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAY;AAAA,QACZ,SAAQ;AAAA;AAAA,IACV;AAAA,KACF;AAEJ;;;AC/DI,qBAAAE,YAGI,OAAAC,OAHJ,QAAAC,cAAA;AAnBG,SAAS,cAAc,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AACzE,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAC3C,QAAM,MAAM,GAAG,KAAK;AAEpB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,WAAW,QAAQ,MAAM,SAAS,IAAI,MAAM;AAClD,QAAM,eACJ,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAC7D,QAAM,WAAW,eAAe;AAEhC,SACE,gBAAAA,OAAAF,YAAA,EAEG;AAAA,WACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,MAAM,IAAI,OAAO;AAAA,QACjB,YAAW;AAAA,QACX,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAY;AAAA;AAAA,IACd;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;;;AC5CQ,qBAAAE,YAEE,OAAAC,OAFF,QAAAC,cAAA;AArDR,IAAM,cAAkC;AAAA,EACtC,CAAC,KAAM,GAAG;AAAA,EAAG,CAAC,KAAK,IAAI;AAAA,EAAG,CAAC,KAAK,GAAG;AAAA,EAAG,CAAC,KAAK,IAAI;AAAA,EAChD,CAAC,KAAK,GAAG;AAAA,EAAG,CAAC,IAAI,IAAI;AAAA,EAAG,CAAC,IAAI,GAAG;AAAA,EAAG,CAAC,IAAI,IAAI;AAAA,EAC5C,CAAC,IAAI,GAAG;AAAA,EAAG,CAAC,GAAG,IAAI;AAAA,EAAG,CAAC,GAAG,GAAG;AAAA,EAAG,CAAC,GAAG,IAAI;AAAA,EAAG,CAAC,GAAG,GAAG;AACpD;AAEO,SAAS,QAAQ,GAAmB;AACzC,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,IAAM,QAAO,OAAO,CAAC;AAChE,MAAI,OAAO;AACX,MAAI,MAAM;AACV,aAAW,CAAC,OAAO,KAAK,KAAK,aAAa;AACxC,WAAO,QAAQ,OAAO;AACpB,aAAO;AACP,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,QAAQ,IAAY,IAAY,GAAW,IAAY,IAAoB;AAClF,QAAM,MAAM,CAAC,MAAe,IAAI,KAAK,KAAM;AAC3C,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACpC,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACpC,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACpC,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACpC,QAAM,QAAQ,KAAK,IAAI,KAAK,EAAE,IAAI,MAAM,IAAI;AAC5C,SAAO,KAAK,GAAG,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AACvG;AAEO,SAAS,aAAa,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AACxE,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,MAAM,GAAG,KAAK;AAEpB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WAAW;AACjB,QAAM,eAAe,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAChF,QAAM,OAAO,eAAe;AAG5B,QAAM,WAAW,WAAW,eAAe,EAAE,GAAG,uBAAuB,CAAC,GAAG,GAAG,CAAC,CAAC;AAChF,QAAM,UAAW,CAAC,WAAW,WAAW,OAAO,GAAa,WAAW,QAAQ,KAAK,CAAC;AACrF,QAAM,SAAS,IAAI,OAAO;AAE1B,SACE,gBAAAA,OAAAF,YAAA,EAEG;AAAA,gBAAY,aACX,gBAAAE,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,YAAO,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,QAAQ,aAAa,KAAK,eAAe,MAAM;AAAA,MAChH,gBAAAA,MAAC,UAAK,GAAG,QAAQ,KAAK,KAAK,KAAK,MAAM,EAAE,GAAG,MAAK,QAAO,QAAQ,QAAQ,aAAa,GAAG,eAAe,MAAM,eAAc,SAAQ;AAAA,MAClI,gBAAAA,MAAC,UAAK,GAAG,QAAQ,KAAK,KAAK,KAAK,IAAI,EAAE,GAAG,MAAK,QAAO,QAAQ,QAAQ,aAAa,GAAG,eAAe,KAAK,eAAc,SAAQ;AAAA,MAC/H,gBAAAA,MAAC,YAAO,IAAI,MAAM,MAAM,KAAK,IAAK,KAAK,KAAK,KAAM,GAAG,GAAG,IAAI,MAAM,MAAM,KAAK,IAAK,KAAK,KAAK,KAAM,GAAG,GAAG,GAAG,GAAG,MAAM,QAAQ;AAAA,OAC9H;AAAA,IAED,YAAY,aACX,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,YAAO,IAAI,KAAM,IAAI,KAAK,GAAG,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,QAAQ,aAAa,KAAK,eAAe,KAAK;AAAA,MAChH,gBAAAA,MAAC,YAAO,IAAI,KAAM,IAAI,KAAK,GAAG,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,QAAQ,aAAa,KAAK,eAAe,KAAK;AAAA,MAChH,gBAAAA,MAAC,YAAO,IAAI,KAAM,IAAI,KAAK,GAAG,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,OAAO,aAAa,KAAK,eAAe,MAAM;AAAA,MAChH,gBAAAA,MAAC,YAAO,IAAI,KAAM,IAAI,KAAK,GAAG,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,QAAQ,aAAa,KAAK,eAAe,MAAM;AAAA,MACjH,gBAAAA,MAAC,UAAK,GAAG,QAAQ,KAAM,KAAK,KAAK,KAAK,GAAG,GAAG,MAAK,QAAO,QAAQ,QAAQ,aAAa,KAAK,eAAe,KAAK,eAAc,SAAQ;AAAA,OACtI;AAAA,IAED,YAAY,WACX,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAG,QAAQ,MAAM,KAAK,KAAK,KAAK,GAAG,GAAG,MAAK,QAAO,QAAQ,IAAI,OAAO,QAAQ,aAAa,GAAG,eAAe,MAAM;AAAA,MACxH,gBAAAA,MAAC,UAAK,GAAG,QAAQ,MAAM,KAAK,KAAK,KAAK,GAAG,GAAG,MAAK,QAAO,QAAQ,IAAI,OAAO,OAAO,aAAa,KAAK,eAAe,KAAK;AAAA,MACxH,gBAAAA,MAAC,UAAK,GAAG,QAAQ,MAAM,KAAK,KAAK,KAAK,GAAG,GAAG,MAAK,QAAO,QAAQ,QAAQ,aAAa,KAAK,eAAe,MAAM,eAAc,SAAQ;AAAA,OACvI;AAAA,IAID,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,MAAM,IAAI,OAAO;AAAA,QACjB,YAAW;AAAA,QACX,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAIF,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA,kBAAQ,KAAK;AAAA,UACd,gBAAAD,MAAC,WAAM,MAAM,IAAI,OAAO,SAAS,aAAa,MAAM,eAEpD;AAAA;AAAA;AAAA,IACF;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,MAAM,cACL,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG;AAAA,UACH,YAAY,IAAI,MAAM;AAAA,UACtB,UAAS;AAAA,UACT,WAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB,gBAAM;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,IAAI,OAAO;AAAA,UACX,IAAG;AAAA,UACH,IAAI,OAAO;AAAA,UACX,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC9GI,qBAAAE,YAII,OAAAC,OAJJ,QAAAC,cAAA;AA1BJ,SAASC,YACP,IACA,OACS;AACT,MAAI,MAAM,YAAY,SAAS,QAAS,QAAO;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,QAAQ,GAAG,OAAO,OAAO,OAAO;AACtC,SAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AACjC;AAEO,SAAS,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC/E,QAAM,SAASA,YAAW,IAAI,KAAK;AAEnC,QAAM,SAAS,SAAS,YAAY,IAAI,OAAO;AAC/C,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAE3C,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WAAW,QAAQ,MAAM,SAAS,IAAI,MAAM;AAElD,SACE,gBAAAD,OAAAF,YAAA,EAGG;AAAA,cACC,gBAAAC,MAAC,UAAK,OAAM,QAAO,QAAO,OAAM,MAAK,WAAU,SAAQ,QAAO;AAAA,IAShE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,YAAW;AAAA,QACX,MAAM;AAAA,QACN,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,KACH;AAEJ;;;AC/DI,qBAAAG,YAEE,OAAAC,OAFF,QAAAC,cAAA;AA1BJ,SAASC,QAAO,GAAW,GAAW,GAAmB;AACvD,QAAM,KAAK,SAAS,EAAE,QAAQ,KAAK,EAAE,GAAG,EAAE;AAC1C,QAAM,KAAK,SAAS,EAAE,QAAQ,KAAK,EAAE,GAAG,EAAE;AAC1C,QAAM,KAAK,CAAC,IAAY,OAAe,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC;AACpE,QAAM,IAAI,GAAI,MAAM,KAAM,KAAM,MAAM,KAAM,GAAG;AAC/C,QAAM,IAAI,GAAI,MAAM,IAAK,KAAM,MAAM,IAAK,GAAG;AAC7C,QAAM,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;AAChC,SAAO,KAAM,KAAK,KAAO,KAAK,IAAK,IAAI,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAY,CAAC;AACpF;AAEO,SAAS,eAAe,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC1E,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAC3C,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,KAAK,WAAW,IAAI,OAAO,MAAM;AAEvC,QAAM,YAAYA,QAAO,IAAI,OAAO,QAAQ,IAAI,IAAI;AAEpD,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAED,SACE,gBAAAD,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,QAAQ;AAAA,IAIrE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,YAAW;AAAA,QACX,MAAM;AAAA,QACN,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,eAAe;AAAA,QACf,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,qBAAW,KAAK;AAAA;AAAA,IACnB;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,MAAM,IAAI,QAAQ;AAAA,QACrB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGD,gBAAAA,MAAC,UAAK,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,IAAI,aAAa,KAAK,SAAS,KAAK;AAAA,IACrF,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;ACpGO,IAAM,qBAAmE;AAAA,EAC9E,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,mBAAmB;AACrB;;;ACxBA,SAAS,YAAAG,kBAAgB;AAiCd,qBAAAC,YAAA,OAAAC,OAcL,QAAAC,cAdK;AA1BX,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,gBAAAD,MAAAD,YAAA,EAAE;AAAA,EACX;AAGA,MAAI;AACJ,aAAW,KAAK,gBAAgB;AAC9B,eAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AAC1C,QAAI,SAAU;AAAA,EAChB;AAGA,MAAI,CAAC,UAAU;AACb,UAAM,EAAE,QAAAG,SAAQ,SAAAC,SAAQ,IAAI,iBAAiB,UAAU,QAAQ,MAAM,GAAG;AACxE,WACE,gBAAAF,OAAAF,YAAA,EACG;AAAA,MAAAG,QAAO,IAAI,CAAC,GAAG,MACd,gBAAAF,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,MACAI,WAAU,KACT,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK,IAAI,KAAK;AAAA,UACjB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,UACrB,YAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAM,IAAI,OAAO;AAAA,UACjB,YAAY,IAAI,MAAM;AAAA,UACtB,kBAAiB;AAAA,UAEhB,cAAIG,QAAO;AAAA;AAAA,MACd;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,MAAM,QAAQ;AAGlD,QAAM,YAAY,aAAa,UAAU,KAAK,GAAG,GAAG;AAEpD,MAAI,OAAO,WAAW,GAAG;AAEvB,UAAMC,YAAW,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,aAAa,CAAC;AAC9D,WAAO,gBAAAJ,MAAAD,YAAA,EAAG,sBAAY,UAAU,EAAE,GAAG,KAAK,GAAG,GAAGK,WAAU,GAAG,KAAK,EAAE,GAAG,GAAG,GAAE;AAAA,EAC9E;AAIA,QAAM,eAAe;AACrB,QAAM,cAAc;AAQpB,QAAM,mBAAmB,OAAO;AAAA,IAC9B,CAAC,GAAG,MAAM,IAAI,aAAa,GAAG,KAAK,GAAG,GAAG,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,QAAM,kBAAkB,OAAO,UAAU,eAAe;AACxD,QAAM,WAAW,KAAK;AAAA,IACpB,KAAK,IAAI,kBAAkB,eAAe;AAAA,IAC1C,KAAK,IAAI;AAAA,EACX;AACA,QAAM,uBAAuB,KAAK,IAAI,WAAW;AACjD,QAAM,WACJ,KAAK,IAAI,KAAK,IAAI,IAAI,uBAAuB,aAAa,CAAC;AAE7D,QAAM,WAAW,KAAK,IAAI,uBAAuB;AAEjD,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,EAAE,GAAG,KAAK,GAAG,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,SAAS;AAAA,IACjD;AAAA,EACF;AAEA,SACE,gBAAAH,OAAAF,YAAA,EACG;AAAA,gBAAY,UAAU,EAAE,GAAG,KAAK,GAAG,GAAG,UAAU,GAAG,KAAK,EAAE,GAAG,GAAG;AAAA,IAChE,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAC,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,IACA,UAAU,KACT,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,KAAK,IAAI,KAAK;AAAA,QACjB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,QACrB,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,cAAI,OAAO;AAAA;AAAA,IACd;AAAA,KAEJ;AAEJ;;;ACrIA,SAAS,YAAAK,kBAAgB;AA2FrB,qBAAAC,YAcU,OAAAC,OAXJ,QAAAC,cAHN;AA9EJ,IAAM,YAAY;AAClB,IAAM,qBAAqB;AAC3B,IAAMC,mBAAkB;AACxB,IAAMC,uBAAsB;AAQrB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAMC,OAAM,OAAO;AAAA,IACjB,CAAC,MAA0B,EAAE,SAAS,eAAe,EAAE,MAAM,SAAS;AAAA,EACxE;AACA,QAAM,OAAOA,MAAK,MAAM,CAAC;AACzB,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,MAAMA,IAAG;AAG7C,QAAM,aAAa,KAAK,MAAM,YAAY,IAAI;AAC9C,QAAM,cAA2B;AAAA,IAC/B,GAAG,KAAK;AAAA,IACR,GAAG,KAAK,KAAK,OAAO,aAAa;AAAA,IACjC,GAAG,KAAK;AAAA,IACR,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,aAAa,EAAE;AAAA,EACjD;AACA,QAAM,EAAE,QAAQ,QAAQ,IAAI,iBAAiB,UAAU,QAAQ,aAAa,GAAG;AAC/E,QAAM,gBAAgB,KAAK,IAAI,YAAY;AAY3C,MAAI,cAAyD;AAC7D,MAAI,eAAe;AACnB,MAAI,aAA4B;AAChC,MAAI,MAAM;AACR,UAAM,WAAW,OAAO,KAAK,KAAK;AAClC,UAAM,aAAa,iBAAiB,QAAQ;AAC5C,UAAM,YAAY,KAAK,OAAO,iBAAiB,KAAK,IAAI,IAAI;AAC5D,UAAM,gBACJ,YAAY,KAAK,aAAa,IAC1B,KAAK,MAAO,KAAK,IAAI,cAAe,aAAa,UAAU,IAC3D,KAAK;AACX,kBAAc,WAAW,UAAU;AAAA,MACjC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,mBAAe,KAAK,MAAM,YAAY,WAAW,GAAG;AACpD,UAAM,eAAe,KAAK,IAAI;AAC9B,iBAAa,KAAK,OACd,gBAAgB,KAAK,MAAM,eAAe,YAAY,QAAQ,IAC9D;AAAA,EACN;AACA,QAAM,cAAc,OAChB,WAAW,KAAK,OAAO;AAAA,IACrB,UAAU,KAAK;AAAA,IACf,UAAUF;AAAA,IACV,aAAaC;AAAA,EACf,CAAC,IACD;AAEJ,SACE,gBAAAF,OAAAF,YAAA,EACG;AAAA,YAAQ,eACP,gBAAAE,OAAC,OACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK;AAAA,UACR,GAAG;AAAA,UACH,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,YAAW;AAAA,UACX,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB;AAAA,wBAAY;AAAA,YACZ,cAAc,QACb,gBAAAD,MAAC,WAAM,UAAU,cAAc,MAAM,IAAI,OAAO,QAC7C,sBACH;AAAA;AAAA;AAAA,MAEJ;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK;AAAA,UACR,GAAG,gBAAgB;AAAA,UACnB,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU,YAAa;AAAA,UACvB,MAAM,IAAI,OAAO;AAAA,UACjB,kBAAiB;AAAA,UAEhB,sBAAa;AAAA;AAAA,MAChB;AAAA,OACF;AAAA,IAED,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAA,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,IACA,UAAU,KACT,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,YAAY,IAAI,YAAY;AAAA,QAC/B,GAAG,YAAY,IAAI,YAAY,IAAI;AAAA,QACnC,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,cAAI,OAAO;AAAA;AAAA,IACd;AAAA,KAEJ;AAEJ;;;AC5IA,SAAS,YAAAK,kBAAgB;AAiCnB,qBAAAC,YAEI,OAAAC,OA+BA,QAAAC,cAjCJ;AA1BN,IAAM,kBAAkB;AAUjB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,OAAO;AAAA,IACxB,CAAC,MAA8C,EAAE,SAAS;AAAA,EAC5D;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,EAAE,QAAAC,QAAO,IAAI,iBAAiB,UAAU,QAAQ,MAAM,GAAG;AAC/D,WACE,gBAAAF,MAAAD,YAAA,EACG,UAAAG,QAAO,IAAI,CAAC,GAAG,MACd,gBAAAF,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD,GACH;AAAA,EAEJ;AAEA,QAAM,OAAO,KAAK,MAAM,KAAK,IAAI,eAAe;AAChD,QAAMI,SAAQ,KAAK,IAAI,OAAO;AAC9B,QAAM,QAAQ,KAAK,IAAI,OAAO;AAC9B,QAAM,OAAO,OAAO,OAAO,CAAC,MAAM,MAAM,UAAU;AAClD,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,EAAE,GAAGA,QAAO,GAAG,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,IAC3C;AAAA,EACF;AACA,QAAM,MAAM,IAAI,SAAS,WAAW,QAAQ,GAAG;AAE/C,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAE,OAAC,OACE;AAAA,YACC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA,UACR,OAAO;AAAA,UACP,QAAQ,KAAK;AAAA,UACb,qBAAoB;AAAA;AAAA,MACtB,IAEA,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,OAAO,SAAS;AAAA,QACnF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAW;AAAA,YACX,GAAG,KAAK,IAAI,OAAO;AAAA,YACnB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,YACrB,UAAU;AAAA,YACV,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAClB;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,KAAK,IAAI;AAAA,UACZ,GAAG,KAAK,IAAI;AAAA,UACZ,OAAO,OAAO;AAAA,UACd,QAAQ,KAAK,IAAI;AAAA,UACjB,MAAK;AAAA,UACL,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAa;AAAA;AAAA,MACf;AAAA,MACC,WAAW,WACV,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK;AAAA,YACR,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,YACrB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM,IAAI,OAAO;AAAA,YACjB,aAAa;AAAA;AAAA,QACf;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK,IAAI,OAAO;AAAA,YACnB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,YACrB,YAAW;AAAA,YACX,UAAU;AAAA,YACV,MAAM,IAAI,OAAO;AAAA,YACjB,YAAY,IAAI,MAAM;AAAA,YACtB,kBAAiB;AAAA,YAEhB,qBAAW;AAAA;AAAA,QACd;AAAA,SACF;AAAA,OAEJ;AAAA,IACC,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAA,MAACD,YAAA,EAAkB,sBAAY,EAAE,OAAO,EAAE,KAAK,GAAG,KAAnC,CAAqC,CACrD;AAAA,IACA,UAAU,KACT,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,KAAK,IAAI,KAAK;AAAA,QACjB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,QACrB,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,cAAI,OAAO;AAAA;AAAA,IACd;AAAA,KAEJ;AAEJ;;;AC1GQ,gBAAAI,OAsCJ,QAAAC,cAtCI;AAND,SAAS,WAAW,EAAE,SAAS,QAAQ,MAAM,IAAI,GAAoB;AAC1E,QAAM,YAAY,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AAEzD,MAAI,YAAY,cAAc;AAC5B,WACE,gBAAAD,MAAC,OAAE,mBAAiB,WAClB,0BAAAA,MAAC,aAAU,QAAgB,MAAY,KAAU,GACnD;AAAA,EAEJ;AAEA,MAAI,YAAY,eAAe;AAC7B,WACE,gBAAAA,MAAC,OAAE,mBAAiB,WAClB,0BAAAA,MAAC,cAAW,QAAgB,MAAY,KAAU,GACpD;AAAA,EAEJ;AAEA,MAAI,YAAY,sBAAsB;AACpC,WACE,gBAAAA,MAAC,OAAE,mBAAiB,WAClB,0BAAAA,MAAC,qBAAkB,QAAgB,MAAY,KAAU,GAC3D;AAAA,EAEJ;AACA,QAAM,EAAE,QAAQ,QAAQ,IAAI,iBAAiB,SAAS,QAAQ,MAAM,GAAG;AAKvE,MAAI,KAAK;AACT,MAAI,OAAO,WAAW,KAAK,YAAY,GAAG;AAIxC,UAAM,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,aAAa,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,EAAE,IAAI,GAAG,GAAG;AAC/E,SAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,EACtC;AAGA,QAAM,eACJ,YAAY,WAAW,OAAO,UAAU,IAAI,WAAW,IAAI,EAAE,WAAW;AAC1E,SACE,gBAAAC,OAAC,OAAE,mBAAiB,WACjB;AAAA,oBAAgB,QACf,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI,KAAK,IAAI;AAAA,QACb,IAAI;AAAA,QACJ,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,QACtB,QAAQ,IAAI,OAAO,UAAU,IAAI,OAAO;AAAA,QACxC,aAAa;AAAA,QACb,eAAe;AAAA;AAAA,IACjB;AAAA,IAED,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAA,MAAC,OAAU,kBAAgB,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAC7D,sBAAY,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,GAAG,KADlD,CAER,CACD;AAAA,IACA,UAAU,KACT,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,KAAK,IAAI,KAAK;AAAA,QACjB,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,QACrB,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,cAAI,OAAO;AAAA;AAAA,IACd;AAAA,KAEJ;AAEJ;;;ACUI,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AA7EG,SAAS,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC/E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAE/C,QAAM,iBAAiB;AACvB,QAAMC,YAAW;AACjB,QAAM,mBAAmB;AAIzB,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,gBAAgB;AAEtB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eACJ,mBAAmB,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AA8BrE,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AACnC,QAAM,mBAAmB,aAAa,KAAK;AAE3C,QAAM,UAAU,eAAe,KAAK;AACpC,QAAM,UAAU,KAAK,IAAI,GAAG,gBAAgB,OAAO;AAEnD,QAAM,YAAY,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAEnD,QAAM,SAAS,UACX,WAAW,SAAS,EAAE,UAAU,UAAU,UAAU,IAAI,aAAa,GAAG,CAAC,IACzE;AAMJ,QAAM,WAAW,MAAM,WACnB,WAAW,MAAM,UAAU,EAAE,UAAU,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC,IAC3E;AAEJ,SACE,gBAAAD,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,IAEC,UACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAGE;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,iBAAO;AAAA;AAAA,IACV;AAAA,IAGD,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,mBAAmB,IAAI,QAAQ;AAAA,QAClC,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,OAAO,MAAM,UAAU,OAAO,QAAQ,YAAY,MAAM,CAAC;AAAA;AAAA,IAChH;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ;AAAA,QACzD;AAAA;AAAA,IACF;AAAA,IAIA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAEC,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;ACpJQ,qBAAAG,YACE,OAAAC,OADF,QAAAC,cAAA;AA/BD,SAAS,iBAAiB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC5E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAE/C,QAAMC,YAAW;AACjB,QAAM,mBAAmB;AAEzB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eACJ,mBAAmB,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAIrE,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IAC9E;AACJ,QAAM,cAAc,eAAe;AACnC,QAAM,WAAW,aAAa,cAAc,gBAAgB;AAC5D,QAAM,QAAQ,UAAU;AACxB,QAAM,WAAW,QAAQ;AACzB,QAAM,WAAW,MAAM;AAEvB,SACE,gBAAAD,OAAAF,YAAA,EAEG;AAAA,eACC,gBAAAE,OAAAF,YAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAG,IAAI,GAAGE,YAAW,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,OAAO,QAAQ;AAAA,MAC3E,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAGE;AAAA,UACH,YAAY,MAAM;AAAA,UAClB,UAAU;AAAA,UACV,MAAM,OAAO;AAAA,UACb,eAAe;AAAA,UACf,kBAAiB;AAAA,UAEhB,qBAAW,SAAS,EAAE,UAAU,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC,EAAE;AAAA;AAAA,MACzE;AAAA,OACF;AAAA,IAID,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,mBAAmB,IAAI,QAAQ;AAAA,QAClC,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAIF,gBAAAA,MAAC,UAAK,GAAG,IAAI,GAAG,SAAS,OAAO,IAAI,QAAQ,GAAG,MAAM,OAAO,QAAQ;AAAA,IACpE,gBAAAA,MAAC,UAAK,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,QAAQ,OAAO,UAAU,OAAO,OAAO,aAAa,GAAG;AAAA,IAGrG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAQ,MAAM;AAAA,QACd,MAAM,EAAE,GAAG,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,QAAQ,EAAE;AAAA,QAChE;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AC8CI,qBAAAG,YAEE,OAAAC,OAFF,QAAAC,cAAA;AAjGJ,IAAMC,wBAAuB;AAE7B,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,cAAc;AAKpB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,eAAe;AACrB,IAAM,iBAAiB,UAAU,UAAU;AAC3C,IAAM,iBAAiB,UAAU,UAAU;AAC3C,IAAMC,mBAAkB;AAGxB,IAAM,mBAAmB,UAAU;AAEnC,IAAMC,WAAU;AAChB,IAAMC,eAAc;AAEpB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AASpB,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,kBAAkB;AAEjB,SAAS,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC/E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAE1B,QAAM,gBAAgB,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE;AAGpE,QAAM,QAAQ,KAAK,IAAI,GAAG,iBAAiB,GAAG,QAAQ,KAAK,CAAC;AAC5D,QAAM,aAAa,sBAAsB,GAAG,QAAQ,KAAK;AACzD,QAAM,aAAa,WAAW,GAAG,KAAK,IAAI,UAAU,IAAI;AAAA,IACtD,UAAU;AAAA,IACV,UAAUF;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AAED,QAAM,aACJ,iBAAiB,IACb,SACA,SAAS,WAAW,QAAQ,MAAM,gBAAgB;AAExD,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAUE;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eAAe,KAAK,MAAM,QAAQ,WAAWH,qBAAoB;AACvE,QAAM,aACJ,kBAAmB,QAAQ,MAAM,SAAS,KAAK,QAAQ,aAAc,IAAI;AAQ3E,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAUG;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,aAAa;AAEjC,QAAM,eAAe,aAAa,eAAe,aAAa,kBAAkB;AAChF,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,EAC9C;AAEA,QAAM,WAAW,MAAM,WACnB,WAAW,MAAM,UAAU,EAAE,UAAU,WAAW,UAAU,IAAI,aAAa,GAAG,CAAC,IACjF;AAEJ,SACE,gBAAAJ,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAG,QAAQ,GAAG,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,MAAM,OAAO,SAAS;AAAA,IACjF,gBAAAA,MAAC,YAAO,IAAI,SAAS,SAAS,GAAG,IAAI,YAAY,GAAG,aAAa,MAAM,OAAO,SAAS;AAAA,IAGvF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,iBAAiB,KAAK,MAAM,WAAW,WAAWE,qBAAoB;AAAA,QACzE,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,YAAW;AAAA,QACX,MAAK;AAAA,QACL,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGI;AAAA,QACH,GACE,kBACE,QAAQ,MAAM,SAAS,KAAK,QAAQ,aAAc,IACpD,IAAI,QAAQ,aACZ;AAAA,QAEF,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAdI;AAAA,IAeP,CACD;AAAA,IAGA,cACC,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAGI;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,OAAO,MAAM,UAAU,OAAO,SAAS,YAAY,MAAM,CAAC;AAAA;AAAA,IACjH;AAAA,IAIF,gBAAAJ,MAAC,cAAW,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,MAAM,aAAa,KAAU;AAAA,IAMtF,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;AC/FI,qBAAAM,YAGI,OAAAC,OAHJ,QAAAC,cAAA;AAhGJ,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAKvB,IAAM,8BAA8B;AACpC,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAU5B,IAAM,WAAW;AAEjB,SAAS,UAAU,IAAqB;AACtC,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,MAAI,OAAO,aAAa,QAAQ,CAAC,MAAM,cAAe,QAAO;AAC7D,QAAM,QAAQ,OAAO,OAAO,MAAM,aAAa;AAC/C,SAAO,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM;AAChC;AAUA,IAAMC,wBAAuB;AAC7B,IAAMC,4BAA2B;AACjC,IAAMC,mBAAkB;AAEjB,SAAS,qBAAqB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAChF,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAK/C,QAAM,UAAU,UAAU,EAAE,IAAI,MAAM;AACtC,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,SAAS,UACX,WAAW,SAAS,EAAE,UAAU,YAAY,UAAU,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC,IAC5F;AAEJ,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,UAAU,QAAQ,MAAM,SAAS,IAAI,iBAAiB;AAC5D,QAAM,eAAe,WAAW;AAChC,QAAM,gBAAgB,WAAW,UAAU;AAC3C,QAAM,gBAAgB,KAAK,MAAM,QAAQ,WAAW,2BAA2B;AAU/E,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAUF;AAAA,IACV,aAAaC;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AAEnC,QAAM,eAAe,eAAe,MAAM,aAAaC,mBAAkB;AACzE,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,GAAG,sBAAsB,YAAY;AAAA,EACnD;AAEA,QAAM,WAAW,MAAM,WACnB,WAAW,MAAM,UAAU,EAAE,UAAU,UAAU,UAAU,IAAI,aAAa,GAAG,CAAC,IAChF;AAEJ,SACE,gBAAAH,OAAAF,YAAA,EAEG;AAAA,cACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,iBAAO;AAAA;AAAA,IACV;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,IAAI,IAAI,OAAO,UAAU;AAAA,QACzB,MAAM,OAAO;AAAA;AAAA,IACf;AAAA,IACC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GACE,iBACE,QAAQ,MAAM,SAAS,KAAK,QAAQ,aAAc,IACpD,IAAI,QAAQ,aACZ;AAAA,QAEF,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAK;AAAA,QACL,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAdI;AAAA,IAeP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,OAAO,MAAM,UAAU,OAAO,SAAS,YAAY,MAAM,CAAC;AAAA;AAAA,IACjH;AAAA,IAIF,gBAAAA,MAAC,cAAW,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,MAAM,aAAa,KAAU;AAAA,IAKtF,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG,gBAAgB;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;AC1FW,SAmEP,YAAAK,YAnEO,OAAAC,OAmEP,QAAAC,cAnEO;AA5DX,IAAMC,YAAW;AAKjB,IAAMC,gBAAe;AACrB,IAAMC,gBAAe;AAErB,IAAM,kBAAkB;AACxB,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,iBAAiB;AAKvB,IAAM,qBAAqB;AAK3B,IAAM,gCAAgC;AACtC,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,UAAU;AAUhB,IAAMC,wBAAuB;AAC7B,IAAMC,4BAA2B;AACjC,IAAMC,mBAAkB;AACxB,IAAM,0BAA0B;AAQhC,IAAM,iBAAiB,oBAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AACjD,IAAM,iBAAiB;AAUvB,SAAS,iBAAiB,OAAc,MAAmB,KAAe;AACxE,MAAI,CAAC,eAAe,IAAI,MAAM,IAAI,GAAG;AACnC,WAAO,gBAAAP,MAAC,cAAW,SAAQ,UAAS,QAAQ,CAAC,KAAK,GAAG,MAAY,KAAU;AAAA,EAC7E;AACA,QAAM,YAAY,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;AACzD,QAAM,WAAW,aAAa,OAAO,KAAK,GAAG,GAAG;AAChD,QAAM,QAAQ,WAAW,IAAI,KAAK,IAAI,KAAK,IAAI,UAAU,cAAc,IAAI;AAC3E,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,UAAU,KAAK,KAAK,KAAK,IAAI,WAAW;AAC9C,SACE,gBAAAA,MAAC,OAAE,mBAAiB,WAClB,0BAAAA,MAAC,OAAE,kBAAgB,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,IAChD,0BAAAA,MAAC,OAAE,WAAW,aAAa,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,KACzD,sBAAY,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,GACpD,GACF,GACF;AAEJ;AAKA,SAAS,cAAc,OAAc,MAAmB,KAAwB;AAC9E,MAAI,eAAe,IAAI,MAAM,IAAI,EAAG,QAAO;AAC3C,SAAO,aAAa,OAAO,KAAK,GAAG,GAAG,KAAK,KAAK;AAClD;AAMA,SAAS,qBAAqB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AACzE,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,kBAAkB,UACpB,gBAAM,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,SAAM,OAAO,KACjD;AACJ,QAAM,eAAe,kBACjB,WAAW,iBAAiB;AAAA,IAC1B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,EACjB,CAAC,IACD;AACJ,QAAM,WAAW,MAAM,WAAW,MAAM;AAExC,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AACrE,QAAM,eAAe,MAAM;AAE3B,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAUK;AAAA,IACV,aAAaC;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AACnC,QAAM,mBAAmB,aAAa,0BAA0B;AAEhE,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,eAAe,KAAK,IAAI,KAAK,WAAW,eAAe,gBAAgB;AAE7E,SACE,gBAAAL,OAAAF,YAAA,EAEG;AAAA,oBACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,aAAa;AAAA,QACvB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,uBAAa;AAAA;AAAA,IAChB;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAY;AAAA;AAAA,IACd;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,MAAM,IAAI,QAAQ;AAAA,QACrB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,WAAW;AAAA,QACrB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,MAAM,UAAU,IAAI,OAAO,QAAQ,YAAY,MAAM,CAAC;AAAA;AAAA,IACxH;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,MAAM,EAAE,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,GAAG,aAAa;AAAA,QACzD;AAAA;AAAA,IACF;AAAA,IAGC,MAAM,YACL,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,IAAI,MAAM;AAAA,QACtB,UAAS;AAAA,QACT,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,gBAAM;AAAA;AAAA,IACT;AAAA,KAEJ;AAEJ;AAEO,SAAS,qBAAqB,OAAyB;AAC5D,QAAM,EAAE,IAAI,OAAO,OAAO,IAAI,IAAI;AAElC,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,aAAa,UAAU,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAE7E,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAUK;AAAA,IACV,aAAaC;AAAA,EACf,CAAC;AACD,QAAM,cAAc,aAAa;AACjC,QAAM,QAAQ,aAAa,kBAAkB,aAAaC,mBAAkB;AAC5E,QAAM,SAAS,MAAM,OAAO,WAAW;AAIvC,QAAM,eAAe,MAAM,WACvB,qBAAqB,gCACrB;AACJ,QAAM,aAAa,SAAS,mBAAmB;AAC/C,QAAM,WAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,GAAG,aAAa,KAAK;AAAA,EACnC;AACA,QAAM,YAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,GAAG,eAAe,OAAO;AAAA,EACvC;AAOA,QAAM,OACJ,MAAM,OAAO,SAAS,KACtB,MAAM,OAAO,UAAU,KACvB,cAAc,MAAM,OAAO,CAAC,GAAG,UAAU,GAAG,MAC3C,CAAC,UAAU,cAAc,MAAM,OAAO,CAAC,GAAG,WAAW,GAAG;AAC3D,MAAI,CAAC,KAAM,QAAO,qBAAqB,KAAK;AAE5C,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,kBAAkB,UACpB,gBAAM,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,SAAM,OAAO,KACjD;AACJ,QAAM,eAAe,kBACjB,WAAW,iBAAiB;AAAA,IAC1B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,EACjB,CAAC,IACD;AAEJ,QAAM,WAAW,MAAM,WACnB,WAAW,MAAM,UAAU,EAAE,UAAU,KAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IAC5E;AAEJ,SACE,gBAAAN,OAAAF,YAAA,EAEG;AAAA,oBACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAG;AAAA,QACH,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,aAAa;AAAA,QACvB,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,uBAAa;AAAA;AAAA,IAChB;AAAA,IAMF,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,YAAWC,gBAAe;AAAA,QAC7B,GAAG;AAAA,QACH,OAAOA;AAAA,QACP,QAAQC;AAAA,QACR,IAAG;AAAA,QACH,MAAM,IAAI,OAAO;AAAA;AAAA,IACnB;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE;AAAA,QACH,GAAG,UAAU,IAAI,QAAQ;AAAA,QACzB,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,cACC,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAG;AAAA,QACH,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,WAAW;AAAA,QACrB,MAAM,IAAI,OAAO;AAAA,QACjB,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,MAAM,UAAU,IAAI,OAAO,QAAQ,YAAY,MAAM,CAAC;AAAA;AAAA,IACxH;AAAA,IAID,iBAAiB,MAAM,OAAO,CAAC,GAAG,UAAU,GAAG;AAAA,IAE/C,UACC,gBAAAD,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,SAAS;AAAA,UACb,IAAI;AAAA,UACJ,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAY;AAAA;AAAA,MACd;AAAA,MACC,iBAAiB,MAAM,OAAO,CAAC,GAAG,WAAW,GAAG;AAAA,OACnD;AAAA,IAGD,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAE;AAAA,QACF,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;ACrTM,qBAAAM,YAEE,OAAAC,OAFF,QAAAC,cAAA;AAnEN,SAASC,YACP,IACA,OACS;AACT,MAAI,MAAM,YAAY,SAAS,QAAS,QAAO;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,QAAQ,GAAG,OAAO,OAAO,OAAO;AACtC,SAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AACjC;AAKA,IAAM,gBAAgB;AAEf,SAAS,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC/E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,SAASA,YAAW,IAAI,KAAK;AACnC,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAC/C,QAAM,QAAQ,iBAAiB,GAAG,QAAQ,KAAK;AAC/C,QAAM,kBAAkB,UACpB,gBAAM,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,SAAM,OAAO,KACjD;AAEJ,MAAI,QAAQ;AACV,UAAMC,gBAAe,kBACjB,WAAW,iBAAiB;AAAA,MAC1B,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,IACjB,CAAC,IACD;AACJ,UAAMC,WAAU,gBAAgB,MAAM,SAAS;AAAA,MAC7C,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,UAAMC,gBAAe,KAAK,IAAI,GAAGD,SAAQ,MAAM,SAAS,CAAC,IAAIA,SAAQ;AACrE,UAAME,gBAAe,MAAMD;AAa3B,UAAME,cAAa,gBAAgB,MAAM,YAAY;AAAA,MACnD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,UAAMC,eAAcF,gBAAe;AACnC,UAAMG,oBAAmBF,cAAa,KAAK;AAC3C,UAAMG,YAAW,MAAML,gBAAeI;AACtC,UAAME,gBAAe,MAAMN,gBAAeI;AAC1C,UAAMG,gBAAe,KAAK,IAAI,KAAK,MAAMP,gBAAeI,iBAAgB;AAIxE,WACE,gBAAAR,OAAAF,YAAA,EAEE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,OAAM;AAAA,UACN,QAAO;AAAA,UACP,IAAI,IAAI,OAAO,UAAU;AAAA,UACzB,MAAK;AAAA;AAAA,MACP;AAAA,MAGCG,iBACC,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAUG,cAAa;AAAA,UACvB,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAEhB,UAAAA,cAAa;AAAA;AAAA,MAChB;AAAA,MAIDC,SAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UAEC,GAAE;AAAA,UACF,GAAG,MAAM,IAAII,SAAQ;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,UAAUA,SAAQ;AAAA,UAClB,YAAW;AAAA,UACX,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QATI;AAAA,MAUP,CACD;AAAA,MAGAG,eACC,gBAAAP;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAGQ;AAAA,UACH,YAAY,MAAM;AAAA,UAClB,UAAUD,YAAW;AAAA,UACrB,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB,+BAAqBA,YAAW,UAAU,EAAE,QAAQ,OAAO,MAAM,UAAU,OAAO,QAAQ,YAAY,MAAM,CAAC;AAAA;AAAA,MAChH;AAAA,MAMF,gBAAAP;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,IAAIU;AAAA,UACJ,IAAI,KAAK;AAAA,UACT,IAAIA;AAAA,UACJ,QAAQ,OAAO;AAAA,UACf,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAV;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,KAAK;AAAA,UACT,IAAIU;AAAA,UACJ,IAAG;AAAA,UACH,IAAIA;AAAA,UACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,UAChC,aAAY;AAAA;AAAA,MACd;AAAA,MAGA,gBAAAV;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,UACd,MAAM,EAAE,GAAG,IAAI,GAAGW,eAAc,GAAG,MAAM,GAAGC,cAAa;AAAA,UACzD;AAAA;AAAA,MACF;AAAA,MAGA,gBAAAZ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB;AAAA,YACC,GAAG,KAAK,kBACJ,WAAW,GAAG,KAAK,eAAe,IAClC;AAAA,YACJ,GAAG,KAAK;AAAA,YACR,GAAG,KAAK;AAAA,UACV,EACG,OAAO,OAAO,EACd,KAAK,UAAO;AAAA;AAAA,MACjB;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,WAAW,MAAM,WAAW,MAAM;AACxC,QAAM,eAAe,kBACjB,WAAW,iBAAiB;AAAA,IAC1B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,EACjB,CAAC,IACD;AACJ,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AACrE,QAAM,eAAe,MAAM;AAa3B,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AACnC,QAAM,mBAAmB,aAAa,KAAK;AAC3C,QAAM,WAAW,MAAM,eAAe;AACtC,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,eAAe,KAAK,IAAI,KAAK,WAAW,eAAe,gBAAgB;AAE7E,SACE,gBAAAC,OAAAF,YAAA,EAEG;AAAA,oBACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAU,aAAa;AAAA,QACvB,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,uBAAa;AAAA;AAAA,IAChB;AAAA,IAID,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,MAAM,IAAI,QAAQ;AAAA,QACrB,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU,EAAE,QAAQ,OAAO,MAAM,UAAU,OAAO,QAAQ,YAAY,MAAM,CAAC;AAAA;AAAA,IAChH;AAAA,IAMF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,aAAY;AAAA;AAAA,IACd;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,MAAM,EAAE,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,GAAG,aAAa;AAAA,QACzD;AAAA;AAAA,IACF;AAAA,IAGC,MAAM,YACL,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,gBAAM;AAAA;AAAA,IACT;AAAA,KAEJ;AAEJ;;;ACtXO,IAAM,YAAY;AAwClB,SAAS,iBAAiB,QAA8B;AAC7D,QAAM,QAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,aAAa;AAC9B,iBAAW,QAAQ,MAAM,MAAO,OAAM,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,CAAC;AAAA,IAC9E,WAAW,MAAM,SAAS,cAAc;AACtC,iBAAW,QAAQ,MAAM;AACvB,cAAM,KAAK,EAAE,MAAM,kBAAkB,MAAM,MAAM,CAAC;AAAA,IACtD,OAAO;AACL,YAAM,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,YACd,OACA,MAC+C;AAC/C,QAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AAEvB,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAEzD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC1E;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,UAAU;AACxB,UAAM,SAAS,UAAU;AACzB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,EAAE,EAAE;AAAA,QAC7C,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,QAAQ,WAAW,GAAG,GAAG,QAAQ,EAAE,EAAE;AAAA,MACvE;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,UAAU;AACxB,UAAM,SAAS,UAAU;AACzB,UAAM,SAAS,IAAI,QAAQ;AAC3B,UAAM,UAAU,IAAI,aAAa;AACjC,WAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,EAAE,EAAE;AAAA,QAC7C,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,QAC9D;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,EAAE,GAAG,QAAQ,GAAG,IAAI,SAAS,WAAW,GAAG,QAAQ,GAAG,OAAO;AAAA,QACpE;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,WAAW,UAAU;AAC3B,UAAM,YAAY,UAAU;AAC5B,UAAM,cAAc,UAAU;AAC9B,UAAM,eAAe,UAAU;AAC/B,UAAM,UAAU,IAAI,OAAO;AAE3B,WAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,UAAU,GAAG,KAAK,EAAE;AAAA,QACtD;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,EAAE,GAAG,IAAI,WAAW,WAAW,GAAG,GAAG,WAAW,GAAG,KAAK;AAAA,QAC/D;AAAA,QACA,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,SAAS,GAAG,aAAa,GAAG,KAAK,EAAE;AAAA,QAClE;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK;AAAA,YACH,GAAG,IAAI,cAAc;AAAA,YACrB,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AAItB,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,QAAQ,IAAI,IAAI,aAAa;AACnC,UAAM,WAAW,IAAI,aAAa;AAClC,UAAM,UAAU,IAAI,OAAO;AAE3B,WAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QAClD;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,EAAE,GAAG,IAAI,OAAO,WAAW,GAAG,GAAG,MAAM,GAAG,KAAK;AAAA,QACtD;AAAA,QACA;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,EAAE,GAAG,IAAI,KAAK,OAAO,YAAY,GAAG,GAAG,MAAM,GAAG,KAAK;AAAA,QAC5D;AAAA,QACA,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,EAAE;AAAA,QAC9D;AAAA,UACE,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,EAAE,GAAG,IAAI,UAAU,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK;AAAA,QACrE;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AAGtB,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,QAAQ,IAAI,IAAI,aAAa;AACnC,UAAM,UAAU,IAAI,OAAO;AAC3B,UAAM,OAAO,CAAC,MAAc,IAAI,KAAK,OAAO;AAE5C,WAAO;AAAA,MACL,OAAO;AAAA,QACL,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QAC3D,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QAC3D,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QAC3D,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QACpE,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,QACpE,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,EAAE;AAAA,MACtE;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAKA,QAAM,EAAE,MAAM,IAAI,YAAY,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI;AACrD,SAAO,EAAE,OAAO,UAAU,MAAM,MAAM,CAAC,EAAE;AAC3C;AAYO,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUD,IAAM,cAAc;AAAA,EAClB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AACT;AAEA,SAAS,WAAW,MAAyB;AAC3C,MAAI,KAAK,SAAS,WAAY,QAAO,YAAY;AACjD,MAAI,KAAK,SAAS,iBAAkB,QAAO,YAAY;AACvD,MAAI,KAAK,MAAM,SAAS,QAAS,QAAO,YAAY;AACpD,MAAI,kBAAkB,IAAI,KAAK,MAAM,IAAI,EAAG,QAAO,YAAY;AAC/D,SAAO,YAAY;AACrB;AAyBA,IAAM,iBAA2C;AAAA,EAC/C,GAAG,CAAC;AAAA,EACJ,GAAG,CAAC,CAAC;AAAA,EACL,GAAG,CAAC,GAAG,CAAC;AAAA,EACR,GAAG,CAAC,GAAG,GAAG,CAAC;AAAA,EACX,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACd,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,EACjB,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACtB;AA8CO,SAAS,sBAAsB,OAAiC;AACrE,QAAM,OAAO,eAAe,MAAM,MAAM;AACxC,MAAI,CAAC,KAAM,QAAO,MAAM,MAAM;AAE9B,QAAM,UAAU,MAAM,IAAI,UAAU;AACpC,MAAI,QAAQ,MAAM,CAAC,WAAW,WAAW,QAAQ,CAAC,CAAC,EAAG,QAAO,MAAM,MAAM;AAEzE,QAAM,eAAe,MAClB,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,MAAM,EAAE,EACtC,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,WAAW,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK;AACnD,WAAO,aAAa,IAAI,WAAW,EAAE,QAAQ,EAAE;AAAA,EACjD,CAAC,EACA,IAAI,CAAC,UAAU,MAAM,IAAI;AAO5B,QAAM,YAAY,KAAK,IAAI,GAAG,OAAO;AACrC,QAAM,gBAAgB,QAAQ,OAAO,CAAC,WAAW,SAAS,SAAS,EAAE;AACrE,QAAM,gBAAgB,KAAK,MAAM,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEpE,QAAM,SAAS,IAAI,MAAiB,MAAM,MAAM;AAChD,eAAa,QAAQ,CAAC,MAAM,eAAe;AACzC,UAAM,YACJ,aAAa,gBACT,KAAK,UAAU,IACf,cAAc,aAAa,aAAa;AAC9C,WAAO,SAAS,IAAI;AAAA,EACtB,CAAC;AACD,SAAO;AACT;;;ACcI,qBAAAa,YAEI,OAAAC,OAQF,QAAAC,cAVF;AAvRJ,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB;AAMvB,IAAM,4BAA4B;AAClC,IAAMC,2BAA0B;AAIhC,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAM9B,IAAMC,kBAAiB,oBAAI,IAAI,CAAC,SAAS,OAAO,CAAC;AA6BjD,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AACF,CAAC;AAYD,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAO3B,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAc7B,IAAM,4BAA4B;AAMlC,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAMC,gCAA+B;AACrC,IAAMC,gCAA+B;AAIrC,IAAM,qBAAqB;AAW3B,IAAM,+BAA+B;AAcrC,IAAM,4BAA4B;AAClC,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;AACvC,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AAMpC,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAgB1B,SAAS,iBAAiB,SAAkB,MAAuB;AACjE,QAAM,aAAa,UAAU,sBAAsB,qBAAqB;AACxE,QAAM,YAAY,OAAO,4BAA4B;AACrD,QAAM,gBAAgB,OAClB,iCACA;AACJ,SAAO,aAAa,YAAY;AAClC;AAkBA,SAAS,kBACP,MACA,KACA,KACoB;AACpB,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,SAAS,IAAI,IAAI,iBAAiB;AACxC,QAAM,UAAU,QAAQ,KAAK,IAAI;AACjC,QAAM,aAAa,UAAU,sBAAsB,qBAAqB;AAQxE,QAAM,OAAO,IAAI,IAAI;AACrB,QAAM,YAAY,OAAO,4BAA4B;AACrD,QAAM,gBAAgB,OAClB,iCACA;AACJ,QAAM,SAAS,OAAO,8BAA8B;AACpD,QAAM,SAAS,OAAO,8BAA8B;AAMpD,QAAM,UAAU,IAAI,IAAI,qBAAqB;AAC7C,QAAM,UAAU,KAAK,IAAI,IAAI,UAAU,iBAAiB,SAAS,IAAI,KAAK,CAAC;AAC3E,QAAM,SAAS,IAAI,IAAI,qBAAqB;AAE5C,QAAM,KAAK,KAAK,QAAQ,WAAW,KAAK,KAAK,IAAI;AACjD,QAAM,aAAa,KAAK,GAAG,SAAS,IAAI,OAAO,QAAQ,IAAI,OAAO;AAOlE,QAAM,WAAW,OAAO,KAAK,KAAK;AAElC,QAAM,OAAO,cAAc,UAAU,KAAK,IAAI;AAC9C,QAAM,EAAE,eAAe,aAAa,IAAI;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,WAAW,UAAU;AAAA,IACvC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,eAAe,KAAK,MAAM,YAAY,WAAW,IAAI;AAC3D,QAAM,aAAa,OACf,gBAAgB,MAAM,eAAe,YAAY,IACjD;AACJ,QAAM,cAAc,WAAW,KAAK,OAAO;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AAED,QAAM,iBAAiB,SAAS,aAAa;AAC7C,QAAM,iBAAiB,iBAAiB;AAgBxC,QAAM,iBACJ,iBAAiB,YAAY,IAAI,IAAI,YAAY;AACnD,QAAM,gBACJ,cAAc,OAAO,iBAAiB,UAAU,IAAI,eAAe;AACrE,QAAM,eAAe,KAAK,+BAA+B;AACzD,QAAM,YAAY,IAAI,IAAI,IAAI,IAAI,iBAAiB,SAAS;AAC5D,QAAM,SAAS,KAAK;AAAA,IAClB,SAAS,iBAAiB,gBAAgB;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,SAAS,iBAAiB,YAAY;AAE5C,SACE,gBAAAJ,OAAAF,YAAA,EACG;AAAA,SAAK,QACJ,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO,IAAI,OAAO;AAAA;AAAA,IACpB;AAAA,IAEF,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU,YAAY;AAAA,QACtB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB;AAAA,sBAAY;AAAA,UACZ,cAAc,QACb,gBAAAD,MAAC,WAAM,UAAU,cAAc,MAAM,IAAI,OAAO,OAC7C,sBACH;AAAA;AAAA;AAAA,IAEJ;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAG;AAAA,QACH,MAAM,IAAI,OAAO;AAAA;AAAA,IACnB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAG;AAAA,QACH,MAAK;AAAA,QACL,QAAQ,IAAI,OAAO;AAAA,QACnB,eAAeI;AAAA,QACf,aAAaF;AAAA;AAAA,IACf;AAAA,IACA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAG;AAAA,QACH,MAAK;AAAA,QACL,QAAQ,IAAI,OAAO;AAAA,QACnB,eAAeK;AAAA,QACf,aAAaH;AAAA;AAAA,IACf;AAAA,IACC,MACC,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAI,IAAI,IAAI,IAAI;AAAA,QACnB,GAAG,SAAS;AAAA,QACZ,YAAW;AAAA,QACX,UAAU;AAAA,QACV,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB,aAAG;AAAA;AAAA,IACN;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU,YAAY;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,YAAY,IAAI,MAAM;AAAA,QACtB,kBAAiB;AAAA,QAEhB,sBAAY;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;AAIA,SAAS,cACP,MACA,KACA,KACA,QACoB;AACpB,SACE,gBAAAC,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,aAAaE;AAAA;AAAA,IACf;AAAA,IACC,kBAAkB,MAAM,KAAK,GAAG;AAAA,KACnC;AAEJ;AAmBA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAS3B,IAAM,6BAA6B;AAEnC,IAAM,4BAA4B;AAIlC,SAAS,eACP,MACA,KACA,KACA,QACoB;AACpB,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,SAAS,IAAI,IAAI,iBAAiB;AAExC,QAAM,UAAU,IAAI,IAAI,qBAAqB;AAC7C,QAAM,WAAW,sBAAsB,MAAM,QAAQ;AAAA,IACnD,eAAe;AAAA,IACf,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,SACJ,IAAI,IAAI,qBAAqB,KAAK,IAAI,IAAI,UAAU,YAAY,CAAC;AACnE,SACE,gBAAAD,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,aAAaE;AAAA;AAAA,IACf;AAAA,IACC,mBAAmB,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK;AAAA,MAClE,eAAe;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAAA,KACH;AAEJ;AAUA,SAAS,eAAe,MAAiB,KAAwB;AAC/D,QAAM,EAAE,MAAM,IAAI,IAAI;AACtB,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAMI,WAAU,IAAI,IAAI,qBAAqB;AAC7C,UAAM,OAAO,IAAI,IAAI;AACrB,WAAO,iBAAiB,QAAQ,KAAK,KAAK,IAAI,GAAG,IAAI,IAAIA;AAAA,EAC3D;AACA,MAAI,KAAK,SAAS,kBAAkB;AAClC,UAAMA,WAAU,IAAI,IAAI,qBAAqB;AAK7C,WACE,sBAAsB,KAAK,MAAM,IAAI,IAAI,iBAAiB,GAAG;AAAA,MAC3D,eAAe;AAAA,MACf,UAAU;AAAA,IACZ,CAAC,IAAIA;AAAA,EAET;AACA,MAAIH,gBAAe,IAAI,KAAK,MAAM,IAAI,EAAG,QAAO;AAChD,MAAI,kBAAkB,IAAI,KAAK,MAAM,IAAI,GAAG;AAC1C,WAAO,aAAa,KAAK,OAAO,IAAI,GAAG,GAAG,IAAI,IAAI;AAAA,EACpD;AACA,QAAM,UAAU,IAAI,IAAI,qBAAqB;AAC7C,SAAO,aAAa,KAAK,OAAO,IAAI,IAAI,iBAAiB,GAAG,GAAG,IAAI;AACrE;AASA,SAASI,YACP,MACA,GACA,KACA,QACoB;AACpB,QAAM,EAAE,MAAM,IAAI,IAAI;AAOtB,QAAM,aAAa;AAAA,IACjB,kBAAkB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,IAC5C,mBAAmB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,EACxD;AASA,QAAM,MAAM,IAAI,YAAY,IAAI,KAAK,KAAK;AAC1C,QAAM,UAAU,OAAO,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;AAErD,MAAI,KAAK,SAAS,YAAY;AAC5B,WACE,gBAAAP,MAAC,OAAW,GAAG,YAAa,GAAG,SAC5B,wBAAc,KAAK,MAAM,KAAK,KAAK,MAAM,KADpC,CAER;AAAA,EAEJ;AAEA,MAAI,KAAK,SAAS,kBAAkB;AAClC,WACE,gBAAAA,MAAC,OAAW,GAAG,YAAa,GAAG,SAC5B,yBAAe,KAAK,MAAM,KAAK,KAAK,MAAM,KADrC,CAER;AAAA,EAEJ;AAEA,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,kBAAkB,IAAI,MAAM,IAAI,GAAG;AAOrC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,SAAQ;AAAA,QACR,QAAQ,CAAC,KAAK;AAAA,QACd,MAAM;AAAA,QACN;AAAA;AAAA,MAJK;AAAA,IAKP;AAAA,EAEJ;AAEA,QAAM,SAAS,IAAI,IAAI;AACvB,QAAM,SAAS,IAAI,IAAI,iBAAiB;AACxC,QAAM,UAAU,IAAI,IAAI,qBAAqB;AAC7C,QAAM,WAAW,aAAa,OAAO,QAAQ,GAAG;AAEhD,QAAM,eAAe,KAAK,IAAI,IAAI,UAAU,YAAY,CAAC;AACzD,QAAM,SAAS,IAAI,IAAI,qBAAqB;AAC5C,QAAM,QACJG,gBAAe,IAAI,MAAM,IAAI,KAAK,WAAW,WAAW,WAAW,IAC/D,UAAU,WACV;AAMN,QAAM,mBAAmB,wBAAwB,IAAI,MAAM,IAAI;AAE/D,SACE,gBAAAF,OAAC,OAAW,GAAG,YACZ;AAAA,KAAC,oBACA,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,aAAaE;AAAA;AAAA,IACf;AAAA,IAED,SAAS,IACR,YAAY,OAAO,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,MAM3D,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,aAAa,UAAU,SAAS,SAAS,SAAS,CAAC,IAAI,MAAM,WAAW,KAAK;AAAA,UAEvF,sBAAY,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG;AAAA;AAAA,MACpD;AAAA;AAAA,OA1BI,CA4BR;AAEJ;AAEO,SAAS,kBAAkB,EAAE,IAAI,OAAO,OAAO,IAAI,GAAqB;AAC7E,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,UAAU,eAAe,GAAG,QAAQ,KAAK;AAG/C,QAAM,SAAS,UACX,WAAW,SAAS;AAAA,IAClB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,EACjB,CAAC,IACD;AAEJ,QAAM,mBAAmB;AACzB,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAAA,IAC7C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,eACJ,mBACA,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAalD,QAAM,aAAa,gBAAgB,MAAM,YAAY;AAAA,IACnD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AACnC,QAAM,mBAAmB,aAAa,KAAK;AAE3C,QAAM,YAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG,eAAe,KAAK;AAAA,IACvB,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,GAAG,OAAO,eAAe,KAAK,iBAAiB;AAAA,EAC7D;AAKA,QAAM,QAAQ,iBAAiB,MAAM,MAAM;AAW3C,MAAI;AACJ,QAAM,WAAW,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AACjD,MAAI,YAAY,SAAS,SAAS,YAAY;AAC5C,UAAM,MAAM;AAAA,MACV,GAAG,UAAU,KAAK,UAAU,IAAI,qBAAqB;AAAA,MACrD,GAAG,UAAU,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,qBAAqB,CAAC;AAAA,MAClE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,WAAOO,YAAW,EAAE,MAAM,UAAU,IAAI,GAAG,GAAG,KAAK,MAAM;AAAA,EAC3D,WAAW,YAAY,SAAS,SAAS,kBAAkB;AAIzD,UAAM,MAAM;AAAA,MACV,GAAG,UAAU,KAAK,UAAU,IAAI,sBAAsB;AAAA,MACtD,GAAG,UAAU,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,sBAAsB,CAAC;AAAA,MACnE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,WAAOA,YAAW,EAAE,MAAM,UAAU,IAAI,GAAG,GAAG,KAAK,MAAM;AAAA,EAC3D,WAAW,UAAU;AACnB,WACE,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAQ,CAAC,SAAS,KAAK;AAAA,QACvB,MAAM;AAAA,QACN;AAAA;AAAA,IACF;AAAA,EAEJ,OAAO;AAML,UAAM,cAAc,sBAAsB,KAAK;AAC/C,UAAM,EAAE,MAAM,IAAI,YAAY,aAAa,SAAS;AAkBpD,UAAM,WACJ,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,SAAS,eAAe,MAAM,GAAG,CAAC;AACpE,WAAO,WACL,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAQ,MAAM;AAAA,QACd,MAAM;AAAA,QACN;AAAA;AAAA,IACF,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,mBAAiB,GAAG,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC;AAAA,QAE3E,gBAAM,IAAI,CAAC,MAAM,MAAMO,YAAW,MAAM,GAAG,KAAK,MAAM,CAAC;AAAA;AAAA,IAC1D;AAAA,EAEJ;AAEA,SACE,gBAAAN,OAAAF,YAAA,EACG;AAAA,cACC,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,iBAAO;AAAA;AAAA,IACV;AAAA,IAGD,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,mBAAmB,IAAI,QAAQ;AAAA,QAClC,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAGA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,+BAAqB,WAAW,UAAU;AAAA,UACzC,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,YAAY;AAAA,QACd,CAAC;AAAA;AAAA,IACH;AAAA,IAGD;AAAA,IAEA,MAAM,YACL,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,gBAAM;AAAA;AAAA,IACT;AAAA,KAEJ;AAEJ;;;ACr3BO,IAAM,qBAAmE;AAAA,EAC9E,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,cAAc;AAChB;;;ACkCI,qBAAAQ,YAEI,OAAAC,OAFJ,QAAAC,cAAA;AA7BG,SAAS,eAAe,EAAE,IAAI,OAAO,IAAI,GAAqB;AACnE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAE1B,QAAM,wBAAwB;AAC9B,QAAM,UAAU,gBAAgB,MAAM,WAAW,gBAAM;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WACJ,wBAAwB,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAC1E,QAAM,eAAe;AAGrB,QAAM,aAAa,WAAW,MAAM,eAAe,MAAM,UAAU,KAAK,uBAAQ;AAAA,IAC9E,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AAEnC,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,cAAc,UAAU,CAAC,QAAQ,MAAM,QAAQ,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IAAI;AAC1F,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,YAAY,CAAC,KAAK,aAAa,IAAI,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AAEhF,SACE,gBAAAA,OAAAF,YAAA,EACG;AAAA,YAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAEA,WAAW,QACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAGD,UAAU,SAAS,KAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM,OAAO;AAAA,QACb,eAAc;AAAA,QACd,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,oBAAU,KAAK,cAAW;AAAA;AAAA,IAC7B;AAAA,KAEJ;AAEJ;;;ACGY,SAsDJ,YAAAE,YAtDI,OAAAC,OAmBF,QAAAC,cAnBE;AA9DZ,SAAS,oBAAoB,MAG3B;AACA,MAAI,KAAK,SAAS,QAAG,EAAG,QAAO,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE,GAAG,QAAQ,SAAI;AACtE,SAAO,EAAE,MAAM,MAAM,QAAQ,KAAK;AACpC;AAEO,SAAS,oBAAoB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACxE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAE1B,QAAM,wBAAwB;AAC9B,QAAM,UAAU,gBAAgB,MAAM,WAAW,sBAAO;AAAA,IACtD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,WACJ,wBACA,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAClD,QAAM,eAAe;AACrB,QAAM,gBAAgB,QAAQ,MAAM,SAAS;AAE7C,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY;AAAA,IAC3B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AACJ,QAAM,cAAc,eAAe;AAEnC,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,cAAc,UAChB,CAAC,QAAQ,MAAM,QAAQ,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,IACxD;AACJ,QAAM,OAAO,GAAG,KAAK;AAErB,QAAM,YAAsB,CAAC;AAC7B,MAAI,IAAK,WAAU,KAAK,GAAG;AAC3B,MAAI,YAAa,WAAU,KAAK,WAAW;AAC3C,MAAI,UAAU,WAAW,KAAK,KAAM,WAAU,KAAK,IAAI;AAEvD,QAAM,QAAQ;AACd,QAAMC,SAAQ;AACd,QAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,eAAe;AAAA,IACf,aAAa,cAAc,KAAK;AAAA,EAClC;AACA,QAAM,WAAW;AACjB,QAAM,mBAAmB;AACzB,QAAM,qBAAqB,QAAQA,SAAQ;AAE3C,SACE,gBAAAD,OAAAF,YAAA,EACG;AAAA,YAAQ,MAAM,IAAI,CAAC,MAAM,MAAM;AAC9B,UAAI,MAAM,eAAe;AACvB,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,GAAE;AAAA,YACF,GAAG,WAAW,IAAI,QAAQ;AAAA,YAC1B,YAAY,MAAM;AAAA,YAClB,UAAU,QAAQ;AAAA,YAClB,YAAW;AAAA,YACX,MAAM,OAAO;AAAA,YACb,YAAW;AAAA,YACX,kBAAiB;AAAA,YAEhB;AAAA;AAAA,UAVI;AAAA,QAWP;AAAA,MAEJ;AAGA,YAAM,EAAE,MAAM,OAAO,IAAI,oBAAoB,IAAI;AACjD,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,GAAE;AAAA,UACF,GAAG,WAAW,IAAI,QAAQ;AAAA,UAC1B,YAAY,MAAM;AAAA,UAClB,UAAU,QAAQ;AAAA,UAClB,YAAW;AAAA,UACX,MAAM,OAAO;AAAA,UACb,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,YACA,UAAU,gBAAAD,MAAC,WAAM,MAAM,OAAO,QAAS,kBAAO;AAAA;AAAA;AAAA,QAX1C;AAAA,MAYP;AAAA,IAEJ,CAAC;AAAA,IAEA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAMD,UAAU,SAAS,KAClB,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQE;AAAA,UACR,MAAM,OAAO;AAAA;AAAA,MACf;AAAA,MACC,UAAU,IAAI,CAAC,MAAM,MACpB,gBAAAF;AAAA,QAAC;AAAA;AAAA,UAEC,GAAE;AAAA,UACF,GAAG,qBAAqB,IAAI;AAAA,UAC5B,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QATI;AAAA,MAUP,CACD;AAAA,OACH;AAAA,KAEJ;AAEJ;;;AC7EM,SA2DE,YAAAG,YA3DF,OAAAC,OAGA,QAAAC,cAHA;AArCN,IAAM,+BAA+B;AACrC,IAAM,4BAA4B;AAClC,IAAM,+BAA+B;AAKrC,IAAM,kBAAkB;AAEjB,SAAS,WAAW,EAAE,IAAI,OAAO,IAAI,GAAqB;AAC/D,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,YAAY,GAAG,KAAK;AAC1B,QAAM,cAAc,CAAC,SAAS,OAAO,SAAS,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,UAAO;AAEnF,QAAM,UAAU,gBAAgB,MAAM,WAAW,gBAAM;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,YAAY,QAAQ,MAAM,SAAS;AACzC,QAAM,WAAW,YACb,+BAA+B,KAAK,IAAI,QAAQ,YAAY,yBAAyB,IACrF;AACJ,QAAM,eACJ,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAC7D,QAAM,aAAa,MAAM,aACrB,WAAW,MAAM,YAAY,EAAE,UAAU,KAAK,UAAU,IAAI,aAAa,GAAG,CAAC,IAC7E;AACJ,QAAM,cAAc,eAAe;AACnC,QAAM,YAAY,gBAAgB,YAAY,+BAA+B;AAE7E,SACE,gBAAAA,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,OAAM,QAAO,OAAM,MAAM,OAAO,SAAS;AAAA,IACnE,gBAAAA,MAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,OAAM,QAAO,OAAM,MAAM,OAAO,QAAQ;AAAA,IAElE,gBAAAC,OAAC,OAAE,WAAU,sBACX;AAAA,sBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,OAAM,GAAE,MAAK,MAAM,OAAO,QAAQ;AAAA,MACpD,OACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IAEC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MATI;AAAA,IAUP,CACD;AAAA,IAEA,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,aAAY;AAAA;AAAA,IACd;AAAA,IAEC,eACC,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG,YAAY;AAAA,UACf,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG,YAAY;AAAA,UACf,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAGD,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG,YAAY;AAAA,QACf,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM;AAAA,QACN,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;ACzFM,SA4DE,YAAAE,YA3DA,OAAAC,OADF,QAAAC,cAAA;AA5CN,IAAMC,gCAA+B;AACrC,IAAMC,6BAA4B;AAClC,IAAM,8BAA8B;AAKpC,IAAMC,mBAAkB;AAEjB,SAAS,aAAa,EAAE,IAAI,OAAO,IAAI,GAAqB;AACjE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,YAAY,GAAG,KAAK;AAC1B,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAClC,QAAM,cAAc,CAAC,QAAQ,MAAM,SAAS,KAAK,EAC9C,OAAO,OAAO,EACd,KAAK,QAAK;AAEb,QAAM,UAAU,gBAAgB,MAAM,WAAW,cAAc;AAAA,IAC7D,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,YAAY,QAAQ,MAAM,SAAS;AACzC,QAAM,WAAW,YACbF,gCAA+B,KAAK,IAAI,QAAQ,YAAYC,0BAAyB,IACrFD;AACJ,QAAM,eACJ,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAG7D,QAAM,aAAa,WAAW,MAAM,eAAe,MAAM,UAAU,KAAK,uBAAQ;AAAA,IAC9E,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,eAAe;AACnC,QAAM,WAAW,gBAAgB,YAAY,8BAA8B;AAE3E,SACE,gBAAAD,OAAAF,YAAA,EAEE;AAAA,oBAAAE,OAAC,OAAE,WAAU,sBACX;AAAA,sBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,OAAM,GAAE,MAAK,MAAM,OAAO,QAAQ;AAAA,MACpD,OACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAE;AAAA,UACF,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IAGC,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,WAAW,QACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAIF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,aAAY;AAAA;AAAA,IACd;AAAA,IAGC,eACC,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG,WAAW;AAAA,UACd,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,eAAc;AAAA,UACd,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG,WAAW;AAAA,UACd,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM,OAAO;AAAA,UACb,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAID,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG,WAAW;AAAA,QACd,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAMI;AAAA,QACN,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;AClHI,qBAAAC,YAGI,OAAAC,OAHJ,QAAAC,cAAA;AAzDJ,IAAMC,YAAW;AAGjB,IAAMC,gBAAe;AACrB,IAAMC,gBAAe;AAEd,SAAS,aAAa,EAAE,IAAI,OAAO,IAAI,GAAqB;AACjE,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,YAAY,GAAG,KAAK;AAC1B,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAElC,QAAM,UAAU,gBAAgB,MAAM,WAAW,kCAAS;AAAA,IACxD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAOD,QAAM,wBAAwB;AAC9B,QAAM,WACJ,wBACA,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAClD,QAAM,eAAe;AAGrB,QAAM,UAAU,eAAe;AAG/B,QAAM,aAAa,WAAW,MAAM,eAAe,MAAM,UAAU,KAAK,2BAA2B;AAAA,IACjG,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,QAAM,cAAc,UAAU;AAC9B,QAAM,WAAW,cAAc;AAE/B,QAAM,cAAc,CAAC,QAAQ,MAAM,SAAS,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAC7E,QAAM,YAAY,CAAC,KAAK,eAAe,MAAM,SAAS,EAAE;AAAA,IACtD,CAAC,MAAmB,QAAQ,CAAC;AAAA,EAC/B;AACA,QAAM,WACJ,UAAU,SAAS,IACf,WAAW,UAAU,KAAK,cAAW,GAAG;AAAA,IACtC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC,IACD;AACN,QAAM,QAAQ,WAAW;AAEzB,SACE,gBAAAH,OAAAF,YAAA,EAEG;AAAA,YAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAGE;AAAA,QACH,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM,IAAI,OAAO;AAAA,QACjB,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAXI;AAAA,IAYP,CACD;AAAA,IAID,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE,YAAWC,gBAAe;AAAA,QAC7B,GAAG;AAAA,QACH,OAAOA;AAAA,QACP,QAAQC;AAAA,QACR,IAAG;AAAA,QACH,MAAM,IAAI,OAAO;AAAA;AAAA,IACnB;AAAA,IAGC,WAAW,QACV,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAG;AAAA,QACH,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,WAAW;AAAA,QACrB,MAAM,IAAI,OAAO;AAAA,QACjB,WAAU;AAAA,QACV,kBAAiB;AAAA,QAEhB,qBAAW;AAAA;AAAA,IACd;AAAA,IAIF,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ,IAAI,OAAO;AAAA,QACnB,aAAY;AAAA;AAAA,IACd;AAAA,IAGC,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAGE;AAAA,QACH,GAAG;AAAA,QACH,YAAW;AAAA,QACX,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM,IAAI,OAAO;AAAA,QACjB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;AC3DQ,SAiDA,YAAAG,YAjDA,OAAAC,OAiDA,QAAAC,cAjDA;AApDR,SAASC,YACP,IACA,OACS;AACT,MAAI,MAAM,YAAY,SAAS,QAAS,QAAO;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,QAAQ,GAAG,OAAO,OAAO,OAAO;AACtC,SAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AACjC;AAEO,SAAS,mBAAmB,EAAE,IAAI,OAAO,IAAI,GAAqB;AACvE,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,SAASA,YAAW,IAAI,KAAK;AAEnC,QAAM,SAAS,SAAS,YAAY,OAAO;AAC3C,QAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,QAAM,cAAc,SAAS,YAAa,OAAO,UAAU,OAAO;AAClE,QAAM,gBAAgB,SAAS,OAAO;AAEtC,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,UAAU,GAAG,KAAK;AACxB,QAAM,YAAY,GAAG,KAAK;AAC1B,QAAM,SAAS,GAAG,KAAK,UAAU,CAAC;AAElC,QAAM,eAAe,CAAC,QAAQ,MAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AAAA,IACpE;AAAA,EACF;AACA,QAAM,cAAc,aAAa,KAAK,QAAK;AAE3C,QAAM,UAAU,gBAAgB,MAAM,WAAW,gBAAM;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,wBAAwB;AAC9B,QAAM,WACJ,wBACA,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,CAAC,IAAI,QAAQ;AAClD,QAAM,eAAe;AACrB,QAAM,WAAW,eAAe;AAChC,QAAM,gBAAgB,WAAW;AACjC,QAAM,eAAe,WAAW;AAChC,QAAM,aAAa,WAAW;AAE9B,SACE,gBAAAD,OAAAF,YAAA,EAGG;AAAA,cACC,gBAAAC,MAAC,UAAK,OAAM,QAAO,QAAO,OAAM,MAAK,WAAU,SAAQ,QAAO;AAAA,IAI/D,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,SAAS,MAAM;AAAA,QACxB,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAID,QAAQ,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAE;AAAA,QACF,GAAG,WAAW,IAAI,QAAQ;AAAA,QAC1B,YAAY,MAAM;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,eAAc;AAAA,QACd,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,aAAY;AAAA;AAAA,IACd;AAAA,IAGC,eACC,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG;AAAA,UACH,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS,SAAS,MAAM;AAAA,UACxB,eAAc;AAAA,UACd,kBAAiB;AAAA,UAClB;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,GAAG;AAAA,UACH,YAAY,MAAM;AAAA,UAClB,UAAS;AAAA,UACT,MAAM;AAAA,UACN,kBAAiB;AAAA,UAEhB;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAID,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,QAClB,UAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,SAAS,OAAO;AAAA,QACzB,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;AClKI,qBAAAG,YAEE,OAAAC,OAFF,QAAAC,cAAA;AAnCG,SAAS,cAAc,EAAE,IAAI,OAAO,IAAI,GAAqB;AAClE,QAAM,MAAM,GAAG,KAAK;AACpB,QAAM,OAAO,GAAG,KAAK;AACrB,QAAM,KAAK,WAAW,IAAI,OAAO,OAAO;AAIxC,QAAM,cAAc,MAAM,WAAW;AACrC,QAAM,QAAQ,gBAAgB,aAAa;AAAA,IACzC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAMC,WAAU;AAChB,QAAM,aAAaA,WAAU,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM;AAEzE,QAAM,QAAQ,aAAa;AAC3B,QAAM,SAAS;AAEf,QAAM,WAAW,cAAc,MAAM,cAAc,IAAI;AAAA,IACrD,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,YAAY,QAAQ,SAAS;AAEnC,QAAM,YAAY,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACnE,QAAM,WACJ,UAAU,SAAS,IACf,WAAW,UAAU,KAAK,cAAW,GAAG,EAAE,UAAU,MAAM,UAAU,IAAI,aAAa,GAAG,CAAC,IACzF;AAEN,SACE,gBAAAD,OAAAF,YAAA,EAEE;AAAA,oBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO,SAAS;AAAA,IAGrE,OACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,YAAW;AAAA,QACX,kBAAiB;AAAA,QAEhB;AAAA;AAAA,IACH;AAAA,IAID,MAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAGE,WAAU,IAAI,MAAM;AAAA,QACvB,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,YAAW;AAAA,QACX,MAAM;AAAA,QACN,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGD,gBAAAF,MAAC,UAAK,GAAG,IAAI,GAAG,OAAO,OAAO,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,IAG5E,SAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,GAAG,YAAY,IAAI,SAAS;AAAA,QAC5B,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB;AAAA;AAAA,MAVI;AAAA,IAWP,CACD;AAAA,IAGA,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,IAAI,MAAM;AAAA,QACtB,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,kBAAiB;AAAA,QAEhB,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAEJ;;;AC9GO,IAAM,oBAAgE;AAAA,EAC3E,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,kBAAkB;AACpB;;;ACiCI,qBAAAG,YACE,OAAAC,OADF,QAAAC,cAAA;AA3BJ,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAM,eAAe;AAOrB,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,SAAS,KAAK,QAAQ;AAC5B,QAAM,SAAS,KAAK,QAAQ;AAC5B,QAAM,SAAS,SAAS,QAAQ;AAChC,QAAM,SAAS,SAAS,QAAQ;AAChC,SACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,QAAQ,cAAc,IAAI,QAAQ,QAAgB,aAAY,KAAI;AAAA,IAC7G,gBAAAA,MAAC,UAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,QAAQ,cAAc,QAAgB,aAAY,KAAI;AAAA,IAC7G,gBAAAA,MAAC,UAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,QAAQ,cAAc,IAAI,QAAQ,QAAgB,aAAY,KAAI;AAAA,IAC7G,gBAAAA,MAAC,UAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,QAAQ,cAAc,QAAgB,aAAY,KAAI;AAAA,KAC/G;AAEJ;AAMO,SAAS,oBAAoB,EAAE,IAAI,OAAO,IAAI,GAAe;AAClE,QAAM,SAAS,IAAI,OAAO,UAAU,IAAI,OAAO;AAC/C,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,yBAAyB,CAAC,KAAK,KAAK,GAAG,CAAU;AAChG,QAAM,WAAW,gBAAAA,MAAC,kBAAe,IAAI,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,GAAG,QAAgB;AACvF,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,SAAU,QAAO;AAEhE,QAAM,UAAU,gBAAAA,MAAC,kBAAe,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,QAAgB;AAClF,QAAM,aAAa,gBAAAA,MAAC,kBAAe,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,IAAI,QAAgB;AACxF,QAAM,cAAc,gBAAAA,MAAC,kBAAe,IAAI,MAAM,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,QAAgB;AAC7F,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EACG;AAAA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AACA,SACE,gBAAAE,OAAAF,YAAA,EACG;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KACH;AAEJ;;;AChBqC,qBAAAG,YAAA,OAAAC,aAAA;AA5BrC,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,QAAQ;AAcd,IAAM,WAAW,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,SAAS,KAAK,IAAI,MAAM;AAE1H,IAAM,cAAc,OAAO,MAAM,QAAQ,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,MAAM;AACpG,IAAM,cAAc,KAAK,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,SAAS,KAAK;AAClG,SAAS,OAAO,SAAkC;AAChD,SAAO,YAAY,MAAM,cAAc,YAAY,MAAM,cAAc;AACzE;AAEO,SAAS,UAAU,EAAE,IAAI,OAAO,IAAI,GAAe;AACxD,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,cAAc,CAAC,KAAK,KAAK,GAAG,CAAU;AAGrF,MAAI,MAAM,SAAS,QAAS,QAAO,gBAAAA,MAAAD,YAAA,EAAE;AACrC,MAAI,MAAM,SAAS,WAAW;AAC5B,WAAO,gBAAAC,MAAC,UAAK,GAAG,OAAO,OAAO,GAAG,MAAK,WAAU,SAAQ,QAAO;AAAA,EACjE;AACA,SAAO,gBAAAA,MAAC,UAAK,GAAG,OAAO,OAAO,GAAG,MAAM,IAAI,OAAO,SAAS,SAAQ,QAAO;AAC5E;;;ACbM,qBAAAC,YAEI,OAAAC,OAFJ,QAAAC,cAAA;AAxBN,IAAM,sBAAsB;AAC5B,IAAM,8BAA8B;AACpC,IAAM,YAAY,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI;AAE3C,IAAM,mBAAmB,CAAC,KAAK,KAAK,IAAI;AACxC,IAAM,oBAAoB,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI;AACnD,SAAS,UAAU,SAAoC;AACrD,SAAO,YAAY,MAAM,mBAAmB,YAAY,MAAM,oBAAoB;AACpF;AACA,IAAM,YAAY;AAClB,IAAM,YAAY;AAGlB,IAAM,oBAAoB,CAAC,KAAK,KAAK,GAAG;AAEjC,SAAS,YAAY,EAAE,IAAI,OAAO,IAAI,GAAe;AAC1D,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAU;AACvF,MAAI,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW;AACtD,UAAM,YAAY,MAAM,SAAS;AACjC,UAAM,aAAa,YAAY,YAAa,IAAI,OAAO,UAAU,IAAI,OAAO;AAC5E,UAAM,cAAc,YAChB,8BACA;AACJ,WACE,gBAAAA,OAAAF,YAAA,EACG;AAAA,gBAAU,OAAO,EAAE,IAAI,CAAC,MACvB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,aAAY;AAAA,UACZ,eAAe;AAAA;AAAA,QAPV,IAAI,CAAC;AAAA,MAQZ,CACD;AAAA,MACA,kBAAkB,OAAO,CAAC,MAAM,IAAI,OAAO,IAAI,GAAG,EAAE,IAAI,CAAC,MACxD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,IAAG;AAAA,UACH,IAAI;AAAA,UACJ,IAAG;AAAA,UACH,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,aAAY;AAAA,UACZ,eAAe;AAAA;AAAA,QAPV,IAAI,CAAC;AAAA,MAQZ,CACD;AAAA,OACH;AAAA,EAEJ;AAEA,SAAO;AACT;;;ACvDI,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AAlBJ,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAUf,SAAS,YAAY,EAAE,IAAI,OAAO,IAAI,GAAe;AAC1D,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,gBAAgB,CAAC,KAAK,KAAK,GAAG,CAAU;AACvF,QAAM,QAAQ,YAAY,MAAM,OAAO,gBAAgB;AAEvD,MAAI,MAAM,SAAS,QAAS,QAAO;AACnC,SACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,YAAO,IAAI,OAAO,IAAI,eAAe,GAAE,KAAI,MAAM,OAAO,QAAQ;AAAA,IACjE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAc;AAAA;AAAA,IAChB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,eAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;;;ACyB+C,qBAAAE,YAAA,OAAAC,OAIvC,QAAAC,cAJuC;AApC/C,SAASC,YACP,IACA,OACS;AACT,MAAI,MAAM,YAAY,SAAS,QAAS,QAAO;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,QAAQ,GAAG,OAAO,OAAO,OAAO;AACtC,SAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AACjC;AAMA,SAAS,sBACP,IACA,OACS;AACT,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,SAAS,QAAS,QAAOA,YAAW,IAAI,KAAK;AACpD,SAAO;AACT;AAEA,IAAM,oBAAoB;AAS1B,IAAM,sBAAsB;AAErB,SAAS,kBAAkB,EAAE,IAAI,OAAO,IAAI,GAAe;AAChE,MAAI,sBAAsB,IAAI,KAAK,EAAG,QAAO,gBAAAF,MAAAD,YAAA,EAAE;AAC/C,SACE,gBAAAE,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAI,mBAAmB,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAC7D;AAAA,sBAAAD,MAAC,UAAK,QAAO,MAAK,WAAW,IAAI,OAAO,IAAI;AAAA,MAC5C,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAW,qBAAqB;AAAA,OACtD,GACF;AAAA,IACA,gBAAAA,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,QAAO,QAAO,OAAM,MAAM,QAAQ,iBAAiB,KAAK;AAAA,KAClF;AAEJ;;;ACmCqB,qBAAAG,YAAA,OAAAC,OAQb,QAAAC,cARa;AA/DrB,SAASC,uBACP,IACA,OACS;AACT,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,SAAS,SAAS;AACvB,UAAM,QAAQ,GAAG,OAAO,OAAO,GAAG,QAAQ;AAC1C,WAAO,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM;AAAA,EACjC;AACA,SAAO;AACT;AAEA,IAAMC,qBAAoB;AAY1B,IAAM,sBAAsB;AAAA,EAC1B,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,EAClB,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,EAClB,EAAE,GAAG,MAAM,GAAG,IAAI;AACpB;AAEA,IAAM,wBAAwB;AAAA,EAC5B,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,EAClB,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,EAClB,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,EAClB,EAAE,GAAG,MAAM,GAAG,IAAI;AACpB;AACA,IAAM,wBAAwB;AAAA,EAC5B,EAAE,GAAG,IAAI,GAAG,IAAI;AAAA,EAChB,EAAE,GAAG,KAAK,GAAG,GAAG;AAAA,EAChB,EAAE,GAAG,KAAK,GAAG,IAAI;AACnB;AACA,SAAS,gBAAgB,SAA0B;AACjD,SAAO,YAAY,MAAM,wBAAwB,YAAY,MAAM,wBAAwB;AAC7F;AAYA,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAEnB,SAAS,mBAAmB,EAAE,IAAI,OAAO,IAAI,GAAe;AACjE,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,uBAAuB,CAAC,KAAK,KAAK,GAAG,CAAU;AAC9F,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,SAASD,uBAAsB,IAAI,KAAK;AAC9C,MAAI,OAAQ,QAAO,gBAAAF,MAAAD,YAAA,EAAE;AAGrB,QAAM,kBAAkB,MAAM,SAAS;AAEvC,SACE,gBAAAE,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAIE,oBAAmB,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAC7D;AAAA,sBAAAH,MAAC,UAAK,QAAO,MAAK,WAAW,qBAAqB;AAAA,MAClD,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAW,mBAAmB;AAAA,OACpD,GACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,MAAM,QAAQG,kBAAiB;AAAA;AAAA,IACjC;AAAA,IACC,mBACC,gBAAAF,OAAAF,YAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,aAAa,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,UACzD,MAAK;AAAA,UACL,QAAQ,IAAI,OAAO;AAAA,UACnB,aAAY;AAAA,UACZ,eAAc;AAAA;AAAA,MAChB;AAAA,MACC,aAAa,IAAI,CAAC,GAAG,MACpB,gBAAAA,MAAC,YAAe,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAE,KAAI,MAAM,IAAI,OAAO,UAA5C,CAAoD,CAClE;AAAA,OACH;AAAA,KAEJ;AAEJ;;;ACtFoC,SAyD9B,YAAAI,YAzD8B,OAAAC,OA8C9B,QAAAC,cA9C8B;AA3EpC,SAAS,IAAI,MAAc;AACzB,MAAI,IAAI,SAAS;AACjB,SAAO,MAAM;AACX,QAAK,IAAI,UAAU,eAAgB;AACnC,WAAO,IAAI;AAAA,EACb;AACF;AAEO,SAAS,cAAc,EAAE,IAAI,OAAO,IAAI,GAAe;AAC5D,QAAM,CAAC,MAAM,MAAM,QAAQ,IAAI,IAAI,IAAI,OAAO;AAC9C,QAAM,QAAQ,IAAI,OAAO;AACzB,MAAI,MAAM,SAAS,UAAW,QAAO;AAMrC,QAAM,SAAS,CACb,GACA,GACA,UACA,KACA,GACA,OACA,MACA,IAAI,SACD;AACH,UAAM,MAAM,IAAI,OAAO,aAAa,CAAC;AACrC,UAAM,QAAQ,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO;AACpD,UAAM,IAAK,WAAW,KAAK,KAAM;AACjC,UAAM,KAAK,KAAK,IAAI,CAAC;AACrB,UAAM,KAAK,KAAK,IAAI,CAAC;AAErB,UAAM,QAAQ,IAAI,IAAI,OAAO,MAAM;AACnC,UAAM,QAAQ,CAAC,GAAW,MAAc;AACtC,YAAM,KAAK,IAAI;AACf,YAAM,QAAQ,OAAO,IAAI,MAAM,IAAI;AACnC,aAAO,EAAE,GAAG,IAAI,IAAI,MAAM,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,MAAM,IAAI,SAAS,GAAG;AAAA,IAC9E;AAEA,UAAM,UAAoB,CAAC,IAAI,IAAI,IAAI,EAAE;AACzC,UAAM,UAAU,CAAC,IAAY,IAAY,MAAc;AACrD,YAAM,IAAI,KAAK,MAAM,EAAE;AACvB,YAAM,IAAI,KAAK,MAAM,EAAE;AACvB,YAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI;AAC/B,aAAO,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,IACxE;AACA,UAAMC,SAAQ,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,GAAG,CAAC;AAChD,aAAS,IAAI,GAAG,KAAKA,QAAO,KAAK;AAC/B,YAAM,KAAK,IAAIA;AACf,YAAM,IAAI,KAAK;AAEf,YAAM,SAAS,OAAO,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,OAAO,IAAI,IAAI;AAC3F,YAAM,QAAS,IAAI,IAAK;AACxB,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI;AACjC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,MAAM,MAAM,IAAI,QAAQ;AAC9B,cAAM,IAAI,MAAM,GAAG,GAAG;AACtB,cAAM,MAAM,KAAK,IAAI,GAAG,KAAK,QAAQ;AAErC,cAAM,KAAK,MAAM,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM,MAAM,IAAI,IAAI,MAAM,OAAO,IAAI,IAAI;AAC1F,cAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,cAAM,KAAK,UAAW,MAAM,MAAM,IAAI,IAAK,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI;AAC3E,gBAAQ,EAAE,KAAK,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE;AAAA,MACrC;AAEA,UAAI,IAAI,IAAI,MAAM;AAChB,cAAM,OAAO,IAAI,IAAI,MAAM,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI;AAC5D,cAAM,IAAI,MAAM,GAAG,GAAG;AACtB,gBAAQ,CAAC,KAAK,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,IAAI,GAAG;AAAA,MACnD;AAAA,IACF;AACA,UAAM,MAAM,CAAC,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI;AACnD,WACE,gBAAAF,MAAC,OACE,kBAAQ,IAAI,CAAC,GAAG,MAAO,IAAI,gBAAAA,MAAC,UAAa,GAAM,MAAM,OAAO,SAAS,IAAI,CAAC,KAApC,CAAuC,IAAK,IAAK,GAC1F;AAAA,EAEJ;AAEA,QAAM,YAAY,CAAC,IAAY,IAAY,MAAc;AACvD,UAAM,IAAI,KAAK,MAAM,EAAE;AACvB,UAAM,IAAI,KAAK,MAAM,EAAE;AACvB,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI;AAC/B,WAAO,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,EACxE;AAGA,QAAM,YAAY,CAAC,SAAiB;AAClC,UAAM,MAAM,IAAI,OAAO,OAAO,CAAC;AAC/B,QAAI,OAAO;AACX,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,KAAK,IAAI,IAAI;AACnB,YAAM,KAAK,IAAI,IAAI;AACnB,YAAM,IAAI,UAAU,IAAI,IAAI,MAAM,IAAI,IAAI,GAAG;AAC7C,UAAI,IAAI,IAAI,IAAK,SAAQ;AAAA,UACpB,UAAS;AAAA,IAChB;AAEA,QAAI,QAAQ;AACZ,aAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,YAAM,KAAK,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,IAAI;AACxD,YAAM,KAAK,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,IAAI;AACxD,YAAM,MAAM,OAAO,IAAI,IAAI;AAC3B,YAAM,OAAO,MAAM,IAAI,IAAI;AAC3B,YAAME,SAAQ;AACd,eAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC9B,cAAM,IAAI,IAAIA;AACd,cAAM,IAAI,IAAI;AACd,cAAM,OAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,KAAM;AACzC,YAAI,IAAI,IAAI,MAAM;AAChB,mBAAS;AAAA,YACP,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI;AAAA,YACzC,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI;AAAA,YACzC,MAAM,IAAI,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WACE,gBAAAD,OAAC,OACE;AAAA,aAAO,gBAAAD,MAAC,UAAK,GAAG,MAAM,MAAK,WAAU,SAAS,MAAM,IAAK;AAAA,MACzD,QAAQ,gBAAAA,MAAC,UAAK,GAAG,OAAO,MAAM,OAAO,SAAS,KAAK,IAAK;AAAA,MACxD,QAAQ,gBAAAA,MAAC,UAAK,GAAG,OAAO,MAAK,WAAU,SAAS,KAAK,IAAK;AAAA,OAC7D;AAAA,EAEJ;AAEA,MAAI,MAAM,SAAS,WAAW;AAE5B,WACE,gBAAAC,OAAAF,YAAA,EACG;AAAA,gBAAU,GAAG;AAAA,MACb,OAAO,MAAM,IAAI,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,MACrC,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC5C,gBAAAC,MAAC,UAAK,GAAE,mCAAkC,MAAM,OAAO,SAAS,KAAK;AAAA,MACrE,gBAAAA,MAAC,YAAO,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,MAAM,OAAO,SAAS,KAAK;AAAA,OAC7D;AAAA,EAEJ;AAEA,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAU;AAEzF,QAAM,QAAQ,CAAC,IAAY,IAAY,GAAW,MAAc,IAAI,OAAO;AACzE,UAAM,MAAM,IAAI,OAAO,OAAO,CAAC;AAC/B,UAAM,OAAO,CAAC;AACd,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK;AAC9B,YAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,YAAM,IAAI,CAAC,MAAM,MAAM,QAAQ,MAAM,KAAK,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AACjE,WAAK;AAAA,QACH,gBAAAA,MAAC,YAAe,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,KAAK,OAAO,MAAM,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,MAAM,GAAG,SAAS,MAAM,IAAI,IAAI,OAAvK,CAA4K;AAAA,MAC3L;AAAA,IACF;AACA,WAAO,gBAAAA,MAAC,OAAG,gBAAK;AAAA,EAClB;AACA,QAAM,UACJ,gBAAAC,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,GAAE,mCAAkC,MAAM,OAAO,SAAS,MAAM;AAAA,IACtE,gBAAAA,MAAC,UAAK,GAAE,mCAAkC,MAAM,OAAO,SAAS,KAAK;AAAA,IACpE,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,IAC1B,MAAM,KAAM,KAAK,KAAK,IAAI,CAAC;AAAA,IAC5B,gBAAAA,MAAC,UAAK,GAAE,wCAAuC,QAAQ,OAAO,aAAa,GAAG,eAAc,SAAQ,SAAS,KAAK;AAAA,KACpH;AAGF,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAC,OAAAF,YAAA,EACG;AAAA,gBAAU,GAAG;AAAA,MACb,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,MAC1C,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC1C,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MACzC,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC1C,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC3C,OAAO,KAAK,KAAK,GAAG,KAAK,IAAI,QAAQ,IAAI,GAAG;AAAA,MAC5C,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,MAC5C,OAAO,KAAM,KAAK,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,MAC5C;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,gBAAU,GAAG;AAAA,MACb,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC1C,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI;AAAA,MAC9C,OAAO,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,MAC7C,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC7C,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC5C,OAAO,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,MAC9C,OAAO,MAAM,KAAK,MAAM,KAAK,IAAI,QAAQ,IAAI,IAAI;AAAA,MACjD;AAAA,OACH;AAAA,EAEJ;AAEA,SACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,cAAU,GAAG;AAAA,IACb,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,IAC7C,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAC5C,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI,GAAG;AAAA,IAC7C,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAC7C,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAC7C,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAAA,IAC7C;AAAA,KACH;AAEJ;;;AC/CQ,SAmLJ,YAAAI,YAnLI,OAAAC,OAyGF,QAAAC,cAzGE;AA9JR,SAAS,UAAU,GAAO,GAAO,IAAY,IAAY,OAAe,MAAoB;AAC1F,MAAI,KAAM,OAAO,aAAa,OAAQ;AACtC,QAAM,MAAM,OAAQ,KAAM,KAAK,UAAU,eAAgB,GAAI,KAAK;AAClE,QAAM,IAAI;AACV,QAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,QAAM,MAAY,CAAC;AACnB,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAM,IAAI,IAAI;AACd,UAAM,OACJ,IAAI,SACA,KAAK,IAAI,IAAI,QAAQ,MAAM,IAAI,IAAI,GAAG,IACtC,KAAK,KAAK,IAAI,MAAM,IAAI,SAAS,MAAM,IAAI,IAAI,GAAG;AACxD,UAAM,IAAI,SAAS,MAAM,MAAM,SAAS,OAAO,IAAI,IAAI;AACvD,QAAI,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,EACnF;AACA,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,OAAa,CAAC,IAAI,CAAC,CAAC;AAC1B,UAAM,MAAM,SAAS,MAAM,IAAI,OAAO;AACtC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,WAAK,KAAK;AAAA,QACR,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,OAAO,MAAM;AAAA,QACzD,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,OAAO,MAAM;AAAA,MAC3D,CAAC;AACD,WAAK,KAAK,IAAI,CAAC,CAAC;AAAA,IAClB;AACA,UAAM;AAAA,EACR;AACA,SAAO,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI,OAAO,QAAQ,MAAM,GAAG,EAAE,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,EAAE;AAC1G;AAGA,SAAS,UAAU,GAAO,GAAO,OAAa,SAAuB;AACnE,QAAM,IAAI,CAAC,MAAc,KAAK,MAAM,CAAC;AACrC,MAAI,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7B,aAAW,KAAK,MAAO,MAAK,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAClD,OAAK,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3B,aAAW,KAAK,QAAS,MAAK,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACpD,SAAO,IAAI;AACb;AAEA,SAASC,KAAI,MAAc;AACzB,MAAI,IAAI,SAAS;AACjB,SAAO,MAAM;AACX,QAAK,IAAI,UAAU,eAAgB;AACnC,WAAO,IAAI;AAAA,EACb;AACF;AAKA,SAAS,WAAW,KAAW,KAAyB;AACtD,QAAM,MAAY,CAAC;AACnB,QAAM,IAAI,IAAI;AACd,QAAM,QAAQ,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO;AACpD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AACzB,QAAI,KAAK,CAAC;AACV,QAAI,KAAK;AAAA,MACP,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE;AAAA,MACjC,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE;AAAA,MACjC,GAAG,EAAE,KAAK,OAAO,IAAI,IAAI;AAAA;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,OAAO,KAAW,QAAgB,KAAyB;AAClE,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,QAAQ,IAAK,OAAM,WAAW,KAAK,GAAG;AAC1D,SAAO;AACT;AAIA,SAAS,WAAW,KAAW,KAAa,KAAyB;AACnE,SAAO,IAAI,IAAI,CAAC,OAAO;AAAA,IACrB,GAAG,EAAE,KAAK,IAAI,IAAI,OAAO,MAAM;AAAA,IAC/B,GAAG,EAAE,KAAK,IAAI,IAAI,OAAO,MAAM;AAAA,IAC/B,GAAG,EAAE;AAAA,EACP,EAAE;AACJ;AAEA,SAAS,QAAQ,KAAmB;AAClC,MAAI,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;AACzD,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,MAAK,MAAM,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5F,SAAO,IAAI;AACb;AAIA,SAAS,YACP,IACA,IACA,GACA,KACA,QAAQ,GACR,aAAa,GACP;AACN,QAAM,MAAY,CAAC;AACnB,QAAM,KAAK,KAAK,IAAI,UAAU;AAC9B,QAAM,KAAK,KAAK,IAAI,UAAU;AAC9B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAK,IAAI,IAAK,KAAK,KAAK,IAAI,IAAI,IAAI;AAC1C,UAAM,IAAI,KAAK,OAAO,IAAI,IAAI;AAE9B,UAAM,KAAK,KAAK,IAAI,CAAC,IAAI,IAAI;AAC7B,UAAM,KAAK,KAAK,IAAI,CAAC,IAAI;AACzB,QAAI,KAAK;AAAA,MACP,GAAG,KAAK,KAAK,KAAK,KAAK;AAAA,MACvB,GAAG,KAAK,KAAK,KAAK,KAAK;AAAA;AAAA,MAEvB,GAAG,IAAI,IAAI,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,WAAW,EAAE,IAAI,OAAO,IAAI,GAAe;AACzD,QAAM,UAAU,IAAI,OAAO;AAG3B,QAAM,CAAC,UAAU,SAAS,IAAI,IAAI;AAClC,QAAM,cAAc,IAAI,OAAO;AAE/B,MAAI,MAAM,SAAS,UAAW,QAAO;AAMrC,QAAM,OAAO,CACX,IACA,IACA,GACA,MACA,MACA,MACA,WAAW,GACX,aAAa,GACb,SAAS,UACN;AACH,UAAM,MAAMA,KAAI,OAAO,aAAa,CAAC;AACrC,UAAM,QAAQ,SAAS,OAAO,OAAO,IAAI,IAAI;AAC7C,UAAMC,QAAO,OAAO,YAAY,IAAI,IAAI,GAAG,KAAK,OAAO,UAAU,GAAG,GAAG,GAAG;AAC1E,UAAM,SAA4B,CAAC;AACnC,UAAM,IAAI,SAAS,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,QAAQ,CAAC;AAC3D,UAAM,WAAW,SAAS,OAAO;AACjC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAE1B,YAAM,QAAQ,IAAI,IAAI;AACtB,YAAM,MAAM,QACRA,MAAK,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,IACxFA;AACJ,YAAM,QAAQ,WAAW,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,OAAO,GAAG;AAC5D,aAAO;AAAA,QACL,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,QAAQ,KAAK;AAAA,YAChB,MAAM;AAAA,YACN,UAAU,QAAQ,WAAW,MAAM,YAAY;AAAA;AAAA,UAH1C;AAAA,QAIP;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC;AACnD,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,IAAI,IAAI,OAAO,IAAI;AAC/B,YAAM,MAAM,IAAI,IAAI,OAAO,IAAI;AAC/B,YAAM,KAAK,MAAM,IAAI,IAAI;AACzB,YAAM,MAAMG,MAAK,IAAI,CAAC,OAAO;AAAA,QAC3B,GAAG,KAAK,MAAM,EAAE,IAAI,MAAM;AAAA,QAC1B,GAAG,KAAK,MAAM,EAAE,IAAI,MAAM;AAAA,QAC1B,GAAG,EAAE,IAAI,KAAK;AAAA,MAChB,EAAE;AACF,aAAO;AAAA,QACL,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,QAAQ,WAAW,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC;AAAA,YAC1D,MAAM;AAAA,YACN,SAAS,OAAO;AAAA;AAAA,UAHX,IAAI,CAAC;AAAA,QAIZ;AAAA,MACF;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,KAAK;AACzC,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK;AAC9B,YAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,OAAO,IAAI,IAAI;AAC/B,YAAM,QAAc,CAAC;AACrB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,KAAM,IAAI,IAAK,KAAK,KAAK;AAC/B,cAAM,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,EAAE,IAAI,MAAM,MAAM,IAAI,IAAI,MAAM,GAAG,KAAK,KAAK,IAAI,EAAE,IAAI,MAAM,MAAM,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,MAC9H;AACA,aAAO;AAAA,QACL,gBAAAA,MAAC,UAAmB,GAAG,QAAQ,OAAO,OAAO,GAAG,GAAG,CAAC,GAAG,MAAM,MAAM,UAAU,OAAO,IAAI,IAAI,QAAQ,YAAzF,IAAI,CAAC,EAA8F;AAAA,MAChH;AAAA,IACF;AAIA,UAAM,UAAU,CAAC,IAAY,IAAY,MAAc;AACrD,YAAM,IAAI,KAAK,MAAM,EAAE;AACvB,YAAM,IAAI,KAAK,MAAM,EAAE;AACvB,YAAM,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI;AAChC,aAAO,KAAK,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,IAC5E;AACA,UAAM,WAAqC,CAAC,IAAI,IAAI,EAAE;AACtD,UAAM,KAAK,KAAK,MAAM,MAAM,QAAQ;AACpC,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK;AAC9B,YAAM,OAAO,IAAI,KAAK;AACtB,YAAM,OAAO,OAAO,KAAK,OAAO,IAAI,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,IAAI,IAAI;AACvE,YAAM,IAAI,QAAQ,KAAK,KAAK,IAAI,GAAG,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,MAAM,MAAM,IAAI,IAAI,GAAG;AACzF,YAAM,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI;AACxC,eAAS,EAAE,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK;AAC9B,YAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,IAAI,IAAI;AACxB,YAAM,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI,IAAI,OAAO;AAC/C,cAAQ,KAAK,KAAK,MAAM,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,IACrM;AAGA,QAAI,SAAS;AACb,UAAM,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC;AACvC,aAAS,KAAK,GAAG,KAAK,QAAQ,MAAM;AAClC,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK;AAC9B,YAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAChC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI;AAChC,YAAM,KAAK,KAAK,IAAI,IAAI;AACxB,YAAM,KAAK,IAAI,IAAI,KAAK;AACxB,YAAM,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC;AACrC,YAAM,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC;AACrC,eAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,cAAM,OAAO,KAAK,QAAQ,MAAM,IAAI,IAAI;AACxC,cAAM,KAAK,MAAM,MAAM,IAAI,IAAI;AAC/B,kBAAU,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,MAC7I;AAAA,IACF;AACA,UAAM,SAA4B;AAAA,MAChC,SAAS,CAAC,IAAI,gBAAAA,MAAC,UAAc,GAAG,SAAS,CAAC,GAAG,MAAM,aAAa,SAAS,OAAjD,IAAsD,IAAK;AAAA,MACnF,SAAS,CAAC,IAAI,gBAAAA,MAAC,UAAc,GAAG,SAAS,CAAC,GAAG,MAAM,MAAM,SAAS,OAA1C,IAA+C,IAAK;AAAA,MAC5E,SAAS,CAAC,IAAI,gBAAAA,MAAC,UAAc,GAAG,SAAS,CAAC,GAAG,MAAM,aAAa,SAAS,QAAjD,IAAuD,IAAK;AAAA,MACpF,OACE,gBAAAA,MAAC,UAAe,GAAG,MAAM,QAAQ,aAAa,aAAa,KAAK,eAAc,SAAQ,MAAK,QAAO,SAAS,QAAjG,KAAuG,IAC/G;AAAA,MACJ,SACE,gBAAAA,MAAC,UAAiB,GAAG,QAAQ,QAAQ,aAAa,aAAa,KAAK,eAAc,SAAQ,MAAK,QAAO,SAAS,OAArG,OAA0G,IAClH;AAAA,IACN;AACA,WACE,gBAAAC,OAAC,OACE;AAAA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AAIA,QAAM,aAAa,CACjB,GACA,GACA,IACA,IACA,OACA,SACA,MACA,UACG;AACH,QAAI,KAAM,OAAO,QAAQ,MAAO;AAChC,UAAM,MAAM,OAAQ,KAAM,KAAK,UAAU,eAAgB,GAAI,KAAK;AAClE,WACE,gBAAAA,OAAC,OACE;AAAA,YAAM,IAAI,CAAC,GAAG,OAAO;AAEpB,cAAM,IAAI;AACV,cAAM,SAAS,CAAC;AAChB,iBAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,EAAE,KAAK,OAAO,IAAI,IAAI;AAAA,YAC9B,OAAO,KAAK,KAAK,KAAK;AAAA,UACxB;AACA,iBAAO;AAAA,YACL,gBAAAD,MAAC,UAAc,GAAG,UAAU,GAAG,GAAG,OAAO,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,KAAK,IAAI,SAAvE,EAA8E;AAAA,UAC3F;AAAA,QACF;AACA,eAAO,gBAAAA,MAAC,OAAY,oBAAL,EAAY;AAAA,MAC7B,CAAC;AAAA,OACC,MAAM;AACN,cAAM,QAAQ,UAAU,GAAG,GAAG,IAAI,IAAI,QAAQ,MAAM,OAAO,CAAC;AAC5D,cAAM,MAAM,CAAC,IAAY,IAAY,MAAc;AACjD,gBAAM,IAAI,KAAK,MAAM,EAAE;AACvB,gBAAM,IAAI,KAAK,MAAM,EAAE;AACvB,gBAAM,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI;AAChC,iBAAO,KAAK,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,QAC5E;AACA,YAAI,KAAK;AACT,YAAI,KAAK;AACT,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,gBAAM,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC;AAChD,gBAAM,IAAI;AAAA,YACR,EAAE,KAAK,IAAI,IAAI,OAAO,QAAQ;AAAA,YAC9B,EAAE,KAAK,IAAI,IAAI,OAAO,QAAQ;AAAA,YAC9B,MAAM,IAAI,IAAI;AAAA,UAChB;AACA,cAAI,IAAI,IAAI,KAAM,OAAM;AAAA,cACnB,OAAM;AAAA,QACb;AACA,eACE,gBAAAC,OAAC,OACE;AAAA,eAAK,gBAAAD,MAAC,UAAK,GAAG,IAAI,MAAM,aAAa,SAAS,KAAK,IAAK;AAAA,UACxD,KAAK,gBAAAA,MAAC,UAAK,GAAG,IAAI,MAAM,MAAM,CAAC,EAAE,GAAG,SAAS,MAAM,IAAK;AAAA,WAC3D;AAAA,MAEJ,GAAG;AAAA,OACL;AAAA,EAEJ;AAEA,QAAM,QAAQ,CAAC,GAAW,GAAW,GAAW,OAAe,MAC7D,gBAAAC,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,QAAQ,OAAO,aAAa,KAAK,MAAK,QAAO,SAAS,GAAG;AAAA,IAC3I,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,QAAQ,MAAM,CAAC,SAAS,KAAK,CAAC,OAAO,KAAK,CAAC,MAAM,MAAM,OAAO,SAAS,IAAI,KAAK;AAAA,IACrI,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,MAAM,OAAO,SAAS,IAAI,KAAK;AAAA,IACnI,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,QAAQ,MAAM,CAAC,cAAc,KAAK,CAAC,MAAM,MAAM,OAAO,SAAS,IAAI,MAAM;AAAA,KACjI;AAGF,MAAI,MAAM,SAAS,WAAW;AAE5B,WACE,gBAAAC,OAAAF,YAAA,EACG;AAAA,WAAK,MAAM,IAAI,KAAK,IAAI,SAAS,MAAM,KAAK,IAAI;AAAA,MAChD,KAAK,MAAM,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG;AAAA,MACjD,KAAK,KAAK,KAAK,KAAK,IAAI,UAAU,aAAa,MAAM,IAAI;AAAA,MACzD,MAAM,MAAM,KAAK,KAAK,UAAU,IAAI;AAAA,OACvC;AAAA,EAEJ;AAEA,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,eAAe,CAAC,KAAK,KAAK,GAAG,CAAU;AAEtF,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,WAAK,KAAK,KAAK,KAAK,IAAI,UAAU,aAAa,KAAK,GAAG;AAAA,MACvD,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,KAAK,GAAG;AAAA,MAC/C,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI;AAAA,MAChD,KAAK,KAAK,MAAM,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AAAA,MACjD,KAAK,KAAK,MAAM,KAAK,IAAI,MAAM,UAAU,MAAM,KAAK;AAAA,MACpD,KAAK,MAAM,KAAK,KAAK,IAAI,SAAS,MAAM,KAAK,IAAI;AAAA,MACjD,KAAK,MAAM,KAAK,KAAK,IAAI,UAAU,MAAM,MAAM,IAAI;AAAA,MACnD,MAAM,MAAM,KAAK,MAAM,UAAU,IAAI;AAAA,OACxC;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,WAAK,KAAK,KAAK,KAAK,IAAI,UAAU,aAAa,GAAG,IAAI;AAAA,MACtD,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AAAA,MAChD,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG;AAAA,MAChD,KAAK,MAAM,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG,IAAI;AAAA,MAC/C,KAAK,MAAM,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG;AAAA,MACjD,KAAK,MAAM,KAAK,KAAK,IAAI,UAAU,MAAM,KAAK,GAAG;AAAA,MACjD,KAAK,MAAM,KAAK,KAAK,IAAI,aAAa,UAAU,MAAM,IAAI;AAAA,MAC1D,MAAM,MAAM,KAAK,KAAK,UAAU,IAAI;AAAA,MACrC,gBAAAC,MAAC,UAAK,GAAE,uFAAsF,QAAQ,UAAU,aAAa,KAAK,SAAS,MAAM;AAAA,OACnJ;AAAA,EAEJ;AAIA,SACE,gBAAAC,OAAAF,YAAA,EACG;AAAA,SAAK,KAAK,KAAK,KAAK,IAAI,UAAU,aAAa,GAAG,IAAI;AAAA,IACtD,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AAAA,IAChD,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG;AAAA,IAChD,WAAW,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,MAAM,KAAK,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAAA,MAC7F,EAAE,GAAG,SAAS,GAAG,KAAK,GAAG,EAAE;AAAA,MAC3B,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;AAAA,IAC9B,CAAC;AAAA,IACD,gBAAAC,MAAC,OAAE,SAAS,MACV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QAAK,GAAE;AAAA,QAGF,QAAQ;AAAA,QAAU,aAAa;AAAA,QAAK,MAAK;AAAA;AAAA,IAAO,GACxD;AAAA,IACC,MAAM,MAAM,KAAK,MAAM,UAAU,GAAG;AAAA,IACpC,MAAM,MAAM,KAAK,MAAM,MAAM,IAAI;AAAA,KACpC;AAEJ;;;ACvZI,SA6CE,YAAAI,YA7CF,OAAAC,OAsBE,QAAAC,cAtBF;AAfJ,SAAS,SAAS,IAAY,IAAY,GAAW,GAAmB;AACtE,QAAM,IAAI,CAAC,MAAc,KAAK,MAAM,IAAI,EAAE,IAAI;AAC9C,MAAI,MAAM;AACR,WAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;AACvZ,MAAI,MAAM;AACR,WAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;AACxZ,SAAO,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACxe;AAEO,SAAS,eAAe,EAAE,IAAI,OAAO,IAAI,GAAe;AAC7D,QAAM,CAAC,MAAM,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO;AAE9C,MAAI,MAAM,SAAS,UAAW,QAAO;AAErC,QAAM,OAAO,CAAC,IAAY,IAAY,GAAW,OAAe,GAAW,IAAI,MAC7E,gBAAAD,MAAC,UAAK,GAAG,SAAS,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,OAAO,SAAS,GAAG;AAI5D,QAAM,OAAO,CAAC,GAAW,GAAW,MAAc,MAAc,OAAe,IAAI,QAAQ;AACzF,UAAM,MAAyB,CAAC;AAChC,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAI;AAAA,UACF,gBAAAA,MAAC,YAAyB,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,KAAnF,GAAG,CAAC,IAAI,CAAC,EAA6E;AAAA,QACrG;AAAA,MACF;AAAA,IACF;AACA,WAAO,gBAAAA,MAAC,OAAG,eAAI;AAAA,EACjB;AAGA,QAAM,QAAQ,CAAC,GAAW,GAAW,OAAe,UAAkB;AACpE,UAAM,IAAK,QAAQ,KAAK,KAAM;AAC9B,UAAM,KAAK,KAAK,IAAI,CAAC,IAAI;AACzB,UAAM,KAAK,KAAK,IAAI,CAAC,IAAI;AACzB,WACE,gBAAAC,OAAC,OAAE,QAAQ,OAAO,aAAa,KAAK,eAAc,SAAQ,SAAS,MACjE;AAAA,sBAAAD,MAAC,UAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,MAAK,QAAO;AAAA,MAClD,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,MAAK,QAAO;AAAA,MAC3D,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,MAAK,QAAO;AAAA,OAC9D;AAAA,EAEJ;AAGA,QAAM,WAAW,CAAC,GAAW,GAAW,GAAW,UAAkB;AACnE,QAAI,IAAI,KAAK,CAAC,IAAI,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC;AAC7D,WAAO,gBAAAA,MAAC,UAAK,GAAM,QAAQ,OAAO,aAAa,KAAK,eAAc,SAAQ,MAAK,QAAO,SAAS,KAAK;AAAA,EACtG;AAGA,QAAM,OAAO,CAAC,IAAY,IAAY,GAAW,OAAe,IAAI,QAClE,gBAAAA,MAAC,YAAO,IAAQ,IAAQ,GAAM,MAAK,QAAO,QAAQ,OAAO,aAAa,GAAG,SAAS,GAAG;AAGvF,MAAI,MAAM,SAAS,WAAW;AAE5B,WACE,gBAAAC,OAAAF,YAAA,EACG;AAAA,WAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC;AAAA,MAChC,KAAK,MAAM,IAAI,IAAI,OAAO,MAAM,CAAC;AAAA,MACjC,KAAK,IAAI,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,MAChC,KAAK,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG;AAAA,MAC9B,SAAS,IAAI,KAAK,GAAG,KAAK;AAAA,OAC7B;AAAA,EAEJ;AAEA,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,mBAAmB,CAAC,KAAK,KAAK,GAAG,CAAU;AAE1F,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,WAAK,IAAI,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,MAC9B,KAAK,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,MAChC,KAAK,IAAI,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,MAChC,KAAK,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC;AAAA,MAClC,KAAK,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC;AAAA,MAClC,KAAK,MAAM,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,MACjC,KAAK,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG;AAAA,MAC9B,MAAM,KAAM,KAAK,KAAK,KAAK;AAAA,MAC3B,SAAS,KAAK,KAAK,GAAG,KAAK;AAAA,MAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,OACjC;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AAEnB,WACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,WAAK,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,MACjC,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,CAAC;AAAA,MACjC,KAAK,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC;AAAA,MAClC,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,MAClC,KAAK,MAAM,IAAI,IAAI,OAAO,KAAK,CAAC;AAAA,MAChC,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,MAChC,KAAK,KAAK,IAAI,GAAG,GAAG,MAAM,GAAG;AAAA,MAC7B,SAAS,KAAK,KAAK,GAAG,KAAK;AAAA,MAC3B,MAAM,IAAI,KAAK,KAAK,IAAI;AAAA,MACxB,KAAK,MAAM,KAAK,IAAI,OAAO,IAAI;AAAA,OAClC;AAAA,EAEJ;AAEA,SACE,gBAAAE,OAAAF,YAAA,EACG;AAAA,SAAK,IAAI,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,IAC/B,KAAK,KAAK,GAAG,KAAK,OAAO,MAAM,CAAC;AAAA,IAChC,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IACjC,KAAK,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC;AAAA,IAClC,KAAK,IAAI,KAAK,KAAK,OAAO,MAAM,CAAC;AAAA,IACjC,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,IACjC,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,IAClC,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,IAClC,KAAK,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI;AAAA,IAC9B,KAAK,KAAM,KAAK,GAAG,GAAG,OAAO,GAAG;AAAA,IAChC,SAAS,MAAM,KAAK,GAAG,IAAI;AAAA,IAC3B,SAAS,KAAK,KAAK,GAAG,KAAK;AAAA,IAC3B,MAAM,MAAM,KAAK,KAAK,IAAI;AAAA,IAC1B,KAAK,KAAK,KAAK,IAAI,OAAO,GAAG;AAAA,IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,IAAI;AAAA,KACjC;AAEJ;;;AClHQ,qBAAAG,YACE,OAAAC,OADF,QAAAC,cAAA;AAZD,SAAS,SAAS,EAAE,OAAO,IAAI,IAAI,GAAe;AACvD,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,MAAM,SAAS,WAAW,MAAM,SAAS;AACxD,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,aAAa,CAAC,KAAK,KAAK,GAAG,CAAU;AAEpF,QAAM,YAAY,GAAG,KAAK,gBAAgB,IAAI,MAAM,GAAG,CAAC;AAExD,SACE,gBAAAA,OAAAF,YAAA,EAGG;AAAA,UAAM,SAAS,aACd,gBAAAE,OAAAF,YAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,QAAQ,OAAO,QAAQ,aAAa,KAAK;AAAA,MAGjF,gBAAAA,MAAC,UAAK,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,OAAO,QAAQ,aAAa,KAAK;AAAA,OACrF;AAAA,IAGD,UACC,gBAAAC,OAAAF,YAAA,EAGG;AAAA,kBAAY,OACX,gBAAAE,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAE,mDAAkD,MAAM,OAAO,SAAS,SAAS,KAAK;AAAA,QAC9F,gBAAAA,MAAC,UAAK,GAAE,mDAAkD,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,QAC/F,gBAAAA,MAAC,UAAK,GAAE,mDAAkD,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,SACjG;AAAA,MAED,YAAY,OACX,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAE,qDAAoD,MAAM,OAAO,SAAS,SAAS,KAAK;AAAA,QAChG,gBAAAA,MAAC,UAAK,GAAE,qDAAoD,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,QACjG,gBAAAA,MAAC,UAAK,GAAE,oDAAmD,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,SAClG;AAAA,MAED,YAAY,OACX,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAE,gEAA+D,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,QAC5G,gBAAAA,MAAC,UAAK,GAAE,mDAAkD,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,SACjG;AAAA,MAQD,MAAM,SAAS,WAAW,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,MACrD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,GAAG,OAAO,SAAS,SAAS,IAAI,KAAK;AAAA,UACrC,YAAY,IAAI,MAAM;AAAA,UACtB,UAAU;AAAA,UACV,MAAM,OAAO;AAAA,UACb,YAAW;AAAA,UACX,kBAAiB;AAAA,UAEhB;AAAA;AAAA,QATI;AAAA,MAUP,CACD;AAAA,MACA,MAAM,SAAS,WACd,gBAAAC,OAAAF,YAAA,EACE;AAAA,wBAAAC,MAAC,UAAK,GAAG,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,OAAO,QAAQ;AAAA,QAC1E,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAQ,OAAO;AAAA,YACf,aAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;;;AC7EW,SAKL,YAAAE,YALK,OAAAC,OAKL,QAAAC,cALK;AARJ,SAAS,UAAU,EAAE,IAAI,OAAO,IAAI,GAAe;AACxD,QAAM,OAAO,IAAI,OAAO;AACxB,MAAI,MAAM,SAAS,UAAW,QAAO;AACrC,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,cAAc,CAAC,KAAK,KAAK,GAAG,CAAU;AAErF,MAAI,CAAC,QAAQ;AAEX,WAAO,gBAAAD,MAAC,UAAK,GAAE,oBAAmB,QAAQ,MAAM,aAAa,KAAK,SAAS,MAAM;AAAA,EACnF;AAEA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAE,kBAAiB,QAAQ,MAAM,aAAa,GAAG,SAAS,KAAK;AAAA,MACrE,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,MAC5C,gBAAAA,MAAC,YAAO,IAAI,MAAM,IAAI,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,OAChD;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAE,+BAA8B,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,KAAK;AAAA,MAChG,gBAAAA,MAAC,UAAK,GAAE,oCAAmC,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,KAAK;AAAA,MACrG,gBAAAA,MAAC,UAAK,GAAE,iCAAgC,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,KAAK;AAAA,MAClG,gBAAAA,MAAC,UAAK,GAAE,sCAAqC,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,KAAK;AAAA,OACzG;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,GAAE,oCAAmC,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,KAAK;AAAA,IACrG,gBAAAA,MAAC,UAAK,GAAE,oCAAmC,QAAQ,MAAM,aAAa,KAAK,MAAK,QAAO,SAAS,MAAM;AAAA,IACtG,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,MAAM,MAAM;AAAA,IAC7C,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,MAAM,MAAM,SAAS,KAAK;AAAA,IAC3D,gBAAAA,MAAC,YAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,MAAM,MAAM,SAAS,MAAM;AAAA,KAC9D;AAEJ;;;ACnCW,SAKL,YAAAE,YALK,OAAAC,OAKL,QAAAC,cALK;AARJ,SAAS,gBAAgB,EAAE,IAAI,OAAO,IAAI,GAAe;AAC9D,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,MAAM,SAAS,UAAW,QAAO;AACrC,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,oBAAoB,CAAC,KAAK,KAAK,GAAG,CAAU;AAE3F,MAAI,CAAC,QAAQ;AAEX,WAAO,gBAAAD,MAAC,UAAK,GAAG,MAAM,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS,MAAM;AAAA,EAChF;AAEA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAG,GAAG,GAAG,KAAK,OAAO,GAAG,QAAQ,KAAK,MAAM,KAAK;AAAA,MACtD,gBAAAA,MAAC,UAAK,GAAG,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK;AAAA,OAC3D;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK;AAAA,MACtD,gBAAAA,MAAC,UAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS,MAAM;AAAA,MACrE,gBAAAA,MAAC,UAAK,GAAG,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK;AAAA,MACzD,gBAAAA,MAAC,UAAK,GAAG,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS,MAAM;AAAA,OAC1E;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAAD,YAAA,EACG,WAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACd,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACb,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,OAAO,IAAI;AAAA,QACd,GAAG,KAAK,IAAI;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,SAAS,KAAK,IAAI,KAAK;AAAA;AAAA,MANlB,GAAG,CAAC,GAAG,CAAC;AAAA,IAOf,CACD;AAAA,EACH,GACF;AAEJ;;;ACpCM,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AATC,SAAS,cAAc,EAAE,IAAI,OAAO,IAAI,GAAe;AAC5D,QAAM,OAAO,IAAI,OAAO;AACxB,QAAM,UAAU,IAAI,OAAO;AAC3B,MAAI,MAAM,SAAS,UAAW,QAAO;AACrC,QAAM,UAAU,WAAW,eAAe,EAAE,GAAG,kBAAkB,CAAC,KAAK,KAAK,GAAG,CAAU;AAEzF,MAAI,MAAM,SAAS,SAAS;AAE1B,WACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAE,6CAA4C,MAAK,QAAO,QAAQ,MAAM,aAAa,KAAK,SAAS,MAAM;AAAA,MAC/G,gBAAAA,MAAC,UAAK,GAAE,6CAA4C,MAAK,QAAO,QAAQ,SAAS,aAAa,KAAK,SAAS,KAAK;AAAA,OACnH;AAAA,EAEJ;AAEA,MAAI,YAAY,KAAK;AAEnB,UAAM,OAAO,CAAC,IAAY,OAAe,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE;AAChH,WACE,gBAAAC,OAAAF,YAAA,EACE;AAAA,sBAAAC,MAAC,UAAK,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,SAAS,SAAS,KAAK;AAAA,MACpD,gBAAAA,MAAC,UAAK,GAAG,KAAK,MAAM,EAAE,GAAG,MAAM,SAAS,SAAS,KAAK;AAAA,MACtD,gBAAAA,MAAC,UAAK,GAAG,KAAK,IAAI,GAAG,GAAG,MAAM,SAAS,SAAS,KAAK;AAAA,MACrD,gBAAAA,MAAC,UAAK,GAAG,KAAK,MAAM,GAAG,GAAG,MAAM,SAAS,SAAS,KAAK;AAAA,OACzD;AAAA,EAEJ;AACA,MAAI,YAAY,KAAK;AACnB,WACE,gBAAAC,OAAAF,YAAA,EAEE;AAAA,sBAAAC,MAAC,UAAK,GAAE,+BAA8B,QAAQ,SAAS,aAAa,GAAG,MAAK,QAAO,SAAS,KAAK;AAAA,MACjG,gBAAAA,MAAC,UAAK,GAAE,mCAAkC,QAAQ,SAAS,aAAa,GAAG,MAAK,QAAO,SAAS,KAAK;AAAA,OACvG;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,UAAK,GAAE,yCAAwC,MAAK,QAAO,QAAQ,MAAM,aAAa,KAAK,SAAS,KAAK;AAAA,IAC1G,gBAAAA,MAAC,UAAK,GAAE,yCAAwC,MAAK,QAAO,QAAQ,SAAS,aAAa,GAAG,SAAS,KAAK;AAAA,IAC3G,gBAAAA,MAAC,UAAK,GAAE,iCAAgC,QAAQ,SAAS,aAAa,GAAG,SAAS,KAAK;AAAA,KACzF;AAEJ;;;ACxCO,IAAM,mBAA6D;AAAA,EACxE,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;;;ACyII,SAME,OAAAE,OANF,QAAAC,cAAA;AAzIG,SAAS,SACd,QACA,QACA,QACU;AACV,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL,SAAS,iBAAiB,OAAO,MAAM,SAAS,SAAS;AAAA,MACzD,MAAM,iBAAiB,OAAO,MAAM,MAAM,MAAM;AAAA,MAChD,MAAM,iBAAiB,OAAO,MAAM,QAAQ,CAAC,GAAG,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,IACA,YAAY,SAAS,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;AAAA,EACvE;AACF;AAcA,IAAM,4BAAkF;AAAA,EACtF,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAYA,SAAS,iBACP,WACA,UACA,MACA,aACiD;AACjD,QAAM,UAA6B,SAAS,WAAW,SAAS;AAChE,MAAI,QAAQ,WAAW,EAAG,QAAO;AAKjC,QAAM,KAAK,mBAAmB,MAAM,GAAG,SAAS,cAAc,SAAS,WAAW;AAClF,SAAO,EAAE,IAAI,WAAW,0BAA0B,SAAS,EAAE,EAAE,EAAE;AACnE;AAOO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,SAAS,SAAS,GAAG,MAAM,IAAI,GAAG,MAAM,QAAQ;AACtD,QAAM,MAAM;AAAA,IACV;AAAA,IACA,GAAG,OAAO;AAAA,IACV,GAAG,KAAK,WAAW,aAAa,SAAS,MAAM,SAAS;AAAA,EAC1D;AACA,QAAM,WAAW,YAAY,GAAG,MAAM,EAAE;AAGxC,QAAM,QAAQ,SAAS,QAAQ,iBAAiB,SAAS,KAAK,IAAI;AAClE,MAAI,SAAS,MAAM,cAAc,OAAO,mBAAmB,MAAM,IAAI;AAQrE,QAAM,qBACJ,OAAO,SAAS,YACf,MAAM,SAAS,WAAW,MAAM,SAAS;AAE5C,MAAI;AACJ,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,EAAE,SAAS,UAAU,GAAG,eAAe,IAAI;AACjD,aAAS;AACT,QAAI,CAAC,oBAAoB;AACvB,YAAM,cAAc,OAAO,mBAAmB,MAAM,IAAI;AACxD,uBACE,YAAY,SAAS,UACjB,YAAY,QACZ,YAAY,SAAS,aACnB,YAAY,OACZ,OAAO,OAAO;AAAA,IACxB;AAAA,EACF;AAIA,QAAM,gBAAgB,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACjE,QAAM,qBACJ,MAAM,YAAY,iBAClB,MAAM,YAAY,eAClB,MAAM,YAAY,kBAClB,MAAM,YAAY;AACpB,QAAM,gBAAgB,sBAAsB;AAO5C,MAAI,cAAc;AAClB,WAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,OAAO,QAAQ,KAAK;AACtD,QAAI,GAAG,OAAO,CAAC,EAAE,SAAS,MAAM,KAAM;AAAA,EACxC;AACA,QAAM,YACJ,sBAAsB,gBAClB,OACA,iBAAiB,MAAM,MAAM,UAAU,eAAe,EAAE,GAAG,WAAW;AAE5E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,OAAO,WAAW,IAAI,WAAW;AAAA,MAC1C,OAAM;AAAA,MACN;AAAA,MACA;AAAA,MAEA;AAAA,wBAAAD,MAAC,cAAW,MAAM,QAAQ,QAAQ,GAAG,OAAO,QAAQ,gBAAgC;AAAA,QACnF,SAAS,CAAC,sBACT,gBAAAA,MAAC,OAAE,cAAU,MACX,0BAAAA,MAAC,SAAM,IAAQ,OAAc,KAAU,GACzC;AAAA,QAEF,gBAAAA,MAAC,cAAW,IAAQ,OAAc,OAAc,KAAU;AAAA,QACzD,qBACC,gBAAAA,MAAC,kBAAe,IAAQ,OAAc,OAAc,KAAU,IAC5D,iBAAiB,MAAM,YAAY,cACrC,gBAAAA,MAAC,gBAAa,IAAQ,OAAc,KAAU,IAC5C,iBAAiB,MAAM,YAAY,iBACrC,gBAAAA,MAAC,mBAAgB,IAAQ,OAAc,KAAU,IAC/C,iBAAiB,MAAM,YAAY,mBACrC,gBAAAA,MAAC,qBAAkB,IAAQ,OAAc,KAAU,IACjD,gBACF,gBAAAA,MAAC,kBAAe,IAAQ,OAAc,KAAU,IAC9C,YACF,gBAAAA,MAAC,OAAE,kBAAgB,UAAU,IAC3B,0BAAAA,MAAC,UAAU,WAAV,EAAoB,IAAQ,OAAc,OAAc,KAAU,GACrE,IACE;AAAA,QAGJ,gBAAAA,MAAC,gBAAa,IAAQ,OAAc,KAAU;AAAA;AAAA;AAAA,EAChD;AAEJ;;;AC7MA,SAAS,4BAA4B;AAY9B,SAAS,gBAAgB,MAAkC;AAChE,QAAM,SAAS,qBAAqB,IAAI;AACxC,SAAO,OAAO,SAAS,QAAQ,IAC3B,SACA,OAAO,QAAQ,WAAW,yCAAyC;AACzE;AAGO,SAAS,aAAa,QAAyB;AACpD,QAAM,SAAS,YAAY,EAAE,aAAa,WAAW;AACrD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,IAAI,OAAO,EAAE,gBAAgB,QAAQ,eAAe;AAChE,QAAM,MAAM,IAAI,cAAc,aAAa;AAC3C,MAAI,IAAK,OAAM,IAAI,MAAM,8BAA8B,IAAI,eAAe,EAAE,EAAE;AAC9E,SAAO,IAAI;AACb;;;A3GpBO,SAAS,iBAAiB,IAAY,OAAc,OAAuB;AAChF,SAAO,gBAAgB,cAAc,cAAc,EAAE,IAAI,OAAO,MAAM,CAAC,CAAC;AAC1E;AAGO,SAAS,WAAW,IAAY,OAAc,OAAqB;AACxE,SAAO,SAAS,aAAa,iBAAiB,IAAI,OAAO,KAAK,CAAC,CAAC;AAClE;;;A4GlBA,OAAOE,YAAW;AAclB,eAAsB,gBAAgB,MAA2B;AAC/D,MAAI;AACF,UAAM,MAAM,MAAMA,OAAM,UAAU,MAAM,KAAK,YAAY,CAAC;AAE1D,UAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,MACxC,CAAC,MAAM,EAAE,WAAW,YAAY,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,IACrD;AACA,QAAI,WAAW,SAAS,EAAG,QAAO;AAGlC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,QAAQ,YAAY;AAC7B,YAAM,QAAQ,MAAM,IAAI,MAAM,IAAI,EAAE,MAAM,YAAY;AACtD,YAAM,MAAM,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,CAAC;AAC3C,YAAM,YAAY,MAAM,IAAI,GAAG;AAC/B,UAAI,cAAc,OAAW,OAAM,IAAI,KAAK,IAAI;AAAA,eACvC,cAAc,KAAM,OAAM,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC;AAAA,IACpE;AACA,QAAI,MAAM,SAAS,EAAG,QAAO;AAG7B,UAAM,YAAY,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,MACvC,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,IAC9C;AACA,eAAW,QAAQ,WAAW;AAC5B,UAAI,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ;AAC9C,UAAI,UAAU;AACd,iBAAW,CAAC,MAAM,SAAS,KAAK,OAAO;AACrC,YAAI,IAAI,SAAS,IAAI,GAAG;AACtB,gBAAM,IAAI,MAAM,IAAI,EAAE,KAAK,SAAS;AACpC,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,UAAI,QAAS,KAAI,KAAK,MAAM,GAAG;AAAA,IACjC;AAGA,eAAW,QAAQ,YAAY;AAC7B,UAAI,MAAM,IAAI,KAAK,IAAI,CAAC,EAAG,KAAI,OAAO,IAAI;AAAA,IAC5C;AAIA,UAAM,KAAK,MAAM,IAAI,cAAc,EAAE,MAAM,eAAe,aAAa,UAAU,CAAC;AAClF,WAAO,IAAI,KAAK,CAAC,EAAE,GAAG;AAAA,MACpB,MAAM;AAAA,IACR,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,KAAK,GAAmB;AAC/B,SAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;AACvC;AAGA,SAAS,MAAM,OAA2B;AACxC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,SAAK,MAAM,CAAC;AACZ,QAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAC7B;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE;AAC9B;;;ACzDA,eAAsB,iBAAiB,OAA8B;AAKnE,QAAM,EAAE,MAAM,OAAO,GAAG,QAAQ,IAAI;AAEpC,QAAM,KAAK,MAAM,iBAAiB,aAAa,MAAM,OAAO,CAAC;AAE7D,QAAM,aAAa,MAAM,OAAO,WAAW,GAAG;AAC9C,QAAM,OAAgB,IAAI,UAAU;AAEpC,OAAK,aAAa,EAAE,MAAM,eAAe,OAAO,OAAO,QAAQ,IAAI,CAAC;AACpE,OAAK,SAAS;AAEd,QAAM,SAAS,SAAS,GAAG,MAAM,IAAI,GAAG,MAAM,QAAQ;AACtD,qBAAmB,MAAM,MAAM;AAE/B,QAAM,kBAAuC,CAAC;AAC9C,KAAG,OAAO,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAM,IAAI,KAAK,SAAS,EAAE,YAAY,MAAM,KAAK,CAAC;AAClD,oBAAgB,KAAK,GAAG,UAAU,GAAG,WAAW,IAAI,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,EAC3E,CAAC;AAED,QAAM,UAAW,MAAM,KAAK,MAAM,EAAE,YAAY,OAAO,CAAC;AAKxD,QAAM,eAAe,MAAM,mBAAmB,SAAS,eAAe;AAOtE,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA,GAAG,KAAK,WAAW,cAAc;AAAA,EACnC;AAQA,QAAM,kBACJ,GAAG,KAAK,WAAW,aAAa,SAC5B,MAAM;AAAA,IACJ;AAAA,IACA,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,EAClE,IACA;AAEN,SAAO,gBAAgB,eAAe;AACxC;;;ACuIO,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWtB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0CjB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,4BAA4B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOV,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOH,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOf,eAAe;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,UAAU,EAAE,YAAY,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+B3B,WAAW,EAAE,UAAU,GAAG,eAAe,IAAI,cAAc,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgC9D,OAAO,EAAE,UAAU,GAAG,eAAe,GAAG,cAAc,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BzD,eAAe,EAAE,cAAc,IAAI;AACrC;;;AC/ZA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE;AACX;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACxD;AAKA,SAAS,qBAAqB,SAAyB;AACrD,SAAO,SAAS,2BAA2B,OAAO,KAAK,SAAS;AAClE;AAOA,SAAS,sBAAsB,OAAuB;AACpD,SACE,CAAC,MAAM,WACP,MAAM,OAAO,WAAW,KACxB,MAAM,OAAO,CAAC,EAAE,SAAS;AAE7B;AAIA,SAAS,WAAW,OAAc,OAAe,SAAiC;AAChF,QAAM,SAAyB,CAAC;AAGhC,MAAI,MAAM,WAAW,QAAQ,MAAM,OAAO,IAAI,SAAS,iBAAiB;AACtE,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAKA,QAAM,oBAAoB,qBAAqB,OAAO;AACtD,MAAI,MAAM,SAAS,aAAa,MAAM,OAAO,SAAS,mBAAmB;AACvE,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,6BAAS,iBAAiB;AAAA,IACrC,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,MAAM,SAAS,UAAW;AAC9B,QAAI,MAAM,MAAM,SAAS,SAAS,QAAQ,UAAU;AAClD,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,0DAAa,SAAS,QAAQ,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH;AACA,eAAW,QAAQ,MAAM,OAAO;AAC9B,UAAI,iBAAiB,IAAI,IAAI,SAAS,QAAQ,iBAAiB;AAC7D,eAAO,KAAK;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAgC,CAAC,SAAS,WAAW,SAAS;AACpE,MACE,aAAa,SAAS,MAAM,IAAI,KAChC,CAAC,MAAM,WACP,CAAC,sBAAsB,KAAK,GAC5B;AACA,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,YAAY,gBAAgB,CAAC,iBAAiB,KAAK,GAAG;AAC9D,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAIO,SAAS,eAAe,IAA4B;AACzD,QAAM,SAAyB,CAAC;AAGhC,MAAI,GAAG,OAAO,WAAW,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,OAAO,QAAQ,KAAK;AACzC,WAAO,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;AAAA,EACzD;AAEA,SAAO;AACT;;;ApItHA,SAAS,qBAAqB,OAAqB,SAAyB;AAC1E,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,mBAAmB,SAAS,eAAe;AAAA,IACpD,KAAK,WAAW;AACd,YAAM,QAAQ,SAAS,2BAA2B,OAAO,KAAK,SAAS;AACvE,aAAO,uCAAuC,KAAK;AAAA,IACrD;AAAA,IACA,KAAK;AACH,aAAO,uCAAuC,SAAS,QAAQ,QAAQ;AAAA,IACzE,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,0BAA0B,MAAM,IAAI;AAAA,EAC/C;AACF;AAeO,SAAS,WAAW,OAAgC;AACzD,QAAM,IAAI,aAAa,UAAU,KAAK;AACtC,MAAI,CAAC,EAAE,SAAS;AACd,UAAMC,UAAS,EAAE,MAAM,OAAO,IAAI,CAAC,UAAU;AAC3C,YAAM,OAAO,MAAM,KAAK,KAAK,GAAG;AAChC,YAAM,IAAI,iBAAiB,KAAK,IAAI;AACpC,aAAO,EAAE,MAAM,SAAS,MAAM,SAAS,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,OAAU;AAAA,IAChF,CAAC;AACD,WAAO,EAAE,IAAI,OAAO,QAAAA,QAAO;AAAA,EAC7B;AACA,QAAM,UAAU,eAAe,EAAE,IAAI;AACrC,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC,EAAE;AACpE,QAAM,SAA4B,QAAQ;AAAA,IAAI,CAAC,UAC7C,MAAM,SAAS,eACX,EAAE,MAAM,UAAU,SAAS,qBAAqB,OAAO,EAAE,KAAK,MAAM,EAAE,EAAE,IACxE;AAAA,MACE,MAAM,UAAU,MAAM,KAAK;AAAA,MAC3B,SAAS,qBAAqB,OAAO,EAAE,KAAK,MAAM,EAAE;AAAA,MACpD,MAAM,MAAM,QAAQ;AAAA,IACtB;AAAA,EACN;AACA,SAAO,EAAE,IAAI,OAAO,OAAO;AAC7B;AAEO,SAAS,aAAa,QAAmC;AAC9D,SAAO,OACJ,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,EAAE,IAAI,WAAM,EAAE,IAAI,KAAK,EAAE,OAAO,KAAK,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAG,EAC5F,KAAK,IAAI;AACd;AAGO,SAAS,eAAe,IAAY,YAA4B;AACrE,QAAM,QAAQ,GAAG,OAAO,UAAU;AAClC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,aAAa,eAAe,UAAU,iCAA4B,GAAG,OAAO,MAAM,SAAS;AAAA,EACvG;AACA,SAAO,iBAAiB,IAAI,OAAO,UAAU;AAC/C;AAGA,eAAsB,aAAa,OAAqC;AACtE,QAAM,IAAI,WAAW,KAAK;AAC1B,MAAI,CAAC,EAAE,GAAI,OAAM,IAAI,aAAa;AAAA,EAAgB,aAAa,EAAE,MAAM,CAAC,EAAE;AAC1E,QAAM,OAAO,MAAM,iBAAiB,EAAE,EAAG;AACzC,SAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AAChD;AASO,SAAS,aAA0B;AACxC,SAAO,oBAAoB,IAAI,CAAC,QAAQ;AAAA,IACtC;AAAA,IACA,OAAO,aAAa,EAAE;AAAA,IACtB,QAAQ,EAAE,GAAG,aAAa,EAAE,EAAE,OAAO;AAAA,EACvC,EAAE;AACJ;AAGO,SAAS,eAAwC;AACtD,SAAOC,GAAE,aAAa,YAAY;AACpC;","names":["z","base","base","JSZip","alpha","SLIDE_PART_RE","PPTX_MIME","JSZip","toHexByte","num","clamp01","alpha","out","transparency","num","num","num","run","num","alpha","num","num","W","H","base","Fragment","jsx","jsxs","jsx","jsxs","num","Fragment","paragraph","fittedFontSize","jsx","Fragment","jsx","jsxs","FONT_SIZE","Fragment","jsx","jsxs","jsx","jsx","jsxs","FONT_SIZE","LINE_RATIO","lay","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","GAP","cw","Fragment","jsx","jsxs","MAX_IMAGE_H","GAP","Fragment","jsx","jsxs","stableHash","baselineY","accentColor","jsx","Fragment","jsx","jsxs","FONT_SIZE","MIN_FONT_SIZE","resolveLayout","Fragment","jsx","jsxs","GAP","MIN_FONT_SIZE","jsx","jsxs","PAD","MIN_FONT_SIZE","BOTTOM_PAD","rows","Fragment","jsx","jsxs","MIN_FONT_SIZE","base","Fragment","Fragment","jsx","jsxs","GAP","ICON_SIZE","TITLE_FONT_SIZE","PAD_X","jsx","jsxs","TITLE_SIZE","num","jsx","jsxs","PAD","LABEL_GAP","DESC_SIZE","textX","jsx","jsxs","PAD_Y","TEXT_X","TITLE_SIZE","TEXT_SIZE","SUB_SIZE","ICON_SIZE","Fragment","jsx","jsxs","PAD_X","PAD_TOP","PAD_BOTTOM","CARD_RADIUS","GAP","TITLE_FONT_SIZE","TITLE_MIN_FONT_SIZE","TITLE_LINE_HEIGHT_RATIO","GAP_TITLE_TEXT","TEXT_FONT_SIZE","TEXT_MAX_LINES","TEXT_LINE_HEIGHT_RATIO","ROW_GAP","cardGeometry","renderVertical","jsx","jsxs","GAP","PAD_X","PAD_BOTTOM","CARD_RADIUS","BADGE_R","TITLE_SIZE","TITLE_LH","GAP_BADGE_TITLE","LABEL_SIZE","ROW_GAP","cardLayout","num","jsx","jsxs","CARD_GAP","PAD_X","PAD_TOP","CARD_RADIUS","TITLE_SIZE","TITLE_LH","PAD_BOTTOM","parseHex","cellLayout","jsx","jsxs","PAD_X","PAD_TOP","PAD_BOTTOM","CARD_RADIUS","BAR_H","TITLE_SIZE","TITLE_LH","GAP_TITLE_ROWS","LABEL_SIZE","TEXT_SIZE","ROW_GAP","roundedTopBarPath","jsx","jsxs","RX","PAD_X","ICON_SIZE","FONT_SIZE","PAD_Y","lay","jsx","jsxs","ROW","LABEL_FONT_SIZE","LABEL_MIN_FONT_SIZE","jsx","placed","Fragment","jsx","jsxs","W","H","textX","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","TITLE_X","TITLE_Y","Fragment","jsx","jsxs","BASELINE_FUDGE_RATIO","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","TITLE_Y","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","hasBgImage","Fragment","jsx","jsxs","mixHex","Fragment","Fragment","jsx","jsxs","placed","dropped","centredY","Fragment","Fragment","jsx","jsxs","LABEL_FONT_SIZE","LABEL_MIN_FONT_SIZE","kpi","Fragment","Fragment","jsx","jsxs","placed","textX","jsx","jsxs","Fragment","jsx","jsxs","KICKER_Y","Fragment","jsx","jsxs","KICKER_Y","Fragment","jsx","jsxs","BASELINE_FUDGE_RATIO","BADGE_FONT_SIZE","TITLE_X","TITLE_MAX_W","Fragment","jsx","jsxs","SUBHEADING_FONT_SIZE","SUBHEADING_MIN_FONT_SIZE","SUBHEADING_SLOT","Fragment","jsx","jsxs","CENTER_X","ACCENT_BAR_W","ACCENT_BAR_H","SUBHEADING_FONT_SIZE","SUBHEADING_MIN_FONT_SIZE","SUBHEADING_SLOT","Fragment","jsx","jsxs","hasBgImage","sectionLabel","heading","headingExtra","headingLastY","subheading","subheadingY","subheadingBudget","dividerY","contentRectY","contentRectH","Fragment","jsx","jsxs","BENTO_CARD_STROKE_WIDTH","SCALABLE_TYPES","BENTO_KPI_GLOW_RING1_OPACITY","BENTO_KPI_GLOW_RING2_OPACITY","budgetH","renderCell","Fragment","jsx","jsxs","Fragment","jsx","jsxs","BAR_H","Fragment","jsx","jsxs","Fragment","jsx","jsxs","ENDING_HEADING_LAST_BASELINE","ENDING_TWO_LINE_SHIFT_MAX","COPYRIGHT_FAINT","Fragment","jsx","jsxs","CENTER_X","ACCENT_BAR_W","ACCENT_BAR_H","Fragment","jsx","jsxs","hasBgImage","Fragment","jsx","jsxs","TITLE_Y","Fragment","jsx","jsxs","Fragment","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","hasBgImage","Fragment","jsx","jsxs","hasExplicitBackground","GRADIENT_FIELD_ID","Fragment","jsx","jsxs","steps","Fragment","jsx","jsxs","lcg","base","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","JSZip","errors","z"]}