base-paint 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/charts.d.ts +62 -0
  2. package/dist/charts.d.ts.map +1 -0
  3. package/dist/charts.js +1677 -0
  4. package/dist/charts.js.map +1 -0
  5. package/dist/contract.d.ts.map +1 -1
  6. package/dist/contract.js +7 -1
  7. package/dist/contract.js.map +1 -1
  8. package/dist/controls.d.ts +114 -0
  9. package/dist/controls.d.ts.map +1 -0
  10. package/dist/controls.js +724 -0
  11. package/dist/controls.js.map +1 -0
  12. package/dist/help.d.ts +24 -0
  13. package/dist/help.d.ts.map +1 -0
  14. package/dist/help.js +604 -0
  15. package/dist/help.js.map +1 -0
  16. package/dist/index.d.ts +21 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +21 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/spec/charts.d.ts +222 -0
  21. package/dist/spec/charts.d.ts.map +1 -0
  22. package/dist/spec/charts.js +35 -0
  23. package/dist/spec/charts.js.map +1 -0
  24. package/dist/spec/controls.d.ts +329 -0
  25. package/dist/spec/controls.d.ts.map +1 -0
  26. package/dist/spec/controls.js +119 -0
  27. package/dist/spec/controls.js.map +1 -0
  28. package/dist/spec/help.d.ts +353 -0
  29. package/dist/spec/help.d.ts.map +1 -0
  30. package/dist/spec/help.js +167 -0
  31. package/dist/spec/help.js.map +1 -0
  32. package/dist/spec/index.d.ts +40 -0
  33. package/dist/spec/index.d.ts.map +1 -0
  34. package/dist/spec/index.js +164 -0
  35. package/dist/spec/index.js.map +1 -0
  36. package/dist/spec/style.d.ts +46 -0
  37. package/dist/spec/style.d.ts.map +1 -0
  38. package/dist/spec/style.js +39 -0
  39. package/dist/spec/style.js.map +1 -0
  40. package/dist/spec/template.d.ts +363 -0
  41. package/dist/spec/template.d.ts.map +1 -0
  42. package/dist/spec/template.js +252 -0
  43. package/dist/spec/template.js.map +1 -0
  44. package/dist/spec/text.d.ts +157 -0
  45. package/dist/spec/text.d.ts.map +1 -0
  46. package/dist/spec/text.js +83 -0
  47. package/dist/spec/text.js.map +1 -0
  48. package/dist/style.d.ts +19 -0
  49. package/dist/style.d.ts.map +1 -1
  50. package/dist/style.js +923 -0
  51. package/dist/style.js.map +1 -1
  52. package/dist/template.d.ts +27 -0
  53. package/dist/template.d.ts.map +1 -0
  54. package/dist/template.js +362 -0
  55. package/dist/template.js.map +1 -0
  56. package/dist/text.d.ts +19 -0
  57. package/dist/text.d.ts.map +1 -0
  58. package/dist/text.js +448 -0
  59. package/dist/text.js.map +1 -0
  60. package/package.json +2 -2
