@gui-chat-plugin/spreadsheet 4.1.0 → 4.2.1

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 (67) hide show
  1. package/README.md +38 -4
  2. package/dist/core/calculationErrors.d.ts +17 -0
  3. package/dist/core/contentVersion.d.ts +5 -0
  4. package/dist/core/definition.d.ts +1 -1
  5. package/dist/core/dispatch.d.ts +3 -3
  6. package/dist/core/dispatchReplies.d.ts +19 -0
  7. package/dist/core/index.d.ts +1 -1
  8. package/dist/core/rangeValues.d.ts +2 -1
  9. package/dist/core/types.d.ts +14 -1
  10. package/dist/core-CTRlKL9k.js +52 -0
  11. package/dist/core-Cf9Pxo_q.cjs +1 -0
  12. package/dist/core.cjs +1 -1
  13. package/dist/core.js +3 -3
  14. package/dist/engine/blankOperands.d.ts +14 -0
  15. package/dist/engine/calculator.d.ts +0 -7
  16. package/dist/engine/cellEmpty.d.ts +3 -0
  17. package/dist/engine/cellFormatting.d.ts +3 -2
  18. package/dist/engine/concatOperand.d.ts +3 -0
  19. package/dist/engine/concatPrecedence.d.ts +32 -0
  20. package/dist/engine/customFunctionSpecs.d.ts +30 -0
  21. package/dist/engine/customFunctions.d.ts +32 -0
  22. package/dist/engine/date-calendar.d.ts +32 -0
  23. package/dist/engine/date-utils.d.ts +4 -1
  24. package/dist/engine/dateDisplay.d.ts +20 -0
  25. package/dist/engine/escapes.d.ts +10 -0
  26. package/dist/engine/evaluator.d.ts +9 -2
  27. package/dist/engine/formatter.d.ts +4 -0
  28. package/dist/engine/functions/aliases.d.ts +6 -0
  29. package/dist/engine/functions/analysis-math.d.ts +3 -0
  30. package/dist/engine/functions/calendar.d.ts +9 -0
  31. package/dist/engine/functions/date.d.ts +1 -1
  32. package/dist/engine/functions/distribution-math.d.ts +44 -0
  33. package/dist/engine/functions/distributions.d.ts +7 -0
  34. package/dist/engine/functions/index.d.ts +5 -0
  35. package/dist/engine/functions/regression-math.d.ts +25 -0
  36. package/dist/engine/functions/regression.d.ts +5 -0
  37. package/dist/engine/functions/shape-math.d.ts +21 -0
  38. package/dist/engine/functions/shape.d.ts +5 -0
  39. package/dist/engine/functions/special-functions.d.ts +17 -0
  40. package/dist/engine/functions/statistical-analysis.d.ts +8 -1
  41. package/dist/engine/functions/statistical.d.ts +21 -1
  42. package/dist/engine/jsonCellLocator.d.ts +0 -16
  43. package/dist/engine/logicalLiterals.d.ts +11 -0
  44. package/dist/engine/math-ops.d.ts +4 -2
  45. package/dist/engine/numericCoercion.d.ts +6 -0
  46. package/dist/engine/registry.d.ts +32 -4
  47. package/dist/engine/sheetReference.d.ts +14 -0
  48. package/dist/engine/textCollation.d.ts +8 -0
  49. package/dist/engine/textComparison.d.ts +22 -0
  50. package/dist/engine/translateFormula.d.ts +16 -5
  51. package/dist/engine/wholeReferences.d.ts +19 -0
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.js +3 -3
  54. package/dist/lang/messages.d.ts +5 -0
  55. package/dist/samples-C5JjpxYJ.js +4513 -0
  56. package/dist/samples-UnTPgkyq.cjs +2 -0
  57. package/dist/style.css +1 -1
  58. package/dist/vue/fileFollow.d.ts +7 -0
  59. package/dist/vue/sheetSession.d.ts +10 -4
  60. package/dist/vue/useCustomFunctions.d.ts +7 -0
  61. package/dist/vue.cjs +32 -32
  62. package/dist/vue.js +3099 -2921
  63. package/package.json +4 -2
  64. package/dist/core-CaJMHb3p.js +0 -44
  65. package/dist/core-PwJLsuHs.cjs +0 -1
  66. package/dist/samples-B6CgK8O-.cjs +0 -1
  67. package/dist/samples-miYeCJeQ.js +0 -2856
