mviz 1.4.2
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 +174 -0
- package/dist/charts/area.d.ts +14 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +137 -0
- package/dist/charts/area.js.map +1 -0
- package/dist/charts/bar.d.ts +14 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +191 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/boxplot.d.ts +14 -0
- package/dist/charts/boxplot.d.ts.map +1 -0
- package/dist/charts/boxplot.js +79 -0
- package/dist/charts/boxplot.js.map +1 -0
- package/dist/charts/bubble.d.ts +14 -0
- package/dist/charts/bubble.d.ts.map +1 -0
- package/dist/charts/bubble.js +127 -0
- package/dist/charts/bubble.js.map +1 -0
- package/dist/charts/calendar.d.ts +14 -0
- package/dist/charts/calendar.d.ts.map +1 -0
- package/dist/charts/calendar.js +94 -0
- package/dist/charts/calendar.js.map +1 -0
- package/dist/charts/combo.d.ts +14 -0
- package/dist/charts/combo.d.ts.map +1 -0
- package/dist/charts/combo.js +163 -0
- package/dist/charts/combo.js.map +1 -0
- package/dist/charts/dumbbell.d.ts +17 -0
- package/dist/charts/dumbbell.d.ts.map +1 -0
- package/dist/charts/dumbbell.js +368 -0
- package/dist/charts/dumbbell.js.map +1 -0
- package/dist/charts/funnel.d.ts +14 -0
- package/dist/charts/funnel.d.ts.map +1 -0
- package/dist/charts/funnel.js +145 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/heatmap.d.ts +14 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +202 -0
- package/dist/charts/heatmap.js.map +1 -0
- package/dist/charts/histogram.d.ts +14 -0
- package/dist/charts/histogram.d.ts.map +1 -0
- package/dist/charts/histogram.js +103 -0
- package/dist/charts/histogram.js.map +1 -0
- package/dist/charts/index.d.ts +40 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +42 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/line.d.ts +14 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +134 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/pie.d.ts +14 -0
- package/dist/charts/pie.d.ts.map +1 -0
- package/dist/charts/pie.js +75 -0
- package/dist/charts/pie.js.map +1 -0
- package/dist/charts/registry.d.ts +36 -0
- package/dist/charts/registry.d.ts.map +1 -0
- package/dist/charts/registry.js +55 -0
- package/dist/charts/registry.js.map +1 -0
- package/dist/charts/sankey.d.ts +14 -0
- package/dist/charts/sankey.d.ts.map +1 -0
- package/dist/charts/sankey.js +74 -0
- package/dist/charts/sankey.js.map +1 -0
- package/dist/charts/scatter.d.ts +14 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +130 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/sparkline.d.ts +19 -0
- package/dist/charts/sparkline.d.ts.map +1 -0
- package/dist/charts/sparkline.js +154 -0
- package/dist/charts/sparkline.js.map +1 -0
- package/dist/charts/waterfall.d.ts +14 -0
- package/dist/charts/waterfall.d.ts.map +1 -0
- package/dist/charts/waterfall.js +232 -0
- package/dist/charts/waterfall.js.map +1 -0
- package/dist/charts/xmr.d.ts +14 -0
- package/dist/charts/xmr.d.ts.map +1 -0
- package/dist/charts/xmr.js +456 -0
- package/dist/charts/xmr.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +120 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/alert.d.ts +10 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +65 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/big_value.d.ts +10 -0
- package/dist/components/big_value.d.ts.map +1 -0
- package/dist/components/big_value.js +78 -0
- package/dist/components/big_value.js.map +1 -0
- package/dist/components/delta.d.ts +10 -0
- package/dist/components/delta.d.ts.map +1 -0
- package/dist/components/delta.js +83 -0
- package/dist/components/delta.js.map +1 -0
- package/dist/components/empty_space.d.ts +10 -0
- package/dist/components/empty_space.d.ts.map +1 -0
- package/dist/components/empty_space.js +29 -0
- package/dist/components/empty_space.js.map +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/note.d.ts +10 -0
- package/dist/components/note.d.ts.map +1 -0
- package/dist/components/note.js +66 -0
- package/dist/components/note.js.map +1 -0
- package/dist/components/registry.d.ts +24 -0
- package/dist/components/registry.d.ts.map +1 -0
- package/dist/components/registry.js +36 -0
- package/dist/components/registry.js.map +1 -0
- package/dist/components/table.d.ts +90 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +610 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/text.d.ts +10 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +46 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.d.ts +10 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +79 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/core/colors.d.ts +45 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +93 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/css.d.ts +20 -0
- package/dist/core/css.d.ts.map +1 -0
- package/dist/core/css.js +97 -0
- package/dist/core/css.js.map +1 -0
- package/dist/core/exceptions.d.ts +59 -0
- package/dist/core/exceptions.d.ts.map +1 -0
- package/dist/core/exceptions.js +100 -0
- package/dist/core/exceptions.js.map +1 -0
- package/dist/core/formatting.d.ts +53 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +491 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/serializer.d.ts +29 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +84 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/themes.d.ts +138 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +484 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/version-check.d.ts +23 -0
- package/dist/core/version-check.d.ts.map +1 -0
- package/dist/core/version-check.js +163 -0
- package/dist/core/version-check.js.map +1 -0
- package/dist/generate_test_harness.d.ts +13 -0
- package/dist/generate_test_harness.d.ts.map +1 -0
- package/dist/generate_test_harness.js +35 -0
- package/dist/generate_test_harness.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/converter.d.ts +22 -0
- package/dist/layout/converter.d.ts.map +1 -0
- package/dist/layout/converter.js +46 -0
- package/dist/layout/converter.js.map +1 -0
- package/dist/layout/csv.d.ts +15 -0
- package/dist/layout/csv.d.ts.map +1 -0
- package/dist/layout/csv.js +88 -0
- package/dist/layout/csv.js.map +1 -0
- package/dist/layout/dispatcher.d.ts +13 -0
- package/dist/layout/dispatcher.d.ts.map +1 -0
- package/dist/layout/dispatcher.js +47 -0
- package/dist/layout/dispatcher.js.map +1 -0
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +8 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/parser.d.ts +19 -0
- package/dist/layout/parser.d.ts.map +1 -0
- package/dist/layout/parser.js +888 -0
- package/dist/layout/parser.js.map +1 -0
- package/dist/layout/templates.d.ts +32 -0
- package/dist/layout/templates.d.ts.map +1 -0
- package/dist/layout/templates.js +1016 -0
- package/dist/layout/templates.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +14 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Number formatting utilities for mviz
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Format a number according to the specified format type
|
|
6
|
+
* @param showSign - If true, prefix positive numbers with +
|
|
7
|
+
*/
|
|
8
|
+
export function formatNumber(value, format, showSign = false) {
|
|
9
|
+
if (value === null || value === undefined || isNaN(value)) {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
const fmt = format ?? 'auto';
|
|
13
|
+
let result;
|
|
14
|
+
switch (fmt) {
|
|
15
|
+
case 'auto':
|
|
16
|
+
result = smartFormatNumber(value, false);
|
|
17
|
+
break;
|
|
18
|
+
case 'usd_auto':
|
|
19
|
+
result = smartFormatNumber(value, true);
|
|
20
|
+
break;
|
|
21
|
+
case 'usd':
|
|
22
|
+
result = formatUsd(value);
|
|
23
|
+
break;
|
|
24
|
+
case 'usd0k':
|
|
25
|
+
result = formatUsd0k(value);
|
|
26
|
+
break;
|
|
27
|
+
case 'usd0m':
|
|
28
|
+
result = formatUsd0m(value);
|
|
29
|
+
break;
|
|
30
|
+
case 'usd0b':
|
|
31
|
+
result = formatUsd0b(value);
|
|
32
|
+
break;
|
|
33
|
+
case 'pct':
|
|
34
|
+
case 'pct1':
|
|
35
|
+
result = formatPct1(value);
|
|
36
|
+
break;
|
|
37
|
+
case 'pct0':
|
|
38
|
+
result = formatPct0(value);
|
|
39
|
+
break;
|
|
40
|
+
case 'num0':
|
|
41
|
+
result = formatNum0(value);
|
|
42
|
+
break;
|
|
43
|
+
case 'num1':
|
|
44
|
+
result = formatNum1(value);
|
|
45
|
+
break;
|
|
46
|
+
case 'num0k':
|
|
47
|
+
result = formatNum0k(value);
|
|
48
|
+
break;
|
|
49
|
+
case 'num0m':
|
|
50
|
+
result = formatNum0m(value);
|
|
51
|
+
break;
|
|
52
|
+
case 'num0b':
|
|
53
|
+
result = formatNum0b(value);
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
result = smartFormatNumber(value, false);
|
|
57
|
+
}
|
|
58
|
+
// Add + sign for positive numbers if requested (and not already using parentheses for negatives)
|
|
59
|
+
if (showSign && value > 0 && !result.startsWith('(')) {
|
|
60
|
+
result = '+' + result;
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Smart auto-format based on magnitude, always showing ~4 significant digits.
|
|
66
|
+
* Matches Python's smart_format_number behavior.
|
|
67
|
+
*/
|
|
68
|
+
function smartFormatNumber(value, isCurrency) {
|
|
69
|
+
const isNegative = value < 0;
|
|
70
|
+
const absValue = Math.abs(value);
|
|
71
|
+
const prefix = isCurrency ? '$' : '';
|
|
72
|
+
let formatted;
|
|
73
|
+
if (absValue >= 1_000_000_000) {
|
|
74
|
+
// Billions: 1.000b, 10.00b, 100.0b
|
|
75
|
+
const scaled = absValue / 1_000_000_000;
|
|
76
|
+
if (scaled >= 100) {
|
|
77
|
+
formatted = prefix + scaled.toFixed(1) + 'b';
|
|
78
|
+
}
|
|
79
|
+
else if (scaled >= 10) {
|
|
80
|
+
formatted = prefix + scaled.toFixed(2) + 'b';
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
formatted = prefix + scaled.toFixed(3) + 'b';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (absValue >= 1_000_000) {
|
|
87
|
+
// Millions: 1.000m, 10.00m, 100.0m
|
|
88
|
+
const scaled = absValue / 1_000_000;
|
|
89
|
+
if (scaled >= 100) {
|
|
90
|
+
formatted = prefix + scaled.toFixed(1) + 'm';
|
|
91
|
+
}
|
|
92
|
+
else if (scaled >= 10) {
|
|
93
|
+
formatted = prefix + scaled.toFixed(2) + 'm';
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
formatted = prefix + scaled.toFixed(3) + 'm';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (absValue >= 10_000) {
|
|
100
|
+
// Thousands: 10.00k, 100.0k
|
|
101
|
+
const scaled = absValue / 1_000;
|
|
102
|
+
if (scaled >= 100) {
|
|
103
|
+
formatted = prefix + scaled.toFixed(1) + 'k';
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
formatted = prefix + scaled.toFixed(2) + 'k';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (absValue >= 1_000) {
|
|
110
|
+
// 1,000 - 9,999: use comma formatting
|
|
111
|
+
formatted = prefix + absValue.toLocaleString('en-US', { maximumFractionDigits: 0 });
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Under 1,000: simple number
|
|
115
|
+
if (absValue === Math.floor(absValue)) {
|
|
116
|
+
formatted = prefix + absValue.toString();
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
formatted = prefix + absValue.toFixed(2);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format as USD: $1,250,000
|
|
126
|
+
*/
|
|
127
|
+
function formatUsd(value) {
|
|
128
|
+
const isNegative = value < 0;
|
|
129
|
+
const absValue = Math.abs(value);
|
|
130
|
+
const formatted = '$' + absValue.toLocaleString('en-US', { maximumFractionDigits: 0 });
|
|
131
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Format as USD with k suffix: $125k
|
|
135
|
+
*/
|
|
136
|
+
function formatUsd0k(value) {
|
|
137
|
+
const isNegative = value < 0;
|
|
138
|
+
const absValue = Math.abs(value);
|
|
139
|
+
const formatted = '$' + Math.round(absValue / 1_000) + 'k';
|
|
140
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Format as USD with m suffix: $1.2m
|
|
144
|
+
*/
|
|
145
|
+
function formatUsd0m(value) {
|
|
146
|
+
const isNegative = value < 0;
|
|
147
|
+
const absValue = Math.abs(value);
|
|
148
|
+
const formatted = '$' + (absValue / 1_000_000).toFixed(1) + 'm';
|
|
149
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Format as USD with b suffix: $1.2b
|
|
153
|
+
*/
|
|
154
|
+
function formatUsd0b(value) {
|
|
155
|
+
const isNegative = value < 0;
|
|
156
|
+
const absValue = Math.abs(value);
|
|
157
|
+
const formatted = '$' + (absValue / 1_000_000_000).toFixed(1) + 'b';
|
|
158
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Format as percentage with 1 decimal: 15.0%
|
|
162
|
+
*/
|
|
163
|
+
function formatPct1(value) {
|
|
164
|
+
return (value * 100).toFixed(1) + '%';
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Format as percentage with 0 decimals: 15%
|
|
168
|
+
*/
|
|
169
|
+
function formatPct0(value) {
|
|
170
|
+
return Math.round(value * 100) + '%';
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Format as number with 0 decimals: 1,250
|
|
174
|
+
*/
|
|
175
|
+
function formatNum0(value) {
|
|
176
|
+
return Math.round(value).toLocaleString('en-US');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Format as number with 1 decimal: 1,250.0
|
|
180
|
+
*/
|
|
181
|
+
function formatNum1(value) {
|
|
182
|
+
return value.toLocaleString('en-US', {
|
|
183
|
+
minimumFractionDigits: 1,
|
|
184
|
+
maximumFractionDigits: 1,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Format as number with k suffix: 125k
|
|
189
|
+
*/
|
|
190
|
+
function formatNum0k(value) {
|
|
191
|
+
const isNegative = value < 0;
|
|
192
|
+
const absValue = Math.abs(value);
|
|
193
|
+
const formatted = Math.round(absValue / 1_000) + 'k';
|
|
194
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Format as number with m suffix: 1.2m
|
|
198
|
+
*/
|
|
199
|
+
function formatNum0m(value) {
|
|
200
|
+
const isNegative = value < 0;
|
|
201
|
+
const absValue = Math.abs(value);
|
|
202
|
+
const formatted = (absValue / 1_000_000).toFixed(1) + 'm';
|
|
203
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Format as number with b suffix: 1.2b
|
|
207
|
+
*/
|
|
208
|
+
function formatNum0b(value) {
|
|
209
|
+
const isNegative = value < 0;
|
|
210
|
+
const absValue = Math.abs(value);
|
|
211
|
+
const formatted = (absValue / 1_000_000_000).toFixed(1) + 'b';
|
|
212
|
+
return isNegative ? `(${formatted})` : formatted;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Infer format type from field name and sample value
|
|
216
|
+
*/
|
|
217
|
+
export function inferFormat(fieldName, value) {
|
|
218
|
+
const name = fieldName.toLowerCase();
|
|
219
|
+
// Check for percentage patterns first (most specific)
|
|
220
|
+
// Differentiate between pct (0-1 values) and pct0 (0-100 values) like Python
|
|
221
|
+
if (isPercentageField(name)) {
|
|
222
|
+
if (value !== undefined) {
|
|
223
|
+
const absVal = Math.abs(value);
|
|
224
|
+
if (absVal >= 0 && absVal <= 1) {
|
|
225
|
+
return 'pct';
|
|
226
|
+
}
|
|
227
|
+
else if (absVal >= 0 && absVal <= 100) {
|
|
228
|
+
return 'pct0';
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return 'pct'; // Default to pct if no value to check
|
|
232
|
+
}
|
|
233
|
+
// Check for currency patterns - always return usd_auto like Python
|
|
234
|
+
if (isCurrencyField(name)) {
|
|
235
|
+
return 'usd_auto';
|
|
236
|
+
}
|
|
237
|
+
return 'auto';
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if field name suggests currency
|
|
241
|
+
*/
|
|
242
|
+
export function isCurrencyField(fieldName) {
|
|
243
|
+
const patterns = [
|
|
244
|
+
'revenue',
|
|
245
|
+
'sales',
|
|
246
|
+
'cost',
|
|
247
|
+
'price',
|
|
248
|
+
'amount',
|
|
249
|
+
'total',
|
|
250
|
+
'budget',
|
|
251
|
+
'spend',
|
|
252
|
+
'income',
|
|
253
|
+
'profit',
|
|
254
|
+
'loss',
|
|
255
|
+
'margin',
|
|
256
|
+
'usd',
|
|
257
|
+
'dollar',
|
|
258
|
+
'fee',
|
|
259
|
+
'payment',
|
|
260
|
+
];
|
|
261
|
+
const name = fieldName.toLowerCase();
|
|
262
|
+
return patterns.some((p) => name.includes(p));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check if field name suggests percentage
|
|
266
|
+
*/
|
|
267
|
+
export function isPercentageField(fieldName) {
|
|
268
|
+
const patterns = ['pct', 'percent', 'rate', 'ratio', 'share', 'proportion'];
|
|
269
|
+
const name = fieldName.toLowerCase();
|
|
270
|
+
return patterns.some((p) => name.includes(p));
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if field name suggests count/integer
|
|
274
|
+
*/
|
|
275
|
+
export function isCountField(fieldName) {
|
|
276
|
+
const patterns = ['count', 'num_', '_num', 'qty', 'quantity', 'users', 'items', 'orders', 'rows'];
|
|
277
|
+
const name = fieldName.toLowerCase();
|
|
278
|
+
return patterns.some((p) => name.includes(p));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Check if a string looks like a parseable date for ECharts time axis.
|
|
282
|
+
* Only ISO dates are reliably parsed by ECharts - short formats like "12/16" are not.
|
|
283
|
+
*/
|
|
284
|
+
function looksLikeDate(value) {
|
|
285
|
+
// ISO date pattern: 2024-01-15 or 2024-01-15T10:30:00
|
|
286
|
+
if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
// Unix timestamp (10-13 digits)
|
|
290
|
+
if (/^\d{10,13}$/.test(value)) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Check if majority of values look like dates
|
|
297
|
+
*/
|
|
298
|
+
function majorityAreDates(values, threshold = 0.8) {
|
|
299
|
+
const sample = values.slice(0, 10).filter((v) => v != null);
|
|
300
|
+
if (sample.length === 0)
|
|
301
|
+
return false;
|
|
302
|
+
const dateCount = sample.filter((v) => typeof v === 'string' && looksLikeDate(v)).length;
|
|
303
|
+
return dateCount >= sample.length * threshold;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Infer axis type from data values
|
|
307
|
+
*/
|
|
308
|
+
export function inferAxisType(values) {
|
|
309
|
+
if (values.length === 0) {
|
|
310
|
+
return 'category';
|
|
311
|
+
}
|
|
312
|
+
const sample = values[0];
|
|
313
|
+
// Check if values are dates
|
|
314
|
+
if (typeof sample === 'string') {
|
|
315
|
+
// Check if it looks like a date
|
|
316
|
+
if (looksLikeDate(sample)) {
|
|
317
|
+
// Validate with more samples to avoid false positives
|
|
318
|
+
if (majorityAreDates(values)) {
|
|
319
|
+
return 'time';
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Unix timestamp (large numbers as strings)
|
|
323
|
+
const num = Number(sample);
|
|
324
|
+
if (!isNaN(num) && num > 1_000_000_000 && num < 2_000_000_000) {
|
|
325
|
+
return 'time';
|
|
326
|
+
}
|
|
327
|
+
return 'category';
|
|
328
|
+
}
|
|
329
|
+
if (typeof sample === 'number') {
|
|
330
|
+
// Unix timestamp
|
|
331
|
+
if (sample > 1_000_000_000 && sample < 2_000_000_000) {
|
|
332
|
+
return 'time';
|
|
333
|
+
}
|
|
334
|
+
return 'value';
|
|
335
|
+
}
|
|
336
|
+
if (sample instanceof Date) {
|
|
337
|
+
return 'time';
|
|
338
|
+
}
|
|
339
|
+
return 'category';
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Parse a potentially numeric string to number
|
|
343
|
+
*/
|
|
344
|
+
export function parseNumericString(value) {
|
|
345
|
+
if (value === '')
|
|
346
|
+
return value;
|
|
347
|
+
// Try parsing as number
|
|
348
|
+
const num = Number(value);
|
|
349
|
+
if (!isNaN(num)) {
|
|
350
|
+
return num;
|
|
351
|
+
}
|
|
352
|
+
return value;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Generate ECharts formatter expression based on format type.
|
|
356
|
+
* Returns a simple JavaScript expression for inline use.
|
|
357
|
+
*/
|
|
358
|
+
export function formatValue(fmt) {
|
|
359
|
+
switch (fmt) {
|
|
360
|
+
case 'usd':
|
|
361
|
+
return "'$' + value.toLocaleString()";
|
|
362
|
+
case 'usd0k':
|
|
363
|
+
return "'$' + (value/1000).toFixed(0) + 'k'";
|
|
364
|
+
case 'usd0m':
|
|
365
|
+
return "'$' + (value/1000000).toFixed(1) + 'm'";
|
|
366
|
+
case 'usd0b':
|
|
367
|
+
return "'$' + (value/1000000000).toFixed(1) + 'b'";
|
|
368
|
+
case 'pct':
|
|
369
|
+
case 'pct1':
|
|
370
|
+
return "(value * 100).toFixed(1) + '%'";
|
|
371
|
+
case 'pct0':
|
|
372
|
+
return "(value * 100).toFixed(0) + '%'";
|
|
373
|
+
case 'num0':
|
|
374
|
+
return "value.toLocaleString()";
|
|
375
|
+
case 'num1':
|
|
376
|
+
return "value.toFixed(1)";
|
|
377
|
+
case 'num0k':
|
|
378
|
+
return "(value/1000).toFixed(0) + 'k'";
|
|
379
|
+
case 'num0m':
|
|
380
|
+
return "(value/1000000).toFixed(1) + 'm'";
|
|
381
|
+
case 'num0b':
|
|
382
|
+
return "(value/1000000000).toFixed(1) + 'b'";
|
|
383
|
+
default:
|
|
384
|
+
return 'value';
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Generate an ECharts label formatter function based on format type.
|
|
389
|
+
* Returns a dict with _js_ key containing the formatter function.
|
|
390
|
+
*/
|
|
391
|
+
export function getLabelFormatterJs(fmt) {
|
|
392
|
+
if (fmt === null || fmt === undefined) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
// Smart auto-formatting based on magnitude (JavaScript version)
|
|
396
|
+
// Handle both scalar values and [x, y] array format (for time/value axes)
|
|
397
|
+
if (fmt === 'auto' || fmt === 'usd_auto') {
|
|
398
|
+
const isCurrency = fmt === 'usd_auto' ? 'true' : 'false';
|
|
399
|
+
return {
|
|
400
|
+
_js_: `function(params) {
|
|
401
|
+
var v = params.value;
|
|
402
|
+
if (v == null) return '';
|
|
403
|
+
if (Array.isArray(v)) v = v[1];
|
|
404
|
+
var abs = Math.abs(v);
|
|
405
|
+
var neg = v < 0;
|
|
406
|
+
var p = ${isCurrency} ? '$' : '';
|
|
407
|
+
var r;
|
|
408
|
+
if (abs >= 1e9) {
|
|
409
|
+
var s = abs / 1e9;
|
|
410
|
+
r = s >= 100 ? p + s.toFixed(1) + 'b' : s >= 10 ? p + s.toFixed(2) + 'b' : p + s.toFixed(3) + 'b';
|
|
411
|
+
} else if (abs >= 1e6) {
|
|
412
|
+
var s = abs / 1e6;
|
|
413
|
+
r = s >= 100 ? p + s.toFixed(1) + 'm' : s >= 10 ? p + s.toFixed(2) + 'm' : p + s.toFixed(3) + 'm';
|
|
414
|
+
} else if (abs >= 1e4) {
|
|
415
|
+
var s = abs / 1e3;
|
|
416
|
+
r = s >= 100 ? p + s.toFixed(1) + 'k' : p + s.toFixed(2) + 'k';
|
|
417
|
+
} else if (abs >= 1e3) {
|
|
418
|
+
r = p + abs.toLocaleString('en-US', {maximumFractionDigits: 0});
|
|
419
|
+
} else {
|
|
420
|
+
r = abs === Math.floor(abs) ? p + abs : p + abs.toFixed(2);
|
|
421
|
+
}
|
|
422
|
+
return neg ? '(' + r + ')' : r;
|
|
423
|
+
}`,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
// Get the formatting expression for specific formats
|
|
427
|
+
const expr = formatValue(fmt);
|
|
428
|
+
if (expr === 'value') {
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
// Build the formatter function - ECharts passes params object with value
|
|
432
|
+
// Handle both scalar values and [x, y] array format (for time/value axes)
|
|
433
|
+
return {
|
|
434
|
+
_js_: `function(params) { var value = params.value; if (Array.isArray(value)) value = value[1]; return ${expr}; }`,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Generate an ECharts axis formatter function.
|
|
439
|
+
*/
|
|
440
|
+
export function getAxisFormatterJs(fmt) {
|
|
441
|
+
if (fmt === null || fmt === undefined) {
|
|
442
|
+
return null;
|
|
443
|
+
}
|
|
444
|
+
// Smart auto-formatting for axis labels (compact to prevent overlap)
|
|
445
|
+
// Uses 1 decimal for all magnitudes (k, m, b) to prevent duplicate labels
|
|
446
|
+
if (fmt === 'auto' || fmt === 'usd_auto') {
|
|
447
|
+
const isCurrency = fmt === 'usd_auto' ? 'true' : 'false';
|
|
448
|
+
return {
|
|
449
|
+
_js_: `function(value) {
|
|
450
|
+
if (value == null) return '';
|
|
451
|
+
var abs = Math.abs(value);
|
|
452
|
+
var neg = value < 0;
|
|
453
|
+
var p = ${isCurrency} ? '$' : '';
|
|
454
|
+
var r;
|
|
455
|
+
if (abs >= 1e9) {
|
|
456
|
+
var s = abs / 1e9;
|
|
457
|
+
r = p + s.toFixed(1) + 'b';
|
|
458
|
+
} else if (abs >= 1e6) {
|
|
459
|
+
var s = abs / 1e6;
|
|
460
|
+
r = p + s.toFixed(1) + 'm';
|
|
461
|
+
} else if (abs >= 1e3) {
|
|
462
|
+
var s = abs / 1e3;
|
|
463
|
+
r = p + s.toFixed(1) + 'k';
|
|
464
|
+
} else {
|
|
465
|
+
r = abs === Math.floor(abs) ? p + Math.floor(abs) : p + abs.toFixed(1);
|
|
466
|
+
}
|
|
467
|
+
return neg ? '(' + r + ')' : r;
|
|
468
|
+
}`,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
// For percentage, multiply by 100
|
|
472
|
+
if (fmt === 'pct' || fmt === 'pct1') {
|
|
473
|
+
return {
|
|
474
|
+
_js_: `function(value) { return (value * 100).toFixed(1) + '%'; }`,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
if (fmt === 'pct0') {
|
|
478
|
+
return {
|
|
479
|
+
_js_: `function(value) { return (value * 100).toFixed(0) + '%'; }`,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
// Get the formatting expression for specific formats
|
|
483
|
+
const expr = formatValue(fmt);
|
|
484
|
+
if (expr === 'value') {
|
|
485
|
+
return null;
|
|
486
|
+
}
|
|
487
|
+
return {
|
|
488
|
+
_js_: `function(value) { return ${expr}; }`,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../core/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core module exports
|
|
3
|
+
*/
|
|
4
|
+
export * from './themes.js';
|
|
5
|
+
export * from './formatting.js';
|
|
6
|
+
export * from './colors.js';
|
|
7
|
+
export * from './css.js';
|
|
8
|
+
export * from './exceptions.js';
|
|
9
|
+
export * from './serializer.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core module exports
|
|
3
|
+
*/
|
|
4
|
+
export * from './themes.js';
|
|
5
|
+
export * from './formatting.js';
|
|
6
|
+
export * from './colors.js';
|
|
7
|
+
export * from './css.js';
|
|
8
|
+
export * from './exceptions.js';
|
|
9
|
+
export * from './serializer.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON serialization with JavaScript function embedding for ECharts
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Special markers for JS functions that need to be embedded in JSON
|
|
6
|
+
*/
|
|
7
|
+
export declare const JS_MARKERS: {
|
|
8
|
+
readonly SYMBOL_SIZE_FUNC: "__SYMBOL_SIZE_FUNC__";
|
|
9
|
+
readonly XMR_TOOLTIP_FORMATTER: "__XMR_TOOLTIP_FORMATTER__";
|
|
10
|
+
readonly LABEL_FORMATTER: "__LABEL_FORMATTER__";
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Serialize ECharts option to JSON with embedded JS functions
|
|
14
|
+
*
|
|
15
|
+
* Handles special markers like __SYMBOL_SIZE_FUNC__ and replaces them
|
|
16
|
+
* with actual JavaScript function code.
|
|
17
|
+
*/
|
|
18
|
+
export declare function serializeOption(option: Record<string, unknown>): string;
|
|
19
|
+
/**
|
|
20
|
+
* Create a JS function marker for embedding in options
|
|
21
|
+
*/
|
|
22
|
+
export declare function createJsFunction(code: string): {
|
|
23
|
+
_js_: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Wrap a chart in a complete HTML page
|
|
27
|
+
*/
|
|
28
|
+
export declare function wrapHtml(chartId: string, option: Record<string, unknown>, css: string, width: string, height: number): string;
|
|
29
|
+
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../core/serializer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAqBX;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAkBvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAuBR"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON serialization with JavaScript function embedding for ECharts
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Special markers for JS functions that need to be embedded in JSON
|
|
6
|
+
*/
|
|
7
|
+
export const JS_MARKERS = {
|
|
8
|
+
SYMBOL_SIZE_FUNC: '__SYMBOL_SIZE_FUNC__',
|
|
9
|
+
XMR_TOOLTIP_FORMATTER: '__XMR_TOOLTIP_FORMATTER__',
|
|
10
|
+
LABEL_FORMATTER: '__LABEL_FORMATTER__',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* JavaScript function definitions to inject
|
|
14
|
+
*/
|
|
15
|
+
const JS_FUNCTIONS = {
|
|
16
|
+
[JS_MARKERS.SYMBOL_SIZE_FUNC]: `function(data) {
|
|
17
|
+
var size = data[2];
|
|
18
|
+
return Math.sqrt(size) * 2 + 4;
|
|
19
|
+
}`,
|
|
20
|
+
[JS_MARKERS.XMR_TOOLTIP_FORMATTER]: `function(params) {
|
|
21
|
+
var lines = params.map(function(p) {
|
|
22
|
+
return p.marker + ' ' + p.seriesName + ': ' + p.value[1].toFixed(2);
|
|
23
|
+
});
|
|
24
|
+
return params[0].value[0] + '<br/>' + lines.join('<br/>');
|
|
25
|
+
}`,
|
|
26
|
+
[JS_MARKERS.LABEL_FORMATTER]: `function(params) {
|
|
27
|
+
return params.value;
|
|
28
|
+
}`,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Serialize ECharts option to JSON with embedded JS functions
|
|
32
|
+
*
|
|
33
|
+
* Handles special markers like __SYMBOL_SIZE_FUNC__ and replaces them
|
|
34
|
+
* with actual JavaScript function code.
|
|
35
|
+
*/
|
|
36
|
+
export function serializeOption(option) {
|
|
37
|
+
let json = JSON.stringify(option, null, 2);
|
|
38
|
+
// Replace markers with actual JS functions
|
|
39
|
+
for (const [marker, func] of Object.entries(JS_FUNCTIONS)) {
|
|
40
|
+
// Match both quoted and unquoted markers
|
|
41
|
+
const quotedPattern = new RegExp(`"${marker}"`, 'g');
|
|
42
|
+
json = json.replace(quotedPattern, func);
|
|
43
|
+
}
|
|
44
|
+
// Handle inline JS function objects: {"_js_": "function..."}
|
|
45
|
+
const jsObjectPattern = /\{\s*"_js_"\s*:\s*"([^"]+)"\s*\}/g;
|
|
46
|
+
json = json.replace(jsObjectPattern, (_match, funcBody) => {
|
|
47
|
+
// Unescape the function body
|
|
48
|
+
return funcBody.replace(/\\n/g, '\n').replace(/\\"/g, '"');
|
|
49
|
+
});
|
|
50
|
+
return json;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a JS function marker for embedding in options
|
|
54
|
+
*/
|
|
55
|
+
export function createJsFunction(code) {
|
|
56
|
+
return { _js_: code };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Wrap a chart in a complete HTML page
|
|
60
|
+
*/
|
|
61
|
+
export function wrapHtml(chartId, option, css, width, height) {
|
|
62
|
+
const optionJson = serializeOption(option);
|
|
63
|
+
return `<!DOCTYPE html>
|
|
64
|
+
<html lang="en">
|
|
65
|
+
<head>
|
|
66
|
+
<meta charset="UTF-8">
|
|
67
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
68
|
+
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js"></script>
|
|
69
|
+
<style>
|
|
70
|
+
${css}
|
|
71
|
+
</style>
|
|
72
|
+
</head>
|
|
73
|
+
<body>
|
|
74
|
+
<div id="${chartId}" style="width: ${width}; height: ${height}px;"></div>
|
|
75
|
+
<script>
|
|
76
|
+
var chart = echarts.init(document.getElementById('${chartId}'), null, {renderer: 'svg'});
|
|
77
|
+
var option = ${optionJson};
|
|
78
|
+
chart.setOption(option);
|
|
79
|
+
window.addEventListener('resize', function() { chart.resize(); });
|
|
80
|
+
</script>
|
|
81
|
+
</body>
|
|
82
|
+
</html>`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../core/serializer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,2BAA2B;IAClD,eAAe,EAAE,qBAAqB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,YAAY,GAA2B;IAC3C,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;;;IAG7B;IACF,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE;;;;;IAKlC;IACF,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;;IAE5B;CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAA+B;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE3C,2CAA2C;IAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,yCAAyC;QACzC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,6DAA6D;IAC7D,MAAM,eAAe,GAAG,mCAAmC,CAAC;IAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,QAAgB,EAAE,EAAE;QAChE,6BAA6B;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,MAA+B,EAC/B,GAAW,EACX,KAAa,EACb,MAAc;IAEd,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO;;;;;;;MAOH,GAAG;;;;aAII,OAAO,mBAAmB,KAAK,aAAa,MAAM;;wDAEP,OAAO;mBAC5C,UAAU;;;;;QAKrB,CAAC;AACT,CAAC"}
|