@@ -0,0 +1,157 @@
1
+ /** base-paint/spec/text:复制文本序列化契约(#77 冻结面)。
2
+ *
3
+ * B2/AC-5:snapshot 结构化接口不移植,输入对齐 envelope `shape`;
4
+ * `buildDataText`/`buildLogText` 保留(复制文本来源),并补全旧侧未定义的
5
+ * `format` 语义(text/json/csv 的转义与空值口径,见文档 §3.4)。
6
+ *
7
+ * 依赖红线:只许 `import type`(AC-13)。
8
+ */
9
+ import type { Envelope } from 'base-link-core';
10
+ export declare const COPY_FORMATS: readonly ["text", "json", "csv"];
11
+ export type CopyFormat = (typeof COPY_FORMATS)[number];
12
+ /** 可序列化形状:envelope 六形状去掉 `fallback`(降级载荷不进复制文本)。
13
+ * 成员**顺序无语义**(不决定 CSV 行序/遍历序),只有成员集有效。 */
14
+ export declare const SERIALIZABLE_SHAPES: readonly ["stat", "list", "detail", "analysis", "receipt"];
15
+ export type SerializableShape = (typeof SERIALIZABLE_SHAPES)[number];
16
+ export type SerializableEnvelope = Envelope<SerializableShape>;
17
+ /** 6 段日志段序(逐字对齐旧 §6.1:①场景标识②AI思考链③数据结构④调用链⑤时间戳版本⑥异常)。 */
18
+ export declare const LOG_SECTIONS: readonly ["scene", "thinking", "dataStructure", "callChain", "timestampVersion", "exception"];
19
+ export type LogSection = (typeof LOG_SECTIONS)[number];
20
+ export declare const LOG_SECTION_TITLES: Readonly<{
21
+ readonly scene: "场景标识";
22
+ readonly thinking: "AI 思考链";
23
+ readonly dataStructure: "数据结构";
24
+ readonly callChain: "调用链";
25
+ readonly timestampVersion: "时间戳版本";
26
+ readonly exception: "异常";
27
+ }>;
28
+ /** 旧 `data.copy_log` 的五字段(新架构 camelCase,由技能包显式传入)。 */
29
+ export interface CopyLogFields {
30
+ readonly thinking?: string;
31
+ readonly dataStructure?: string;
32
+ readonly callChain?: string;
33
+ readonly timestamp?: string;
34
+ readonly exception?: string;
35
+ }
36
+ /** 6 段日志 → 数据源(FX-1③):`scene` 由 **envelope 派生**(`skill`/`key`/`shape`),
37
+ * 其余 5 段取 `CopyLogFields`;`timestampVersion` ← `copyLog.timestamp`(不是 `timestampVersion` 字段)。 */
38
+ export declare const LOG_SECTION_SOURCES: Readonly<{
39
+ readonly scene: "envelope";
40
+ readonly thinking: "copyLog.thinking";
41
+ readonly dataStructure: "copyLog.dataStructure";
42
+ readonly callChain: "copyLog.callChain";
43
+ readonly timestampVersion: "copyLog.timestamp";
44
+ readonly exception: "copyLog.exception";
45
+ }>;
46
+ export interface DataTextInput {
47
+ readonly envelope: SerializableEnvelope;
48
+ /** 缺省 `text`。 */
49
+ readonly format?: CopyFormat;
50
+ /** 覆盖输出头;缺省 `TEXT_HEADER_TEMPLATE`(`'【{skill} · {key}】'`)。 */
51
+ readonly title?: string;
52
+ /** 时间行;缺省不输出该行。 */
53
+ readonly occurredAt?: string;
54
+ }
55
+ export interface LogTextInput {
56
+ readonly envelope: SerializableEnvelope;
57
+ /** 缺省 `text`。 */
58
+ readonly format?: CopyFormat;
59
+ readonly copyLog?: CopyLogFields;
60
+ }
61
+ /** 日志缺省占位(FX-1④):**只作用于 `text` 口径**;`json` 写 `null`,`csv` 写空串。 */
62
+ export declare const LOG_UNKNOWN_PLACEHOLDER = "(\u672A\u77E5)";
63
+ /** `text` 口径的数据空值占位:**只作用于 `text` 口径**;`json` 保留 `null`,`csv` 写空串。 */
64
+ export declare const TEXT_EMPTY_PLACEHOLDER = "\u672A\u586B\u5199";
65
+ export declare const TEXT_SENSITIVE_MASK = "****";
66
+ /** text 口径输出头(`{skill}`/`{key}` 为替换位,非 HTML 占位符)。 */
67
+ export declare const TEXT_HEADER_TEMPLATE = "\u3010{skill} \u00B7 {key}\u3011";
68
+ /** **敏感行判定口径(FX-23,机读)**:投影行(`metrics`/`item` 的值、`items` 的元素)取值为
69
+ * `{ text: string, sensitive: true }` 形态时判为**敏感行**——该形态的**字段名**与旧侧 `_rowText` 一致
70
+ * (`base.js:218-221`:`:219` 函数、`:221` 合并掩码行),但**判定语义不同**(FX-30):
71
+ * 旧侧是真值判定(`if (r.sensitive)`),本契约只认**字面 `true`**(`flagValue`)。
72
+ *
73
+ * - 判定只看源值的 `flagField` 是否为字面 `flagValue`(`true`),**不看文本内容**;`text` 字段是原文。
74
+ * - `EnvelopeDataByShape` 不含该形态 → 它是 **text 层的行值包装**(`data.metrics`/`data.item` 的值、
75
+ * `data.items` 的元素),**不改变** envelope 契约,也不进 json 键名(json 口径该键值写 `mask`)。
76
+ * - 三种 format 一律输出 `mask`(= `TEXT_SENSITIVE_MASK`);`text` 口径在该行之后**紧跟一行**
77
+ * `textNotice`。
78
+ * - **与旧侧的偏离(显式声明)**:旧侧把掩码与提示合成一行 `'****(敏感字段已脱敏)'`(`base.js:221`);
79
+ * 新契约拆成「掩码行 + 提示行」,理由是掩码值须能被 `TEXT_SENSITIVE_MASK` 逐值断言、
80
+ * 且 `json`/`csv` 口径下不得夹中文提示(json 值必须是纯掩码字符串、csv 单元格同)。语义等价:原文一律不出现。
81
+ */
82
+ export declare const SENSITIVE_ROW_RULE: Readonly<{
83
+ readonly textField: "text";
84
+ readonly flagField: "sensitive";
85
+ readonly flagValue: true;
86
+ readonly mask: "****";
87
+ readonly textNotice: "(敏感字段已脱敏)";
88
+ }>;
89
+ /** 逐 shape 投影规格(FX-1①):envelope `data` → 复制文本结构。 */
90
+ export interface DataProjectionSpec {
91
+ /** 标题行(`text` 口径输出头;`json`/`csv` 无输出头)。 */
92
+ readonly header: string;
93
+ /** 主体行来源:`data` 上的字段名(`stat` 的 metrics 逐键展开、`list` 的 items 逐项展开)。 */
94
+ readonly body: string;
95
+ /** 收尾行来源:`data` 上的字段名;无收尾行为 null。 */
96
+ readonly tail: string | null;
97
+ /** `csv` 口径下这些行写入 `section` 列的分组名(行序 = body 行 → tail 行)。 */
98
+ readonly csvSections: readonly string[];
99
+ }
100
+ /** 逐 shape 投影表(FX-1①;数据形态对齐 `EnvelopeDataByShape`):
101
+ * `stat`→metrics 键值行;`list`→逐项行 + `total` 收尾;`detail`→item 字段行;
102
+ * `receipt`→状态行 + `message` 行;`analysis`→`summary` 文本行。 */
103
+ export declare const DATA_TEXT_PROJECTIONS: Readonly<{
104
+ readonly stat: {
105
+ readonly header: "【{skill} · {key}】";
106
+ readonly body: "metrics";
107
+ readonly tail: null;
108
+ readonly csvSections: readonly ["metrics"];
109
+ };
110
+ readonly list: {
111
+ readonly header: "【{skill} · {key}】";
112
+ readonly body: "items";
113
+ readonly tail: "total";
114
+ readonly csvSections: readonly ["items", "total"];
115
+ };
116
+ readonly detail: {
117
+ readonly header: "【{skill} · {key}】";
118
+ readonly body: "item";
119
+ readonly tail: null;
120
+ readonly csvSections: readonly ["item"];
121
+ };
122
+ readonly receipt: {
123
+ readonly header: "【{skill} · {key}】";
124
+ readonly body: "ok";
125
+ readonly tail: "message";
126
+ readonly csvSections: readonly ["status", "message"];
127
+ };
128
+ readonly analysis: {
129
+ readonly header: "【{skill} · {key}】";
130
+ readonly body: "summary";
131
+ readonly tail: null;
132
+ readonly csvSections: readonly ["summary"];
133
+ };
134
+ }>;
135
+ export declare const TEXT_JSON_INDENT = 2;
136
+ /** json 口径:文本中 `<` 一律写成反斜杠 + u003c,防 `</script>` 断标签。 */
137
+ export declare const TEXT_JSON_LT_RULE: "u003c";
138
+ /** csv 口径:RFC4180 引号规则 + LF 行尾。 */
139
+ export declare const CSV_DIALECT: Readonly<{
140
+ readonly delimiter: ",";
141
+ readonly quote: "\"";
142
+ readonly quoteEscape: "\"\"";
143
+ readonly lineEnding: "LF";
144
+ readonly header: readonly ["section", "row"];
145
+ }>;
146
+ export declare const TEXT_ERROR_CODES: readonly ["shape-unsupported", "structure-invalid", "format-unknown"];
147
+ export type TextErrorCode = (typeof TEXT_ERROR_CODES)[number];
148
+ export interface TextErrorShape {
149
+ readonly name: 'TextError';
150
+ readonly code: TextErrorCode;
151
+ readonly message: string;
152
+ }
153
+ /** 冻结签名:`buildDataText(input: DataTextInput): string`。 */
154
+ export type BuildDataText = (input: DataTextInput) => string;
155
+ /** 冻结签名:`buildLogText(input: LogTextInput): string`。 */
156
+ export type BuildLogText = (input: LogTextInput) => string;
157
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/spec/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /** base-paint/spec/text:复制文本序列化契约(#77 冻结面)。
2
+ *
3
+ * B2/AC-5:snapshot 结构化接口不移植,输入对齐 envelope `shape`;
4
+ * `buildDataText`/`buildLogText` 保留(复制文本来源),并补全旧侧未定义的
5
+ * `format` 语义(text/json/csv 的转义与空值口径,见文档 §3.4)。
6
+ *
7
+ * 依赖红线:只许 `import type`(AC-13)。
8
+ */
9
+ export const COPY_FORMATS = ['text', 'json', 'csv'];
10
+ /** 可序列化形状:envelope 六形状去掉 `fallback`(降级载荷不进复制文本)。
11
+ * 成员**顺序无语义**(不决定 CSV 行序/遍历序),只有成员集有效。 */
12
+ export const SERIALIZABLE_SHAPES = ['stat', 'list', 'detail', 'analysis', 'receipt'];
13
+ /** 6 段日志段序(逐字对齐旧 §6.1:①场景标识②AI思考链③数据结构④调用链⑤时间戳版本⑥异常)。 */
14
+ export const LOG_SECTIONS = ['scene', 'thinking', 'dataStructure', 'callChain', 'timestampVersion', 'exception'];
15
+ export const LOG_SECTION_TITLES = Object.freeze({
16
+ scene: '场景标识',
17
+ thinking: 'AI 思考链',
18
+ dataStructure: '数据结构',
19
+ callChain: '调用链',
20
+ timestampVersion: '时间戳版本',
21
+ exception: '异常',
22
+ });
23
+ /** 6 段日志 → 数据源(FX-1③):`scene` 由 **envelope 派生**(`skill`/`key`/`shape`),
24
+ * 其余 5 段取 `CopyLogFields`;`timestampVersion` ← `copyLog.timestamp`(不是 `timestampVersion` 字段)。 */
25
+ export const LOG_SECTION_SOURCES = Object.freeze({
26
+ scene: 'envelope',
27
+ thinking: 'copyLog.thinking',
28
+ dataStructure: 'copyLog.dataStructure',
29
+ callChain: 'copyLog.callChain',
30
+ timestampVersion: 'copyLog.timestamp',
31
+ exception: 'copyLog.exception',
32
+ });
33
+ /** 日志缺省占位(FX-1④):**只作用于 `text` 口径**;`json` 写 `null`,`csv` 写空串。 */
34
+ export const LOG_UNKNOWN_PLACEHOLDER = '(未知)';
35
+ /** `text` 口径的数据空值占位:**只作用于 `text` 口径**;`json` 保留 `null`,`csv` 写空串。 */
36
+ export const TEXT_EMPTY_PLACEHOLDER = '未填写';
37
+ export const TEXT_SENSITIVE_MASK = '****';
38
+ /** text 口径输出头(`{skill}`/`{key}` 为替换位,非 HTML 占位符)。 */
39
+ export const TEXT_HEADER_TEMPLATE = '【{skill} · {key}】';
40
+ /** **敏感行判定口径(FX-23,机读)**:投影行(`metrics`/`item` 的值、`items` 的元素)取值为
41
+ * `{ text: string, sensitive: true }` 形态时判为**敏感行**——该形态的**字段名**与旧侧 `_rowText` 一致
42
+ * (`base.js:218-221`:`:219` 函数、`:221` 合并掩码行),但**判定语义不同**(FX-30):
43
+ * 旧侧是真值判定(`if (r.sensitive)`),本契约只认**字面 `true`**(`flagValue`)。
44
+ *
45
+ * - 判定只看源值的 `flagField` 是否为字面 `flagValue`(`true`),**不看文本内容**;`text` 字段是原文。
46
+ * - `EnvelopeDataByShape` 不含该形态 → 它是 **text 层的行值包装**(`data.metrics`/`data.item` 的值、
47
+ * `data.items` 的元素),**不改变** envelope 契约,也不进 json 键名(json 口径该键值写 `mask`)。
48
+ * - 三种 format 一律输出 `mask`(= `TEXT_SENSITIVE_MASK`);`text` 口径在该行之后**紧跟一行**
49
+ * `textNotice`。
50
+ * - **与旧侧的偏离(显式声明)**:旧侧把掩码与提示合成一行 `'****(敏感字段已脱敏)'`(`base.js:221`);
51
+ * 新契约拆成「掩码行 + 提示行」,理由是掩码值须能被 `TEXT_SENSITIVE_MASK` 逐值断言、
52
+ * 且 `json`/`csv` 口径下不得夹中文提示(json 值必须是纯掩码字符串、csv 单元格同)。语义等价:原文一律不出现。
53
+ */
54
+ export const SENSITIVE_ROW_RULE = Object.freeze({
55
+ textField: 'text',
56
+ flagField: 'sensitive',
57
+ flagValue: true,
58
+ mask: TEXT_SENSITIVE_MASK,
59
+ textNotice: '(敏感字段已脱敏)',
60
+ });
61
+ /** 逐 shape 投影表(FX-1①;数据形态对齐 `EnvelopeDataByShape`):
62
+ * `stat`→metrics 键值行;`list`→逐项行 + `total` 收尾;`detail`→item 字段行;
63
+ * `receipt`→状态行 + `message` 行;`analysis`→`summary` 文本行。 */
64
+ export const DATA_TEXT_PROJECTIONS = Object.freeze({
65
+ stat: { header: TEXT_HEADER_TEMPLATE, body: 'metrics', tail: null, csvSections: ['metrics'] },
66
+ list: { header: TEXT_HEADER_TEMPLATE, body: 'items', tail: 'total', csvSections: ['items', 'total'] },
67
+ detail: { header: TEXT_HEADER_TEMPLATE, body: 'item', tail: null, csvSections: ['item'] },
68
+ receipt: { header: TEXT_HEADER_TEMPLATE, body: 'ok', tail: 'message', csvSections: ['status', 'message'] },
69
+ analysis: { header: TEXT_HEADER_TEMPLATE, body: 'summary', tail: null, csvSections: ['summary'] },
70
+ });
71
+ export const TEXT_JSON_INDENT = 2;
72
+ /** json 口径:文本中 `<` 一律写成反斜杠 + u003c,防 `</script>` 断标签。 */
73
+ export const TEXT_JSON_LT_RULE = 'u003c';
74
+ /** csv 口径:RFC4180 引号规则 + LF 行尾。 */
75
+ export const CSV_DIALECT = Object.freeze({
76
+ delimiter: ',',
77
+ quote: '"',
78
+ quoteEscape: '""',
79
+ lineEnding: 'LF',
80
+ header: ['section', 'row'],
81
+ });
82
+ export const TEXT_ERROR_CODES = ['shape-unsupported', 'structure-invalid', 'format-unknown'];
83
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/spec/text.ts"],"names":[],"mappings":"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"}
package/dist/style.d.ts CHANGED
@@ -2,7 +2,20 @@
2
2
  *
