lineadraw 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -13
- package/bin/lineadraw.mjs +193 -25
- package/dist/chunk-L4FNH35X.js +80 -0
- package/dist/chunk-L4FNH35X.js.map +1 -0
- package/dist/chunk-NCNZ7A6M.js +7957 -0
- package/dist/chunk-NCNZ7A6M.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/embedded-F5ZJYFHC.js +10 -0
- package/dist/embedded-F5ZJYFHC.js.map +1 -0
- package/dist/exportDxf-2HC6UIBS.js +8 -0
- package/dist/exportDxf-2HC6UIBS.js.map +1 -0
- package/dist/node-2RH2EKXG.js +255 -0
- package/dist/node-2RH2EKXG.js.map +1 -0
- package/dist/pkg/linea_dwg_bg.wasm +0 -0
- package/dist/sdk.d.ts +5925 -0
- package/dist/sdk.js +8165 -0
- package/dist/sdk.js.map +1 -0
- package/lib/init.mjs +3 -3
- package/lib/manifest.mjs +33 -67
- package/lineadraw.d.ts +1506 -177
- package/package.json +33 -5
- package/templates/tsconfig.json +3 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/export/dxf/exportDxf.ts","../../core/src/model/objects.ts","../../core/src/model/common.ts","../../core/src/model/fonts.ts","../../core/src/model/builtinLin.ts","../../core/src/model/lineTypes.ts","../../core/src/geometry/vec2.ts","../../core/src/extensions/paramLists.ts","../../core/src/model/blockDefinition.ts","../../core/src/extensions/evalBlock.ts","../../core/src/geometry/line.ts","../../core/src/transform.ts","../../core/src/extensions/blockDtos.ts","../../core/src/extensions/jsLiteral.ts","../../core/src/model/migrations.ts","../../core/src/extensions/scriptHelpers.ts","../../core/src/extensions/scriptRuntime.ts","../../core/src/model/objectLookup.ts","../../core/src/paint/dimensionGeometry.ts","../../core/src/paint/textMetrics.ts","../../core/src/paint/advanceTables.ts","../../core/src/paint/textMeasurer.ts","../../core/src/paint/textGeometry.ts","../../core/src/paint/tableLayout.ts","../../core/src/export/dxf/aci.ts","../../core/src/export/dxf/dxfExtras.ts","../../core/src/export/dxf/hatchPattern.ts"],"sourcesContent":["// Document → DXF (AC1021-era entities, mm units). Model space, every paper\n// layout (as *Paper_Space blocks + LAYOUT objects), and viewports (VIEWPORT\n// entities) are written. Hatches, leaders, and dimensions go out as native\n// entities; dimensions also carry a geometry block (exploded via the exact\n// painter geometry) so CAD apps that don't regenerate still show them.\n\nimport {\n DxfWriter,\n Units,\n LayerFlags,\n LWPolylineFlags,\n MTextAttachmentPoint,\n TextHorizontalAlignment,\n TextVerticalAlignment,\n HatchBoundaryPaths,\n HatchPolylineBoundary,\n HatchPredefinedPatterns,\n pattern,\n type DxfBlock,\n type DxfLayer,\n} from \"@tarikjabiri/dxf\";\nimport type { LineaDocument } from \"../../model/document\";\nimport type {\n DimStyle,\n ModelObject,\n Text,\n Viewport,\n} from \"../../model/objects\";\nimport {\n dimFontFace,\n dimStyleFor as dimStyleForObj,\n resolveTextStyle,\n} from \"../../model/objects\";\nimport { getLineType, LINE_TYPE_DEFS } from \"../../model/lineTypes\";\nimport type { Vec2 } from \"../../geometry/vec2\";\nimport { add, fromAngle, norm, perp, scale, sub } from \"../../geometry/vec2\";\nimport { getEvaluatedWorldChildren } from \"../../extensions/evalBlock\";\nimport { documentObjectResolver } from \"../../model/objectLookup\";\nimport { dimensionGeometry } from \"../../paint/dimensionGeometry\";\nimport {\n boundMeasurer,\n textBlock,\n type TextMeasurer,\n} from \"../../paint/textMetrics\";\nimport {\n fontFace,\n fontTypeface,\n parseFontFace,\n resolveFont,\n} from \"../../model/fonts\";\nimport { tableLayout } from \"../../paint/tableLayout\";\nimport { hexToTrueColor, nearestAci } from \"./aci\";\nimport {\n ViewportEntity,\n LayoutObject,\n MultiLeaderEntity,\n MLeaderStyleObject,\n} from \"./dxfExtras\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nimport { ANSI31_BASE_ANGLE_DEG, ANSI31_BASE_SPACING } from \"./hatchPattern\";\n\n/** DXF layer names must avoid a set of reserved characters. */\nconst sanitizeLayerName = (name: string): string =>\n name.replace(/[<>/\\\\\":;?*|=,`]/g, \"_\").trim() || \"0\";\n\nconst v3 = (p: Vec2) => ({ x: p.x, y: p.y, z: 0 });\n/** BLOCK group-70 bit: an external reference (the path rides in group 1). */\nconst XREF_BLOCK_FLAG = 4;\n\nconst H_ALIGN: Record<Text[\"hAlign\"], TextHorizontalAlignment> = {\n left: TextHorizontalAlignment.Left,\n center: TextHorizontalAlignment.Center,\n right: TextHorizontalAlignment.Right,\n};\n\n/** MTEXT attachment point 1–9 (TL TC TR / ML MC MR / BL BC BR). */\nconst mtextAttachment = (\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n): MTextAttachmentPoint => {\n const row = vAlign === \"top\" ? 0 : vAlign === \"center\" ? 3 : 6;\n const col = hAlign === \"left\" ? 1 : hAlign === \"center\" ? 2 : 3;\n return (row + col) as MTextAttachmentPoint;\n};\n\n/** Escape MTEXT specials, encode line breaks as \\P and tabs as ^I (the\n * caret control code AutoCAD stores tabs as — the import decodes it back). */\nconst escapeMtext = (s: string): string =>\n s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\{/g, \"\\\\{\")\n .replace(/\\}/g, \"\\\\}\")\n .replace(/\\n/g, \"\\\\P\")\n .replace(/\\t/g, \"^I\");\n\n/** LTYPE name a line type exports as (undefined = solid/continuous/unknown). */\nconst dxfLineTypeName = (lineType: string | undefined): string | undefined => {\n if (!lineType) return undefined;\n const p = getLineType(lineType);\n if (!p || p.dashesMm.length === 0) return undefined;\n return p.dxfName ?? p.name.toUpperCase();\n};\n\nconst DIM_STYLE_NAME = \"LINEA\";\n\ninterface ExportContext {\n doc: LineaDocument;\n /** Text width measurement (canvas-backed in the editor, font-metric in Node). */\n measure: TextMeasurer;\n writer: DxfWriter;\n layerNames: Map<string, string>;\n layerRecords: Map<string, DxfLayer>;\n skipped: Map<string, number>;\n exported: number;\n dimBlockCount: number;\n /** Write leaders as plain geometry instead of MULTILEADER objects (see\n * DxfExportOptions). */\n explodeLeaders: boolean;\n /** Handles for MULTILEADER references. */\n mleaderStyleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n /** Lazily created STYLE records, one per font id (name + handle). */\n textStyles: Map<string, { name: string; handle: string }>;\n /** Per-override DIMSTYLE records, keyed by resolved style values. */\n dimStyles: Map<string, string>;\n /** XREF block names by referenced path (one block per linked file). */\n xrefBlocks: Map<string, string>;\n}\n\nexport interface DxfExportResult {\n content: string;\n exported: number;\n skipped: Map<string, number>;\n}\n\nconst optionsFor = (obj: ModelObject, ctx: ExportContext) => {\n // We render dashes width-proportionally (pattern × resolved lineweight ×\n // CELTSCALE); DXF consumers render pattern × group 48. Fold the width in\n // so AutoCAD shows the same dash lengths the user saw (import divides it\n // back out — round-trips are exact). Emitted only when the effective line\n // type actually dashes — continuous entities don't need the noise.\n const layer = ctx.doc.layers.find((l) => l.id === obj.layerId);\n const dashed =\n (getLineType(obj.lineType ?? layer?.lineType ?? \"\")?.dashesMm.length ?? 0) >\n 0;\n const lineTypeScale =\n (obj.lineTypeScale ?? 1) * (obj.lineWidth ?? layer?.lineWidth ?? 0.25);\n const trueColor = obj.color ? hexToTrueColor(obj.color) : null;\n return {\n layerName: ctx.layerNames.get(obj.layerId) ?? \"0\",\n // Both color forms: nearest ACI (62) for legacy viewers, exact true\n // color (420) which wins wherever it is supported.\n ...(obj.color ? { colorNumber: nearestAci(obj.color) } : {}),\n ...(trueColor !== null ? { trueColor: String(trueColor) } : {}),\n ...(dxfLineTypeName(obj.lineType)\n ? { lineType: dxfLineTypeName(obj.lineType) }\n : {}),\n ...(dashed && lineTypeScale !== 1 ? { lineTypeScale } : {}),\n };\n};\n\n/** Arrowhead geometry mirroring paintArrowhead's styles. */\nconst addArrowhead = (\n space: DxfBlock,\n tip: Vec2,\n toward: Vec2,\n size: number,\n type: DimStyle[\"arrowType\"],\n opts: object,\n) => {\n if (type === \"none\") return;\n const dir = norm(sub(toward, tip));\n if (dir.x === 0 && dir.y === 0) return;\n switch (type) {\n case \"filled\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(tip) },\n { point: v3(add(base, half)) },\n { point: v3(sub(base, half)) },\n ],\n { flags: LWPolylineFlags.Closed, ...opts },\n );\n break;\n }\n case \"open\": {\n const base = add(tip, scale(dir, size));\n const half = scale(perp(dir), size / 3);\n space.addLWPolyline(\n [\n { point: v3(add(base, half)) },\n { point: v3(tip) },\n { point: v3(sub(base, half)) },\n ],\n opts,\n );\n break;\n }\n case \"tick\": {\n const diag = scale(norm(add(dir, perp(dir))), size / 2);\n space.addLine(v3(sub(tip, diag)), v3(add(tip, diag)), opts);\n break;\n }\n case \"dot\":\n space.addCircle(v3(tip), size / 4, opts);\n break;\n }\n};\n\n/** STYLE record for a font FACE (id + bold/italic), created on first use\n * (fonts are exported as TTF references by file name — never embedded, like\n * AutoCAD). Bold/italic ride as the ACAD xdata flags (injectStyleTypefaces),\n * so the receiving CAD picks its own installed bold/italic face. */\nconst textStyleFor = (\n ctx: ExportContext,\n font: string | undefined,\n): { name: string; handle: string } => {\n const def = resolveFont(font);\n const { bold, italic } = parseFontFace(font);\n const suffix = (bold ? \"B\" : \"\") + (italic ? \"I\" : \"\");\n const key = fontFace(def.id, bold, italic)!;\n let rec = ctx.textStyles.get(key);\n if (!rec) {\n const style = ctx.writer.document.tables.styleTable.addStyle(\n `LINEA_${def.id.toUpperCase()}${suffix ? `_${suffix}` : \"\"}`,\n );\n style.fontFileName = def.dxfFontFile;\n rec = { name: style.name, handle: style.handle };\n ctx.textStyles.set(key, rec);\n }\n return rec;\n};\n\ninterface TextFontOpts {\n styleName?: string;\n font?: string;\n widthFactor?: number;\n}\n\nconst addTextLines = (\n space: DxfBlock,\n content: string,\n position: Vec2,\n height: number,\n rotation: number,\n hAlign: Text[\"hAlign\"],\n vAlign: Text[\"vAlign\"],\n opts: object,\n measure: TextMeasurer,\n /** MTEXT reference rectangle width (mm); forces an MTEXT with word-wrap. */\n mtextWidth?: number,\n fontOpts: TextFontOpts = {},\n) => {\n const { styleName, font, widthFactor = 1 } = fontOpts;\n // Wrap decisions must use the font the receiving CAD will render with.\n const m = boundMeasurer(measure, font, widthFactor);\n const block = textBlock(content, height, m, mtextWidth);\n if (\n block.lines.length > 1 ||\n (mtextWidth !== undefined && mtextWidth > 0) ||\n content.includes(\"\\t\")\n ) {\n // Multi-line, width-constrained, or TABBED content stays ONE entity:\n // MTEXT with \\P line breaks / ^I tabs and (when set) a reference\n // rectangle width (group 41). (TEXT has no tab semantics at all.)\n // Width factor has no MTEXT group code — it rides as an inline \\W code.\n const value =\n (widthFactor !== 1 ? `\\\\W${widthFactor};` : \"\") + escapeMtext(content);\n const mtext = space.addMText(v3(position), height, value, {\n rotation: rotation * RAD2DEG,\n attachmentPoint: mtextAttachment(hAlign, vAlign),\n ...(mtextWidth !== undefined && mtextWidth > 0\n ? { width: mtextWidth }\n : {}),\n ...opts,\n });\n if (styleName) mtext.textStyle = styleName;\n return;\n }\n const down = scale(perp(fromAngle(rotation)), -1);\n block.lines.forEach((line, i) => {\n if (!line) return;\n const anchor = add(position, scale(down, i * block.lineHeight));\n const text = space.addText(v3(anchor), height, line, {\n rotation: rotation * RAD2DEG,\n horizontalAlignment: H_ALIGN[hAlign],\n verticalAlignment:\n vAlign === \"center\"\n ? TextVerticalAlignment.Middle\n : vAlign === \"top\"\n ? TextVerticalAlignment.Top\n : TextVerticalAlignment.BaseLine,\n // DXF quirk: aligned text positions via the second alignment point.\n secondAlignmentPoint: v3(anchor),\n ...(widthFactor !== 1 ? { relativeXScaleFactor: widthFactor } : {}),\n ...opts,\n });\n if (styleName) text.textStyle = styleName;\n });\n};\n\n/**\n * Built-in pattern name → DXF predefined pattern. They share names; the enum\n * keys use underscores where the .pat uses hyphens (AR-CONC → AR_CONC). Any\n * name the writer doesn't know falls back to ANSI31.\n */\nconst dxfPatternName = (name: string): HatchPredefinedPatterns => {\n const key = name\n .toUpperCase()\n .replace(/-/g, \"_\")\n .replace(/\\./g, \"_\") as keyof typeof HatchPredefinedPatterns;\n return HatchPredefinedPatterns[key] ?? HatchPredefinedPatterns.ANSI31;\n};\n\nconst writeHatch = (space: DxfBlock, obj: ModelObject, opts: object) => {\n if (obj.type !== \"hatch\") return;\n // Gradient exports as a SOLID in the gradient's own start color (the\n // entity color would otherwise be the object/layer color, which a\n // gradient fill never shows).\n if (obj.fill.kind === \"gradient\") {\n opts = {\n ...opts,\n colorNumber: nearestAci(obj.fill.color1),\n trueColor: String(hexToTrueColor(obj.fill.color1)),\n };\n }\n const boundary = new HatchBoundaryPaths();\n for (const loop of obj.loops) {\n boundary.addPolylineBoundary(\n new HatchPolylineBoundary(\n loop.points.map((v) => ({ x: v.x, y: v.y, bulge: v.bulge })),\n ),\n );\n }\n const fill =\n // Gradient exports as SOLID in the start color — DXF gradient data\n // (codes 450+) is beyond dxf-writer, and a solid keeps the region and\n // its boundary intact in the receiving CAD.\n obj.fill.kind === \"solid\" || obj.fill.kind === \"gradient\"\n ? pattern({ name: HatchPredefinedPatterns.SOLID })\n : obj.fill.kind === \"pattern\"\n ? // The curated library names are the standard predefined patterns, so\n // this is a direct mapping; fill.angle/scale ARE the DXF rotation\n // (code 52) and scale (code 41).\n pattern({\n name: dxfPatternName(obj.fill.name),\n angle: obj.fill.angle * RAD2DEG,\n scale: obj.fill.scale * obj.scale,\n })\n : pattern({\n name: HatchPredefinedPatterns.ANSI31,\n angle: obj.fill.angle * RAD2DEG - ANSI31_BASE_ANGLE_DEG,\n // obj.scale is baked into the pattern scale (like text height).\n scale: (obj.fill.spacing * obj.scale) / ANSI31_BASE_SPACING,\n });\n space.addHatch(boundary, fill, opts);\n};\n\n/** The painter's exact dimension output as plain entities (block content or,\n * for the explode path, straight into the target space). */\nconst writeDimensionGeometry = (\n target: DxfBlock,\n geom: NonNullable<ReturnType<typeof dimensionGeometry>>,\n opts: object,\n ctx: ExportContext,\n): void => {\n for (const seg of [...geom.extensionLines, ...geom.dimLines])\n target.addLine(v3(seg.a), v3(seg.b), opts);\n if (geom.dimArc)\n target.addArc(\n v3(geom.dimArc.center),\n geom.dimArc.radius,\n geom.dimArc.startAngle * RAD2DEG,\n geom.dimArc.endAngle * RAD2DEG,\n opts,\n );\n for (const arrow of geom.arrows)\n addArrowhead(\n target,\n arrow.tip,\n arrow.toward,\n arrow.size,\n geom.arrowType,\n opts,\n );\n for (const text of geom.texts)\n addTextLines(\n target,\n text.content,\n text.anchor,\n text.height,\n text.rotation,\n \"center\",\n \"center\",\n opts,\n ctx.measure,\n undefined,\n {\n styleName: textStyleFor(ctx, text.font).name,\n font: text.font,\n widthFactor: text.widthFactor,\n },\n );\n};\n\n/** DIMSTYLE mirroring a resolved dim style (base values UNSCALED; the\n * object's scale rides as DIMSCALE, exactly AutoCAD's semantics). Records\n * are cached by value so identical overrides share one style. */\nconst dimStyleFor = (\n ctx: ExportContext,\n style: DimStyle & { scale?: number },\n): string => {\n const scale = style.scale ?? 1;\n const key = JSON.stringify([\n style.arrowSize,\n style.arrowType,\n style.extensionOffset,\n style.extensionOvershoot,\n style.textHeight,\n style.textOffset,\n style.precision,\n dimFontFace(style),\n scale,\n ]);\n let name = ctx.dimStyles.get(key);\n if (name) return name;\n name =\n ctx.dimStyles.size === 0\n ? DIM_STYLE_NAME\n : `${DIM_STYLE_NAME}_${ctx.dimStyles.size}`;\n const rec = ctx.writer.addDimStyle(name);\n rec.DIMASZ = style.arrowSize;\n rec.DIMEXO = style.extensionOffset;\n rec.DIMEXE = style.extensionOvershoot;\n rec.DIMTXT = style.textHeight;\n rec.DIMGAP = style.textOffset;\n rec.DIMDEC = style.precision;\n if (scale !== 1) rec.DIMSCALE = scale;\n if (style.arrowType !== \"filled\") rec.DIMBLK = DIMBLK_NAMES[style.arrowType];\n rec.DIMTXSTY = textStyleFor(ctx, dimFontFace(style)).handle;\n ctx.dimStyles.set(key, name);\n return name;\n};\n\n// Standard arrowhead block names (\"\" = ClosedFilled, the default).\nconst DIMBLK_NAMES: Record<DimStyle[\"arrowType\"], string> = {\n filled: \"\",\n open: \"_OPEN\",\n tick: \"_ARCHTICK\",\n dot: \"_DOT\",\n none: \"_NONE\",\n};\n\nconst writeDimension = (\n space: DxfBlock,\n obj: ModelObject,\n opts: object,\n ctx: ExportContext,\n): boolean => {\n if (obj.type !== \"dimension\") return false;\n\n // Chained linear dimensions have no DXF counterpart — AutoCAD models\n // chains as one DIMENSION per measured pair; emit the same.\n if (obj.kind === \"linear\" && obj.points.length > 2) {\n let any = false;\n for (let i = 0; i + 1 < obj.points.length; i++) {\n const pair = { ...obj, points: obj.points.slice(i, i + 2) };\n any = writeDimension(space, pair, opts, ctx) || any;\n }\n return any;\n }\n\n const geom = dimensionGeometry(obj, ctx.doc.dimStyles);\n if (!geom) return false;\n\n // Geometry block: the painter's exact output, so CAD apps that don't\n // regenerate dimensions still display what the user saw.\n const blockName = `LINEA_DIM_${ctx.dimBlockCount++}`;\n const block = ctx.writer.addBlock(blockName);\n writeDimensionGeometry(block, geom, opts, ctx);\n\n // Style: the document's FIRST style, or a per-object record (referenced\n // named style + overrides) so a regenerating CAD reproduces the object's\n // scale/precision/arrows too (the annotation scale rides as DIMSCALE).\n const styleName =\n obj.styleId || obj.styleOverride || obj.scale !== 1\n ? dimStyleFor(ctx, {\n ...dimStyleForObj(obj, ctx.doc.dimStyles),\n ...obj.styleOverride,\n scale: obj.scale,\n })\n : DIM_STYLE_NAME;\n\n const dimOpts = {\n blockName,\n text: geom.texts[0]?.content,\n styleName,\n // Text middle point (group 11) — without it a regenerating CAD places\n // the value at the style default instead of where the user saw it.\n ...(geom.texts[0] ? { middlePoint: v3(geom.texts[0].anchor) } : {}),\n ...opts,\n };\n switch (obj.kind) {\n case \"angular\": {\n const [vertex, a, b] = obj.points;\n space.addAngularPointsDim(v3(vertex), v3(a), v3(b), {\n ...dimOpts,\n definitionPoint: v3(add(vertex, obj.offset)),\n });\n break;\n }\n case \"radial\": {\n // DXF radial: definition point (10) = center, 15 = point on the curve.\n const [center, p] = obj.points;\n space.addRadialDim(v3(p), v3(center), dimOpts);\n break;\n }\n case \"diameter\": {\n const [p1, p2] = obj.points;\n space.addDiameterDim(v3(p1), v3(p2), dimOpts);\n break;\n }\n case \"linear\": {\n // The measuring axis is perp(offset) → a DXF ROTATED linear dim.\n const [p1, p2] = obj.points;\n const upLen = Math.hypot(obj.offset.x, obj.offset.y);\n const u =\n upLen > 1e-9 ? perp(scale(obj.offset, 1 / upLen)) : norm(sub(p2, p1));\n space.addLinearDim(v3(p1), v3(p2), {\n ...dimOpts,\n definitionPoint: v3(geom.dimLines[0].b),\n angle: Math.atan2(u.y, u.x) * RAD2DEG,\n });\n break;\n }\n }\n return true;\n};\n\nconst writeObject = (\n space: DxfBlock,\n obj: ModelObject,\n ctx: ExportContext,\n): void => {\n const opts = optionsFor(obj, ctx);\n switch (obj.type) {\n case \"line\":\n space.addLine(v3(obj.a), v3(obj.b), opts);\n break;\n case \"point\":\n space.addPoint(obj.p.x, obj.p.y, 0, opts);\n break;\n case \"polyline\":\n space.addLWPolyline(\n obj.points.map((v) => ({\n point: { x: v.x, y: v.y },\n bulge: v.bulge,\n })),\n {\n flags: obj.closed ? LWPolylineFlags.Closed : LWPolylineFlags.None,\n ...opts,\n },\n );\n break;\n case \"circle\":\n space.addCircle(v3(obj.center), obj.radius, opts);\n break;\n case \"arc\":\n space.addArc(\n v3(obj.center),\n obj.radius,\n obj.startAngle * RAD2DEG,\n obj.endAngle * RAD2DEG,\n opts,\n );\n break;\n case \"ellipse\":\n space.addEllipse(\n v3(obj.center),\n v3(obj.majorAxis), // relative to center, per DXF\n obj.ratio,\n obj.startAngle,\n obj.endAngle,\n opts,\n );\n break;\n case \"hatch\":\n writeHatch(space, obj, opts);\n break;\n case \"text\": {\n // Effective style (document style + overrides) — the font is baked\n // into the STYLE reference so receiving CADs render the same.\n const eff = resolveTextStyle(obj, ctx.doc.textStyles);\n const { arrowSize, arrowType } = eff;\n const face = fontFace(eff.font, eff.bold, eff.italic);\n if (obj.leaderLines.length > 0 && ctx.explodeLeaders) {\n // Explode path (DWG transcode): leader lines + arrowheads as plain\n // geometry; the note itself falls through to the TEXT/MTEXT write.\n for (const line of obj.leaderLines) {\n space.addLWPolyline(\n line.map((v) => ({ point: { x: v.x, y: v.y } })),\n opts,\n );\n addArrowhead(\n space,\n line[0],\n line[1],\n arrowSize * obj.scale,\n arrowType,\n opts,\n );\n }\n } else if (obj.leaderLines.length > 0) {\n // One MULTILEADER carries the leader lines + the note text. Line\n // vertices stop before the shared junction (the LEADER node's\n // \"last point\"); the junction→text gap doubles as the dogleg, and\n // the object's scale maps to MLEADER's overall scale.\n const first = obj.leaderLines[0];\n const junction = first[first.length - 1];\n const toText = {\n x: obj.position.x - junction.x,\n y: obj.position.y - junction.y,\n };\n const gap = Math.max(Math.hypot(toText.x, toText.y), 1e-6);\n const lines = obj.leaderLines.map((line) => {\n const last = line[line.length - 1];\n const joins =\n Math.hypot(last.x - junction.x, last.y - junction.y) < 1e-9;\n return joins && line.length > 1 ? line.slice(0, -1) : line;\n });\n const entity = new MultiLeaderEntity({\n lines,\n junction,\n doglegDirection: { x: toText.x / gap, y: toText.y / gap },\n doglegLength: gap,\n content: escapeMtext(obj.content),\n textHeight: eff.textHeight,\n arrowSize,\n overallScale: obj.scale,\n textLocation: obj.position,\n styleHandle: ctx.mleaderStyleHandle,\n textStyleHandle: textStyleFor(ctx, face).handle,\n lineTypeHandle: ctx.lineTypeHandle,\n });\n entity.layerName = ctx.layerNames.get(obj.layerId) ?? \"0\";\n if (obj.color) {\n entity.colorNumber = nearestAci(obj.color);\n const tc = hexToTrueColor(obj.color);\n if (tc !== null) entity.trueColor = String(tc);\n }\n space.addEntity(entity);\n break;\n }\n // Model alignment is the DXF justification (which edge sits on the\n // point). TEXT has no scale concept, so the effective height is baked\n // in.\n addTextLines(\n space,\n obj.content,\n obj.position,\n eff.textHeight * obj.scale,\n obj.rotation,\n obj.hAlign,\n obj.vAlign,\n opts,\n ctx.measure,\n obj.width === undefined ? undefined : obj.width * obj.scale,\n {\n styleName: textStyleFor(ctx, face).name,\n font: face,\n widthFactor: eff.widthFactor,\n },\n );\n break;\n }\n case \"dimension\":\n if (!writeDimension(space, obj, opts, ctx)) {\n skip(ctx, \"dimension\");\n return;\n }\n break;\n case \"block\": {\n // Parametric instances have per-instance geometry — bake the\n // evaluated world children as plain entities.\n const children = getEvaluatedWorldChildren(\n obj,\n ctx.doc.blockDefinitions,\n documentObjectResolver(ctx.doc),\n ctx.doc,\n );\n if (children.length === 0) {\n skip(ctx, \"block\");\n return;\n }\n const before = ctx.exported;\n for (const child of children) {\n if (child.type === \"block\" || child.type === \"viewport\") continue;\n writeObject(space, child, ctx);\n }\n ctx.exported = before; // children count as one instance, not N entities\n break;\n }\n case \"table\": {\n // Baked like a block instance: the rules as LINEs, each cell as its\n // TEXT/MTEXT (native ACAD_TABLE export is a later phase).\n const before = ctx.exported;\n for (const child of tableLayout(obj, ctx.doc.textStyles).children)\n writeObject(space, child, ctx);\n ctx.exported = before;\n break;\n }\n case \"viewport\":\n // Handled by the layout writer; a viewport in model space is invalid.\n skip(ctx, \"viewport\");\n return;\n case \"image\":\n // DXF IMAGE entities reference EXTERNAL files (IMAGEDEF) — embedded\n // assets have no faithful mapping, so images are skipped explicitly.\n skip(ctx, \"image\");\n return;\n case \"reference\": {\n // DXF/DWG links become real XREFs (an xref BLOCK carrying the path +\n // an INSERT with the placement), so CAD apps resolve the same file.\n // Other formats (.linea, PDF, images) have no DXF xref — skipped, as\n // are switched-off references. ponytail: a clip isn't written\n // (XCLIP's SPATIAL_FILTER) — the xref arrives unclipped.\n if (\n obj.hidden ||\n (obj.format !== \"dxf\" && obj.format !== \"dwg\") ||\n obj.source.kind !== \"path\"\n ) {\n skip(ctx, \"reference\");\n return;\n }\n const path = obj.source.path;\n let blockName = ctx.xrefBlocks.get(path);\n if (!blockName) {\n blockName = `${sanitizeLayerName(obj.name)}${ctx.xrefBlocks.size > 0 ? `_${ctx.xrefBlocks.size}` : \"\"}`;\n const block = ctx.writer.addBlock(blockName);\n block.flags = XREF_BLOCK_FLAG as typeof block.flags;\n block.xrefPathName = path;\n ctx.xrefBlocks.set(path, blockName);\n }\n space.addInsert(blockName, v3(obj.position), {\n ...opts,\n scaleFactor: {\n x: obj.mirrored ? -obj.scale : obj.scale,\n y: obj.scale,\n z: obj.scale,\n },\n rotationAngle: (obj.rotation * 180) / Math.PI,\n });\n break;\n }\n case \"comment\":\n // Review annotation, not drawing content — no DXF mapping.\n skip(ctx, \"comment\");\n return;\n default:\n skip(ctx, (obj as ModelObject).type);\n return;\n }\n ctx.exported++;\n};\n\nconst skip = (ctx: ExportContext, type: string) =>\n ctx.skipped.set(type, (ctx.skipped.get(type) ?? 0) + 1);\n\nconst writeViewport = (\n space: DxfBlock,\n vp: Viewport,\n id: number,\n ctx: ExportContext,\n): void => {\n space.addEntity(\n new ViewportEntity({\n center: { x: vp.rect.x + vp.rect.w / 2, y: vp.rect.y + vp.rect.h / 2 },\n width: vp.rect.w,\n height: vp.rect.h,\n viewCenter: vp.modelCenter,\n // scale = the 1:N denominator (model mm per paper mm) → visible model\n // height.\n viewHeight: vp.rect.h * vp.scale,\n id,\n status: id,\n locked: vp.locked,\n frozenLayerHandles: vp.hiddenLayerIds\n .map((layerId) => ctx.layerRecords.get(layerId)?.handle)\n .filter((h): h is string => h !== undefined),\n }),\n );\n ctx.exported++;\n};\n\nexport interface DxfExportOptions {\n /**\n * Write leaders as plain geometry instead of MULTILEADER objects. Used by\n * the DWG path: acadrust's MULTILEADER DWG output is unproven in real\n * CADs (reported invisible) — exploded geometry always displays.\n */\n explodeLeaders?: boolean;\n}\n\n/**\n * Document → DXF text. Pure and headless: `measure` supplies text-width\n * measurement (canvas-backed in the editor, font-metric in Node). The editor\n * wraps this with the store read + file download + toast.\n */\nexport const buildDxf = (\n doc: LineaDocument,\n measure: TextMeasurer,\n options: DxfExportOptions = {},\n): DxfExportResult => {\n const writer = new DxfWriter();\n writer.setUnits(Units.Millimeters);\n\n // Linetype table (Continuous/ByLayer/ByBlock are predefined by the writer).\n // Emit the whole dashed catalogue — hidden scale variants included — so any\n // referenced LTYPE is defined; the signed dash sequence IS the DXF element\n // form (>0 dash, <0 gap, 0 dot).\n const emittedLtypes = new Set<string>();\n for (const p of LINE_TYPE_DEFS) {\n if (p.dashesMm.length === 0) continue;\n const dxfName = p.dxfName ?? p.name.toUpperCase();\n if (emittedLtypes.has(dxfName)) continue;\n emittedLtypes.add(dxfName);\n const descriptive = p.label.replace(/[^\\x20-\\x7e]/g, \"\").slice(0, 47);\n writer.addLType(dxfName, descriptive, p.dashesMm);\n }\n\n // Layers (nearest ACI + exact true color; visibility/locking as flags).\n const layerNames = new Map<string, string>();\n const layerRecords = new Map<string, DxfLayer>();\n // DXF layer names are unique case-insensitively; two Linea layers can\n // collide after sanitizing (\"A/B\" and \"A_B\") or in older documents that\n // already had duplicates — suffix the later ones instead of writing two\n // LAYER records with one name. \"0\" stays the shared default layer.\n const taken = new Set<string>([\"0\"]);\n for (const layer of doc.layers) {\n let name = sanitizeLayerName(layer.name);\n if (name !== \"0\") {\n const base = name;\n for (let i = 2; taken.has(name.toUpperCase()); i++) name = `${base}_${i}`;\n taken.add(name.toUpperCase());\n }\n layerNames.set(layer.id, name);\n if (name === \"0\") {\n const zero = writer.layer(\"0\");\n if (zero) layerRecords.set(layer.id, zero);\n continue;\n }\n const flags =\n (layer.visible ? 0 : LayerFlags.Frozen) |\n (layer.locked ? LayerFlags.Locked : 0);\n const record = writer.addLayer(\n name,\n nearestAci(layer.color),\n dxfLineTypeName(layer.lineType) ?? \"Continuous\",\n flags || undefined,\n );\n const tc = hexToTrueColor(layer.color);\n if (tc !== null) record.trueColor = tc;\n layerRecords.set(layer.id, record);\n }\n\n // MULTILEADER plumbing: leaders export as MULTILEADER, which references\n // an MLEADERSTYLE through the ACAD_MLEADERSTYLE dictionary.\n const textStyleHandle =\n writer.document.tables.styleTable.records.find((r) => r.name === \"Standard\")\n ?.handle ?? \"0\";\n const lineTypeHandle =\n writer.document.tables.ltypeTable.records.find((r) => r.name === \"ByBlock\")\n ?.handle ?? \"0\";\n const mleaderDict = writer.document.objects.addDictionary();\n writer.document.objects.addEntryToRoot(\n \"ACAD_MLEADERSTYLE\",\n mleaderDict.handle,\n );\n const mleaderStyle = writer.document.objects.addObject(\n new MLeaderStyleObject({\n name: \"Standard\",\n textStyleHandle,\n arrowSize: doc.dimStyles[0].arrowSize,\n textHeight: doc.dimStyles[0].textHeight,\n dictionaryHandle: mleaderDict.handle,\n }),\n );\n mleaderStyle.ownerObjecthandle = mleaderDict.handle;\n mleaderDict.addEntryObject(\"Standard\", mleaderStyle.handle);\n\n const ctx: ExportContext = {\n doc,\n measure,\n writer,\n layerNames,\n layerRecords,\n skipped: new Map(),\n exported: 0,\n dimBlockCount: 0,\n xrefBlocks: new Map(),\n explodeLeaders: options.explodeLeaders ?? false,\n mleaderStyleHandle: mleaderStyle.handle,\n textStyleHandle,\n lineTypeHandle,\n textStyles: new Map(),\n dimStyles: new Map(),\n };\n\n // Base dimension style mirroring the document's first dim style (the\n // record gets the plain LINEA name; per-dimension records add LINEA_1, …).\n dimStyleFor(ctx, doc.dimStyles[0]);\n\n // Model space.\n for (const obj of doc.objects)\n writeObject(writer.document.blocks.modelSpace, obj, ctx);\n\n // Paper layouts: the first uses the predefined *Paper_Space block, the\n // rest get their own; each gets a LAYOUT object so tabs survive.\n const layoutRecords: {\n name: string;\n blockRecordHandle: string;\n width: number;\n height: number;\n }[] = [];\n doc.layouts.forEach((layout, i) => {\n const space =\n i === 0 ? writer.document.blocks.paperSpace : writer.addPaperSpace();\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === space.name,\n );\n\n // The layout's own paper view is viewport id 1; real ones follow.\n writeViewport(\n space,\n {\n type: \"viewport\",\n id: \"paper\",\n layerId: \"\",\n rect: { x: 0, y: 0, w: layout.sheet.width, h: layout.sheet.height },\n modelCenter: { x: 0, y: 0 },\n scale: 1,\n locked: false,\n hiddenLayerIds: [],\n },\n 1,\n ctx,\n );\n ctx.exported--; // the paper view is bookkeeping, not user content\n\n let viewportId = 2;\n for (const obj of layout.objects) {\n if (obj.type === \"viewport\") writeViewport(space, obj, viewportId++, ctx);\n else writeObject(space, obj, ctx);\n }\n\n if (record) {\n layoutRecords.push({\n name: layout.name,\n blockRecordHandle: record.handle,\n width: layout.sheet.width,\n height: layout.sheet.height,\n });\n }\n });\n\n // LAYOUT objects (+ the mandatory Model entry) in an ACAD_LAYOUT dictionary.\n const objects = writer.document.objects;\n const layoutDict = objects.addDictionary();\n objects.addEntryToRoot(\"ACAD_LAYOUT\", layoutDict.handle);\n const modelRecord = writer.document.tables.blockRecordTable.records.find(\n (r) => r.name === \"*Model_Space\",\n );\n const entries = [\n {\n name: \"Model\",\n tabOrder: 0,\n width: 210,\n height: 297,\n blockRecordHandle: modelRecord?.handle ?? \"0\",\n },\n ...layoutRecords.map((l, i) => ({ ...l, tabOrder: i + 1 })),\n ];\n for (const entry of entries) {\n const layoutObj = objects.addObject(\n new LayoutObject({\n name: entry.name,\n tabOrder: entry.tabOrder,\n paperWidth: entry.width,\n paperHeight: entry.height,\n blockRecordHandle: entry.blockRecordHandle,\n }),\n );\n layoutObj.ownerObjecthandle = layoutDict.handle;\n layoutDict.addEntryObject(entry.name, layoutObj.handle);\n // Back-pointer: BLOCK_RECORD → its LAYOUT (group 340).\n const record = writer.document.tables.blockRecordTable.records.find(\n (r) => r.handle === entry.blockRecordHandle,\n );\n if (record) record.layoutObject = layoutObj.handle;\n }\n\n return {\n content: injectStyleTypefaces(writer.stringify(), ctx.textStyles),\n exported: ctx.exported,\n skipped: ctx.skipped,\n };\n};\n\n/**\n * STYLE records carry the font as a FILE name (group 3), but CAD apps\n * resolve installed TrueType fonts by FAMILY through the standard ACAD\n * xdata (1001 \"ACAD\" / 1000 typeface / 1071 flags) — the same convention\n * AutoCAD writes. Without it, a receiver warns about every style whose\n * literal file name it cannot find, even with the font family installed.\n * The writer library has no xdata on table records, so the groups are\n * spliced into the emitted text at the end of each of our STYLE records.\n */\nconst injectStyleTypefaces = (\n content: string,\n textStyles: Map<string, { name: string; handle: string }>,\n): string => {\n let out = content;\n for (const [fontId, rec] of textStyles) {\n const typeface = fontTypeface(resolveFont(fontId));\n // AutoCAD's packed font flags: italic 0x1000000, bold 0x2000000.\n const { bold, italic } = parseFontFace(fontId);\n const flags = (italic ? 0x1000000 : 0) | (bold ? 0x2000000 : 0);\n // Subclass marker anchors the search to a STYLE record (a user layer\n // could share the name).\n const marker = `\\nAcDbTextStyleTableRecord\\n2\\n${rec.name}\\n`;\n const at = out.indexOf(marker);\n if (at === -1) continue;\n // xdata must close the record — the record runs to the next STYLE or\n // the table's ENDTAB (a bare \"\\n0\\n\" also matches group-70 VALUES).\n const from = at + marker.length;\n const recordEnd = Math.min(\n ...[\"\\n0\\nSTYLE\", \"\\n0\\nENDTAB\"]\n .map((m) => out.indexOf(m, from))\n .filter((i) => i !== -1),\n );\n if (!Number.isFinite(recordEnd)) continue;\n out =\n out.slice(0, recordEnd) +\n `\\n1001\\nACAD\\n1000\\n${typeface}\\n1071\\n${flags}` +\n out.slice(recordEnd);\n }\n return out;\n};\n","import { z } from \"zod\";\nimport {\n ColorSchema,\n ObjectBaseSchema,\n Vec2Schema,\n type ObjectBase,\n} from \"./common\";\nimport { fontFace } from \"./fonts\";\n\n// Geometry is deliberately DXF-shaped so export/import stays a direct mapping.\n\n/**\n * DXF POINT. Paints as a round dot whose DIAMETER is the resolved lineWidth\n * (byLayer or override) — realized like a lineweight, so it stays paper-mm\n * through viewport transforms and clamps like a hairline on screen.\n */\nexport const PointSchema = ObjectBaseSchema.extend({\n type: z.literal(\"point\"),\n p: Vec2Schema,\n});\nexport type Point = z.infer<typeof PointSchema>;\n\nexport const LineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"line\"),\n a: Vec2Schema,\n b: Vec2Schema,\n});\nexport type Line = z.infer<typeof LineSchema>;\n\n/**\n * bulge = tan(sweep/4); 0 = straight segment, >0 CCW arc to the next vertex\n * (DXF LWPOLYLINE). Accepts [x, y, bulge?] as input (block scripts).\n */\nexport const PolylineVertexSchema = z.preprocess(\n (v) =>\n Array.isArray(v) && v.length >= 2\n ? { x: v[0], y: v[1], bulge: v[2] ?? 0 }\n : v,\n z.object({ x: z.number(), y: z.number(), bulge: z.number().default(0) }),\n);\nexport type PolylineVertex = z.infer<typeof PolylineVertexSchema>;\n\n// Note: there is no separate rectangle object — the Rectangle tool emits a\n// closed 4-vertex polyline (same as AutoCAD RECTANG).\nexport const PolylineSchema = ObjectBaseSchema.extend({\n type: z.literal(\"polyline\"),\n points: z.array(PolylineVertexSchema).min(2),\n closed: z.boolean().default(false),\n});\nexport type Polyline = z.infer<typeof PolylineSchema>;\n\nexport const CircleSchema = ObjectBaseSchema.extend({\n type: z.literal(\"circle\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n});\nexport type Circle = z.infer<typeof CircleSchema>;\n\n/** Runs CCW from startAngle to endAngle (DXF ARC convention). */\nexport const ArcSchema = ObjectBaseSchema.extend({\n type: z.literal(\"arc\"),\n center: Vec2Schema,\n radius: z.number().positive(),\n startAngle: z.number(),\n endAngle: z.number(),\n});\nexport type Arc = z.infer<typeof ArcSchema>;\n\n/** DXF ELLIPSE form: majorAxis is the endpoint vector from center; ratio = minor/major in (0,1]. */\nexport const EllipseSchema = ObjectBaseSchema.extend({\n type: z.literal(\"ellipse\"),\n center: Vec2Schema,\n majorAxis: Vec2Schema,\n ratio: z.number().gt(0).max(1),\n startAngle: z.number().default(0),\n endAngle: z.number().default(Math.PI * 2),\n});\nexport type Ellipse = z.infer<typeof EllipseSchema>;\n\nexport const HatchLoopSchema = z.object({\n points: z.array(PolylineVertexSchema).min(3),\n});\nexport type HatchLoop = z.infer<typeof HatchLoopSchema>;\n\nexport const HatchFillSchema = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"solid\") }),\n z.object({\n kind: z.literal(\"pattern\"),\n name: z.string(),\n angle: z.number(),\n scale: z.number().positive(),\n }),\n z.object({\n kind: z.literal(\"lines\"),\n angle: z.number(),\n spacing: z.number().positive(),\n }),\n z.object({\n kind: z.literal(\"gradient\"),\n /** linear = color1→color2 along `angle`; radial = color1 at the\n * boundary's center fading to color2 at its edge. */\n shape: z.enum([\"linear\", \"radial\"]).default(\"linear\"),\n color1: z.string().default(\"#808080\"),\n color2: z.string().default(\"#2d2d2d\"),\n /** Direction, radians CCW: 0 = color1 on the left (linear only). */\n angle: z.number().default(0),\n }),\n]);\n\n/** Owns copied boundary geometry (non-associative). loops[0] outer, rest holes (even-odd). */\nexport const HatchSchema = ObjectBaseSchema.extend({\n type: z.literal(\"hatch\"),\n loops: z.array(HatchLoopSchema).min(1),\n fill: HatchFillSchema.default({\n kind: \"lines\",\n angle: Math.PI / 4,\n spacing: 5,\n }),\n /** Pattern spacing multiplier (same idea as DimStyle.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Hatch = z.infer<typeof HatchSchema>;\n\n/** Arrowhead style (maps to the standard DXF DIMBLK arrowhead blocks). */\nconst ArrowTypeSchema = z.enum([\"filled\", \"open\", \"tick\", \"dot\", \"none\"]);\nexport type ArrowType = z.infer<typeof ArrowTypeSchema>;\n\n/**\n * A named document text style: everything a TEXT object inherits unless its\n * own `styleOverride` sets a key (same model as DimStyle for dimensions).\n * Documents carry an ARRAY of these; objects reference one by `styleId`\n * (absent/dangling = the first style). Font names are stored, never font\n * data — unknown names render in the default and round-trip.\n */\nexport const TextStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** AutoCAD-style width factor: horizontal glyph scale. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic face (bundled outlines where the font has them, else\n * synthesized — model/fonts.ts `fontFace`). Absent = regular. */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n /** Cap height in mm (world), before the object's `scale`. */\n textHeight: z.number().positive().default(2.5),\n /** Leader arrowhead style. */\n arrowType: ArrowTypeSchema.default(\"filled\"),\n /** Leader arrowhead size (mm), before the object's `scale`. */\n arrowSize: z.number().positive().default(2.5),\n});\nexport type TextStyle = z.infer<typeof TextStyleSchema>;\n\n/** The historic hard-coded fallbacks — documents that predate the field\n * default to this and render identically. */\nexport const DEFAULT_TEXT_STYLE: TextStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n arrowType: \"filled\",\n arrowSize: 2.5,\n};\n\n/**\n * Per-text style override: keys the user actually set, nothing else (same\n * discipline as DimStyleOverrideSchema — NOT .partial(), which would bake\n * defaults in and freeze the object against document-style edits).\n * Keep in sync with TextStyleSchema.\n */\nexport const TextStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n});\n\n/** The text style an object references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const textStyleFor = (\n obj: Pick<Text, \"styleId\">,\n styles: readonly TextStyle[],\n): TextStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_TEXT_STYLE;\n\n/** Referenced document style + the text's overrides. */\nexport const resolveTextStyle = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): TextStyle => ({ ...textStyleFor(obj, styles), ...obj.styleOverride });\n\n/** A text's effective font FACE (font id + bold/italic, as one face string\n * — model/fonts.ts) and widthFactor (override, else its style's). */\nexport const effectiveTextFont = (\n obj: Pick<Text, \"styleId\" | \"styleOverride\">,\n styles: readonly TextStyle[],\n): { font: string; widthFactor: number } => {\n const base = textStyleFor(obj, styles);\n const o = obj.styleOverride;\n return {\n font: fontFace(\n o?.font ?? base.font,\n o?.bold ?? base.bold,\n o?.italic ?? base.italic,\n )!,\n widthFactor: o?.widthFactor ?? base.widthFactor,\n };\n};\n\n/**\n * Text, optionally annotated with leader lines (MLEADER-style — the old\n * standalone \"leader\" type merged in at document v6). Each leader line is a\n * polyline with its arrowhead at [0]; by convention lines join at the first\n * line's last point (the junction), near the text.\n */\nexport const TextSchema = ObjectBaseSchema.extend({\n type: z.literal(\"text\"),\n position: Vec2Schema,\n content: z.string(),\n /** Arrow polylines pointing at this text (arrowhead at [0]). */\n leaderLines: z.array(z.array(Vec2Schema).min(2)).default([]),\n /**\n * Max text box width in mm (before `scale`) — the word-wrap boundary and the\n * frame width. Undefined = no wrapping (lines break only on explicit\n * newlines). Maps to the DXF MTEXT reference rectangle width.\n */\n width: z.number().positive().optional(),\n hAlign: z.enum([\"left\", \"center\", \"right\"]).default(\"center\"),\n vAlign: z.enum([\"bottom\", \"center\", \"top\"]).default(\"center\"),\n /** Border drawn around the text: a rectangle, a circle, a slot (rounded\n * ends), a line under the text or under its first line. */\n frame: z\n .enum([\"none\", \"rectangle\", \"circle\", \"slot\", \"bottom\", \"firstLine\"])\n .optional(),\n /** The document text style this text follows (absent/dangling = the\n * document's first style). */\n styleId: z.string().optional(),\n /** Style keys the user set on THIS text (font, height, arrows, …);\n * absent = inherit the referenced style. */\n styleOverride: TextStyleOverrideSchema.optional(),\n rotation: z.number().default(0),\n /** Size multiplier for height + arrow size (same idea as\n * Dimension.scale). */\n scale: z.number().positive().default(1),\n});\nexport type Text = z.infer<typeof TextSchema>;\n\nexport const DimensionKindSchema = z.enum([\n \"linear\",\n \"angular\",\n \"radial\",\n \"diameter\",\n]);\n\n/** A named document dimension style; documents carry an ARRAY of these and\n * dimensions reference one by `styleId` (absent/dangling = the first). */\nexport const DimStyleSchema = z.object({\n id: z.string().default(() => crypto.randomUUID()),\n name: z.string().default(\"Standard\"),\n /** Font id for dimension text (model/fonts.ts). */\n font: z.string().default(\"arial\"),\n /** Horizontal glyph scale for dimension text. */\n widthFactor: z.number().positive().default(1),\n /** Bold / italic dimension text (same faces as TextStyle). */\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().default(2.5),\n /** Dimension line → text center distance (mm, × scale; DXF DIMGAP-ish). */\n textOffset: z.number().default(1.8),\n arrowType: ArrowTypeSchema.default(\"tick\"),\n arrowSize: z.number().positive().default(2.5),\n /** \"long\" runs each extension line from the measured point to the\n * dimension line; \"short\" draws only a 2×overshoot tick across it. */\n extensionType: z.enum([\"long\", \"short\"]).default(\"long\"),\n extensionOffset: z.number().default(1),\n extensionOvershoot: z.number().default(1.25),\n /** Decimal places for the measurement text. */\n precision: z.number().int().min(0).max(6).default(1),\n});\nexport type DimStyle = z.infer<typeof DimStyleSchema>;\n\nexport const DEFAULT_DIM_STYLE: DimStyle = {\n id: \"standard\",\n name: \"Standard\",\n font: \"arial\",\n widthFactor: 1,\n textHeight: 2.5,\n textOffset: 1.8,\n arrowType: \"tick\",\n arrowSize: 2.5,\n extensionType: \"long\",\n extensionOffset: 1,\n extensionOvershoot: 1,\n precision: 1,\n};\n\n/**\n * Per-object style override: keys the user actually set, nothing else.\n * NOT DimStyleSchema.partial() — zod's partial() still applies field\n * defaults, which would bake EVERY style value into the override and freeze\n * the object against document-style edits. Keep in sync with DimStyleSchema.\n */\n// Deliberately LENIENT (unknown keys strip, zod default): a strict schema\n// would refuse to open documents saved by a newer Linea whose override\n// gained a key — forward compatibility wins at the document boundary. The\n// classic agent mistake (`styleOverride: { scale }` — annotation scale is\n// the object's top-level `scale` field) is caught loudly at the SDK/tool\n// mutation boundary instead, via unknownStyleOverrideKeys below.\nexport const DimStyleOverrideSchema = z.object({\n font: z.string().optional(),\n widthFactor: z.number().positive().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n textHeight: z.number().positive().optional(),\n textOffset: z.number().optional(),\n arrowType: ArrowTypeSchema.optional(),\n arrowSize: z.number().positive().optional(),\n extensionType: z.enum([\"long\", \"short\"]).optional(),\n extensionOffset: z.number().optional(),\n extensionOvershoot: z.number().optional(),\n precision: z.number().int().min(0).max(6).optional(),\n});\n\n/**\n * Unknown keys in a raw object INPUT's `styleOverride` — the SDK and agent\n * tools call this before parsing so a wrong key (the classic\n * `styleOverride: { scale }`; annotation scale is the object's TOP-LEVEL\n * `scale` field) errors loudly instead of being silently stripped by the\n * deliberately lenient schema.\n */\nexport const unknownStyleOverrideKeys = (\n input: Record<string, unknown>,\n): string[] => {\n const so = input.styleOverride;\n if (so === null || typeof so !== \"object\" || Array.isArray(so)) return [];\n const shape =\n input.type === \"dimension\"\n ? DimStyleOverrideSchema.shape\n : input.type === \"text\"\n ? TextStyleOverrideSchema.shape\n : null;\n if (!shape) return [];\n return Object.keys(so).filter((k) => !(k in shape));\n};\n\n/** Throwing form of unknownStyleOverrideKeys for mutation boundaries (the\n * SDK and the editor's agent tools). `where` prefixes the error. */\nexport const assertKnownStyleOverrideKeys = (\n input: Record<string, unknown>,\n where: string,\n): void => {\n const unknown = unknownStyleOverrideKeys(input);\n if (unknown.length === 0) return;\n const hint = unknown.includes(\"scale\")\n ? ' — annotation scale is the TOP-LEVEL \"scale\" field (scale: 50 for 1:50), not a style key'\n : \"\";\n throw new Error(\n `${where}: styleOverride: unknown key(s) ${unknown\n .map((k) => `\"${k}\"`)\n .join(\", \")}${hint}`,\n );\n};\n\n/** The dim style a dimension references: by `styleId`, else the document's\n * first (absent/dangling ids degrade gracefully). */\nexport const dimStyleFor = (\n obj: { styleId?: string },\n styles: readonly DimStyle[],\n): DimStyle =>\n styles.find((s) => s.id === obj.styleId) ?? styles[0] ?? DEFAULT_DIM_STYLE;\n\n/** A (resolved) dim style's text font FACE — font id + bold/italic as one\n * face string (model/fonts.ts), like effectiveTextFont for texts. */\nexport const dimFontFace = (\n style: Pick<DimStyle, \"font\" | \"bold\" | \"italic\">,\n): string => fontFace(style.font, style.bold, style.italic)!;\n\n/** Static (non-associative) definition points. Linear measures point to\n * point (the pre-v9 \"aligned\" behavior; the axis-locked variant is gone). */\nexport const DimensionSchema = ObjectBaseSchema.extend({\n type: z.literal(\"dimension\"),\n kind: DimensionKindSchema.default(\"linear\"),\n /**\n * Measured points. Linear dims with MORE than two points render as a\n * CHAIN: one measurement per consecutive pair, sharing the dimension\n * line (text placement is derived — see `offset`, not a text anchor).\n */\n points: z.array(Vec2Schema).min(1),\n /**\n * Dimension line placement, anchored at the kind's base point (points[0];\n * diameter: the points' midpoint): anchor + offset lies on the dimension\n * line (angular: on the arc — its length is the arc radius; radial /\n * diameter: at the text). The DIRECTION is set at creation and preserved\n * afterwards — the offset grip only rescales the length.\n */\n offset: Vec2Schema,\n textOverride: z.string().optional(),\n /** The document dimension style this dimension follows (absent/dangling =\n * the document's first style). */\n styleId: z.string().optional(),\n styleOverride: DimStyleOverrideSchema.optional(),\n /** Annotation size multiplier (text/arrows/offsets — same idea as\n * Text.scale; rides as DIMSCALE in DXF). */\n scale: z.number().positive().default(1),\n});\nexport type Dimension = z.infer<typeof DimensionSchema>;\n\nexport const BlockSchema = ObjectBaseSchema.extend({\n type: z.literal(\"block\"),\n definitionId: z.string(),\n /** Applied LAST, about the pivot (the first point input). */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Per-instance parameter values (merged over the definition defaults). */\n params: z\n .record(\n z.string(),\n z.union([\n z.number(),\n z.string(),\n z.boolean(),\n // numberList / stringList parameters.\n z.array(z.number()),\n z.array(z.string()),\n ]),\n )\n .default({}),\n /**\n * The values the script's `place` acquired at insertion, in pick\n * order: points in WORLD coords, or referenced object ids (strings —\n * phase 2). The first point is the instance's PIVOT — it plays the role\n * of the insertion point: `draw` receives inputs localized against it,\n * rotation/scale apply about it, and it snaps as an endpoint.\n * Transforms map the points and the script recomputes, which is what\n * makes mirror correct for script-derived geometry.\n */\n inputs: z.array(z.union([Vec2Schema, z.string()])).default([]),\n});\nexport type Block = z.infer<typeof BlockSchema>;\n\n/**\n * Review note pinned to a point. Pure editor chrome: the EDITOR paints it as\n * a screen-fixed speech-bubble marker (lucide MessageCircle outline, tail tip\n * at `position`) and hit-tests it in screen scale — there is no shared-path\n * painter, so comments never reach PDF/SVG/PNG exports or viewport\n * projections, and DXF export skips them explicitly.\n */\nexport const CommentSchema = ObjectBaseSchema.extend({\n type: z.literal(\"comment\"),\n /** Tail tip of the bubble (world/sheet mm). */\n position: Vec2Schema,\n text: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n});\nexport type Comment = z.infer<typeof CommentSchema>;\n\n/** One table cell (docs/table-object.md). Style keys absent = the table's,\n * then the document text style. */\nexport const TableCellSchema = z.object({\n /** Plain text; \"\\n\" = line break. Long lines wrap at the cell width. */\n text: z.string().default(\"\"),\n /** Merge, set on the ANCHOR (top-left) cell. Covered cells stay in the\n * grid with their content ignored — AutoCAD's model. */\n span: z\n .object({\n cols: z.number().int().min(1),\n rows: z.number().int().min(1),\n })\n .optional(),\n /** Where the text sits in the cell; absent = left / center. */\n hAlign: z.enum([\"left\", \"center\", \"right\"]).optional(),\n vAlign: z.enum([\"top\", \"center\", \"bottom\"]).optional(),\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n /** Text color; absent = the table's. */\n color: ColorSchema.optional(),\n});\nexport type TableCell = z.infer<typeof TableCellSchema>;\n\n/**\n * A table: a grid of text cells hanging right/down from `position` (the\n * top-left corner). Sizes are sheet mm before `scale`, like text. Rows grow\n * to fit their wrapped text (`minHeight` is the floor); the derived geometry\n * — rules + one text per cell, in world space — comes from paint/tableLayout\n * and feeds every consumer (painter, snapping, DXF).\n */\nexport const TableSchema = ObjectBaseSchema.extend({\n type: z.literal(\"table\"),\n position: Vec2Schema,\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n /** Column widths (mm). */\n columns: z.array(z.number().positive()).min(1),\n /** Per-row settings. Input may give a row COUNT (all auto-height). */\n rows: z.preprocess(\n (v) => (typeof v === \"number\" ? Array.from({ length: v }, () => ({})) : v),\n z.array(z.object({ minHeight: z.number().positive().optional() })).min(1),\n ),\n /** Row-major: `cells[row][column]`, exactly rows × columns. Input may\n * give a cell as a plain string (= `{ text }`). */\n cells: z.array(\n z.array(\n z.preprocess(\n (v) => (typeof v === \"string\" ? { text: v } : v),\n TableCellSchema,\n ),\n ),\n ),\n /** Rows above the heavier header rule. */\n headerRows: z.number().int().min(0).default(0),\n /** Text inset from the cell edges (mm). */\n cellMargin: z.number().min(0).default(1),\n borders: z.enum([\"all\", \"outer\", \"rows\", \"none\"]).default(\"all\"),\n /** Document text style for every cell (cells may override). */\n styleId: z.string().optional(),\n styleOverride: TextStyleOverrideSchema.optional(),\n}).superRefine((t, ctx) => {\n const issue = (message: string) => ctx.addIssue({ code: \"custom\", message });\n const nr = t.rows.length;\n const nc = t.columns.length;\n if (t.cells.length !== nr || t.cells.some((row) => row.length !== nc)) {\n issue(`cells must be ${nr} rows × ${nc} columns`);\n return;\n }\n // Every grid slot is covered by at most one merge, inside the grid.\n const owner: (string | null)[][] = t.cells.map((row) => row.map(() => null));\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n const s = cell.span;\n if (!s || (s.cols === 1 && s.rows === 1)) return;\n if (r + s.rows > nr || c + s.cols > nc) {\n issue(`cell ${r},${c}: span leaves the grid`);\n return;\n }\n for (let i = r; i < r + s.rows; i++)\n for (let j = c; j < c + s.cols; j++) {\n if (owner[i][j]) issue(`cell ${i},${j}: overlapping merges`);\n owner[i][j] = `${r},${c}`;\n }\n }),\n );\n});\nexport type Table = z.infer<typeof TableSchema>;\n\n/** The instance's pivot: its first point input, or the origin if none. */\nexport const blockPivot = (b: Block): { x: number; y: number } => {\n for (const v of b.inputs) if (typeof v !== \"string\") return v;\n return { x: 0, y: 0 };\n};\n\n/**\n * Paper-space window into model space (DXF VIEWPORT). Only meaningful inside\n * a layout's object collection — never in model space or block children.\n */\nexport const ViewportSchema = ObjectBaseSchema.extend({\n type: z.literal(\"viewport\"),\n /** Placement on the sheet, mm, origin bottom-left of sheet. */\n rect: z.object({\n x: z.number(),\n y: z.number(),\n w: z.number().positive(),\n h: z.number().positive(),\n }),\n /** World point shown at the center of the rect. */\n modelCenter: Vec2Schema.default({ x: 0, y: 0 }),\n /** Drawing-scale denominator (model mm per paper mm); 1:50 => 50. */\n scale: z.number().positive().default(1),\n /** Pinned: no pan/zoom-through, no move/resize grips. */\n locked: z.boolean().default(false),\n hiddenLayerIds: z.array(z.string()).default([]),\n});\nexport type Viewport = z.infer<typeof ViewportSchema>;\n\n/**\n * Raster reference (uploaded PNG/JPEG, or a PDF page rasterized at import).\n * The pixels live in the document's `assets` map (data URL, content-hash\n * keyed — instances of the same image share one entry); the object is just\n * the placement. No DXF mapping (DXF IMAGE references external files) — the\n * exporter skips it explicitly.\n */\nexport const ImageSchema = ObjectBaseSchema.extend({\n type: z.literal(\"image\"),\n /** Key into `document.assets`. */\n assetId: z.string(),\n /** Bottom-left corner (world/sheet mm) — rotation pivots here. */\n origin: Vec2Schema,\n width: z.number().positive(),\n height: z.number().positive(),\n /** Radians CCW about `origin`. */\n rotation: z.number().default(0),\n // (opacity moved to ObjectBaseSchema — every object paints with it now;\n // documents that stored it per-image parse unchanged.)\n});\nexport type ImageObject = z.infer<typeof ImageSchema>;\n\n/** File formats a reference can link (docs/references.md). */\nexport const REFERENCE_FORMATS = [\n \"linea\",\n \"dxf\",\n \"dwg\",\n \"pdf\",\n \"png\",\n \"jpg\",\n] as const;\nexport type ReferenceFormat = (typeof REFERENCE_FORMATS)[number];\n\n/**\n * Where a reference's file lives. `path`: stored relative to the document's\n * folder when inside it (POSIX separators), else absolute; on the web, where\n * paths can't be read, the file's NAME plus `cacheKey` — this browser's copy\n * of the bytes. `url`: fetched.\n */\nexport const ReferenceSourceSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"path\"),\n path: z.string().min(1),\n cacheKey: z.string().min(1).optional(),\n }),\n z.object({ kind: z.literal(\"url\"), url: z.string().url() }),\n]);\nexport type ReferenceSource = z.infer<typeof ReferenceSourceSchema>;\n\n/**\n * A LINKED file drawn in place (an xref): the document holds this record,\n * never the file. The file's model space lands with its origin at\n * `position`, rotated, scaled and optionally mirrored (about its X axis).\n */\nexport const ReferenceSchema = ObjectBaseSchema.extend({\n type: z.literal(\"reference\"),\n format: z.enum(REFERENCE_FORMATS),\n name: z.string().min(1),\n source: ReferenceSourceSchema,\n position: Vec2Schema,\n /** Radians CCW about `position`. */\n rotation: z.number().default(0),\n scale: z.number().positive().default(1),\n mirrored: z.boolean().optional(),\n /** PDF: the 1-based page drawn, and how (vector lines + text / raster). */\n pdfPage: z.number().int().positive().optional(),\n pdfMode: z.enum([\"vector\", \"raster\"]).optional(),\n /** The FILE's layers not drawn, by name (stable across reloads). */\n hiddenLayers: z.array(z.string()).default([]),\n /** Switched off in the References panel: not drawn, picked or snapped. */\n hidden: z.boolean().optional(),\n /** Locked in the References panel: drawn and snapped, but never hovered\n * or picked on the canvas — select it from the panel instead. */\n locked: z.boolean().optional(),\n /** Crop rectangle in FILE coordinates: only content inside is drawn and\n * snapped (AutoCAD's XCLIP, rectangular). */\n clip: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n /**\n * The content's bounds in file coordinates, recorded on each successful\n * load: a missing file still has a frame to draw, pick and snap to.\n */\n extent: z\n .object({\n minX: z.number(),\n minY: z.number(),\n maxX: z.number(),\n maxY: z.number(),\n })\n .optional(),\n});\nexport type ReferenceObject = z.infer<typeof ReferenceSchema>;\n\n/**\n * The property clipboard's cross-type transferable look: the shared\n * ObjectBase style fields. Never `id`, never geometry. There are NO per-type\n * property schemas — the clipboard payload is validated as a whole document\n * and apply only copies values between already-valid objects, so all that's\n * needed is these key lists (typed against the model so a renamed field\n * fails the compile). See docs/clipboard-copy-paste.md.\n */\nexport const BASE_PROPERTY_KEYS = [\n \"color\",\n \"lineType\",\n \"lineTypeScale\",\n \"lineWidth\",\n \"opacity\",\n] as const satisfies readonly (keyof ObjectBase)[];\n\n/**\n * Type-specific look keys — transfer ONLY between objects of the SAME type\n * (shared key names lie across types: text/dimension `styleId` index\n * different style arrays; `scale` means pattern spacing / annotation size /\n * instance scale depending on type). Types not listed transfer base keys\n * only.\n */\nexport const EXTRA_PROPERTY_KEYS: {\n [K in ModelObjectType]?: readonly (keyof Extract<ModelObject, { type: K }>)[];\n} = {\n text: [\"hAlign\", \"vAlign\", \"frame\", \"styleId\", \"styleOverride\", \"scale\"],\n dimension: [\"styleId\", \"styleOverride\", \"scale\"],\n hatch: [\"fill\", \"scale\"],\n};\n\nexport const ModelObjectSchema = z.discriminatedUnion(\"type\", [\n PointSchema,\n LineSchema,\n PolylineSchema,\n CircleSchema,\n ArcSchema,\n EllipseSchema,\n HatchSchema,\n TextSchema,\n DimensionSchema,\n BlockSchema,\n ImageSchema,\n ViewportSchema,\n CommentSchema,\n TableSchema,\n ReferenceSchema,\n]);\nexport type ModelObject = z.infer<typeof ModelObjectSchema>;\nexport type ModelObjectType = ModelObject[\"type\"];\n\n/** An object before an id is assigned (creation input). */\nexport type ModelObjectDto = {\n [K in ModelObjectType]: Omit<Extract<ModelObject, { type: K }>, \"id\">;\n}[ModelObjectType];\n","import { z } from \"zod\";\n\n/**\n * World units are millimeters, Y-up. Angles in radians, CCW.\n * Accepts [x, y] as input for script ergonomics (block scripts); always\n * parses to {x, y}.\n */\nexport const Vec2Schema = z.preprocess(\n (v) => (Array.isArray(v) && v.length >= 2 ? { x: v[0], y: v[1] } : v),\n z.object({ x: z.number(), y: z.number() }),\n);\nexport type Vec2 = z.infer<typeof Vec2Schema>;\n\n/** Hex color like #rrggbb. */\nexport const ColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/);\n\n/**\n * Properties shared by every model object.\n * color/lineWidth/lineType undefined = inherit from the layer (\"byLayer\").\n * lineWidth is a paper-space lineweight in mm (CAD convention).\n */\nexport const ObjectBaseSchema = z.object({\n id: z.string(),\n layerId: z.string(),\n color: ColorSchema.optional(),\n lineType: z.string().optional(),\n /** Extra dash-pattern multiplier on top of the width-proportional scale\n * (CAD CELTSCALE). Dash patterns are defined per 1 mm of line width and\n * scale by the resolved lineweight; this multiplies that. undefined = 1. */\n lineTypeScale: z.number().positive().optional(),\n lineWidth: z.number().positive().optional(),\n /** Paint opacity 0..1 across canvas/SVG/PDF. undefined = opaque. */\n opacity: z.number().min(0).max(1).optional(),\n});\nexport type ObjectBase = z.infer<typeof ObjectBaseSchema>;\n","// The bundled font registry. Documents store font NAMES (ids), never font\n// data — same model as DXF/DWG, where a text style references \"arial.ttf\"\n// and missing fonts substitute. Unknown ids resolve to the default font for\n// display but are preserved in the model, so foreign names round-trip.\n// Background + the full design: docs/fonts.md.\n\nexport type FontId =\n | \"arial\"\n | \"osifont\"\n | \"osifont-italic\"\n | \"jetbrains-mono\"\n | \"source-serif\"\n | \"roboto-condensed\"\n | \"noto-sans\"\n | \"architects-daughter\"\n | \"comic-neue\";\n\nexport interface FontDef {\n id: FontId;\n /** User-facing name (property panel, dialogs). */\n label: string;\n /** CSS font-family stack for canvas/SVG rendering. */\n cssStack: string;\n /**\n * Cap height as a fraction of the em (OS/2 sCapHeight / unitsPerEm).\n * Text heights in the model are CAP heights (CAD convention: 2.5 mm text\n * has 2.5 mm capitals), so sinks set the font size to height/capHeight.\n */\n capHeight: number;\n /** STYLE table font file name (group 3) for DXF export. */\n dxfFontFile: string;\n /**\n * PDF strategy: a jsPDF built-in font name, or \"embed\" (the exporting\n * host must register the TTF via addFileToVFS/addFont under this font's\n * id before rendering).\n */\n pdf: \"helvetica\" | \"embed\";\n}\n\nexport const DEFAULT_FONT: FontId = \"arial\";\n\nexport const FONTS: Record<FontId, FontDef> = {\n arial: {\n id: \"arial\",\n label: \"Arial\",\n // Liberation Sans is the metric-compatible substitute on Linux.\n cssStack: \"Arial, 'Liberation Sans', 'Helvetica Neue', sans-serif\",\n capHeight: 1467 / 2048, // Arial OS/2 metrics\n dxfFontFile: \"arial.ttf\",\n // Embedded as Liberation Sans (SIL OFL, advance-identical to Arial, full\n // Cyrillic) so PDFs are self-contained and non-WinAnsi text survives.\n // When the host registers no TTF, the sink degrades to base-14 Helvetica\n // exactly as before.\n pdf: \"embed\",\n },\n osifont: {\n id: \"osifont\",\n label: \"osifont (ISO 3098)\",\n cssStack: \"osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont.ttf\",\n pdf: \"embed\",\n },\n \"osifont-italic\": {\n id: \"osifont-italic\",\n label: \"osifont Italic (ISO 3098)\",\n // Registered under its own family name; italic osifont text resolves\n // here (fontFace). The SVG sink adds font-style=\"italic\" so resvg, which\n // matches the TTF family \"osifont\", picks this file too.\n cssStack: \"'osifont-italic', osifont, Arial, sans-serif\",\n capHeight: 0.7397, // gen:fonts, from the bundled TTF\n dxfFontFile: \"osifont-italic.ttf\",\n pdf: \"embed\",\n },\n \"jetbrains-mono\": {\n id: \"jetbrains-mono\",\n label: \"JetBrains Mono\",\n cssStack: \"'JetBrains Mono', Consolas, monospace\",\n capHeight: 0.73, // gen:fonts, from the bundled TTF\n dxfFontFile: \"JetBrainsMono-Regular.ttf\",\n pdf: \"embed\",\n },\n \"source-serif\": {\n id: \"source-serif\",\n label: \"Source Serif 4\",\n cssStack: \"'Source Serif 4', Georgia, 'Times New Roman', serif\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"SourceSerif4-Regular.ttf\",\n pdf: \"embed\",\n },\n \"roboto-condensed\": {\n id: \"roboto-condensed\",\n label: \"Roboto Condensed\",\n cssStack: \"'Roboto Condensed', 'Arial Narrow', Arial, sans-serif\",\n capHeight: 0.7109, // gen:fonts, from the bundled TTF\n dxfFontFile: \"RobotoCondensed-Regular.ttf\",\n pdf: \"embed\",\n },\n \"noto-sans\": {\n id: \"noto-sans\",\n label: \"Noto Sans\",\n cssStack: \"'Noto Sans', Arial, sans-serif\",\n capHeight: 0.714, // gen:fonts, from the bundled TTF\n dxfFontFile: \"NotoSans-Regular.ttf\",\n pdf: \"embed\",\n },\n \"architects-daughter\": {\n id: \"architects-daughter\",\n label: \"Architects Daughter\",\n cssStack: \"'Architects Daughter', 'Comic Sans MS', cursive\",\n capHeight: 0.6592, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ArchitectsDaughter-Regular.ttf\",\n pdf: \"embed\",\n },\n \"comic-neue\": {\n id: \"comic-neue\",\n label: \"Comic Neue\",\n cssStack: \"'Comic Neue', 'Comic Sans MS', cursive\",\n capHeight: 0.67, // gen:fonts, from the bundled TTF\n dxfFontFile: \"ComicNeue-Regular.ttf\",\n pdf: \"embed\",\n },\n};\n\n// ---- faces (bold / italic) ---------------------------------------------------\n//\n// The model stores `font` plus `bold` / `italic` flags; everything downstream\n// of style resolution (measurers, sinks, exporters) receives ONE face string\n// in place of the bare font id: \"arial\", \"arial;b\", \"arial;i\", \"arial;bi\".\n// Code that only needs the font definition keeps calling resolveFont (it\n// strips the suffix); the style-aware places — canvas font string, measurer\n// tables, PDF face selection, SVG attributes, DXF STYLE flags — read it back\n// with parseFontFace.\n\n/** Font id + style → face string. osifont's italic is its own bundled face,\n * so italic osifont resolves to \"osifont-italic\" rather than a flag. */\nexport const fontFace = (\n font: string | undefined,\n bold = false,\n italic = false,\n): string | undefined => {\n let id = font;\n let i = italic;\n if (italic && resolveFont(font).id === \"osifont\") {\n id = \"osifont-italic\";\n i = false;\n }\n const suffix = (bold ? \"b\" : \"\") + (i ? \"i\" : \"\");\n return suffix ? `${id ?? DEFAULT_FONT};${suffix}` : id;\n};\n\n/** Face string → font id + style flags (the inverse of fontFace). */\nexport const parseFontFace = (\n face?: string,\n): { font: string | undefined; bold: boolean; italic: boolean } => {\n const at = face?.indexOf(\";\") ?? -1;\n if (!face || at === -1) return { font: face, bold: false, italic: false };\n const suffix = face.slice(at + 1);\n return {\n font: face.slice(0, at),\n bold: suffix.includes(\"b\"),\n italic: suffix.includes(\"i\"),\n };\n};\n\n/** Styled faces with their own bundled TTF (real bold / italic outlines).\n * Every other styled face is SYNTHESIZED by the sink from the regular one\n * (canvas: the browser; PDF: fill+stroke / skew), so all outputs agree. */\nexport const REAL_FACES: ReadonlySet<string> = new Set([\n \"arial;b\",\n \"arial;i\",\n \"arial;bi\",\n]);\n\n/** The face key a styled face renders with: itself when bundled (REAL_FACES),\n * else null (synthesized from the regular font). */\nexport const realFace = (face?: string): string | null => {\n const { font, bold, italic } = parseFontFace(face);\n if (!bold && !italic) return null;\n const key = `${resolveFont(font).id};${bold ? \"b\" : \"\"}${italic ? \"i\" : \"\"}`;\n return REAL_FACES.has(key) ? key : null;\n};\n\n/** Known id (or face string) → its definition; unknown/absent → the default\n * font. */\nexport const resolveFont = (font?: string): FontDef => {\n const id = font?.includes(\";\") ? font.slice(0, font.indexOf(\";\")) : font;\n return (id && FONTS[id as FontId]) || FONTS[DEFAULT_FONT];\n};\n\n/** TrueType typeface (family) name — the first family of the CSS stack.\n * The DXF export writes it as the STYLE record's ACAD xdata so CAD apps\n * resolve installed fonts by FAMILY instead of our bundle's file names. */\nexport const fontTypeface = (def: FontDef): string =>\n def.cssStack.split(\",\")[0].replace(/[\"']/g, \"\").trim();\n\n/** Font picker entries. osifont-italic is left out: osifont + the Italic\n * toggle IS that face (fontFace); stored values still resolve and show. */\nexport const FONT_OPTIONS: { value: FontId; label: string }[] = Object.values(\n FONTS,\n)\n .filter((f) => f.id !== \"osifont-italic\")\n .map((f) => ({ value: f.id, label: f.label }));\n","// GENERATED — do not edit. Mirror of builtin.lin (the built-in line type\n// library, lengths in mm). Regenerate with:\n// npm run gen:linetypes -w @lineadraw/core\n\nexport const BUILTIN_LIN = `;; Linea built-in line type library.\n;;\n;; Format: .lin syntax - a \\`*NAME,description\\` header line followed by an\n;; \\`A,...\\` definition (alignment code, then signed dash lengths: >0 pen-down,\n;; <0 gap, 0 dot). All lengths are millimeters, sized for a 1 mm pen (ISO\n;; scaling); scale the line type to suit other pen widths.\n;;\n;; The dash sequences are functional interchange data, kept name- and\n;; value-compatible with the DXF LTYPE identifiers other CAD applications\n;; resolve: the general set follows long-standing drafting conventions, the\n;; ACAD_ISO* set implements the ISO 128 line types, and the JIS_* set\n;; follows JIS Z 8312. Descriptions and organization are Linea's own.\n;;\n;; After editing, regenerate the embedded TS mirror:\n;; npm run gen:linetypes -w @lineadraw/core\n;;\n\n;; ISO 128 line types (1 mm pen width base).\n\n*ACAD_ISO02W100,ISO 1\nA,12,-3\n*ACAD_ISO03W100,ISO 2\nA,12,-18\n*ACAD_ISO04W100,ISO 3\nA,24,-3,0,-3\n*ACAD_ISO05W100,ISO 4\nA,24,-3,0,-3,0,-3\n*ACAD_ISO06W100,ISO 5\nA,24,-3,0,-3,0,-3,0,-3\n*ACAD_ISO07W100,ISO 6\nA,0,-3\n*ACAD_ISO08W100,ISO 7\nA,24,-3,6,-3\n*ACAD_ISO09W100,ISO 8\nA,24,-3,6,-3,6,-3\n*ACAD_ISO10W100,ISO 9\nA,12,-3,0,-3\n*ACAD_ISO11W100,ISO 10\nA,12,-3,12,-3,0,-3\n*ACAD_ISO12W100,ISO 11\nA,12,-3,0,-3,0,-3\n*ACAD_ISO13W100,ISO 12\nA,12,-3,12,-3,0,-3,0,-3\n*ACAD_ISO14W100,ISO 13\nA,12,-3,0,-3,0,-3,0,-3\n*ACAD_ISO15W100,ISO 14\nA,12,-3,12,-3,0,-3,0,-3,0,-3\n\n;; JIS Z 8312 line types.\n\n*JIS_08_11,JIS 1SASEN11\nA,11,-.60,.60,-.60\n*JIS_08_15,JIS 1SASEN15\nA,15,-.75,.75,-.75\n*JIS_08_25,JIS 1SASEN25\nA,25,-1.125,.75,-1.125\n*JIS_08_37,JIS 1SASEN37\nA,37.5,-1.125,.75,-1.125\n*JIS_08_50,JIS 1SASEN50\nA,50,-1.125,.75,-1.125\n*JIS_02_0.7,JIS HIDDEN0.75\nA,.75,-.60\n*JIS_02_1.0,JIS HIDDEN01\nA,1,-1\n*JIS_02_1.2,JIS HIDDEN01.25\nA,1.25,-1.25\n*JIS_02_2.0,JIS HIDDEN02\nA,2,-1\n*JIS_02_4.0,JIS HIDDEN04\nA,4,-1.5\n*JIS_09_08,JIS 2SASEN8\nA,8,-.55,.55,-.55,.55,-.55\n*JIS_09_15,JIS 2SASEN15\nA,15,-.90,.60,-.90,.60,-.90\n*JIS_09_29,JIS 2SASEN29\nA,29,-1.2,.70,-1.2,.70,-1.2\n*JIS_09_50,JIS 2SASEN50\nA,50,-1.2,.70,-1.2,.70,-1.2\n`;\n","// Named line types — the .lin dash model. A line type is a repeating\n// sequence of dash lengths: >0 pen-down, <0 gap, 0 dot. Lengths are mm PER\n// 1 MM OF LINE WIDTH — the paint layer multiplies them by the resolved\n// lineweight (ISO 128 style: pattern size tracks stroke weight), so a\n// 0.25 mm line gets quarter-size dashes. The curated set\n// (continuous/dashed/…) is kept for back-compat and takes precedence; the\n// built-in catalogue (builtin.lin — DXF-compatible LTYPE names, standards-\n// derived dash data) is embedded and merged in by name.\n//\n// Objects/layers store a line type by NAME (a plain string, resolved here);\n// unknown names fall back to continuous at paint time — mirrors hatchPatterns.\n\nimport { BUILTIN_LIN } from \"./builtinLin\";\n\nexport interface LinePattern {\n /** Canonical name as stored on objects/layers (curated names are lowercase). */\n name: string;\n /** Human label for the dropdown. */\n label: string;\n /**\n * Signed dash sequence, mm per 1 mm of line width: >0 dash, <0 gap, 0 dot.\n * Empty = continuous (no dashing).\n */\n dashesMm: number[];\n /** DXF LTYPE name for export (defaults to the catalogue name). */\n dxfName?: string;\n /**\n * Resolvable and DXF-exported but not offered in pickers — the catalogue's\n * `NAME2` (half) / `NAMEX2` (double) scale variants, which lineTypeScale\n * makes redundant as picker entries.\n */\n hidden?: boolean;\n}\n\n/**\n * Parse acad .lin text. Each entry is a `*NAME,description` header followed by\n * an `A,d1,d2,…` definition line (alignment code + signed dash lengths).\n * Dash lengths are taken as world mm (builtin.lin is already mm). Complex\n * linetypes (embedded shapes/text in `[...]`) are skipped — we can't render\n * SHX shapes, and dropping the shape would misrepresent them.\n */\nexport interface ParsedLinePattern {\n name: string;\n description?: string;\n dashesMm: number[];\n}\n\nexport const parseLinDefinitions = (text: string): ParsedLinePattern[] => {\n const out: ParsedLinePattern[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line.startsWith(\"*\")) continue;\n const comma = line.indexOf(\",\");\n const name = (comma >= 0 ? line.slice(1, comma) : line.slice(1)).trim();\n const description = comma >= 0 ? line.slice(comma + 1).trim() : undefined;\n // The definition is the next non-blank, non-comment line.\n let j = i + 1;\n while (j < lines.length) {\n const d = lines[j].trim();\n if (d && !d.startsWith(\";\")) break;\n j++;\n }\n if (j >= lines.length) break;\n const def = lines[j].trim();\n if (def.startsWith(\"*\")) continue; // header with no body → skip\n i = j;\n if (def.includes(\"[\") || def.includes('\"')) continue; // complex → skip\n const tokens = def.split(\",\").map((t) => t.trim());\n // tokens[0] is the alignment code (always \"A\"); the rest are dash lengths.\n const nums = tokens\n .slice(1)\n .filter((t) => t.length > 0)\n .map(Number);\n if (nums.some((n) => Number.isNaN(n))) continue;\n out.push({ name, description, dashesMm: nums });\n }\n return out;\n};\n\n// Curated set — the historical defaults. Stored signed so they render exactly\n// as before (the render conversion turns 0 into a visible dot). These win over\n// the catalogue on name collision.\nconst CURATED: LinePattern[] = [\n { name: \"continuous\", label: \"Continuous\", dashesMm: [] },\n {\n name: \"dashed\",\n label: \"Dashed\",\n dashesMm: [12.7, -6.35],\n dxfName: \"DASHED\",\n },\n { name: \"dotted\", label: \"Dotted\", dashesMm: [0, -6.35], dxfName: \"DOT\" },\n {\n name: \"dashdot\",\n label: \"Dash-dot\",\n dashesMm: [12.7, -6.35, 0, -6.35],\n dxfName: \"DASHDOT\",\n },\n {\n name: \"center\",\n label: \"Center\",\n dashesMm: [31.75, -6.35, 6.35, -6.35],\n dxfName: \"CENTER\",\n },\n {\n name: \"hidden\",\n label: \"Hidden\",\n dashesMm: [6.35, -3.175],\n dxfName: \"HIDDEN\",\n },\n {\n name: \"phantom\",\n label: \"Phantom\",\n dashesMm: [31.75, -6.35, 6.35, -6.35, 6.35, -6.35],\n dxfName: \"PHANTOM\",\n },\n {\n name: \"border\",\n label: \"Border\",\n dashesMm: [12.7, -6.35, 12.7, -6.35, 0, -6.35],\n dxfName: \"BORDER\",\n },\n {\n name: \"divide\",\n label: \"Divide\",\n dashesMm: [12.7, -6.35, 0, -6.35, 0, -6.35],\n dxfName: \"DIVIDE\",\n },\n];\n\n// Fold the separator drift between .lin names, the DXF table, and AutoCAD\n// output (hyphens/dots/spaces → `_`) so lookups resolve regardless of style.\nconst normalizeName = (name: string): string =>\n name\n .trim()\n .toUpperCase()\n .replace(/[\\s.-]+/g, \"_\");\n\n/**\n * ~26-char ASCII depiction of a dash cycle, generated from the data itself so\n * it can never lie: >0 → underscores, <0 → spaces, 0 → a dot. Scaled per\n * pattern (longest element ≈ 5 chars) so long/short contrast survives both\n * the fine curated dashes and the coarse catalogue ones. Empty = solid line.\n */\nconst asciiPreview = (dashesMm: number[]): string => {\n const WIDTH = 15;\n if (!dashesMm.length) return \"_\".repeat(WIDTH * 0.8);\n const unit = Math.max(1.5875, Math.max(...dashesMm.map(Math.abs)) / 5);\n let out = \"\";\n while (out.length < WIDTH) {\n for (const d of dashesMm) {\n const n = Math.max(1, Math.min(10, Math.round(Math.abs(d) / unit)));\n out += d > 0 ? \"_\".repeat(n) : d < 0 ? \" \".repeat(n) : \".\";\n if (out.length >= WIDTH) break;\n }\n }\n return out.slice(0, WIDTH).trimEnd();\n};\n\n/** name → label without the ASCII preview (the pickers draw an SVG one). */\nconst PLAIN_LABELS: Record<string, string> = {};\n\n/** Label exported as the DXF LTYPE description. */\nconst withPreview = (p: LinePattern): LinePattern => {\n PLAIN_LABELS[p.name] = p.label;\n return { ...p, label: `${p.label} ${asciiPreview(p.dashesMm)}` };\n};\n\nconst BUILT_IN: LinePattern[] = CURATED.map(withPreview);\nconst BY_NAME = new Map(BUILT_IN.map((p) => [normalizeName(p.name), p]));\nfor (const p of parseLinDefinitions(BUILTIN_LIN)) {\n const key = normalizeName(p.name);\n if (BY_NAME.has(key)) continue; // curated precedence + dedup\n const pattern = withPreview({\n name: p.name,\n label: p.description || p.name,\n dashesMm: p.dashesMm,\n dxfName: p.name,\n });\n BY_NAME.set(key, pattern);\n BUILT_IN.push(pattern);\n}\n\n// Hide the .lin scale-variant convention (NAME2 = half, NAMEX2 = double) from\n// pickers: lineTypeScale covers scaling, so the variants are clutter there —\n// but they stay resolvable so imported DXF, old documents, and round-trips\n// keep rendering with their exact catalogue dashes.\nconst scaleVariantBase = (name: string): string | undefined => {\n if (/x2$/i.test(name)) return name.slice(0, -2);\n if (/2$/.test(name)) return name.slice(0, -1);\n return undefined;\n};\nfor (const p of BUILT_IN) {\n const base = scaleVariantBase(p.name);\n const target = base ? BY_NAME.get(normalizeName(base)) : undefined;\n if (target && target !== p) p.hidden = true;\n}\n\n/** Ordered picker line-type names (hidden scale variants excluded). */\nexport const LINE_TYPE_NAMES: string[] = BUILT_IN.filter((p) => !p.hidden).map(\n (p) => p.name,\n);\n\n/**\n * Every definition including hidden scale variants — DXF export emits them\n * all so any LTYPE a document references stays defined.\n */\nexport const LINE_TYPE_DEFS: readonly LinePattern[] = BUILT_IN;\n\n/** name → display label (covers hidden entries so stored values still show). */\nexport const LINE_TYPE_LABELS: Record<string, string> = PLAIN_LABELS;\n\n/** Default line type (solid). */\nexport const DEFAULT_LINE_TYPE = \"continuous\";\n\n/** Resolve a line-type name (case- and punctuation-insensitive) to its definition. */\nexport const getLineType = (name: string): LinePattern | undefined =>\n BY_NAME.get(normalizeName(name));\n\n/**\n * Render dash array (canvas/PDF style: all-positive mm, a 0-length dot becomes\n * a short 0.1 mm mark that reads as a dot with round caps). undefined = a solid\n * (continuous) line.\n */\nexport const renderDashes = (pattern: LinePattern): number[] | undefined =>\n pattern.dashesMm.length\n ? pattern.dashesMm.map((v) => (v === 0 ? 0.1 : Math.abs(v)))\n : undefined;\n","// Pure 2D vector math. World units are millimeters, angles are radians, Y is up.\n\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\nexport const vec2 = (x: number, y: number): Vec2 => ({ x, y });\n\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x + b.x, y: a.y + b.y });\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({ x: a.x - b.x, y: a.y - b.y });\nexport const scale = (a: Vec2, s: number): Vec2 => ({ x: a.x * s, y: a.y * s });\nexport const neg = (a: Vec2): Vec2 => ({ x: -a.x, y: -a.y });\n\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n/** 2D cross product (z component of the 3D cross). Positive when b is CCW from a. */\nexport const cross = (a: Vec2, b: Vec2): number => a.x * b.y - a.y * b.x;\n\nexport const lenSq = (a: Vec2): number => a.x * a.x + a.y * a.y;\nexport const len = (a: Vec2): number => Math.hypot(a.x, a.y);\nexport const distSq = (a: Vec2, b: Vec2): number => lenSq(sub(b, a));\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Normalize; returns the zero vector unchanged. */\nexport const norm = (a: Vec2): Vec2 => {\n const l = len(a);\n return l === 0 ? a : { x: a.x / l, y: a.y / l };\n};\n\nexport const lerp = (a: Vec2, b: Vec2, t: number): Vec2 => ({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n});\n\nexport const mid = (a: Vec2, b: Vec2): Vec2 => lerp(a, b, 0.5);\n\n/** Angle of the vector from +X axis, CCW, in (-π, π]. */\nexport const angle = (a: Vec2): number => Math.atan2(a.y, a.x);\n\n/** Rotate a vector by an angle (radians, CCW). */\nexport const rot = (a: Vec2, angle: number): Vec2 => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { x: a.x * c - a.y * s, y: a.x * s + a.y * c };\n};\n\n/** Rotate point p around center by angle (radians, CCW). */\nexport const rotAround = (p: Vec2, center: Vec2, angle: number): Vec2 =>\n add(center, rot(sub(p, center), angle));\n\n/** Perpendicular vector, 90° CCW. */\nexport const perp = (a: Vec2): Vec2 => ({ x: -a.y, y: a.x });\n\n/** Unit vector at the given angle. */\nexport const fromAngle = (angle: number): Vec2 => ({\n x: Math.cos(angle),\n y: Math.sin(angle),\n});\n\n/** Point at distance d from origin p in direction angle (polar). */\nexport const polar = (angle: number, d: number, p: Vec2): Vec2 => ({\n x: Math.cos(angle) * d + p.x,\n y: Math.sin(angle) * d + p.y,\n});\n\nexport const eq = (a: Vec2, b: Vec2, epsilon = 1e-9): boolean =>\n Math.abs(a.x - b.x) <= epsilon && Math.abs(a.y - b.y) <= epsilon;\n\n/** Normalize an angle into [0, 2π). */\nexport const normAngle = (angle: number): number => {\n const t = angle % (Math.PI * 2);\n return t < 0 ? t + Math.PI * 2 : t;\n};\n","// The text form of list parameters (`numberList` / `stringList`): what the\n// properties panel shows and parses, and how legacy string values of a list\n// parameter are read. Space-separated, like a command line:\n//\n// stringList [\"yes\", \"hello sir\"] ⇄ yes \"hello sir\"\n// double quotes group words; \\\" and \\\\ escape inside quotes\n// numberList [0, 7200, 7200] ⇄ 0 2*7200\n// Tekla-style `N*d` repeats d N times (runs format back to it);\n// a decimal comma is accepted (\"2,5\")\n//\n// Pure — no DOM, shared by the editor, headless callers and scripts' hosts.\n\nconst NUMBER = /^[+-]?(\\d+([.,]\\d*)?|[.,]\\d+)(e[+-]?\\d+)?$/i;\nconst REPEAT = /^(\\d+)\\*(.+)$/;\n\nconst parseNumber = (token: string): number | null =>\n NUMBER.test(token) ? Number(token.replace(\",\", \".\")) : null;\n\n/** \"0 2*7200\" → [0, 7200, 7200]; null when any token isn't a number. */\nexport const parseNumberList = (text: string): number[] | null => {\n const out: number[] = [];\n for (const token of text.trim().split(/\\s+/).filter(Boolean)) {\n const repeat = REPEAT.exec(token);\n const count = repeat ? Number(repeat[1]) : 1;\n const value = parseNumber(repeat ? repeat[2] : token);\n if (value === null || !Number.isFinite(value) || count < 1) return null;\n for (let i = 0; i < count; i++) out.push(value);\n }\n return out;\n};\n\n/** Shortest exact-enough decimal: no float noise (0.1 + 0.2 → \"0.3\"). */\nconst formatNumber = (n: number): string => String(Number(n.toPrecision(12)));\n\n/** [0, 7200, 7200] → \"0 2*7200\" (consecutive equal values become N*d). */\nexport const formatNumberList = (nums: readonly number[]): string => {\n const parts: string[] = [];\n for (let i = 0; i < nums.length;) {\n let j = i + 1;\n while (j < nums.length && nums[j] === nums[i]) j++;\n const n = formatNumber(nums[i]);\n parts.push(j - i > 1 ? `${j - i}*${n}` : n);\n i = j;\n }\n return parts.join(\" \");\n};\n\n/** 'yes \"hello sir\"' → [\"yes\", \"hello sir\"]; null on an unclosed quote. */\nexport const parseStringList = (text: string): string[] | null => {\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n if (/\\s/.test(text[i])) {\n i++;\n continue;\n }\n let item = \"\";\n if (text[i] === '\"') {\n i++;\n let closed = false;\n while (i < text.length) {\n const c = text[i++];\n if (c === \"\\\\\" && i < text.length) item += text[i++];\n else if (c === '\"') {\n closed = true;\n break;\n } else item += c;\n }\n if (!closed) return null;\n } else {\n while (i < text.length && !/\\s/.test(text[i])) item += text[i++];\n }\n out.push(item);\n }\n return out;\n};\n\n/** [\"yes\", \"hello sir\"] → 'yes \"hello sir\"' (quoted only when needed). */\nexport const formatStringList = (strs: readonly string[]): string =>\n strs\n .map((s) =>\n s === \"\" || /[\\s\"\\\\]/.test(s)\n ? `\"${s.replace(/[\\\\\"]/g, (c) => `\\\\${c}`)}\"`\n : s,\n )\n .join(\" \");\n\n/**\n * A stored value read as a list parameter: arrays pass through (filtered to\n * the element type), and a STRING — what a parameter held before its block\n * switched to a list type — is parsed in the list syntax. Anything else, or\n * text that doesn't parse, yields null (callers fall back to the default).\n */\nexport const readListParam = (\n type: \"numberList\" | \"stringList\",\n value: unknown,\n): number[] | string[] | null => {\n if (type === \"numberList\") {\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"number\" && Number.isFinite(v))\n ? (value as number[])\n : null;\n return typeof value === \"string\" ? parseNumberList(value) : null;\n }\n if (Array.isArray(value))\n return value.every((v) => typeof v === \"string\")\n ? (value as string[])\n : null;\n return typeof value === \"string\" ? parseStringList(value) : null;\n};\n","import { z } from \"zod\";\n\n// Discriminated by `type` so the default (and per-type constraints like\n// min/max or enum options) can't disagree with the declared type.\nconst paramBase = {\n name: z.string().regex(/^[a-zA-Z_]\\w*$/),\n label: z.string().optional(),\n /** What the parameter means: the label's tooltip in the panel. */\n hint: z.string().optional(),\n};\n\n/** `#rrggbb` — a color parameter's value. */\nexport const HEX_COLOR = /^#[0-9a-f]{6}$/i;\n\n/**\n * One enum choice: `value` is what the script receives, `label` what the\n * properties panel shows (falls back to the value). Plain strings — the\n * pre-label form still written by older documents — normalize to\n * `{ value }`.\n */\nexport const EnumOptionSchema = z.preprocess(\n (raw) => (typeof raw === \"string\" ? { value: raw } : raw),\n z.object({\n value: z.string(),\n label: z.string().optional(),\n /** A `#rrggbb` color square before the option's label. */\n swatch: z.string().regex(HEX_COLOR).optional(),\n }),\n);\nexport type EnumOption = z.infer<typeof EnumOptionSchema>;\n\nconst NumberParam = z.object({\n ...paramBase,\n type: z.literal(\"number\"),\n default: z.number(),\n min: z.number().optional(),\n max: z.number().optional(),\n /** Whole numbers only. */\n integer: z.boolean().optional(),\n /** ArrowUp / ArrowDown increment in the panel (default 1). */\n step: z.number().positive().optional(),\n /** Shown inside the field before / after the value (\"1:\", \"mm\"). */\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n /** Standard values offered in the field's dropdown; typing stays free. */\n presets: z.array(z.number()).optional(),\n});\nconst StringParam = z.object({\n ...paramBase,\n type: z.literal(\"string\"),\n default: z.string(),\n placeholder: z.string().optional(),\n /** A textarea; Shift+Enter starts a new line. */\n multiline: z.boolean().optional(),\n presets: z.array(z.string()).optional(),\n});\nconst BooleanParam = z.object({\n ...paramBase,\n type: z.literal(\"boolean\"),\n default: z.boolean(),\n /** \"toggle\": a toggle button showing the label (compact, e.g. in a row\n * beside a picker) instead of a switch. */\n display: z.enum([\"switch\", \"toggle\"]).optional(),\n});\n// Lists edit as space-separated text (extensions/paramLists.ts): numbers\n// with Tekla `N*d` repeats, words with \"quoted phrases\".\nconst NumberListParam = z.object({\n ...paramBase,\n type: z.literal(\"numberList\"),\n default: z.array(z.number()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n presets: z.array(z.array(z.number())).optional(),\n});\nconst StringListParam = z.object({\n ...paramBase,\n type: z.literal(\"stringList\"),\n default: z.array(z.string()),\n /** Shown while the list is empty. */\n placeholder: z.string().optional(),\n presets: z.array(z.array(z.string())).optional(),\n});\n// A `#rrggbb` color: swatch + picker in the panel, presets as a palette.\nconst ColorParam = z.object({\n ...paramBase,\n type: z.literal(\"color\"),\n default: z.string().regex(HEX_COLOR),\n presets: z.array(z.string().regex(HEX_COLOR)).optional(),\n});\nconst EnumParam = z.object({\n ...paramBase,\n type: z.literal(\"enum\"),\n default: z.string(),\n options: z.array(EnumOptionSchema).min(1),\n /** \"buttons\": a segmented toggle group of the options (short choices);\n * the panel falls back to the dropdown when they don't fit. */\n display: z.enum([\"dropdown\", \"buttons\"]).optional(),\n});\n// Pickers over the document's resources. Values are ids / names (strings):\n// a style id (\"\" or unknown → the document's first style, the rule objects\n// follow), a font id, a linetype or hatch pattern name.\nconst resourceParam = <T extends string>(type: T, fallback: string) =>\n z.object({\n ...paramBase,\n type: z.literal(type),\n default: z.string().default(fallback),\n });\nconst TextStyleParam = resourceParam(\"textStyle\", \"\");\nconst DimStyleParam = resourceParam(\"dimStyle\", \"\");\nconst FontParam = resourceParam(\"font\", \"arial\");\nconst LineTypeParam = resourceParam(\"lineType\", \"continuous\");\nconst HatchPatternParam = resourceParam(\"hatchPattern\", \"ANSI31\");\n\n// A section label between rows in the properties panel — no value, no\n// default; never present in the `params` record scripts receive.\nconst LabelParam = z.object({ ...paramBase, type: z.literal(\"label\") });\n\nconst enumDefaultIsAnOption = (p: { type: string }): boolean =>\n p.type !== \"enum\" ||\n (p as z.infer<typeof EnumParam>).options.some(\n (o) => o.value === (p as z.infer<typeof EnumParam>).default,\n );\nconst ENUM_DEFAULT = { message: \"enum default must be one of its options\" };\n\n/** What a `row` may hold: compact, single-line kinds. */\nexport const RowItemSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n EnumParam,\n ColorParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\n\n/** Layout only: 2–3 params on one panel row, each item's label shown as a\n * short prefix (\"W\", \"H\"). The values stay flat — `params.w`, `params.h` —\n * so a row never changes the stored shape (see valueParams). */\nconst RowParam = z.object({\n ...paramBase,\n type: z.literal(\"row\"),\n items: z.array(RowItemSchema).min(2).max(3),\n});\n\nexport const BlockParamSchema = z\n .discriminatedUnion(\"type\", [\n NumberParam,\n StringParam,\n BooleanParam,\n NumberListParam,\n StringListParam,\n ColorParam,\n EnumParam,\n TextStyleParam,\n DimStyleParam,\n FontParam,\n LineTypeParam,\n HatchPatternParam,\n LabelParam,\n RowParam,\n ])\n .refine(enumDefaultIsAnOption, ENUM_DEFAULT);\nexport type BlockParameter = z.infer<typeof BlockParamSchema>;\n\n/** A param that carries a value (not a label heading, not a row container). */\nexport type ValueParameter = Exclude<BlockParameter, { type: \"label\" | \"row\" }>;\n\n/** The value-carrying params of a table, row items flattened in place —\n * what defaults, `params` records, checks and visibility work on. */\nexport const valueParams = (\n defs: readonly BlockParameter[],\n): ValueParameter[] =>\n defs.flatMap((d): ValueParameter[] =>\n d.type === \"label\" ? [] : d.type === \"row\" ? d.items : [d],\n );\n\n// NOTE: there is no BlockDefinition record anymore — a block IS an ES module\n// (JavaScript or TypeScript) whose source string lives in\n// `LineaDocument.blockDefinitions`. Identity and metadata (`id`, `name`,\n// `params`) are the module's own exports, derived via `getBlockMeta`\n// (blocks/evalBlock.ts). The schemas here only describe the shape of the\n// `params` export.\n","// Parametric block evaluation. A block IS an ES module (JavaScript or\n// TypeScript): the document stores raw module sources, and everything the\n// app knows about a block derives from the module's exports —\n// id → identity (instances reference it via `definitionId`)\n// name → list/panel label\n// params → optional parameter declarations (ParamDef[], default []) — a\n// table literal OR a zero-arg pure function returning one (the\n// function form lets const data tables live at the end of the\n// file; it runs once per compiled module version)\n// draw({ params, inputs }) → child DTOs in block-LOCAL coordinates\n// (pure; runs on every evaluation). Object-id\n// inputs arrive RESOLVED: the referenced\n// object localized against the pivot, or null\n// when the reference is gone.\n// place({ params, pickPoint, pickObject })\n// → optional; runs ONCE at insertion and\n// interactively acquires the instance's\n// inputs array (points / object ids).\n// May instead be an ARRAY of point labels\n// (one pick per label, in order).\n// Absent → a single \"Insertion point\" pick.\n// paramVisibility({ params }) → optional; pure, re-run per properties-\n// panel render: which parameter rows to show\n// given the current values. Omitted names\n// stay visible; hidden values are KEPT and\n// still reach `draw`.\n// previewInputs → optional; author-curated inputs array for\n// previews/thumbnails (dryRunBlockInputs\n// prefers it over the stand-in pickers).\n// The pre-rename export names `main` (→ draw) and `defineInput` (→ place)\n// are FROZEN aliases, resolved at compile like the \"linea\" import\n// specifiers — documents and .block.ts files carrying them keep evaluating\n// forever.\n// A module may also `export default defineBlock({...})` (defineBlock is a\n// runtime identity from \"lineadraw\"; its overloads give full cross-member\n// type inference) — the default-exported spec carries the same members and\n// is normalized over the named exports at compile.\n// Scripts are transpiled with sucrase (typescript + imports → CJS) and\n// executed with `new Function` (calculus getProfile pattern — the user's own\n// code, same-origin, no sandbox by design) against a `require` shim that\n// resolves only the virtual modules: \"lineadraw/helpers\" (named geometry\n// helpers; \"lineadraw\" itself carries only types, plus the legacy `helpers`\n// object migration-wrapped scripts import) and their pre-rename \"linea\"\n// aliases. Output is zod-validated and\n// cached. Evaluation is\n// SYNC so render/snap paths can evaluate lazily without stalls; sucrase\n// itself is lazy-loaded — until it arrives evaluation reports a transient\n// error and `setScriptTranspilerReadyCallback` lets the host re-render.\n//\n// Instance pose: `inputs` is a flat array of world points (or id strings).\n// The PIVOT is the first point input. `draw` receives the points localized\n// against the pivot; its output is scaled, rotated (the instance fields,\n// applied last) and translated back to the pivot. Transforms map the input\n// points and the script recomputes — pose lives in the points.\n//\n// Object references: an id input resolves at evaluation time through the\n// caller-supplied resolver (the mutation owner's document lookup) into the\n// referenced object localized against the pivot — or null when it no longer\n// resolves. Which instance references which objects is recorded here\n// (instanceDeps) so the mutation owner can EXPAND its invalidation id lists\n// via `expandWithBlockDependents`: editing a referenced object then drops the\n// dependent instances' memo/snap entries and they re-evaluate on next paint.\n//\n// KERNEL SEAM: this module owns the caches but has no store. The mutation\n// owner (the editor's modelStore, a headless SDK session) calls\n// `invalidateBlockCache` from its own invalidation path, and the document's\n// script list is passed into `getEvaluatedWorldChildren` rather than read\n// from a global.\n\nimport { readListParam } from \"./paramLists\";\nimport {\n BlockParamSchema,\n valueParams,\n type BlockParameter,\n} from \"../model/blockDefinition\";\nimport {\n blockPivot,\n DEFAULT_DIM_STYLE,\n DEFAULT_TEXT_STYLE,\n dimStyleFor,\n textStyleFor,\n type Block,\n type DimStyle,\n type ModelObject,\n type TextStyle,\n} from \"../model/objects\";\nimport { Vec2Schema } from \"../model/common\";\nimport { z } from \"zod\";\nimport { sub, type Vec2 } from \"../geometry/vec2\";\nimport {\n rotateObject,\n scaleObjectUniform,\n translateObject,\n} from \"../transform\";\nimport { BlockScriptResultSchema, type BlockChild } from \"./blockDtos\";\nimport {\n ensureScriptTranspiler,\n executeScriptModule,\n scriptTranspilerReady,\n transpilerLoadingError,\n} from \"./scriptRuntime\";\n\nconst hashString = (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 h;\n};\n\n/** One acquired block input: a world point or a referenced object id. */\nexport type BlockInputValue = Vec2 | string;\n\n/**\n * One input as `draw` receives it: a pivot-local point, the referenced\n * object (localized against the pivot), or null for a dangling reference.\n */\nexport type ResolvedBlockInput = Vec2 | ModelObject | null;\n\n/**\n * Looks up a referenced object by id — supplied by whoever owns the\n * document (ids are document-unique, so a document-wide lookup is correct).\n */\nexport type BlockObjectResolver = (id: string) => ModelObject | undefined;\n\n/** Interactive pickers the host hands to `place` at insertion. */\nexport interface BlockInputPickers {\n pickPoint: (label?: string) => Promise<Vec2>;\n pickObject: (label?: string) => Promise<string>;\n}\n\n/** Identity + metadata derived from a block module's exports. The optional\n * fields are marketplace/listing metadata (docs/block-marketplace.md) —\n * absent ones change nothing about evaluation. */\nexport interface BlockMeta {\n id: string;\n name: string;\n params: BlockParameter[];\n description?: string;\n version?: string;\n authors?: string[];\n tags?: string[];\n /** Ids of block definitions this block's `draw` emits instances of.\n * Declared (a param-dependent path may emit only sometimes), but the\n * save-time dry run REJECTS emitted instances that are not declared. */\n dependencies?: string[];\n}\n\n/**\n * The well-known exports of a compiled block script module, NORMALIZED: the\n * transpiler resolves the frozen legacy export names (`main` → `draw`,\n * `defineInput` → `place`) and spreads a default-exported BlockSpec\n * (`export default defineBlock({...})`) over the named exports, so\n * everything downstream reads only one shape. `place` may be an array of\n * point labels — the declarative \"pick one point per label\" form.\n */\ntype BlockScriptModule = {\n draw: (props: {\n params: Record<string, unknown>;\n inputs: ResolvedBlockInput[];\n }) => unknown;\n place?:\n | ((\n props: {\n params: Record<string, unknown>;\n } & BlockInputPickers,\n ) => unknown)\n | readonly string[];\n paramVisibility?: (props: { params: Record<string, unknown> }) => unknown;\n /** Optional author-curated inputs for previews/thumbnails (points may be\n * [x, y] tuples; strings are object refs the stand-in resolver serves). */\n previewInputs?: unknown;\n};\n\n/** The declarative `place` form: point labels, one pick per entry. */\nconst isLabelArray = (v: unknown): v is readonly string[] =>\n Array.isArray(v) && v.every((s) => typeof s === \"string\");\n\ninterface CompiledBlock {\n mod: BlockScriptModule;\n meta: BlockMeta;\n}\n\n/**\n * Compile cache keyed by the raw SOURCE (collision-free — the sources live\n * in the document anyway). Bounded because live editing (the block editor's\n * preview debounce) mints an entry per keystroke burst; eviction is\n * insertion-ordered with a get-refresh, i.e. LRU-ish.\n */\nconst compileCache = new Map<string, CompiledBlock>();\nconst COMPILE_CACHE_MAX = 200;\n\n/** Shared results for input-less evaluations (cross-instance reuse pays). */\nconst resultCache = new Map<string, BlockChild[]>();\nconst RESULT_CACHE_MAX = 500;\n\n/**\n * Per-instance memo for evaluations WITH inputs: input points make keys\n * unique per instance, so a shared cache would just thrash (it's FIFO, and\n * painting re-evaluates every dirty frame). Entries drop via model\n * invalidation.\n */\nconst instanceMemo = new Map<string, { key: string; children: BlockChild[] }>();\n\n/**\n * Which objects each instance's inputs REFERENCE (instance id → referenced\n * ids). ACCUMULATED, never replaced: several documents can share one\n * process (MCP server, SDK, a Save As copy keeps object ids), and the union\n * can only over-expand an invalidation list — harmless — never miss a\n * dependent. Entries are only dropped wholesale (a per-id drop would have to\n * be ordered against `expandWithBlockDependents`, which reads this map).\n */\nconst instanceDeps = new Map<string, Set<string>>();\n\n/**\n * Expand a mutation's invalidation id list with every block instance whose\n * inputs reference one of the mutated objects. The mutation owner calls this\n * BEFORE fanning out to `invalidateBlockCache` and its cache listeners, so\n * dependent instances' memo/snap entries drop and they re-evaluate against\n * the fresh referenced object on the next paint.\n */\nexport const expandWithBlockDependents = (ids: string[]): string[] => {\n if (instanceDeps.size === 0) return ids;\n const idSet = new Set(ids);\n let extra: string[] | null = null;\n for (const [instanceId, deps] of instanceDeps) {\n if (idSet.has(instanceId)) continue;\n for (const d of deps)\n if (idSet.has(d)) {\n (extra ??= []).push(instanceId);\n break;\n }\n }\n return extra ? [...ids, ...extra] : ids;\n};\n\n/**\n * Drop cached instance evaluations + volatile errors. Called by whoever owns\n * mutations, exactly where the funnel fires invalidation listeners today:\n * `null` clears everything, otherwise the given instance ids are dropped.\n */\nexport const invalidateBlockCache = (ids: string[] | null): void => {\n if (ids === null) {\n instanceMemo.clear();\n evalErrors.clear();\n instanceDeps.clear();\n return;\n }\n for (const id of ids) {\n instanceMemo.delete(id);\n evalErrors.delete(id);\n }\n};\n\n/** Volatile per-instance evaluation errors (never persisted, not in history). */\nconst evalErrors = new Map<string, string>();\nexport const getBlockError = (instanceId: string): string | undefined =>\n evalErrors.get(instanceId);\n\nconst defaultParams = (meta: BlockMeta): Record<string, unknown> => {\n // Null prototype: a param named `constructor`/`__proto__` must stay a\n // plain property, not clobber the prototype chain.\n const params: Record<string, unknown> = Object.create(null);\n // Labels are panel chrome with no value — scripts never see them; row\n // items are ordinary params (a row is layout only).\n for (const param of valueParams(meta.params))\n params[param.name] = param.default;\n return params;\n};\n\n/** An instance's stored params over the defaults. A list parameter is read\n * through readListParam: a STRING stored before its block switched to a\n * list type is parsed, an unreadable value falls back to the default. */\nconst instanceParams = (\n meta: BlockMeta,\n stored: Readonly<Record<string, unknown>>,\n): Record<string, unknown> => {\n const params = defaultParams(meta);\n for (const [name, value] of Object.entries(stored)) params[name] = value;\n for (const p of valueParams(meta.params))\n if (\n (p.type === \"numberList\" || p.type === \"stringList\") &&\n p.name in stored\n )\n params[p.name] = readListParam(p.type, stored[p.name]) ?? p.default;\n return params;\n};\n\n// The transpiler + executor live in ./scriptRuntime (shared with command\n// modules); re-exported here so `@lineadraw/core` keeps one flat surface.\nexport {\n ensureScriptTranspiler,\n executeScriptModule,\n scriptTranspilerReady,\n setScriptTranspilerReadyCallback,\n type ModuleExecutor,\n} from \"./scriptRuntime\";\n\n/** Resolve the frozen legacy export aliases (`main` → `draw`, `defineInput`\n * → `place`) and validate the block-module shape. */\nconst toBlockModule = (mod: Record<string, unknown>): BlockScriptModule => {\n const draw = mod.draw ?? mod.main;\n if (typeof draw !== \"function\")\n throw new Error(\"Block script must export a `draw` function\");\n const place = mod.place ?? mod.defineInput;\n if (\n place !== undefined &&\n typeof place !== \"function\" &&\n !isLabelArray(place)\n )\n throw new Error(\n \"Block script export `place` must be a function or an array of point labels\",\n );\n if (\n mod.paramVisibility !== undefined &&\n typeof mod.paramVisibility !== \"function\"\n )\n throw new Error(\"Block script export `paramVisibility` must be a function\");\n if (mod.previewInputs !== undefined && !Array.isArray(mod.previewInputs))\n throw new Error(\n \"Block script export `previewInputs` must be an array of points / object ids\",\n );\n return { ...mod, draw, place } as BlockScriptModule;\n};\n\nconst ParamsExportSchema = z.array(BlockParamSchema);\n\n/** Optional listing metadata (same surface as command modules, plus the\n * block-only `dependencies` — commands don't nest). */\nconst OptionalBlockMetaSchema = z.object({\n description: z.string().optional(),\n version: z.string().optional(),\n authors: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n dependencies: z.array(z.string()).optional(),\n});\n\n/**\n * A module's `params` export — the table itself or a zero-arg function\n * returning it (the function form lets const data tables live below it in\n * the file) — validated with author-facing errors. Shared by blocks and\n * commands; absent → [].\n */\nexport const parseParamsExport = (paramsExport: unknown): BlockParameter[] => {\n if (typeof paramsExport === \"function\") {\n try {\n paramsExport = (paramsExport as () => unknown)();\n } catch (e) {\n throw new Error(\n `\\`params\\` function threw — ${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n }\n if (paramsExport === undefined) return [];\n const parsed = ParamsExportSchema.safeParse(paramsExport);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n throw new Error(\n `Invalid \\`params\\` export${\n issue ? ` — ${issue.path.join(\".\") || \"params\"}: ${issue.message}` : \"\"\n }`,\n );\n }\n // Names are unique across the table AND inside rows (row items share the\n // flat `params` record with everything else).\n const seen = new Set<string>();\n const names = parsed.data.flatMap((d) =>\n d.type === \"row\" ? [d.name, ...d.items.map((i) => i.name)] : [d.name],\n );\n for (const name of names) {\n if (seen.has(name))\n throw new Error(`Duplicate parameter name \"${name}\" in \\`params\\``);\n seen.add(name);\n }\n return parsed.data;\n};\n\n/** Validate a module's identity/metadata exports with author-facing errors. */\nconst extractMeta = (mod: Record<string, unknown>): BlockMeta => {\n if (typeof mod.id !== \"string\" || mod.id.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `id`\");\n if (typeof mod.name !== \"string\" || mod.name.trim() === \"\")\n throw new Error(\"Block script must export a non-empty string `name`\");\n const optional = OptionalBlockMetaSchema.safeParse(mod);\n if (!optional.success) {\n const issue = optional.error.issues[0];\n throw new Error(\n `Invalid block metadata${\n issue ? ` — ${issue.path.join(\".\")}: ${issue.message}` : \"\"\n }`,\n );\n }\n const params = parseParamsExport(mod.params);\n return { id: mod.id, name: mod.name, params, ...optional.data };\n};\n\nconst compileBlock = (script: string): CompiledBlock => {\n const cached = compileCache.get(script);\n if (cached) {\n // Refresh recency so live-edited drafts don't evict the document's defs.\n compileCache.delete(script);\n compileCache.set(script, cached);\n return cached;\n }\n const mod = toBlockModule(executeScriptModule(script));\n const meta = extractMeta(mod as unknown as Record<string, unknown>);\n if (compileCache.size >= COMPILE_CACHE_MAX) {\n const oldest = compileCache.keys().next().value;\n if (oldest !== undefined) compileCache.delete(oldest);\n }\n compileCache.set(script, { mod, meta });\n return { mod, meta };\n};\n\n/**\n * Identity/metadata of a block module. Sync; throws the transient\n * \"Compiling block script…\" until the lazy transpiler is loaded, and a\n * descriptive error for invalid modules (missing exports, bad params).\n */\nexport const getBlockMeta = (script: string): BlockMeta =>\n compileBlock(script).meta;\n\n/** Non-throwing meta lookup for list UIs. */\nexport type BlockMetaResult =\n | { ok: true; meta: BlockMeta }\n | {\n ok: false;\n error: string;\n /** True while the transient transpiler load is the only problem. */\n loading: boolean;\n };\n\nexport const getBlockMetaResult = (script: string): BlockMetaResult => {\n try {\n return { ok: true, meta: compileBlock(script).meta };\n } catch (e) {\n return {\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n loading: !scriptTranspilerReady(),\n };\n }\n};\n\n/** Meta for each script in a document's library (invalid entries report). */\nexport const listBlockMeta = (scripts: readonly string[]): BlockMetaResult[] =>\n scripts.map(getBlockMetaResult);\n\n/** Source-level `export const id = \"…\"` matcher (broken-module fallback). */\nconst ID_EXPORT_RE = /export\\s+const\\s+id\\s*=\\s*[\"']([^\"']+)[\"']/;\n\n/**\n * The script whose exported `id` matches — the definition lookup behind\n * `instance.definitionId`. Throws the transient loading error while the\n * transpiler is absent (a missing transpiler must read as \"compiling\", not\n * \"missing definition\"). A module that FAILS to compile still matches via a\n * source-level id scan, so its instances report the actual script error\n * instead of \"unknown definition\".\n */\nexport const findBlockScript = (\n scripts: readonly string[],\n id: string,\n): string | undefined => {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n for (const script of scripts) {\n try {\n if (compileBlock(script).meta.id === id) return script;\n } catch {\n if (ID_EXPORT_RE.exec(script)?.[1] === id) return script;\n }\n }\n return undefined;\n};\n\n/**\n * A module's exported id without requiring it to be valid: compiled meta\n * when possible, source-level scan otherwise. Undefined only when neither\n * yields one (including while the transpiler still loads and no literal id\n * export is present).\n */\nexport const blockScriptId = (script: string): string | undefined => {\n try {\n return compileBlock(script).meta.id;\n } catch {\n return ID_EXPORT_RE.exec(script)?.[1];\n }\n};\n\n/**\n * Transitive dependency closure of the given definition ids, following each\n * module's declared `dependencies` against the library. Returns the input\n * ids plus every reachable dependency id — INCLUDING ids that don't resolve\n * to a module (the caller decides whether a missing dep is an error or just\n * has nothing to bundle). Cycle-safe. Throws the transient loading error\n * while the transpiler is absent (callers ship the whole library instead).\n */\nexport const blockDependencyClosure = (\n scripts: readonly string[],\n ids: Iterable<string>,\n): Set<string> => {\n const closure = new Set<string>();\n const queue = [...ids];\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (closure.has(id)) continue;\n closure.add(id);\n const script = findBlockScript(scripts, id);\n if (script === undefined) continue;\n try {\n for (const dep of compileBlock(script).meta.dependencies ?? [])\n queue.push(dep);\n } catch {\n // Broken module — its declared deps are unreadable; ship what we have.\n }\n }\n return closure;\n};\n\n/**\n * Does any script in the library export this id? PERMISSIVE while the\n * transpiler is still loading (returns true) — used by ops validation,\n * where \"cannot verify yet\" must not reject a valid document.\n */\nexport const blockDefinitionExists = (\n scripts: readonly string[],\n id: string,\n): boolean => {\n if (!scriptTranspilerReady()) return true;\n return findBlockScript(scripts, id) !== undefined;\n};\n\n/**\n * Deep-clone + freeze the props handed to a script: freezing alone is\n * shallow, and a script mutating a Vec2 input would otherwise corrupt\n * cached state.\n */\nconst scriptProps = <T extends Record<string, unknown>>(props: T): T => {\n const cloned = structuredClone(props);\n for (const value of Object.values(cloned))\n if (value !== null && typeof value === \"object\") Object.freeze(value);\n return Object.freeze(cloned);\n};\n\n/** Run the script's `draw` and validate the result. */\nconst runScript = (\n script: string,\n params: Record<string, unknown>,\n inputs: ResolvedBlockInput[],\n styles: BlockStyleSources,\n): BlockChild[] => {\n const { mod } = compileBlock(script);\n // `styles` joins AFTER the deep clone (functions don't clone); what its\n // methods return is a frozen copy, like everything else a script sees.\n const props = Object.freeze({\n ...scriptProps({ params, inputs }),\n styles: stylesResolver(styles),\n });\n const raw = mod.draw(props);\n return BlockScriptResultSchema.parse(raw);\n};\n\n/** The document styles a block's `draw` can read (`styles.text(id)` /\n * `styles.dim(id)`), so a block can lay out with real text sizes. */\nexport interface BlockStyleSources {\n textStyles: readonly TextStyle[];\n dimStyles: readonly DimStyle[];\n}\n\n/** What a block sees without a document (dry runs, previews, headless\n * callers that pass none): the standard styles. */\nexport const DEFAULT_BLOCK_STYLES: BlockStyleSources = {\n textStyles: [DEFAULT_TEXT_STYLE],\n dimStyles: [DEFAULT_DIM_STYLE],\n};\n\n/** `draw`'s `styles`: id → the document style (\"\" / unknown → the first,\n * the same rule a stored object's `styleId` follows). */\nconst stylesResolver = (s: BlockStyleSources) =>\n Object.freeze({\n text: (id?: string) =>\n Object.freeze(\n structuredClone(textStyleFor({ styleId: id }, s.textStyles)),\n ),\n dim: (id?: string) =>\n Object.freeze(structuredClone(dimStyleFor({ styleId: id }, s.dimStyles))),\n });\n\n/** A short signature of the styles for evaluation cache keys — editing a\n * style re-evaluates blocks (they may read it). Hashed once per array. */\nconst styleSigs = new WeakMap<object, string>();\nconst stylesSig = (s: BlockStyleSources): string => {\n const sig = (styles: readonly object[]) => {\n let v = styleSigs.get(styles);\n if (v === undefined) {\n v = String(hashString(JSON.stringify(styles)));\n styleSigs.set(styles, v);\n }\n return v;\n };\n return `${sig(s.textStyles)}.${sig(s.dimStyles)}`;\n};\n\nconst ParamVisibilityResultSchema = z.record(z.string(), z.boolean());\n\n/**\n * Evaluate the module's optional `paramVisibility` export with the given\n * effective param values: per-parameter visibility flags for the properties\n * panel (names missing from the record stay visible). NON-THROWING — an\n * absent export, a compiling/broken module, a throwing function, or a bad\n * return shape all yield {} (everything visible); the save-time dry run is\n * where authors get those errors reported.\n */\nexport const getParamVisibility = (\n script: string,\n params: Record<string, unknown>,\n): Record<string, boolean> => {\n try {\n const { mod } = compileBlock(script);\n if (!mod.paramVisibility) return {};\n const raw = mod.paramVisibility(scriptProps({ params }));\n const parsed = ParamVisibilityResultSchema.safeParse(raw);\n return parsed.success ? parsed.data : {};\n } catch {\n return {};\n }\n};\n\nconst paramsKey = (params: Record<string, unknown>): string =>\n JSON.stringify(Object.entries(params).sort(([a], [b]) => a.localeCompare(b)));\n\n// ---------------------------------------------------------------------------\n// Input localization + cache signature\n// ---------------------------------------------------------------------------\n\n/** Round for the cache KEY only — kills float jitter without touching data. */\nconst r6 = (v: number): number => Math.round(v * 1e6) / 1e6;\nconst sigOf = (v: BlockInputValue): string =>\n typeof v === \"string\" ? `#${v}` : `${r6(v.x)},${r6(v.y)}`;\n\n/** A serial per referenced object RECORD. The kernel replaces an object on\n * every edit (and undo restores the old record), so the serial changes\n * exactly when the referenced content can have — and another document's\n * object under the same id is another record, another serial. */\nconst recordSerials = new WeakMap<object, number>();\nlet nextRecordSerial = 0;\nconst recordSig = (obj: ModelObject | undefined): string => {\n if (!obj) return \"-\";\n let n = recordSerials.get(obj);\n if (n === undefined) recordSerials.set(obj, (n = ++nextRecordSerial));\n return `@${n}`;\n};\n\n/**\n * The memo-key signature of the instance's inputs, localized against the\n * pivot. Object references contribute their id AND the resolved record's\n * identity (an O(1) index lookup): the memo is per instance id, which two\n * documents in one process can share — keying on the reference id alone\n * served one document the other's geometry.\n */\nconst inputsSig = (\n instance: Block,\n resolve: BlockObjectResolver | undefined,\n): string => {\n const pivot = blockPivot(instance);\n return instance.inputs\n .map((v) =>\n typeof v === \"string\"\n ? sigOf(v) + recordSig(resolve?.(v))\n : sigOf(sub(v, pivot)),\n )\n .join(\"|\");\n};\n\n/**\n * Resolve + localize inputs for a `draw` run: points localize against the\n * pivot (the pivot itself becomes {0,0}); id inputs resolve to the\n * referenced object translated into the same pivot-local frame, or null\n * when the reference no longer resolves.\n */\nconst resolveInputs = (\n inputs: readonly BlockInputValue[],\n pivot: Vec2,\n resolve: BlockObjectResolver | undefined,\n): ResolvedBlockInput[] => {\n const neg = { x: -pivot.x, y: -pivot.y };\n return inputs.map((v) => {\n if (typeof v !== \"string\") return sub(v, pivot);\n const obj = resolve?.(v);\n return obj ? translateObject(obj, neg) : null;\n });\n};\n\n/** What `place` must produce: an array of points / object ids. */\nconst BlockInputsSchema = z.array(z.union([Vec2Schema, z.string()]));\n\n/**\n * Run the script's `place` with the host's interactive pickers and\n * return the validated inputs array (world coords). A labels-array `place`\n * picks one point per label, in order; scripts without a `place` export\n * default to a single \"Insertion point\" pick. Await\n * `ensureScriptTranspiler` before calling from a flow that cannot tolerate\n * the transient compile error. Rejections from the pickers (user cancel)\n * propagate.\n */\nexport const acquireBlockInputs = async (\n script: string,\n pickers: BlockInputPickers,\n): Promise<BlockInputValue[]> => {\n const { mod, meta } = compileBlock(script);\n if (!mod.place) return [await pickers.pickPoint(\"Insertion point\")];\n if (isLabelArray(mod.place)) {\n const points: BlockInputValue[] = [];\n for (const label of mod.place) points.push(await pickers.pickPoint(label));\n return points;\n }\n const raw = await mod.place({\n params: scriptProps({ ...defaultParams(meta) }),\n pickPoint: pickers.pickPoint,\n pickObject: pickers.pickObject,\n });\n return BlockInputsSchema.parse(raw);\n};\n\n/**\n * Bounded stand-in pickers for dry-runs: points walk a small grid; after\n * `limit` picks they reject, so a `place` collecting \"until cancel\"\n * terminates the way a user's Escape would.\n */\nconst dryRunPickers = (limit = 16): BlockInputPickers => {\n let n = 0;\n const next = (): Vec2 => {\n if (n >= limit)\n throw new Error(`Input picking canceled (dry-run limit of ${limit})`);\n const i = n++;\n return { x: (i % 4) * 500, y: Math.floor(i / 4) * 500 };\n };\n return {\n pickPoint: (): Promise<Vec2> => new Promise((resolve) => resolve(next())),\n pickObject: (): Promise<string> => Promise.resolve(\"dry-run-object\"),\n };\n};\n\n/**\n * Stand-in resolver for dry runs and previews: hands every reference a\n * plausible object (a short line) so scripts that derive geometry from a\n * pick exercise their happy path instead of hitting null.\n */\nconst dryRunObjects = new Map<string, ModelObject>();\nexport const dryRunObjectResolver: BlockObjectResolver = (id) => {\n // One stable record per id, so previews keep their memo hits.\n let obj = dryRunObjects.get(id);\n if (!obj) {\n obj = {\n id,\n layerId: \"dry-run\",\n type: \"line\",\n a: { x: 0, y: 0 },\n b: { x: 100, y: 0 },\n };\n dryRunObjects.set(id, obj);\n }\n return obj;\n};\n\n/**\n * Acquire a module's inputs with the bounded stand-in pickers — the input\n * half of a dry run, shared by save-time testing and previews (a preview\n * instance built on these inputs paints exactly what inserting the block\n * would). An author-curated `previewInputs` export wins over the generic\n * stand-in picks, so previews/thumbnails can show the block at its best\n * (\"[x, y]\" tuples accepted; validated with an author-facing error).\n * Awaits the transpiler; script errors propagate.\n */\nexport const dryRunBlockInputs = async (\n script: string,\n): Promise<BlockInputValue[]> => {\n await ensureScriptTranspiler();\n const { mod } = compileBlock(script);\n if (mod.previewInputs !== undefined) {\n const parsed = BlockInputsSchema.safeParse(mod.previewInputs);\n if (!parsed.success)\n throw new Error(\n \"`previewInputs` must be an array of points ([x, y] or {x, y}) and/or object-id strings\",\n );\n return parsed.data;\n }\n return acquireBlockInputs(script, dryRunPickers());\n};\n\n/**\n * Dry-run a block module (editor's save): validate the identity exports,\n * acquire inputs via `place` with stand-in pickers, then run `draw`\n * on them with default params.\n */\nexport const testBlockDefinition = async (\n script: string,\n): Promise<{ ok: true } | { ok: false; error: string }> => {\n try {\n await ensureScriptTranspiler();\n const { mod, meta } = compileBlock(script);\n // `previewInputs` shortcuts the picker path for previews — but the dry\n // run must still exercise `place` (its errors would otherwise surface\n // only at insertion).\n if (mod.previewInputs !== undefined && mod.place !== undefined)\n await acquireBlockInputs(script, dryRunPickers());\n const inputs = await dryRunBlockInputs(script);\n const pivot = inputs.find((v): v is Vec2 => typeof v !== \"string\") ?? {\n x: 0,\n y: 0,\n };\n const local = resolveInputs(inputs, pivot, dryRunObjectResolver);\n const children = runScript(\n script,\n { ...defaultParams(meta) },\n local,\n DEFAULT_BLOCK_STYLES,\n );\n // Emitted nested instances must be DECLARED — dependencies is what\n // install/copy/export use to bundle the closure, so an undeclared one\n // would break every one of those paths silently.\n const declared = new Set(meta.dependencies ?? []);\n for (const child of children) {\n if (child.type === \"block\" && !declared.has(child.definitionId))\n throw new Error(\n `draw emits an instance of \"${child.definitionId}\" — declare it in \\`dependencies\\``,\n );\n }\n // The panel-facing paramVisibility is non-throwing (falls back to\n // all-visible), so the dry run is where its errors reach the author.\n if (mod.paramVisibility) {\n const raw = mod.paramVisibility(\n scriptProps({ params: { ...defaultParams(meta) } }),\n );\n if (!ParamVisibilityResultSchema.safeParse(raw).success)\n throw new Error(\n \"`paramVisibility` must return an object of boolean flags keyed by parameter name\",\n );\n }\n return { ok: true };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n};\n\n/**\n * Child DTO → full pseudo model object in block-LOCAL coordinates.\n * BlockChild is the model schema minus exactly {id, layerId, hidden}\n * (derived via omit in blockDtos), so re-adding those three is all the\n * cast bridges.\n */\nconst childToObject = (\n child: BlockChild,\n instance: Block,\n index: number,\n): ModelObject => {\n return {\n color: instance.color,\n lineType: instance.lineType,\n lineTypeScale: instance.lineTypeScale,\n lineWidth: instance.lineWidth,\n ...child,\n id: `${instance.id}:${index}`,\n layerId: instance.layerId,\n } as ModelObject;\n};\n\n/**\n * Evaluated children of an instance in WORLD coordinates (pseudo objects with\n * synthetic ids). Painters, snapping, hit-testing, and Explode all consume\n * this. Errors are recorded volatile and yield an empty list. The document's\n * block module sources are passed in (the kernel holds no store).\n */\n// Blocks may contain nested block instances; guard against definition cycles\n// (a script emitting an instance of an ancestor def would recurse forever).\nconst evaluating = new Set<string>();\n\nexport const getEvaluatedWorldChildren = (\n instance: Block,\n scripts: readonly string[],\n resolveObject?: BlockObjectResolver,\n /** The document's styles, readable in `draw` (`styles.text(id)`). */\n styles: BlockStyleSources = DEFAULT_BLOCK_STYLES,\n): ModelObject[] => {\n // Keep the dependency registry current on EVERY call (cheap): expansion\n // must know about references even when this call ends as a memo hit.\n const refs = instance.inputs.filter(\n (v): v is string => typeof v === \"string\",\n );\n if (refs.length > 0) {\n const deps = instanceDeps.get(instance.id);\n if (deps) for (const r of refs) deps.add(r);\n else instanceDeps.set(instance.id, new Set(refs));\n }\n\n let guarded: string | null = null;\n try {\n if (!scriptTranspilerReady()) throw transpilerLoadingError();\n const script = findBlockScript(scripts, instance.definitionId);\n if (!script) {\n evalErrors.set(\n instance.id,\n `Unknown block definition (${instance.definitionId})`,\n );\n return [];\n }\n const { meta } = compileBlock(script);\n if (evaluating.has(meta.id)) {\n evalErrors.set(instance.id, `Recursive block definition (${meta.name})`);\n return [];\n }\n evaluating.add(meta.id);\n guarded = meta.id;\n\n const params = instanceParams(meta, instance.params);\n let children: BlockChild[];\n if (instance.inputs.length > 0) {\n const key = `${meta.id}:${hashString(script)}:${paramsKey(\n params,\n )}:${inputsSig(instance, resolveObject)}:${stylesSig(styles)}`;\n const hit = instanceMemo.get(instance.id);\n if (hit && hit.key === key) {\n children = hit.children;\n } else {\n const values = resolveInputs(\n instance.inputs,\n blockPivot(instance),\n resolveObject,\n );\n children = runScript(script, params, values, styles);\n instanceMemo.set(instance.id, { key, children });\n }\n } else {\n // Input-less instances share results across instances.\n const key = `${meta.id}:${hashString(script)}:${paramsKey(\n params,\n )}:${stylesSig(styles)}`;\n const cached = resultCache.get(key);\n if (cached) {\n children = cached;\n } else {\n children = runScript(script, params, [], styles);\n if (resultCache.size >= RESULT_CACHE_MAX) {\n const oldest = resultCache.keys().next().value;\n if (oldest !== undefined) resultCache.delete(oldest);\n }\n resultCache.set(key, children);\n }\n }\n evalErrors.delete(instance.id);\n const pivot = blockPivot(instance);\n return children.map((child, i) => {\n let obj = childToObject(child, instance, i);\n if (instance.scale !== 1) obj = scaleObjectUniform(obj, instance.scale);\n if (instance.rotation !== 0)\n obj = rotateObject(obj, { x: 0, y: 0 }, instance.rotation);\n return translateObject(obj, pivot);\n });\n } catch (e) {\n evalErrors.set(instance.id, e instanceof Error ? e.message : String(e));\n return [];\n } finally {\n if (guarded !== null) evaluating.delete(guarded);\n }\n};\n","// Segment / line utilities. All in world mm.\n\nimport type { Vec2 } from \"./vec2\";\nimport { add, cross, dist, dot, lenSq, scale, sub } from \"./vec2\";\n\nexport interface Segment {\n a: Vec2;\n b: Vec2;\n}\n\n/** Parameter t of the projection of p onto the infinite line through a-b (t=0 at a, t=1 at b). */\nexport const projectParam = (p: Vec2, a: Vec2, b: Vec2): number => {\n const ab = sub(b, a);\n const l2 = lenSq(ab);\n if (l2 === 0) return 0;\n return dot(sub(p, a), ab) / l2;\n};\n\n/** Closest point to p on the infinite line through a-b. */\nexport const projectOntoLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 =>\n add(a, scale(sub(b, a), projectParam(p, a, b)));\n\n/** Closest point to p on the segment a-b. */\nexport const closestPointOnSegment = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const t = Math.max(0, Math.min(1, projectParam(p, a, b)));\n return add(a, scale(sub(b, a), t));\n};\n\nexport const distToSegment = (p: Vec2, a: Vec2, b: Vec2): number =>\n dist(p, closestPointOnSegment(p, a, b));\n\n/**\n * Intersection of infinite lines (p1-p2) and (p3-p4).\n * Returns null when parallel.\n */\nexport const lineLineIntersection = (\n p1: Vec2,\n p2: Vec2,\n p3: Vec2,\n p4: Vec2,\n): Vec2 | null => {\n const d1 = sub(p2, p1);\n const d2 = sub(p4, p3);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(p3, p1), d2) / denom;\n return add(p1, scale(d1, t));\n};\n\n/**\n * Intersection point of segments a1-a2 and b1-b2, or null.\n * Endpoint touches count as intersections.\n */\nexport const segSegIntersection = (\n a1: Vec2,\n a2: Vec2,\n b1: Vec2,\n b2: Vec2,\n): Vec2 | null => {\n const d1 = sub(a2, a1);\n const d2 = sub(b2, b1);\n const denom = cross(d1, d2);\n if (Math.abs(denom) < 1e-12) return null;\n const t = cross(sub(b1, a1), d2) / denom;\n const u = cross(sub(b1, a1), d1) / denom;\n const eps = 1e-9;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return add(a1, scale(d1, t));\n};\n\n/** Reflect a point across the infinite line through a-b. */\nexport const reflectAcrossLine = (p: Vec2, a: Vec2, b: Vec2): Vec2 => {\n const foot = projectOntoLine(p, a, b);\n return { x: 2 * foot.x - p.x, y: 2 * foot.y - p.y };\n};\n\n/** Does segment a1-a2 intersect the axis-aligned rect (used by crossing selection)? */\nexport const segIntersectsRect = (\n a: Vec2,\n b: Vec2,\n min: Vec2,\n max: Vec2,\n): boolean => {\n // Either endpoint inside\n const inside = (p: Vec2) =>\n p.x >= min.x && p.x <= max.x && p.y >= min.y && p.y <= max.y;\n if (inside(a) || inside(b)) return true;\n // Or the segment crosses one of the 4 edges\n const corners = [\n { x: min.x, y: min.y },\n { x: max.x, y: min.y },\n { x: max.x, y: max.y },\n { x: min.x, y: max.y },\n ];\n for (let i = 0; i < 4; i++) {\n if (segSegIntersection(a, b, corners[i], corners[(i + 1) % 4])) return true;\n }\n return false;\n};\n","import type { ModelObject, ModelObjectDto } from \"./model/objects\";\nimport type { Vec2 } from \"./geometry/vec2\";\nimport {\n add,\n angle,\n fromAngle,\n normAngle,\n rot,\n rotAround,\n scale,\n sub,\n} from \"./geometry/vec2\";\nimport { reflectAcrossLine } from \"./geometry/line\";\n\n/** Clone an object without its id (the funnel stamps a fresh one on add). */\nexport const stripId = (obj: ModelObject): ModelObjectDto => {\n const clone: Partial<ModelObject> = { ...obj };\n delete clone.id;\n return clone as ModelObjectDto;\n};\n\n/**\n * Remap a block instance's object-reference inputs through an old→new id\n * map (ids absent from the map pass through untouched). Non-block objects\n * return unchanged.\n */\nexport const remapBlockInputRefs = (\n obj: ModelObject,\n idMap: ReadonlyMap<string, string>,\n): ModelObject => {\n if (obj.type !== \"block\") return obj;\n if (!obj.inputs.some((v) => typeof v === \"string\" && idMap.has(v)))\n return obj;\n return {\n ...obj,\n inputs: obj.inputs.map((v) =>\n typeof v === \"string\" ? (idMap.get(v) ?? v) : v,\n ),\n };\n};\n\n/**\n * Clone a batch for duplication (copy / array / mirror-copy / paste): fresh\n * ids, with block object-reference inputs that point INSIDE the batch\n * following to the clones — a copied annotation tracks the copied geometry,\n * not the original. References to objects outside the batch keep pointing\n * at the originals (dangling ones stay dangling and evaluate as null).\n */\nexport const duplicateObjects = (\n objects: readonly ModelObject[],\n): ModelObject[] => {\n const idMap = new Map(objects.map((o) => [o.id, crypto.randomUUID()]));\n return objects.map((o) => ({\n ...remapBlockInputRefs(o, idMap),\n id: idMap.get(o.id) ?? o.id,\n }));\n};\n\ntype BlockObj = Extract<ModelObject, { type: \"block\" }>;\n\n/**\n * Map a block's input points (world coords) through a point transform.\n * Instances carry their pose IN these points — transforms move the points\n * and the script re-derives direction/size, which is also what makes mirror\n * come out right for script-derived geometry. Reference values (strings)\n * pass through untouched.\n */\nconst mapInputPoints = (\n obj: BlockObj,\n fn: (p: Vec2) => Vec2,\n): BlockObj[\"inputs\"] =>\n obj.inputs.map((value) => (typeof value === \"string\" ? value : fn(value)));\n\n/**\n * With ≥2 point inputs the pose is fully determined by the points — the\n * rotation/scale fields stay untouched under transforms (accumulating them\n * on top would double-apply). A single-point instance is a classic symbol:\n * its point only carries position, so rotate/scale/mirror ALSO accumulate\n * the instance fields (applied last, about that point). ANY object-reference\n * input also disqualifies accumulation: geometry derived from the referenced\n * object already follows it, so accumulating rotation/scale on top would\n * double-apply when the reference transforms along (e.g. rotating a\n * selection holding both the instance and its referenced object).\n */\nconst pointsCarryPose = (obj: BlockObj): boolean =>\n obj.inputs.some((v) => typeof v === \"string\") ||\n obj.inputs.filter((v) => typeof v !== \"string\").length >= 2;\n\ntype ImageObj = Extract<ModelObject, { type: \"image\" }>;\n\n/** World center of an image's (rotated) footprint. */\nexport const imageCenter = (obj: ImageObj): Vec2 =>\n add(obj.origin, rot({ x: obj.width / 2, y: obj.height / 2 }, obj.rotation));\n\n/** The four corners of an image's footprint, CCW from `origin`. */\nexport const imageCorners = (obj: ImageObj): [Vec2, Vec2, Vec2, Vec2] => {\n const c = (x: number, y: number) =>\n add(obj.origin, rot({ x, y }, obj.rotation));\n return [\n obj.origin,\n c(obj.width, 0),\n c(obj.width, obj.height),\n c(0, obj.height),\n ];\n};\n\n/**\n * Map every point field of an object through `fn` (polyline/hatch vertices\n * keep their bulges; viewports pass through untouched). The four transforms\n * layer their per-type scalar/angle/bulge fixups on top.\n */\nconst mapObjectPoints = (\n obj: ModelObject,\n fn: (p: Vec2) => Vec2,\n): ModelObject => {\n switch (obj.type) {\n case \"line\":\n return { ...obj, a: fn(obj.a), b: fn(obj.b) };\n case \"point\":\n return { ...obj, p: fn(obj.p) };\n case \"polyline\":\n return { ...obj, points: obj.points.map((v) => ({ ...v, ...fn(v) })) };\n case \"circle\":\n case \"arc\":\n case \"ellipse\":\n return { ...obj, center: fn(obj.center) };\n case \"hatch\":\n return {\n ...obj,\n loops: obj.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, ...fn(v) })),\n })),\n };\n case \"text\":\n return {\n ...obj,\n position: fn(obj.position),\n leaderLines: obj.leaderLines.map((l) => l.map(fn)),\n };\n case \"dimension\":\n // offset is anchor-relative — the caller decides how it maps.\n return { ...obj, points: obj.points.map(fn) };\n case \"block\":\n return { ...obj, inputs: mapInputPoints(obj, fn) };\n case \"viewport\":\n return obj;\n case \"image\":\n return { ...obj, origin: fn(obj.origin) };\n case \"comment\":\n // The marker stays upright (screen-chrome-like): only the pin moves.\n return { ...obj, position: fn(obj.position) };\n case \"table\":\n return { ...obj, position: fn(obj.position) };\n case \"reference\":\n return { ...obj, position: fn(obj.position) };\n }\n};\n\n/** Pure translation of any model object by a world-space delta. */\nexport const translateObject = (obj: ModelObject, delta: Vec2): ModelObject => {\n const mapped = mapObjectPoints(obj, (p) => add(p, delta));\n return mapped.type === \"viewport\"\n ? {\n ...mapped,\n rect: {\n ...mapped.rect,\n x: mapped.rect.x + delta.x,\n y: mapped.rect.y + delta.y,\n },\n }\n : mapped;\n};\n\n/** Translate a viewport so its frame center lands on `newCenter` of `map`. */\nconst moveViewportCenter = (\n obj: Extract<ModelObject, { type: \"viewport\" }>,\n map: (p: Vec2) => Vec2,\n): ModelObject => {\n const c = {\n x: obj.rect.x + obj.rect.w / 2,\n y: obj.rect.y + obj.rect.h / 2,\n };\n const nc = map(c);\n return translateObject(obj, sub(nc, c));\n};\n\n/** Pure rotation of any model object around a center by `ang` radians CCW. */\nexport const rotateObject = (\n obj: ModelObject,\n center: Vec2,\n ang: number,\n): ModelObject => {\n const r = (p: Vec2) => rotAround(p, center, ang);\n const mapped = mapObjectPoints(obj, r);\n switch (mapped.type) {\n case \"arc\":\n return {\n ...mapped,\n startAngle: normAngle(mapped.startAngle + ang),\n endAngle: normAngle(mapped.endAngle + ang),\n };\n case \"ellipse\":\n return { ...mapped, majorAxis: rot(mapped.majorAxis, ang) };\n case \"text\":\n case \"table\":\n return { ...mapped, rotation: mapped.rotation + ang };\n case \"dimension\":\n return { ...mapped, offset: rot(mapped.offset, ang) };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mapped.rotation + ang };\n case \"viewport\":\n // Frames stay axis-aligned: the placement orbits, content unrotated.\n return moveViewportCenter(mapped, r);\n case \"image\":\n case \"reference\":\n return { ...mapped, rotation: normAngle(mapped.rotation + ang) };\n case \"line\":\n case \"point\":\n case \"polyline\":\n case \"circle\":\n case \"hatch\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/** Pure uniform scale of any model object about the origin. */\nexport const scaleObjectUniform = (\n obj: ModelObject,\n s: number,\n): ModelObject => {\n const m = (p: Vec2): Vec2 => ({ x: p.x * s, y: p.y * s });\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"circle\":\n case \"arc\":\n return { ...mapped, radius: mapped.radius * s };\n case \"ellipse\":\n return { ...mapped, majorAxis: m(mapped.majorAxis) };\n case \"hatch\":\n return {\n ...mapped,\n fill:\n mapped.fill.kind === \"lines\"\n ? { ...mapped.fill, spacing: mapped.fill.spacing * s }\n : mapped.fill.kind === \"pattern\"\n ? { ...mapped.fill, scale: mapped.fill.scale * s }\n : mapped.fill,\n };\n case \"text\":\n case \"table\":\n // `scale` multiplies textHeight/arrowSize/width at paint time\n // (textGeometry), covering own AND inherited sizes — scaling\n // styleOverride or width here too would apply s twice.\n return { ...mapped, scale: mapped.scale * s };\n case \"dimension\":\n return { ...mapped, offset: m(mapped.offset), scale: mapped.scale * s };\n case \"block\":\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, scale: mapped.scale * s };\n case \"viewport\":\n // Frame and view scale together: the same model window, s× larger.\n return {\n ...mapped,\n rect: {\n x: mapped.rect.x * s,\n y: mapped.rect.y * s,\n w: mapped.rect.w * s,\n h: mapped.rect.h * s,\n },\n // Same model window through an s× frame: the 1:N denominator (model\n // mm per paper mm) shrinks as the frame grows.\n scale: mapped.scale / s,\n };\n case \"image\":\n return { ...mapped, width: mapped.width * s, height: mapped.height * s };\n case \"reference\":\n return { ...mapped, scale: mapped.scale * s };\n case \"point\":\n // The point dot's size is a lineweight, not geometry — position only.\n return mapped;\n case \"line\":\n case \"polyline\":\n case \"comment\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n\n/**\n * Pure mirror of any model object across the line a-b. Reflection reverses\n * orientation: bulges negate and CCW angle ranges swap ends.\n * Block instances only reflect their insertion point/rotation (their child\n * geometry is not handed — documented v1 limitation).\n */\nexport const mirrorObject = (\n obj: ModelObject,\n a: Vec2,\n b: Vec2,\n): ModelObject => {\n const m = (p: Vec2) => reflectAcrossLine(p, a, b);\n const axisAngle = angle(sub(b, a));\n const mirrorAngle = (t: number) => normAngle(2 * axisAngle - t);\n if (obj.type === \"ellipse\") {\n const center = m(obj.center);\n const majorAxis = sub(m(add(obj.center, obj.majorAxis)), center);\n return {\n ...obj,\n center: center,\n majorAxis,\n startAngle: normAngle(-obj.endAngle),\n endAngle: normAngle(-obj.startAngle),\n };\n }\n if (obj.type === \"reference\") {\n // A true reflection: the insertion point reflects and the left-right\n // flip toggles — Ref(α)·R(θ) = R(2α−θ+π)·flipX, and flipX² = I either\n // way — content, text included, mirrors.\n return {\n ...obj,\n position: m(obj.position),\n rotation: normAngle(mirrorAngle(obj.rotation) + Math.PI),\n mirrored: !obj.mirrored,\n };\n }\n if (obj.type === \"image\") {\n // Pixels can't reflect (no flip support): the CENTER reflects and the\n // rotation mirrors, keeping the footprint on the mirrored spot.\n const c = imageCenter(obj);\n const rotation = mirrorAngle(obj.rotation);\n const moved = { ...obj, rotation };\n return translateObject(moved, sub(m(c), imageCenter(moved)));\n }\n if (obj.type === \"table\") {\n // Readable like text (MIRRTEXT=0): the TOP EDGE reflects and the table\n // keeps hanging down from it. When the reflected baseline is flipped\n // 180° to stay readable, the reflected top-RIGHT becomes the new\n // top-left. Only the width is needed (the height depends on measured\n // text, which transforms can't see).\n const width = obj.columns.reduce((a, w) => a + w, 0) * obj.scale;\n const topRight = add(obj.position, scale(fromAngle(obj.rotation), width));\n const reflected = normAngle(mirrorAngle(obj.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n return {\n ...obj,\n position: m(readable ? obj.position : topRight),\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n };\n }\n const mapped = mapObjectPoints(obj, m);\n switch (mapped.type) {\n case \"polyline\":\n return {\n ...mapped,\n points: mapped.points.map((v) => ({ ...v, bulge: -v.bulge })),\n };\n case \"arc\":\n return {\n ...mapped,\n startAngle: mirrorAngle(mapped.endAngle),\n endAngle: mirrorAngle(mapped.startAngle),\n };\n case \"hatch\":\n return {\n ...mapped,\n loops: mapped.loops.map((loop) => ({\n points: loop.points.map((v) => ({ ...v, bulge: -v.bulge })),\n })),\n };\n case \"text\": {\n // Keep glyphs READABLE (CAD MIRRTEXT=0): the anchor and leaders\n // reflect, but when the reflected baseline would run upside-down\n // (outside the (-90°, 90°] reading band) it flips 180° and the\n // horizontal alignment swaps so the text covers the mirrored extent.\n const reflected = normAngle(mirrorAngle(mapped.rotation));\n const readable =\n reflected <= Math.PI / 2 + 1e-9 || reflected > (3 * Math.PI) / 2 + 1e-9;\n const swap = { left: \"right\", center: \"center\", right: \"left\" } as const;\n return {\n ...mapped,\n rotation: readable ? reflected : normAngle(reflected + Math.PI),\n hAlign: readable ? mapped.hAlign : swap[mapped.hAlign],\n };\n }\n case \"dimension\":\n // offset is a direction vector: reflect it without translation.\n return { ...mapped, offset: sub(m(add(a, mapped.offset)), a) };\n case \"block\":\n // Multi-point: reflected points make script-derived geometry mirror\n // correctly (single-point child geometry still can't reflect — the\n // rotation flip below only orbits it).\n return pointsCarryPose(mapped)\n ? mapped\n : { ...mapped, rotation: mirrorAngle(mapped.rotation) };\n case \"viewport\":\n // Frames stay axis-aligned: only the placement reflects.\n return moveViewportCenter(mapped, m);\n case \"line\":\n case \"point\":\n case \"circle\":\n case \"comment\":\n return mapped;\n // Mirrored above, before the point map.\n case \"ellipse\":\n case \"reference\":\n case \"image\":\n case \"table\":\n return mapped;\n default:\n return mapped satisfies never;\n }\n};\n","// Schema for what a block script may RETURN: model objects minus identity\n// (id/layerId/hidden), in block-local coordinates (mm, y-up, origin at the\n// insertion point). Derived from the model schemas so the two cannot drift.\n// Points accept both {x, y} and [x, y] (see Vec2Schema/PolylineVertexSchema).\n// Children inherit the instance's layer/color/lineWidth unless they carry\n// their own.\n\nimport { z } from \"zod\";\nimport {\n ArcSchema,\n BlockSchema,\n CircleSchema,\n DimensionSchema,\n EllipseSchema,\n HatchSchema,\n LineSchema,\n PointSchema,\n PolylineSchema,\n TextSchema,\n} from \"../model/objects\";\nimport {\n dimensionRawToOffset,\n dimRawScaleToField,\n leaderRawToText,\n textRawStyleToOverride,\n} from \"../model/migrations\";\n\n/** Identity comes from the block instance, not the script. */\nconst CHILD_OMIT = { id: true, layerId: true } as const;\n\n// Every model object type except viewport (sheet furniture, never block\n// geometry). Block children allow nested instances via `definitionId`.\n// Nested instances MAY carry point input values (parent-local; the parent's\n// transform pass carries them to world) but never REFERENCE values (strings)\n// — script-emitted references to real model ids would evade dependency\n// tracking.\nexport const BlockChildSchema = z.preprocess(\n // Back-compat: scripts written before document v6 may still emit \"leader\"\n // children (→ text with leaderLines), pre-v9 scripts may emit dimensions\n // in the linePoint/rotation shape (→ offset), pre-v17 scripts may put\n // style fields (font/widthFactor/textHeight/arrowSize) directly on a text\n // (→ styleOverride), and pre-v18 scripts may put a dimension's scale in\n // its styleOverride (→ the direct field) — convert like the migrations do\n // (scripts are user code we can't rewrite).\n (raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n let obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") obj = leaderRawToText(obj);\n if (obj.type === \"dimension\")\n return dimRawScaleToField(dimensionRawToOffset(obj));\n if (obj.type === \"text\") return textRawStyleToOverride(obj);\n return obj;\n },\n z.discriminatedUnion(\"type\", [\n LineSchema.omit(CHILD_OMIT),\n PointSchema.omit(CHILD_OMIT),\n PolylineSchema.omit(CHILD_OMIT),\n CircleSchema.omit(CHILD_OMIT),\n ArcSchema.omit(CHILD_OMIT),\n EllipseSchema.omit(CHILD_OMIT),\n HatchSchema.omit(CHILD_OMIT),\n TextSchema.omit(CHILD_OMIT),\n DimensionSchema.omit(CHILD_OMIT),\n BlockSchema.omit(CHILD_OMIT).refine(\n (b) => b.inputs.every((v) => typeof v !== \"string\"),\n { message: \"nested block instances may not carry object references\" },\n ),\n ]),\n);\nexport type BlockChild = z.infer<typeof BlockChildSchema>;\n\nexport const BlockScriptResultSchema = z.array(BlockChildSchema);\n","// JS-literal serialization: generated block-script fragments should read like\n// hand-written JavaScript (unquoted keys, inline {x, y} points), not JSON.\n// Used by the BLOCK command's captured-geometry script and the v14 document\n// migration that folds stored definition metadata into module exports.\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst jsKey = (k: string): string =>\n IDENTIFIER.test(k) ? k : JSON.stringify(k);\n\nexport const toJsLiteral = (value: unknown, indent: string): string => {\n if (typeof value === \"number\") return String(Math.round(value * 1e6) / 1e6);\n if (value === null || typeof value === \"boolean\") return String(value);\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n const inner = indent + \" \";\n return `[\\n${value.map((item) => inner + toJsLiteral(item, inner)).join(\",\\n\")}\\n${indent}]`;\n }\n if (typeof value === \"object\") {\n // Own keys explicitly set to undefined (e.g. a \"by layer\" reset stored\n // as `{ ...o, color: undefined }`) mean the same as absent — omit them\n // instead of printing `key: undefined`.\n const entries = Object.entries(value).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return \"{}\";\n // Small flat objects ({x, y}, vertices) stay on one line.\n const flat = entries.every(([, v]) => typeof v !== \"object\" || v === null);\n if (flat && entries.length <= 4) {\n return `{ ${entries.map(([k, v]) => `${jsKey(k)}: ${toJsLiteral(v, indent)}`).join(\", \")} }`;\n }\n const inner = indent + \" \";\n return `{\\n${entries\n .map(([k, v]) => `${inner}${jsKey(k)}: ${toJsLiteral(v, inner)}`)\n .join(\",\\n\")}\\n${indent}}`;\n }\n return \"undefined\";\n};\n","/**\n * Document migrations. Runs inside the LineaDocument z.preprocess, so it is\n * shared by file load and working-copy load.\n *\n * Discipline (from calculus-app): prefer .optional()/.default() on new schema\n * fields; bump CURRENT_DOCUMENT_VERSION and add a migration step here only\n * when a field's shape actually changes.\n */\n\nimport { toJsLiteral } from \"../extensions/jsLiteral\";\n\nexport const CURRENT_DOCUMENT_VERSION = 20;\n\n/**\n * A raw v5 \"leader\" object → v6 \"text\" with leaderLines. Exported because\n * block scripts may still EMIT leader child DTOs (user code we can't\n * rewrite) — blockDtos runs the same conversion. The text position/alignment\n * reproduce the old painter's derived anchor (gap past the last point,\n * facing the last segment's direction), so documents render identically.\n */\nexport const leaderRawToText = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n const points = Array.isArray(raw.points)\n ? (raw.points as { x: number; y: number }[])\n : [];\n const extraLines = Array.isArray(raw.extraLines) ? raw.extraLines : [];\n const textHeight =\n typeof raw.textHeight === \"number\" && raw.textHeight > 0\n ? raw.textHeight\n : 2.5;\n const last = points[points.length - 1] ?? { x: 0, y: 0 };\n const prev = points[points.length - 2] ?? last;\n const rightward = last.x - prev.x >= 0;\n const gap = textHeight * 0.6;\n const rest = { ...raw };\n delete rest.points;\n delete rest.extraLines;\n delete rest.textHeight;\n return {\n ...rest,\n type: \"text\",\n position: { x: last.x + (rightward ? gap : -gap), y: last.y },\n height: textHeight,\n rotation: 0,\n // Model semantics name where the text SITS: past the last point.\n hAlign: rightward ? \"right\" : \"left\",\n vAlign: \"center\",\n leaderLines: points.length >= 2 ? [points, ...extraLines] : extraLines,\n scale: 1,\n };\n};\n\n/**\n * v1 → v2: paper-space viewports move from `layout.viewports` into\n * `layout.objects` as first-class \"viewport\" objects (they gain the object\n * base fields: layerId).\n */\nconst migrateV1toV2 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layers = Array.isArray(doc.layers) ? doc.layers : [];\n const firstLayerId = (layers[0] as { id?: string } | undefined)?.id;\n const defaultLayerId =\n typeof doc.currentLayerId === \"string\" && doc.currentLayerId !== \"\"\n ? doc.currentLayerId\n : (firstLayerId ?? \"\");\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n const viewports = Array.isArray(layout.viewports)\n ? layout.viewports\n : [];\n const objects = Array.isArray(layout.objects) ? layout.objects : [];\n const migrated = viewports.map((vp) => ({\n ...(vp as Record<string, unknown>),\n type: \"viewport\",\n layerId: defaultLayerId,\n }));\n const rest = { ...layout, objects: [...migrated, ...objects] };\n return rest;\n })\n : doc.layouts;\n\n return { ...doc, layouts, version: 2 };\n};\n\n/**\n * v2 → v3: ellipse `startParam`/`endParam` renamed to `startAngle`/`endAngle`\n * (matching arcs, dxf-parser, and AutoCAD's property palette — the value is\n * still the DXF parametric angle).\n */\nconst migrateV2toV3 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameEllipse = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"ellipse\") return raw;\n const { startParam, endParam, ...rest } = obj;\n return {\n ...rest,\n startAngle: obj.startAngle ?? startParam ?? 0,\n endAngle: obj.endAngle ?? endParam ?? Math.PI * 2,\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameEllipse) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 3 };\n};\n\n/**\n * v3 → v4: `strokeWidth` renamed to `lineWidth` on layers and objects.\n * Block definition SCRIPTS are user code emitting child DTOs — they get a\n * textual rename (the token has no other meaning in block scripts; zod's\n * strip mode would otherwise silently drop the old key on evaluation).\n */\nconst migrateV3toV4 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (!(\"strokeWidth\" in obj)) return raw;\n const { strokeWidth, ...rest } = obj;\n return { ...rest, lineWidth: obj.lineWidth ?? strokeWidth };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: def.script.replaceAll(\"strokeWidth\", \"lineWidth\"),\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n layers: mapObjects(doc.layers),\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 4,\n };\n};\n\n/**\n * v4 → v5: text alignment semantics inverted — the value now names where the\n * text SITS relative to its anchor point (\"left\" = text left of the point)\n * instead of which edge is anchored. Stored values swap (left↔right,\n * top↔bottom) so existing documents render pixel-identically. Block scripts\n * emitting non-center text alignments are NOT rewritten (values are computed\n * data, not renameable tokens) and will render mirrored — acceptable, rare.\n */\n/** Every text object's alignment flipped (left↔right, top↔bottom), in\n * model space and every layout — the same rendering under the inverse\n * convention. Used by v4→v5 and, reversing it, v19→v20. */\nconst swapTextAlignments = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const swapH: Record<string, string> = { left: \"right\", right: \"left\" };\n const swapV: Record<string, string> = { top: \"bottom\", bottom: \"top\" };\n const swapAlign = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"text\") return raw;\n return {\n ...obj,\n ...(typeof obj.hAlign === \"string\" && swapH[obj.hAlign]\n ? { hAlign: swapH[obj.hAlign] }\n : {}),\n ...(typeof obj.vAlign === \"string\" && swapV[obj.vAlign]\n ? { vAlign: swapV[obj.vAlign] }\n : {}),\n };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(swapAlign) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts };\n};\n\nconst migrateV4toV5 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 5 });\n\n/**\n * v5 → v6: the standalone \"leader\" type merges into \"text\" (which gains\n * leaderLines/arrowSize/scale). Existing text objects pick the new fields up\n * via schema defaults. Dimension styleOverrides are also cleaned: zod's\n * partial() used to bake ALL default values into any override, freezing the\n * object against document-style edits — override keys still equal to the\n * historic defaults are dropped (identical rendering, styles unfrozen).\n */\nconst DIM_OVERRIDE_HISTORIC_DEFAULTS: Record<string, number> = {\n textHeight: 2.5,\n arrowSize: 2.5,\n extensionOffset: 1,\n extensionOvershoot: 1.25,\n precision: 1,\n scale: 1,\n};\n\nconst migrateV5toV6 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type === \"leader\") return leaderRawToText(obj);\n if (\n obj.type === \"dimension\" &&\n obj.styleOverride !== null &&\n typeof obj.styleOverride === \"object\"\n ) {\n const cleaned = Object.fromEntries(\n Object.entries(obj.styleOverride).filter(\n ([k, v]) => DIM_OVERRIDE_HISTORIC_DEFAULTS[k] !== v,\n ),\n );\n return {\n ...obj,\n styleOverride: Object.keys(cleaned).length > 0 ? cleaned : undefined,\n };\n }\n return raw;\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 6 };\n};\n\n/**\n * v6 → v7: dimension `defPoints` renamed to `points` (consistent with\n * polylines). Block definition scripts get the same textual rename as the\n * v3→v4 strokeWidth migration — the token has no other meaning in scripts,\n * and zod's strip mode would otherwise silently drop the old key.\n */\nconst migrateV6toV7 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const renameKey = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\" || !(\"defPoints\" in obj)) return raw;\n const { defPoints, ...rest } = obj;\n return { ...rest, points: obj.points ?? defPoints };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(renameKey) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? { ...def, script: def.script.replaceAll(\"defPoints\", \"points\") }\n : def;\n })\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 7,\n };\n};\n\n/**\n * v7 → v8: `dimStyle.scale` (the document-level annotation scale) is removed;\n * scale is per-dimension only (`styleOverride.scale`, absent = 1). A non-1\n * document scale is baked into every dimension that doesn't override it, so\n * existing drawings render identically. Block-script-emitted dimensions can't\n * be baked (their DTOs are recomputed on eval) — acceptable, rare.\n */\nconst migrateV7toV8 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const dimStyle =\n doc.dimStyle !== null && typeof doc.dimStyle === \"object\"\n ? { ...(doc.dimStyle as Record<string, unknown>) }\n : undefined;\n const docScale =\n dimStyle && typeof dimStyle.scale === \"number\" && dimStyle.scale > 0\n ? dimStyle.scale\n : 1;\n if (dimStyle) delete dimStyle.scale;\n\n const bake = (raw: unknown): unknown => {\n if (docScale === 1) return raw;\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"dimension\") return raw;\n const override =\n obj.styleOverride !== null && typeof obj.styleOverride === \"object\"\n ? (obj.styleOverride as Record<string, unknown>)\n : {};\n if (typeof override.scale === \"number\") return raw; // own scale wins\n return { ...obj, styleOverride: { ...override, scale: docScale } };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(bake) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return {\n ...doc,\n ...(dimStyle ? { dimStyle } : {}),\n objects: mapObjects(doc.objects),\n layouts,\n version: 8,\n };\n};\n\n/**\n * A raw legacy dimension → the current `offset` shape. Handles BOTH old\n * forms: the pre-v9 linePoint + rotation (\"aligned\" kind) placement, and\n * the v9–v12 `upVector` field (renamed to `offset` in v13). For\n * linear/aligned dims the offset is PERPENDICULAR to the measuring axis\n * (the axis is perp(offset) at paint time), so the conversion is\n * lossless — old axis-locked linear dims keep their points AND their\n * axis. Exported because block scripts may still EMIT legacy dimension\n * DTOs and the DXF importer builds them — blockDtos and the import\n * funnel run the same conversion.\n */\nexport const dimensionRawToOffset = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"dimension\") return raw;\n if (\"upVector\" in raw && !(\"offset\" in raw)) {\n const rest = { ...raw };\n delete rest.upVector;\n return { ...rest, offset: raw.upVector };\n }\n if (!(\"linePoint\" in raw)) return raw;\n const linePoint = raw.linePoint as { x: number; y: number };\n const points = (raw.points ?? []) as { x: number; y: number }[];\n let kind = typeof raw.kind === \"string\" ? raw.kind : \"linear\";\n if (points.length < 1 || typeof linePoint?.x !== \"number\") return raw;\n\n let offset: { x: number; y: number };\n if (kind === \"linear\" || kind === \"aligned\") {\n // Old measuring axis: the stored rotation (linear) or first→last\n // (aligned). offset = the perpendicular part of linePoint − first.\n const first = points[0];\n const last = points[points.length - 1];\n let ux = 1;\n let uy = 0;\n if (kind === \"aligned\") {\n const d = Math.hypot(last.x - first.x, last.y - first.y);\n if (d > 1e-9) {\n ux = (last.x - first.x) / d;\n uy = (last.y - first.y) / d;\n }\n } else {\n const rot = typeof raw.rotation === \"number\" ? raw.rotation : 0;\n ux = Math.cos(rot);\n uy = Math.sin(rot);\n }\n const h = -(linePoint.x - first.x) * uy + (linePoint.y - first.y) * ux;\n offset = { x: -uy * h + 0, y: ux * h + 0 }; // \"+ 0\" folds -0 into 0\n kind = \"linear\";\n } else {\n const anchor =\n kind === \"diameter\" && points.length >= 2\n ? {\n x: (points[0].x + points[1].x) / 2,\n y: (points[0].y + points[1].y) / 2,\n }\n : points[0];\n offset = { x: linePoint.x - anchor.x, y: linePoint.y - anchor.y };\n }\n\n const rest = { ...raw };\n delete rest.linePoint;\n delete rest.rotation;\n return { ...rest, kind, points, offset };\n};\n\n/**\n * v8 → v9: the dimension \"aligned\" kind merges into \"linear\" (which now\n * measures point to point), and `linePoint`/`rotation` are replaced by an\n * anchored offset vector (direction fixed at creation; the field lands\n * directly in its final v13 `offset` name).\n */\nconst migrateV8toV9 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 9 };\n};\n\n// The exact wrapper the v9→v10 migration produced (inputs were a RECORD\n// keyed by declared input name back then) — v10→v11 detects it to re-wrap.\n// Frozen bytes: real v10 files carry the pre-rename \"linea\" specifier, and\n// detection is a string match — never update this to \"lineadraw\".\nconst V10_WRAPPER_HEADER = `import { helpers } from \"linea\";\n\nexport const main = ({ params, inputs }) => {\n const p = { ...params, ...inputs };\n`;\nconst V10_WRAPPER_FOOTER = `\n};\n`;\n\n/**\n * v9 → v10: block scripts become ES modules — the stored string is no longer\n * a bare function body but a module exporting `main`, importing `helpers`\n * from the virtual module. Frozen historical form (pre-rename \"linea\"\n * specifier included): the wrapper it emits is the v10 (record-inputs)\n * shape; v10→v11 re-wraps it.\n */\nconst migrateV9toV10 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const def = raw as Record<string, unknown>;\n return typeof def.script === \"string\"\n ? {\n ...def,\n script: `${V10_WRAPPER_HEADER}${def.script}${V10_WRAPPER_FOOTER}`,\n }\n : def;\n })\n : doc.blockDefinitions;\n\n return { ...doc, blockDefinitions, version: 10 };\n};\n\n/** A pre-v11 declared input (from the definition's dropped inputs table). */\nexport interface LegacyBlockInput {\n name: string;\n repeat?: boolean;\n}\n\n/** Declared inputs of a RAW pre-v11 definition (invalid entries skipped). */\nconst legacyDeclaredInputs = (\n rawDef: Record<string, unknown>,\n): LegacyBlockInput[] => {\n if (!Array.isArray(rawDef.inputs)) return [];\n const out: LegacyBlockInput[] = [];\n for (const raw of rawDef.inputs) {\n if (raw === null || typeof raw !== \"object\") continue;\n const inp = raw as Record<string, unknown>;\n if (typeof inp.name !== \"string\" || !/^[a-zA-Z_]\\w*$/.test(inp.name))\n continue;\n out.push({ name: inp.name, repeat: inp.repeat === true });\n }\n return out;\n};\n\n/**\n * A legacy block script BODY (the pre-v10 `(p, helpers) => children` form) →\n * a v11 ES-module script. Purely mechanical: the instance's inputs array is\n * destructured back into the old declared input names (a trailing `repeat`\n * input collects the rest), and the body keeps reading `p` via a shim that\n * reproduces the old merged params+inputs object. Inputs arrive localized\n * against the pivot (the first point), which matches the old localization\n * against the insertion point. Exported because `.block` library files carry\n * the same scripts (blockFile.ts migrates old envelopes).\n */\nexport const blockScriptToModule = (\n body: string,\n declared: LegacyBlockInput[] = [],\n): string => {\n const bindings = declared.map((inp, i) =>\n inp.repeat && i === declared.length - 1 ? `...${inp.name}` : inp.name,\n );\n const destructure =\n bindings.length > 0 ? ` const [${bindings.join(\", \")}] = inputs;\\n` : \"\";\n const pSpread =\n declared.length > 0\n ? `{ ...params, ${declared.map((inp) => inp.name).join(\", \")} }`\n : \"{ ...params }\";\n return `import { helpers } from \"lineadraw\";\n\nexport const main = ({ params, inputs }) => {\n${destructure} const p = ${pSpread};\n${body}\n};\n`;\n};\n\n/**\n * A raw pre-v11 block definition → v11: the migration-generated v10 wrapper\n * is re-wrapped into the array-inputs form (other scripts pass through\n * unchanged) and the declared-inputs table is dropped. Exported because\n * `.block` library files carry the same definitions.\n */\nconst blockDefRawToV11 = (\n rawDef: Record<string, unknown>,\n): Record<string, unknown> => {\n let script = rawDef.script;\n if (\n typeof script === \"string\" &&\n script.startsWith(V10_WRAPPER_HEADER) &&\n script.endsWith(V10_WRAPPER_FOOTER)\n ) {\n const body = script.slice(\n V10_WRAPPER_HEADER.length,\n script.length - V10_WRAPPER_FOOTER.length,\n );\n script = blockScriptToModule(body, legacyDeclaredInputs(rawDef));\n }\n const rest: Record<string, unknown> = { ...rawDef, script };\n delete rest.inputs;\n return rest;\n};\n\n/**\n * v10 → v11: the block instance loses its own frame origin — `insert` is\n * replaced by the inputs array (the first point is the pivot), `args` is\n * renamed to `params`, and the record-of-named-values `inputs` flattens to\n * an array in declared order (repeat arrays splice in). Classic instances\n * become single-point instances (`inputs: [insert]`), so their pose —\n * including rotation/scale, which now apply about the pivot — survives\n * losslessly. Definitions drop the declared-inputs table (the script's\n * `place` — `defineInput` at the time — owns acquisition now) and\n * migration-shaped scripts are re-wrapped for array inputs.\n */\nconst migrateV10toV11 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const rawDefs = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.filter(\n (d): d is Record<string, unknown> =>\n d !== null && typeof d === \"object\",\n )\n : [];\n const declaredOf = new Map<string, LegacyBlockInput[]>();\n for (const def of rawDefs)\n if (typeof def.id === \"string\")\n declaredOf.set(def.id, legacyDeclaredInputs(def));\n\n const isPoint = (v: unknown): v is { x: number; y: number } =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as { x?: unknown }).x === \"number\" &&\n typeof (v as { y?: unknown }).y === \"number\";\n\n const convert = (raw: unknown): unknown => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const obj = raw as Record<string, unknown>;\n if (obj.type !== \"block\") return raw;\n\n const declared =\n typeof obj.definitionId === \"string\"\n ? (declaredOf.get(obj.definitionId) ?? [])\n : [];\n const record =\n obj.inputs !== null &&\n typeof obj.inputs === \"object\" &&\n !Array.isArray(obj.inputs)\n ? (obj.inputs as Record<string, unknown>)\n : {};\n\n const inputs: unknown[] = [];\n if (declared.length === 0) {\n // Classic instance: the insertion point becomes the single input.\n if (isPoint(obj.insert)) inputs.push(obj.insert);\n } else {\n for (const inp of declared) {\n const v = record[inp.name];\n if (v === undefined) continue;\n if (Array.isArray(v)) inputs.push(...v);\n else inputs.push(v);\n }\n }\n\n const rest = { ...obj };\n delete rest.insert;\n delete rest.args;\n return { ...rest, params: obj.params ?? obj.args ?? {}, inputs };\n };\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions.map((raw) =>\n raw !== null && typeof raw === \"object\"\n ? blockDefRawToV11(raw as Record<string, unknown>)\n : raw,\n )\n : doc.blockDefinitions;\n\n return {\n ...doc,\n objects: mapObjects(doc.objects),\n layouts,\n blockDefinitions,\n version: 11,\n };\n};\n\n/**\n * v11 → v12: viewport `scale` flips meaning from paper mm per model mm\n * (1:50 = 0.02) to the drawing-scale denominator, model mm per paper mm\n * (1:50 = 50). The stored value inverts; the projection is unchanged.\n */\nconst migrateV11toV12 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n if (!Array.isArray(layout.objects)) return raw;\n const objects = layout.objects.map((o) => {\n if (o === null || typeof o !== \"object\") return o;\n const obj = o as Record<string, unknown>;\n if (obj.type !== \"viewport\") return o;\n const scale =\n typeof obj.scale === \"number\" && obj.scale > 0 ? 1 / obj.scale : 1;\n return { ...obj, scale };\n });\n return { ...layout, objects };\n })\n : doc.layouts;\n return { ...doc, layouts, version: 12 };\n};\n\n/**\n * v12 → v13: dimension `upVector` renamed to `offset` (same anchored\n * placement vector; the old name suggested a unit direction).\n */\nconst migrateV12toV13 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimensionRawToOffset(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 13 };\n};\n\n/**\n * A stored pre-v14 block definition record → a self-contained module source:\n * the record's id/name/params fold into the script as exports. Also used to\n * convert legacy `.block` library entries at import.\n */\nexport const blockDefRecordToModule = (raw: unknown): string | null => {\n if (typeof raw === \"string\") return raw; // already a module source\n if (raw === null || typeof raw !== \"object\") return null;\n const def = raw as Record<string, unknown>;\n if (typeof def.script !== \"string\") return null;\n const header: string[] = [\n `export const id = ${JSON.stringify(\n typeof def.id === \"string\" && def.id !== \"\"\n ? def.id\n : crypto.randomUUID(),\n )};`,\n `export const name = ${JSON.stringify(\n typeof def.name === \"string\" && def.name !== \"\" ? def.name : \"Block\",\n )};`,\n ];\n if (Array.isArray(def.params) && def.params.length > 0)\n header.push(`export const params = ${toJsLiteral(def.params, \"\")};`);\n return `${header.join(\"\\n\")}\\n\\n${def.script}`;\n};\n\n/**\n * v13 → v14: block definitions become raw ES-module sources — the stored\n * {id, name, params, script} record folds into the script as exports\n * (mechanical, same spirit as the v9→v11 script wrappers). Instances are\n * untouched: `definitionId` still matches the now-exported id.\n */\nconst migrateV13toV14 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const blockDefinitions = Array.isArray(doc.blockDefinitions)\n ? doc.blockDefinitions\n .map(blockDefRecordToModule)\n .filter((s): s is string => s !== null)\n : [];\n return { ...doc, blockDefinitions, version: 14 };\n};\n\n/**\n * v14 → v15: the format tag `type: \"linea\"` becomes `\"lineadraw\"` (the app\n * rename; the pre-rename tag is set unconditionally — files that predate the\n * field default-filled \"linea\" on parse).\n */\nconst migrateV14toV15 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...doc, type: \"lineadraw\", version: 15 });\n\n/**\n * A raw pre-v16 text's `arrowSize` field → `styleOverride.arrowSize`. The\n * historic per-object default (2.5) equals the new document-style default,\n * so a value still at it is dropped instead of frozen into an override —\n * identical rendering, style edits keep applying.\n */\nconst textRawArrowToOverride = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (raw.type !== \"text\" || !(\"arrowSize\" in raw)) return raw;\n const { arrowSize, ...rest } = raw;\n if (typeof arrowSize !== \"number\" || arrowSize === 2.5) return rest;\n const override =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n return {\n ...rest,\n styleOverride: { arrowSize, ...override }, // an existing key wins\n };\n};\n\n/**\n * A raw text with pre-v17 direct style fields (`font`, `widthFactor`,\n * `textHeight` — plus `arrowSize` and the `height` alias some early leader\n * conversions/scripts used) → the `styleOverride` form. Present keys fold in\n * unconditionally (they were explicit); existing override keys win.\n * `inheritTextHeight` drops a height equal to what inheritance would resolve\n * to anyway (the v16→v17 migration passes the document style's height so\n * unedited text stays unfrozen; script DTOs pass nothing — a script's height\n * is always intentional). Exported because block scripts may still EMIT the\n * old shapes (user code we can't rewrite) — blockDtos runs this conversion.\n */\nexport const textRawStyleToOverride = (\n raw: Record<string, unknown>,\n inheritTextHeight?: number,\n): Record<string, unknown> => {\n if (raw.type !== \"text\") return raw;\n const { font, widthFactor, textHeight, height, arrowSize, ...rest } = raw;\n const override: Record<string, unknown> = {};\n if (typeof font === \"string\") override.font = font;\n if (typeof widthFactor === \"number\") override.widthFactor = widthFactor;\n const h =\n typeof textHeight === \"number\"\n ? textHeight\n : typeof height === \"number\"\n ? height\n : undefined;\n if (h !== undefined && h !== inheritTextHeight) override.textHeight = h;\n if (typeof arrowSize === \"number\") override.arrowSize = arrowSize;\n const existing =\n rest.styleOverride !== null && typeof rest.styleOverride === \"object\"\n ? (rest.styleOverride as Record<string, unknown>)\n : {};\n const merged = { ...override, ...existing };\n return {\n ...rest,\n ...(Object.keys(merged).length > 0 ? { styleOverride: merged } : {}),\n };\n};\n\n/**\n * v15 → v16: text leader arrows join the document text style — the\n * per-object `arrowSize` field becomes an optional `styleOverride` entry\n * (mirroring dimensions), and the style gains `arrowSize`/`arrowType`.\n */\nconst migrateV15toV16 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawArrowToOverride(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 16 };\n};\n\n/**\n * v16 → v17: the remaining direct text style fields (`font`, `widthFactor`,\n * `textHeight`) join `styleOverride`, completing the DimStyle-shaped split.\n * `textHeight` was required per-object before; a value equal to the\n * document style's height is dropped (inheritance resolves to the same\n * number — identical rendering, style edits keep applying), anything else\n * becomes an override.\n */\nconst migrateV16toV17 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const styleHeight =\n doc.textStyle !== null &&\n typeof doc.textStyle === \"object\" &&\n typeof (doc.textStyle as Record<string, unknown>).textHeight === \"number\"\n ? ((doc.textStyle as Record<string, unknown>).textHeight as number)\n : 2.5;\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? textRawStyleToOverride(raw as Record<string, unknown>, styleHeight)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 17 };\n};\n\n/**\n * A raw dimension with the pre-v18 `styleOverride.scale` key → the direct\n * `scale` field (a size multiplier is object pose, not a style override —\n * matching Text/Hatch/Block). An existing field wins; an emptied override\n * is dropped. Exported because block scripts may still EMIT the old shape\n * (user code we can't rewrite) — blockDtos runs the same conversion.\n */\nexport const dimRawScaleToField = (\n raw: Record<string, unknown>,\n): Record<string, unknown> => {\n if (\n raw.type !== \"dimension\" ||\n raw.styleOverride === null ||\n typeof raw.styleOverride !== \"object\" ||\n !(\"scale\" in raw.styleOverride)\n )\n return raw;\n const { scale, ...override } = raw.styleOverride as Record<string, unknown>;\n return {\n ...raw,\n styleOverride: Object.keys(override).length > 0 ? override : undefined,\n ...(typeof raw.scale === \"number\" || typeof scale !== \"number\"\n ? {}\n : { scale }),\n };\n};\n\n/**\n * v17 → v18: the dimension annotation scale moves from\n * `styleOverride.scale` to a direct `scale` field on the object.\n */\nconst migrateV17toV18 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const convert = (raw: unknown): unknown =>\n raw !== null && typeof raw === \"object\"\n ? dimRawScaleToField(raw as Record<string, unknown>)\n : raw;\n const mapObjects = (list: unknown): unknown =>\n Array.isArray(list) ? list.map(convert) : list;\n const layouts = Array.isArray(doc.layouts)\n ? doc.layouts.map((raw) => {\n if (raw === null || typeof raw !== \"object\") return raw;\n const layout = raw as Record<string, unknown>;\n return { ...layout, objects: mapObjects(layout.objects) };\n })\n : doc.layouts;\n return { ...doc, objects: mapObjects(doc.objects), layouts, version: 18 };\n};\n\n/**\n * v18 → v19: the single document `textStyle`/`dimStyle` become ARRAYS of\n * named styles (`textStyles`/`dimStyles`); the old singleton folds into the\n * first entry with a stable id (\"standard\") and name. Objects need no\n * change: `styleId` is optional and absent resolves to the first style.\n */\nconst migrateV18toV19 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => {\n const wrap = (style: unknown): Record<string, unknown>[] => [\n {\n id: \"standard\",\n name: \"Standard\",\n ...(style !== null && typeof style === \"object\"\n ? (style as Record<string, unknown>)\n : {}),\n },\n ];\n const { textStyle, dimStyle, ...rest } = doc;\n return {\n ...rest,\n textStyles: wrap(textStyle),\n dimStyles: wrap(dimStyle),\n version: 19,\n };\n};\n\n/**\n * v19 → v20: text alignment back to JUSTIFICATION — which edge sits on the\n * point, the AutoCAD / DXF meaning (\"right\" = text left of the point,\n * \"bottom\" = above it); v5 had inverted it to \"where the text sits\". The\n * swap keeps every document pixel-identical. Block scripts can't be\n * rewritten: their non-center text alignments render mirrored until the\n * block is updated (docs/adr/0002).\n */\nconst migrateV19toV20 = (\n doc: Record<string, unknown>,\n): Record<string, unknown> => ({ ...swapTextAlignments(doc), version: 20 });\n\n/** Step N-1 migrates version N to N+1 (so the array has CURRENT-1 entries). */\nconst MIGRATION_STEPS = [\n migrateV1toV2,\n migrateV2toV3,\n migrateV3toV4,\n migrateV4toV5,\n migrateV5toV6,\n migrateV6toV7,\n migrateV7toV8,\n migrateV8toV9,\n migrateV9toV10,\n migrateV10toV11,\n migrateV11toV12,\n migrateV12toV13,\n migrateV13toV14,\n migrateV14toV15,\n migrateV15toV16,\n migrateV16toV17,\n migrateV17toV18,\n migrateV18toV19,\n migrateV19toV20,\n];\n\nexport function migrateDocument(raw: unknown): unknown {\n if (raw === null || typeof raw !== \"object\") return raw;\n let doc = raw as Record<string, unknown>;\n const version =\n typeof doc.version === \"number\" ? doc.version : CURRENT_DOCUMENT_VERSION;\n if (\n !Number.isInteger(version) ||\n version < 1 ||\n version > CURRENT_DOCUMENT_VERSION\n ) {\n // Loading a newer (or unknown) format \"as-is\" silently drops whatever\n // that version added, then SAVES the mangled result as the current\n // version — refuse instead and let the caller surface it.\n throw new Error(\n `Unsupported Linea document version ${version} (this build reads up to ${CURRENT_DOCUMENT_VERSION}). Open it with a newer Linea instead.`,\n );\n }\n for (let v = version; v < CURRENT_DOCUMENT_VERSION; v++) {\n doc = MIGRATION_STEPS[v - 1](doc);\n }\n return doc;\n}\n","// The geometry helpers block scripts import from the virtual \"lineadraw/helpers\"\n// module. SELF-CONTAINED ON PURPOSE: this file is a typings source for the\n// generated lineadraw.d.ts (npm run gen:lineadraw-dts) — no imports allowed; every\n// exported declaration lands verbatim inside `declare module \"lineadraw/helpers\"`,\n// so IntelliSense derives from the implementation and cannot drift.\n\n/** A 2D point (mm, y-up). A type ALIAS so editor hovers expand its shape. */\nexport type Vec2 = {\n x: number;\n y: number;\n};\n\n/** [0, 1, ..., n-1] — handy for repeating geometry. */\nexport const range = (n: number): number[] => [\n ...Array(Math.max(0, Math.floor(n))).keys(),\n];\n\n/** Point at `distance` from `p` in direction `angle` (radians, CCW). */\nexport const polar = (angle: number, distance: number, p?: Vec2): Vec2 => ({\n x: Math.cos(angle) * distance + (p ? p.x : 0),\n y: Math.sin(angle) * distance + (p ? p.y : 0),\n});\n\n/** Radians → degrees. */\nexport const toDeg = (r: number): number => (r * 180) / Math.PI;\n\n/** Degrees → radians. */\nexport const toRad = (d: number): number => (d * Math.PI) / 180;\n\n/** Length of a vector/point. */\nexport const len = (p: Vec2): number => Math.hypot(p.x, p.y);\n\n/** Distance between two points. */\nexport const dist = (a: Vec2, b: Vec2): number =>\n Math.hypot(b.x - a.x, b.y - a.y);\n\n/** Vector/point sum. */\nexport const add = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x + b.x,\n y: a.y + b.y,\n});\n\n/** Vector/point difference (a − b). */\nexport const sub = (a: Vec2, b: Vec2): Vec2 => ({\n x: a.x - b.x,\n y: a.y - b.y,\n});\n\n/** Scale a vector by a factor. */\nexport const scale = (p: Vec2, s: number): Vec2 => ({\n x: p.x * s,\n y: p.y * s,\n});\n\n/** Unit vector (a zero vector stays zero). */\nexport const norm = (p: Vec2): Vec2 => {\n const length = Math.hypot(p.x, p.y);\n return length === 0 ? { x: 0, y: 0 } : { x: p.x / length, y: p.y / length };\n};\n\n/** Dot product. */\nexport const dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/** Rotate vector by `angle` (radians, CCW). */\nexport const rotate = (p: Vec2, angle: number): Vec2 => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return { x: p.x * cos - p.y * sin, y: p.x * sin + p.y * cos };\n};\n\n/**\n * All helpers as one object — what migration-wrapped legacy scripts receive\n * via `import { helpers } from \"lineadraw\"`. New scripts import the named\n * functions from \"lineadraw/helpers\" instead.\n */\nexport const helpers = Object.freeze({\n range,\n polar,\n toDeg,\n toRad,\n len,\n dist,\n add,\n sub,\n scale,\n norm,\n dot,\n rotate,\n});\n","// The shared script runtime under BLOCK and COMMAND modules: lazy sucrase\n// transpilation (typescript + ESM→CJS) and `new Function` execution against\n// a `require` shim that resolves only the virtual \"lineadraw\" /\n// \"lineadraw/helpers\" modules (plus their frozen pre-rename \"linea\" aliases).\n// The user's own code, same-origin, no sandbox by design (calculus\n// getProfile pattern). Kind-specific normalization/validation stays with\n// evalBlock (blocks) and commandModules (commands).\n\n// The script-facing helpers live in their own SELF-CONTAINED module that\n// doubles as a typings source for the generated lineadraw.d.ts. The namespace\n// import IS what `require(\"lineadraw/helpers\")` hands to a compiled script, so\n// the typings match the runtime by construction.\nimport * as scriptHelpers from \"./scriptHelpers\";\n\n/**\n * Optional hook a reactive host registers so a re-render/re-evaluation is\n * triggered once the lazily-loaded transpiler finishes (scripts report a\n * transient error until then). No-op by default (headless).\n */\nlet onTranspilerReady: (() => void) | null = null;\nexport const setScriptTranspilerReadyCallback = (\n cb: (() => void) | null,\n): void => {\n onTranspilerReady = cb;\n};\n\n// Every script goes through sucrase: import/export syntax is a SyntaxError\n// to plain `new Function`, so there is no untranspiled fast path anymore.\n// sucrase is lazy-loaded so hosts without script documents never pay for it;\n// while it loads, evaluation reports a transient error and everything\n// re-evaluates on arrival (a reactive host should call\n// `ensureScriptTranspiler` eagerly to hide the flash).\nexport type ModuleExecutor = (script: string) => Record<string, unknown>;\nlet transpiler: ModuleExecutor | null = null;\nlet transpilerLoading: Promise<ModuleExecutor> | null = null;\n\n/** Load the script transpiler (idempotent). Awaited by save/insert flows.\n * Shared by block AND command modules. */\nexport const ensureScriptTranspiler = (): Promise<ModuleExecutor> => {\n if (transpiler) return Promise.resolve(transpiler);\n transpilerLoading ??= import(\"sucrase\").then(({ transform }) => {\n transpiler = (script: string) => {\n // ESM → CJS + type-stripping in one pass, then run the module body\n // once. Top-level code executes here (per script version, cached);\n // the exported functions run per evaluation.\n const code = transform(script, {\n transforms: [\"typescript\", \"imports\"],\n }).code;\n const moduleShim = { exports: {} as Record<string, unknown> };\n new Function(\"exports\", \"require\", \"module\", code)(\n moduleShim.exports,\n (spec: string) => {\n // \"linea\"/\"linea/helpers\" are the pre-rename specifiers — resolved\n // silently so documents and .block.ts files from before the\n // Lineadraw rename keep evaluating.\n if (spec === \"lineadraw/helpers\" || spec === \"linea/helpers\")\n return scriptHelpers;\n // \"lineadraw\" carries the runtime spec identities (defineBlock /\n // defineCommand — the types do all the work) plus the legacy\n // `helpers` object for migration-wrapped scripts; everything else\n // it declares is types, elided at transpile time.\n if (spec === \"lineadraw\" || spec === \"linea\")\n return {\n helpers: scriptHelpers.helpers,\n defineBlock: <T>(blockSpec: T): T => blockSpec,\n defineCommand: <T>(commandSpec: T): T => commandSpec,\n };\n throw new Error(\n `Cannot import \"${spec}\" — scripts may only import from \"lineadraw\" and \"lineadraw/helpers\"`,\n );\n },\n moduleShim,\n );\n const exported = moduleShim.exports;\n // A default-exported spec (`export default defineBlock({...})` or\n // `defineCommand({...})`) carries the same members as the named\n // exports — spread it over them so downstream reads one shape (spec\n // fields win).\n const spec = exported.default;\n return spec !== null && typeof spec === \"object\" && !Array.isArray(spec)\n ? { ...exported, ...(spec as Record<string, unknown>) }\n : exported;\n };\n // Scripts that failed while the transpiler loaded re-evaluate now.\n onTranspilerReady?.();\n return transpiler;\n });\n return transpilerLoading;\n};\n\n/**\n * Execute a raw script module: the transpiled exports with a default-exported\n * spec spread in, no kind-specific normalization or validation. The shared\n * lower layer under block and command compilation. Throws the transient\n * \"compiling\" error until the lazy transpiler has loaded.\n */\nexport const executeScriptModule = (\n script: string,\n): Record<string, unknown> => {\n if (!transpiler) throw transpilerLoadingError();\n return transpiler(script);\n};\n\n/** Whether the lazy transpiler has loaded (distinguishes \"compiling…\" from\n * a real script error in non-throwing meta lookups). */\nexport const scriptTranspilerReady = (): boolean => transpiler !== null;\n\n/** The transient not-yet-loaded error — kicks the load off as a side effect. */\nexport const transpilerLoadingError = (): Error => {\n void ensureScriptTranspiler();\n return new Error(\"Compiling block script…\");\n};\n","// Document-wide object lookup by id — model space plus every layout. Object\n// ids are uuids, unique across the whole document, so this is the correct\n// resolver for block object-reference inputs regardless of which space the\n// referencing instance lives in (BlockObjectResolver, blocks/evalBlock.ts).\n\nimport type { LineaDocument } from \"./document\";\nimport type { ModelObject } from \"./objects\";\n\n// One index per document VALUE: documents are replaced (never mutated) on\n// every change, so a WeakMap keyed by the document is self-invalidating.\n// Built lazily on the first miss-path lookup, not per mutation.\nconst indexCache = new WeakMap<LineaDocument, Map<string, ModelObject>>();\n\nconst indexOf = (doc: LineaDocument): Map<string, ModelObject> => {\n let index = indexCache.get(doc);\n if (!index) {\n index = new Map();\n for (const obj of doc.objects) index.set(obj.id, obj);\n for (const layout of doc.layouts)\n for (const obj of layout.objects) index.set(obj.id, obj);\n indexCache.set(doc, index);\n }\n return index;\n};\n\n/** Find an object anywhere in the document; undefined when absent. */\nexport const resolveDocumentObject = (\n doc: LineaDocument,\n id: string,\n): ModelObject | undefined => indexOf(doc).get(id);\n\n/** The lookup bound to one document — the shape block evaluation consumes. */\nexport const documentObjectResolver =\n (doc: LineaDocument): ((id: string) => ModelObject | undefined) =>\n (id) =>\n resolveDocumentObject(doc, id);\n","// Dimension geometry derivation, all kinds: linear/aligned (with 2+ chained\n// points), angular (3 points: vertex + two rays), radial (center + curve\n// point), and diameter (two opposite curve points). Pure — the sink-bound\n// painter lives editor-side; snap/hit-testing and DXF explosion reuse exactly\n// what is drawn.\n\nimport type { Dimension, DimStyle } from \"../model/objects\";\nimport { dimFontFace, dimStyleFor } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport {\n add,\n angle,\n dist,\n dot,\n fromAngle,\n len,\n mid,\n norm,\n normAngle,\n perp,\n scale,\n sub,\n} from \"../geometry/vec2\";\nimport type { Segment } from \"../geometry/line\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport interface DimArc {\n center: Vec2;\n radius: number;\n /** Radians, CCW from startAngle to endAngle (canvas/DXF convention). */\n startAngle: number;\n endAngle: number;\n}\n\nexport interface DimText {\n content: string;\n anchor: Vec2;\n rotation: number;\n height: number;\n /** Font id + width factor from the resolved dimension style. */\n font?: string;\n widthFactor?: number;\n}\n\nexport interface DimGeometry {\n extensionLines: Segment[];\n dimLines: Segment[];\n /** Angular dimensions draw an arc instead of a straight dimension line. */\n dimArc: DimArc | null;\n arrows: { tip: Vec2; toward: Vec2; size: number }[];\n arrowType: DimStyle[\"arrowType\"];\n /** One entry per measured segment (chains carry several). */\n texts: DimText[];\n /** Primary measurement: total span / angle in radians / radius / diameter. */\n value: number;\n}\n\nexport const formatDimValue = (value: number, precision: number): string => {\n const fixed = value.toFixed(precision);\n return fixed.includes(\".\") ? fixed.replace(/\\.?0+$/, \"\") : fixed;\n};\n\n/** Referenced document style + per-object overrides, with the object's\n * annotation `scale` along for the ride (there is no document-level scale). */\nexport type ResolvedDimStyle = DimStyle & { scale: number };\n\nconst resolveDimStyle = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): ResolvedDimStyle => ({\n ...dimStyleFor(obj, styles),\n ...obj.styleOverride,\n scale: obj.scale,\n});\n\n/** Readable text rotation for a direction: never upside down. */\nconst readableRotation = (u: Vec2): number => {\n const raw = normAngle(angle(u));\n const flipped = raw > Math.PI / 2 + 1e-9 && raw <= (3 * Math.PI) / 2 + 1e-9;\n return flipped ? raw - Math.PI : raw;\n};\n\nconst textFor = (\n content: string,\n at: Vec2,\n along: Vec2,\n style: ResolvedDimStyle,\n): DimText => {\n const rotation = readableRotation(along);\n const textUp = perp(fromAngle(rotation));\n return {\n content,\n anchor: add(at, scale(textUp, style.textOffset * style.scale)),\n rotation,\n height: style.textHeight * style.scale,\n font: dimFontFace(style),\n widthFactor: style.widthFactor,\n };\n};\n\n/** The anchor of a dimension's offset (see DimensionSchema). */\nexport const dimensionUpAnchor = (\n obj: Pick<Dimension, \"kind\" | \"points\">,\n): Vec2 =>\n obj.kind === \"diameter\" && obj.points.length >= 2\n ? mid(obj.points[0], obj.points[1])\n : obj.points[0];\n\n/** Linear: 2+ points chained along one dimension line. The measuring\n * direction is PERPENDICULAR to offset — dragging the points can't rotate\n * the dimension, only transforms (rotate/mirror) turn offset itself. A\n * zero offset (degenerate) falls back to the point-to-point direction. */\nconst linearGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 2) return null;\n const s = style.scale;\n const points = obj.points;\n\n // Measuring direction.\n const first = points[0];\n const last = points[points.length - 1];\n const upLen = len(obj.offset);\n const u =\n upLen > 1e-9\n ? perp(scale(obj.offset, 1 / upLen))\n : dist(first, last) > 1e-9\n ? norm(sub(last, first))\n : { x: 1, y: 0 };\n\n // Feet: every point projected onto the dimension line, which runs along u\n // through points[0] + offset.\n const v = perp(u);\n const h = dot(obj.offset, v);\n const feet = points.map((p) => add(p, scale(v, h - dot(sub(p, first), v))));\n\n const extensionLines: Segment[] = [];\n points.forEach((p, i) => {\n const f = feet[i];\n const gap = dist(p, f);\n if (gap < 1e-9) return;\n const w = norm(sub(f, p));\n // \"short\": just a 2×overshoot tick across the dimension line.\n extensionLines.push({\n a:\n style.extensionType === \"short\"\n ? sub(f, scale(w, style.extensionOvershoot * s))\n : add(p, scale(w, Math.min(style.extensionOffset * s, gap))),\n b: add(f, scale(w, style.extensionOvershoot * s)),\n });\n });\n\n const dimLines: Segment[] = [];\n const arrows: DimGeometry[\"arrows\"] = [];\n const texts: DimText[] = [];\n for (let i = 0; i + 1 < feet.length; i++) {\n const a = feet[i];\n const b = feet[i + 1];\n const value = dist(a, b);\n if (value < 1e-9) continue;\n dimLines.push({ a, b });\n arrows.push(\n { tip: a, toward: b, size: style.arrowSize * s },\n { tip: b, toward: a, size: style.arrowSize * s },\n );\n texts.push(\n textFor(\n obj.textOverride ?? formatDimValue(value, style.precision),\n mid(a, b),\n u,\n style,\n ),\n );\n }\n if (dimLines.length === 0) return null;\n\n return {\n extensionLines,\n dimLines,\n dimArc: null,\n arrows,\n arrowType: style.arrowType,\n texts,\n value: dist(feet[0], feet[feet.length - 1]),\n };\n};\n\n/** Angular: [vertex, a, b]; offset picks the arc radius AND which side. */\nconst angularGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 3) return null;\n const s = style.scale;\n const [vertex, a, b] = obj.points;\n const radius = len(obj.offset);\n const da = dist(vertex, a);\n const db = dist(vertex, b);\n if (radius < 1e-9 || da < 1e-9 || db < 1e-9) return null;\n\n const angA = angle(sub(a, vertex));\n const angB = angle(sub(b, vertex));\n const angL = angle(obj.offset);\n // Arc CCW from A to B unless offset points into the complementary side.\n const sweepAB = normAngle(angB - angA);\n const inAB = normAngle(angL - angA) <= sweepAB;\n const start = inAB ? angA : angB;\n const sweep = inAB ? sweepAB : normAngle(angA - angB);\n if (sweep < 1e-9) return null;\n\n const at = (t: number): Vec2 =>\n add(vertex, scale(fromAngle(start + t), radius));\n\n // Extension lines: along each ray from the point out to the arc\n // (\"short\": just a 2×overshoot tick across it).\n const extensionLines: Segment[] = [];\n for (const [p, d] of [\n [a, da],\n [b, db],\n ] as const) {\n const w = norm(sub(p, vertex));\n const inner =\n style.extensionType === \"short\"\n ? radius - style.extensionOvershoot * s\n : Math.min(d + style.extensionOffset * s, radius);\n const outer = radius + style.extensionOvershoot * s;\n if (outer - inner > 1e-9)\n extensionLines.push({\n a: add(vertex, scale(w, inner)),\n b: add(vertex, scale(w, outer)),\n });\n }\n\n // Arrow bodies point a short way along the arc (tangent-ish).\n const tangentStep = Math.min(sweep / 3, (style.arrowSize * s * 2) / radius);\n const valueDeg = sweep * RAD2DEG;\n const midPoint = at(sweep / 2);\n const midTangent = perp(norm(sub(midPoint, vertex)));\n\n return {\n extensionLines,\n dimLines: [],\n dimArc: {\n center: vertex,\n radius,\n startAngle: start,\n endAngle: start + sweep,\n },\n arrows: [\n { tip: at(0), toward: at(tangentStep), size: style.arrowSize * s },\n {\n tip: at(sweep),\n toward: at(sweep - tangentStep),\n size: style.arrowSize * s,\n },\n ],\n arrowType: style.arrowType,\n texts: [\n textFor(\n obj.textOverride ?? `${formatDimValue(valueDeg, style.precision)}°`,\n midPoint,\n midTangent,\n style,\n ),\n ],\n value: sweep,\n };\n};\n\n/** Radial: [center, point on curve]; offset positions the text on the ray. */\nconst radialGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 2) return null;\n const s = style.scale;\n const [center, p] = obj.points;\n const r = dist(center, p);\n if (r < 1e-9) return null;\n const u = norm(sub(p, center));\n const t = Math.max(dot(obj.offset, u), r * 0.2);\n const textAt = add(center, scale(u, t));\n\n return {\n extensionLines: [],\n // The line runs center → text position (through the curve point).\n dimLines: [{ a: center, b: t > r ? textAt : p }],\n dimArc: null,\n arrows: [{ tip: p, toward: center, size: style.arrowSize * s }],\n arrowType: style.arrowType,\n texts: [\n textFor(\n obj.textOverride ?? `R${formatDimValue(r, style.precision)}`,\n textAt,\n u,\n style,\n ),\n ],\n value: r,\n };\n};\n\n/** Diameter: [p1, p2] opposite points on the curve; text on the line. */\nconst diameterGeometry = (\n obj: Dimension,\n style: ResolvedDimStyle,\n): DimGeometry | null => {\n if (obj.points.length < 2) return null;\n const s = style.scale;\n const [p1, p2] = obj.points;\n const d = dist(p1, p2);\n if (d < 1e-9) return null;\n const u = norm(sub(p2, p1));\n // offset is anchored at the midpoint; project its tip onto the line.\n const t = dot(sub(add(mid(p1, p2), obj.offset), p1), u);\n const textAt = add(p1, scale(u, Math.min(Math.max(t, d * 0.15), d * 0.85)));\n\n return {\n extensionLines: [],\n dimLines: [{ a: p1, b: p2 }],\n dimArc: null,\n arrows: [\n { tip: p1, toward: p2, size: style.arrowSize * s },\n { tip: p2, toward: p1, size: style.arrowSize * s },\n ],\n arrowType: style.arrowType,\n texts: [\n textFor(\n obj.textOverride ?? `Ø${formatDimValue(d, style.precision)}`,\n textAt,\n u,\n style,\n ),\n ],\n value: d,\n };\n};\n\n/**\n * Derive the drawn geometry of a dimension (all kinds).\n * Returns null for degenerate definitions.\n */\nexport const dimensionGeometry = (\n obj: Dimension,\n styles: readonly DimStyle[],\n): DimGeometry | null => {\n const style = resolveDimStyle(obj, styles);\n switch (obj.kind) {\n case \"angular\":\n return angularGeometry(obj, style);\n case \"radial\":\n return radialGeometry(obj, style);\n case \"diameter\":\n return diameterGeometry(obj, style);\n case \"linear\":\n return linearGeometry(obj, style);\n }\n};\n","// Text measurement in world mm, independent of any render sink (used for\n// bounds, hit-testing, and alignment).\n//\n// The kernel cannot measure glyphs on its own — that needs either a canvas\n// (`measureText`) or precomputed font metrics — so measurement is INJECTED\n// via `TextMeasurer`. The editor supplies a canvas-backed implementation; a\n// Node consumer supplies an opentype.js / precomputed-Inter implementation.\n// `GeometrySink` already exposes a compatible `measureText`, so a sink can be\n// adapted to this interface directly.\n\n// AutoCAD's default MTEXT single line spacing: 1.66 × cap height.\nexport const LINE_HEIGHT_FACTOR = 1.66;\n\n// Tab stops every 4 × cap height (CAD convention). Tabs align columns WITHIN\n// one text object; separate objects line up because the interval convention\n// is shared — same as MTEXT.\nexport const TAB_SIZE_FACTOR = 4;\n\n/** Measures the on-screen width of a single line of text at a cap height. */\nexport interface TextMeasurer {\n /** Width of a single line in mm for the given cap height. Implementations\n * must honor `font` (id from model/fonts.ts) and `widthFactor`\n * (horizontal glyph scale) when provided. */\n measureTextWidth(\n text: string,\n heightMm: number,\n font?: string,\n widthFactor?: number,\n ): number;\n}\n\n/** A measurer with a font assignment baked in — lets object-aware callers\n * bind `(obj.font, obj.widthFactor)` once instead of threading them through\n * every wrap/width call. */\nexport const boundMeasurer = (\n measure: TextMeasurer,\n font?: string,\n widthFactor?: number,\n): TextMeasurer =>\n font === undefined && widthFactor === undefined\n ? measure\n : {\n measureTextWidth: (text, heightMm) =>\n measure.measureTextWidth(text, heightMm, font, widthFactor),\n };\n\nexport interface TextBlock {\n lines: string[];\n /** Widest line, mm. */\n width: number;\n /** Total block height, mm. */\n height: number;\n lineHeight: number;\n}\n\n/** One tab-delimited run of a line: its text and start offset from the\n * line's left edge (mm). */\nexport interface LineSegment {\n text: string;\n x: number;\n}\n\n/**\n * Split one line at tabs into positioned segments: each tab advances to the\n * next multiple of `TAB_SIZE_FACTOR × heightMm` past the previous segment's\n * measured end. Tab-less lines come back as one segment at x = 0.\n */\nexport const lineSegments = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): LineSegment[] => {\n if (!line.includes(\"\\t\")) return [{ text: line, x: 0 }];\n const tab = heightMm * TAB_SIZE_FACTOR;\n const out: LineSegment[] = [];\n let x = 0;\n const parts = line.split(\"\\t\");\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) x = (Math.floor(x / tab + 1e-9) + 1) * tab;\n out.push({ text: parts[i], x });\n x += measure.measureTextWidth(parts[i], heightMm);\n }\n return out;\n};\n\n/** Width of one line in mm, tab stops expanded. */\nexport const lineWidthWithTabs = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n): number => {\n const segs = lineSegments(line, heightMm, measure);\n const last = segs[segs.length - 1];\n return last.x + measure.measureTextWidth(last.text, heightMm);\n};\n\n/** Greedy word-wrap of tab-less text to a max width (mm). Words wider than\n * the limit overflow on their own line rather than breaking mid-word. */\nconst wrapWords = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n const words = line.split(\" \");\n const out: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (cur && measure.measureTextWidth(trial, heightMm) > maxWidthMm) {\n out.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n out.push(cur);\n return out;\n};\n\n/** Word-wrap of one logical line to a max width (mm). */\nconst wrapLine = (\n line: string,\n heightMm: number,\n measure: TextMeasurer,\n maxWidthMm: number,\n): string[] => {\n if (!line.includes(\"\\t\"))\n return wrapWords(line, heightMm, measure, maxWidthMm);\n // Tabbed line. A tabular row that FITS passes through unwrapped (breaking\n // a table row would misalign its columns). One that overflows is the MTEXT\n // bullet shape — \"-<tab>long paragraph\" — so wrap the text after the LAST\n // tab and hang continuation lines at its stop by re-prefixing the tabs\n // (stops are a fixed grid, so a leading tab run lands on the same stop).\n if (lineWidthWithTabs(line, heightMm, measure) <= maxWidthMm) return [line];\n const segs = lineSegments(line, heightMm, measure);\n const x0 = segs[segs.length - 1].x;\n if (maxWidthMm - x0 <= heightMm) return [line]; // stop ~past the box: give up\n const cut = line.lastIndexOf(\"\\t\") + 1;\n const tabs = \"\\t\".repeat(segs.length - 1);\n return wrapWords(line.slice(cut), heightMm, measure, maxWidthMm - x0).map(\n (l, i) => (i === 0 ? line.slice(0, cut) + l : tabs + l),\n );\n};\n\nexport const textBlock = (\n content: string,\n heightMm: number,\n measure: TextMeasurer,\n /** Word-wrap boundary in mm; also fixes the block width. */\n maxWidthMm?: number,\n): TextBlock => {\n const wrap = maxWidthMm !== undefined && maxWidthMm > 0;\n const lines = wrap\n ? content\n .split(\"\\n\")\n .flatMap((l) => wrapLine(l, heightMm, measure, maxWidthMm))\n : content.split(\"\\n\");\n const lineHeight = heightMm * LINE_HEIGHT_FACTOR;\n return {\n lines,\n // A fixed max width defines the box; otherwise it hugs the widest line.\n width: wrap\n ? maxWidthMm\n : Math.max(\n ...lines.map((l) => lineWidthWithTabs(l, heightMm, measure)),\n 0,\n ),\n height: heightMm + (lines.length - 1) * lineHeight,\n lineHeight,\n };\n};\n","// GENERATED — do not edit. Per-font advance widths (em units — ASCII,\n// Latin-1, Cyrillic, typography/CAD extras) and cap-height ratios,\n// extracted from the real TTFs for the headless measurer and the PDF\n// coverage checks. Regenerate with: npm run gen:fonts -w @lineadraw/core\nexport interface AdvanceTable {\n /** OS/2 sCapHeight / unitsPerEm. */\n capHeight: number;\n /** Fallback for characters outside the table (em). */\n defaultAdvance: number;\n /** Advance per character (em). */\n advances: Readonly<Record<string, number>>;\n}\n\n/** Codepoint ranges the tables extract — a char inside these but absent\n * from a font's table is a REAL coverage gap in that font. */\nexport const EXTRACTED_RANGES: readonly (readonly [number, number])[] = [\n [32, 126],\n [160, 255],\n [1024, 1119],\n];\nexport const EXTRACTED_EXTRAS = \"‐–—‘’‚“”„…‰•€™⌀№\";\n\n/** Keyed by font id, plus the bundled styled faces (\"arial;b\", …). */\nexport const ADVANCE_TABLES: Record<string, AdvanceTable> = {\n arial: {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.6675,\n Ђ: 0.8647,\n Ѓ: 0.5415,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0571,\n Њ: 1.0103,\n Ћ: 0.854,\n Ќ: 0.5825,\n Ѝ: 0.7188,\n Ў: 0.6353,\n Џ: 0.7188,\n А: 0.667,\n Б: 0.6563,\n В: 0.667,\n Г: 0.5415,\n Д: 0.6772,\n Е: 0.667,\n Ж: 0.9233,\n З: 0.604,\n И: 0.7188,\n Й: 0.7188,\n К: 0.5825,\n Л: 0.6563,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6353,\n Ф: 0.7603,\n Х: 0.667,\n Ц: 0.7397,\n Ч: 0.6665,\n Ш: 0.9165,\n Щ: 0.9375,\n Ъ: 0.7915,\n Ы: 0.8853,\n Ь: 0.6563,\n Э: 0.7188,\n Ю: 1.0103,\n Я: 0.7222,\n а: 0.5562,\n б: 0.5728,\n в: 0.5313,\n г: 0.3647,\n д: 0.5835,\n е: 0.5562,\n ж: 0.6689,\n з: 0.4585,\n и: 0.5586,\n й: 0.5586,\n к: 0.4375,\n л: 0.5835,\n м: 0.6875,\n н: 0.5522,\n о: 0.5562,\n п: 0.5415,\n р: 0.5562,\n с: 0.5,\n т: 0.458,\n у: 0.5,\n ф: 0.8228,\n х: 0.5,\n ц: 0.5728,\n ч: 0.521,\n ш: 0.8022,\n щ: 0.8228,\n ъ: 0.625,\n ы: 0.7188,\n ь: 0.521,\n э: 0.5103,\n ю: 0.75,\n я: 0.5415,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3647,\n є: 0.5103,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2778,\n ј: 0.2222,\n љ: 0.9063,\n њ: 0.8125,\n ћ: 0.5562,\n ќ: 0.4375,\n ѝ: 0.5586,\n ў: 0.5,\n џ: 0.5522,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.0728,\n },\n },\n \"arial;b\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.6689,\n Ђ: 0.8853,\n Ѓ: 0.5669,\n Є: 0.7114,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2759,\n Ј: 0.5562,\n Љ: 1.0938,\n Њ: 1.0625,\n Ћ: 0.875,\n Ќ: 0.6104,\n Ѝ: 0.7188,\n Ў: 0.6221,\n Џ: 0.7188,\n А: 0.7222,\n Б: 0.7188,\n В: 0.7222,\n Г: 0.5669,\n Д: 0.7124,\n Е: 0.667,\n Ж: 0.9038,\n З: 0.6265,\n И: 0.7188,\n Й: 0.7188,\n К: 0.6104,\n Л: 0.7017,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7188,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6221,\n Ф: 0.8535,\n Х: 0.667,\n Ц: 0.7305,\n Ч: 0.7026,\n Ш: 1.0049,\n Щ: 1.019,\n Ъ: 0.8696,\n Ы: 0.979,\n Ь: 0.7188,\n Э: 0.7114,\n Ю: 1.0313,\n Я: 0.7188,\n а: 0.5562,\n б: 0.6177,\n в: 0.6147,\n г: 0.4165,\n д: 0.6348,\n е: 0.5562,\n ж: 0.709,\n з: 0.4971,\n и: 0.6147,\n й: 0.6147,\n к: 0.5005,\n л: 0.6353,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.604,\n р: 0.6108,\n с: 0.5562,\n т: 0.4897,\n у: 0.5562,\n ф: 0.875,\n х: 0.5562,\n ц: 0.6147,\n ч: 0.5806,\n ш: 0.8335,\n щ: 0.8438,\n ъ: 0.729,\n ы: 0.854,\n ь: 0.6147,\n э: 0.5522,\n ю: 0.854,\n я: 0.5835,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4165,\n є: 0.5522,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2813,\n ј: 0.2778,\n љ: 0.9688,\n њ: 0.9063,\n ћ: 0.6108,\n ќ: 0.5005,\n ѝ: 0.6147,\n ў: 0.5562,\n џ: 0.604,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.1147,\n },\n },\n \"arial;i\": {\n capHeight: 0.7163,\n defaultAdvance: 0.527,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.2778,\n '\"': 0.355,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.667,\n \"'\": 0.1909,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.2778,\n \";\": 0.2778,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.5562,\n \"@\": 1.0151,\n A: 0.667,\n B: 0.667,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5,\n K: 0.667,\n L: 0.5562,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.2778,\n \"\\\\\": 0.2778,\n \"]\": 0.2778,\n \"^\": 0.4692,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.5562,\n c: 0.5,\n d: 0.5562,\n e: 0.5562,\n f: 0.2778,\n g: 0.5562,\n h: 0.5562,\n i: 0.2222,\n j: 0.2222,\n k: 0.5,\n l: 0.2222,\n m: 0.833,\n n: 0.5562,\n o: 0.5562,\n p: 0.5562,\n q: 0.5562,\n r: 0.333,\n s: 0.5,\n t: 0.2778,\n u: 0.5562,\n v: 0.5,\n w: 0.7222,\n x: 0.5,\n y: 0.5,\n z: 0.5,\n \"{\": 0.334,\n \"|\": 0.2598,\n \"}\": 0.334,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2598,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5371,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.667,\n Á: 0.667,\n Â: 0.667,\n Ã: 0.667,\n Ä: 0.667,\n Å: 0.667,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.5562,\n ñ: 0.5562,\n ò: 0.5562,\n ó: 0.5562,\n ô: 0.5562,\n õ: 0.5562,\n ö: 0.5562,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.5562,\n ú: 0.5562,\n û: 0.5562,\n ü: 0.5562,\n ý: 0.5,\n þ: 0.5562,\n ÿ: 0.5,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8428,\n Ѓ: 0.5439,\n Є: 0.7075,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5,\n Љ: 1.0659,\n Њ: 0.9824,\n Ћ: 0.8442,\n Ќ: 0.5894,\n Ѝ: 0.7153,\n Ў: 0.6392,\n Џ: 0.7236,\n А: 0.667,\n Б: 0.6509,\n В: 0.667,\n Г: 0.5439,\n Д: 0.7041,\n Е: 0.667,\n Ж: 0.917,\n З: 0.6138,\n И: 0.7153,\n Й: 0.7153,\n К: 0.5894,\n Л: 0.6855,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7246,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6392,\n Ф: 0.7949,\n Х: 0.667,\n Ц: 0.7271,\n Ч: 0.6733,\n Ш: 0.9204,\n Щ: 0.9229,\n Ъ: 0.8052,\n Ы: 0.8862,\n Ь: 0.6509,\n Э: 0.6938,\n Ю: 1.0225,\n Я: 0.6816,\n а: 0.5562,\n б: 0.5625,\n в: 0.522,\n г: 0.4932,\n д: 0.5527,\n е: 0.5562,\n ж: 0.688,\n з: 0.4648,\n и: 0.5562,\n й: 0.5562,\n к: 0.4722,\n л: 0.564,\n м: 0.6855,\n н: 0.5503,\n о: 0.5562,\n п: 0.5503,\n р: 0.5562,\n с: 0.5,\n т: 0.833,\n у: 0.5,\n ф: 0.8354,\n х: 0.5,\n ц: 0.5718,\n ч: 0.5176,\n ш: 0.8301,\n щ: 0.8511,\n ъ: 0.6211,\n ы: 0.7358,\n ь: 0.5259,\n э: 0.4917,\n ю: 0.752,\n я: 0.5342,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.5562,\n ѓ: 0.3779,\n є: 0.4956,\n ѕ: 0.5,\n і: 0.2222,\n ї: 0.2222,\n ј: 0.2222,\n љ: 0.9102,\n њ: 0.8276,\n ћ: 0.5562,\n ќ: 0.4722,\n ѝ: 0.5562,\n ў: 0.5,\n џ: 0.5562,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2222,\n \"’\": 0.2222,\n \"‚\": 0.2222,\n \"“\": 0.333,\n \"”\": 0.333,\n \"„\": 0.333,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.083,\n },\n },\n \"arial;bi\": {\n capHeight: 0.7163,\n defaultAdvance: 0.5513,\n advances: {\n \"0\": 0.5562,\n \"1\": 0.5562,\n \"2\": 0.5562,\n \"3\": 0.5562,\n \"4\": 0.5562,\n \"5\": 0.5562,\n \"6\": 0.5562,\n \"7\": 0.5562,\n \"8\": 0.5562,\n \"9\": 0.5562,\n \" \": 0.2778,\n \"!\": 0.333,\n '\"': 0.4741,\n \"#\": 0.5562,\n $: 0.5562,\n \"%\": 0.8892,\n \"&\": 0.7222,\n \"'\": 0.2378,\n \"(\": 0.333,\n \")\": 0.333,\n \"*\": 0.3892,\n \"+\": 0.584,\n \",\": 0.2778,\n \"-\": 0.333,\n \".\": 0.2778,\n \"/\": 0.2778,\n \":\": 0.333,\n \";\": 0.333,\n \"<\": 0.584,\n \"=\": 0.584,\n \">\": 0.584,\n \"?\": 0.6108,\n \"@\": 0.9751,\n A: 0.7222,\n B: 0.7222,\n C: 0.7222,\n D: 0.7222,\n E: 0.667,\n F: 0.6108,\n G: 0.7778,\n H: 0.7222,\n I: 0.2778,\n J: 0.5562,\n K: 0.7222,\n L: 0.6108,\n M: 0.833,\n N: 0.7222,\n O: 0.7778,\n P: 0.667,\n Q: 0.7778,\n R: 0.7222,\n S: 0.667,\n T: 0.6108,\n U: 0.7222,\n V: 0.667,\n W: 0.9438,\n X: 0.667,\n Y: 0.667,\n Z: 0.6108,\n \"[\": 0.333,\n \"\\\\\": 0.2778,\n \"]\": 0.333,\n \"^\": 0.584,\n _: 0.5562,\n \"`\": 0.333,\n a: 0.5562,\n b: 0.6108,\n c: 0.5562,\n d: 0.6108,\n e: 0.5562,\n f: 0.333,\n g: 0.6108,\n h: 0.6108,\n i: 0.2778,\n j: 0.2778,\n k: 0.5562,\n l: 0.2778,\n m: 0.8892,\n n: 0.6108,\n o: 0.6108,\n p: 0.6108,\n q: 0.6108,\n r: 0.3892,\n s: 0.5562,\n t: 0.333,\n u: 0.6108,\n v: 0.5562,\n w: 0.7778,\n x: 0.5562,\n y: 0.5562,\n z: 0.5,\n \"{\": 0.3892,\n \"|\": 0.2798,\n \"}\": 0.3892,\n \"~\": 0.584,\n \" \": 0.2778,\n \"¡\": 0.333,\n \"¢\": 0.5562,\n \"£\": 0.5562,\n \"¤\": 0.5562,\n \"¥\": 0.5562,\n \"¦\": 0.2798,\n \"§\": 0.5562,\n \"¨\": 0.333,\n \"©\": 0.7368,\n ª: 0.3701,\n \"«\": 0.5562,\n \"¬\": 0.584,\n \"\": 0.333,\n \"®\": 0.7368,\n \"¯\": 0.5522,\n \"°\": 0.3999,\n \"±\": 0.5488,\n \"²\": 0.333,\n \"³\": 0.333,\n \"´\": 0.333,\n µ: 0.5762,\n \"¶\": 0.5562,\n \"·\": 0.333,\n \"¸\": 0.333,\n \"¹\": 0.333,\n º: 0.3652,\n \"»\": 0.5562,\n \"¼\": 0.834,\n \"½\": 0.834,\n \"¾\": 0.834,\n \"¿\": 0.6108,\n À: 0.7222,\n Á: 0.7222,\n Â: 0.7222,\n Ã: 0.7222,\n Ä: 0.7222,\n Å: 0.7222,\n Æ: 1,\n Ç: 0.7222,\n È: 0.667,\n É: 0.667,\n Ê: 0.667,\n Ë: 0.667,\n Ì: 0.2778,\n Í: 0.2778,\n Î: 0.2778,\n Ï: 0.2778,\n Ð: 0.7222,\n Ñ: 0.7222,\n Ò: 0.7778,\n Ó: 0.7778,\n Ô: 0.7778,\n Õ: 0.7778,\n Ö: 0.7778,\n \"×\": 0.584,\n Ø: 0.7778,\n Ù: 0.7222,\n Ú: 0.7222,\n Û: 0.7222,\n Ü: 0.7222,\n Ý: 0.667,\n Þ: 0.667,\n ß: 0.6108,\n à: 0.5562,\n á: 0.5562,\n â: 0.5562,\n ã: 0.5562,\n ä: 0.5562,\n å: 0.5562,\n æ: 0.8892,\n ç: 0.5562,\n è: 0.5562,\n é: 0.5562,\n ê: 0.5562,\n ë: 0.5562,\n ì: 0.2778,\n í: 0.2778,\n î: 0.2778,\n ï: 0.2778,\n ð: 0.6108,\n ñ: 0.6108,\n ò: 0.6108,\n ó: 0.6108,\n ô: 0.6108,\n õ: 0.6108,\n ö: 0.6108,\n \"÷\": 0.5488,\n ø: 0.6108,\n ù: 0.6108,\n ú: 0.6108,\n û: 0.6108,\n ü: 0.6108,\n ý: 0.5562,\n þ: 0.6108,\n ÿ: 0.5562,\n Ѐ: 0.667,\n Ё: 0.667,\n Ђ: 0.8857,\n Ѓ: 0.6138,\n Є: 0.7188,\n Ѕ: 0.667,\n І: 0.2778,\n Ї: 0.2778,\n Ј: 0.5562,\n Љ: 1.0942,\n Њ: 1.042,\n Ћ: 0.8535,\n Ќ: 0.6147,\n Ѝ: 0.7192,\n Ў: 0.6772,\n Џ: 0.7192,\n А: 0.7222,\n Б: 0.708,\n В: 0.7222,\n Г: 0.6138,\n Д: 0.7222,\n Е: 0.667,\n Ж: 0.9272,\n З: 0.6426,\n И: 0.7192,\n Й: 0.7192,\n К: 0.6147,\n Л: 0.687,\n М: 0.833,\n Н: 0.7222,\n О: 0.7778,\n П: 0.7192,\n Р: 0.667,\n С: 0.7222,\n Т: 0.6108,\n У: 0.6772,\n Ф: 0.7808,\n Х: 0.667,\n Ц: 0.729,\n Ч: 0.708,\n Ш: 0.979,\n Щ: 0.9888,\n Ъ: 0.854,\n Ы: 1,\n Ь: 0.708,\n Э: 0.7188,\n Ю: 1.042,\n Я: 0.729,\n а: 0.5562,\n б: 0.6191,\n в: 0.604,\n г: 0.5337,\n д: 0.6182,\n е: 0.5562,\n ж: 0.7363,\n з: 0.5103,\n и: 0.6108,\n й: 0.6108,\n к: 0.5068,\n л: 0.6221,\n м: 0.7397,\n н: 0.604,\n о: 0.6108,\n п: 0.6108,\n р: 0.6108,\n с: 0.5562,\n т: 0.8892,\n у: 0.5562,\n ф: 0.8848,\n х: 0.5562,\n ц: 0.646,\n ч: 0.583,\n ш: 0.8892,\n щ: 0.9351,\n ъ: 0.707,\n ы: 0.854,\n ь: 0.5938,\n э: 0.5518,\n ю: 0.8647,\n я: 0.5889,\n ѐ: 0.5562,\n ё: 0.5562,\n ђ: 0.6108,\n ѓ: 0.4692,\n є: 0.563,\n ѕ: 0.5562,\n і: 0.2778,\n ї: 0.2778,\n ј: 0.2778,\n љ: 0.9692,\n њ: 0.9058,\n ћ: 0.6108,\n ќ: 0.5068,\n ѝ: 0.6108,\n ў: 0.5562,\n џ: 0.6108,\n \"‐\": 0.333,\n \"–\": 0.5562,\n \"—\": 1,\n \"‘\": 0.2778,\n \"’\": 0.2778,\n \"‚\": 0.2778,\n \"“\": 0.5,\n \"”\": 0.5,\n \"„\": 0.5,\n \"…\": 1,\n \"‰\": 1,\n \"•\": 0.3501,\n \"€\": 0.5562,\n \"™\": 1,\n \"№\": 1.146,\n },\n },\n osifont: {\n capHeight: 0.7397,\n defaultAdvance: 0.4659,\n advances: {\n \"0\": 0.4678,\n \"1\": 0.3418,\n \"2\": 0.4663,\n \"3\": 0.4805,\n \"4\": 0.5132,\n \"5\": 0.4971,\n \"6\": 0.4946,\n \"7\": 0.478,\n \"8\": 0.5156,\n \"9\": 0.5029,\n \" \": 0.4346,\n \"!\": 0.2197,\n '\"': 0.3911,\n \"#\": 0.6133,\n $: 0.4658,\n \"%\": 0.7637,\n \"&\": 0.6143,\n \"'\": 0.2036,\n \"(\": 0.2549,\n \")\": 0.2549,\n \"*\": 0.4639,\n \"+\": 0.4648,\n \",\": 0.2329,\n \"-\": 0.4648,\n \".\": 0.2012,\n \"/\": 0.4912,\n \":\": 0.2222,\n \";\": 0.2549,\n \"<\": 0.4648,\n \"=\": 0.4639,\n \">\": 0.4648,\n \"?\": 0.4644,\n \"@\": 0.8105,\n A: 0.6143,\n B: 0.582,\n C: 0.4902,\n D: 0.5884,\n E: 0.4897,\n F: 0.4897,\n G: 0.5796,\n H: 0.5908,\n I: 0.2207,\n J: 0.4136,\n K: 0.564,\n L: 0.4917,\n M: 0.666,\n N: 0.5869,\n O: 0.5874,\n P: 0.5625,\n Q: 0.5967,\n R: 0.564,\n S: 0.5396,\n T: 0.5376,\n U: 0.5889,\n V: 0.6147,\n W: 0.7612,\n X: 0.6162,\n Y: 0.6143,\n Z: 0.54,\n \"[\": 0.2656,\n \"\\\\\": 0.4619,\n \"]\": 0.2656,\n \"^\": 0.3896,\n _: 0.4648,\n \"`\": 0.3154,\n a: 0.4814,\n b: 0.5029,\n c: 0.4048,\n d: 0.5034,\n e: 0.4956,\n f: 0.439,\n g: 0.5024,\n h: 0.5034,\n i: 0.2183,\n j: 0.2178,\n k: 0.4917,\n l: 0.2676,\n m: 0.6421,\n n: 0.4937,\n o: 0.4927,\n p: 0.5073,\n q: 0.5073,\n r: 0.4072,\n s: 0.4658,\n t: 0.3472,\n u: 0.4941,\n v: 0.4658,\n w: 0.6118,\n x: 0.4644,\n y: 0.4644,\n z: 0.4639,\n \"{\": 0.3145,\n \"|\": 0.2207,\n \"}\": 0.3145,\n \"~\": 0.4658,\n \" \": 0.4346,\n \"¡\": 0.2197,\n \"¢\": 0.4785,\n \"£\": 0.5649,\n \"¤\": 0.5313,\n \"§\": 0.5205,\n \"©\": 0.668,\n \"«\": 0.5391,\n \"®\": 0.668,\n \"°\": 0.3906,\n \"±\": 0.4648,\n \"²\": 0.3213,\n \"³\": 0.3281,\n \"´\": 0.3154,\n µ: 0.5488,\n \"¶\": 0.5942,\n \"·\": 0.2207,\n \"¹\": 0.293,\n \"»\": 0.5391,\n \"¼\": 0.6416,\n \"½\": 0.6172,\n \"¾\": 0.6572,\n \"¿\": 0.4644,\n À: 0.6143,\n Á: 0.6143,\n Â: 0.6143,\n Ã: 0.6143,\n Ä: 0.6143,\n Å: 0.6143,\n Æ: 0.7637,\n Ç: 0.4902,\n È: 0.4897,\n É: 0.4897,\n Ê: 0.4897,\n Ë: 0.4897,\n Ì: 0.2207,\n Í: 0.2207,\n Î: 0.2207,\n Ï: 0.2207,\n Ð: 0.6274,\n Ñ: 0.5869,\n Ò: 0.5874,\n Ó: 0.5874,\n Ô: 0.5874,\n Õ: 0.5874,\n Ö: 0.5874,\n \"×\": 0.4673,\n Ø: 0.5913,\n Ù: 0.5889,\n Ú: 0.5889,\n Û: 0.5889,\n Ü: 0.5889,\n Ý: 0.6143,\n Þ: 0.5029,\n ß: 0.5879,\n à: 0.4814,\n á: 0.4814,\n â: 0.4814,\n ã: 0.4814,\n ä: 0.4814,\n å: 0.4814,\n æ: 0.6387,\n ç: 0.4048,\n è: 0.4956,\n é: 0.4956,\n ê: 0.4956,\n ë: 0.4956,\n ì: 0.2183,\n í: 0.2183,\n î: 0.2183,\n ï: 0.2183,\n ð: 0.4946,\n ñ: 0.4937,\n ò: 0.4927,\n ó: 0.4927,\n ô: 0.4927,\n õ: 0.4927,\n ö: 0.4927,\n \"÷\": 0.4663,\n ø: 0.5454,\n ù: 0.4941,\n ú: 0.4941,\n û: 0.4941,\n ü: 0.4941,\n ý: 0.4644,\n þ: 0.5029,\n ÿ: 0.4644,\n Ѐ: 0.5,\n Ё: 0.5,\n Ђ: 0.6689,\n Ѓ: 0.5093,\n Є: 0.4902,\n Ѕ: 0.5396,\n І: 0.2207,\n Ї: 0.2969,\n Ј: 0.4136,\n Љ: 0.96,\n Њ: 0.9414,\n Ћ: 0.6689,\n Ќ: 0.5234,\n Ѝ: 0.5967,\n Ў: 0.4155,\n Џ: 0.6416,\n А: 0.6143,\n Б: 0.5591,\n В: 0.5713,\n Г: 0.5093,\n Д: 0.6157,\n Е: 0.5,\n Ж: 0.793,\n З: 0.4805,\n И: 0.5967,\n Й: 0.5967,\n К: 0.5234,\n Л: 0.6226,\n М: 0.6719,\n Н: 0.6045,\n О: 0.5337,\n П: 0.6045,\n Р: 0.5615,\n С: 0.458,\n Т: 0.4839,\n У: 0.4155,\n Ф: 0.6733,\n Х: 0.5293,\n Ц: 0.6416,\n Ч: 0.5015,\n Ш: 0.7891,\n Щ: 0.8145,\n Ъ: 0.7197,\n Ы: 0.7544,\n Ь: 0.5029,\n Э: 0.4492,\n Ю: 0.769,\n Я: 0.5386,\n а: 0.4814,\n б: 0.4487,\n в: 0.4775,\n г: 0.4463,\n д: 0.5425,\n е: 0.4468,\n ж: 0.5664,\n з: 0.4063,\n и: 0.6138,\n й: 0.6138,\n к: 0.4683,\n л: 0.52,\n м: 0.6025,\n н: 0.5273,\n о: 0.436,\n п: 0.5283,\n р: 0.4766,\n с: 0.3403,\n т: 0.4771,\n у: 0.3906,\n ф: 0.6021,\n х: 0.3804,\n ц: 0.54,\n ч: 0.4697,\n ш: 0.5913,\n щ: 0.6313,\n ъ: 0.4883,\n ы: 0.6509,\n ь: 0.4814,\n э: 0.4302,\n ю: 0.6201,\n я: 0.4497,\n ѐ: 0.4468,\n ё: 0.4468,\n ђ: 0.5259,\n ѓ: 0.4463,\n є: 0.4048,\n ѕ: 0.4658,\n і: 0.2183,\n ї: 0.2969,\n ј: 0.2178,\n љ: 0.7783,\n њ: 0.7622,\n ћ: 0.5259,\n ќ: 0.4683,\n ѝ: 0.6138,\n ў: 0.3906,\n џ: 0.54,\n \"–\": 0.5,\n \"—\": 0.6421,\n \"’\": 0.2329,\n \"‰\": 1.1665,\n \"•\": 0.3477,\n \"€\": 0.8516,\n \"™\": 0.8394,\n \"⌀\": 0.668,\n \"№\": 0.9233,\n },\n },\n \"osifont-italic\": {\n capHeight: 0.7397,\n defaultAdvance: 0.425,\n advances: {\n \"0\": 0.4326,\n \"1\": 0.3154,\n \"2\": 0.4316,\n \"3\": 0.4443,\n \"4\": 0.4756,\n \"5\": 0.4595,\n \"6\": 0.457,\n \"7\": 0.4419,\n \"8\": 0.4766,\n \"9\": 0.4648,\n \" \": 0.395,\n \"!\": 0.2012,\n '\"': 0.3613,\n \"#\": 0.5684,\n $: 0.4312,\n \"%\": 0.708,\n \"&\": 0.5688,\n \"'\": 0.187,\n \"(\": 0.2344,\n \")\": 0.2344,\n \"*\": 0.4292,\n \"+\": 0.4302,\n \",\": 0.2139,\n \"-\": 0.4302,\n \".\": 0.1841,\n \"/\": 0.4541,\n \":\": 0.2036,\n \";\": 0.2339,\n \"<\": 0.4302,\n \"=\": 0.4292,\n \">\": 0.4302,\n \"?\": 0.4297,\n \"@\": 0.7505,\n A: 0.5688,\n B: 0.5381,\n C: 0.4531,\n D: 0.5439,\n E: 0.4526,\n F: 0.4526,\n G: 0.5361,\n H: 0.5464,\n I: 0.2021,\n J: 0.3818,\n K: 0.522,\n L: 0.4546,\n M: 0.6162,\n N: 0.5425,\n O: 0.543,\n P: 0.5205,\n Q: 0.5532,\n R: 0.522,\n S: 0.4995,\n T: 0.4976,\n U: 0.5444,\n V: 0.5693,\n W: 0.7056,\n X: 0.5708,\n Y: 0.5688,\n Z: 0.5,\n \"[\": 0.2441,\n \"\\\\\": 0.4272,\n \"]\": 0.2441,\n \"^\": 0.3604,\n _: 0.4302,\n \"`\": 0.291,\n a: 0.4224,\n b: 0.4414,\n c: 0.354,\n d: 0.4424,\n e: 0.4351,\n f: 0.3853,\n g: 0.4419,\n h: 0.4424,\n i: 0.1963,\n j: 0.188,\n k: 0.4292,\n l: 0.2378,\n m: 0.563,\n n: 0.4331,\n o: 0.4321,\n p: 0.4458,\n q: 0.4458,\n r: 0.3584,\n s: 0.4082,\n t: 0.3018,\n u: 0.4336,\n v: 0.4058,\n w: 0.5303,\n x: 0.4146,\n y: 0.4146,\n z: 0.4141,\n \"{\": 0.29,\n \"|\": 0.2021,\n \"}\": 0.29,\n \"~\": 0.4312,\n \" \": 0.395,\n \"¡\": 0.2012,\n \"¢\": 0.4424,\n \"£\": 0.5244,\n \"¤\": 0.4922,\n \"§\": 0.4819,\n \"©\": 0.6191,\n \"«\": 0.499,\n \"®\": 0.6191,\n \"°\": 0.3613,\n \"±\": 0.4302,\n \"²\": 0.2964,\n \"³\": 0.3027,\n \"´\": 0.3154,\n µ: 0.4795,\n \"¶\": 0.5503,\n \"·\": 0.2021,\n \"¹\": 0.27,\n \"»\": 0.499,\n \"¼\": 0.5952,\n \"½\": 0.5718,\n \"¾\": 0.6094,\n \"¿\": 0.4297,\n À: 0.5688,\n Á: 0.5688,\n Â: 0.5688,\n Ã: 0.5688,\n Ä: 0.5688,\n Å: 0.5688,\n Æ: 0.708,\n Ç: 0.4531,\n È: 0.4526,\n É: 0.4526,\n Ê: 0.4526,\n Ë: 0.4526,\n Ì: 0.2021,\n Í: 0.2021,\n Î: 0.2021,\n Ï: 0.2021,\n Ð: 0.582,\n Ñ: 0.5425,\n Ò: 0.543,\n Ó: 0.543,\n Ô: 0.543,\n Õ: 0.543,\n Ö: 0.543,\n \"×\": 0.4326,\n Ø: 0.5498,\n Ù: 0.5444,\n Ú: 0.5444,\n Û: 0.5444,\n Ü: 0.5444,\n Ý: 0.5688,\n Þ: 0.4648,\n ß: 0.5151,\n à: 0.4224,\n á: 0.4224,\n â: 0.4224,\n ã: 0.4224,\n ä: 0.4224,\n å: 0.4224,\n æ: 0.5601,\n ç: 0.354,\n è: 0.4351,\n é: 0.4351,\n ê: 0.4351,\n ë: 0.4351,\n ì: 0.1963,\n í: 0.1963,\n î: 0.1963,\n ï: 0.1963,\n ð: 0.4341,\n ñ: 0.4331,\n ò: 0.4321,\n ó: 0.4321,\n ô: 0.4321,\n õ: 0.4321,\n ö: 0.4321,\n \"÷\": 0.4316,\n ø: 0.4727,\n ù: 0.4336,\n ú: 0.4336,\n û: 0.4336,\n ü: 0.4336,\n ý: 0.4146,\n þ: 0.4414,\n ÿ: 0.4146,\n Ѐ: 0.4619,\n Ё: 0.4619,\n Ђ: 0.6206,\n Ѓ: 0.4712,\n Є: 0.4531,\n Ѕ: 0.4995,\n І: 0.2021,\n Ї: 0.2759,\n Ј: 0.3818,\n Љ: 0.8916,\n Њ: 0.8726,\n Ћ: 0.6206,\n Ќ: 0.4849,\n Ѝ: 0.5513,\n Ў: 0.3853,\n Џ: 0.5928,\n А: 0.5688,\n Б: 0.5176,\n В: 0.5283,\n Г: 0.4712,\n Д: 0.5718,\n Е: 0.4619,\n Ж: 0.7373,\n З: 0.4443,\n И: 0.5513,\n Й: 0.5513,\n К: 0.4849,\n Л: 0.5771,\n М: 0.6216,\n Н: 0.5586,\n О: 0.5337,\n П: 0.5586,\n Р: 0.5195,\n С: 0.4238,\n Т: 0.4487,\n У: 0.3853,\n Ф: 0.6245,\n Х: 0.4917,\n Ц: 0.5942,\n Ч: 0.4634,\n Ш: 0.7305,\n Щ: 0.7549,\n Ъ: 0.6685,\n Ы: 0.6982,\n Ь: 0.4648,\n Э: 0.416,\n Ю: 0.7124,\n Я: 0.499,\n а: 0.4224,\n б: 0.3931,\n в: 0.4185,\n г: 0.3882,\n д: 0.4751,\n е: 0.3911,\n ж: 0.4912,\n з: 0.355,\n и: 0.5366,\n й: 0.5415,\n к: 0.4077,\n л: 0.4536,\n м: 0.5269,\n н: 0.4624,\n о: 0.3813,\n п: 0.4634,\n р: 0.418,\n с: 0.2954,\n т: 0.4121,\n у: 0.3472,\n ф: 0.5254,\n х: 0.3379,\n ц: 0.4741,\n ч: 0.4121,\n ш: 0.521,\n щ: 0.5547,\n ъ: 0.4233,\n ы: 0.5708,\n ь: 0.4414,\n э: 0.373,\n ю: 0.5425,\n я: 0.3936,\n ѐ: 0.3911,\n ё: 0.3931,\n ђ: 0.457,\n ѓ: 0.3882,\n є: 0.354,\n ѕ: 0.4082,\n і: 0.1963,\n ї: 0.2607,\n ј: 0.188,\n љ: 0.6753,\n њ: 0.6636,\n ћ: 0.457,\n ќ: 0.4077,\n ѝ: 0.5366,\n ў: 0.3472,\n џ: 0.4785,\n \"–\": 0.4629,\n \"—\": 0.5947,\n \"’\": 0.2139,\n \"‰\": 1.082,\n \"•\": 0.3203,\n \"€\": 0.7905,\n \"™\": 0.7778,\n \"⌀\": 0.6191,\n \"№\": 0.856,\n },\n },\n \"jetbrains-mono\": {\n capHeight: 0.73,\n defaultAdvance: 0.6,\n advances: {\n \"0\": 0.6,\n \"1\": 0.6,\n \"2\": 0.6,\n \"3\": 0.6,\n \"4\": 0.6,\n \"5\": 0.6,\n \"6\": 0.6,\n \"7\": 0.6,\n \"8\": 0.6,\n \"9\": 0.6,\n \" \": 0.6,\n \"!\": 0.6,\n '\"': 0.6,\n \"#\": 0.6,\n $: 0.6,\n \"%\": 0.6,\n \"&\": 0.6,\n \"'\": 0.6,\n \"(\": 0.6,\n \")\": 0.6,\n \"*\": 0.6,\n \"+\": 0.6,\n \",\": 0.6,\n \"-\": 0.6,\n \".\": 0.6,\n \"/\": 0.6,\n \":\": 0.6,\n \";\": 0.6,\n \"<\": 0.6,\n \"=\": 0.6,\n \">\": 0.6,\n \"?\": 0.6,\n \"@\": 0.6,\n A: 0.6,\n B: 0.6,\n C: 0.6,\n D: 0.6,\n E: 0.6,\n F: 0.6,\n G: 0.6,\n H: 0.6,\n I: 0.6,\n J: 0.6,\n K: 0.6,\n L: 0.6,\n M: 0.6,\n N: 0.6,\n O: 0.6,\n P: 0.6,\n Q: 0.6,\n R: 0.6,\n S: 0.6,\n T: 0.6,\n U: 0.6,\n V: 0.6,\n W: 0.6,\n X: 0.6,\n Y: 0.6,\n Z: 0.6,\n \"[\": 0.6,\n \"\\\\\": 0.6,\n \"]\": 0.6,\n \"^\": 0.6,\n _: 0.6,\n \"`\": 0.6,\n a: 0.6,\n b: 0.6,\n c: 0.6,\n d: 0.6,\n e: 0.6,\n f: 0.6,\n g: 0.6,\n h: 0.6,\n i: 0.6,\n j: 0.6,\n k: 0.6,\n l: 0.6,\n m: 0.6,\n n: 0.6,\n o: 0.6,\n p: 0.6,\n q: 0.6,\n r: 0.6,\n s: 0.6,\n t: 0.6,\n u: 0.6,\n v: 0.6,\n w: 0.6,\n x: 0.6,\n y: 0.6,\n z: 0.6,\n \"{\": 0.6,\n \"|\": 0.6,\n \"}\": 0.6,\n \"~\": 0.6,\n \" \": 0.6,\n \"¡\": 0.6,\n \"¢\": 0.6,\n \"£\": 0.6,\n \"¤\": 0.6,\n \"¥\": 0.6,\n \"¦\": 0.6,\n \"§\": 0.6,\n \"¨\": 0.6,\n \"©\": 0.6,\n ª: 0.6,\n \"«\": 0.6,\n \"¬\": 0.6,\n \"®\": 0.6,\n \"¯\": 0.6,\n \"°\": 0.6,\n \"±\": 0.6,\n \"²\": 0.6,\n \"³\": 0.6,\n \"´\": 0.6,\n µ: 0.6,\n \"¶\": 0.6,\n \"·\": 0.6,\n \"¸\": 0.6,\n \"¹\": 0.6,\n º: 0.6,\n \"»\": 0.6,\n \"¼\": 0.6,\n \"½\": 0.6,\n \"¾\": 0.6,\n \"¿\": 0.6,\n À: 0.6,\n Á: 0.6,\n Â: 0.6,\n Ã: 0.6,\n Ä: 0.6,\n Å: 0.6,\n Æ: 0.6,\n Ç: 0.6,\n È: 0.6,\n É: 0.6,\n Ê: 0.6,\n Ë: 0.6,\n Ì: 0.6,\n Í: 0.6,\n Î: 0.6,\n Ï: 0.6,\n Ð: 0.6,\n Ñ: 0.6,\n Ò: 0.6,\n Ó: 0.6,\n Ô: 0.6,\n Õ: 0.6,\n Ö: 0.6,\n \"×\": 0.6,\n Ø: 0.6,\n Ù: 0.6,\n Ú: 0.6,\n Û: 0.6,\n Ü: 0.6,\n Ý: 0.6,\n Þ: 0.6,\n ß: 0.6,\n à: 0.6,\n á: 0.6,\n â: 0.6,\n ã: 0.6,\n ä: 0.6,\n å: 0.6,\n æ: 0.6,\n ç: 0.6,\n è: 0.6,\n é: 0.6,\n ê: 0.6,\n ë: 0.6,\n ì: 0.6,\n í: 0.6,\n î: 0.6,\n ï: 0.6,\n ð: 0.6,\n ñ: 0.6,\n ò: 0.6,\n ó: 0.6,\n ô: 0.6,\n õ: 0.6,\n ö: 0.6,\n \"÷\": 0.6,\n ø: 0.6,\n ù: 0.6,\n ú: 0.6,\n û: 0.6,\n ü: 0.6,\n ý: 0.6,\n þ: 0.6,\n ÿ: 0.6,\n Ё: 0.6,\n Ђ: 0.6,\n Ѓ: 0.6,\n Є: 0.6,\n Ѕ: 0.6,\n І: 0.6,\n Ї: 0.6,\n Ј: 0.6,\n Љ: 0.6,\n Њ: 0.6,\n Ћ: 0.6,\n Ќ: 0.6,\n Ў: 0.6,\n Џ: 0.6,\n А: 0.6,\n Б: 0.6,\n В: 0.6,\n Г: 0.6,\n Д: 0.6,\n Е: 0.6,\n Ж: 0.6,\n З: 0.6,\n И: 0.6,\n Й: 0.6,\n К: 0.6,\n Л: 0.6,\n М: 0.6,\n Н: 0.6,\n О: 0.6,\n П: 0.6,\n Р: 0.6,\n С: 0.6,\n Т: 0.6,\n У: 0.6,\n Ф: 0.6,\n Х: 0.6,\n Ц: 0.6,\n Ч: 0.6,\n Ш: 0.6,\n Щ: 0.6,\n Ъ: 0.6,\n Ы: 0.6,\n Ь: 0.6,\n Э: 0.6,\n Ю: 0.6,\n Я: 0.6,\n а: 0.6,\n б: 0.6,\n в: 0.6,\n г: 0.6,\n д: 0.6,\n е: 0.6,\n ж: 0.6,\n з: 0.6,\n и: 0.6,\n й: 0.6,\n к: 0.6,\n л: 0.6,\n м: 0.6,\n н: 0.6,\n о: 0.6,\n п: 0.6,\n р: 0.6,\n с: 0.6,\n т: 0.6,\n у: 0.6,\n ф: 0.6,\n х: 0.6,\n ц: 0.6,\n ч: 0.6,\n ш: 0.6,\n щ: 0.6,\n ъ: 0.6,\n ы: 0.6,\n ь: 0.6,\n э: 0.6,\n ю: 0.6,\n я: 0.6,\n ё: 0.6,\n ђ: 0.6,\n ѓ: 0.6,\n є: 0.6,\n ѕ: 0.6,\n і: 0.6,\n ї: 0.6,\n ј: 0.6,\n љ: 0.6,\n њ: 0.6,\n ћ: 0.6,\n ќ: 0.6,\n ў: 0.6,\n џ: 0.6,\n \"‐\": 0.6,\n \"–\": 0.6,\n \"—\": 0.6,\n \"‘\": 0.6,\n \"’\": 0.6,\n \"‚\": 0.6,\n \"“\": 0.6,\n \"”\": 0.6,\n \"„\": 0.6,\n \"…\": 0.6,\n \"‰\": 0.6,\n \"•\": 0.6,\n \"€\": 0.6,\n \"™\": 0.6,\n \"№\": 0.6,\n },\n },\n \"source-serif\": {\n capHeight: 0.67,\n defaultAdvance: 0.5169,\n advances: {\n \"0\": 0.5,\n \"1\": 0.5,\n \"2\": 0.5,\n \"3\": 0.5,\n \"4\": 0.5,\n \"5\": 0.5,\n \"6\": 0.5,\n \"7\": 0.5,\n \"8\": 0.5,\n \"9\": 0.5,\n \" \": 0.233,\n \"!\": 0.289,\n '\"': 0.356,\n \"#\": 0.526,\n $: 0.5,\n \"%\": 0.88,\n \"&\": 0.72,\n \"'\": 0.183,\n \"(\": 0.339,\n \")\": 0.339,\n \"*\": 0.439,\n \"+\": 0.53,\n \",\": 0.3,\n \"-\": 0.312,\n \".\": 0.3,\n \"/\": 0.33,\n \":\": 0.3,\n \";\": 0.3,\n \"<\": 0.53,\n \"=\": 0.53,\n \">\": 0.53,\n \"?\": 0.416,\n \"@\": 0.835,\n A: 0.664,\n B: 0.629,\n C: 0.631,\n D: 0.71,\n E: 0.603,\n F: 0.579,\n G: 0.682,\n H: 0.788,\n I: 0.371,\n J: 0.374,\n K: 0.667,\n L: 0.596,\n M: 0.902,\n N: 0.735,\n O: 0.707,\n P: 0.589,\n Q: 0.707,\n R: 0.651,\n S: 0.512,\n T: 0.604,\n U: 0.727,\n V: 0.674,\n W: 0.962,\n X: 0.648,\n Y: 0.633,\n Z: 0.551,\n \"[\": 0.32,\n \"\\\\\": 0.33,\n \"]\": 0.32,\n \"^\": 0.531,\n _: 0.512,\n \"`\": 0.4,\n a: 0.509,\n b: 0.577,\n c: 0.488,\n d: 0.567,\n e: 0.51,\n f: 0.354,\n g: 0.518,\n h: 0.601,\n i: 0.298,\n j: 0.277,\n k: 0.547,\n l: 0.298,\n m: 0.901,\n n: 0.606,\n o: 0.549,\n p: 0.583,\n q: 0.557,\n r: 0.423,\n s: 0.434,\n t: 0.325,\n u: 0.583,\n v: 0.505,\n w: 0.764,\n x: 0.526,\n y: 0.512,\n z: 0.456,\n \"{\": 0.344,\n \"|\": 0.291,\n \"}\": 0.344,\n \"~\": 0.53,\n \" \": 0.233,\n \"¡\": 0.289,\n \"¢\": 0.5,\n \"£\": 0.5,\n \"¤\": 0.502,\n \"¥\": 0.5,\n \"¦\": 0.291,\n \"§\": 0.491,\n \"¨\": 0.4,\n \"©\": 0.755,\n ª: 0.351,\n \"«\": 0.487,\n \"¬\": 0.53,\n \"\": 0.312,\n \"®\": 0.459,\n \"¯\": 0.4,\n \"°\": 0.328,\n \"±\": 0.53,\n \"²\": 0.37,\n \"³\": 0.37,\n \"´\": 0.4,\n µ: 0.569,\n \"¶\": 0.598,\n \"·\": 0.3,\n \"¸\": 0.4,\n \"¹\": 0.37,\n º: 0.377,\n \"»\": 0.487,\n \"¼\": 0.85,\n \"½\": 0.88,\n \"¾\": 0.85,\n \"¿\": 0.416,\n À: 0.664,\n Á: 0.664,\n Â: 0.664,\n Ã: 0.664,\n Ä: 0.664,\n Å: 0.664,\n Æ: 0.92,\n Ç: 0.631,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.371,\n Í: 0.371,\n Î: 0.371,\n Ï: 0.371,\n Ð: 0.71,\n Ñ: 0.735,\n Ò: 0.707,\n Ó: 0.707,\n Ô: 0.707,\n Õ: 0.707,\n Ö: 0.707,\n \"×\": 0.53,\n Ø: 0.707,\n Ù: 0.727,\n Ú: 0.727,\n Û: 0.727,\n Ü: 0.727,\n Ý: 0.633,\n Þ: 0.611,\n ß: 0.592,\n à: 0.509,\n á: 0.509,\n â: 0.509,\n ã: 0.509,\n ä: 0.509,\n å: 0.509,\n æ: 0.786,\n ç: 0.488,\n è: 0.51,\n é: 0.51,\n ê: 0.51,\n ë: 0.51,\n ì: 0.298,\n í: 0.298,\n î: 0.298,\n ï: 0.298,\n ð: 0.546,\n ñ: 0.606,\n ò: 0.549,\n ó: 0.549,\n ô: 0.549,\n õ: 0.549,\n ö: 0.549,\n \"÷\": 0.53,\n ø: 0.549,\n ù: 0.583,\n ú: 0.583,\n û: 0.583,\n ü: 0.583,\n ý: 0.512,\n þ: 0.554,\n ÿ: 0.512,\n Ѐ: 0.603,\n Ё: 0.603,\n Ђ: 0.701,\n Ѓ: 0.56,\n Є: 0.615,\n Ѕ: 0.512,\n І: 0.371,\n Ї: 0.371,\n Ј: 0.374,\n Љ: 0.894,\n Њ: 1.002,\n Ћ: 0.755,\n Ќ: 0.653,\n Ѝ: 0.797,\n Ў: 0.67,\n Џ: 0.769,\n А: 0.664,\n Б: 0.618,\n В: 0.629,\n Г: 0.56,\n Д: 0.691,\n Е: 0.603,\n Ж: 0.918,\n З: 0.55,\n И: 0.797,\n Й: 0.797,\n К: 0.653,\n Л: 0.693,\n М: 0.902,\n Н: 0.788,\n О: 0.707,\n П: 0.775,\n Р: 0.589,\n С: 0.631,\n Т: 0.604,\n У: 0.67,\n Ф: 0.721,\n Х: 0.648,\n Ц: 0.769,\n Ч: 0.701,\n Ш: 1.043,\n Щ: 1.044,\n Ъ: 0.697,\n Ы: 0.914,\n Ь: 0.609,\n Э: 0.612,\n Ю: 0.995,\n Я: 0.642,\n а: 0.509,\n б: 0.543,\n в: 0.517,\n г: 0.447,\n д: 0.567,\n е: 0.51,\n ж: 0.758,\n з: 0.43,\n и: 0.645,\n й: 0.645,\n к: 0.553,\n л: 0.577,\n м: 0.742,\n н: 0.633,\n о: 0.549,\n п: 0.626,\n р: 0.583,\n с: 0.488,\n т: 0.528,\n у: 0.512,\n ф: 0.735,\n х: 0.526,\n ц: 0.622,\n ч: 0.554,\n ш: 0.856,\n щ: 0.858,\n ъ: 0.615,\n ы: 0.75,\n ь: 0.505,\n э: 0.48,\n ю: 0.8,\n я: 0.532,\n ѐ: 0.51,\n ё: 0.51,\n ђ: 0.535,\n ѓ: 0.447,\n є: 0.488,\n ѕ: 0.434,\n і: 0.298,\n ї: 0.298,\n ј: 0.277,\n љ: 0.754,\n њ: 0.818,\n ћ: 0.601,\n ќ: 0.553,\n ѝ: 0.645,\n ў: 0.512,\n џ: 0.634,\n \"‐\": 0.312,\n \"–\": 0.512,\n \"—\": 0.812,\n \"‘\": 0.212,\n \"’\": 0.212,\n \"‚\": 0.212,\n \"“\": 0.415,\n \"”\": 0.415,\n \"„\": 0.415,\n \"…\": 0.82,\n \"‰\": 1.25,\n \"•\": 0.305,\n \"€\": 0.5,\n \"™\": 0.722,\n \"№\": 1.009,\n },\n },\n \"roboto-condensed\": {\n capHeight: 0.7109,\n defaultAdvance: 0.453,\n advances: {\n \"0\": 0.4937,\n \"1\": 0.4937,\n \"2\": 0.4937,\n \"3\": 0.4937,\n \"4\": 0.4937,\n \"5\": 0.4937,\n \"6\": 0.4937,\n \"7\": 0.4937,\n \"8\": 0.4937,\n \"9\": 0.4937,\n \" \": 0.2295,\n \"!\": 0.2461,\n '\"': 0.3203,\n \"#\": 0.5479,\n $: 0.4937,\n \"%\": 0.6328,\n \"&\": 0.5439,\n \"'\": 0.1748,\n \"(\": 0.314,\n \")\": 0.3188,\n \"*\": 0.4307,\n \"+\": 0.4971,\n \",\": 0.1968,\n \"-\": 0.248,\n \".\": 0.2637,\n \"/\": 0.3711,\n \":\": 0.2334,\n \";\": 0.2026,\n \"<\": 0.4458,\n \"=\": 0.479,\n \">\": 0.4604,\n \"?\": 0.4224,\n \"@\": 0.769,\n A: 0.5767,\n B: 0.5459,\n C: 0.5669,\n D: 0.5708,\n E: 0.4971,\n F: 0.481,\n G: 0.5908,\n H: 0.6201,\n I: 0.25,\n J: 0.4834,\n K: 0.5454,\n L: 0.4756,\n M: 0.7554,\n N: 0.6196,\n O: 0.6011,\n P: 0.5542,\n Q: 0.6011,\n R: 0.5308,\n S: 0.5186,\n T: 0.5205,\n U: 0.5615,\n V: 0.5605,\n W: 0.7617,\n X: 0.5513,\n Y: 0.5249,\n Z: 0.5229,\n \"[\": 0.2505,\n \"\\\\\": 0.3696,\n \"]\": 0.2505,\n \"^\": 0.3711,\n _: 0.4048,\n \"`\": 0.3091,\n a: 0.479,\n b: 0.4932,\n c: 0.4619,\n d: 0.4961,\n e: 0.4688,\n f: 0.3164,\n g: 0.4932,\n h: 0.4829,\n i: 0.2295,\n j: 0.2241,\n k: 0.4507,\n l: 0.2295,\n m: 0.7529,\n n: 0.4844,\n o: 0.502,\n p: 0.4932,\n q: 0.5005,\n r: 0.3047,\n s: 0.4561,\n t: 0.2959,\n u: 0.4834,\n v: 0.4277,\n w: 0.6499,\n x: 0.439,\n y: 0.4165,\n z: 0.439,\n \"{\": 0.3066,\n \"|\": 0.2441,\n \"}\": 0.3066,\n \"~\": 0.5894,\n \" \": 0.2295,\n \"¡\": 0.2319,\n \"¢\": 0.48,\n \"£\": 0.5112,\n \"¤\": 0.7134,\n \"¥\": 0.4639,\n \"¦\": 0.2402,\n \"§\": 0.5376,\n \"¨\": 0.4185,\n \"©\": 0.7856,\n ª: 0.3965,\n \"«\": 0.418,\n \"¬\": 0.4873,\n \"\": 0.248,\n \"®\": 0.7861,\n \"¯\": 0.4146,\n \"°\": 0.3735,\n \"±\": 0.4702,\n \"²\": 0.3296,\n \"³\": 0.3296,\n \"´\": 0.3135,\n µ: 0.4985,\n \"¶\": 0.4346,\n \"·\": 0.2437,\n \"¸\": 0.2295,\n \"¹\": 0.3296,\n º: 0.4033,\n \"»\": 0.418,\n \"¼\": 0.6377,\n \"½\": 0.6777,\n \"¾\": 0.6733,\n \"¿\": 0.4219,\n À: 0.5767,\n Á: 0.5767,\n Â: 0.5767,\n Ã: 0.5767,\n Ä: 0.5767,\n Å: 0.5767,\n Æ: 0.8125,\n Ç: 0.5669,\n È: 0.4971,\n É: 0.4971,\n Ê: 0.4971,\n Ë: 0.4971,\n Ì: 0.25,\n Í: 0.25,\n Î: 0.25,\n Ï: 0.25,\n Ð: 0.5854,\n Ñ: 0.6196,\n Ò: 0.6011,\n Ó: 0.6011,\n Ô: 0.6011,\n Õ: 0.6011,\n Ö: 0.6011,\n \"×\": 0.4707,\n Ø: 0.6011,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5249,\n Þ: 0.5151,\n ß: 0.522,\n à: 0.479,\n á: 0.479,\n â: 0.479,\n ã: 0.479,\n ä: 0.479,\n å: 0.479,\n æ: 0.7285,\n ç: 0.4619,\n è: 0.4688,\n é: 0.4688,\n ê: 0.4688,\n ë: 0.4688,\n ì: 0.2354,\n í: 0.2354,\n î: 0.2354,\n ï: 0.2354,\n ð: 0.5137,\n ñ: 0.4844,\n ò: 0.502,\n ó: 0.502,\n ô: 0.502,\n õ: 0.502,\n ö: 0.502,\n \"÷\": 0.5,\n ø: 0.4985,\n ù: 0.4834,\n ú: 0.4834,\n û: 0.4834,\n ü: 0.4834,\n ý: 0.4165,\n þ: 0.5083,\n ÿ: 0.4165,\n Ѐ: 0.4971,\n Ё: 0.4971,\n Ђ: 0.6509,\n Ѓ: 0.4883,\n Є: 0.5903,\n Ѕ: 0.5186,\n І: 0.25,\n Ї: 0.25,\n Ј: 0.4834,\n Љ: 0.9243,\n Њ: 0.9272,\n Ћ: 0.7061,\n Ќ: 0.5454,\n Ѝ: 0.6196,\n Ў: 0.5479,\n Џ: 0.6211,\n А: 0.5767,\n Б: 0.5498,\n В: 0.5459,\n Г: 0.4883,\n Д: 0.6602,\n Е: 0.4971,\n Ж: 0.791,\n З: 0.5176,\n И: 0.6196,\n Й: 0.6196,\n К: 0.5605,\n Л: 0.6157,\n М: 0.7554,\n Н: 0.6201,\n О: 0.6011,\n П: 0.6206,\n Р: 0.5542,\n С: 0.5669,\n Т: 0.5205,\n У: 0.5479,\n Ф: 0.6772,\n Х: 0.5513,\n Ц: 0.6396,\n Ч: 0.6006,\n Ш: 0.8149,\n Щ: 0.8418,\n Ъ: 0.6519,\n Ы: 0.7559,\n Ь: 0.5513,\n Э: 0.5903,\n Ю: 0.7656,\n Я: 0.5625,\n а: 0.479,\n б: 0.4849,\n в: 0.5034,\n г: 0.3716,\n д: 0.5361,\n е: 0.4688,\n ж: 0.6626,\n з: 0.4468,\n и: 0.5093,\n й: 0.5093,\n к: 0.4805,\n л: 0.5103,\n м: 0.646,\n н: 0.5088,\n о: 0.502,\n п: 0.5093,\n р: 0.4932,\n с: 0.4619,\n т: 0.4253,\n у: 0.4165,\n ф: 0.6289,\n х: 0.439,\n ц: 0.5244,\n ч: 0.48,\n ш: 0.7041,\n щ: 0.7227,\n ъ: 0.5381,\n ы: 0.6802,\n ь: 0.4785,\n э: 0.4722,\n ю: 0.7061,\n я: 0.4824,\n ѐ: 0.4688,\n ё: 0.4688,\n ђ: 0.4829,\n ѓ: 0.3716,\n є: 0.4722,\n ѕ: 0.4561,\n і: 0.2295,\n ї: 0.2354,\n ј: 0.2241,\n љ: 0.73,\n њ: 0.7432,\n ћ: 0.4985,\n ќ: 0.4805,\n ѝ: 0.5093,\n ў: 0.4165,\n џ: 0.5093,\n \"‐\": 0.2485,\n \"–\": 0.5723,\n \"—\": 0.6782,\n \"‘\": 0.1948,\n \"’\": 0.1948,\n \"‚\": 0.1953,\n \"“\": 0.334,\n \"”\": 0.3374,\n \"„\": 0.3267,\n \"…\": 0.5903,\n \"‰\": 0.8188,\n \"•\": 0.3374,\n \"€\": 0.4937,\n \"™\": 0.5479,\n \"№\": 0.8862,\n },\n },\n \"noto-sans\": {\n capHeight: 0.714,\n defaultAdvance: 0.5336,\n advances: {\n \"0\": 0.572,\n \"1\": 0.572,\n \"2\": 0.572,\n \"3\": 0.572,\n \"4\": 0.572,\n \"5\": 0.572,\n \"6\": 0.572,\n \"7\": 0.572,\n \"8\": 0.572,\n \"9\": 0.572,\n \" \": 0.26,\n \"!\": 0.269,\n '\"': 0.408,\n \"#\": 0.646,\n $: 0.572,\n \"%\": 0.831,\n \"&\": 0.732,\n \"'\": 0.225,\n \"(\": 0.3,\n \")\": 0.3,\n \"*\": 0.551,\n \"+\": 0.572,\n \",\": 0.268,\n \"-\": 0.322,\n \".\": 0.268,\n \"/\": 0.372,\n \":\": 0.268,\n \";\": 0.268,\n \"<\": 0.572,\n \"=\": 0.572,\n \">\": 0.572,\n \"?\": 0.434,\n \"@\": 0.899,\n A: 0.639,\n B: 0.65,\n C: 0.632,\n D: 0.73,\n E: 0.556,\n F: 0.519,\n G: 0.728,\n H: 0.741,\n I: 0.339,\n J: 0.273,\n K: 0.619,\n L: 0.524,\n M: 0.907,\n N: 0.76,\n O: 0.781,\n P: 0.605,\n Q: 0.781,\n R: 0.622,\n S: 0.549,\n T: 0.556,\n U: 0.731,\n V: 0.6,\n W: 0.93,\n X: 0.586,\n Y: 0.566,\n Z: 0.572,\n \"[\": 0.329,\n \"\\\\\": 0.372,\n \"]\": 0.329,\n \"^\": 0.572,\n _: 0.444,\n \"`\": 0.281,\n a: 0.561,\n b: 0.615,\n c: 0.48,\n d: 0.615,\n e: 0.564,\n f: 0.344,\n g: 0.615,\n h: 0.618,\n i: 0.258,\n j: 0.258,\n k: 0.534,\n l: 0.258,\n m: 0.935,\n n: 0.618,\n o: 0.605,\n p: 0.615,\n q: 0.615,\n r: 0.413,\n s: 0.479,\n t: 0.361,\n u: 0.618,\n v: 0.508,\n w: 0.786,\n x: 0.529,\n y: 0.51,\n z: 0.47,\n \"{\": 0.38,\n \"|\": 0.551,\n \"}\": 0.38,\n \"~\": 0.572,\n \" \": 0.26,\n \"¡\": 0.269,\n \"¢\": 0.572,\n \"£\": 0.572,\n \"¤\": 0.572,\n \"¥\": 0.572,\n \"¦\": 0.551,\n \"§\": 0.513,\n \"¨\": 0.58,\n \"©\": 0.832,\n ª: 0.357,\n \"«\": 0.509,\n \"¬\": 0.572,\n \"\": 0.322,\n \"®\": 0.832,\n \"¯\": 0.5,\n \"°\": 0.428,\n \"±\": 0.572,\n \"²\": 0.35,\n \"³\": 0.35,\n \"´\": 0.281,\n µ: 0.623,\n \"¶\": 0.655,\n \"·\": 0.268,\n \"¸\": 0.225,\n \"¹\": 0.35,\n º: 0.376,\n \"»\": 0.509,\n \"¼\": 0.745,\n \"½\": 0.771,\n \"¾\": 0.781,\n \"¿\": 0.434,\n À: 0.639,\n Á: 0.639,\n Â: 0.639,\n Ã: 0.639,\n Ä: 0.639,\n Å: 0.639,\n Æ: 0.881,\n Ç: 0.632,\n È: 0.556,\n É: 0.556,\n Ê: 0.556,\n Ë: 0.556,\n Ì: 0.339,\n Í: 0.339,\n Î: 0.339,\n Ï: 0.339,\n Ð: 0.73,\n Ñ: 0.76,\n Ò: 0.781,\n Ó: 0.781,\n Ô: 0.781,\n Õ: 0.781,\n Ö: 0.781,\n \"×\": 0.572,\n Ø: 0.781,\n Ù: 0.731,\n Ú: 0.731,\n Û: 0.731,\n Ü: 0.731,\n Ý: 0.566,\n Þ: 0.605,\n ß: 0.631,\n à: 0.561,\n á: 0.561,\n â: 0.561,\n ã: 0.561,\n ä: 0.561,\n å: 0.561,\n æ: 0.864,\n ç: 0.48,\n è: 0.564,\n é: 0.564,\n ê: 0.564,\n ë: 0.564,\n ì: 0.258,\n í: 0.258,\n î: 0.258,\n ï: 0.258,\n ð: 0.605,\n ñ: 0.618,\n ò: 0.605,\n ó: 0.605,\n ô: 0.605,\n õ: 0.605,\n ö: 0.605,\n \"÷\": 0.572,\n ø: 0.605,\n ù: 0.618,\n ú: 0.618,\n û: 0.618,\n ü: 0.618,\n ý: 0.51,\n þ: 0.615,\n ÿ: 0.51,\n Ѐ: 0.556,\n Ё: 0.556,\n Ђ: 0.716,\n Ѓ: 0.509,\n Є: 0.639,\n Ѕ: 0.549,\n І: 0.284,\n Ї: 0.284,\n Ј: 0.273,\n Љ: 1.01,\n Њ: 1.027,\n Ћ: 0.715,\n Ќ: 0.625,\n Ѝ: 0.756,\n Ў: 0.616,\n Џ: 0.731,\n А: 0.638,\n Б: 0.614,\n В: 0.65,\n Г: 0.509,\n Д: 0.729,\n Е: 0.556,\n Ж: 0.905,\n З: 0.577,\n И: 0.756,\n Й: 0.756,\n К: 0.625,\n Л: 0.698,\n М: 0.907,\n Н: 0.743,\n О: 0.761,\n П: 0.733,\n Р: 0.605,\n С: 0.64,\n Т: 0.556,\n У: 0.616,\n Ф: 0.817,\n Х: 0.588,\n Ц: 0.74,\n Ч: 0.673,\n Ш: 1.035,\n Щ: 1.026,\n Ъ: 0.685,\n Ы: 0.849,\n Ь: 0.607,\n Э: 0.647,\n Ю: 0.999,\n Я: 0.638,\n а: 0.556,\n б: 0.597,\n в: 0.564,\n г: 0.438,\n д: 0.607,\n е: 0.551,\n ж: 0.759,\n з: 0.488,\n и: 0.621,\n й: 0.621,\n к: 0.531,\n л: 0.587,\n м: 0.768,\n н: 0.614,\n о: 0.594,\n п: 0.606,\n р: 0.608,\n с: 0.493,\n т: 0.465,\n у: 0.509,\n ф: 0.737,\n х: 0.511,\n ц: 0.612,\n ч: 0.589,\n ш: 0.894,\n щ: 0.897,\n ъ: 0.623,\n ы: 0.759,\n ь: 0.545,\n э: 0.494,\n ю: 0.799,\n я: 0.577,\n ѐ: 0.551,\n ё: 0.551,\n ђ: 0.619,\n ѓ: 0.438,\n є: 0.493,\n ѕ: 0.468,\n і: 0.258,\n ї: 0.258,\n ј: 0.258,\n љ: 0.859,\n њ: 0.89,\n ћ: 0.621,\n ќ: 0.531,\n ѝ: 0.621,\n ў: 0.509,\n џ: 0.606,\n \"‐\": 0.322,\n \"–\": 0.5,\n \"—\": 1,\n \"‘\": 0.175,\n \"’\": 0.175,\n \"‚\": 0.25,\n \"“\": 0.359,\n \"”\": 0.359,\n \"„\": 0.416,\n \"…\": 0.791,\n \"‰\": 1.177,\n \"•\": 0.376,\n \"€\": 0.572,\n \"™\": 0.773,\n \"№\": 1.02,\n },\n },\n \"architects-daughter\": {\n capHeight: 0.6592,\n defaultAdvance: 0.5163,\n advances: {\n \"0\": 0.6309,\n \"1\": 0.1279,\n \"2\": 0.5723,\n \"3\": 0.5088,\n \"4\": 0.6807,\n \"5\": 0.708,\n \"6\": 0.627,\n \"7\": 0.6152,\n \"8\": 0.6484,\n \"9\": 0.5693,\n \" \": 0.4004,\n \"!\": 0.1348,\n '\"': 0.2363,\n \"#\": 0.6377,\n $: 0.5566,\n \"%\": 0.5186,\n \"&\": 0.6699,\n \"'\": 0.1621,\n \"(\": 0.2979,\n \")\": 0.3516,\n \"*\": 0.5078,\n \"+\": 0.5244,\n \",\": 0.1777,\n \"-\": 0.3105,\n \".\": 0.1406,\n \"/\": 0.4551,\n \":\": 0.167,\n \";\": 0.124,\n \"<\": 0.4756,\n \"=\": 0.4922,\n \">\": 0.4717,\n \"?\": 0.5059,\n \"@\": 1.043,\n A: 0.6406,\n B: 0.7109,\n C: 0.708,\n D: 0.6484,\n E: 0.5918,\n F: 0.6924,\n G: 0.6924,\n H: 0.6055,\n I: 0.1514,\n J: 0.5293,\n K: 0.6055,\n L: 0.6924,\n M: 0.8271,\n N: 0.627,\n O: 0.6699,\n P: 0.6377,\n Q: 0.7129,\n R: 0.7129,\n S: 0.6426,\n T: 0.623,\n U: 0.5615,\n V: 0.627,\n W: 0.9404,\n X: 0.5996,\n Y: 0.5342,\n Z: 0.7842,\n \"[\": 0.4248,\n \"\\\\\": 0.502,\n \"]\": 0.541,\n \"^\": 0.3066,\n _: 0.6865,\n \"`\": 0.1719,\n a: 0.5088,\n b: 0.5615,\n c: 0.6328,\n d: 0.5127,\n e: 0.541,\n f: 0.5938,\n g: 0.5156,\n h: 0.4951,\n i: 0.1514,\n j: 0.1777,\n k: 0.6143,\n l: 0.1572,\n m: 0.7783,\n n: 0.5,\n o: 0.5625,\n p: 0.5566,\n q: 0.5137,\n r: 0.5518,\n s: 0.502,\n t: 0.4043,\n u: 0.5078,\n v: 0.5186,\n w: 0.8086,\n x: 0.4707,\n y: 0.5488,\n z: 0.4951,\n \"{\": 0.3525,\n \"|\": 0.1455,\n \"}\": 0.4785,\n \"~\": 0.4443,\n \" \": 0.4004,\n \"¡\": 0.1348,\n \"¢\": 0.6328,\n \"£\": 0.5391,\n \"¤\": 0.5625,\n \"¥\": 0.5342,\n \"¦\": 0.1279,\n \"§\": 0.502,\n \"¨\": 0.3711,\n \"©\": 0.6309,\n ª: 0.249,\n \"«\": 0.7012,\n \"¬\": 0.5996,\n \"®\": 0.6309,\n \"¯\": 0.3105,\n \"°\": 0.2197,\n \"±\": 0.5244,\n \"²\": 0.375,\n \"³\": 0.3281,\n \"´\": 0.1719,\n µ: 0.4902,\n \"¶\": 0.3789,\n \"·\": 0.1406,\n \"¸\": 0.2666,\n \"¹\": 0.1123,\n º: 0.2715,\n \"»\": 0.6543,\n \"¼\": 0.6201,\n \"½\": 0.6484,\n \"¾\": 0.8623,\n \"¿\": 0.4844,\n À: 0.6406,\n Á: 0.6406,\n Â: 0.6406,\n Ã: 0.6406,\n Ä: 0.6406,\n Å: 0.6406,\n Æ: 0.877,\n Ç: 0.708,\n È: 0.5918,\n É: 0.5918,\n Ê: 0.5918,\n Ë: 0.5918,\n Ì: 0.1514,\n Í: 0.1514,\n Î: 0.1514,\n Ï: 0.1514,\n Ð: 0.6816,\n Ñ: 0.627,\n Ò: 0.6699,\n Ó: 0.6699,\n Ô: 0.6699,\n Õ: 0.6699,\n Ö: 0.6699,\n \"×\": 0.4707,\n Ø: 0.6699,\n Ù: 0.5615,\n Ú: 0.5615,\n Û: 0.5615,\n Ü: 0.5615,\n Ý: 0.5342,\n Þ: 0.5059,\n ß: 0.7109,\n à: 0.5088,\n á: 0.5088,\n â: 0.5088,\n ã: 0.5088,\n ä: 0.5088,\n å: 0.5088,\n æ: 0.9238,\n ç: 0.6328,\n è: 0.541,\n é: 0.541,\n ê: 0.541,\n ë: 0.541,\n ì: 0.1514,\n í: 0.1514,\n î: 0.1514,\n ï: 0.1514,\n ð: 0.5801,\n ñ: 0.5,\n ò: 0.5625,\n ó: 0.5625,\n ô: 0.5625,\n õ: 0.5625,\n ö: 0.5625,\n \"÷\": 0.3438,\n ø: 0.5625,\n ù: 0.5078,\n ú: 0.5078,\n û: 0.5078,\n ü: 0.5078,\n ý: 0.5488,\n þ: 0.5186,\n ÿ: 0.5488,\n \"–\": 0.3105,\n \"—\": 0.4111,\n \"‘\": 0.1621,\n \"’\": 0.1621,\n \"‚\": 0.1621,\n \"“\": 0.2363,\n \"”\": 0.2363,\n \"„\": 0.2803,\n \"…\": 0.4229,\n \"•\": 0.1924,\n \"€\": 0.7949,\n \"™\": 1.21,\n },\n },\n \"comic-neue\": {\n capHeight: 0.67,\n defaultAdvance: 0.4919,\n advances: {\n \"0\": 0.609,\n \"1\": 0.396,\n \"2\": 0.523,\n \"3\": 0.506,\n \"4\": 0.484,\n \"5\": 0.542,\n \"6\": 0.542,\n \"7\": 0.473,\n \"8\": 0.515,\n \"9\": 0.531,\n \" \": 0.334,\n \"!\": 0.245,\n '\"': 0.275,\n \"#\": 0.74,\n $: 0.602,\n \"%\": 0.72,\n \"&\": 0.644,\n \"'\": 0.196,\n \"(\": 0.346,\n \")\": 0.346,\n \"*\": 0.394,\n \"+\": 0.444,\n \",\": 0.164,\n \"-\": 0.402,\n \".\": 0.153,\n \"/\": 0.436,\n \":\": 0.181,\n \";\": 0.199,\n \"<\": 0.511,\n \"=\": 0.462,\n \">\": 0.541,\n \"?\": 0.501,\n \"@\": 0.832,\n A: 0.581,\n B: 0.62,\n C: 0.614,\n D: 0.629,\n E: 0.603,\n F: 0.577,\n G: 0.716,\n H: 0.723,\n I: 0.392,\n J: 0.457,\n K: 0.56,\n L: 0.5,\n M: 0.838,\n N: 0.658,\n O: 0.643,\n P: 0.56,\n Q: 0.708,\n R: 0.596,\n S: 0.552,\n T: 0.522,\n U: 0.691,\n V: 0.536,\n W: 0.867,\n X: 0.685,\n Y: 0.594,\n Z: 0.582,\n \"[\": 0.318,\n \"\\\\\": 0.549,\n \"]\": 0.318,\n \"^\": 0.504,\n _: 0.494,\n \"`\": 0.181,\n a: 0.516,\n b: 0.535,\n c: 0.482,\n d: 0.53,\n e: 0.501,\n f: 0.279,\n g: 0.53,\n h: 0.536,\n i: 0.227,\n j: 0.236,\n k: 0.484,\n l: 0.219,\n m: 0.827,\n n: 0.553,\n o: 0.529,\n p: 0.531,\n q: 0.52,\n r: 0.397,\n s: 0.416,\n t: 0.286,\n u: 0.511,\n v: 0.418,\n w: 0.598,\n x: 0.473,\n y: 0.447,\n z: 0.434,\n \"{\": 0.373,\n \"|\": 0.197,\n \"}\": 0.373,\n \"~\": 0.615,\n \" \": 0.334,\n \"¡\": 0.245,\n \"¢\": 0.48,\n \"£\": 0.661,\n \"¤\": 0.507,\n \"¥\": 0.494,\n \"¦\": 0.223,\n \"§\": 0.421,\n \"¨\": 0.265,\n \"©\": 0.547,\n ª: 0.302,\n \"«\": 0.563,\n \"¬\": 0.478,\n \"\": 0.402,\n \"®\": 0.555,\n \"¯\": 0.263,\n \"°\": 0.247,\n \"±\": 0.445,\n \"²\": 0.249,\n \"³\": 0.245,\n \"´\": 0.181,\n µ: 0.504,\n \"¶\": 0.557,\n \"·\": 0.176,\n \"¸\": 0.172,\n \"¹\": 0.176,\n º: 0.281,\n \"»\": 0.559,\n \"¼\": 0.685,\n \"½\": 0.741,\n \"¾\": 0.734,\n \"¿\": 0.485,\n À: 0.581,\n Á: 0.581,\n Â: 0.581,\n Ã: 0.581,\n Ä: 0.581,\n Å: 0.581,\n Æ: 1.044,\n Ç: 0.614,\n È: 0.603,\n É: 0.603,\n Ê: 0.603,\n Ë: 0.603,\n Ì: 0.392,\n Í: 0.392,\n Î: 0.392,\n Ï: 0.392,\n Ð: 0.634,\n Ñ: 0.658,\n Ò: 0.643,\n Ó: 0.643,\n Ô: 0.643,\n Õ: 0.643,\n Ö: 0.643,\n \"×\": 0.376,\n Ø: 0.635,\n Ù: 0.691,\n Ú: 0.691,\n Û: 0.691,\n Ü: 0.691,\n Ý: 0.594,\n Þ: 0.542,\n ß: 0.526,\n à: 0.516,\n á: 0.516,\n â: 0.516,\n ã: 0.516,\n ä: 0.516,\n å: 0.516,\n æ: 0.822,\n ç: 0.482,\n è: 0.501,\n é: 0.501,\n ê: 0.501,\n ë: 0.501,\n ì: 0.228,\n í: 0.228,\n î: 0.228,\n ï: 0.228,\n ð: 0.47,\n ñ: 0.553,\n ò: 0.529,\n ó: 0.529,\n ô: 0.529,\n õ: 0.529,\n ö: 0.529,\n \"÷\": 0.432,\n ø: 0.529,\n ù: 0.511,\n ú: 0.511,\n û: 0.511,\n ü: 0.511,\n ý: 0.447,\n þ: 0.531,\n ÿ: 0.447,\n \"–\": 0.6,\n \"—\": 0.824,\n \"‘\": 0.185,\n \"’\": 0.185,\n \"‚\": 0.265,\n \"“\": 0.308,\n \"”\": 0.326,\n \"„\": 0.373,\n \"…\": 0.664,\n \"•\": 0.313,\n \"€\": 0.667,\n \"™\": 0.487,\n },\n },\n};\n","// Headless TextMeasurer implementation. The editor measures text with a\n// canvas (`ctx.measureText`); Node has no canvas, so measurement runs off\n// per-glyph advance-width tables extracted from the real TTFs\n// (advanceTables.ts, regenerated via `npm run gen:fonts`).\n//\n// approximateTextMeasurer is ZERO-CONFIG and per-font accurate on advances,\n// but APPROXIMATE overall: no kerning/shaping, ASCII table only (other\n// characters use the font's average advance). Good enough for bounds /\n// hit-testing / preview; NOT pixel-exact. When a sink is available its own\n// measureText is preferred (the painters already use it), so this mainly\n// serves sink-less calls (buildSnapEntry bounds).\n\nimport type { TextMeasurer } from \"./textMetrics\";\nimport { realFace, resolveFont } from \"../model/fonts\";\nimport { ADVANCE_TABLES } from \"./advanceTables\";\n\n/**\n * Zero-config headless measurer. Model text heights are CAP heights, so\n * measurement scales the em advances by heightMm / capHeight.\n */\nexport const approximateTextMeasurer: TextMeasurer = {\n measureTextWidth: (text, heightMm, font, widthFactor = 1) => {\n // A bundled bold/italic face has its own advances; a synthesized one\n // keeps the regular font's (synthesis doesn't change advances).\n const table = ADVANCE_TABLES[realFace(font) ?? resolveFont(font).id];\n let em = 0;\n for (const ch of text) em += table.advances[ch] ?? table.defaultAdvance;\n return (em * heightMm * widthFactor) / table.capHeight;\n },\n};\n","// Pure text geometry: alignment involutions and the corner points of a\n// text box, used by bounds, snapping, and hit-testing. Measurement is\n// injected (see textMetrics.ts); the sink-bound painter stays editor-side.\n\nimport type {\n ArrowType,\n PolylineVertex,\n Text,\n TextStyle,\n} from \"../model/objects\";\nimport { effectiveTextFont, textStyleFor } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale, sub } from \"../geometry/vec2\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\n\n// Text alignment is JUSTIFICATION — which edge of the text sits on its\n// point, the AutoCAD / DXF and canvas meaning (\"right\" = the text lies left\n// of the point, \"bottom\" = above it). Model, sinks and DXF share it, so no\n// mapping between them (docs/adr/0002).\n\n/** Effective cap height (override, else the referenced style's) with the\n * object's scale applied (like DimStyle.scale). */\nexport const textHeight = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.textHeight ?? textStyleFor(obj, textStyles).textHeight) *\n obj.scale;\n\n/** Effective leader arrowhead size (override, else the referenced style's)\n * with the object's scale applied. */\nexport const textArrowSize = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): number =>\n (obj.styleOverride?.arrowSize ?? textStyleFor(obj, textStyles).arrowSize) *\n obj.scale;\n\n/** Effective leader arrowhead style (override, else the referenced\n * style's). */\nexport const textArrowType = (\n obj: Text,\n textStyles: readonly TextStyle[],\n): ArrowType =>\n obj.styleOverride?.arrowType ?? textStyleFor(obj, textStyles).arrowType;\n\n/** Wrap/box width with the object's scale applied, or undefined for no wrap. */\nexport const textWidth = (obj: Text): number | undefined =>\n obj.width === undefined ? undefined : obj.width * obj.scale;\n\n/** Frame border inset from the text box, proportional to cap height. */\nconst FRAME_MARGIN_FACTOR = 0.35;\n\n/** The rotated local frame + anchor-relative extents of a text's box. */\nconst textBoxLocal = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n) => {\n // Bind the object's effective font (own, else document style) — callers\n // pass generic measurers. (Already-bound measurers ignore the extra args,\n // so this can't double.)\n const { font, widthFactor } = effectiveTextFont(obj, textStyles);\n const m = boundMeasurer(measure, font, widthFactor);\n const block = textBlock(\n obj.content,\n textHeight(obj, textStyles),\n m,\n textWidth(obj),\n );\n const u = fromAngle(obj.rotation);\n const vUp = perp(u);\n const hA = obj.hAlign;\n const vA = obj.vAlign;\n // Anchor-relative extents by (anchor-edge) alignment.\n const left =\n hA === \"left\" ? 0 : hA === \"center\" ? -block.width / 2 : -block.width;\n const top =\n vA === \"top\" ? 0 : vA === \"center\" ? block.height / 2 : block.height;\n const at = (dx: number, dy: number): Vec2 =>\n add(add(obj.position, scale(u, dx)), scale(vUp, dy));\n return {\n block,\n u,\n vUp,\n left,\n right: left + block.width,\n top,\n bottom: top - block.height,\n at,\n };\n};\n\n/** Corner points of the (rotated) text box, for bounds/hit-testing. */\nexport const textBoxCorners = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Vec2[] => {\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n return [at(left, top), at(right, top), at(right, bottom), at(left, bottom)];\n};\n\n/**\n * Change a text's alignment and keep its box where it is (AutoCAD): the\n * position moves to the box's new justification point.\n */\nexport const realignText = (\n obj: Text,\n align: Partial<Pick<Text, \"hAlign\" | \"vAlign\">>,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): Text => {\n const next = { ...obj, ...align };\n const before = textBoxCorners(obj, measure, textStyles)[0];\n const after = textBoxCorners(next, measure, textStyles)[0];\n return { ...next, position: add(obj.position, sub(before, after)) };\n};\n\n/** A frame part: a vertex chain with DXF bulges (arcs), like a polyline. */\nexport interface TextFramePart {\n points: PolylineVertex[];\n closed: boolean;\n}\n\n/**\n * The text frame as polyline-shaped chains (none → empty), offset outward\n * from the text box by a cap-height-proportional margin: \"rectangle\" a box,\n * \"circle\" the circle around the box, \"slot\" a box with semicircular ends,\n * \"bottom\" a line under the text, \"firstLine\" one under its first line.\n */\nexport const textFrameGeometry = (\n obj: Text,\n measure: TextMeasurer,\n textStyles: readonly TextStyle[],\n): TextFramePart[] => {\n if (!obj.frame || obj.frame === \"none\") return [];\n const { left, right, top, bottom, at } = textBoxLocal(\n obj,\n measure,\n textStyles,\n );\n const h = textHeight(obj, textStyles);\n const m = h * FRAME_MARGIN_FACTOR;\n const l = left - m;\n const r = right + m;\n const t = top + m;\n const b = bottom - m;\n const v = (dx: number, dy: number, bulge = 0): PolylineVertex => ({\n ...at(dx, dy),\n bulge,\n });\n const line = (y: number) => [{ points: [v(l, y), v(r, y)], closed: false }];\n switch (obj.frame) {\n case \"bottom\":\n return line(b);\n case \"firstLine\":\n return line(top - h - m);\n case \"circle\": {\n // Circumscribes the box; bulge 1 = a half circle per vertex.\n const cy = (top + bottom) / 2;\n const rad = Math.hypot((right - left) / 2, (top - bottom) / 2) + m;\n const cx = (left + right) / 2;\n return [\n { points: [v(cx - rad, cy, 1), v(cx + rad, cy, 1)], closed: true },\n ];\n }\n case \"slot\":\n // Straight over the text, half circles past its ends (CCW chain).\n return [\n {\n points: [v(right, b, 1), v(right, t), v(left, t, 1), v(left, b)],\n closed: true,\n },\n ];\n default:\n return [{ points: [v(l, b), v(r, b), v(r, t), v(l, t)], closed: true }];\n }\n};\n","// Table layout: the ONE derivation of a table's geometry (docs/table-object.md).\n// A table resolves to world-space child objects — grid rules as `line`s and\n// one `text` per cell — so the painter, snapping and DXF export reuse their\n// existing per-type code (the block-instance pattern).\n//\n// Layout (wrapping and row heights) is measured with the DETERMINISTIC\n// approximate measurer, not a sink's: every output must agree on where rows\n// fall, so the cell text is pre-wrapped here and handed to the text painter\n// as explicit lines (the same reason the text painter lays out tab stops\n// with it). A canvas glyph run may over/underfill a line by the\n// approximation error instead.\n\nimport type { ModelObject, Table, Text, TextStyle } from \"../model/objects\";\nimport { effectiveTextFont } from \"../model/objects\";\nimport type { Vec2 } from \"../geometry/vec2\";\nimport { add, fromAngle, perp, scale } from \"../geometry/vec2\";\nimport { approximateTextMeasurer } from \"./textMeasurer\";\nimport { boundMeasurer, textBlock, type TextMeasurer } from \"./textMetrics\";\nimport { textHeight } from \"./textGeometry\";\n\n/** One rule of the grid, in table-local coordinates (x right, y DOWN from\n * the top-left corner, scaled mm). */\ninterface LocalRule {\n a: Vec2;\n b: Vec2;\n header: boolean;\n}\n\nexport interface TableLayout {\n /** Column boundaries, local x (n + 1 values, from 0). */\n colX: number[];\n /** Row boundaries, local y downward (m + 1 values, from 0). */\n rowY: number[];\n /** World corners: top-left, top-right, bottom-right, bottom-left. */\n outline: Vec2[];\n /** Rules + cell texts as world objects (rules first, under the text). */\n children: ModelObject[];\n /** Anchor cells with their merged extents (merge-aware cell lookup). */\n anchors: { row: number; col: number; rows: number; cols: number }[];\n}\n\n/** Header rule weight when the table sets no lineWidth (ISO thick pen). */\nconst HEADER_RULE_MM = 0.5;\n\n/** Table-local point → world. */\nconst toWorld = (t: Table, p: Vec2): Vec2 => {\n const u = fromAngle(t.rotation);\n return add(add(t.position, scale(u, p.x)), scale(perp(u), -p.y));\n};\n\n/** The anchor index covering each grid slot (merges claim their area). */\nconst ownerGrid = (t: Table): number[][] => {\n const owner = t.cells.map((row) => row.map(() => -1));\n let next = 0;\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== -1) return; // covered by an earlier merge\n const id = next++;\n const rows = cell.span?.rows ?? 1;\n const cols = cell.span?.cols ?? 1;\n for (let i = r; i < Math.min(r + rows, t.rows.length); i++)\n for (let j = c; j < Math.min(c + cols, t.columns.length); j++)\n if (owner[i][j] === -1) owner[i][j] = id;\n }),\n );\n return owner;\n};\n\n/** A cell's text as a stand-alone Text (styles merged over the table's),\n * not yet positioned. */\nconst cellText = (t: Table, row: number, col: number): Text => {\n const cell = t.cells[row][col];\n return {\n type: \"text\",\n id: `${t.id}:${row}:${col}`,\n layerId: t.layerId,\n position: { x: 0, y: 0 },\n content: cell.text,\n leaderLines: [],\n hAlign: \"center\",\n vAlign: \"center\",\n rotation: t.rotation,\n scale: t.scale,\n styleId: cell.styleId ?? t.styleId,\n styleOverride: { ...t.styleOverride, ...cell.styleOverride },\n ...(cell.color ? { color: cell.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n };\n};\n\n/** Word wrap leaves a single word wider than the cell on its own line,\n * running through the border; a cell breaks such a line between characters\n * instead (text objects keep word-only wrapping). */\nconst breakLongLines = (\n lines: string[],\n h: number,\n measure: TextMeasurer,\n width: number,\n): string[] =>\n lines.flatMap((line) => {\n if (measure.measureTextWidth(line, h) <= width) return [line];\n const out: string[] = [];\n let cur = \"\";\n for (const ch of line) {\n if (cur && measure.measureTextWidth(cur + ch, h) > width) {\n out.push(cur.trimEnd());\n cur = ch.trimStart();\n } else cur += ch;\n }\n if (cur) out.push(cur);\n return out;\n });\n\n/** Where a cell's text sits: its aligned anchor point inside the (merged)\n * cell rect, in world space, with the model alignment for it. */\nconst cellAnchor = (\n t: Table,\n colX: number[],\n rowY: number[],\n a: TableLayout[\"anchors\"][number],\n): Pick<Text, \"position\" | \"hAlign\" | \"vAlign\"> => {\n const cell = t.cells[a.row][a.col];\n const margin = t.cellMargin * t.scale;\n const x0 = colX[a.col] + margin;\n const x1 = colX[a.col + a.cols] - margin;\n const y0 = rowY[a.row] + margin;\n const y1 = rowY[a.row + a.rows] - margin;\n const h = cell.hAlign ?? \"left\";\n const v = cell.vAlign ?? \"center\";\n return {\n position: toWorld(t, {\n x: h === \"left\" ? x0 : h === \"right\" ? x1 : (x0 + x1) / 2,\n y: v === \"top\" ? y0 : v === \"bottom\" ? y1 : (y0 + y1) / 2,\n }),\n // The cell's justification is the text's: same edge on the point.\n hAlign: h,\n vAlign: v,\n };\n};\n\n/** A cell's editable frame: its text (styles merged, positioned as the\n * painter places it) and the wrap width inside the margins — what an\n * in-place editor needs to sit exactly over the painted text. `row`/`col`\n * may name any slot; a covered slot resolves to its merge anchor. */\nexport const tableCellFrame = (\n t: Table,\n textStyles: readonly TextStyle[],\n row: number,\n col: number,\n): { row: number; col: number; text: Text; innerWidth: number } => {\n const { colX, rowY, anchors } = tableLayout(t, textStyles);\n const a = anchors.find(\n (a) =>\n row >= a.row &&\n row < a.row + a.rows &&\n col >= a.col &&\n col < a.col + a.cols,\n ) ?? { row, col, rows: 1, cols: 1 };\n return {\n row: a.row,\n col: a.col,\n text: { ...cellText(t, a.row, a.col), ...cellAnchor(t, colX, rowY, a) },\n innerWidth: colX[a.col + a.cols] - colX[a.col] - 2 * t.cellMargin * t.scale,\n };\n};\n\nconst cache = new WeakMap<\n Table,\n { styles: readonly TextStyle[]; layout: TableLayout }\n>();\n\nexport const tableLayout = (\n t: Table,\n textStyles: readonly TextStyle[],\n): TableLayout => {\n const hit = cache.get(t);\n if (hit && hit.styles === textStyles) return hit.layout;\n\n const s = t.scale;\n const margin = t.cellMargin * s;\n const colX = [0];\n for (const w of t.columns) colX.push(colX[colX.length - 1] + w * s);\n\n // Anchors with their wrapped text.\n const owner = ownerGrid(t);\n const anchors: TableLayout[\"anchors\"] = [];\n const wrapped: { text: Text; lines: string[]; height: number }[] = [];\n t.cells.forEach((row, r) =>\n row.forEach((cell, c) => {\n if (owner[r][c] !== anchors.length) return;\n const rows = Math.min(cell.span?.rows ?? 1, t.rows.length - r);\n const cols = Math.min(cell.span?.cols ?? 1, t.columns.length - c);\n anchors.push({ row: r, col: c, rows, cols });\n const text = cellText(t, r, c);\n const h = textHeight(text, textStyles);\n const { font, widthFactor } = effectiveTextFont(text, textStyles);\n const inner = colX[c + cols] - colX[c] - 2 * margin;\n const measure = boundMeasurer(approximateTextMeasurer, font, widthFactor);\n const block = textBlock(\n cell.text,\n h,\n measure,\n inner > 0 ? inner : undefined,\n );\n const lines =\n inner > 0\n ? breakLongLines(block.lines, h, measure, inner)\n : block.lines;\n wrapped.push({\n text,\n lines,\n // An empty cell still reserves one line of its text height.\n height:\n (cell.text ? h + (lines.length - 1) * block.lineHeight : h) +\n 2 * margin,\n });\n }),\n );\n\n // Row heights: the floor, then single-row cells, then merges that still\n // don't fit grow their LAST row (in order of that row).\n const heights = t.rows.map((r) => (r.minHeight ?? 0) * s);\n anchors.forEach((a, i) => {\n if (a.rows === 1)\n heights[a.row] = Math.max(heights[a.row], wrapped[i].height);\n });\n anchors\n .map((a, i) => ({ a, need: wrapped[i].height }))\n .filter(({ a }) => a.rows > 1)\n .sort((x, y) => x.a.row + x.a.rows - (y.a.row + y.a.rows))\n .forEach(({ a, need }) => {\n let have = 0;\n for (let r = a.row; r < a.row + a.rows; r++) have += heights[r];\n if (have < need) heights[a.row + a.rows - 1] += need - have;\n });\n // Rows nobody sized (all covered by merges that fit) get the table's\n // one-line height so the grid never collapses.\n const oneLine = textHeight(cellText(t, 0, 0), textStyles) + 2 * margin;\n const rowY = [0];\n for (const h of heights) rowY.push(rowY[rowY.length - 1] + (h || oneLine));\n\n // Rules: boundaries between different owners (merges suppress their\n // interior), per the borders preset; collinear runs joined.\n const nr = t.rows.length;\n const nc = t.columns.length;\n const inner = t.borders === \"all\";\n const innerRows = t.borders === \"all\" || t.borders === \"rows\";\n const outer = t.borders !== \"none\";\n const rules: LocalRule[] = [];\n const run = (\n on: boolean[],\n seg: (k: number) => [Vec2, Vec2],\n header: boolean,\n ) => {\n let start = -1;\n for (let k = 0; k <= on.length; k++) {\n if (k < on.length && on[k]) {\n if (start === -1) start = k;\n continue;\n }\n if (start !== -1) {\n rules.push({ a: seg(start)[0], b: seg(k - 1)[1], header });\n start = -1;\n }\n }\n };\n for (let j = 0; j <= nc; j++) {\n const edge = j === 0 || j === nc;\n const on = Array.from({ length: nr }, (_, r) =>\n edge ? outer : inner && owner[r][j - 1] !== owner[r][j],\n );\n run(\n on,\n (r) => [\n { x: colX[j], y: rowY[r] },\n { x: colX[j], y: rowY[r + 1] },\n ],\n false,\n );\n }\n for (let i = 0; i <= nr; i++) {\n const edge = i === 0 || i === nr;\n const header = !edge && i === t.headerRows && outer;\n const on = Array.from({ length: nc }, (_, c) =>\n edge ? outer : (innerRows || header) && owner[i - 1][c] !== owner[i][c],\n );\n run(\n on,\n (c) => [\n { x: colX[c], y: rowY[i] },\n { x: colX[c + 1], y: rowY[i] },\n ],\n header,\n );\n }\n\n const children: ModelObject[] = rules.map((r, k) => ({\n type: \"line\",\n id: `${t.id}:rule:${k}`,\n layerId: t.layerId,\n a: toWorld(t, r.a),\n b: toWorld(t, r.b),\n ...(t.color ? { color: t.color } : {}),\n ...(t.opacity !== undefined ? { opacity: t.opacity } : {}),\n ...(r.header\n ? { lineWidth: t.lineWidth ? t.lineWidth * 2 : HEADER_RULE_MM }\n : t.lineWidth\n ? { lineWidth: t.lineWidth }\n : {}),\n }));\n\n // Cell texts at their aligned anchor points inside the merged rect.\n anchors.forEach((a, i) => {\n const { text, lines } = wrapped[i];\n if (!t.cells[a.row][a.col].text) return;\n children.push({\n ...text,\n ...cellAnchor(t, colX, rowY, a),\n content: lines.join(\"\\n\"),\n });\n });\n\n const w = colX[nc];\n const hTotal = rowY[nr];\n const layout: TableLayout = {\n colX,\n rowY,\n outline: [\n toWorld(t, { x: 0, y: 0 }),\n toWorld(t, { x: w, y: 0 }),\n toWorld(t, { x: w, y: hTotal }),\n toWorld(t, { x: 0, y: hTotal }),\n ],\n children,\n anchors,\n };\n cache.set(t, { styles: textStyles, layout });\n return layout;\n};\n","// AutoCAD Color Index mapping. Exports carry BOTH the nearest ACI (group 62,\n// legacy viewers) and the exact true color (group 420, wins where supported);\n// import resolves either back to hex.\n\nexport const hexToRgb = (hex: string): [number, number, number] | null => {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\n if (!m) return null;\n return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)];\n};\n\nexport const rgbToHex = (r: number, g: number, b: number): string =>\n `#${[r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\"),\n )\n .join(\"\")}`;\n\n// Full AutoCAD Color Index → hex palette (index 0 = ByBlock, 256 = ByLayer are\n// reserved and never looked up). Used on import to resolve an entity's ACI to a\n// concrete color. Generated from the standard ACAD palette.\nconst ACI_HEX: string[] = [\n \"#000000\",\n \"#ff0000\",\n \"#ffff00\",\n \"#00ff00\",\n \"#00ffff\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#ffffff\",\n \"#808080\",\n \"#c0c0c0\",\n \"#ff0000\",\n \"#ff7f7f\",\n \"#cc0000\",\n \"#cc6666\",\n \"#990000\",\n \"#994c4c\",\n \"#7f0000\",\n \"#7f3f3f\",\n \"#4c0000\",\n \"#4c2626\",\n \"#ff3f00\",\n \"#ff9f7f\",\n \"#cc3300\",\n \"#cc7f66\",\n \"#992600\",\n \"#995f4c\",\n \"#7f1f00\",\n \"#7f4f3f\",\n \"#4c1300\",\n \"#4c2f26\",\n \"#ff7f00\",\n \"#ffbf7f\",\n \"#cc6600\",\n \"#cc9966\",\n \"#994c00\",\n \"#99724c\",\n \"#7f3f00\",\n \"#7f5f3f\",\n \"#4c2600\",\n \"#4c3926\",\n \"#ffbf00\",\n \"#ffdf7f\",\n \"#cc9900\",\n \"#ccb266\",\n \"#997200\",\n \"#99854c\",\n \"#7f5f00\",\n \"#7f6f3f\",\n \"#4c3900\",\n \"#4c4226\",\n \"#ffff00\",\n \"#ffff7f\",\n \"#cccc00\",\n \"#cccc66\",\n \"#989800\",\n \"#98984c\",\n \"#7f7f00\",\n \"#7f7f3f\",\n \"#4c4c00\",\n \"#4c4c26\",\n \"#bfff00\",\n \"#dfff7f\",\n \"#99cc00\",\n \"#b2cc66\",\n \"#729800\",\n \"#85984c\",\n \"#5f7f00\",\n \"#6f7f3f\",\n \"#394c00\",\n \"#424c26\",\n \"#7fff00\",\n \"#bfff7f\",\n \"#66cc00\",\n \"#99cc66\",\n \"#4c9800\",\n \"#72984c\",\n \"#3f7f00\",\n \"#5f7f3f\",\n \"#264c00\",\n \"#394c26\",\n \"#3fff00\",\n \"#9fff7f\",\n \"#33cc00\",\n \"#7fcc66\",\n \"#269800\",\n \"#5f984c\",\n \"#1f7f00\",\n \"#4f7f3f\",\n \"#134c00\",\n \"#2f4c26\",\n \"#00ff00\",\n \"#7fff7f\",\n \"#00cc00\",\n \"#66cc66\",\n \"#009800\",\n \"#4c984c\",\n \"#007f00\",\n \"#3f7f3f\",\n \"#004c00\",\n \"#264c26\",\n \"#00ff3f\",\n \"#7fff9f\",\n \"#00cc33\",\n \"#66cc7f\",\n \"#009826\",\n \"#4c985f\",\n \"#007f1f\",\n \"#3f7f4f\",\n \"#004c13\",\n \"#264c2f\",\n \"#00ff7f\",\n \"#7fffbf\",\n \"#00cc66\",\n \"#66cc99\",\n \"#00984c\",\n \"#4c9872\",\n \"#007f3f\",\n \"#3f7f5f\",\n \"#004c26\",\n \"#264c39\",\n \"#00ffbf\",\n \"#7fffdf\",\n \"#00cc99\",\n \"#66ccb2\",\n \"#009872\",\n \"#4c9885\",\n \"#007f5f\",\n \"#3f7f6f\",\n \"#004c39\",\n \"#264c42\",\n \"#00ffff\",\n \"#7fffff\",\n \"#00cccc\",\n \"#66cccc\",\n \"#009898\",\n \"#4c9898\",\n \"#007f7f\",\n \"#3f7f7f\",\n \"#004c4c\",\n \"#264c4c\",\n \"#00bfff\",\n \"#7fdfff\",\n \"#0099cc\",\n \"#66b2cc\",\n \"#007298\",\n \"#4c8598\",\n \"#005f7f\",\n \"#3f6f7f\",\n \"#00394c\",\n \"#26424c\",\n \"#007fff\",\n \"#7fbfff\",\n \"#0066cc\",\n \"#6699cc\",\n \"#004c98\",\n \"#4c7298\",\n \"#003f7f\",\n \"#3f5f7f\",\n \"#00264c\",\n \"#26394c\",\n \"#003fff\",\n \"#7f9fff\",\n \"#0033cc\",\n \"#667fcc\",\n \"#002698\",\n \"#4c5f98\",\n \"#001f7f\",\n \"#3f4f7f\",\n \"#00134c\",\n \"#262f4c\",\n \"#0000ff\",\n \"#7f7fff\",\n \"#0000cc\",\n \"#6666cc\",\n \"#000098\",\n \"#4c4c98\",\n \"#00007f\",\n \"#3f3f7f\",\n \"#00004c\",\n \"#26264c\",\n \"#3f00ff\",\n \"#9f7fff\",\n \"#3300cc\",\n \"#7f66cc\",\n \"#260098\",\n \"#5f4c98\",\n \"#1f007f\",\n \"#4f3f7f\",\n \"#13004c\",\n \"#2f264c\",\n \"#7f00ff\",\n \"#bf7fff\",\n \"#6600cc\",\n \"#9966cc\",\n \"#4c0098\",\n \"#724c98\",\n \"#3f007f\",\n \"#5f3f7f\",\n \"#26004c\",\n \"#39264c\",\n \"#bf00ff\",\n \"#df7fff\",\n \"#9900cc\",\n \"#b266cc\",\n \"#720098\",\n \"#854c98\",\n \"#5f007f\",\n \"#6f3f7f\",\n \"#39004c\",\n \"#42264c\",\n \"#ff00ff\",\n \"#ff7fff\",\n \"#cc00cc\",\n \"#cc66cc\",\n \"#980098\",\n \"#984c98\",\n \"#7f007f\",\n \"#7f3f7f\",\n \"#4c004c\",\n \"#4c264c\",\n \"#ff00bf\",\n \"#ff7fdf\",\n \"#cc0099\",\n \"#cc66b2\",\n \"#980072\",\n \"#984c85\",\n \"#7f005f\",\n \"#7f3f6f\",\n \"#4c0039\",\n \"#4c2642\",\n \"#ff007f\",\n \"#ff7fbf\",\n \"#cc0066\",\n \"#cc6699\",\n \"#98004c\",\n \"#984c72\",\n \"#7f003f\",\n \"#7f3f5f\",\n \"#4c0026\",\n \"#4c2639\",\n \"#ff003f\",\n \"#ff7f9f\",\n \"#cc0033\",\n \"#cc667f\",\n \"#980026\",\n \"#984c5f\",\n \"#7f001f\",\n \"#7f3f4f\",\n \"#4c0013\",\n \"#4c262f\",\n \"#333333\",\n \"#5b5b5b\",\n \"#848484\",\n \"#adadad\",\n \"#d6d6d6\",\n \"#ffffff\",\n];\n\n/** Concrete ACI index (1–255) → hex; ByBlock/ByLayer/out-of-range → undefined. */\nexport const aciToHex = (index: number): string | undefined =>\n index > 0 && index < 256 ? ACI_HEX[index] : undefined;\n\n// RGB triples for the palette above, decoded once (index 0 stays unused).\nconst ACI_RGB: [number, number, number][] = ACI_HEX.map(\n (hex) => hexToRgb(hex) ?? [0, 0, 0],\n);\n\n/** Nearest ACI index (1–255, full palette) for a hex color. */\nexport const nearestAci = (hex: string): number => {\n const rgb = hexToRgb(hex);\n if (!rgb) return 7;\n let best = 7;\n let bestD = Infinity;\n for (let index = 1; index < 256; index++) {\n const c = ACI_RGB[index];\n const d =\n (rgb[0] - c[0]) ** 2 + (rgb[1] - c[1]) ** 2 + (rgb[2] - c[2]) ** 2;\n if (d < bestD) {\n bestD = d;\n best = index;\n }\n }\n return best;\n};\n\n/** Hex → packed 24-bit true color (DXF group 420); null for invalid hex. */\nexport const hexToTrueColor = (hex: string): number | null => {\n const rgb = hexToRgb(hex);\n return rgb ? (rgb[0] << 16) | (rgb[1] << 8) | rgb[2] : null;\n};\n","// Hand-rolled DXF pieces @tarikjabiri/dxf lacks: the paper-space VIEWPORT\n// entity, LAYOUT objects (ACAD_LAYOUT dictionary), and MULTILEADER +\n// MLEADERSTYLE. All hook into the writer through its public extension points\n// (EntitiesManager.addEntity / DxfObjectsSection.addObject) so handles and\n// owner wiring stay consistent. The MULTILEADER tag stream mirrors ezdxf's\n// output (AutoCAD-validated) field for field.\n\nimport { Point, DxfObject, type Dxfier } from \"@tarikjabiri/dxf\";\n\n/** Raw AutoCAD color values (0xC?000000 method markers). */\nconst RAW_COLOR_BY_BLOCK = -1056964608;\nconst RAW_COLOR_NONE = -939524096;\n\n/** Zoom-lock bit of the VIEWPORT status flags (group 90). */\nconst VIEWPORT_LOCKED_FLAG = 16384;\n\ninterface ViewportEntityArgs {\n /** Viewport center on the sheet (paper mm). */\n center: { x: number; y: number };\n /** Frame size on the sheet (paper mm). */\n width: number;\n height: number;\n /** Model-space point shown at the viewport center. */\n viewCenter: { x: number; y: number };\n /** Model-space height visible through the frame (sets the scale). */\n viewHeight: number;\n /** 1 is the layout's own paper view; real viewports count from 2. */\n id: number;\n /** Stacking status; > 0 means on. */\n status: number;\n locked: boolean;\n /** Handles of layers frozen in this viewport (group 331). */\n frozenLayerHandles: string[];\n}\n\n/**\n * Paper-space VIEWPORT entity. Extends the writer's Point only to inherit the\n * Entity plumbing (handle, owner block record, common-group emission) — the\n * whole AcDbViewport body is emitted by dxfyChild.\n */\nexport class ViewportEntity extends Point {\n private readonly args: ViewportEntityArgs;\n\n constructor(args: ViewportEntityArgs) {\n super(args.center.x, args.center.y, 0);\n this.args = args;\n // The base Entity emits these (0 VIEWPORT … 100 AcDbViewport).\n this.type = \"VIEWPORT\";\n this.subclassMarker = \"AcDbViewport\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(10, a.center.x);\n dx.push(20, a.center.y);\n dx.push(30, 0);\n dx.push(40, a.width);\n dx.push(41, a.height);\n dx.push(68, a.status);\n dx.push(69, a.id);\n dx.push(12, a.viewCenter.x);\n dx.push(22, a.viewCenter.y);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(14, 10);\n dx.push(24, 10);\n dx.push(15, 10);\n dx.push(25, 10);\n dx.push(16, 0);\n dx.push(26, 0);\n dx.push(36, 1);\n dx.push(17, 0);\n dx.push(27, 0);\n dx.push(37, 0);\n dx.push(42, 50);\n dx.push(43, 0);\n dx.push(44, 0);\n dx.push(45, a.viewHeight);\n dx.push(50, 0);\n dx.push(51, 0);\n dx.push(72, 100);\n for (const handle of a.frozenLayerHandles) dx.push(331, handle);\n dx.push(90, a.locked ? VIEWPORT_LOCKED_FLAG : 0);\n dx.push(281, 0);\n dx.push(71, 1);\n dx.push(74, 0);\n }\n}\n\ninterface LayoutObjectArgs {\n name: string;\n /** 0 = Model tab; paper layouts count from 1, in tab order. */\n tabOrder: number;\n /** Sheet size in mm (PlotSettings always stores mm). */\n paperWidth: number;\n paperHeight: number;\n /** BLOCK_RECORD handle of the space this layout owns. */\n blockRecordHandle: string;\n}\n\n/**\n * LAYOUT object (AcDbPlotSettings + AcDbLayout) for the OBJECTS section.\n * The writer only provides generic dictionaries, so the body is emitted by\n * hand; margins and plot flags use plain defaults.\n */\nexport class LayoutObject extends DxfObject {\n private readonly args: LayoutObjectArgs;\n\n constructor(args: LayoutObjectArgs) {\n super(\"LAYOUT\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"LAYOUT\");\n dx.push(5, this.handle);\n dx.push(330, this.ownerObjecthandle);\n dx.push(100, \"AcDbPlotSettings\");\n dx.push(1, \"\");\n dx.push(2, \"none_device\");\n dx.push(4, \"\");\n dx.push(6, \"\");\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(42, 0);\n dx.push(43, 0);\n dx.push(44, a.paperWidth);\n dx.push(45, a.paperHeight);\n dx.push(46, 0);\n dx.push(47, 0);\n dx.push(48, 0);\n dx.push(49, 0);\n dx.push(140, 0);\n dx.push(141, 0);\n dx.push(142, 1);\n dx.push(143, 1);\n dx.push(70, 688);\n dx.push(72, 1); // plot paper units: millimeters\n dx.push(73, 0);\n dx.push(74, 5);\n dx.push(7, \"\");\n dx.push(75, 16);\n dx.push(147, 1);\n dx.push(148, 0);\n dx.push(149, 0);\n dx.push(100, \"AcDbLayout\");\n dx.push(1, a.name);\n dx.push(70, 1);\n dx.push(71, a.tabOrder);\n dx.push(10, 0);\n dx.push(20, 0);\n dx.push(11, a.paperWidth);\n dx.push(21, a.paperHeight);\n dx.push(12, 0);\n dx.push(22, 0);\n dx.push(32, 0);\n dx.push(14, 0);\n dx.push(24, 0);\n dx.push(34, 0);\n dx.push(15, a.paperWidth);\n dx.push(25, a.paperHeight);\n dx.push(35, 0);\n dx.push(146, 0);\n dx.push(13, 0);\n dx.push(23, 0);\n dx.push(33, 0);\n dx.push(16, 1);\n dx.push(26, 0);\n dx.push(36, 0);\n dx.push(17, 0);\n dx.push(27, 1);\n dx.push(37, 0);\n dx.push(76, 0);\n dx.push(330, a.blockRecordHandle);\n }\n}\n\ninterface MultiLeaderArgs {\n /**\n * Leader lines in local order (primary first). Vertices run arrow tip →\n * junction; the shared junction itself is NOT included (it's the LEADER\n * node's \"last point\").\n */\n lines: { x: number; y: number }[][];\n /** Common junction where all lines meet (primary line's last point). */\n junction: { x: number; y: number };\n /** Dogleg from the junction toward the text (unit direction + length). */\n doglegDirection: { x: number; y: number };\n doglegLength: number;\n /** MTEXT-escaped note content. */\n content: string;\n /**\n * Base sizes BEFORE scale. The writer multiplies them by overallScale for\n * the stored tags — CONTEXT_DATA and entity-level override sizes hold\n * FINAL values in DXF; group 40/45 record the factor for later edits.\n */\n textHeight: number;\n arrowSize: number;\n overallScale: number;\n /** Text insertion point (past the dogleg). */\n textLocation: { x: number; y: number };\n /** Handles resolved by the exporter. */\n styleHandle: string;\n textStyleHandle: string;\n lineTypeHandle: string;\n}\n\n/**\n * MULTILEADER entity (mtext content + N leader lines). Tag order mirrors\n * ezdxf's writer output; the entity-level property-override mask is all-ones\n * so the values here win over the referenced MLEADERSTYLE.\n */\nexport class MultiLeaderEntity extends Point {\n private readonly args: MultiLeaderArgs;\n\n constructor(args: MultiLeaderArgs) {\n super(args.junction.x, args.junction.y, 0);\n this.args = args;\n this.type = \"MULTILEADER\";\n this.subclassMarker = \"AcDbMLeader\";\n }\n\n override dxfyChild(dx: Dxfier): void {\n const a = this.args;\n dx.push(270, 2); // version\n dx.push(300, \"CONTEXT_DATA{\");\n dx.push(40, a.overallScale); // overall scale (multiplies all sizes)\n // Content base point = end of the dogleg.\n dx.push(10, a.junction.x + a.doglegDirection.x * a.doglegLength);\n dx.push(20, a.junction.y + a.doglegDirection.y * a.doglegLength);\n dx.push(30, 0);\n dx.push(41, a.textHeight * a.overallScale);\n dx.push(140, a.arrowSize * a.overallScale);\n dx.push(145, 2 * a.overallScale); // landing gap\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(177, 0);\n dx.push(290, 1); // has mtext content\n dx.push(304, a.content);\n dx.push(11, 0);\n dx.push(21, 0);\n dx.push(31, 1); // text normal\n dx.push(340, a.textStyleHandle);\n dx.push(12, a.textLocation.x);\n dx.push(22, a.textLocation.y);\n dx.push(32, 0);\n dx.push(13, 1);\n dx.push(23, 0);\n dx.push(33, 0); // text direction\n dx.push(42, 0); // rotation\n dx.push(43, 0); // width\n dx.push(44, 0);\n dx.push(45, 1);\n dx.push(170, 1);\n dx.push(90, RAW_COLOR_BY_BLOCK); // text color\n dx.push(171, 1); // attachment\n dx.push(172, 1); // flow direction\n dx.push(91, RAW_COLOR_NONE); // background fill color\n dx.push(141, 1.5);\n dx.push(92, 0);\n dx.push(291, 0);\n dx.push(292, 0);\n dx.push(173, 0);\n dx.push(293, 0);\n dx.push(142, 0);\n dx.push(143, 0);\n dx.push(294, 0);\n dx.push(295, 1);\n dx.push(296, 0);\n dx.push(110, 0);\n dx.push(120, 0);\n dx.push(130, 0); // plane origin\n dx.push(111, 1);\n dx.push(121, 0);\n dx.push(131, 0); // plane x axis\n dx.push(112, 0);\n dx.push(122, 1);\n dx.push(132, 0); // plane y axis\n dx.push(297, 0);\n dx.push(302, \"LEADER{\");\n dx.push(290, 1); // has last leader point\n dx.push(291, 1); // has dogleg\n dx.push(10, a.junction.x);\n dx.push(20, a.junction.y);\n dx.push(30, 0);\n dx.push(11, a.doglegDirection.x);\n dx.push(21, a.doglegDirection.y);\n dx.push(31, 0);\n dx.push(90, 0); // branch index\n dx.push(40, a.doglegLength);\n a.lines.forEach((line, i) => {\n dx.push(304, \"LEADER_LINE{\");\n for (const p of line) {\n dx.push(10, p.x);\n dx.push(20, p.y);\n dx.push(30, 0);\n }\n dx.push(91, i); // line index\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(305, \"}\");\n });\n dx.push(303, \"}\");\n dx.push(301, \"}\");\n dx.push(340, a.styleHandle);\n dx.push(90, 2147483647); // property override flags: entity values win\n dx.push(170, 1); // straight leader lines\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(341, a.lineTypeHandle);\n dx.push(171, -2); // lineweight ByBlock\n dx.push(290, 1); // landing enabled\n dx.push(291, 1); // dogleg enabled\n dx.push(41, a.doglegLength);\n dx.push(42, a.arrowSize * a.overallScale);\n dx.push(172, 2); // content type: mtext\n dx.push(343, a.textStyleHandle);\n dx.push(173, 1);\n dx.push(95, 1);\n dx.push(174, 1);\n dx.push(175, 0);\n dx.push(92, RAW_COLOR_BY_BLOCK);\n dx.push(292, 0);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(10, 1);\n dx.push(20, 1);\n dx.push(30, 1); // block content scale\n dx.push(43, 0);\n dx.push(176, 0);\n dx.push(293, 0);\n dx.push(294, 0);\n dx.push(178, 0);\n dx.push(179, 1);\n dx.push(45, a.overallScale); // entity scale, consistent with context 40\n }\n}\n\ninterface MLeaderStyleArgs {\n name: string;\n textStyleHandle: string;\n arrowSize: number;\n textHeight: number;\n /** ACAD_MLEADERSTYLE dictionary handle (owner + reactor). */\n dictionaryHandle: string;\n}\n\n/**\n * Minimal MLEADERSTYLE (mirrors ezdxf's \"Standard\"). Entities override every\n * property anyway (mask above), so the style mostly satisfies referential\n * integrity.\n */\nexport class MLeaderStyleObject extends DxfObject {\n private readonly args: MLeaderStyleArgs;\n\n constructor(args: MLeaderStyleArgs) {\n super(\"MLEADERSTYLE\");\n this.args = args;\n }\n\n override dxfy(dx: Dxfier): void {\n const a = this.args;\n dx.push(0, \"MLEADERSTYLE\");\n dx.push(5, this.handle);\n dx.push(102, \"{ACAD_REACTORS\");\n dx.push(330, a.dictionaryHandle);\n dx.push(102, \"}\");\n dx.push(330, a.dictionaryHandle);\n dx.push(100, \"AcDbMLeaderStyle\");\n dx.push(179, 2);\n dx.push(170, 2);\n dx.push(171, 1);\n dx.push(172, 0);\n dx.push(90, 2);\n dx.push(40, 0);\n dx.push(41, 0);\n dx.push(173, 1);\n dx.push(91, RAW_COLOR_BY_BLOCK);\n dx.push(92, -2);\n dx.push(290, 1);\n dx.push(42, 2); // landing gap\n dx.push(291, 1);\n dx.push(43, 8); // dogleg length\n dx.push(3, a.name);\n dx.push(44, a.arrowSize);\n dx.push(300, \"\");\n dx.push(342, a.textStyleHandle);\n dx.push(174, 1);\n dx.push(175, 1);\n dx.push(176, 0);\n dx.push(178, 1);\n dx.push(93, RAW_COLOR_BY_BLOCK);\n dx.push(45, a.textHeight);\n dx.push(292, 0);\n dx.push(297, 0);\n dx.push(46, a.textHeight);\n dx.push(94, RAW_COLOR_BY_BLOCK);\n dx.push(47, 1);\n dx.push(49, 1);\n dx.push(140, 1);\n dx.push(294, 1);\n dx.push(141, 0);\n dx.push(177, 0);\n dx.push(142, 1);\n dx.push(295, 0);\n dx.push(296, 0);\n dx.push(143, 3.75);\n dx.push(271, 0);\n dx.push(272, 9);\n dx.push(273, 9);\n }\n}\n","// Shared by DXF export and import (kept dependency-free so the lazy import\n// chunk doesn't pull in the writer library).\n\n/**\n * ANSI31 base: parallel lines at 45° spaced 3.175 mm at scale 1. Line-fill\n * hatches export as ANSI31 with angle = fill.angle − 45° and scale =\n * spacing / 3.175, which is exactly how AutoCAD renders them; the importer\n * inverts the same formula for any ANSI31 hatch.\n */\nexport const ANSI31_BASE_SPACING = 3.175;\nexport const ANSI31_BASE_ANGLE_DEG = 45;\n"],"mappings":"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CL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAK;AAAA,MACL,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,QAAG;AAAA,MACH,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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","names":["z","z","z","pattern","pattern","angle","angle","z","z","a","z","textHeight","rest","rot","scale","z","add","dist","dot","len","norm","scale","sub","angle","spec","z","z","z","w","inner","RAD2DEG","textStyleFor","dimStyleFor","scale"]}
|