@elaraai/east 1.0.84 → 1.0.86

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 (247) hide show
  1. package/dist/src/analyze.d.ts.map +1 -1
  2. package/dist/src/analyze.js +48 -0
  3. package/dist/src/analyze.js.map +1 -1
  4. package/dist/src/ast_to_ir.coerce_to.spec.js +4 -4
  5. package/dist/src/ast_to_ir.coerce_to.spec.js.map +1 -1
  6. package/dist/src/ast_to_ir.d.ts +6 -1
  7. package/dist/src/ast_to_ir.d.ts.map +1 -1
  8. package/dist/src/ast_to_ir.js +20 -7
  9. package/dist/src/ast_to_ir.js.map +1 -1
  10. package/dist/src/builtins.d.ts +1 -1
  11. package/dist/src/builtins.d.ts.map +1 -1
  12. package/dist/src/builtins.js +52 -0
  13. package/dist/src/builtins.js.map +1 -1
  14. package/dist/src/codegen/canonical.d.ts +37 -0
  15. package/dist/src/codegen/canonical.d.ts.map +1 -0
  16. package/dist/src/codegen/canonical.js +208 -0
  17. package/dist/src/codegen/canonical.js.map +1 -0
  18. package/dist/src/codegen/codegen.spec.js +132 -201
  19. package/dist/src/codegen/codegen.spec.js.map +1 -1
  20. package/dist/src/codegen/printer.d.ts.map +1 -1
  21. package/dist/src/codegen/printer.js +142 -24
  22. package/dist/src/codegen/printer.js.map +1 -1
  23. package/dist/src/codegen/spellings.d.ts +4 -1
  24. package/dist/src/codegen/spellings.d.ts.map +1 -1
  25. package/dist/src/codegen/spellings.js +5 -1
  26. package/dist/src/codegen/spellings.js.map +1 -1
  27. package/dist/src/compile/builtins/index.d.ts.map +1 -1
  28. package/dist/src/compile/builtins/index.js +2 -0
  29. package/dist/src/compile/builtins/index.js.map +1 -1
  30. package/dist/src/compile/builtins/primitives.d.ts.map +1 -1
  31. package/dist/src/compile/builtins/primitives.js +2 -1
  32. package/dist/src/compile/builtins/primitives.js.map +1 -1
  33. package/dist/src/compile/builtins/query.d.ts +10 -0
  34. package/dist/src/compile/builtins/query.d.ts.map +1 -0
  35. package/dist/src/compile/builtins/query.js +5 -0
  36. package/dist/src/compile/builtins/query.js.map +1 -0
  37. package/dist/src/expr/block.d.ts.map +1 -1
  38. package/dist/src/expr/block.js +2 -1
  39. package/dist/src/expr/block.js.map +1 -1
  40. package/dist/src/expr/index.d.ts +75 -47
  41. package/dist/src/expr/index.d.ts.map +1 -1
  42. package/dist/src/expr/index.js +31 -0
  43. package/dist/src/expr/index.js.map +1 -1
  44. package/dist/src/expr/libs/datetime.d.ts +20 -20
  45. package/dist/src/expr/libs/datetime.d.ts.map +1 -1
  46. package/dist/src/expr/libs/datetime.js +208 -167
  47. package/dist/src/expr/libs/datetime.js.map +1 -1
  48. package/dist/src/expr/libs/float.d.ts +15 -15
  49. package/dist/src/expr/libs/float.d.ts.map +1 -1
  50. package/dist/src/expr/libs/float.js +298 -267
  51. package/dist/src/expr/libs/float.js.map +1 -1
  52. package/dist/src/expr/libs/integer.d.ts +12 -12
  53. package/dist/src/expr/libs/integer.d.ts.map +1 -1
  54. package/dist/src/expr/libs/integer.js +219 -194
  55. package/dist/src/expr/libs/integer.js.map +1 -1
  56. package/dist/src/expr/libs/lazy.d.ts +28 -0
  57. package/dist/src/expr/libs/lazy.d.ts.map +1 -0
  58. package/dist/src/expr/libs/lazy.js +55 -0
  59. package/dist/src/expr/libs/lazy.js.map +1 -0
  60. package/dist/src/expr/libs/lazy.spec.d.ts +6 -0
  61. package/dist/src/expr/libs/lazy.spec.d.ts.map +1 -0
  62. package/dist/src/expr/libs/lazy.spec.js +102 -0
  63. package/dist/src/expr/libs/lazy.spec.js.map +1 -0
  64. package/dist/src/expr/query.d.ts +60 -0
  65. package/dist/src/expr/query.d.ts.map +1 -0
  66. package/dist/src/expr/query.js +84 -0
  67. package/dist/src/expr/query.js.map +1 -0
  68. package/dist/src/functions.crossimport.spec.js +8 -0
  69. package/dist/src/functions.crossimport.spec.js.map +1 -1
  70. package/dist/src/functions.d.ts +45 -8
  71. package/dist/src/functions.d.ts.map +1 -1
  72. package/dist/src/functions.js +138 -28
  73. package/dist/src/functions.js.map +1 -1
  74. package/dist/src/functions.spec.js +60 -2
  75. package/dist/src/functions.spec.js.map +1 -1
  76. package/dist/src/index.d.ts +3 -0
  77. package/dist/src/index.d.ts.map +1 -1
  78. package/dist/src/index.js +3 -0
  79. package/dist/src/index.js.map +1 -1
  80. package/dist/src/internal.d.ts +4 -0
  81. package/dist/src/internal.d.ts.map +1 -1
  82. package/dist/src/internal.js +9 -0
  83. package/dist/src/internal.js.map +1 -1
  84. package/dist/src/location.d.ts +22 -0
  85. package/dist/src/location.d.ts.map +1 -1
  86. package/dist/src/location.js +31 -0
  87. package/dist/src/location.js.map +1 -1
  88. package/dist/src/naming.d.ts +5 -3
  89. package/dist/src/naming.d.ts.map +1 -1
  90. package/dist/src/naming.js.map +1 -1
  91. package/dist/src/portable.spec.d.ts +6 -0
  92. package/dist/src/portable.spec.d.ts.map +1 -0
  93. package/dist/src/portable.spec.js +181 -0
  94. package/dist/src/portable.spec.js.map +1 -0
  95. package/dist/src/query/evaluate.d.ts +98 -0
  96. package/dist/src/query/evaluate.d.ts.map +1 -0
  97. package/dist/src/query/evaluate.js +193 -0
  98. package/dist/src/query/evaluate.js.map +1 -0
  99. package/dist/src/query/index.d.ts +17 -0
  100. package/dist/src/query/index.d.ts.map +1 -0
  101. package/dist/src/query/index.js +17 -0
  102. package/dist/src/query/index.js.map +1 -0
  103. package/dist/src/query/jq/catalog.d.ts +174 -0
  104. package/dist/src/query/jq/catalog.d.ts.map +1 -0
  105. package/dist/src/query/jq/catalog.js +1740 -0
  106. package/dist/src/query/jq/catalog.js.map +1 -0
  107. package/dist/src/query/jq/check.d.ts +210 -0
  108. package/dist/src/query/jq/check.d.ts.map +1 -0
  109. package/dist/src/query/jq/check.js +2261 -0
  110. package/dist/src/query/jq/check.js.map +1 -0
  111. package/dist/src/query/jq/complete.d.ts +89 -0
  112. package/dist/src/query/jq/complete.d.ts.map +1 -0
  113. package/dist/src/query/jq/complete.js +320 -0
  114. package/dist/src/query/jq/complete.js.map +1 -0
  115. package/dist/src/query/jq/describe.d.ts +53 -0
  116. package/dist/src/query/jq/describe.d.ts.map +1 -0
  117. package/dist/src/query/jq/describe.js +149 -0
  118. package/dist/src/query/jq/describe.js.map +1 -0
  119. package/dist/src/query/jq/lex.d.ts +118 -0
  120. package/dist/src/query/jq/lex.d.ts.map +1 -0
  121. package/dist/src/query/jq/lex.js +371 -0
  122. package/dist/src/query/jq/lex.js.map +1 -0
  123. package/dist/src/query/jq/literals.d.ts +49 -0
  124. package/dist/src/query/jq/literals.d.ts.map +1 -0
  125. package/dist/src/query/jq/literals.js +78 -0
  126. package/dist/src/query/jq/literals.js.map +1 -0
  127. package/dist/src/query/jq/messages.d.ts +126 -0
  128. package/dist/src/query/jq/messages.d.ts.map +1 -0
  129. package/dist/src/query/jq/messages.js +172 -0
  130. package/dist/src/query/jq/messages.js.map +1 -0
  131. package/dist/src/query/jq/parse.d.ts +70 -0
  132. package/dist/src/query/jq/parse.d.ts.map +1 -0
  133. package/dist/src/query/jq/parse.js +1013 -0
  134. package/dist/src/query/jq/parse.js.map +1 -0
  135. package/dist/src/query/jq/print.d.ts +59 -0
  136. package/dist/src/query/jq/print.d.ts.map +1 -0
  137. package/dist/src/query/jq/print.js +587 -0
  138. package/dist/src/query/jq/print.js.map +1 -0
  139. package/dist/src/query/jq/shapes.d.ts +345 -0
  140. package/dist/src/query/jq/shapes.d.ts.map +1 -0
  141. package/dist/src/query/jq/shapes.js +584 -0
  142. package/dist/src/query/jq/shapes.js.map +1 -0
  143. package/dist/src/query/jq/spans.d.ts +133 -0
  144. package/dist/src/query/jq/spans.d.ts.map +1 -0
  145. package/dist/src/query/jq/spans.js +195 -0
  146. package/dist/src/query/jq/spans.js.map +1 -0
  147. package/dist/src/query/jq/split.d.ts +334 -0
  148. package/dist/src/query/jq/split.d.ts.map +1 -0
  149. package/dist/src/query/jq/split.js +2108 -0
  150. package/dist/src/query/jq/split.js.map +1 -0
  151. package/dist/src/query/jq/strftime.d.ts +20 -0
  152. package/dist/src/query/jq/strftime.d.ts.map +1 -0
  153. package/dist/src/query/jq/strftime.js +65 -0
  154. package/dist/src/query/jq/strftime.js.map +1 -0
  155. package/dist/src/query/jq/summary.d.ts +139 -0
  156. package/dist/src/query/jq/summary.d.ts.map +1 -0
  157. package/dist/src/query/jq/summary.js +222 -0
  158. package/dist/src/query/jq/summary.js.map +1 -0
  159. package/dist/src/query/jq/translate-builtins.d.ts +21 -0
  160. package/dist/src/query/jq/translate-builtins.d.ts.map +1 -0
  161. package/dist/src/query/jq/translate-builtins.js +1873 -0
  162. package/dist/src/query/jq/translate-builtins.js.map +1 -0
  163. package/dist/src/query/jq/translate.d.ts +627 -0
  164. package/dist/src/query/jq/translate.d.ts.map +1 -0
  165. package/dist/src/query/jq/translate.js +3364 -0
  166. package/dist/src/query/jq/translate.js.map +1 -0
  167. package/dist/src/query/types.d.ts +505 -0
  168. package/dist/src/query/types.d.ts.map +1 -0
  169. package/dist/src/query/types.js +231 -0
  170. package/dist/src/query/types.js.map +1 -0
  171. package/dist/src/runner_exec.d.ts +134 -0
  172. package/dist/src/runner_exec.d.ts.map +1 -0
  173. package/dist/src/runner_exec.js +371 -0
  174. package/dist/src/runner_exec.js.map +1 -0
  175. package/dist/src/runner_exec.spec.d.ts +6 -0
  176. package/dist/src/runner_exec.spec.d.ts.map +1 -0
  177. package/dist/src/runner_exec.spec.js +198 -0
  178. package/dist/src/runner_exec.spec.js.map +1 -0
  179. package/dist/src/runner_io.d.ts +370 -0
  180. package/dist/src/runner_io.d.ts.map +1 -0
  181. package/dist/src/runner_io.js +563 -0
  182. package/dist/src/runner_io.js.map +1 -0
  183. package/dist/src/runner_io.spec.d.ts +6 -0
  184. package/dist/src/runner_io.spec.d.ts.map +1 -0
  185. package/dist/src/runner_io.spec.js +224 -0
  186. package/dist/src/runner_io.spec.js.map +1 -0
  187. package/dist/src/runner_merge.d.ts +95 -0
  188. package/dist/src/runner_merge.d.ts.map +1 -0
  189. package/dist/src/runner_merge.js +238 -0
  190. package/dist/src/runner_merge.js.map +1 -0
  191. package/dist/src/runner_protocol.d.ts +11 -4
  192. package/dist/src/runner_protocol.d.ts.map +1 -1
  193. package/dist/src/runner_protocol.js +11 -4
  194. package/dist/src/runner_protocol.js.map +1 -1
  195. package/dist/src/serialization/beast2/index.d.ts +1 -1
  196. package/dist/src/serialization/beast2/index.d.ts.map +1 -1
  197. package/dist/src/serialization/beast2/index.js.map +1 -1
  198. package/dist/src/serialization/beast2/v5/frames.d.ts +10 -6
  199. package/dist/src/serialization/beast2/v5/frames.d.ts.map +1 -1
  200. package/dist/src/serialization/beast2/v5/frames.js +10 -6
  201. package/dist/src/serialization/beast2/v5/frames.js.map +1 -1
  202. package/dist/src/serialization/beast2/v5/frames.spec.d.ts +6 -0
  203. package/dist/src/serialization/beast2/v5/frames.spec.d.ts.map +1 -0
  204. package/dist/src/serialization/beast2/v5/frames.spec.js +42 -0
  205. package/dist/src/serialization/beast2/v5/frames.spec.js.map +1 -0
  206. package/dist/src/serialization/beast2/v5/index.spec.js +108 -0
  207. package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
  208. package/dist/src/serialization/beast2/v5/lazy.d.ts +12 -7
  209. package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
  210. package/dist/src/serialization/beast2/v5/lazy.js +16 -6
  211. package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
  212. package/dist/src/serialization/beast2/v5/lazy.spec.js +159 -18
  213. package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
  214. package/dist/src/serialization/beast2/v5/stream.d.ts +110 -21
  215. package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
  216. package/dist/src/serialization/beast2/v5/stream.js +153 -42
  217. package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
  218. package/dist/src/serialization/beast2/v5/weight.d.ts +36 -0
  219. package/dist/src/serialization/beast2/v5/weight.d.ts.map +1 -0
  220. package/dist/src/serialization/beast2/v5/weight.js +238 -0
  221. package/dist/src/serialization/beast2/v5/weight.js.map +1 -0
  222. package/dist/src/serialization/crc32.d.ts +38 -0
  223. package/dist/src/serialization/crc32.d.ts.map +1 -0
  224. package/dist/src/serialization/crc32.js +70 -0
  225. package/dist/src/serialization/crc32.js.map +1 -0
  226. package/dist/src/serialization/crc32.spec.d.ts +6 -0
  227. package/dist/src/serialization/crc32.spec.d.ts.map +1 -0
  228. package/dist/src/serialization/crc32.spec.js +92 -0
  229. package/dist/src/serialization/crc32.spec.js.map +1 -0
  230. package/dist/src/serialization/east-inferred.spec.js +4 -0
  231. package/dist/src/serialization/east-inferred.spec.js.map +1 -1
  232. package/dist/src/serialization/east.d.ts.map +1 -1
  233. package/dist/src/serialization/east.js +134 -110
  234. package/dist/src/serialization/east.js.map +1 -1
  235. package/dist/src/serialization/east.spec.js +185 -4
  236. package/dist/src/serialization/east.spec.js.map +1 -1
  237. package/dist/src/serialization/east_text.d.ts +25 -0
  238. package/dist/src/serialization/east_text.d.ts.map +1 -0
  239. package/dist/src/serialization/east_text.js +29 -0
  240. package/dist/src/serialization/east_text.js.map +1 -0
  241. package/dist/src/serialization/index.d.ts +1 -1
  242. package/dist/src/serialization/index.d.ts.map +1 -1
  243. package/dist/src/types.d.ts +1 -1
  244. package/dist/src/types.d.ts.map +1 -1
  245. package/dist/src/types.js +7 -6
  246. package/dist/src/types.js.map +1 -1
  247. package/package.json +6 -3
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Summaries: one generated jq program that profiles a value of a type leaf by
7
+ * leaf, which runs wherever queries run (`devdocs/QUERY.md` §19).
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import { ArrayType, DateTimeType, DictType, FloatType, IntegerType, OptionType, StringType, StructType, } from "../../types.js";
12
+ import { plainKind } from "./describe.js";
13
+ import { jsonString } from "./literals.js";
14
+ import { nullablePayload, unwrap } from "./shapes.js";
15
+ /** A value and how many times it occurs. */
16
+ const TextCountType = StructType({ n: IntegerType, value: StringType });
17
+ /**
18
+ * What a summary says about one leaf path of the rows.
19
+ *
20
+ * @remarks
21
+ * - `cases` — a variant's cases in declared order, each with how many rows
22
+ * hold it (zero counts kept).
23
+ * - `count` — how many values reach the path (a list's elements each count).
24
+ * - `dates` — for dates: the first and last, and the counts per month
25
+ * (`"2026-03"`) and per year.
26
+ * - `distinct` — how many different values: for text, cases and whole numbers.
27
+ * - `kind` — the plain kind: `"text"`, `"number, sometimes missing"`, ….
28
+ * - `lengths` — for lists and lookup tables: the shortest and longest.
29
+ * - `missing` — how many values are null.
30
+ * - `numbers` — for numbers: the least, greatest, mean and median.
31
+ * - `values` — for text and yes-or-no: the most common values, by count and
32
+ * then value.
33
+ */
34
+ export const SummaryLeafType = StructType({
35
+ cases: OptionType(ArrayType(TextCountType)),
36
+ count: IntegerType,
37
+ dates: OptionType(StructType({
38
+ max: DateTimeType,
39
+ min: DateTimeType,
40
+ months: ArrayType(TextCountType),
41
+ years: ArrayType(StructType({ n: IntegerType, value: IntegerType })),
42
+ })),
43
+ distinct: OptionType(IntegerType),
44
+ kind: StringType,
45
+ lengths: OptionType(StructType({ max: IntegerType, min: IntegerType })),
46
+ missing: IntegerType,
47
+ numbers: OptionType(StructType({ max: FloatType, mean: FloatType, median: FloatType, min: FloatType })),
48
+ values: OptionType(ArrayType(TextCountType)),
49
+ });
50
+ /**
51
+ * A summary: how many rows, and each leaf path's {@link SummaryLeafType}, by
52
+ * its jq path from a row (`.total`, `.lines[].sku`, `.status.value.date`).
53
+ */
54
+ export const SummaryType = StructType({ count: IntegerType, leaves: DictType(StringType, SummaryLeafType) });
55
+ /** A field's name in a path: bare when it is an identifier. */
56
+ function fieldStep(name) {
57
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) ? `.${name}` : `.${jsonString(name)}`;
58
+ }
59
+ /** The leaves of a row type, breadth first. */
60
+ function leavesOf(row, maxLeaves) {
61
+ const leaves = [];
62
+ const queue = [
63
+ { type: row, path: ".", reach: ".", seen: new Set() },
64
+ ];
65
+ // A path read after another: `.` then `.a` is `.a`, and a reach through a
66
+ // case's `select` continues after a pipe.
67
+ const join = (base, step) => {
68
+ if (base === ".")
69
+ return step.startsWith("[") ? `.${step}` : step;
70
+ return base.endsWith(")") ? `${base} | ${step.startsWith("[") ? `.${step}` : step}` : `${base}${step}`;
71
+ };
72
+ while (queue.length > 0 && leaves.length < maxLeaves) {
73
+ const item = queue.shift();
74
+ const { type, path, reach } = item;
75
+ let seen = item.seen;
76
+ // A recursive type is summarised once, where it is first reached.
77
+ if (type.type === "Recursive") {
78
+ if (seen.has(type))
79
+ continue;
80
+ seen = new Set([...seen, type]);
81
+ }
82
+ const t = unwrap(type);
83
+ const payload = nullablePayload(t);
84
+ const inner = payload === undefined ? t : unwrap(payload);
85
+ switch (inner.type) {
86
+ case "String":
87
+ case "Integer":
88
+ case "Float":
89
+ case "Boolean":
90
+ case "DateTime":
91
+ leaves.push({ path, reach, type });
92
+ break;
93
+ case "Array":
94
+ case "Set":
95
+ case "Vector":
96
+ case "Dict": {
97
+ leaves.push({ path, reach, type });
98
+ const element = inner.type === "Array" ? inner.value : inner.type === "Set" ? inner.key : inner.type === "Vector" ? inner.element : inner.value;
99
+ queue.push({ type: element, path: join(path, "[]"), reach: join(reach, payload === undefined ? "[]" : "[]?"), seen });
100
+ break;
101
+ }
102
+ case "Struct":
103
+ for (const [name, field] of Object.entries(inner.fields)) {
104
+ queue.push({ type: field, path: join(path, fieldStep(name)), reach: join(reach, fieldStep(name)), seen });
105
+ }
106
+ break;
107
+ case "Variant": {
108
+ const cases = inner.cases;
109
+ leaves.push({ path: join(path, ".type"), reach: join(reach, ".type"), type: payload === undefined ? StringType : OptionType(StringType), cases: Object.keys(cases) });
110
+ for (const [name, caseType] of Object.entries(cases)) {
111
+ if (unwrap(caseType).type === "Null")
112
+ continue;
113
+ const narrowed = `${reach === "." ? "" : `${reach} | `}select(.type == ${jsonString(name)}) | .value`;
114
+ queue.push({ type: caseType, path: join(path, ".value"), reach: `(${narrowed})`, seen });
115
+ }
116
+ break;
117
+ }
118
+ default:
119
+ break;
120
+ }
121
+ }
122
+ return leaves.slice(0, maxLeaves);
123
+ }
124
+ /** The jq for one leaf's summary, over `$rows`. */
125
+ function leafProgram(leaf, topValues) {
126
+ const t = unwrap(leaf.type);
127
+ const nullable = nullablePayload(t) !== undefined;
128
+ const inner = unwrap(nullablePayload(t) ?? t);
129
+ const reach = leaf.reach;
130
+ const kind = leaf.cases !== undefined ? `one of${nullable ? ", sometimes missing" : ""}` : plainKind(leaf.type);
131
+ const counts = (of, value) => `${of} | group_by(.) | map({n: length, value: (.[0] // ${value})})`;
132
+ const top = `sort_by({n: -.n, value}) | .[:${topValues}]`;
133
+ let cases = "null";
134
+ let dates = "null";
135
+ let distinct = "null";
136
+ let lengths = "null";
137
+ let numbers = "null";
138
+ let values = "null";
139
+ if (leaf.cases !== undefined) {
140
+ cases = `[${leaf.cases.map(c => `{n: ([$p[] | select(. == ${jsonString(c)})] | length), value: ${jsonString(c)}}`).join(", ")}]`;
141
+ distinct = "($p | unique | length)";
142
+ }
143
+ else {
144
+ switch (inner.type) {
145
+ case "String":
146
+ distinct = "($p | unique | length)";
147
+ values = `(${counts("$p", "\"\"")} | ${top})`;
148
+ break;
149
+ case "Boolean":
150
+ values = `(${counts("$p | map(tostring)", "\"\"")} | ${top})`;
151
+ break;
152
+ case "Integer":
153
+ case "Float":
154
+ if (inner.type === "Integer")
155
+ distinct = "($p | unique | length)";
156
+ numbers = "(if ($p | length) == 0 then null else ($p | map(. + 0.0)) as $n | "
157
+ + "{max: ($n | max // 0.0), mean: ($n | add / length), median: ($n | sort | .[length / 2 | floor] // 0.0), min: ($n | min // 0.0)} end)";
158
+ break;
159
+ case "DateTime":
160
+ dates = "(if ($p | length) == 0 then null else "
161
+ + `{max: ($p | max // $epoch), min: ($p | min // $epoch), months: (${counts("$p | map(strftime(\"%Y-%m\"))", "\"\"")}), `
162
+ + `years: (${counts("$p | map(year)", "0")})} end)`;
163
+ break;
164
+ default:
165
+ lengths = "($p | map(length) | if length == 0 then null else {max: (max // 0), min: (min // 0)} end)";
166
+ break;
167
+ }
168
+ }
169
+ const missing = nullable ? "([$v[] | select(. == null)] | length)" : "0";
170
+ const present = nullable ? "[$v[] | values] as $p | " : "$v as $p | ";
171
+ return `{key: ${jsonString(leaf.path)}, value: ([$rows[] | ${reach}] as $v | ${present}`
172
+ + `{cases: ${cases}, count: ($v | length), dates: ${dates}, distinct: ${distinct}, kind: ${jsonString(kind)}, `
173
+ + `lengths: ${lengths}, missing: ${missing}, numbers: ${numbers}, values: ${values}})}`;
174
+ }
175
+ /**
176
+ * Two leaves that give every part of a {@link SummaryLeafType} its type: one
177
+ * with every optional part and one with none. The summary lists them first and
178
+ * drops them, so its leaves have exactly that type whatever the rows hold.
179
+ */
180
+ const PROTOTYPES = [
181
+ "{key: \"\", value: {cases: [{n: 0, value: \"\"}], count: 0, dates: {max: $epoch, min: $epoch, months: [{n: 0, value: \"\"}], "
182
+ + "years: [{n: 0, value: 0}]}, distinct: 0, kind: \"\", lengths: {max: 0, min: 0}, missing: 0, "
183
+ + "numbers: {max: 0.0, mean: 0.0, median: 0.0, min: 0.0}, values: [{n: 0, value: \"\"}]}}",
184
+ "{key: \"\", value: {cases: null, count: 0, dates: null, distinct: null, kind: \"\", lengths: null, missing: 0, numbers: null, values: null}}",
185
+ ];
186
+ /**
187
+ * A jq program that summarises a value of a type, leaf by leaf, to a
188
+ * {@link SummaryType}.
189
+ *
190
+ * @param type - the type of the value the program runs on
191
+ * @param options - how many leaves, and how many text values per leaf
192
+ * @returns the program's text, which checks against `type` to `SummaryType`
193
+ *
194
+ * @remarks
195
+ * The rows are the elements of an array or set, the values of a dict, and
196
+ * otherwise the value itself. The leaves are the paths from a row to each
197
+ * scalar, each variant's `.type` and each case's payload leaves (counted
198
+ * where the case holds), and each list, shallowest first. The program binds
199
+ * the rows once and builds each leaf's summary with jq over them, so it runs
200
+ * wherever queries run, and after any program: `prefix + " | " +
201
+ * summaryProgram(typeAfterPrefix)` summarises the rows at that stage.
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * const program = summaryProgram(ArrayType(StructType({ total: FloatType })));
206
+ * checkJq(program, ArrayType(StructType({ total: FloatType }))).elementType; // SummaryType
207
+ * ```
208
+ */
209
+ export function summaryProgram(type, options = {}) {
210
+ const t = unwrap(type);
211
+ const payload = nullablePayload(t);
212
+ const container = unwrap(payload ?? t);
213
+ const elementOf = (u) => u.type === "Array" ? u.value : u.type === "Set" ? u.key : u.type === "Vector" ? u.element
214
+ : u.type === "Dict" ? u.value : undefined;
215
+ const element = elementOf(container);
216
+ const rows = element === undefined ? "[.]" : payload === undefined ? "[.[]]" : "[.[]?]";
217
+ const leaves = leavesOf(element ?? type, options.maxLeaves ?? 100);
218
+ const entries = [...PROTOTYPES, ...leaves.map(leaf => leafProgram(leaf, options.topValues ?? 20))];
219
+ return `("1970-01-01T00:00:00Z" | fromdate) as $epoch | ${rows} as $rows | `
220
+ + `{count: ($rows | length), leaves: ([${entries.join(", ")}] | .[2:] | from_entries)}`;
221
+ }
222
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../../src/query/jq/summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EACL,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAC9F,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEtD,4CAA4C;AAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC;QAC3B,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC;QAChC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;KACrE,CAAC,CAAC;IACH,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC;IACjC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACvG,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;CAC7C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;AAkB7G,+DAA+D;AAC/D,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,+CAA+C;AAC/C,SAAS,QAAQ,CAAC,GAAa,EAAE,SAAiB;IAChD,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAmF;QAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE;KACtD,CAAC;IACF,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE;QAClD,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;IACzG,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,kEAAkE;QAClE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ,CAAC;YAAC,KAAK,SAAS,CAAC;YAAC,KAAK,OAAO,CAAC;YAAC,KAAK,SAAS,CAAC;YAAC,KAAK,UAAU;gBAC1E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,OAAO,CAAC;YAAC,KAAK,KAAK,CAAC;YAAC,KAAK,QAAQ,CAAC;YAAC,KAAK,MAAM,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBAChJ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClI,MAAM;YACR,CAAC;YACD,KAAK,QAAQ;gBACX,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAkC,CAAC,EAAE,CAAC;oBACrF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5G,CAAC;gBACD,MAAM;YACR,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,KAAK,GAAG,KAAK,CAAC,KAAiC,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtK,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM;wBAAE,SAAS;oBAC/C,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,mBAAmB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;oBACtG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBACD,MAAM;YACR,CAAC;YACD;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,mDAAmD;AACnD,SAAS,WAAW,CAAC,IAAU,EAAE,SAAiB;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChH,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,EAAE,oDAAoD,KAAK,KAAK,CAAC;IAClH,MAAM,GAAG,GAAG,iCAAiC,SAAS,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,IAAI,QAAQ,GAAG,MAAM,CAAC;IACtB,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,4BAA4B,UAAU,CAAC,CAAC,CAAC,wBAAwB,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACjI,QAAQ,GAAG,wBAAwB,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,QAAQ,GAAG,wBAAwB,CAAC;gBACpC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC9C,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,GAAG,IAAI,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC9D,MAAM;YACR,KAAK,SAAS,CAAC;YAAC,KAAK,OAAO;gBAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;oBAAE,QAAQ,GAAG,wBAAwB,CAAC;gBAClE,OAAO,GAAG,oEAAoE;sBAC1E,sIAAsI,CAAC;gBAC3I,MAAM;YACR,KAAK,UAAU;gBACb,KAAK,GAAG,wCAAwC;sBAC5C,mEAAmE,MAAM,CAAC,+BAA+B,EAAE,MAAM,CAAC,KAAK;sBACvH,WAAW,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,CAAC;gBACtD,MAAM;YACR;gBACE,OAAO,GAAG,2FAA2F,CAAC;gBACtG,MAAM;QACV,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,aAAa,CAAC;IACtE,OAAO,SAAS,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,KAAK,aAAa,OAAO,EAAE;UACpF,WAAW,KAAK,kCAAkC,KAAK,eAAe,QAAQ,WAAW,UAAU,CAAC,IAAI,CAAC,IAAI;UAC7G,YAAY,OAAO,cAAc,OAAO,cAAc,OAAO,aAAa,MAAM,KAAK,CAAC;AAC5F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,GAAG;IACjB,+HAA+H;UAC3H,8FAA8F;UAC9F,wFAAwF;IAC5F,8IAA8I;CAC/I,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,UAAiC,EAAE;IAChF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,CAAW,EAAwB,EAAE,CACtD,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAmB;QAC3H,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,mDAAmD,IAAI,cAAc;UACxE,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ import type { Expr } from "../../expr/expr.js";
6
+ import { type EastType } from "../../types.js";
7
+ import { type Block, type BuiltinRule, type CallSite, type Translator } from "./translate.js";
8
+ /**
9
+ * `a + b` for `add`, as the checker types it: numbers, strings, arrays, dicts;
10
+ * struct merges. Also how a split query's pieces add up an `add` (`split.ts`).
11
+ *
12
+ * @internal
13
+ */
14
+ export declare function addInto(t: Translator, c: CallSite, $: Block, acc: Expr, v: Expr, type: EastType): void;
15
+ /** A format: a value as text. @internal */
16
+ export type Format = (t: Translator, $: Block, v: Expr, path: string) => Expr;
17
+ /** Each format, by name. @internal */
18
+ export declare const FORMATS: Readonly<Record<string, Format>>;
19
+ /** Every builtin's rule, by name as called; formats as `@name`. @internal */
20
+ export declare const BUILTIN_RULES: Readonly<Record<string, BuiltinRule>>;
21
+ //# sourceMappingURL=translate-builtins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate-builtins.d.ts","sourceRoot":"","sources":["../../../../src/query/jq/translate-builtins.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAEoD,KAAK,QAAQ,EACvE,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAiB,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAuB,KAAK,UAAU,EAA8B,MAAM,gBAAgB,CAAC;AA2zB9J;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAqBtG;AA0qBD,2CAA2C;AAC3C,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAwF9E,sCAAsC;AACtC,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BpD,CAAC;AAwJF,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAS,CAAC"}