schematex 0.3.2 → 0.3.4
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 +20 -1
- package/dist/ai/ai-sdk.cjs +25 -25
- package/dist/ai/ai-sdk.d.cts +1 -1
- package/dist/ai/ai-sdk.d.ts +1 -1
- package/dist/ai/ai-sdk.js +20 -20
- package/dist/ai/index.cjs +28 -28
- package/dist/ai/index.d.cts +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.js +20 -20
- package/dist/browser.cjs +22 -22
- package/dist/browser.js +20 -20
- package/dist/{chunk-UK7JF5QB.cjs → chunk-3MJKJX27.cjs} +37 -38
- package/dist/chunk-3MJKJX27.cjs.map +1 -0
- package/dist/{chunk-HIQPEAL7.js → chunk-3RAVPXLN.js} +4 -4
- package/dist/{chunk-HIQPEAL7.js.map → chunk-3RAVPXLN.js.map} +1 -1
- package/dist/{chunk-LFZZ4NCP.cjs → chunk-3WNW5Y7P.cjs} +48 -8
- package/dist/chunk-3WNW5Y7P.cjs.map +1 -0
- package/dist/{chunk-XUEROLSB.cjs → chunk-4THC4VUA.cjs} +17 -17
- package/dist/chunk-4THC4VUA.cjs.map +1 -0
- package/dist/{chunk-K5QG53GT.cjs → chunk-5COUZTVA.cjs} +27 -27
- package/dist/{chunk-K5QG53GT.cjs.map → chunk-5COUZTVA.cjs.map} +1 -1
- package/dist/{chunk-F6OROIHS.js → chunk-5CTERELC.js} +4 -4
- package/dist/{chunk-F6OROIHS.js.map → chunk-5CTERELC.js.map} +1 -1
- package/dist/{chunk-ZNLEUL7T.js → chunk-5SKT7RYR.js} +5 -5
- package/dist/chunk-5SKT7RYR.js.map +1 -0
- package/dist/{chunk-75BMFCP5.cjs → chunk-5UCXMYE7.cjs} +44 -44
- package/dist/{chunk-75BMFCP5.cjs.map → chunk-5UCXMYE7.cjs.map} +1 -1
- package/dist/{chunk-GYTWJ6VB.cjs → chunk-6ULC3UHJ.cjs} +68 -49
- package/dist/chunk-6ULC3UHJ.cjs.map +1 -0
- package/dist/{chunk-3YXXZ4LT.cjs → chunk-6WORZSL3.cjs} +34 -34
- package/dist/{chunk-3YXXZ4LT.cjs.map → chunk-6WORZSL3.cjs.map} +1 -1
- package/dist/{chunk-6BKUD5EJ.js → chunk-6XGSEG3K.js} +4 -5
- package/dist/chunk-6XGSEG3K.js.map +1 -0
- package/dist/{chunk-OK5RYX55.cjs → chunk-CQP5YHVK.cjs} +26 -27
- package/dist/chunk-CQP5YHVK.cjs.map +1 -0
- package/dist/{chunk-2UJAVPA4.cjs → chunk-CS67UBP3.cjs} +27 -27
- package/dist/{chunk-2UJAVPA4.cjs.map → chunk-CS67UBP3.cjs.map} +1 -1
- package/dist/{chunk-YTEEZV6J.cjs → chunk-DBMZEZLF.cjs} +425 -425
- package/dist/chunk-DBMZEZLF.cjs.map +1 -0
- package/dist/{chunk-NFT6VW73.js → chunk-DHKKDIVT.js} +4 -4
- package/dist/chunk-DHKKDIVT.js.map +1 -0
- package/dist/{chunk-H4CJTKEH.js → chunk-DNZV4V4R.js} +5 -5
- package/dist/{chunk-H4CJTKEH.js.map → chunk-DNZV4V4R.js.map} +1 -1
- package/dist/{chunk-ZTSO3S4P.js → chunk-FO7BLCEW.js} +3 -3
- package/dist/{chunk-ZTSO3S4P.js.map → chunk-FO7BLCEW.js.map} +1 -1
- package/dist/{chunk-EYHD7LV3.cjs → chunk-H5JYZ5YS.cjs} +130 -130
- package/dist/chunk-H5JYZ5YS.cjs.map +1 -0
- package/dist/{chunk-RNGYXGHS.js → chunk-HKJRHXGZ.js} +22 -22
- package/dist/chunk-HKJRHXGZ.js.map +1 -0
- package/dist/{chunk-X4F6VVEJ.js → chunk-I6VEXSUK.js} +3 -4
- package/dist/chunk-I6VEXSUK.js.map +1 -0
- package/dist/{chunk-MKKFIPKU.cjs → chunk-IFR34VTL.cjs} +47 -47
- package/dist/chunk-IFR34VTL.cjs.map +1 -0
- package/dist/{chunk-BJ65PKDU.js → chunk-IURM4ZWE.js} +4 -4
- package/dist/chunk-IURM4ZWE.js.map +1 -0
- package/dist/{chunk-M5ZC3LFJ.js → chunk-IZMAZOQI.js} +4 -4
- package/dist/chunk-IZMAZOQI.js.map +1 -0
- package/dist/{chunk-RODV6PC4.cjs → chunk-J3Y2QDJR.cjs} +7 -7
- package/dist/{chunk-RODV6PC4.cjs.map → chunk-J3Y2QDJR.cjs.map} +1 -1
- package/dist/{chunk-BUN3CRMP.cjs → chunk-K6RAUXRQ.cjs} +65 -66
- package/dist/chunk-K6RAUXRQ.cjs.map +1 -0
- package/dist/{chunk-IT2TVXC7.js → chunk-LPKVIRYT.js} +4 -5
- package/dist/chunk-LPKVIRYT.js.map +1 -0
- package/dist/{chunk-W7GIQTJV.cjs → chunk-MIKCKV27.cjs} +22 -22
- package/dist/chunk-MIKCKV27.cjs.map +1 -0
- package/dist/{chunk-KUXOHLGC.cjs → chunk-O5POCPXZ.cjs} +52 -53
- package/dist/chunk-O5POCPXZ.cjs.map +1 -0
- package/dist/{chunk-BJWMPPEA.js → chunk-PWI4NFYR.js} +4 -4
- package/dist/chunk-PWI4NFYR.js.map +1 -0
- package/dist/{chunk-WHJXRLFD.js → chunk-SYYBKDL7.js} +48 -8
- package/dist/chunk-SYYBKDL7.js.map +1 -0
- package/dist/{chunk-L2KUGWFR.cjs → chunk-T47A6XUK.cjs} +47 -47
- package/dist/chunk-T47A6XUK.cjs.map +1 -0
- package/dist/{chunk-SFSZUOFT.js → chunk-TWAC2IIS.js} +4 -4
- package/dist/chunk-TWAC2IIS.js.map +1 -0
- package/dist/{chunk-XI6JOG76.cjs → chunk-V4OVUBLA.cjs} +46 -46
- package/dist/chunk-V4OVUBLA.cjs.map +1 -0
- package/dist/{chunk-2J2QWNGI.js → chunk-VRE5VWDQ.js} +27 -8
- package/dist/chunk-VRE5VWDQ.js.map +1 -0
- package/dist/{chunk-SE23X5OE.js → chunk-WHNIK4LK.js} +4 -5
- package/dist/chunk-WHNIK4LK.js.map +1 -0
- package/dist/{chunk-C3IVD7DI.cjs → chunk-WIFGBWET.cjs} +25 -26
- package/dist/chunk-WIFGBWET.cjs.map +1 -0
- package/dist/{chunk-7MVDN5UC.cjs → chunk-XSNNGYXZ.cjs} +36 -36
- package/dist/chunk-XSNNGYXZ.cjs.map +1 -0
- package/dist/{chunk-7BEJHG43.js → chunk-YWDODCW2.js} +4 -4
- package/dist/{chunk-7BEJHG43.js.map → chunk-YWDODCW2.js.map} +1 -1
- package/dist/{chunk-M3R6RCXY.js → chunk-ZKDL6Y3O.js} +4 -4
- package/dist/chunk-ZKDL6Y3O.js.map +1 -0
- package/dist/{chunk-56LXBM45.js → chunk-ZQZNWAHH.js} +4 -5
- package/dist/chunk-ZQZNWAHH.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +6 -6
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +2 -2
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +8 -8
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +3 -3
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +10 -10
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +3 -3
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +8 -8
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +3 -3
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +7 -7
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +3 -3
- package/dist/diagrams/timing/index.cjs +5 -5
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +2 -2
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/export.cjs +1 -1
- package/dist/export.cjs.map +1 -1
- package/dist/export.d.cts +1 -1
- package/dist/export.d.ts +1 -1
- package/dist/export.js +1 -1
- package/dist/export.js.map +1 -1
- package/dist/{index-dWDwG6BW.d.ts → index-D3u6vcA4.d.ts} +1 -1
- package/dist/{index-BrLxEzSQ.d.cts → index-bdfj6FpQ.d.cts} +1 -1
- package/dist/index.cjs +41 -41
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +19 -19
- package/dist/react.cjs +20 -20
- package/dist/react.js +19 -19
- package/dist/{types-BtiUg7Gx.d.cts → types-DnU2UlWz.d.cts} +2 -0
- package/dist/{types-BtiUg7Gx.d.ts → types-DnU2UlWz.d.ts} +2 -0
- package/package.json +1 -1
- package/dist/chunk-2J2QWNGI.js.map +0 -1
- package/dist/chunk-56LXBM45.js.map +0 -1
- package/dist/chunk-6BKUD5EJ.js.map +0 -1
- package/dist/chunk-7MVDN5UC.cjs.map +0 -1
- package/dist/chunk-BJ65PKDU.js.map +0 -1
- package/dist/chunk-BJWMPPEA.js.map +0 -1
- package/dist/chunk-BUN3CRMP.cjs.map +0 -1
- package/dist/chunk-C3IVD7DI.cjs.map +0 -1
- package/dist/chunk-EYHD7LV3.cjs.map +0 -1
- package/dist/chunk-GYTWJ6VB.cjs.map +0 -1
- package/dist/chunk-IT2TVXC7.js.map +0 -1
- package/dist/chunk-KUXOHLGC.cjs.map +0 -1
- package/dist/chunk-L2KUGWFR.cjs.map +0 -1
- package/dist/chunk-LFZZ4NCP.cjs.map +0 -1
- package/dist/chunk-M3R6RCXY.js.map +0 -1
- package/dist/chunk-M5ZC3LFJ.js.map +0 -1
- package/dist/chunk-MKKFIPKU.cjs.map +0 -1
- package/dist/chunk-NFT6VW73.js.map +0 -1
- package/dist/chunk-OK5RYX55.cjs.map +0 -1
- package/dist/chunk-RNGYXGHS.js.map +0 -1
- package/dist/chunk-SE23X5OE.js.map +0 -1
- package/dist/chunk-SFSZUOFT.js.map +0 -1
- package/dist/chunk-UK7JF5QB.cjs.map +0 -1
- package/dist/chunk-W7GIQTJV.cjs.map +0 -1
- package/dist/chunk-WHJXRLFD.js.map +0 -1
- package/dist/chunk-X4F6VVEJ.js.map +0 -1
- package/dist/chunk-XI6JOG76.cjs.map +0 -1
- package/dist/chunk-XUEROLSB.cjs.map +0 -1
- package/dist/chunk-YTEEZV6J.cjs.map +0 -1
- package/dist/chunk-ZNLEUL7T.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk5UCXMYE7_cjs = require('./chunk-5UCXMYE7.cjs');
|
|
4
4
|
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
|
|
6
6
|
|
|
7
7
|
// src/diagrams/pedigree/parser.ts
|
|
8
8
|
var PedigreeParseError = class extends Error {
|
|
@@ -53,7 +53,7 @@ function parsePedigree(text2) {
|
|
|
53
53
|
i++;
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
56
|
+
if (chunk5UCXMYE7_cjs.parseLegendDirective(trimmed, legendOverrides)) {
|
|
57
57
|
hasLegendOverrides = true;
|
|
58
58
|
i++;
|
|
59
59
|
continue;
|
|
@@ -829,8 +829,8 @@ function renderPedigree(layout, config, ast) {
|
|
|
829
829
|
const genCount = genGroups.size;
|
|
830
830
|
const diagramTitle = ast?.metadata?.title ?? "Pedigree";
|
|
831
831
|
const layers = [
|
|
832
|
-
|
|
833
|
-
|
|
832
|
+
chunk3WNW5Y7P_cjs.title(diagramTitle),
|
|
833
|
+
chunk3WNW5Y7P_cjs.desc(`Pedigree chart with ${nodeCount} individuals across ${genCount} generations`),
|
|
834
834
|
defsStr,
|
|
835
835
|
styleStr
|
|
836
836
|
];
|
|
@@ -840,9 +840,9 @@ function renderPedigree(layout, config, ast) {
|
|
|
840
840
|
let legendSvg = "";
|
|
841
841
|
if (ast) {
|
|
842
842
|
const autoSpec = buildPedigreeLegend(ast, t);
|
|
843
|
-
const finalSpec =
|
|
843
|
+
const finalSpec = chunk5UCXMYE7_cjs.applyLegendOverrides(autoSpec, ast.legendOverrides);
|
|
844
844
|
if (finalSpec.mode === "on" && finalSpec.items.length > 0) {
|
|
845
|
-
const { svg, bbox: lb } =
|
|
845
|
+
const { svg, bbox: lb } = chunk5UCXMYE7_cjs.renderLegend(
|
|
846
846
|
finalSpec,
|
|
847
847
|
{
|
|
848
848
|
canvasWidth: layout.width,
|
|
@@ -863,13 +863,13 @@ function renderPedigree(layout, config, ast) {
|
|
|
863
863
|
}
|
|
864
864
|
const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);
|
|
865
865
|
layers.push(
|
|
866
|
-
|
|
866
|
+
chunk3WNW5Y7P_cjs.group(
|
|
867
867
|
{ transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : void 0 },
|
|
868
868
|
chartContent
|
|
869
869
|
)
|
|
870
870
|
);
|
|
871
871
|
if (legendSvg) layers.push(legendSvg);
|
|
872
|
-
return
|
|
872
|
+
return chunk3WNW5Y7P_cjs.svgRoot(
|
|
873
873
|
{
|
|
874
874
|
viewBox: `0 0 ${finalWidth} ${finalHeight}`,
|
|
875
875
|
class: "schematex-diagram schematex-pedigree",
|
|
@@ -888,16 +888,16 @@ function buildDefs(nodes, t) {
|
|
|
888
888
|
}
|
|
889
889
|
if (needs.has("carrier")) {
|
|
890
890
|
children.push(
|
|
891
|
-
|
|
892
|
-
|
|
891
|
+
chunk3WNW5Y7P_cjs.el("clipPath", { id: "schematex-pedigree-clip-carrier-rect" }, [
|
|
892
|
+
chunk3WNW5Y7P_cjs.rect({ x: "0", y: "0", width: "50%", height: "100%" })
|
|
893
893
|
]),
|
|
894
|
-
|
|
895
|
-
|
|
894
|
+
chunk3WNW5Y7P_cjs.el("clipPath", { id: "schematex-pedigree-clip-carrier-circle" }, [
|
|
895
|
+
chunk3WNW5Y7P_cjs.rect({ x: "-50", y: "-50", width: "50", height: "100" })
|
|
896
896
|
])
|
|
897
897
|
);
|
|
898
898
|
}
|
|
899
899
|
children.push(
|
|
900
|
-
|
|
900
|
+
chunk3WNW5Y7P_cjs.el("marker", {
|
|
901
901
|
id: "schematex-pedigree-proband-arrow",
|
|
902
902
|
viewBox: "0 0 10 10",
|
|
903
903
|
refX: "0",
|
|
@@ -906,15 +906,14 @@ function buildDefs(nodes, t) {
|
|
|
906
906
|
markerHeight: "8",
|
|
907
907
|
orient: "auto-start-reverse"
|
|
908
908
|
}, [
|
|
909
|
-
|
|
909
|
+
chunk3WNW5Y7P_cjs.path({ d: "M 0 0 L 10 5 L 0 10 z", fill: t.stroke })
|
|
910
910
|
])
|
|
911
911
|
);
|
|
912
|
-
return
|
|
912
|
+
return chunk3WNW5Y7P_cjs.defs(children);
|
|
913
913
|
}
|
|
914
914
|
function buildStyles(config, t) {
|
|
915
915
|
const css = `
|
|
916
916
|
.schematex-pedigree {${chunkD7EHZFK4_cjs.cssCustomProperties(t)}
|
|
917
|
-
background: ${t.bg};
|
|
918
917
|
}
|
|
919
918
|
.schematex-pedigree-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; stroke-linejoin: round; }
|
|
920
919
|
.schematex-pedigree-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }
|
|
@@ -933,7 +932,7 @@ function buildStyles(config, t) {
|
|
|
933
932
|
.schematex-pedigree-legend { font-family: ${config.fontFamily}; font-size: 11px; fill: ${t.text}; }
|
|
934
933
|
.schematex-pedigree-legend-box { fill: ${t.fill}; stroke: ${t.neutral}; stroke-width: 1; }
|
|
935
934
|
`;
|
|
936
|
-
return
|
|
935
|
+
return chunk3WNW5Y7P_cjs.el("style", {}, css);
|
|
937
936
|
}
|
|
938
937
|
function renderEdges(edges) {
|
|
939
938
|
const children = [];
|
|
@@ -941,13 +940,13 @@ function renderEdges(edges) {
|
|
|
941
940
|
const relType = edge.relationship.type;
|
|
942
941
|
const cssClass = `schematex-pedigree-edge schematex-pedigree-edge-${relType}`;
|
|
943
942
|
const elements = [
|
|
944
|
-
|
|
943
|
+
chunk3WNW5Y7P_cjs.el("path", { d: edge.path, class: "schematex-pedigree-edge-path" })
|
|
945
944
|
];
|
|
946
945
|
if (relType === "separated") {
|
|
947
946
|
const mid = pathMidpoint(edge.path);
|
|
948
947
|
if (mid) {
|
|
949
948
|
elements.push(
|
|
950
|
-
|
|
949
|
+
chunk3WNW5Y7P_cjs.line({
|
|
951
950
|
x1: mid.x - 4,
|
|
952
951
|
y1: mid.y - 6,
|
|
953
952
|
x2: mid.x + 4,
|
|
@@ -958,10 +957,10 @@ function renderEdges(edges) {
|
|
|
958
957
|
}
|
|
959
958
|
}
|
|
960
959
|
children.push(
|
|
961
|
-
|
|
960
|
+
chunk3WNW5Y7P_cjs.group({ class: cssClass, "data-from": edge.from, "data-to": edge.to }, elements)
|
|
962
961
|
);
|
|
963
962
|
}
|
|
964
|
-
return
|
|
963
|
+
return chunk3WNW5Y7P_cjs.group({ class: "schematex-pedigree-edges" }, children);
|
|
965
964
|
}
|
|
966
965
|
function pathMidpoint(pathData) {
|
|
967
966
|
const coords = pathData.match(/[\d.-]+/g);
|
|
@@ -992,7 +991,7 @@ function renderNodes(genGroups) {
|
|
|
992
991
|
nodeElements.push(renderPedigreeSymbol(node.individual, cx, cy, node.width));
|
|
993
992
|
}
|
|
994
993
|
layers.push(
|
|
995
|
-
|
|
994
|
+
chunk3WNW5Y7P_cjs.group(
|
|
996
995
|
{ class: `schematex-pedigree-generation schematex-pedigree-generation-${genIdx}`, "data-generation": genIdx },
|
|
997
996
|
nodeElements
|
|
998
997
|
)
|
|
@@ -1006,20 +1005,20 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1006
1005
|
if (ind.status === "deceased") classes.push("schematex-pedigree-deceased");
|
|
1007
1006
|
if (ind.geneticStatus) classes.push(`schematex-pedigree-${ind.geneticStatus}`);
|
|
1008
1007
|
const titleText = formatTitle(ind);
|
|
1009
|
-
const children = [
|
|
1008
|
+
const children = [chunk3WNW5Y7P_cjs.title(titleText)];
|
|
1010
1009
|
const pregLoss = ind.status === "sab" || ind.status === "tab" || ind.status === "ectopic";
|
|
1011
1010
|
if (pregLoss) {
|
|
1012
1011
|
classes.push(`schematex-pedigree-${ind.status}`);
|
|
1013
1012
|
const t = half * 0.6;
|
|
1014
1013
|
children.push(
|
|
1015
|
-
|
|
1014
|
+
chunk3WNW5Y7P_cjs.polygon({
|
|
1016
1015
|
points: `${-t},${-t} ${t},${-t} 0,${t}`,
|
|
1017
1016
|
class: `schematex-pedigree-loss-shape schematex-pedigree-${ind.status}-shape`
|
|
1018
1017
|
})
|
|
1019
1018
|
);
|
|
1020
1019
|
if (ind.status === "tab") {
|
|
1021
1020
|
children.push(
|
|
1022
|
-
|
|
1021
|
+
chunk3WNW5Y7P_cjs.line({
|
|
1023
1022
|
x1: -t * 1.1,
|
|
1024
1023
|
y1: t * 1.1,
|
|
1025
1024
|
x2: t * 1.1,
|
|
@@ -1030,13 +1029,13 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1030
1029
|
}
|
|
1031
1030
|
if (ind.status === "ectopic") {
|
|
1032
1031
|
children.push(
|
|
1033
|
-
|
|
1032
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1034
1033
|
{ x: 0, y: t + 14, class: "schematex-pedigree-status-label", "text-anchor": "middle" },
|
|
1035
1034
|
"ECT"
|
|
1036
1035
|
)
|
|
1037
1036
|
);
|
|
1038
1037
|
}
|
|
1039
|
-
return
|
|
1038
|
+
return chunk3WNW5Y7P_cjs.group(
|
|
1040
1039
|
{
|
|
1041
1040
|
class: classes.join(" "),
|
|
1042
1041
|
"data-individual-id": ind.id,
|
|
@@ -1049,7 +1048,7 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1049
1048
|
if (ind.status === "stillborn") {
|
|
1050
1049
|
classes.push("schematex-pedigree-stillborn");
|
|
1051
1050
|
children.push(
|
|
1052
|
-
|
|
1051
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1053
1052
|
{ x: 0, y: half + 14, class: "schematex-pedigree-status-label", "text-anchor": "middle" },
|
|
1054
1053
|
"SB"
|
|
1055
1054
|
)
|
|
@@ -1065,26 +1064,26 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1065
1064
|
}
|
|
1066
1065
|
if (gs === "presymptomatic") {
|
|
1067
1066
|
children.push(
|
|
1068
|
-
|
|
1067
|
+
chunk3WNW5Y7P_cjs.line({ x1: 0, y1: -half, x2: 0, y2: half, class: "schematex-pedigree-presymptomatic-mark" })
|
|
1069
1068
|
);
|
|
1070
1069
|
}
|
|
1071
1070
|
if (ind.status === "deceased") {
|
|
1072
1071
|
const ext = ind.sex === "female" ? half * 0.707 : half;
|
|
1073
1072
|
children.push(
|
|
1074
|
-
|
|
1073
|
+
chunk3WNW5Y7P_cjs.line({ x1: ext, y1: -ext, x2: -ext, y2: ext, class: "schematex-pedigree-deceased-mark" })
|
|
1075
1074
|
);
|
|
1076
1075
|
}
|
|
1077
1076
|
if (ind.markers?.includes("proband")) {
|
|
1078
1077
|
const arrowLen = 20;
|
|
1079
1078
|
children.push(
|
|
1080
|
-
|
|
1079
|
+
chunk3WNW5Y7P_cjs.line({
|
|
1081
1080
|
x1: -half - arrowLen,
|
|
1082
1081
|
y1: half + arrowLen,
|
|
1083
1082
|
x2: -half - 2,
|
|
1084
1083
|
y2: half + 2,
|
|
1085
1084
|
class: "schematex-pedigree-proband-arrow-line"
|
|
1086
1085
|
}),
|
|
1087
|
-
|
|
1086
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1088
1087
|
{ x: -half - arrowLen - 4, y: half + arrowLen + 4, class: "schematex-pedigree-proband-label", "text-anchor": "end" },
|
|
1089
1088
|
"P"
|
|
1090
1089
|
)
|
|
@@ -1093,14 +1092,14 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1093
1092
|
if (ind.markers?.includes("consultand")) {
|
|
1094
1093
|
const arrowLen = 20;
|
|
1095
1094
|
children.push(
|
|
1096
|
-
|
|
1095
|
+
chunk3WNW5Y7P_cjs.line({
|
|
1097
1096
|
x1: -half - arrowLen,
|
|
1098
1097
|
y1: half + arrowLen,
|
|
1099
1098
|
x2: -half - 2,
|
|
1100
1099
|
y2: half + 2,
|
|
1101
1100
|
class: "schematex-pedigree-proband-arrow-line"
|
|
1102
1101
|
}),
|
|
1103
|
-
|
|
1102
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1104
1103
|
{ x: -half - arrowLen - 4, y: half + arrowLen + 4, class: "schematex-pedigree-proband-label", "text-anchor": "end" },
|
|
1105
1104
|
"C"
|
|
1106
1105
|
)
|
|
@@ -1108,13 +1107,13 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1108
1107
|
}
|
|
1109
1108
|
if (ind.markers?.includes("evaluated")) {
|
|
1110
1109
|
children.push(
|
|
1111
|
-
|
|
1110
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1112
1111
|
{ x: 0, y: -half - 4, class: "schematex-pedigree-proband-label", "text-anchor": "middle" },
|
|
1113
1112
|
"E"
|
|
1114
1113
|
)
|
|
1115
1114
|
);
|
|
1116
1115
|
}
|
|
1117
|
-
return
|
|
1116
|
+
return chunk3WNW5Y7P_cjs.group(
|
|
1118
1117
|
{
|
|
1119
1118
|
class: classes.join(" "),
|
|
1120
1119
|
"data-individual-id": ind.id,
|
|
@@ -1126,22 +1125,22 @@ function renderPedigreeSymbol(ind, x, y, size) {
|
|
|
1126
1125
|
function baseShape(sex, half) {
|
|
1127
1126
|
switch (sex) {
|
|
1128
1127
|
case "male":
|
|
1129
|
-
return
|
|
1128
|
+
return chunk3WNW5Y7P_cjs.rect({ x: -half, y: -half, width: half * 2, height: half * 2, class: "schematex-pedigree-shape" });
|
|
1130
1129
|
case "female":
|
|
1131
|
-
return
|
|
1130
|
+
return chunk3WNW5Y7P_cjs.circle({ cx: 0, cy: 0, r: half, class: "schematex-pedigree-shape" });
|
|
1132
1131
|
default:
|
|
1133
|
-
return
|
|
1132
|
+
return chunk3WNW5Y7P_cjs.polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, class: "schematex-pedigree-shape" });
|
|
1134
1133
|
}
|
|
1135
1134
|
}
|
|
1136
1135
|
function affectedFill(sex, half) {
|
|
1137
1136
|
const attrs = { class: "schematex-pedigree-affected-fill" };
|
|
1138
1137
|
switch (sex) {
|
|
1139
1138
|
case "male":
|
|
1140
|
-
return
|
|
1139
|
+
return chunk3WNW5Y7P_cjs.rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });
|
|
1141
1140
|
case "female":
|
|
1142
|
-
return
|
|
1141
|
+
return chunk3WNW5Y7P_cjs.circle({ cx: 0, cy: 0, r: half, ...attrs });
|
|
1143
1142
|
default:
|
|
1144
|
-
return
|
|
1143
|
+
return chunk3WNW5Y7P_cjs.polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });
|
|
1145
1144
|
}
|
|
1146
1145
|
}
|
|
1147
1146
|
function carrierFill(sex, half) {
|
|
@@ -1152,15 +1151,15 @@ function carrierFill(sex, half) {
|
|
|
1152
1151
|
};
|
|
1153
1152
|
switch (sex) {
|
|
1154
1153
|
case "male":
|
|
1155
|
-
return
|
|
1154
|
+
return chunk3WNW5Y7P_cjs.rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });
|
|
1156
1155
|
case "female":
|
|
1157
|
-
return
|
|
1156
|
+
return chunk3WNW5Y7P_cjs.circle({ cx: 0, cy: 0, r: half, ...attrs });
|
|
1158
1157
|
default:
|
|
1159
|
-
return
|
|
1158
|
+
return chunk3WNW5Y7P_cjs.polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });
|
|
1160
1159
|
}
|
|
1161
1160
|
}
|
|
1162
1161
|
function carrierDot(half) {
|
|
1163
|
-
return
|
|
1162
|
+
return chunk3WNW5Y7P_cjs.circle({ cx: 0, cy: 0, r: half * 0.15, class: "schematex-pedigree-carrier-x-dot" });
|
|
1164
1163
|
}
|
|
1165
1164
|
function formatTitle(ind) {
|
|
1166
1165
|
const name = ind.label.charAt(0).toUpperCase() + ind.label.slice(1);
|
|
@@ -1188,13 +1187,13 @@ function renderLabels(nodes, genGroups, config) {
|
|
|
1188
1187
|
const pedigreeId = genNumbering.get(ind.id) ?? ind.id;
|
|
1189
1188
|
const displayLabel = ind.label !== ind.id ? ind.label : pedigreeId;
|
|
1190
1189
|
labels.push(
|
|
1191
|
-
|
|
1190
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1192
1191
|
{ x: cx, y: labelY, class: "schematex-pedigree-label", "data-individual-id": ind.id },
|
|
1193
1192
|
displayLabel
|
|
1194
1193
|
)
|
|
1195
1194
|
);
|
|
1196
1195
|
}
|
|
1197
|
-
return
|
|
1196
|
+
return chunk3WNW5Y7P_cjs.group({ class: "schematex-pedigree-labels" }, labels);
|
|
1198
1197
|
}
|
|
1199
1198
|
function renderGenerationLabels(genGroups, _config) {
|
|
1200
1199
|
const labels = [];
|
|
@@ -1205,13 +1204,13 @@ function renderGenerationLabels(genGroups, _config) {
|
|
|
1205
1204
|
const midY = nodes[0].y + nodes[0].height / 2;
|
|
1206
1205
|
const roman = toRoman(genIdx + 1);
|
|
1207
1206
|
labels.push(
|
|
1208
|
-
|
|
1207
|
+
chunk3WNW5Y7P_cjs.text(
|
|
1209
1208
|
{ x: 25, y: midY + 5, class: "schematex-pedigree-gen-label" },
|
|
1210
1209
|
roman
|
|
1211
1210
|
)
|
|
1212
1211
|
);
|
|
1213
1212
|
}
|
|
1214
|
-
return
|
|
1213
|
+
return chunk3WNW5Y7P_cjs.group({ class: "schematex-pedigree-generation-labels" }, labels);
|
|
1215
1214
|
}
|
|
1216
1215
|
function toRoman(n) {
|
|
1217
1216
|
const vals = [1e3, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
|
|
@@ -1258,5 +1257,5 @@ exports.layoutPedigree = layoutPedigree;
|
|
|
1258
1257
|
exports.parsePedigree = parsePedigree;
|
|
1259
1258
|
exports.pedigree = pedigree;
|
|
1260
1259
|
exports.renderPedigree = renderPedigree;
|
|
1261
|
-
//# sourceMappingURL=chunk-
|
|
1262
|
-
//# sourceMappingURL=chunk-
|
|
1260
|
+
//# sourceMappingURL=chunk-O5POCPXZ.cjs.map
|
|
1261
|
+
//# sourceMappingURL=chunk-O5POCPXZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/pedigree/parser.ts","../src/diagrams/pedigree/layout.ts","../src/diagrams/pedigree/legend.ts","../src/diagrams/pedigree/renderer.ts","../src/diagrams/pedigree/index.ts"],"names":["line","text","parseLegendDirective","propsStr","resolvePersonTheme","title","desc","applyLegendOverrides","renderLegend","group","svgRoot","el","rect","path","defs","cssCustomProperties","STROKE_WIDTH","polygon","circle"],"mappings":";;;;;;;AAeO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CAAY,SAAwBA,KAAAA,EAAc;AAChD,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,KAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AADE,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AAAA,EAHoC,IAAA;AAItC;AAIA,IAAM,UAAA,GAA+D;AAAA,EACnE,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,WAAA,EAAY;AAAA,EAClC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,EACtC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,YAAA;AACtB,CAAA;AAEA,IAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,UAAU,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC/E,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,0BAAU,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,CAAC,CAAA;AAC9D,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAa,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA;AAIrF,SAAS,cAAcC,KAAAA,EAA0B;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,SAAS,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AACzD,EAAA,IAAI,KAAK,QAAA,CAAS,MAAA,QAAc,IAAI,kBAAA,CAAmB,eAAe,CAAC,CAAA;AAEvE,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AACpC,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,KAAA,CAAM,8BAA8B,CAAA;AACnE,EAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,kBAAA,CAAmB,4BAAA,EAA8B,IAAI,CAAC,CAAA;AAElF,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,IAAI,YAAY,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,GAAQ,YAAY,CAAC,CAAA;AAClD,EAAA,CAAA,EAAA;AAEA,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,kBAAmC,EAAC;AAC1C,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwB;AACnD,EAAA,MAAM,gBAAgC,EAAC;AAEvC,EAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AAEzB,IAAA,IAAI,OAAA,KAAY,MAAM,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACzE,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAMA,IAAA,IAAIC,sCAAA,CAAqB,OAAA,EAAS,eAAe,CAAA,EAAG;AAClD,MAAA,kBAAA,GAAqB,IAAA;AACrB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,OAAA,CAAQ,KAAA;AAAA,MAC1B;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA,EAAI,YAAY,CAAC,CAAA;AAAA,QACjB,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,QACpB,IAAA,EAAO,WAAA,CAAY,CAAC,CAAA,IAAuB;AAAA,OAC5C,CAAA;AACD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,eAAe,OAAO,CAAA;AAC1C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAS,GAAI,WAAA;AACjC,MAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AAEpB,MAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,UAAU,UAAA,EAAW,GAAI,iBAAiB,QAAQ,CAAA;AACvE,MAAA,MAAM,OAAA,GAAU,OAAO,WAAA,EAAY;AACnC,MAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AAErC,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,oBAAA,EAAuB,MAAM,KAAK,OAAO,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,cAAA,CAAe,IAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAAS,UAAmB,CAAC,CAAA;AAAA,MAC5E,CAAA,MAAA,IAAW,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,oBAAA,EAAuB,OAAO,KAAK,OAAO,CAAA;AAAA,MACzE;AAEA,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,EAAA,CAAG,MAAM,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,QAAA,EAAU,CAAA;AAEjE,MAAA,MAAM,YAAA,GAAe,cAAc,GAAG,CAAA;AACtC,MAAA,CAAA,EAAA;AAGA,MAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,QAAA,MAAM,YAAA,GAAe,UAAU,IAAA,EAAK;AAEpC,QAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAAG;AACvD,UAAA,CAAA,EAAA;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,IAAK,YAAA,EAAc;AAG9C,QAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,UAAAC,SAAAA,EAAS,GAAI,iBAAiB,YAAY,CAAA;AAC/D,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AAErC,QAAA,cAAA,CAAe,IAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAASA,SAAsB,CAAC,CAAA;AAE7E,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACxC,QAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,SAAA,EAAW,EAAA,EAAI,UAAU,CAAA;AAE1E,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAS,GAAI,iBAAiB,OAAO,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,GAAG,WAAA,EAAY;AAC3B,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,EAAA,EAAI,QAAe,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,eAAA,CAAgB,QAAA,EAAU,GAAG,CAAC,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IAC7B;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,IAC/C,aAAA;AAAA,IACA,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AAAA,IACxD,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,IACrC,eAAA,EAAiB,qBAAqB,eAAA,GAAkB;AAAA,GAC1D;AACF;AAIA,SAAS,cAAcH,KAAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC7B,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAC3B;AAEA,SAAS,eAAe,OAAA,EAAwF;AAC9G,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACxB,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACxB,MAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,MAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,GAAI,GAAG,KAAA,CAAM,MAAM,CAAA,KAAM,EAAA,CAAG,KAAA,EAAO;AAC1D,QAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK;AAC1C,QAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,CAAA,GAAI,GAAG,KAAA,CAAM,MAAM,EAAE,IAAA,EAAK;AAC1D,QAAA,IAAI,IAAA,IAAQ,KAAA,IAAS,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,UAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,UAAU,KAAA,EAAM;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,GAAA,EAAsD;AAC9E,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,UAAA,KAAe,IAAI,OAAO,EAAE,IAAI,GAAA,CAAI,IAAA,EAAK,EAAG,QAAA,EAAU,IAAA,EAAK;AAC/D,EAAA,MAAM,KAAK,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,UAAA,GAAa,GAAG,UAAA,KAAe,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,UAAU,CAAA;AAC1F,EAAA,OAAO,EAAE,IAAI,QAAA,EAAS;AACxB;AAEA,SAAS,WAAW,QAAA,EAA4B;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,UAAA,KAAe,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,EAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,EAAG,MAAA,CAAO,KAAK,OAAO,CAAA;AACvC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,EAAA,EAAY,QAAA,EAAyB,QAAA,EAA8B;AAC1F,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,EAAA,EAAI,GAAG,WAAA,EAAY;AAAA,IACnB,KAAA,EAAO,EAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,GAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,EAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAS,IAAA,EAAK;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAEhC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,GAAA,GAAM,UAAU,MAAA,GAAS,MAAA,GAAS,UAAU,MAAA,GAAS,QAAA,GAAW,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,KAAA;AAAA,IACrG,CAAA,MAAA,IAAW,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,GAAA,CAAI,MAAA,GAAS,KAAA;AAAA,IACf,CAAA,MAAA,IAAW,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA,EAAG;AACtC,MAAA,GAAA,CAAI,aAAA,GAAgB,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,UAAU,EAAC;AACjC,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,KAAyB,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAChC,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACxC,MAAA,GAAA,CAAI,aAAA,GAAgB,UAAA;AACpB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AACtF,MAAA,GAAA,CAAI,UAAA,GAAa,OAAO,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAwB,CAAE,CAAA;AAAA,IAChF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC5D,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvE,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,aAAa,EAAC;AACvC,QAAA,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CAAgB,UAAsB,QAAA,EAAkC;AAC/E,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,KAAK,QAAA,CAAS,GAAA,KAAQ,SAAA,GAAY,QAAA,CAAS,MAAM,QAAA,CAAS,GAAA;AAAA,IAC1D,QAAQ,QAAA,CAAS,MAAA,KAAW,OAAA,GAAU,QAAA,CAAS,SAAS,QAAA,CAAS,MAAA;AAAA,IACjE,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC1C,aAAA,EAAe,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA;AAAA,IAClD,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACtC,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA;AAAA,IAC5C,YAAY,EAAE,GAAG,SAAS,UAAA,EAAY,GAAG,SAAS,UAAA;AAAW,GAC/D;AACF;;;AC/PA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,gBAAA,GAAmB,EAAA;AAIlB,SAAS,cAAA,CACd,KACA,MAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,EAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,wBAAwB,KAAK,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AACnD,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AACtD;AAIA,SAAS,WAAW,GAAA,EAA8B;AAChD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAwB;AAChD,EAAA,KAAA,MAAW,OAAO,GAAA,CAAI,WAAA,cAAyB,GAAA,CAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AAE9D,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAExC,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,CAAc,MAAA;AAAA,IACnC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,WAAA,IACnC,CAAA,CAAE,IAAA,KAAS,gBAAA,IAAoB,CAAA,CAAE,IAAA,KAAS;AAAA,GACnD;AAEA,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAEnC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,QAAQ,QAAA,EAAU;AAChD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B,WAAW,IAAA,CAAK,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,aAAA,EAAe;AACjC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,cAAA,IAAkB,CAAA,CAAE,SAAS,IAAA,EAAM;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAE,CAAA;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,OAAA,CAAQ,EAAA,EAAI,SAAA,IAAa,IAAA,KAAS,EAAA,EAAI,SAAA,IAAa,IAAA,CAAA;AAAA,IACrD,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,UAAU,YAAA,EAAc,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,6BAAa,IAAI,GAAA,IAAO,OAAA,EAAQ;AACrE;AAIA,SAAS,kBAAkB,KAAA,EAA0B;AACnD,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,OAAA,EAAS,aAAY,GAAI,KAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,CAAC,OAAO,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAEpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3C,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,IAAI,GAAG,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC5C,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAChC,QAAA,IAAI,SAAS,UAAA,EAAY;AAAE,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,UAAA,OAAA,GAAU,IAAA;AAAA,QAAM;AACxF,QAAA,IAAI,SAAS,UAAA,EAAY;AAAE,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,UAAA,OAAA,GAAU,IAAA;AAAA,QAAM;AAAA,MAC1F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,QAAA,OAAA,GAAU,IAAA;AAAA,MACzD,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAAG,QAAA,OAAA,GAAU,IAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACxC,QAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,GAAW,QAAA,EAAU;AACjD,UAAA,WAAA,CAAY,GAAA,CAAI,SAAS,QAAQ,CAAA;AACjC,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,CAAC,YAAY,GAAA,CAAI,EAAE,GAAG,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACjD;AACF;AASA,SAAS,wBAAwB,KAAA,EAAyC;AACxE,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,MAAM,WAAA,EAAa;AACzC,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,GAAG,KAAK,EAAC;AACnC,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA,EAAG,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,SAAmB,KAAA,EAA8B;AACxE,EAAA,IAAI,QAAQ,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,GAAG,OAAO,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,MAAA;AAAA,IAChC,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAA,CAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC;AAAA,GACnE;AAEA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,IAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG;AACpC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,QAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAWA,SAAS,eAAA,CACP,WAAA,EACA,KAAA,EACA,MAAA,EAC2B;AAC3B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,MAAA;AACpC,EAAA,MAAM,OAAO,SAAA,GAAY,CAAA;AACzB,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,YAAA,GAAe,YAAY,MAAA,CAAO,YAAA;AAEvE,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,QAAA,GAAW,IAAA;AACjC,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAEjD,IAAA,IAAI,UAAU,gBAAA,GAAmB,IAAA;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,CAAA,GAAI,GAAG,OAAA,IAAW,SAAA;AAEtB,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAClF,QAAA,OAAA,IAAW,SAAA;AACX,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAC9C,EAAA,0BAAA,CAA2B,SAAA,EAAW,OAAO,MAAM,CAAA;AACnD,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAE9C,EAAA,OAAO,SAAA;AACT;AAOA,SAAS,aAAA,CAAc,SAAmB,KAAA,EAA+B;AACvE,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AAEpB,IAAA,MAAM,EAAA,GAAK,MAAM,WAAA,CAAY,IAAA;AAAA,MAC3B,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,SAAS,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,KAAM,OAC3C,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,QAAQ,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC;AAAA,KAC7B;AAEA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,GAAG,CAAA;AACvE,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAE,GAAG,CAAA;AAC3C,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,0BAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAE/C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA0B;AAClD,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,KAAK,EAAC;AACnC,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,WAAA,CAAY,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAE9B,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,MAAA,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AACvC,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAElD,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrD,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAClC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAClC,QAAA,OAAA,CAAQ,EAAA,EAAI,SAAA,IAAa,IAAA,KAAS,EAAA,EAAI,SAAA,IAAa,IAAA,CAAA;AAAA,MACrD,CAAC,CAAA;AAED,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAE7B,QAAA,MAAM,OAAiB,EAAC;AACxB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAClD,UAAA,IAAI,GAAA,GAAM,YAAA;AAGV,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA;AACtC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,EAAE,MAAM,GAAA,KAAQ,MAAA,IAAW,MAAM,GAAA,KAAQ,QAAA,IAAY,IAAA,EAAM,GAAA,KAAQ,QAAA,CAAA,EAAY;AACjF,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAGA,UAAA,MAAM,SAAA,GAAY,eAAe,CAAC,CAAA;AAClC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,IAAA,EAAM,QAAQ,MAAA,IAAW,IAAA,EAAM,QAAQ,QAAA,IAAY,IAAA,EAAM,QAAQ,QAAA,EAAW;AAC9E,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAEA,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACjD,QAAA,MAAM,MAAA,GAAS,aAAa,UAAA,GAAa,CAAA;AACzC,QAAA,IAAI,EAAA,GAAK,MAAA;AACT,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,UAAA,IAAI,GAAA,MAAS,CAAA,GAAI,EAAA;AACjB,UAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,EAAA,IAAM,KAAK,CAAC,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,QAAA,IAAI,GAAA,MAAS,CAAA,GAAI,UAAA;AAAA,MACnB;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACtC,QAAA,IAAI,CAAC,QAAA,EAAU;AACf,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,KAAK,EAAC;AAC9C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,KAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAC5F,UAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAC1C,UAAA,IAAI,CAAC,UAAA,EAAY;AACjB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC9C,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAClD,UAAA,IAAI,QAAA,EAAU,QAAQ,MAAA,IAAW,QAAA,EAAU,QAAQ,QAAA,IAAY,UAAA,EAAY,QAAQ,QAAA,EAAW;AAC5F,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAA,CACP,SAAA,EACA,WAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,YAAA;AAEzC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAClB,GAAA,CAAI,CAAC,EAAA,KAAO,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,CAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAyB,MAAM,MAAS,CAAA;AACnD,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAC5C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAM,QAAQ,MAAA,GAAS,GAAA;AACvB,QAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,IAAK,KAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,MAAA,CAAO,SAAA,GAAY,CAAA;AACzD,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,MAAM,QAAQ,UAAA,GAAa,IAAA;AAC3B,IAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,MAAO,CAAA,IAAK,KAAA;AAAA,EACjD;AACF;AAIA,SAAS,YAAA,CACP,KAAA,EACA,SAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,GAAY,CAAA;AAChC,EAAA,MAAM,eAAe,MAAA,CAAO,UAAA,GAAa,IAAI,YAAA,GAAe,SAAA,GAAY,OAAO,YAAA,GAAe,IAAA;AAE9F,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAEhE,IAAA,MAAM,SAAA,GAA0B,EAAE,IAAA,EAAM,EAAA,CAAG,cAAc,IAAA,EAAM,MAAA,EAAQ,IAAI,OAAA,EAAQ;AACnF,IAAA,MAAM,UAAA,GAAa,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAC,CAAA,CAAA;AAC1F,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,SAAS,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,CAAA;AAGnF,IAAA,IAAI,EAAA,CAAG,iBAAiB,gBAAA,EAAkB;AACxC,MAAA,MAAM,MAAA,GAAS,CAAA;AACf,MAAA,MAAM,WAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,GAAI,IAAI,IAAI,OAAA,CAAQ,CAAA,GAAI,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,MAAM,CAAA,CAAA;AAC1G,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QAAQ,EAAA,EAAI,OAAA;AAAA,QAClB,YAAA,EAAc,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,QACpF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,CAAA;AACrB,MAAA,MAAM,QAAQ,OAAA,GAAU,YAAA;AAExB,MAAA,MAAM,cAAA,GAAiB,GAAG,QAAA,CACvB,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,IAAI,GAAA,EAAK,GAAA,EAAK,UAAU,GAAA,CAAI,GAAG,GAAE,CAAE,CAAA,CACnD,OAAO,CAAC,CAAA,KAA8C,CAAA,CAAE,GAAA,KAAQ,MAAS,CAAA;AAE5E,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AACjC,MAAA,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA;AACpC,MAAA,MAAM,SAAS,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,EAAE,GAAA,CAAI,CAAA;AAE7D,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QAAG,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QACvC,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,OAAA,EAAQ;AAAA,QAC/D,IAAA,EAAM,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,IAAI,KAAK,CAAA;AAAA,OAC9C,CAAA;AAED,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UAAG,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UACvC,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,UAAA,EAAW;AAAA,UAClE,IAAA,EAAM,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,MAAM,IAAI,KAAK,CAAA;AAAA,SAC/C,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,OAAO,UAAA,GAAa,CAAA;AACnD,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,MAAA,KAAW,CAAA,GACxC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,QAAQ,KAC1C,CAAA,EAAA,EAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,KAAK,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAE1D,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,MAAM,EAAA,CAAG,EAAA;AAAA,UAAI,IAAI,KAAA,CAAM,EAAA;AAAA,UACvB,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,EAAA,EAAI,KAAA,CAAM,EAAA,EAAG;AAAA,UAChE,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,aAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,SAAA,EAAW;AACjC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA;AAAA,MACA,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,GAAI,OAAA;AAAA,MAClC,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,aAAa,CAAA,GAAI,OAAA;AAAA,MACnC,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,QAAQ,MAAA,CAAO,UAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACrC,GAAG,CAAA;AAAA,IACH,IAAA,EAAM,SAAA,CAAU,CAAA,CAAE,IAAA,EAAM,SAAS,OAAO;AAAA,GAC1C,CAAE,CAAA;AAEF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,IAAS,KAAK,UAAA,CAAW,EAAA;AAC3D,IAAA,MAAM,cAAA,GAAiB,UAAU,MAAA,GAAS,GAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAC/D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,KAAK,cAAc,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAC7B,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,QAAQ,CAAC,IAAA;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,CAAA,IAAK,KAAA;AAAA,IACZ;AACA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,IAAQ,KAAA;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,GAAO,OAAA;AAAA,IACd,MAAA,EAAQ,IAAA,GAAO,OAAA,GAAU,SAAA,GAAY,YAAA,GAAe,EAAA;AAAA,IACpD,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,SAAA,CAAU,QAAA,EAAkB,EAAA,EAAY,EAAA,EAAoB;AACnE,EAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IACd,iCAAA;AAAA,IACA,CAAC,MAAA,EAAQ,GAAA,EAAa,IAAA,EAAc,IAAA,KAAiB;AACnD,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC9iBA,IAAM,QAAA,GAA4B;AAAA,EAChC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACxC,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EAChC,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA;AAC1B,CAAA;AAEA,IAAM,8BAAgC,IAAI,GAAA,CAAS,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE9D,SAAS,mBAAA,CACd,KACA,KAAA,EACY;AACZ,EAAA,MAAM,QAAsB,EAAC;AAI7B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAmB;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,WAAA,EAAa;AACjC,IAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,aAAA,KAAkB,YAAA,EAAc;AAC3D,MAAA,UAAA,CAAW,GAAA,CAAI,IAAI,aAAa,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,UAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,CAAM,IAAA,IAAQ,MAAM,IAAA,KAAS,MAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAK,KAAA,CAAM,EAAA;AAAA,QACX,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA,EAAM,SAAS,MAAA,GAAS,cAAA;AAAA,QACxB,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,aAAA;AAAA,QAC5B,KAAA,EAAO,MAAA,GAAS,MAAA,GAAY,KAAA,CAAM,IAAA;AAAA,QAClC,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAS;AAC7B,EAAA,KAAA,MAAW,OAAO,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,CAAA;AACtD,EAAA,MAAM,QAAA,GAAkB,CAAC,SAAA,EAAW,OAAA,EAAS,aAAa,UAAU,CAAA;AACpE,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,CAAC,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA;AAAA,MACb,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,MACjB,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,MAAM,KAAA,CAAM,WAAA;AAAA,MACZ,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,UAAU,CAAA;AACvE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,UAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,OAAA;AAAA,MACR,OAAO,KAAA,CAAM,YAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,EAAS,QAAA,CAAS,SAAS,CAAC,CAAA;AAC7E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,gBAAA;AAAA,MACL,KAAA,EAAO,mDAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACA,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,EAAS,QAAA,CAAS,YAAY,CAAC,CAAA;AACnF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,GAAA,EAAK,mBAAA;AAAA,MACL,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CACP,GACA,KAAA,EACY;AACZ,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,SAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,kBAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,kBAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,gBAAA;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS,OAAA;AAAA,QACT,WAAA,EAAa,CAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,QAChB,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,QACjB,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA;AAEN;AAEA,SAAS,SAAS,CAAA,EAAgB;AAChC,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,SAAA;AAAW,MAAA,OAAO,aAAA;AAAA,IACvB,KAAK,OAAA;AAAS,MAAA,OAAO,OAAA;AAAA,IACrB,KAAK,WAAA;AAAa,MAAA,OAAO,YAAA;AAAA,IACzB,KAAK,UAAA;AAAY,MAAA,OAAO,UAAA;AAAA,IACxB;AAAS,MAAA,OAAO,CAAA;AAAA;AAEpB;AAEA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA;AACzE;;;AClLO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAII,oCAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,CAAC,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,YAAY,SAAS,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,WAAW,MAAM,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,SAAiB,CAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,MAAA;AAC/B,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,GAAA,EAAK,QAAA,EAAU,KAAA,IAAS,UAAA;AAE7C,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvBC,wBAAM,YAAY,CAAA;AAAA,IAClBC,sBAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,oBAAA,EAAuB,QAAQ,CAAA,YAAA,CAAc,CAAA;AAAA,IAClF,OAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,eAAe,CAAC,SAAA,EAAW,UAAA,EAAY,GAAG,YAAY,UAAU,CAAA;AAEtE,EAAA,IAAI,aAAa,MAAA,CAAO,KAAA;AACxB,EAAA,IAAI,cAAc,MAAA,CAAO,MAAA;AACzB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,GAAA,EAAK,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAYC,sCAAA,CAAqB,QAAA,EAAU,GAAA,CAAI,eAAe,CAAA;AACpE,IAAA,IAAI,UAAU,IAAA,KAAS,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA,EAAG;AACzD,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,EAAA,EAAG,GAAIC,8BAAA;AAAA,QACxB,SAAA;AAAA,QACA;AAAA,UACE,aAAa,MAAA,CAAO,KAAA;AAAA,UACpB,cAAc,MAAA,CAAO,MAAA;AAAA,UACrB,OAAA,EAAS;AAAA,SACX;AAAA,QACA,CAAA;AAAA,QACA,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,OAAO,QAAA;AAAS,OAC7D;AACA,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AAChC,QAAA,IAAI,SAAA,GAAY,YAAY,UAAA,GAAa,SAAA;AACzC,QAAA,IAAI,SAAA,GAAY,aAAa,WAAA,GAAc,SAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,UAAA,GAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAChE,EAAA,MAAA,CAAO,IAAA;AAAA,IACLC,uBAAA;AAAA,MACE,EAAE,SAAA,EAAW,YAAA,GAAe,IAAI,CAAA,UAAA,EAAa,YAAY,SAAS,MAAA,EAAU;AAAA,MAC5E;AAAA;AACF,GACF;AACA,EAAA,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAEpC,EAAA,OAAOC,yBAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,MACzC,KAAA,EAAO,sCAAA;AAAA,MACP,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CAAU,OAAqB,CAAA,EAAwC;AAC9E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,EAAA,GAAK,EAAE,UAAA,CAAW,aAAA;AACxB,IAAA,IAAI,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPC,oBAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7DC,sBAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ;AAAA,OACtD,CAAA;AAAA,MACDD,oBAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/DC,sBAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO;AAAA,OACxD;AAAA,KACH;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,IAAA;AAAA,IACPD,qBAAG,QAAA,EAAU;AAAA,MACX,EAAA,EAAI,kCAAA;AAAA,MACJ,OAAA,EAAS,WAAA;AAAA,MACT,IAAA,EAAM,GAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa,GAAA;AAAA,MACb,YAAA,EAAc,GAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV,EAAG;AAAA,MACDE,uBAAK,EAAE,CAAA,EAAG,yBAAyB,IAAA,EAAM,CAAA,CAAE,QAAQ;AAAA,KACpD;AAAA,GACH;AAEA,EAAA,OAAOC,uBAAK,QAAQ,CAAA;AACtB;AAIA,SAAS,WAAA,CAAY,QAAsB,CAAA,EAAwC;AACjF,EAAA,MAAM,GAAA,GAAM;AAAA,qBAAA,EACSC,qCAAA,CAAoB,CAAC,CAAC;AAAA;AAAA,kCAAA,EAET,EAAE,IAAI,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA,gBAAA,EAAmBC,+BAAa,MAAM,CAAA;AAAA,yCAAA,EAC1D,OAAO,UAAU,CAAA,aAAA,EAAgB,OAAO,QAAQ,CAAA,+BAAA,EAAkC,EAAE,IAAI,CAAA;AAAA,6CAAA,EACpF,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,IAAI,CAAA;AAAA,mCAAA,EAChF,CAAA,CAAE,MAAM,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,4CAAA,EACrC,CAAA,CAAE,YAAY,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,0CAAA,EACtD,EAAE,aAAa,CAAA;AAAA,yCAAA,EAChB,EAAE,aAAa,CAAA;AAAA,0CAAA,EACd,EAAE,aAAa,CAAA;AAAA,kDAAA,EACP,CAAA,CAAE,aAAa,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,iDAAA,EACtD,CAAA,CAAE,MAAM,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,iDAAA,EAC9C,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,MAAM,CAAA;AAAA,uCAAA,EAClF,EAAE,MAAM,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA,gBAAA,EAAmBA,+BAAa,MAAM,CAAA;AAAA,wCAAA,EAClE,CAAA,CAAE,YAAY,CAAA,gBAAA,EAAmBA,8BAAA,CAAa,MAAM,CAAA;AAAA,gDAAA,EAC5C,MAAA,CAAO,UAAU,CAAA,4CAAA,EAA+C,CAAA,CAAE,IAAI,CAAA;AAAA,0CAAA,EAC5E,MAAA,CAAO,UAAU,CAAA,yBAAA,EAA4B,CAAA,CAAE,IAAI,CAAA;AAAA,uCAAA,EACtD,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA;AAAA,CAAA;AAEnE,EAAA,OAAOL,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG,CAAA;AAC5B;AAIA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,IAAA;AAClC,IAAA,MAAM,QAAA,GAAW,mDAAmD,OAAO,CAAA,CAAA;AAE3E,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzBA,oBAAA,CAAG,QAAQ,EAAE,CAAA,EAAG,KAAK,IAAA,EAAM,KAAA,EAAO,gCAAgC;AAAA,KACpE;AAEA,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,IAAA;AAAA,UACPX,sBAAA,CAAK;AAAA,YACH,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAAG,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAC3B,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAAG,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YAC3B,KAAA,EAAO;AAAA,WACR;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA;AAAA,MACPS,uBAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,EAAA,EAAG,EAAG,QAAQ;AAAA,KACjF;AAAA,EACF;AAEA,EAAA,OAAOA,uBAAA,CAAM,EAAE,KAAA,EAAO,0BAAA,IAA8B,QAAQ,CAAA;AAC9D;AAEA,SAAS,aAAa,QAAA,EAAmD;AACvE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,IAAA;AACzC,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,CAAA;AAAA,IACrD,CAAA,EAAA,CAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK;AAAA,GACvD;AACF;AAIA,SAAS,kBAAkB,KAAA,EAAgD;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAU,KAAK,EAAC;AAC5C,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,GAAG,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,SAAA,EAAgD;AACnE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACxC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,MAAA,YAAA,CAAa,IAAA,CAAK,qBAAqB,IAAA,CAAK,UAAA,EAAY,IAAI,EAAA,EAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACLA,uBAAA;AAAA,QACE,EAAE,KAAA,EAAO,CAAA,4DAAA,EAA+D,MAAM,CAAA,CAAA,EAAI,mBAAmB,MAAA,EAAO;AAAA,QAC5G;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAA,CACP,GAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,OAAO,IAAA,GAAO,CAAA;AACpB,EAAA,MAAM,OAAA,GAAU,CAAC,yBAAA,EAA2B,CAAA,mBAAA,EAAsB,GAAA,CAAI,QAAQ,OAAA,GAAU,SAAA,GAAY,GAAA,CAAI,GAAG,CAAA,CAAE,CAAA;AAC7G,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AACzE,EAAA,IAAI,IAAI,aAAA,EAAe,OAAA,CAAQ,KAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,aAAa,CAAA,CAAE,CAAA;AAE7E,EAAA,MAAM,SAAA,GAAY,YAAY,GAAG,CAAA;AACjC,EAAA,MAAM,QAAA,GAAqB,CAACJ,uBAAA,CAAM,SAAS,CAAC,CAAA;AAG5C,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,SAAA;AAChF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC/C,IAAA,MAAM,IAAI,IAAA,GAAO,GAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPY,yBAAA,CAAQ;AAAA,QACN,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,MAAM,CAAC,CAAA,CAAA;AAAA,QACrC,KAAA,EAAO,CAAA,iDAAA,EAAoD,GAAA,CAAI,MAAM,CAAA,MAAA;AAAA,OACtE;AAAA,KACH;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,MAAA,QAAA,CAAS,IAAA;AAAA,QACPjB,sBAAA,CAAK;AAAA,UACH,EAAA,EAAI,CAAC,CAAA,GAAI,GAAA;AAAA,UAAK,IAAI,CAAA,GAAI,GAAA;AAAA,UAAK,IAAI,CAAA,GAAI,GAAA;AAAA,UAAK,EAAA,EAAI,CAAC,CAAA,GAAI,GAAA;AAAA,UACjD,KAAA,EAAO;AAAA,SACR;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,QAAA,CAAS,IAAA;AAAA,QACPC,sBAAA;AAAA,UACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,KAAA,EAAO,iCAAA,EAAmC,aAAA,EAAe,QAAA,EAAS;AAAA,UACrF;AAAA;AACF,OACF;AAAA,IACF;AAEA,IAAA,OAAOQ,uBAAA;AAAA,MACL;AAAA,QACE,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,QACvB,sBAAsB,GAAA,CAAI,EAAA;AAAA,QAC1B,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAAA,OACjC;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAGtC,EAAA,IAAI,GAAA,CAAI,WAAW,WAAA,EAAa;AAC9B,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,IAAA,QAAA,CAAS,IAAA;AAAA,MACPR,sBAAA;AAAA,QACE,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,EAAI,KAAA,EAAO,iCAAA,EAAmC,aAAA,EAAe,QAAA,EAAS;AAAA,QACxF;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAK,GAAA,CAAI,aAAA;AACf,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC3C,CAAA,MAAA,IAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,EAAA,KAAO,WAAA,IAAe,EAAA,KAAO,kBAAA,EAAoB;AAC1D,IAAA,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAChC;AAGA,EAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,IAAA,QAAA,CAAS,IAAA;AAAA,MACPD,sBAAA,CAAK,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAC,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,0CAA0C;AAAA,KAC7F;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,KAAQ,QAAA,GAAW,OAAO,KAAA,GAAQ,IAAA;AAClD,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA,CAAK,EAAE,EAAA,EAAI,GAAA,EAAK,IAAI,CAAC,GAAA,EAAK,EAAA,EAAI,CAAC,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,oCAAoC;AAAA,KAC1F;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA,CAAK;AAAA,QACH,EAAA,EAAI,CAAC,IAAA,GAAO,QAAA;AAAA,QAAU,IAAI,IAAA,GAAO,QAAA;AAAA,QACjC,EAAA,EAAI,CAAC,IAAA,GAAO,CAAA;AAAA,QAAG,IAAI,IAAA,GAAO,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAC,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,eAAe,KAAA,EAAM;AAAA,QACnH;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AACvC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACPD,sBAAA,CAAK;AAAA,QACH,EAAA,EAAI,CAAC,IAAA,GAAO,QAAA;AAAA,QAAU,IAAI,IAAA,GAAO,QAAA;AAAA,QACjC,EAAA,EAAI,CAAC,IAAA,GAAO,CAAA;AAAA,QAAG,IAAI,IAAA,GAAO,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACDC,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAC,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,eAAe,KAAA,EAAM;AAAA,QACnH;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA,EAAG;AACtC,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,OAAO,CAAA,EAAG,KAAA,EAAO,kCAAA,EAAoC,aAAA,EAAe,QAAA,EAAS;AAAA,QACzF;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MACvB,sBAAsB,GAAA,CAAI,EAAA;AAAA,MAC1B,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CAAU,KAAwB,IAAA,EAAsB;AAC/D,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOG,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,KAAA,EAAO,4BAA4B,CAAA;AAAA,IAC1G,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,0BAAA,EAA4B,CAAA;AAAA,IAC5E;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,KAAA,EAAO,4BAA4B,CAAA;AAAA;AAE/G;AAEA,SAAS,YAAA,CAAa,KAAwB,IAAA,EAAsB;AAClE,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,kCAAA,EAAmC;AAC1D,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOL,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AAAA,IACnD;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,OAAO,CAAA;AAAA;AAEtF;AAEA,SAAS,WAAA,CAAY,KAAwB,IAAA,EAAsB;AACjE,EAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,QAAA,GAAW,QAAA,GAAW,MAAA;AACjD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA,EAAO,iCAAA;AAAA,IACP,WAAA,EAAa,wCAAwC,UAAU,CAAA,CAAA;AAAA,GACjE;AACA,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAOL,uBAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAOM,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AAAA,IACnD;AACE,MAAA,OAAOD,0BAAQ,EAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,EAAM,GAAG,OAAO,CAAA;AAAA;AAEtF;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAOC,wBAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,KAAA,EAAO,kCAAA,EAAoC,CAAA;AAC3F;AAEA,SAAS,YAAY,GAAA,EAAyB;AAC5C,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAClE,EAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,aAAA,KAAkB,YAAA,EAAc;AAC3D,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,aAAa,CAAA,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,YAAA,CACP,KAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAC3C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,EAAA,EAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,QAAA;AAEjD,IAAA,MAAM,aAAa,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI,EAAA;AACnD,IAAA,MAAM,eAAe,GAAA,CAAI,KAAA,KAAU,GAAA,CAAI,EAAA,GAAK,IAAI,KAAA,GAAQ,UAAA;AAExD,IAAA,MAAA,CAAO,IAAA;AAAA,MACLjB,sBAAA;AAAA,QACE,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,QAAQ,KAAA,EAAO,0BAAA,EAA4B,oBAAA,EAAsB,GAAA,CAAI,EAAA,EAAG;AAAA,QACpF;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA,CAAM,EAAE,KAAA,EAAO,2BAAA,IAA+B,MAAM,CAAA;AAC7D;AAIA,SAAS,sBAAA,CACP,WACA,OAAA,EACQ;AACR,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACxC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA,CAAE,IAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAEhC,IAAA,MAAA,CAAO,IAAA;AAAA,MACLR,sBAAA;AAAA,QACE,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,IAAA,GAAO,CAAA,EAAG,OAAO,8BAAA,EAA+B;AAAA,QAC5D;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAOQ,uBAAA,CAAM,EAAE,KAAA,EAAO,sCAAA,IAA0C,MAAM,CAAA;AACxE;AAOA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,MAAM,GAAG,CAAA;AACnF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,OAAO,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AACnB,MAAA,MAAA,IAAU,KAAK,CAAC,CAAA;AAChB,MAAA,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;AC5gBO,IAAM,QAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,UAAA;AAAA,EAEN,OAAOR,KAAAA,EAAuB;AAC5B,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AACtE,IAAA,OAAO,SAAA,KAAc,UAAA,IAAc,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,KAAA,EAAO,aAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,MAAM,GAAA,GAAM,cAAcA,KAAI,CAAA;AAC9B,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,YAAA,EAAc,EAAA;AAAA,MACd,YAAA,EAAc,GAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AACA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAC/C,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,UAAA,EAAY,QAAQ,UAAA,IAAc,sCAAA;AAAA,MAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,MAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,MACxB,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AACA,IAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,YAAA,EAAc,GAAG,CAAA;AAAA,EACjD;AACF","file":"chunk-O5POCPXZ.cjs","sourcesContent":["import type {\n DiagramAST,\n Individual,\n LegendOverrides,\n Relationship,\n RelationshipType,\n GeneticStatus,\n IndividualMarker,\n LegendEntry,\n ConditionFill,\n} from \"../../core/types\";\nimport { parseLegendDirective } from \"../../core/legend-parser\";\n\n// ─── ParseError ─────────────────────────────────────────────\n\nexport class PedigreeParseError extends Error {\n constructor(message: string, public line: number) {\n super(`Line ${line}: ${message}`);\n this.name = \"PedigreeParseError\";\n }\n}\n\n// ─── Couple operators ───────────────────────────────────────\n\nconst COUPLE_OPS: Array<{ token: string; type: RelationshipType }> = [\n { token: \"-/-\", type: \"separated\" },\n { token: \"==\", type: \"consanguineous\" },\n { token: \"--\", type: \"married\" },\n { token: \"~\", type: \"cohabiting\" },\n];\n\nconst VALID_SEX = new Set([\"male\", \"female\", \"unknown\", \"amab\", \"afab\", \"uaab\"]);\nconst GENETIC_STATUSES = new Set([\n \"affected\",\n \"carrier\",\n \"carrier-x\",\n \"obligate-carrier\",\n \"presymptomatic\",\n \"unaffected\",\n]);\nconst MARKERS = new Set([\"proband\", \"consultand\", \"evaluated\"]);\nconst VALID_STATUS = new Set([\"deceased\", \"stillborn\", \"pregnancy\", \"sab\", \"tab\", \"ectopic\"]);\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function parsePedigree(text: string): DiagramAST {\n const rawLines = text.split(\"\\n\");\n let i = 0;\n\n while (i < rawLines.length && rawLines[i].trim() === \"\") i++;\n if (i >= rawLines.length) throw new PedigreeParseError(\"Empty input\", 1);\n\n const headerLine = rawLines[i].trim();\n const headerMatch = headerLine.match(/^pedigree\\s*(?:\"([^\"]*)\")?$/i);\n if (!headerMatch) throw new PedigreeParseError(\"Expected 'pedigree' header\", i + 1);\n\n const metadata: Record<string, string> = {};\n if (headerMatch[1]) metadata.title = headerMatch[1];\n i++;\n\n const legend: LegendEntry[] = [];\n const legendOverrides: LegendOverrides = {};\n let hasLegendOverrides = false;\n const individualsMap = new Map<string, Individual>();\n const relationships: Relationship[] = [];\n\n while (i < rawLines.length) {\n const raw = rawLines[i];\n const trimmed = raw.trim();\n\n if (trimmed === \"\" || trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\")) {\n i++;\n continue;\n }\n\n // Unified legend directives (legend.title / .position / .label / .hide /\n // .section / .item / `legend: on|off|<position>`). Legacy `legend: id =\n // \"...\"` falls through to the regex below — applyMaster() returns false\n // for the trait-id form, so parseLegendDirective hands it back to us.\n if (parseLegendDirective(trimmed, legendOverrides)) {\n hasLegendOverrides = true;\n i++;\n continue;\n }\n\n // Legend definition (legacy trait-fill DSL).\n const legendMatch = trimmed.match(\n /^legend:\\s*([a-zA-Z][a-zA-Z0-9_-]*)\\s*=\\s*\"([^\"]*)\"\\s*(?:\\(\\s*fill:\\s*([a-zA-Z-]+)\\s*\\))?$/\n );\n if (legendMatch) {\n legend.push({\n id: legendMatch[1],\n label: legendMatch[2],\n fill: (legendMatch[3] as ConditionFill) ?? \"full\",\n });\n i++;\n continue;\n }\n\n // Couple line\n const coupleMatch = detectCoupleOp(trimmed);\n if (coupleMatch) {\n const { leftId, op, rightRaw } = coupleMatch;\n const lineNum = i + 1;\n\n const { id: rightId, propsStr: rightProps } = parseIdWithProps(rightRaw);\n const leftKey = leftId.toLowerCase();\n const rightKey = rightId.toLowerCase();\n\n if (!individualsMap.has(leftKey)) {\n throw new PedigreeParseError(`Unknown individual '${leftId}'`, lineNum);\n }\n\n if (rightProps) {\n individualsMap.set(rightKey, buildIndividual(rightId, rightProps, lineNum));\n } else if (!individualsMap.has(rightKey)) {\n throw new PedigreeParseError(`Unknown individual '${rightId}'`, lineNum);\n }\n\n relationships.push({ type: op.type, from: leftKey, to: rightKey });\n\n const coupleIndent = leadingSpaces(raw);\n i++;\n\n // Children (indented under couple)\n while (i < rawLines.length) {\n const childLine = rawLines[i];\n const childTrimmed = childLine.trim();\n\n if (childTrimmed === \"\" || childTrimmed.startsWith(\"#\")) {\n i++;\n continue;\n }\n\n if (leadingSpaces(childLine) <= coupleIndent) break;\n\n const childLineNum = i + 1;\n const { id: childId, propsStr } = parseIdWithProps(childTrimmed);\n const childKey = childId.toLowerCase();\n\n individualsMap.set(childKey, buildIndividual(childId, propsStr, childLineNum));\n\n const coupleKey = `${leftKey}+${rightKey}`;\n relationships.push({ type: \"parent-child\", from: coupleKey, to: childKey });\n\n i++;\n }\n continue;\n }\n\n // Individual definition\n const { id, propsStr } = parseIdWithProps(trimmed);\n const key = id.toLowerCase();\n const ind = buildIndividual(id, propsStr, i + 1);\n const existing = individualsMap.get(key);\n if (existing) {\n individualsMap.set(key, mergeIndividual(existing, ind));\n } else {\n individualsMap.set(key, ind);\n }\n i++;\n }\n\n return {\n type: \"pedigree\",\n individuals: Array.from(individualsMap.values()),\n relationships,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n legend: legend.length > 0 ? legend : undefined,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction leadingSpaces(line: string): number {\n const m = line.match(/^(\\s*)/);\n return m ? m[1].length : 0;\n}\n\nfunction detectCoupleOp(trimmed: string): { leftId: string; op: typeof COUPLE_OPS[0]; rightRaw: string } | null {\n for (const op of COUPLE_OPS) {\n let bracketDepth = 0;\n for (let j = 0; j < trimmed.length; j++) {\n if (trimmed[j] === \"[\") bracketDepth++;\n if (trimmed[j] === \"]\") bracketDepth--;\n if (bracketDepth > 0) continue;\n\n if (trimmed.substring(j, j + op.token.length) === op.token) {\n const left = trimmed.substring(0, j).trim();\n const right = trimmed.substring(j + op.token.length).trim();\n if (left && right && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(left)) {\n return { leftId: left, op, rightRaw: right };\n }\n }\n }\n }\n return null;\n}\n\nfunction parseIdWithProps(raw: string): { id: string; propsStr: string | null } {\n const bracketIdx = raw.indexOf(\"[\");\n if (bracketIdx === -1) return { id: raw.trim(), propsStr: null };\n const id = raw.substring(0, bracketIdx).trim();\n const endBracket = raw.lastIndexOf(\"]\");\n const propsStr = raw.substring(bracketIdx + 1, endBracket === -1 ? raw.length : endBracket);\n return { id, propsStr };\n}\n\nfunction splitProps(propsStr: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n for (const ch of propsStr) {\n if (ch === \"(\") parenDepth++;\n if (ch === \")\") parenDepth--;\n if (ch === \",\" && parenDepth === 0) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) result.push(current);\n return result;\n}\n\nfunction buildIndividual(id: string, propsStr: string | null, _lineNum: number): Individual {\n const ind: Individual = {\n id: id.toLowerCase(),\n label: id,\n sex: \"unknown\",\n status: \"alive\",\n };\n\n if (!propsStr) return ind;\n\n const tokens = splitProps(propsStr);\n for (const rawToken of tokens) {\n const token = rawToken.trim();\n const lower = token.toLowerCase();\n\n if (VALID_SEX.has(lower)) {\n ind.sex = lower === \"amab\" ? \"male\" : lower === \"afab\" ? \"female\" : lower === \"uaab\" ? \"unknown\" : lower as Individual[\"sex\"];\n } else if (VALID_STATUS.has(lower)) {\n ind.status = lower as Individual[\"status\"];\n } else if (GENETIC_STATUSES.has(lower)) {\n ind.geneticStatus = lower as GeneticStatus;\n } else if (MARKERS.has(lower)) {\n if (!ind.markers) ind.markers = [];\n ind.markers.push(lower as IndividualMarker);\n } else if (/^\\d{4}$/.test(lower)) {\n ind.birthYear = parseInt(token, 10);\n } else if (lower.startsWith(\"affected:\")) {\n ind.geneticStatus = \"affected\";\n const traits = token.substring(\"affected:\".length).trim().split(\"+\").map(t => t.trim());\n ind.conditions = traits.map(t => ({ label: t, fill: \"full\" as ConditionFill }));\n } else if (token.includes(\":\")) {\n const colonIdx = token.indexOf(\":\");\n const key = token.substring(0, colonIdx).trim().toLowerCase();\n const value = token.substring(colonIdx + 1).trim().replace(/^\"|\"$/g, \"\");\n if (key === \"label\") {\n ind.label = value;\n } else {\n if (!ind.properties) ind.properties = {};\n ind.properties[key] = value;\n }\n }\n }\n\n return ind;\n}\n\nfunction mergeIndividual(existing: Individual, incoming: Individual): Individual {\n return {\n ...existing,\n sex: incoming.sex !== \"unknown\" ? incoming.sex : existing.sex,\n status: incoming.status !== \"alive\" ? incoming.status : existing.status,\n birthYear: incoming.birthYear ?? existing.birthYear,\n geneticStatus: incoming.geneticStatus ?? existing.geneticStatus,\n markers: incoming.markers ?? existing.markers,\n conditions: incoming.conditions ?? existing.conditions,\n properties: { ...existing.properties, ...incoming.properties },\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Internal types ─────────────────────────────────────────\n\ninterface FamilyUnit {\n id: string;\n partners: [string, string];\n relationship: RelationshipType;\n children: string[];\n}\n\ninterface LayoutGraph {\n individuals: Map<string, Individual>;\n familyUnits: FamilyUnit[];\n generations: Map<string, number>;\n childOf: Map<string, string>;\n}\n\n// ─── Constants ─────────────────────────────────────────────\n\nconst LABEL_HEIGHT = 20;\nconst LABEL_GAP = 6;\nconst GEN_LABEL_MARGIN = 50;\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function layoutPedigree(\n ast: DiagramAST,\n config: LayoutConfig\n): LayoutResult {\n const graph = buildGraph(ast);\n assignGenerations(graph);\n const ordered = orderNodesInGenerations(graph);\n const positions = assignPositions(ordered, graph, config);\n const edges = computeEdges(graph, positions, config);\n return packageResult(positions, edges, graph, config);\n}\n\n// ─── Step 1: Build graph ────────────────────────────────────\n\nfunction buildGraph(ast: DiagramAST): LayoutGraph {\n const individuals = new Map<string, Individual>();\n for (const ind of ast.individuals) individuals.set(ind.id, ind);\n\n const familyUnits: FamilyUnit[] = [];\n const childOf = new Map<string, string>();\n\n const coupleRels = ast.relationships.filter(\n (r) => r.type === \"married\" || r.type === \"separated\" ||\n r.type === \"consanguineous\" || r.type === \"cohabiting\"\n );\n\n for (const rel of coupleRels) {\n const fuId = `${rel.from}+${rel.to}`;\n const indA = individuals.get(rel.from);\n const indB = individuals.get(rel.to);\n\n let partners: [string, string];\n if (indA && indB) {\n if (indA.sex === \"male\" && indB.sex === \"female\") {\n partners = [rel.from, rel.to];\n } else if (indA.sex === \"female\" && indB.sex === \"male\") {\n partners = [rel.to, rel.from];\n } else {\n partners = [rel.from, rel.to];\n }\n } else {\n partners = [rel.from, rel.to];\n }\n\n const children: string[] = [];\n for (const r of ast.relationships) {\n if (r.type === \"parent-child\" && r.from === fuId) {\n children.push(r.to);\n childOf.set(r.to, fuId);\n }\n }\n\n children.sort((a, b) => {\n const ia = individuals.get(a);\n const ib = individuals.get(b);\n return (ia?.birthYear ?? 9999) - (ib?.birthYear ?? 9999);\n });\n\n familyUnits.push({ id: fuId, partners, relationship: rel.type, children });\n }\n\n return { individuals, familyUnits, generations: new Map(), childOf };\n}\n\n// ─── Step 2: Assign generations ─────────────────────────────\n\nfunction assignGenerations(graph: LayoutGraph): void {\n const { individuals, familyUnits, childOf, generations } = graph;\n const allIds = Array.from(individuals.keys());\n const roots = allIds.filter((id) => !childOf.has(id));\n\n if (roots.length === 0 && allIds.length > 0) {\n for (const id of allIds) generations.set(id, 0);\n return;\n }\n\n for (const root of roots) {\n if (!generations.has(root)) generations.set(root, 0);\n }\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const fu of familyUnits) {\n const gen0 = generations.get(fu.partners[0]);\n const gen1 = generations.get(fu.partners[1]);\n\n let partnerGen: number;\n if (gen0 !== undefined && gen1 !== undefined) {\n partnerGen = Math.max(gen0, gen1);\n if (gen0 !== partnerGen) { generations.set(fu.partners[0], partnerGen); changed = true; }\n if (gen1 !== partnerGen) { generations.set(fu.partners[1], partnerGen); changed = true; }\n } else if (gen0 !== undefined) {\n partnerGen = gen0;\n generations.set(fu.partners[1], partnerGen); changed = true;\n } else if (gen1 !== undefined) {\n partnerGen = gen1;\n generations.set(fu.partners[0], partnerGen); changed = true;\n } else {\n continue;\n }\n\n for (const childId of fu.children) {\n const childGen = partnerGen + 1;\n const existing = generations.get(childId);\n if (existing === undefined || existing < childGen) {\n generations.set(childId, childGen);\n changed = true;\n }\n }\n }\n }\n\n for (const id of allIds) {\n if (!generations.has(id)) generations.set(id, 0);\n }\n}\n\n// ─── Step 3: Order nodes ───────────────────────────────────\n\ninterface OrderedGeneration {\n index: number;\n nodeIds: string[];\n}\n\nfunction orderNodesInGenerations(graph: LayoutGraph): OrderedGeneration[] {\n const genGroups = new Map<number, string[]>();\n for (const [id, gen] of graph.generations) {\n const grp = genGroups.get(gen) ?? [];\n grp.push(id);\n genGroups.set(gen, grp);\n }\n\n const genIndices = Array.from(genGroups.keys()).sort((a, b) => a - b);\n const result: OrderedGeneration[] = [];\n\n for (const genIdx of genIndices) {\n const nodeIds = genGroups.get(genIdx) ?? [];\n result.push({ index: genIdx, nodeIds: orderGeneration(nodeIds, graph) });\n }\n\n return result;\n}\n\nfunction orderGeneration(nodeIds: string[], graph: LayoutGraph): string[] {\n if (nodeIds.length <= 1) return [...nodeIds];\n\n const nodeSet = new Set(nodeIds);\n const placed = new Set<string>();\n const ordered: string[] = [];\n\n const fuInGen = graph.familyUnits.filter(\n (fu) => nodeSet.has(fu.partners[0]) || nodeSet.has(fu.partners[1])\n );\n\n for (const fu of fuInGen) {\n for (const p of fu.partners) {\n if (nodeSet.has(p) && !placed.has(p)) {\n ordered.push(p);\n placed.add(p);\n }\n }\n }\n\n for (const id of nodeIds) {\n if (!placed.has(id)) {\n ordered.push(id);\n placed.add(id);\n }\n }\n\n return ordered;\n}\n\n// ─── Step 4: Assign positions ──────────────────────────────\n\ninterface NodePosition {\n id: string;\n x: number;\n y: number;\n generation: number;\n}\n\nfunction assignPositions(\n orderedGens: OrderedGeneration[],\n graph: LayoutGraph,\n config: LayoutConfig\n): Map<string, NodePosition> {\n const positions = new Map<string, NodePosition>();\n const { nodeWidth, nodeSpacingX } = config;\n const half = nodeWidth / 2;\n const coupleGap = nodeWidth + nodeSpacingX * 0.6;\n const familyGap = nodeWidth + nodeSpacingX * 1.5;\n const genStepY = config.nodeHeight + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY;\n\n for (const gen of orderedGens) {\n const y = gen.index * genStepY + half;\n const segments = buildSegments(gen.nodeIds, graph);\n\n let xCursor = GEN_LABEL_MARGIN + half;\n for (let s = 0; s < segments.length; s++) {\n const seg = segments[s];\n if (s > 0) xCursor += familyGap;\n\n if (seg.type === \"couple\") {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n xCursor += coupleGap;\n positions.set(seg.ids[1], { id: seg.ids[1], x: xCursor, y, generation: gen.index });\n } else {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n }\n }\n }\n\n resolveOverlaps(positions, orderedGens, config);\n centerChildrenUnderParents(positions, graph, config);\n resolveOverlaps(positions, orderedGens, config);\n\n return positions;\n}\n\ninterface Segment {\n type: \"couple\" | \"single\";\n ids: string[];\n}\n\nfunction buildSegments(nodeIds: string[], graph: LayoutGraph): Segment[] {\n const nodeSet = new Set(nodeIds);\n const segments: Segment[] = [];\n const placed = new Set<string>();\n\n for (const id of nodeIds) {\n if (placed.has(id)) continue;\n\n const fu = graph.familyUnits.find(\n (f) =>\n (f.partners[0] === id || f.partners[1] === id) &&\n !placed.has(f.partners[0]) &&\n !placed.has(f.partners[1]) &&\n nodeSet.has(f.partners[0]) &&\n nodeSet.has(f.partners[1])\n );\n\n if (fu) {\n segments.push({ type: \"couple\", ids: [fu.partners[0], fu.partners[1]] });\n placed.add(fu.partners[0]);\n placed.add(fu.partners[1]);\n } else {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n }\n\n return segments;\n}\n\nfunction centerChildrenUnderParents(\n positions: Map<string, NodePosition>,\n graph: LayoutGraph,\n config: LayoutConfig\n): void {\n const coupleGap = config.nodeSpacingX + config.nodeWidth;\n\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n for (const p of fu.partners) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n\n for (let pass = 0; pass < 3; pass++) {\n for (const fu of graph.familyUnits) {\n if (fu.children.length === 0) continue;\n\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const parentMidX = (posA.x + posB.x) / 2;\n const childSpacing = config.nodeSpacingX + config.nodeWidth;\n\n const sortedChildren = [...fu.children].sort((a, b) => {\n const ia = graph.individuals.get(a);\n const ib = graph.individuals.get(b);\n return (ia?.birthYear ?? 9999) - (ib?.birthYear ?? 9999);\n });\n\n if (sortedChildren.length > 1) {\n // Calculate per-gap spacing: add room for married-in spouses\n const gaps: number[] = [];\n for (let j = 0; j < sortedChildren.length - 1; j++) {\n let gap = childSpacing;\n\n // If the RIGHT child has a spouse placed to their LEFT\n const nextChild = sortedChildren[j + 1];\n const nextFUs = personToFUs.get(nextChild) ?? [];\n for (const cfu of nextFUs) {\n const pid = cfu.partners[0] === nextChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(nextChild);\n const pInd = graph.individuals.get(pid);\n if (!(cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\"))) {\n gap += coupleGap;\n }\n }\n\n // If the LEFT child has a spouse placed to their RIGHT\n const currChild = sortedChildren[j];\n const currFUs = personToFUs.get(currChild) ?? [];\n for (const cfu of currFUs) {\n const pid = cfu.partners[0] === currChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(currChild);\n const pInd = graph.individuals.get(pid);\n if (cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\")) {\n gap += coupleGap;\n }\n }\n\n gaps.push(gap);\n }\n\n const totalWidth = gaps.reduce((s, g) => s + g, 0);\n const startX = parentMidX - totalWidth / 2;\n let cx = startX;\n for (let j = 0; j < sortedChildren.length; j++) {\n const pos = positions.get(sortedChildren[j]);\n if (pos) pos.x = cx;\n if (j < gaps.length) cx += gaps[j];\n }\n } else {\n const pos = positions.get(sortedChildren[0]);\n if (pos) pos.x = parentMidX;\n }\n\n for (const childId of fu.children) {\n const childPos = positions.get(childId);\n if (!childPos) continue;\n const childFUs = personToFUs.get(childId) ?? [];\n for (const childFU of childFUs) {\n const partnerId = childFU.partners[0] === childId ? childFU.partners[1] : childFU.partners[0];\n const partnerPos = positions.get(partnerId);\n if (!partnerPos) continue;\n const childInd = graph.individuals.get(childId);\n const partnerInd = graph.individuals.get(partnerId);\n if (childInd?.sex === \"male\" || (childInd?.sex !== \"female\" && partnerInd?.sex === \"female\")) {\n partnerPos.x = childPos.x + coupleGap;\n } else {\n partnerPos.x = childPos.x - coupleGap;\n }\n }\n }\n }\n }\n}\n\nfunction resolveOverlaps(\n positions: Map<string, NodePosition>,\n orderedGens: OrderedGeneration[],\n config: LayoutConfig\n): void {\n const minGap = config.nodeWidth + config.nodeSpacingX;\n\n for (const gen of orderedGens) {\n const genNodes = gen.nodeIds\n .map((id) => positions.get(id))\n .filter((p): p is NodePosition => p !== undefined);\n genNodes.sort((a, b) => a.x - b.x);\n\n for (let j = 1; j < genNodes.length; j++) {\n const gap = genNodes[j].x - genNodes[j - 1].x;\n if (gap < minGap) {\n const shift = minGap - gap;\n for (let k = j; k < genNodes.length; k++) genNodes[k].x += shift;\n }\n }\n }\n\n let minX = Infinity;\n for (const pos of positions.values()) {\n if (pos.x < minX) minX = pos.x;\n }\n const minAllowed = GEN_LABEL_MARGIN + config.nodeWidth / 2;\n if (minX < minAllowed) {\n const shift = minAllowed - minX;\n for (const pos of positions.values()) pos.x += shift;\n }\n}\n\n// ─── Step 5: Compute edges ─────────────────────────────────\n\nfunction computeEdges(\n graph: LayoutGraph,\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n const dropY_offset = config.nodeHeight / 2 + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY * 0.35;\n\n for (const fu of graph.familyUnits) {\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const leftPos = posA.x < posB.x ? posA : posB;\n const rightPos = posA.x < posB.x ? posB : posA;\n const leftId = posA.x < posB.x ? fu.partners[0] : fu.partners[1];\n const rightId = posA.x < posB.x ? fu.partners[1] : fu.partners[0];\n\n const coupleRel: Relationship = { type: fu.relationship, from: leftId, to: rightId };\n const couplePath = `M ${leftPos.x + half} ${leftPos.y} L ${rightPos.x - half} ${rightPos.y}`;\n edges.push({ from: leftId, to: rightId, relationship: coupleRel, path: couplePath });\n\n // Consanguinity: add second parallel line\n if (fu.relationship === \"consanguineous\") {\n const offset = 3;\n const consPath = `M ${leftPos.x + half} ${leftPos.y + offset} L ${rightPos.x - half} ${rightPos.y + offset}`;\n edges.push({\n from: leftId, to: rightId,\n relationship: { type: \"consanguineous\", from: leftId, to: rightId, label: \"_double\" },\n path: consPath,\n });\n }\n\n if (fu.children.length > 0) {\n const midX = (posA.x + posB.x) / 2;\n const coupleY = posA.y;\n const dropY = coupleY + dropY_offset;\n\n const childPositions = fu.children\n .map((cid) => ({ id: cid, pos: positions.get(cid) }))\n .filter((c): c is { id: string; pos: NodePosition } => c.pos !== undefined);\n\n if (childPositions.length === 0) continue;\n childPositions.sort((a, b) => a.pos.x - b.pos.x);\n\n const leftX = childPositions[0].pos.x;\n const rightX = childPositions[childPositions.length - 1].pos.x;\n\n edges.push({\n from: fu.partners[0], to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_drop\" },\n path: `M ${midX} ${coupleY} L ${midX} ${dropY}`,\n });\n\n if (childPositions.length > 1) {\n edges.push({\n from: fu.partners[0], to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_sibship\" },\n path: `M ${leftX} ${dropY} L ${rightX} ${dropY}`,\n });\n }\n\n for (const child of childPositions) {\n const childTop = child.pos.y - config.nodeHeight / 2;\n const childPath = childPositions.length === 1\n ? `M ${midX} ${coupleY} L ${midX} ${childTop}`\n : `M ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n\n edges.push({\n from: fu.id, to: child.id,\n relationship: { type: \"parent-child\", from: fu.id, to: child.id },\n path: childPath,\n });\n }\n }\n }\n\n return edges;\n}\n\n// ─── Step 6: Package result ─────────────────────────────────\n\nfunction packageResult(\n positions: Map<string, NodePosition>,\n edges: LayoutEdge[],\n graph: LayoutGraph,\n config: LayoutConfig\n): LayoutResult {\n const padding = 40;\n const nodes: LayoutNode[] = [];\n\n for (const [id, pos] of positions) {\n const ind = graph.individuals.get(id);\n if (!ind) continue;\n nodes.push({\n id,\n x: pos.x - config.nodeWidth / 2 + padding,\n y: pos.y - config.nodeHeight / 2 + padding,\n width: config.nodeWidth,\n height: config.nodeHeight,\n generation: pos.generation,\n individual: ind,\n });\n }\n\n const shiftedEdges = edges.map((e) => ({\n ...e,\n path: shiftPath(e.path, padding, padding),\n }));\n\n let maxX = 0;\n let maxY = 0;\n let minX = Infinity;\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const labelText = node.individual.label || node.individual.id;\n const labelHalfWidth = labelText.length * 3.8;\n const right = Math.max(node.x + node.width, cx + labelHalfWidth);\n const left = Math.min(node.x, cx - labelHalfWidth);\n const bottom = node.y + node.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n if (left < minX) minX = left;\n }\n\n if (minX < 0) {\n const shift = -minX;\n for (const node of nodes) {\n node.x += shift;\n }\n for (const edge of shiftedEdges) {\n edge.path = shiftPath(edge.path, shift, 0);\n }\n maxX += shift;\n }\n\n return {\n width: maxX + padding,\n height: maxY + padding + LABEL_GAP + LABEL_HEIGHT + 10,\n nodes,\n edges: shiftedEdges,\n };\n}\n\nfunction shiftPath(pathData: string, dx: number, dy: number): string {\n return pathData.replace(\n /([ML])\\s*([\\d.-]+)\\s+([\\d.-]+)/g,\n (_match, cmd: string, xStr: string, yStr: string) => {\n const x = parseFloat(xStr) + dx;\n const y = parseFloat(yStr) + dy;\n return `${cmd} ${x} ${y}`;\n }\n );\n}\n","/**\n * Auto-derive a LegendSpec from a pedigree AST.\n *\n * Pedigree-specific encodings:\n * 1. Trait fills (the legacy `legend: trait_id = \"Label\" (fill: ...)`\n * directive) — merged into the unified system as a TRAITS section.\n * 2. Symbols (carriers, deceased, proband, etc.) — only when used.\n *\n * The standard square=Male / circle=Female convention is universal McGoldrick\n * and is excluded by default (matches genogram behavior).\n */\n\nimport type {\n DiagramAST,\n GeneticStatus,\n LegendItem,\n LegendSection,\n LegendSpec,\n Sex,\n} from \"../../core/types\";\nimport type { ResolvedTheme, PersonTokens } from \"../../core/theme\";\n\nconst SECTIONS: LegendSection[] = [\n { id: \"status\", title: \"Genetic status\" },\n { id: \"traits\", title: \"Traits\" },\n { id: \"symbols\", title: \"Symbols\" },\n];\n\nconst OBVIOUS_SEX: ReadonlySet<Sex> = new Set<Sex>([\"male\", \"female\"]);\n\nexport function buildPedigreeLegend(\n ast: DiagramAST,\n theme: ResolvedTheme<PersonTokens>\n): LegendSpec {\n const items: LegendItem[] = [];\n\n // Genetic status: standard pedigree-chart encoding (unaffected omitted —\n // it's the universal default).\n const statusUsed = new Set<GeneticStatus>();\n for (const ind of ast.individuals) {\n if (ind.geneticStatus && ind.geneticStatus !== \"unaffected\") {\n statusUsed.add(ind.geneticStatus);\n }\n }\n const statusOrder: GeneticStatus[] = [\n \"affected\",\n \"carrier\",\n \"carrier-x\",\n \"obligate-carrier\",\n \"presymptomatic\",\n ];\n for (const s of statusOrder) {\n if (!statusUsed.has(s)) continue;\n items.push(geneticStatusItem(s, theme));\n }\n\n // Legacy trait legend entries (when DSL uses `legend: cf = \"Cystic Fibrosis\"`).\n if (ast.legend && ast.legend.length > 0) {\n for (const entry of ast.legend) {\n const isFull = !entry.fill || entry.fill === \"full\";\n items.push({\n key: entry.id,\n label: entry.label,\n kind: isFull ? \"fill\" : \"fill-pattern\",\n color: entry.color ?? theme.conditionFill,\n shape: isFull ? undefined : entry.fill,\n section: \"traits\",\n });\n }\n }\n\n // Non-obvious sex shapes (unknown / nonbinary / intersex).\n const sexUsed = new Set<Sex>();\n for (const ind of ast.individuals) sexUsed.add(ind.sex);\n const sexOrder: Sex[] = [\"unknown\", \"other\", \"nonbinary\", \"intersex\"];\n for (const s of sexOrder) {\n if (!sexUsed.has(s) || OBVIOUS_SEX.has(s)) continue;\n items.push({\n key: `sex.${s}`,\n label: sexLabel(s),\n kind: \"shape\",\n shape: \"diamond\",\n fill: theme.unknownFill,\n color: theme.stroke,\n section: \"symbols\",\n });\n }\n\n // Deceased\n const hasDeceased = ast.individuals.some((i) => i.status === \"deceased\");\n if (hasDeceased) {\n items.push({\n key: \"status.deceased\",\n label: \"Deceased\",\n kind: \"marker\",\n marker: \"slash\",\n color: theme.deceasedMark,\n section: \"symbols\",\n });\n }\n\n // Proband / consultand markers\n const hasProband = ast.individuals.some((i) => i.markers?.includes(\"proband\"));\n if (hasProband) {\n items.push({\n key: \"marker.proband\",\n label: \"Proband (P) — first affected case identified\",\n kind: \"marker\",\n marker: \"P\",\n section: \"symbols\",\n });\n }\n const hasConsultand = ast.individuals.some((i) => i.markers?.includes(\"consultand\"));\n if (hasConsultand) {\n items.push({\n key: \"marker.consultand\",\n label: \"Consultand (C)\",\n kind: \"marker\",\n marker: \"C\",\n section: \"symbols\",\n });\n }\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\nfunction geneticStatusItem(\n s: GeneticStatus,\n theme: ResolvedTheme<PersonTokens>\n): LegendItem {\n switch (s) {\n case \"affected\":\n return {\n key: `status.${s}`,\n label: \"Affected\",\n kind: \"fill\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"carrier\":\n return {\n key: `status.${s}`,\n label: \"Carrier\",\n kind: \"fill-pattern\",\n color: theme.conditionFill,\n shape: \"half-left\",\n section: \"status\",\n };\n case \"carrier-x\":\n return {\n key: `status.${s}`,\n label: \"X-linked carrier\",\n kind: \"marker\",\n marker: \"dot\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"obligate-carrier\":\n return {\n key: `status.${s}`,\n label: \"Obligate carrier\",\n kind: \"marker\",\n marker: \"dot\",\n color: theme.conditionFill,\n section: \"status\",\n };\n case \"presymptomatic\":\n return {\n key: `status.${s}`,\n label: \"Presymptomatic\",\n kind: \"line\",\n color: theme.conditionFill,\n pattern: \"solid\",\n strokeWidth: 2,\n section: \"status\",\n };\n default:\n return {\n key: `status.${s}`,\n label: humanize(s),\n kind: \"fill\",\n color: theme.conditionFill,\n section: \"status\",\n };\n }\n}\n\nfunction sexLabel(s: Sex): string {\n switch (s) {\n case \"unknown\": return \"Unknown sex\";\n case \"other\": return \"Other\";\n case \"nonbinary\": return \"Non-binary\";\n case \"intersex\": return \"Intersex\";\n default: return s;\n }\n}\n\nfunction humanize(s: string): string {\n return s.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type {\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n RenderConfig,\n Individual,\n DiagramAST,\n} from \"../../core/types\";\nimport {\n svgRoot,\n el,\n group,\n rect,\n circle,\n polygon,\n line,\n text,\n title,\n desc,\n defs,\n path,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolvePersonTheme, STROKE_WIDTH, type ResolvedTheme, type PersonTokens } from \"../../core/theme\";\nimport { applyLegendOverrides, renderLegend as renderLegendCore } from \"../../core/legend\";\nimport { buildPedigreeLegend } from \"./legend\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderPedigree(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const t = resolvePersonTheme(config.theme);\n const defsStr = buildDefs(layout.nodes, t);\n const styleStr = buildStyles(config, t);\n\n const genGroups = groupByGeneration(layout.nodes);\n const edgeLayers = renderEdges(layout.edges);\n const nodeLayers = renderNodes(genGroups);\n const labelLayer = renderLabels(layout.nodes, genGroups, config);\n const genLabels = renderGenerationLabels(genGroups, config);\n\n const nodeCount = layout.nodes.length;\n const genCount = genGroups.size;\n\n const diagramTitle = ast?.metadata?.title ?? \"Pedigree\";\n\n const layers: string[] = [\n title(diagramTitle),\n desc(`Pedigree chart with ${nodeCount} individuals across ${genCount} generations`),\n defsStr,\n styleStr,\n ];\n\n // Defer chart-content push until legend bbox is known so we can center.\n const chartContent = [genLabels, edgeLayers, ...nodeLayers, labelLayer];\n\n let finalWidth = layout.width;\n let finalHeight = layout.height;\n let legendSvg = \"\";\n\n if (ast) {\n const autoSpec = buildPedigreeLegend(ast, t);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg, bbox: lb } = renderLegendCore(\n finalSpec,\n {\n canvasWidth: layout.width,\n canvasHeight: layout.height,\n padding: 16,\n },\n t,\n { fontFamily: config.fontFamily, fontSize: config.fontSize }\n );\n if (svg) {\n legendSvg = svg;\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n }\n\n const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);\n layers.push(\n group(\n { transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : undefined },\n chartContent\n )\n );\n if (legendSvg) layers.push(legendSvg);\n\n return svgRoot(\n {\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n class: \"schematex-diagram schematex-pedigree\",\n width: finalWidth,\n height: finalHeight,\n },\n layers\n );\n}\n\n// ─── Defs ──────────────────────────────────────────────────\n\nfunction buildDefs(nodes: LayoutNode[], t: ResolvedTheme<PersonTokens>): string {\n const children: string[] = [];\n const needs = new Set<string>();\n\n for (const n of nodes) {\n const gs = n.individual.geneticStatus;\n if (gs) needs.add(gs);\n }\n\n if (needs.has(\"carrier\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-pedigree-clip-carrier-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-pedigree-clip-carrier-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n // Proband arrow marker\n children.push(\n el(\"marker\", {\n id: \"schematex-pedigree-proband-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"0\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto-start-reverse\",\n }, [\n path({ d: \"M 0 0 L 10 5 L 0 10 z\", fill: t.stroke }),\n ])\n );\n\n return defs(children);\n}\n\n// ─── Styles ────────────────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig, t: ResolvedTheme<PersonTokens>): string {\n const css = `\n.schematex-pedigree {${cssCustomProperties(t)}\n}\n.schematex-pedigree-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-pedigree-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-pedigree-gen-label { font-family: ${config.fontFamily}; font-size: 14px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-pedigree-edge { stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; stroke-linejoin: round; }\n.schematex-pedigree-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-pedigree-affected-fill { fill: ${t.conditionFill}; }\n.schematex-pedigree-carrier-fill { fill: ${t.conditionFill}; }\n.schematex-pedigree-carrier-x-dot { fill: ${t.conditionFill}; }\n.schematex-pedigree-presymptomatic-mark { stroke: ${t.conditionFill}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-pedigree-proband-arrow-line { stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; marker-end: url(#schematex-pedigree-proband-arrow); }\n.schematex-pedigree-proband-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.stroke}; }\n.schematex-pedigree-loss-shape { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-pedigree-tab-slash { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-pedigree-status-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.text}; }\n.schematex-pedigree-legend { font-family: ${config.fontFamily}; font-size: 11px; fill: ${t.text}; }\n.schematex-pedigree-legend-box { fill: ${t.fill}; stroke: ${t.neutral}; stroke-width: 1; }\n`;\n return el(\"style\", {}, css);\n}\n\n// ─── Edges ─────────────────────────────────────────────────\n\nfunction renderEdges(edges: LayoutEdge[]): string {\n const children: string[] = [];\n\n for (const edge of edges) {\n const relType = edge.relationship.type;\n const cssClass = `schematex-pedigree-edge schematex-pedigree-edge-${relType}`;\n\n const elements: string[] = [\n el(\"path\", { d: edge.path, class: \"schematex-pedigree-edge-path\" }),\n ];\n\n if (relType === \"separated\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n line({\n x1: mid.x - 4, y1: mid.y - 6,\n x2: mid.x + 4, y2: mid.y + 6,\n class: \"schematex-pedigree-edge\",\n })\n );\n }\n }\n\n children.push(\n group({ class: cssClass, \"data-from\": edge.from, \"data-to\": edge.to }, elements)\n );\n }\n\n return group({ class: \"schematex-pedigree-edges\" }, children);\n}\n\nfunction pathMidpoint(pathData: string): { x: number; y: number } | null {\n const coords = pathData.match(/[\\d.-]+/g);\n if (!coords || coords.length < 4) return null;\n return {\n x: (parseFloat(coords[0]) + parseFloat(coords[2])) / 2,\n y: (parseFloat(coords[1]) + parseFloat(coords[3])) / 2,\n };\n}\n\n// ─── Nodes ─────────────────────────────────────────────────\n\nfunction groupByGeneration(nodes: LayoutNode[]): Map<number, LayoutNode[]> {\n const groups = new Map<number, LayoutNode[]>();\n for (const node of nodes) {\n const grp = groups.get(node.generation) ?? [];\n grp.push(node);\n groups.set(node.generation, grp);\n }\n return groups;\n}\n\nfunction renderNodes(genGroups: Map<number, LayoutNode[]>): string[] {\n const layers: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n const nodeElements: string[] = [];\n\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n nodeElements.push(renderPedigreeSymbol(node.individual, cx, cy, node.width));\n }\n\n layers.push(\n group(\n { class: `schematex-pedigree-generation schematex-pedigree-generation-${genIdx}`, \"data-generation\": genIdx },\n nodeElements\n )\n );\n }\n\n return layers;\n}\n\nfunction renderPedigreeSymbol(\n ind: Individual,\n x: number,\n y: number,\n size: number\n): string {\n const half = size / 2;\n const classes = [\"schematex-pedigree-node\", `schematex-pedigree-${ind.sex === \"other\" ? \"unknown\" : ind.sex}`];\n if (ind.status === \"deceased\") classes.push(\"schematex-pedigree-deceased\");\n if (ind.geneticStatus) classes.push(`schematex-pedigree-${ind.geneticStatus}`);\n\n const titleText = formatTitle(ind);\n const children: string[] = [title(titleText)];\n\n // NSGC pregnancy-loss: filled point-down triangle (~60% size). TAB adds slash; Ectopic adds \"ECT\".\n const pregLoss = ind.status === \"sab\" || ind.status === \"tab\" || ind.status === \"ectopic\";\n if (pregLoss) {\n classes.push(`schematex-pedigree-${ind.status}`);\n const t = half * 0.6;\n children.push(\n polygon({\n points: `${-t},${-t} ${t},${-t} 0,${t}`,\n class: `schematex-pedigree-loss-shape schematex-pedigree-${ind.status}-shape`,\n })\n );\n if (ind.status === \"tab\") {\n children.push(\n line({\n x1: -t * 1.1, y1: t * 1.1, x2: t * 1.1, y2: -t * 1.1,\n class: \"schematex-pedigree-tab-slash\",\n })\n );\n }\n if (ind.status === \"ectopic\") {\n children.push(\n text(\n { x: 0, y: t + 14, class: \"schematex-pedigree-status-label\", \"text-anchor\": \"middle\" },\n \"ECT\"\n )\n );\n }\n // Skip regular shape + genetic-status fills — not applicable.\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": ind.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n }\n\n // Base shape\n children.push(baseShape(ind.sex, half));\n\n // Stillborn: keep the sex-based shape, add an \"SB\" label below.\n if (ind.status === \"stillborn\") {\n classes.push(\"schematex-pedigree-stillborn\");\n children.push(\n text(\n { x: 0, y: half + 14, class: \"schematex-pedigree-status-label\", \"text-anchor\": \"middle\" },\n \"SB\"\n )\n );\n }\n\n // Genetic status fills\n const gs = ind.geneticStatus;\n if (gs === \"affected\") {\n children.push(affectedFill(ind.sex, half));\n } else if (gs === \"carrier\") {\n children.push(carrierFill(ind.sex, half));\n } else if (gs === \"carrier-x\" || gs === \"obligate-carrier\") {\n children.push(carrierDot(half));\n }\n\n // Presymptomatic vertical line\n if (gs === \"presymptomatic\") {\n children.push(\n line({ x1: 0, y1: -half, x2: 0, y2: half, class: \"schematex-pedigree-presymptomatic-mark\" })\n );\n }\n\n // Deceased: diagonal slash (pedigree uses / not X)\n if (ind.status === \"deceased\") {\n const ext = ind.sex === \"female\" ? half * 0.707 : half;\n children.push(\n line({ x1: ext, y1: -ext, x2: -ext, y2: ext, class: \"schematex-pedigree-deceased-mark\" })\n );\n }\n\n // Proband arrow\n if (ind.markers?.includes(\"proband\")) {\n const arrowLen = 20;\n children.push(\n line({\n x1: -half - arrowLen, y1: half + arrowLen,\n x2: -half - 2, y2: half + 2,\n class: \"schematex-pedigree-proband-arrow-line\",\n }),\n text(\n { x: -half - arrowLen - 4, y: half + arrowLen + 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"end\" },\n \"P\"\n )\n );\n }\n\n // Consultand arrow\n if (ind.markers?.includes(\"consultand\")) {\n const arrowLen = 20;\n children.push(\n line({\n x1: -half - arrowLen, y1: half + arrowLen,\n x2: -half - 2, y2: half + 2,\n class: \"schematex-pedigree-proband-arrow-line\",\n }),\n text(\n { x: -half - arrowLen - 4, y: half + arrowLen + 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"end\" },\n \"C\"\n )\n );\n }\n\n // Evaluated marker\n if (ind.markers?.includes(\"evaluated\")) {\n children.push(\n text(\n { x: 0, y: -half - 4, class: \"schematex-pedigree-proband-label\", \"text-anchor\": \"middle\" },\n \"E\"\n )\n );\n }\n\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": ind.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n}\n\nfunction baseShape(sex: Individual[\"sex\"], half: number): string {\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, class: \"schematex-pedigree-shape\" });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, class: \"schematex-pedigree-shape\" });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, class: \"schematex-pedigree-shape\" });\n }\n}\n\nfunction affectedFill(sex: Individual[\"sex\"], half: number): string {\n const attrs = { class: \"schematex-pedigree-affected-fill\" };\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });\n }\n}\n\nfunction carrierFill(sex: Individual[\"sex\"], half: number): string {\n const clipSuffix = sex === \"female\" ? \"circle\" : \"rect\";\n const attrs = {\n class: \"schematex-pedigree-carrier-fill\",\n \"clip-path\": `url(#schematex-pedigree-clip-carrier-${clipSuffix})`,\n };\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n default:\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, ...attrs });\n }\n}\n\nfunction carrierDot(half: number): string {\n return circle({ cx: 0, cy: 0, r: half * 0.15, class: \"schematex-pedigree-carrier-x-dot\" });\n}\n\nfunction formatTitle(ind: Individual): string {\n const name = ind.label.charAt(0).toUpperCase() + ind.label.slice(1);\n if (ind.geneticStatus && ind.geneticStatus !== \"unaffected\") {\n return `${name} (${ind.geneticStatus})`;\n }\n return name;\n}\n\n// ─── Labels ────────────────────────────────────────────────\n\nfunction renderLabels(\n nodes: LayoutNode[],\n genGroups: Map<number, LayoutNode[]>,\n config: RenderConfig\n): string {\n const labels: string[] = [];\n\n // Build per-generation numbering\n const genNumbering = new Map<string, string>();\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n for (const genIdx of sortedGens) {\n const genNodes = genGroups.get(genIdx) ?? [];\n const sorted = [...genNodes].sort((a, b) => a.x - b.x);\n const romanNum = toRoman(genIdx + 1);\n for (let i = 0; i < sorted.length; i++) {\n genNumbering.set(sorted[i].id, `${romanNum}-${i + 1}`);\n }\n }\n\n for (const node of nodes) {\n const ind = node.individual;\n const cx = node.x + node.width / 2;\n const labelY = node.y + node.height + 6 + config.fontSize;\n\n const pedigreeId = genNumbering.get(ind.id) ?? ind.id;\n const displayLabel = ind.label !== ind.id ? ind.label : pedigreeId;\n\n labels.push(\n text(\n { x: cx, y: labelY, class: \"schematex-pedigree-label\", \"data-individual-id\": ind.id },\n displayLabel\n )\n );\n }\n\n return group({ class: \"schematex-pedigree-labels\" }, labels);\n}\n\n// ─── Generation Labels ─────────────────────────────────────\n\nfunction renderGenerationLabels(\n genGroups: Map<number, LayoutNode[]>,\n _config: RenderConfig\n): string {\n const labels: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n if (nodes.length === 0) continue;\n\n const midY = nodes[0].y + nodes[0].height / 2;\n const roman = toRoman(genIdx + 1);\n\n labels.push(\n text(\n { x: 25, y: midY + 5, class: \"schematex-pedigree-gen-label\" },\n roman\n )\n );\n }\n\n return group({ class: \"schematex-pedigree-generation-labels\" }, labels);\n}\n\n// ─── Legend ────────────────────────────────────────────────\n// (moved to ./legend.ts; rendered via core/legend)\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction toRoman(n: number): string {\n const vals = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\n const syms = [\"M\", \"CM\", \"D\", \"CD\", \"C\", \"XC\", \"L\", \"XL\", \"X\", \"IX\", \"V\", \"IV\", \"I\"];\n let result = \"\";\n for (let i = 0; i < vals.length; i++) {\n while (n >= vals[i]) {\n result += syms[i];\n n -= vals[i];\n }\n }\n return result;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parsePedigree, PedigreeParseError } from \"./parser\";\nimport { layoutPedigree } from \"./layout\";\nimport { renderPedigree } from \"./renderer\";\n\nexport const pedigree: DiagramPlugin = {\n type: \"pedigree\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"pedigree\" || firstLine.startsWith(\"pedigree \");\n },\n\n parse: parsePedigree,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parsePedigree(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutPedigree(ast, layoutConfig);\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: config?.fontSize ?? 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return renderPedigree(layout, renderConfig, ast);\n },\n};\n\nexport { parsePedigree, PedigreeParseError, layoutPedigree, renderPedigree };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveIndustrialTheme } from './chunk-2VNMKOUO.js';
|
|
2
|
-
import { title, desc, el, defs, text, path, group, svgRoot, line } from './chunk-
|
|
2
|
+
import { title, desc, el, defs, text, path, group, svgRoot, line } from './chunk-SYYBKDL7.js';
|
|
3
3
|
|
|
4
4
|
// src/diagrams/sld/parser.ts
|
|
5
5
|
var SLDParseError = class extends Error {
|
|
@@ -1094,7 +1094,7 @@ function buildCss(t) {
|
|
|
1094
1094
|
const bandOdd = isDark ? BAND_ODD_DARK : BAND_ODD_LIGHT;
|
|
1095
1095
|
const bandEven = isDark ? BAND_EVEN_DARK : BAND_EVEN_LIGHT;
|
|
1096
1096
|
return `
|
|
1097
|
-
.lt-sld {
|
|
1097
|
+
.lt-sld { font-family: system-ui, -apple-system, sans-serif; }
|
|
1098
1098
|
.lt-sld-stroke { stroke: ${t.stroke}; stroke-width: 1.8; fill: none; }
|
|
1099
1099
|
.lt-sld-stroke-thick { stroke: ${t.stroke}; stroke-width: 2.4; fill: none; stroke-linecap: round; }
|
|
1100
1100
|
.lt-sld-fill { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }
|
|
@@ -1324,5 +1324,5 @@ var sld = {
|
|
|
1324
1324
|
};
|
|
1325
1325
|
|
|
1326
1326
|
export { layoutSLD, parseSLDDSL, renderSLD, sld };
|
|
1327
|
-
//# sourceMappingURL=chunk-
|
|
1328
|
-
//# sourceMappingURL=chunk-
|
|
1327
|
+
//# sourceMappingURL=chunk-PWI4NFYR.js.map
|
|
1328
|
+
//# sourceMappingURL=chunk-PWI4NFYR.js.map
|