@@ -0,0 +1,4513 @@
1
+ import { ARTIFACTS_ROOT as e, createSerialLock as t } from "gui-chat-protocol";
2
+ import { newQuickJSWASMModuleFromVariant as n, shouldInterruptAfterDeadline as r } from "quickjs-emscripten-core";
3
+ //#region src/core/definition.ts
4
+ var i = "presentSpreadsheet", a = {
5
+ type: "function",
6
+ name: i,
7
+ description: "Display an Excel-like spreadsheet with formulas and calculations.",
8
+ parameters: {
9
+ type: "object",
10
+ properties: {
11
+ title: {
12
+ type: "string",
13
+ description: "Title for the spreadsheet"
14
+ },
15
+ sheets: {
16
+ type: "array",
17
+ description: "Sheets to render as spreadsheet tabs. Each sheet includes a name and 2D array of cells (rows x columns).",
18
+ items: {
19
+ type: "object",
20
+ properties: {
21
+ name: {
22
+ type: "string",
23
+ description: "Sheet name (e.g., 'Sales Q1', 'Summary')"
24
+ },
25
+ data: {
26
+ type: "array",
27
+ description: "Rows of cells. Each cell is an object with 'v' (value) and 'f' (format). Use Excel-style A1 notation in formulas: columns are letters (A, B, C...), rows are 1-based numbers (1, 2, 3...). Values can be text, numbers, dates, or formulas. Examples: [{\"v\": \"Product\"}, {\"v\": 2024, \"f\": \"#,##0\"}, {\"v\": \"01/15/2025\", \"f\": \"MM/DD/YYYY\"}, {\"v\": \"=B2*1.05\", \"f\": \"$#,##0.00\"}]. Format codes: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date).",
28
+ items: {
29
+ type: "array",
30
+ description: "Row of cells. Each cell is an object with value and format.",
31
+ items: {
32
+ type: "object",
33
+ description: "Cell object with value and optional format. If value is a string starting with '=', it's treated as a formula.",
34
+ properties: {
35
+ v: {
36
+ oneOf: [
37
+ { type: "string" },
38
+ { type: "number" },
39
+ { type: "boolean" }
40
+ ],
41
+ description: "Cell value. Can be text, number, date, or formula (string starting with '='). Examples: 'Revenue', 1500000, '01/15/2025', '=SUM(A1:A10)', '=B2-TODAY()'. Date strings like '01/15/2025' are automatically parsed to date serial numbers."
42
+ },
43
+ f: {
44
+ type: "string",
45
+ description: "Optional format code for displaying the value. Common formats: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date)"
46
+ }
47
+ },
48
+ required: ["v"]
49
+ }
50
+ }
51
+ },
52
+ functions: {
53
+ type: "array",
54
+ description: "Optional. Functions this workbook defines, for an analysis no built-in function does (a moving average, a custom score). A formula on any sheet calls one by name, e.g. =MOVING.AVG(B2:B100, 7), and it recalculates like any formula. Each is a JavaScript function body run in a sandbox with no network, files, DOM or timers, at most 50 ms per call. A range argument arrives as rows of cells (an array of arrays; a blank cell is null); a single cell and any other argument as its value. A whole column (A:A) arrives as the rows its sheet's data reaches. Return a number, text or true/false; anything else, a thrown error or a time-out shows as an error in the cell.",
55
+ items: {
56
+ type: "object",
57
+ properties: {
58
+ name: {
59
+ type: "string",
60
+ description: "Letters and digits, parts joined by dots (MOVING.AVG). Not the name of a built-in function."
61
+ },
62
+ params: {
63
+ type: "array",
64
+ items: { type: "string" },
65
+ description: "Parameter names, in call order, e.g. [\"values\", \"n\"]."
66
+ },
67
+ body: {
68
+ type: "string",
69
+ description: "The function body, e.g. \"const xs = values.flat().filter((v) => typeof v === 'number'); const tail = xs.slice(-n); return tail.reduce((a, b) => a + b, 0) / tail.length;\""
70
+ },
71
+ description: {
72
+ type: "string",
73
+ description: "What it computes."
74
+ }
75
+ },
76
+ required: [
77
+ "name",
78
+ "params",
79
+ "body"
80
+ ]
81
+ }
82
+ }
83
+ },
84
+ required: ["name", "data"]
85
+ }
86
+ }
87
+ },
88
+ required: ["title", "sheets"]
89
+ }
90
+ }, o = `Use ${i} whenever the user needs a spreadsheet-style table, multi-step math, or dynamic what-if analysis—do not summarize in text. Build LIVE sheets where every cell is an object {"v": value, "f": format}. For formulas, set "v" to a string starting with "=" (e.g., {"v": "=B2*1.05", "f": "$#,##0.00"}). For dates, use date strings like "01/15/2025" or date formulas like "=TODAY()" or "=DATE(2025,1,15)". The spreadsheet auto-parses common date formats (MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY) into date serial numbers for calculations. Date arithmetic works: "=B2-TODAY()" calculates days between dates. Never pre-calculate; let the spreadsheet compute using cell refs, functions (SUM, AVERAGE, IF, TODAY, DATE, DATEDIF, etc.), and arithmetic. Standard formats: "$#,##0.00" currency, "#,##0" integer, "0.00%" percent, "0.00" decimal, "MM/DD/YYYY" date, "DD-MMM-YYYY" date, "YYYY-MM-DD" ISO date. Format is optional for plain text/numbers. When an analysis needs a method no built-in function has, define it once in the sheet's "functions" and call it from formulas, rather than pasting a computed number: it then recalculates when the data changes.`;
91
+ //#endregion
92
+ //#region src/engine/guards.ts
93
+ function s(e) {
94
+ return typeof e == "object" && !!e && !Array.isArray(e);
95
+ }
96
+ function c(e) {
97
+ return typeof e == "object" && !!e;
98
+ }
99
+ var l = (e, t) => s(e) && typeof e[t] == "string";
100
+ function u(e, t) {
101
+ return e instanceof Error ? e.message : l(e, "details") && e.details ? e.details : l(e, "message") && e.message ? e.message : t === void 0 ? String(e) : t;
102
+ }
103
+ //#endregion
104
+ //#region src/core/paths.ts
105
+ var d = "spreadsheets", f = ".json", p = 16, ee = 2, m = (e) => `${e.getUTCFullYear()}/${String(e.getUTCMonth() + 1).padStart(ee, "0")}`, h = () => globalThis.crypto.randomUUID().split("-").join("").slice(0, p);
106
+ function te(t = /* @__PURE__ */ new Date(), n = h()) {
107
+ let r = `${d}/${m(t)}/${n}${f}`;
108
+ return {
109
+ relPath: r,
110
+ filePath: `${e}/${r}`
111
+ };
112
+ }
113
+ var ne = /* @__PURE__ */ new Set([
114
+ "",
115
+ ".",
116
+ ".."
117
+ ]);
118
+ function re(t) {
119
+ return typeof t != "string" || !t.startsWith(`${e}/${d}/`) || !t.endsWith(f) || t.includes("\\") ? !1 : !t.split("/").some((e) => ne.has(e));
120
+ }
121
+ var g = (t) => t.slice(e.length + 1), ie = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean", ae = (e) => e === null || ie(e) || s(e) && (e.v === void 0 || e.v === null || ie(e.v)) && (e.f === void 0 || typeof e.f == "string"), oe = (e) => Array.isArray(e) && e.every(ae), se = (e) => s(e) && typeof e.name == "string" && Array.isArray(e.data) && e.data.every(oe);
122
+ function ce(e) {
123
+ return Array.isArray(e) && e.every(se) ? e : null;
124
+ }
125
+ //#endregion
126
+ //#region src/core/contentVersion.ts
127
+ var le = "SHA-256", ue = 16, de = 2;
128
+ async function fe(e) {
129
+ let t = await crypto.subtle.digest(le, new TextEncoder().encode(e));
130
+ return Array.from(new Uint8Array(t), (e) => e.toString(ue).padStart(de, "0")).join("");
131
+ }
132
+ var pe = (e, t) => e !== void 0 && t !== null && e !== t;
133
+ //#endregion
134
+ //#region src/core/dispatch.ts
135
+ function me(e) {
136
+ if (!s(e) || typeof e.path != "string") return !1;
137
+ if (e.kind === "loadSpreadsheet") return !0;
138
+ let t = e.baseVersion;
139
+ return e.kind === "saveSpreadsheet" && Array.isArray(e.sheets) && e.sheets.every(se) && (t === void 0 || typeof t == "string");
140
+ }
141
+ var he = (e) => s(e) && typeof e.read == "function" && typeof e.write == "function";
142
+ function ge(e) {
143
+ if (!s(e) || !s(e.files)) return null;
144
+ let t = e.files.artifacts;
145
+ return he(t) ? t : null;
146
+ }
147
+ function _e(e, t) {
148
+ let n = ce(JSON.parse(e));
149
+ if (!n) throw Error(`${t} does not hold an array of sheets`);
150
+ return n;
151
+ }
152
+ async function ve(e, t) {
153
+ let n = await e.read(g(t));
154
+ return {
155
+ message: `Loaded spreadsheet ${t}`,
156
+ data: {
157
+ sheets: _e(n, t),
158
+ version: await fe(n)
159
+ }
160
+ };
161
+ }
162
+ var ye = /* @__PURE__ */ new Map();
163
+ function be(e) {
164
+ let n = ye.get(e);
165
+ if (n) return n;
166
+ let r = t();
167
+ return ye.set(e, r), r;
168
+ }
169
+ async function xe(e, t) {
170
+ return await e.exists(t) ? e.read(t) : null;
171
+ }
172
+ function Se(e, t, n) {
173
+ return {
174
+ message: `Did not save spreadsheet ${e}: it changed since it was read`,
175
+ data: {
176
+ sheets: _e(t, e),
177
+ version: n,
178
+ conflict: !0
179
+ }
180
+ };
181
+ }
182
+ async function Ce(e, t, n, r) {
183
+ let i = g(t);
184
+ return be(i)(async () => {
185
+ let a = r === void 0 ? null : await xe(e, i), o = a === null ? null : await fe(a);
186
+ if (a !== null && o !== null && pe(r, o)) return Se(t, a, o);
187
+ let s = JSON.stringify(n);
188
+ return await e.write(i, s), {
189
+ message: `Saved spreadsheet ${t}`,
190
+ data: {
191
+ sheets: t,
192
+ version: await fe(s)
193
+ }
194
+ };
195
+ });
196
+ }
197
+ async function we(e, t) {
198
+ if (!re(t.path)) throw Error("path must be a .json file under artifacts/spreadsheets/");
199
+ return t.kind === "loadSpreadsheet" ? ve(e, t.path) : Ce(e, t.path, t.sheets, t.baseVersion);
200
+ }
201
+ //#endregion
202
+ //#region src/engine/spreadsheet-errors.ts
203
+ var Te = [
204
+ "#NULL!",
205
+ "#DIV/0!",
206
+ "#VALUE!",
207
+ "#REF!",
208
+ "#NAME?",
209
+ "#NUM!",
210
+ "#N/A",
211
+ "#ERROR!"
212
+ ], _ = class {
213
+ code;
214
+ constructor(e) {
215
+ this.code = e;
216
+ }
217
+ toString() {
218
+ return this.code;
219
+ }
220
+ toJSON() {
221
+ return this.code;
222
+ }
223
+ }, Ee = new _("#NULL!"), v = new _("#DIV/0!"), y = new _("#VALUE!"), De = new _("#REF!"), Oe = new _("#NAME?"), b = new _("#NUM!"), x = new _("#N/A"), ke = {
224
+ "#NULL!": Ee,
225
+ "#DIV/0!": v,
226
+ "#VALUE!": y,
227
+ "#REF!": De,
228
+ "#NAME?": Oe,
229
+ "#NUM!": b,
230
+ "#N/A": x,
231
+ "#ERROR!": new _("#ERROR!")
232
+ }, Ae = (e) => ke[e], je = new Set(Te);
233
+ function Me(e) {
234
+ return typeof e == "string" && je.has(e);
235
+ }
236
+ function S(e) {
237
+ return e instanceof _;
238
+ }
239
+ function Ne(e) {
240
+ return S(e) ? e.code : Me(e) ? e : null;
241
+ }
242
+ function Pe(e) {
243
+ return e == null ? !0 : typeof e == "number" ? Number.isNaN(e) || !Number.isFinite(e) : S(e);
244
+ }
245
+ //#endregion
246
+ //#region src/engine/numericCoercion.ts
247
+ var Fe = (e) => isNaN(e) ? null : e;
248
+ function Ie(e) {
249
+ if (e.includes("%")) {
250
+ let t = Fe(parseFloat(e.replace("%", "").trim()));
251
+ return t === null ? null : t / 100;
252
+ }
253
+ return e.includes("$") ? Fe(parseFloat(e.replace(/[$,]/g, "").trim())) : e.includes(",") ? Fe(parseFloat(e.replace(/,/g, "").trim())) : Fe(parseFloat(e));
254
+ }
255
+ function C(e) {
256
+ return typeof e == "number" ? !isNaN(e) : typeof e == "string" && Ie(e) !== null;
257
+ }
258
+ function w(e) {
259
+ return typeof e == "number" ? e : typeof e == "boolean" ? +!!e : typeof e == "string" ? Ie(e) ?? y : e;
260
+ }
261
+ function Le(e) {
262
+ return typeof e == "number" ? !isNaN(e) : typeof e == "string" && e.trim() !== "" && !isNaN(Number(e));
263
+ }
264
+ //#endregion
265
+ //#region src/engine/date-utils.ts
266
+ var Re = 864e5, ze = new Date(Date.UTC(1899, 11, 30)), Be = (e) => (e.getTime() - ze.getTime()) / Re, T = (e) => {
267
+ let t = Math.floor(e), n = e - t, r = new Date(ze.getTime() + t * Re), i = Math.round(n * 24 * 60 * 60);
268
+ return r.setSeconds(r.getSeconds() + i), r;
269
+ }, Ve = [
270
+ "Jan",
271
+ "Feb",
272
+ "Mar",
273
+ "Apr",
274
+ "May",
275
+ "Jun",
276
+ "Jul",
277
+ "Aug",
278
+ "Sep",
279
+ "Oct",
280
+ "Nov",
281
+ "Dec"
282
+ ], He = [
283
+ "January",
284
+ "February",
285
+ "March",
286
+ "April",
287
+ "May",
288
+ "June",
289
+ "July",
290
+ "August",
291
+ "September",
292
+ "October",
293
+ "November",
294
+ "December"
295
+ ], Ue = [
296
+ "Sun",
297
+ "Mon",
298
+ "Tue",
299
+ "Wed",
300
+ "Thu",
301
+ "Fri",
302
+ "Sat"
303
+ ], We = [
304
+ "Sunday",
305
+ "Monday",
306
+ "Tuesday",
307
+ "Wednesday",
308
+ "Thursday",
309
+ "Friday",
310
+ "Saturday"
311
+ ];
312
+ //#endregion
313
+ //#region src/engine/date-parser.ts
314
+ function Ge(e) {
315
+ if (typeof e != "string" || e.length < 6 || e.length > 30) return !1;
316
+ let t = /\d/.test(e), n = /[/\-\s,]/.test(e);
317
+ return !t || !n ? !1 : [
318
+ /^\d{1,2}\/\d{1,2}\/\d{2,4}$/,
319
+ /^\d{4}-\d{1,2}-\d{1,2}$/,
320
+ /^\d{4}\/\d{1,2}\/\d{1,2}$/,
321
+ /^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/,
322
+ /^[A-Za-z]{3,9}\s+\d{1,2},?\s+\d{4}$/,
323
+ /^\d{1,2}\s+[A-Za-z]{3,9}\s+\d{4}$/
324
+ ].some((t) => t.test(e.trim()));
325
+ }
326
+ function Ke(e, t, n) {
327
+ return nt(e, t, n) ? Be(new Date(Date.UTC(e, t - 1, n))) : null;
328
+ }
329
+ function E(e, t) {
330
+ let [, n, r, i] = e.match(t) ?? [];
331
+ return n === void 0 || r === void 0 || i === void 0 ? null : [
332
+ n,
333
+ r,
334
+ i
335
+ ];
336
+ }
337
+ var qe = /^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/, Je = 12, Ye = (e, t, n) => e > Je || t <= Je && e <= Je && n;
338
+ function Xe(e) {
339
+ let t = e.toLowerCase(), n = Ve.findIndex((e) => e.toLowerCase() === t);
340
+ if (n !== -1) return n + 1;
341
+ let r = He.findIndex((e) => e.toLowerCase() === t);
342
+ return r === -1 ? null : r + 1;
343
+ }
344
+ function Ze(e, t = !1) {
345
+ if (!Ge(e)) return null;
346
+ let n = e.trim(), r = E(n, /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);
347
+ if (r) {
348
+ let [e, t, n] = r;
349
+ return Ke(parseInt(e), parseInt(t), parseInt(n));
350
+ }
351
+ let i = E(n, /^(\d{1,2})-([A-Za-z]{3})-(\d{2,4})$/);
352
+ if (i) {
353
+ let [e, t, n] = i;
354
+ return tt(et(parseInt(n)), t, parseInt(e));
355
+ }
356
+ let a = E(n, /^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{4})$/);
357
+ if (a) {
358
+ let [e, t, n] = a;
359
+ return tt(parseInt(n), e, parseInt(t));
360
+ }
361
+ let o = E(n, /^(\d{1,2})\s+([A-Za-z]{3,9})\s+(\d{4})$/);
362
+ if (o) {
363
+ let [e, t, n] = o;
364
+ return tt(parseInt(n), t, parseInt(e));
365
+ }
366
+ let s = E(n, qe);
367
+ if (s) {
368
+ let [e, n, r] = s, i = Ye(parseInt(e), parseInt(n), t), a = parseInt(i ? n : e), o = parseInt(i ? e : n);
369
+ return Ke(et(parseInt(r)), a, o);
370
+ }
371
+ return null;
372
+ }
373
+ var Qe = 100, $e = 30;
374
+ function et(e) {
375
+ return e >= Qe ? e : e < $e ? 2e3 + e : 1900 + e;
376
+ }
377
+ function tt(e, t, n) {
378
+ let r = Xe(t);
379
+ return r === null ? null : Ke(e, r, n);
380
+ }
381
+ function nt(e, t, n) {
382
+ if (e < 1900 || e > 2100 || t < 1 || t > 12 || n < 1 || n > 31) return !1;
383
+ let r = new Date(Date.UTC(e, t - 1, n));
384
+ return r.getUTCFullYear() === e && r.getUTCMonth() === t - 1 && r.getUTCDate() === n;
385
+ }
386
+ function rt(e, t = !1) {
387
+ let n = e.trim();
388
+ if (/^\d{4}-\d{1,2}-\d{1,2}$/.test(n)) return "YYYY-MM-DD";
389
+ if (/^\d{4}\/\d{1,2}\/\d{1,2}$/.test(n)) return "YYYY/MM/DD";
390
+ if (/^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/.test(n)) return "DD-MMM-YYYY";
391
+ if (/^[A-Za-z]{3}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMM D, YYYY";
392
+ if (/^[A-Za-z]{4,9}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMMM D, YYYY";
393
+ let r = E(n, qe);
394
+ if (r) {
395
+ let [e, n] = r;
396
+ return Ye(parseInt(e), parseInt(n), t) ? "DD/MM/YYYY" : "MM/DD/YYYY";
397
+ }
398
+ return t ? "DD/MM/YYYY" : "MM/DD/YYYY";
399
+ }
400
+ //#endregion
401
+ //#region src/engine/registry.ts
402
+ var it = (e, t) => /* @__PURE__ */ Error(`${e} requires at least ${t} argument${t === 1 ? "" : "s"}`), D = (e, t, n) => {
403
+ let r = t[n];
404
+ if (r === void 0) throw it(e.functionName, n + 1);
405
+ return r;
406
+ }, at = (e) => e.getRangeValuesRaw ?? e.getRangeValues, O = (e) => e.getRangeValuesKeepingBlanks ?? at(e), k = new class {
407
+ functions = /* @__PURE__ */ new Map();
408
+ overlay = null;
409
+ register(e) {
410
+ this.functions.set(e.name.toUpperCase(), e);
411
+ }
412
+ get(e) {
413
+ let t = e.toUpperCase();
414
+ return this.functions.get(t) ?? this.overlay?.get(t);
415
+ }
416
+ hasFunction(e) {
417
+ let t = e.toUpperCase();
418
+ return this.functions.has(t) || (this.overlay?.has(t) ?? !1);
419
+ }
420
+ isBuiltIn(e) {
421
+ return this.functions.has(e.toUpperCase());
422
+ }
423
+ withOverlay(e, t) {
424
+ let n = this.overlay;
425
+ this.overlay = e;
426
+ try {
427
+ return t();
428
+ } finally {
429
+ this.overlay = n;
430
+ }
431
+ }
432
+ getAllFunctions() {
433
+ return Array.from(this.functions.values());
434
+ }
435
+ getFunctionsByCategory() {
436
+ let e = /* @__PURE__ */ new Map();
437
+ for (let t of Array.from(this.functions.values())) {
438
+ let n = t.category || "Other";
439
+ e.has(n) || e.set(n, []), e.get(n).push(t);
440
+ }
441
+ return e;
442
+ }
443
+ }(), ot = "[A-Z][A-Z0-9]*(?:\\.[A-Z0-9]+)*", st = (e) => /^[A-Z]+(?:\.[A-Z]+)*$/i.test(e) || k.hasFunction(e);
444
+ function A(e) {
445
+ return typeof e == "number" ? e : Ie(String(e)) ?? 0;
446
+ }
447
+ function ct(e) {
448
+ return typeof e == "boolean" ? e ? "TRUE" : "FALSE" : String(e);
449
+ }
450
+ var lt = /[.*+?^${}()|[\]\\]/, ut = (e) => lt.test(e) ? `\\${e}` : e, dt = /~([\s\S])|[\s\S]/g, ft = (e) => e.replace(dt, (e, t) => t === void 0 ? e === "*" ? ".*" : e === "?" ? "." : ut(e) : ut(t));
451
+ function pt(e) {
452
+ let t = RegExp(`^${ft(e)}$`, "iu");
453
+ return (e) => t.test(e);
454
+ }
455
+ function mt(e, t = !1) {
456
+ let n = e.trim().replace(/^["']|["']$/g, "");
457
+ if (n === "=") return (e) => String(e).trim() === "";
458
+ if (n === "<>") return (e) => String(e).trim() !== "";
459
+ let [, r, i] = n.match(/^([><=!]+)(.+)$/) ?? [];
460
+ if (r !== void 0 && i !== void 0) {
461
+ let e = ht(i, t), n = gt(i, t), a = (e) => (t) => C(t) && e(A(t));
462
+ switch (r) {
463
+ case ">": return a((t) => t > e);
464
+ case ">=": return a((t) => t >= e);
465
+ case "<": return a((t) => t < e);
466
+ case "<=": return a((t) => t <= e);
467
+ case "=":
468
+ case "==": return n;
469
+ case "!=":
470
+ case "<>": return (e) => !n(e);
471
+ default: return () => !1;
472
+ }
473
+ }
474
+ return gt(n, t);
475
+ }
476
+ function ht(e, t) {
477
+ return Ze(e, t) ?? Ie(e) ?? NaN;
478
+ }
479
+ function gt(e, t) {
480
+ let n = pt(e), r = ht(e, t), i = !isNaN(r);
481
+ return (e) => typeof e != "number" && n(String(e)) || i && C(e) && A(e) === r;
482
+ }
483
+ function _t(e, t, n) {
484
+ let r = e.evaluateFormula(D(e, t, n));
485
+ return S(r) ? r : typeof r == "boolean" ? (e) => e === r : mt(String(r), e.preferDDMMYYYY);
486
+ }
487
+ //#endregion
488
+ //#region src/engine/functions/statistical-math.ts
489
+ var vt = (e) => e.reduce((e, t) => e + t, 0) / e.length;
490
+ function yt(e) {
491
+ return e.length === 0 ? v : vt(e);
492
+ }
493
+ function bt(e) {
494
+ return e.length === 0 ? b : vt(xt([...e].sort((e, t) => e - t)));
495
+ }
496
+ function xt(e) {
497
+ let t = Math.floor(e.length / 2);
498
+ return e.slice(e.length % 2 == 0 ? t - 1 : t, t + 1);
499
+ }
500
+ function St(e) {
501
+ let t = /* @__PURE__ */ new Map();
502
+ for (let n of e) t.set(n, (t.get(n) ?? 0) + 1);
503
+ let n = 0, r = x;
504
+ for (let [e, i] of t.entries()) i > n && (n = i, r = e);
505
+ return n >= 2 ? r : x;
506
+ }
507
+ var Ct = 2;
508
+ function wt(e) {
509
+ if (e.length < Ct) return v;
510
+ let t = vt(e);
511
+ return e.reduce((e, n) => e + (n - t) ** 2, 0) / (e.length - 1);
512
+ }
513
+ function Tt(e) {
514
+ let t = wt(e);
515
+ return typeof t == "number" ? Math.sqrt(t) : t;
516
+ }
517
+ //#endregion
518
+ //#region src/engine/functions/statistical.ts
519
+ var j = 255, Et = /^\$?[A-Z]+\$?\d+$/i, Dt = (e) => Et.test(e), Ot = (e) => e.slice(e.lastIndexOf("!") + 1), kt = (e) => {
520
+ if (!e) return !1;
521
+ let [t, n] = Ot(e).split(":");
522
+ return !t || !n ? !1 : Dt(t) && Dt(n);
523
+ }, At = (e) => kt(e) || Dt(Ot(e)), jt = (e, t, n) => {
524
+ let r = [];
525
+ for (let i of e) {
526
+ let e = i?.trim();
527
+ e && (At(e) ? n(e).forEach((e) => r.push({
528
+ value: e,
529
+ isScalar: !1
530
+ })) : r.push({
531
+ value: t.evaluateFormula(e),
532
+ isScalar: !0
533
+ }));
534
+ }
535
+ return r;
536
+ }, Mt = (e, t) => {
537
+ if (!t.getRangeValuesKeepingBlanks) return Pt(e, t);
538
+ let n = jt(e, t, t.getRangeValuesKeepingBlanks).flatMap(Nt);
539
+ return n.find(S) ?? n.filter((e) => typeof e == "number");
540
+ }, Nt = ({ value: e, isScalar: t }) => S(e) ? [e] : t ? [w(e)] : Le(e) ? [A(e)] : [];
541
+ function Pt(e, t) {
542
+ let n = e.map((e) => e?.trim() ?? "").filter((e) => e !== "").map((e) => {
543
+ if (At(e)) return {
544
+ error: t.getRangeValuesRaw?.(e).find(S),
545
+ numbers: t.getRangeValues(e).map(A)
546
+ };
547
+ let n = w(t.evaluateFormula(e));
548
+ return typeof n == "number" ? { numbers: [n] } : {
549
+ error: n,
550
+ numbers: []
551
+ };
552
+ });
553
+ return n.find(({ error: e }) => e)?.error ?? n.flatMap(({ numbers: e }) => e);
554
+ }
555
+ var Ft = (e) => e.filter(Le).map(A), M = (e) => (t, n) => {
556
+ let r = Mt(t, n);
557
+ return Array.isArray(r) ? e(r) : r;
558
+ }, It = (e, t) => jt(e, t, O(t)).map(({ value: e }) => e), Lt = M((e) => e.reduce((e, t) => e + t, 0)), Rt = M(yt), zt = M((e) => e.length > 0 ? Math.max(...e) : 0), Bt = M((e) => e.length > 0 ? Math.min(...e) : 0), Vt = ({ value: e, isScalar: t }) => !t || typeof w(e) == "number", Ht = (e, t) => jt(e, t, t.getRangeValues).filter(Vt).length, Ut = M(bt), Wt = M(St), Gt = M(Tt), Kt = M(wt), qt = (e) => e != null && e !== "", Jt = (e, t) => At(e) && t.countFilledCells ? t.countFilledCells(e) : It([e], t).filter(qt).length, Yt = (e, t) => e.reduce((e, n) => {
559
+ let r = n?.trim();
560
+ return r ? e + Jt(r, t) : e;
561
+ }, 0), Xt = (e, t) => {
562
+ let n = O(t)(D(t, e, 0)), r = _t(t, e, 1);
563
+ return typeof r == "function" ? n.filter(r).length : r;
564
+ }, Zt = (e, t) => {
565
+ let n = D(t, e, 0), r = O(t), i = e.length === 3 ? D(t, e, 2) : n;
566
+ return {
567
+ criteriaRange: r(n),
568
+ valueRange: r(i),
569
+ matches: _t(t, e, 1)
570
+ };
571
+ }, Qt = (e, t, n) => e.reduce((e, r, i) => {
572
+ if (!n(r)) return e;
573
+ let a = t[i] ?? "";
574
+ return S(a) ? {
575
+ ...e,
576
+ error: e.error ?? a
577
+ } : {
578
+ ...e,
579
+ sum: e.sum + A(a),
580
+ count: e.count + +!!C(a)
581
+ };
582
+ }, {
583
+ sum: 0,
584
+ count: 0
585
+ });
586
+ k.register({
587
+ name: "SUM",
588
+ handler: Lt,
589
+ minArgs: 1,
590
+ maxArgs: j,
591
+ description: "Returns the sum of all numbers in a range",
592
+ examples: ["SUM(A1:A10)", "SUM(B2:B20)"],
593
+ category: "Statistical"
594
+ }), k.register({
595
+ name: "AVERAGE",
596
+ handler: Rt,
597
+ minArgs: 1,
598
+ maxArgs: j,
599
+ description: "Returns the average (arithmetic mean) of numbers in a range",
600
+ examples: ["AVERAGE(A1:A10)", "AVERAGE(B2:B20)"],
601
+ category: "Statistical"
602
+ }), k.register({
603
+ name: "MAX",
604
+ handler: zt,
605
+ minArgs: 1,
606
+ description: "Returns the largest value in a range",
607
+ examples: ["MAX(A1:A10)", "MAX(B2:B20)"],
608
+ category: "Statistical"
609
+ }), k.register({
610
+ name: "MIN",
611
+ handler: Bt,
612
+ minArgs: 1,
613
+ description: "Returns the smallest value in a range",
614
+ examples: ["MIN(A1:A10)", "MIN(B2:B20)"],
615
+ category: "Statistical"
616
+ }), k.register({
617
+ name: "COUNT",
618
+ handler: Ht,
619
+ minArgs: 1,
620
+ maxArgs: j,
621
+ description: "Counts the number of cells in a range",
622
+ examples: ["COUNT(A1:A10)", "COUNT(B2:B20)"],
623
+ category: "Statistical"
624
+ }), k.register({
625
+ name: "MEDIAN",
626
+ handler: Ut,
627
+ minArgs: 1,
628
+ maxArgs: j,
629
+ description: "Returns the median (middle) value in a range",
630
+ examples: ["MEDIAN(A1:A10)", "MEDIAN(B2:B20)"],
631
+ category: "Statistical"
632
+ }), k.register({
633
+ name: "MODE",
634
+ handler: Wt,
635
+ minArgs: 1,
636
+ maxArgs: j,
637
+ description: "Returns the most frequently occurring value in a range",
638
+ examples: ["MODE(A1:A10)", "MODE(B2:B20)"],
639
+ category: "Statistical"
640
+ }), k.register({
641
+ name: "STDEV",
642
+ handler: Gt,
643
+ minArgs: 1,
644
+ maxArgs: j,
645
+ description: "Returns the standard deviation of numbers in a range",
646
+ examples: ["STDEV(A1:A10)", "STDEV(B2:B20)"],
647
+ category: "Statistical"
648
+ }), k.register({
649
+ name: "VAR",
650
+ handler: Kt,
651
+ minArgs: 1,
652
+ maxArgs: j,
653
+ description: "Returns the variance of numbers in a range",
654
+ examples: ["VAR(A1:A10)", "VAR(B2:B20)"],
655
+ category: "Statistical"
656
+ }), k.register({
657
+ name: "COUNTA",
658
+ handler: Yt,
659
+ minArgs: 1,
660
+ maxArgs: j,
661
+ description: "Counts the number of non-empty cells in a range",
662
+ examples: ["COUNTA(A1:A10)", "COUNTA(B2:B20)"],
663
+ category: "Statistical"
664
+ }), k.register({
665
+ name: "COUNTIF",
666
+ handler: Xt,
667
+ minArgs: 2,
668
+ maxArgs: 2,
669
+ description: "Counts cells in a range that match a criteria",
670
+ examples: ["COUNTIF(A1:A10, \">5\")", "COUNTIF(B1:B10, \"Yes\")"],
671
+ category: "Statistical"
672
+ }), k.register({
673
+ name: "SUMIF",
674
+ handler: (e, t) => {
675
+ let { criteriaRange: n, valueRange: r, matches: i } = Zt(e, t);
676
+ if (typeof i != "function") return i;
677
+ let { sum: a, error: o } = Qt(n, r, i);
678
+ return o ?? a;
679
+ },
680
+ minArgs: 2,
681
+ maxArgs: 3,
682
+ description: "Sums cells in a range that match a criteria",
683
+ examples: ["SUMIF(A1:A10, \">5\")", "SUMIF(A1:A10, \">5\", B1:B10)"],
684
+ category: "Statistical"
685
+ }), k.register({
686
+ name: "AVERAGEIF",
687
+ handler: (e, t) => {
688
+ let { criteriaRange: n, valueRange: r, matches: i } = Zt(e, t);
689
+ if (typeof i != "function") return i;
690
+ let { sum: a, count: o, error: s } = Qt(n, r, i);
691
+ return s || (o > 0 ? a / o : v);
692
+ },
693
+ minArgs: 2,
694
+ maxArgs: 3,
695
+ description: "Averages cells in a range that match a criteria",
696
+ examples: ["AVERAGEIF(A1:A10, \">5\")", "AVERAGEIF(A1:A10, \">5\", B1:B10)"],
697
+ category: "Statistical"
698
+ });
699
+ //#endregion
700
+ //#region src/engine/functions/analysis-math.ts
701
+ var $t = 2, en = 1, tn = 4, N = (e) => e.reduce((e, t) => e + t, 0) / e.length, P = (e) => {
702
+ let t = N(e);
703
+ return e.reduce((e, n) => e + (n - t) ** 2, 0);
704
+ };
705
+ function nn(e, t) {
706
+ if (e.length !== t.length) return x;
707
+ let n = e.flatMap((e, n) => {
708
+ let r = t[n];
709
+ return C(e) && r !== void 0 && C(r) ? [{
710
+ y: A(e),
711
+ x: A(r)
712
+ }] : [];
713
+ });
714
+ return {
715
+ ys: n.map((e) => e.y),
716
+ xs: n.map((e) => e.x)
717
+ };
718
+ }
719
+ var F = ({ ys: e, xs: t }) => {
720
+ let n = N(e), r = N(t);
721
+ return e.reduce((e, i, a) => e + (i - n) * ((t[a] ?? r) - r), 0);
722
+ };
723
+ function rn(e) {
724
+ if (e.ys.length < $t) return v;
725
+ let t = Math.sqrt(P(e.ys) * P(e.xs));
726
+ return t === 0 ? v : F(e) / t;
727
+ }
728
+ function an(e) {
729
+ if (e.ys.length < $t) return v;
730
+ let t = P(e.xs);
731
+ return t === 0 ? v : F(e) / t;
732
+ }
733
+ function on(e) {
734
+ let t = an(e);
735
+ return typeof t == "number" ? N(e.ys) - t * N(e.xs) : t;
736
+ }
737
+ function sn(e) {
738
+ let t = rn(e);
739
+ return typeof t == "number" ? t * t : t;
740
+ }
741
+ function cn(e, t) {
742
+ if (e.length === 0 || t < 0 || t > en) return b;
743
+ let n = [...e].sort((e, t) => e - t), r = t * (n.length - 1), i = n[Math.floor(r)] ?? 0, a = n[Math.ceil(r)] ?? i;
744
+ return i + (r - Math.floor(r)) * (a - i);
745
+ }
746
+ function ln(e, t) {
747
+ let n = Math.trunc(t);
748
+ return n < 0 || n > tn ? b : cn(e, n / tn);
749
+ }
750
+ function un(e, t) {
751
+ let n = Math.ceil(t);
752
+ return n < 1 || n > e.length ? b : [...e].sort((e, t) => t - e)[n - 1] ?? b;
753
+ }
754
+ function dn(e, t) {
755
+ let n = Math.ceil(t);
756
+ return n < 1 || n > e.length ? b : [...e].sort((e, t) => e - t)[n - 1] ?? b;
757
+ }
758
+ function fn(e, t, n) {
759
+ return t.includes(e) ? t.filter((t) => n ? t < e : t > e).length + 1 : x;
760
+ }
761
+ function pn(e) {
762
+ return e.length === 0 ? v : P(e) / e.length;
763
+ }
764
+ function mn(e) {
765
+ let t = pn(e);
766
+ return typeof t == "number" ? Math.sqrt(t) : t;
767
+ }
768
+ function hn(e, t) {
769
+ return t.some(({ range: t }) => t.length !== e) ? y : Array.from({ length: e }, (e, n) => t.every(({ range: e, matches: t }) => t(e[n] ?? "")));
770
+ }
771
+ //#endregion
772
+ //#region src/engine/functions/statistical-analysis.ts
773
+ var I = 255, gn = (e, t, n) => w(t.evaluateFormula(D(t, e, n))), _n = (e, t, n = 0) => {
774
+ let r = O(t), [i, a] = [r(D(t, e, n)), r(D(t, e, n + 1))];
775
+ return [...i, ...a].find(S) ?? nn(i, a);
776
+ }, L = (e) => (t, n) => {
777
+ let r = _n(t, n);
778
+ return "ys" in r ? e(r) : r;
779
+ }, vn = (e) => (t, n) => {
780
+ let r = Mt([D(n, t, 0)], n);
781
+ if (!Array.isArray(r)) return r;
782
+ let i = gn(t, n, 1);
783
+ return typeof i == "number" ? e(r, i) : i;
784
+ }, yn = (e, t) => {
785
+ let n = gn(e, t, 0);
786
+ if (typeof n != "number") return n;
787
+ let r = Mt([D(t, e, 1)], t);
788
+ if (!Array.isArray(r)) return r;
789
+ let i = e.length > 2 ? gn(e, t, 2) : 0;
790
+ return typeof i == "number" ? fn(n, r, i !== 0) : i;
791
+ }, bn = (e, t, n) => {
792
+ let r = O(t), i = Array.from({ length: Math.ceil((e.length - n) / 2) }, (e, t) => n + t * 2).map((n) => ({
793
+ range: r(D(t, e, n)),
794
+ matches: _t(t, e, n + 1)
795
+ }));
796
+ return i.map(({ matches: e }) => e).find(S) || i.flatMap(({ range: e, matches: t }) => typeof t == "function" ? [{
797
+ range: e,
798
+ matches: t
799
+ }] : []);
800
+ }, xn = (e, t) => {
801
+ let n = O(t)(D(t, e, 0)), r = bn(e, t, 1);
802
+ if (!Array.isArray(r)) return r;
803
+ let i = hn(n.length, r);
804
+ if (!Array.isArray(i)) return i;
805
+ let a = n.filter((e, t) => i[t]);
806
+ return a.find(S) ?? a;
807
+ }, Sn = (e, t) => {
808
+ let n = xn(e, t);
809
+ return Array.isArray(n) ? n.reduce((e, t) => e + A(t), 0) : n;
810
+ }, Cn = (e, t) => {
811
+ let n = xn(e, t);
812
+ if (!Array.isArray(n)) return n;
813
+ let r = n.filter(C).map(A);
814
+ return r.length > 0 ? r.reduce((e, t) => e + t, 0) / r.length : v;
815
+ }, wn = (e) => (t, n) => {
816
+ let r = xn(t, n);
817
+ if (!Array.isArray(r)) return r;
818
+ let i = r.filter(C).map(A);
819
+ return i.length > 0 ? i.reduce((t, n) => e(t, n)) : 0;
820
+ };
821
+ [
822
+ {
823
+ name: "CORREL",
824
+ handler: L(rn),
825
+ minArgs: 2,
826
+ maxArgs: 2,
827
+ description: "Returns the correlation coefficient of two ranges",
828
+ examples: ["CORREL(A2:A20, B2:B20)"]
829
+ },
830
+ {
831
+ name: "SLOPE",
832
+ handler: L(an),
833
+ minArgs: 2,
834
+ maxArgs: 2,
835
+ description: "Returns the slope of the least-squares line through known_y and known_x",
836
+ examples: ["SLOPE(B2:B20, A2:A20)"]
837
+ },
838
+ {
839
+ name: "INTERCEPT",
840
+ handler: L(on),
841
+ minArgs: 2,
842
+ maxArgs: 2,
843
+ description: "Returns where the least-squares line crosses the y axis",
844
+ examples: ["INTERCEPT(B2:B20, A2:A20)"]
845
+ },
846
+ {
847
+ name: "RSQ",
848
+ handler: L(sn),
849
+ minArgs: 2,
850
+ maxArgs: 2,
851
+ description: "Returns the square of the correlation coefficient",
852
+ examples: ["RSQ(B2:B20, A2:A20)"]
853
+ },
854
+ {
855
+ name: "PERCENTILE",
856
+ handler: vn(cn),
857
+ minArgs: 2,
858
+ maxArgs: 2,
859
+ description: "Returns the k-th percentile (k from 0 to 1), interpolated like PERCENTILE.INC",
860
+ examples: ["PERCENTILE(A2:A100, 0.9)"]
861
+ },
862
+ {
863
+ name: "QUARTILE",
864
+ handler: vn(ln),
865
+ minArgs: 2,
866
+ maxArgs: 2,
867
+ description: "Returns a quartile (0 to 4), interpolated like QUARTILE.INC",
868
+ examples: ["QUARTILE(A2:A100, 1)"]
869
+ },
870
+ {
871
+ name: "LARGE",
872
+ handler: vn(un),
873
+ minArgs: 2,
874
+ maxArgs: 2,
875
+ description: "Returns the k-th largest value",
876
+ examples: ["LARGE(A2:A100, 3)"]
877
+ },
878
+ {
879
+ name: "SMALL",
880
+ handler: vn(dn),
881
+ minArgs: 2,
882
+ maxArgs: 2,
883
+ description: "Returns the k-th smallest value",
884
+ examples: ["SMALL(A2:A100, 3)"]
885
+ },
886
+ {
887
+ name: "RANK",
888
+ handler: yn,
889
+ minArgs: 2,
890
+ maxArgs: 3,
891
+ description: "Returns the rank of a number in a range (largest first unless order is non-zero)",
892
+ examples: ["RANK(A2, A2:A100)", "RANK(A2, A2:A100, 1)"]
893
+ },
894
+ {
895
+ name: "STDEVP",
896
+ handler: M(mn),
897
+ minArgs: 1,
898
+ maxArgs: I,
899
+ description: "Returns the population standard deviation",
900
+ examples: ["STDEVP(A2:A100)"]
901
+ },
902
+ {
903
+ name: "VARP",
904
+ handler: M(pn),
905
+ minArgs: 1,
906
+ maxArgs: I,
907
+ description: "Returns the population variance",
908
+ examples: ["VARP(A2:A100)"]
909
+ },
910
+ {
911
+ name: "SUMIFS",
912
+ handler: Sn,
913
+ minArgs: 3,
914
+ maxArgs: I,
915
+ description: "Sums the cells whose rows meet every condition",
916
+ examples: ["SUMIFS(C2:C100, A2:A100, \"East\", B2:B100, \">10\")"]
917
+ },
918
+ {
919
+ name: "COUNTIFS",
920
+ handler: (e, t) => {
921
+ let n = bn(e, t, 0);
922
+ if (!Array.isArray(n)) return n;
923
+ let r = hn(n[0]?.range.length ?? 0, n);
924
+ return Array.isArray(r) ? r.filter(Boolean).length : r;
925
+ },
926
+ minArgs: 2,
927
+ maxArgs: I,
928
+ description: "Counts the rows that meet every condition",
929
+ examples: ["COUNTIFS(A2:A100, \"East\", B2:B100, \">10\")"]
930
+ },
931
+ {
932
+ name: "MAXIFS",
933
+ handler: wn(Math.max),
934
+ minArgs: 3,
935
+ maxArgs: I,
936
+ description: "Returns the largest value whose row meets every condition (0 when none does)",
937
+ examples: ["MAXIFS(C2:C100, A2:A100, \"East\")"]
938
+ },
939
+ {
940
+ name: "MINIFS",
941
+ handler: wn(Math.min),
942
+ minArgs: 3,
943
+ maxArgs: I,
944
+ description: "Returns the smallest value whose row meets every condition (0 when none does)",
945
+ examples: ["MINIFS(C2:C100, A2:A100, \"East\")"]
946
+ },
947
+ {
948
+ name: "AVERAGEIFS",
949
+ handler: Cn,
950
+ minArgs: 3,
951
+ maxArgs: I,
952
+ description: "Averages the cells whose rows meet every condition",
953
+ examples: ["AVERAGEIFS(C2:C100, A2:A100, \"East\")"]
954
+ }
955
+ ].forEach((e) => k.register({
956
+ ...e,
957
+ category: "Statistical"
958
+ }));
959
+ //#endregion
960
+ //#region src/engine/functions/regression-math.ts
961
+ var Tn = 3, En = 2;
962
+ function Dn(e, t) {
963
+ if (e.ys.length === 0) return x;
964
+ let n = an(e);
965
+ return typeof n == "number" ? N(e.ys) + n * (t - N(e.xs)) : n;
966
+ }
967
+ function On(e) {
968
+ let t = e.ys.length;
969
+ if (t === 0) return x;
970
+ let n = P(e.xs);
971
+ if (t < Tn || n === 0) return v;
972
+ let r = F(e) / n, [i, a] = [N(e.ys), N(e.xs)], o = e.ys.reduce((t, n, o) => t + (n - i - r * ((e.xs[o] ?? a) - a)) ** 2, 0);
973
+ return Math.sqrt(o / (t - 2));
974
+ }
975
+ function kn(e) {
976
+ return e.ys.length === 0 ? v : F(e) / e.ys.length;
977
+ }
978
+ function An(e) {
979
+ return e.ys.length < En ? v : F(e) / (e.ys.length - 1);
980
+ }
981
+ var jn = (e) => Array.from({ length: e }, (e, t) => t + 1);
982
+ function Mn(e, t, n, r) {
983
+ if (e.length !== t.length) return De;
984
+ let i = [...e, ...t], a = i.find(S);
985
+ if (a) return a;
986
+ if (e.length === 0 || !i.every(C)) return y;
987
+ let o = {
988
+ ys: e.map(A),
989
+ xs: t.map(A)
990
+ };
991
+ return r ? Nn(o, n) : Pn(o, n);
992
+ }
993
+ function Nn(e, t) {
994
+ let n = P(e.xs), r = N(e.ys);
995
+ return n === 0 ? r : r + F(e) / n * (t - N(e.xs));
996
+ }
997
+ function Pn({ ys: e, xs: t }, n) {
998
+ let r = t.reduce((e, t) => e + t * t, 0), i = e.reduce((e, n, r) => e + n * (t[r] ?? 0), 0);
999
+ return r === 0 ? 0 : i / r * n;
1000
+ }
1001
+ //#endregion
1002
+ //#region src/engine/coerce-boolean.ts
1003
+ function R(e) {
1004
+ if (typeof e == "boolean") return e;
1005
+ if (e == null) return !1;
1006
+ if (typeof e == "number") return e !== 0;
1007
+ if (S(e)) return !0;
1008
+ let t = e.trim();
1009
+ if (t === "") return !1;
1010
+ let n = t.toLowerCase();
1011
+ if (n === "true") return !0;
1012
+ if (n === "false") return !1;
1013
+ let r = Number(t);
1014
+ return Number.isNaN(r) ? !0 : r !== 0;
1015
+ }
1016
+ //#endregion
1017
+ //#region src/engine/functions/regression.ts
1018
+ var Fn = (e, t) => {
1019
+ let n = gn(e, t, 0);
1020
+ if (typeof n != "number") return n;
1021
+ let r = _n(e, t, 1);
1022
+ return "ys" in r ? Dn(r, n) : r;
1023
+ };
1024
+ function In(e, t) {
1025
+ let [n, ...r] = jt([e], t, O(t));
1026
+ return n === void 0 || r.length > 0 ? y : n.isScalar ? w(n.value) : S(n.value) ? n.value : C(n.value) ? A(n.value) : y;
1027
+ }
1028
+ function Ln(e, t) {
1029
+ let n = e[3]?.trim();
1030
+ if (!n) return !0;
1031
+ let r = t.evaluateFormula(n);
1032
+ return S(r) ? r : R(r);
1033
+ }
1034
+ [
1035
+ {
1036
+ name: "FORECAST.LINEAR",
1037
+ handler: Fn,
1038
+ minArgs: 3,
1039
+ maxArgs: 3,
1040
+ description: "Returns the value of the least-squares line through known_y and known_x at x",
1041
+ examples: ["FORECAST.LINEAR(30, B2:B20, A2:A20)"]
1042
+ },
1043
+ {
1044
+ name: "TREND",
1045
+ handler: (e, t) => {
1046
+ let n = O(t), r = n(D(t, e, 0)), i = e[1]?.trim(), a = i ? n(i) : jn(r.length), o = In(D(t, e, 2), t);
1047
+ if (typeof o != "number") return o;
1048
+ let s = Ln(e, t);
1049
+ return typeof s == "boolean" ? Mn(r, a, o, s) : s;
1050
+ },
1051
+ minArgs: 3,
1052
+ maxArgs: 4,
1053
+ description: "Returns the least-squares line's value at one new x (known_x defaults to 1, 2, 3, …; const FALSE fits through the origin)",
1054
+ examples: ["TREND(B2:B20, A2:A20, 30)", "TREND(B2:B20, , 21)"]
1055
+ },
1056
+ {
1057
+ name: "STEYX",
1058
+ handler: L(On),
1059
+ minArgs: 2,
1060
+ maxArgs: 2,
1061
+ description: "Returns the standard error of the y predicted by the least-squares line",
1062
+ examples: ["STEYX(B2:B20, A2:A20)"]
1063
+ },
1064
+ {
1065
+ name: "COVARIANCE.P",
1066
+ handler: L(kn),
1067
+ minArgs: 2,
1068
+ maxArgs: 2,
1069
+ description: "Returns the population covariance of two ranges",
1070
+ examples: ["COVARIANCE.P(A2:A20, B2:B20)"]
1071
+ },
1072
+ {
1073
+ name: "COVARIANCE.S",
1074
+ handler: L(An),
1075
+ minArgs: 2,
1076
+ maxArgs: 2,
1077
+ description: "Returns the sample covariance of two ranges",
1078
+ examples: ["COVARIANCE.S(A2:A20, B2:B20)"]
1079
+ }
1080
+ ].forEach((e) => k.register({
1081
+ ...e,
1082
+ category: "Statistical"
1083
+ }));
1084
+ //#endregion
1085
+ //#region src/engine/functions/special-functions.ts
1086
+ var Rn = .5 * Math.log(2 * Math.PI), zn = 1e-16, Bn = 1e-300, Vn = 2e3, z = (e) => Math.abs(e) < Bn ? Bn : e, Hn = 10, Un = 7, Wn = [
1087
+ .9999999999998099,
1088
+ 676.5203681218851,
1089
+ -1259.1392167224028,
1090
+ 771.3234287776531,
1091
+ -176.6150291621406,
1092
+ 12.507343278686905,
1093
+ -.13857109526572012,
1094
+ 9984369578019572e-21,
1095
+ 1.5056327351493116e-7
1096
+ ], Gn = [
1097
+ 1 / 12,
1098
+ -1 / 360,
1099
+ 1 / 1260,
1100
+ -1 / 1680,
1101
+ 1 / 1188,
1102
+ -691 / 360360,
1103
+ 1 / 156,
1104
+ -3617 / 122400
1105
+ ];
1106
+ function Kn(e) {
1107
+ let t = 1 / (e * e);
1108
+ return Gn.reduceRight((e, n) => e * t + n, 0) / e;
1109
+ }
1110
+ function qn(e) {
1111
+ let t = e - 1, n = Wn.slice(1).reduce((e, n, r) => e + n / (t + r + 1), Wn[0] ?? 1), r = t + Un + .5;
1112
+ return Rn + (t + .5) * Math.log(r) - r + Math.log(n);
1113
+ }
1114
+ function B(e) {
1115
+ return e >= Hn ? Rn + (e - .5) * Math.log(e) - e + Kn(e) : qn(e);
1116
+ }
1117
+ function Jn(e, t) {
1118
+ let n = Math.min(e, t), r = Math.max(e, t);
1119
+ if (r >= Hn) {
1120
+ let e = Kn(r) - Kn(n + r);
1121
+ return B(n) + e + n - n * Math.log(n + r) + (r - .5) * Math.log1p(-n / (n + r));
1122
+ }
1123
+ return B(n) + B(r) - B(n + r);
1124
+ }
1125
+ function Yn(e, t, n) {
1126
+ let r = {
1127
+ c: 1,
1128
+ d: 1 / z(1 - (t + n) * e / (t + 1)),
1129
+ result: 0
1130
+ };
1131
+ r.result = r.d;
1132
+ for (let i = 1; i <= Vn; i += 1) {
1133
+ let a = i * (n - i) * e / ((t + 2 * i - 1) * (t + 2 * i));
1134
+ r.d = 1 / z(1 + a * r.d), r.c = z(1 + a / r.c), r.result *= r.d * r.c;
1135
+ let o = -(t + i) * (t + n + i) * e / ((t + 2 * i) * (t + 2 * i + 1));
1136
+ r.d = 1 / z(1 + o * r.d), r.c = z(1 + o / r.c);
1137
+ let s = r.d * r.c;
1138
+ if (r.result *= s, Math.abs(s - 1) < zn) return r.result;
1139
+ }
1140
+ return r.result;
1141
+ }
1142
+ var Xn = 1e4, Zn = 8;
1143
+ function Qn(e, t, n, r, i) {
1144
+ let a = {
1145
+ term: 1,
1146
+ sum: 1
1147
+ };
1148
+ for (let t = 0; t < Vn && a.term > a.sum * zn; t += 1) a.term *= (r + i + t) / (r + 1 + t) * e, a.sum += a.term;
1149
+ return Math.exp(r * t + i * n - Jn(r, i)) / r * a.sum;
1150
+ }
1151
+ function $n(e, t, n, r) {
1152
+ if (e === -Infinity) return 0;
1153
+ if (t === -Infinity) return 1;
1154
+ let i = Math.exp(e), a = Math.exp(t);
1155
+ if (Math.max(n, r) >= Xn && a * (n + r) <= Zn) return 1 - Qn(a, t, e, r, n);
1156
+ let o = Math.exp(n * e + r * t - Jn(n, r));
1157
+ return i < (n + 1) / (n + r + 2) ? o * Yn(i, n, r) / n : 1 - o * Yn(a, r, n) / r;
1158
+ }
1159
+ function er(e, t) {
1160
+ let n = {
1161
+ term: 1 / e,
1162
+ sum: 1 / e
1163
+ };
1164
+ for (let r = 1; r <= Vn && Math.abs(n.term) >= Math.abs(n.sum) * zn; r += 1) n.term *= t / (e + r), n.sum += n.term;
1165
+ return n.sum * Math.exp(-t + e * Math.log(t) - B(e));
1166
+ }
1167
+ function tr(e, t) {
1168
+ let n = {
1169
+ b: t + 1 - e,
1170
+ c: 1 / Bn,
1171
+ d: 0,
1172
+ result: 0
1173
+ };
1174
+ n.d = 1 / z(n.b), n.result = n.d;
1175
+ for (let t = 1; t <= Vn; t += 1) {
1176
+ let r = -t * (t - e);
1177
+ n.b += 2, n.d = 1 / z(r * n.d + n.b), n.c = z(n.b + r / n.c);
1178
+ let i = n.d * n.c;
1179
+ if (n.result *= i, Math.abs(i - 1) < zn) break;
1180
+ }
1181
+ return Math.exp(-t + e * Math.log(t) - B(e)) * n.result;
1182
+ }
1183
+ function nr(e, t) {
1184
+ return t <= 0 ? 1 : t < e + 1 ? 1 - er(e, t) : tr(e, t);
1185
+ }
1186
+ //#endregion
1187
+ //#region src/engine/functions/distribution-math.ts
1188
+ var rr = Math.sqrt(2 * Math.PI), ir = (e) => e === 0 ? 0 : -e, ar = 1e-15, or = 200, sr = (e) => Math.exp(-.5 * e * e) / rr;
1189
+ function cr(e) {
1190
+ let t = .5 * nr(.5, .5 * e * e);
1191
+ return e >= 0 ? t : 1 - t;
1192
+ }
1193
+ var lr = (e) => cr(-e), ur = [
1194
+ -39.69683028665376,
1195
+ 220.9460984245205,
1196
+ -275.9285104469687,
1197
+ 138.357751867269,
1198
+ -30.66479806614716,
1199
+ 2.506628277459239
1200
+ ], dr = [
1201
+ -54.47609879822406,
1202
+ 161.5858368580409,
1203
+ -155.6989798598866,
1204
+ 66.80131188771972,
1205
+ -13.28068155288572
1206
+ ], fr = [
1207
+ -.007784894002430293,
1208
+ -.3223964580411365,
1209
+ -2.400758277161838,
1210
+ -2.549732539343734,
1211
+ 4.374664141464968,
1212
+ 2.938163982698783
1213
+ ], pr = [
1214
+ .007784695709041462,
1215
+ .3224671290700398,
1216
+ 2.445134137142996,
1217
+ 3.754408661907416
1218
+ ], mr = .02425, hr = (e, t) => e.reduce((e, n) => e * t + n, 0);
1219
+ function gr(e) {
1220
+ if (e < mr) {
1221
+ let t = Math.sqrt(-2 * Math.log(e));
1222
+ return hr(fr, t) / (hr(pr, t) * t + 1);
1223
+ }
1224
+ let t = e - .5, n = t * t;
1225
+ return hr(ur, n) * t / (hr(dr, n) * n + 1);
1226
+ }
1227
+ function _r(e) {
1228
+ if (e > .5) return ir(_r(1 - e));
1229
+ let t = { z: gr(e) };
1230
+ for (let n = 0; n < 3; n += 1) {
1231
+ let n = (lr(t.z) - e) / sr(t.z);
1232
+ t.z -= n / (1 + t.z * n / 2);
1233
+ }
1234
+ return t.z;
1235
+ }
1236
+ var vr = (e) => ir(_r(e));
1237
+ function yr(e, t) {
1238
+ return Math.exp(-Jn(t / 2, .5) - .5 * Math.log(t) - (t + 1) / 2 * Math.log1p(e * e / t));
1239
+ }
1240
+ function br(e) {
1241
+ if (e > 0) {
1242
+ let t = Math.log1p(Math.exp(-e));
1243
+ return {
1244
+ logX: -t,
1245
+ logComplement: -e - t
1246
+ };
1247
+ }
1248
+ let t = Math.log1p(Math.exp(e));
1249
+ return {
1250
+ logX: e - t,
1251
+ logComplement: -t
1252
+ };
1253
+ }
1254
+ function V(e, t) {
1255
+ if (e === 0) return .5;
1256
+ let { logX: n, logComplement: r } = br(Math.log(t) - 2 * Math.log(Math.abs(e))), i = .5 * $n(n, r, t / 2, .5);
1257
+ return e >= 0 ? i : 1 - i;
1258
+ }
1259
+ var xr = (e, t) => V(-e, t);
1260
+ function Sr(e, t) {
1261
+ let n = { high: 1 };
1262
+ for (; V(n.high, t) > e && n.high < Number.MAX_VALUE / 2;) n.high *= 2;
1263
+ return n.high;
1264
+ }
1265
+ function Cr(e, t, n, r) {
1266
+ let i = V(e, n);
1267
+ i > t ? r.low = e : r.high = e;
1268
+ let a = e + (Math.log(i) - Math.log(t)) * i / yr(e, n);
1269
+ return a > r.low && a < r.high && Number.isFinite(a) ? a : (r.low + r.high) / 2;
1270
+ }
1271
+ function wr(e, t) {
1272
+ if (e === .5) return 0;
1273
+ let n = {
1274
+ low: 0,
1275
+ high: Sr(e, t)
1276
+ }, r = { t: Math.min(Math.max(vr(e), 0), n.high) };
1277
+ for (let i = 0; i < or; i += 1) {
1278
+ let i = Cr(r.t, e, t, n), a = Math.abs(i - r.t) <= ar * Math.abs(i);
1279
+ if (r.t = i, a) break;
1280
+ }
1281
+ return r.t;
1282
+ }
1283
+ function Tr(e, t) {
1284
+ return e > .5 ? ir(wr(1 - e, t)) : wr(e, t);
1285
+ }
1286
+ var Er = (e, t) => ir(Tr(e, t));
1287
+ function Dr(e) {
1288
+ let t = e.length, n = e.reduce((e, t) => e + t, 0) / t;
1289
+ return {
1290
+ count: t,
1291
+ mean: n,
1292
+ variance: e.reduce((e, t) => e + (t - n) ** 2, 0) / (t - 1)
1293
+ };
1294
+ }
1295
+ function Or(e) {
1296
+ let { count: t, mean: n, variance: r } = Dr(e);
1297
+ return {
1298
+ t: n / Math.sqrt(r / t),
1299
+ df: t - 1
1300
+ };
1301
+ }
1302
+ function kr(e, t) {
1303
+ let n = e.count + t.count - 2, r = ((e.count - 1) * e.variance + (t.count - 1) * t.variance) / n;
1304
+ return {
1305
+ t: (e.mean - t.mean) / Math.sqrt(r * (1 / e.count + 1 / t.count)),
1306
+ df: n
1307
+ };
1308
+ }
1309
+ function Ar(e, t) {
1310
+ let n = e.variance / e.count, r = t.variance / t.count, i = (n + r) ** 2 / (n ** 2 / (e.count - 1) + r ** 2 / (t.count - 1));
1311
+ return {
1312
+ t: (e.mean - t.mean) / Math.sqrt(n + r),
1313
+ df: i
1314
+ };
1315
+ }
1316
+ var jr = ({ t: e, df: t }, n) => n * V(Math.abs(e), t), Mr = (e, t, n) => w(t.evaluateFormula(D(t, e, n)));
1317
+ function Nr(e, t, n) {
1318
+ let r = t.evaluateFormula(D(t, e, n));
1319
+ return S(r) ? r : R(r);
1320
+ }
1321
+ function Pr(e, t, n) {
1322
+ let r = Array.from({ length: n }, (n, r) => Mr(e, t, r));
1323
+ return r.find((e) => typeof e != "number") ?? r.filter((e) => typeof e == "number");
1324
+ }
1325
+ var H = (e, t) => (n, r) => {
1326
+ let i = Pr(n, r, e);
1327
+ return Array.isArray(i) ? t(i) : i;
1328
+ }, Fr = (e) => {
1329
+ let t = Math.trunc(e);
1330
+ return t >= 1 ? t : null;
1331
+ }, Ir = (e) => e > 0 && e < 1, Lr = (e, t) => {
1332
+ let n = Pr(e, t, 2);
1333
+ if (!Array.isArray(n)) return n;
1334
+ let [r = 0, i = 0] = n, a = Nr(e, t, 2);
1335
+ if (typeof a != "boolean") return a;
1336
+ let o = Fr(i);
1337
+ return o === null ? b : a ? xr(r, o) : yr(r, o);
1338
+ }, Rr = ([e = 0, t = 0]) => {
1339
+ let n = Fr(t);
1340
+ return n === null || e < 0 ? b : 2 * V(e, n);
1341
+ }, zr = ([e = 0, t = 0]) => {
1342
+ let n = Fr(t);
1343
+ return n === null ? b : V(e, n);
1344
+ }, Br = ([e = 0, t = 0]) => {
1345
+ let n = Fr(t);
1346
+ return n === null || !Ir(e) ? b : Er(e, n);
1347
+ }, Vr = ([e = 0, t = 0]) => {
1348
+ let n = Fr(t);
1349
+ return n === null || e <= 0 || e > 1 ? b : Tr(e / 2, n);
1350
+ }, Hr = 1, Ur = 2, Wr = 3;
1351
+ function Gr([e, t]) {
1352
+ let n = nn(e, t);
1353
+ return "ys" in n ? Or(n.ys.map((e, t) => e - (n.xs[t] ?? 0))) : n;
1354
+ }
1355
+ function Kr([e, t], n) {
1356
+ let [r, i] = [Dr(Ft(e)), Dr(Ft(t))];
1357
+ return n === Ur ? kr(r, i) : Ar(r, i);
1358
+ }
1359
+ var qr = (e) => "t" in e && !(Number.isFinite(e.t) && Number.isFinite(e.df)) ? v : e, Jr = (e, t) => {
1360
+ let n = O(t), r = [n(D(t, e, 0)), n(D(t, e, 1))], i = r.flat().find(S);
1361
+ if (i) return i;
1362
+ let a = [Mr(e, t, 2), Mr(e, t, 3)], o = a.find((e) => typeof e != "number");
1363
+ if (o) return o;
1364
+ let [s, c] = a.map((e) => Math.trunc(Number(e)));
1365
+ if (s !== 1 && s !== 2 || c === void 0 || c < Hr || c > Wr) return b;
1366
+ let l = qr(c === Hr ? Gr(r) : Kr(r, c));
1367
+ return "t" in l ? jr(l, s === 1 ? 1 : 2) : l;
1368
+ }, Yr = (e, t) => {
1369
+ let n = Pr(e, t, 3);
1370
+ if (!Array.isArray(n)) return n;
1371
+ let [r = 0, i = 0, a = 0] = n, o = Nr(e, t, 3);
1372
+ if (typeof o != "boolean") return o;
1373
+ if (a <= 0) return b;
1374
+ let s = (r - i) / a;
1375
+ return o ? lr(s) : sr(s) / a;
1376
+ }, Xr = (e, t) => {
1377
+ let n = Mr(e, t, 0);
1378
+ if (typeof n != "number") return n;
1379
+ let r = Nr(e, t, 1);
1380
+ return typeof r == "boolean" ? r ? lr(n) : sr(n) : r;
1381
+ }, Zr = ([e = 0, t = 0, n = 0]) => !Ir(e) || n <= 0 ? b : t + n * _r(e), Qr = ([e = 0]) => Ir(e) ? _r(e) : b;
1382
+ function $r([e = 0, t = 0, n = 0]) {
1383
+ let r = Math.trunc(n);
1384
+ return !Ir(e) || t <= 0 || r < 1 ? b : {
1385
+ alpha: e,
1386
+ sd: t,
1387
+ size: r
1388
+ };
1389
+ }
1390
+ [
1391
+ {
1392
+ name: "T.TEST",
1393
+ handler: Jr,
1394
+ minArgs: 4,
1395
+ maxArgs: 4,
1396
+ description: "Returns the p-value of a t-test: tails 1 or 2; type 1 paired, 2 equal variance, 3 unequal variance (Welch)",
1397
+ examples: ["T.TEST(A2:A20, B2:B20, 2, 3)"]
1398
+ },
1399
+ {
1400
+ name: "T.DIST",
1401
+ handler: Lr,
1402
+ minArgs: 3,
1403
+ maxArgs: 3,
1404
+ description: "Returns the left-tailed Student's t distribution (cumulative TRUE) or its density",
1405
+ examples: ["T.DIST(1.96, 30, TRUE)"]
1406
+ },
1407
+ {
1408
+ name: "T.DIST.2T",
1409
+ handler: H(2, Rr),
1410
+ minArgs: 2,
1411
+ maxArgs: 2,
1412
+ description: "Returns the two-tailed Student's t distribution for x >= 0",
1413
+ examples: ["T.DIST.2T(1.96, 30)"]
1414
+ },
1415
+ {
1416
+ name: "T.DIST.RT",
1417
+ handler: H(2, zr),
1418
+ minArgs: 2,
1419
+ maxArgs: 2,
1420
+ description: "Returns the right-tailed Student's t distribution",
1421
+ examples: ["T.DIST.RT(1.96, 30)"]
1422
+ },
1423
+ {
1424
+ name: "T.INV",
1425
+ handler: H(2, Br),
1426
+ minArgs: 2,
1427
+ maxArgs: 2,
1428
+ description: "Returns the t value with the given left-tailed probability",
1429
+ examples: ["T.INV(0.975, 30)"]
1430
+ },
1431
+ {
1432
+ name: "T.INV.2T",
1433
+ handler: H(2, Vr),
1434
+ minArgs: 2,
1435
+ maxArgs: 2,
1436
+ description: "Returns the t value whose two tails hold the given probability",
1437
+ examples: ["T.INV.2T(0.05, 30)"]
1438
+ },
1439
+ {
1440
+ name: "NORM.DIST",
1441
+ handler: Yr,
1442
+ minArgs: 4,
1443
+ maxArgs: 4,
1444
+ description: "Returns the normal distribution (cumulative TRUE) or its density",
1445
+ examples: ["NORM.DIST(42, 40, 1.5, TRUE)"]
1446
+ },
1447
+ {
1448
+ name: "NORM.S.DIST",
1449
+ handler: Xr,
1450
+ minArgs: 2,
1451
+ maxArgs: 2,
1452
+ description: "Returns the standard normal distribution (cumulative TRUE) or its density",
1453
+ examples: ["NORM.S.DIST(1.96, TRUE)"]
1454
+ },
1455
+ {
1456
+ name: "NORM.INV",
1457
+ handler: H(3, Zr),
1458
+ minArgs: 3,
1459
+ maxArgs: 3,
1460
+ description: "Returns the value with the given cumulative normal probability",
1461
+ examples: ["NORM.INV(0.9, 40, 1.5)"]
1462
+ },
1463
+ {
1464
+ name: "NORM.S.INV",
1465
+ handler: H(1, Qr),
1466
+ minArgs: 1,
1467
+ maxArgs: 1,
1468
+ description: "Returns the z with the given cumulative standard normal probability",
1469
+ examples: ["NORM.S.INV(0.975)"]
1470
+ },
1471
+ {
1472
+ name: "CONFIDENCE.NORM",
1473
+ handler: H(3, (e) => {
1474
+ let t = $r(e);
1475
+ return "size" in t ? vr(t.alpha / 2) * t.sd / Math.sqrt(t.size) : t;
1476
+ }),
1477
+ minArgs: 3,
1478
+ maxArgs: 3,
1479
+ description: "Returns the half-width of a confidence interval for a mean, using the normal distribution",
1480
+ examples: ["CONFIDENCE.NORM(0.05, 2.5, 50)"]
1481
+ },
1482
+ {
1483
+ name: "CONFIDENCE.T",
1484
+ handler: H(3, (e) => {
1485
+ let t = $r(e);
1486
+ return "size" in t ? t.size === 1 ? v : Tr(t.alpha / 2, t.size - 1) * t.sd / Math.sqrt(t.size) : t;
1487
+ }),
1488
+ minArgs: 3,
1489
+ maxArgs: 3,
1490
+ description: "Returns the half-width of a confidence interval for a mean, using Student's t distribution",
1491
+ examples: ["CONFIDENCE.T(0.05, 1, 50)"]
1492
+ }
1493
+ ].forEach((e) => k.register({
1494
+ ...e,
1495
+ category: "Statistical"
1496
+ }));
1497
+ //#endregion
1498
+ //#region src/engine/functions/shape-math.ts
1499
+ var ei = 3, ti = 4, ni = (e) => e.reduce((e, t) => e + t, 0) / e.length;
1500
+ function ri(e, t) {
1501
+ let n = ni(e), r = e.map((e) => e - n), i = Math.sqrt(r.reduce((e, t) => e + t * t, 0) / (e.length - 1));
1502
+ return i === 0 ? null : r.reduce((e, n) => e + (n / i) ** t, 0);
1503
+ }
1504
+ function ii(e) {
1505
+ let t = e.length, n = t < ei ? null : ri(e, 3);
1506
+ return n === null ? v : t / ((t - 1) * (t - 2)) * n;
1507
+ }
1508
+ function ai(e) {
1509
+ let t = e.length, n = t < ti ? null : ri(e, 4);
1510
+ return n === null ? v : t * (t + 1) / ((t - 1) * (t - 2) * (t - 3)) * n - 3 * (t - 1) ** 2 / ((t - 2) * (t - 3));
1511
+ }
1512
+ var oi = (e, t, n) => n > 0 ? (e - t) / n : b;
1513
+ function si(e) {
1514
+ return e.length === 0 || e.some((e) => e <= 0) ? b : Math.exp(ni(e.map(Math.log)));
1515
+ }
1516
+ function ci(e) {
1517
+ return e.length === 0 || e.some((e) => e <= 0) ? b : e.length / e.reduce((e, t) => e + 1 / t, 0);
1518
+ }
1519
+ function li(e, t) {
1520
+ let n = e.length - 1, r = e.filter((e) => e < t).length;
1521
+ if (e[r] === t) return r / n;
1522
+ let i = e[r - 1] ?? t, a = e[r] ?? t;
1523
+ return (r - 1 + (t - i) / (a - i)) / n;
1524
+ }
1525
+ function ui(e, t, n) {
1526
+ let r = Math.trunc(n);
1527
+ if (r < 1 || e.length === 0) return b;
1528
+ let i = Array.from(Float64Array.from(e).sort()), [a, o] = [i[0], i.at(-1)];
1529
+ if (a === void 0 || o === void 0 || t < a || t > o) return x;
1530
+ if (i.length === 1) return 1;
1531
+ let s = 10 ** r;
1532
+ return Math.floor(li(i, t) * s * (1 + 2 ** -52 * 4)) / s;
1533
+ }
1534
+ //#endregion
1535
+ //#region src/engine/functions/shape.ts
1536
+ var di = 255, fi = 3, pi = (e, t, n) => w(t.evaluateFormula(D(t, e, n))), mi = (e) => (t, n) => {
1537
+ let r = Mt(t, n);
1538
+ return Array.isArray(r) ? e(r) : r;
1539
+ };
1540
+ [
1541
+ {
1542
+ name: "SKEW",
1543
+ handler: mi(ii),
1544
+ minArgs: 1,
1545
+ maxArgs: di,
1546
+ description: "Returns the skewness of a sample",
1547
+ examples: ["SKEW(A2:A100)"]
1548
+ },
1549
+ {
1550
+ name: "KURT",
1551
+ handler: mi(ai),
1552
+ minArgs: 1,
1553
+ maxArgs: di,
1554
+ description: "Returns the excess kurtosis of a sample",
1555
+ examples: ["KURT(A2:A100)"]
1556
+ },
1557
+ {
1558
+ name: "STANDARDIZE",
1559
+ handler: (e, t) => {
1560
+ let n = [
1561
+ 0,
1562
+ 1,
1563
+ 2
1564
+ ].map((n) => pi(e, t, n)), r = n.find((e) => typeof e != "number");
1565
+ if (r) return r;
1566
+ let [i = 0, a = 0, o = 0] = n.map(Number);
1567
+ return oi(i, a, o);
1568
+ },
1569
+ minArgs: 3,
1570
+ maxArgs: 3,
1571
+ description: "Returns (x - mean) / standard deviation",
1572
+ examples: ["STANDARDIZE(A2, AVERAGE(A2:A100), STDEV(A2:A100))"]
1573
+ },
1574
+ {
1575
+ name: "PERCENTRANK.INC",
1576
+ handler: (e, t) => {
1577
+ let n = pi(e, t, 1);
1578
+ if (typeof n != "number") return n;
1579
+ let r = e.length > 2 ? pi(e, t, 2) : fi;
1580
+ if (typeof r != "number") return r;
1581
+ let i = Mt([D(t, e, 0)], t);
1582
+ return Array.isArray(i) ? ui(i, n, r) : i;
1583
+ },
1584
+ minArgs: 2,
1585
+ maxArgs: 3,
1586
+ description: "Returns the rank of x in a range as a fraction from 0 to 1, to significance digits (3 by default)",
1587
+ examples: ["PERCENTRANK.INC(A2:A100, A2)"]
1588
+ },
1589
+ {
1590
+ name: "GEOMEAN",
1591
+ handler: mi(si),
1592
+ minArgs: 1,
1593
+ maxArgs: di,
1594
+ description: "Returns the geometric mean of positive numbers",
1595
+ examples: ["GEOMEAN(A2:A20)"]
1596
+ },
1597
+ {
1598
+ name: "HARMEAN",
1599
+ handler: mi(ci),
1600
+ minArgs: 1,
1601
+ maxArgs: di,
1602
+ description: "Returns the harmonic mean of positive numbers",
1603
+ examples: ["HARMEAN(A2:A20)"]
1604
+ }
1605
+ ].forEach((e) => k.register({
1606
+ ...e,
1607
+ category: "Statistical"
1608
+ }));
1609
+ //#endregion
1610
+ //#region src/engine/math-ops.ts
1611
+ var hi = 10, gi = (e) => hi ** +e, _i = 15, vi = (e) => Number(e.toPrecision(_i)), yi = (e, t, n) => {
1612
+ if (gi(t) === 0) return 0;
1613
+ let r = Math.abs(e) * gi(t);
1614
+ return !Number.isFinite(r) || Number.isInteger(r) && r !== 0 ? e : Math.sign(e) * n(vi(r)) / gi(t);
1615
+ }, bi = (e, t, n) => {
1616
+ let r = e / t;
1617
+ return !Number.isFinite(r) || Number.isInteger(r) ? e : vi(n(vi(r)) * t);
1618
+ };
1619
+ function xi(e, t) {
1620
+ return yi(e, t, Math.round);
1621
+ }
1622
+ function Si(e, t) {
1623
+ return gi(t) === 0 && e !== 0 ? b : yi(e, t, Math.ceil);
1624
+ }
1625
+ function Ci(e, t) {
1626
+ return yi(e, t, Math.floor);
1627
+ }
1628
+ var wi = (e, t) => e === 0 || Math.sign(e) === Math.sign(t);
1629
+ function Ti(e, t) {
1630
+ return t === 0 ? v : wi(e, t) ? bi(e, t, Math.floor) : b;
1631
+ }
1632
+ function Ei(e, t) {
1633
+ return t === 0 ? 0 : wi(e, t) ? bi(e, t, Math.ceil) : b;
1634
+ }
1635
+ function Di(e, t) {
1636
+ return t === 0 ? v : e - t * Math.floor(e / t);
1637
+ }
1638
+ function Oi(e, t) {
1639
+ if (e < 0 && !Number.isInteger(t)) return b;
1640
+ if (e === 0 && t < 0) return v;
1641
+ if (e === 0 && t === 0) return b;
1642
+ let n = e ** +t;
1643
+ return Number.isFinite(n) ? n : b;
1644
+ }
1645
+ function ki(e) {
1646
+ return e <= 0 ? b : Math.log(e);
1647
+ }
1648
+ function Ai(e, t) {
1649
+ let n = ki(e);
1650
+ return S(n) ? n : t <= 0 || t === 1 ? b : n / Math.log(t);
1651
+ }
1652
+ function ji(e) {
1653
+ return e <= 0 ? b : Math.log10(e);
1654
+ }
1655
+ function Mi(e) {
1656
+ return e < 0 ? b : Math.sqrt(e);
1657
+ }
1658
+ k.register({
1659
+ name: "ROUND",
1660
+ handler: (e, t) => xi(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1661
+ minArgs: 2,
1662
+ maxArgs: 2,
1663
+ description: "Rounds a number to a specified number of digits",
1664
+ examples: ["ROUND(3.14159, 2)", "ROUND(A1, 0)"],
1665
+ category: "Mathematical"
1666
+ }), k.register({
1667
+ name: "ROUNDUP",
1668
+ handler: (e, t) => Si(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1669
+ minArgs: 2,
1670
+ maxArgs: 2,
1671
+ description: "Rounds a number up, away from zero",
1672
+ examples: ["ROUNDUP(3.14159, 2)", "ROUNDUP(A1, 0)"],
1673
+ category: "Mathematical"
1674
+ }), k.register({
1675
+ name: "ROUNDDOWN",
1676
+ handler: (e, t) => Ci(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1677
+ minArgs: 2,
1678
+ maxArgs: 2,
1679
+ description: "Rounds a number down, toward zero",
1680
+ examples: ["ROUNDDOWN(3.14159, 2)", "ROUNDDOWN(A1, 0)"],
1681
+ category: "Mathematical"
1682
+ }), k.register({
1683
+ name: "FLOOR",
1684
+ handler: (e, t) => Ti(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1685
+ minArgs: 2,
1686
+ maxArgs: 2,
1687
+ description: "Rounds a number down to the nearest multiple of significance",
1688
+ examples: ["FLOOR(3.7, 1)", "FLOOR(24, 5)"],
1689
+ category: "Mathematical"
1690
+ }), k.register({
1691
+ name: "CEILING",
1692
+ handler: (e, t) => Ei(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1693
+ minArgs: 2,
1694
+ maxArgs: 2,
1695
+ description: "Rounds a number up to the nearest multiple of significance",
1696
+ examples: ["CEILING(3.2, 1)", "CEILING(24, 5)"],
1697
+ category: "Mathematical"
1698
+ }), k.register({
1699
+ name: "ABS",
1700
+ handler: (e, t) => {
1701
+ let n = w(t.evaluateFormula(D(t, e, 0)));
1702
+ return S(n) ? n : Math.abs(n);
1703
+ },
1704
+ minArgs: 1,
1705
+ maxArgs: 1,
1706
+ description: "Returns the absolute value of a number",
1707
+ examples: ["ABS(-5)", "ABS(A1)"],
1708
+ category: "Mathematical"
1709
+ }), k.register({
1710
+ name: "POWER",
1711
+ handler: (e, t) => Oi(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1712
+ minArgs: 2,
1713
+ maxArgs: 2,
1714
+ description: "Returns the result of a number raised to a power",
1715
+ examples: ["POWER(2, 3)", "POWER(A1, 2)"],
1716
+ category: "Mathematical"
1717
+ }), k.register({
1718
+ name: "SQRT",
1719
+ handler: (e, t) => Mi(A(t.evaluateFormula(D(t, e, 0)))),
1720
+ minArgs: 1,
1721
+ maxArgs: 1,
1722
+ description: "Returns the square root of a number",
1723
+ examples: ["SQRT(16)", "SQRT(A1)"],
1724
+ category: "Mathematical"
1725
+ }), k.register({
1726
+ name: "MOD",
1727
+ handler: (e, t) => Di(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1)))),
1728
+ minArgs: 2,
1729
+ maxArgs: 2,
1730
+ description: "Returns the remainder after division",
1731
+ examples: ["MOD(10, 3)", "MOD(A1, 2)"],
1732
+ category: "Mathematical"
1733
+ }), k.register({
1734
+ name: "INT",
1735
+ handler: (e, t) => {
1736
+ let n = A(t.evaluateFormula(D(t, e, 0)));
1737
+ return Math.floor(n);
1738
+ },
1739
+ minArgs: 1,
1740
+ maxArgs: 1,
1741
+ description: "Rounds a number down to the nearest integer",
1742
+ examples: ["INT(3.7)", "INT(A1)"],
1743
+ category: "Mathematical"
1744
+ }), k.register({
1745
+ name: "TRUNC",
1746
+ handler: (e, t) => Ci(A(t.evaluateFormula(D(t, e, 0))), e.length === 2 ? A(t.evaluateFormula(D(t, e, 1))) : 0),
1747
+ minArgs: 1,
1748
+ maxArgs: 2,
1749
+ description: "Truncates a number to a specified number of decimal places",
1750
+ examples: ["TRUNC(3.14159, 2)", "TRUNC(A1)"],
1751
+ category: "Mathematical"
1752
+ }), k.register({
1753
+ name: "SIGN",
1754
+ handler: (e, t) => {
1755
+ let n = w(t.evaluateFormula(D(t, e, 0)));
1756
+ return S(n) ? n : Math.sign(n);
1757
+ },
1758
+ minArgs: 1,
1759
+ maxArgs: 1,
1760
+ description: "Returns the sign of a number (1, 0, or -1)",
1761
+ examples: ["SIGN(-5)", "SIGN(A1)"],
1762
+ category: "Mathematical"
1763
+ }), k.register({
1764
+ name: "PI",
1765
+ handler: () => Math.PI,
1766
+ minArgs: 0,
1767
+ maxArgs: 0,
1768
+ description: "Returns the value of pi (3.14159...)",
1769
+ examples: ["PI()", "PI()*2"],
1770
+ category: "Mathematical"
1771
+ }), k.register({
1772
+ name: "EXP",
1773
+ handler: (e, t) => {
1774
+ let n = A(t.evaluateFormula(D(t, e, 0)));
1775
+ return Math.exp(n);
1776
+ },
1777
+ minArgs: 1,
1778
+ maxArgs: 1,
1779
+ description: "Returns e raised to the power of a number",
1780
+ examples: ["EXP(1)", "EXP(A1)"],
1781
+ category: "Mathematical"
1782
+ }), k.register({
1783
+ name: "LN",
1784
+ handler: (e, t) => ki(A(t.evaluateFormula(D(t, e, 0)))),
1785
+ minArgs: 1,
1786
+ maxArgs: 1,
1787
+ description: "Returns the natural logarithm of a number",
1788
+ examples: ["LN(10)", "LN(A1)"],
1789
+ category: "Mathematical"
1790
+ }), k.register({
1791
+ name: "LOG",
1792
+ handler: (e, t) => Ai(A(t.evaluateFormula(D(t, e, 0))), e.length === 2 ? A(t.evaluateFormula(D(t, e, 1))) : 10),
1793
+ minArgs: 1,
1794
+ maxArgs: 2,
1795
+ description: "Returns the logarithm of a number to a specified base",
1796
+ examples: ["LOG(100)", "LOG(8, 2)"],
1797
+ category: "Mathematical"
1798
+ }), k.register({
1799
+ name: "LOG10",
1800
+ handler: (e, t) => ji(A(t.evaluateFormula(D(t, e, 0)))),
1801
+ minArgs: 1,
1802
+ maxArgs: 1,
1803
+ description: "Returns the base-10 logarithm of a number",
1804
+ examples: ["LOG10(100)", "LOG10(A1)"],
1805
+ category: "Mathematical"
1806
+ });
1807
+ //#endregion
1808
+ //#region src/engine/escapes.ts
1809
+ function U(e, t) {
1810
+ let n = { position: t };
1811
+ for (; n.position > 0 && e[n.position - 1] === "\\";) --n.position;
1812
+ return (t - n.position) % 2 == 1;
1813
+ }
1814
+ //#endregion
1815
+ //#region src/engine/translateFormula.ts
1816
+ function Ni(e) {
1817
+ return ra(qi(e));
1818
+ }
1819
+ function Pi(e, t) {
1820
+ return e === "" ? t : t === e ? "" : e;
1821
+ }
1822
+ function Fi(e) {
1823
+ let t = e.split(""), n = [], r = "";
1824
+ return t.forEach((t, i) => {
1825
+ (t === "\"" || t === "'") && !U(e, i) && (r = Pi(r, t)), n.push(t === "&" && r === "" ? "+" : t);
1826
+ }), n.join("");
1827
+ }
1828
+ function Ii(e) {
1829
+ let t = [], n = { openQuote: "" };
1830
+ return e.split("").forEach((r, i) => {
1831
+ (r === "\"" || r === "'") && !U(e, i) && (n.openQuote = Pi(n.openQuote, r));
1832
+ let a = t.at(-1);
1833
+ n.openQuote === "" && (r === "-" || r === "+") && a === r && t.push(" "), t.push(r);
1834
+ }), t.join("");
1835
+ }
1836
+ function Li(e) {
1837
+ return e.replace(/([^<>!])=([^=])/g, "$1==$2");
1838
+ }
1839
+ function Ri(e) {
1840
+ return /^[\d+\-*/(). ]+$/.test(e);
1841
+ }
1842
+ function zi(e) {
1843
+ return /^[\d+\-*/(). <>!=]+$/.test(e);
1844
+ }
1845
+ var Bi = /^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/, Vi = /^[A-Za-z_$][\w$]*/, Hi = /^\s+/;
1846
+ function Ui(e, t) {
1847
+ let n = e[t], r = Array.from(e.slice(t + 1)).findIndex((r, i) => r === n && !U(e, t + 1 + i));
1848
+ return r === -1 ? e.length : t + r + 2;
1849
+ }
1850
+ var Wi = {
1851
+ "(": "open",
1852
+ ")": "close",
1853
+ "^": "caret"
1854
+ }, Gi = [
1855
+ {
1856
+ kind: "number",
1857
+ pattern: Bi
1858
+ },
1859
+ {
1860
+ kind: "word",
1861
+ pattern: Vi
1862
+ },
1863
+ {
1864
+ kind: "space",
1865
+ pattern: Hi
1866
+ }
1867
+ ];
1868
+ function Ki(e, t) {
1869
+ let n = e[t];
1870
+ if (n === "\"" || n === "'") return {
1871
+ kind: "literal",
1872
+ text: e.slice(t, Ui(e, t))
1873
+ };
1874
+ let r = e.slice(t), i = Gi.map(({ kind: e, pattern: t }) => ({
1875
+ kind: e,
1876
+ text: t.exec(r)?.[0]
1877
+ })).find((e) => e.text !== void 0);
1878
+ return i?.text === void 0 ? {
1879
+ kind: Wi[n] ?? "symbol",
1880
+ text: n
1881
+ } : {
1882
+ kind: i.kind,
1883
+ text: i.text
1884
+ };
1885
+ }
1886
+ function qi(e) {
1887
+ let t = [], n = { position: 0 };
1888
+ for (; n.position < e.length;) {
1889
+ let r = Ki(e, n.position);
1890
+ t.push(r), n.position += r.text.length;
1891
+ }
1892
+ return t;
1893
+ }
1894
+ var Ji = (e) => e?.kind === "symbol" && (e.text === "-" || e.text === "+");
1895
+ function Yi(e, t) {
1896
+ let n = { depth: 0 };
1897
+ return e.findIndex((e, r) => r < t ? !1 : (e.kind === "open" && (n.depth += 1), e.kind === "close" && --n.depth, n.depth === 0));
1898
+ }
1899
+ function Xi(e, t) {
1900
+ let n = e[t];
1901
+ if (n === void 0) return null;
1902
+ if (n.kind === "number" || n.kind === "literal" || n.kind === "word") return {
1903
+ text: n.text,
1904
+ end: t + 1
1905
+ };
1906
+ if (n.kind !== "open") return null;
1907
+ let r = Yi(e, t);
1908
+ return r === -1 ? null : {
1909
+ text: `(${ra(e.slice(t + 1, r))})`,
1910
+ end: r + 1
1911
+ };
1912
+ }
1913
+ function Zi(e, t) {
1914
+ let n = { index: t };
1915
+ for (; Ji(e[n.index]) || e[n.index]?.kind === "space";) n.index += 1;
1916
+ let r = Xi(e, n.index);
1917
+ if (r === null) return null;
1918
+ let i = e.slice(t, n.index), a = i.filter((e) => e.kind === "symbol").map((e) => e.text), o = i.map((e) => e.text).join("");
1919
+ return {
1920
+ text: a.join(" ") + r.text,
1921
+ source: o + r.text,
1922
+ signed: a.length > 0,
1923
+ end: r.end
1924
+ };
1925
+ }
1926
+ function Qi(e, t) {
1927
+ let n = { index: t };
1928
+ for (; e[n.index]?.kind === "space";) n.index += 1;
1929
+ return e[n.index]?.kind === "caret" ? n.index : -1;
1930
+ }
1931
+ var $i = (e) => e.signed ? `(${e.text})` : e.text;
1932
+ function ea(e, t) {
1933
+ let n = {
1934
+ text: $i(t),
1935
+ end: t.end,
1936
+ links: 0
1937
+ };
1938
+ for (let t = Qi(e, n.end); t !== -1; t = Qi(e, n.end)) {
1939
+ let r = Zi(e, t + 1);
1940
+ if (r === null) break;
1941
+ let i = n.links === 0 ? n.text : `(${n.text})`;
1942
+ Object.assign(n, {
1943
+ text: `${i}**${$i(r)}`,
1944
+ end: r.end,
1945
+ links: n.links + 1
1946
+ });
1947
+ }
1948
+ return n.links === 0 ? {
1949
+ text: t.source,
1950
+ end: t.end
1951
+ } : n;
1952
+ }
1953
+ var ta = (e) => e === void 0 || e.kind === "open" || e.kind === "symbol" || e.kind === "caret", na = (e, t) => e.kind !== "space" && (!Ji(e) || ta(t));
1954
+ function ra(e) {
1955
+ let t = [], n = {
1956
+ index: 0,
1957
+ previous: void 0
1958
+ };
1959
+ for (; n.index < e.length;) {
1960
+ let r = e[n.index], i = na(r, n.previous) ? Zi(e, n.index) : null, a = i === null ? null : ea(e, i);
1961
+ t.push(a === null ? r.kind === "caret" ? "**" : r.text : a.text);
1962
+ let o = a === null ? n.index + 1 : a.end;
1963
+ r.kind !== "space" && (n.previous = e[o - 1]), n.index = o;
1964
+ }
1965
+ return t.join("");
1966
+ }
1967
+ //#endregion
1968
+ //#region src/engine/concatPrecedence.ts
1969
+ var ia = (e) => e === "\"" || e === "'";
1970
+ function aa(e) {
1971
+ let t = {
1972
+ quote: "",
1973
+ depth: 0
1974
+ };
1975
+ return e.split("").map((n, r) => {
1976
+ let i = ia(n) && !U(e, r) && (t.quote === "" || t.quote === n), a = t.quote !== "" || i;
1977
+ i && (t.quote = t.quote === "" ? n : ""), !a && n === ")" && --t.depth;
1978
+ let o = {
1979
+ char: n,
1980
+ inLiteral: a,
1981
+ depth: t.depth
1982
+ };
1983
+ return !a && n === "(" && (t.depth += 1), o;
1984
+ });
1985
+ }
1986
+ var oa = (e, t) => !e.inLiteral && t.includes(e.char);
1987
+ function sa(e) {
1988
+ let t = aa(e).flatMap((e, t) => e.depth === 0 && oa(e, "&") ? [t] : []);
1989
+ return [-1, ...t].map((n, r) => e.slice(n + 1, t[r] ?? e.length));
1990
+ }
1991
+ function ca(e) {
1992
+ let t = aa(e), n = t.flatMap((e, t) => e.depth === 0 && oa(e, "(") ? [t] : []), r = (e) => t.findIndex((t, n) => n > e && t.depth === 0 && oa(t, ")"));
1993
+ return n.map((e) => ({
1994
+ open: e,
1995
+ close: r(e)
1996
+ })).filter(({ close: e }) => e > 0);
1997
+ }
1998
+ function la(e) {
1999
+ let { pieces: t, cursor: n } = ca(e).reduce((t, { open: n, close: r }) => ({
2000
+ pieces: [
2001
+ ...t.pieces,
2002
+ e.slice(t.cursor, n + 1),
2003
+ pa(e.slice(n + 1, r))
2004
+ ],
2005
+ cursor: r
2006
+ }), {
2007
+ pieces: [],
2008
+ cursor: 0
2009
+ });
2010
+ return [...t, e.slice(n)].join("");
2011
+ }
2012
+ var ua = {
2013
+ true: "\"TRUE\"",
2014
+ false: "\"FALSE\""
2015
+ };
2016
+ function da(e) {
2017
+ let t = e.trim(), n = aa(t);
2018
+ return t.startsWith("(") && n.findIndex((e, t) => t > 0 && e.depth === 0 && oa(e, ")")) === t.length - 1 ? da(t.slice(1, -1)) : t;
2019
+ }
2020
+ var fa = (e) => ua[da(e)] ?? e;
2021
+ function pa(e) {
2022
+ let t = sa(e).map(la);
2023
+ return t.length === 1 ? t[0] ?? "" : `(""+${t.map((e) => `(${fa(e)})`).join("+")})`;
2024
+ }
2025
+ function ma(e) {
2026
+ if (aa(e).some((e) => oa(e, "=<>"))) return Fi(e);
2027
+ let t = sa(e);
2028
+ return t.length > 1 && t.some((e) => e.trim() === "") ? Fi(e) : pa(e);
2029
+ }
2030
+ function ha(e) {
2031
+ let t = sa(e), n = t.flatMap((e) => ca(e).flatMap(({ open: t, close: n }) => ha(e.slice(t + 1, n))));
2032
+ return t.length > 1 ? [...t, ...n] : n;
2033
+ }
2034
+ //#endregion
2035
+ //#region src/engine/textCollation.ts
2036
+ var ga = " \n\v\f\r _-,;:!?.'\"()[]{}@*/\\&#%`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz", _a = 74, va = 8, ya = 14, ba = 31, xa = 127;
2037
+ function Sa(e) {
2038
+ let t = e.codePointAt(0) ?? 0;
2039
+ return t <= va || t >= ya && t <= ba || t === xa;
2040
+ }
2041
+ var Ca = /^[\u0300-\u036f]$/u, wa = /* @__PURE__ */ "34f.332.313 343.314.301 341.300 340.306.302.30c.30a.342.308.344.30b.303.307.338.327.328.304.30d 30e 312 315 31a 33d 33e 33f 346 34a 34b 34c 350 351 352 357 35b 35d 35e.316 317 318 319 31c 31d 31e 31f 320 329 32a 32b 32c 32f 333 33a 33b 33c 347 348 349 34d 34e 353 354 355 356 359 35a 35c 35f 362.336 337.335.305.309.30f.310.311.31b.321.322.323.324.325.326.32d.32e.330.331.334.339.345.358.360.361".split("."), Ta = 0, Ea = "aeioucdhmrtvx", Da = 867, Oa = (e) => Ea.charAt((e.codePointAt(0) ?? 0) - Da) || e, ka = new Map(wa.flatMap((e, t) => e.split(" ").map((e) => [String.fromCodePoint(Number.parseInt(e, 16)), t])));
2042
+ function Aa(e) {
2043
+ let t = ga.indexOf(e);
2044
+ return t >= 0 ? t : _a + (e.codePointAt(0) ?? 0);
2045
+ }
2046
+ function ja(e) {
2047
+ let t = {
2048
+ primary: [],
2049
+ accents: []
2050
+ };
2051
+ return Array.from(e.normalize("NFD")).filter((e) => !Sa(e)).map(Oa).forEach((e) => {
2052
+ let n = t.accents.at(-1);
2053
+ if (Ca.test(e) && n !== void 0) {
2054
+ let t = ka.get(e) ?? Ta;
2055
+ t !== Ta && n.push(t);
2056
+ } else t.primary.push(Aa(e.toLowerCase())), t.accents.push([]);
2057
+ }), t;
2058
+ }
2059
+ function Ma(e, t) {
2060
+ let n = Math.min(e.length, t.length);
2061
+ for (let r = 0; r < n; r += 1) {
2062
+ let [n, i] = [e[r], t[r]];
2063
+ if (n !== void 0 && i !== void 0 && n !== i) return n < i ? -1 : 1;
2064
+ }
2065
+ return e.length - t.length;
2066
+ }
2067
+ function Na(e, t) {
2068
+ return e.reduce((e, n, r) => e || Ma(n, t[r] ?? []), 0);
2069
+ }
2070
+ function Pa(e, t) {
2071
+ let [n, r] = [ja(e), ja(t)];
2072
+ return Ma(n.primary, r.primary) || Na(n.accents, r.accents);
2073
+ }
2074
+ //#endregion
2075
+ //#region src/engine/textComparison.ts
2076
+ var Fa = [
2077
+ "<>",
2078
+ "<=",
2079
+ ">=",
2080
+ "=",
2081
+ "<",
2082
+ ">"
2083
+ ], Ia = "=<>!";
2084
+ function La(e) {
2085
+ let t = [];
2086
+ return aa(e).forEach((e, n) => {
2087
+ if (e.inLiteral || e.depth !== 0 || !Ia.includes(e.char)) return;
2088
+ let r = t.at(-1);
2089
+ r !== void 0 && r.start + r.text.length === n ? r.text += e.char : t.push({
2090
+ start: n,
2091
+ text: e.char
2092
+ });
2093
+ }), t;
2094
+ }
2095
+ var Ra = (e) => Fa.some((t) => t === e);
2096
+ function za(e) {
2097
+ let t = La(e);
2098
+ if (t.length === 0) return null;
2099
+ let n = t.map((e) => e.text);
2100
+ if (!n.every(Ra)) return null;
2101
+ let r = [{
2102
+ start: 0,
2103
+ text: ""
2104
+ }, ...t].map((n, r) => ({
2105
+ from: n.start + n.text.length,
2106
+ to: t[r]?.start ?? e.length
2107
+ })).map(({ from: t, to: n }) => e.slice(t, n).trim());
2108
+ return r.some((e) => e === "") ? null : {
2109
+ operands: r,
2110
+ operators: n.filter(Ra)
2111
+ };
2112
+ }
2113
+ var Ba = 0, Va = 1, Ha = 2, Ua = (e) => typeof e == "number" ? Ba : typeof e == "boolean" ? Ha : Va;
2114
+ function Wa(e, t) {
2115
+ let n = Ua(e) - Ua(t);
2116
+ return n === 0 ? typeof e == "number" && typeof t == "number" ? e - t : typeof e == "boolean" && typeof t == "boolean" ? Number(e) - Number(t) : Pa(String(e), String(t)) : n;
2117
+ }
2118
+ var Ga = {
2119
+ "=": (e) => e === 0,
2120
+ "<>": (e) => e !== 0,
2121
+ "<": (e) => e < 0,
2122
+ ">": (e) => e > 0,
2123
+ "<=": (e) => e <= 0,
2124
+ ">=": (e) => e >= 0
2125
+ };
2126
+ function Ka(e, t, n) {
2127
+ return Ga[e](Wa(t, n));
2128
+ }
2129
+ function qa(e, t) {
2130
+ return t.reduce((t, n, r) => Ka(n, t, e[r + 1] ?? ""), e[0] ?? "");
2131
+ }
2132
+ //#endregion
2133
+ //#region src/engine/blankOperands.ts
2134
+ var Ja = (e) => typeof e == "number" ? 0 : typeof e != "boolean" && "";
2135
+ function Ya(e, t) {
2136
+ return e.map((n, r) => t[r] ? r === 0 ? Ja(e[1] ?? 0) : r === 1 && Ja(e[0] ?? 0) : n);
2137
+ }
2138
+ //#endregion
2139
+ //#region src/engine/condition.ts
2140
+ var Xa = [
2141
+ ">=",
2142
+ "<=",
2143
+ "<>",
2144
+ "!=",
2145
+ "==",
2146
+ "=",
2147
+ ">",
2148
+ "<"
2149
+ ];
2150
+ function* Za(e) {
2151
+ let t = null;
2152
+ for (let n = 0; n < e.length; n++) {
2153
+ let r = e[n];
2154
+ t === null ? r === "\"" || r === "'" ? t = r : yield n : r === "\\" ? n++ : r === t && (t = null);
2155
+ }
2156
+ }
2157
+ function Qa(e) {
2158
+ let t = e.trim();
2159
+ for (; t.startsWith("(") && t.endsWith(")");) {
2160
+ let e = 0, n = !0;
2161
+ for (let r of Za(t)) {
2162
+ let i = t[r];
2163
+ if (i === "(") e++;
2164
+ else if (i === ")") {
2165
+ if (e--, e === 0 && r < t.length - 1) {
2166
+ n = !1;
2167
+ break;
2168
+ }
2169
+ if (e < 0) return t;
2170
+ }
2171
+ }
2172
+ if (!n || e !== 0) return t;
2173
+ t = t.slice(1, -1).trim();
2174
+ }
2175
+ return t;
2176
+ }
2177
+ function $a(e) {
2178
+ let t = Qa(e);
2179
+ for (let e of Za(t)) for (let n of Xa) if (t.startsWith(n, e)) return {
2180
+ left: t.slice(0, e).trim(),
2181
+ operator: n,
2182
+ right: t.slice(e + n.length).trim()
2183
+ };
2184
+ return null;
2185
+ }
2186
+ function eo(e) {
2187
+ return e.length >= 2 && (e.startsWith("\"") && e.endsWith("\"") || e.startsWith("'") && e.endsWith("'")) ? {
2188
+ value: e.slice(1, -1).replace(/\\(["'\\])/g, "$1"),
2189
+ quoted: !0
2190
+ } : {
2191
+ value: e,
2192
+ quoted: !1
2193
+ };
2194
+ }
2195
+ function to(e) {
2196
+ let { value: t, quoted: n } = eo(e.trim());
2197
+ if (n) return t;
2198
+ if (t === "") return "";
2199
+ let r = t.toUpperCase();
2200
+ if (r === "TRUE") return !0;
2201
+ if (r === "FALSE") return !1;
2202
+ let i = Number(t);
2203
+ return Number.isNaN(i) ? t : i;
2204
+ }
2205
+ var no = {
2206
+ ">=": ">=",
2207
+ "<=": "<=",
2208
+ "<>": "<>",
2209
+ "!=": "<>",
2210
+ "==": "=",
2211
+ "=": "=",
2212
+ ">": ">",
2213
+ "<": "<"
2214
+ };
2215
+ function ro(e, t) {
2216
+ let [n, r] = [t(e.left), t(e.right)], i = e.left === "" ? Ja(r) : n, a = e.right === "" ? Ja(n) : r;
2217
+ return Ka(no[e.operator], i, a);
2218
+ }
2219
+ function io(e) {
2220
+ return typeof e == "boolean" ? e : typeof e == "number" ? e !== 0 : e !== "";
2221
+ }
2222
+ function ao(e, t) {
2223
+ let n = $a(e);
2224
+ return n ? ro(n, t) : io(t(Qa(e)));
2225
+ }
2226
+ function oo(e) {
2227
+ if (e == null) return "\"\"";
2228
+ let t = S(e) ? e.code : e;
2229
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
2230
+ }
2231
+ //#endregion
2232
+ //#region src/engine/sheetReference.ts
2233
+ var so = /^(?:'((?:[^']|'')+)'|([^!]+))!(.+)$/;
2234
+ function co(e) {
2235
+ let [, t, n, r] = e.match(so) ?? [], i = t === void 0 ? n : t.replace(/''/g, "'");
2236
+ return i === void 0 || r === void 0 ? null : {
2237
+ sheetName: i,
2238
+ ref: r
2239
+ };
2240
+ }
2241
+ function lo(e, t) {
2242
+ let n = e.indexOf("'", t + 1);
2243
+ return n === -1 ? -1 : e[n + 1] === "'" ? lo(e, n + 1) : n + 1;
2244
+ }
2245
+ //#endregion
2246
+ //#region src/engine/concatOperand.ts
2247
+ var uo = (e) => e.trim() === "";
2248
+ function fo(e, t) {
2249
+ let n = { at: t - 1 };
2250
+ for (; n.at >= 0 && (uo(e[n.at] ?? "") || e[n.at] === "(");) --n.at;
2251
+ return n.at < 0 ? "" : e[n.at] ?? "";
2252
+ }
2253
+ function po(e, t) {
2254
+ let n = { at: t };
2255
+ for (; n.at < e.length && (uo(e[n.at] ?? "") || e[n.at] === ")");) n.at += 1;
2256
+ return n.at >= e.length ? "" : e[n.at] ?? "";
2257
+ }
2258
+ var mo = (e) => e === "" || e === "&";
2259
+ function ho(e, t, n) {
2260
+ let r = fo(e, t), i = po(e, n);
2261
+ return mo(r) && mo(i) && (r === "&" || i === "&");
2262
+ }
2263
+ //#endregion
2264
+ //#region src/engine/formulaError.ts
2265
+ var W = {
2266
+ div_zero: "#DIV/0!",
2267
+ invalid_ref: "#REF!",
2268
+ syntax: "#NAME?",
2269
+ unknown: "#ERROR!"
2270
+ }, go = {
2271
+ [W.div_zero]: "div_zero",
2272
+ [W.invalid_ref]: "invalid_ref",
2273
+ [W.syntax]: "syntax"
2274
+ }, G = class extends Error {
2275
+ errorType;
2276
+ display;
2277
+ constructor(e, t, n) {
2278
+ super(n ?? t), this.errorType = e, this.display = t, this.name = "FormulaError";
2279
+ }
2280
+ }, _o = (e) => e instanceof G, vo = () => new G("div_zero", W.div_zero, "Division by zero"), yo = (e) => new G("invalid_ref", W.invalid_ref, `Invalid reference: ${e}`), bo = (e) => new G("syntax", W.syntax, `Unknown function: ${e}`), xo = (e) => new G("unknown", W.unknown, e), So = (e) => new G(go[e] ?? "unknown", e, `Propagated error: ${e}`), Co = (e) => _o(e) ? {
2281
+ type: e.errorType,
2282
+ display: e.display
2283
+ } : {
2284
+ type: "unknown",
2285
+ display: W.unknown
2286
+ }, wo = /("(?:[^"\\]|\\.|"")*"?|'(?:[^']|'')*'?)/, To = /(?<![\w$.!])(TRUE|FALSE)(?![\w$.]|\s*[(!])/gi;
2287
+ function Eo(e) {
2288
+ return e.split(wo).map((e, t) => t % 2 == 1 ? e : e.replace(To, (e) => e.toLowerCase())).join("");
2289
+ }
2290
+ var Do = /^\(*\s*(true|false)\s*\)*$/;
2291
+ function Oo(e) {
2292
+ let [, t] = e.trim().match(Do) ?? [];
2293
+ return t === void 0 ? null : t === "true";
2294
+ }
2295
+ function ko(e) {
2296
+ return /["']/.test(e) ? e : e.replace(/\btrue\b/g, "1").replace(/\bfalse\b/g, "0");
2297
+ }
2298
+ //#endregion
2299
+ //#region src/engine/evaluator.ts
2300
+ var Ao = RegExp(`^(${ot})\\((.*)\\)$`, "i"), jo = RegExp(`^(${ot})\\(`, "i");
2301
+ function Mo(e) {
2302
+ if (e == null) return "0";
2303
+ let t = S(e) ? e.code : e;
2304
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
2305
+ }
2306
+ function No(e) {
2307
+ let t = "", n = null;
2308
+ for (let r = 0; r < e.length; r++) {
2309
+ let i = e[r];
2310
+ if (n !== null) {
2311
+ if (i === "\\") {
2312
+ r++;
2313
+ continue;
2314
+ }
2315
+ i === n && (n = null, t += i);
2316
+ } else (i === "\"" || i === "'") && (n = i), t += i;
2317
+ }
2318
+ return t;
2319
+ }
2320
+ function Po(e) {
2321
+ let t = No(e).replace(/\b(?:true|false)\b/g, "");
2322
+ return /^[\d+\-*/(). "']*$/.test(t);
2323
+ }
2324
+ function Fo(e, t) {
2325
+ let n = e[t], r = t + 1;
2326
+ for (; r < e.length;) if (e[r] === "\\") r += 2;
2327
+ else {
2328
+ if (e[r] === n) return r + 1;
2329
+ r++;
2330
+ }
2331
+ return e.length;
2332
+ }
2333
+ function Io(e, t) {
2334
+ let n = lo(e, t);
2335
+ if (n === -1 || e[n] !== "!") return null;
2336
+ let r = e.substring(n + 1).match(/^(\$?[A-Z]+\$?\d+)/);
2337
+ return r ? e.substring(t, n + 1 + r[0].length) : null;
2338
+ }
2339
+ function Lo(e, t) {
2340
+ let n = e.substring(t), r = n.match(/^([A-Z][A-Z0-9]*)!/i);
2341
+ if (r) {
2342
+ let e = n.substring(r[0].length).match(/^(\$?[A-Z]+\$?\d+)/);
2343
+ if (e) return r[0] + e[0];
2344
+ }
2345
+ let i = n.match(/^(\$?[A-Z]+\$?\d+)/);
2346
+ return i ? i[0] : null;
2347
+ }
2348
+ function Ro(e) {
2349
+ let t = [], n = 0;
2350
+ for (; n < e.length;) {
2351
+ let r = e[n];
2352
+ if (r === "\"") {
2353
+ n = Fo(e, n);
2354
+ continue;
2355
+ }
2356
+ if (r === "'") {
2357
+ let r = Io(e, n);
2358
+ r ? (t.push({
2359
+ ref: r,
2360
+ start: n
2361
+ }), n += r.length) : n = Fo(e, n);
2362
+ continue;
2363
+ }
2364
+ let i = Lo(e, n);
2365
+ i ? (t.push({
2366
+ ref: i,
2367
+ start: n
2368
+ }), n += i.length) : n++;
2369
+ }
2370
+ return t;
2371
+ }
2372
+ function zo(e, t, n) {
2373
+ return [...t].reverse().reduce((e, { ref: t, start: r }) => e.slice(0, r) + n(t, r) + e.slice(r + t.length), e);
2374
+ }
2375
+ function Bo(e) {
2376
+ let t = [], n = "", r = 0, i = !1, a = "";
2377
+ for (let o = 0; o < e.length; o++) {
2378
+ let s = e[o];
2379
+ (s === "\"" || s === "'") && !U(e, o) ? (i ? s === a && (i = !1, a = "") : (i = !0, a = s), n += s) : !i && (s === "(" && r++, s === ")" && r--, s === "," && r === 0) ? (t.push(n.trim()), n = "") : n += s;
2380
+ }
2381
+ return n.trim() && t.push(n.trim()), t;
2382
+ }
2383
+ function Vo(e) {
2384
+ let t;
2385
+ try {
2386
+ t = Function(`return (${Ii(e)})`)();
2387
+ } catch {
2388
+ throw xo();
2389
+ }
2390
+ if (typeof t == "number") {
2391
+ if (!Number.isFinite(t)) throw vo();
2392
+ return t;
2393
+ }
2394
+ if (typeof t == "string" || typeof t == "boolean") return t;
2395
+ throw xo();
2396
+ }
2397
+ function Ho(e) {
2398
+ if (!e.includes("&")) return null;
2399
+ let t = ma(e);
2400
+ return Po(t) ? (ha(e).filter(Ri).forEach(Vo), Vo(t)) : null;
2401
+ }
2402
+ var Uo = /^\(*\s*(true|false)\s*\)*$/i, Wo = (e) => (e.startsWith("\"") || e.startsWith("'")) && e.endsWith(e[0] ?? "") && Fo(e, 0) === e.length;
2403
+ function Go(e) {
2404
+ let t = Uo.exec(e)?.[1];
2405
+ if (t !== void 0) return t.toLowerCase() === "true";
2406
+ let n = Ho(e);
2407
+ return n === null ? Ri(e) || Wo(Qa(e)) ? Vo(e) : null : n;
2408
+ }
2409
+ var Ko = (e) => e !== null;
2410
+ function qo(e, t) {
2411
+ let n = za(e), r = t.isCellEmpty;
2412
+ return !n || !r ? null : n.operands.map((e) => {
2413
+ let t = Jo(e);
2414
+ return t !== null && r(t);
2415
+ });
2416
+ }
2417
+ function Jo(e) {
2418
+ let t = Qa(e).trim(), [n, ...r] = Ro(t);
2419
+ return n && r.length === 0 && n.start === 0 && n.ref.length === t.length ? n.ref : null;
2420
+ }
2421
+ function Yo(e, t) {
2422
+ let n = Eo(e), r = n.trim();
2423
+ if (Wo(r)) {
2424
+ let e = r.slice(1, -1), n = Ze(e, t.preferDDMMYYYY);
2425
+ return n === null ? e : n;
2426
+ }
2427
+ let [, i, a] = n.match(Ao) ?? [];
2428
+ if (i !== void 0 && a !== void 0 && st(i)) {
2429
+ let e = 0, n = !0;
2430
+ for (let t of a) if (t === "(") e++;
2431
+ else if (t === ")" && (e--, e < 0)) {
2432
+ n = !1;
2433
+ break;
2434
+ }
2435
+ let r = i.toUpperCase(), o = k.get(r);
2436
+ if (o && n) {
2437
+ let e = Bo(a);
2438
+ if (o.minArgs !== void 0 && e.length < o.minArgs) throw it(r, o.minArgs);
2439
+ if (o.maxArgs !== void 0 && e.length > o.maxArgs) throw Error(`${r} accepts at most ${o.maxArgs} argument${o.maxArgs === 1 ? "" : "s"}`);
2440
+ return o.handler(e, {
2441
+ functionName: r,
2442
+ getCellValue: t.getCellValue,
2443
+ getRangeValues: t.getRangeValues,
2444
+ getRangeValuesRaw: t.getRangeValuesRaw,
2445
+ getRangeValuesKeepingBlanks: t.getRangeValuesKeepingBlanks,
2446
+ countFilledCells: t.countFilledCells,
2447
+ evaluateFormula: t.evaluateFormula,
2448
+ isBlankReference: (e) => {
2449
+ let n = Jo(e);
2450
+ return n !== null && t.isCellEmpty?.(n) === !0;
2451
+ },
2452
+ preferDDMMYYYY: t.preferDDMMYYYY
2453
+ });
2454
+ }
2455
+ if (n && !o) throw bo(r);
2456
+ }
2457
+ let o = n, s = 0, c = 0;
2458
+ for (; s < o.length && c < 100;) {
2459
+ if (c++, o[s] === "\"" || o[s] === "'") {
2460
+ s = Fo(o, s);
2461
+ continue;
2462
+ }
2463
+ let [, e] = o.substring(s).match(jo) ?? [];
2464
+ if (e === void 0 || !st(e)) {
2465
+ if (s++, s >= o.length) break;
2466
+ continue;
2467
+ }
2468
+ let n = s, r = s + e.length + 1, i = 1, a = r, l = !1, u = "";
2469
+ for (; a < o.length && i > 0;) {
2470
+ let e = o[a];
2471
+ (e === "\"" || e === "'") && !U(o, a) && (l ? e === u && (l = !1, u = "") : (l = !0, u = e)), l || (e === "(" ? i++ : e === ")" && i--), a++;
2472
+ }
2473
+ if (i === 0) {
2474
+ let e = o.substring(n, a), r = t.evaluateFormula(e);
2475
+ if (S(r)) throw So(r.code);
2476
+ let i = typeof r == "string" ? Mo(r) : `(${r})`;
2477
+ o = o.substring(0, n) + i + o.substring(a), s = n + i.length;
2478
+ } else s++;
2479
+ }
2480
+ let l = Ro(o), u = l.length === 1 ? l[0] : void 0;
2481
+ if (u) {
2482
+ let e = o.slice(0, u.start), n = o.slice(u.start + u.ref.length);
2483
+ if (e.trim() === "" && n.trim() === "") return t.getCellValue(u.ref);
2484
+ }
2485
+ let d = o, f = qo(d, t);
2486
+ o = zo(o, l, (e, n) => {
2487
+ if (ho(d, n, n + e.length) && t.isCellEmpty?.(e)) return "\"\"";
2488
+ let r = t.getCellValue(e), i = Ne(r);
2489
+ if (i !== null) throw So(i);
2490
+ return Mo(r);
2491
+ }), o = o.replace(/"([^"]+)"/g, (e, n) => {
2492
+ let r = Ze(n, t.preferDDMMYYYY);
2493
+ return r === null ? e : r.toString();
2494
+ }), o = Ni(o);
2495
+ let p = za(o);
2496
+ if (p) {
2497
+ let e = p.operands.map(Go), t = f?.length === e.length;
2498
+ if (e.every(Ko)) return qa(t ? Ya(e, f) : e, p.operators);
2499
+ }
2500
+ let ee = Ho(o);
2501
+ if (ee !== null) return ee;
2502
+ let m = Oo(o);
2503
+ if (m !== null) return m;
2504
+ if (o = ko(o), zi(o)) return Vo(Li(o));
2505
+ if (Ri(o)) return Vo(o);
2506
+ let h = o.trim();
2507
+ return h.startsWith("\"") && h.endsWith("\"") || h.startsWith("'") && h.endsWith("'") ? h.slice(1, -1) : o;
2508
+ }
2509
+ k.register({
2510
+ name: "IF",
2511
+ handler: (e, t) => {
2512
+ let n = D(t, e, 0), r = D(t, e, 1), i = D(t, e, 2), a = R(t.evaluateFormula(n)) ? r : i;
2513
+ return /^["'](.*)["']$/.test(a) ? a.slice(1, -1) : t.evaluateFormula(a);
2514
+ },
2515
+ minArgs: 3,
2516
+ maxArgs: 3,
2517
+ description: "Returns one value if a condition is true and another if false",
2518
+ examples: ["IF(A1>10, \"High\", \"Low\")", "IF(B2>=5, SUM(C1:C10), 0)"],
2519
+ category: "Logical"
2520
+ }), k.register({
2521
+ name: "AND",
2522
+ handler: (e, t) => {
2523
+ for (let n of e) if (!R(t.evaluateFormula(n.trim()))) return !1;
2524
+ return !0;
2525
+ },
2526
+ minArgs: 1,
2527
+ description: "Returns TRUE if all arguments are true",
2528
+ examples: ["AND(A1>5, B1<10)", "AND(A1>0, B1>0, C1>0)"],
2529
+ category: "Logical"
2530
+ }), k.register({
2531
+ name: "OR",
2532
+ handler: (e, t) => {
2533
+ for (let n of e) if (R(t.evaluateFormula(n.trim()))) return !0;
2534
+ return !1;
2535
+ },
2536
+ minArgs: 1,
2537
+ description: "Returns TRUE if any argument is true",
2538
+ examples: ["OR(A1>5, B1<10)", "OR(A1>0, B1>0)"],
2539
+ category: "Logical"
2540
+ }), k.register({
2541
+ name: "NOT",
2542
+ handler: (e, t) => !R(t.evaluateFormula(D(t, e, 0))),
2543
+ minArgs: 1,
2544
+ maxArgs: 1,
2545
+ description: "Reverses the logical value of its argument",
2546
+ examples: ["NOT(A1>5)", "NOT(B1)"],
2547
+ category: "Logical"
2548
+ }), k.register({
2549
+ name: "IFERROR",
2550
+ handler: (e, t) => {
2551
+ try {
2552
+ let n = t.evaluateFormula(D(t, e, 0));
2553
+ return Pe(n) ? t.evaluateFormula(D(t, e, 1)) : n;
2554
+ } catch {
2555
+ return t.evaluateFormula(D(t, e, 1));
2556
+ }
2557
+ },
2558
+ minArgs: 2,
2559
+ maxArgs: 2,
2560
+ description: "Returns a value if expression is an error, otherwise returns the expression",
2561
+ examples: ["IFERROR(A1/B1, 0)", "IFERROR(VLOOKUP(A1, B1:C10, 2), \"Not found\")"],
2562
+ category: "Logical"
2563
+ }), k.register({
2564
+ name: "IFNA",
2565
+ handler: (e, t) => {
2566
+ let n = t.evaluateFormula(D(t, e, 0)), r = S(n) && n.code === x.code;
2567
+ return n == null || r ? t.evaluateFormula(D(t, e, 1)) : n;
2568
+ },
2569
+ minArgs: 2,
2570
+ maxArgs: 2,
2571
+ description: "Returns a value if expression is #N/A, otherwise returns the expression",
2572
+ examples: ["IFNA(A1, \"N/A\")", "IFNA(MATCH(A1, B1:B10), 0)"],
2573
+ category: "Logical"
2574
+ }), k.register({
2575
+ name: "IFS",
2576
+ handler: (e, t) => {
2577
+ if (e.length < 2 || e.length % 2 != 0) throw Error("IFS requires an even number of arguments (condition-value pairs)");
2578
+ for (let n = 0; n < e.length; n += 2) {
2579
+ let r = D(t, e, n), i = D(t, e, n + 1);
2580
+ if (ao(zo(r, Ro(r), (e) => oo(t.getCellValue(e))), (e) => {
2581
+ let n = to(e);
2582
+ return typeof n == "string" && n === e.trim() ? t.evaluateFormula(e) : n;
2583
+ })) return /^["'](.*)["']$/.test(i) ? i.slice(1, -1) : t.evaluateFormula(i);
2584
+ }
2585
+ return x;
2586
+ },
2587
+ minArgs: 2,
2588
+ description: "Checks multiple conditions and returns the first true result",
2589
+ examples: ["IFS(A1>90, \"A\", A1>80, \"B\", A1>70, \"C\")", "IFS(B1=\"Yes\", 1, B1=\"No\", 0)"],
2590
+ category: "Logical"
2591
+ }), k.register({
2592
+ name: "TRUE",
2593
+ handler: () => !0,
2594
+ minArgs: 0,
2595
+ maxArgs: 0,
2596
+ description: "Returns the logical value TRUE",
2597
+ examples: ["TRUE()", "IF(A1>0, TRUE(), FALSE())"],
2598
+ category: "Logical"
2599
+ }), k.register({
2600
+ name: "FALSE",
2601
+ handler: () => !1,
2602
+ minArgs: 0,
2603
+ maxArgs: 0,
2604
+ description: "Returns the logical value FALSE",
2605
+ examples: ["FALSE()", "IF(A1>0, TRUE(), FALSE())"],
2606
+ category: "Logical"
2607
+ });
2608
+ //#endregion
2609
+ //#region src/engine/formatter.ts
2610
+ function Xo(e) {
2611
+ return /[YMD]|MMM|DD|YYYY|h:mm|AM\/PM/i.test(e);
2612
+ }
2613
+ var Zo = /YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|AM\/PM|am\/pm|HH|H|hh|h|mm|ss/g;
2614
+ function Qo(e, t) {
2615
+ let n = T(e), r = n.getUTCFullYear(), i = n.getUTCMonth(), a = n.getUTCDate(), o = n.getUTCHours(), s = n.getUTCMinutes(), c = n.getUTCSeconds(), l = n.getUTCDay(), u = /AM\/PM|am\/pm/.test(t), d = o % 12 || 12, f = o >= 12, p = {
2616
+ YYYY: r.toString(),
2617
+ YY: (r % 100).toString().padStart(2, "0"),
2618
+ MMMM: He[i] ?? He[0],
2619
+ MMM: Ve[i] ?? Ve[0],
2620
+ MM: (i + 1).toString().padStart(2, "0"),
2621
+ M: (i + 1).toString(),
2622
+ dddd: We[l] ?? We[0],
2623
+ ddd: Ue[l] ?? Ue[0],
2624
+ DD: a.toString().padStart(2, "0"),
2625
+ D: a.toString(),
2626
+ "AM/PM": f ? "PM" : "AM",
2627
+ "am/pm": f ? "pm" : "am",
2628
+ HH: o.toString().padStart(2, "0"),
2629
+ H: o.toString(),
2630
+ hh: (u ? d : o).toString().padStart(2, "0"),
2631
+ h: (u ? d : o).toString(),
2632
+ mm: s.toString().padStart(2, "0"),
2633
+ ss: c.toString().padStart(2, "0")
2634
+ };
2635
+ return t.replace(Zo, (e) => p[e] ?? e);
2636
+ }
2637
+ var $o = 3, es = (e) => Array.from(e).reduce((t, n, r) => r > 0 && (e.length - r) % $o === 0 ? `${t},${n}` : `${t}${n}`, ""), ts = (e) => {
2638
+ let [t, ...n] = e.split(".");
2639
+ return t === void 0 ? e : [es(t), ...n].join(".");
2640
+ };
2641
+ function ns(e, t) {
2642
+ if (!t) return e.toString();
2643
+ try {
2644
+ if (Xo(t)) return Qo(e, t);
2645
+ if (t.includes("$")) {
2646
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = Math.abs(e).toFixed(n >= 0 ? n : 0), i = "$" + (t.includes(",") ? ts(r) : r);
2647
+ return e < 0 ? "-" + i : i;
2648
+ }
2649
+ if (t.includes("%")) {
2650
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
2651
+ return (e * 100).toFixed(n >= 0 ? n : 2) + "%";
2652
+ }
2653
+ if (t.includes(",")) {
2654
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = ts(Math.abs(e).toFixed(n >= 0 ? n : 0));
2655
+ return e < 0 ? "-" + r : r;
2656
+ }
2657
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
2658
+ return n >= 0 ? e.toFixed(n) : e.toString();
2659
+ } catch (t) {
2660
+ return console.error("Format error:", t), e.toString();
2661
+ }
2662
+ }
2663
+ //#endregion
2664
+ //#region src/engine/textFormat.ts
2665
+ var rs = 100, is = "?\\*_[]\"@;/", as = /[#0][#0,.]*/, os = /[#0]/, ss = /0+$/, cs = (e, t) => Array.from(e).filter((e) => t.includes(e)).length, ls = (e) => Array.from(e).some((e) => is.includes(e)), us = (e) => {
2666
+ let t = as.exec(e);
2667
+ if (!t || t[0].endsWith(",")) return null;
2668
+ let n = e.slice(0, t.index), r = e.slice(t.index + t[0].length);
2669
+ if (os.test(r) || ls(n) || ls(r)) return null;
2670
+ let [i, a = "", ...o] = t[0].split(".");
2671
+ return i === void 0 || o.length > 0 ? null : {
2672
+ prefix: n,
2673
+ suffix: r,
2674
+ useGrouping: i.includes(","),
2675
+ integerMinDigits: cs(i, "0"),
2676
+ minDecimals: cs(a, "0"),
2677
+ maxDecimals: cs(a, "#0"),
2678
+ isPercent: n.includes("%") || r.includes("%")
2679
+ };
2680
+ }, ds = (e, t) => {
2681
+ let n = e.replace(ss, "");
2682
+ return n.length >= t ? n : e.slice(0, t);
2683
+ }, fs = (e, t) => {
2684
+ let n = e.toFixed(t.maxDecimals), r = n.indexOf("."), i = r === -1 ? n : n.slice(0, r), a = r === -1 ? "" : n.slice(r + 1), o = i.padStart(t.integerMinDigits, "0"), s = t.useGrouping ? es(o) : o, c = ds(a, t.minDecimals);
2685
+ return c ? `${s}.${c}` : s;
2686
+ }, ps = (e) => Array.from(e).every((e) => e === "0" || e === "," || e === "."), ms = (e, t) => {
2687
+ if (!Number.isFinite(e)) return null;
2688
+ let n = us(t);
2689
+ if (!n) return null;
2690
+ let r = n.isPercent ? e * rs : e, i = fs(Math.abs(r), n);
2691
+ return `${r < 0 && !ps(i) ? "-" : ""}${n.prefix}${i}${n.suffix}`;
2692
+ }, hs = (e) => /[\p{L}\p{M}]/u.test(e), gs = (e) => {
2693
+ let t = Array.from(e);
2694
+ return t.map((e, n) => {
2695
+ let r = t[n - 1];
2696
+ return r === void 0 || !hs(r) ? e.toUpperCase() : e.toLowerCase();
2697
+ }).join("");
2698
+ }, _s = (e) => !Number.isFinite(e) || e < 0 ? y : Math.trunc(e), vs = (e, t) => {
2699
+ let n = _s(t);
2700
+ return S(n) ? n : e.substring(0, n);
2701
+ }, ys = (e, t) => {
2702
+ let n = _s(t);
2703
+ return S(n) ? n : e.substring(e.length - n);
2704
+ }, bs = (e, t, n, r) => {
2705
+ let i = e.split(t);
2706
+ return r > i.length - 1 ? e : i.slice(0, r).join(t) + n + i.slice(r).join(t);
2707
+ }, xs = (e, t, n, r) => {
2708
+ if (t === "") return e;
2709
+ if (r === void 0) return e.split(t).join(n);
2710
+ let i = Math.trunc(r);
2711
+ return !Number.isFinite(i) || i <= 0 ? y : bs(e, t, n, i);
2712
+ }, Ss = (e, t) => e.isBlankReference?.(t) ? "" : ct(e.evaluateFormula(t)), K = (e, t, n) => Ss(e, D(e, t, n)), Cs = (e, t) => e.map((e) => Ss(t, e.trim())).join(""), ws = Cs, Ts = (e, t) => vs(K(t, e, 0), e.length === 2 ? Number(t.evaluateFormula(D(t, e, 1))) : 1), Es = (e, t) => ys(K(t, e, 0), e.length === 2 ? Number(t.evaluateFormula(D(t, e, 1))) : 1), Ds = (e, t, n) => {
2713
+ let r = _s(n);
2714
+ if (S(r)) return r;
2715
+ if (!Number.isFinite(t) || t < 1) return y;
2716
+ let i = Math.trunc(t) - 1;
2717
+ return e.substring(i, i + r);
2718
+ }, Os = (e, t) => Ds(K(t, e, 0), Number(t.evaluateFormula(D(t, e, 1))), Number(t.evaluateFormula(D(t, e, 2)))), ks = (e, t) => K(t, e, 0).length, As = (e, t) => K(t, e, 0).toUpperCase(), js = (e, t) => K(t, e, 0).toLowerCase(), Ms = (e, t) => gs(K(t, e, 0)), Ns = (e, t) => K(t, e, 0).trim().replace(/\s+/g, " "), Ps = (e, t) => xs(K(t, e, 0), K(t, e, 1), K(t, e, 2), e.length === 4 ? Number(t.evaluateFormula(D(t, e, 3))) : void 0), Fs = (e, t) => {
2719
+ let n = K(t, e, 0), r = Number(t.evaluateFormula(D(t, e, 1))) - 1, i = Number(t.evaluateFormula(D(t, e, 2))), a = K(t, e, 3);
2720
+ return n.substring(0, r) + a + n.substring(r + i);
2721
+ }, Is = (e, t, n, r) => {
2722
+ let i = r.caseInsensitive ? e.toLowerCase() : e, a = (r.caseInsensitive ? t.toLowerCase() : t).indexOf(i, n);
2723
+ return a === -1 ? y : a + 1;
2724
+ }, Ls = (e) => (t, n) => Is(K(n, t, 0), K(n, t, 1), t.length === 3 ? Number(n.evaluateFormula(D(n, t, 2))) - 1 : 0, { caseInsensitive: e }), Rs = Ls(!1), zs = Ls(!0), Bs = (e) => e.replace(/^["']/, "").replace(/["']$/, ""), Vs = (e, t) => {
2725
+ let n = t.evaluateFormula(D(t, e, 0)), r = Bs(K(t, e, 1));
2726
+ return typeof n == "number" ? ms(n, r) ?? ct(n) : ct(n);
2727
+ }, Hs = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/, Us = (e) => {
2728
+ if (!Hs.test(e)) return null;
2729
+ let t = Number(e);
2730
+ return Number.isFinite(t) ? t : null;
2731
+ }, Ws = (e) => {
2732
+ let t = e.replace(/[$,]/g, "").trim();
2733
+ if (t.endsWith("%")) {
2734
+ let e = Us(t.slice(0, -1).trim());
2735
+ return e === null ? y : e / 100;
2736
+ }
2737
+ let n = Us(t);
2738
+ return n === null ? y : n;
2739
+ };
2740
+ k.register({
2741
+ name: "CONCATENATE",
2742
+ handler: Cs,
2743
+ minArgs: 1,
2744
+ description: "Joins several text strings into one string",
2745
+ examples: ["CONCATENATE(\"Hello\", \" \", \"World\")", "CONCATENATE(A1, B1)"],
2746
+ category: "Text"
2747
+ }), k.register({
2748
+ name: "CONCAT",
2749
+ handler: ws,
2750
+ minArgs: 1,
2751
+ description: "Joins several text strings into one string (same as CONCATENATE)",
2752
+ examples: ["CONCAT(\"Hello\", \" \", \"World\")", "CONCAT(A1, B1)"],
2753
+ category: "Text"
2754
+ }), k.register({
2755
+ name: "LEFT",
2756
+ handler: Ts,
2757
+ minArgs: 1,
2758
+ maxArgs: 2,
2759
+ description: "Returns the leftmost characters from a text string",
2760
+ examples: ["LEFT(\"Hello\", 2)", "LEFT(A1, 3)"],
2761
+ category: "Text"
2762
+ }), k.register({
2763
+ name: "RIGHT",
2764
+ handler: Es,
2765
+ minArgs: 1,
2766
+ maxArgs: 2,
2767
+ description: "Returns the rightmost characters from a text string",
2768
+ examples: ["RIGHT(\"Hello\", 2)", "RIGHT(A1, 3)"],
2769
+ category: "Text"
2770
+ }), k.register({
2771
+ name: "MID",
2772
+ handler: Os,
2773
+ minArgs: 3,
2774
+ maxArgs: 3,
2775
+ description: "Returns characters from the middle of a text string",
2776
+ examples: ["MID(\"Hello\", 2, 3)", "MID(A1, 1, 5)"],
2777
+ category: "Text"
2778
+ }), k.register({
2779
+ name: "LEN",
2780
+ handler: ks,
2781
+ minArgs: 1,
2782
+ maxArgs: 1,
2783
+ description: "Returns the number of characters in a text string",
2784
+ examples: ["LEN(\"Hello\")", "LEN(A1)"],
2785
+ category: "Text"
2786
+ }), k.register({
2787
+ name: "UPPER",
2788
+ handler: As,
2789
+ minArgs: 1,
2790
+ maxArgs: 1,
2791
+ description: "Converts text to uppercase",
2792
+ examples: ["UPPER(\"hello\")", "UPPER(A1)"],
2793
+ category: "Text"
2794
+ }), k.register({
2795
+ name: "LOWER",
2796
+ handler: js,
2797
+ minArgs: 1,
2798
+ maxArgs: 1,
2799
+ description: "Converts text to lowercase",
2800
+ examples: ["LOWER(\"HELLO\")", "LOWER(A1)"],
2801
+ category: "Text"
2802
+ }), k.register({
2803
+ name: "PROPER",
2804
+ handler: Ms,
2805
+ minArgs: 1,
2806
+ maxArgs: 1,
2807
+ description: "Capitalizes the first letter of each word",
2808
+ examples: ["PROPER(\"hello world\")", "PROPER(A1)"],
2809
+ category: "Text"
2810
+ }), k.register({
2811
+ name: "TRIM",
2812
+ handler: Ns,
2813
+ minArgs: 1,
2814
+ maxArgs: 1,
2815
+ description: "Removes extra spaces from text",
2816
+ examples: ["TRIM(\" hello world \")", "TRIM(A1)"],
2817
+ category: "Text"
2818
+ }), k.register({
2819
+ name: "SUBSTITUTE",
2820
+ handler: Ps,
2821
+ minArgs: 3,
2822
+ maxArgs: 4,
2823
+ description: "Replaces old text with new text in a string",
2824
+ examples: ["SUBSTITUTE(\"Hello World\", \"World\", \"Earth\")", "SUBSTITUTE(A1, \"old\", \"new\", 1)"],
2825
+ category: "Text"
2826
+ }), k.register({
2827
+ name: "REPLACE",
2828
+ handler: Fs,
2829
+ minArgs: 4,
2830
+ maxArgs: 4,
2831
+ description: "Replaces part of a text string with a different text string",
2832
+ examples: ["REPLACE(\"Hello World\", 7, 5, \"Earth\")", "REPLACE(A1, 1, 3, \"New\")"],
2833
+ category: "Text"
2834
+ }), k.register({
2835
+ name: "FIND",
2836
+ handler: Rs,
2837
+ minArgs: 2,
2838
+ maxArgs: 3,
2839
+ description: "Finds one text string within another (case-sensitive)",
2840
+ examples: ["FIND(\"o\", \"Hello\")", "FIND(\"World\", A1)"],
2841
+ category: "Text"
2842
+ }), k.register({
2843
+ name: "SEARCH",
2844
+ handler: zs,
2845
+ minArgs: 2,
2846
+ maxArgs: 3,
2847
+ description: "Finds one text string within another (case-insensitive)",
2848
+ examples: ["SEARCH(\"O\", \"Hello\")", "SEARCH(\"world\", A1)"],
2849
+ category: "Text"
2850
+ }), k.register({
2851
+ name: "TEXT",
2852
+ handler: Vs,
2853
+ minArgs: 2,
2854
+ maxArgs: 2,
2855
+ description: "Formats a number and converts it to text",
2856
+ examples: ["TEXT(1234.5, \"$#,##0.00\")", "TEXT(0.5, \"0%\")"],
2857
+ category: "Text"
2858
+ }), k.register({
2859
+ name: "VALUE",
2860
+ handler: (e, t) => Ws(ct(t.evaluateFormula(D(t, e, 0)))),
2861
+ minArgs: 1,
2862
+ maxArgs: 1,
2863
+ description: "Converts a text string to a number",
2864
+ examples: ["VALUE(\"123\")", "VALUE(\"$1,234.56\")"],
2865
+ category: "Text"
2866
+ }), k.register({
2867
+ name: "EXACT",
2868
+ handler: (e, t) => K(t, e, 0) === K(t, e, 1),
2869
+ minArgs: 2,
2870
+ maxArgs: 2,
2871
+ description: "Checks if two text strings are exactly the same",
2872
+ examples: ["EXACT(\"Hello\", \"hello\")", "EXACT(A1, B1)"],
2873
+ category: "Text"
2874
+ });
2875
+ //#endregion
2876
+ //#region src/engine/financial-math.ts
2877
+ function Gs(e, t, n, r, i) {
2878
+ if (e === 0) return -(r + n * t);
2879
+ let a = (1 + e) ** +t;
2880
+ return -r * a - n * (a - 1) * (1 + e * i) / e;
2881
+ }
2882
+ function Ks(e, t, n, r, i) {
2883
+ if (e === 0) return -(r + n) / t;
2884
+ let a = (1 + e) ** +t;
2885
+ return -e * (r + n * a) / ((a - 1) * (1 + e * i));
2886
+ }
2887
+ function qs(e, t, n, r, i, a) {
2888
+ let o = Ks(e, n, r, i, a);
2889
+ if (t === 1 && a === 1) return 0;
2890
+ let s = Gs(e, a === 1 ? t - 2 : t - 1, o, r, a) * e;
2891
+ return a === 1 ? s / (1 + e) : s;
2892
+ }
2893
+ function Js(e, t, n, r, i, a) {
2894
+ return Ks(e, n, r, i, a) - qs(e, t, n, r, i, a);
2895
+ }
2896
+ function Ys(e, t, n, r, i) {
2897
+ if (e === 0) return -(r + n * t);
2898
+ let a = (1 + e) ** +t;
2899
+ return (-r - n * (a - 1) * (1 + e * i) / e) / a;
2900
+ }
2901
+ function Xs(e, t, n, r, i) {
2902
+ if (e === 0) return -(r + n) / t;
2903
+ let a = t * (1 + e * i);
2904
+ return Math.log((a - r * e) / (a + n * e)) / Math.log(1 + e);
2905
+ }
2906
+ var Zs = 100, q = 1e-7;
2907
+ function Qs(e, t, n, r, i, a) {
2908
+ let o = a;
2909
+ for (let a = 0; a < Zs; a++) {
2910
+ Math.abs(o) < q && (o = q);
2911
+ let a = (1 + o) ** +e, s = n * a + t * ((a - 1) / o) * (1 + o * i) + r, c = e * n * (1 + o) ** (e - 1) + t * (1 + o * i) * (e * (1 + o) ** (e - 1) * o - (a - 1)) / (o * o) + t * i * ((a - 1) / o), l = o - s / c;
2912
+ if (Math.abs(l - o) < q) return Number.isFinite(l) ? l : b;
2913
+ o = l;
2914
+ }
2915
+ return b;
2916
+ }
2917
+ function $s(e, t) {
2918
+ return t.reduce((t, n, r) => t + n / (1 + e) ** +(r + 1), 0);
2919
+ }
2920
+ function ec(e, t) {
2921
+ return e.reduce((e, n, r) => {
2922
+ let i = (1 + t) ** +r;
2923
+ return {
2924
+ npv: e.npv + n / i,
2925
+ dnpv: e.dnpv - r * n / (i * (1 + t))
2926
+ };
2927
+ }, {
2928
+ npv: 0,
2929
+ dnpv: 0
2930
+ });
2931
+ }
2932
+ function tc(e, t) {
2933
+ let n = t;
2934
+ for (let t = 0; t < Zs; t++) {
2935
+ let { npv: t, dnpv: r } = ec(e, n);
2936
+ if (Math.abs(t) < q) return n;
2937
+ if (Math.abs(r) < q) return b;
2938
+ let i = n - t / r;
2939
+ if (Math.abs(i - n) < q) return Number.isFinite(i) ? i : b;
2940
+ n = i;
2941
+ }
2942
+ return b;
2943
+ }
2944
+ //#endregion
2945
+ //#region src/engine/functions/financial.ts
2946
+ var nc = (e, t, n, r) => {
2947
+ let i = (n) => A(t.evaluateFormula(D(t, e, n))), a = Array.from({ length: n }, (e, t) => i(t)), o = r.map((t, r) => e.length > n + r ? i(n + r) : t);
2948
+ return [...a, ...o];
2949
+ }, rc = (e, t) => {
2950
+ let [n, r, i, a, o] = nc(e, t, 3, [0, 0]);
2951
+ return Gs(n, r, i, a, o);
2952
+ }, ic = (e, t) => {
2953
+ let [n, r, i, a, o] = nc(e, t, 3, [0, 0]);
2954
+ return Ys(n, r, i, a, o);
2955
+ }, ac = (e, t) => {
2956
+ let [n, r, i, a, o] = nc(e, t, 3, [0, 0]);
2957
+ return Ks(n, r, i, a, o);
2958
+ }, oc = (e, t) => {
2959
+ let [n, r, i, a, o] = nc(e, t, 3, [0, 0]);
2960
+ return Xs(n, r, i, a, o);
2961
+ }, sc = (e, t) => {
2962
+ let [n, r, i, a, o, s] = nc(e, t, 3, [
2963
+ 0,
2964
+ 0,
2965
+ .1
2966
+ ]);
2967
+ return Qs(n, r, i, a, o, s);
2968
+ }, cc = (e) => (t, n) => {
2969
+ let [r, i, a, o, s, c] = nc(t, n, 4, [0, 0]);
2970
+ return e(r, i, a, o, s, c);
2971
+ }, lc = cc(qs), uc = cc(Js), dc = (e, t) => e.flatMap((e) => (e.includes(":") ? t.getRangeValues(e) : [t.evaluateFormula(e)]).map(A));
2972
+ k.register({
2973
+ name: "FV",
2974
+ handler: rc,
2975
+ minArgs: 3,
2976
+ maxArgs: 5,
2977
+ description: "Calculates the future value of an investment based on periodic, constant payments and a constant interest rate",
2978
+ examples: ["FV(0.06/12, 12, -100, -1000, 1)", "FV(A1, A2, A3)"],
2979
+ category: "Financial"
2980
+ }), k.register({
2981
+ name: "PV",
2982
+ handler: ic,
2983
+ minArgs: 3,
2984
+ maxArgs: 5,
2985
+ description: "Calculates the present value of an investment based on periodic, constant payments and a constant interest rate",
2986
+ examples: ["PV(0.08/12, 12*20, 500, 0, 0)", "PV(A1, A2, A3)"],
2987
+ category: "Financial"
2988
+ }), k.register({
2989
+ name: "PMT",
2990
+ handler: ac,
2991
+ minArgs: 3,
2992
+ maxArgs: 5,
2993
+ description: "Calculates the payment for a loan based on constant payments and a constant interest rate",
2994
+ examples: ["PMT(0.06/12, 30*12, 250000)", "PMT(A1, A2, A3)"],
2995
+ category: "Financial"
2996
+ }), k.register({
2997
+ name: "NPER",
2998
+ handler: oc,
2999
+ minArgs: 3,
3000
+ maxArgs: 5,
3001
+ description: "Calculates the number of periods for an investment based on periodic, constant payments and a constant interest rate",
3002
+ examples: ["NPER(0.06/12, -1000, 50000, 0, 0)", "NPER(A1, A2, A3)"],
3003
+ category: "Financial"
3004
+ }), k.register({
3005
+ name: "RATE",
3006
+ handler: sc,
3007
+ minArgs: 3,
3008
+ maxArgs: 6,
3009
+ description: "Calculates the interest rate per period of an annuity using iteration",
3010
+ examples: ["RATE(12, -100, 1000, 0, 0, 0.1)", "RATE(A1, A2, A3)"],
3011
+ category: "Financial"
3012
+ }), k.register({
3013
+ name: "IPMT",
3014
+ handler: lc,
3015
+ minArgs: 4,
3016
+ maxArgs: 6,
3017
+ description: "Calculates the interest payment for a given period for an investment",
3018
+ examples: ["IPMT(0.06/12, 1, 30*12, 250000)", "IPMT(A1, A2, A3, A4)"],
3019
+ category: "Financial"
3020
+ }), k.register({
3021
+ name: "PPMT",
3022
+ handler: uc,
3023
+ minArgs: 4,
3024
+ maxArgs: 6,
3025
+ description: "Calculates the payment on the principal for a given period for an investment",
3026
+ examples: ["PPMT(0.06/12, 1, 30*12, 250000)", "PPMT(A1, A2, A3, A4)"],
3027
+ category: "Financial"
3028
+ }), k.register({
3029
+ name: "NPV",
3030
+ handler: (e, t) => $s(A(t.evaluateFormula(D(t, e, 0))), dc(e.slice(1), t)),
3031
+ minArgs: 2,
3032
+ description: "Calculates the net present value of an investment based on a discount rate and a series of future cash flows",
3033
+ examples: ["NPV(0.1, -10000, 3000, 4200, 6800)", "NPV(A1, B1:B10)"],
3034
+ category: "Financial"
3035
+ }), k.register({
3036
+ name: "IRR",
3037
+ handler: (e, t) => {
3038
+ let n = t.getRangeValues(D(t, e, 0)).map(A), r = e.length === 2 ? A(t.evaluateFormula(D(t, e, 1))) : .1;
3039
+ if (n.length === 0) throw Error("IRR requires at least one value");
3040
+ return tc(n, r);
3041
+ },
3042
+ minArgs: 1,
3043
+ maxArgs: 2,
3044
+ description: "Calculates the internal rate of return for a series of cash flows",
3045
+ examples: ["IRR(A1:A5, 0.1)", "IRR(B1:B10)"],
3046
+ category: "Financial"
3047
+ });
3048
+ //#endregion
3049
+ //#region src/engine/parser.ts
3050
+ function fc(e) {
3051
+ let t = 0;
3052
+ for (let n = 0; n < e.length; n++) t = t * 26 + (e.charCodeAt(n) - 64);
3053
+ return t - 1;
3054
+ }
3055
+ function J(e) {
3056
+ let t = "", n = e + 1;
3057
+ for (; n > 0;) {
3058
+ let e = (n - 1) % 26;
3059
+ t = String.fromCharCode(65 + e) + t, n = Math.floor((n - 1) / 26);
3060
+ }
3061
+ return t;
3062
+ }
3063
+ //#endregion
3064
+ //#region src/engine/formulaRefs.ts
3065
+ var pc = /\$?[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+/g, mc = /\$?[A-Z]+\$?\d+/g;
3066
+ function hc(e) {
3067
+ return e.startsWith("=") ? e.slice(1) : e;
3068
+ }
3069
+ var gc = /^([A-Z]+)(\d+)$/;
3070
+ function _c(e) {
3071
+ let [, t, n] = e.match(gc) ?? [];
3072
+ return t === void 0 || n === void 0 ? null : {
3073
+ col: fc(t),
3074
+ rowNumber: parseInt(n, 10)
3075
+ };
3076
+ }
3077
+ function vc(e) {
3078
+ let [t, n, ...r] = e.split(":");
3079
+ if (t === void 0 || n === void 0 || r.length > 0) return null;
3080
+ let i = _c(t), a = _c(n);
3081
+ return i && a ? {
3082
+ start: i,
3083
+ end: a
3084
+ } : null;
3085
+ }
3086
+ function yc(e) {
3087
+ let t = vc(e.replace(/\$/g, ""));
3088
+ if (!t) return [];
3089
+ let { start: n, end: r } = t, i = [];
3090
+ for (let e = n.rowNumber - 1; e <= r.rowNumber - 1; e++) for (let t = n.col; t <= r.col; t++) i.push({
3091
+ row: e,
3092
+ col: t
3093
+ });
3094
+ return i;
3095
+ }
3096
+ function bc(e) {
3097
+ let t = e.trim().toUpperCase();
3098
+ if (t.includes(":")) {
3099
+ let e = yc(t);
3100
+ return e.length > 0 ? e : null;
3101
+ }
3102
+ let n = xc(t);
3103
+ return n ? [n] : null;
3104
+ }
3105
+ function xc(e) {
3106
+ let t = _c(e.replace(/\$/g, ""));
3107
+ return t ? {
3108
+ col: t.col,
3109
+ row: t.rowNumber - 1
3110
+ } : null;
3111
+ }
3112
+ var Sc = /^\$?[A-Za-z]+\$?\d+$/;
3113
+ function Cc(e) {
3114
+ let t = e.lastIndexOf("!"), n = t >= 0 ? e.slice(0, t + 1) : "", r = t >= 0 ? e.slice(t + 1) : e, i = r.split(":").every((e) => Sc.test(e)) ? vc(r.replace(/\$/g, "").toUpperCase()) : null;
3115
+ if (!i) return null;
3116
+ let { start: a, end: o } = i;
3117
+ return {
3118
+ sheetPrefix: n,
3119
+ startCol: a.col,
3120
+ startRow: a.rowNumber,
3121
+ endCol: o.col,
3122
+ endRow: o.rowNumber
3123
+ };
3124
+ }
3125
+ var wc = 0, Tc = 1;
3126
+ function Ec(e, t) {
3127
+ let n = Math.trunc(e);
3128
+ return Number.isFinite(n) ? n === wc ? t === 1 ? 0 : null : n < Tc || n > t ? null : n - Tc : null;
3129
+ }
3130
+ function Dc(e, t, n) {
3131
+ let r = Ec(t, e.endRow - e.startRow + 1), i = Ec(n, e.endCol - e.startCol + 1);
3132
+ return r === null || i === null ? null : {
3133
+ colIndex: e.startCol + i,
3134
+ row: e.startRow + r
3135
+ };
3136
+ }
3137
+ function Oc(e, t) {
3138
+ let n = Math.trunc(e);
3139
+ return !Number.isFinite(n) || n < Tc || n > t ? null : n - Tc;
3140
+ }
3141
+ function kc(e) {
3142
+ let t = hc(e), n = [], r = /* @__PURE__ */ new Set(), i = (e) => {
3143
+ let t = `${e.row},${e.col}`;
3144
+ r.has(t) || (r.add(t), n.push(e));
3145
+ };
3146
+ for (let e of t.match(pc) ?? []) for (let t of yc(e)) i(t);
3147
+ let a = t.replace(pc, "");
3148
+ for (let e of a.match(mc) ?? []) {
3149
+ let t = xc(e);
3150
+ t && i(t);
3151
+ }
3152
+ return n;
3153
+ }
3154
+ //#endregion
3155
+ //#region src/engine/functions/lookup-math.ts
3156
+ function Ac(e) {
3157
+ if (typeof e == "boolean") return e;
3158
+ if (typeof e == "number") return e !== 0;
3159
+ if (S(e)) return !1;
3160
+ let t = e.trim().toUpperCase();
3161
+ return t === "TRUE" || t === "1";
3162
+ }
3163
+ //#endregion
3164
+ //#region src/engine/functions/lookup.ts
3165
+ var jc = (e, t) => Array.from({ length: Math.max(0, t - e + 1) }, (t, n) => e + n), Mc = (e, t, n, r, i) => jc(r, i).map((r) => e.getCellValue(`${t}${n}${r}`)), Nc = (e, t, n, r, i) => jc(r, i).map((r) => e.getCellValue(`${t}${J(r)}${n}`)), Pc = (e, t) => e.reduce((e, n, r) => t(n) ? r : e, -1), Fc = (e, t) => {
3166
+ let n = e.findIndex((e) => !t(e));
3167
+ return (n === -1 ? e.length : n) - 1;
3168
+ }, Ic = (e, t) => typeof e == "number" && typeof t == "number" ? e - t : String(e).localeCompare(String(t)), Lc = (e, t, n = 1, r = 1) => {
3169
+ if (n === 0) {
3170
+ let n = typeof e == "string" && (e.includes("*") || e.includes("?")) ? mt(e) : (t) => t == e;
3171
+ return r === 1 ? t.findIndex(n) : Pc(t, n);
3172
+ }
3173
+ return n === 1 ? Fc(t, (t) => Ic(t, e) <= 0) : n === -1 ? Fc(t, (t) => Ic(t, e) >= 0) : -1;
3174
+ };
3175
+ k.register({
3176
+ name: "VLOOKUP",
3177
+ handler: (e, t) => {
3178
+ let n = t.evaluateFormula(D(t, e, 0)), r = Cc(D(t, e, 1));
3179
+ if (!r) throw Error("Invalid table array range");
3180
+ let i = A(t.evaluateFormula(D(t, e, 2))), a = +!!Ac(e.length !== 4 || t.evaluateFormula(D(t, e, 3))), o = Oc(i, r.endCol - r.startCol + 1);
3181
+ if (o === null) return De;
3182
+ let s = J(r.startCol), c = Lc(n, Mc(t, r.sheetPrefix, s, r.startRow, r.endRow), a);
3183
+ if (c === -1) return x;
3184
+ let l = J(r.startCol + o), u = r.startRow + c;
3185
+ return t.getCellValue(`${r.sheetPrefix}${l}${u}`);
3186
+ },
3187
+ minArgs: 3,
3188
+ maxArgs: 4,
3189
+ description: "Looks for a value in the leftmost column of a table, and then returns a value in the same row from a column you specify",
3190
+ examples: ["VLOOKUP(105, A2:C10, 2)", "VLOOKUP(\"Smith\", A2:E10, 5, FALSE)"],
3191
+ category: "Lookup & Reference"
3192
+ }), k.register({
3193
+ name: "HLOOKUP",
3194
+ handler: (e, t) => {
3195
+ let n = t.evaluateFormula(D(t, e, 0)), r = Cc(D(t, e, 1));
3196
+ if (!r) throw Error("Invalid range format");
3197
+ let i = A(t.evaluateFormula(D(t, e, 2))), a = +!!Ac(e.length !== 4 || t.evaluateFormula(D(t, e, 3))), o = Oc(i, r.endRow - r.startRow + 1);
3198
+ if (o === null) return De;
3199
+ let s = Lc(n, Nc(t, r.sheetPrefix, r.startRow, r.startCol, r.endCol), a);
3200
+ if (s === -1) return x;
3201
+ let c = J(r.startCol + s), l = r.startRow + o;
3202
+ return t.getCellValue(`${r.sheetPrefix}${c}${l}`);
3203
+ },
3204
+ minArgs: 3,
3205
+ maxArgs: 4,
3206
+ description: "Looks for a value in the top row of a table, and then returns a value in the same column from a row you specify",
3207
+ examples: ["HLOOKUP(\"Axles\", A1:C10, 2, TRUE)"],
3208
+ category: "Lookup & Reference"
3209
+ }), k.register({
3210
+ name: "MATCH",
3211
+ handler: (e, t) => {
3212
+ let n = t.evaluateFormula(D(t, e, 0)), r = D(t, e, 1), i = e.length === 3 ? A(t.evaluateFormula(D(t, e, 2))) : 1, a = Lc(n, at(t)(r), i);
3213
+ return a === -1 ? x : a + 1;
3214
+ },
3215
+ minArgs: 2,
3216
+ maxArgs: 3,
3217
+ description: "Returns the relative position of an item in an array that matches a specified value",
3218
+ examples: ["MATCH(25, A1:A10, 0)", "MATCH(\"b\", A1:A5, 0)"],
3219
+ category: "Lookup & Reference"
3220
+ }), k.register({
3221
+ name: "INDEX",
3222
+ handler: (e, t) => {
3223
+ let n = Cc(D(t, e, 0));
3224
+ if (!n) throw Error("Invalid range format");
3225
+ let r = Dc(n, A(t.evaluateFormula(D(t, e, 1))), e.length >= 3 ? A(t.evaluateFormula(D(t, e, 2))) : 1);
3226
+ return r ? t.getCellValue(`${n.sheetPrefix}${J(r.colIndex)}${r.row}`) : De;
3227
+ },
3228
+ minArgs: 2,
3229
+ maxArgs: 4,
3230
+ description: "Returns the value of an element in a table or an array, selected by the row and column number indexes",
3231
+ examples: ["INDEX(A1:B5, 2, 2)", "INDEX(A1:A10, 5)"],
3232
+ category: "Lookup & Reference"
3233
+ }), k.register({
3234
+ name: "XLOOKUP",
3235
+ handler: (e, t) => {
3236
+ let n = t.evaluateFormula(D(t, e, 0)), r = D(t, e, 1), i = D(t, e, 2), a = e.length >= 4 ? t.evaluateFormula(D(t, e, 3)) : x, o = e.length >= 5 ? A(t.evaluateFormula(D(t, e, 4))) : 0, s = e.length >= 6 ? A(t.evaluateFormula(D(t, e, 5))) : 1, c = at(t), l = c(r), u = c(i), d = -1;
3237
+ if (o === 0 || o === 2) d = Lc(n, l, 0, s);
3238
+ else {
3239
+ let e = Infinity;
3240
+ for (let t = 0; t < l.length; t++) {
3241
+ let r = s === 1 ? t : l.length - 1 - t, i = l[r];
3242
+ if (i == n) {
3243
+ d = r;
3244
+ break;
3245
+ }
3246
+ if (typeof i == "number" && typeof n == "number") {
3247
+ let t = i - n;
3248
+ o === -1 && t < 0 && Math.abs(t) < e ? (e = Math.abs(t), d = r) : o === 1 && t > 0 && t < e && (e = t, d = r);
3249
+ }
3250
+ }
3251
+ }
3252
+ if (d === -1) return a;
3253
+ let f = u[d];
3254
+ return f === void 0 ? x : f;
3255
+ },
3256
+ minArgs: 3,
3257
+ maxArgs: 6,
3258
+ description: "Searches a range or an array, and returns an item corresponding to the first match it finds",
3259
+ examples: ["XLOOKUP(A1, B1:B10, C1:C10)", "XLOOKUP(\"USA\", Countries, Populations)"],
3260
+ category: "Lookup & Reference"
3261
+ });
3262
+ //#endregion
3263
+ //#region src/engine/datedif.ts
3264
+ var Rc = 864e5, Y = 12;
3265
+ function zc(e, t) {
3266
+ let n = e.getUTCMonth() + t, r = e.getUTCFullYear() + Math.floor(n / Y), i = (n % Y + Y) % Y, a = new Date(Date.UTC(r, i + 1, 0)).getUTCDate(), o = Math.min(e.getUTCDate(), a);
3267
+ return new Date(Date.UTC(r, i, o));
3268
+ }
3269
+ function Bc(e, t, n) {
3270
+ if (e > t) return b;
3271
+ let r = T(e), i = T(t), a = i.getUTCFullYear() - r.getUTCFullYear(), o = i.getUTCMonth() - r.getUTCMonth(), s = i.getUTCDate() - r.getUTCDate();
3272
+ switch (n.toUpperCase()) {
3273
+ case "Y": {
3274
+ let e = a;
3275
+ return o < 0 || o === 0 && s < 0 ? e - 1 : e;
3276
+ }
3277
+ case "M": {
3278
+ let e = a * Y + o;
3279
+ return s < 0 ? e - 1 : e;
3280
+ }
3281
+ case "D": return Math.floor(t - e);
3282
+ case "MD": {
3283
+ let e = zc(r, a * Y + o - +(s < 0)), t = Date.UTC(i.getUTCFullYear(), i.getUTCMonth(), i.getUTCDate());
3284
+ return Math.round((t - e.getTime()) / Rc);
3285
+ }
3286
+ case "YM": {
3287
+ let e = s < 0 ? o - 1 : o;
3288
+ return e < 0 ? e + Y : e;
3289
+ }
3290
+ case "YD": {
3291
+ let e = new Date(r);
3292
+ return e.setUTCFullYear(i.getUTCFullYear()), e.getTime() - i.getTime() > 0 && e.setUTCFullYear(i.getUTCFullYear() - 1), Math.floor((i.getTime() - e.getTime()) / Rc);
3293
+ }
3294
+ default: return b;
3295
+ }
3296
+ }
3297
+ k.register({
3298
+ name: "NOW",
3299
+ handler: () => {
3300
+ let e = /* @__PURE__ */ new Date();
3301
+ return Be(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds())));
3302
+ },
3303
+ minArgs: 0,
3304
+ maxArgs: 0,
3305
+ description: "Returns the serial number of the current date and time",
3306
+ examples: ["NOW()"],
3307
+ category: "Date & Time"
3308
+ }), k.register({
3309
+ name: "TODAY",
3310
+ handler: () => {
3311
+ let e = /* @__PURE__ */ new Date();
3312
+ return Be(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate())));
3313
+ },
3314
+ minArgs: 0,
3315
+ maxArgs: 0,
3316
+ description: "Returns the serial number of today's date",
3317
+ examples: ["TODAY()"],
3318
+ category: "Date & Time"
3319
+ }), k.register({
3320
+ name: "DATE",
3321
+ handler: (e, t) => {
3322
+ let n = A(t.evaluateFormula(D(t, e, 0))), r = A(t.evaluateFormula(D(t, e, 1))), i = A(t.evaluateFormula(D(t, e, 2)));
3323
+ return Be(new Date(Date.UTC(n, r - 1, i)));
3324
+ },
3325
+ minArgs: 3,
3326
+ maxArgs: 3,
3327
+ description: "Returns the serial number that represents a particular date",
3328
+ examples: ["DATE(2023, 11, 25)"],
3329
+ category: "Date & Time"
3330
+ }), k.register({
3331
+ name: "TIME",
3332
+ handler: (e, t) => {
3333
+ let n = A(t.evaluateFormula(D(t, e, 0))), r = A(t.evaluateFormula(D(t, e, 1))), i = A(t.evaluateFormula(D(t, e, 2))), a = n * 3600 + r * 60 + i, o = 86400;
3334
+ return a % o / o;
3335
+ },
3336
+ minArgs: 3,
3337
+ maxArgs: 3,
3338
+ description: "Returns the serial number of a particular time",
3339
+ examples: ["TIME(14, 30, 0)"],
3340
+ category: "Date & Time"
3341
+ }), k.register({
3342
+ name: "YEAR",
3343
+ handler: (e, t) => T(A(t.evaluateFormula(D(t, e, 0)))).getUTCFullYear(),
3344
+ minArgs: 1,
3345
+ maxArgs: 1,
3346
+ description: "Converts a serial number to a year",
3347
+ examples: ["YEAR(TODAY())", "YEAR(A1)"],
3348
+ category: "Date & Time"
3349
+ }), k.register({
3350
+ name: "MONTH",
3351
+ handler: (e, t) => T(A(t.evaluateFormula(D(t, e, 0)))).getUTCMonth() + 1,
3352
+ minArgs: 1,
3353
+ maxArgs: 1,
3354
+ description: "Converts a serial number to a month",
3355
+ examples: ["MONTH(TODAY())", "MONTH(A1)"],
3356
+ category: "Date & Time"
3357
+ }), k.register({
3358
+ name: "DAY",
3359
+ handler: (e, t) => T(A(t.evaluateFormula(D(t, e, 0)))).getUTCDate(),
3360
+ minArgs: 1,
3361
+ maxArgs: 1,
3362
+ description: "Converts a serial number to a day of the month",
3363
+ examples: ["DAY(TODAY())", "DAY(A1)"],
3364
+ category: "Date & Time"
3365
+ }), k.register({
3366
+ name: "HOUR",
3367
+ handler: (e, t) => {
3368
+ let n = A(t.evaluateFormula(D(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
3369
+ return Math.floor(i / 3600);
3370
+ },
3371
+ minArgs: 1,
3372
+ maxArgs: 1,
3373
+ description: "Converts a serial number to an hour",
3374
+ examples: ["HOUR(NOW())", "HOUR(A1)"],
3375
+ category: "Date & Time"
3376
+ }), k.register({
3377
+ name: "MINUTE",
3378
+ handler: (e, t) => {
3379
+ let n = A(t.evaluateFormula(D(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
3380
+ return Math.floor(i % 3600 / 60);
3381
+ },
3382
+ minArgs: 1,
3383
+ maxArgs: 1,
3384
+ description: "Converts a serial number to a minute",
3385
+ examples: ["MINUTE(NOW())", "MINUTE(A1)"],
3386
+ category: "Date & Time"
3387
+ }), k.register({
3388
+ name: "SECOND",
3389
+ handler: (e, t) => {
3390
+ let n = A(t.evaluateFormula(D(t, e, 0))), r = n - Math.floor(n);
3391
+ return Math.round(r * 86400) % 60;
3392
+ },
3393
+ minArgs: 1,
3394
+ maxArgs: 1,
3395
+ description: "Converts a serial number to a second",
3396
+ examples: ["SECOND(NOW())", "SECOND(A1)"],
3397
+ category: "Date & Time"
3398
+ }), k.register({
3399
+ name: "DATEDIF",
3400
+ handler: (e, t) => Bc(A(t.evaluateFormula(D(t, e, 0))), A(t.evaluateFormula(D(t, e, 1))), ct(t.evaluateFormula(D(t, e, 2)))),
3401
+ minArgs: 3,
3402
+ maxArgs: 3,
3403
+ description: "Calculates the number of days, months, or years between two dates",
3404
+ examples: ["DATEDIF(A1, B1, \"Y\")", "DATEDIF(DATE(2020,1,1), TODAY(), \"D\")"],
3405
+ category: "Date & Time"
3406
+ });
3407
+ //#endregion
3408
+ //#region src/engine/date-calendar.ts
3409
+ var X = 7, Vc = 5, Hc = 0, Uc = 6, Wc = Uc, Z = (e) => Math.floor(e), Q = (e) => Number.isFinite(e) && e >= 0 && e <= 2958465, Gc = (e) => ((Z(e) + Wc) % X + X) % X, Kc = {
3410
+ 1: 0,
3411
+ 2: 1,
3412
+ 11: 1,
3413
+ 12: 2,
3414
+ 13: 3,
3415
+ 14: 4,
3416
+ 15: 5,
3417
+ 16: 6,
3418
+ 17: 0
3419
+ }, qc = 3;
3420
+ function Jc(e, t = 1) {
3421
+ if (!Q(e)) return b;
3422
+ let n = Gc(e);
3423
+ if (t === qc) return (n + X - 1) % X;
3424
+ let r = Kc[t];
3425
+ return r === void 0 ? b : (n - r + X) % X + 1;
3426
+ }
3427
+ function Yc(e, t) {
3428
+ return !Q(e) || !Q(t) ? b : Z(e) - Z(t);
3429
+ }
3430
+ var Xc = (e, t) => new Date(Date.UTC(e, t + 1, 0)).getUTCDate(), Zc = (e) => Q(e) ? e : b;
3431
+ function Qc(e, t) {
3432
+ if (!Q(e) || !Number.isFinite(t)) return b;
3433
+ let n = T(Z(e)), r = n.getUTCFullYear(), i = n.getUTCMonth() + Math.trunc(t), a = Math.min(n.getUTCDate(), Xc(r, i));
3434
+ return Zc(Be(new Date(Date.UTC(r, i, a))));
3435
+ }
3436
+ function $c(e, t) {
3437
+ if (!Q(e) || !Number.isFinite(t)) return b;
3438
+ let n = T(Z(e));
3439
+ return Zc(Be(new Date(Date.UTC(n.getUTCFullYear(), n.getUTCMonth() + Math.trunc(t) + 1, 0))));
3440
+ }
3441
+ var el = (e) => {
3442
+ let t = Gc(e);
3443
+ return t !== Hc && t !== Uc;
3444
+ }, tl = (e) => new Set(e.map(Z));
3445
+ function nl(e, t, n = []) {
3446
+ if (!Q(e) || !Number.isFinite(t)) return b;
3447
+ let r = tl(n), i = Math.sign(t), a = {
3448
+ date: Z(e),
3449
+ left: Math.abs(Math.trunc(t))
3450
+ };
3451
+ for (; a.left > 0;) {
3452
+ if (a.date += i, !Q(a.date)) return b;
3453
+ el(a.date) && !r.has(a.date) && --a.left;
3454
+ }
3455
+ return a.date;
3456
+ }
3457
+ function rl(e, t) {
3458
+ let n = t - e + 1, r = Math.floor(n / X), i = Array.from({ length: n % X }, (t, n) => e + r * X + n);
3459
+ return r * Vc + i.filter(el).length;
3460
+ }
3461
+ function il(e, t, n = []) {
3462
+ if (!Q(e) || !Q(t)) return b;
3463
+ let [r, i] = [Z(e), Z(t)], [a, o] = r <= i ? [r, i] : [i, r], s = [...tl(n)].filter((e) => e >= a && e <= o && el(e)).length, c = rl(a, o) - s;
3464
+ return r <= i ? c : -c;
3465
+ }
3466
+ //#endregion
3467
+ //#region src/engine/functions/calendar.ts
3468
+ var $ = (e, t, n) => w(t.evaluateFormula(D(t, e, n))), al = (e) => e.find(S) ?? e.filter((e) => typeof e == "number");
3469
+ function ol(e, t, n) {
3470
+ if (e.length <= n) return [];
3471
+ let r = at(t)(D(t, e, n));
3472
+ return r.length === 0 ? al([$(e, t, n)]) : r.find(S) ?? r.filter(C).map(A);
3473
+ }
3474
+ var sl = (e, t) => {
3475
+ let n = al([$(e, t, 0), e.length > 1 ? $(e, t, 1) : 1]);
3476
+ if (S(n)) return n;
3477
+ let [r = 0, i = 1] = n;
3478
+ return Jc(r, i);
3479
+ }, cl = (e) => (t, n) => {
3480
+ let r = al([$(t, n, 0), $(t, n, 1)]);
3481
+ if (S(r)) return r;
3482
+ let [i = 0, a = 0] = r;
3483
+ return e(i, a);
3484
+ }, ll = (e) => (t, n) => {
3485
+ let r = al([$(t, n, 0), $(t, n, 1)]);
3486
+ if (S(r)) return r;
3487
+ let i = ol(t, n, 2);
3488
+ if (S(i)) return i;
3489
+ let [a = 0, o = 0] = r;
3490
+ return e(a, o, i);
3491
+ };
3492
+ //#endregion
3493
+ //#region src/engine/functions/aliases.ts
3494
+ [
3495
+ {
3496
+ name: "WEEKDAY",
3497
+ handler: sl,
3498
+ minArgs: 1,
3499
+ maxArgs: 2,
3500
+ description: "Returns the day of the week (1 = Sunday by default)",
3501
+ examples: ["WEEKDAY(A2)", "WEEKDAY(A2, 2)"]
3502
+ },
3503
+ {
3504
+ name: "DAYS",
3505
+ handler: cl(Yc),
3506
+ minArgs: 2,
3507
+ maxArgs: 2,
3508
+ description: "Returns the number of days between two dates",
3509
+ examples: ["DAYS(B2, A2)"]
3510
+ },
3511
+ {
3512
+ name: "EDATE",
3513
+ handler: cl(Qc),
3514
+ minArgs: 2,
3515
+ maxArgs: 2,
3516
+ description: "Returns the date a number of months before or after a date",
3517
+ examples: ["EDATE(A2, 1)"]
3518
+ },
3519
+ {
3520
+ name: "EOMONTH",
3521
+ handler: cl($c),
3522
+ minArgs: 2,
3523
+ maxArgs: 2,
3524
+ description: "Returns the last day of the month a number of months away",
3525
+ examples: ["EOMONTH(A2, 0)"]
3526
+ },
3527
+ {
3528
+ name: "WORKDAY",
3529
+ handler: ll(nl),
3530
+ minArgs: 2,
3531
+ maxArgs: 3,
3532
+ description: "Returns the date a number of working days away, skipping weekends and holidays",
3533
+ examples: ["WORKDAY(A2, 10)", "WORKDAY(A2, 10, H2:H5)"]
3534
+ },
3535
+ {
3536
+ name: "NETWORKDAYS",
3537
+ handler: ll(il),
3538
+ minArgs: 2,
3539
+ maxArgs: 3,
3540
+ description: "Returns the number of working days between two dates, both included",
3541
+ examples: ["NETWORKDAYS(A2, B2)", "NETWORKDAYS(A2, B2, H2:H5)"]
3542
+ }
3543
+ ].forEach((e) => k.register({
3544
+ ...e,
3545
+ category: "Date & Time"
3546
+ })), Object.entries({
3547
+ "PERCENTILE.INC": "PERCENTILE",
3548
+ "QUARTILE.INC": "QUARTILE",
3549
+ "STDEV.S": "STDEV",
3550
+ "STDEV.P": "STDEVP",
3551
+ "VAR.S": "VAR",
3552
+ "VAR.P": "VARP",
3553
+ "RANK.EQ": "RANK",
3554
+ TTEST: "T.TEST",
3555
+ PERCENTRANK: "PERCENTRANK.INC",
3556
+ FORECAST: "FORECAST.LINEAR",
3557
+ PEARSON: "CORREL"
3558
+ }).forEach(([e, t]) => {
3559
+ let n = k.get(t);
3560
+ if (!n) throw Error(`alias ${e} names ${t}, which is not registered`);
3561
+ k.register({
3562
+ ...n,
3563
+ name: e,
3564
+ description: `Same as ${t}`,
3565
+ examples: []
3566
+ });
3567
+ });
3568
+ //#endregion
3569
+ //#region src/engine/customFunctionSpecs.ts
3570
+ var ul = RegExp(`^${ot}$`, "i"), dl = /^[A-Za-z_$][\w$]*$/, fl = 32, pl = (e) => typeof e == "object" && !!e && !Array.isArray(e), ml = (e) => Array.isArray(e) && e.every((e) => typeof e == "string"), hl = (e) => pl(e) && typeof e.name == "string" && typeof e.body == "string" && ml(e.params) && (e.description === void 0 || typeof e.description == "string");
3571
+ function gl(e) {
3572
+ return Array.isArray(e) ? e.filter(hl) : [];
3573
+ }
3574
+ function _l(e, t) {
3575
+ if (!ul.test(e.name)) return "a name is letters and digits, parts joined by dots (MOVING.AVG)";
3576
+ if (t(e.name)) return `${e.name.toUpperCase()} is a built-in function`;
3577
+ if (e.params.length > fl) return `at most ${fl} parameters`;
3578
+ let n = e.params.find((e) => !dl.test(e));
3579
+ return n === void 0 ? new Set(e.params).size === e.params.length ? null : "a parameter is named twice" : `"${n}" is not a parameter name`;
3580
+ }
3581
+ function vl(e, t) {
3582
+ let n = /* @__PURE__ */ new Map(), r = [];
3583
+ return e.forEach((e) => {
3584
+ let i = e.name.toUpperCase(), a = n.has(i) ? `${i} is defined twice` : _l(e, t);
3585
+ a ? r.push({
3586
+ name: e.name,
3587
+ reason: a
3588
+ }) : n.set(i, e);
3589
+ }), {
3590
+ usable: n,
3591
+ problems: r
3592
+ };
3593
+ }
3594
+ var yl = (e) => `Function(${[...e.params, `"use strict";\n${e.body}`].map((e) => JSON.stringify(e)).join(", ")})`, bl = 50, xl = 2e3, Sl = 16777216, Cl = 1048576, wl = 1e5, Tl = "(fn, args) => fn(...JSON.parse(args))", El = "(?:(?:'(?:[^']|'')+'|[^!'\"(),]+)!)?", Dl = RegExp(`^${El}\\$?[A-Z]+\\$?\\d+:\\$?[A-Z]+\\$?\\d+$`, "i"), Ol = RegExp(`^${El}\\$?[A-Z]+\\$?\\d+$`, "i"), kl = null, Al = async () => (kl ??= import("@jitl/quickjs-singlefile-mjs-release-sync").then((e) => e.default, (e) => {
3595
+ throw kl = null, e;
3596
+ }), n(await kl)), jl = () => void 0, Ml = {
3597
+ definitions: /* @__PURE__ */ new Map(),
3598
+ problems: [],
3599
+ startCalculation: jl,
3600
+ dispose: jl
3601
+ };
3602
+ function Nl(e, t) {
3603
+ return e.startCalculation(), k.withOverlay(e.definitions, t);
3604
+ }
3605
+ async function Pl(e) {
3606
+ let { usable: t, problems: n } = vl(e.flatMap((e) => gl(e.functions)), (e) => k.isBuiltIn(e));
3607
+ return t.size === 0 ? {
3608
+ ...Ml,
3609
+ problems: n
3610
+ } : Fl(await Al(), t, n);
3611
+ }
3612
+ function Fl(e, t, n) {
3613
+ let r = e.newRuntime();
3614
+ r.setMemoryLimit(Sl), r.setMaxStackSize(Cl);
3615
+ let i = { calculationStart: Date.now() }, a = [], o = /* @__PURE__ */ new Map();
3616
+ return t.forEach((e, t) => {
3617
+ let s = r.newContext(), c = [];
3618
+ a.push({
3619
+ vm: s,
3620
+ handles: c
3621
+ });
3622
+ let l = zl(r, Date.now() + bl, () => {
3623
+ let t = s.evalCode(yl(e));
3624
+ return t.error ? { error: Il(s, t.error) || "it stopped while loading" } : { fn: t.value };
3625
+ });
3626
+ if ("error" in l) {
3627
+ n.push({
3628
+ name: e.name,
3629
+ reason: `does not compile: ${l.error}`
3630
+ });
3631
+ return;
3632
+ }
3633
+ let u = s.unwrapResult(s.evalCode(Tl));
3634
+ c.push(l.fn, u);
3635
+ let d = {
3636
+ vm: s,
3637
+ runtime: r,
3638
+ caller: u,
3639
+ fn: l.fn
3640
+ };
3641
+ o.set(t, Hl(e, (e) => Ll(d, e, i.calculationStart)));
3642
+ }), {
3643
+ definitions: o,
3644
+ problems: n,
3645
+ startCalculation: () => i.calculationStart = Date.now(),
3646
+ dispose: () => {
3647
+ try {
3648
+ a.forEach(({ vm: e, handles: t }) => {
3649
+ t.forEach((e) => e.dispose()), e.dispose();
3650
+ }), r.dispose();
3651
+ } catch {}
3652
+ }
3653
+ };
3654
+ }
3655
+ function Il(e, t) {
3656
+ try {
3657
+ let n = e.getProp(t, "message"), r = e.typeof(n) === "string" ? e.getString(n) : "";
3658
+ return n.dispose(), r;
3659
+ } catch {
3660
+ return "";
3661
+ } finally {
3662
+ t.dispose();
3663
+ }
3664
+ }
3665
+ function Ll({ vm: e, runtime: t, caller: n, fn: r }, i, a) {
3666
+ let o = Math.min(Date.now() + bl, a + xl);
3667
+ return Date.now() >= o ? b : zl(t, o, () => {
3668
+ let t = e.newString(i), a = e.callFunction(n, e.undefined, r, t);
3669
+ if (t.dispose(), a.error) return Il(e, a.error) === Rl ? b : y;
3670
+ let o = Bl(e, a.value);
3671
+ return a.value.dispose(), o;
3672
+ });
3673
+ }
3674
+ var Rl = "interrupted";
3675
+ function zl(e, t, n) {
3676
+ e.setInterruptHandler(r(t));
3677
+ try {
3678
+ return n();
3679
+ } finally {
3680
+ e.removeInterruptHandler();
3681
+ }
3682
+ }
3683
+ function Bl(e, t) {
3684
+ let n = e.typeof(t);
3685
+ return n === "number" ? Vl(e.getNumber(t)) : n === "string" ? e.getString(t) : n === "boolean" ? Vl(e.dump(t)) : y;
3686
+ }
3687
+ function Vl(e) {
3688
+ return typeof e == "number" ? Number.isFinite(e) ? e : b : typeof e == "string" || typeof e == "boolean" ? e : y;
3689
+ }
3690
+ function Hl(e, t) {
3691
+ let n = e.description ?? `Defined in this workbook (${e.params.join(", ")})`;
3692
+ return {
3693
+ name: e.name.toUpperCase(),
3694
+ minArgs: e.params.length,
3695
+ maxArgs: e.params.length,
3696
+ description: n,
3697
+ category: "Workbook",
3698
+ handler: (e, n) => {
3699
+ let r = e.map((e) => Wl(e.trim(), n));
3700
+ return r.find(S) ?? t(JSON.stringify(r));
3701
+ }
3702
+ };
3703
+ }
3704
+ var Ul = (e) => S(e) ? e : e === "" ? null : e;
3705
+ function Wl(e, t) {
3706
+ return Dl.test(e) ? Kl(e, t) : Ol.test(e) ? Ul(Gl(t)(e)[0] ?? "") : Ul(t.evaluateFormula(e));
3707
+ }
3708
+ var Gl = (e) => e.getRangeValuesKeepingBlanks ?? e.getRangeValuesRaw ?? e.getRangeValues;
3709
+ function Kl(e, t) {
3710
+ let n = e.lastIndexOf("!"), r = n >= 0 ? e.slice(0, n + 1) : "", i = bc(e.slice(n + 1)) ?? [];
3711
+ if (i.length > wl) return y;
3712
+ let a = Gl(t), o = /* @__PURE__ */ new Map();
3713
+ for (let { row: e, col: t } of i) {
3714
+ let n = Ul(a(`${r}${J(t)}${e + 1}`)[0] ?? "");
3715
+ if (S(n)) return n;
3716
+ o.set(e, [...o.get(e) ?? [], n]);
3717
+ }
3718
+ return Array.from(o.values());
3719
+ }
3720
+ //#endregion
3721
+ //#region src/engine/cellEmpty.ts
3722
+ function ql(e) {
3723
+ if (e == null) return !0;
3724
+ if (typeof e == "string") return e.trim() === "";
3725
+ if (c(e)) {
3726
+ if (!("v" in e)) return !0;
3727
+ let t = e.v;
3728
+ return t == null || typeof t == "string" && t.trim() === "";
3729
+ }
3730
+ return !1;
3731
+ }
3732
+ function Jl(e) {
3733
+ return !S(e) && ql(e);
3734
+ }
3735
+ //#endregion
3736
+ //#region src/engine/cellFormatting.ts
3737
+ var Yl = 36e3, Xl = 63499, Zl = (e) => s(e) && "v" in e, Ql = (e) => typeof e == "number" && Number.isInteger(e) && e >= Yl && e <= Xl, $l = (e, t, n, r) => {
3738
+ if (S(t)) return t.code;
3739
+ if (!Zl(e) || typeof t != "number") return t;
3740
+ let i = typeof e.f == "string" ? e.f : "";
3741
+ return i ? ns(t, i) : typeof e.v == "string" && e.v.startsWith("=") && r && Ql(t) ? ns(t, n ? "DD/MM/YYYY" : "MM/DD/YYYY") : t;
3742
+ }, eu = /* @__PURE__ */ new Set([
3743
+ "DATE",
3744
+ "TODAY",
3745
+ "EDATE",
3746
+ "EOMONTH",
3747
+ "WORKDAY"
3748
+ ]), tu = /^[\s(+-]*([A-Z][A-Z0-9]*(?:\.[A-Z0-9]+)*)\s*\(/i;
3749
+ function nu(e) {
3750
+ let t = tu.exec(e)?.[1];
3751
+ return t === void 0 ? null : t.toUpperCase();
3752
+ }
3753
+ function ru(e, t, n, r = /* @__PURE__ */ new Set()) {
3754
+ let i = e.replace(/^=/, ""), a = nu(i);
3755
+ if (a !== null && eu.has(a)) return !0;
3756
+ let o = Ro(i)[0]?.ref, s = o === void 0 ? null : n(o, t);
3757
+ if (s === null || o === void 0) return !1;
3758
+ if (Xo(s.format)) return !0;
3759
+ let c = `${s.sheet}!${o.replace(/^.*!/, "").replace(/\$/g, "").toUpperCase()}`;
3760
+ return s.formula === null || r.has(c) ? !1 : ru(s.formula, s.sheet, n, /* @__PURE__ */ new Set([...r, c]));
3761
+ }
3762
+ //#endregion
3763
+ //#region src/engine/wholeReferences.ts
3764
+ var iu = String.raw`(?:'((?:[^']|'')+)'|([A-Za-z_][\w.]*))!`, au = String.raw`[(,+\-*/^&=<>\s]`, ou = String.raw`[),+\-*/^&=<>\s]`, su = new RegExp(String.raw`(?<=^|${au})(?:${iu})?(?:(\$?[A-Za-z]{1,3}):(\$?[A-Za-z]{1,3})|(\$?\d+):(\$?\d+))(?=$|${ou})`, "g"), cu = (e) => e.replace("$", "").toUpperCase(), lu = ([e, t], n) => {
3765
+ let r = [cu(e), cu(t)];
3766
+ return n(r[0]) <= n(r[1]) ? r : [r[1], r[0]];
3767
+ };
3768
+ function uu({ whole: e, sheetName: t, columns: n, rows: r }, i) {
3769
+ let a = i(t);
3770
+ if (!a) return null;
3771
+ let o = e.slice(0, e.lastIndexOf("!") + 1), s = Math.max(a.rows, 1);
3772
+ if (n) {
3773
+ let [e, t] = lu(n, fc);
3774
+ return `${o}${e}1:${t}${s}`;
3775
+ }
3776
+ let c = J(Math.max(a.columns, 1) - 1), [l, u] = lu(r ?? ["1", "1"], Number);
3777
+ return `${o}A${l}:${c}${u}`;
3778
+ }
3779
+ function du(e, t) {
3780
+ return e.replace(su, (e, n, r, i, a, o, s) => uu({
3781
+ whole: e,
3782
+ sheetName: n?.replace(/''/g, "'") ?? r ?? null,
3783
+ columns: i && a ? [i, a] : void 0,
3784
+ rows: o && s ? [o, s] : void 0
3785
+ }, t) ?? e);
3786
+ }
3787
+ function fu(e, t) {
3788
+ return e.split(/("(?:[^"]|"")*(?:"|$))/).map((e, n) => n % 2 == 1 ? e : du(e, t)).join("");
3789
+ }
3790
+ //#endregion
3791
+ //#region src/engine/calculator.ts
3792
+ function pu(e) {
3793
+ return (t, n) => {
3794
+ let r = co(t), i = r?.sheetName ?? n, a = xc(r?.ref ?? t), o = a ? e.find((e) => e.name === i)?.data[a.row]?.[a.col] : void 0;
3795
+ if (!c(o)) return null;
3796
+ let s = typeof o.v == "string" && o.v.startsWith("=") ? o.v : null;
3797
+ return {
3798
+ format: typeof o.f == "string" ? o.f : "",
3799
+ formula: s,
3800
+ sheet: i
3801
+ };
3802
+ };
3803
+ }
3804
+ function mu(e) {
3805
+ if (!e || !Array.isArray(e) || e.length === 0) return [];
3806
+ if (Array.isArray(e[0])) return e;
3807
+ if (c(e[0])) {
3808
+ let t = [];
3809
+ for (let n = 0; n < e.length; n += 2) {
3810
+ let r = [e[n]];
3811
+ n + 1 < e.length && r.push(e[n + 1]), t.push(r);
3812
+ }
3813
+ return t;
3814
+ }
3815
+ return console.warn("Unknown data structure in spreadsheet, returning empty:", e), [];
3816
+ }
3817
+ function hu(e, t) {
3818
+ return e.map((e) => e.map((e) => {
3819
+ if (!c(e) || !("v" in e)) return e;
3820
+ let n = e.v;
3821
+ if (typeof n == "string" && !n.startsWith("=")) {
3822
+ let r = Ze(n, t);
3823
+ if (r !== null) return {
3824
+ v: r,
3825
+ f: e.f || rt(n, t)
3826
+ };
3827
+ }
3828
+ return e;
3829
+ }));
3830
+ }
3831
+ function gu(e, t, n = {}) {
3832
+ return _u(e, t, n, /* @__PURE__ */ new Map()).finish();
3833
+ }
3834
+ function _u(e, t, n, r) {
3835
+ let i = n.preferDDMMYYYY ?? !1, a = n.skipFormatting ?? !1, o = hu(mu(e.data), i), l = t?.map((e) => ({
3836
+ ...e,
3837
+ data: hu(mu(e.data), i)
3838
+ })), d = o, f = e.name, p = [], ee = [], m = d.map((e) => [...e]), h = /* @__PURE__ */ new Set(), te = /* @__PURE__ */ new Set(), ne = (e) => {
3839
+ let t = e === null || e === f ? d : l?.find((t) => t.name === e)?.data;
3840
+ return t ? {
3841
+ rows: t.length,
3842
+ columns: t.reduce((e, t) => Math.max(e, t.length), 0)
3843
+ } : null;
3844
+ }, re = (e, { cells: t, row: n, col: r }) => {
3845
+ let i = `${n},${r}`;
3846
+ if (h.has(i)) return p.push({
3847
+ cell: {
3848
+ row: n,
3849
+ col: r
3850
+ },
3851
+ formula: e,
3852
+ error: "Circular reference detected",
3853
+ type: "circular"
3854
+ }), 0;
3855
+ if (te.has(i)) return t[r];
3856
+ h.add(i);
3857
+ try {
3858
+ let n = me(fu(e.substring(1), ne));
3859
+ return t[r] = n, n;
3860
+ } catch (i) {
3861
+ let { type: a, display: o } = Co(i);
3862
+ p.push({
3863
+ cell: {
3864
+ row: n,
3865
+ col: r
3866
+ },
3867
+ formula: e,
3868
+ error: u(i),
3869
+ type: a
3870
+ });
3871
+ let s = Ae(o);
3872
+ return t[r] = s, s;
3873
+ } finally {
3874
+ h.delete(i), te.add(i);
3875
+ }
3876
+ }, g = (e, t) => {
3877
+ if (e == null) return 0;
3878
+ if (S(e) || typeof e == "number") return e;
3879
+ if (typeof e == "string") {
3880
+ if (e.trim() === "") return 0;
3881
+ if (e.includes("%")) {
3882
+ let t = e.replace("%", "").trim(), n = parseFloat(t);
3883
+ return isNaN(n) ? 0 : n / 100;
3884
+ }
3885
+ if (e.includes("$")) {
3886
+ let t = e.replace(/[$,]/g, "").trim(), n = parseFloat(t);
3887
+ return isNaN(n) ? 0 : n;
3888
+ }
3889
+ if (e.includes(",")) {
3890
+ let t = e.replace(/,/g, "").trim(), n = parseFloat(t);
3891
+ return isNaN(n) ? 0 : n;
3892
+ }
3893
+ let t = parseFloat(e);
3894
+ return isNaN(t) ? e : t;
3895
+ }
3896
+ if (c(e)) {
3897
+ let n = "v" in e ? e.v : void 0;
3898
+ return typeof n == "string" && n.startsWith("=") ? t ? re(n, t) : 0 : g(n);
3899
+ }
3900
+ let n = parseFloat(e);
3901
+ return isNaN(n) ? e : n;
3902
+ }, ie = (e) => {
3903
+ let t = co(e);
3904
+ if (!t) return {
3905
+ sheetData: m,
3906
+ ref: e,
3907
+ read: g
3908
+ };
3909
+ let n = r.get(t.sheetName) ?? ae(t.sheetName);
3910
+ return n ? {
3911
+ sheetData: n.calculated,
3912
+ ref: t.ref,
3913
+ read: n.read
3914
+ } : null;
3915
+ }, ae = (e) => {
3916
+ let t = l?.find((t) => t.name === e);
3917
+ return !t || !t.data ? null : (_u(t, l, {
3918
+ preferDDMMYYYY: i,
3919
+ skipFormatting: !0
3920
+ }, r), r.get(e) ?? null);
3921
+ }, oe = (e) => {
3922
+ let t = ie(e);
3923
+ if (!t) throw yo(e);
3924
+ let { sheetData: n, ref: r, read: i } = t, a = xc(r);
3925
+ if (!a) return null;
3926
+ let { row: o, col: s } = a, c = o >= 0 ? n[o] : void 0;
3927
+ return !c || s < 0 || s >= c.length ? null : {
3928
+ cell: c[s],
3929
+ position: {
3930
+ cells: c,
3931
+ row: o,
3932
+ col: s
3933
+ },
3934
+ read: i
3935
+ };
3936
+ }, se = (e) => {
3937
+ let t = oe(e);
3938
+ return t ? t.read(t.cell, t.position) : 0;
3939
+ }, ce = (e) => {
3940
+ let t = oe(e);
3941
+ if (t === null) return !0;
3942
+ let { cell: n, position: r, read: i } = t, a = s(n) ? n.v : void 0;
3943
+ return Jl(typeof a == "string" && a.startsWith("=") ? i(n, r) : n);
3944
+ }, le = (e, t) => {
3945
+ let n = ie(e);
3946
+ if (!n) return [];
3947
+ let { sheetData: r, ref: i, read: a } = n, o = bc(i);
3948
+ if (!o) return [];
3949
+ let s = [];
3950
+ for (let { row: e, col: n } of o) {
3951
+ let i = e >= 0 ? r[e] : void 0, o = i && n >= 0 ? i[n] : void 0, c = a(o, i ? {
3952
+ cells: i,
3953
+ row: e,
3954
+ col: n
3955
+ } : void 0);
3956
+ if (t.numericOnly) !ql(o) && Le(c) && s.push(c);
3957
+ else {
3958
+ let e = ql(o) && !S(o);
3959
+ s.push(t.keepBlanks && e ? "" : c);
3960
+ }
3961
+ }
3962
+ return s;
3963
+ }, ue = (e) => le(e, { numericOnly: !0 }), de = (e) => le(e, { numericOnly: !1 }), fe = (e) => le(e, {
3964
+ numericOnly: !1,
3965
+ keepBlanks: !0
3966
+ }), pe = (e) => {
3967
+ let t = ie(e), n = t ? bc(t.ref) : null;
3968
+ if (!t || !n) return 0;
3969
+ let r = co(e)?.sheetName ?? f, i = r === f ? d : l?.find((e) => e.name === r)?.data;
3970
+ return i ? n.filter(({ row: e, col: t }) => {
3971
+ let n = i[e]?.[t];
3972
+ return n !== void 0 && !ql(n);
3973
+ }).length : 0;
3974
+ }, me = (e) => Yo(e, {
3975
+ getCellValue: se,
3976
+ getRangeValues: ue,
3977
+ getRangeValuesRaw: de,
3978
+ getRangeValuesKeepingBlanks: fe,
3979
+ countFilledCells: pe,
3980
+ evaluateFormula: me,
3981
+ preferDDMMYYYY: i,
3982
+ isCellEmpty: ce
3983
+ }), he = (e, t) => {
3984
+ if (!c(e) || !("v" in e)) return;
3985
+ let n = e.v;
3986
+ if (typeof n != "string" || !n.startsWith("=")) {
3987
+ t.cells[t.col] = n;
3988
+ return;
3989
+ }
3990
+ let r = {
3991
+ cell: {
3992
+ row: t.row,
3993
+ col: t.col
3994
+ },
3995
+ formula: n,
3996
+ dependencies: [],
3997
+ result: 0
3998
+ };
3999
+ ee.push(r), r.result = re(n, t), t.cells[t.col] = r.result;
4000
+ }, ge = (e) => {
4001
+ d.forEach((t, n) => {
4002
+ let r = m[n];
4003
+ r && t.forEach((t, i) => e(t, {
4004
+ cells: r,
4005
+ row: n,
4006
+ col: i
4007
+ }));
4008
+ });
4009
+ };
4010
+ return r.set(f, {
4011
+ calculated: m,
4012
+ read: g
4013
+ }), { finish: () => {
4014
+ if (ge(he), !a) {
4015
+ let e = pu([{
4016
+ name: f,
4017
+ data: d
4018
+ }, ...(l ?? []).filter((e) => e.name !== f)]);
4019
+ ge((t, { cells: n, col: r }) => {
4020
+ let a = c(t) && typeof t.v == "string" ? t.v : "", o = a.startsWith("=") && ru(a, f, e);
4021
+ n[r] = $l(t, n[r], i, o);
4022
+ });
4023
+ }
4024
+ return {
4025
+ name: f,
4026
+ data: m,
4027
+ formulas: ee,
4028
+ errors: p
4029
+ };
4030
+ } };
4031
+ }
4032
+ function vu(e, t = {}) {
4033
+ return e.map((n) => gu(n, e, t));
4034
+ }
4035
+ //#endregion
4036
+ //#region src/engine/cellBuilder.ts
4037
+ var yu = RegExp(`^[-+]?\\s*(${ot})\\s*\\(`, "i"), bu = (e) => {
4038
+ let t = e.match(yu)?.[1];
4039
+ return t !== void 0 && st(t);
4040
+ }, xu = /[A-Z]+\d+\s*[+\-*/^]/, Su = /\d+\s*[+\-*/^]\s*\d+/, Cu = /^[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
4041
+ function wu(e) {
4042
+ return bu(e) || xu.test(e) || Su.test(e);
4043
+ }
4044
+ function Tu(e) {
4045
+ let t = e.trim();
4046
+ return t === "" ? "" : wu(t) ? `=${t}` : Cu.test(t) ? Number(t) : t;
4047
+ }
4048
+ function Eu(e) {
4049
+ if (e.type === "string") return { v: String(e.value) };
4050
+ let t = { v: Tu(e.formula ?? "") };
4051
+ return e.format && e.format.length > 0 && (t.f = e.format), t;
4052
+ }
4053
+ //#endregion
4054
+ //#region src/engine/engine.ts
4055
+ var Du = class {
4056
+ options;
4057
+ constructor(e = {}) {
4058
+ this.options = {
4059
+ maxIterations: e.maxIterations ?? 100,
4060
+ enableCrossSheetRefs: e.enableCrossSheetRefs ?? !0,
4061
+ strictMode: e.strictMode ?? !1,
4062
+ preferDDMMYYYY: e.preferDDMMYYYY ?? !1
4063
+ };
4064
+ }
4065
+ calculate(e, t) {
4066
+ return gu(e, t, { preferDDMMYYYY: this.options.preferDDMMYYYY });
4067
+ }
4068
+ calculateWorkbook(e) {
4069
+ return vu(e, { preferDDMMYYYY: this.options.preferDDMMYYYY });
4070
+ }
4071
+ getOptions() {
4072
+ return { ...this.options };
4073
+ }
4074
+ setOptions(e) {
4075
+ this.options = {
4076
+ ...this.options,
4077
+ ...e
4078
+ };
4079
+ }
4080
+ createSheet(e, t) {
4081
+ return {
4082
+ name: e,
4083
+ data: t.map((e) => e.map((e) => c(e) && "v" in e ? e : { v: e }))
4084
+ };
4085
+ }
4086
+ toStringArray(e) {
4087
+ return e.data.map((e) => e.map((e) => String(e ?? "")));
4088
+ }
4089
+ }, Ou = (e) => e.length > 80 ? `${e.slice(0, 80)}…` : e, ku = (e) => {
4090
+ let t = typeof e == "object" && e && "v" in e ? e.v : e;
4091
+ return typeof t == "string" && t.startsWith("=") ? t : null;
4092
+ };
4093
+ function Au(e, t = Ml) {
4094
+ let n = e.map((e) => ({
4095
+ name: e.name,
4096
+ data: mu(e.data)
4097
+ })), r = Nl(t, () => n.map((e) => gu(e, n, { skipFormatting: !0 }))).flatMap((t, n) => t.data.flatMap((t, r) => t.flatMap((t, i) => {
4098
+ let a = ku(e[n]?.data[r]?.[i]);
4099
+ return a === null || !S(t) ? [] : [`${e[n]?.name ?? ""}!${J(i)}${r + 1} = ${t.code} (${Ou(a)})`];
4100
+ })));
4101
+ return {
4102
+ count: r.length,
4103
+ samples: r.slice(0, 5)
4104
+ };
4105
+ }
4106
+ function ju({ count: e, samples: t }) {
4107
+ if (e === 0) return "";
4108
+ let n = e > t.length ? `, and ${e - t.length} more` : "";
4109
+ return ` ${e} formula cell(s) calculate to an error; fix any that are not meant to be errors before telling the user the spreadsheet is ready: ${t.join("; ")}${n}.`;
4110
+ }
4111
+ //#endregion
4112
+ //#region src/core/plugin.ts
4113
+ function Mu(e) {
4114
+ if (typeof e != "string") return e;
4115
+ try {
4116
+ let t = JSON.parse(e);
4117
+ return console.warn("Sheets was provided as a string and has been parsed to an array"), t;
4118
+ } catch (e) {
4119
+ throw Error(`Invalid sheets format: sheets must be an array, not a string. Parse error: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
4120
+ }
4121
+ }
4122
+ function Nu(e) {
4123
+ if (!Array.isArray(e) || e.length === 0) throw Error("At least one sheet is required. Sheets must be an array of sheet objects.");
4124
+ e.forEach((e) => {
4125
+ if (!e.name || !e.data || e.data.length === 0) throw Error(`Invalid sheet: ${e.name || "unnamed"}. Each sheet must have a name and data array.`);
4126
+ });
4127
+ }
4128
+ async function Pu(e) {
4129
+ let t = await Pl(e);
4130
+ try {
4131
+ return (t.problems.length === 0 ? "" : ` These functions could not be used and calls to them show #NAME?: ${t.problems.slice(0, 5).map(({ name: e, reason: t }) => `${e} (${t})`).join("; ")}.`) + ju(Au(e, t));
4132
+ } finally {
4133
+ t.dispose();
4134
+ }
4135
+ }
4136
+ var Fu = async (e, t) => {
4137
+ let { title: n } = t, r = Mu(t.sheets);
4138
+ Nu(r);
4139
+ let i = "Acknowledge that the spreadsheet has been created and is displayed to the user.", a = await Pu(r), o = ge(e);
4140
+ if (!o) return {
4141
+ message: `Created spreadsheet: ${n}${a}`,
4142
+ title: n,
4143
+ data: { sheets: r },
4144
+ instructions: i
4145
+ };
4146
+ let { relPath: s, filePath: c } = te();
4147
+ return await o.write(s, JSON.stringify(r)), {
4148
+ message: `Created spreadsheet: ${n}. Saved to ${c}; the user can edit cells there, so read that file for the current values.${a}`,
4149
+ title: n,
4150
+ data: { sheets: c },
4151
+ instructions: i
4152
+ };
4153
+ };
4154
+ async function Iu(e, t) {
4155
+ if (!("kind" in t)) return Fu(e, t);
4156
+ let n = ge(e);
4157
+ if (!n) throw Error("This host does not provide files.artifacts, so spreadsheets cannot be loaded or saved");
4158
+ if (!me(t)) throw Error("Invalid spreadsheet dispatch");
4159
+ return we(n, t);
4160
+ }
4161
+ var Lu = {
4162
+ toolDefinition: a,
4163
+ execute: Iu,
4164
+ generatingMessage: "Creating spreadsheet...",
4165
+ waitingMessage: "Tell the user that the spreadsheet was created and will be presented shortly.",
4166
+ isEnabled: () => !0,
4167
+ systemPrompt: o
4168
+ }, Ru = [
4169
+ {
4170
+ name: "Simple Budget",
4171
+ args: {
4172
+ title: "Monthly Budget",
4173
+ sheets: [{
4174
+ name: "Budget",
4175
+ data: [
4176
+ [{ v: "Category" }, { v: "Amount" }],
4177
+ [{ v: "Income" }, {
4178
+ v: 5e3,
4179
+ f: "$#,##0.00"
4180
+ }],
4181
+ [{ v: "Rent" }, {
4182
+ v: -1500,
4183
+ f: "$#,##0.00"
4184
+ }],
4185
+ [{ v: "Utilities" }, {
4186
+ v: -200,
4187
+ f: "$#,##0.00"
4188
+ }],
4189
+ [{ v: "Food" }, {
4190
+ v: -600,
4191
+ f: "$#,##0.00"
4192
+ }],
4193
+ [{ v: "Transport" }, {
4194
+ v: -300,
4195
+ f: "$#,##0.00"
4196
+ }],
4197
+ [{ v: "Total" }, {
4198
+ v: "=SUM(B2:B6)",
4199
+ f: "$#,##0.00"
4200
+ }]
4201
+ ]
4202
+ }]
4203
+ }
4204
+ },
4205
+ {
4206
+ name: "Sales Report",
4207
+ args: {
4208
+ title: "Q1 Sales Report",
4209
+ sheets: [{
4210
+ name: "Sales",
4211
+ data: [
4212
+ [
4213
+ { v: "Product" },
4214
+ { v: "Jan" },
4215
+ { v: "Feb" },
4216
+ { v: "Mar" },
4217
+ { v: "Total" }
4218
+ ],
4219
+ [
4220
+ { v: "Widget A" },
4221
+ { v: 1200 },
4222
+ { v: 1350 },
4223
+ { v: 1500 },
4224
+ { v: "=SUM(B2:D2)" }
4225
+ ],
4226
+ [
4227
+ { v: "Widget B" },
4228
+ { v: 800 },
4229
+ { v: 920 },
4230
+ { v: 1100 },
4231
+ { v: "=SUM(B3:D3)" }
4232
+ ],
4233
+ [
4234
+ { v: "Widget C" },
4235
+ { v: 450 },
4236
+ { v: 480 },
4237
+ { v: 520 },
4238
+ { v: "=SUM(B4:D4)" }
4239
+ ],
4240
+ [
4241
+ { v: "Total" },
4242
+ { v: "=SUM(B2:B4)" },
4243
+ { v: "=SUM(C2:C4)" },
4244
+ { v: "=SUM(D2:D4)" },
4245
+ { v: "=SUM(E2:E4)" }
4246
+ ]
4247
+ ]
4248
+ }]
4249
+ }
4250
+ },
4251
+ {
4252
+ name: "Loan Calculator",
4253
+ args: {
4254
+ title: "Loan Calculator",
4255
+ sheets: [{
4256
+ name: "Calculator",
4257
+ data: [
4258
+ [{ v: "Loan Amount" }, {
4259
+ v: 25e4,
4260
+ f: "$#,##0"
4261
+ }],
4262
+ [{ v: "Interest Rate" }, {
4263
+ v: .065,
4264
+ f: "0.00%"
4265
+ }],
4266
+ [{ v: "Term (Years)" }, { v: 30 }],
4267
+ [{ v: "" }, { v: "" }],
4268
+ [{ v: "Monthly Payment" }, {
4269
+ v: "=PMT(B2/12, B3*12, -B1)",
4270
+ f: "$#,##0.00"
4271
+ }],
4272
+ [{ v: "Total Interest" }, {
4273
+ v: "=B5*B3*12-B1",
4274
+ f: "$#,##0.00"
4275
+ }]
4276
+ ]
4277
+ }]
4278
+ }
4279
+ },
4280
+ {
4281
+ name: "World Population",
4282
+ args: {
4283
+ title: "世界人口(上位10)",
4284
+ sheets: [{
4285
+ name: "世界人口(上位10)",
4286
+ data: [
4287
+ [
4288
+ { v: "順位" },
4289
+ { v: "国・地域" },
4290
+ {
4291
+ v: "人口(概数)",
4292
+ f: "#,##0"
4293
+ },
4294
+ { v: "上位10合計に占める割合" },
4295
+ { v: "世界人口に占める割合" }
4296
+ ],
4297
+ [
4298
+ {
4299
+ v: 1,
4300
+ f: "#,##0"
4301
+ },
4302
+ { v: "インド" },
4303
+ {
4304
+ v: 1428627e3,
4305
+ f: "#,##0"
4306
+ },
4307
+ {
4308
+ v: "=C2/$C$12",
4309
+ f: "0.00%"
4310
+ },
4311
+ {
4312
+ v: "=C2/$C$13",
4313
+ f: "0.00%"
4314
+ }
4315
+ ],
4316
+ [
4317
+ {
4318
+ v: 2,
4319
+ f: "#,##0"
4320
+ },
4321
+ { v: "中国" },
4322
+ {
4323
+ v: 1425671e3,
4324
+ f: "#,##0"
4325
+ },
4326
+ {
4327
+ v: "=C3/$C$12",
4328
+ f: "0.00%"
4329
+ },
4330
+ {
4331
+ v: "=C3/$C$13",
4332
+ f: "0.00%"
4333
+ }
4334
+ ],
4335
+ [
4336
+ {
4337
+ v: 3,
4338
+ f: "#,##0"
4339
+ },
4340
+ { v: "アメリカ合衆国" },
4341
+ {
4342
+ v: 334e6,
4343
+ f: "#,##0"
4344
+ },
4345
+ {
4346
+ v: "=C4/$C$12",
4347
+ f: "0.00%"
4348
+ },
4349
+ {
4350
+ v: "=C4/$C$13",
4351
+ f: "0.00%"
4352
+ }
4353
+ ],
4354
+ [
4355
+ {
4356
+ v: 4,
4357
+ f: "#,##0"
4358
+ },
4359
+ { v: "インドネシア" },
4360
+ {
4361
+ v: 277e6,
4362
+ f: "#,##0"
4363
+ },
4364
+ {
4365
+ v: "=C5/$C$12",
4366
+ f: "0.00%"
4367
+ },
4368
+ {
4369
+ v: "=C5/$C$13",
4370
+ f: "0.00%"
4371
+ }
4372
+ ],
4373
+ [
4374
+ {
4375
+ v: 5,
4376
+ f: "#,##0"
4377
+ },
4378
+ { v: "パキスタン" },
4379
+ {
4380
+ v: 24e7,
4381
+ f: "#,##0"
4382
+ },
4383
+ {
4384
+ v: "=C6/$C$12",
4385
+ f: "0.00%"
4386
+ },
4387
+ {
4388
+ v: "=C6/$C$13",
4389
+ f: "0.00%"
4390
+ }
4391
+ ],
4392
+ [
4393
+ {
4394
+ v: 6,
4395
+ f: "#,##0"
4396
+ },
4397
+ { v: "ナイジェリア" },
4398
+ {
4399
+ v: 219e6,
4400
+ f: "#,##0"
4401
+ },
4402
+ {
4403
+ v: "=C7/$C$12",
4404
+ f: "0.00%"
4405
+ },
4406
+ {
4407
+ v: "=C7/$C$13",
4408
+ f: "0.00%"
4409
+ }
4410
+ ],
4411
+ [
4412
+ {
4413
+ v: 7,
4414
+ f: "#,##0"
4415
+ },
4416
+ { v: "ブラジル" },
4417
+ {
4418
+ v: 216e6,
4419
+ f: "#,##0"
4420
+ },
4421
+ {
4422
+ v: "=C8/$C$12",
4423
+ f: "0.00%"
4424
+ },
4425
+ {
4426
+ v: "=C8/$C$13",
4427
+ f: "0.00%"
4428
+ }
4429
+ ],
4430
+ [
4431
+ {
4432
+ v: 8,
4433
+ f: "#,##0"
4434
+ },
4435
+ { v: "バングラデシュ" },
4436
+ {
4437
+ v: 172e6,
4438
+ f: "#,##0"
4439
+ },
4440
+ {
4441
+ v: "=C9/$C$12",
4442
+ f: "0.00%"
4443
+ },
4444
+ {
4445
+ v: "=C9/$C$13",
4446
+ f: "0.00%"
4447
+ }
4448
+ ],
4449
+ [
4450
+ {
4451
+ v: 9,
4452
+ f: "#,##0"
4453
+ },
4454
+ { v: "ロシア" },
4455
+ {
4456
+ v: 146e6,
4457
+ f: "#,##0"
4458
+ },
4459
+ {
4460
+ v: "=C10/$C$12",
4461
+ f: "0.00%"
4462
+ },
4463
+ {
4464
+ v: "=C10/$C$13",
4465
+ f: "0.00%"
4466
+ }
4467
+ ],
4468
+ [
4469
+ {
4470
+ v: 10,
4471
+ f: "#,##0"
4472
+ },
4473
+ { v: "メキシコ" },
4474
+ {
4475
+ v: 13e7,
4476
+ f: "#,##0"
4477
+ },
4478
+ {
4479
+ v: "=C11/$C$12",
4480
+ f: "0.00%"
4481
+ },
4482
+ {
4483
+ v: "=C11/$C$13",
4484
+ f: "0.00%"
4485
+ }
4486
+ ],
4487
+ [
4488
+ { v: "" },
4489
+ { v: "合計(上位10)" },
4490
+ {
4491
+ v: "=SUM(C2:C11)",
4492
+ f: "#,##0"
4493
+ },
4494
+ { v: "" },
4495
+ { v: "" }
4496
+ ],
4497
+ [
4498
+ { v: "" },
4499
+ { v: "世界推定人口(例)" },
4500
+ {
4501
+ v: 805e7,
4502
+ f: "#,##0"
4503
+ },
4504
+ { v: "" },
4505
+ { v: "" }
4506
+ ]
4507
+ ]
4508
+ }]
4509
+ }
4510
+ }
4511
+ ];
4512
+ //#endregion
4513
+ export { s as C, i as E, c as S, a as T, me as _, Eu as a, g as b, Ml as c, kc as d, Cc as f, we as g, U as h, Du as i, Nl as l, J as m, Fu as n, gu as o, xc as p, Lu as r, mu as s, Ru as t, Pl as u, ce as v, o as w, u as x, re as y };