3
3
  * 红线:样式只抖 render——改样式只改本文件,link-core/combos/单品包
4
4
  * 禁止自带样式常量。类名前缀统一 STYLE_PREFIX,token 表冻结。
5
+ *
6
+ * 本文件同时是 **#75 共享样式资产的唯一产出者**(契约 §3.2/§6.2):
7
+ * `buildStyleSheet()` 产出的 `css` 即 `<!--SHARED-CSS-->` 的填充物
8
+ * (`input.assets.sharedCssText`,契约 `docs/base-paint-contract.md:163`)。
9
+ * 逐条纪律(契约行号):
10
+ * - `:root` 的 11 个 token 逐值取 `CSS_VAR_TOKENS`(doc:273-289),**不自造第二份表**(doc:303);
11
+ * - 8 个样式区取 `CONTROL_STYLE_SECTIONS` 闭集(doc:295),类名自动加 `prefix`;
12
+ * - 产出**不含** `STYLE_FORBIDDEN_TOKENS`(Q14)、**不含**深色区(doc:292);
13
+ * - `charts` 区文本**复用** `charts.ts` 的唯一产出者 `chartsCss`,**不得重述**(#78 结论);
14
+ * - 与既有 `STYLE_TOKENS`(9 个深色 JS token)**并存**、语义互不覆盖(doc:293);
15
+ * - `extraCss` 末尾**原样追加**、**不按技能名分支**(doc:299-300),并执行**三禁强制**
16
+ * (`:root` 改写/Q14 禁入项/深色区 → 抛不导出的 `StyleSheetError`;D3 修订见 §8.11)。
5
17
  */
18
+ import type { BuildStyleSheet } from './spec/style.js';
6
19
  export declare const STYLE_PREFIX = "ilife-";
7
20
  export declare const STYLE_VERSION = "0.1.0";
8
21
  export declare const STYLE_TOKENS: Readonly<{
@@ -21,4 +34,10 @@ export type StyleTokenName = keyof typeof STYLE_TOKENS;
21
34
  export declare function cx(...names: Array<string | false | null | undefined>): string;
22
35
  /** 取 token(样式消费唯一入口,换肤时单点改)。 */
23
36
  export declare function token(name: StyleTokenName): string;
37
+ /** 冻结签名:`buildStyleSheet(input?: StyleSheetInput): StyleSheetOutput`。
38
+ *
39
+ * **同源**:不按技能名分支;任何技能主题差异只能来自调用方显式传入的 `extraCss`(doc:300)。
40
+ * `extraCss` **末尾原样追加**(不加工、不转义);并执行**三禁强制**(D3 修订,见 `assertExtraCss`):
41
+ * 命中 `:root`/`STYLE_FORBIDDEN_TOKENS`/深色区任一 → 抛不导出的 `StyleSheetError`(带 `code`)。 */
42
+ export declare const buildStyleSheet: BuildStyleSheet;
24
43
  //# sourceMappingURL=style.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,eAAO,MAAM,YAAY;;;;;;;;;;EAUvB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,YAAY,CAAC;AAEvD,4BAA4B;AAC5B,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E;AAED,gCAAgC;AAChC,wBAAgB,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAElD"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,eAAO,MAAM,YAAY;;;;;;;;;;EAUvB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,YAAY,CAAC;AAEvD,4BAA4B;AAC5B,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E;AAED,gCAAgC;AAChC,wBAAgB,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAElD;AA44BD;;;;qFAIqF;AACrF,eAAO,MAAM,eAAe,EAAE,eAmB7B,CAAC"}