@ex-grid/pivot-engine 0.0.0-stage → 0.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +28 -2
- package/dist/index.d.ts +2206 -0
- package/dist/index.js +13472 -0
- package/dist/index.js.map +7 -0
- package/package.json +26 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/errors.ts", "../src/must.ts", "../src/words/word-tables.ts", "../src/words/pivot-words.ts", "../src/culture/culture-table.ts", "../src/culture/culture-data.ts", "../src/text/number-text.ts", "../src/text/date-text.ts", "../src/text/detail-text.ts", "../src/layout/pivot-enums.ts", "../src/items/item-key.ts", "../src/text/upper-table.ts", "../src/text/casing.ts", "../src/text/invariant.ts", "../src/aggregates/exact-decimal.ts", "../src/items/snapshot-item.ts", "../src/layout/pivot-layout.ts", "../src/json/json-text.ts", "../src/layout/layout-json.ts", "../src/fields/pivot-field.ts", "../src/items/record-value.ts", "../src/text/tailored-ranks.ts", "../src/text/collation.ts", "../src/text/general.ts", "../src/report/labels.ts", "../src/aggregates/parts.ts", "../src/cube/query.ts", "../src/levels/level-shown.ts", "../src/cube/answer.ts", "../src/source/slicing.ts", "../src/levels/level-check.ts", "../src/levels/level-sums.ts", "../src/cube/cube.ts", "../src/report/value.ts", "../src/report/report.ts", "../src/layout/layout-edits.ts", "../src/source/pivot-source.ts", "../src/source/binding.ts", "../src/source/aggregation-pass.ts", "../src/levels/level-answers.ts", "../src/source/server-batches.ts", "../src/source/leaf-bound.ts", "../src/source/pivot-json.ts", "../src/engine.ts", "../src/reports/contract.ts", "../src/reports/label-metrics.ts", "../src/reports/change-times.ts", "../src/reports/local-report-source.ts", "../src/computation/paged.ts", "../src/computation/cells.ts", "../src/computation/axis.ts", "../src/computation/members.ts", "../src/computation/cube.ts", "../src/computation/report.ts", "../src/computation/session.ts"],
|
|
4
|
+
"sourcesContent": ["// The refusals the engine throws that are neither a RangeError, a TypeError nor a plain Error\n// (tests/cases/README.md): each is a C# exception of its own, and a shared case names it by kind.\n\n/** Text that is not in the form it must be: a .NET format string .NET does not read, a word's template\n * with a brace out of place, a Pivot Layout's JSON that is not one. The C# engine's FormatException. */\nexport class PivotFormatError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'PivotFormatError';\n }\n}\n\n/** A Pivot Layout written by a version this reader does not read: the C# engine's NotSupportedException. */\nexport class PivotVersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PivotVersionError';\n }\n}\n\n/** A field's Order Key failed on an Item, or gave its Items keys of two types (ADR-0060): the order is\n * refused, naming the field and the value, rather than fall back to the labels. */\nexport class PivotOrderKeyError extends Error {\n /** The name of the field whose Order Key failed. */\n readonly field: string;\n\n constructor(field: string, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'PivotOrderKeyError';\n this.field = field;\n }\n}\n", "// What the engine knows is there, as core/src/must.ts says it for the Script Core: a miss is a defect in\n// the engine, said by throwing where a `!` would read on with `undefined` (CONVENTIONS.md, \"No quiet\n// fallback\"). The packages share no code, so each carries its own.\n\n/** The element at `index`, which the caller knows is there. A miss throws: it is a defect, never an answer. */\nexport function elementAt<T extends object | string | number | boolean | bigint | null>(list: ArrayLike<T>, index: number): T {\n const value = list[index];\n if (value === undefined) {\n throw new Error(`Internal: index ${index} is outside a list of ${list.length}.`);\n }\n return value;\n}\n\n/** The value, which the caller knows is there. `undefined` throws, naming what was missing. */\nexport function defined<T>(value: T | undefined, what: string): T {\n if (value === undefined) {\n throw new Error(`Internal: ${what} is missing.`);\n }\n return value;\n}\n\n/** The smallest 64-bit integer, as C#'s long holds it. */\nexport const int64Min = -(1n << 63n);\n\n/** The largest 64-bit integer, as C#'s long holds it. */\nexport const int64Max = (1n << 63n) - 1n;\n\n/** The end of a switch that has taken every member of a union; a value from outside it throws here. */\nexport function unreachable(value: never): never {\n throw new Error(`Internal: ${String(value)} is not a value this switch takes.`);\n}\n", "// Transcribed by dotnet/tools/pivot-oracle (`dotnet run --project dotnet/tools/pivot-oracle -- words <this file>`) from\n// ExPivot.Engine's PivotWords and PivotDateWords (ADR-0060): the words ExPivot paints, by id, in Excel's\n// English (United States) edition, the English (United Kingdom) edition's where they differ, and the\n// Japanese edition's. tests/cases/pivot/words holds both engines to them.\n\n/** The English of Excel's English (United States) edition, for every id. */\nexport const englishWords: Readonly<Record<string, string>> = {\n 'row-labels': \"Row Labels\",\n 'values': \"Values\",\n 'grand-total': \"Grand Total\",\n 'item-total': \"{0} Total\",\n 'total-of': \"Total {0}\",\n 'item-value': \"{0} {1}\",\n 'blank': \"(blank)\",\n 'all': \"(All)\",\n 'multiple-items': \"(Multiple Items)\",\n 'values-pseudo-field': \"\u03A3 Values\",\n 'aggregation-sum': \"Sum\",\n 'aggregation-count': \"Count\",\n 'aggregation-average': \"Average\",\n 'aggregation-max': \"Max\",\n 'aggregation-min': \"Min\",\n 'aggregation-product': \"Product\",\n 'aggregation-count-numbers': \"Count Numbers\",\n 'aggregation-stddev': \"StdDev\",\n 'aggregation-stddevp': \"StdDevp\",\n 'aggregation-var': \"Var\",\n 'aggregation-varp': \"Varp\",\n 'caption-sum': \"Sum of {0}\",\n 'caption-count': \"Count of {0}\",\n 'caption-average': \"Average of {0}\",\n 'caption-max': \"Max of {0}\",\n 'caption-min': \"Min of {0}\",\n 'caption-product': \"Product of {0}\",\n 'caption-count-numbers': \"Count of {0}\",\n 'caption-stddev': \"StdDev of {0}\",\n 'caption-stddevp': \"StdDevp of {0}\",\n 'caption-var': \"Var of {0}\",\n 'caption-varp': \"Varp of {0}\",\n 'show-no-calculation': \"No Calculation\",\n 'show-percent-of-grand-total': \"% of Grand Total\",\n 'show-percent-of-column-total': \"% of Column Total\",\n 'show-percent-of-row-total': \"% of Row Total\",\n 'field-list': \"PivotTable Fields\",\n 'choose-fields': \"Choose fields to add to report:\",\n 'drag-fields': \"Drag fields between areas below:\",\n 'search-fields': \"Search\",\n 'area-filters': \"Filters\",\n 'area-columns': \"Columns\",\n 'area-rows': \"Rows\",\n 'area-values': \"Values\",\n 'field-menu': \"Options for {0}\",\n 'filtered': \"Filtered\",\n 'drop-here': \"Drop here\",\n 'move-up': \"Move Up\",\n 'move-down': \"Move Down\",\n 'move-to-beginning': \"Move to Beginning\",\n 'move-to-end': \"Move to End\",\n 'move-to-filters': \"Move to Report Filter\",\n 'move-to-rows': \"Move to Row Labels\",\n 'move-to-columns': \"Move to Column Labels\",\n 'move-to-values': \"Move to Values\",\n 'remove-field': \"Remove Field\",\n 'field-settings': \"Field Settings\u2026\",\n 'value-field-settings': \"Value Field Settings\u2026\",\n 'sort-ascending': \"Sort A to Z\",\n 'sort-descending': \"Sort Z to A\",\n 'filter-items': \"Filter\u2026\",\n 'expand-field': \"Expand Entire Field\",\n 'collapse-field': \"Collapse Entire Field\",\n 'ok': \"OK\",\n 'cancel': \"Cancel\",\n 'select-all': \"(Select All)\",\n 'search-items': \"Search\",\n 'too-many-items': \"More than {0} items. Search to narrow the list.\",\n 'no-items-match': \"No items match.\",\n 'custom-name': \"Custom Name\",\n 'summarize-by': \"Summarize value field by\",\n 'show-values-as': \"Show values as\",\n 'number-format': \"Number format\",\n 'number-format-general': \"General\",\n 'sample': \"Sample: {0}\",\n 'subtotals': \"Subtotals\",\n 'subtotals-automatic': \"Automatic\",\n 'subtotals-none': \"None\",\n 'sort-order': \"Sort\",\n 'sort-label-ascending': \"Ascending (A to Z) by label\",\n 'sort-label-descending': \"Descending (Z to A) by label\",\n 'sort-value-ascending': \"Ascending by {0}\",\n 'sort-value-descending': \"Descending by {0}\",\n 'refused-hides-every-item': \"Select at least one item.\",\n 'refused-caption-taken': \"PivotTable field name already exists.\",\n 'refused-caption-empty': \"Enter a name.\",\n 'refused-number-format': \"This number format cannot be used.\",\n 'empty-report': \"To build a report, choose fields from the PivotTable Fields list.\",\n 'report-filters': \"Report filters\",\n 'filter-of': \"Filter {0}\",\n 'expand': \"Expand\",\n 'collapse': \"Collapse\",\n 'expand-item': \"Expand {0}\",\n 'collapse-item': \"Collapse {0}\",\n 'show-details': \"Show Details\",\n 'sort-smallest-to-largest': \"Sort Smallest to Largest\",\n 'sort-largest-to-smallest': \"Sort Largest to Smallest\",\n 'remove-named-field': \"Remove \\\"{0}\\\"\",\n 'show-field-list': \"Show Field List\",\n 'hide-field-list': \"Hide Field List\",\n 'layout-menu': \"Layout\",\n 'grand-totals': \"Grand Totals\",\n 'report-layout': \"Report Layout\",\n 'subtotals-do-not-show': \"Do Not Show Subtotals\",\n 'subtotals-at-bottom': \"Show all Subtotals at Bottom of Group\",\n 'subtotals-at-top': \"Show all Subtotals at Top of Group\",\n 'grand-totals-off': \"Off for Rows and Columns\",\n 'grand-totals-on': \"On for Rows and Columns\",\n 'grand-totals-rows-only': \"On for Rows Only\",\n 'grand-totals-columns-only': \"On for Columns Only\",\n 'form-compact': \"Show in Compact Form\",\n 'form-outline': \"Show in Outline Form\",\n 'form-tabular': \"Show in Tabular Form\",\n 'repeat-item-labels': \"Repeat All Item Labels\",\n 'do-not-repeat-item-labels': \"Do Not Repeat Item Labels\",\n 'refresh': \"Refresh\",\n 'field-list-toggle': \"Field List\",\n 'loading': \"Loading\u2026\",\n 'defer-layout-update': \"Defer Layout Update\",\n 'update': \"Update\",\n 'refused-too-many-cells': \"This layout needs more than {0} cells.\",\n 'refused-too-many-rows': \"This layout needs more than {0} rows.\",\n 'refused-too-many-columns': \"This layout needs more than {0} columns.\",\n 'refused-out-of-memory': \"Memory ran out while this layout was laid out.\",\n 'refused-too-many-combinations': \"{0} in {1} makes more than {2} combinations, the most server data allows.\",\n 'refused-too-many-combinations-counted': \"{0} ({1} items) in {2} makes more than {3} combinations, the most server data allows.\",\n 'refused-too-many-combinations-remedy': \"Put {0} in Filters, or filter {0} first.\",\n 'field-item-count': \"{0} items\",\n 'drop-over-cap': \"More than {0} combinations, the most server data allows\",\n 'aggregation-not-offered': \"The source does not answer {0}.\",\n 'source-failed': \"The source could not answer: {0}\",\n 'source-refused': \"The source refused to answer: {0}\",\n 'data-changed': \"The data has changed \u2014 refresh.\",\n 'copy-another-version': \"The copy answered another Report Version.\",\n 'copy-missing-range': \"The copy did not answer every selected range.\",\n 'copy-incomplete-range': \"The copy returned an incomplete selected range.\",\n 'summary-another-version': \"The summary answered another Report Version.\",\n 'summary-inconsistent-errors': \"The summary returned inconsistent error counts.\",\n 'copy-stale-report': \"The report shows the data as of {0}: Retry before copying.\",\n 'find-report-not-held': \"The source no longer holds the report shown: refresh, then find again.\",\n 'find-invalid-answer': \"The source answered the search with another version or range than it was asked.\",\n 'find-report-changing': \"The report kept changing while it was searched: find again.\",\n 'replace-unavailable': \"Cannot change this part of a PivotTable report.\",\n 'details-title': \"Details: {0}\",\n 'report-tab': \"PivotTable\",\n 'sheets': \"Sheets\",\n 'close-tab': \"Close {0}\",\n 'close': \"Close\",\n 'stale-report': \"Showing the data as of {0}: {1}\",\n 'stale-too-many-cells': \"the newest data needs more than {0} cells.\",\n 'stale-too-many-rows': \"the newest data needs more than {0} rows.\",\n 'stale-too-many-columns': \"the newest data needs more than {0} columns.\",\n 'stale-source-failed': \"the source could not answer: {0}\",\n 'stale-source-refused': \"the source refused to answer: {0}\",\n 'stale-out-of-memory': \"memory ran out while the newest data was laid out.\",\n 'retry': \"Retry\",\n};\n\n/** The English (United Kingdom) edition's words, where they differ. */\nexport const unitedKingdomWords: Readonly<Record<string, string>> = {\n 'aggregation-max': \"Max.\",\n 'aggregation-min': \"Min.\",\n 'caption-max': \"Max. of {0}\",\n 'caption-min': \"Min. of {0}\",\n 'summarize-by': \"Summarise value field by\",\n};\n\n/** The Japanese edition's words. */\nexport const japaneseWords: Readonly<Record<string, string>> = {\n 'row-labels': \"\u884C\u30E9\u30D9\u30EB\",\n 'values': \"\u5024\",\n 'grand-total': \"\u7DCF\u8A08\",\n 'item-total': \"{0} \u96C6\u8A08\",\n 'total-of': \"\u5168\u4F53\u306E {0}\",\n 'item-value': \"{0} {1}\",\n 'blank': \"(\u7A7A\u767D)\",\n 'all': \"(\u3059\u3079\u3066)\",\n 'multiple-items': \"(\u8907\u6570\u306E\u30A2\u30A4\u30C6\u30E0)\",\n 'values-pseudo-field': \"\u03A3 \u5024\",\n 'aggregation-sum': \"\u5408\u8A08\",\n 'aggregation-count': \"\u500B\u6570\",\n 'aggregation-average': \"\u5E73\u5747\",\n 'aggregation-max': \"\u6700\u5927\",\n 'aggregation-min': \"\u6700\u5C0F\",\n 'aggregation-product': \"\u7A4D\",\n 'aggregation-count-numbers': \"\u6570\u5024\u306E\u500B\u6570\",\n 'aggregation-stddev': \"\u6A19\u672C\u6A19\u6E96\u504F\u5DEE\",\n 'aggregation-stddevp': \"\u6A19\u6E96\u504F\u5DEE\",\n 'aggregation-var': \"\u6A19\u672C\u5206\u6563\",\n 'aggregation-varp': \"\u5206\u6563\",\n 'caption-sum': \"\u5408\u8A08 / {0}\",\n 'caption-count': \"\u30C7\u30FC\u30BF\u306E\u500B\u6570 / {0}\",\n 'caption-average': \"\u5E73\u5747 / {0}\",\n 'caption-max': \"\u6700\u5927 / {0}\",\n 'caption-min': \"\u6700\u5C0F / {0}\",\n 'caption-product': \"\u7A4D / {0}\",\n 'caption-count-numbers': \"\u30C7\u30FC\u30BF\u306E\u500B\u6570 / {0}\",\n 'caption-stddev': \"\u6A19\u672C\u6A19\u6E96\u504F\u5DEE / {0}\",\n 'caption-stddevp': \"\u6A19\u6E96\u504F\u5DEE / {0}\",\n 'caption-var': \"\u6A19\u672C\u5206\u6563 / {0}\",\n 'caption-varp': \"\u5206\u6563 / {0}\",\n 'show-no-calculation': \"\u8A08\u7B97\u306A\u3057\",\n 'show-percent-of-grand-total': \"\u7DCF\u8A08\u306B\u5BFE\u3059\u308B\u6BD4\u7387\",\n 'show-percent-of-column-total': \"\u5217\u96C6\u8A08\u306B\u5BFE\u3059\u308B\u6BD4\u7387\",\n 'show-percent-of-row-total': \"\u884C\u96C6\u8A08\u306B\u5BFE\u3059\u308B\u6BD4\u7387\",\n 'field-list': \"\u30D4\u30DC\u30C3\u30C8\u30C6\u30FC\u30D6\u30EB\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\",\n 'choose-fields': \"\u30EC\u30DD\u30FC\u30C8\u306B\u8FFD\u52A0\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:\",\n 'drag-fields': \"\u6B21\u306E\u30DC\u30C3\u30AF\u30B9\u9593\u3067\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u304F\u3060\u3055\u3044:\",\n 'search-fields': \"\u691C\u7D22\",\n 'area-filters': \"\u30D5\u30A3\u30EB\u30BF\u30FC\",\n 'area-columns': \"\u5217\",\n 'area-rows': \"\u884C\",\n 'area-values': \"\u5024\",\n 'field-menu': \"{0} \u306E\u30AA\u30D7\u30B7\u30E7\u30F3\",\n 'filtered': \"\u30D5\u30A3\u30EB\u30BF\u30FC\u9069\u7528\",\n 'drop-here': \"\u3053\u3053\u306B\u30C9\u30ED\u30C3\u30D7\",\n 'move-up': \"\u4E0A\u3078\u79FB\u52D5\",\n 'move-down': \"\u4E0B\u3078\u79FB\u52D5\",\n 'move-to-beginning': \"\u5148\u982D\u3078\u79FB\u52D5\",\n 'move-to-end': \"\u672B\u5C3E\u3078\u79FB\u52D5\",\n 'move-to-filters': \"\u30EC\u30DD\u30FC\u30C8 \u30D5\u30A3\u30EB\u30BF\u30FC\u306B\u79FB\u52D5\",\n 'move-to-rows': \"\u884C\u30E9\u30D9\u30EB\u306B\u79FB\u52D5\",\n 'move-to-columns': \"\u5217\u30E9\u30D9\u30EB\u306B\u79FB\u52D5\",\n 'move-to-values': \"\u5024\u306B\u79FB\u52D5\",\n 'remove-field': \"\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u524A\u9664\",\n 'field-settings': \"\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u8A2D\u5B9A...\",\n 'value-field-settings': \"\u5024\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u8A2D\u5B9A...\",\n 'sort-ascending': \"\u6607\u9806\",\n 'sort-descending': \"\u964D\u9806\",\n 'filter-items': \"\u30D5\u30A3\u30EB\u30BF\u30FC...\",\n 'expand-field': \"\u30D5\u30A3\u30FC\u30EB\u30C9\u5168\u4F53\u306E\u5C55\u958B\",\n 'collapse-field': \"\u30D5\u30A3\u30FC\u30EB\u30C9\u5168\u4F53\u306E\u6298\u308A\u305F\u305F\u307F\",\n 'ok': \"OK\",\n 'cancel': \"\u30AD\u30E3\u30F3\u30BB\u30EB\",\n 'select-all': \"(\u3059\u3079\u3066\u9078\u629E)\",\n 'search-items': \"\u691C\u7D22\",\n 'too-many-items': \"{0} \u500B\u3092\u8D85\u3048\u308B\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u3059\u3002\u691C\u7D22\u3057\u3066\u4E00\u89A7\u3092\u7D5E\u308A\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\u3002\",\n 'no-items-match': \"\u4E00\u81F4\u3059\u308B\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002\",\n 'custom-name': \"\u540D\u524D\u306E\u6307\u5B9A\",\n 'summarize-by': \"\u5024\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u96C6\u8A08\",\n 'show-values-as': \"\u8A08\u7B97\u306E\u7A2E\u985E\",\n 'number-format': \"\u8868\u793A\u5F62\u5F0F\",\n 'number-format-general': \"\u6A19\u6E96\",\n 'sample': \"\u30B5\u30F3\u30D7\u30EB: {0}\",\n 'subtotals': \"\u5C0F\u8A08\",\n 'subtotals-automatic': \"\u81EA\u52D5\",\n 'subtotals-none': \"\u306A\u3057\",\n 'sort-order': \"\u4E26\u3079\u66FF\u3048\",\n 'sort-label-ascending': \"\u30E9\u30D9\u30EB\u306E\u6607\u9806\",\n 'sort-label-descending': \"\u30E9\u30D9\u30EB\u306E\u964D\u9806\",\n 'sort-value-ascending': \"{0} \u306E\u6607\u9806\",\n 'sort-value-descending': \"{0} \u306E\u964D\u9806\",\n 'refused-hides-every-item': \"\u5C11\u306A\u304F\u3068\u3082 1 \u3064\u306E\u30A2\u30A4\u30C6\u30E0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-caption-taken': \"\u305D\u306E\u30D4\u30DC\u30C3\u30C8\u30C6\u30FC\u30D6\u30EB\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u540D\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\",\n 'refused-caption-empty': \"\u540D\u524D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-number-format': \"\u3053\u306E\u8868\u793A\u5F62\u5F0F\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\",\n 'empty-report': \"\u30EC\u30DD\u30FC\u30C8\u3092\u4F5C\u6210\u3059\u308B\u306B\u306F\u3001[\u30D4\u30DC\u30C3\u30C8\u30C6\u30FC\u30D6\u30EB\u306E\u30D5\u30A3\u30FC\u30EB\u30C9] \u30EA\u30B9\u30C8\u304B\u3089\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'report-filters': \"\u30EC\u30DD\u30FC\u30C8 \u30D5\u30A3\u30EB\u30BF\u30FC\",\n 'filter-of': \"{0} \u306E\u30D5\u30A3\u30EB\u30BF\u30FC\",\n 'expand': \"\u5C55\u958B\",\n 'collapse': \"\u6298\u308A\u305F\u305F\u307F\",\n 'expand-item': \"{0} \u3092\u5C55\u958B\",\n 'collapse-item': \"{0} \u3092\u6298\u308A\u305F\u305F\u3080\",\n 'show-details': \"\u8A73\u7D30\u306E\u8868\u793A\",\n 'sort-smallest-to-largest': \"\u6607\u9806\",\n 'sort-largest-to-smallest': \"\u964D\u9806\",\n 'remove-named-field': \"\\\"{0}\\\" \u306E\u524A\u9664\",\n 'show-field-list': \"\u30D5\u30A3\u30FC\u30EB\u30C9 \u30EA\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\",\n 'hide-field-list': \"\u30D5\u30A3\u30FC\u30EB\u30C9 \u30EA\u30B9\u30C8\u3092\u8868\u793A\u3057\u306A\u3044\",\n 'layout-menu': \"\u30EC\u30A4\u30A2\u30A6\u30C8\",\n 'grand-totals': \"\u7DCF\u8A08\",\n 'report-layout': \"\u30EC\u30DD\u30FC\u30C8\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\",\n 'subtotals-do-not-show': \"\u5C0F\u8A08\u3092\u8868\u793A\u3057\u306A\u3044\",\n 'subtotals-at-bottom': \"\u3059\u3079\u3066\u306E\u5C0F\u8A08\u3092\u30B0\u30EB\u30FC\u30D7\u306E\u672B\u5C3E\u306B\u8868\u793A\u3059\u308B\",\n 'subtotals-at-top': \"\u3059\u3079\u3066\u306E\u5C0F\u8A08\u3092\u30B0\u30EB\u30FC\u30D7\u306E\u5148\u982D\u306B\u8868\u793A\u3059\u308B\",\n 'grand-totals-off': \"\u884C\u3068\u5217\u306E\u96C6\u8A08\u3092\u884C\u308F\u306A\u3044\",\n 'grand-totals-on': \"\u884C\u3068\u5217\u306E\u96C6\u8A08\u3092\u884C\u3046\",\n 'grand-totals-rows-only': \"\u884C\u306E\u307F\u96C6\u8A08\u3092\u884C\u3046\",\n 'grand-totals-columns-only': \"\u5217\u306E\u307F\u96C6\u8A08\u3092\u884C\u3046\",\n 'form-compact': \"\u30B3\u30F3\u30D1\u30AF\u30C8\u5F62\u5F0F\u3067\u8868\u793A\",\n 'form-outline': \"\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u5F62\u5F0F\u3067\u8868\u793A\",\n 'form-tabular': \"\u8868\u5F62\u5F0F\u3067\u8868\u793A\",\n 'repeat-item-labels': \"\u30A2\u30A4\u30C6\u30E0\u306E\u30E9\u30D9\u30EB\u3092\u3059\u3079\u3066\u7E70\u308A\u8FD4\u3059\",\n 'do-not-repeat-item-labels': \"\u30A2\u30A4\u30C6\u30E0\u306E\u30E9\u30D9\u30EB\u3092\u7E70\u308A\u8FD4\u3055\u306A\u3044\",\n 'refresh': \"\u66F4\u65B0\",\n 'field-list-toggle': \"\u30D5\u30A3\u30FC\u30EB\u30C9 \u30EA\u30B9\u30C8\",\n 'loading': \"\u8AAD\u307F\u8FBC\u307F\u4E2D...\",\n 'defer-layout-update': \"\u30EC\u30A4\u30A2\u30A6\u30C8\u306E\u66F4\u65B0\u3092\u4FDD\u7559\u3059\u308B\",\n 'update': \"\u66F4\u65B0\",\n 'refused-too-many-cells': \"\u3053\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\u306B\u306F {0} \u500B\u3092\u8D85\u3048\u308B\u30BB\u30EB\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'refused-too-many-rows': \"\u3053\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\u306B\u306F {0} \u3092\u8D85\u3048\u308B\u884C\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'refused-too-many-columns': \"\u3053\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\u306B\u306F {0} \u3092\u8D85\u3048\u308B\u5217\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'refused-out-of-memory': \"\u3053\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u914D\u7F6E\u3059\u308B\u9014\u4E2D\u3067\u30E1\u30E2\u30EA\u304C\u4E0D\u8DB3\u3057\u307E\u3057\u305F\u3002\",\n 'refused-too-many-combinations': \"{1}\u306B {0} \u3092\u7F6E\u304F\u3068\u3001\u7D44\u307F\u5408\u308F\u305B\u304C\u30B5\u30FC\u30D0\u30FC\u306E\u30C7\u30FC\u30BF\u3067\u6271\u3048\u308B\u4E0A\u9650\u306E {2} \u3092\u8D85\u3048\u307E\u3059\u3002\",\n 'refused-too-many-combinations-counted': \"{2}\u306B {0} ({1} \u500B\u306E\u30A2\u30A4\u30C6\u30E0) \u3092\u7F6E\u304F\u3068\u3001\u7D44\u307F\u5408\u308F\u305B\u304C\u30B5\u30FC\u30D0\u30FC\u306E\u30C7\u30FC\u30BF\u3067\u6271\u3048\u308B\u4E0A\u9650\u306E {3} \u3092\u8D85\u3048\u307E\u3059\u3002\",\n 'refused-too-many-combinations-remedy': \"{0} \u3092\u30D5\u30A3\u30EB\u30BF\u30FC\u306B\u7F6E\u304F\u304B\u3001\u5148\u306B {0} \u3092\u7D5E\u308A\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\u3002\",\n 'field-item-count': \"{0} \u500B\u306E\u30A2\u30A4\u30C6\u30E0\",\n 'drop-over-cap': \"\u7D44\u307F\u5408\u308F\u305B\u304C\u30B5\u30FC\u30D0\u30FC\u306E\u30C7\u30FC\u30BF\u3067\u6271\u3048\u308B\u4E0A\u9650\u306E {0} \u3092\u8D85\u3048\u307E\u3059\",\n 'aggregation-not-offered': \"\u30BD\u30FC\u30B9\u306F {0} \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002\",\n 'source-failed': \"\u30BD\u30FC\u30B9\u304B\u3089\u5FDC\u7B54\u3092\u5F97\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {0}\",\n 'source-refused': \"\u30BD\u30FC\u30B9\u304C\u5FDC\u7B54\u3092\u62D2\u5426\u3057\u307E\u3057\u305F: {0}\",\n 'data-changed': \"\u30C7\u30FC\u30BF\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F\u3002\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'copy-another-version': \"\u30B3\u30D4\u30FC\u3078\u306E\u5FDC\u7B54\u304C\u3001\u5225\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30EC\u30DD\u30FC\u30C8\u306E\u3082\u306E\u3067\u3057\u305F\u3002\",\n 'copy-missing-range': \"\u30B3\u30D4\u30FC\u3078\u306E\u5FDC\u7B54\u306B\u3001\u9078\u629E\u3057\u305F\u3059\u3079\u3066\u306E\u7BC4\u56F2\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u305B\u3093\u3067\u3057\u305F\u3002\",\n 'copy-incomplete-range': \"\u30B3\u30D4\u30FC\u3078\u306E\u5FDC\u7B54\u306B\u3001\u6B20\u3051\u306E\u3042\u308B\u9078\u629E\u7BC4\u56F2\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3057\u305F\u3002\",\n 'summary-another-version': \"\u96C6\u8A08\u3078\u306E\u5FDC\u7B54\u304C\u3001\u5225\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30EC\u30DD\u30FC\u30C8\u306E\u3082\u306E\u3067\u3057\u305F\u3002\",\n 'summary-inconsistent-errors': \"\u96C6\u8A08\u3078\u306E\u5FDC\u7B54\u3067\u3001\u30A8\u30E9\u30FC\u306E\u6570\u304C\u98DF\u3044\u9055\u3063\u3066\u3044\u307E\u3057\u305F\u3002\",\n 'copy-stale-report': \"\u30EC\u30DD\u30FC\u30C8\u306F {0} \u6642\u70B9\u306E\u30C7\u30FC\u30BF\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059\u3002\u30B3\u30D4\u30FC\u3059\u308B\u524D\u306B\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'find-report-not-held': \"\u30BD\u30FC\u30B9\u306F\u8868\u793A\u4E2D\u306E\u30EC\u30DD\u30FC\u30C8\u3092\u4FDD\u6301\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u66F4\u65B0\u3057\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u691C\u7D22\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'find-invalid-answer': \"\u30BD\u30FC\u30B9\u304C\u691C\u7D22\u306B\u5BFE\u3057\u3066\u3001\u8981\u6C42\u3068\u7570\u306A\u308B\u30D0\u30FC\u30B8\u30E7\u30F3\u307E\u305F\u306F\u7BC4\u56F2\u3067\u5FDC\u7B54\u3057\u307E\u3057\u305F\u3002\",\n 'find-report-changing': \"\u691C\u7D22\u4E2D\u306B\u30EC\u30DD\u30FC\u30C8\u304C\u5909\u66F4\u3055\u308C\u7D9A\u3051\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u691C\u7D22\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'replace-unavailable': \"\u30D4\u30DC\u30C3\u30C8\u30C6\u30FC\u30D6\u30EB \u30EC\u30DD\u30FC\u30C8\u306E\u3053\u306E\u90E8\u5206\u306F\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002\",\n 'details-title': \"\u8A73\u7D30: {0}\",\n 'report-tab': \"\u30D4\u30DC\u30C3\u30C8\u30C6\u30FC\u30D6\u30EB\",\n 'sheets': \"\u30B7\u30FC\u30C8\",\n 'close-tab': \"{0} \u3092\u9589\u3058\u308B\",\n 'close': \"\u9589\u3058\u308B\",\n 'stale-report': \"{0} \u6642\u70B9\u306E\u30C7\u30FC\u30BF\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059: {1}\",\n 'stale-too-many-cells': \"\u6700\u65B0\u306E\u30C7\u30FC\u30BF\u306B\u306F {0} \u500B\u3092\u8D85\u3048\u308B\u30BB\u30EB\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'stale-too-many-rows': \"\u6700\u65B0\u306E\u30C7\u30FC\u30BF\u306B\u306F {0} \u3092\u8D85\u3048\u308B\u884C\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'stale-too-many-columns': \"\u6700\u65B0\u306E\u30C7\u30FC\u30BF\u306B\u306F {0} \u3092\u8D85\u3048\u308B\u5217\u304C\u5FC5\u8981\u3067\u3059\u3002\",\n 'stale-source-failed': \"\u30BD\u30FC\u30B9\u304B\u3089\u5FDC\u7B54\u3092\u5F97\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {0}\",\n 'stale-source-refused': \"\u30BD\u30FC\u30B9\u304C\u5FDC\u7B54\u3092\u62D2\u5426\u3057\u307E\u3057\u305F: {0}\",\n 'stale-out-of-memory': \"\u6700\u65B0\u306E\u30C7\u30FC\u30BF\u3092\u914D\u7F6E\u3059\u308B\u9014\u4E2D\u3067\u30E1\u30E2\u30EA\u304C\u4E0D\u8DB3\u3057\u307E\u3057\u305F\u3002\",\n 'retry': \"\u518D\u8A66\u884C\",\n 'copy': \"\u30B3\u30D4\u30FC\",\n 'copy-with-headers': \"\u898B\u51FA\u3057\u4ED8\u304D\u3067\u30B3\u30D4\u30FC\",\n 'reload-notice-script': \"\u3053\u306E\u30DA\u30FC\u30B8\u306B\u306F\u5225\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30B0\u30EA\u30C3\u30C9\u306E\u30B9\u30AF\u30EA\u30D7\u30C8\u304C\u3042\u308A\u307E\u3059\u3002\u30DA\u30FC\u30B8\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'reload-notice-stylesheet': \"\u3053\u306E\u30DA\u30FC\u30B8\u306B\u306F\u5225\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u304C\u3042\u308A\u307E\u3059\u3002\u30DA\u30FC\u30B8\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-empty-selection': \"\u4F55\u3082\u5909\u66F4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30BB\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5148\u306B\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-single-cell-target': \"\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u304C\u3001\u9078\u629E\u3057\u305F 1 \u3064\u306E\u30BB\u30EB\u304B\u3089\u306F\u307F\u51FA\u3057\u307E\u3059\u3002\u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u3068\u540C\u3058\u5F62\u306E\u7BC4\u56F2\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-shape-mismatch': \"\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u304C\u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u306E\u6574\u6570\u500D\u306B\u306A\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u3068\u540C\u3058\u5F62\u306E\u7BC4\u56F2\u304B\u3001\u305D\u306E\u5F62\u304C\u3061\u3087\u3046\u3069\u7E70\u308A\u8FD4\u3055\u308C\u308B\u7BC4\u56F2\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-shape-mismatch-may-spill': \"\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u304C\u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u306E\u6574\u6570\u500D\u306B\u306A\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u3068\u540C\u3058\u5F62\u306E\u7BC4\u56F2\u3001\u305D\u306E\u5F62\u304C\u3061\u3087\u3046\u3069\u7E70\u308A\u8FD4\u3055\u308C\u308B\u7BC4\u56F2\u3001\u307E\u305F\u306F 1 \u3064\u306E\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-disjoint-target': \"\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u8907\u6570\u306E\u30BB\u30EB\u304B\u3089\u306A\u308B\u7BC4\u56F2\u306F\u3001\u8907\u6570\u306E\u9078\u629E\u7BC4\u56F2\u306B\u306F\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3002\u7BC4\u56F2\u3092 1 \u3064\u3060\u3051\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-target-not-editable': \"\u4F55\u3082\u5909\u66F4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u306B\u3001\u7DE8\u96C6\u3067\u304D\u306A\u3044 {column} \u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u7DE8\u96C6\u3067\u304D\u308B\u5217\u306E\u30BB\u30EB\u3060\u3051\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-too-large': \"\u4F55\u3082\u5909\u66F4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u4E00\u5EA6\u306B\u8AAD\u307F\u8FBC\u3081\u308B\u91CF\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002\u3088\u308A\u5C0F\u3055\u306A\u7BC4\u56F2\u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-unreadable': \"\u4F55\u3082\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-cancelled': \"\u4F55\u3082\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u8CBC\u308A\u4ED8\u3051\u306F\u53D6\u308A\u6D88\u3055\u308C\u307E\u3057\u305F\u3002\",\n 'paste-under-way': \"\u8CBC\u308A\u4ED8\u3051\u3066\u3044\u307E\u3059\u3002Escape \u30AD\u30FC\u3067\u53D6\u308A\u6D88\u305B\u307E\u3059\u3002\",\n 'paste-already-landed': \"\u8CBC\u308A\u4ED8\u3051\u306F\u3059\u3067\u306B\u6E08\u3093\u3067\u3044\u305F\u305F\u3081\u3001\u53D6\u308A\u6D88\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\",\n 'refused-paste-spill-past-extent': \"\u8CBC\u308A\u4ED8\u3051\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30B3\u30D4\u30FC\u3057\u305F\u7BC4\u56F2\u304C\u6700\u5F8C\u306E\u884C\u307E\u305F\u306F\u5217\u3092\u8D8A\u3048\u307E\u3059\u3002\u7AEF\u304B\u3089\u96E2\u308C\u305F\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-nothing-to-fill-from': \"\u30D5\u30A3\u30EB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u306E\u4E0A\u306B\u884C\u304C\u306A\u3044\u304B\u3001\u5DE6\u306B\u5217\u304C\u306A\u3044\u305F\u3081\u3001\u5143\u306B\u306A\u308B\u30BB\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u5143\u306B\u306A\u308B\u30BB\u30EB\u3068\u30D5\u30A3\u30EB\u3059\u308B\u30BB\u30EB\u3092\u4E00\u7DD2\u306B\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-multiple-ranges': \"\u30D5\u30A3\u30EB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: \u30D5\u30A3\u30EB\u306F 1 \u3064\u306E\u7BC4\u56F2\u306B\u3060\u3051\u884C\u3048\u307E\u3059\u3002\u7BC4\u56F2\u3092 1 \u3064\u3060\u3051\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-source-unavailable': \"\u30D5\u30A3\u30EB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: \u5143\u306B\u306A\u308B\u30BB\u30EB\u3092\u3059\u3079\u3066\u8AAD\u307F\u53D6\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\",\n 'refused-paste-order-moved': \"\u4F55\u3082\u5909\u66F4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30BB\u30EB\u3092\u9078\u629E\u3057\u305F\u5F8C\u306B\u884C\u304C\u79FB\u52D5\u3057\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-paste-source-changed': \"\u4F55\u3082\u5909\u66F4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30BB\u30EB\u3092\u9078\u629E\u3057\u305F\u5F8C\u306B\u30C7\u30FC\u30BF\u304C\u7F6E\u304D\u63DB\u3048\u3089\u308C\u307E\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-copy-empty-selection': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30BB\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30B3\u30D4\u30FC\u3059\u308B\u30BB\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-copy-misaligned-shape': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u3057\u305F\u7BC4\u56F2\u304C 1 \u3064\u306E\u7BC4\u56F2\u306B\u307E\u3068\u307E\u308A\u307E\u305B\u3093\u3002\u884C\u307E\u305F\u306F\u5217\u304C\u5171\u901A\u3059\u308B\u7BC4\u56F2\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-copy-too-large': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u306E\u30BB\u30EB\u304C\u30011 \u56DE\u306E\u30B3\u30D4\u30FC\u3067\u6271\u3048\u308B\u6570\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002\u4EE3\u308F\u308A\u306B\u30C7\u30FC\u30BF\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002\",\n 'refused-copy-rows-unavailable': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u9078\u629E\u7BC4\u56F2\u306E\u884C\u3092\u3059\u3079\u3066\u8AAD\u307F\u53D6\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\",\n 'refused-copy-clipboard-unavailable': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3078\u306E\u66F8\u304D\u8FBC\u307F\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306E\u5185\u5BB9\u306F\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\u3002\",\n 'refused-copy-by-consumer': \"\u30B3\u30D4\u30FC\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\",\n 'date-year': \"{0}\u5E74\",\n 'date-quarter': \"\u7B2C{0}\u56DB\u534A\u671F\",\n 'date-month-1': \"1\u6708\",\n 'date-month-2': \"2\u6708\",\n 'date-month-3': \"3\u6708\",\n 'date-month-4': \"4\u6708\",\n 'date-month-5': \"5\u6708\",\n 'date-month-6': \"6\u6708\",\n 'date-month-7': \"7\u6708\",\n 'date-month-8': \"8\u6708\",\n 'date-month-9': \"9\u6708\",\n 'date-month-10': \"10\u6708\",\n 'date-month-11': \"11\u6708\",\n 'date-month-12': \"12\u6708\",\n};\n\n/** A date part's Items in English: the year, the quarter and each month. */\nexport const dateEnglishWords: Readonly<Record<string, string>> = {\n 'date-year': \"{0}\",\n 'date-quarter': \"Qtr{0}\",\n 'date-month-1': \"Jan\",\n 'date-month-2': \"Feb\",\n 'date-month-3': \"Mar\",\n 'date-month-4': \"Apr\",\n 'date-month-5': \"May\",\n 'date-month-6': \"Jun\",\n 'date-month-7': \"Jul\",\n 'date-month-8': \"Aug\",\n 'date-month-9': \"Sep\",\n 'date-month-10': \"Oct\",\n 'date-month-11': \"Nov\",\n 'date-month-12': \"Dec\",\n};\n", "// The words ExPivot paints, by id, with their English, which is Excel's English (United States)\n// edition's (ADR-0060): \"Max of {0}\", \"Summarize value field by\". A Consumer replaces any of them through\n// a function from id to text, answering undefined to keep the English. A word with {0} (and {1}) is a\n// template, filled as .NET's string.Format fills one, so a word that reads in C# reads here. The English\n// (United Kingdom) and Japanese editions' words are bundled, as the C# engine bundles them; they never\n// follow the locale on their own (ADR-0060's note of 2026-10-14).\n\nimport { PivotFormatError } from '../errors';\nimport type { PivotAggregation, PivotDatePart, PivotShowValuesAs } from '../layout/pivot-enums';\nimport { unreachable } from '../must';\nimport { dateEnglishWords, englishWords, japaneseWords, unitedKingdomWords } from './word-tables';\n\n/** The Consumer's word for an id, or `undefined` to keep the English. */\nexport type PivotLabel = (id: string) => string | undefined;\n\nconst english: ReadonlyMap<string, string> = new Map(Object.entries(englishWords));\nconst unitedKingdom: ReadonlyMap<string, string> = new Map(Object.entries(unitedKingdomWords));\nconst japanese: ReadonlyMap<string, string> = new Map(Object.entries(japaneseWords));\nconst dateEnglish: ReadonlyMap<string, string> = new Map(Object.entries(dateEnglishWords));\n\n/** The ids of the words a report paints, by what they name. */\nexport const pivotWordIds = Object.freeze({\n /** The Compact form's label column header: `Row Labels`. */\n rowLabels: 'row-labels',\n /** The \u03A3 Values pseudo-field's header, and a report's lone value column when the values stand in\n * rows: `Values`. */\n values: 'values',\n /** The grand total row and column: `Grand Total`. */\n grandTotal: 'grand-total',\n /** An outer Item's subtotal: `{0} Total`, `{0}` the Item's label. */\n itemTotal: 'item-total',\n /** A Value Field's grand total row, with the values in rows: `Total {0}`, `{0}` its caption. */\n totalOf: 'total-of',\n /** An outer Item's subtotal row for one Value Field: `{0} {1}`, the Item's label and the caption. */\n itemValue: 'item-value',\n /** The Blank Item: `(blank)`. */\n blank: 'blank',\n /** A report filter with nothing hidden: `(All)`. */\n all: 'all',\n /** A report filter showing several Items: `(Multiple Items)`. */\n multipleItems: 'multiple-items',\n /** The \u03A3 Values entry in an Area: `\u03A3 Values`. */\n valuesPseudoField: 'values-pseudo-field',\n /** A year's Item: `{0}`, the year. */\n dateYear: 'date-year',\n /** A quarter's Item: `Qtr{0}`, the quarter from 1 to 4. */\n dateQuarter: 'date-quarter',\n /** A server's layout over the leaf cap, refused at the drop (ADR-0370 section 3), `{0}` the field moved,\n * `{1}` its Area's word and `{2}` the cap:\n * `{0} in {1} makes more than {2} combinations, the most server data allows.` */\n tooManyCombinations: 'refused-too-many-combinations',\n /** The same refusal where the source counted the field, `{1}` the field's count of Items:\n * `{0} ({1} items) in {2} makes more than {3} combinations, the most server data allows.` */\n tooManyCombinationsCounted: 'refused-too-many-combinations-counted',\n /** The ways that remain after that refusal, `{0}` the field: `Put {0} in Filters, or filter {0} first.` */\n tooManyCombinationsRemedy: 'refused-too-many-combinations-remedy',\n});\n\nfunction slug(aggregation: PivotAggregation): string {\n switch (aggregation) {\n case 'sum': return 'sum';\n case 'count': return 'count';\n case 'average': return 'average';\n case 'max': return 'max';\n case 'min': return 'min';\n case 'product': return 'product';\n case 'countNumbers': return 'count-numbers';\n case 'stdDev': return 'stddev';\n case 'stdDevp': return 'stddevp';\n case 'var': return 'var';\n case 'varp': return 'varp';\n default: return unreachable(aggregation);\n }\n}\n\n/** The id of an Aggregation's name: `aggregation-sum` is `Sum`. */\nexport function aggregationNameId(aggregation: PivotAggregation): string {\n return `aggregation-${slug(aggregation)}`;\n}\n\n/** The id of a Value Field's default caption: `caption-sum` is `Sum of {0}`, `{0}` the field's caption. */\nexport function captionId(aggregation: PivotAggregation): string {\n return `caption-${slug(aggregation)}`;\n}\n\n/** The id of a Show Values As choice's name: `show-percent-of-grand-total` is `% of Grand Total`. */\nexport function showValuesAsNameId(showValuesAs: PivotShowValuesAs): string {\n switch (showValuesAs) {\n case 'noCalculation': return 'show-no-calculation';\n case 'percentOfGrandTotal': return 'show-percent-of-grand-total';\n case 'percentOfColumnTotal': return 'show-percent-of-column-total';\n case 'percentOfRowTotal': return 'show-percent-of-row-total';\n default: return unreachable(showValuesAs);\n }\n}\n\n/** The id of a month's Item, from 1 to 12: `date-month-9` is `Sep`. */\nexport function monthId(month: number): string {\n if (!Number.isInteger(month) || month < 1 || month > 12) throw new RangeError(`A month is from 1 to 12, not ${month}.`);\n return `date-month-${month}`;\n}\n\n/** The English for an id, or `undefined` for an id the engine does not know. A date part's words are\n * here too. */\nexport function englishWordFor(id: string): string | undefined {\n return english.get(id) ?? dateEnglish.get(id);\n}\n\n/** Every id the engine has an English word for, a date part's included: what a Consumer replaces to give\n * ExPivot another language. */\nexport function pivotWordIdList(): readonly string[] {\n return Object.freeze([...english.keys(), ...dateEnglish.keys()]);\n}\n\n/** The words of Excel's Japanese edition: `\u884C\u30E9\u30D9\u30EB`, `\u7DCF\u8A08`, `\u5408\u8A08 / \u91D1\u984D`, `(\u7A7A\u767D)`, a date part's\n * `2026\u5E74`, `\u7B2C3\u56DB\u534A\u671F`, `9\u6708`. A {@link PivotLabel} to hand to a report's options in one line. */\nexport const japanesePivotWords: PivotLabel = id => japanese.get(id);\n\n/** The words of Excel's English (United Kingdom) edition where they differ from the English (United\n * States) edition's: `Max.`, `Max. of {0}`, `Summarise value field by`. */\nexport const unitedKingdomPivotWords: PivotLabel = id => unitedKingdom.get(id);\n\n/** The word for an id: the Consumer's, the English where it says nothing, and the id itself where neither\n * knows it \u2014 an id painted is a missing word seen, never a blank. */\nexport function resolveWord(id: string, label: PivotLabel | undefined): string {\n return label?.(id) ?? english.get(id) ?? id;\n}\n\n/** A date part's word, resolved as the C# engine's PivotDateWords resolves one: through the Consumer's,\n * then the date part's English, then the id. */\nfunction resolveDateWord(id: string, label: PivotLabel | undefined): string {\n return label?.(id) ?? dateEnglish.get(id) ?? id;\n}\n\n/** A template word with its arguments put in, as .NET's `string.Format` puts them in under the invariant\n * culture: `{n}`, `{n,width}`, `{n:format}` (a text takes no format), and `{{` and `}}` for a brace. A\n * template .NET refuses throws a PivotFormatError. */\nexport function fillWord(template: string, ...args: readonly string[]): string {\n const refused = (): PivotFormatError => new PivotFormatError(\n `The word '${template}' is not a template .NET fills: a brace stands where it cannot, or names an argument it is not given.`);\n let result = '';\n let i = 0;\n while (i < template.length) {\n const ch = template.charAt(i);\n if (ch === '}') {\n if (template.charAt(i + 1) !== '}') throw refused();\n result += '}';\n i += 2;\n continue;\n }\n if (ch !== '{') {\n result += ch;\n i++;\n continue;\n }\n if (template.charAt(i + 1) === '{') {\n result += '{';\n i += 2;\n continue;\n }\n const match = /^\\{(\\d+) *(?:, *(-?\\d+) *)?(?::([^{}]*))?\\}/.exec(template.slice(i));\n if (match === null) throw refused();\n const [whole, index = '', width] = match;\n const arg = args[Number(index)];\n if (arg === undefined) throw refused();\n const pad = width === undefined ? 0 : Number(width);\n result += pad < 0 ? arg.padEnd(-pad) : arg.padStart(pad);\n i += whole.length;\n }\n return result;\n}\n\n/** The part of a date: its year, its quarter from 1 to 4, or its month from 1 to 12. */\nexport function datePartOf(part: PivotDatePart, year: number, month: number): number {\n switch (part) {\n case 'year': return year;\n case 'quarter': return Math.floor((month - 1) / 3) + 1;\n case 'month': return month;\n default: return unreachable(part);\n }\n}\n\n/** Whether a number is one a date part takes: a year from 1 to 9999, a quarter from 1 to 4, a month from\n * 1 to 12, each whole. */\nexport function datePartTakes(part: PivotDatePart, value: number): boolean {\n if (value !== Math.floor(value)) return false;\n switch (part) {\n case 'year': return value >= 1 && value <= 9999;\n case 'quarter': return value >= 1 && value <= 4;\n case 'month': return value >= 1 && value <= 12;\n default: return unreachable(part);\n }\n}\n\n/** The label of a date part's Item in the report's words: `2026`, `Qtr3`, `Sep`. */\nexport function datePartLabel(part: PivotDatePart, value: number, label: PivotLabel | undefined): string {\n switch (part) {\n case 'year': return fillWord(resolveDateWord(pivotWordIds.dateYear, label), String(value));\n case 'quarter': return fillWord(resolveDateWord(pivotWordIds.dateQuarter, label), String(value));\n case 'month': return resolveDateWord(monthId(value), label);\n default: return unreachable(part);\n }\n}\n", "// Generated by dotnet/tools/pivot-oracle (`dotnet run --project dotnet/tools/pivot-oracle -- cultures <this file>`):\n// the number and date conventions of each culture @ex-grid/pivot-engine formats in, as .NET holds them\n// on Linux, ICU's data, which a .NET server pivots in. Edit the generator, not this file.\n\nimport type { CultureData } from './culture-data';\n\nconst n0 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":2,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":0,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":2,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"Infinity\",\"negativeInfinity\":\"-Infinity\"};\nconst d1 = {\"shortDate\":\"MM/dd/yyyy\",\"longDate\":\"dddd, dd MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"monthDay\":\"MMMM dd\",\"yearMonth\":\"yyyy MMMM\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"A.D.\",\"useGenitive\":false};\nconst a2 = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"];\nconst a3 = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"];\nconst a4 = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\nconst a5 = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\nconst n6 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d7 = {\"shortDate\":\"M/d/yyyy\",\"longDate\":\"dddd, MMMM d, yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, MMMM d, yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"MMMM d\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst n8 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"$\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n9 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A3\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d10 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"am\",\"pm\":\"pm\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst a11 = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"];\nconst d12 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, d MMMM yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"am\",\"pm\":\"pm\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst a13 = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"June\",\"July\",\"Aug\",\"Sept\",\"Oct\",\"Nov\",\"Dec\"];\nconst d14 = {\"shortDate\":\"yyyy-MM-dd\",\"longDate\":\"dddd, MMMM d, yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, MMMM d, yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"MMMM d\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"-\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst n15 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d16 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst n17 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3,2],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3,2],\"currencyDigits\":2,\"currencySymbol\":\"\u20B9\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3,2],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d18 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, d MMMM yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"am\",\"pm\":\"pm\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst n19 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"R\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d20 = {\"shortDate\":\"yyyy/MM/dd\",\"longDate\":\"dddd, dd MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"am\",\"pm\":\"pm\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst n21 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d22 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d. MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d. MMMM yyyy HH:mm:ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"n. Chr.\",\"useGenitive\":true};\nconst a23 = [\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"];\nconst a24 = [\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"];\nconst a25 = [\"Januar\",\"Februar\",\"M\u00E4rz\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"];\nconst a26 = [\"Jan\",\"Feb\",\"M\u00E4r\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"];\nconst a27 = [\"Jan.\",\"Feb.\",\"M\u00E4rz\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sept.\",\"Okt.\",\"Nov.\",\"Dez.\"];\nconst n28 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n29 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":9,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst a30 = [\"J\u00E4nner\",\"Februar\",\"M\u00E4rz\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"];\nconst a31 = [\"J\u00E4n\",\"Feb\",\"M\u00E4r\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"];\nconst a32 = [\"J\u00E4n.\",\"Feb.\",\"M\u00E4rz\",\"Apr.\",\"Mai\",\"Juni\",\"Juli\",\"Aug.\",\"Sep.\",\"Okt.\",\"Nov.\",\"Dez.\"];\nconst n33 = {\"decimal\":\".\",\"group\":\"\u2019\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\"\u2019\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"CHF\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":2,\"percentDecimal\":\".\",\"percentGroup\":\"\u2019\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n34 = {\"decimal\":\",\",\"group\":\"\\u202F\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u202F\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u202F\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d35 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"ap. J.-C.\",\"useGenitive\":false};\nconst a36 = [\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"];\nconst a37 = [\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"];\nconst a38 = [\"janvier\",\"f\u00E9vrier\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"ao\u00FBt\",\"septembre\",\"octobre\",\"novembre\",\"d\u00E9cembre\"];\nconst a39 = [\"janv.\",\"f\u00E9vr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"ao\u00FBt\",\"sept.\",\"oct.\",\"nov.\",\"d\u00E9c.\"];\nconst n40 = {\"decimal\":\",\",\"group\":\"\\u202F\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u202F\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u202F\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d41 = {\"shortDate\":\"d/MM/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"ap. J.-C.\",\"useGenitive\":false};\nconst n42 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"$\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d43 = {\"shortDate\":\"yyyy-MM-dd\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH 'h' mm\",\"longTime\":\"HH 'h' mm 'min' ss 's'\",\"fullDateTime\":\"dddd d MMMM yyyy HH 'h' mm 'min' ss 's'\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"-\",\"timeSeparator\":\":\",\"era\":\"ap. J.-C.\",\"useGenitive\":false};\nconst a44 = [\"janv.\",\"f\u00E9vr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juill.\",\"ao\u00FBt\",\"sept.\",\"oct.\",\"nov.\",\"d\u00E9c.\"];\nconst n45 = {\"decimal\":\",\",\"group\":\"\\u202F\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\"\\u202F\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"CHF\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u202F\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d46 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"ap. J.-C.\",\"useGenitive\":false};\nconst d47 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"dddd, d 'de' MMMM 'de' yyyy\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"dddd, d 'de' MMMM 'de' yyyy H:mm:ss\",\"monthDay\":\"d 'de' MMMM\",\"yearMonth\":\"MMMM 'de' yyyy\",\"am\":\"a.\\u00A0m.\",\"pm\":\"p.\\u00A0m.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d. C.\",\"useGenitive\":false};\nconst a48 = [\"domingo\",\"lunes\",\"martes\",\"mi\u00E9rcoles\",\"jueves\",\"viernes\",\"s\u00E1bado\"];\nconst a49 = [\"dom\",\"lun\",\"mar\",\"mi\u00E9\",\"jue\",\"vie\",\"s\u00E1b\"];\nconst a50 = [\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"];\nconst a51 = [\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sept\",\"oct\",\"nov\",\"dic\"];\nconst d52 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, d 'de' MMMM 'de' yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, d 'de' MMMM 'de' yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"d 'de' MMMM\",\"yearMonth\":\"MMMM 'de' yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst a53 = [\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sep\",\"oct\",\"nov\",\"dic\"];\nconst d54 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"dddd, d 'de' MMMM 'de' yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd, d 'de' MMMM 'de' yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"d 'de' MMMM\",\"yearMonth\":\"MMMM 'de' yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst n55 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d56 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst a57 = [\"domenica\",\"luned\u00EC\",\"marted\u00EC\",\"mercoled\u00EC\",\"gioved\u00EC\",\"venerd\u00EC\",\"sabato\"];\nconst a58 = [\"dom\",\"lun\",\"mar\",\"mer\",\"gio\",\"ven\",\"sab\"];\nconst a59 = [\"gennaio\",\"febbraio\",\"marzo\",\"aprile\",\"maggio\",\"giugno\",\"luglio\",\"agosto\",\"settembre\",\"ottobre\",\"novembre\",\"dicembre\"];\nconst a60 = [\"gen\",\"feb\",\"mar\",\"apr\",\"mag\",\"giu\",\"lug\",\"ago\",\"set\",\"ott\",\"nov\",\"dic\"];\nconst n61 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d62 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst n63 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":9,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d64 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, d 'de' MMMM 'de' yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d 'de' MMMM 'de' yyyy HH:mm:ss\",\"monthDay\":\"d 'de' MMMM\",\"yearMonth\":\"MMMM 'de' yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst a65 = [\"domingo\",\"segunda-feira\",\"ter\u00E7a-feira\",\"quarta-feira\",\"quinta-feira\",\"sexta-feira\",\"s\u00E1bado\"];\nconst a66 = [\"dom.\",\"seg.\",\"ter.\",\"qua.\",\"qui.\",\"sex.\",\"s\u00E1b.\"];\nconst a67 = [\"janeiro\",\"fevereiro\",\"mar\u00E7o\",\"abril\",\"maio\",\"junho\",\"julho\",\"agosto\",\"setembro\",\"outubro\",\"novembro\",\"dezembro\"];\nconst a68 = [\"jan.\",\"fev.\",\"mar.\",\"abr.\",\"mai.\",\"jun.\",\"jul.\",\"ago.\",\"set.\",\"out.\",\"nov.\",\"dez.\"];\nconst n69 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"R$\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":9,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n70 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d71 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, d 'de' MMMM 'de' yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d 'de' MMMM 'de' yyyy HH:mm:ss\",\"monthDay\":\"d 'de' MMMM\",\"yearMonth\":\"MMMM 'de' yyyy\",\"am\":\"da manh\u00E3\",\"pm\":\"da tarde\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"d.C.\",\"useGenitive\":false};\nconst a72 = [\"domingo\",\"segunda\",\"ter\u00E7a\",\"quarta\",\"quinta\",\"sexta\",\"s\u00E1bado\"];\nconst n73 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":12,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d74 = {\"shortDate\":\"dd-MM-yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"-\",\"timeSeparator\":\":\",\"era\":\"n.Chr.\",\"useGenitive\":false};\nconst a75 = [\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"];\nconst a76 = [\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"];\nconst a77 = [\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"];\nconst a78 = [\"jan\",\"feb\",\"mrt\",\"apr\",\"mei\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"];\nconst n79 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":2,\"currencyNegativePattern\":12,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d80 = {\"shortDate\":\"d/MM/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"n.Chr.\",\"useGenitive\":false};\nconst n81 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u2212\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u2212\u221E\"};\nconst d82 = {\"shortDate\":\"yyyy-MM-dd\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"fm\",\"pm\":\"em\",\"dateSeparator\":\"-\",\"timeSeparator\":\":\",\"era\":\"e.Kr.\",\"useGenitive\":false};\nconst a83 = [\"s\u00F6ndag\",\"m\u00E5ndag\",\"tisdag\",\"onsdag\",\"torsdag\",\"fredag\",\"l\u00F6rdag\"];\nconst a84 = [\"s\u00F6n\",\"m\u00E5n\",\"tis\",\"ons\",\"tors\",\"fre\",\"l\u00F6r\"];\nconst a85 = [\"januari\",\"februari\",\"mars\",\"april\",\"maj\",\"juni\",\"juli\",\"augusti\",\"september\",\"oktober\",\"november\",\"december\"];\nconst a86 = [\"jan.\",\"feb.\",\"mars\",\"apr.\",\"maj\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"];\nconst n87 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u2212\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"kr\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u2212\u221E\"};\nconst d88 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd 'den' d. MMMM yyyy\",\"shortTime\":\"HH.mm\",\"longTime\":\"HH.mm.ss\",\"fullDateTime\":\"dddd 'den' d. MMMM yyyy HH.mm.ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\".\",\"era\":\"e.Kr.\",\"useGenitive\":false};\nconst a89 = [\"s\u00F8ndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"l\u00F8rdag\"];\nconst a90 = [\"s\u00F8n.\",\"man.\",\"tirs.\",\"ons.\",\"tors.\",\"fre.\",\"l\u00F8r.\"];\nconst a91 = [\"januar\",\"februar\",\"marts\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"december\"];\nconst a92 = [\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"maj\",\"jun.\",\"jul.\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"];\nconst n93 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"kr.\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d94 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd d. MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd d. MMMM yyyy HH:mm:ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"e.Kr.\",\"useGenitive\":true};\nconst a95 = [\"s\u00F8n.\",\"man.\",\"tir.\",\"ons.\",\"tor.\",\"fre.\",\"l\u00F8r.\"];\nconst a96 = [\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"];\nconst a97 = [\"jan\",\"feb\",\"mar\",\"apr\",\"mai\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"];\nconst a98 = [\"jan.\",\"feb.\",\"mars\",\"apr.\",\"mai\",\"juni\",\"juli\",\"aug.\",\"sep.\",\"okt.\",\"nov.\",\"des.\"];\nconst n99 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u2212\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"ep\u00E4luku\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u2212\u221E\"};\nconst d100 = {\"shortDate\":\"d.M.yyyy\",\"longDate\":\"dddd d. MMMM yyyy\",\"shortTime\":\"H.mm\",\"longTime\":\"H.mm.ss\",\"fullDateTime\":\"dddd d. MMMM yyyy H.mm.ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"ap.\",\"pm\":\"ip.\",\"dateSeparator\":\".\",\"timeSeparator\":\".\",\"era\":\"jKr.\",\"useGenitive\":true};\nconst a101 = [\"sunnuntai\",\"maanantai\",\"tiistai\",\"keskiviikko\",\"torstai\",\"perjantai\",\"lauantai\"];\nconst a102 = [\"su\",\"ma\",\"ti\",\"ke\",\"to\",\"pe\",\"la\"];\nconst a103 = [\"tammikuu\",\"helmikuu\",\"maaliskuu\",\"huhtikuu\",\"toukokuu\",\"kes\u00E4kuu\",\"hein\u00E4kuu\",\"elokuu\",\"syyskuu\",\"lokakuu\",\"marraskuu\",\"joulukuu\"];\nconst a104 = [\"tammi\",\"helmi\",\"maalis\",\"huhti\",\"touko\",\"kes\u00E4\",\"hein\u00E4\",\"elo\",\"syys\",\"loka\",\"marras\",\"joulu\"];\nconst a105 = [\"tammikuuta\",\"helmikuuta\",\"maaliskuuta\",\"huhtikuuta\",\"toukokuuta\",\"kes\u00E4kuuta\",\"hein\u00E4kuuta\",\"elokuuta\",\"syyskuuta\",\"lokakuuta\",\"marraskuuta\",\"joulukuuta\"];\nconst n106 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u2212\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"ep\u00E4luku\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u2212\u221E\"};\nconst n107 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d108 = {\"shortDate\":\"d.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"n.e.\",\"useGenitive\":true};\nconst a109 = [\"niedziela\",\"poniedzia\u0142ek\",\"wtorek\",\"\u015Broda\",\"czwartek\",\"pi\u0105tek\",\"sobota\"];\nconst a110 = [\"niedz.\",\"pon.\",\"wt.\",\"\u015Br.\",\"czw.\",\"pt.\",\"sob.\"];\nconst a111 = [\"stycze\u0144\",\"luty\",\"marzec\",\"kwiecie\u0144\",\"maj\",\"czerwiec\",\"lipiec\",\"sierpie\u0144\",\"wrzesie\u0144\",\"pa\u017Adziernik\",\"listopad\",\"grudzie\u0144\"];\nconst a112 = [\"sty\",\"lut\",\"mar\",\"kwi\",\"maj\",\"cze\",\"lip\",\"sie\",\"wrz\",\"pa\u017A\",\"lis\",\"gru\"];\nconst a113 = [\"stycznia\",\"lutego\",\"marca\",\"kwietnia\",\"maja\",\"czerwca\",\"lipca\",\"sierpnia\",\"wrze\u015Bnia\",\"pa\u017Adziernika\",\"listopada\",\"grudnia\"];\nconst n114 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"z\u0142\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n115 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d116 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd d. MMMM yyyy\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"dddd d. MMMM yyyy H:mm:ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"dop.\",\"pm\":\"odp.\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"n. l.\",\"useGenitive\":true};\nconst a117 = [\"ned\u011Ble\",\"pond\u011Bl\u00ED\",\"\u00FAter\u00FD\",\"st\u0159eda\",\"\u010Dtvrtek\",\"p\u00E1tek\",\"sobota\"];\nconst a118 = [\"ne\",\"po\",\"\u00FAt\",\"st\",\"\u010Dt\",\"p\u00E1\",\"so\"];\nconst a119 = [\"leden\",\"\u00FAnor\",\"b\u0159ezen\",\"duben\",\"kv\u011Bten\",\"\u010Derven\",\"\u010Dervenec\",\"srpen\",\"z\u00E1\u0159\u00ED\",\"\u0159\u00EDjen\",\"listopad\",\"prosinec\"];\nconst a120 = [\"led\",\"\u00FAno\",\"b\u0159e\",\"dub\",\"kv\u011B\",\"\u010Dvn\",\"\u010Dvc\",\"srp\",\"z\u00E1\u0159\",\"\u0159\u00EDj\",\"lis\",\"pro\"];\nconst a121 = [\"ledna\",\"\u00FAnora\",\"b\u0159ezna\",\"dubna\",\"kv\u011Btna\",\"\u010Dervna\",\"\u010Dervence\",\"srpna\",\"z\u00E1\u0159\u00ED\",\"\u0159\u00EDjna\",\"listopadu\",\"prosince\"];\nconst n122 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"K\u010D\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d123 = {\"shortDate\":\"d. M. yyyy\",\"longDate\":\"dddd d. MMMM yyyy\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"dddd d. MMMM yyyy H:mm:ss\",\"monthDay\":\"d. MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\". \",\"timeSeparator\":\":\",\"era\":\"po Kr.\",\"useGenitive\":true};\nconst a124 = [\"nede\u013Ea\",\"pondelok\",\"utorok\",\"streda\",\"\u0161tvrtok\",\"piatok\",\"sobota\"];\nconst a125 = [\"ne\",\"po\",\"ut\",\"st\",\"\u0161t\",\"pi\",\"so\"];\nconst a126 = [\"janu\u00E1r\",\"febru\u00E1r\",\"marec\",\"apr\u00EDl\",\"m\u00E1j\",\"j\u00FAn\",\"j\u00FAl\",\"august\",\"september\",\"okt\u00F3ber\",\"november\",\"december\"];\nconst a127 = [\"jan\",\"feb\",\"mar\",\"apr\",\"m\u00E1j\",\"j\u00FAn\",\"j\u00FAl\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"];\nconst a128 = [\"janu\u00E1ra\",\"febru\u00E1ra\",\"marca\",\"apr\u00EDla\",\"m\u00E1ja\",\"j\u00FAna\",\"j\u00FAla\",\"augusta\",\"septembra\",\"okt\u00F3bra\",\"novembra\",\"decembra\"];\nconst n129 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AC\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d130 = {\"shortDate\":\"yyyy. MM. dd.\",\"longDate\":\"yyyy. MMMM d., dddd\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"yyyy. MMMM d., dddd H:mm:ss\",\"monthDay\":\"MMMM d.\",\"yearMonth\":\"yyyy. MMMM\",\"am\":\"de.\",\"pm\":\"du.\",\"dateSeparator\":\". \",\"timeSeparator\":\":\",\"era\":\"i. sz.\",\"useGenitive\":false};\nconst a131 = [\"vas\u00E1rnap\",\"h\u00E9tf\u0151\",\"kedd\",\"szerda\",\"cs\u00FCt\u00F6rt\u00F6k\",\"p\u00E9ntek\",\"szombat\"];\nconst a132 = [\"V\",\"H\",\"K\",\"Sze\",\"Cs\",\"P\",\"Szo\"];\nconst a133 = [\"janu\u00E1r\",\"febru\u00E1r\",\"m\u00E1rcius\",\"\u00E1prilis\",\"m\u00E1jus\",\"j\u00FAnius\",\"j\u00FAlius\",\"augusztus\",\"szeptember\",\"okt\u00F3ber\",\"november\",\"december\"];\nconst a134 = [\"jan.\",\"febr.\",\"m\u00E1rc.\",\"\u00E1pr.\",\"m\u00E1j.\",\"j\u00FAn.\",\"j\u00FAl.\",\"aug.\",\"szept.\",\"okt.\",\"nov.\",\"dec.\"];\nconst n135 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"Ft\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d136 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"a.m.\",\"pm\":\"p.m.\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"d.Hr.\",\"useGenitive\":false};\nconst a137 = [\"duminic\u0103\",\"luni\",\"mar\u021Bi\",\"miercuri\",\"joi\",\"vineri\",\"s\u00E2mb\u0103t\u0103\"];\nconst a138 = [\"dum.\",\"lun.\",\"mar.\",\"mie.\",\"joi\",\"vin.\",\"s\u00E2m.\"];\nconst a139 = [\"ianuarie\",\"februarie\",\"martie\",\"aprilie\",\"mai\",\"iunie\",\"iulie\",\"august\",\"septembrie\",\"octombrie\",\"noiembrie\",\"decembrie\"];\nconst a140 = [\"ian.\",\"feb.\",\"mar.\",\"apr.\",\"mai\",\"iun.\",\"iul.\",\"aug.\",\"sept.\",\"oct.\",\"nov.\",\"dec.\"];\nconst n141 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"RON\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d142 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"dddd d MMMM yyyy\",\"shortTime\":\"h:mm\\u202Ftt\",\"longTime\":\"h:mm:ss\\u202Ftt\",\"fullDateTime\":\"dddd d MMMM yyyy h:mm:ss\\u202Ftt\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"\u03C0.\u03BC.\",\"pm\":\"\u03BC.\u03BC.\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u03BC.\u03A7.\",\"useGenitive\":true};\nconst a143 = [\"\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE\",\"\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1\",\"\u03A4\u03C1\u03AF\u03C4\u03B7\",\"\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7\",\"\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7\",\"\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE\",\"\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF\"];\nconst a144 = [\"\u039A\u03C5\u03C1\",\"\u0394\u03B5\u03C5\",\"\u03A4\u03C1\u03AF\",\"\u03A4\u03B5\u03C4\",\"\u03A0\u03AD\u03BC\",\"\u03A0\u03B1\u03C1\",\"\u03A3\u03AC\u03B2\"];\nconst a145 = [\"\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2\",\"\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2\",\"\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2\",\"\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2\",\"\u039C\u03AC\u03B9\u03BF\u03C2\",\"\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2\",\"\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2\",\"\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2\",\"\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2\",\"\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2\",\"\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2\",\"\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2\"];\nconst a146 = [\"\u0399\u03B1\u03BD\",\"\u03A6\u03B5\u03B2\",\"\u039C\u03AC\u03C1\",\"\u0391\u03C0\u03C1\",\"\u039C\u03AC\u03B9\",\"\u0399\u03BF\u03CD\u03BD\",\"\u0399\u03BF\u03CD\u03BB\",\"\u0391\u03CD\u03B3\",\"\u03A3\u03B5\u03C0\",\"\u039F\u03BA\u03C4\",\"\u039D\u03BF\u03AD\",\"\u0394\u03B5\u03BA\"];\nconst a147 = [\"\u0399\u03B1\u03BD\u03BF\u03C5\u03B1\u03C1\u03AF\u03BF\u03C5\",\"\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03B1\u03C1\u03AF\u03BF\u03C5\",\"\u039C\u03B1\u03C1\u03C4\u03AF\u03BF\u03C5\",\"\u0391\u03C0\u03C1\u03B9\u03BB\u03AF\u03BF\u03C5\",\"\u039C\u03B1\u0390\u03BF\u03C5\",\"\u0399\u03BF\u03C5\u03BD\u03AF\u03BF\u03C5\",\"\u0399\u03BF\u03C5\u03BB\u03AF\u03BF\u03C5\",\"\u0391\u03C5\u03B3\u03BF\u03CD\u03C3\u03C4\u03BF\u03C5\",\"\u03A3\u03B5\u03C0\u03C4\u03B5\u03BC\u03B2\u03C1\u03AF\u03BF\u03C5\",\"\u039F\u03BA\u03C4\u03C9\u03B2\u03C1\u03AF\u03BF\u03C5\",\"\u039D\u03BF\u03B5\u03BC\u03B2\u03C1\u03AF\u03BF\u03C5\",\"\u0394\u03B5\u03BA\u03B5\u03BC\u03B2\u03C1\u03AF\u03BF\u03C5\"];\nconst a148 = [\"\u0399\u03B1\u03BD\",\"\u03A6\u03B5\u03B2\",\"\u039C\u03B1\u03C1\",\"\u0391\u03C0\u03C1\",\"\u039C\u03B1\u0390\",\"\u0399\u03BF\u03C5\u03BD\",\"\u0399\u03BF\u03C5\u03BB\",\"\u0391\u03C5\u03B3\",\"\u03A3\u03B5\u03C0\",\"\u039F\u03BA\u03C4\",\"\u039D\u03BF\u03B5\",\"\u0394\u03B5\u03BA\"];\nconst n149 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"\u043D\u0435\\u00A0\u0447\u0438\u0441\u043B\u043E\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d150 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\\u202F'\u0433'.\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy\\u202F'\u0433'. HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\\u202F'\u0433'.\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"\u043D. \u044D.\",\"useGenitive\":true};\nconst a151 = [\"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435\",\"\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\",\"\u0432\u0442\u043E\u0440\u043D\u0438\u043A\",\"\u0441\u0440\u0435\u0434\u0430\",\"\u0447\u0435\u0442\u0432\u0435\u0440\u0433\",\"\u043F\u044F\u0442\u043D\u0438\u0446\u0430\",\"\u0441\u0443\u0431\u0431\u043E\u0442\u0430\"];\nconst a152 = [\"\u0432\u0441\",\"\u043F\u043D\",\"\u0432\u0442\",\"\u0441\u0440\",\"\u0447\u0442\",\"\u043F\u0442\",\"\u0441\u0431\"];\nconst a153 = [\"\u044F\u043D\u0432\u0430\u0440\u044C\",\"\u0444\u0435\u0432\u0440\u0430\u043B\u044C\",\"\u043C\u0430\u0440\u0442\",\"\u0430\u043F\u0440\u0435\u043B\u044C\",\"\u043C\u0430\u0439\",\"\u0438\u044E\u043D\u044C\",\"\u0438\u044E\u043B\u044C\",\"\u0430\u0432\u0433\u0443\u0441\u0442\",\"\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C\",\"\u043E\u043A\u0442\u044F\u0431\u0440\u044C\",\"\u043D\u043E\u044F\u0431\u0440\u044C\",\"\u0434\u0435\u043A\u0430\u0431\u0440\u044C\"];\nconst a154 = [\"\u044F\u043D\u0432.\",\"\u0444\u0435\u0432\u0440.\",\"\u043C\u0430\u0440\u0442\",\"\u0430\u043F\u0440.\",\"\u043C\u0430\u0439\",\"\u0438\u044E\u043D\u044C\",\"\u0438\u044E\u043B\u044C\",\"\u0430\u0432\u0433.\",\"\u0441\u0435\u043D\u0442.\",\"\u043E\u043A\u0442.\",\"\u043D\u043E\u044F\u0431.\",\"\u0434\u0435\u043A.\"];\nconst a155 = [\"\u044F\u043D\u0432\u0430\u0440\u044F\",\"\u0444\u0435\u0432\u0440\u0430\u043B\u044F\",\"\u043C\u0430\u0440\u0442\u0430\",\"\u0430\u043F\u0440\u0435\u043B\u044F\",\"\u043C\u0430\u044F\",\"\u0438\u044E\u043D\u044F\",\"\u0438\u044E\u043B\u044F\",\"\u0430\u0432\u0433\u0443\u0441\u0442\u0430\",\"\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F\",\"\u043E\u043A\u0442\u044F\u0431\u0440\u044F\",\"\u043D\u043E\u044F\u0431\u0440\u044F\",\"\u0434\u0435\u043A\u0430\u0431\u0440\u044F\"];\nconst a156 = [\"\u044F\u043D\u0432.\",\"\u0444\u0435\u0432\u0440.\",\"\u043C\u0430\u0440.\",\"\u0430\u043F\u0440.\",\"\u043C\u0430\u044F\",\"\u0438\u044E\u043D.\",\"\u0438\u044E\u043B.\",\"\u0430\u0432\u0433.\",\"\u0441\u0435\u043D\u0442.\",\"\u043E\u043A\u0442.\",\"\u043D\u043E\u044F\u0431.\",\"\u0434\u0435\u043A.\"];\nconst n157 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20BD\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":0,\"percentNegativePattern\":0,\"nan\":\"\u043D\u0435\\u00A0\u0447\u0438\u0441\u043B\u043E\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d158 = {\"shortDate\":\"dd.MM.yyyy\",\"longDate\":\"dddd, d MMMM yyyy\\u202F'\u0440'.\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM yyyy\\u202F'\u0440'. HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\\u202F'\u0440'.\",\"am\":\"\u0434\u043F\",\"pm\":\"\u043F\u043F\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"\u043D. \u0435.\",\"useGenitive\":true};\nconst a159 = [\"\u043D\u0435\u0434\u0456\u043B\u044F\",\"\u043F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A\",\"\u0432\u0456\u0432\u0442\u043E\u0440\u043E\u043A\",\"\u0441\u0435\u0440\u0435\u0434\u0430\",\"\u0447\u0435\u0442\u0432\u0435\u0440\",\"\u043F\u02BC\u044F\u0442\u043D\u0438\u0446\u044F\",\"\u0441\u0443\u0431\u043E\u0442\u0430\"];\nconst a160 = [\"\u043D\u0434\",\"\u043F\u043D\",\"\u0432\u0442\",\"\u0441\u0440\",\"\u0447\u0442\",\"\u043F\u0442\",\"\u0441\u0431\"];\nconst a161 = [\"\u0441\u0456\u0447\u0435\u043D\u044C\",\"\u043B\u044E\u0442\u0438\u0439\",\"\u0431\u0435\u0440\u0435\u0437\u0435\u043D\u044C\",\"\u043A\u0432\u0456\u0442\u0435\u043D\u044C\",\"\u0442\u0440\u0430\u0432\u0435\u043D\u044C\",\"\u0447\u0435\u0440\u0432\u0435\u043D\u044C\",\"\u043B\u0438\u043F\u0435\u043D\u044C\",\"\u0441\u0435\u0440\u043F\u0435\u043D\u044C\",\"\u0432\u0435\u0440\u0435\u0441\u0435\u043D\u044C\",\"\u0436\u043E\u0432\u0442\u0435\u043D\u044C\",\"\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\",\"\u0433\u0440\u0443\u0434\u0435\u043D\u044C\"];\nconst a162 = [\"\u0441\u0456\u0447.\",\"\u043B\u044E\u0442.\",\"\u0431\u0435\u0440.\",\"\u043A\u0432\u0456\u0442.\",\"\u0442\u0440\u0430\u0432.\",\"\u0447\u0435\u0440\u0432.\",\"\u043B\u0438\u043F.\",\"\u0441\u0435\u0440\u043F.\",\"\u0432\u0435\u0440.\",\"\u0436\u043E\u0432\u0442.\",\"\u043B\u0438\u0441\u0442.\",\"\u0433\u0440\u0443\u0434.\"];\nconst a163 = [\"\u0441\u0456\u0447\u043D\u044F\",\"\u043B\u044E\u0442\u043E\u0433\u043E\",\"\u0431\u0435\u0440\u0435\u0437\u043D\u044F\",\"\u043A\u0432\u0456\u0442\u043D\u044F\",\"\u0442\u0440\u0430\u0432\u043D\u044F\",\"\u0447\u0435\u0440\u0432\u043D\u044F\",\"\u043B\u0438\u043F\u043D\u044F\",\"\u0441\u0435\u0440\u043F\u043D\u044F\",\"\u0432\u0435\u0440\u0435\u0441\u043D\u044F\",\"\u0436\u043E\u0432\u0442\u043D\u044F\",\"\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\u0430\",\"\u0433\u0440\u0443\u0434\u043D\u044F\"];\nconst n164 = {\"decimal\":\",\",\"group\":\"\\u00A0\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\"\\u00A0\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20B4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\"\\u00A0\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n165 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":2,\"percentNegativePattern\":2,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d166 = {\"shortDate\":\"d.MM.yyyy\",\"longDate\":\"d MMMM yyyy dddd\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"d MMMM yyyy dddd HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"\u00D6\u00D6\",\"pm\":\"\u00D6S\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"MS\",\"useGenitive\":false};\nconst a167 = [\"Pazar\",\"Pazartesi\",\"Sal\u0131\",\"\u00C7ar\u015Famba\",\"Per\u015Fembe\",\"Cuma\",\"Cumartesi\"];\nconst a168 = [\"Paz\",\"Pzt\",\"Sal\",\"\u00C7ar\",\"Per\",\"Cum\",\"Cmt\"];\nconst a169 = [\"Ocak\",\"\u015Eubat\",\"Mart\",\"Nisan\",\"May\u0131s\",\"Haziran\",\"Temmuz\",\"A\u011Fustos\",\"Eyl\u00FCl\",\"Ekim\",\"Kas\u0131m\",\"Aral\u0131k\"];\nconst a170 = [\"Oca\",\"\u015Eub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"A\u011Fu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"];\nconst n171 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20BA\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":2,\"percentNegativePattern\":2,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n172 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u200E-\",\"positiveSign\":\"\u200E+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u200E-\u221E\"};\nconst d173 = {\"shortDate\":\"d.M.yyyy\",\"longDate\":\"dddd, d \u05D1MMMM yyyy\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"dddd, d \u05D1MMMM yyyy H:mm:ss\",\"monthDay\":\"d \u05D1MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\".\",\"timeSeparator\":\":\",\"era\":\"\u05DC\u05E1\u05E4\u05D9\u05E8\u05D4\",\"useGenitive\":false};\nconst a174 = [\"\u05D9\u05D5\u05DD \u05E8\u05D0\u05E9\u05D5\u05DF\",\"\u05D9\u05D5\u05DD \u05E9\u05E0\u05D9\",\"\u05D9\u05D5\u05DD \u05E9\u05DC\u05D9\u05E9\u05D9\",\"\u05D9\u05D5\u05DD \u05E8\u05D1\u05D9\u05E2\u05D9\",\"\u05D9\u05D5\u05DD \u05D7\u05DE\u05D9\u05E9\u05D9\",\"\u05D9\u05D5\u05DD \u05E9\u05D9\u05E9\u05D9\",\"\u05D9\u05D5\u05DD \u05E9\u05D1\u05EA\"];\nconst a175 = [\"\u05D9\u05D5\u05DD \u05D0\u05F3\",\"\u05D9\u05D5\u05DD \u05D1\u05F3\",\"\u05D9\u05D5\u05DD \u05D2\u05F3\",\"\u05D9\u05D5\u05DD \u05D3\u05F3\",\"\u05D9\u05D5\u05DD \u05D4\u05F3\",\"\u05D9\u05D5\u05DD \u05D5\u05F3\",\"\u05E9\u05D1\u05EA\"];\nconst a176 = [\"\u05D9\u05E0\u05D5\u05D0\u05E8\",\"\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8\",\"\u05DE\u05E8\u05E5\",\"\u05D0\u05E4\u05E8\u05D9\u05DC\",\"\u05DE\u05D0\u05D9\",\"\u05D9\u05D5\u05E0\u05D9\",\"\u05D9\u05D5\u05DC\u05D9\",\"\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8\",\"\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8\",\"\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8\",\"\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8\",\"\u05D3\u05E6\u05DE\u05D1\u05E8\"];\nconst a177 = [\"\u05D9\u05E0\u05D5\u05F3\",\"\u05E4\u05D1\u05E8\u05F3\",\"\u05DE\u05E8\u05E5\",\"\u05D0\u05E4\u05E8\u05F3\",\"\u05DE\u05D0\u05D9\",\"\u05D9\u05D5\u05E0\u05D9\",\"\u05D9\u05D5\u05DC\u05D9\",\"\u05D0\u05D5\u05D2\u05F3\",\"\u05E1\u05E4\u05D8\u05F3\",\"\u05D0\u05D5\u05E7\u05F3\",\"\u05E0\u05D5\u05D1\u05F3\",\"\u05D3\u05E6\u05DE\u05F3\"];\nconst n178 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"\u200E-\",\"positiveSign\":\"\u200E+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u20AA\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"\u200E-\u221E\"};\nconst n179 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d180 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"dddd, dd MMMM yyyy\",\"shortTime\":\"HH.mm\",\"longTime\":\"HH.mm.ss\",\"fullDateTime\":\"dddd, dd MMMM yyyy HH.mm.ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM yyyy\",\"am\":\"AM\",\"pm\":\"PM\",\"dateSeparator\":\"/\",\"timeSeparator\":\".\",\"era\":\"M\",\"useGenitive\":false};\nconst a181 = [\"Minggu\",\"Senin\",\"Selasa\",\"Rabu\",\"Kamis\",\"Jumat\",\"Sabtu\"];\nconst a182 = [\"Min\",\"Sen\",\"Sel\",\"Rab\",\"Kam\",\"Jum\",\"Sab\"];\nconst a183 = [\"Januari\",\"Februari\",\"Maret\",\"April\",\"Mei\",\"Juni\",\"Juli\",\"Agustus\",\"September\",\"Oktober\",\"November\",\"Desember\"];\nconst a184 = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"Mei\",\"Jun\",\"Jul\",\"Agu\",\"Sep\",\"Okt\",\"Nov\",\"Des\"];\nconst n185 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"Rp\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d186 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"dddd, d MMMM, yyyy\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"dddd, d MMMM, yyyy HH:mm:ss\",\"monthDay\":\"d MMMM\",\"yearMonth\":\"MMMM 'n\u0103m' yyyy\",\"am\":\"SA\",\"pm\":\"CH\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"SCN\",\"useGenitive\":true};\nconst a187 = [\"Ch\u1EE7 Nh\u1EADt\",\"Th\u1EE9 Hai\",\"Th\u1EE9 Ba\",\"Th\u1EE9 T\u01B0\",\"Th\u1EE9 N\u0103m\",\"Th\u1EE9 S\u00E1u\",\"Th\u1EE9 B\u1EA3y\"];\nconst a188 = [\"CN\",\"Th 2\",\"Th 3\",\"Th 4\",\"Th 5\",\"Th 6\",\"Th 7\"];\nconst a189 = [\"Th\u00E1ng 1\",\"Th\u00E1ng 2\",\"Th\u00E1ng 3\",\"Th\u00E1ng 4\",\"Th\u00E1ng 5\",\"Th\u00E1ng 6\",\"Th\u00E1ng 7\",\"Th\u00E1ng 8\",\"Th\u00E1ng 9\",\"Th\u00E1ng 10\",\"Th\u00E1ng 11\",\"Th\u00E1ng 12\"];\nconst a190 = [\"th\u00E1ng 1\",\"th\u00E1ng 2\",\"th\u00E1ng 3\",\"th\u00E1ng 4\",\"th\u00E1ng 5\",\"th\u00E1ng 6\",\"th\u00E1ng 7\",\"th\u00E1ng 8\",\"th\u00E1ng 9\",\"th\u00E1ng 10\",\"th\u00E1ng 11\",\"th\u00E1ng 12\"];\nconst a191 = [\"thg 1\",\"thg 2\",\"thg 3\",\"thg 4\",\"thg 5\",\"thg 6\",\"thg 7\",\"thg 8\",\"thg 9\",\"thg 10\",\"thg 11\",\"thg 12\"];\nconst n192 = {\"decimal\":\",\",\"group\":\".\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\",\",\"currencyGroup\":\".\",\"currencyGroupSizes\":[3],\"currencyDigits\":0,\"currencySymbol\":\"\u20AB\",\"currencyPositivePattern\":3,\"currencyNegativePattern\":8,\"percentDecimal\":\",\",\"percentGroup\":\".\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d193 = {\"shortDate\":\"yyyy/MM/dd\",\"longDate\":\"yyyy\u5E74M\u6708d\u65E5dddd\",\"shortTime\":\"H:mm\",\"longTime\":\"H:mm:ss\",\"fullDateTime\":\"yyyy\u5E74M\u6708d\u65E5dddd H:mm:ss\",\"monthDay\":\"M\u6708d\u65E5\",\"yearMonth\":\"yyyy\u5E74M\u6708\",\"am\":\"\u5348\u524D\",\"pm\":\"\u5348\u5F8C\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u897F\u66A6\",\"useGenitive\":false};\nconst a194 = [\"\u65E5\u66DC\u65E5\",\"\u6708\u66DC\u65E5\",\"\u706B\u66DC\u65E5\",\"\u6C34\u66DC\u65E5\",\"\u6728\u66DC\u65E5\",\"\u91D1\u66DC\u65E5\",\"\u571F\u66DC\u65E5\"];\nconst a195 = [\"\u65E5\",\"\u6708\",\"\u706B\",\"\u6C34\",\"\u6728\",\"\u91D1\",\"\u571F\"];\nconst a196 = [\"1\u6708\",\"2\u6708\",\"3\u6708\",\"4\u6708\",\"5\u6708\",\"6\u6708\",\"7\u6708\",\"8\u6708\",\"9\u6708\",\"10\u6708\",\"11\u6708\",\"12\u6708\"];\nconst n197 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":0,\"currencySymbol\":\"\uFFE5\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d198 = {\"shortDate\":\"yyyy. M. d.\",\"longDate\":\"yyyy\uB144 MMMM d\uC77C dddd\",\"shortTime\":\"tt h:mm\",\"longTime\":\"tt h:mm:ss\",\"fullDateTime\":\"yyyy\uB144 MMMM d\uC77C dddd tt h:mm:ss\",\"monthDay\":\"MMMM d\uC77C\",\"yearMonth\":\"yyyy\uB144 MMMM\",\"am\":\"\uC624\uC804\",\"pm\":\"\uC624\uD6C4\",\"dateSeparator\":\". \",\"timeSeparator\":\":\",\"era\":\"AD\",\"useGenitive\":false};\nconst a199 = [\"\uC77C\uC694\uC77C\",\"\uC6D4\uC694\uC77C\",\"\uD654\uC694\uC77C\",\"\uC218\uC694\uC77C\",\"\uBAA9\uC694\uC77C\",\"\uAE08\uC694\uC77C\",\"\uD1A0\uC694\uC77C\"];\nconst a200 = [\"\uC77C\",\"\uC6D4\",\"\uD654\",\"\uC218\",\"\uBAA9\",\"\uAE08\",\"\uD1A0\"];\nconst a201 = [\"1\uC6D4\",\"2\uC6D4\",\"3\uC6D4\",\"4\uC6D4\",\"5\uC6D4\",\"6\uC6D4\",\"7\uC6D4\",\"8\uC6D4\",\"9\uC6D4\",\"10\uC6D4\",\"11\uC6D4\",\"12\uC6D4\"];\nconst n202 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":0,\"currencySymbol\":\"\u20A9\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d203 = {\"shortDate\":\"yyyy/M/d\",\"longDate\":\"yyyy\u5E74M\u6708d\u65E5dddd\",\"shortTime\":\"HH:mm\",\"longTime\":\"HH:mm:ss\",\"fullDateTime\":\"yyyy\u5E74M\u6708d\u65E5dddd HH:mm:ss\",\"monthDay\":\"M\u6708d\u65E5\",\"yearMonth\":\"yyyy\u5E74M\u6708\",\"am\":\"\u4E0A\u5348\",\"pm\":\"\u4E0B\u5348\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u516C\u5143\",\"useGenitive\":false};\nconst a204 = [\"\u661F\u671F\u65E5\",\"\u661F\u671F\u4E00\",\"\u661F\u671F\u4E8C\",\"\u661F\u671F\u4E09\",\"\u661F\u671F\u56DB\",\"\u661F\u671F\u4E94\",\"\u661F\u671F\u516D\"];\nconst a205 = [\"\u5468\u65E5\",\"\u5468\u4E00\",\"\u5468\u4E8C\",\"\u5468\u4E09\",\"\u5468\u56DB\",\"\u5468\u4E94\",\"\u5468\u516D\"];\nconst a206 = [\"\u4E00\u6708\",\"\u4E8C\u6708\",\"\u4E09\u6708\",\"\u56DB\u6708\",\"\u4E94\u6708\",\"\u516D\u6708\",\"\u4E03\u6708\",\"\u516B\u6708\",\"\u4E5D\u6708\",\"\u5341\u6708\",\"\u5341\u4E00\u6708\",\"\u5341\u4E8C\u6708\"];\nconst n207 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A5\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"NaN\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst n208 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"HK$\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"\u975E\u6578\u503C\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d209 = {\"shortDate\":\"d/M/yyyy\",\"longDate\":\"yyyy\u5E74M\u6708d\u65E5dddd\",\"shortTime\":\"tth:mm\",\"longTime\":\"tth:mm:ss\",\"fullDateTime\":\"yyyy\u5E74M\u6708d\u65E5dddd tth:mm:ss\",\"monthDay\":\"M\u6708d\u65E5\",\"yearMonth\":\"yyyy\u5E74M\u6708\",\"am\":\"\u4E0A\u5348\",\"pm\":\"\u4E0B\u5348\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u516C\u5143\",\"useGenitive\":false};\nconst a210 = [\"\u9031\u65E5\",\"\u9031\u4E00\",\"\u9031\u4E8C\",\"\u9031\u4E09\",\"\u9031\u56DB\",\"\u9031\u4E94\",\"\u9031\u516D\"];\nconst d211 = {\"shortDate\":\"dd/MM/yyyy\",\"longDate\":\"yyyy\u5E74M\u6708d\u65E5dddd\",\"shortTime\":\"tth:mm\",\"longTime\":\"tth:mm:ss\",\"fullDateTime\":\"yyyy\u5E74M\u6708d\u65E5dddd tth:mm:ss\",\"monthDay\":\"M\u6708d\u65E5\",\"yearMonth\":\"yyyy\u5E74M\u6708\",\"am\":\"\u4E0A\u5348\",\"pm\":\"\u4E0B\u5348\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u516C\u5143\",\"useGenitive\":false};\nconst n212 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"$\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"\u975E\u6578\u503C\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\nconst d213 = {\"shortDate\":\"yyyy/M/d\",\"longDate\":\"yyyy\u5E74M\u6708d\u65E5 dddd\",\"shortTime\":\"tth:mm\",\"longTime\":\"tth:mm:ss\",\"fullDateTime\":\"yyyy\u5E74M\u6708d\u65E5 dddd tth:mm:ss\",\"monthDay\":\"M\u6708d\u65E5\",\"yearMonth\":\"yyyy\u5E74M\u6708\",\"am\":\"\u4E0A\u5348\",\"pm\":\"\u4E0B\u5348\",\"dateSeparator\":\"/\",\"timeSeparator\":\":\",\"era\":\"\u897F\u5143\",\"useGenitive\":false};\nconst n214 = {\"decimal\":\".\",\"group\":\",\",\"groupSizes\":[3],\"digits\":3,\"negativePattern\":1,\"negativeSign\":\"-\",\"positiveSign\":\"+\",\"currencyDecimal\":\".\",\"currencyGroup\":\",\",\"currencyGroupSizes\":[3],\"currencyDigits\":2,\"currencySymbol\":\"\u00A4\",\"currencyPositivePattern\":0,\"currencyNegativePattern\":1,\"percentDecimal\":\".\",\"percentGroup\":\",\",\"percentGroupSizes\":[3],\"percentDigits\":3,\"percentSymbol\":\"%\",\"perMilleSymbol\":\"\u2030\",\"percentPositivePattern\":1,\"percentNegativePattern\":1,\"nan\":\"\u975E\u6578\u503C\",\"positiveInfinity\":\"\u221E\",\"negativeInfinity\":\"-\u221E\"};\n\n/** The cultures the engine formats in, by their .NET names; `invariant` is .NET's InvariantCulture. */\nexport const cultureTable: Readonly<Record<string, CultureData>> = {\n invariant: { number: n0, date: { ...d1, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a5, genitiveMonths: a4, abbreviatedGenitiveMonths: a5 } },\n 'en': { number: n6, date: { ...d7, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a5, genitiveMonths: a4, abbreviatedGenitiveMonths: a5 } },\n 'en-US': { number: n8, date: { ...d7, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a5, genitiveMonths: a4, abbreviatedGenitiveMonths: a5 } },\n 'en-GB': { number: n9, date: { ...d10, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'en-AU': { number: n8, date: { ...d12, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a13, genitiveMonths: a4, abbreviatedGenitiveMonths: a13 } },\n 'en-CA': { number: n8, date: { ...d14, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a5, genitiveMonths: a4, abbreviatedGenitiveMonths: a5 } },\n 'en-IE': { number: n15, date: { ...d16, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'en-IN': { number: n17, date: { ...d18, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'en-NZ': { number: n8, date: { ...d18, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'en-SG': { number: n8, date: { ...d12, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'en-ZA': { number: n19, date: { ...d20, days: a2, abbreviatedDays: a3, months: a4, abbreviatedMonths: a11, genitiveMonths: a4, abbreviatedGenitiveMonths: a11 } },\n 'de': { number: n21, date: { ...d22, days: a23, abbreviatedDays: a24, months: a25, abbreviatedMonths: a26, genitiveMonths: a25, abbreviatedGenitiveMonths: a27 } },\n 'de-DE': { number: n28, date: { ...d22, days: a23, abbreviatedDays: a24, months: a25, abbreviatedMonths: a26, genitiveMonths: a25, abbreviatedGenitiveMonths: a27 } },\n 'de-AT': { number: n29, date: { ...d22, days: a23, abbreviatedDays: a24, months: a30, abbreviatedMonths: a31, genitiveMonths: a30, abbreviatedGenitiveMonths: a32 } },\n 'de-CH': { number: n33, date: { ...d22, days: a23, abbreviatedDays: a24, months: a25, abbreviatedMonths: a26, genitiveMonths: a25, abbreviatedGenitiveMonths: a27 } },\n 'fr': { number: n34, date: { ...d35, days: a36, abbreviatedDays: a37, months: a38, abbreviatedMonths: a39, genitiveMonths: a38, abbreviatedGenitiveMonths: a39 } },\n 'fr-FR': { number: n40, date: { ...d35, days: a36, abbreviatedDays: a37, months: a38, abbreviatedMonths: a39, genitiveMonths: a38, abbreviatedGenitiveMonths: a39 } },\n 'fr-BE': { number: n40, date: { ...d41, days: a36, abbreviatedDays: a37, months: a38, abbreviatedMonths: a39, genitiveMonths: a38, abbreviatedGenitiveMonths: a39 } },\n 'fr-CA': { number: n42, date: { ...d43, days: a36, abbreviatedDays: a37, months: a38, abbreviatedMonths: a44, genitiveMonths: a38, abbreviatedGenitiveMonths: a44 } },\n 'fr-CH': { number: n45, date: { ...d46, days: a36, abbreviatedDays: a37, months: a38, abbreviatedMonths: a39, genitiveMonths: a38, abbreviatedGenitiveMonths: a39 } },\n 'es': { number: n21, date: { ...d47, days: a48, abbreviatedDays: a49, months: a50, abbreviatedMonths: a51, genitiveMonths: a50, abbreviatedGenitiveMonths: a51 } },\n 'es-ES': { number: n28, date: { ...d47, days: a48, abbreviatedDays: a49, months: a50, abbreviatedMonths: a51, genitiveMonths: a50, abbreviatedGenitiveMonths: a51 } },\n 'es-MX': { number: n8, date: { ...d52, days: a48, abbreviatedDays: a49, months: a50, abbreviatedMonths: a53, genitiveMonths: a50, abbreviatedGenitiveMonths: a53 } },\n 'es-US': { number: n8, date: { ...d54, days: a48, abbreviatedDays: a49, months: a50, abbreviatedMonths: a51, genitiveMonths: a50, abbreviatedGenitiveMonths: a51 } },\n 'it': { number: n55, date: { ...d56, days: a57, abbreviatedDays: a58, months: a59, abbreviatedMonths: a60, genitiveMonths: a59, abbreviatedGenitiveMonths: a60 } },\n 'it-IT': { number: n61, date: { ...d56, days: a57, abbreviatedDays: a58, months: a59, abbreviatedMonths: a60, genitiveMonths: a59, abbreviatedGenitiveMonths: a60 } },\n 'it-CH': { number: n33, date: { ...d62, days: a57, abbreviatedDays: a58, months: a59, abbreviatedMonths: a60, genitiveMonths: a59, abbreviatedGenitiveMonths: a60 } },\n 'pt': { number: n63, date: { ...d64, days: a65, abbreviatedDays: a66, months: a67, abbreviatedMonths: a68, genitiveMonths: a67, abbreviatedGenitiveMonths: a68 } },\n 'pt-BR': { number: n69, date: { ...d64, days: a65, abbreviatedDays: a66, months: a67, abbreviatedMonths: a68, genitiveMonths: a67, abbreviatedGenitiveMonths: a68 } },\n 'pt-PT': { number: n70, date: { ...d71, days: a65, abbreviatedDays: a72, months: a67, abbreviatedMonths: a68, genitiveMonths: a67, abbreviatedGenitiveMonths: a68 } },\n 'nl': { number: n73, date: { ...d74, days: a75, abbreviatedDays: a76, months: a77, abbreviatedMonths: a78, genitiveMonths: a77, abbreviatedGenitiveMonths: a78 } },\n 'nl-NL': { number: n79, date: { ...d74, days: a75, abbreviatedDays: a76, months: a77, abbreviatedMonths: a78, genitiveMonths: a77, abbreviatedGenitiveMonths: a78 } },\n 'nl-BE': { number: n79, date: { ...d80, days: a75, abbreviatedDays: a76, months: a77, abbreviatedMonths: a78, genitiveMonths: a77, abbreviatedGenitiveMonths: a78 } },\n 'sv': { number: n81, date: { ...d82, days: a83, abbreviatedDays: a84, months: a85, abbreviatedMonths: a86, genitiveMonths: a85, abbreviatedGenitiveMonths: a86 } },\n 'sv-SE': { number: n87, date: { ...d82, days: a83, abbreviatedDays: a84, months: a85, abbreviatedMonths: a86, genitiveMonths: a85, abbreviatedGenitiveMonths: a86 } },\n 'da': { number: n21, date: { ...d88, days: a89, abbreviatedDays: a90, months: a91, abbreviatedMonths: a92, genitiveMonths: a91, abbreviatedGenitiveMonths: a92 } },\n 'da-DK': { number: n93, date: { ...d88, days: a89, abbreviatedDays: a90, months: a91, abbreviatedMonths: a92, genitiveMonths: a91, abbreviatedGenitiveMonths: a92 } },\n 'nb': { number: n81, date: { ...d94, days: a89, abbreviatedDays: a95, months: a96, abbreviatedMonths: a97, genitiveMonths: a96, abbreviatedGenitiveMonths: a98 } },\n 'nb-NO': { number: n87, date: { ...d94, days: a89, abbreviatedDays: a95, months: a96, abbreviatedMonths: a97, genitiveMonths: a96, abbreviatedGenitiveMonths: a98 } },\n 'fi': { number: n99, date: { ...d100, days: a101, abbreviatedDays: a102, months: a103, abbreviatedMonths: a104, genitiveMonths: a105, abbreviatedGenitiveMonths: a104 } },\n 'fi-FI': { number: n106, date: { ...d100, days: a101, abbreviatedDays: a102, months: a103, abbreviatedMonths: a104, genitiveMonths: a105, abbreviatedGenitiveMonths: a104 } },\n 'pl': { number: n107, date: { ...d108, days: a109, abbreviatedDays: a110, months: a111, abbreviatedMonths: a112, genitiveMonths: a113, abbreviatedGenitiveMonths: a112 } },\n 'pl-PL': { number: n114, date: { ...d108, days: a109, abbreviatedDays: a110, months: a111, abbreviatedMonths: a112, genitiveMonths: a113, abbreviatedGenitiveMonths: a112 } },\n 'cs': { number: n115, date: { ...d116, days: a117, abbreviatedDays: a118, months: a119, abbreviatedMonths: a120, genitiveMonths: a121, abbreviatedGenitiveMonths: a120 } },\n 'cs-CZ': { number: n122, date: { ...d116, days: a117, abbreviatedDays: a118, months: a119, abbreviatedMonths: a120, genitiveMonths: a121, abbreviatedGenitiveMonths: a120 } },\n 'sk': { number: n115, date: { ...d123, days: a124, abbreviatedDays: a125, months: a126, abbreviatedMonths: a127, genitiveMonths: a128, abbreviatedGenitiveMonths: a127 } },\n 'sk-SK': { number: n129, date: { ...d123, days: a124, abbreviatedDays: a125, months: a126, abbreviatedMonths: a127, genitiveMonths: a128, abbreviatedGenitiveMonths: a127 } },\n 'hu': { number: n107, date: { ...d130, days: a131, abbreviatedDays: a132, months: a133, abbreviatedMonths: a134, genitiveMonths: a133, abbreviatedGenitiveMonths: a134 } },\n 'hu-HU': { number: n135, date: { ...d130, days: a131, abbreviatedDays: a132, months: a133, abbreviatedMonths: a134, genitiveMonths: a133, abbreviatedGenitiveMonths: a134 } },\n 'ro': { number: n21, date: { ...d136, days: a137, abbreviatedDays: a138, months: a139, abbreviatedMonths: a140, genitiveMonths: a139, abbreviatedGenitiveMonths: a140 } },\n 'ro-RO': { number: n141, date: { ...d136, days: a137, abbreviatedDays: a138, months: a139, abbreviatedMonths: a140, genitiveMonths: a139, abbreviatedGenitiveMonths: a140 } },\n 'el': { number: n55, date: { ...d142, days: a143, abbreviatedDays: a144, months: a145, abbreviatedMonths: a146, genitiveMonths: a147, abbreviatedGenitiveMonths: a148 } },\n 'el-GR': { number: n61, date: { ...d142, days: a143, abbreviatedDays: a144, months: a145, abbreviatedMonths: a146, genitiveMonths: a147, abbreviatedGenitiveMonths: a148 } },\n 'ru': { number: n149, date: { ...d150, days: a151, abbreviatedDays: a152, months: a153, abbreviatedMonths: a154, genitiveMonths: a155, abbreviatedGenitiveMonths: a156 } },\n 'ru-RU': { number: n157, date: { ...d150, days: a151, abbreviatedDays: a152, months: a153, abbreviatedMonths: a154, genitiveMonths: a155, abbreviatedGenitiveMonths: a156 } },\n 'uk': { number: n107, date: { ...d158, days: a159, abbreviatedDays: a160, months: a161, abbreviatedMonths: a162, genitiveMonths: a163, abbreviatedGenitiveMonths: a162 } },\n 'uk-UA': { number: n164, date: { ...d158, days: a159, abbreviatedDays: a160, months: a161, abbreviatedMonths: a162, genitiveMonths: a163, abbreviatedGenitiveMonths: a162 } },\n 'tr': { number: n165, date: { ...d166, days: a167, abbreviatedDays: a168, months: a169, abbreviatedMonths: a170, genitiveMonths: a169, abbreviatedGenitiveMonths: a170 } },\n 'tr-TR': { number: n171, date: { ...d166, days: a167, abbreviatedDays: a168, months: a169, abbreviatedMonths: a170, genitiveMonths: a169, abbreviatedGenitiveMonths: a170 } },\n 'he': { number: n172, date: { ...d173, days: a174, abbreviatedDays: a175, months: a176, abbreviatedMonths: a177, genitiveMonths: a176, abbreviatedGenitiveMonths: a177 } },\n 'he-IL': { number: n178, date: { ...d173, days: a174, abbreviatedDays: a175, months: a176, abbreviatedMonths: a177, genitiveMonths: a176, abbreviatedGenitiveMonths: a177 } },\n 'id': { number: n179, date: { ...d180, days: a181, abbreviatedDays: a182, months: a183, abbreviatedMonths: a184, genitiveMonths: a183, abbreviatedGenitiveMonths: a184 } },\n 'id-ID': { number: n185, date: { ...d180, days: a181, abbreviatedDays: a182, months: a183, abbreviatedMonths: a184, genitiveMonths: a183, abbreviatedGenitiveMonths: a184 } },\n 'vi': { number: n55, date: { ...d186, days: a187, abbreviatedDays: a188, months: a189, abbreviatedMonths: a189, genitiveMonths: a190, abbreviatedGenitiveMonths: a191 } },\n 'vi-VN': { number: n192, date: { ...d186, days: a187, abbreviatedDays: a188, months: a189, abbreviatedMonths: a189, genitiveMonths: a190, abbreviatedGenitiveMonths: a191 } },\n 'ja': { number: n6, date: { ...d193, days: a194, abbreviatedDays: a195, months: a196, abbreviatedMonths: a196, genitiveMonths: a196, abbreviatedGenitiveMonths: a196 } },\n 'ja-JP': { number: n197, date: { ...d193, days: a194, abbreviatedDays: a195, months: a196, abbreviatedMonths: a196, genitiveMonths: a196, abbreviatedGenitiveMonths: a196 } },\n 'ko': { number: n6, date: { ...d198, days: a199, abbreviatedDays: a200, months: a201, abbreviatedMonths: a201, genitiveMonths: a201, abbreviatedGenitiveMonths: a201 } },\n 'ko-KR': { number: n202, date: { ...d198, days: a199, abbreviatedDays: a200, months: a201, abbreviatedMonths: a201, genitiveMonths: a201, abbreviatedGenitiveMonths: a201 } },\n 'zh': { number: n6, date: { ...d203, days: a204, abbreviatedDays: a205, months: a206, abbreviatedMonths: a196, genitiveMonths: a206, abbreviatedGenitiveMonths: a196 } },\n 'zh-CN': { number: n207, date: { ...d203, days: a204, abbreviatedDays: a205, months: a206, abbreviatedMonths: a196, genitiveMonths: a206, abbreviatedGenitiveMonths: a196 } },\n 'zh-HK': { number: n208, date: { ...d209, days: a204, abbreviatedDays: a210, months: a196, abbreviatedMonths: a196, genitiveMonths: a196, abbreviatedGenitiveMonths: a196 } },\n 'zh-SG': { number: n8, date: { ...d211, days: a204, abbreviatedDays: a205, months: a206, abbreviatedMonths: a196, genitiveMonths: a206, abbreviatedGenitiveMonths: a196 } },\n 'zh-TW': { number: n212, date: { ...d213, days: a204, abbreviatedDays: a210, months: a196, abbreviatedMonths: a196, genitiveMonths: a196, abbreviatedGenitiveMonths: a196 } },\n 'zh-Hans': { number: n6, date: { ...d203, days: a204, abbreviatedDays: a205, months: a206, abbreviatedMonths: a196, genitiveMonths: a206, abbreviatedGenitiveMonths: a196 } },\n 'zh-Hant': { number: n214, date: { ...d213, days: a204, abbreviatedDays: a210, months: a196, abbreviatedMonths: a196, genitiveMonths: a196, abbreviatedGenitiveMonths: a196 } },\n};\n", "// A culture's number and date conventions, as .NET's NumberFormatInfo and DateTimeFormatInfo hold them\n// (ADR-0370, section 10). The engine formats labels and values from this table, never from `Intl`, so a\n// figure does not change with the runtime's ICU: the table is .NET's on Linux, which a .NET server pivots\n// in, and the shared cases hold the two engines to it.\n\nimport { cultureTable } from './culture-table';\n\n/** NumberFormatInfo's members the formats read. Patterns are .NET's numbers for them. */\nexport interface NumberCulture {\n readonly decimal: string;\n readonly group: string;\n readonly groupSizes: readonly number[];\n readonly digits: number;\n readonly negativePattern: number;\n readonly negativeSign: string;\n readonly positiveSign: string;\n readonly currencyDecimal: string;\n readonly currencyGroup: string;\n readonly currencyGroupSizes: readonly number[];\n readonly currencyDigits: number;\n readonly currencySymbol: string;\n readonly currencyPositivePattern: number;\n readonly currencyNegativePattern: number;\n readonly percentDecimal: string;\n readonly percentGroup: string;\n readonly percentGroupSizes: readonly number[];\n readonly percentDigits: number;\n readonly percentSymbol: string;\n readonly perMilleSymbol: string;\n readonly percentPositivePattern: number;\n readonly percentNegativePattern: number;\n readonly nan: string;\n readonly positiveInfinity: string;\n readonly negativeInfinity: string;\n}\n\n/** DateTimeFormatInfo's members the formats read, for the Gregorian calendar. */\nexport interface DateCulture {\n readonly shortDate: string;\n readonly longDate: string;\n readonly shortTime: string;\n readonly longTime: string;\n readonly fullDateTime: string;\n readonly monthDay: string;\n readonly yearMonth: string;\n readonly am: string;\n readonly pm: string;\n readonly dateSeparator: string;\n readonly timeSeparator: string;\n readonly era: string;\n /** Whether a month's genitive names differ from its own, so `MMMM` beside a day takes them. */\n readonly useGenitive: boolean;\n readonly days: readonly string[];\n readonly abbreviatedDays: readonly string[];\n readonly months: readonly string[];\n readonly abbreviatedMonths: readonly string[];\n readonly genitiveMonths: readonly string[];\n readonly abbreviatedGenitiveMonths: readonly string[];\n}\n\n/** One culture's conventions. */\nexport interface CultureData {\n readonly number: NumberCulture;\n readonly date: DateCulture;\n}\n\n/** A culture the engine formats in: its .NET name, `invariant` for the InvariantCulture, and its\n * conventions. */\nexport interface Culture {\n readonly name: string;\n readonly data: CultureData;\n}\n\nconst byLowerName = new Map<string, string>();\n\n/** The culture of a locale, a BCP 47 tag or `invariant`, matched as .NET matches a culture name, ignoring\n * case. A locale the table does not hold is refused with a `RangeError` naming it: formatting in some other\n * culture's conventions would show figures the reader cannot trust. */\nexport function cultureOf(locale: string): Culture {\n if (byLowerName.size === 0) {\n for (const name of Object.keys(cultureTable)) byLowerName.set(name.toLowerCase(), name);\n }\n const name = byLowerName.get(locale.toLowerCase());\n const data = name === undefined ? undefined : cultureTable[name];\n if (name === undefined || data === undefined) {\n throw new RangeError(\n `The locale '${locale}' is not one the pivot engine formats in; it holds ${[...byLowerName.values()].join(', ')}.`);\n }\n return Object.freeze({ name, data });\n}\n\n/** The locales the engine formats in, by their .NET names. */\nexport function pivotLocales(): readonly string[] {\n return Object.freeze(Object.keys(cultureTable));\n}\n", "// .NET's number formatting, as `double.ToString(format, culture)` and `decimal.ToString(format, culture)`\n// write a number (ADR-0060: a Value Field's number format and a field's format are .NET format strings,\n// and a report written in TypeScript must show what the C# engine shows). It is .NET's own algorithm,\n// transcribed: the digits of the number in a buffer, rounded where the format says, then laid out by the\n// standard format's pattern or the custom format's sections. dotnet/tools/pivot-oracle holds it to .NET.\n//\n// A double's digits are its exact binary value's: correctly rounded where a standard format names its\n// precision, the shortest that reads back where it names none, and fifteen significant digits, rounded\n// again half up, under a custom format, as .NET does. A decimal's are its own, rounded half away from zero.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport type { PivotNumber } from '../cube/answer';\nimport { cultureOf, type NumberCulture } from '../culture/culture-data';\nimport { PivotFormatError } from '../errors';\n\n/** The digits of a number: `0.d1d2d3\u2026 \u00D7 10^scale`, as .NET's NumberBuffer holds them. */\ninterface NumberBuffer {\n digits: string;\n scale: number;\n negative: boolean;\n readonly floating: boolean;\n}\n\nconst badFormat = 'Format specifier was invalid.';\n\n/** `value.ToString(format, culture)` for a C# double. */\nexport function formatDouble(value: number, format: string | undefined = '', culture: NumberCulture): string {\n const text = format;\n if (!Number.isFinite(value)) {\n if (Number.isNaN(value)) return culture.nan;\n return value < 0 ? culture.negativeInfinity : culture.positiveInfinity;\n }\n const specifier = parseSpecifier(text);\n const negative = value < 0 || Object.is(value, -0);\n if (specifier.letter === undefined) {\n // A custom format: fifteen significant digits, rounded again where the format puts its last.\n const buffer = significantDigits(Math.abs(value), 15, negative);\n return customFormat(buffer, text, culture);\n }\n let precision = specifier.precision;\n let significant: boolean;\n const letter = specifier.letter.toUpperCase();\n switch (letter) {\n case 'C':\n if (precision === -1) precision = culture.currencyDigits;\n significant = false;\n break;\n case 'E':\n if (precision === -1) precision = 6;\n precision++;\n significant = true;\n break;\n case 'F':\n case 'N':\n if (precision === -1) precision = culture.digits;\n significant = false;\n break;\n case 'G':\n if (precision === 0) precision = -1;\n significant = true;\n break;\n case 'P':\n if (precision === -1) precision = culture.percentDigits;\n precision += 2;\n significant = false;\n break;\n case 'R':\n precision = -1;\n significant = true;\n break;\n default:\n throw new PivotFormatError(badFormat);\n }\n let maxDigits = specifier.precision;\n const magnitude = Math.abs(value);\n let buffer: NumberBuffer;\n if (precision === -1) {\n buffer = shortestDigits(magnitude, negative);\n maxDigits = Math.max(buffer.digits.length, 17);\n } else if (significant) {\n buffer = significantDigits(magnitude, precision, negative);\n } else {\n buffer = fixedDigits(magnitude, precision, negative);\n }\n return standardFormat(buffer, specifier.letter, maxDigits, culture);\n}\n\n/** `value.ToString(format, culture)` for a C# decimal, `mantissa` \u00D7 10^-`scale`, trailing zeros and all. */\nexport function formatDecimal(value: SnapshotDecimal, format: string | undefined = '', culture: NumberCulture): string {\n const text = format;\n const negative = value.mantissa < 0n;\n const magnitude = negative ? -value.mantissa : value.mantissa;\n const digits = magnitude === 0n ? '' : magnitude.toString();\n const buffer: NumberBuffer = { digits, scale: digits.length - value.scale, negative, floating: false };\n const specifier = parseSpecifier(text);\n if (specifier.letter === undefined) return customFormat(buffer, text, culture);\n return standardFormat(buffer, specifier.letter, specifier.precision, culture);\n}\n\n// ---- The specifier ----------------------------------------------------------------------------------\n\ninterface Specifier {\n /** The standard format's letter, or undefined for a custom format. */\n readonly letter: string | undefined;\n /** Its precision, or -1 where it names none. */\n readonly precision: number;\n}\n\n/** .NET's ParseFormatSpecifier: a letter and up to nine digits is a standard format; an empty one is G. */\nfunction parseSpecifier(format: string): Specifier {\n if (format.length === 0) return { letter: 'G', precision: -1 };\n const first = format.charCodeAt(0);\n if (first === 0) return { letter: 'G', precision: -1 };\n if (isAsciiLetter(first)) {\n if (format.length === 1) return { letter: format.charAt(0), precision: -1 };\n let n = 0;\n let i = 1;\n while (i < format.length && isAsciiDigit(format.charCodeAt(i))) {\n if (n >= 100_000_000) throw new PivotFormatError(badFormat);\n n = n * 10 + format.charCodeAt(i) - 48;\n i++;\n }\n if (i >= format.length || format.charCodeAt(i) === 0) return { letter: format.charAt(0), precision: n };\n }\n return { letter: undefined, precision: -1 };\n}\n\nfunction isAsciiLetter(code: number): boolean {\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isAsciiDigit(code: number): boolean {\n return code >= 48 && code <= 57;\n}\n\n// ---- A double's digits ------------------------------------------------------------------------------\n\nlet powersOfFive: bigint[] | undefined;\n\nfunction fiveTo(power: number): bigint {\n powersOfFive ??= [1n];\n while (powersOfFive.length <= power) {\n const last = powersOfFive[powersOfFive.length - 1];\n if (last === undefined) throw new Error('Internal: the powers of five are empty.');\n powersOfFive.push(last * 5n);\n }\n const five = powersOfFive[power];\n if (five === undefined) throw new Error(`Internal: 5^${power} is missing.`);\n return five;\n}\n\n/** The exact decimal digits of a finite, non-negative double, without trailing zeros, and its scale. */\nfunction exactDigits(magnitude: number): { digits: string; scale: number } {\n if (magnitude === 0) return { digits: '', scale: 0 };\n const bits = new DataView(new ArrayBuffer(8));\n bits.setFloat64(0, magnitude);\n const word = bits.getBigUint64(0);\n const biased = Number(word >> 52n);\n const fraction = word & ((1n << 52n) - 1n);\n const mantissa = biased === 0 ? fraction : fraction | (1n << 52n);\n const exponent = (biased === 0 ? 1 : biased) - 1075;\n let digits: string;\n let scale: number;\n if (exponent >= 0) {\n digits = (mantissa << BigInt(exponent)).toString();\n scale = digits.length;\n } else {\n digits = (mantissa * fiveTo(-exponent)).toString();\n scale = digits.length + exponent;\n }\n return { digits: digits.replace(/0+$/, ''), scale };\n}\n\n/** The shortest digits that read back as the double, as its round-trip text writes them. */\nfunction shortestDigits(magnitude: number, negative: boolean): NumberBuffer {\n if (magnitude === 0) return { digits: '', scale: 0, negative, floating: true };\n const [mantissa = '', exponent = ''] = magnitude.toExponential().split('e');\n const digits = mantissa.replace('.', '').replace(/0+$/, '');\n return { digits, scale: Number(exponent) + 1, negative, floating: true };\n}\n\n/** The double's exact value rounded to `count` significant digits, a tie to the even digit. */\nfunction significantDigits(magnitude: number, count: number, negative: boolean): NumberBuffer {\n const exact = exactDigits(magnitude);\n const rounded = roundExact(exact.digits, exact.scale, count);\n return { digits: rounded.digits, scale: rounded.scale, negative, floating: true };\n}\n\n/** The double's exact value rounded to `places` decimal places, a tie to the even digit. */\nfunction fixedDigits(magnitude: number, places: number, negative: boolean): NumberBuffer {\n const exact = exactDigits(magnitude);\n const rounded = roundExact(exact.digits, exact.scale, exact.scale + places);\n return { digits: rounded.digits, scale: rounded.scale, negative, floating: true };\n}\n\n/** Exact digits cut to `keep`, rounded to the nearest and a tie to the even digit, without trailing\n * zeros. Rounded to nothing, the digits are empty at scale 0. */\nfunction roundExact(digits: string, scale: number, keep: number): { digits: string; scale: number } {\n if (digits.length === 0) return { digits: '', scale: 0 };\n if (keep >= digits.length) return { digits, scale };\n if (keep < 0) return { digits: '', scale: 0 };\n const kept = digits.slice(0, keep);\n const next = digits.charCodeAt(keep) - 48;\n const rest = digits.length > keep + 1;\n const lastKept = keep === 0 ? 0 : kept.charCodeAt(keep - 1) - 48;\n const up = next > 5 || (next === 5 && (rest || lastKept % 2 === 1));\n if (!up) {\n const trimmed = kept.replace(/0+$/, '');\n return trimmed.length === 0 ? { digits: '', scale: 0 } : { digits: trimmed, scale };\n }\n return incremented(kept, scale);\n}\n\n/** `kept`, a run of digits at `scale`, plus one in its last place. */\nfunction incremented(kept: string, scale: number): { digits: string; scale: number } {\n let i = kept.length;\n while (i > 0 && kept.charCodeAt(i - 1) === 57) i--;\n if (i === 0) return { digits: '1', scale: scale + 1 };\n return { digits: kept.slice(0, i - 1) + String.fromCharCode(kept.charCodeAt(i - 1) + 1), scale };\n}\n\n// ---- Rounding the buffer ------------------------------------------------------------------------------\n\n/** .NET's RoundNumber: keeps `pos` digits, rounding half up unless the digits were already rounded\n * correctly; trailing zeros come off, and a number rounded to nothing is 0 at scale 0, a decimal's\n * sign dropped with it. */\nfunction roundNumber(buffer: NumberBuffer, pos: number, correctlyRounded: boolean): void {\n const digits = buffer.digits;\n let i = 0;\n while (i < pos && i < digits.length) i++;\n let result: string;\n if (i === pos && i < digits.length && !correctlyRounded && digits.charCodeAt(i) >= 53) {\n while (i > 0 && digits.charCodeAt(i - 1) === 57) i--;\n if (i > 0) {\n result = digits.slice(0, i - 1) + String.fromCharCode(digits.charCodeAt(i - 1) + 1);\n } else {\n buffer.scale++;\n result = '1';\n }\n } else {\n while (i > 0 && digits.charCodeAt(i - 1) === 48) i--;\n result = digits.slice(0, i);\n }\n if (result.length === 0) {\n if (!buffer.floating) buffer.negative = false;\n buffer.scale = 0;\n }\n buffer.digits = result;\n}\n\n// ---- Standard formats ---------------------------------------------------------------------------------\n\nconst negativeNumberPatterns = ['(#)', '-#', '- #', '#-', '# -'];\nconst positiveCurrencyPatterns = ['$#', '#$', '$ #', '# $'];\nconst negativeCurrencyPatterns = [\n '($#)', '-$#', '$-#', '$#-', '(#$)', '-#$', '#-$', '#$-', '-# $', '-$ #', '# $-', '$ #-', '$ -#', '#- $',\n '($ #)', '(# $)', '$- #',\n];\nconst positivePercentPatterns = ['# %', '#%', '%#', '% #'];\nconst negativePercentPatterns = ['-# %', '-#%', '-%#', '%-#', '%#-', '#-%', '#%-', '-% #', '# %-', '% #-', '% -#', '#- %'];\n\nfunction pattern(list: readonly string[], index: number): string {\n const chosen = list[index];\n if (chosen === undefined) throw new Error(`Internal: the culture names pattern ${index}, which .NET does not have.`);\n return chosen;\n}\n\n/** .NET's NumberToString for a double's or a decimal's buffer. */\nfunction standardFormat(buffer: NumberBuffer, letter: string, precision: number, culture: NumberCulture): string {\n const correctlyRounded = buffer.floating;\n let maxDigits = precision;\n switch (letter) {\n case 'C':\n case 'c': {\n if (maxDigits < 0) maxDigits = culture.currencyDigits;\n roundNumber(buffer, buffer.scale + maxDigits, correctlyRounded);\n const layout = buffer.negative\n ? pattern(negativeCurrencyPatterns, culture.currencyNegativePattern)\n : pattern(positiveCurrencyPatterns, culture.currencyPositivePattern);\n return laidOut(layout, buffer, maxDigits, culture.currencyGroupSizes, culture.currencyDecimal,\n culture.currencyGroup, culture);\n }\n case 'F':\n case 'f':\n if (maxDigits < 0) maxDigits = culture.digits;\n roundNumber(buffer, buffer.scale + maxDigits, correctlyRounded);\n return (buffer.negative ? culture.negativeSign : '')\n + fixed(buffer, maxDigits, undefined, culture.decimal, '');\n case 'N':\n case 'n': {\n if (maxDigits < 0) maxDigits = culture.digits;\n roundNumber(buffer, buffer.scale + maxDigits, correctlyRounded);\n const layout = buffer.negative ? pattern(negativeNumberPatterns, culture.negativePattern) : '#';\n return laidOut(layout, buffer, maxDigits, culture.groupSizes, culture.decimal, culture.group, culture);\n }\n case 'E':\n case 'e':\n if (maxDigits < 0) maxDigits = 6;\n maxDigits++;\n roundNumber(buffer, maxDigits, correctlyRounded);\n return (buffer.negative ? culture.negativeSign : '') + scientific(buffer, maxDigits, culture, letter);\n case 'G':\n case 'g':\n case 'R':\n case 'r': {\n const exponent = letter === 'G' || letter === 'R' ? 'E' : 'e';\n if (maxDigits < 1) {\n if (!buffer.floating && maxDigits === -1) {\n // A decimal in G keeps its trailing zeros, as significant, and its own digits.\n const sign = buffer.negative && buffer.digits.length > 0 ? culture.negativeSign : '';\n return sign + general(buffer, maxDigits, culture, exponent, true);\n }\n maxDigits = buffer.digits.length;\n }\n roundNumber(buffer, maxDigits, correctlyRounded);\n return (buffer.negative ? culture.negativeSign : '') + general(buffer, maxDigits, culture, exponent, false);\n }\n case 'P':\n case 'p': {\n if (maxDigits < 0) maxDigits = culture.percentDigits;\n buffer.scale += 2;\n roundNumber(buffer, buffer.scale + maxDigits, correctlyRounded);\n const layout = buffer.negative\n ? pattern(negativePercentPatterns, culture.percentNegativePattern)\n : pattern(positivePercentPatterns, culture.percentPositivePattern);\n return laidOut(layout, buffer, maxDigits, culture.percentGroupSizes, culture.percentDecimal,\n culture.percentGroup, culture);\n }\n default:\n throw new PivotFormatError(badFormat);\n }\n}\n\n/** A standard pattern: `#` the grouped number, `-` the culture's negative sign, `$` its currency symbol and\n * `%` its percent symbol; anything else as it stands. */\nfunction laidOut(layout: string, buffer: NumberBuffer, maxDigits: number, groupSizes: readonly number[], decimal: string,\n group: string, culture: NumberCulture): string {\n let text = '';\n for (const ch of layout) {\n switch (ch) {\n case '#': text += fixed(buffer, maxDigits, groupSizes, decimal, group); break;\n case '-': text += culture.negativeSign; break;\n case '$': text += culture.currencySymbol; break;\n case '%': text += culture.percentSymbol; break;\n default: text += ch; break;\n }\n }\n return text;\n}\n\n/** .NET's FormatFixed: the integer digits, grouped from the right when sizes are given, then `maxDigits`\n * places. */\nfunction fixed(buffer: NumberBuffer, maxDigits: number, groupSizes: readonly number[] | undefined, decimal: string,\n group: string): string {\n const digits = buffer.digits;\n let digPos = buffer.scale;\n let next = 0;\n let text = '';\n if (digPos > 0) {\n let whole = '';\n for (let i = 0; i < digPos; i++) whole += i < digits.length ? digits.charAt(i) : '0';\n next = Math.min(digPos, digits.length);\n text = groupSizes === undefined ? whole : grouped(whole, groupSizes, group);\n } else {\n text = '0';\n }\n if (maxDigits > 0) {\n text += decimal;\n let places = maxDigits;\n if (digPos < 0) {\n const zeroes = Math.min(-digPos, places);\n text += '0'.repeat(zeroes);\n digPos += zeroes;\n places -= zeroes;\n }\n for (; places > 0; places--) {\n text += next < digits.length ? digits.charAt(next) : '0';\n next++;\n }\n }\n return text;\n}\n\n/** Whole digits with the group separator put in from the right: the first size, then each next, the last\n * repeating; a size of 0 ends the grouping. */\nfunction grouped(whole: string, sizes: readonly number[], separator: string): string {\n const first = sizes[0];\n if (first === undefined || first === 0) return whole;\n const parts: string[] = [];\n let end = whole.length;\n let index = 0;\n let size = first;\n while (size > 0 && end > size) {\n parts.unshift(whole.slice(end - size, end));\n end -= size;\n if (index < sizes.length - 1) {\n index++;\n size = sizes[index] ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- the index was checked against the length above\n }\n }\n parts.unshift(whole.slice(0, end));\n return parts.join(separator);\n}\n\n/** .NET's FormatScientific: one digit, the point unless only one is asked for, the rest, and an exponent\n * of at least three digits with its sign. */\nfunction scientific(buffer: NumberBuffer, maxDigits: number, culture: NumberCulture, letter: string): string {\n const digits = buffer.digits;\n let text = digits.length > 0 ? digits.charAt(0) : '0';\n if (maxDigits !== 1) text += culture.decimal;\n for (let i = 1; i < maxDigits; i++) text += i < digits.length ? digits.charAt(i) : '0';\n const exponent = digits.length === 0 ? 0 : buffer.scale - 1;\n return text + exponentText(exponent, letter, 3, true, culture);\n}\n\n/** .NET's FormatGeneral: fixed while the scale lies within the digits asked for, and from -3, else\n * scientific with an exponent of at least two digits. */\nfunction general(buffer: NumberBuffer, maxDigits: number, culture: NumberCulture, letter: string,\n suppressScientific: boolean): string {\n const digits = buffer.digits;\n let digPos = buffer.scale;\n let isScientific = false;\n if (!suppressScientific && (digPos > maxDigits || digPos < -3)) {\n digPos = 1;\n isScientific = true;\n }\n let next = 0;\n let text = '';\n if (digPos > 0) {\n for (; digPos > 0; digPos--) {\n text += next < digits.length ? digits.charAt(next) : '0';\n next++;\n }\n } else {\n text = '0';\n }\n if (next < digits.length || digPos < 0) {\n text += culture.decimal;\n for (; digPos < 0; digPos++) text += '0';\n text += digits.slice(next);\n }\n if (isScientific) text += exponentText(buffer.scale - 1, letter, 2, true, culture);\n return text;\n}\n\n/** .NET's FormatExponent. */\nfunction exponentText(value: number, letter: string, minDigits: number, positiveSign: boolean, culture: NumberCulture): string {\n let text = letter;\n if (value < 0) text += culture.negativeSign;\n else if (positiveSign) text += culture.positiveSign;\n return text + Math.abs(value).toString().padStart(minDigits, '0');\n}\n\n// ---- Custom formats -------------------------------------------------------------------------------------\n\n/** .NET's FindSection: where section `section` (0 positive, 1 negative, 2 zero) starts, or 0 when the\n * format has none. */\nfunction findSection(format: string, section: number): number {\n if (section === 0) return 0;\n let remaining = section;\n let src = 0;\n for (;;) {\n if (src >= format.length) return 0;\n const ch = format.charAt(src++);\n switch (ch) {\n case '\\'':\n case '\"':\n while (src < format.length && format.charCodeAt(src) !== 0 && format.charAt(src++) !== ch) { /* the quoted text is skipped */ }\n break;\n case '\\\\':\n if (src < format.length && format.charCodeAt(src) !== 0) src++;\n break;\n case ';':\n if (--remaining !== 0) break;\n if (src < format.length && format.charCodeAt(src) !== 0 && format.charAt(src) !== ';') return src;\n return 0;\n case '\\0':\n return 0;\n default:\n break;\n }\n }\n}\n\n/** .NET's NumberToStringFormat: a custom format's sections, placeholders, grouping and scaling. */\nfunction customFormat(buffer: NumberBuffer, format: string, culture: NumberCulture): string {\n let section = findSection(format, buffer.digits.length === 0 ? 2 : buffer.negative ? 1 : 0);\n let digitCount: number;\n let decimalPos: number;\n let firstDigit: number;\n let lastDigit: number;\n let isScientific: boolean;\n let thousandPos: number;\n let thousandCount = 0;\n let thousandSeps: boolean;\n let scaleAdjust: number;\n let src: number;\n\n for (;;) {\n digitCount = 0;\n decimalPos = -1;\n firstDigit = 0x7FFFFFFF;\n lastDigit = 0;\n isScientific = false;\n thousandPos = -1;\n thousandSeps = false;\n scaleAdjust = 0;\n src = section;\n while (src < format.length) {\n const ch = format.charAt(src++);\n if (ch === '\\0' || ch === ';') break;\n switch (ch) {\n case '#':\n digitCount++;\n break;\n case '0':\n if (firstDigit === 0x7FFFFFFF) firstDigit = digitCount;\n digitCount++;\n lastDigit = digitCount;\n break;\n case '.':\n if (decimalPos < 0) decimalPos = digitCount;\n break;\n case ',':\n if (digitCount > 0 && decimalPos < 0) {\n if (thousandPos >= 0) {\n if (thousandPos === digitCount) {\n thousandCount++;\n break;\n }\n thousandSeps = true;\n }\n thousandPos = digitCount;\n thousandCount = 1;\n }\n break;\n case '%':\n scaleAdjust += 2;\n break;\n case '\u2030':\n scaleAdjust += 3;\n break;\n case '\\'':\n case '\"':\n while (src < format.length && format.charCodeAt(src) !== 0 && format.charAt(src++) !== ch) { /* the quoted text is skipped */ }\n break;\n case '\\\\':\n if (src < format.length && format.charCodeAt(src) !== 0) src++;\n break;\n case 'E':\n case 'e':\n if ((src < format.length && format.charAt(src) === '0')\n || (src + 1 < format.length && (format.charAt(src) === '+' || format.charAt(src) === '-')\n && format.charAt(src + 1) === '0')) {\n while (++src < format.length && format.charAt(src) === '0') { /* the exponent's zeros */ }\n isScientific = true;\n }\n break;\n default:\n break;\n }\n }\n if (decimalPos < 0) decimalPos = digitCount;\n if (thousandPos >= 0) {\n if (thousandPos === decimalPos) scaleAdjust -= thousandCount * 3;\n else thousandSeps = true;\n }\n if (buffer.digits.length > 0) {\n buffer.scale += scaleAdjust;\n const pos = isScientific ? digitCount : buffer.scale + digitCount - decimalPos;\n roundNumber(buffer, pos, false);\n if (buffer.digits.length === 0) {\n const zero = findSection(format, 2);\n if (zero !== section) {\n section = zero;\n continue;\n }\n }\n } else {\n if (!buffer.floating) buffer.negative = false;\n buffer.scale = 0;\n }\n break;\n }\n\n firstDigit = firstDigit < decimalPos ? decimalPos - firstDigit : 0;\n lastDigit = lastDigit > decimalPos ? decimalPos - lastDigit : 0;\n let digPos: number;\n let adjust: number;\n if (isScientific) {\n digPos = decimalPos;\n adjust = 0;\n } else {\n digPos = buffer.scale > decimalPos ? buffer.scale : decimalPos;\n adjust = buffer.scale - decimalPos;\n }\n src = section;\n\n const separators: number[] = [];\n if (thousandSeps && culture.group.length > 0) {\n const sizes = culture.groupSizes;\n let index = 0;\n let total = sizes.length === 0 ? 0 : sizes[0] ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- the length was checked on the same line\n let size = total;\n const totalDigits = digPos + (adjust < 0 ? adjust : 0);\n const numDigits = firstDigit > totalDigits ? firstDigit : totalDigits;\n while (numDigits > total) {\n if (size === 0) break;\n separators.push(total);\n if (index < sizes.length - 1) {\n index++;\n size = sizes[index] ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- the index was checked against the length above\n }\n total += size;\n }\n }\n let separator = separators.length - 1;\n\n const digits = buffer.digits;\n let cur = 0;\n let text = '';\n if (buffer.negative && section === 0 && buffer.scale !== 0) text += culture.negativeSign;\n let decimalWritten = false;\n const groupAfter = (): void => {\n if (thousandSeps && digPos > 1 && separator >= 0 && digPos === (separators[separator] ?? -1) + 1) { // oxlint-disable-line ex-grid/no-stand-in-default -- the index was checked on the same line\n text += culture.group;\n separator--;\n }\n };\n\n while (src < format.length) {\n let ch = format.charAt(src++);\n if (ch === '\\0' || ch === ';') break;\n if (adjust > 0 && (ch === '#' || ch === '0' || ch === '.')) {\n while (adjust > 0) {\n text += cur < digits.length ? digits.charAt(cur++) : '0';\n groupAfter();\n digPos--;\n adjust--;\n }\n }\n switch (ch) {\n case '#':\n case '0': {\n if (adjust < 0) {\n adjust++;\n ch = digPos <= firstDigit ? '0' : '';\n } else {\n ch = cur < digits.length ? digits.charAt(cur++) : digPos > lastDigit ? '0' : '';\n }\n if (ch !== '') {\n text += ch;\n groupAfter();\n }\n digPos--;\n break;\n }\n case '.':\n if (digPos !== 0 || decimalWritten) break;\n if (lastDigit < 0 || (decimalPos < digitCount && cur < digits.length)) {\n text += culture.decimal;\n decimalWritten = true;\n }\n break;\n case '\u2030':\n text += culture.perMilleSymbol;\n break;\n case '%':\n text += culture.percentSymbol;\n break;\n case ',':\n break;\n case '\\'':\n case '\"':\n while (src < format.length && format.charCodeAt(src) !== 0 && format.charAt(src) !== ch) text += format.charAt(src++);\n if (src < format.length && format.charCodeAt(src) !== 0) src++;\n break;\n case '\\\\':\n if (src < format.length && format.charCodeAt(src) !== 0) text += format.charAt(src++);\n break;\n case 'E':\n case 'e': {\n let positiveSign = false;\n let zeros = 0;\n if (isScientific) {\n if (src < format.length && format.charAt(src) === '0') {\n zeros++;\n } else if (src + 1 < format.length && format.charAt(src) === '+' && format.charAt(src + 1) === '0') {\n positiveSign = true;\n } else if (src + 1 < format.length && format.charAt(src) === '-' && format.charAt(src + 1) === '0') {\n // E-0 writes the sign only when the exponent is negative.\n } else {\n text += ch;\n break;\n }\n while (++src < format.length && format.charAt(src) === '0') zeros++;\n if (zeros > 10) zeros = 10;\n const exponent = digits.length === 0 ? 0 : buffer.scale - decimalPos;\n text += exponentText(exponent, ch, zeros, positiveSign, culture);\n isScientific = false;\n } else {\n text += ch;\n if (src < format.length) {\n if (format.charAt(src) === '+' || format.charAt(src) === '-') text += format.charAt(src++);\n while (src < format.length && format.charAt(src) === '0') text += format.charAt(src++);\n }\n }\n break;\n }\n default:\n text += ch;\n break;\n }\n }\n if (buffer.negative && section === 0 && buffer.scale === 0 && text.length > 0) text = culture.negativeSign + text;\n return text;\n}\n\n/**\n * A count written as the report writes a whole number in `locale`, a BCP 47 tag or `invariant`, with its\n * group separators: `1,020,000` in en-US, `1.020.000` in de-DE, as C#'s `count.ToString(\"N0\", culture)`\n * writes it. The Field List writes a field's count of Items with it, and the leaf cap's refusal its figures\n * (ADR-0370 section 3). A count that is not a whole number of at least 0 is refused.\n */\nexport function formatPivotCount(count: number, locale: string): string {\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(`A count is a whole number of at least 0, not ${count}.`);\n return formatDouble(count, 'N0', cultureOf(locale).data.number);\n}\n\n/**\n * A number written in a number format in `locale`, as C#'s `value.ToString(format, culture)` writes it: what a\n * Value Field's number format makes of a figure, which Value Field Settings\u2026 shows as its sample (ADR-0061).\n * A format .NET cannot format a number with throws a `PivotFormatError`; `pivotNumberFormatProblem` says so\n * first.\n */\nexport function formatPivotNumber(value: number, format: string, locale: string): string {\n return formatDouble(value, format, cultureOf(locale).data.number);\n}\n\n/**\n * A figure written in a number format in `locale`, as C#'s `ToString(format, culture)` writes the decimal or the\n * double it is: a Selection Summary's figure in the Focus value's format, as the report shows that value (ADR-0130).\n * A format .NET cannot format a number with throws a `PivotFormatError`.\n */\nexport function formatPivotFigure(value: PivotNumber, format: string, locale: string): string {\n const culture = cultureOf(locale).data.number;\n return value.kind === 'exact' ? formatDecimal(value.value, format, culture) : formatDouble(value.value, format, culture);\n}\n", "// .NET's date formatting, as `DateTime.ToString(format, culture)` writes a date Item's label (ADR-0060): a\n// standard format's culture pattern, or a custom format's specifiers, transcribed from .NET's\n// DateTimeFormat for the Gregorian calendar. A date is a clock value without a zone, a DateTime of\n// unspecified kind, so `K` writes nothing and `z` writes the offset of UTC, which a .NET server pivots in.\n// dotnet/tools/pivot-oracle holds it to .NET.\n\nimport type { DateCulture } from '../culture/culture-data';\nimport { PivotFormatError } from '../errors';\n\nconst ticksPerDay = 864_000_000_000n;\nconst ticksPerSecond = 10_000_000n;\n\n/** A clock value's parts, from its ticks. */\ninterface DateParts {\n readonly year: number;\n readonly month: number;\n readonly day: number;\n readonly dayOfWeek: number;\n readonly hour: number;\n readonly minute: number;\n readonly second: number;\n /** The ticks within the second, 0 to 9,999,999. */\n readonly fraction: number;\n}\n\n/** The parts of a DateTime's ticks: the proleptic Gregorian calendar from 0001-01-01. */\nexport function dateParts(ticks: bigint): DateParts {\n const days = Number(ticks / ticksPerDay);\n const within = ticks % ticksPerDay;\n const seconds = Number(within / ticksPerSecond);\n // Days since 0000-03-01, the civil calendar's own start, then back to January's year.\n const shifted = days + 306;\n const era = Math.floor(shifted / 146097);\n const dayOfEra = shifted - era * 146097;\n const yearOfEra = Math.floor((dayOfEra - Math.floor(dayOfEra / 1460) + Math.floor(dayOfEra / 36524) - Math.floor(dayOfEra / 146096)) / 365);\n const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));\n const monthFromMarch = Math.floor((5 * dayOfYear + 2) / 153);\n const day = dayOfYear - Math.floor((153 * monthFromMarch + 2) / 5) + 1;\n const month = monthFromMarch < 10 ? monthFromMarch + 3 : monthFromMarch - 9;\n const year = yearOfEra + era * 400 + (month <= 2 ? 1 : 0);\n return {\n year, month, day,\n dayOfWeek: (days + 1) % 7,\n hour: Math.floor(seconds / 3600),\n minute: Math.floor(seconds / 60) % 60,\n second: seconds % 60,\n fraction: Number(within % ticksPerSecond),\n };\n}\n\nconst badFormat = 'Input string was not in a correct format.';\n\n/** `new DateTime(ticks).ToString(format, culture)`. A format .NET refuses throws a PivotFormatError, as\n * C# throws its FormatException. */\nexport function formatDate(ticks: bigint, format: string | undefined = '', culture: DateCulture): string {\n const text = format;\n const parts = dateParts(ticks);\n if (text.length === 0) return custom(parts, `${culture.shortDate} ${culture.longTime}`, culture);\n if (text.length === 1) return custom(parts, ...standard(text, culture));\n return custom(parts, text, culture);\n}\n\nconst invariantDate: DateCulture = {\n shortDate: 'MM/dd/yyyy', longDate: 'dddd, dd MMMM yyyy', shortTime: 'HH:mm', longTime: 'HH:mm:ss',\n fullDateTime: 'dddd, dd MMMM yyyy HH:mm:ss', monthDay: 'MMMM dd', yearMonth: 'yyyy MMMM', am: 'AM', pm: 'PM',\n dateSeparator: '/', timeSeparator: ':', era: 'A.D.', useGenitive: false,\n days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n abbreviatedDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n abbreviatedMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n genitiveMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n abbreviatedGenitiveMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n};\n\n/** A standard format's pattern, and the culture it is written in: the invariant one for o, r, s and u. */\nfunction standard(letter: string, culture: DateCulture): [string, DateCulture] {\n switch (letter) {\n case 'd': return [culture.shortDate, culture];\n case 'D': return [culture.longDate, culture];\n case 'f': return [`${culture.longDate} ${culture.shortTime}`, culture];\n case 'F':\n case 'U': return [culture.fullDateTime, culture];\n case 'g': return [`${culture.shortDate} ${culture.shortTime}`, culture];\n case 'G': return [`${culture.shortDate} ${culture.longTime}`, culture];\n case 'm':\n case 'M': return [culture.monthDay, culture];\n case 'o':\n case 'O': return [\"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK\", invariantDate];\n case 'r':\n case 'R': return [\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\", invariantDate];\n case 's': return [\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\", invariantDate];\n case 't': return [culture.shortTime, culture];\n case 'T': return [culture.longTime, culture];\n case 'u': return [\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\", invariantDate];\n case 'y':\n case 'Y': return [culture.yearMonth, culture];\n default: throw new PivotFormatError(badFormat);\n }\n}\n\n/** How many times `format[at]` repeats from `at`. */\nfunction repeat(format: string, at: number): number {\n const ch = format.charAt(at);\n let end = at + 1;\n while (end < format.length && format.charAt(end) === ch) end++;\n return end - at;\n}\n\nfunction digits(value: number, length: number): string {\n return value.toString().padStart(length, '0');\n}\n\nfunction name(list: readonly string[], index: number): string {\n const found = list[index];\n if (found === undefined) throw new Error(`Internal: a culture's names miss ${index}.`);\n return found;\n}\n\n/** .NET's IsUseGenitiveForm: whether a `MMMM` at `at` stands next to a `d` or `dd`, before or after it. */\nfunction usesGenitive(format: string, at: number, length: number): boolean {\n let i = at - 1;\n while (i >= 0 && format.charAt(i) !== 'd') i--;\n if (i >= 0) {\n let count = 0;\n while (--i >= 0 && format.charAt(i) === 'd') count++;\n if (count <= 1) return true;\n }\n i = at + length;\n while (i < format.length && format.charAt(i) !== 'd') i++;\n if (i < format.length) {\n let count = 0;\n while (++i < format.length && format.charAt(i) === 'd') count++;\n if (count <= 1) return true;\n }\n return false;\n}\n\n/** A quoted run from `at`, its quote's own character ending it and a backslash taking the next: the text,\n * and how many characters it took. An unclosed quote is refused. */\nfunction quoted(format: string, at: number): [string, number] {\n const quote = format.charAt(at);\n let i = at + 1;\n let text = '';\n let closed = false;\n while (i < format.length) {\n const ch = format.charAt(i++);\n if (ch === quote) {\n closed = true;\n break;\n }\n if (ch === '\\\\') {\n if (i >= format.length) throw new PivotFormatError(badFormat);\n text += format.charAt(i++);\n } else {\n text += ch;\n }\n }\n if (!closed) throw new PivotFormatError(badFormat);\n return [text, i - at];\n}\n\n/** .NET's FormatCustomized for the Gregorian calendar, appending to `written`, the text so far. */\nfunction custom(parts: DateParts, format: string, culture: DateCulture, written = ''): string {\n let text = written;\n let i = 0;\n while (i < format.length) {\n const ch = format.charAt(i);\n let length: number;\n switch (ch) {\n case 'g':\n length = repeat(format, i);\n text += culture.era;\n break;\n case 'h': {\n length = repeat(format, i);\n const hour = parts.hour % 12;\n text += digits(hour === 0 ? 12 : hour, Math.min(length, 2));\n break;\n }\n case 'H':\n length = repeat(format, i);\n text += digits(parts.hour, Math.min(length, 2));\n break;\n case 'm':\n length = repeat(format, i);\n text += digits(parts.minute, Math.min(length, 2));\n break;\n case 's':\n length = repeat(format, i);\n text += digits(parts.second, Math.min(length, 2));\n break;\n case 'f':\n case 'F': {\n length = repeat(format, i);\n if (length > 7) throw new PivotFormatError(badFormat);\n let fraction = Math.floor(parts.fraction / 10 ** (7 - length));\n if (ch === 'f') {\n text += digits(fraction, length);\n } else {\n let effective = length;\n while (effective > 0 && fraction % 10 === 0) {\n fraction /= 10;\n effective--;\n }\n if (effective > 0) text += digits(fraction, effective);\n else if (text.endsWith('.')) text = text.slice(0, -1);\n }\n break;\n }\n case 't':\n length = repeat(format, i);\n if (length === 1) {\n const designator = parts.hour < 12 ? culture.am : culture.pm;\n if (designator.length >= 1) text += designator.charAt(0);\n } else {\n text += parts.hour < 12 ? culture.am : culture.pm;\n }\n break;\n case 'd':\n length = repeat(format, i);\n if (length <= 2) text += digits(parts.day, length);\n else if (length === 3) text += name(culture.abbreviatedDays, parts.dayOfWeek);\n else text += name(culture.days, parts.dayOfWeek);\n break;\n case 'M':\n length = repeat(format, i);\n if (length <= 2) {\n text += digits(parts.month, length);\n } else if (culture.useGenitive && usesGenitive(format, i, length)) {\n text += name(length === 3 ? culture.abbreviatedGenitiveMonths : culture.genitiveMonths, parts.month - 1);\n } else {\n text += name(length === 3 ? culture.abbreviatedMonths : culture.months, parts.month - 1);\n }\n break;\n case 'y':\n length = repeat(format, i);\n text += length <= 2 ? digits(parts.year % 100, length) : digits(parts.year, length);\n break;\n case 'z':\n // A clock value without a zone is written in the offset of UTC, where the C# engine runs.\n length = repeat(format, i);\n text += length === 1 ? '+0' : length === 2 ? '+00' : '+00:00';\n break;\n case 'K':\n length = 1;\n break;\n case ':':\n length = 1;\n text += culture.timeSeparator;\n break;\n case '/':\n length = 1;\n text += culture.dateSeparator;\n break;\n case '\\'':\n case '\"': {\n const [run, taken] = quoted(format, i);\n text += run;\n length = taken;\n break;\n }\n case '%': {\n const following = format.charAt(i + 1);\n if (i + 1 >= format.length || following === '%') throw new PivotFormatError(badFormat);\n text = custom(parts, following, culture, text);\n length = 2;\n break;\n }\n case '\\\\':\n if (i + 1 >= format.length) throw new PivotFormatError(badFormat);\n text += format.charAt(i + 1);\n length = 2;\n break;\n default:\n text += ch;\n length = 1;\n break;\n }\n i += length;\n }\n return text;\n}\n", "// A value of a record behind a cell as Show Details writes it (ADR-0059), as the Razor component's\n// PivotDetailsSheet.TextOf writes it: text as it is; a number or a date in its field's format under the report's\n// culture, or at most 15 significant digits, or the culture's short date (with its long time where the date has a\n// time of day), as an Item is labelled (ADR-0060); a Boolean as TRUE or FALSE; and a double that is not finite as\n// #NUM!. A format .NET cannot write the value in writes it in General, as `value.ToString(null, culture)` does.\n\nimport { cultureOf } from '../culture/culture-data';\nimport { PivotFormatError } from '../errors';\nimport type { PivotDetailValue } from '../source/pivot-source';\nimport { formatDate } from './date-text';\nimport { formatDecimal, formatDouble } from './number-text';\n\nconst ticksPerDay = 864_000_000_000n;\n\n// Written in `format`, or in General when .NET cannot write the value in it.\nfunction formatted(write: (format: string) => string, format: string): string {\n try {\n return write(format);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- a format .NET refuses for a value writes it in General, as the Razor component's TextOf does; anything else is thrown on\n if (error instanceof PivotFormatError) return write('');\n throw error;\n }\n}\n\n/**\n * A value of a record behind a cell, `value`, written as Show Details shows it in its field's column: in `format`,\n * the field's own format, where it is a number or a date, under `locale`, a BCP 47 tag or `invariant`. A Blank is\n * written as nothing.\n */\nexport function formatPivotDetailValue(value: PivotDetailValue, format: string | undefined, locale: string): string {\n if (value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n const { data } = cultureOf(locale);\n if (typeof value === 'bigint') {\n const fallback = value % ticksPerDay === 0n ? 'd' : 'G';\n // A field with no format of its own writes its dates as the culture's short date, or date and time, as the\n // Razor component's does.\n return formatted(f => formatDate(value, f, data.date), format ?? fallback);\n }\n if (typeof value === 'object') return formatted(f => formatDecimal(value, f, data.number), format ?? 'G15'); // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0060: a number with no format of its own is written to 15 significant digits\n if (!Number.isFinite(value)) return '#NUM!';\n return formatted(f => formatDouble(value, f, data.number), format ?? 'G15'); // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0060: a number with no format of its own is written to 15 significant digits\n}\n", "// The closed sets of names a Pivot Layout and a report are written in (ADR-0059/0060/0061), spelt as\n// the layout's JSON spells them (PivotLayoutJson, version 1), so a layout read from JSON is the layout.\n\n/** The type a Consumer declares for a Pivot Field (ADR-0060). It decides the defaults only: where a\n * ticked field goes, which Aggregation a new Value Field takes. Each Item's kind comes from the data. */\nexport type PivotFieldType = 'text' | 'number' | 'date' | 'boolean';\n\n/** The four places a Pivot Field stands, in Excel's words (ADR-0061). */\nexport type PivotArea = 'filters' | 'columns' | 'rows' | 'values';\n\n/** Where \u03A3 Values stands, when there are two or more Value Fields: innermost in Columns, Excel's default,\n * or in Rows (ADR-0060). */\nexport type PivotAxis = 'columns' | 'rows';\n\n/** How a Value Field summarises the records at a cell: Excel's \"Summarize Values By\" (ADR-0060). */\nexport type PivotAggregation =\n | 'sum' | 'count' | 'average' | 'max' | 'min' | 'product' | 'countNumbers' | 'stdDev' | 'stdDevp' | 'var' | 'varp';\n\n/** Every Aggregation, in the C# engine's order. */\nexport const pivotAggregations: readonly PivotAggregation[] = Object.freeze(\n ['sum', 'count', 'average', 'max', 'min', 'product', 'countNumbers', 'stdDev', 'stdDevp', 'var', 'varp']);\n\n/** How a Value Field's values are shown after aggregation (ADR-0060). */\nexport type PivotShowValuesAs = 'noCalculation' | 'percentOfGrandTotal' | 'percentOfColumnTotal' | 'percentOfRowTotal';\n\n/** Every Show Values As, in the C# engine's order: what Value Field Settings\u2026 offers. */\nexport const pivotShowValuesAsList: readonly PivotShowValuesAs[] = Object.freeze(\n ['noCalculation', 'percentOfGrandTotal', 'percentOfColumnTotal', 'percentOfRowTotal']);\n\n/** How a report sets out its row labels: Excel's \"Report Layout\" (ADR-0060). */\nexport type PivotReportForm = 'compact' | 'outline' | 'tabular';\n\n/** Ascending or descending, for an Item order; `(blank)` is last either way (ADR-0060). */\nexport type PivotSortDirection = 'ascending' | 'descending';\n\n/** The kind of an Item, which comes from its value (ADR-0060). {@link pivotItemKinds} is the ascending\n * order across kinds. */\nexport type PivotItemKind = 'number' | 'date' | 'text' | 'boolean' | 'error' | 'blank';\n\n/** Every Item kind, in the ascending order across kinds: numbers, dates, text, Booleans, `#NUM!`, then\n * `(blank)`. */\nexport const pivotItemKinds: readonly PivotItemKind[] = Object.freeze(['number', 'date', 'text', 'boolean', 'error', 'blank']);\n\n/** A part of a Date column a Pivot Field can be declared as: its year, quarter or month (ADR-0060). */\nexport type PivotDatePart = 'year' | 'quarter' | 'month';\n\n/** What a row of a report stands for (ADR-0059/0060): an Item of the innermost field, a group row, a\n * subtotal, or the grand total; or a Pending Row, kept for a sibling outside a Sibling Window and never shown\n * (ADR-0370 section 3). */\nexport type PivotRowRole = 'item' | 'group' | 'subtotal' | 'grandTotal' | 'pending';\n\n/** What a value column of a report stands for (ADR-0060). */\nexport type PivotColumnRole = 'item' | 'subtotal' | 'grandTotal';\n\n/** The C# engine's name of an Aggregation, as its messages write it: `Sum`, `CountNumbers`, `StdDevp`. */\nexport function aggregationTitle(aggregation: PivotAggregation): string {\n return aggregation.charAt(0).toUpperCase() + aggregation.slice(1);\n}\n\n/** The C# engine's name of an Item kind, as a key's text and its messages write it: `Text`, `Number`. */\nexport function itemKindTitle(kind: PivotItemKind): string {\n return kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n\n/** The order of an Item kind among the kinds, ascending. */\nexport function itemKindOrder(kind: PivotItemKind): number {\n return pivotItemKinds.indexOf(kind);\n}\n", "// An Item as a Pivot Layout writes it, and as the engine tells Items apart (ADR-0060). A key names an\n// Item by its kind and its invariant text: a number in its shortest round-trip form, a date as ISO, a\n// Boolean as TRUE or FALSE, text as it is, so a saved layout names the same Items under any locale. Two\n// keys of text are one Item when they differ only in case, as .NET's OrdinalIgnoreCase folds them.\n\nimport { ticksOf } from '@ex-grid/data';\nimport { compareOrdinalIgnoringCase, foldedText } from '../text/casing';\nimport { formatDate } from '../text/date-text';\nimport { invariantDates, invariantNumbers } from '../text/invariant';\nimport { formatDouble } from '../text/number-text';\nimport { itemKindOrder, itemKindTitle, type PivotItemKind } from '../layout/pivot-enums';\nimport { unreachable } from '../must';\n\n/** An Item as a Pivot Layout writes it: its kind and its invariant text, which a Blank has none of. */\nexport interface PivotItemKey {\n /** The Item's kind. */\n readonly kind: PivotItemKind;\n /** Its invariant text; absent only for a Blank. */\n readonly value?: string;\n}\n\n/** The text of `#NUM!`, the Item of a number no one can hold. */\nexport const pivotErrorText = '#NUM!';\n\n/** The format a date Item's key is written in, as .NET writes it. */\nconst keyDateFormat = \"yyyy-MM-dd'T'HH:mm:ss.FFFFFFF\";\n\n/** The Item `(blank)`. */\nexport const blankItemKey: PivotItemKey = Object.freeze({ kind: 'blank' });\n\n/** The Item `#NUM!`. */\nexport const errorItemKey: PivotItemKey = Object.freeze({ kind: 'error', value: pivotErrorText });\n\n/**\n * Names one Item, refusing a value that is not the invariant text of its kind: a key that could not name\n * any Item is a mapping bug, not an Item nobody has. A number's text is read as .NET reads a float (spaces,\n * a sign, a point and an exponent), and a date's as `yyyy-MM-ddTHH:mm:ss` with up to seven digits of a\n * second; the text is kept as it was given.\n */\nexport function pivotItemKey(kind: PivotItemKind, value?: string): PivotItemKey {\n switch (kind) {\n case 'blank':\n if (value !== undefined) throw new TypeError('A Blank Item has no value.');\n return blankItemKey;\n case 'number':\n if (value === undefined || numberOfText(value) === undefined) {\n throw new TypeError(`'${String(value)}' is not the invariant text of a finite number.`);\n }\n break;\n case 'date':\n if (value === undefined || ticksOfKeyText(value) === undefined) {\n throw new TypeError(`'${String(value)}' is not an ISO date (${keyDateFormat}).`);\n }\n break;\n case 'boolean':\n if (value !== 'TRUE' && value !== 'FALSE') throw new TypeError(`'${String(value)}' is not TRUE or FALSE.`);\n break;\n case 'text':\n if (typeof value !== 'string') throw new TypeError('A text Item has a value.');\n break;\n case 'error':\n if (value !== pivotErrorText) throw new TypeError(`The error Item is ${pivotErrorText}.`);\n return errorItemKey;\n default:\n throw new RangeError(`Unknown PivotItemKind '${String(kind satisfies never)}'.`);\n }\n return Object.freeze({ kind, value });\n}\n\n/** The key of a text Item. */\nexport function textItemKey(text: string): PivotItemKey {\n return Object.freeze({ kind: 'text', value: text });\n}\n\n/** The key of a number Item; a number that is not finite is `#NUM!`, and -0 is 0. */\nexport function numberItemKey(number: number): PivotItemKey {\n if (!Number.isFinite(number)) return errorItemKey;\n return Object.freeze({ kind: 'number', value: formatDouble(number === 0 ? 0 : number, 'R', invariantNumbers) });\n}\n\n/** The key of a date Item, by its clock value in DateTime ticks. */\nexport function dateItemKey(ticks: bigint): PivotItemKey {\n return Object.freeze({ kind: 'date', value: formatDate(ticks, keyDateFormat, invariantDates) });\n}\n\n/** The key of a Boolean Item. */\nexport function booleanItemKey(value: boolean): PivotItemKey {\n return Object.freeze({ kind: 'boolean', value: value ? 'TRUE' : 'FALSE' });\n}\n\n/** Whether two keys name one Item: the same kind and text, text compared ignoring case. */\nexport function itemKeysEqual(a: PivotItemKey, b: PivotItemKey): boolean {\n if (a.kind !== b.kind) return false;\n if (a.kind === 'text') return compareOrdinalIgnoringCase(a.value ?? '', b.value ?? '') === 0; // oxlint-disable-line ex-grid/no-stand-in-default -- a text key always has a value\n return a.value === b.value;\n}\n\n/** `Text:East`, `Number:1234.5`, `Blank`: a key as the C# engine's messages write it. */\nexport function itemKeyText(key: PivotItemKey): string {\n return key.value === undefined ? itemKindTitle(key.kind) : `${itemKindTitle(key.kind)}:${key.value}`;\n}\n\n/** What a public key compares as, as a Map key: its kind, and its text folded where text is compared\n * ignoring case. Two keys equal by {@link itemKeysEqual} have one. */\nexport function publicKeyId(key: PivotItemKey): string {\n return key.kind === 'text' ? `text:${foldedText(key.value ?? '')}` : `${key.kind}:${key.value ?? ''}`; // oxlint-disable-line ex-grid/no-stand-in-default -- a Blank's key has no text, and every other kind's has one\n}\n\n// ---- reading a key's text --------------------------------------------------------------------------\n\n/** A number's text read as .NET's `double.TryParse(text, NumberStyles.Float, InvariantCulture)` reads it,\n * or `undefined` where it does not read or is not finite. */\nexport function numberOfText(text: string): number | undefined {\n const match = /^[\\t-\\r ]*([+-]?)(\\d*)(?:\\.(\\d*))?(?:[eE]([+-]?\\d+))?[\\t-\\r ]*$/.exec(text);\n if (match === null) return undefined;\n const [, sign = '', whole = '', fraction = '', exponent = '0'] = match;\n if (whole.length === 0 && fraction.length === 0) return undefined;\n const number = Number(`${sign}${whole.length === 0 ? '0' : whole}.${fraction}e${exponent}`);\n return Number.isFinite(number) ? number : undefined;\n}\n\n/** A date key's text read as .NET's `DateTime.TryParseExact(text, \"yyyy-MM-dd'T'HH:mm:ss.FFFFFFF\")` reads\n * it, as ticks, or `undefined` where it does not read. */\nexport function ticksOfKeyText(text: string): bigint | undefined {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{0,7}))?$/.exec(text);\n if (match === null) return undefined;\n const [, y = '', mo = '', d = '', h = '', mi = '', s = '', f = ''] = match;\n const year = Number(y);\n const month = Number(mo);\n const day = Number(d);\n const hour = Number(h);\n const minute = Number(mi);\n const second = Number(s);\n if (year < 1 || month < 1 || month > 12 || day < 1 || day > daysIn(year, month) || hour > 23 || minute > 59 || second > 59) {\n return undefined;\n }\n return ticksOf(year, month, day, hour, minute, second, Number(f.padEnd(7, '0')));\n}\n\nfunction daysIn(year: number, month: number): number {\n if (month === 2) return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28;\n return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\n// ---- the engine's own key ----------------------------------------------------------------------------\n\n/** An Item's identity while the engine sorts values into Items: its kind, and its number, clock value or\n * text. Equal as Items are told apart; {@link keyIdOf} says it as a Map key. */\nexport interface ItemKey {\n readonly kind: PivotItemKind;\n /** The number of a number Item, never -0; 0 otherwise. */\n readonly number: number;\n /** The clock ticks of a date; 0 or 1 for a Boolean; 0 otherwise. */\n readonly ticks: bigint;\n /** The text of a text Item; empty otherwise. */\n readonly text: string;\n}\n\nconst blankKey: ItemKey = Object.freeze({ kind: 'blank', number: 0, ticks: 0n, text: '' });\nconst errorKey: ItemKey = Object.freeze({ kind: 'error', number: 0, ticks: 0n, text: '' });\n\nexport const ItemKeys = Object.freeze({\n blank: blankKey,\n error: errorKey,\n text: (text: string): ItemKey => Object.freeze({ kind: 'text', number: 0, ticks: 0n, text }),\n number: (number: number): ItemKey => Number.isFinite(number)\n ? Object.freeze({ kind: 'number', number: number === 0 ? 0 : number, ticks: 0n, text: '' })\n : errorKey,\n date: (ticks: bigint): ItemKey => Object.freeze({ kind: 'date', number: 0, ticks, text: '' }),\n boolean: (value: boolean): ItemKey => Object.freeze({ kind: 'boolean', number: 0, ticks: value ? 1n : 0n, text: '' }),\n});\n\n/** What an Item compares as, as a Map key. */\nexport function keyIdOf(key: ItemKey): string {\n switch (key.kind) {\n case 'number': return `n${String(key.number)}`;\n case 'date': return `d${key.ticks}`;\n case 'boolean': return `b${key.ticks}`;\n case 'text': return `t${foldedText(key.text)}`;\n case 'error': return 'e';\n case 'blank': return 'k';\n default: return unreachable(key.kind);\n }\n}\n\n/** Whether two keys are one Item. */\nexport function sameItem(a: ItemKey, b: ItemKey): boolean {\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'number': return a.number === b.number;\n case 'date':\n case 'boolean': return a.ticks === b.ticks;\n case 'text': return compareOrdinalIgnoringCase(a.text, b.text) === 0;\n case 'error':\n case 'blank': return true;\n default: return unreachable(a.kind);\n }\n}\n\n/** The engine's key of a public one. */\nexport function fromPublicKey(key: PivotItemKey): ItemKey {\n switch (key.kind) {\n case 'blank': return blankKey;\n case 'error': return errorKey;\n case 'text': return ItemKeys.text(must(key.value));\n case 'number': return ItemKeys.number(must(numberOfText(must(key.value))));\n case 'date': return ItemKeys.date(must(ticksOfKeyText(must(key.value))));\n case 'boolean': return ItemKeys.boolean(key.value === 'TRUE');\n default: return unreachable(key.kind);\n }\n}\n\n/** The value an Item hands an Order Key and a format (ADR-0060): a text Item's text, a number's number, a date's\n * clock ticks, a Boolean's Boolean; `undefined` for a Blank and for #NUM!, which no key orders. */\nexport function itemValueOf(key: ItemKey): string | number | bigint | boolean | undefined {\n switch (key.kind) {\n case 'text': return key.text;\n case 'number': return key.number;\n case 'date': return key.ticks;\n case 'boolean': return key.ticks === 1n;\n case 'error':\n case 'blank': return undefined;\n default: return unreachable(key.kind);\n }\n}\n\n/** The value the Item `key` names hands an Order Key (ADR-0060): a text Item's text, a number's number, a date's\n * clock ticks, a Boolean's Boolean; `undefined` for a Blank and for #NUM!. A source that answers an Order Key's\n * keys for the Items it names files them under this. */\nexport function pivotItemValue(key: PivotItemKey): string | number | bigint | boolean | undefined {\n return itemValueOf(fromPublicKey(key));\n}\n\n/** The public key of the engine's. */\nexport function toPublicKey(key: ItemKey): PivotItemKey {\n switch (key.kind) {\n case 'blank': return blankItemKey;\n case 'error': return errorItemKey;\n case 'text': return textItemKey(key.text);\n case 'number': return numberItemKey(key.number);\n case 'date': return dateItemKey(key.ticks);\n case 'boolean': return booleanItemKey(key.ticks === 1n);\n default: return unreachable(key.kind);\n }\n}\n\n/** The order a source lists Items in when it knows no locale (ADR-0066): by kind, then numbers and dates\n * by value, FALSE before TRUE, and text ordinally ignoring case. */\nexport function compareInvariant(x: ItemKey, y: ItemKey): number {\n if (x.kind !== y.kind) return Math.sign(itemKindOrder(x.kind) - itemKindOrder(y.kind));\n switch (x.kind) {\n case 'number': return x.number < y.number ? -1 : x.number > y.number ? 1 : 0;\n case 'date':\n case 'boolean': return x.ticks < y.ticks ? -1 : x.ticks > y.ticks ? 1 : 0;\n case 'text': return compareOrdinalIgnoringCase(x.text, y.text);\n case 'error':\n case 'blank': return 0;\n default: return unreachable(x.kind);\n }\n}\n\nfunction must<T>(value: T | undefined): T {\n if (value === undefined) throw new Error('Internal: a public key that was checked does not read.');\n return value;\n}\n", "// Generated by dotnet/tools/pivot-oracle (`dotnet run --project dotnet/tools/pivot-oracle -- casing <this file>`):\n// .NET's simple upper case, ToUpperInvariant's, of every code point from U+0080 that has one, so text\n// folds as .NET folds it whatever Unicode the JavaScript engine carries (casing.ts). Edit the\n// generator, not this file.\n\n/** Runs of [first, last, delta, step]: every step-th code point from first to last upper-cases to\n * itself plus delta. Ordered by first. */\nexport const upperRuns: readonly (readonly [number, number, number, number])[] = [\n [0xB5, 0xB5, 743, 1],\n [0xE0, 0xF6, -32, 1],\n [0xF8, 0xFE, -32, 1],\n [0xFF, 0xFF, 121, 1],\n [0x101, 0x12F, -1, 2],\n [0x133, 0x137, -1, 2],\n [0x13A, 0x148, -1, 2],\n [0x14B, 0x177, -1, 2],\n [0x17A, 0x17E, -1, 2],\n [0x17F, 0x17F, -300, 1],\n [0x180, 0x180, 195, 1],\n [0x183, 0x185, -1, 2],\n [0x188, 0x188, -1, 1],\n [0x18C, 0x18C, -1, 1],\n [0x192, 0x192, -1, 1],\n [0x195, 0x195, 97, 1],\n [0x199, 0x199, -1, 1],\n [0x19A, 0x19A, 163, 1],\n [0x19B, 0x19B, 42561, 1],\n [0x19E, 0x19E, 130, 1],\n [0x1A1, 0x1A5, -1, 2],\n [0x1A8, 0x1A8, -1, 1],\n [0x1AD, 0x1AD, -1, 1],\n [0x1B0, 0x1B0, -1, 1],\n [0x1B4, 0x1B6, -1, 2],\n [0x1B9, 0x1B9, -1, 1],\n [0x1BD, 0x1BD, -1, 1],\n [0x1BF, 0x1BF, 56, 1],\n [0x1C5, 0x1C5, -1, 1],\n [0x1C6, 0x1C6, -2, 1],\n [0x1C8, 0x1C8, -1, 1],\n [0x1C9, 0x1C9, -2, 1],\n [0x1CB, 0x1CB, -1, 1],\n [0x1CC, 0x1CC, -2, 1],\n [0x1CE, 0x1DC, -1, 2],\n [0x1DD, 0x1DD, -79, 1],\n [0x1DF, 0x1EF, -1, 2],\n [0x1F2, 0x1F2, -1, 1],\n [0x1F3, 0x1F3, -2, 1],\n [0x1F5, 0x1F5, -1, 1],\n [0x1F9, 0x21F, -1, 2],\n [0x223, 0x233, -1, 2],\n [0x23C, 0x23C, -1, 1],\n [0x23F, 0x240, 10815, 1],\n [0x242, 0x242, -1, 1],\n [0x247, 0x24F, -1, 2],\n [0x250, 0x250, 10783, 1],\n [0x251, 0x251, 10780, 1],\n [0x252, 0x252, 10782, 1],\n [0x253, 0x253, -210, 1],\n [0x254, 0x254, -206, 1],\n [0x256, 0x257, -205, 1],\n [0x259, 0x259, -202, 1],\n [0x25B, 0x25B, -203, 1],\n [0x25C, 0x25C, 42319, 1],\n [0x260, 0x260, -205, 1],\n [0x261, 0x261, 42315, 1],\n [0x263, 0x263, -207, 1],\n [0x264, 0x264, 42343, 1],\n [0x265, 0x265, 42280, 1],\n [0x266, 0x266, 42308, 1],\n [0x268, 0x268, -209, 1],\n [0x269, 0x269, -211, 1],\n [0x26A, 0x26A, 42308, 1],\n [0x26B, 0x26B, 10743, 1],\n [0x26C, 0x26C, 42305, 1],\n [0x26F, 0x26F, -211, 1],\n [0x271, 0x271, 10749, 1],\n [0x272, 0x272, -213, 1],\n [0x275, 0x275, -214, 1],\n [0x27D, 0x27D, 10727, 1],\n [0x280, 0x280, -218, 1],\n [0x282, 0x282, 42307, 1],\n [0x283, 0x283, -218, 1],\n [0x287, 0x287, 42282, 1],\n [0x288, 0x288, -218, 1],\n [0x289, 0x289, -69, 1],\n [0x28A, 0x28B, -217, 1],\n [0x28C, 0x28C, -71, 1],\n [0x292, 0x292, -219, 1],\n [0x29D, 0x29D, 42261, 1],\n [0x29E, 0x29E, 42258, 1],\n [0x345, 0x345, 84, 1],\n [0x371, 0x373, -1, 2],\n [0x377, 0x377, -1, 1],\n [0x37B, 0x37D, 130, 1],\n [0x3AC, 0x3AC, -38, 1],\n [0x3AD, 0x3AF, -37, 1],\n [0x3B1, 0x3C1, -32, 1],\n [0x3C2, 0x3C2, -31, 1],\n [0x3C3, 0x3CB, -32, 1],\n [0x3CC, 0x3CC, -64, 1],\n [0x3CD, 0x3CE, -63, 1],\n [0x3D0, 0x3D0, -62, 1],\n [0x3D1, 0x3D1, -57, 1],\n [0x3D5, 0x3D5, -47, 1],\n [0x3D6, 0x3D6, -54, 1],\n [0x3D7, 0x3D7, -8, 1],\n [0x3D9, 0x3EF, -1, 2],\n [0x3F0, 0x3F0, -86, 1],\n [0x3F1, 0x3F1, -80, 1],\n [0x3F2, 0x3F2, 7, 1],\n [0x3F3, 0x3F3, -116, 1],\n [0x3F5, 0x3F5, -96, 1],\n [0x3F8, 0x3F8, -1, 1],\n [0x3FB, 0x3FB, -1, 1],\n [0x430, 0x44F, -32, 1],\n [0x450, 0x45F, -80, 1],\n [0x461, 0x481, -1, 2],\n [0x48B, 0x4BF, -1, 2],\n [0x4C2, 0x4CE, -1, 2],\n [0x4CF, 0x4CF, -15, 1],\n [0x4D1, 0x52F, -1, 2],\n [0x561, 0x586, -48, 1],\n [0x10D0, 0x10FA, 3008, 1],\n [0x10FD, 0x10FF, 3008, 1],\n [0x13F8, 0x13FD, -8, 1],\n [0x1C80, 0x1C80, -6254, 1],\n [0x1C81, 0x1C81, -6253, 1],\n [0x1C82, 0x1C82, -6244, 1],\n [0x1C83, 0x1C84, -6242, 1],\n [0x1C85, 0x1C85, -6243, 1],\n [0x1C86, 0x1C86, -6236, 1],\n [0x1C87, 0x1C87, -6181, 1],\n [0x1C88, 0x1C88, 35266, 1],\n [0x1C8A, 0x1C8A, -1, 1],\n [0x1D79, 0x1D79, 35332, 1],\n [0x1D7D, 0x1D7D, 3814, 1],\n [0x1D8E, 0x1D8E, 35384, 1],\n [0x1E01, 0x1E95, -1, 2],\n [0x1E9B, 0x1E9B, -59, 1],\n [0x1EA1, 0x1EFF, -1, 2],\n [0x1F00, 0x1F07, 8, 1],\n [0x1F10, 0x1F15, 8, 1],\n [0x1F20, 0x1F27, 8, 1],\n [0x1F30, 0x1F37, 8, 1],\n [0x1F40, 0x1F45, 8, 1],\n [0x1F51, 0x1F57, 8, 2],\n [0x1F60, 0x1F67, 8, 1],\n [0x1F70, 0x1F71, 74, 1],\n [0x1F72, 0x1F75, 86, 1],\n [0x1F76, 0x1F77, 100, 1],\n [0x1F78, 0x1F79, 128, 1],\n [0x1F7A, 0x1F7B, 112, 1],\n [0x1F7C, 0x1F7D, 126, 1],\n [0x1F80, 0x1F87, 8, 1],\n [0x1F90, 0x1F97, 8, 1],\n [0x1FA0, 0x1FA7, 8, 1],\n [0x1FB0, 0x1FB1, 8, 1],\n [0x1FB3, 0x1FB3, 9, 1],\n [0x1FBE, 0x1FBE, -7205, 1],\n [0x1FC3, 0x1FC3, 9, 1],\n [0x1FD0, 0x1FD1, 8, 1],\n [0x1FE0, 0x1FE1, 8, 1],\n [0x1FE5, 0x1FE5, 7, 1],\n [0x1FF3, 0x1FF3, 9, 1],\n [0x214E, 0x214E, -28, 1],\n [0x2170, 0x217F, -16, 1],\n [0x2184, 0x2184, -1, 1],\n [0x24D0, 0x24E9, -26, 1],\n [0x2C30, 0x2C5F, -48, 1],\n [0x2C61, 0x2C61, -1, 1],\n [0x2C65, 0x2C65, -10795, 1],\n [0x2C66, 0x2C66, -10792, 1],\n [0x2C68, 0x2C6C, -1, 2],\n [0x2C73, 0x2C73, -1, 1],\n [0x2C76, 0x2C76, -1, 1],\n [0x2C81, 0x2CE3, -1, 2],\n [0x2CEC, 0x2CEE, -1, 2],\n [0x2CF3, 0x2CF3, -1, 1],\n [0x2D00, 0x2D25, -7264, 1],\n [0x2D27, 0x2D27, -7264, 1],\n [0x2D2D, 0x2D2D, -7264, 1],\n [0xA641, 0xA66D, -1, 2],\n [0xA681, 0xA69B, -1, 2],\n [0xA723, 0xA72F, -1, 2],\n [0xA733, 0xA76F, -1, 2],\n [0xA77A, 0xA77C, -1, 2],\n [0xA77F, 0xA787, -1, 2],\n [0xA78C, 0xA78C, -1, 1],\n [0xA791, 0xA793, -1, 2],\n [0xA794, 0xA794, 48, 1],\n [0xA797, 0xA7A9, -1, 2],\n [0xA7B5, 0xA7C3, -1, 2],\n [0xA7C8, 0xA7CA, -1, 2],\n [0xA7CD, 0xA7CD, -1, 1],\n [0xA7D1, 0xA7D1, -1, 1],\n [0xA7D7, 0xA7DB, -1, 2],\n [0xA7F6, 0xA7F6, -1, 1],\n [0xAB53, 0xAB53, -928, 1],\n [0xAB70, 0xABBF, -38864, 1],\n [0xFF41, 0xFF5A, -32, 1],\n [0x10428, 0x1044F, -40, 1],\n [0x104D8, 0x104FB, -40, 1],\n [0x10597, 0x105A1, -39, 1],\n [0x105A3, 0x105B1, -39, 1],\n [0x105B3, 0x105B9, -39, 1],\n [0x105BB, 0x105BC, -39, 1],\n [0x10CC0, 0x10CF2, -64, 1],\n [0x10D70, 0x10D85, -32, 1],\n [0x118C0, 0x118DF, -32, 1],\n [0x16E60, 0x16E7F, -32, 1],\n [0x1E922, 0x1E943, -34, 1],\n];\n", "// Text compared as the C# engine compares it: two spellings that differ only in case are one Item\n// (ADR-0060), as .NET's OrdinalIgnoreCase folds them, a column's name upper-cases an Item invariantly and\n// escapes it as Uri.EscapeDataString does, and a label orders by the culture's collation, ignoring case,\n// ties broken ordinally. dotnet/tools/pivot-oracle holds each to .NET.\n\nimport { elementAt } from '../must';\nimport { upperRuns } from './upper-table';\n\n/** A way .NET upper-cases text: the code points it leaves as they are, beyond those .NET's table leaves. */\ninterface Casing {\n readonly kept: ReadonlySet<number>;\n}\n\n// ToUpperInvariant is the table itself; OrdinalIgnoreCase keeps the long s as it is.\nconst invariantCasing: Casing = { kept: new Set() };\nconst ordinalCasing: Casing = { kept: new Set([0x17F]) };\n\n/** A code point's simple upper case, as .NET's table holds it (upper-table.ts), never the JavaScript\n * engine's: its full mapping writes \u1FB3 as two code points, and its Unicode is its own version. */\nfunction upperOf(codePoint: number, casing: Casing): number {\n if (codePoint < 0x80) return codePoint >= 0x61 && codePoint <= 0x7A ? codePoint - 0x20 : codePoint;\n if (casing.kept.has(codePoint)) return codePoint;\n let low = 0;\n let high = upperRuns.length - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const [first, last, delta, step] = elementAt(upperRuns, middle);\n if (codePoint < first) {\n high = middle - 1;\n } else if (codePoint > last) {\n low = middle + 1;\n } else {\n return (codePoint - first) % step === 0 ? codePoint + delta : codePoint;\n }\n }\n return codePoint;\n}\n\nfunction upperCased(text: string, casing: Casing): string {\n // oxlint-disable-next-line no-control-regex -- an all-ASCII text upper-cases as JavaScript's own\n if (/^[\\x00-\\x7F]*$/.test(text)) return text.toUpperCase();\n let result = '';\n for (const ch of text) {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) throw new Error('Internal: an empty character.');\n result += String.fromCodePoint(upperOf(codePoint, casing));\n }\n return result;\n}\n\n/** The text upper-cased one code point at a time, as `ToUpperInvariant` maps it. */\nexport function upperInvariant(text: string): string {\n return upperCased(text, invariantCasing);\n}\n\n/** What two texts equal under OrdinalIgnoreCase share: a Map key for an Item's text. */\nexport function foldedText(text: string): string {\n return upperCased(text, ordinalCasing);\n}\n\n/** -1, 0 or 1 as `a` sorts before, with or after `b` ordinally, by UTF-16 code unit. */\nexport function compareOrdinal(a: string, b: string): number {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n}\n\n/** `string.Compare(a, b, StringComparison.OrdinalIgnoreCase)`'s sign. */\nexport function compareOrdinalIgnoringCase(a: string, b: string): number {\n return compareOrdinal(foldedText(a), foldedText(b));\n}\n\n/** `Uri.EscapeDataString`: every UTF-8 byte but the unreserved letters, digits and `-._~` as `%XX`. */\nexport function escapeDataString(text: string): string {\n // A lone surrogate has no UTF-8; .NET writes the replacement character in its place.\n const wellFormed = text.replace(/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g, '\\uFFFD');\n return encodeURIComponent(wellFormed).replace(/[!'()*]/g, (ch) => `%${ch.charCodeAt(0).toString(16).toUpperCase()}`);\n}\n\n// What .NET's char.IsWhiteSpace holds a space: NEL is one, and the byte order mark, which JavaScript's trim\n// takes away, is not.\nconst netWhiteSpace = /^[\\t\\n\\v\\f\\r \\u0085\\u00A0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]*$/u;\n\n/** Whether nothing is left of the text once .NET's `Trim` has taken its white space away. */\nexport function isWhiteSpaceOnly(text: string): boolean {\n return netWhiteSpace.test(text);\n}\n", "// The invariant culture's conventions, and the raw, locale-free text of a value: what a copy carries and a\n// grid's raw form reads back (ADR-0060), the exact decimal's own digits or the double's round trip.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport type { DateCulture, NumberCulture } from '../culture/culture-data';\nimport { cultureTable } from '../culture/culture-table';\nimport { defined } from '../must';\nimport { formatDecimal, formatDouble } from './number-text';\n\nconst invariant = defined(cultureTable['invariant'], 'the invariant culture');\n\n/** The invariant culture's number conventions. */\nexport const invariantNumbers: NumberCulture = invariant.number;\n\n/** The invariant culture's date conventions. */\nexport const invariantDates: DateCulture = invariant.date;\n\n/** A decimal's invariant text, as C#'s `ToString(null, CultureInfo.InvariantCulture)` writes it. */\nexport function decimalRaw(value: SnapshotDecimal): string {\n return formatDecimal(value, undefined, invariantNumbers);\n}\n\n/** A double's round-trip text, as C#'s `ToString(\"R\", CultureInfo.InvariantCulture)` writes it. */\nexport function doubleRaw(value: number): string {\n return formatDouble(value, 'R', invariantNumbers);\n}\n", "// C#'s decimal, as far as the engine computes in one (ADR-0060, ADR-0370 \u00A73): a whole number of at most\n// 96 bits and a scale of 0 to 28 decimal places, the Snapshot's Decimal. Money is summed in it exactly, by\n// counting decimal places, never by adding doubles. Each operation is .NET's: a result too wide for 96\n// bits gives up decimal places, rounded half to even, and one whose whole part is too wide overflows, which\n// the caller turns into Excel's double. The Script Core's exact-decimal.ts says the same; the packages\n// share no code, so each carries its own.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport { elementAt } from '../must';\n\nconst limit = 1n << 96n;\nconst maxScale = 28;\n\n/** Zero, canonical. */\nexport const decimalZero: SnapshotDecimal = Object.freeze({ mantissa: 0n, scale: 0 });\n\n// 10^k for k = 0 to 28 as doubles, the table .NET's VarR8FromDec divides by; every one to 1e22 is exact.\nconst doublePowers: readonly number[] = Object.freeze([\n 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14,\n 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28,\n]);\n\n/** 10^`power` as a double, for a power from 0 to 28. */\nexport function doubleTenTo(power: number): number {\n return elementAt(doublePowers, power);\n}\n\nlet bigPowers: readonly bigint[] | undefined;\n\n/** 10^`power` as a bigint, for a power from 0 to 28, from a table: every scale a decimal has, and every\n * difference of two. */\nfunction tenToThe(power: number): bigint {\n bigPowers ??= Object.freeze(Array.from({ length: maxScale + 1 }, (_, n) => 10n ** BigInt(n)));\n return elementAt(bigPowers, power);\n}\n\n/** A whole number as a decimal, which the caller knows is narrower than 96 bits. */\nexport function decimalOfWhole(value: bigint): SnapshotDecimal {\n if (value >= limit || value <= -limit) throw new Error(`Internal: ${value} is wider than a decimal.`);\n return Object.freeze({ mantissa: value, scale: 0 });\n}\n\n/** `a` + `b` as C#'s decimal adds them, at the larger of their scales, or `undefined` where C# overflows. */\nexport function decimalAdd(a: SnapshotDecimal, b: SnapshotDecimal): SnapshotDecimal | undefined {\n const scale = Math.max(a.scale, b.scale);\n return fitted(scaledTo(a, scale) + scaledTo(b, scale), scale);\n}\n\n/** `a` \u00F7 `count` as C#'s decimal divides by a whole count: as many decimal places as 96 bits hold, to 28,\n * the last rounded half to even. */\nexport function decimalDivide(a: SnapshotDecimal, count: number): SnapshotDecimal {\n if (!Number.isSafeInteger(count) || count <= 0) throw new RangeError(`A decimal is divided by a count from 1, not ${count}.`);\n const divisor = BigInt(count);\n for (let scale = maxScale; scale >= a.scale; scale--) {\n const quotient = roundedQuotient(scaledTo(a, scale), divisor);\n if (abs(quotient) < limit) return decimalCanonical({ mantissa: quotient, scale });\n }\n // The quotient at `a`'s own scale is no larger than `a`, which fits.\n throw new Error(`Internal: a decimal \u00F7 ${count} fits at no scale.`);\n}\n\n/** -1, 0 or 1 as `a` is below, equal to or above `b`. */\nexport function decimalCompare(a: SnapshotDecimal, b: SnapshotDecimal): number {\n const scale = Math.max(a.scale, b.scale);\n const left = scaledTo(a, scale);\n const right = scaledTo(b, scale);\n if (left < right) return -1;\n return left > right ? 1 : 0;\n}\n\n/** Whether two decimals are one value, whatever their scales. */\nexport function decimalEquals(a: SnapshotDecimal, b: SnapshotDecimal): boolean {\n return decimalCompare(a, b) === 0;\n}\n\n/** The double C# converts a decimal to: .NET's VarR8FromDec, which adds the two halves of the mantissa and\n * divides by the power of ten in double arithmetic, so the last bit can differ from the nearest double. */\nexport function decimalToNumber(value: SnapshotDecimal): number {\n const magnitude = abs(value.mantissa);\n const low = Number(magnitude & ((1n << 64n) - 1n));\n const high = Number(magnitude >> 64n);\n const result = (low + high * 18446744073709551616) / doubleTenTo(value.scale);\n return value.mantissa < 0n ? -result : result;\n}\n\n/** The value without trailing zeros, as C#'s canonical form writes it. */\nexport function decimalCanonical(value: SnapshotDecimal): SnapshotDecimal {\n let digits = value.mantissa;\n let places = value.scale;\n while (places > 0 && digits % 10n === 0n) {\n digits /= 10n;\n places -= 1;\n }\n if (digits === value.mantissa && places === value.scale && Object.isFrozen(value)) return value;\n return Object.freeze({ mantissa: digits, scale: digits === 0n ? 0 : places });\n}\n\n/**\n * An exact sum, a whole number of any width at a power of ten, as the decimal C# finishes it into: the one\n * form of the value, without trailing zeros, or `undefined` where no decimal holds it \u2014 more than 96 bits\n * once the trailing zeros are gone, or more than 28 places.\n */\nexport function decimalOfSum(value: bigint, scale: number): SnapshotDecimal | undefined {\n const canonical = canonicalWide(value, scale);\n if (canonical.scale > maxScale || abs(canonical.mantissa) >= limit) return undefined;\n return Object.freeze(canonical);\n}\n\n/** The double of an exact sum no decimal holds: its one form's whole number divided by its power of ten,\n * as C# divides an Int128 by `Math.Pow(10, scale)`. */\nexport function doubleOfSum(value: bigint, scale: number): number {\n const canonical = canonicalWide(value, scale);\n return Number(canonical.mantissa) / doubleTenTo(canonical.scale);\n}\n\nfunction canonicalWide(value: bigint, scale: number): { mantissa: bigint; scale: number } {\n if (value === 0n) return { mantissa: 0n, scale: 0 };\n let digits = value;\n let places = scale;\n while (places > 0 && digits % 10n === 0n) {\n digits /= 10n;\n places -= 1;\n }\n return { mantissa: digits, scale: places };\n}\n\nconst wideMost = (1n << 127n) - 1n;\nconst wideLeast = -(1n << 127n);\n\n/**\n * `a` \u00D7 10^-`aScale` plus `b` \u00D7 10^-`bScale` at the larger scale, as C#'s `Exactly.TryAdd` adds two exact sums\n * held in 128 bits, or `undefined` where either, at that scale, or their sum leaves 128 bits: the sum is\n * Excel's double from then on (ADR-0060).\n */\nexport function wideAdd(a: bigint, aScale: number, b: bigint, bScale: number): { sum: bigint; scale: number } | undefined {\n const scale = Math.max(aScale, bScale);\n const x = wideRescaled(a, aScale, scale);\n const y = wideRescaled(b, bScale, scale);\n if (x === undefined || y === undefined) return undefined;\n const sum = x + y;\n return sum > wideMost || sum < wideLeast ? undefined : { sum, scale };\n}\n\n// A whole number of 128 bits moved to a larger scale, or `undefined` where it would leave them: C#'s\n// TryRescale, which refuses a magnitude above Int128.MaxValue / 10^k.\nfunction wideRescaled(value: bigint, from: number, to: number): bigint | undefined {\n if (from === to || value === 0n) return value;\n const most = wideMost / tenToThe(to - from);\n return value > most || value < -most ? undefined : value * tenToThe(to - from);\n}\n\n/** The double of an exact sum as C#'s `Exactly.ToDouble` takes it: the decimal's, where a decimal holds the\n * sum, otherwise the quotient of its one form. */\nexport function doubleOfWide(value: bigint, scale: number): number {\n const exact = decimalOfSum(value, scale);\n return exact === undefined ? doubleOfSum(value, scale) : decimalToNumber(exact);\n}\n\n/** `value`'s whole number at `scale`, which is at least its own. */\nexport function scaledTo(value: SnapshotDecimal, scale: number): bigint {\n return scale === value.scale ? value.mantissa : value.mantissa * tenToThe(scale - value.scale);\n}\n\n/** An exact result held in 96 bits: decimal places given up, rounded once, half to even, until it fits,\n * or `undefined` where even the whole part does not. Trailing zeros are kept, as C# keeps them. */\nfunction fitted(mantissa: bigint, scale: number): SnapshotDecimal | undefined {\n for (let dropped = 0; dropped <= scale; dropped++) {\n const kept = dropped === 0 ? mantissa : roundedQuotient(mantissa, tenToThe(dropped));\n if (abs(kept) < limit) return Object.freeze({ mantissa: kept, scale: scale - dropped });\n }\n return undefined;\n}\n\n/** `numerator` \u00F7 `divisor` (positive), a tie rounded to the even quotient. */\nfunction roundedQuotient(numerator: bigint, divisor: bigint): bigint {\n const quotient = numerator / divisor;\n const twice = abs(numerator % divisor) * 2n;\n if (twice < divisor || (twice === divisor && quotient % 2n === 0n)) return quotient;\n return numerator < 0n ? quotient - 1n : quotient + 1n;\n}\n\nfunction abs(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n", "// The Item a Snapshot's value belongs to (ADR-0060), for a Consumer that reads a Snapshot's rows beside the\n// engine, such as ExBoard telling which rows stand under a pivot's selected cells (ADR-0340, Q5).\n\nimport type { SnapshotColumn } from '@ex-grid/data';\nimport { decimalToNumber } from '../aggregates/exact-decimal';\nimport { unreachable } from '../must';\nimport { ItemKeys, toPublicKey, type ItemKey, type PivotItemKey } from './item-key';\n\n/** The Item the value of `column` at `row` belongs to, as the engine groups a field over that column: a number\n * by its double, a Decimal by the double C# converts it to, a date by its clock value, and a Blank as Blank. */\nexport function pivotItemKeyAt(column: SnapshotColumn, row: number): PivotItemKey {\n return toPublicKey(itemKeyOf(column, row));\n}\n\nfunction itemKeyOf(column: SnapshotColumn, row: number): ItemKey {\n switch (column.kind) {\n case 'text': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.text(value); }\n case 'decimal': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.number(decimalToNumber(value)); }\n case 'integer': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.number(Number(value)); }\n case 'double': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.number(value); }\n case 'date': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.date(value); }\n case 'boolean': { const value = column.valueAt(row); return value === null ? ItemKeys.blank : ItemKeys.boolean(value); }\n default: return unreachable(column);\n }\n}\n", "// The Pivot Layout (ADR-0059): which Pivot Fields stand in which Areas, in what order, with each one's\n// settings, and the report's form and totals. It is ExPivot's View State: it holds no value, it is\n// serialisable (layout-json.ts), and the Consumer persists it. Frozen; every change is a new layout, which\n// is also the change signal. The create functions fill every setting a caller leaves out with the C#\n// engine's default, so a layout made here and one made in C# from the same choices are the same layout.\n\nimport { itemKeysEqual, pivotItemKey, type PivotItemKey } from '../items/item-key';\nimport type { PivotAggregation, PivotArea, PivotAxis, PivotReportForm, PivotShowValuesAs, PivotSortDirection } from './pivot-enums';\n\n/** An Item order: by label, ascending or descending, or by a Value Field's value at each Item's total;\n * `(blank)` is last either way (ADR-0060). */\nexport interface PivotSort {\n /** Ascending or descending. */\n readonly direction: PivotSortDirection;\n /** The index in the layout's Values of the Value Field to order by; absent to order by label. */\n readonly byValue?: number;\n}\n\n/** A Pivot Field standing in Filters, Rows or Columns, with its settings, which travel with it when it\n * moves between those Areas (ADR-0060/0061). */\nexport interface PivotFieldPlacement {\n /** The Pivot Field's name. */\n readonly field: string;\n /** The Item order. */\n readonly sort: PivotSort;\n /** The Items the user unticked: every record carrying one is left out of the report, totals included. */\n readonly hiddenItems: readonly PivotItemKey[];\n /** Whether an outer Item of this field has a subtotal (Excel's Automatic) or none. */\n readonly subtotals: boolean;\n /** The field-wide collapse state: true when every Item is collapsed but the toggled ones. */\n readonly collapsed: boolean;\n /** The Items whose collapse state is the opposite of `collapsed`. */\n readonly toggledItems: readonly PivotItemKey[];\n}\n\n/** A Pivot Field standing in Values (ADR-0060). */\nexport interface PivotValueField {\n /** The Pivot Field's name. */\n readonly field: string;\n /** How the records at a cell are summarised. */\n readonly aggregation: PivotAggregation;\n /** A caption of the Value Field's own (Excel's Custom Name), or absent for `<Aggregation> of <field>`. */\n readonly caption?: string;\n /** How the aggregated values are shown. */\n readonly showValuesAs: PivotShowValuesAs;\n /** A .NET format string the values are shown in under the report's locale, or absent for General,\n * at most eleven characters besides a minus sign, or `0.00%` for a percentage. */\n readonly numberFormat?: string;\n}\n\n/** Which Pivot Fields stand in which Areas, and the report's form and totals (ADR-0059). */\nexport interface PivotLayout {\n /** The report filter's fields, in order. */\n readonly filters: readonly PivotFieldPlacement[];\n /** The row fields, outermost first. */\n readonly rows: readonly PivotFieldPlacement[];\n /** The column fields, outermost first. */\n readonly columns: readonly PivotFieldPlacement[];\n /** The Value Fields, in order. */\n readonly values: readonly PivotValueField[];\n /** Where \u03A3 Values stands when there are two or more Value Fields. */\n readonly valuesAxis: PivotAxis;\n /** How the row labels are set out. */\n readonly form: PivotReportForm;\n /** Whether a subtotal is carried on its group row (Excel's default) or has a row of its own at the\n * bottom. The Tabular form always puts it at the bottom. */\n readonly subtotalsAtTop: boolean;\n /** Whether the `Grand Total` row is painted at the bottom: Excel's \"grand totals for columns\". */\n readonly grandTotalRow: boolean;\n /** Whether the `Grand Total` column is painted at the right: Excel's \"grand totals for rows\". */\n readonly grandTotalColumn: boolean;\n /** Whether every row of the Outline and Tabular forms repeats its outer Items' labels. */\n readonly repeatItemLabels: boolean;\n}\n\n/** A placement's settings, each its default when left out: by label ascending, nothing hidden, subtotals\n * Automatic, expanded. */\nexport interface PivotFieldPlacementInput {\n /** The Pivot Field's name. */\n readonly field: string;\n /** The Item order. */\n readonly sort?: PivotSort;\n /** The Items unticked. */\n readonly hiddenItems?: readonly PivotItemKey[];\n /** Whether an outer Item has a subtotal. */\n readonly subtotals?: boolean;\n /** The field-wide collapse state. */\n readonly collapsed?: boolean;\n /** The Items whose collapse state is the opposite of `collapsed`. */\n readonly toggledItems?: readonly PivotItemKey[];\n}\n\n/** A Value Field's settings, each its default when left out: Sum, the default caption, no calculation,\n * General. */\nexport interface PivotValueFieldInput {\n /** The Pivot Field's name. */\n readonly field: string;\n /** How the records at a cell are summarised. */\n readonly aggregation?: PivotAggregation;\n /** A caption of the Value Field's own. */\n readonly caption?: string;\n /** How the aggregated values are shown. */\n readonly showValuesAs?: PivotShowValuesAs;\n /** A .NET format string the values are shown in. */\n readonly numberFormat?: string;\n}\n\n/** A layout's settings, each its default when left out: no field anywhere, \u03A3 Values in Columns, the\n * Compact form, subtotals at the top, both grand totals, labels not repeated. A placement or a Value Field\n * may be given by its field's name alone. */\nexport interface PivotLayoutInput {\n /** The report filter's fields. */\n readonly filters?: readonly (string | PivotFieldPlacementInput)[];\n /** The row fields, outermost first. */\n readonly rows?: readonly (string | PivotFieldPlacementInput)[];\n /** The column fields, outermost first. */\n readonly columns?: readonly (string | PivotFieldPlacementInput)[];\n /** The Value Fields. */\n readonly values?: readonly (string | PivotValueFieldInput)[];\n /** Where \u03A3 Values stands. */\n readonly valuesAxis?: PivotAxis;\n /** How the row labels are set out. */\n readonly form?: PivotReportForm;\n /** Whether a subtotal is carried on its group row. */\n readonly subtotalsAtTop?: boolean;\n /** Whether the `Grand Total` row is painted. */\n readonly grandTotalRow?: boolean;\n /** Whether the `Grand Total` column is painted. */\n readonly grandTotalColumn?: boolean;\n /** Whether the Outline and Tabular forms repeat outer labels. */\n readonly repeatItemLabels?: boolean;\n}\n\nconst ascending: PivotSort = Object.freeze({ direction: 'ascending' });\n\nfunction fieldName(field: string): string {\n if (typeof field !== 'string' || field.length === 0) throw new TypeError('A placed field is named.');\n return field;\n}\n\nconst sortDirections: readonly string[] = ['ascending', 'descending'];\n\n/** A sort, checked and frozen. */\nexport function pivotSort(direction: PivotSortDirection = 'ascending', byValue?: number): PivotSort {\n if (!sortDirections.includes(direction)) throw new TypeError(`'${direction}' is not a sort direction.`);\n if (byValue === undefined) return direction === 'descending' ? Object.freeze({ direction }) : ascending;\n if (!Number.isInteger(byValue)) throw new TypeError(`A sort by value names a Value Field by its index, not ${byValue}.`);\n return Object.freeze({ direction, byValue });\n}\n\n/** Whether two sorts are one. */\nexport function sortsEqual(a: PivotSort, b: PivotSort): boolean {\n return a.direction === b.direction && a.byValue === b.byValue;\n}\n\n/** Whether two Value Fields are one, member by member, as the C# engine's record equality says. */\nexport function valueFieldsEqual(a: PivotValueField, b: PivotValueField): boolean {\n return a.field === b.field && a.aggregation === b.aggregation && a.caption === b.caption && a.showValuesAs === b.showValuesAs\n && a.numberFormat === b.numberFormat;\n}\n\nfunction keys(list: readonly PivotItemKey[] | undefined): readonly PivotItemKey[] {\n if (list === undefined) return Object.freeze([]);\n return Object.freeze(list.map(key => pivotItemKey(key.kind, key.value)));\n}\n\n/** A placement of the field, its settings checked and frozen. */\nexport function createPivotFieldPlacement(input: string | PivotFieldPlacementInput): PivotFieldPlacement {\n const { field, sort, hiddenItems, subtotals = true, collapsed = false, toggledItems }: PivotFieldPlacementInput =\n typeof input === 'string' ? { field: input } : input;\n return Object.freeze({\n field: fieldName(field),\n sort: sort === undefined ? ascending : pivotSort(sort.direction, sort.byValue),\n hiddenItems: keys(hiddenItems),\n subtotals,\n collapsed,\n toggledItems: keys(toggledItems),\n });\n}\n\n/** A Value Field of the field, its settings checked and frozen. */\nexport function createPivotValueField(input: string | PivotValueFieldInput): PivotValueField {\n const { field, aggregation = 'sum', showValuesAs = 'noCalculation', caption, numberFormat }: PivotValueFieldInput =\n typeof input === 'string' ? { field: input } : input;\n const value: { -readonly [K in keyof PivotValueField]: PivotValueField[K] } = { field: fieldName(field), aggregation, showValuesAs };\n if (caption !== undefined) value.caption = caption;\n if (numberFormat !== undefined) value.numberFormat = numberFormat;\n return Object.freeze(value);\n}\n\n/** A layout, every setting left out taking its default, and every placement and Value Field made by\n * {@link createPivotFieldPlacement} and {@link createPivotValueField}. */\nexport function createPivotLayout({\n filters = [], rows = [], columns = [], values = [], valuesAxis = 'columns', form = 'compact', subtotalsAtTop = true,\n grandTotalRow = true, grandTotalColumn = true, repeatItemLabels = false,\n}: PivotLayoutInput = {}): PivotLayout {\n return Object.freeze({\n filters: Object.freeze(filters.map(createPivotFieldPlacement)),\n rows: Object.freeze(rows.map(createPivotFieldPlacement)),\n columns: Object.freeze(columns.map(createPivotFieldPlacement)),\n values: Object.freeze(values.map(createPivotValueField)),\n valuesAxis,\n form,\n subtotalsAtTop,\n grandTotalRow,\n grandTotalColumn,\n repeatItemLabels,\n });\n}\n\n/** The layout with some of its settings changed, as C#'s `with` makes a new record. */\nexport function withLayout(layout: PivotLayout, changes: Partial<PivotLayout>): PivotLayout {\n return Object.freeze({ ...layout, ...changes });\n}\n\n/** The placement with some of its settings changed. */\nexport function withPlacement(placement: PivotFieldPlacement, changes: Partial<PivotFieldPlacement>): PivotFieldPlacement {\n return Object.freeze({ ...placement, ...changes });\n}\n\n/** No field anywhere: the report is empty and asks for fields. */\nexport const emptyPivotLayout: PivotLayout = createPivotLayout();\n\n/** Whether the layout places no field at all. */\nexport function isEmptyLayout(layout: PivotLayout): boolean {\n return layout.filters.length === 0 && layout.rows.length === 0 && layout.columns.length === 0 && layout.values.length === 0;\n}\n\n/** The placements of Filters, Rows or Columns. */\nexport function placementsIn(layout: PivotLayout, area: PivotArea): readonly PivotFieldPlacement[] {\n switch (area) {\n case 'filters': return layout.filters;\n case 'rows': return layout.rows;\n case 'columns': return layout.columns;\n case 'values': throw new TypeError('Values holds Value Fields; read the layout\\'s values.');\n default: throw new RangeError(`Unknown PivotArea '${String(area satisfies never)}'.`);\n }\n}\n\n/** Where a field stands among Filters, Rows and Columns, or `undefined` when it stands in none of them. */\nexport function placementOf(layout: PivotLayout, field: string): { readonly area: PivotArea; readonly index: number } | undefined {\n for (const area of ['filters', 'columns', 'rows'] as const) {\n const index = placementsIn(layout, area).findIndex(placement => placement.field === field);\n if (index >= 0) return { area, index };\n }\n return undefined;\n}\n\n/** Whether the field stands anywhere, Values included: a ticked field. */\nexport function placesField(layout: PivotLayout, field: string): boolean {\n return placementOf(layout, field) !== undefined || layout.values.some(value => value.field === field);\n}\n\n/** Whether the placement's Item is collapsed. */\nexport function isItemCollapsed(placement: PivotFieldPlacement, item: PivotItemKey): boolean {\n return placement.collapsed !== placement.toggledItems.some(key => itemKeysEqual(key, item));\n}\n", "// JSON as the C# engine's System.Text.Json reads and writes it: a reader that keeps each number as it is\n// spelt, since C# reads an integer or a decimal from its spelling and not from a double, and a writer that\n// spells strings and numbers as Utf8JsonWriter does, so that a document both engines write is one text.\n\nimport { decimalFromText, type SnapshotDecimal } from '@ex-grid/data';\nimport { doubleRaw } from '../text/invariant';\n\n/** A number as the document spells it: C# reads an integer from its spelling, so 1.0 is not one. */\nexport class JsonNumber {\n readonly raw: string;\n\n constructor(raw: string) {\n this.raw = raw;\n }\n\n /** The spelling's value as a 32-bit integer, or `undefined` where it has a fraction, an exponent or\n * a value outside 32 bits, as `JsonElement.TryGetInt32` refuses it. */\n get int32(): number | undefined {\n const value = this.#whole();\n return value !== undefined && value >= -(2 ** 31) && value < 2 ** 31 ? value : undefined;\n }\n\n /** The spelling's value as a whole number a double holds exactly, or `undefined` where it has a\n * fraction or an exponent, as `JsonElement.TryGetInt64` refuses it, or lies past 2^53. */\n get integer(): number | undefined {\n const value = this.#whole();\n return value !== undefined && Number.isSafeInteger(value) ? value : undefined;\n }\n\n /** The decimal the spelling writes exactly, or `undefined` where no decimal holds it: more than 28\n * places that are not trailing zeros, or digits past 2^96. An exponent is read. */\n get decimal(): SnapshotDecimal | undefined {\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/u.exec(this.raw);\n if (match === null) return undefined;\n const [, sign = '', whole = '', fraction = '', exponent = '0'] = match;\n let digits = (whole + fraction).replace(/^0+(?=\\d)/u, '');\n let places = fraction.length - Number(exponent);\n if (/^0+$/u.test(digits)) return decimalFromText('0');\n while (places > 0 && digits.endsWith('0')) {\n digits = digits.slice(0, -1);\n places--;\n }\n // A decimal has at most 29 digits, so a value past them is not one, however its exponent is spelt.\n if (places > 28 || digits.length - places > 29) return undefined;\n const text = places <= 0\n ? digits + '0'.repeat(-places)\n : `${digits.slice(0, -places).padStart(1, '0')}.${digits.slice(-places).padStart(places, '0')}`;\n if (BigInt(text.replace('.', '')) >= 1n << 96n) return undefined;\n return decimalFromText(sign + text);\n }\n\n /** The spelling's value as a double. */\n get double(): number {\n return Number(this.raw);\n }\n\n #whole(): number | undefined {\n if (!/^-?(?:0|[1-9]\\d*)$/u.test(this.raw)) return undefined;\n return Number(this.raw) + 0;\n }\n}\n\n/** A JSON value, each number kept as it is spelt. */\nexport type Json = null | boolean | JsonNumber | string | readonly Json[] | { readonly [key: string]: Json };\n\n/** A JSON object. */\nexport type JsonObject = { readonly [key: string]: Json };\n\n// The names an object read was written with more than once, which only a reader that walks its members sees,\n// and its names in the order written, which an object's own keys do not keep where a name is a whole number.\nconst writtenTwice = new WeakMap<JsonObject, readonly string[]>();\nconst writtenOrder = new WeakMap<JsonObject, readonly string[]>();\n\n/** The names `object` was written with, each once, in the order the document first wrote them, as\n * System.Text.Json enumerates an object; an object {@link readJson} did not read gives its own keys. */\nexport function memberNames(object: JsonObject): readonly string[] {\n return writtenOrder.get(object) ?? Object.keys(object);\n}\n\n/** The names `object` was written with more than once, in the order the second of each was met; none for an\n * object {@link readJson} did not read. */\nexport function namesWrittenTwice(object: JsonObject): readonly string[] {\n return writtenTwice.get(object) ?? []; // oxlint-disable-line ex-grid/no-stand-in-default -- an object read with no name written twice is not recorded\n}\n\n/**\n * The value of a text JSON.parse reads without complaint, each number kept as it is spelt; a name written\n * twice is the last one written, as JSON.parse and JsonElement both take it. Text that is not JSON is the\n * caller's to refuse first: this reader assumes JSON.parse has read it.\n */\nexport function readJson(text: string): Json {\n let at = 0;\n const skip = (): void => {\n while (at < text.length && ' \\t\\n\\r'.includes(text.charAt(at))) at++;\n };\n const stringAt = (): string => {\n const start = at;\n at++;\n while (text.charAt(at) !== '\"') at += text.charAt(at) === '\\\\' ? 2 : 1;\n at++;\n const decoded: unknown = JSON.parse(text.slice(start, at));\n if (typeof decoded !== 'string') throw new Error('Internal: a JSON string read as another value.');\n return decoded;\n };\n const valueAt = (): Json => {\n skip();\n const ch = text.charAt(at);\n if (ch === '{') {\n at++;\n const object: { [key: string]: Json } = {};\n const twice: string[] = [];\n const order: string[] = [];\n skip();\n if (text.charAt(at) === '}') {\n at++;\n return object;\n }\n for (;;) {\n skip();\n const name = stringAt();\n skip();\n at++; // the colon\n if (Object.hasOwn(object, name)) twice.push(name);\n else order.push(name);\n Object.defineProperty(object, name, { value: valueAt(), enumerable: true, writable: true, configurable: true });\n skip();\n if (text.charAt(at++) === '}') {\n if (twice.length > 0) writtenTwice.set(object, Object.freeze(twice));\n writtenOrder.set(object, Object.freeze(order));\n return object;\n }\n }\n }\n if (ch === '[') {\n at++;\n const entries: Json[] = [];\n skip();\n if (text.charAt(at) === ']') {\n at++;\n return entries;\n }\n for (;;) {\n entries.push(valueAt());\n skip();\n if (text.charAt(at++) === ']') return entries;\n }\n }\n if (ch === '\"') return stringAt();\n for (const [word, value] of [['true', true], ['false', false], ['null', null]] as const) {\n if (text.startsWith(word, at)) {\n at += word.length;\n return value;\n }\n }\n const number = /-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/uy;\n number.lastIndex = at;\n const spelled = number.exec(text);\n if (spelled === null) throw new Error('Internal: JSON.parse read a value this reader does not.');\n at += spelled[0].length;\n return new JsonNumber(spelled[0]);\n };\n return valueAt();\n}\n\n/** Whether a value is an array. */\nexport function isArray(value: Json | undefined): value is readonly Json[] {\n return Array.isArray(value);\n}\n\n/** Whether a value is an object, and not an array, a number or null. */\nexport function isObject(value: Json | undefined): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof JsonNumber);\n}\n\n/** An object's own member, or `undefined` where it has none: `__proto__` is a member like any other. */\nexport function member(element: JsonObject, name: string): Json | undefined {\n return Object.hasOwn(element, name) ? element[name] : undefined;\n}\n\n// ---- writing -------------------------------------------------------------------------------------\n\n// What System.Text.Json's default encoder spells by its code: every character outside printable ASCII, and\n// those HTML gives a meaning to.\nconst shortEscapes: Readonly<Record<string, string>> = Object.freeze({ '\\\\': '\\\\\\\\', '\\n': '\\\\n', '\\r': '\\\\r', '\\t': '\\\\t', '\\b': '\\\\b', '\\f': '\\\\f' });\n\n/** A string as Utf8JsonWriter writes it under the default encoder: `\"` as `\"`, `<` as `<`, every\n * character past ASCII as its UTF-16 units. */\nexport function jsonString(text: string): string {\n let written = '\"';\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n const code = text.charCodeAt(i);\n // Utf8JsonWriter refuses text that is not UTF-16: a surrogate without its other half.\n const high = code >= 0xd800 && code <= 0xdbff;\n const low = code >= 0xdc00 && code <= 0xdfff;\n const paired = high ? isLow(text.charCodeAt(i + 1)) : low && i > 0 && isHigh(text.charCodeAt(i - 1));\n if ((high || low) && !paired) throw new TypeError(`Cannot write invalid UTF-16 text: a lone surrogate at ${i} of ${JSON.stringify(text)}.`);\n const short = shortEscapes[ch];\n if (short !== undefined) written += short;\n else if (code < 0x20 || code > 0x7e || '\"&\\'+<>`'.includes(ch)) written += `\\\\u${code.toString(16).toUpperCase().padStart(4, '0')}`;\n else written += ch;\n }\n return `${written}\"`;\n}\n\nfunction isHigh(code: number): boolean {\n return code >= 0xd800 && code <= 0xdbff;\n}\n\nfunction isLow(code: number): boolean {\n return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/** A finite double as Utf8JsonWriter writes it: its shortest round-trip text, `1E+300`, `-0`. */\nexport function jsonDouble(value: number): string {\n if (!Number.isFinite(value)) throw new RangeError(`${value} is not a number JSON writes; it is written by name, as a string.`);\n // Between 10^-4 and 10^15 both platforms write the shortest digits without an exponent, so JavaScript's own\n // text is .NET's; outside it, and for -0, .NET's spelling is made by hand.\n const magnitude = Math.abs(value);\n return magnitude >= 1e-4 && magnitude < 1e15 ? String(value) : doubleRaw(value);\n}\n\n/** An object written from members already written, in order, as `{\"name\":value,\u2026}`. */\nexport function jsonObject(members: readonly (readonly [string, string])[]): string {\n return `{${members.map(([name, value]) => `${jsonString(name)}:${value}`).join(',')}}`;\n}\n\n/** An array written from entries already written. */\nexport function jsonArray(entries: readonly string[]): string {\n return `[${entries.join(',')}]`;\n}\n", "// The Pivot Layout's serialised form (ADR-0059): versioned JSON a Consumer stores as View State and reads\n// back as the same layout, the C# engine's PivotLayoutJson member for member. A document of a version this\n// reader does not know is refused rather than half-read, and so is a member of the wrong type or an\n// unknown name; a member left out takes its default.\n\nimport { PivotFormatError, PivotVersionError } from '../errors';\nimport { isObject, JsonNumber, member, readJson, type Json, type JsonObject } from '../json/json-text';\nimport { pivotItemKey, type PivotItemKey } from '../items/item-key';\nimport { pivotAggregations, pivotItemKinds, type PivotAggregation, type PivotItemKind, type PivotShowValuesAs } from './pivot-enums';\nimport {\n createPivotFieldPlacement, createPivotLayout, createPivotValueField, pivotSort,\n type PivotFieldPlacement, type PivotLayout, type PivotValueField,\n} from './pivot-layout';\n\n/** The version this writer writes and the only one this reader reads. */\nexport const pivotLayoutJsonVersion = 1;\n\n/** The layout as JSON, its members in the C# writer's order. */\nexport function writePivotLayoutJson(layout: PivotLayout): string {\n return JSON.stringify({\n version: pivotLayoutJsonVersion,\n form: layout.form,\n valuesAxis: layout.valuesAxis,\n subtotalsAtTop: layout.subtotalsAtTop,\n grandTotalRow: layout.grandTotalRow,\n grandTotalColumn: layout.grandTotalColumn,\n repeatItemLabels: layout.repeatItemLabels,\n filters: layout.filters.map(placementJson),\n rows: layout.rows.map(placementJson),\n columns: layout.columns.map(placementJson),\n values: layout.values.map(valueJson),\n });\n}\n\nfunction placementJson(placement: PivotFieldPlacement): Record<string, unknown> {\n const json: Record<string, unknown> = { field: placement.field };\n if (placement.sort.direction !== 'ascending' || placement.sort.byValue !== undefined) {\n const sort: Record<string, unknown> = { direction: placement.sort.direction };\n if (placement.sort.byValue !== undefined) sort['byValue'] = placement.sort.byValue;\n json['sort'] = sort;\n }\n if (!placement.subtotals) json['subtotals'] = false;\n if (placement.collapsed) json['collapsed'] = true;\n if (placement.hiddenItems.length > 0) json['hiddenItems'] = placement.hiddenItems.map(keyJson);\n if (placement.toggledItems.length > 0) json['toggledItems'] = placement.toggledItems.map(keyJson);\n return json;\n}\n\nfunction keyJson(key: PivotItemKey): Record<string, unknown> {\n return key.value === undefined ? { kind: key.kind } : { kind: key.kind, value: key.value };\n}\n\nfunction valueJson(value: PivotValueField): Record<string, unknown> {\n const json: Record<string, unknown> = { field: value.field, aggregation: value.aggregation };\n if (value.caption !== undefined) json['caption'] = value.caption;\n if (value.showValuesAs !== 'noCalculation') json['showValuesAs'] = value.showValuesAs;\n if (value.numberFormat !== undefined) json['numberFormat'] = value.numberFormat;\n return json;\n}\n\n/**\n * A layout read back from {@link writePivotLayoutJson}'s JSON. Refuses by name, with a PivotFormatError, a\n * document that is not an object, an unknown name for a form, an axis, an Aggregation, a Show Values As, a\n * sort direction or an Item kind, and a member of the wrong type; and with a PivotVersionError a document of\n * another version.\n */\nexport function readPivotLayoutJson(json: string): PivotLayout {\n try {\n JSON.parse(json);\n } catch (error) {\n throw new PivotFormatError('A Pivot Layout is JSON.', { cause: error });\n }\n const parsed = readJson(json);\n if (!isObject(parsed)) throw new PivotFormatError('A Pivot Layout is a JSON object.');\n const version = member(parsed, 'version');\n if (!(version instanceof JsonNumber)) throw new PivotFormatError('A Pivot Layout names its version.');\n if (version.int32 !== pivotLayoutJsonVersion) {\n throw new PivotVersionError(`A Pivot Layout of version ${version.raw} cannot be read; this reader reads version ${pivotLayoutJsonVersion}.`);\n }\n return createPivotLayout({\n form: parse(parsed, 'form', 'form', ['compact', 'outline', 'tabular'], 'compact'),\n valuesAxis: parse(parsed, 'valuesAxis', 'valuesAxis', ['columns', 'rows'], 'columns'),\n subtotalsAtTop: boolean(parsed, 'subtotalsAtTop', true),\n grandTotalRow: boolean(parsed, 'grandTotalRow', true),\n grandTotalColumn: boolean(parsed, 'grandTotalColumn', true),\n repeatItemLabels: boolean(parsed, 'repeatItemLabels', false),\n filters: readPlacements(parsed, 'filters'),\n rows: readPlacements(parsed, 'rows'),\n columns: readPlacements(parsed, 'columns'),\n values: array(parsed, 'values').map(readValue),\n });\n}\n\nfunction readPlacements(root: JsonObject, name: string): PivotFieldPlacement[] {\n return array(root, name).map(element => {\n const sortJson = member(element, 'sort');\n let sort = pivotSort('ascending');\n if (sortJson !== undefined) {\n if (!isObject(sortJson)) throw new PivotFormatError(\"'sort' is an object.\");\n const direction = parse(sortJson, 'direction', 'direction', ['ascending', 'descending'], 'ascending');\n const byValue = member(sortJson, 'byValue');\n const index = byValue instanceof JsonNumber ? byValue.int32 : undefined;\n if (byValue !== undefined && index === undefined) throw new PivotFormatError(\"'byValue' is an integer.\");\n sort = pivotSort(direction, index);\n }\n return createPivotFieldPlacement({\n field: string(element, 'field'),\n sort,\n subtotals: boolean(element, 'subtotals', true),\n collapsed: boolean(element, 'collapsed', false),\n hiddenItems: readKeys(element, 'hiddenItems'),\n toggledItems: readKeys(element, 'toggledItems'),\n });\n });\n}\n\nfunction readKeys(element: JsonObject, name: string): PivotItemKey[] {\n return array(element, name).map(key => {\n const kind: PivotItemKind = parse(key, 'kind', 'kind', pivotItemKinds, 'blank');\n const value = member(key, 'value');\n if (value !== undefined && typeof value !== 'string') throw new PivotFormatError(\"An Item's 'value' is a string.\");\n return pivotItemKey(kind, value);\n });\n}\n\nfunction readValue(element: JsonObject): PivotValueField {\n const aggregation: PivotAggregation = parse(element, 'aggregation', 'aggregation', pivotAggregations, 'sum');\n const showValuesAs: PivotShowValuesAs = parse(element, 'showValuesAs', 'showValuesAs',\n ['noCalculation', 'percentOfGrandTotal', 'percentOfColumnTotal', 'percentOfRowTotal'], 'noCalculation');\n const caption = optionalString(element, 'caption');\n const numberFormat = optionalString(element, 'numberFormat');\n return createPivotValueField({\n field: string(element, 'field'),\n aggregation,\n showValuesAs,\n ...(caption === undefined ? {} : { caption }),\n ...(numberFormat === undefined ? {} : { numberFormat }),\n });\n}\n\nfunction array(element: JsonObject, name: string): JsonObject[] {\n const value = member(element, name);\n if (value === undefined) return [];\n if (!Array.isArray(value)) throw new PivotFormatError(`'${name}' is an array.`);\n return (value as readonly Json[]).map(entry => {\n // An entry that is not an object has no member to read: C#'s JsonElement throws an\n // InvalidOperationException, which is a plain Error here.\n if (!isObject(entry)) throw new Error(`An entry of '${name}' is not an object.`);\n return entry;\n });\n}\n\nfunction string(element: JsonObject, name: string): string {\n const value = member(element, name);\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string, and is required.`);\n return value;\n}\n\nfunction optionalString(element: JsonObject, name: string): string | undefined {\n const value = member(element, name);\n if (value === undefined) return undefined;\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string.`);\n return value;\n}\n\nfunction boolean(element: JsonObject, name: string, fallback: boolean): boolean {\n const value = member(element, name);\n if (value === undefined) return fallback;\n if (typeof value !== 'boolean') throw new PivotFormatError(`'${name}' is true or false.`);\n return value;\n}\n\nfunction parse<T extends string>(element: JsonObject, name: string, what: string, names: readonly T[], fallback: T): T {\n const value = member(element, name);\n if (value === undefined) return fallback;\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string.`);\n const known = names.find(candidate => candidate === value);\n if (known === undefined) throw new PivotFormatError(`'${value}' is not a ${what} this reader knows.`);\n return known;\n}\n", "// A Pivot Field as a source offers it (ADR-0061/0066): its name, caption and declared type, the format its\n// Items are labelled with, the order its Items are declared in (Excel's custom lists) and its Order Key \u2014\n// and, over records, how it is read from one. The C# engine's PivotField, PivotField<TRecord> and\n// PivotNumberFormat, with their checks and their messages.\n\nimport { ticksOf } from '@ex-grid/data';\nimport { PivotFormatError } from '../errors';\nimport { itemKeyOfValue, readRecordValue } from '../items/record-value';\nimport { keyIdOf } from '../items/item-key';\nimport type { PivotDatePart, PivotFieldType } from '../layout/pivot-enums';\nimport { formatDate } from '../text/date-text';\nimport { invariantDates, invariantNumbers } from '../text/invariant';\nimport { formatDecimal, formatDouble } from '../text/number-text';\n\n/** What an Order Key gives an Item: a value Items are ordered by, ascending; one field's keys are all of\n * one type. `null` or `undefined` gives the Item no key. */\nexport type PivotOrderKeyValue = string | number | bigint | boolean;\n\n/**\n * A field's Order Key (ADR-0060): from an Item's value \u2014 the text of a text Item (its first spelling), the\n * number of a number Item, the clock ticks of a date, the Boolean of a Boolean \u2014 to what the Items are\n * ordered by. Called once per Item where the report is laid out; one that throws is refused, naming the\n * field and the Item.\n */\nexport type PivotOrderKey = (value: string | number | bigint | boolean) => PivotOrderKeyValue | null | undefined;\n\n/** A Pivot Field as a source offers it: everything but how it is read from a record. */\nexport interface PivotField {\n /** What a Pivot Layout addresses it by; unique among the fields. */\n readonly name: string;\n /** What the Field List and the report call it. */\n readonly caption: string;\n /** The declared type, which decides the defaults (ADR-0060). */\n readonly type: PivotFieldType;\n /** A .NET format string an Item's number or date is labelled with, under the report's locale; absent for\n * the value's own text. */\n readonly format?: string;\n /** Values whose Items come first, in this order, when the field is sorted by label. */\n readonly itemOrder: readonly unknown[];\n /** The Snapshot column the field reads, when it is not the column of its own name. */\n readonly column?: string;\n /** The part of a Date column the field is: its year, quarter or month. */\n readonly datePart?: PivotDatePart;\n /** The field's Order Key. */\n readonly orderKey?: PivotOrderKey;\n}\n\n/** A Pivot Field over records in memory: a field and how it is read from one record. */\nexport interface PivotRecordField<TRecord> extends PivotField {\n /** Reads the field from a record; `null` or `undefined` is a Blank. */\n readonly value: (record: TRecord) => unknown;\n}\n\n/** A field's declaration, each setting left out taking its default: the name for the caption, no format,\n * no declared order, the column of its own name, no Order Key. */\nexport interface PivotFieldInput {\n /** What a Pivot Layout addresses it by. */\n readonly name: string;\n /** The declared type. */\n readonly type: PivotFieldType;\n /** What the Field List and the report call it; its name when left out. */\n readonly caption?: string;\n /** A .NET format string its Items are labelled with. */\n readonly format?: string;\n /** Values whose Items come first, in this order. */\n readonly itemOrder?: readonly unknown[];\n /** The Snapshot column it reads; the column of its own name when left out. */\n readonly column?: string;\n /** The part of a Date column it is. */\n readonly datePart?: PivotDatePart;\n /** Its Order Key. */\n readonly orderKey?: PivotOrderKey;\n}\n\n/** A record field's declaration. */\nexport interface PivotRecordFieldInput<TRecord> extends PivotFieldInput {\n /** Reads the field from a record; `null` or `undefined` is a Blank. */\n readonly value: (record: TRecord) => unknown;\n}\n\nconst fieldTypes: readonly PivotFieldType[] = ['text', 'number', 'date', 'boolean'];\nconst dateParts: readonly PivotDatePart[] = ['year', 'quarter', 'month'];\n\n/** The C# engine's name of a field type: `Text`, `Number`. */\nexport function fieldTypeTitle(type: PivotFieldType): string {\n return type.charAt(0).toUpperCase() + type.slice(1);\n}\n\n/** The C# engine's name of a date part: `Year`, `Month`. */\nexport function datePartTitle(part: PivotDatePart): string {\n return part.charAt(0).toUpperCase() + part.slice(1);\n}\n\n/** A field, its declaration checked and frozen. Refuses, with a TypeError, an empty name, an empty caption,\n * an empty column, a format that cannot format the field's values and a date part of a field not declared\n * Date; with a RangeError an unknown type or date part. */\nexport function pivotField(input: PivotFieldInput): PivotField {\n return Object.freeze(declared(input));\n}\n\n/** A record field, its declaration checked as {@link pivotField} checks it, and its accessor a function. */\nexport function pivotRecordField<TRecord>(input: PivotRecordFieldInput<TRecord>): PivotRecordField<TRecord> {\n const field = declared(input);\n if (typeof input.value !== 'function') throw new TypeError(`Pivot Field '${field.name}' reads its value with a function.`);\n return Object.freeze({ ...field, value: input.value });\n}\n\n/** A field that is a part of a Date column (ADR-0060): its year, quarter or month, labelled `2026`, `Qtr3`,\n * `Sep` in the report's words and ordered by the calendar. */\nexport function datePartField(name: string, column: string, part: PivotDatePart, caption?: string): PivotField {\n if (typeof column !== 'string' || column.length === 0) throw new TypeError('A date part names the Date column it is a part of.');\n return pivotField({ name, type: 'date', column, datePart: part, ...(caption === undefined ? {} : { caption }) });\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nfunction declared(input: PivotFieldInput): PivotField {\n const { name, type } = input;\n if (typeof name !== 'string' || name.length === 0) throw new TypeError('A Pivot Field is named, and its name is not empty.');\n if (!fieldTypes.includes(type)) throw new RangeError(`Unknown PivotFieldType for Pivot Field '${name}'.`);\n if (input.caption !== undefined && input.caption.length === 0) {\n throw new TypeError(`Pivot Field '${name}' has an empty caption; leave it out for the name.`);\n }\n if (input.format !== undefined) {\n const problem = formatProblem(type, input.format);\n if (problem !== undefined) throw new TypeError(`Pivot Field '${name}' declares the format '${input.format}', which ${problem}.`);\n }\n if (input.column !== undefined && input.column.length === 0) {\n throw new TypeError(`Pivot Field '${name}' names an empty column; leave it out for the column '${name}'.`);\n }\n if (input.datePart !== undefined) {\n if (!dateParts.includes(input.datePart)) throw new RangeError(`Unknown PivotDatePart for Pivot Field '${name}'.`);\n if (type !== 'date') {\n throw new TypeError(`Pivot Field '${name}' is a date part, and is declared ${fieldTypeTitle(type)}; a date part is declared Date.`);\n }\n }\n if (input.orderKey !== undefined && typeof input.orderKey !== 'function') {\n throw new TypeError(`Pivot Field '${name}' has an Order Key that is not a function.`);\n }\n const field: Mutable<PivotField> = {\n name,\n caption: input.caption ?? name,\n type,\n itemOrder: Object.freeze([...(input.itemOrder ?? [])]), // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0060: no declared order is an empty one\n };\n if (input.format !== undefined) field.format = input.format;\n if (input.column !== undefined) field.column = input.column;\n if (input.datePart !== undefined) field.datePart = input.datePart;\n if (input.orderKey !== undefined) field.orderKey = input.orderKey;\n return field;\n}\n\n// ---- Formats --------------------------------------------------------------------------------------\n\n/** The longest format string a field or a Value Field may declare. */\nexport const maxFormatLength = 64;\n\n/** The most digits a standard number format may ask for. */\nexport const maxFormatPrecision = 30;\n\n/**\n * What is wrong with a number format, or `undefined` when nothing is (PivotNumberFormat.Check): empty,\n * longer than 64 characters, a standard format asking for more than 30 digits, or one .NET cannot format\n * a number with.\n */\nexport function numberFormatProblem(format: string): string | undefined {\n if (format.length === 0) return 'is empty';\n if (format.length > maxFormatLength) return `is longer than ${maxFormatLength} characters`;\n if (/^[A-Za-z][0-9]+$/.test(format)) {\n // int.TryParse: a precision too large for an int is not read, and the format is tried as it is.\n const precision = Number(format.slice(1));\n if (precision <= 2147483647 && precision > maxFormatPrecision) return `asks for ${precision} digits, more than ${maxFormatPrecision}`;\n }\n try {\n formatDecimal({ mantissa: 12345n, scale: 1 }, format, invariantNumbers);\n formatDouble(-1234.5, format, invariantNumbers);\n formatDouble(0, format, invariantNumbers);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- a format .NET refuses is the problem this check names\n\n if (error instanceof PivotFormatError) return 'cannot format a number';\n throw error;\n }\n return undefined;\n}\n\nconst sampleDate = ticksOf(2026, 9, 30, 13, 45, 0);\n\n// A number's format is held to what a Value Field's is; a date's needs only to format a date.\nfunction formatProblem(type: PivotFieldType, format: string): string | undefined {\n if (type !== 'date') return numberFormatProblem(format);\n if (format.length === 0 || format.length > maxFormatLength) return `is empty or longer than ${maxFormatLength} characters`;\n try {\n formatDate(sampleDate, format, invariantDates);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- a format .NET refuses is the problem this check names\n\n if (error instanceof PivotFormatError) return 'cannot format a date';\n throw error;\n }\n return undefined;\n}\n\n// ---- What the report needs of a field -----------------------------------------------------------------\n\n/** What laying out a report reads of a field: its declaration, and its declared order by Item. */\nexport interface FieldMeta {\n readonly field: PivotField;\n /** The declared order, by the Item's {@link keyIdOf}: the first place a value takes. */\n readonly declaredOrder: ReadonlyMap<string, number>;\n}\n\n/** A field's meta. */\nexport function fieldMeta(field: PivotField): FieldMeta {\n const order = new Map<string, number>();\n field.itemOrder.forEach((value, index) => {\n const id = keyIdOf(itemKeyOfValue(readRecordValue(value)));\n if (!order.has(id)) order.set(id, index);\n });\n return Object.freeze({ field, declaredOrder: order });\n}\n\n/** The fields by name, refusing a name declared twice: a layout could not say which it means. */\nexport function declaredFields<T extends PivotField>(fields: readonly T[]): ReadonlyMap<string, T> {\n const byName = new Map<string, T>();\n for (const field of fields) {\n if (byName.has(field.name)) throw new TypeError(`Two Pivot Fields are named '${field.name}'; a layout could not say which it means.`);\n byName.set(field.name, field);\n }\n return byName;\n}\n\n/** Each field's meta, by name. */\nexport function fieldMetas(fields: readonly PivotField[]): ReadonlyMap<string, FieldMeta> {\n const metas = new Map<string, FieldMeta>();\n for (const [name, field] of declaredFields(fields)) metas.set(name, fieldMeta(field));\n return metas;\n}\n", "// A value a Consumer hands the engine, read by its own kind (ADR-0060: a field \"whose values are not all\n// of the declared type is still pivoted as its values are\"), as the C# engine reads a boxed value: text, an\n// exact number, a double, a date, a Boolean, or a Blank. JavaScript's kinds map onto C#'s: a string is text,\n// a number is a double, a bigint and a SnapshotDecimal are exact, a Temporal plain date or date-time is a\n// date by its clock value, null and undefined are Blanks. C# reads any other type as its invariant text;\n// JavaScript has no such text (an object's is \"[object Object]\"), so another type is refused, naming it,\n// rather than pivoted as text nobody chose.\n\nimport { ticksOfTemporal, type SnapshotDecimal } from '@ex-grid/data';\nimport { decimalToNumber } from '../aggregates/exact-decimal';\nimport { ItemKeys, type ItemKey } from './item-key';\n\n/** A value as the engine reads it. */\nexport type RecordValue =\n | { readonly kind: 'blank' }\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'decimal'; readonly decimal: SnapshotDecimal }\n | { readonly kind: 'double'; readonly number: number }\n | { readonly kind: 'date'; readonly ticks: bigint }\n | { readonly kind: 'boolean'; readonly value: boolean };\n\nconst blank: RecordValue = Object.freeze({ kind: 'blank' });\n\n/** Whether a value is a SnapshotDecimal: a bigint mantissa and a whole scale from 0 to 28. */\nexport function isDecimal(value: unknown): value is SnapshotDecimal {\n if (typeof value !== 'object' || value === null) return false;\n const mantissa: unknown = Reflect.get(value, 'mantissa');\n const scale: unknown = Reflect.get(value, 'scale');\n return typeof mantissa === 'bigint' && typeof scale === 'number' && Number.isInteger(scale) && scale >= 0 && scale <= 28;\n}\n\nconst decimalLimit = 1n << 96n;\n\n/** A value read by its kind; another type is refused with a TypeError that names it. */\nexport function readRecordValue(value: unknown): RecordValue {\n if (value === null || value === undefined) return blank;\n switch (typeof value) {\n case 'string': return { kind: 'text', text: value };\n case 'number': return { kind: 'double', number: value };\n case 'boolean': return { kind: 'boolean', value };\n case 'bigint':\n if (value >= decimalLimit || value <= -decimalLimit) {\n throw new RangeError(`${value} is wider than the 96 bits a decimal holds.`);\n }\n return { kind: 'decimal', decimal: { mantissa: value, scale: 0 } };\n case 'object': {\n if (isDecimal(value)) {\n if (value.mantissa >= decimalLimit || value.mantissa <= -decimalLimit) {\n throw new RangeError(`A decimal's ${value.mantissa} is wider than the 96 bits it holds.`);\n }\n return { kind: 'decimal', decimal: value };\n }\n const ticks = ticksOfTemporal(value);\n if (ticks !== undefined) return { kind: 'date', ticks };\n throw new TypeError(`A value of type ${Object.prototype.toString.call(value).slice(8, -1)} is none the engine reads: `\n + 'text, a number, a bigint, a SnapshotDecimal, a Temporal plain date or date-time, a Boolean, or null.');\n }\n case 'function':\n case 'symbol':\n case 'undefined':\n throw new TypeError(`A value of type ${typeof value} is none the engine reads.`);\n default: throw new Error(`Internal: typeof gave a type the engine does not know (${typeof value}).`);\n }\n}\n\n/** The Item a value belongs to (ADR-0060): a number by its double, a decimal by the double C# converts it\n * to, a date by its clock value. */\nexport function itemKeyOfValue(value: RecordValue): ItemKey {\n switch (value.kind) {\n case 'blank': return ItemKeys.blank;\n case 'text': return ItemKeys.text(value.text);\n case 'decimal': return ItemKeys.number(decimalToNumber(value.decimal));\n case 'double': return ItemKeys.number(value.number);\n case 'date': return ItemKeys.date(value.ticks);\n case 'boolean': return ItemKeys.boolean(value.value);\n default: throw new Error(`Internal: ${String(value satisfies never)} is not a value's kind.`);\n }\n}\n", "// Generated by dotnet/tools/pivot-oracle (`dotnet run --project dotnet/tools/pivot-oracle -- kana <this file>`):\n// the rank .NET's collation tailoring gives each character in its group of one primary weight under\n// ICU's root, where the rank is not 0 (collation.ts). Edit the generator, not this file.\n\n/** Each tailored character, by code point, and its rank. */\nexport const tailoredRanks: ReadonlyMap<number, number> = new Map([\n [0xFF01, 1], // \uFF01 after !\n [0xFF02, 1], // \uFF02 after \"\n [0xFF03, 1], // \uFF03 after #\n [0xFF04, 1], // \uFF04 after $\n [0xFF05, 1], // \uFF05 after %\n [0xFF06, 1], // \uFF06 after &\n [0xFF07, 1], // \uFF07 after '\n [0xFF08, 1], // \uFF08 after (\n [0xFF09, 1], // \uFF09 after )\n [0xFF0A, 1], // \uFF0A after *\n [0xFF0B, 1], // \uFF0B after +\n [0xFF0C, 1], // \uFF0C after ,\n [0xFF0D, 1], // \uFF0D after -\n [0xFF0E, 1], // \uFF0E after .\n [0xFF0F, 1], // \uFF0F after /\n [0xFF10, 1], // \uFF10 after 0\n [0xFF11, 1], // \uFF11 after 1\n [0xFF12, 1], // \uFF12 after 2\n [0xFF13, 1], // \uFF13 after 3\n [0xFF14, 1], // \uFF14 after 4\n [0xFF15, 1], // \uFF15 after 5\n [0xFF16, 1], // \uFF16 after 6\n [0xFF17, 1], // \uFF17 after 7\n [0xFF18, 1], // \uFF18 after 8\n [0xFF19, 1], // \uFF19 after 9\n [0xFF1A, 1], // \uFF1A after :\n [0xFF1B, 1], // \uFF1B after ;\n [0xFF1C, 1], // \uFF1C after <\n [0xFF1D, 1], // \uFF1D after =\n [0xFF1E, 1], // \uFF1E after >\n [0xFF1F, 1], // \uFF1F after ?\n [0xFF20, 1], // \uFF20 after @\n [0xFF21, 1], // \uFF21 after A\n [0xFF41, 1], // \uFF41 after A\n [0xFF22, 1], // \uFF22 after B\n [0xFF42, 1], // \uFF42 after B\n [0xFF23, 1], // \uFF23 after C\n [0xFF43, 1], // \uFF43 after C\n [0xFF24, 1], // \uFF24 after D\n [0xFF44, 1], // \uFF44 after D\n [0xFF25, 1], // \uFF25 after E\n [0xFF45, 1], // \uFF45 after E\n [0xFF26, 1], // \uFF26 after F\n [0xFF46, 1], // \uFF46 after F\n [0xFF27, 1], // \uFF27 after G\n [0xFF47, 1], // \uFF47 after G\n [0xFF28, 1], // \uFF28 after H\n [0xFF48, 1], // \uFF48 after H\n [0xFF29, 1], // \uFF29 after I\n [0xFF49, 1], // \uFF49 after I\n [0xFF2A, 1], // \uFF2A after J\n [0xFF4A, 1], // \uFF4A after J\n [0xFF2B, 1], // \uFF2B after K\n [0xFF4B, 1], // \uFF4B after K\n [0xFF2C, 1], // \uFF2C after L\n [0xFF4C, 1], // \uFF4C after L\n [0xFF2D, 1], // \uFF2D after M\n [0xFF4D, 1], // \uFF4D after M\n [0xFF2E, 1], // \uFF2E after N\n [0xFF4E, 1], // \uFF4E after N\n [0xFF2F, 1], // \uFF2F after O\n [0xFF4F, 1], // \uFF4F after O\n [0xFF30, 1], // \uFF30 after P\n [0xFF50, 1], // \uFF50 after P\n [0xFF31, 1], // \uFF31 after Q\n [0xFF51, 1], // \uFF51 after Q\n [0xFF32, 1], // \uFF32 after R\n [0xFF52, 1], // \uFF52 after R\n [0xFF33, 1], // \uFF33 after S\n [0xFF53, 1], // \uFF53 after S\n [0xFF34, 1], // \uFF34 after T\n [0xFF54, 1], // \uFF54 after T\n [0xFF35, 1], // \uFF35 after U\n [0xFF55, 1], // \uFF55 after U\n [0xFF36, 1], // \uFF36 after V\n [0xFF56, 1], // \uFF56 after V\n [0xFF37, 1], // \uFF37 after W\n [0xFF57, 1], // \uFF57 after W\n [0xFF38, 1], // \uFF38 after X\n [0xFF58, 1], // \uFF58 after X\n [0xFF39, 1], // \uFF39 after Y\n [0xFF59, 1], // \uFF59 after Y\n [0xFF3A, 1], // \uFF3A after Z\n [0xFF5A, 1], // \uFF5A after Z\n [0xFF3B, 1], // \uFF3B after [\n [0xFF3D, 1], // \uFF3D after ]\n [0xFF3E, 1], // \uFF3E after ^\n [0xFF3F, 1], // \uFF3F after _\n [0xFF40, 1], // \uFF40 after `\n [0xFF5B, 1], // \uFF5B after {\n [0xFF5C, 1], // \uFF5C after |\n [0xFF5D, 1], // \uFF5D after }\n [0xFF5E, 1], // \uFF5E after ~\n [0xFFE0, 1], // \uFFE0 after \u00A2\n [0xFFE1, 1], // \uFFE1 after \u00A3\n [0xFFE5, 1], // \uFFE5 after \u00A5\n [0xFFE4, 1], // \uFFE4 after \u00A6\n [0xFF64, 1], // \uFF64 after \u3001\n [0xFF61, 1], // \uFF61 after \u3002\n [0xFF62, 1], // \uFF62 after \u300C\n [0xFF63, 1], // \uFF63 after \u300D\n [0x30A2, 1], // \u30A2 after \u3041\n [0xFF71, 2], // \uFF71 after \u3041\n [0x30A1, 3], // \u30A1 after \u3041\n [0xFF67, 4], // \uFF67 after \u3041\n [0x30A4, 1], // \u30A4 after \u3043\n [0xFF72, 2], // \uFF72 after \u3043\n [0x30A3, 3], // \u30A3 after \u3043\n [0xFF68, 4], // \uFF68 after \u3043\n [0x30A6, 1], // \u30A6 after \u3045\n [0x30F4, 1], // \u30F4 after \u3045\n [0xFF73, 2], // \uFF73 after \u3045\n [0x30A5, 3], // \u30A5 after \u3045\n [0xFF69, 4], // \uFF69 after \u3045\n [0x30A8, 1], // \u30A8 after \u3047\n [0xFF74, 2], // \uFF74 after \u3047\n [0x30A7, 3], // \u30A7 after \u3047\n [0xFF6A, 4], // \uFF6A after \u3047\n [0x30AA, 1], // \u30AA after \u3049\n [0xFF75, 2], // \uFF75 after \u3049\n [0x30A9, 3], // \u30A9 after \u3049\n [0xFF6B, 4], // \uFF6B after \u3049\n [0x30F5, 1], // \u30F5 after \u304B\n [0x30AB, 2], // \u30AB after \u304B\n [0x30AC, 2], // \u30AC after \u304B\n [0xFF76, 3], // \uFF76 after \u304B\n [0x30AD, 1], // \u30AD after \u304D\n [0x30AE, 1], // \u30AE after \u304D\n [0xFF77, 2], // \uFF77 after \u304D\n [0x30AF, 1], // \u30AF after \u304F\n [0x30B0, 1], // \u30B0 after \u304F\n [0xFF78, 2], // \uFF78 after \u304F\n [0x30F6, 1], // \u30F6 after \u3051\n [0x30B1, 2], // \u30B1 after \u3051\n [0x30B2, 2], // \u30B2 after \u3051\n [0xFF79, 3], // \uFF79 after \u3051\n [0x30B3, 1], // \u30B3 after \u3053\n [0x30B4, 1], // \u30B4 after \u3053\n [0xFF7A, 2], // \uFF7A after \u3053\n [0x30B5, 1], // \u30B5 after \u3055\n [0x30B6, 1], // \u30B6 after \u3055\n [0xFF7B, 2], // \uFF7B after \u3055\n [0x30B7, 1], // \u30B7 after \u3057\n [0x30B8, 1], // \u30B8 after \u3057\n [0xFF7C, 2], // \uFF7C after \u3057\n [0x30B9, 1], // \u30B9 after \u3059\n [0x30BA, 1], // \u30BA after \u3059\n [0xFF7D, 2], // \uFF7D after \u3059\n [0x30BB, 1], // \u30BB after \u305B\n [0x30BC, 1], // \u30BC after \u305B\n [0xFF7E, 2], // \uFF7E after \u305B\n [0x30BD, 1], // \u30BD after \u305D\n [0x30BE, 1], // \u30BE after \u305D\n [0xFF7F, 2], // \uFF7F after \u305D\n [0x30BF, 1], // \u30BF after \u305F\n [0x30C0, 1], // \u30C0 after \u305F\n [0xFF80, 2], // \uFF80 after \u305F\n [0x30C1, 1], // \u30C1 after \u3061\n [0x30C2, 1], // \u30C2 after \u3061\n [0xFF81, 2], // \uFF81 after \u3061\n [0x30C4, 1], // \u30C4 after \u3063\n [0x30C5, 1], // \u30C5 after \u3063\n [0xFF82, 2], // \uFF82 after \u3063\n [0x30C3, 3], // \u30C3 after \u3063\n [0xFF6F, 4], // \uFF6F after \u3063\n [0x30C6, 1], // \u30C6 after \u3066\n [0x30C7, 1], // \u30C7 after \u3066\n [0xFF83, 2], // \uFF83 after \u3066\n [0x30C8, 1], // \u30C8 after \u3068\n [0x30C9, 1], // \u30C9 after \u3068\n [0xFF84, 2], // \uFF84 after \u3068\n [0x30CA, 1], // \u30CA after \u306A\n [0xFF85, 2], // \uFF85 after \u306A\n [0x30CB, 1], // \u30CB after \u306B\n [0xFF86, 2], // \uFF86 after \u306B\n [0x30CC, 1], // \u30CC after \u306C\n [0xFF87, 2], // \uFF87 after \u306C\n [0x30CD, 1], // \u30CD after \u306D\n [0xFF88, 2], // \uFF88 after \u306D\n [0x30CE, 1], // \u30CE after \u306E\n [0xFF89, 2], // \uFF89 after \u306E\n [0x30CF, 1], // \u30CF after \u306F\n [0x30D0, 1], // \u30D0 after \u306F\n [0x30D1, 1], // \u30D1 after \u306F\n [0xFF8A, 2], // \uFF8A after \u306F\n [0x30D2, 1], // \u30D2 after \u3072\n [0x30D3, 1], // \u30D3 after \u3072\n [0x30D4, 1], // \u30D4 after \u3072\n [0xFF8B, 2], // \uFF8B after \u3072\n [0x30D5, 1], // \u30D5 after \u3075\n [0x30D6, 1], // \u30D6 after \u3075\n [0x30D7, 1], // \u30D7 after \u3075\n [0xFF8C, 2], // \uFF8C after \u3075\n [0x30D8, 1], // \u30D8 after \u3078\n [0x30D9, 1], // \u30D9 after \u3078\n [0x30DA, 1], // \u30DA after \u3078\n [0xFF8D, 2], // \uFF8D after \u3078\n [0x30DB, 1], // \u30DB after \u307B\n [0x30DC, 1], // \u30DC after \u307B\n [0x30DD, 1], // \u30DD after \u307B\n [0xFF8E, 2], // \uFF8E after \u307B\n [0x30DE, 1], // \u30DE after \u307E\n [0xFF8F, 2], // \uFF8F after \u307E\n [0x30DF, 1], // \u30DF after \u307F\n [0xFF90, 2], // \uFF90 after \u307F\n [0x30E0, 1], // \u30E0 after \u3080\n [0xFF91, 2], // \uFF91 after \u3080\n [0x30E1, 1], // \u30E1 after \u3081\n [0xFF92, 2], // \uFF92 after \u3081\n [0x30E2, 1], // \u30E2 after \u3082\n [0xFF93, 2], // \uFF93 after \u3082\n [0x30E4, 1], // \u30E4 after \u3083\n [0xFF94, 2], // \uFF94 after \u3083\n [0x30E3, 3], // \u30E3 after \u3083\n [0xFF6C, 4], // \uFF6C after \u3083\n [0x30E6, 1], // \u30E6 after \u3085\n [0xFF95, 2], // \uFF95 after \u3085\n [0x30E5, 3], // \u30E5 after \u3085\n [0xFF6D, 4], // \uFF6D after \u3085\n [0x30E8, 1], // \u30E8 after \u3087\n [0xFF96, 2], // \uFF96 after \u3087\n [0x30E7, 3], // \u30E7 after \u3087\n [0xFF6E, 4], // \uFF6E after \u3087\n [0x30E9, 1], // \u30E9 after \u3089\n [0xFF97, 2], // \uFF97 after \u3089\n [0x30EA, 1], // \u30EA after \u308A\n [0xFF98, 2], // \uFF98 after \u308A\n [0x30EB, 1], // \u30EB after \u308B\n [0xFF99, 2], // \uFF99 after \u308B\n [0x30EC, 1], // \u30EC after \u308C\n [0xFF9A, 2], // \uFF9A after \u308C\n [0x30ED, 1], // \u30ED after \u308D\n [0xFF9B, 2], // \uFF9B after \u308D\n [0x30EF, 1], // \u30EF after \u308E\n [0x30F7, 1], // \u30F7 after \u308E\n [0xFF9C, 2], // \uFF9C after \u308E\n [0x30EE, 3], // \u30EE after \u308E\n [0x30F0, 1], // \u30F0 after \u3090\n [0x30F8, 1], // \u30F8 after \u3090\n [0x30F1, 1], // \u30F1 after \u3091\n [0x30F9, 1], // \u30F9 after \u3091\n [0x30F2, 1], // \u30F2 after \u3092\n [0x30FA, 1], // \u30FA after \u3092\n [0xFF66, 2], // \uFF66 after \u3092\n [0x30F3, 1], // \u30F3 after \u3093\n [0xFF9D, 2], // \uFF9D after \u3093\n [0xFF65, 1], // \uFF65 after \u30FB\n [0xFFA1, 1], // \uFFA1 after \u3131\n [0xFFA2, 1], // \uFFA2 after \u3132\n [0xFFA3, 1], // \uFFA3 after \u3133\n [0xFFA4, 1], // \uFFA4 after \u3134\n [0xFFA5, 1], // \uFFA5 after \u3135\n [0xFFA6, 1], // \uFFA6 after \u3136\n [0xFFA7, 1], // \uFFA7 after \u3137\n [0xFFA8, 1], // \uFFA8 after \u3138\n [0xFFA9, 1], // \uFFA9 after \u3139\n [0xFFAA, 1], // \uFFAA after \u313A\n [0xFFAB, 1], // \uFFAB after \u313B\n [0xFFAC, 1], // \uFFAC after \u313C\n [0xFFAD, 1], // \uFFAD after \u313D\n [0xFFAE, 1], // \uFFAE after \u313E\n [0xFFAF, 1], // \uFFAF after \u313F\n [0xFFB0, 1], // \uFFB0 after \u3140\n [0xFFB1, 1], // \uFFB1 after \u3141\n [0xFFB2, 1], // \uFFB2 after \u3142\n [0xFFB3, 1], // \uFFB3 after \u3143\n [0xFFB4, 1], // \uFFB4 after \u3144\n [0xFFB5, 1], // \uFFB5 after \u3145\n [0xFFB6, 1], // \uFFB6 after \u3146\n [0xFFB7, 1], // \uFFB7 after \u3147\n [0xFFB8, 1], // \uFFB8 after \u3148\n [0xFFB9, 1], // \uFFB9 after \u3149\n [0xFFBA, 1], // \uFFBA after \u314A\n [0xFFBB, 1], // \uFFBB after \u314B\n [0xFFBC, 1], // \uFFBC after \u314C\n [0xFFBD, 1], // \uFFBD after \u314D\n [0xFFBE, 1], // \uFFBE after \u314E\n [0xFFC2, 1], // \uFFC2 after \u314F\n [0xFFC3, 1], // \uFFC3 after \u3150\n [0xFFC4, 1], // \uFFC4 after \u3151\n [0xFFC5, 1], // \uFFC5 after \u3152\n [0xFFC6, 1], // \uFFC6 after \u3153\n [0xFFC7, 1], // \uFFC7 after \u3154\n [0xFFCA, 1], // \uFFCA after \u3155\n [0xFFCB, 1], // \uFFCB after \u3156\n [0xFFCC, 1], // \uFFCC after \u3157\n [0xFFCD, 1], // \uFFCD after \u3158\n [0xFFCE, 1], // \uFFCE after \u3159\n [0xFFCF, 1], // \uFFCF after \u315A\n [0xFFD2, 1], // \uFFD2 after \u315B\n [0xFFD3, 1], // \uFFD3 after \u315C\n [0xFFD4, 1], // \uFFD4 after \u315D\n [0xFFD5, 1], // \uFFD5 after \u315E\n [0xFFD6, 1], // \uFFD6 after \u315F\n [0xFFD7, 1], // \uFFD7 after \u3160\n [0xFFDA, 1], // \uFFDA after \u3161\n [0xFFDB, 1], // \uFFDB after \u3162\n [0xFFDC, 1], // \uFFDC after \u3163\n [0xFFA0, 1], // \uFFA0 after \u3164\n]);\n", "// A culture's order of text, as the C# engine orders text Items by label: CompareInfo.Compare with\n// IgnoreCase, which is ICU's collation at secondary strength, `Intl.Collator`'s `accent` sensitivity, with\n// the rules .NET adds to it. Ties are broken ordinally by the caller, so the order is total.\n//\n// .NET keeps the kana type and the width apart even while it ignores case: it tailors each katakana to\n// sort after its hiragana, and each half-width or full-width form after its usual form, as a difference of\n// the first strength (System.Globalization.Native's custom rules). So in ja-JP \u3042\u3081 comes before \u30A2\u30C3\u30D7\u30EB,\n// where ICU alone puts \u30A2\u30C3\u30D7\u30EB first. `Intl.Collator` takes no rules, so the difference is found here: on\n// the first characters that ICU gives one primary weight but .NET ranks apart (tailored-ranks.ts), before\n// any later letter differs. Character by character: where a full-width or kana form meets a contraction\n// (Danish aa, which is \u00E5), or an expansion, the order can differ from .NET's.\n\nimport { tailoredRanks } from './tailored-ranks';\n\nconst collators = new Map<string, Intl.Collator>();\nconst baseCollators = new Map<string, Intl.Collator>();\n\nfunction collator(culture: string, sensitivity: 'accent' | 'base', cache: Map<string, Intl.Collator>): Intl.Collator {\n let found = cache.get(culture);\n if (found === undefined) {\n found = new Intl.Collator(culture === 'invariant' ? 'und' : culture, { sensitivity, usage: 'sort' });\n cache.set(culture, found);\n }\n return found;\n}\n\n// Katakana, the small kana and the half-width and full-width forms: what .NET's rules rank.\nconst anyTailored = /[\u30A1-\u30FA\uFF01-\uFFEE]/;\n\nfunction rankOf(character: string): number {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) throw new Error('Internal: an empty character.');\n const rank = tailoredRanks.get(codePoint);\n return rank === undefined ? 0 : rank;\n}\n\n/** -1, 0 or 1 as `a` sorts before, with or after `b` in `culture`, ignoring case, as .NET orders them. */\nexport function compareInCulture(culture: string, a: string, b: string): number {\n const accent = collator(culture, 'accent', collators);\n if (anyTailored.test(a) || anyTailored.test(b)) {\n const base = collator(culture, 'base', baseCollators);\n const left = Array.from(a);\n const right = Array.from(b);\n const length = Math.min(left.length, right.length);\n for (let i = 0; i < length; i++) {\n const x = left[i];\n const y = right[i];\n if (x === undefined || y === undefined) throw new Error('Internal: a character outside the text.');\n if (base.compare(x, y) !== 0) break;\n const rx = rankOf(x);\n const ry = rankOf(y);\n if (rx !== ry) return rx < ry ? -1 : 1;\n }\n }\n return Math.sign(accent.compare(a, b));\n}\n", "// Excel's General as a PivotTable's value cell shows it, and as it labels a number Item (ADR-0060; the\n// readings of 2026-10-12, R3 (c)): at most eleven characters besides a minus sign. Decimals are rounded\n// to what fits, and the form is scientific where the integer part has twelve or more digits, or where the\n// scientific form is closer to the number than the decimal form that fits: 1.414213562, 1.23456789,\n// 1.23457E+11, 1.23457E-05. The C# engine's PivotGeneral, transcribed; the minus sign is `-` in every\n// culture, and only the decimal separator is the culture's.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport type { NumberCulture } from '../culture/culture-data';\nimport { invariantNumbers } from './invariant';\nimport { formatDecimal, formatDouble } from './number-text';\n\n/** The most characters General shows, not counting a minus sign. */\nexport const generalCharacters = 11;\n\n/** A double in General, under the culture's decimal separator. */\nexport function generalOfDouble(number: number, culture: NumberCulture): string {\n if (!Number.isFinite(number)) return formatDouble(number, undefined, culture);\n const magnitude = Math.abs(number);\n return form(number < 0, formatDouble(magnitude, 'E14', invariantNumbers),\n (decimalForm, scientific) => Math.abs(Number(decimalForm) - magnitude) <= Math.abs(Number(scientific) - magnitude), culture);\n}\n\n/** An exact decimal in General: its own digits are rounded, never a double's, so a sum of money is shown\n * from the sum itself (ADR-0060, \"Money stays exact\"). The two forms are built from its fifteen\n * significant digits, and which is closer is judged against those same digits. */\nexport function generalOfDecimal(number: SnapshotDecimal, culture: NumberCulture): string {\n const magnitude = { mantissa: number.mantissa < 0n ? -number.mantissa : number.mantissa, scale: number.scale };\n const e14 = formatDecimal(magnitude, 'E14', invariantNumbers);\n const fifteen = exactOf(e14);\n return form(number.mantissa < 0n, e14,\n (decimalForm, scientific) => compareMagnitudes(distance(exactOf(decimalForm), fifteen), distance(exactOf(scientific), fifteen)) <= 0,\n culture);\n}\n\n/** An invariant number's text, `-1.5`, `1.23457E+11`, as an exact fraction: digits over a power of ten. */\ninterface Exact {\n readonly digits: bigint;\n readonly scale: number;\n}\n\nfunction exactOf(text: string): Exact {\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?(?:E([+-]\\d+))?$/.exec(text);\n if (match === null) throw new Error(`Internal: '${text}' is not a number General wrote.`);\n const [, sign = '', whole = '', fraction = '', exponent = '0'] = match;\n const scale = fraction.length - Number(exponent);\n const digits = BigInt(sign + whole + fraction);\n return scale >= 0 ? { digits, scale } : { digits: digits * 10n ** BigInt(-scale), scale: 0 };\n}\n\nfunction distance(a: Exact, b: Exact): Exact {\n const scale = Math.max(a.scale, b.scale);\n const difference = a.digits * 10n ** BigInt(scale - a.scale) - b.digits * 10n ** BigInt(scale - b.scale);\n return { digits: difference < 0n ? -difference : difference, scale };\n}\n\nfunction compareMagnitudes(a: Exact, b: Exact): number {\n const scale = Math.max(a.scale, b.scale);\n const left = a.digits * 10n ** BigInt(scale - a.scale);\n const right = b.digits * 10n ** BigInt(scale - b.scale);\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n/** The form of a magnitude written `d.ddddddddddddddE\u00B1xxx`: fifteen significant digits, rounded again\n * from there. */\nfunction form(minus: boolean, e14: string, decimalIsCloser: (decimalForm: string, scientific: string) => boolean,\n culture: NumberCulture): string {\n const digits = e14.charAt(0) + e14.slice(2, 16);\n if (/^0+$/.test(digits)) return '0';\n const exponent = Number(e14.slice(17));\n const decimalForm = decimalText(digits, exponent, generalCharacters);\n const scientific = scientificText(digits, exponent, generalCharacters);\n let chosen = decimalForm !== undefined && decimalIsCloser(decimalForm, scientific) ? decimalForm : scientific;\n const separator = culture.decimal;\n if (separator !== '.') chosen = chosen.replaceAll('.', separator);\n return (minus ? '-' : '') + chosen;\n}\n\n/** The decimal form, invariant, in at most `limit` characters, or `undefined` where none fits. */\nfunction decimalText(digits: string, exponent: number, limit: number): string | undefined {\n const integerDigits = exponent >= 0 ? exponent + 1 : 1;\n if (integerDigits > limit) return undefined;\n const fraction = Math.max(0, limit - integerDigits - 1);\n const [rounded, at] = round(digits, exponent, exponent + 1 + fraction);\n if (rounded.length === 0) return '0';\n const digitAt = (power: number): string => {\n const i = at - power;\n return i >= 0 && i < rounded.length ? rounded.charAt(i) : '0';\n };\n let text = at < 0 ? '0' : '';\n for (let p = at; p >= 0; p--) text += digitAt(p);\n let fractionText = '';\n for (let p = -1; p >= -fraction; p--) fractionText += digitAt(p);\n const trimmed = fractionText.replace(/0+$/, '');\n if (trimmed.length > 0) text += `.${trimmed}`;\n return text.length <= limit ? text : undefined;\n}\n\n/** The scientific form, invariant, in at most `limit` characters; eleven always hold one. */\nfunction scientificText(digits: string, exponent: number, limit: number): string {\n for (let mantissaFraction = Math.max(0, limit - 6); mantissaFraction >= 0; mantissaFraction--) {\n const [rounded, at] = round(digits, exponent, 1 + mantissaFraction);\n const mantissa = rounded.replace(/0+$/, '');\n let text = mantissa.charAt(0);\n if (mantissa.length > 1) text += `.${mantissa.slice(1)}`;\n const power = Math.abs(at);\n text += (at < 0 ? 'E-' : 'E+') + power.toString().padStart(power >= 100 ? 3 : 2, '0');\n if (text.length <= limit) return text;\n }\n throw new Error(`Internal: no scientific form of ${digits}E${exponent} fits ${limit} characters.`);\n}\n\n/** `digits` (the first at 10^`exponent`) rounded half away from zero to `keep` significant digits: the\n * digits kept, and the power of ten of the first. Empty when the number rounds to zero. */\nfunction round(digits: string, exponent: number, keep: number): [string, number] {\n if (keep >= digits.length) return [digits, exponent];\n if (keep < 0) return ['', exponent];\n if (keep === 0) return digits.charCodeAt(0) >= 53 ? ['1', exponent + 1] : ['', exponent];\n const kept = digits.slice(0, keep).split('');\n if (digits.charCodeAt(keep) >= 53) {\n let i = keep - 1;\n while (i >= 0 && kept[i] === '9') {\n kept[i] = '0';\n i--;\n }\n if (i < 0) return [`1${kept.join('')}`, exponent + 1];\n kept[i] = String.fromCharCode((kept[i] ?? '0').charCodeAt(0) + 1); // oxlint-disable-line ex-grid/no-stand-in-default -- i lies within kept, checked by the loop above\n }\n return [kept.join(''), exponent];\n}\n", "// How a report labels and orders Items (ADR-0060): a number Item in its field's format or in General, a date\n// in its format or the locale's short date, a date part in the report's words, `(blank)`, `#NUM!`, TRUE and\n// FALSE; and the order by label \u2014 `(blank)` last always, a declared Item order first, keyed Items by their\n// Order Key, then by kind, numbers and dates by value, text by the locale's collation ignoring case. The C#\n// engine's ItemLabels and ItemOrder.\n\nimport type { Culture } from '../culture/culture-data';\nimport { cultureOf } from '../culture/culture-data';\nimport { PivotFormatError, PivotOrderKeyError } from '../errors';\nimport type { FieldMeta, PivotOrderKeyValue } from '../fields/pivot-field';\nimport { keyIdOf, pivotErrorText } from '../items/item-key';\nimport { itemKindOrder } from '../layout/pivot-enums';\nimport { compareOrdinal } from '../text/casing';\nimport { compareInCulture } from '../text/collation';\nimport { formatDate } from '../text/date-text';\nimport { generalOfDouble } from '../text/general';\nimport { formatDouble } from '../text/number-text';\nimport { datePartLabel, datePartTakes, pivotWordIds, resolveWord, type PivotLabel } from '../words/pivot-words';\nimport type { ItemRef } from '../cube/cube';\nimport { unreachable } from '../must';\n\n/** What a report is laid out in: a locale \u2014 a BCP 47 tag or `invariant` \u2014 and the words it is written in. */\nexport interface PivotOptions {\n /** The locale numbers and dates are written in and text is ordered by (ADR-0370 \u00A710); the browser's\n * language when left out. */\n readonly locale?: string;\n /** The report's words by id, for those the Consumer translates; English for the rest. */\n readonly label?: PivotLabel;\n}\n\n/** Options resolved: the culture, and the word of an id. */\nexport interface ResolvedOptions {\n readonly culture: Culture;\n readonly label: PivotLabel | undefined;\n word(id: string): string;\n}\n\n// The browser's language, or none where the runtime has no navigator.\nfunction browserLanguage(): string | undefined {\n const navigator: unknown = Reflect.get(globalThis, 'navigator');\n if (typeof navigator !== 'object' || navigator === null) return undefined;\n const language: unknown = Reflect.get(navigator, 'language');\n return typeof language === 'string' && language.length > 0 ? language : undefined;\n}\n\n/** The options resolved, refusing a locale the engine does not format in. With no locale given, the\n * browser's language is taken; where there is none, the locale must be given. */\nexport function resolveOptions(options: PivotOptions = {}): ResolvedOptions {\n const locale = options.locale ?? browserLanguage();\n if (locale === undefined) throw new TypeError(\"A report's options name its locale where the runtime has no browser language.\");\n if (typeof locale !== 'string') throw new TypeError(\"A report's locale is a BCP 47 tag or 'invariant'.\");\n const culture = cultureOf(locale);\n const label = options.label;\n return Object.freeze({ culture, label, word: (id: string) => resolveWord(id, label) });\n}\n\nconst ticksPerDay = 864_000_000_000n;\n\n// A format .NET cannot apply to the value writes it in its own text, as C#'s PivotNumberFormat.Apply does;\n// a field's format is checked when it is declared, so only an unusual value reaches here.\nfunction applyDouble(value: number, format: string, culture: Culture): string {\n try {\n return formatDouble(value, format, culture.data.number);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- C#'s PivotNumberFormat.Apply writes the value in its own text when .NET refuses the format\n\n if (!(error instanceof PivotFormatError)) throw error;\n }\n return formatDouble(value, undefined, culture.data.number);\n}\n\nfunction applyDate(ticks: bigint, format: string, culture: Culture): string {\n try {\n return formatDate(ticks, format, culture.data.date);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- C#'s Apply writes the date in its own text when .NET refuses the format\n\n if (!(error instanceof PivotFormatError)) throw error;\n }\n return formatDate(ticks, undefined, culture.data.date);\n}\n\n/** The labels of a report's Items, each computed once. */\nexport class ItemLabels {\n readonly #options: ResolvedOptions;\n readonly #labels = new Map<ItemRef, string>();\n\n constructor(options: ResolvedOptions) {\n this.#options = options;\n }\n\n /** The label of an Item of a field. */\n of(item: ItemRef, meta: FieldMeta): string {\n let label = this.#labels.get(item);\n if (label === undefined) {\n label = this.#compute(item, meta);\n this.#labels.set(item, label);\n }\n return label;\n }\n\n /** The number a number Item's label shows, for its copy; `undefined` for any other, a date part's word\n * included. */\n static numberOf(item: ItemRef, meta: FieldMeta): number | undefined {\n if (item.key.kind !== 'number') return undefined;\n const part = meta.field.datePart;\n if (part !== undefined && datePartTakes(part, item.key.number)) return undefined;\n return item.key.number;\n }\n\n #compute(item: ItemRef, meta: FieldMeta): string {\n const culture = this.#options.culture;\n const key = item.key;\n const part = meta.field.datePart;\n // A date part is labelled as Excel labels it, in the report's words: 2026, Qtr3, Sep.\n if (part !== undefined && key.kind === 'number' && datePartTakes(part, key.number)) {\n return datePartLabel(part, key.number, this.#options.label);\n }\n switch (key.kind) {\n case 'blank': return this.#options.word(pivotWordIds.blank);\n case 'error': return pivotErrorText;\n case 'boolean': return key.ticks === 1n ? 'TRUE' : 'FALSE';\n case 'number': {\n const format = meta.field.format;\n return format === undefined ? generalOfDouble(key.number, culture.data.number) : applyDouble(key.number, format, culture);\n }\n case 'date': {\n const format = meta.field.format ?? (key.ticks % ticksPerDay === 0n ? 'd' : 'G');\n return applyDate(key.ticks, format, culture);\n }\n case 'text': return key.text;\n default: return unreachable(key.kind);\n }\n }\n}\n\n// C#'s IComparable.CompareTo for each kind an Order Key gives: NaN below every number, false below true;\n// text compared ordinally, where C# compares it in the process's culture, which a browser has no share in.\nfunction compareKeys(x: PivotOrderKeyValue, y: PivotOrderKeyValue): number {\n if (typeof x === 'number' && typeof y === 'number') {\n if (Number.isNaN(x)) return Number.isNaN(y) ? 0 : -1;\n if (Number.isNaN(y)) return 1;\n return x < y ? -1 : x > y ? 1 : 0;\n }\n if (typeof x === 'bigint' && typeof y === 'bigint') return x < y ? -1 : x > y ? 1 : 0;\n if (typeof x === 'boolean' && typeof y === 'boolean') return x === y ? 0 : x ? 1 : -1;\n if (typeof x === 'string' && typeof y === 'string') return compareOrdinal(x, y);\n throw new Error('Internal: two Order Keys of different types are compared.');\n}\n\nfunction keyTypeName(key: PivotOrderKeyValue): string {\n return typeof key;\n}\n\n/** The order of one field's Items by label (ADR-0060), ascending or descending; `(blank)` is last either\n * way. With `byKey` false, as a sort by value's ties are broken, the Order Key is not read. */\nexport class ItemOrder {\n readonly #meta: FieldMeta;\n readonly #labels: ItemLabels;\n readonly #culture: string;\n readonly #descending: boolean;\n readonly #byKey: boolean;\n #firstKeyed: ItemRef | undefined;\n\n constructor(meta: FieldMeta, labels: ItemLabels, culture: Culture, descending: boolean, byKey = true) {\n this.#meta = meta;\n this.#labels = labels;\n this.#culture = culture.name;\n this.#descending = descending;\n this.#byKey = byKey;\n }\n\n /** Asks the Order Key of each Item, once: one that throws is refused, naming the field and the Item,\n * and so are keys of two types. */\n prepare(item: ItemRef): void {\n const orderKey = this.#meta.field.orderKey;\n if (!this.#byKey || orderKey === undefined) return;\n if (!item.hasOrderKey) {\n let key: PivotOrderKeyValue | undefined;\n if (item.key.kind !== 'blank' && item.key.kind !== 'error' && item.firstValue !== undefined) {\n let given: unknown;\n try {\n given = orderKey(item.firstValue);\n } catch (error) {\n // An Order Key that refuses in its own words, naming this field, is refused in them.\n if (error instanceof PivotOrderKeyError && error.field === this.#meta.field.name) throw error;\n throw new PivotOrderKeyError(this.#meta.field.name,\n `The Order Key of ${this.#meta.field.caption} failed on '${this.#labels.of(item, this.#meta)}'.`, { cause: error });\n }\n key = this.#keyOf(given, item);\n }\n item.setOrderKey(key);\n }\n const key = item.orderKey;\n if (key === undefined) return;\n const first = this.#firstKeyed;\n if (first === undefined) {\n this.#firstKeyed = item;\n return;\n }\n const firstKey = first.orderKey;\n if (firstKey !== undefined && typeof firstKey !== typeof key) {\n throw new PivotOrderKeyError(this.#meta.field.name,\n `The Order Key of ${this.#meta.field.caption} gave '${this.#labels.of(first, this.#meta)}' a key of type ${keyTypeName(firstKey)} `\n + `and '${this.#labels.of(item, this.#meta)}' one of type ${keyTypeName(key)}; a field's keys are of one type.`);\n }\n }\n\n #keyOf(given: unknown, item: ItemRef): PivotOrderKeyValue | undefined {\n if (given === null || given === undefined) return undefined;\n if (typeof given === 'string' || typeof given === 'number' || typeof given === 'bigint' || typeof given === 'boolean') return given;\n throw new PivotOrderKeyError(this.#meta.field.name,\n `The Order Key of ${this.#meta.field.caption} gave '${this.#labels.of(item, this.#meta)}' a key that is not a string, a number, a bigint or a Boolean.`);\n }\n\n /** -1, 0 or 1 as `x` comes before, with or after `y`. */\n compare(x: ItemRef, y: ItemRef): number {\n if (x === y) return 0;\n const xBlank = x.key.kind === 'blank';\n const yBlank = y.key.kind === 'blank';\n if (xBlank || yBlank) return xBlank === yBlank ? 0 : xBlank ? 1 : -1;\n const ascending = this.#ascending(x, y);\n return this.#descending ? -ascending : ascending;\n }\n\n #ascending(x: ItemRef, y: ItemRef): number {\n const xAt = this.#meta.declaredOrder.get(keyIdOf(x.key));\n const yAt = this.#meta.declaredOrder.get(keyIdOf(y.key));\n if (xAt !== undefined || yAt !== undefined) {\n if (xAt !== undefined && yAt !== undefined) return Math.sign(xAt - yAt);\n return xAt !== undefined ? -1 : 1;\n }\n if (this.#byKey && this.#meta.field.orderKey !== undefined) {\n // Keyed Items first, by key; the Items with no key after them; ties by label.\n const xKey = x.hasOrderKey ? x.orderKey : undefined;\n const yKey = y.hasOrderKey ? y.orderKey : undefined;\n if (xKey !== undefined && yKey !== undefined) {\n const byKeys = compareKeys(xKey, yKey);\n if (byKeys !== 0) return byKeys;\n } else if (xKey !== undefined || yKey !== undefined) {\n return xKey !== undefined ? -1 : 1;\n }\n }\n if (x.key.kind !== y.key.kind) return Math.sign(itemKindOrder(x.key.kind) - itemKindOrder(y.key.kind));\n switch (x.key.kind) {\n case 'number': return x.key.number < y.key.number ? -1 : x.key.number > y.key.number ? 1 : 0;\n case 'date':\n case 'boolean': return x.key.ticks < y.key.ticks ? -1 : x.key.ticks > y.key.ticks ? 1 : 0;\n case 'text': {\n const xText = this.#labels.of(x, this.#meta);\n const yText = this.#labels.of(y, this.#meta);\n const compared = compareInCulture(this.#culture, xText, yText);\n return compared !== 0 ? compared : compareOrdinal(xText, yText);\n }\n case 'error':\n case 'blank': return 0;\n default: return unreachable(x.key.kind);\n }\n }\n}\n", "// The parts a Leaf Aggregate is made of, and the arithmetic over them (ADR-0060/0066/0130): how one number\n// is folded into each part, how two parts of one field merge, how a part is finished, and how an\n// Aggregation is read from the parts. Every part combines exactly \u2014 counts and exact sums add, extremes\n// compare, products multiply and running variances merge \u2014 so a total merged from its pieces is the total\n// of its values, never a total of totals. Money stays exact until it cannot: then double, Excel's own\n// arithmetic. ExGrid.Data's AggregateArithmetic and ExPivot's PartColumns, transcribed: the order of every\n// double operation is the C# engine's, so a sum agrees with it to the last bit.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport { pivotErrorText } from '../items/item-key';\nimport type { PivotAggregation } from '../layout/pivot-enums';\nimport { elementAt, unreachable } from '../must';\nimport { decimalAdd, decimalCanonical, decimalCompare, decimalDivide, decimalOfWhole, decimalToNumber, decimalZero } from './exact-decimal';\n\n/** The text of a division by zero. */\nexport const divideByZeroText = '#DIV/0!';\n\n/** The parts a question asks of one field in Values, as bits: the counts always travel, and are 0. */\nexport const partSum = 1;\n/** Max and Min read the extremes. */\nexport const partExtremes = 2;\n/** Product reads the product. */\nexport const partProduct = 4;\n/** StdDev, StdDevp, Var and Varp read the running variance. */\nexport const partVariance = 8;\n/** Every part. */\nexport const allParts = partSum | partExtremes | partProduct | partVariance;\n\n/** The parts an Aggregation reads. */\nexport function partsOf(aggregation: PivotAggregation): number {\n switch (aggregation) {\n case 'sum':\n case 'average': return partSum;\n case 'max':\n case 'min': return partExtremes;\n case 'product': return partProduct;\n case 'stdDev':\n case 'stdDevp':\n case 'var':\n case 'varp': return partVariance;\n case 'count':\n case 'countNumbers': return 0;\n default: throw new RangeError(`Unknown PivotAggregation '${String(aggregation satisfies never)}'.`);\n }\n}\n\n/** The parts' names as C#'s PivotParts writes them: `Sum, Extremes`, or `Counts` for none. */\nexport function partsText(parts: number): string {\n const names: string[] = [];\n if ((parts & partSum) !== 0) names.push('Sum');\n if ((parts & partExtremes) !== 0) names.push('Extremes');\n if ((parts & partProduct) !== 0) names.push('Product');\n if ((parts & partVariance) !== 0) names.push('Variance');\n return names.length === 0 ? 'Counts' : names.join(', ');\n}\n\n/** The counts every summarised set of values carries. */\nexport interface CountsPart {\n /** Values that are not Blank \u2014 Excel's COUNTA. */\n values: number;\n /** Values that are numbers, non-finite ones included. */\n numbers: number;\n /** A non-finite number was among the values: every numeric Aggregation is #NUM!. */\n nonFinite: boolean;\n}\n\n/** The sum part: exact while every number was, double once one was not or the exact sum overflowed. */\nexport interface SumPart {\n exact: SnapshotDecimal;\n double: number;\n /** Neumaier's running error of `double`, folded in once the part is finished. */\n compensation: number;\n inexact: boolean;\n}\n\n/** The extremes part: exact while every number was, double once one was not. */\nexport interface ExtremesPart {\n exactMin: SnapshotDecimal;\n exactMax: SnapshotDecimal;\n min: number;\n max: number;\n inexact: boolean;\n}\n\n/** The running variance: Welford's mean and sum of squared deviations, merged by Chan's rule. */\nexport interface VariancePart {\n mean: number;\n m2: number;\n}\n\nfunction noCounts(): CountsPart {\n return { values: 0, numbers: 0, nonFinite: false };\n}\n\n/** A sum that holds no number. */\nexport function noSum(): SumPart {\n return { exact: decimalZero, double: 0, compensation: 0, inexact: false };\n}\n\n/** Extremes that hold no number. */\nexport function noExtremes(): ExtremesPart {\n return { exactMin: decimalZero, exactMax: decimalZero, min: 0, max: 0, inexact: false };\n}\n\nfunction noVariance(): VariancePart {\n return { mean: 0, m2: 0 };\n}\n\n// ---- One number ---------------------------------------------------------------------------------\n\n/** Folds an exact number into a sum; `first` when the sum held no number before. */\nexport function addExactToSum(sum: SumPart, value: SnapshotDecimal, first: boolean): void {\n if (sum.inexact) {\n neumaier(sum, decimalToNumber(value));\n return;\n }\n if (first) {\n sum.exact = value;\n return;\n }\n const added = decimalAdd(sum.exact, value);\n if (added !== undefined) {\n sum.exact = added;\n return;\n }\n sumToInexact(sum);\n neumaier(sum, decimalToNumber(value));\n}\n\n/** Folds a finite double into a sum; `first` when the sum held no number before. */\nexport function addDoubleToSum(sum: SumPart, value: number, first: boolean): void {\n if (first) {\n sum.inexact = true;\n sum.double = value;\n return;\n }\n if (!sum.inexact) sumToInexact(sum);\n neumaier(sum, value);\n}\n\n/** A sum leaves exactness for double, starting from the exact sum it had, converted. */\nexport function sumToInexact(sum: SumPart): void {\n sum.inexact = true;\n sum.double = decimalToNumber(sum.exact);\n sum.compensation = 0;\n sum.exact = decimalZero;\n}\n\n/** Adds to a double sum with Neumaier's compensation. */\nexport function neumaier(sum: SumPart, value: number): void {\n const total = sum.double + value;\n sum.compensation += Math.abs(sum.double) >= Math.abs(value)\n ? (sum.double - total) + value\n : (value - total) + sum.double;\n sum.double = total;\n}\n\n/** Folds an exact number into extremes; `first` when they held no number before. */\nexport function addExactToExtremes(extremes: ExtremesPart, value: SnapshotDecimal, first: boolean): void {\n if (extremes.inexact) {\n addInexact(extremes, decimalToNumber(value));\n return;\n }\n if (first) {\n extremes.exactMin = value;\n extremes.exactMax = value;\n return;\n }\n if (decimalCompare(value, extremes.exactMin) < 0) extremes.exactMin = value;\n if (decimalCompare(value, extremes.exactMax) > 0) extremes.exactMax = value;\n}\n\n/** Folds a finite double into extremes; `first` when they held no number before. */\nexport function addDoubleToExtremes(extremes: ExtremesPart, value: number, first: boolean): void {\n if (first) {\n extremes.inexact = true;\n extremes.min = value;\n extremes.max = value;\n return;\n }\n if (!extremes.inexact) extremesToInexact(extremes);\n addInexact(extremes, value);\n}\n\n// The conversion is monotonic, so the double extremes of exact numbers are their exact extremes converted.\nfunction extremesToInexact(extremes: ExtremesPart): void {\n extremes.inexact = true;\n extremes.min = decimalToNumber(extremes.exactMin);\n extremes.max = decimalToNumber(extremes.exactMax);\n extremes.exactMin = decimalZero;\n extremes.exactMax = decimalZero;\n}\n\nfunction addInexact(extremes: ExtremesPart, value: number): void {\n if (value < extremes.min) extremes.min = value;\n if (value > extremes.max) extremes.max = value;\n}\n\n/** Folds a number into a running variance by Welford's rule; `count` is the numbers with this one. */\nexport function addToVariance(variance: VariancePart, value: number, count: number): void {\n const delta = value - variance.mean;\n variance.mean += delta / count;\n variance.m2 += delta * (value - variance.mean);\n}\n\n// ---- Merging ------------------------------------------------------------------------------------\n\nfunction mergeSum(sum: SumPart, other: SumPart, first: boolean): void {\n if (first) {\n Object.assign(sum, other);\n return;\n }\n if (!sum.inexact && !other.inexact) {\n const added = decimalAdd(sum.exact, other.exact);\n if (added !== undefined) {\n sum.exact = added;\n return;\n }\n sumToInexact(sum);\n neumaier(sum, decimalToNumber(other.exact));\n return;\n }\n if (!sum.inexact) sumToInexact(sum);\n if (other.inexact) {\n neumaier(sum, other.double);\n sum.compensation += other.compensation;\n } else {\n neumaier(sum, decimalToNumber(other.exact));\n }\n}\n\nfunction mergeExtremes(extremes: ExtremesPart, other: ExtremesPart, first: boolean): void {\n if (first) {\n Object.assign(extremes, other);\n return;\n }\n if (!extremes.inexact && !other.inexact) {\n if (decimalCompare(other.exactMin, extremes.exactMin) < 0) extremes.exactMin = other.exactMin;\n if (decimalCompare(other.exactMax, extremes.exactMax) > 0) extremes.exactMax = other.exactMax;\n return;\n }\n if (!extremes.inexact) extremesToInexact(extremes);\n addInexact(extremes, other.inexact ? other.min : decimalToNumber(other.exactMin));\n addInexact(extremes, other.inexact ? other.max : decimalToNumber(other.exactMax));\n}\n\nfunction mergeVariance(variance: VariancePart, other: VariancePart, count: number, otherCount: number): void {\n if (count === 0) {\n Object.assign(variance, other);\n return;\n }\n const n = count + otherCount;\n const delta = other.mean - variance.mean;\n variance.mean += delta * otherCount / n;\n variance.m2 += other.m2 + (delta * delta * count * otherCount / n);\n}\n\n// ---- Finishing ----------------------------------------------------------------------------------\n\n/** Ends a sum: a double takes its compensation in, and the figures it does not use are zeroed. */\nexport function finishSum(sum: SumPart): void {\n if (sum.inexact) {\n sum.double = sum.double + sum.compensation;\n sum.compensation = 0;\n sum.exact = decimalZero;\n } else {\n sum.double = 0;\n sum.compensation = 0;\n }\n}\n\n/** Ends extremes, as {@link finishSum} ends a sum. */\nexport function finishExtremes(extremes: ExtremesPart): void {\n if (extremes.inexact) {\n extremes.exactMin = decimalZero;\n extremes.exactMax = decimalZero;\n } else {\n extremes.min = 0;\n extremes.max = 0;\n }\n}\n\n// ---- Reading an Aggregation ---------------------------------------------------------------------\n\n/** An Aggregation's answer before it is shown: nothing, a number (exact where it could be) or an error\n * value's text. */\nexport type AggregateValue =\n | { readonly kind: 'empty' }\n | { readonly kind: 'error'; readonly error: string }\n | { readonly kind: 'number'; readonly number: number; readonly exact: SnapshotDecimal | undefined };\n\n/** No value at all: an empty cell. */\nexport const emptyValue: AggregateValue = Object.freeze({ kind: 'empty' });\n\n/** #DIV/0!. */\nexport const divideByZeroValue: AggregateValue = Object.freeze({ kind: 'error', error: divideByZeroText });\n\n/** #NUM!. */\nexport const numberErrorValue: AggregateValue = Object.freeze({ kind: 'error', error: pivotErrorText });\n\n/** An exact number. */\nexport function exactValue(value: SnapshotDecimal): AggregateValue {\n return Object.freeze({ kind: 'number', number: decimalToNumber(value), exact: value });\n}\n\n/** A double. */\nexport function doubleValue(value: number): AggregateValue {\n return Object.freeze({ kind: 'number', number: value, exact: undefined });\n}\n\n// A double that is not finite is #NUM!.\nfunction checked(value: number): AggregateValue {\n return Number.isFinite(value) ? doubleValue(value) : numberErrorValue;\n}\n\nfunction need<T>(part: T | undefined, aggregation: PivotAggregation): T {\n if (part === undefined) throw new Error(`${aggregation} reads a part that was not accumulated (ADR-0066).`);\n return part;\n}\n\n/** An Aggregation's answer from its parts, by the table in ADR-0060. */\nexport function readAggregate(\n aggregation: PivotAggregation,\n counts: CountsPart,\n sum: SumPart | undefined,\n extremes: ExtremesPart | undefined,\n product: number | undefined,\n variance: VariancePart | undefined,\n): AggregateValue {\n if (counts.values === 0) return emptyValue;\n if (aggregation === 'count') return exactValue(decimalOfWhole(BigInt(counts.values)));\n if (aggregation === 'countNumbers') return exactValue(decimalOfWhole(BigInt(counts.numbers)));\n const noNumber = counts.numbers === 0;\n switch (aggregation) {\n case 'sum':\n case 'max':\n case 'min':\n case 'product':\n if (noNumber) return exactValue(decimalZero);\n break;\n case 'average':\n case 'stdDev':\n case 'stdDevp':\n case 'var':\n case 'varp':\n if (noNumber) return divideByZeroValue;\n break;\n default:\n return unreachable(aggregation);\n }\n if (counts.nonFinite) return numberErrorValue;\n const n = counts.numbers;\n switch (aggregation) {\n case 'sum': {\n const s = need(sum, aggregation);\n return s.inexact ? checked(s.double + s.compensation) : exactValue(s.exact);\n }\n case 'average': {\n const s = need(sum, aggregation);\n return s.inexact ? checked((s.double + s.compensation) / n) : exactValue(decimalDivide(s.exact, n));\n }\n case 'max': {\n const e = need(extremes, aggregation);\n return e.inexact ? checked(e.max) : exactValue(e.exactMax);\n }\n case 'min': {\n const e = need(extremes, aggregation);\n return e.inexact ? checked(e.min) : exactValue(e.exactMin);\n }\n case 'product':\n return checked(need(product, aggregation));\n case 'stdDev':\n return n < 2 ? divideByZeroValue : checked(Math.sqrt(Math.max(0, need(variance, aggregation).m2) / (n - 1)));\n case 'stdDevp':\n return checked(Math.sqrt(Math.max(0, need(variance, aggregation).m2) / n));\n case 'var':\n return n < 2 ? divideByZeroValue : checked(Math.max(0, need(variance, aggregation).m2) / (n - 1));\n case 'varp':\n return checked(Math.max(0, need(variance, aggregation).m2) / n);\n default:\n return unreachable(aggregation);\n }\n}\n\n// ---- Column by column ---------------------------------------------------------------------------\n\n/**\n * One field in Values, held column by column over a set of cells \u2014 a question's leaves, or every cell of a\n * cube (ADR-0066). Only the parts asked for have columns, and only they are accumulated.\n */\nexport class PartColumns {\n readonly parts: number;\n readonly counts: CountsPart[] = [];\n readonly sums: SumPart[] | undefined;\n readonly extremes: ExtremesPart[] | undefined;\n readonly products: number[] | undefined;\n readonly variances: VariancePart[] | undefined;\n /** The sum of the magnitudes of each cell's numbers, as doubles added in the records' order: what bounds\n * the rounding of a sum that is a double, which a level answer carries with it (ADR-0370 section 3).\n * Kept only where {@link trackAbsolutes} asked for it, beside a sum. */\n absolutes: number[] | undefined;\n\n constructor(parts: number) {\n this.parts = parts;\n this.sums = (parts & partSum) !== 0 ? [] : undefined;\n this.extremes = (parts & partExtremes) !== 0 ? [] : undefined;\n this.products = (parts & partProduct) !== 0 ? [] : undefined;\n this.variances = (parts & partVariance) !== 0 ? [] : undefined;\n }\n\n /** How many cells there are. */\n get count(): number {\n return this.counts.length;\n }\n\n /** Keeps {@link absolutes} beside the sum from now on; the cells hold none yet. */\n trackAbsolutes(): void {\n if (this.sums === undefined) throw new Error('Internal: magnitudes are kept beside a sum.');\n this.absolutes ??= this.counts.map(() => 0);\n }\n\n /** Adds a number's magnitude to a cell's, where they are kept. */\n addAbsolute(cell: number, value: number): void {\n if (this.absolutes !== undefined) this.absolutes[cell] = elementAt(this.absolutes, cell) + Math.abs(value);\n }\n\n /** A new cell, holding no value; its index. */\n addCell(): number {\n const cell = this.counts.length;\n this.counts.push(noCounts());\n this.sums?.push(noSum());\n this.extremes?.push(noExtremes());\n this.products?.push(0);\n this.variances?.push(noVariance());\n this.absolutes?.push(0);\n return cell;\n }\n\n /** Empties a cell, as {@link addCell} makes it. */\n resetCell(cell: number): void {\n if (cell < 0 || cell >= this.counts.length) throw new RangeError(`There is no cell ${cell} of ${this.counts.length}.`);\n this.counts[cell] = noCounts();\n if (this.sums !== undefined) this.sums[cell] = noSum();\n if (this.extremes !== undefined) this.extremes[cell] = noExtremes();\n if (this.products !== undefined) this.products[cell] = 0;\n if (this.variances !== undefined) this.variances[cell] = noVariance();\n if (this.absolutes !== undefined) this.absolutes[cell] = 0;\n }\n\n /** Cells until there are `count`. */\n ensureCells(count: number): void {\n while (this.counts.length < count) this.addCell();\n }\n\n /** Cell `from` of `other`, which holds at least these parts, as a new cell of this one. */\n copyCell(other: PartColumns, from: number): number {\n const cell = this.counts.length;\n this.counts.push({ ...elementAt(other.counts, from) });\n if (this.sums !== undefined) this.sums.push({ ...elementAt(must(other.sums), from) });\n if (this.extremes !== undefined) this.extremes.push({ ...elementAt(must(other.extremes), from) });\n if (this.products !== undefined) this.products.push(elementAt(must(other.products), from));\n if (this.variances !== undefined) this.variances.push({ ...elementAt(must(other.variances), from) });\n if (this.absolutes !== undefined) this.absolutes.push(elementAt(must(other.absolutes), from));\n return cell;\n }\n\n /** Writes over cell `cell` a copy of `other`'s cell `from`, which holds at least these parts. */\n setCell(cell: number, other: PartColumns, from: number): void {\n if (cell < 0 || cell >= this.counts.length) throw new RangeError(`There is no cell ${cell} of ${this.counts.length}.`);\n this.counts[cell] = { ...elementAt(other.counts, from) };\n if (this.sums !== undefined) this.sums[cell] = { ...elementAt(must(other.sums), from) };\n if (this.extremes !== undefined) this.extremes[cell] = { ...elementAt(must(other.extremes), from) };\n if (this.products !== undefined) this.products[cell] = elementAt(must(other.products), from);\n if (this.variances !== undefined) this.variances[cell] = { ...elementAt(must(other.variances), from) };\n if (this.absolutes !== undefined) this.absolutes[cell] = elementAt(must(other.absolutes), from);\n }\n\n /** Folds in a value that is neither Blank nor a number: counted, never a number. */\n addOther(cell: number): void {\n elementAt(this.counts, cell).values++;\n }\n\n /** Folds in an exact number. */\n addExact(cell: number, value: SnapshotDecimal): void {\n const counts = elementAt(this.counts, cell);\n counts.values++;\n // Once a non-finite number is in, every numeric Aggregation is #NUM! and no part is read.\n if (!counts.nonFinite) {\n const first = counts.numbers === 0;\n if (this.sums !== undefined) addExactToSum(elementAt(this.sums, cell), value, first);\n this.addAbsolute(cell, decimalToNumber(value));\n if (this.extremes !== undefined) addExactToExtremes(elementAt(this.extremes, cell), value, first);\n if (this.products !== undefined || this.variances !== undefined) {\n this.addInexactParts(cell, decimalToNumber(value), counts.numbers + 1);\n }\n }\n counts.numbers++;\n }\n\n /** Folds in a double: not exact, and #NUM! when it is not finite. */\n addDouble(cell: number, value: number): void {\n const counts = elementAt(this.counts, cell);\n counts.values++;\n if (!Number.isFinite(value)) {\n counts.nonFinite = true;\n counts.numbers++;\n return;\n }\n if (!counts.nonFinite) {\n const first = counts.numbers === 0;\n if (this.sums !== undefined) addDoubleToSum(elementAt(this.sums, cell), value, first);\n this.addAbsolute(cell, value);\n if (this.extremes !== undefined) addDoubleToExtremes(elementAt(this.extremes, cell), value, first);\n this.addInexactParts(cell, value, counts.numbers + 1);\n }\n counts.numbers++;\n }\n\n /** Folds one number into the parts kept in double \u2014 the product and the running variance; `count` is\n * the cell's numbers with this one. */\n addInexactParts(cell: number, value: number, count: number): void {\n if (this.products !== undefined) this.products[cell] = count === 1 ? value : elementAt(this.products, cell) * value;\n if (this.variances !== undefined) addToVariance(elementAt(this.variances, cell), value, count);\n }\n\n /** Ends accumulation: a double sum takes its compensation in, and the figures a part does not use are\n * zeroed, so a part is one value whatever path it took. */\n finish(): void {\n this.sums?.forEach(finishSum);\n this.extremes?.forEach(finishExtremes);\n }\n\n /** Writes each exact sum and exact extreme of cells [from, to) without trailing zeros (ADR-0064); every\n * cell when no range is given. */\n canonicalize(from = 0, to = this.counts.length): void {\n for (let cell = from; cell < to; cell++) {\n const sum = this.sums?.[cell];\n if (sum !== undefined && !sum.inexact) sum.exact = decimalCanonical(sum.exact);\n const extremes = this.extremes?.[cell];\n if (extremes !== undefined && !extremes.inexact) {\n extremes.exactMin = decimalCanonical(extremes.exactMin);\n extremes.exactMax = decimalCanonical(extremes.exactMax);\n }\n }\n }\n\n /** Folds `other`'s cell `from`, of the same field, into cell `cell`. */\n merge(cell: number, other: PartColumns, from: number): void {\n const counts = elementAt(this.counts, cell);\n const theirs = elementAt(other.counts, from);\n counts.values += theirs.values;\n counts.nonFinite ||= theirs.nonFinite;\n if (theirs.numbers === 0) return;\n const first = counts.numbers === 0;\n if (this.sums !== undefined) mergeSum(elementAt(this.sums, cell), elementAt(must(other.sums), from), first);\n if (this.absolutes !== undefined) this.absolutes[cell] = elementAt(this.absolutes, cell) + elementAt(must(other.absolutes), from);\n if (this.extremes !== undefined) mergeExtremes(elementAt(this.extremes, cell), elementAt(must(other.extremes), from), first);\n if (this.products !== undefined) {\n const product = elementAt(must(other.products), from);\n this.products[cell] = first ? product : elementAt(this.products, cell) * product;\n }\n if (this.variances !== undefined) {\n mergeVariance(elementAt(this.variances, cell), elementAt(must(other.variances), from), counts.numbers, theirs.numbers);\n }\n counts.numbers += theirs.numbers;\n }\n\n /** Whether this holds every part `aggregation` reads. */\n answers(aggregation: PivotAggregation): boolean {\n const needed = partsOf(aggregation);\n return (this.parts & needed) === needed;\n }\n\n /** An Aggregation's answer at a cell, by the table in ADR-0060. */\n read(cell: number, aggregation: PivotAggregation): AggregateValue {\n const counts = elementAt(this.counts, cell);\n const reads = aggregation !== 'count' && aggregation !== 'countNumbers';\n if (counts.values !== 0 && reads && !this.answers(aggregation)) {\n throw new Error(`${aggregation} reads a part this field was not aggregated with (${partsText(this.parts)}); ask again with its parts (ADR-0066).`);\n }\n return readAggregate(aggregation, counts,\n this.sums === undefined ? undefined : elementAt(this.sums, cell),\n this.extremes === undefined ? undefined : elementAt(this.extremes, cell),\n this.products === undefined ? undefined : elementAt(this.products, cell),\n this.variances === undefined ? undefined : elementAt(this.variances, cell));\n }\n}\n\nfunction must<T>(part: T | undefined): T {\n if (part === undefined) throw new Error('Internal: a part the cells merge from is not held.');\n return part;\n}\n", "// The question ExPivot asks a Pivot Source for a report (ADR-0066): the row and column fields, the Filters\n// that hide something, each field in Values with the parts its Aggregations read, and the cap on leaves.\n// A question is a serialisable value; a source answers it with the Leaf Aggregates, or refuses it. The C#\n// engine's PivotQuery, PivotQueryField and PivotQueryValue, with their checks and messages.\n\nimport { pivotItemKey, publicKeyId, type PivotItemKey } from '../items/item-key';\nimport type { PivotLayout, PivotFieldPlacement } from '../layout/pivot-layout';\nimport { pivotAggregations, type PivotAggregation } from '../layout/pivot-enums';\nimport { partExtremes, partProduct, partSum, partVariance, partsOf } from '../aggregates/parts';\n\n/** A part of a Leaf Aggregate beyond the counts, which always travel (ADR-0066). */\nexport type PivotPart = 'sum' | 'extremes' | 'product' | 'variance';\n\n/** The parts in their order. */\nexport const pivotParts: readonly PivotPart[] = Object.freeze(['sum', 'extremes', 'product', 'variance']);\n\nconst bitOf: Readonly<Record<PivotPart, number>> = Object.freeze({ sum: partSum, extremes: partExtremes, product: partProduct, variance: partVariance });\n\n/** The parts as bits. */\nexport function partBits(parts: readonly PivotPart[]): number {\n let bits = 0;\n for (const part of parts) {\n if (!pivotParts.includes(part)) throw new RangeError(`'${part}' is not a part of a Leaf Aggregate.`);\n bits |= bitOf[part];\n }\n return bits;\n}\n\n/** The parts the bits name, in their order. */\nexport function partList(bits: number): readonly PivotPart[] {\n return Object.freeze(pivotParts.filter(part => (bits & bitOf[part]) !== 0));\n}\n\n/** The default cap on leaves: \"this layout needs more than 200,000 cells\". */\nexport const defaultMaxLeaves = 200_000;\n\n/** A field placed in Rows, Columns or Filters, with the Items it hides. */\nexport interface PivotQueryField {\n /** The field's name. */\n readonly field: string;\n /** The Items whose records are left out. */\n readonly hiddenItems: readonly PivotItemKey[];\n}\n\n/** A field in Values, and the parts its Value Fields' Aggregations read. */\nexport interface PivotQueryValue {\n /** The field's name. */\n readonly field: string;\n /** The parts asked for beyond the counts. */\n readonly parts: readonly PivotPart[];\n}\n\n/**\n * One field's rule of a question's levels (ADR-0370 section 3): whether its Items are collapsed, and the\n * Items whose state is the other. Item `x` is expanded when `collapsed` is not `x \u2208 toggledItems`; the Items\n * of the innermost field have nothing below them, and their rule changes nothing.\n */\nexport interface PivotLevelRule {\n /** Whether its Items are collapsed, but for the toggled ones. */\n readonly collapsed: boolean;\n /** The Items whose state is the other of `collapsed`. */\n readonly toggledItems: readonly PivotItemKey[];\n /** How a row field's Items are ordered by a value, for a question with a window; none for a field\n * ordered by label, and for a column field. */\n readonly order?: PivotLevelOrder;\n}\n\n/**\n * How a row field's Items are ordered among their siblings (ADR-0370 section 3): by a field in Values under an\n * Aggregation, read at the grand total of the columns, as the report sorts them. A sibling whose value is not\n * a number follows every number, in either direction. What a window of a sibling set is cut from.\n */\nexport interface PivotLevelOrder {\n /** The field in Values, by its place in the question's `values`. */\n readonly value: number;\n /** The Aggregation read of it. */\n readonly aggregation: PivotAggregation;\n /** Whether the largest comes first. */\n readonly descending: boolean;\n}\n\n/** Where one parent's window starts: the parent row group, by its Items, and the sibling it starts at. */\nexport interface PivotWindowStart {\n /** The parent's Items, outermost first: none for the grand total. */\n readonly rows: readonly PivotItemKey[];\n /** The place among the siblings, from 0, of the first one asked for. */\n readonly start: number;\n}\n\n/**\n * The window of a question's levels (ADR-0370 section 3): a sibling set ordered by a value with more than\n * `limit` siblings is answered as a window of them, starting where `starts` says for its parent, or at the\n * first, and no further than `limit` from the end; with what lies on either side merged.\n */\nexport interface PivotLevelWindow {\n /** The most siblings a set ordered by a value is answered with whole. */\n readonly limit: number;\n /** Where the windows start, one a parent at most. */\n readonly starts: readonly PivotWindowStart[];\n}\n\n/**\n * Which groups a report shows, as a question for Level Aggregates carries them (ADR-0370 section 3): one\n * rule a row field and one a column field. A group is shown when every Item above it is expanded, and the\n * grand total always is; a cell is a shown row group crossed with a shown column group. A server can turn\n * them into `GROUPING SETS` without knowing the report.\n */\nexport interface PivotLevels {\n /** The row fields' rules, outermost first. */\n readonly rows: readonly PivotLevelRule[];\n /** The column fields' rules, outermost first. */\n readonly columns: readonly PivotLevelRule[];\n /** The window of the sets ordered by a value; none, and every set is answered whole. */\n readonly window?: PivotLevelWindow;\n}\n\n/** A rule's settings, each left out taking its default: every Item expanded, ordered by label. */\nexport interface PivotLevelRuleInput {\n /** Whether the Items are collapsed, but for the toggled ones. */\n readonly collapsed?: boolean;\n /** The Items whose state is the other. */\n readonly toggledItems?: readonly PivotItemKey[];\n /** How the Items are ordered by a value. */\n readonly order?: PivotLevelOrder;\n}\n\n/** A rule, checked and frozen. */\nexport function pivotLevelRule(input: PivotLevelRuleInput = {}): PivotLevelRule {\n const collapsed = input.collapsed ?? false; // oxlint-disable-line ex-grid/no-stand-in-default -- a rule left unsaid is every Item expanded\n if (typeof collapsed !== 'boolean') throw new TypeError(\"A rule's collapse is true or false.\");\n const toggled = (input.toggledItems ?? []).map(key => pivotItemKey(key.kind, key.value)); // oxlint-disable-line ex-grid/no-stand-in-default -- a rule that toggles nothing toggles no Item\n if (input.order === undefined) return Object.freeze({ collapsed, toggledItems: Object.freeze(toggled) });\n return Object.freeze({ collapsed, toggledItems: Object.freeze(toggled), order: levelOrder(input.order) });\n}\n\nfunction levelOrder(input: PivotLevelOrder): PivotLevelOrder {\n if (!Number.isSafeInteger(input.value) || input.value < 0) throw new RangeError(`An order names a field in Values by its place, not ${input.value}.`);\n if (!pivotAggregations.includes(input.aggregation)) throw new RangeError(`'${input.aggregation}' is not an Aggregation.`);\n if (typeof input.descending !== 'boolean') throw new TypeError(\"An order's direction is true or false.\");\n return Object.freeze({ value: input.value, aggregation: input.aggregation, descending: input.descending });\n}\n\n/** A window's settings: its limit, and where its windows start, none by default. */\nexport interface PivotLevelWindowInput {\n /** The most siblings a set ordered by a value is answered with whole. */\n readonly limit: number;\n /** Where the windows start. */\n readonly starts?: readonly PivotWindowStart[];\n}\n\nfunction levelWindow(input: PivotLevelWindowInput): PivotLevelWindow {\n if (!Number.isSafeInteger(input.limit) || input.limit < 1) throw new RangeError(`A window holds at least one sibling, not ${input.limit}.`);\n const seen = new Set<string>();\n const starts = (input.starts ?? []).map(given => { // oxlint-disable-line ex-grid/no-stand-in-default -- a window named nowhere starts every set at its first sibling\n if (!Number.isSafeInteger(given.start) || given.start < 0) throw new RangeError(`A window starts at a sibling's place from 0, not ${given.start}.`);\n const rows = given.rows.map(key => pivotItemKey(key.kind, key.value));\n const id = rows.map(publicKeyId).join('\\u0000');\n if (seen.has(id)) throw new TypeError('The window starts twice under one parent (ADR-0370 section 3).');\n seen.add(id);\n return Object.freeze({ rows: Object.freeze(rows), start: given.start });\n });\n return Object.freeze({ limit: input.limit, starts: Object.freeze(starts) });\n}\n\n/** Whether the groups below `item` are shown under `rule`. */\nexport function isLevelExpanded(rule: PivotLevelRule, item: PivotItemKey): boolean {\n const id = publicKeyId(item);\n return rule.collapsed === rule.toggledItems.some(toggled => publicKeyId(toggled) === id);\n}\n\nfunction ruleOfPlacement(placement: PivotFieldPlacement): PivotLevelRule {\n return pivotLevelRule({ collapsed: placement.collapsed, toggledItems: placement.toggledItems });\n}\n\n/** The groups a layout shows: each row and column field's collapse state. */\nexport function levelsOfLayout(layout: PivotLayout): PivotLevels {\n return Object.freeze({ rows: Object.freeze(layout.rows.map(ruleOfPlacement)), columns: Object.freeze(layout.columns.map(ruleOfPlacement)) });\n}\n\nfunction sameOrder(a: PivotLevelOrder | undefined, b: PivotLevelOrder | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return a.value === b.value && a.aggregation === b.aggregation && a.descending === b.descending;\n}\n\nfunction sameRules(one: readonly PivotLevelRule[], other: readonly PivotLevelRule[]): boolean {\n return one.length === other.length\n && one.every((rule, i) => {\n const theirs = other[i];\n return theirs !== undefined && rule.collapsed === theirs.collapsed && sameKeys(rule.toggledItems, theirs.toggledItems)\n && sameOrder(rule.order, theirs.order);\n });\n}\n\n// Two windows' starts are one when each parent starts at the same place, in any order.\nfunction sameWindow(a: PivotLevelWindow | undefined, b: PivotLevelWindow | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n const startOf = (window: PivotLevelWindow): Map<string, number> => new Map(window.starts.map(start => [start.rows.map(publicKeyId).join('\\u0000'), start.start]));\n const mine = startOf(a);\n const theirs = startOf(b);\n return a.limit === b.limit && mine.size === theirs.size && [...mine].every(([parent, start]) => theirs.get(parent) === start);\n}\n\n/** Whether two questions' levels show the same groups: both none, or the same rules and the same window. */\nexport function sameLevels(a: PivotLevels | undefined, b: PivotLevels | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n return sameRules(a.rows, b.rows) && sameRules(a.columns, b.columns) && sameWindow(a.window, b.window);\n}\n\n/** The question for a report's Leaf Aggregates. */\nexport interface PivotQuery {\n /** The row fields, outermost first. */\n readonly rows: readonly PivotQueryField[];\n /** The column fields, outermost first. */\n readonly columns: readonly PivotQueryField[];\n /** The Filters that hide something; one that hides nothing leaves every record in. */\n readonly filters: readonly PivotQueryField[];\n /** Each field in Values, once, with the parts its Value Fields read. */\n readonly values: readonly PivotQueryValue[];\n /** The most leaves the answer may have; one more refuses the question. */\n readonly maxLeaves: number;\n /**\n * Which groups the report shows, for a source that answers Level Aggregates (ADR-0370 section 3): it may\n * then answer, when the leaves would pass the cap, with the cells of the groups shown instead\n * (an answer's `isLevels`). Left out, the question asks for the leaves alone.\n */\n readonly levels?: PivotLevels;\n}\n\n/** A question's settings, each left out taking its default: no field anywhere and the default cap. */\nexport interface PivotQueryInput {\n /** The row fields, by name or with their Hidden Items. */\n readonly rows?: readonly (string | { readonly field: string; readonly hiddenItems?: readonly PivotItemKey[] })[];\n /** The column fields. */\n readonly columns?: readonly (string | { readonly field: string; readonly hiddenItems?: readonly PivotItemKey[] })[];\n /** The Filters that hide something. */\n readonly filters?: readonly (string | { readonly field: string; readonly hiddenItems?: readonly PivotItemKey[] })[];\n /** The fields in Values, by name or with their parts. */\n readonly values?: readonly (string | { readonly field: string; readonly parts?: readonly PivotPart[] })[];\n /** The cap on leaves; {@link defaultMaxLeaves} when left out. */\n readonly maxLeaves?: number;\n /** Which groups the report shows, one rule a row and a column field, and the window of the sets ordered by a\n * value; none when left out. */\n readonly levels?: {\n readonly rows?: readonly PivotLevelRuleInput[];\n readonly columns?: readonly PivotLevelRuleInput[];\n readonly window?: PivotLevelWindowInput;\n };\n}\n\nfunction queryField(input: string | { readonly field: string; readonly hiddenItems?: readonly PivotItemKey[] }): PivotQueryField {\n const given = typeof input === 'string' ? { field: input } : input;\n if (typeof given.field !== 'string' || given.field.length === 0) throw new TypeError('A field of a question is named.');\n const hidden = (given.hiddenItems ?? []).map(key => pivotItemKey(key.kind, key.value)); // oxlint-disable-line ex-grid/no-stand-in-default -- a field that hides nothing hides no Item\n return Object.freeze({ field: given.field, hiddenItems: Object.freeze(hidden) });\n}\n\nfunction queryValue(input: string | { readonly field: string; readonly parts?: readonly PivotPart[] }): PivotQueryValue {\n const given = typeof input === 'string' ? { field: input } : input;\n if (typeof given.field !== 'string' || given.field.length === 0) throw new TypeError('A field in Values is named.');\n return Object.freeze({ field: given.field, parts: partList(partBits(given.parts ?? [])) }); // oxlint-disable-line ex-grid/no-stand-in-default -- the counts alone are no part\n}\n\n/**\n * A question, checked and frozen: a field placed twice among Filters, Rows and Columns, or asked for twice in\n * Values, is refused with a TypeError naming it; a cap below 1 with a RangeError.\n */\nexport function pivotQuery(input: PivotQueryInput = {}): PivotQuery {\n const rows = Object.freeze((input.rows ?? []).map(queryField)); // oxlint-disable-line ex-grid/no-stand-in-default -- no row field\n const columns = Object.freeze((input.columns ?? []).map(queryField)); // oxlint-disable-line ex-grid/no-stand-in-default -- no column field\n const filters = Object.freeze((input.filters ?? []).map(queryField)); // oxlint-disable-line ex-grid/no-stand-in-default -- no filter\n const values = Object.freeze((input.values ?? []).map(queryValue)); // oxlint-disable-line ex-grid/no-stand-in-default -- nothing in Values\n const maxLeaves = input.maxLeaves ?? defaultMaxLeaves;\n if (!Number.isSafeInteger(maxLeaves) || maxLeaves < 1) throw new RangeError(`A question allows at least one leaf, not ${maxLeaves}.`);\n const placed = new Set<string>();\n for (const field of [...rows, ...columns, ...filters]) {\n if (placed.has(field.field)) {\n throw new TypeError(`The question places '${field.field}' twice among Filters, Rows and Columns; a field stands in one of them at most (ADR-0061).`);\n }\n placed.add(field.field);\n }\n const asked = new Set<string>();\n for (const value of values) {\n if (asked.has(value.field)) {\n throw new TypeError(`The question asks for '${value.field}' twice in Values; ask once, with the parts of every Value Field of it (ADR-0066).`);\n }\n asked.add(value.field);\n }\n if (input.levels === undefined) return Object.freeze({ rows, columns, filters, values, maxLeaves });\n const levelRows = Object.freeze((input.levels.rows ?? []).map(pivotLevelRule)); // oxlint-disable-line ex-grid/no-stand-in-default -- no row field, no rule\n const levelColumns = Object.freeze((input.levels.columns ?? []).map(pivotLevelRule)); // oxlint-disable-line ex-grid/no-stand-in-default -- no column field, no rule\n const levels: PivotLevels = Object.freeze(input.levels.window === undefined\n ? { rows: levelRows, columns: levelColumns }\n : { rows: levelRows, columns: levelColumns, window: levelWindow(input.levels.window) });\n if (levels.rows.length !== rows.length || levels.columns.length !== columns.length) {\n throw new TypeError(`The question's levels give ${levels.rows.length} row and ${levels.columns.length} column rules, and it places ${rows.length} row and ${columns.length} column fields; a field has one rule (ADR-0370 section 3).`);\n }\n checkOrders(levels, values);\n return Object.freeze({ rows, columns, filters, values, maxLeaves, levels });\n}\n\n// A row field's order names a field in Values whose parts its Aggregation reads; a column field's names none, since\n// only row sets are windowed; a window's parent names an Item of each row field above the set.\nfunction checkOrders(levels: PivotLevels, values: readonly PivotQueryValue[]): void {\n if (levels.columns.some(rule => rule.order !== undefined)) {\n throw new TypeError(\"A column field's rule says no order; only row sets are answered as windows (ADR-0370 section 3).\");\n }\n for (const rule of levels.rows) {\n const order = rule.order;\n if (order === undefined) continue;\n const value = values[order.value];\n if (value === undefined) throw new RangeError(`An order reads value ${order.value}, and the question asks for ${values.length} values.`);\n const needed = partsOf(order.aggregation);\n if ((partBits(value.parts) & needed) !== needed) {\n throw new TypeError(`An order reads the ${order.aggregation} of '${value.field}', and the question asks for none of its parts (ADR-0370 section 3).`);\n }\n }\n for (const start of levels.window?.starts ?? []) { // oxlint-disable-line ex-grid/no-stand-in-default -- no window starts nowhere\n if (start.rows.length >= levels.rows.length) {\n throw new RangeError(`A window's parent names ${start.rows.length} Items, and the question places ${levels.rows.length} row fields; its children are a row field's Items (ADR-0370 section 3).`);\n }\n }\n}\n\nfunction askedOf(p: PivotFieldPlacement): PivotQueryField {\n return Object.freeze({ field: p.field, hiddenItems: p.hiddenItems });\n}\n\n/** The question a layout asks (ADR-0066): its row and column fields, the Filters that hide something, and\n * each field in Values once, with the parts of every Value Field of it. */\nexport function queryForLayout(layout: PivotLayout, maxLeaves: number = defaultMaxLeaves): PivotQuery {\n const values: { field: string; parts: number }[] = [];\n for (const value of layout.values) {\n const parts = partsOf(value.aggregation);\n const held = values.find(asked => asked.field === value.field);\n if (held === undefined) values.push({ field: value.field, parts });\n else held.parts |= parts;\n }\n return pivotQuery({\n rows: layout.rows.map(askedOf),\n columns: layout.columns.map(askedOf),\n filters: hidingFilters(layout.filters).map(askedOf),\n values: values.map(value => ({ field: value.field, parts: partList(value.parts) })),\n maxLeaves,\n });\n}\n\n/** The question {@link queryForLayout} asks, with the groups the layout shows (ADR-0370 section 3): what\n * ExPivot asks a source that answers Level Aggregates. With a `window`, each row field whose Items show no groups\n * below them \u2014 the innermost, or one collapsed with none toggled \u2014 and that the layout sorts by a value shown as it\n * is computed carries that order, so a set of it too large to answer whole is answered as a Sibling Window; a value\n * shown as a percentage, a sort by label, or a field with groups shown below it carries none. */\nexport function levelQueryForLayout(layout: PivotLayout, maxLeaves: number = defaultMaxLeaves, window?: PivotLevelWindowInput): PivotQuery {\n const query = queryForLayout(layout, maxLeaves);\n if (window === undefined) return Object.freeze({ ...query, levels: levelsOfLayout(layout) });\n const orderOf = (placement: PivotFieldPlacement, level: number): PivotLevelOrder | undefined => {\n const byValue = placement.sort.byValue;\n const showsNoGroups = level === layout.rows.length - 1 || (placement.collapsed && placement.toggledItems.length === 0);\n if (byValue === undefined || !showsNoGroups) return undefined;\n const shown = layout.values[byValue];\n if (shown === undefined) throw new Error(`'${placement.field}' is ordered by Value Field ${byValue}, and the layout has ${layout.values.length} (ADR-0060).`);\n if (shown.showValuesAs !== 'noCalculation') return undefined;\n return { value: query.values.findIndex(value => value.field === shown.field), aggregation: shown.aggregation, descending: placement.sort.direction === 'descending' };\n };\n return pivotQuery({\n ...query,\n levels: {\n rows: layout.rows.map((placement, level) => {\n const order = orderOf(placement, level);\n return { collapsed: placement.collapsed, toggledItems: placement.toggledItems, ...(order === undefined ? {} : { order }) };\n }),\n columns: layout.columns.map(placement => ({ collapsed: placement.collapsed, toggledItems: placement.toggledItems })),\n window,\n },\n });\n}\n\n/** The Filters that hide something. */\nexport function hidingFilters(filters: readonly PivotFieldPlacement[]): readonly PivotFieldPlacement[] {\n return filters.filter(placement => placement.hiddenItems.length > 0);\n}\n\n/** Every field the question places, Rows, Columns and Filters in that order. */\nexport function placedFields(query: PivotQuery): readonly PivotQueryField[] {\n return [...query.rows, ...query.columns, ...query.filters];\n}\n\n/** Whether two lists of Items hide the same Items, in any order. */\nexport function sameKeys(one: readonly PivotItemKey[], other: readonly PivotItemKey[]): boolean {\n if (one === other || (one.length === 0 && other.length === 0)) return true;\n const mine = new Set(one.map(publicKeyId));\n const theirs = new Set(other.map(publicKeyId));\n return mine.size === theirs.size && [...mine].every(id => theirs.has(id));\n}\n\nfunction sameFields(one: readonly PivotQueryField[], other: readonly PivotQueryField[]): boolean {\n return one.length === other.length\n && one.every((field, i) => {\n const theirs = other[i];\n return theirs !== undefined && field.field === theirs.field && sameKeys(field.hiddenItems, theirs.hiddenItems);\n });\n}\n\n/** Whether two questions are one. */\nexport function queriesEqual(a: PivotQuery, b: PivotQuery): boolean {\n return a === b\n || (a.maxLeaves === b.maxLeaves\n && sameLevels(a.levels, b.levels)\n && sameFields(a.rows, b.rows) && sameFields(a.columns, b.columns) && sameFields(a.filters, b.filters)\n && a.values.length === b.values.length\n && a.values.every((value, i) => {\n const theirs = b.values[i];\n return theirs !== undefined && value.field === theirs.field && partBits(value.parts) === partBits(theirs.parts);\n }));\n}\n\n// ---- The other questions ------------------------------------------------------------------------\n\n/** An Item of a field, as a cell's path names it. */\nexport interface PivotFieldItem {\n /** The field's name. */\n readonly field: string;\n /** The Item. */\n readonly item: PivotItemKey;\n}\n\n/** A field's Items over all the data, under a Source Version (ADR-0066). */\nexport interface PivotItemsQuery {\n /** The field whose Items are asked for. */\n readonly field: string;\n /** The Source Version they are asked for under. */\n readonly sourceVersion: string;\n /** Only the Items whose invariant text holds this, ignoring case. */\n readonly search?: string;\n /** The most Items the page lists. */\n readonly max: number;\n}\n\n/** The default most Items a page lists. */\nexport const defaultMaxItems = 10_000;\n\n/** A question for a field's Items, checked: an empty search is no search. */\nexport function pivotItemsQuery(input: { readonly field: string; readonly sourceVersion: string; readonly search?: string; readonly max?: number }): PivotItemsQuery {\n if (typeof input.field !== 'string' || input.field.length === 0) throw new TypeError('The field whose Items are asked for is named.');\n if (typeof input.sourceVersion !== 'string') throw new TypeError('Items are asked for under a Source Version.');\n const max = input.max ?? defaultMaxItems;\n if (!Number.isSafeInteger(max) || max < 0) throw new RangeError(`A page lists at least no Item, not ${max}.`);\n const query: { -readonly [K in keyof PivotItemsQuery]: PivotItemsQuery[K] } = { field: input.field, sourceVersion: input.sourceVersion, max };\n if (input.search !== undefined && input.search.length > 0) query.search = input.search;\n return Object.freeze(query);\n}\n\n/** The most records a question for them asks for: every one, as the C# engine's `int.MaxValue`, the most a\n * document carries (PivotJson). */\nexport const everyRecord = 2_147_483_647;\n\n/** One page of the records behind a cell (ADR-0063/0066): those carrying every Item of its paths and no\n * Hidden Item of any placed field, under a Source Version. */\nexport interface PivotDetailsQuery {\n /** The Source Version the records are asked for under. */\n readonly sourceVersion: string;\n /** The row's Items, outermost first. */\n readonly rowItems: readonly PivotFieldItem[];\n /** The column's Items, outermost first. */\n readonly columnItems: readonly PivotFieldItem[];\n /** Every placed field's Hidden Items. */\n readonly hiddenItems: readonly PivotQueryField[];\n /** The place of the page's first record. */\n readonly start: number;\n /** The most records the page holds; every one, 2^31 \u2212 1 as the C# engine's `int.MaxValue`, when the\n * question was made without one, so that it crosses to a C# server as it is. */\n readonly count: number;\n}\n\n/** A question for the records behind a cell, checked: a path naming a field twice, or Hidden Items given\n * twice for one field, are refused by name. */\nexport function pivotDetailsQuery({ sourceVersion, rowItems = [], columnItems = [], hiddenItems = [], start = 0, count = everyRecord }: {\n readonly sourceVersion: string;\n readonly rowItems?: readonly PivotFieldItem[];\n readonly columnItems?: readonly PivotFieldItem[];\n readonly hiddenItems?: readonly PivotQueryField[];\n readonly start?: number;\n readonly count?: number;\n}): PivotDetailsQuery {\n if (typeof sourceVersion !== 'string') throw new TypeError('The records behind a cell are asked for under a Source Version.');\n if (!Number.isSafeInteger(start) || start < 0) throw new RangeError(`A page starts at a record from 0, not ${start}.`);\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(`A page holds at least no record, not ${count}.`);\n const step = (item: PivotFieldItem): PivotFieldItem => {\n if (typeof item.field !== 'string' || item.field.length === 0) throw new TypeError('A field is named.');\n return Object.freeze({ field: item.field, item: pivotItemKey(item.item.kind, item.item.value) });\n };\n const rows = Object.freeze(rowItems.map(step));\n const columns = Object.freeze(columnItems.map(step));\n const hidden = Object.freeze(hiddenItems.map(queryField));\n const named = new Set<string>();\n for (const item of [...rows, ...columns]) {\n if (named.has(item.field)) throw new TypeError(`The cell's path names '${item.field}' twice.`);\n named.add(item.field);\n }\n const hiding = new Set<string>();\n for (const field of hidden) {\n if (hiding.has(field.field)) throw new TypeError(`The question gives the Hidden Items of '${field.field}' twice.`);\n hiding.add(field.field);\n }\n return Object.freeze({ sourceVersion, rowItems: rows, columnItems: columns, hiddenItems: hidden, start, count });\n}\n", "// Which groups a question's levels show (ADR-0370 section 3), and the check of a level answer against them.\n// The C# engine's PivotLevelAnswers.Mismatch and the helpers it shares with the bundled sources' level answer\n// (level-answers.ts).\n//\n// A group named by Items x\u2080 \u2026 x\u208Dd\u22121\u208E is shown when x\u2080 \u2026 x\u208Dd\u22122\u208E are all expanded: the outermost field's groups\n// and the grand total always are. Along a leaf the shown groups are those down to a depth, the first Item that\n// is collapsed being the last one named, so a cell is a shown row group crossed with a shown column group.\n\nimport type { PivotAnswer, PivotAnswerAxis, PivotAnswerWindowing } from '../cube/answer';\nimport type { PivotLevelRule, PivotLevels } from '../cube/query';\nimport { itemKeyText, publicKeyId, type PivotItemKey } from '../items/item-key';\nimport { elementAt } from '../must';\n\n/** Whether the groups below an Item of a level are shown, by each level's rule: an Item is expanded when its\n * field's Items are not collapsed, or it is toggled from that. */\nexport function levelExpander(rules: readonly PivotLevelRule[]): (level: number, item: PivotItemKey) => boolean {\n const toggled = rules.map(rule => new Set(rule.toggledItems.map(publicKeyId)));\n return (level, item) => elementAt(rules, level).collapsed === elementAt(toggled, level).has(publicKeyId(item));\n}\n\n/** Each level's Items: whether the groups below each are shown. */\nexport function expandedItems(rules: readonly PivotLevelRule[], axes: readonly PivotAnswerAxis[]): readonly (readonly boolean[])[] {\n const expanded = levelExpander(rules);\n return axes.map((axis, level) => axis.items.map(item => expanded(level, item)));\n}\n\n// How deep a cell is named along one axis.\nfunction depthOf(axes: readonly PivotAnswerAxis[], cell: number): number {\n let depth = 0;\n while (depth < axes.length && elementAt(axes, depth).itemAt(cell) >= 0) depth++;\n return depth;\n}\n\n// Whether the group a cell names down to `depth` along one axis is shown: every Item above its own is expanded.\nfunction isShown(axes: readonly PivotAnswerAxis[], expanded: readonly (readonly boolean[])[], cell: number, depth: number): boolean {\n for (let level = 0; level < depth - 1; level++) {\n if (!elementAt(elementAt(expanded, level), elementAt(axes, level).itemAt(cell))) return false;\n }\n return true;\n}\n\n/** The deepest group shown along a leaf on one axis: 0 where the axis has no field. */\nexport function deepestShown(axes: readonly PivotAnswerAxis[], expanded: readonly (readonly boolean[])[], leaf: number): number {\n if (axes.length === 0) return 0;\n let depth = 1;\n while (depth < axes.length && elementAt(elementAt(expanded, depth - 1), elementAt(axes, depth - 1).itemAt(leaf))) depth++;\n return depth;\n}\n\n/** A cell's Item index at every level, \u22121 below its depth on either axis: the leaf `cell` of `rows` and\n * `columns` named down to `rowDepth` and `columnDepth`. */\nexport function cellPath(rows: readonly PivotAnswerAxis[], columns: readonly PivotAnswerAxis[], cell: number, rowDepth: number, columnDepth: number): number[] {\n return [\n ...rows.map((axis, level) => (level < rowDepth ? axis.itemAt(cell) : -1)),\n ...columns.map((axis, level) => (level < columnDepth ? axis.itemAt(cell) : -1)),\n ];\n}\n\n/** A path as a Map key. */\nexport function pathKey(path: readonly number[]): string {\n return path.join(',');\n}\n\n// The path with the Item at one level taken away, as a key: the group above along that axis.\nfunction aboveKey(path: readonly number[], level: number): string {\n const above = [...path];\n above[level] = -1;\n return pathKey(above);\n}\n\n/** [Region=Text:East] \u00D7 [] \u2014 a cell's Items, for a refusal. */\nexport function describe(answer: PivotAnswer, cell: number): string {\n const path = (axes: readonly PivotAnswerAxis[]): string => {\n const named = axes.slice(0, depthOf(axes, cell));\n return `[${named.map(axis => `${axis.field}=${itemKeyText(elementAt(axis.items, axis.itemAt(cell)))}`).join(', ')}]`;\n };\n return `${path(answer.rows)} \u00D7 ${path(answer.columns)}`;\n}\n\n/**\n * Why a level answer does not answer the levels asked, or `undefined`: a cell the rules do not show, two cells\n * for one group, or a cell whose parent on either axis is not in the answer; a window the question does not\n * ask for, or one that is not where it was asked; a rest cell without its window's parent, or a side it says\n * has no siblings beyond its margin. Its shape \u2014 each cell named down to its depth \u2014 the answer checked as it\n * was made.\n */\nexport function levelAnswerMismatch(levels: PivotLevels, answer: PivotAnswer, windowing: PivotAnswerWindowing): string | undefined {\n const rows = answer.rows;\n const columns = answer.columns;\n const rowExpanded = expandedItems(levels.rows, rows);\n const columnExpanded = expandedItems(levels.columns, columns);\n const isRest = (cell: number): boolean => windowing.windows.length > 0 && elementAt(windowing.rests, cell) >= 0;\n const cells = new Set<string>();\n const rests = new Set<string>();\n const paths: number[][] = [];\n for (let cell = 0; cell < answer.leafCount; cell++) {\n const rowDepth = depthOf(rows, cell);\n const columnDepth = depthOf(columns, cell);\n if (!isShown(rows, rowExpanded, cell, rowDepth) || !isShown(columns, columnExpanded, cell, columnDepth)) {\n return `its cell ${describe(answer, cell)} is a group the question's levels do not show`;\n }\n const path = cellPath(rows, columns, cell, rowDepth, columnDepth);\n paths.push(path);\n if (isRest(cell)) {\n const restKey = `${pathKey(path)}|${elementAt(windowing.rests, cell)}`;\n if (rests.has(restKey)) return `it has two rest cells for one side of a window at ${describe(answer, cell)}`;\n rests.add(restKey);\n continue;\n }\n const key = pathKey(path);\n if (cells.has(key)) return `it has two cells for ${describe(answer, cell)}`;\n cells.add(key);\n }\n for (let cell = 0; cell < answer.leafCount; cell++) {\n const path = elementAt(paths, cell);\n const rowDepth = depthOf(rows, cell);\n const columnDepth = depthOf(columns, cell);\n if (isRest(cell)) {\n if (!cells.has(pathKey(path))) return `its rest cell ${describe(answer, cell)} is answered without its parent's cell`;\n continue;\n }\n if (rowDepth > 0 && !cells.has(aboveKey(path, rowDepth - 1))) {\n return `its cell ${describe(answer, cell)} is shown without its parent row group`;\n }\n if (columnDepth > 0 && !cells.has(aboveKey(path, rows.length + columnDepth - 1))) {\n return `its cell ${describe(answer, cell)} is shown without its parent column group`;\n }\n }\n return windowMismatch(levels, answer, windowing, rowExpanded, paths);\n}\n\n// Each set ordered by a value under a question's window: answered whole up to the limit, and past it as a window\n// where it was asked, its rest cells on a side only where that side has siblings beyond its margin.\nfunction windowMismatch(levels: PivotLevels, answer: PivotAnswer, windowing: PivotAnswerWindowing, rowExpanded: readonly (readonly boolean[])[],\n paths: readonly (readonly number[])[]): string | undefined {\n const rows = answer.rows;\n const asked = levels.window;\n if (asked === undefined) return windowing.windows.length === 0 ? undefined : 'it answers a window, and the question asks for none';\n const rowCount = rows.length;\n // The children each parent row group has at the grand total of the columns, by the parent's path.\n const children = new Map<string, number>();\n const parents = new Set<string>();\n paths.forEach((path, cell) => {\n if (windowing.windows.length > 0 && elementAt(windowing.rests, cell) >= 0) return;\n if (path.slice(rowCount).some(item => item >= 0)) return;\n const depth = depthOf(rows, cell);\n parents.add(path.slice(0, depth).join(','));\n if (depth === 0) return;\n const parent = path.slice(0, depth - 1).join(',');\n children.set(parent, (children.get(parent) ?? 0) + 1); // oxlint-disable-line ex-grid/no-stand-in-default -- a parent's first child counted\n });\n const describeParent = (parent: readonly number[]): string =>\n `[${parent.map((item, level) => `${elementAt(rows, level).field}=${itemKeyText(elementAt(elementAt(rows, level).items, item))}`).join(', ')}]`;\n const startOf = new Map(asked.starts.map(start => [start.rows.map(publicKeyId).join('\\u0000'), start.start]));\n const windowed = new Set<string>();\n for (const [w, window] of windowing.windows.entries()) {\n const key = window.parent.join(',');\n const depth = window.parent.length;\n if (windowed.has(key)) return `it has two windows under ${describeParent(window.parent)}`;\n windowed.add(key);\n if (!parents.has(key)) return `its window ${w} is under ${describeParent(window.parent)}, a group it has no cell for`;\n if (depth > 0 && !elementAt(elementAt(rowExpanded, depth - 1), elementAt(window.parent, depth - 1))) {\n return `its window ${w} is under ${describeParent(window.parent)}, whose children the question's levels do not show`;\n }\n if (elementAt(levels.rows, depth).order === undefined) {\n return `its window ${w} is of the Items of '${elementAt(rows, depth).field}', which the question orders by label`;\n }\n const answered = children.get(key) ?? 0; // oxlint-disable-line ex-grid/no-stand-in-default -- a window with no sibling answered is refused below\n const margins = (window.before > 0 ? 1 : 0) + (window.after > 0 ? 1 : 0);\n const shown = answered - margins;\n if (shown < 1) return `its window ${w} under ${describeParent(window.parent)} shows no sibling`;\n const total = window.before + shown + window.after;\n if (total <= asked.limit) return `its window ${w} under ${describeParent(window.parent)} is of ${total} siblings, which the limit of ${asked.limit} answers whole`;\n const parentId = window.parent.map((item, level) => publicKeyId(elementAt(elementAt(rows, level).items, item))).join('\\u0000');\n const start = Math.min(startOf.get(parentId) ?? 0, total - asked.limit); // oxlint-disable-line ex-grid/no-stand-in-default -- a window the question names no start for starts at the first sibling\n if (window.before > start || window.before + shown < start + asked.limit) {\n return `its window ${w} under ${describeParent(window.parent)} shows siblings ${window.before} to ${window.before + shown - 1}, and the question asks for ${start} to ${start + asked.limit - 1}`;\n }\n }\n const restSides = new Set<number>();\n paths.forEach((path, cell) => {\n const code = windowing.windows.length === 0 ? -1 : elementAt(windowing.rests, cell);\n if (code >= 0 && path.slice(rowCount).every(item => item < 0)) restSides.add(code);\n });\n for (const [w, window] of windowing.windows.entries()) {\n for (const [side, count, code] of [['before', window.before, 2 * w], ['after', window.after, 2 * w + 1]] as const) {\n if ((count >= 2) !== restSides.has(code)) {\n return count >= 2\n ? `its window ${w} has ${count} siblings ${side} it and no rest cell for those beyond its margin`\n : `its window ${w} has ${count} siblings ${side} it and a rest cell beyond its margin`;\n }\n }\n }\n // A set ordered by a value that came whole holds no more siblings than the limit.\n for (const [parent, count] of children) {\n if (windowed.has(parent) || count <= asked.limit) continue;\n const depth = parent === '' ? 0 : parent.split(',').length;\n if (elementAt(levels.rows, depth).order === undefined) continue;\n const named = parent === '' ? [] : parent.split(',').map(Number);\n return `it answers the ${count} siblings under ${describeParent(named)} whole, past the window's limit of ${asked.limit}`;\n }\n return undefined;\n}\n", "// A Pivot Source's answer to a question (ADR-0066): the Leaf Aggregates \u2014 one leaf per combination of the\n// row and column fields' Items that has an included record, each with its Items, its record count and the\n// parts asked for of each field in Values \u2014 under the Source Version they were computed at; or a refusal,\n// which is an answer and not a failure. The C# engine's PivotAnswer, PivotSourceRefusal, PivotNumber and\n// PivotAnswerBuilder.\n//\n// To a question carrying levels, a source that answers Level Aggregates may answer, when the leaves would pass\n// the cap, with the cells of the groups shown instead (ADR-0370 section 3): each a shown row group crossed\n// with a shown column group that some record reaches, named by its Items down to its depth \u2014 an axis's\n// `itemAt` is \u22121 below it \u2014 with its records and its parts, and, beside a sum that is a double, the sum of its\n// numbers' magnitudes. What is said here of a leaf is then said of a cell. A sibling set ordered by a value and\n// passing the question's window limit is answered as a window: its siblings from where the window starts, a\n// margin on either side, and rest cells merging the siblings beyond each margin, one a shown column group.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport { decimalCanonical, decimalDivide, decimalEquals, decimalToNumber } from '../aggregates/exact-decimal';\nimport { PartColumns, partsText } from '../aggregates/parts';\nimport { itemKeyText, pivotItemKey, publicKeyId, type PivotItemKey } from '../items/item-key';\nimport { aggregationTitle, type PivotAggregation } from '../layout/pivot-enums';\nimport { PivotFormatError } from '../errors';\nimport { levelAnswerMismatch } from '../levels/level-shown';\nimport { elementAt } from '../must';\nimport { partBits, partList, placedFields, type PivotPart, type PivotQuery } from './query';\n\n/** Why a Pivot Source refused a question (ADR-0066). */\nexport type PivotSourceRefusalKind = 'tooManyLeaves' | 'unknownField' | 'aggregationNotOffered' | 'sourceVersionNotHeld';\n\n/** A Pivot Source's refusal to answer: its kind, a sentence a person can read, and the field or the cap it\n * concerns. The report stays on the layout it had and says why. */\nexport interface PivotSourceRefusal {\n /** Why the source refused. */\n readonly kind: PivotSourceRefusalKind;\n /** A sentence a person can read. */\n readonly message: string;\n /** The field the refusal concerns. */\n readonly field?: string;\n /** The cap a `tooManyLeaves` refusal passed. */\n readonly limit?: number;\n}\n\n/** A whole number with its thousands grouped by commas, as .NET's invariant `N0` writes it. */\nfunction grouped(value: number): string {\n return Math.trunc(value).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\n/** The refusals, worded as the C# engine words them. */\nexport const PivotRefusals = Object.freeze({\n /** \"This layout needs more than 200,000 cells.\" */\n tooManyLeaves: (maxLeaves: number): PivotSourceRefusal => Object.freeze({\n kind: 'tooManyLeaves', message: `This layout needs more than ${grouped(maxLeaves)} cells.`, limit: maxLeaves,\n }),\n /** A field the source does not have. */\n unknownField: (field: string): PivotSourceRefusal => Object.freeze({\n kind: 'unknownField', message: `The source has no field named '${field}'.`, field,\n }),\n /** A part that only Aggregations the source does not offer read. */\n aggregationNotOffered: (field: string, aggregations: readonly PivotAggregation[]): PivotSourceRefusal => Object.freeze({\n kind: 'aggregationNotOffered',\n message: `The source does not offer ${aggregations.map(aggregationTitle).join(' or ')}, which the question asks of '${field}'.`,\n field,\n }),\n /** A question asked under a Source Version the source no longer holds. */\n sourceVersionNotHeld: (sourceVersion: string): PivotSourceRefusal => Object.freeze({\n kind: 'sourceVersionNotHeld', message: `The data has changed since version '${sourceVersion}'; refresh the report.`,\n }),\n});\n\n/** A number a part carries: exact while every number it was made of was, a double otherwise. */\nexport type PivotNumber =\n | { readonly kind: 'exact'; readonly value: SnapshotDecimal }\n | { readonly kind: 'double'; readonly value: number };\n\n/** The number as a double: the exact one converted as C# converts a decimal. */\nexport function pivotNumberValue(number: PivotNumber): number {\n return number.kind === 'exact' ? decimalToNumber(number.value) : number.value;\n}\n\n/** The number without trailing zeros where it is exact, as C#'s accumulator finishes a figure (`AggregateArithmetic.Canonical`). */\nexport function pivotNumberCanonical(number: PivotNumber): PivotNumber {\n if (number.kind !== 'exact') return number;\n const value = decimalCanonical(number.value);\n return value === number.value ? number : Object.freeze({ kind: 'exact', value });\n}\n\n/** The Average of `count` numbers whose sum is `sum`: exact where the sum is, divided as C#'s decimal divides by a\n * whole count, and a double otherwise, as a Selection Summary's Average over the report reads it (ADR-0130). */\nexport function pivotNumberAverage(sum: PivotNumber, count: number): PivotNumber {\n return sum.kind === 'exact'\n ? Object.freeze({ kind: 'exact', value: decimalDivide(sum.value, count) })\n : Object.freeze({ kind: 'double', value: sum.value / count });\n}\n\n/** Whether two numbers are one: both exact and equal, or both doubles with the same bits. */\nexport function pivotNumbersEqual(a: PivotNumber, b: PivotNumber): boolean {\n if (a.kind === 'exact') return b.kind === 'exact' && decimalEquals(a.value, b.value);\n return b.kind === 'double' && Object.is(a.value, b.value);\n}\n\nfunction exact(value: SnapshotDecimal): PivotNumber {\n return Object.freeze({ kind: 'exact', value });\n}\n\nfunction double(value: number): PivotNumber {\n return Object.freeze({ kind: 'double', value });\n}\n\n/** One row or column field of an answer: its Items, and each leaf's Item among them. */\nexport class PivotAnswerAxis {\n /** The field. */\n readonly field: string;\n /** Its Items that some leaf carries. */\n readonly items: readonly PivotItemKey[];\n readonly #itemOfLeaf: readonly number[];\n\n /** @internal */\n constructor(field: string, items: readonly PivotItemKey[], itemOfLeaf: readonly number[]) {\n this.field = field;\n this.items = Object.freeze([...items]);\n this.#itemOfLeaf = itemOfLeaf;\n }\n\n /** The index among {@link PivotAnswerAxis.items} of a leaf's Item; in a level answer, \u22121 for a cell above\n * this field, which stands for every Item of it. */\n itemAt(leaf: number): number {\n return elementAt(this.#itemOfLeaf, checkLeaf(leaf, this.#itemOfLeaf.length));\n }\n}\n\nfunction checkLeaf(leaf: number, leafCount: number): number {\n if (!Number.isInteger(leaf) || leaf < 0 || leaf >= leafCount) throw new RangeError(`The answer has ${leafCount} leaves.`);\n return leaf;\n}\n\nlet makeValues: (field: string, columns: PartColumns, leafCount: number) => PivotAnswerValues;\nlet columnsOfValues: (values: PivotAnswerValues) => PartColumns;\n\n/** One field in Values of an answer: the parts at each leaf. */\nexport class PivotAnswerValues {\n /** The field. */\n readonly field: string;\n readonly #columns: PartColumns;\n readonly #leafCount: number;\n\n private constructor(field: string, columns: PartColumns, leafCount: number) {\n this.field = field;\n this.#columns = columns;\n this.#leafCount = leafCount;\n }\n\n static {\n makeValues = (field, columns, leafCount) => new PivotAnswerValues(field, columns, leafCount);\n columnsOfValues = values => values.#columns;\n }\n\n /** The parts carried beyond the counts. */\n get parts(): readonly PivotPart[] {\n return partList(this.#columns.parts);\n }\n\n /** The values at a leaf that are not Blank. */\n valuesAt(leaf: number): number {\n return elementAt(this.#columns.counts, this.#at(leaf)).values;\n }\n\n /** The numbers at a leaf, non-finite ones included. */\n numbersAt(leaf: number): number {\n return elementAt(this.#columns.counts, this.#at(leaf)).numbers;\n }\n\n /** Whether a non-finite number is among a leaf's values. */\n nonFiniteAt(leaf: number): boolean {\n return elementAt(this.#columns.counts, this.#at(leaf)).nonFinite;\n }\n\n /** The sum of a leaf's numbers. */\n sumAt(leaf: number): PivotNumber {\n const sum = elementAt(this.#carried(this.#columns.sums, 'Sum'), this.#at(leaf));\n return sum.inexact ? double(sum.double + sum.compensation) : exact(sum.exact);\n }\n\n /** The smallest of a leaf's numbers. */\n minAt(leaf: number): PivotNumber {\n const extremes = elementAt(this.#carried(this.#columns.extremes, 'Extremes'), this.#at(leaf));\n return extremes.inexact ? double(extremes.min) : exact(extremes.exactMin);\n }\n\n /** The largest of a leaf's numbers. */\n maxAt(leaf: number): PivotNumber {\n const extremes = elementAt(this.#carried(this.#columns.extremes, 'Extremes'), this.#at(leaf));\n return extremes.inexact ? double(extremes.max) : exact(extremes.exactMax);\n }\n\n /** The sum of the magnitudes of a cell's numbers, which a level answer carries beside a sum that is a\n * double: what bounds its rounding when it is checked against its parent (ADR-0370 section 3).\n * `undefined` for an exact sum, and in an answer of leaves. */\n absoluteSumAt(leaf: number): number | undefined {\n const at = this.#at(leaf);\n const sum = elementAt(this.#carried(this.#columns.sums, 'Sum'), at);\n const absolutes = this.#columns.absolutes;\n return sum.inexact && absolutes !== undefined ? elementAt(absolutes, at) : undefined;\n }\n\n /** The product of a leaf's numbers. */\n productAt(leaf: number): number {\n return elementAt(this.#carried(this.#columns.products, 'Product'), this.#at(leaf));\n }\n\n /** The running mean of a leaf's numbers. */\n meanAt(leaf: number): number {\n return elementAt(this.#carried(this.#columns.variances, 'Variance'), this.#at(leaf)).mean;\n }\n\n /** The running sum of squared deviations of a leaf's numbers. */\n m2At(leaf: number): number {\n return elementAt(this.#carried(this.#columns.variances, 'Variance'), this.#at(leaf)).m2;\n }\n\n #at(leaf: number): number {\n return checkLeaf(leaf, this.#leafCount);\n }\n\n #carried<T>(part: T | undefined, name: string): T {\n if (part === undefined) throw new Error(`The answer carries no ${name} part for '${this.field}'; the question did not ask for it (ADR-0066).`);\n return part;\n }\n}\n\nfunction names(fields: readonly { readonly field: string }[]): string {\n return `[${fields.map(f => f.field).join(', ')}]`;\n}\n\nfunction sameNames(a: readonly { readonly field: string }[], b: readonly { readonly field: string }[]): boolean {\n return a.length === b.length && a.every((f, i) => f.field === b[i]?.field);\n}\n\n/**\n * A sibling set answered as a window (ADR-0370 section 3): its parent row group, and how many of its siblings\n * come before the first one shown and after the last. Each count, when above 0, takes in a margin \u2014 the\n * nearest sibling on that side, answered as any shown group is and not shown \u2014 and the siblings beyond it,\n * merged into the window's rest cells on that side.\n */\nexport interface PivotAnswerWindow {\n /** The parent's Item at each row field above the set, as an index among that axis's Items: none for the\n * grand total. */\n readonly parent: readonly number[];\n /** The siblings before the first one shown, its margin among them. */\n readonly before: number;\n /** The siblings after the last one shown, its margin among them. */\n readonly after: number;\n}\n\n/** Which side of a window a rest cell merges. */\nexport type PivotRestSide = 'before' | 'after';\n\nconst restSides: ReadonlySet<string> = new Set(['before', 'after']);\n\n/** A rest cell's window, by its place among the answer's windows, and its side. */\nexport interface PivotAnswerRest {\n /** The window, by its place among {@link PivotAnswer.windows}. */\n readonly window: number;\n /** The side whose siblings beyond the margin it merges. */\n readonly side: PivotRestSide;\n}\n\n/** An answer's windows, and each cell's rest code: \u22121 for a cell, 2w for the before side of window w, 2w + 1 for\n * its after side. */\nexport interface PivotAnswerWindowing {\n readonly windows: readonly PivotAnswerWindow[];\n readonly rests: readonly number[];\n}\n\n/** No window. */\nexport const noWindowing: PivotAnswerWindowing = Object.freeze({ windows: Object.freeze([]), rests: Object.freeze([]) });\n\nlet makeAnswer: (sourceVersion: string, rows: readonly PivotAnswerAxis[], columns: readonly PivotAnswerAxis[], leafCount: number,\n records: readonly number[], values: readonly PivotAnswerValues[], levels: boolean, windowing: PivotAnswerWindowing) => PivotAnswer;\n\n// A level answer's shape (ADR-0370 section 3): each cell named down to its depth on each axis and by nothing\n// below, a double sum carried with its magnitudes, and each rest cell named by its window's parent.\nfunction checkLevels(rows: readonly PivotAnswerAxis[], columns: readonly PivotAnswerAxis[], cells: number, values: readonly PivotAnswerValues[],\n windowing: PivotAnswerWindowing): void {\n for (let cell = 0; cell < cells; cell++) {\n checkDepth(rows, cell);\n checkDepth(columns, cell);\n }\n checkWindowing(rows, cells, windowing);\n for (const value of values) {\n const parts = columnsOfValues(value);\n const sums = parts.sums;\n if (sums === undefined) continue;\n const absolutes = parts.absolutes;\n for (let cell = 0; cell < cells; cell++) {\n if (elementAt(sums, cell).inexact && !elementAt(parts.counts, cell).nonFinite && (absolutes === undefined || Number.isNaN(elementAt(absolutes, cell)))) {\n throw new PivotFormatError(`Cell ${cell}'s sum of '${value.field}' is a double, and carries no sum of its magnitudes (ADR-0370 section 3).`);\n }\n }\n }\n}\n\nfunction checkWindowing(rows: readonly PivotAnswerAxis[], cells: number, windowing: PivotAnswerWindowing): void {\n const { windows, rests } = windowing;\n if (windows.length === 0) {\n if (rests.length !== 0) throw new PivotFormatError('The answer has rest cells and no window (ADR-0370 section 3).');\n return;\n }\n if (rests.length !== cells) throw new PivotFormatError(`The answer says whether ${rests.length} cells are rests, and has ${cells}.`);\n windows.forEach((window, w) => {\n if (window.parent.length >= rows.length) {\n throw new PivotFormatError(`Window ${w}'s parent names ${window.parent.length} Items, and the answer has ${rows.length} row fields; its siblings are a row field's Items (ADR-0370 section 3).`);\n }\n window.parent.forEach((item, level) => {\n if (!Number.isSafeInteger(item) || item < 0 || item >= elementAt(rows, level).items.length) {\n throw new PivotFormatError(`Window ${w}'s parent names Item ${item} of '${elementAt(rows, level).field}', which has ${elementAt(rows, level).items.length}.`);\n }\n });\n for (const [side, count] of [['before', window.before], ['after', window.after]] as const) {\n if (!Number.isSafeInteger(count) || count < 0) throw new PivotFormatError(`Window ${w} has ${count} siblings ${side} it; a count is a whole number, not below 0.`);\n }\n });\n rests.forEach((code, cell) => {\n if (code === -1) return;\n if (!Number.isSafeInteger(code) || code < 0 || code >= 2 * windows.length) {\n throw new PivotFormatError(`Cell ${cell} is a rest of window ${Math.floor(code / 2)}, and the answer has ${windows.length}.`);\n }\n const window = elementAt(windows, Math.floor(code / 2));\n const named = rows.every((axis, level) => axis.itemAt(cell) === (level < window.parent.length ? elementAt(window.parent, level) : -1));\n if (!named) throw new PivotFormatError(`Cell ${cell} is a rest of window ${Math.floor(code / 2)}, and is not named by its parent's Items alone (ADR-0370 section 3).`);\n });\n}\n\nfunction checkDepth(axes: readonly PivotAnswerAxis[], cell: number): void {\n let below = false;\n for (const axis of axes) {\n if (axis.itemAt(cell) < 0) below = true;\n else if (below) throw new PivotFormatError(`Cell ${cell} names an Item of '${axis.field}' below a field it names none of; a cell is named down to its depth (ADR-0370 section 3).`);\n }\n}\n\n/** A Pivot Source's answer: the Leaf Aggregates under a Source Version, or a refusal. */\nexport class PivotAnswer {\n /** The refusal, when the source refused. */\n readonly refusal: PivotSourceRefusal | undefined;\n /** How many leaves the answer has. */\n readonly leafCount: number;\n readonly #sourceVersion: string | undefined;\n readonly #rows: readonly PivotAnswerAxis[];\n readonly #columns: readonly PivotAnswerAxis[];\n readonly #values: readonly PivotAnswerValues[];\n readonly #records: readonly number[];\n /** Whether the answer holds the cells of the groups shown \u2014 Level Aggregates \u2014 rather than the leaves\n * (ADR-0370 section 3). */\n readonly isLevels: boolean;\n readonly #windowing: PivotAnswerWindowing;\n\n private constructor(\n sourceVersion: string | undefined, refusal: PivotSourceRefusal | undefined, rows: readonly PivotAnswerAxis[],\n columns: readonly PivotAnswerAxis[], leafCount: number, records: readonly number[], values: readonly PivotAnswerValues[],\n levels: boolean, windowing: PivotAnswerWindowing,\n ) {\n if (levels) checkLevels(rows, columns, leafCount, values, windowing);\n else if (windowing.windows.length > 0) throw new PivotFormatError('An answer of leaves has no window (ADR-0370 section 3).');\n this.isLevels = levels;\n this.#windowing = windowing;\n this.#sourceVersion = sourceVersion;\n this.refusal = refusal;\n this.#rows = Object.freeze([...rows]);\n this.#columns = Object.freeze([...columns]);\n this.leafCount = leafCount;\n this.#records = records;\n this.#values = Object.freeze([...values]);\n }\n\n static {\n makeAnswer = (sourceVersion, rows, columns, leafCount, records, values, levels, windowing) =>\n new PivotAnswer(sourceVersion, undefined, rows, columns, leafCount, records, values, levels, windowing);\n }\n\n /** A refusal, as an answer. */\n static refused(refusal: PivotSourceRefusal): PivotAnswer {\n return new PivotAnswer(undefined, refusal, [], [], 0, [], [], false, noWindowing);\n }\n\n /** Whether the source refused. */\n get isRefused(): boolean {\n return this.refusal !== undefined;\n }\n\n /** The Source Version the answer was computed at. A refusal has none, and throws. */\n get sourceVersion(): string {\n if (this.#sourceVersion === undefined) throw this.#refusedError();\n return this.#sourceVersion;\n }\n\n /** The row fields, in the question's order. */\n get rows(): readonly PivotAnswerAxis[] {\n if (this.refusal !== undefined) throw this.#refusedError();\n return this.#rows;\n }\n\n /** The column fields, in the question's order. */\n get columns(): readonly PivotAnswerAxis[] {\n if (this.refusal !== undefined) throw this.#refusedError();\n return this.#columns;\n }\n\n /** Each field in Values, in the question's order. */\n get values(): readonly PivotAnswerValues[] {\n if (this.refusal !== undefined) throw this.#refusedError();\n return this.#values;\n }\n\n /** The included records at a leaf. */\n recordsAt(leaf: number): number {\n return elementAt(this.#records, checkLeaf(leaf, this.leafCount));\n }\n\n /** The sibling sets answered as windows (ADR-0370 section 3); none in an answer of leaves. */\n get windows(): readonly PivotAnswerWindow[] {\n if (this.refusal !== undefined) throw this.#refusedError();\n return this.#windowing.windows;\n }\n\n /** The window and side a rest cell merges, or `undefined` for a cell of a group. */\n restAt(cell: number): PivotAnswerRest | undefined {\n checkLeaf(cell, this.leafCount);\n if (this.#windowing.windows.length === 0) return undefined;\n const code = elementAt(this.#windowing.rests, cell);\n return code < 0 ? undefined : { window: Math.floor(code / 2), side: code % 2 === 0 ? 'before' : 'after' };\n }\n\n /** What does not answer the question, in words, or `undefined` when the answer answers it. */\n mismatch(query: PivotQuery): string | undefined {\n if (this.refusal !== undefined) return `the source refused: ${this.refusal.message}`;\n if (this.isLevels && query.levels === undefined) return 'it holds Level Aggregates, and the question asks for the leaves';\n if (!sameNames(this.#rows, query.rows)) return `its row fields are ${names(this.#rows)}, and the question's ${names(query.rows)}`;\n if (!sameNames(this.#columns, query.columns)) return `its column fields are ${names(this.#columns)}, and the question's ${names(query.columns)}`;\n if (!sameNames(this.#values, query.values)) return `its fields in Values are ${names(this.#values)}, and the question's ${names(query.values)}`;\n for (let v = 0; v < this.#values.length; v++) {\n const held = elementAt(this.#values, v);\n const asked = partBits(elementAt(query.values, v).parts);\n if ((columnsOfValues(held).parts & asked) !== asked) {\n return `it carries the parts ${partsText(columnsOfValues(held).parts)} of '${held.field}', and the question asks for ${partsText(asked)}`;\n }\n }\n if (this.leafCount > query.maxLeaves) {\n return `it holds ${this.leafCount} ${this.isLevels ? 'cells' : 'leaves'}, and the question allows ${query.maxLeaves}`;\n }\n return query.levels !== undefined && this.isLevels ? levelAnswerMismatch(query.levels, this, this.#windowing) : undefined;\n }\n\n #refusedError(): Error {\n return new Error(`The source refused to answer: ${this.refusal?.message ?? 'without a reason'}`); // oxlint-disable-line ex-grid/no-stand-in-default -- only a refusal reaches here, and a refusal says why\n }\n}\n\n/**\n * Builds an answer a leaf at a time, as a server's rows arrive (ADR-0066): each leaf named by its Items, one\n * per row and column field, with its record count, and the parts asked for of each field in Values set on\n * it. Two leaves for one combination of Items are refused, and so is a part the question did not ask for.\n *\n * A server that answers Level Aggregates (ADR-0370 section 3) adds the cells of the groups shown with\n * {@link PivotAnswerBuilder.addCell} instead, from `GROUPING SETS` for instance, and gives a sum that is a\n * double with the sum of its magnitudes; an answer holds leaves or cells, never both.\n */\nexport class PivotAnswerBuilder {\n readonly #query: PivotQuery;\n readonly #sourceVersion: string;\n readonly #levels: number;\n readonly #items: PivotItemKey[][];\n readonly #itemIndex: Map<string, number>[];\n readonly #itemOfLeaf: number[][];\n readonly #records: number[] = [];\n readonly #values: PartColumns[];\n readonly #leaves = new Map<string, number>();\n readonly #windows: PivotAnswerWindow[] = [];\n readonly #windowOf = new Map<string, number>();\n readonly #rests: number[] = [];\n #cells: boolean | undefined;\n #built = false;\n\n /** A builder for the answer to `query`, under `sourceVersion`. */\n constructor(query: PivotQuery, sourceVersion: string) {\n if (typeof sourceVersion !== 'string') throw new TypeError('An answer carries its Source Version.');\n this.#query = query;\n this.#sourceVersion = sourceVersion;\n this.#levels = query.rows.length + query.columns.length;\n this.#items = Array.from({ length: this.#levels }, () => []);\n this.#itemIndex = Array.from({ length: this.#levels }, () => new Map<string, number>());\n this.#itemOfLeaf = Array.from({ length: this.#levels }, () => []);\n this.#values = query.values.map(value => new PartColumns(partBits(value.parts)));\n }\n\n /** How many leaves have been added. */\n get leafCount(): number {\n return this.#records.length;\n }\n\n /** Adds a leaf of `records` records (at least 1) at one Item per row and column field, outermost row\n * field first; its index. */\n addLeaf(items: readonly PivotItemKey[], records: number): number {\n if (!Number.isSafeInteger(records) || records < 1) throw new RangeError(`A leaf holds at least one record, not ${records}.`);\n if (items.length !== this.#levels) {\n throw new TypeError(`A leaf names one Item per row and column field: ${this.#levels}, not ${items.length}.`);\n }\n if (this.#cells === true) throw new Error('This answer holds the cells of the groups shown; it is given them with addCell (ADR-0370 section 3).');\n this.#cells = false;\n const indexes = items.map((item, level) => this.#indexOf(level, item));\n const leafKey = indexes.join(',');\n if (this.#leaves.has(leafKey)) throw new TypeError(`The answer already has a leaf for [${items.map(itemKeyText).join(', ')}].`);\n return this.#add(leafKey, indexes, records);\n }\n\n /**\n * Adds the cell of a shown row group crossed with a shown column group, and returns its index (ADR-0370\n * section 3): an answer of Level Aggregates, to a question carrying levels. Each group is named by its\n * Items, outermost first, down to its depth \u2014 none for a grand total. Refuses a cell of no records, more\n * Items than an axis has fields, and a second cell for the same Items. Which cells are shown, and that each\n * has its parent, is checked when the answer is read against the question.\n */\n addCell(rowItems: readonly PivotItemKey[], columnItems: readonly PivotItemKey[], records: number): number {\n if (!Number.isSafeInteger(records) || records < 1) throw new RangeError(`A leaf holds at least one record, not ${records}.`);\n const rowCount = this.#query.rows.length;\n const columnCount = this.#query.columns.length;\n if (rowItems.length > rowCount) throw new TypeError(`A row group names at most one Item per row field: ${rowCount}, not ${rowItems.length}.`);\n if (columnItems.length > columnCount) throw new TypeError(`A column group names at most one Item per column field: ${columnCount}, not ${columnItems.length}.`);\n this.#startCells();\n const indexes = Array.from({ length: this.#levels }, () => -1);\n rowItems.forEach((item, level) => {\n indexes[level] = this.#indexOf(level, item);\n });\n columnItems.forEach((item, level) => {\n indexes[rowCount + level] = this.#indexOf(rowCount + level, item);\n });\n const cellKey = indexes.join(',');\n if (this.#leaves.has(cellKey)) {\n throw new TypeError(`The answer already has a cell for [${rowItems.map(itemKeyText).join(', ')}] \u00D7 [${columnItems.map(itemKeyText).join(', ')}].`);\n }\n const cell = this.#add(cellKey, indexes, records);\n for (const parts of this.#values) if (parts.absolutes !== undefined) parts.absolutes[cell] = Number.NaN;\n return cell;\n }\n\n /**\n * Adds a sibling set answered as a window, and returns its index (ADR-0370 section 3): the children of the\n * row group `parentRows` names, of which `before` come before the first one shown and `after` after the\n * last, each count taking in its margin. The margins and the siblings shown are added as cells; the siblings\n * beyond each margin as rest cells with {@link PivotAnswerBuilder.addRest}. Refuses a second window for one\n * parent; whether the window answers the question is checked when the answer is read against it.\n */\n addWindow(parentRows: readonly PivotItemKey[], before: number, after: number): number {\n this.#startCells();\n if (parentRows.length >= this.#query.rows.length) {\n throw new TypeError(`A window's parent names fewer Items than there are row fields: ${this.#query.rows.length}, not ${parentRows.length}.`);\n }\n for (const [side, count] of [['before', before], ['after', after]] as const) {\n if (!Number.isSafeInteger(count) || count < 0) throw new RangeError(`A window has a whole number of siblings ${side} it, not ${count}.`);\n }\n const parent = parentRows.map((item, level) => this.#indexOf(level, item));\n const key = parent.join(',');\n if (this.#windowOf.has(key)) throw new TypeError(`The answer already has a window under [${parentRows.map(itemKeyText).join(', ')}].`);\n const window = this.#windows.length;\n this.#windowOf.set(key, window);\n this.#windows.push(Object.freeze({ parent: Object.freeze(parent), before, after }));\n return window;\n }\n\n /**\n * Adds a rest cell of a window, and returns its index (ADR-0370 section 3): the siblings on one side beyond\n * its margin, merged, crossed with the shown column group `columnItems` names. Its parts are set as a cell's.\n * Refuses one of no records and a second one for the same side and column group.\n */\n addRest(window: number, side: PivotRestSide, columnItems: readonly PivotItemKey[], records: number): number {\n if (!Number.isSafeInteger(records) || records < 1) throw new RangeError(`A leaf holds at least one record, not ${records}.`);\n const held = this.#windows[window];\n if (held === undefined) throw new RangeError(`The answer has ${this.#windows.length} windows.`);\n if (!restSides.has(side)) throw new TypeError(`A rest is before or after its window, not '${side}'.`);\n const rowCount = this.#query.rows.length;\n const columnCount = this.#query.columns.length;\n if (columnItems.length > columnCount) throw new TypeError(`A column group names at most one Item per column field: ${columnCount}, not ${columnItems.length}.`);\n const indexes = Array.from({ length: this.#levels }, () => -1);\n held.parent.forEach((item, level) => {\n indexes[level] = item;\n });\n columnItems.forEach((item, level) => {\n indexes[rowCount + level] = this.#indexOf(rowCount + level, item);\n });\n const code = 2 * window + (side === 'after' ? 1 : 0);\n const restKey = `${indexes.join(',')}|${code}`;\n if (this.#leaves.has(restKey)) throw new TypeError(`Window ${window} already has a rest ${side} it at [${columnItems.map(itemKeyText).join(', ')}].`);\n const cell = this.#add(restKey, indexes, records, code);\n for (const parts of this.#values) if (parts.absolutes !== undefined) parts.absolutes[cell] = Number.NaN;\n return cell;\n }\n\n #startCells(): void {\n if (this.#query.levels === undefined) throw new Error('The question asks for the leaves, and carries no levels to answer with cells (ADR-0370 section 3).');\n if (this.#cells === false) throw new Error('This answer holds leaves; it is given them with addLeaf (ADR-0370 section 3).');\n if (this.#cells === undefined) {\n this.#cells = true;\n for (const parts of this.#values) if (parts.sums !== undefined) parts.trackAbsolutes();\n }\n }\n\n #indexOf(level: number, item: PivotItemKey): number {\n const key = pivotItemKey(item.kind, item.value);\n const id = publicKeyId(key);\n const index = elementAt(this.#itemIndex, level);\n const found = index.get(id);\n if (found !== undefined) return found;\n const made = elementAt(this.#items, level).length;\n elementAt(this.#items, level).push(key);\n index.set(id, made);\n return made;\n }\n\n #add(leafKey: string, indexes: readonly number[], records: number, rest = -1): number {\n const leaf = this.#records.length;\n this.#leaves.set(leafKey, leaf);\n indexes.forEach((index, level) => elementAt(this.#itemOfLeaf, level).push(index));\n this.#records.push(records);\n this.#rests.push(rest);\n for (const values of this.#values) values.addCell();\n return leaf;\n }\n\n /** Sets a leaf's counts for a field in Values. */\n setCounts(leaf: number, value: number, values: number, numbers: number, nonFinite = false): void {\n const columns = this.#columnsOf(leaf, value);\n const records = elementAt(this.#records, leaf);\n if (values < 0 || numbers < 0 || numbers > values || values > records) {\n throw new RangeError(`A leaf of ${records} records cannot hold ${values} values of which ${numbers} are numbers.`);\n }\n columns.counts[leaf] = { values, numbers, nonFinite };\n }\n\n /** Sets a leaf's sum for a field in Values. */\n setSum(leaf: number, value: number, sum: PivotNumber): void {\n const sums = this.#asked(this.#columnsOf(leaf, value).sums, value, 'Sum');\n sums[leaf] = sum.kind === 'exact'\n ? { exact: decimalCanonical(sum.value), double: 0, compensation: 0, inexact: false }\n : { exact: { mantissa: 0n, scale: 0 }, double: sum.value, compensation: 0, inexact: true };\n }\n\n /** Sets a cell's sum of Level Aggregates with the sum of its numbers' magnitudes, which a sum that is a\n * double carries (ADR-0370 section 3): what bounds its rounding when the cell is checked against its\n * parent. */\n setLevelSum(leaf: number, value: number, sum: PivotNumber, absoluteSum: number): void {\n if (this.#cells !== true) throw new Error('A sum of magnitudes is carried by a cell of Level Aggregates (ADR-0370 section 3).');\n if (Number.isNaN(absoluteSum) || absoluteSum < 0) throw new RangeError(`A sum of magnitudes is a number, not below 0, not ${absoluteSum} (ADR-0370 section 3).`);\n this.setSum(leaf, value, sum);\n const absolutes = elementAt(this.#values, value).absolutes;\n if (absolutes === undefined) throw new Error('Internal: a cell of Level Aggregates keeps the magnitudes beside its sum.');\n absolutes[leaf] = absoluteSum;\n }\n\n /** Sets a leaf's extremes for a field in Values: both exact or both doubles. */\n setExtremes(leaf: number, value: number, min: PivotNumber, max: PivotNumber): void {\n const extremes = this.#asked(this.#columnsOf(leaf, value).extremes, value, 'Extremes');\n if (min.kind === 'exact' && max.kind === 'exact') {\n extremes[leaf] = { exactMin: min.value, exactMax: max.value, min: 0, max: 0, inexact: false };\n } else if (min.kind === 'double' && max.kind === 'double') {\n extremes[leaf] = { exactMin: { mantissa: 0n, scale: 0 }, exactMax: { mantissa: 0n, scale: 0 }, min: min.value, max: max.value, inexact: true };\n } else {\n throw new TypeError(\"A leaf's extremes are both exact or both double.\");\n }\n }\n\n /** Sets a leaf's product for a field in Values. */\n setProduct(leaf: number, value: number, product: number): void {\n this.#asked(this.#columnsOf(leaf, value).products, value, 'Product')[leaf] = product;\n }\n\n /** Sets a leaf's running variance for a field in Values. */\n setVariance(leaf: number, value: number, mean: number, m2: number): void {\n this.#asked(this.#columnsOf(leaf, value).variances, value, 'Variance')[leaf] = { mean, m2 };\n }\n\n /** The answer, once: one with more leaves than the question allows is refused. */\n build(): PivotAnswer {\n if (this.#built) throw new Error('This answer has been built already.');\n this.#built = true;\n const leafCount = this.#records.length;\n if (leafCount > this.#query.maxLeaves) return PivotAnswer.refused(PivotRefusals.tooManyLeaves(this.#query.maxLeaves));\n for (const parts of this.#values) parts.finish();\n const rowCount = this.#query.rows.length;\n const axes = placedFields(this.#query).slice(0, this.#levels).map((field, level) =>\n new PivotAnswerAxis(field.field, elementAt(this.#items, level), elementAt(this.#itemOfLeaf, level)));\n const values = this.#values.map((parts, v) => makeValues(elementAt(this.#query.values, v).field, parts, leafCount));\n try {\n const windowing = this.#windows.length === 0 ? noWindowing : Object.freeze({ windows: Object.freeze([...this.#windows]), rests: Object.freeze([...this.#rests]) });\n return makeAnswer(this.#sourceVersion, axes.slice(0, rowCount), axes.slice(rowCount), leafCount, [...this.#records], values, this.#cells === true, windowing);\n } catch (error) {\n if (error instanceof PivotFormatError) throw new Error(error.message, { cause: error });\n throw error;\n }\n }\n\n #columnsOf(leaf: number, value: number): PartColumns {\n if (this.#built) throw new Error('This answer has been built already.');\n checkLeaf(leaf, this.#records.length);\n if (!Number.isInteger(value) || value < 0 || value >= this.#values.length) {\n throw new RangeError(`The question has ${this.#values.length} fields in Values.`);\n }\n return elementAt(this.#values, value);\n }\n\n #asked<T>(part: T | undefined, value: number, name: string): T {\n if (part === undefined) {\n throw new Error(`The question did not ask for the ${name} part of '${elementAt(this.#query.values, value).field}' (ADR-0066).`);\n }\n return part;\n }\n}\n\n/** An answer with its leaves, or with its cells of Level Aggregates (`levels`), as a pass, a builder or a\n * reader makes it; a level answer's shape is checked, and refused with a PivotFormatError. */\nexport function madeAnswer(sourceVersion: string, rows: readonly PivotAnswerAxis[], columns: readonly PivotAnswerAxis[], leafCount: number,\n records: readonly number[], values: readonly PivotAnswerValues[], levels = false, windowing: PivotAnswerWindowing = noWindowing): PivotAnswer {\n return makeAnswer(sourceVersion, rows, columns, leafCount, records, values, levels, windowing);\n}\n\n/** One field in Values of an answer, from its parts column by column. */\nexport function answerValues(field: string, columns: PartColumns, leafCount: number): PivotAnswerValues {\n return makeValues(field, columns, leafCount);\n}\n\n/** The parts of a field in Values, column by column. */\nexport function answerColumns(values: PivotAnswerValues): PartColumns {\n return columnsOfValues(values);\n}\n", "// How the engine's work shares the thread (PV-40): a question's pass, the answer assembled after it, the cube\n// made from the answer and the report laid out from the cube run in slices sized by time, yielding between\n// them so that a browser keeps painting, and cancelled work stops at the next slice. The C# engine's\n// PivotSlicing and Slicer.\n\nimport { elementAt } from '../must';\n\n/** How the engine's work paces itself (PV-40). */\nexport interface PivotSlicing {\n /** How long one slice works, in milliseconds, before it yields; 30 when left out, within the 50 a page\n * may be blocked for. A slice always does some work, so 0 yields after every step. */\n readonly sliceBudgetMs?: number;\n /** What the work awaits between slices; a macrotask (`setTimeout(\u2026, 0)`) when left out, which gives a\n * browser a turn of its event loop to paint in. */\n readonly yield?: () => Promise<void>;\n}\n\nfunction macrotask(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n}\n\n/** Paces one question's work: at each step it looks at the signal, and yields once the slice is spent. */\nexport class Slicer {\n readonly #slicing: CheckedSlicing;\n readonly #signal: AbortSignal | undefined;\n #sliceStart = performance.now();\n\n constructor(slicing: CheckedSlicing, signal: AbortSignal | undefined) {\n this.#slicing = slicing;\n this.#signal = signal;\n signal?.throwIfAborted();\n }\n\n /** The signal the question is cancelled with, which a source asked on these slices hears. */\n get signal(): AbortSignal | undefined {\n return this.#signal;\n }\n\n /** A point between two steps: throws once the question is cancelled, and yields when the slice is spent. */\n async step(): Promise<void> {\n this.#signal?.throwIfAborted();\n if (performance.now() < this.#sliceStart + this.#slicing.budget) return;\n await this.#slicing.yield();\n this.#signal?.throwIfAborted();\n this.#sliceStart = performance.now();\n }\n\n /** Runs a piece of work that yields between its steps, a step at a time. */\n async run<T>(steps: Generator<void, T>): Promise<T> {\n for (;;) {\n const next = steps.next();\n if (next.done === true) return next.value;\n await this.step();\n }\n }\n}\n\n/** The units of work a piece of the work after a pass is cut to \u2014 a leaf copied, a cell merged, a node of a\n * report entered \u2014 so that a step falls about every thousand of them. */\nexport const pieceUnits = 1024;\n\n/** Runs `step` over [0, `count`) in pieces of about {@link pieceUnits} units, each element worth `weight` of\n * them, yielding between two pieces. */\nexport function* inPieces(count: number, weight: number, step: (from: number, to: number) => void): Generator<void, void> {\n const size = Math.max(1, Math.floor(pieceUnits / weight));\n for (let from = 0; from < count; from += size) {\n if (from > 0) yield;\n step(from, Math.min(count, from + size));\n }\n}\n\n/** Runs a piece of work that yields between its steps through to its result, unsliced. */\nexport function runWhole<T>(steps: Generator<void, T>): T {\n for (;;) {\n const next = steps.next();\n if (next.done === true) return next.value;\n }\n}\n\n/** `list` sorted as `toSorted` sorts it, stably, a piece at a time: a short list at once, a long one merged\n * bottom up, yielding once a piece's worth of elements is placed. Two runs already in order are copied with one\n * comparison, so a list that comes sorted \u2014 as a source's Items often do \u2014 costs a comparison an element. */\nexport function* sortedSteps<T extends object | number>(list: readonly T[], compare: (a: T, b: T) => number): Generator<void, readonly T[]> {\n if (list.length <= pieceUnits / 8) return list.toSorted(compare);\n let from = [...list];\n let to = [...list];\n let compared = 0;\n for (let width = 1; width < from.length; width *= 2) {\n for (let start = 0; start < from.length; start += 2 * width) {\n const middle = Math.min(start + width, from.length);\n const end = Math.min(start + (2 * width), from.length);\n if (middle >= end || compare(elementAt(from, middle - 1), elementAt(from, middle)) <= 0) {\n for (let at = start; at < end; at++) to[at] = elementAt(from, at);\n compared += end - start;\n if (compared >= pieceUnits) {\n compared = 0;\n yield;\n }\n continue;\n }\n let left = start;\n let right = middle;\n for (let at = start; at < end; at++) {\n if (left < middle && (right >= end || compare(elementAt(from, left), elementAt(from, right)) <= 0)) {\n to[at] = elementAt(from, left++);\n } else {\n to[at] = elementAt(from, right++);\n }\n if (++compared >= pieceUnits) {\n compared = 0;\n yield;\n }\n }\n }\n [from, to] = [to, from];\n }\n return from;\n}\n\n/** A Consumer's slicing, checked and resolved: how long a slice works, and what the work awaits between two. */\nexport interface CheckedSlicing {\n readonly budget: number;\n readonly yield: () => Promise<void>;\n}\n\n/** Checks a Consumer's slicing where it is given \u2014 when a source is made, and when a cube or a report is asked\n * for in slices \u2014 so a wrong budget fails there, before any work. */\nexport function checkedSlicing(slicing: PivotSlicing | undefined): CheckedSlicing {\n const chosen = slicing === undefined ? {} : slicing;\n const budget = chosen.sliceBudgetMs === undefined ? 30 : chosen.sliceBudgetMs;\n if (typeof budget !== 'number' || Number.isNaN(budget) || budget < 0) {\n throw new RangeError(`A slice budget is a number of milliseconds, not negative; ${String(budget)} is not.`);\n }\n const given = chosen.yield;\n if (given !== undefined && typeof given !== 'function') throw new TypeError('A slicing\\'s yield is a function that returns a promise.');\n return Object.freeze({ budget, yield: given === undefined ? macrotask : () => given() });\n}\n", "// Whether a server's Level Aggregates add up (ADR-0370 section 3): the parts of every sibling set shown,\n// composed, against their parent's. Counts, extremes and exact sums are compared exactly; a double part (a\n// sum, a product, a running variance) within the rounding its composition can make on either side, so an\n// honest server is never refused for the order it summed in, and a figure the rounding cannot explain is.\n//\n// The bounds, fixed by test/level-check.test.ts before Level Aggregates are built: with u = 2^-53 and\n// \u03B3 = k\u00B7u / (1 \u2212 k\u00B7u) for k the parent's numbers plus the children composed, any order of summing N numbers\n// is within \u03B3\u00B7\u03A3|x| of the true sum, and any order of multiplying them within \u03B3\u00B7|\u03A0 x|. Each side may be that\n// far off, so a sum agrees within 2\u03B3\u00B7\u03A3|x| (\u03A3|x| the parent's absolute sum, itself within \u03B3), and a product\n// within 2\u03B3 of the larger. A running variance's mean and sum of squared deviations are bounded through S =\n// m2 + n\u00B7mean\u00B2, which is \u03A3x\u00B2 for the parent: the naive m2 = \u03A3x\u00B2 \u2212 (\u03A3x)\u00B2/n a SQL server computes is within\n// 3\u03B3\u00B7S, and Welford's within the same order, so the mean agrees within 4\u03B3\u00B7\u221AS and m2 within 8\u03B3\u00B7S. A part\n// that is not finite is #NUM! in the parent and its children alike, so only the counts are compared; a bound\n// that is not finite cannot be checked, and refuses.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport { decimalCompare, decimalToNumber, doubleOfWide, scaledTo } from '../aggregates/exact-decimal';\nimport type { PartColumns } from '../aggregates/parts';\nimport type { PivotNumber } from '../cube/answer';\nimport { elementAt } from '../must';\n\n/** One group's parts of one Value Field, as a server answers them under Level Aggregates. */\nexport interface LevelParts {\n /** Values that are not Blank. */\n readonly values: number;\n /** Values that are numbers, non-finite ones included. */\n readonly numbers: number;\n /** Whether a non-finite number is among them: every numeric part is then #NUM!. */\n readonly nonFinite: boolean;\n /** The sum, exact while every number was. */\n readonly sum?: PivotNumber;\n /** The sum of the numbers' magnitudes, carried with a sum that is a double: what bounds its rounding. */\n readonly absoluteSum?: number;\n /** The smallest number. */\n readonly min?: PivotNumber;\n /** The largest number. */\n readonly max?: PivotNumber;\n /** The product. */\n readonly product?: number;\n /** The running mean. */\n readonly mean?: number;\n /** The running sum of squared deviations from the mean. */\n readonly m2?: number;\n}\n\n/** One cell's parts of one Value Field as {@link levelMismatch} reads them: every part its columns carry, but\n * for a cell of no numbers or of #NUM!, whose parts are not read. */\nexport function levelPartsAt(columns: PartColumns, cell: number): LevelParts {\n const counts = elementAt(columns.counts, cell);\n const held = { values: counts.values, numbers: counts.numbers, nonFinite: counts.nonFinite };\n if (counts.numbers === 0 || counts.nonFinite) return held;\n const sum = columns.sums?.[cell];\n const extremes = columns.extremes?.[cell];\n const product = columns.products?.[cell];\n const variance = columns.variances?.[cell];\n const absoluteSum = columns.absolutes?.[cell];\n return {\n ...held,\n ...(sum === undefined ? {} : { sum: sum.inexact ? { kind: 'double', value: sum.double } : { kind: 'exact', value: sum.exact } }),\n ...(sum !== undefined && sum.inexact && absoluteSum !== undefined ? { absoluteSum } : {}),\n ...(extremes === undefined ? {} : extremes.inexact\n ? { min: { kind: 'double', value: extremes.min }, max: { kind: 'double', value: extremes.max } }\n : { min: { kind: 'exact', value: extremes.exactMin }, max: { kind: 'exact', value: extremes.exactMax } }),\n ...(product === undefined ? {} : { product }),\n ...(variance === undefined ? {} : { mean: variance.mean, m2: variance.m2 }),\n };\n}\n\n/** The part of a group that does not add up from its children, named as a refusal says it. */\nexport type LevelMismatch =\n | 'values' | 'numbers' | 'nonFinite' | 'sum' | 'absoluteSum' | 'min' | 'max' | 'product' | 'mean' | 'm2';\n\nconst unit = 2 ** -53;\nconst smallestNormal = 2 ** -1022;\n\nfunction gamma(k: number): number {\n return k * unit / (1 - k * unit);\n}\n\n/**\n * The first part of `parent` its `children` do not compose to, or `undefined` where every part agrees. A part\n * the parent carries and a child does not, or the reverse, does not add up. The children are the whole\n * sibling set: every child of the parent that some record carries, crossed with the same column group.\n */\nexport function levelMismatch(parent: LevelParts, children: readonly LevelParts[]): LevelMismatch | undefined {\n let values = 0;\n let numbers = 0;\n let nonFinite = false;\n for (const child of children) {\n values += child.values;\n numbers += child.numbers;\n nonFinite ||= child.nonFinite;\n }\n if (values !== parent.values) return 'values';\n if (numbers !== parent.numbers) return 'numbers';\n if (nonFinite !== parent.nonFinite) return 'nonFinite';\n if (nonFinite || numbers === 0) return undefined;\n const numbered = children.filter(child => child.numbers > 0);\n const g = gamma(numbers + numbered.length);\n return sumMismatch(parent, numbered, g)\n ?? extremeMismatch('min', parent.min, numbered.map(c => c.min), -1)\n ?? extremeMismatch('max', parent.max, numbered.map(c => c.max), 1)\n ?? productMismatch(parent.product, numbered.map(c => c.product), g)\n ?? varianceMismatch(parent, numbered, g);\n}\n\nfunction carried<T>(parent: T | undefined, children: readonly (T | undefined)[]): { parent: T; children: readonly T[] } | 'none' | 'mixed' {\n const held = children.filter((c): c is T => c !== undefined);\n if (parent === undefined) return held.length === 0 ? 'none' : 'mixed';\n return held.length === children.length ? { parent, children: held } : 'mixed';\n}\n\nfunction within(a: number, b: number, bound: number): boolean {\n return Number.isFinite(bound) && Math.abs(a - b) <= bound;\n}\n\nfunction sumMismatch(parent: LevelParts, children: readonly LevelParts[], g: number): LevelMismatch | undefined {\n const sums = carried(parent.sum, children.map(c => c.sum));\n if (sums === 'none') return undefined;\n if (sums === 'mixed') return 'sum';\n const exact = sums.children.every(s => s.kind === 'exact');\n if (exact && sums.parent.kind === 'exact') {\n return exactSumOf(sums.children.map(s => (s.kind === 'exact' ? s.value : unreachableKind())), sums.parent.value) ? undefined : 'sum';\n }\n // A double parent bounds both sides by its absolute sum; an exact parent over a double child cannot be.\n if (sums.parent.kind === 'exact') return 'sum';\n const absolute = parent.absoluteSum;\n if (absolute === undefined || !(absolute >= Math.abs(sums.parent.value) * (1 - g))) return 'absoluteSum';\n const composed = exact ? exactAsDouble(sums.children) : compensated(sums.children.map(numberOf));\n if (!within(composed, sums.parent.value, 2 * g * absolute / (1 - g))) return 'sum';\n const absolutes = children.map(c => c.absoluteSum);\n if (absolutes.every((a): a is number => a !== undefined)) {\n const total = compensated(absolutes);\n if (!within(total, absolute, 2 * g * Math.max(total, absolute))) return 'absoluteSum';\n }\n return undefined;\n}\n\nfunction unreachableKind(): never {\n throw new Error('Internal: an exact sum was read as a double.');\n}\n\nfunction numberOf(number: PivotNumber): number {\n return number.kind === 'exact' ? decimalToNumber(number.value) : number.value;\n}\n\n// The children's exact sums added without a limit, against the parent's.\nfunction exactSumOf(children: readonly SnapshotDecimal[], parent: SnapshotDecimal): boolean {\n const scale = Math.max(parent.scale, ...children.map(c => c.scale));\n let total = 0n;\n for (const child of children) total += scaledTo(child, scale);\n return total === scaledTo(parent, scale);\n}\n\nfunction exactAsDouble(children: readonly PivotNumber[]): number {\n const decimals = children.map(c => (c.kind === 'exact' ? c.value : unreachableKind()));\n const scale = Math.max(...decimals.map(c => c.scale));\n let total = 0n;\n for (const child of decimals) total += scaledTo(child, scale);\n return doubleOfWide(total, scale);\n}\n\n// Neumaier's compensated sum, so the composition adds no rounding of its own worth the name.\nfunction compensated(numbers: readonly number[]): number {\n let total = 0;\n let compensation = 0;\n for (const value of numbers) {\n const next = total + value;\n compensation += Math.abs(total) >= Math.abs(value) ? (total - next) + value : (value - next) + total;\n total = next;\n }\n return total + compensation;\n}\n\nfunction extremeMismatch(name: 'min' | 'max', parent: PivotNumber | undefined, children: readonly (PivotNumber | undefined)[], sign: number): LevelMismatch | undefined {\n const extremes = carried(parent, children);\n if (extremes === 'none') return undefined;\n if (extremes === 'mixed') return name;\n // The parent is a double exactly when a child is: one double record makes both so.\n const inexact = extremes.children.some(e => e.kind === 'double');\n if (inexact !== (extremes.parent.kind === 'double')) return name;\n let best = extremes.children[0];\n for (const child of extremes.children) {\n if (best === undefined || compareNumbers(child, best) * sign > 0) best = child;\n }\n return best !== undefined && compareNumbers(best, extremes.parent) === 0 ? undefined : name;\n}\n\nfunction compareNumbers(a: PivotNumber, b: PivotNumber): number {\n if (a.kind === 'exact' && b.kind === 'exact') return decimalCompare(a.value, b.value);\n const x = numberOf(a);\n const y = numberOf(b);\n return x < y ? -1 : x > y ? 1 : 0;\n}\n\nfunction productMismatch(parent: number | undefined, children: readonly (number | undefined)[], g: number): LevelMismatch | undefined {\n const products = carried(parent, children);\n if (products === 'none') return undefined;\n if (products === 'mixed') return 'product';\n let composed = 1;\n for (const child of products.children) composed *= child;\n const expected = products.parent;\n if (composed === expected) return undefined;\n // Below the normal range a product's relative rounding is unbounded, and what it shows is zero either way.\n if (Math.abs(composed) < smallestNormal && Math.abs(expected) < smallestNormal) return undefined;\n return within(composed, expected, 2 * g * Math.max(Math.abs(composed), Math.abs(expected))) ? undefined : 'product';\n}\n\nfunction varianceMismatch(parent: LevelParts, children: readonly LevelParts[], g: number): LevelMismatch | undefined {\n const means = carried(parent.mean, children.map(c => c.mean));\n const m2s = carried(parent.m2, children.map(c => c.m2));\n if (means === 'none' && m2s === 'none') return undefined;\n if (means === 'none' || means === 'mixed') return 'mean';\n if (m2s === 'none' || m2s === 'mixed') return 'm2';\n let count = 0;\n let mean = 0;\n let m2 = 0;\n children.forEach((child, i) => {\n const childMean = elementAt(means.children, i);\n const childM2 = elementAt(m2s.children, i);\n if (count === 0) {\n count = child.numbers;\n mean = childMean;\n m2 = childM2;\n return;\n }\n const n = count + child.numbers;\n const delta = childMean - mean;\n mean += delta * child.numbers / n;\n m2 += childM2 + delta * delta * count * child.numbers / n;\n count = n;\n });\n const squares = m2s.parent + parent.numbers * means.parent * means.parent;\n if (!within(mean, means.parent, 4 * g * Math.sqrt(squares))) return 'mean';\n return within(m2, m2s.parent, 8 * g * squares) ? undefined : 'm2';\n}\n", "// Every group a level answer shows, checked against its parent (ADR-0370 section 3), as its cube is made: each\n// sibling set's records and parts composed and compared with the parent's, by the bounds level-check.ts holds.\n// The children are all of them, since every question names the whole screen: the groups below a shown group\n// that is expanded, crossed with the same group of the other axis. A set that does not add up refuses the\n// answer, naming its parent, and no figure from it is shown (spine rule 1). A Sibling Window's set is its siblings\n// answered and its Rest Cells, and its margins are checked to sort strictly beyond its edges.\n\nimport type { PartColumns } from '../aggregates/parts';\nimport type { AxisNode } from '../cube/cube';\nimport type { PivotRestSide } from '../cube/answer';\nimport type { PivotLevels } from '../cube/query';\nimport type { PivotItemKey } from '../items/item-key';\nimport { defined, elementAt } from '../must';\nimport { pieceUnits } from '../source/slicing';\nimport { levelMismatch, levelPartsAt, type LevelParts } from './level-check';\nimport { levelExpander } from './level-shown';\n\n/** What the check reads of a cube being made from a level answer. */\nexport interface LevelCells {\n readonly levels: PivotLevels;\n /** How many row and column fields the question places. */\n readonly rowFields: number;\n readonly columnFields: number;\n /** Each cell's row node and column node. */\n readonly rowOf: readonly AxisNode[];\n readonly columnOf: readonly AxisNode[];\n /** The cell at a row node and a column node. */\n readonly cellAt: (row: AxisNode, column: AxisNode) => number | undefined;\n /** Each cell's records. */\n readonly records: (cell: number) => number;\n /** Each field in Values: its name and its parts at every cell. */\n readonly values: readonly { readonly field: string; readonly columns: PartColumns }[];\n /** A cell's groups, as a refusal names them. */\n readonly describe: (cell: number) => string;\n /** The column tree's root: the grand total of the columns. */\n readonly columnRoot: AxisNode;\n /** The answer's Sibling Windows. */\n readonly windows: readonly LevelWindow[];\n /** Whether a cell is a Rest Cell, which stands beside a group's children and is checked as a row of its own. */\n readonly isRest: (cell: number) => boolean;\n}\n\n/** A Sibling Window as the check reads it: its parent's row node, the siblings before and after the ones shown,\n * and its Rest Cells by side and column node. */\nexport interface LevelWindow {\n readonly parent: AxisNode;\n readonly before: number;\n readonly after: number;\n readonly rests: ReadonlyMap<PivotRestSide, ReadonlyMap<AxisNode, number>>;\n}\n\n/** Whether a node's children are shown under an axis's rules: the grand total's always are, where there is a\n * field below it. */\nexport function expandsBelow(node: AxisNode, fields: number, expanded: (level: number, item: PivotItemKey) => boolean): boolean {\n if (node.level + 1 >= fields) return false;\n return node.item === undefined || expanded(node.level, node.item.publicKey);\n}\n\n/** Checks every sibling set of the cells against its parent, yielding about every {@link pieceUnits} children\n * read; throws, naming the parent, at the first set that does not add up. */\nexport function* levelSumsSteps(cells: LevelCells): Generator<void, void> {\n const rowExpanded = levelExpander(cells.levels.rows);\n const columnExpanded = levelExpander(cells.levels.columns);\n // Each cell's parts, read once: a cell is a parent once and a child in a set of each axis.\n const parts = cells.values.map(() => new Map<number, LevelParts>());\n const partsAt = (v: number, cell: number): LevelParts => {\n const read = elementAt(parts, v);\n let held = read.get(cell);\n if (held === undefined) {\n held = levelPartsAt(elementAt(cells.values, v).columns, cell);\n read.set(cell, held);\n }\n return held;\n };\n const windowOf = new Map(cells.windows.map(window => [window.parent, window]));\n const check = (cell: number, axis: string, children: readonly number[]): void => {\n const refuse = (what: string): never => {\n throw new Error(`The server's answer for ${cells.describe(cell)} does not add up: ${what} is not what its ${axis} groups below `\n + 'compose to (ADR-0370 section 3).');\n };\n const records = children.reduce((total, child) => total + cells.records(child), 0);\n if (records !== cells.records(cell)) refuse(`its records (${cells.records(cell)})`);\n cells.values.forEach((value, v) => {\n const part = levelMismatch(partsAt(v, cell), children.map(child => partsAt(v, child)));\n if (part !== undefined) refuse(`its ${part} of '${value.field}'`);\n });\n };\n let units = 0;\n for (let cell = 0; cell < cells.rowOf.length; cell++) {\n if (cells.isRest(cell)) continue;\n const row = elementAt(cells.rowOf, cell);\n const column = elementAt(cells.columnOf, cell);\n const sets: [string, number[]][] = [];\n if (expandsBelow(row, cells.rowFields, rowExpanded)) {\n sets.push(['row', [...row.children.flatMap(child => {\n const at = cells.cellAt(child, column);\n return at === undefined ? [] : [at];\n }), ...restsAt(windowOf.get(row), column)]]);\n }\n if (expandsBelow(column, cells.columnFields, columnExpanded)) {\n sets.push(['column', column.children.flatMap(child => {\n const at = cells.cellAt(row, child);\n return at === undefined ? [] : [at];\n })]);\n }\n for (const [axis, children] of sets) {\n check(cell, axis, children);\n units += children.length * (1 + cells.values.length);\n }\n if (++units >= pieceUnits) {\n units = 0;\n yield;\n }\n }\n // A Rest Cell is a row of its own across the columns: its column groups below compose to it as any row's do.\n for (const window of cells.windows) {\n for (const byColumn of window.rests.values()) {\n for (const [column, cell] of byColumn) {\n if (!expandsBelow(column, cells.columnFields, columnExpanded)) continue;\n check(cell, 'column', column.children.flatMap(child => {\n const at = byColumn.get(child);\n return at === undefined ? [] : [at];\n }));\n units += column.children.length * (1 + cells.values.length);\n if (units >= pieceUnits) {\n units = 0;\n yield;\n }\n }\n }\n marginsCheck(cells, window);\n }\n}\n\n// A window's Rest Cells at a column node, before and after.\nfunction restsAt(window: LevelWindow | undefined, column: AxisNode): number[] {\n if (window === undefined) return [];\n return (['before', 'after'] as const).flatMap(side => {\n const rest = window.rests.get(side)?.get(column);\n return rest === undefined ? [] : [rest];\n });\n}\n\n// Each margin of a Sibling Window sorts strictly beyond its edge, by the value its set is ordered by at the grand\n// total of the columns: a margin tied with the sibling next to it would leave a tie straddling the edge, and the\n// siblings answered as the window would not be those the order puts there (ADR-0370 section 3).\nfunction marginsCheck(cells: LevelCells, window: LevelWindow): void {\n const depth = window.parent.level + 1;\n const order = elementAt(cells.levels.rows, depth).order;\n if (order === undefined) throw new Error('Internal: a window is of a set ordered by a value, as the answer was checked.');\n const columns = elementAt(cells.values, order.value).columns;\n const keyOf = (cell: number): number | undefined => {\n const value = columns.read(cell, order.aggregation);\n return value.kind === 'number' ? value.number : undefined;\n };\n // Numbers in the order's direction, and every value that is not one after them, tied with one another.\n const compare = (x: number | undefined, y: number | undefined): number => {\n if (x === undefined || y === undefined) return x === undefined ? (y === undefined ? 0 : 1) : -1;\n const compared = x < y ? -1 : x > y ? 1 : 0;\n return order.descending ? -compared : compared;\n };\n const siblings = window.parent.children.flatMap(child => {\n const at = cells.cellAt(child, cells.columnRoot);\n return at === undefined ? [] : [{ cell: at, key: keyOf(at) }];\n }).toSorted((a, b) => compare(a.key, b.key));\n const parent = defined(cells.cellAt(window.parent, cells.columnRoot), \"a window's parent's cell, as the answer was checked\");\n const refuse = (side: string, margin: number, edge: number): never => {\n throw new Error(`The server's window under ${cells.describe(parent)} is not where its order puts it: `\n + `the margin ${side} it, ${cells.describe(margin)}, does not sort strictly ${side} ${cells.describe(edge)} (ADR-0370 section 3).`);\n };\n const first = elementAt(siblings, 0);\n const last = elementAt(siblings, siblings.length - 1);\n if (window.before > 0) {\n const edge = elementAt(siblings, 1);\n if (compare(first.key, edge.key) >= 0) refuse('before', first.cell, edge.cell);\n }\n if (window.after > 0) {\n const edge = elementAt(siblings, siblings.length - 2);\n if (compare(last.key, edge.key) <= 0) refuse('after', last.cell, edge.cell);\n }\n}\n", "// The cube a report is laid out from (ADR-0060/0066): the answer's leaves as the first cells, each axis's\n// tree of Items, and every total merged from the leaves beneath it \u2014 never a total of totals. The C#\n// engine's PivotCube, AxisNode and ItemRef. The order totals are merged in is C#'s, leaf by leaf, each\n// leaf into its row's ancestors and its column's, so a double total agrees with C#'s to the last bit.\n\nimport { PartColumns, emptyValue, type AggregateValue } from '../aggregates/parts';\nimport { fromPublicKey, itemValueOf, type ItemKey, type PivotItemKey } from '../items/item-key';\nimport type { FieldMeta, PivotOrderKeyValue } from '../fields/pivot-field';\nimport { sameKeys, hidingFilters, levelQueryForLayout, levelsOfLayout, placedFields, sameLevels, type PivotQuery, type PivotQueryField } from './query';\nimport { answerColumns, type PivotAnswer, type PivotAnswerAxis, type PivotRestSide } from './answer';\nimport type { PivotLayout, PivotFieldPlacement } from '../layout/pivot-layout';\nimport { pivotAggregations, type PivotAggregation } from '../layout/pivot-enums';\nimport { defined, elementAt } from '../must';\nimport { inPieces, runWhole } from '../source/slicing';\nimport { describe, levelExpander } from '../levels/level-shown';\nimport { expandsBelow, levelSumsSteps } from '../levels/level-sums';\n\n/** An Item as the report reads it: its key, the value an Order Key and a format read, and its public key. */\nexport class ItemRef {\n readonly key: ItemKey;\n readonly publicKey: PivotItemKey;\n /** The text of a text Item, the number of a number, the ticks of a date, the Boolean of a Boolean;\n * `undefined` for a Blank and for #NUM!. */\n readonly firstValue: string | number | bigint | boolean | undefined;\n #orderKey: PivotOrderKeyValue | undefined;\n #hasOrderKey = false;\n\n constructor(key: ItemKey, publicKey: PivotItemKey) {\n this.key = key;\n this.publicKey = publicKey;\n this.firstValue = itemValueOf(key);\n }\n\n /** The Item a public key names. */\n static of(publicKey: PivotItemKey): ItemRef {\n return new ItemRef(fromPublicKey(publicKey), publicKey);\n }\n\n /** Whether the Order Key was asked for this Item. */\n get hasOrderKey(): boolean {\n return this.#hasOrderKey;\n }\n\n /** The Order Key's answer for this Item, `undefined` for none. */\n get orderKey(): PivotOrderKeyValue | undefined {\n return this.#orderKey;\n }\n\n /** Keeps the Order Key's answer, asked once. */\n setOrderKey(key: PivotOrderKeyValue | undefined): void {\n this.#orderKey = key;\n this.#hasOrderKey = true;\n }\n}\n\n/** A node of an axis's tree: the root, or an Item under its parent's. */\nexport class AxisNode {\n readonly id: number;\n /** \u22121 for the root. */\n readonly level: number;\n readonly parent: AxisNode | undefined;\n readonly item: ItemRef | undefined;\n readonly children: AxisNode[] = [];\n readonly #childIndex = new Map<number, AxisNode>();\n\n constructor(id: number, level: number, parent: AxisNode | undefined, item: ItemRef | undefined) {\n this.id = id;\n this.level = level;\n this.parent = parent;\n this.item = item;\n }\n\n /** The child of the Item at `index` among the next level's Items, where it has been made. */\n childAt(index: number): AxisNode | undefined {\n return this.#childIndex.get(index);\n }\n\n /** The child of the Item at `index` among the next level's Items, made on first asking. */\n child(index: number, item: ItemRef, nodes: AxisNode[]): AxisNode {\n let child = this.#childIndex.get(index);\n if (child === undefined) {\n child = new AxisNode(nodes.length, this.level + 1, this, item);\n nodes.push(child);\n this.children.push(child);\n this.#childIndex.set(index, child);\n }\n return child;\n }\n}\n\nconst nodeLimit = 67108864;\n\n/** A cell by its row's and its column's node ids, each below 2^26, so the key is a safe integer: a cube of\n * more nodes than that holds more cells than a Map can. */\nexport function cellKey(row: number, column: number): number {\n if (row >= nodeLimit || column >= nodeLimit) throw new RangeError(`A cube holds at most ${nodeLimit} nodes an axis.`);\n return row * nodeLimit + column;\n}\n\n/** One axis of a cube as a report reads it: its root, and each node's children and present form. A cube built\n * from an answer holds its tree as it was made; a computation's later versions hold it under an overlay of the\n * nodes and child lists their updates wrote (ADR-0153). Not part of the public surface. */\nexport interface CubeAxis {\n readonly root: AxisNode;\n /** The node of an id. */\n node(id: number): AxisNode;\n /** The node as this version holds it: an Item relabelled since the node was made carries its new spelling. */\n nodeOf(node: AxisNode): AxisNode;\n /** A node's children as this version holds them, in the order they were made. */\n childrenOf(node: AxisNode): readonly AxisNode[];\n}\n\n/** A cube's cells, by the ids of their row's and their column's nodes. Not part of the public surface. */\nexport interface CubeCells {\n /** An Aggregation's answer at a cell, Empty where the cube holds none. */\n read(row: number, column: number, source: number, aggregation: PivotAggregation): AggregateValue;\n}\n\n/** What the report reads of a cube: not part of the public surface. */\nexport interface CubeParts {\n readonly meta: ReadonlyMap<string, FieldMeta>;\n readonly rows: CubeAxis;\n readonly columns: CubeAxis;\n /** Each field in Values, by the answer's order. */\n readonly sources: readonly string[];\n /** Every Item of a field over all the data, where the cube was made from records it can read again. */\n readonly allItems: ((field: string) => readonly ItemKey[]) | undefined;\n readonly cells: CubeCells;\n /** The Sibling Windows a level answer holds, by their parent's row node id (ADR-0370 section 3). */\n readonly windows: ReadonlyMap<number, CubeWindow>;\n}\n\n/** A Sibling Window as the report lays it out: how many siblings come before the first shown and after the last,\n * each a Pending Row's worth, its margin among them. Its parent's children in the cube are the siblings shown and\n * the margins, which sort strictly beyond them. */\nexport interface CubeWindow {\n readonly before: number;\n readonly after: number;\n}\n\n/** What a cube's build made, for a computation that keeps the cube up to date (ADR-0153): each tree's nodes by\n * id, the nodes each of the answer's leaves stands at, in the answer's order, and the cells \u2014 the leaves first,\n * as the answer has them, then the totals. Nothing writes any of it once the cube is made. */\nexport interface CubeBuild {\n readonly rowNodes: readonly AxisNode[];\n readonly columnNodes: readonly AxisNode[];\n readonly rowLeaves: readonly AxisNode[];\n readonly columnLeaves: readonly AxisNode[];\n readonly cells: ReadonlyMap<number, number>;\n readonly values: readonly PartColumns[];\n}\n\n// An axis as its build made it.\nclass BuiltAxis implements CubeAxis {\n readonly root: AxisNode;\n readonly #nodes: readonly AxisNode[];\n\n constructor(nodes: readonly AxisNode[]) {\n this.root = elementAt(nodes, 0);\n this.#nodes = nodes;\n }\n\n node(id: number): AxisNode {\n return elementAt(this.#nodes, id);\n }\n\n nodeOf(node: AxisNode): AxisNode {\n return node;\n }\n\n childrenOf(node: AxisNode): readonly AxisNode[] {\n return node.children;\n }\n}\n\n// The cells as the build made them.\nclass BuiltCells implements CubeCells {\n readonly #cells: ReadonlyMap<number, number>;\n readonly #values: readonly PartColumns[];\n\n constructor(cells: ReadonlyMap<number, number>, values: readonly PartColumns[]) {\n this.#cells = cells;\n this.#values = values;\n }\n\n read(row: number, column: number, source: number, aggregation: PivotAggregation): AggregateValue {\n const cell = this.#cells.get(cellKey(row, column));\n return cell === undefined ? emptyValue : elementAt(this.#values, source).read(cell, aggregation);\n }\n}\n\n/** An Aggregation's answer at a row and a column of a cube. */\nexport function readCell(parts: CubeParts, row: AxisNode, column: AxisNode, source: number, aggregation: PivotAggregation): AggregateValue {\n return parts.cells.read(row.id, column.id, source, aggregation);\n}\n\nlet partsOfCube: (cube: PivotCube) => CubeParts;\nlet makeCube: (query: PivotQuery, sourceVersion: string, included: number, parts: CubeParts, values: readonly PartColumns[], levels: boolean) => PivotCube;\nlet withCells: (cube: PivotCube, sourceVersion: string, included: number, rows: CubeAxis, columns: CubeAxis, cells: CubeCells) => PivotCube;\nlet fieldsHeld: (cube: PivotCube, layout: PivotLayout) => boolean;\nlet windowsHeld: (cube: PivotCube, layout: PivotLayout) => boolean;\n\n/** The cube a report is laid out from (ADR-0060/0066): the answer's leaves, each axis's tree of Items, and\n * every total merged from the leaves beneath it. Made by {@link pivotCube} or {@link aggregatePivot}. */\nexport class PivotCube {\n /** The question the cube answers. */\n readonly query: PivotQuery;\n /** The Source Version its answer was computed at. */\n readonly sourceVersion: string;\n /** How many records its leaves hold: those no Hidden Item left out. */\n readonly includedRecordCount: number;\n /** Whether it was made from Level Aggregates (ADR-0370 section 3): it holds the groups the question's levels\n * show and no others, so a layout that shows others is asked again. */\n readonly isLevels: boolean;\n readonly #parts: CubeParts;\n readonly #values: readonly PartColumns[];\n\n private constructor(query: PivotQuery, sourceVersion: string, included: number, parts: CubeParts, values: readonly PartColumns[], levels: boolean) {\n this.query = query;\n this.sourceVersion = sourceVersion;\n this.includedRecordCount = included;\n this.isLevels = levels;\n this.#parts = parts;\n this.#values = values;\n Object.freeze(this);\n }\n\n static {\n partsOfCube = cube => cube.#parts;\n fieldsHeld = (cube, layout) => cube.#holdsFields(layout);\n windowsHeld = (cube, layout) => cube.#holdsWindows(layout);\n makeCube = (query, sourceVersion, included, parts, values, levels) => new PivotCube(query, sourceVersion, included, parts, values, levels);\n withCells = (cube, sourceVersion, included, rows, columns, cells) =>\n new PivotCube(cube.query, sourceVersion, included, Object.freeze({ ...cube.#parts, rows, columns, cells }), cube.#values, cube.isLevels);\n }\n\n /** Whether the cube was aggregated under the layout's placed fields, Hidden Items and Value Fields, with\n * the parts each of its Aggregations reads; one made from Level Aggregates, also under the groups the layout\n * shows, and one that answered Sibling Windows, also under the orders and collapse the layout asks them by. */\n holds(layout: PivotLayout): boolean {\n return this.#holdsFields(layout) && this.#showsGroups(layout) && this.#holdsWindows(layout);\n }\n\n // Whether the Sibling Windows answered are where the layout would ask for them (ADR-0370 section 3): a window\n // is cut by its set's order and laid out under the collapse it was asked with, so a layout that orders or\n // collapses otherwise asks again.\n #holdsWindows(layout: PivotLayout): boolean {\n const window = this.query.levels?.window;\n if (window === undefined || this.#parts.windows.size === 0) return true;\n return sameLevels(levelQueryForLayout(layout, this.query.maxLeaves, window).levels, this.query.levels);\n }\n\n // The fields, Hidden Items and parts the layout lays out.\n #holdsFields(layout: PivotLayout): boolean {\n if (!sameFields(layout.rows, this.query.rows, true)\n || !sameFields(layout.columns, this.query.columns, true)\n || !sameFields(hidingFilters(layout.filters), this.query.filters.filter(f => f.hiddenItems.length > 0), false)) {\n return false;\n }\n for (const value of layout.values) {\n const source = this.#parts.sources.indexOf(value.field);\n if (source < 0 || !pivotAggregations.includes(value.aggregation) || !elementAt(this.#values, source).answers(value.aggregation)) return false;\n }\n return true;\n }\n\n // Whether every group the layout shows is one the cube holds: always, for a cube of leaves; for one of Level\n // Aggregates, where every group the layout expands, reached through groups it expands, the question expanded\n // too. A group the question expanded and the layout collapses is laid out from its own cell.\n #showsGroups(layout: PivotLayout): boolean {\n const asked = this.query.levels;\n if (!this.isLevels || asked === undefined) return true;\n const shown = levelsOfLayout(layout);\n const axes = [\n [this.#parts.rows, levelExpander(shown.rows), levelExpander(asked.rows), layout.rows.length],\n [this.#parts.columns, levelExpander(shown.columns), levelExpander(asked.columns), layout.columns.length],\n ] as const;\n return axes.every(([axis, shows, held, fields]) => {\n const pending = [axis.root];\n for (let node = pending.pop(); node !== undefined; node = pending.pop()) {\n if (!expandsBelow(node, fields, shows)) continue;\n if (!expandsBelow(node, fields, held)) return false;\n pending.push(...axis.childrenOf(node));\n }\n return true;\n });\n }\n}\n\n/** Whether the cube holds the layout's fields, Hidden Items and parts, whichever groups it shows. */\nexport function cubeHoldsFields(cube: PivotCube, layout: PivotLayout): boolean {\n return fieldsHeld(cube, layout);\n}\n\n/** Whether the cube's Sibling Windows are where the layout would ask for them; not part of the public surface. */\nexport function cubeHoldsWindows(cube: PivotCube, layout: PivotLayout): boolean {\n return windowsHeld(cube, layout);\n}\n\n/** The parts of a cube the report reads. */\nexport function cubeParts(cube: PivotCube): CubeParts {\n return partsOfCube(cube);\n}\n\n/** The cube a computation's update made of `cube` (ADR-0153): the same question, fields and Values, at another\n * Source Version, with the trees and cells the update holds. */\nexport function cubeWith(cube: PivotCube, sourceVersion: string, included: number, rows: CubeAxis, columns: CubeAxis, cells: CubeCells): PivotCube {\n return withCells(cube, sourceVersion, included, rows, columns, cells);\n}\n\n/** The cube of an answer to a question (ADR-0066): an answer to another question is refused by name, and so\n * is a field no declared Pivot Field names, or two leaves for one cell. */\nexport function buildCube(query: PivotQuery, answer: PivotAnswer, meta: ReadonlyMap<string, FieldMeta>,\n allItems?: (field: string) => readonly ItemKey[]): PivotCube {\n return runWhole(buildCubeSteps(query, answer, meta, allItems));\n}\n\n/** {@link buildCube}, a step at a time (PV-40): the trees, the leaves' cells, every total merged and every exact\n * value written in one form, each over its leaves or cells a piece at a time, yielding after each piece for a\n * caller to slice. The answer is only read. `made` is handed what the build made, for a computation that keeps\n * the cube up to date (ADR-0153). */\nexport function* buildCubeSteps(query: PivotQuery, answer: PivotAnswer, meta: ReadonlyMap<string, FieldMeta>,\n allItems?: (field: string) => readonly ItemKey[], made?: (build: CubeBuild) => void): Generator<void, PivotCube> {\n const mismatch = answer.mismatch(query);\n if (mismatch !== undefined) throw new Error(`The answer does not answer the question: ${mismatch} (ADR-0066).`);\n for (const field of [...placedFields(query).map(f => f.field), ...query.values.map(v => v.field)]) {\n if (!meta.has(field)) throw new Error(`The question names '${field}', and no Pivot Field of that name is declared (ADR-0060).`);\n }\n const leafCount = answer.leafCount;\n const rowTree = yield* tree(answer.rows, leafCount);\n const columnTree = yield* tree(answer.columns, leafCount);\n const rowLeaves = rowTree.leaves;\n const columnLeaves = columnTree.leaves;\n\n const sources = answer.values.map(v => v.field);\n const values: PartColumns[] = [];\n for (const answered of answer.values) {\n const held = answerColumns(answered);\n const columns = new PartColumns(held.parts);\n // A level answer's double sums carry their magnitudes, which its check reads.\n if (held.absolutes !== undefined) columns.trackAbsolutes();\n yield* inPieces(leafCount, 1, (from, to) => {\n for (let leaf = from; leaf < to; leaf++) columns.copyCell(held, leaf);\n });\n values.push(columns);\n }\n\n // The leaves are the first cells, as the source answered them; a level answer's cells are all of them but\n // its Rest Cells, which stand beside their parents' children and are no group of their own.\n const cells = new Map<number, number>();\n const rests = answer.isLevels ? answer.windows.map(() => new Map<PivotRestSide, Map<AxisNode, number>>()) : [];\n let included = 0;\n yield* inPieces(leafCount, 2, (from, to) => {\n for (let leaf = from; leaf < to; leaf++) {\n const rest = answer.isLevels ? answer.restAt(leaf) : undefined;\n if (rest !== undefined) {\n const sides = elementAt(rests, rest.window);\n let side = sides.get(rest.side);\n if (side === undefined) {\n side = new Map();\n sides.set(rest.side, side);\n }\n side.set(elementAt(columnLeaves, leaf), leaf);\n continue;\n }\n const key = cellKey(elementAt(rowLeaves, leaf).id, elementAt(columnLeaves, leaf).id);\n if (cells.has(key)) {\n throw new Error(`The answer has two leaves for one cell (leaf ${leaf}); a source answers each combination of Items once (ADR-0066).`);\n }\n cells.set(key, leaf);\n if (!answer.isLevels) included += answer.recordsAt(leaf);\n }\n });\n\n const levels = query.levels;\n const windows = new Map<number, CubeWindow>();\n if (answer.isLevels) {\n if (levels === undefined) throw new Error('Internal: a level answer is laid out only for a question with levels.');\n // Level Aggregates (ADR-0370 section 3): every total is the server's, and is checked against the groups\n // below it rather than merged from them; the grand total, at both roots (id 0), holds every record included.\n const total = cells.get(cellKey(0, 0));\n if (total !== undefined) included = answer.recordsAt(total);\n const checked = answer.windows.map((window, w) => ({\n parent: window.parent.reduce<AxisNode>((node, item) => defined(node.childAt(item), \"a window's parent, as the answer was checked\"), elementAt(rowTree.nodes, 0)),\n before: window.before,\n after: window.after,\n rests: elementAt(rests, w),\n }));\n yield* levelSumsSteps({\n levels,\n rowFields: answer.rows.length,\n columnFields: answer.columns.length,\n rowOf: rowLeaves,\n columnOf: columnLeaves,\n cellAt: (row, column) => cells.get(cellKey(row.id, column.id)),\n records: cell => answer.recordsAt(cell),\n values: values.map((columns, v) => ({ field: elementAt(sources, v), columns })),\n describe: cell => describe(answer, cell),\n columnRoot: elementAt(columnTree.nodes, 0),\n windows: checked,\n isRest: cell => answer.restAt(cell) !== undefined,\n });\n for (const window of checked) windows.set(window.parent.id, Object.freeze({ before: window.before, after: window.after }));\n } else if (values.length > 0) {\n // Every total from its leaves (ADR-0060): each leaf is merged into every cell whose row and column\n // are its own or their ancestors. An ancestor's cell is never a leaf's, so nothing is counted twice.\n // What one leaf costs: a cell looked up, and every field merged into it, for each pair of its row and\n // column or their ancestors.\n const weight = (answer.rows.length + 1) * (answer.columns.length + 1) * (1 + values.length);\n yield* inPieces(leafCount, weight, (from, to) => {\n for (let leaf = from; leaf < to; leaf++) {\n const rowLeaf = elementAt(rowLeaves, leaf);\n const columnLeaf = elementAt(columnLeaves, leaf);\n for (let row: AxisNode | undefined = rowLeaf; row !== undefined; row = row.parent) {\n for (let column: AxisNode | undefined = columnLeaf; column !== undefined; column = column.parent) {\n if (row === rowLeaf && column === columnLeaf) continue;\n const key = cellKey(row.id, column.id);\n let cell = cells.get(key);\n if (cell === undefined) {\n cell = elementAt(values, 0).count;\n cells.set(key, cell);\n for (const columns of values) columns.addCell();\n }\n for (const columns of values) columns.merge(cell, columns, leaf);\n }\n }\n }\n });\n }\n\n // One form for each exact value (ADR-0064): decimal addition keeps the larger scale.\n for (const columns of values) yield* inPieces(columns.count, 1, (from, to) => columns.canonicalize(from, to));\n const parts: CubeParts = Object.freeze({\n meta, sources, allItems,\n rows: new BuiltAxis(rowTree.nodes),\n columns: new BuiltAxis(columnTree.nodes),\n cells: new BuiltCells(cells, values),\n windows,\n });\n made?.(Object.freeze({ rowNodes: rowTree.nodes, columnNodes: columnTree.nodes, rowLeaves, columnLeaves, cells, values }));\n return makeCube(query, answer.sourceVersion, included, parts, values, answer.isLevels);\n}\n\nfunction sameFields(placements: readonly PivotFieldPlacement[], held: readonly PivotQueryField[], ordered: boolean): boolean {\n if (placements.length !== held.length) return false;\n return placements.every((mine, i) => {\n const theirs = ordered ? held[i] : held.find(f => f.field === mine.field);\n return theirs !== undefined && theirs.field === mine.field && sameKeys(mine.hiddenItems, theirs.hiddenItems);\n });\n}\n\n// One axis's tree from the leaves' Items, level by level, a piece of leaves at a time: its nodes by id, and the\n// node each leaf ends at. A level answer's cell ends at the group it names, above the first level it names none\n// of.\nfunction* tree(axes: readonly PivotAnswerAxis[], leafCount: number): Generator<void, { readonly nodes: AxisNode[]; readonly leaves: AxisNode[] }> {\n const root = new AxisNode(0, -1, undefined, undefined);\n const nodes: AxisNode[] = [root];\n const refs: ItemRef[][] = [];\n for (const axis of axes) {\n const level: ItemRef[] = [];\n yield* inPieces(axis.items.length, 1, (from, to) => {\n for (let item = from; item < to; item++) level.push(ItemRef.of(elementAt(axis.items, item)));\n });\n refs.push(level);\n }\n const leaves: AxisNode[] = [];\n yield* inPieces(leafCount, Math.max(1, axes.length), (from, to) => {\n for (let leaf = from; leaf < to; leaf++) {\n let node = root;\n for (let level = 0; level < axes.length; level++) {\n const item = elementAt(axes, level).itemAt(leaf);\n if (item < 0) break;\n node = node.child(item, elementAt(elementAt(refs, level), item), nodes);\n }\n leaves.push(node);\n }\n });\n return { nodes, leaves };\n}\n", "// A value cell as the report shows it (ADR-0060): an error value's text, General as Excel's PivotTable shows\n// it \u2014 at most eleven characters \u2014 or the Value Field's number format, a Show Values As percentage in\n// `0.00%` when it has none. An exact value is written from its own digits, never from a double. The C#\n// engine's PivotValue.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport type { AggregateValue } from '../aggregates/parts';\nimport type { Culture } from '../culture/culture-data';\nimport { generalOfDecimal, generalOfDouble } from '../text/general';\nimport { formatDecimal, formatDouble } from '../text/number-text';\n\n/** A value cell of a report: its text, its number, and its exact decimal where it was computed in one. */\nexport interface PivotValue {\n /** The text the cell shows. */\n readonly text: string;\n /** The number, as a double: the exact one converted where there is one; 0 for an error. */\n readonly number: number;\n /** The exact decimal, where the Aggregation was computed in one. */\n readonly exact?: SnapshotDecimal;\n /** The error value's text, `#DIV/0!` or `#NUM!`, when the cell is one. */\n readonly error?: string;\n}\n\n/** The shown value of an Aggregation's answer, which is not empty. */\nexport function pivotValueOf(value: Exclude<AggregateValue, { readonly kind: 'empty' }>, numberFormat: string | undefined,\n percent: boolean, culture: Culture): PivotValue {\n if (value.kind === 'error') return Object.freeze({ text: value.error, number: 0, error: value.error });\n const numbers = culture.data.number;\n let text: string;\n if (numberFormat === undefined && !percent) {\n text = value.exact === undefined ? generalOfDouble(value.number, numbers) : generalOfDecimal(value.exact, numbers);\n } else {\n const format = numberFormat ?? '0.00%'; // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0060: a percentage with no format of its own is shown in 0.00%\n text = value.exact === undefined ? formatDouble(value.number, format, numbers) : formatDecimal(value.exact, format, numbers);\n }\n return Object.freeze(value.exact === undefined ? { text, number: value.number } : { text, number: value.number, exact: value.exact });\n}\n", "// The report laid out from a cube (ADR-0059/0060): its label columns, its value columns and the Header Group\n// spans over them, and its rows \u2014 group rows, Item rows, subtotals and the grand total \u2014 in the Compact,\n// Outline or Tabular form, each Item in its field's order; and the value at each row and column, as the\n// Value Field shows it. The C# engine's ReportBuilder, CellReader, ValueCaptions, PivotReport and PivotRowKey.\n\nimport type { AggregateValue } from '../aggregates/parts';\nimport { divideByZeroValue, doubleValue, numberErrorValue } from '../aggregates/parts';\nimport type { PivotCube } from '../cube/cube';\nimport { cubeParts, readCell, type AxisNode, type CubeAxis, type CubeWindow, type ItemRef } from '../cube/cube';\nimport { everyRecord, pivotDetailsQuery, placedFields, type PivotDetailsQuery, type PivotFieldItem } from '../cube/query';\nimport type { FieldMeta } from '../fields/pivot-field';\nimport { fromPublicKey, itemKeysEqual, itemKeyText, keyIdOf, publicKeyId, sameItem, type PivotItemKey } from '../items/item-key';\nimport type { PivotAggregation, PivotColumnRole, PivotRowRole, PivotShowValuesAs } from '../layout/pivot-enums';\nimport { itemKindOrder } from '../layout/pivot-enums';\nimport type { PivotFieldPlacement, PivotLayout, PivotValueField } from '../layout/pivot-layout';\nimport { defined, elementAt } from '../must';\nimport { Slicer, checkedSlicing, inPieces, pieceUnits, runWhole, sortedSteps, type PivotSlicing } from '../source/slicing';\nimport { escapeDataString, foldedText, upperInvariant } from '../text/casing';\nimport { captionId, fillWord, pivotWordIds } from '../words/pivot-words';\nimport { ItemLabels, ItemOrder, type ResolvedOptions } from './labels';\nimport { pivotValueOf, type PivotValue } from './value';\n\n// ---- Value Field captions -----------------------------------------------------------------------\n\n/**\n * Each Value Field's caption (ADR-0060): a caption of its own, which must be non-empty, unique ignoring case\n * and no Pivot Field's caption; or the default, `Sum of Amount` in the report's words, numbered 2, 3 \u2026 to stay\n * unique.\n */\nexport function valueCaptions(values: readonly PivotValueField[], fields: ReadonlyMap<string, FieldMeta>, options: ResolvedOptions): readonly string[] {\n const captions: (string | undefined)[] = values.map(() => undefined);\n const taken = new Set<string>();\n const fieldCaptions = new Set([...fields.values()].map(meta => foldedText(meta.field.caption)));\n values.forEach((value, i) => {\n const own = value.caption;\n if (own === undefined) return;\n if (own.length === 0) throw new Error(`The Value Field of '${value.field}' has an empty caption (ADR-0060).`);\n const folded = foldedText(own);\n if (taken.has(folded)) throw new Error(`Two Value Fields are captioned '${own}' (ADR-0060).`);\n taken.add(folded);\n if (fieldCaptions.has(folded)) {\n throw new Error(`The Value Field of '${value.field}' is captioned '${own}', which is a Pivot Field's caption (ADR-0060).`);\n }\n captions[i] = own;\n });\n values.forEach((value, i) => {\n if (captions[i] !== undefined) return;\n const meta = fields.get(value.field);\n const fieldCaption = meta === undefined ? value.field : meta.field.caption;\n const basis = fillWord(options.word(captionId(value.aggregation)), fieldCaption);\n let caption = basis;\n for (let n = 2; taken.has(foldedText(caption)) || fieldCaptions.has(foldedText(caption)); n++) caption = basis + String(n);\n taken.add(foldedText(caption));\n captions[i] = caption;\n });\n return Object.freeze(captions.map(caption => {\n if (caption === undefined) throw new Error('Internal: a Value Field was left without a caption.');\n return caption;\n }));\n}\n\n// ---- Cells --------------------------------------------------------------------------------------\n\ninterface ValueFieldPlan {\n readonly source: number;\n readonly aggregation: PivotAggregation;\n readonly caption: string;\n readonly showValuesAs: PivotShowValuesAs;\n readonly numberFormat: string | undefined;\n}\n\n/** Reads a Value Field at a row and a column, and shows it as its Show Values As says. */\nclass CellReader {\n readonly #cube: PivotCube;\n readonly values: readonly ValueFieldPlan[];\n\n constructor(cube: PivotCube, values: readonly ValueFieldPlan[]) {\n this.#cube = cube;\n this.values = values;\n }\n\n read(row: AxisNode, column: AxisNode, vf: number): AggregateValue {\n const plan = elementAt(this.values, vf);\n return readCell(cubeParts(this.#cube), row, column, plan.source, plan.aggregation);\n }\n\n shown(row: AxisNode, column: AxisNode, vf: number): AggregateValue {\n const value = this.read(row, column, vf);\n const plan = elementAt(this.values, vf);\n if (plan.showValuesAs === 'noCalculation' || value.kind !== 'number') return value;\n let divisor: AggregateValue;\n switch (plan.showValuesAs) {\n case 'percentOfGrandTotal': divisor = this.read(cubeParts(this.#cube).rows.root, cubeParts(this.#cube).columns.root, vf); break;\n case 'percentOfColumnTotal': divisor = this.read(cubeParts(this.#cube).rows.root, column, vf); break;\n case 'percentOfRowTotal': divisor = this.read(row, cubeParts(this.#cube).columns.root, vf); break;\n }\n if (divisor.kind !== 'number' || divisor.number === 0) return divideByZeroValue;\n const shown = value.number / divisor.number;\n return Number.isFinite(shown) ? doubleValue(shown) : numberErrorValue;\n }\n}\n\n// ---- What a report is made of -------------------------------------------------------------------\n\n/** The button beside an outer row Item, which collapses or expands it. */\nexport interface PivotToggle {\n /** The row field whose Item it is. */\n readonly field: string;\n /** The Item it collapses or expands. */\n readonly item: PivotItemKey;\n /** The Item's label, for the button's accessible name. */\n readonly itemLabel: string;\n /** Whether the Item is collapsed now. */\n readonly isCollapsed: boolean;\n}\n\n/** A row's label in one label column: its text, its indent in levels, and its button. */\nexport interface PivotRowLabel {\n /** The text, or `undefined` for an empty label cell. */\n readonly text: string | undefined;\n /** The indent, in levels. */\n readonly indent: number;\n /** The collapse button, beside an outer Item that has Items under it. */\n readonly toggle?: PivotToggle;\n /** The number a number Item's label shows, in full, which its copy carries. */\n readonly number?: number;\n}\n\n/** Whether two labels are alike as C#'s records compare them: text, indent, number and toggle, the toggle's Item as\n * it is spelt. */\nexport function rowLabelsAlike(a: PivotRowLabel, b: PivotRowLabel): boolean {\n if (a.text !== b.text || a.indent !== b.indent || a.number !== b.number) return false;\n if (a.toggle === undefined || b.toggle === undefined) return a.toggle === b.toggle;\n return a.toggle.field === b.toggle.field && a.toggle.item.kind === b.toggle.item.kind && a.toggle.item.value === b.toggle.item.value\n && a.toggle.itemLabel === b.toggle.itemLabel && a.toggle.isCollapsed === b.toggle.isCollapsed;\n}\n\n/** A row's role, Value Field and Items written in one form, each Item as Items match: two keys that stand for one\n * row are one text, however their Items are spelt. */\nexport function rowIdOf(role: PivotRowRole, valueField: number, items: readonly PivotItemKey[]): string {\n return `${role}\\u0001${valueField}\\u0001${items.map(publicKeyId).join('\\u0001')}`;\n}\n\nconst noLabel: PivotRowLabel = Object.freeze({ text: undefined, indent: 0 });\n\nfunction rowLabel(text: string, indent = 0, toggle?: PivotToggle, number?: number): PivotRowLabel {\n const label: { -readonly [K in keyof PivotRowLabel]: PivotRowLabel[K] } = { text, indent };\n if (toggle !== undefined) label.toggle = toggle;\n if (number !== undefined) label.number = number;\n return Object.freeze(label);\n}\n\n/** A label column: `row-labels` in the Compact form, `row:<field>` a field in the others. */\nexport interface PivotLabelColumn {\n /** Its name, stable across reports, so a width survives. */\n readonly name: string;\n /** Its header's text. */\n readonly header: string;\n /** The row field it labels, or `undefined` for Compact's one column and for \u03A3 Values's. */\n readonly field: string | undefined;\n}\n\n/** A Header Group span: a label over `columnCount` value columns from `firstColumn`, at a tier of the\n * header, `tierSpan` tiers tall. */\nexport interface PivotHeaderSpan {\n /** The text over the span. */\n readonly label: string;\n /** The first value column under it. */\n readonly firstColumn: number;\n /** How many value columns it spans. */\n readonly columnCount: number;\n /** Its tier, from 0 at the top. */\n readonly tier: number;\n /** How many tiers tall it is. */\n readonly tierSpan: number;\n}\n\nlet makeColumn: (name: string, header: string, role: PivotColumnRole, valueField: number, node: AxisNode, headerNumber?: number) => PivotReportColumn;\nlet columnNode: (column: PivotReportColumn) => AxisNode;\n\n/** A value column of a report. */\nexport class PivotReportColumn {\n /** Its role, its Items and its Value Field's caption: stable across reports, so a width survives. */\n readonly name: string;\n /** Its leaf header's text. */\n readonly header: string;\n /** An Item's column, a subtotal's, or the grand total's. */\n readonly role: PivotColumnRole;\n /** The Value Field it shows, or \u22121 when its rows say. */\n readonly valueField: number;\n /** The number a number column Item's leaf header shows, in full, for its copy. */\n readonly headerNumber: number | undefined;\n readonly #node: AxisNode;\n\n private constructor(name: string, header: string, role: PivotColumnRole, valueField: number, node: AxisNode, headerNumber?: number) {\n this.name = name;\n this.header = header;\n this.role = role;\n this.valueField = valueField;\n this.#node = node;\n this.headerNumber = headerNumber;\n Object.freeze(this);\n }\n\n static {\n makeColumn = (name, header, role, valueField, node, headerNumber) => new PivotReportColumn(name, header, role, valueField, node, headerNumber);\n columnNode = column => column.#node;\n }\n}\n\n/** What a row of a report stands for, across reports: its role, its Value Field and its Items. */\nexport class PivotRowKey {\n /** The row's role. */\n readonly role: PivotRowRole;\n /** The Value Field the row shows, or \u22121 when its columns say. */\n readonly valueField: number;\n /** The row's Items, outermost first. */\n readonly items: readonly PivotItemKey[];\n\n /** A key of a row's role, Value Field and Items. */\n constructor(role: PivotRowRole, valueField: number, items: readonly PivotItemKey[]) {\n this.role = role;\n this.valueField = valueField;\n this.items = Object.freeze([...items]);\n }\n\n /** Whether two keys stand for one row: the same role, Value Field and Items. */\n equals(other: PivotRowKey): boolean {\n return this === other\n || (this.role === other.role && this.valueField === other.valueField && this.items.length === other.items.length\n && this.items.every((item, i) => itemKeysEqual(item, elementAt(other.items, i))));\n }\n\n /** `item -1 [Text:East / Text:Apples]`, for messages and logs. */\n toString(): string {\n return `${this.role} ${this.valueField} [${this.items.map(itemKeyText).join(' / ')}]`;\n }\n}\n\nlet makeRow: (role: PivotRowRole, node: AxisNode, valueField: number, carriesValues: boolean, labels: readonly PivotRowLabel[], lineage: object,\n sibling?: number) => PivotReportRow;\nlet rowNode: (row: PivotReportRow) => AxisNode;\nlet rowSibling: (row: PivotReportRow) => number;\nlet lineageOf: (row: PivotReportRow) => object | undefined;\n\n/** A row of a report. */\nexport class PivotReportRow {\n /** A group row, an Item's, a subtotal's or the grand total's. */\n readonly role: PivotRowRole;\n /** The Value Field the row shows, or \u22121 when its columns say. */\n readonly valueField: number;\n /** Its label in each label column. */\n readonly labels: readonly PivotRowLabel[];\n /** Whether the row carries values: a group row whose subtotal stands at the bottom carries none. */\n readonly carriesValues: boolean;\n readonly #node: AxisNode;\n // A Pending Row's sibling, by its place among its parent's siblings from 0, its node being the parent; \u22121 for\n // any other row.\n readonly #sibling: number;\n // The reports that may read the row: the one that laid it out, and those updated from it. A field of the row,\n // not an entry in a map beside it, so that a million rows cost no table of a million entries to grow.\n readonly #lineage: object;\n #key: PivotRowKey | undefined;\n\n private constructor(role: PivotRowRole, node: AxisNode, valueField: number, carriesValues: boolean, labels: readonly PivotRowLabel[], lineage: object,\n sibling: number) {\n this.role = role;\n this.#node = node;\n this.#sibling = sibling;\n this.valueField = valueField;\n this.carriesValues = carriesValues;\n // Labels already frozen are shared, as the Pending Rows of a set share theirs.\n this.labels = Object.isFrozen(labels) ? labels : Object.freeze([...labels]);\n this.#lineage = lineage;\n }\n\n static {\n makeRow = (role, node, valueField, carriesValues, labels, lineage, sibling = -1) =>\n new PivotReportRow(role, node, valueField, carriesValues, labels, lineage, sibling);\n rowNode = row => row.#node;\n rowSibling = row => row.#sibling;\n // A row-like object a caller made, not one a report laid out, has none.\n lineageOf = row => #lineage in row ? row.#lineage : undefined;\n }\n\n /** What the row stands for, across reports. */\n get key(): PivotRowKey {\n if (this.#key === undefined) {\n const items: PivotItemKey[] = [];\n for (let at: AxisNode | undefined = this.#node; at?.item !== undefined; at = at.parent) items.unshift(at.item.publicKey);\n this.#key = new PivotRowKey(this.role, this.valueField, items);\n }\n return this.#key;\n }\n}\n\n// ---- The report ---------------------------------------------------------------------------------\n\nfunction sameRows(mine: PivotReport, other: PivotReport, from: number, to: number): boolean {\n for (let i = from; i < to; i++) {\n const row = elementAt(mine.rows, i);\n const theirs = elementAt(other.rows, i);\n if (row.role === 'pending' || theirs.role === 'pending') {\n // A Pending Row stands for the sibling at its place, which the same data puts at the same place\n // whichever window was answered (ADR-0370 section 3).\n const parent = siblingsParent(row);\n const theirParent = siblingsParent(theirs);\n if (mine.cube.sourceVersion !== other.cube.sourceVersion || parent === undefined || theirParent === undefined || !samePath(parent, theirParent)) return false;\n } else if (row.role !== theirs.role || row.valueField !== theirs.valueField || !samePath(rowNode(row), rowNode(theirs))) {\n return false;\n }\n }\n return true;\n}\n\n// The parent of the sibling a row stands for: a Pending Row's own node, any other row's node's parent, and none\n// for a row of the grand total, which stands for no sibling.\nfunction siblingsParent(row: PivotReportRow): AxisNode | undefined {\n const node = rowNode(row);\n return row.role === 'pending' ? node : node.parent;\n}\n\n/** Whether the other report's rows stand, one for one, for what this one's do, compared a piece at a time. */\nexport function* sameRowsSteps(mine: PivotReport, other: PivotReport | undefined): Generator<void, boolean> {\n if (other === undefined || other.rows.length !== mine.rows.length) return false;\n if (other === mine) return true;\n // A row is worth a unit for each level its path is compared at.\n const size = Math.max(1, Math.floor(pieceUnits / (mine.layout.rows.length + 1)));\n for (let from = 0; from < mine.rows.length; from += size) {\n if (from > 0) yield;\n if (!sameRows(mine, other, from, Math.min(mine.rows.length, from + size))) return false;\n }\n return true;\n}\n\nlet reportOptions: (report: PivotReport) => ResolvedOptions;\nlet reportLineage: (report: PivotReport) => object;\nlet reportRanks: (report: PivotReport) => ReadonlyMap<number, number>;\nlet makeReport: (cube: PivotCube, layout: PivotLayout, options: ResolvedOptions, reader: CellReader, labelColumns: readonly PivotLabelColumn[],\n valueColumns: readonly PivotReportColumn[], headerSpans: readonly PivotHeaderSpan[], headerTierCount: number,\n rows: readonly PivotReportRow[], lineage: object, ranks: ReadonlyMap<number, number>) => PivotReport;\n\n/** A report: its columns, its rows, and the value at each row and column. */\nexport class PivotReport {\n /** The layout it was laid out under. */\n readonly layout: PivotLayout;\n /** The label columns, left to right. */\n readonly labelColumns: readonly PivotLabelColumn[];\n /** The value columns, left to right. */\n readonly valueColumns: readonly PivotReportColumn[];\n /** The Header Group spans over the value columns. */\n readonly headerSpans: readonly PivotHeaderSpan[];\n /** How many tiers the column header has above the leaf headers. */\n readonly headerTierCount: number;\n /** The rows, top to bottom. */\n readonly rows: readonly PivotReportRow[];\n /** Each Value Field's caption. */\n readonly valueCaptions: readonly string[];\n /** The cube it was laid out from. */\n readonly cube: PivotCube;\n readonly #options: ResolvedOptions;\n readonly #reader: CellReader;\n readonly #lineage: object;\n readonly #ranks: ReadonlyMap<number, number>;\n\n private constructor(cube: PivotCube, layout: PivotLayout, options: ResolvedOptions, reader: CellReader, labelColumns: readonly PivotLabelColumn[],\n valueColumns: readonly PivotReportColumn[], headerSpans: readonly PivotHeaderSpan[], headerTierCount: number,\n rows: readonly PivotReportRow[], lineage: object, ranks: ReadonlyMap<number, number>) {\n this.cube = cube;\n this.layout = layout;\n this.#options = options;\n this.#reader = reader;\n this.labelColumns = Object.freeze([...labelColumns]);\n this.valueColumns = Object.freeze([...valueColumns]);\n this.headerSpans = Object.freeze([...headerSpans]);\n this.headerTierCount = headerTierCount;\n this.rows = Object.freeze([...rows]);\n this.#lineage = lineage;\n this.#ranks = ranks;\n this.valueCaptions = Object.freeze(reader.values.map(v => v.caption));\n }\n\n static {\n makeReport = (...args) => new PivotReport(...args);\n reportOptions = report => report.#options;\n reportLineage = report => report.#lineage;\n reportRanks = report => report.#ranks;\n }\n\n /** The locale the report is written in. */\n get locale(): string {\n return this.#options.culture.name;\n }\n\n /** Whether the layout places no field at all. */\n get isEmpty(): boolean {\n return this.layout.rows.length === 0 && this.layout.columns.length === 0 && this.layout.values.length === 0;\n }\n\n /** Whether the other report's rows stand, one for one, for what this one's do. */\n hasSameRowsAs(other: PivotReport | undefined): boolean {\n if (other === undefined || other.rows.length !== this.rows.length) return false;\n return other === this || sameRows(this, other, 0, this.rows.length);\n }\n\n /**\n * {@link PivotReport.hasSameRowsAs} in slices (ADR-0066, PV-40): the rows compared a piece at a time, yielding\n * between slices as `slicing` paces them \u2014 a refresh of a large report compares every row. Once `signal` is\n * aborted, it stops at the next slice and rejects with the signal's reason.\n */\n async hasSameRowsAsAsync(other: PivotReport | undefined, slicing?: PivotSlicing, signal?: AbortSignal): Promise<boolean> {\n const slicer = new Slicer(checkedSlicing(slicing), signal);\n return slicer.run(sameRowsSteps(this, other));\n }\n\n /** The row's Items, outermost first, each with its field. */\n rowPath(row: PivotReportRow): readonly PivotFieldItem[] {\n this.#answered(row);\n return path(rowNode(row), this.layout.rows, cubeParts(this.cube).rows);\n }\n\n /** The value column's Items, outermost first, each with its field. */\n columnPath(valueColumn: number): readonly PivotFieldItem[] {\n return path(columnNode(elementAt(this.valueColumns, valueColumn)), this.layout.columns, cubeParts(this.cube).columns);\n }\n\n /** The question for the records behind a cell (ADR-0063): its row's and its column's Items, and every\n * placed field's Hidden Items, under the cube's Source Version. A column of \u22121 asks for the row's. */\n detailsQuery(row: PivotReportRow, valueColumn: number, start = 0, count: number = everyRecord): PivotDetailsQuery {\n if (!this.rows.includes(row)) throw new TypeError('The row belongs to another report.');\n this.#answered(row);\n if (!Number.isInteger(valueColumn) || valueColumn < -1 || valueColumn >= this.valueColumns.length) {\n throw new RangeError('Not a value column of the report, nor \u22121.');\n }\n return pivotDetailsQuery({\n sourceVersion: this.cube.sourceVersion,\n rowItems: this.rowPath(row),\n columnItems: valueColumn < 0 ? [] : this.columnPath(valueColumn),\n hiddenItems: placedFields(this.cube.query).filter(field => field.hiddenItems.length > 0),\n start,\n count,\n });\n }\n\n /** The Value Field a cell shows: its row's, its column's, the one Value Field, or \u22121 for none. */\n valueFieldAt(row: PivotReportRow, valueColumn: number): number {\n this.#answered(row);\n if (row.valueField >= 0) return row.valueField;\n const column = elementAt(this.valueColumns, valueColumn);\n if (column.valueField >= 0) return column.valueField;\n return this.#reader.values.length === 1 ? 0 : -1;\n }\n\n /** The value at a row and a value column as the report shows it, or `undefined` for an empty cell. */\n valueAt(row: PivotReportRow, valueColumn: number): PivotValue | undefined {\n this.#answered(row);\n if (!Number.isInteger(valueColumn) || valueColumn < 0 || valueColumn >= this.valueColumns.length) {\n throw new RangeError(`The report has ${this.valueColumns.length} value columns.`);\n }\n if (!row.carriesValues) return undefined;\n const vf = this.valueFieldAt(row, valueColumn);\n if (vf < 0) return undefined;\n const value = this.#reader.shown(rowNode(row), columnNode(elementAt(this.valueColumns, valueColumn)), vf);\n if (value.kind === 'empty') return undefined;\n const plan = elementAt(this.#reader.values, vf);\n return pivotValueOf(value, plan.numberFormat, plan.showValuesAs !== 'noCalculation', this.#options.culture);\n }\n\n // A row of this report's lineage, or the refusal that names it.\n #own(row: PivotReportRow): void {\n if (lineageOf(row) !== this.#lineage) {\n throw new TypeError(`The row ${row.key.toString()} is not a row of this report: it was laid out by another report, `\n + 'whose Value Fields and Items it names. Read a row through the report it came from.');\n }\n }\n\n // A row of this report that was answered: a Pending Row has no Items, no Value Field and no value to read.\n #answered(row: PivotReportRow): void {\n this.#own(row);\n if (row.role === 'pending') {\n const parent = path(rowNode(row), this.layout.rows, cubeParts(this.cube).rows).map(step => itemKeyText(step.item)).join(' / ');\n throw new RangeError(`The row stands for a sibling the Pivot Source has not answered: the siblings under ${parent === '' ? 'the grand total' : parent} `\n + 'were answered as a window that does not hold it. Ask for a report Window that reaches it, and the window moves there (ADR-0370 section 3).');\n }\n }\n}\n\n/** A Sibling Window's set as a range of a report's rows reaches it: its parent's Items, the first and the last\n * sibling the rows stand for, each by its place from 0, and how many siblings the set has. */\nexport interface PendingSpan {\n readonly parent: readonly PivotItemKey[];\n readonly first: number;\n readonly last: number;\n readonly siblings: number;\n}\n\n/** The Sibling Windows' sets whose Pending Rows lie among the rows from `from` to before `to`, each with the\n * siblings those rows stand for, answered or not (ADR-0370 section 3); none when every row there was answered.\n * Not part of the public surface. */\nexport function pendingSpans(report: PivotReport, from: number, to: number): readonly PendingSpan[] {\n const parts = cubeParts(report.cube);\n if (parts.windows.size === 0) return [];\n const ranks = reportRanks(report);\n const spans = new Map<AxisNode, { first: number; last: number; pending: boolean }>();\n for (let i = from; i < to; i++) {\n const row = elementAt(report.rows, i);\n const node = rowNode(row);\n const pending = row.role === 'pending';\n const rank = pending ? rowSibling(row) : ranks.get(node.id);\n if (rank === undefined || (!pending && (row.role === 'subtotal' || row.role === 'grandTotal'))) continue;\n const parent = pending ? node : parentOf(node);\n const held = spans.get(parent);\n if (held === undefined) spans.set(parent, { first: rank, last: rank, pending });\n else {\n held.first = Math.min(held.first, rank);\n held.last = Math.max(held.last, rank);\n held.pending ||= pending;\n }\n }\n const found: PendingSpan[] = [];\n for (const [parent, reached] of spans) {\n if (!reached.pending) continue;\n const window = defined(parts.windows.get(parent.id), \"a Pending Row's window\");\n found.push(Object.freeze({\n parent: path(parent, report.layout.rows, parts.rows).map(step => step.item),\n first: reached.first,\n last: reached.last,\n siblings: window.before + shownCount(parts.rows.childrenOf(parent).length, window) + window.after,\n }));\n }\n return Object.freeze(found);\n}\n\n// Each report's Pending Rows as runs of consecutive rows, from the first to before the end, made once asked for.\nconst pendingRuns = new WeakMap<PivotReport, readonly (readonly [number, number])[]>();\n\n/** Whether any row from `top` to `bottom`, both included, is a Pending Row. Not part of the public surface. */\nexport function reachesPending(report: PivotReport, top: number, bottom: number): boolean {\n if (cubeParts(report.cube).windows.size === 0) return false;\n let runs = pendingRuns.get(report);\n if (runs === undefined) {\n const made: [number, number][] = [];\n report.rows.forEach((row, i) => {\n if (row.role !== 'pending') return;\n const run = made.at(-1);\n if (run?.[1] === i) run[1] = i + 1;\n else made.push([i, i + 1]);\n });\n runs = made;\n pendingRuns.set(report, runs);\n }\n // The first run that ends after `top`.\n let low = 0;\n let high = runs.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (elementAt(runs, middle)[1] <= top) low = middle + 1;\n else high = middle;\n }\n const run = runs[low];\n return run !== undefined && run[0] <= bottom;\n}\n\n// A row parent's Items, as one text: two reports' parents of the same Items are one text.\nfunction parentText(node: AxisNode, report: PivotReport): string {\n return path(node, report.layout.rows, cubeParts(report.cube).rows).map(step => publicKeyId(step.item)).join('\\u0000');\n}\n\n/** The place of the sibling an answered row of a Sibling Window's set stands for: its parent's Items as one text,\n * and its place among the set's siblings from 0; none for any other row. Not part of the public surface. */\nexport function siblingPlace(report: PivotReport, row: PivotReportRow): { readonly parent: string; readonly rank: number } | undefined {\n if (row.role === 'pending' || row.role === 'subtotal' || row.role === 'grandTotal') return undefined;\n const node = rowNode(row);\n const rank = reportRanks(report).get(node.id);\n return rank === undefined ? undefined : { parent: parentText(parentOf(node), report), rank };\n}\n\n/** The siblings a report's Sibling Window under a parent, given by its Items as one text, shows: from the first to\n * before the end, by their places from 0; none where the parent's set was answered whole. Not part of the public\n * surface. */\nexport function shownSiblings(report: PivotReport, parent: string): readonly [number, number] | undefined {\n const parts = cubeParts(report.cube);\n for (const [id, window] of parts.windows) {\n const node = parts.rows.node(id);\n if (parentText(node, report) === parent) return [window.before, window.before + shownCount(parts.rows.childrenOf(node).length, window)];\n }\n return undefined;\n}\n\n// How many of a windowed parent's children are shown: all but its margins.\nfunction shownCount(children: number, window: CubeWindow): number {\n return children - (window.before > 0 ? 1 : 0) - (window.after > 0 ? 1 : 0);\n}\n\nfunction samePath(one: AxisNode, other: AxisNode): boolean {\n let a: AxisNode | undefined = one;\n let b: AxisNode | undefined = other;\n while (a !== undefined && b !== undefined) {\n if (a.level !== b.level) return false;\n if (a.item === undefined) return b.item === undefined;\n if (b.item === undefined || !sameItem(a.item.key, b.item.key)) return false;\n a = a.parent;\n b = b.parent;\n }\n return a === b;\n}\n\n// A node's Items, outermost first, each spelled as the cube's version holds it.\nfunction path(node: AxisNode, placements: readonly PivotFieldPlacement[], axis: CubeAxis): readonly PivotFieldItem[] {\n const steps: PivotFieldItem[] = [];\n for (let at: AxisNode | undefined = node; at?.item !== undefined; at = at.parent) {\n steps.unshift(Object.freeze({ field: elementAt(placements, at.level).field, item: itemOf(axis.nodeOf(at)).publicKey }));\n }\n return Object.freeze(steps);\n}\n\n// ---- Laying it out ------------------------------------------------------------------------------\n\n/** Whether a placement's Item is collapsed, its Items compared as the engine tells them apart. */\nclass CollapseState {\n readonly #collapsed: boolean;\n readonly #toggled: ReadonlySet<string>;\n\n constructor(placement: PivotFieldPlacement) {\n this.#collapsed = placement.collapsed;\n this.#toggled = new Set(placement.toggledItems.map(key => keyIdOf(fromPublicKey(key))));\n }\n\n isCollapsed(item: ItemRef): boolean {\n return this.#collapsed !== this.#toggled.has(keyIdOf(item.key));\n }\n}\n\n/** Lays a report out from a cube and a layout the cube holds. */\nexport function buildReport(cube: PivotCube, layout: PivotLayout, options: ResolvedOptions): PivotReport {\n return runWhole(new ReportBuilder(cube, layout, options, false).build());\n}\n\n/** {@link buildReport}, a step at a time (PV-40): each tree walked a node at a time and a node's children\n * ordered a piece at a time, yielding once a piece of work is done, for a caller to slice. Siblings are merged\n * in order a piece at a time where {@link buildReport} sorts them at once, and both sort stably, so the two\n * give one order. */\nexport function buildReportSteps(cube: PivotCube, layout: PivotLayout, options: ResolvedOptions): Generator<void, PivotReport> {\n return new ReportBuilder(cube, layout, options, true).build();\n}\n\n// Which side of a Sibling Window's shown siblings Pending Rows stand on, and a node's Pending Rows there, made a\n// piece at a time; undefined where it has none.\ntype PendingSide = 'before' | 'after';\ntype PendingSteps = (node: AxisNode, side: PendingSide) => Generator<void, void> | undefined;\n\n// The steps of a node's Pending Rows, none where it has none.\nfunction* allSteps(steps: Generator<void, void> | undefined): Generator<void, void> {\n if (steps !== undefined) yield* steps;\n}\n\n// What a step of the walk is worth, in the units a piece counts: a node entered or left, each row it emits,\n// and each column, whose name is written from its Items.\nconst rowUnits = 4;\nconst columnUnits = 8;\n\n/** Lays a report out from a cube: the walk {@link buildReportSteps} takes, and the steps a computation lays a\n * report out with node by node (ADR-0153). Not part of the public surface. */\nexport class ReportBuilder {\n readonly #cube: PivotCube;\n readonly #layout: PivotLayout;\n readonly #options: ResolvedOptions;\n readonly #labels: ItemLabels;\n readonly #reader: CellReader;\n readonly #values: readonly ValueFieldPlan[];\n readonly #rowPlacements: readonly PivotFieldPlacement[];\n readonly #columnPlacements: readonly PivotFieldPlacement[];\n readonly #rowMeta: readonly FieldMeta[];\n readonly #columnMeta: readonly FieldMeta[];\n readonly #rowCollapse: readonly CollapseState[];\n readonly #columnCollapse: readonly CollapseState[];\n readonly #valuesOnRows: boolean;\n readonly #valuesOnColumns: boolean;\n readonly #labelColumnCount: number;\n readonly #pending: (AxisNode | undefined)[];\n readonly #lineage: object;\n readonly #sliced: boolean;\n readonly #rowAxis: CubeAxis;\n readonly #columnAxis: CubeAxis;\n // Each shown sibling of a Sibling Window's set, by its node id: its place among all the set's siblings.\n readonly #ranks = new Map<number, number>();\n\n /** A builder of `cube` under `layout`, which the cube holds; its rows are of `lineage`, a report's that it\n * lays out again, or of a lineage of their own. */\n constructor(cube: PivotCube, layout: PivotLayout, options: ResolvedOptions, sliced: boolean, lineage: object = {}) {\n this.#lineage = lineage;\n this.#cube = cube;\n this.#sliced = sliced;\n this.#rowAxis = cubeParts(cube).rows;\n this.#columnAxis = cubeParts(cube).columns;\n this.#layout = layout;\n this.#options = options;\n this.#labels = new ItemLabels(options);\n this.#rowPlacements = layout.rows;\n this.#columnPlacements = layout.columns;\n const metaOf = (field: string): FieldMeta => {\n const meta = cubeParts(cube).meta.get(field);\n if (meta === undefined) throw new Error(`Internal: '${field}' has no meta.`);\n return meta;\n };\n this.#rowMeta = layout.rows.map(p => metaOf(p.field));\n this.#columnMeta = layout.columns.map(p => metaOf(p.field));\n this.#rowCollapse = layout.rows.map(p => new CollapseState(p));\n this.#columnCollapse = layout.columns.map(p => new CollapseState(p));\n const captions = valueCaptions(layout.values, cubeParts(cube).meta, options);\n this.#values = layout.values.map((value, i) => Object.freeze({\n source: cubeParts(cube).sources.indexOf(value.field),\n aggregation: value.aggregation,\n caption: elementAt(captions, i),\n showValuesAs: value.showValuesAs,\n numberFormat: value.numberFormat,\n }));\n this.#reader = new CellReader(cube, this.#values);\n this.#valuesOnRows = this.#values.length >= 2 && layout.valuesAxis === 'rows';\n this.#valuesOnColumns = this.#values.length >= 2 && layout.valuesAxis === 'columns';\n this.#labelColumnCount = this.#countLabelColumns();\n this.#pending = layout.rows.map(() => undefined);\n }\n\n get #rowLevels(): number {\n return this.#rowPlacements.length;\n }\n\n get #columnLevels(): number {\n return this.#columnPlacements.length;\n }\n\n get #valueCount(): number {\n return this.#values.length;\n }\n\n get #empty(): boolean {\n return this.#layout.rows.length === 0 && this.#layout.columns.length === 0 && this.#layout.values.length === 0;\n }\n\n #countLabelColumns(): number {\n if (this.#empty) return 0;\n if (this.#layout.form === 'compact') return this.#rowLevels > 0 || this.#valuesOnRows ? 1 : 0;\n return this.#rowLevels + (this.#valuesOnRows ? 1 : 0);\n }\n\n /** A builder that lays `cube` out again as `previous` was laid out: under its layout and options, its rows of\n * its lineage, so that a row it shares is the report's own (ADR-0153). */\n static again(cube: PivotCube, previous: PivotReport): ReportBuilder {\n return new ReportBuilder(cube, previous.layout, reportOptions(previous), true, reportLineage(previous));\n }\n\n /** The cube laid out. */\n get cube(): PivotCube {\n return this.#cube;\n }\n\n /** The layout laid out. */\n get layout(): PivotLayout {\n return this.#layout;\n }\n\n /** The report around `rows`, which this builder laid out node by node ({@link rowsOf}): the value columns and\n * their spans laid out as {@link build} lays them out. */\n *buildAround(rows: readonly PivotReportRow[]): Generator<void, PivotReport> {\n const columns: PivotReportColumn[] = [];\n const spans: PivotHeaderSpan[] = [];\n if (!this.#empty) yield* this.#emitColumns(columns, spans);\n return makeReport(this.#cube, this.#layout, this.#options, this.#reader, this.#labelColumnList(), columns, spans, this.#tiers(), rows, this.#lineage, this.#ranks);\n }\n\n /** `previous` with `rows` laid out by this builder: its label columns, and its value columns and spans unless\n * the columns changed \u2014 laid out again then, each column `previous` showed alike kept. */\n *withRows(previous: PivotReport, rows: readonly PivotReportRow[], columnsChanged: boolean): Generator<void, PivotReport> {\n // Only a cube of leaves is updated, and only its answer has no Sibling Window: the places of a window's\n // siblings are each report's own.\n if (cubeParts(this.#cube).windows.size > 0) throw new Error('Internal: a report with Sibling Windows is laid out afresh, never updated.');\n if (!columnsChanged) {\n return makeReport(this.#cube, this.#layout, this.#options, this.#reader, previous.labelColumns, previous.valueColumns, previous.headerSpans,\n previous.headerTierCount, rows, this.#lineage, this.#ranks);\n }\n const columns: PivotReportColumn[] = [];\n const spans: PivotHeaderSpan[] = [];\n if (!this.#empty) yield* this.#emitColumns(columns, spans);\n const old = new Map(previous.valueColumns.map(column => [column.name, column]));\n const kept = columns.map(column => {\n const held = old.get(column.name);\n return held !== undefined && held.header === column.header ? held : column;\n });\n return makeReport(this.#cube, this.#layout, this.#options, this.#reader, previous.labelColumns, kept, spans, previous.headerTierCount, rows,\n this.#lineage, this.#ranks);\n }\n\n /**\n * One node's own rows, as the walk lays the node out (ADR-0153): those before its children's, those after, and\n * whether its children are laid out. In the Tabular form an outer Item's label stands on the first row of its\n * block: `pendingFrom` is the first level whose ancestor's label is still to be shown \u2014 the node's own level\n * for a node that is not its parent's first child, its parent's for one that is.\n */\n *rowsOf(node: AxisNode, pendingFrom: number): Generator<void, { readonly before: PivotReportRow[]; readonly after: PivotReportRow[]; readonly descend: boolean }> {\n const before: PivotReportRow[] = [];\n const after: PivotReportRow[] = [];\n if (this.#empty) return { before, after, descend: false };\n if (node.item === undefined) {\n if (this.#rowLevels === 0) {\n runWhole(this.#emitRows(before));\n return { before, after, descend: false };\n }\n yield* allSteps(this.#pendingRows(node, 'before', before));\n yield* allSteps(this.#pendingRows(node, 'after', after));\n this.#grandTotalRows(after);\n return { before, after, descend: true };\n }\n this.#pending.fill(undefined);\n for (let level = pendingFrom; level < node.level; level++) this.#pending[level] = this.#ancestorAt(node, level);\n const tabular = this.#layout.form === 'tabular';\n const descend = (tabular ? this.#enterTabular(node, before) : this.#enterGrouped(node, before)) >= 0;\n if (descend) yield* allSteps(this.#pendingRows(node, 'before', before));\n this.#pending.fill(undefined);\n if (descend) {\n yield* allSteps(this.#pendingRows(node, 'after', after));\n if (tabular) this.#leaveTabular(node, after);\n else this.#leaveGrouped(node, after);\n }\n return { before, after, descend };\n }\n\n /** Where a node's child's block starts to show labels, as {@link rowsOf} takes it: the node's for its first\n * child, unless Pending Rows stand before that child and took them; its child's level for any other. */\n childPendingFrom(node: AxisNode, index: number, pendingFrom: number): number {\n const window = cubeParts(this.#cube).windows.get(node.id);\n return index === 0 && (window === undefined || window.before === 0) ? pendingFrom : node.level + 1;\n }\n\n /** A row node's children in their field's order, ordered a piece at a time. */\n orderedChildren(node: AxisNode): Generator<void, readonly AxisNode[]> {\n return this.#order(node, true);\n }\n\n #tiers(): number {\n return this.#columnLevels === 0 ? 0 : this.#valuesOnColumns ? this.#columnLevels : this.#columnLevels - 1;\n }\n\n *build(): Generator<void, PivotReport> {\n const columns: PivotReportColumn[] = [];\n const spans: PivotHeaderSpan[] = [];\n const rows: PivotReportRow[] = [];\n if (!this.#empty) {\n yield* this.#emitColumns(columns, spans);\n yield* this.#emitRows(rows);\n }\n return makeReport(this.#cube, this.#layout, this.#options, this.#reader, this.#labelColumnList(), columns, spans, this.#tiers(), rows, this.#lineage, this.#ranks);\n }\n\n #word(id: string): string {\n return this.#options.word(id);\n }\n\n #label(node: AxisNode, meta: FieldMeta): string {\n return this.#labels.of(itemOf(node), meta);\n }\n\n #itemLabel(node: AxisNode, level: number, indent = 0, toggle?: PivotToggle): PivotRowLabel {\n const meta = elementAt(this.#rowMeta, level);\n return rowLabel(this.#label(node, meta), indent, toggle, ItemLabels.numberOf(itemOf(node), meta));\n }\n\n #labelColumnList(): PivotLabelColumn[] {\n if (this.#labelColumnCount === 0) return [];\n if (this.#layout.form === 'compact') return [Object.freeze({ name: 'row-labels', header: this.#word(pivotWordIds.rowLabels), field: undefined })];\n const columns: PivotLabelColumn[] = this.#rowPlacements.map((placement, i) =>\n Object.freeze({ name: `row:${placement.field}`, header: elementAt(this.#rowMeta, i).field.caption, field: placement.field }));\n if (this.#valuesOnRows) columns.push(Object.freeze({ name: 'row:#values', header: this.#word(pivotWordIds.values), field: undefined }));\n return columns;\n }\n\n // ---- The walk ----\n\n // Depth first, in the Items' order: each node entered, its children ordered and walked, then left. A\n // step \u2014 a node entered or left, or a piece of its children ordered \u2014 is worth a unit and each row or\n // column it emits more; once a piece's worth is done, the walk yields. A node's Pending Rows, made just\n // after it is entered and just before it is left, are steps of their own, made a piece at a time.\n *#walk(root: AxisNode, rows: boolean, enter: (node: AxisNode) => number, leave: (node: AxisNode, mark: number) => void,\n emitted: () => number, unitsEach: number, pending?: PendingSteps): Generator<void, void> {\n if (!this.#sliced) {\n this.#walkAtOnce(root, rows, enter, leave, pending);\n return;\n }\n const frames: WalkFrame[] = [];\n let units = 0;\n const entered = (node: AxisNode): number => {\n const before = emitted();\n const mark = enter(node);\n units += 1 + ((emitted() - before) * unitsEach);\n return mark;\n };\n // A node's Pending Rows: every piece but the last a step of its own, the last counted toward the step it ends.\n const pendingRows = function* (node: AxisNode, side: PendingSide): Generator<void, void> {\n const before = emitted();\n yield* allSteps(pending?.(node, side));\n units += (emitted() - before) * unitsEach;\n };\n const rootMark = entered(root);\n if (rootMark < 0) return;\n yield* pendingRows(root, 'before');\n frames.push({ node: root, mark: rootMark, children: this.#atOnce(root, rows) ? this.#orderAtOnce(root, rows) : yield* this.#order(root, rows), next: 0 });\n for (let top = frames.at(-1); top !== undefined; top = frames.at(-1)) {\n const child = top.children[top.next];\n if (child === undefined) {\n yield* pendingRows(top.node, 'after');\n const before = emitted();\n leave(top.node, top.mark);\n units += 1 + ((emitted() - before) * unitsEach);\n frames.pop();\n } else {\n top.next++;\n const mark = entered(child);\n if (mark >= 0) {\n yield* pendingRows(child, 'before');\n frames.push({ node: child, mark, children: this.#atOnce(child, rows) ? this.#orderAtOnce(child, rows) : yield* this.#order(child, rows), next: 0 });\n }\n }\n if (units >= pieceUnits) {\n units = 0;\n yield;\n }\n }\n }\n\n // The same walk at once, for a report laid out at once.\n #walkAtOnce(node: AxisNode, rows: boolean, enter: (node: AxisNode) => number, leave: (node: AxisNode, mark: number) => void,\n pending: PendingSteps | undefined): void {\n const mark = enter(node);\n if (mark < 0) return;\n runWhole(allSteps(pending?.(node, 'before')));\n for (const child of this.#orderAtOnce(node, rows)) this.#walkAtOnce(child, rows, enter, leave, pending);\n runWhole(allSteps(pending?.(node, 'after')));\n leave(node, mark);\n }\n\n // ---- Columns ----\n\n #tierOf(level: number): number {\n return this.#valuesOnColumns ? this.#columnLevels - level : this.#columnLevels - 1 - level;\n }\n\n *#emitColumns(columns: PivotReportColumn[], spans: PivotHeaderSpan[]): Generator<void, void> {\n const root = this.#columnAxis.root;\n if (this.#columnLevels === 0) {\n if (this.#valueCount === 0) return;\n if (this.#valuesOnColumns) {\n this.#values.forEach((plan, vf) => columns.push(this.#column('item', root, vf, plan.caption)));\n } else {\n // One value column: the one Value Field's caption, or \"Values\" when several stand in rows.\n columns.push(this.#column('item', root, -1, this.#valueCount === 1 ? elementAt(this.#values, 0).caption : this.#word(pivotWordIds.values)));\n }\n return;\n }\n yield* this.#walk(root, false, node => this.#enterColumn(node, columns, spans), (node, start) => this.#leaveColumn(node, start, columns, spans),\n () => columns.length + spans.length, columnUnits);\n if (this.#layout.grandTotalColumn && this.#valueCount > 0) {\n const label = this.#word(pivotWordIds.grandTotal);\n if (this.#valuesOnColumns) {\n const first = columns.length;\n this.#values.forEach((plan, vf) => columns.push(this.#column('grandTotal', root, vf, plan.caption)));\n const top = this.#tierOf(0);\n spans.push(span(label, first, this.#valueCount, top, top));\n } else {\n columns.push(this.#column('grandTotal', root, -1, label));\n }\n }\n }\n\n // An innermost or collapsed column Item emits its columns, and its children are not walked; any other is\n // left with the first column under it.\n #enterColumn(node: AxisNode, columns: PivotReportColumn[], spans: PivotHeaderSpan[]): number {\n if (node.item === undefined) return 0;\n const level = node.level;\n const innermost = level === this.#columnLevels - 1;\n const collapsed = !innermost && elementAt(this.#columnCollapse, level).isCollapsed(node.item);\n if (!innermost && !collapsed) return columns.length;\n const meta = elementAt(this.#columnMeta, level);\n const label = this.#label(node, meta);\n const tier = this.#tierOf(level);\n if (this.#valuesOnColumns) {\n const first = columns.length;\n this.#values.forEach((plan, vf) => columns.push(this.#column('item', node, vf, plan.caption)));\n spans.push(span(label, first, this.#valueCount, tier, tier));\n } else {\n columns.push(makeColumn(this.#columnName('item', node, -1), label, 'item', -1, node, ItemLabels.numberOf(node.item, meta)));\n }\n return -1;\n }\n\n #leaveColumn(node: AxisNode, start: number, columns: PivotReportColumn[], spans: PivotHeaderSpan[]): void {\n if (node.item === undefined) return;\n const level = node.level;\n const label = this.#label(node, elementAt(this.#columnMeta, level));\n const tier = this.#tierOf(level);\n spans.push(span(label, start, columns.length - start, tier, 1));\n if (elementAt(this.#columnPlacements, level).subtotals && this.#valueCount > 0) {\n const total = fillWord(this.#word(pivotWordIds.itemTotal), label);\n if (this.#valuesOnColumns) {\n const first = columns.length;\n this.#values.forEach((plan, vf) => columns.push(this.#column('subtotal', node, vf, plan.caption)));\n spans.push(span(total, first, this.#valueCount, tier, tier));\n } else {\n columns.push(this.#column('subtotal', node, -1, total));\n }\n }\n }\n\n #column(role: PivotColumnRole, node: AxisNode, vf: number, header: string): PivotReportColumn {\n return makeColumn(this.#columnName(role, node, vf), header, role, vf, node);\n }\n\n // A column's name is its role, its Items and its Value Field's caption \u2014 stable across reports for the\n // same column, so a width the user gave it survives a refresh (ADR-0016).\n #columnName(role: PivotColumnRole, node: AxisNode, vf: number): string {\n const parts: string[] = [];\n for (let at: AxisNode | undefined = node; at?.item !== undefined; at = at.parent) {\n const key = itemOf(this.#columnAxis.nodeOf(at)).publicKey;\n const text = key.kind === 'text' ? upperInvariant(key.value ?? '') : key.value ?? ''; // oxlint-disable-line ex-grid/no-stand-in-default -- a Blank's key has no text, and its name's part is empty as C# writes it\n parts.unshift(`${itemKindOrder(key.kind)}:${escapeDataString(text)}`);\n }\n let name = `v:${role === 'item' ? 'i' : role === 'subtotal' ? 's' : 'g'}`;\n for (const part of parts) name += `/${part}`;\n if (vf >= 0) name += `#${escapeDataString(elementAt(this.#values, vf).caption)}`;\n return name;\n }\n\n // ---- Rows ----\n\n #row(role: PivotRowRole, node: AxisNode, valueField: number, carriesValues: boolean, labels: readonly PivotRowLabel[]): PivotReportRow {\n return makeRow(role, node, valueField, carriesValues, labels, this.#lineage);\n }\n\n *#emitRows(rows: PivotReportRow[]): Generator<void, void> {\n const root = this.#rowAxis.root;\n if (this.#rowLevels === 0) {\n if (this.#valueCount === 0) return;\n if (this.#valuesOnRows) {\n this.#values.forEach((plan, vf) => {\n const labels = this.#newLabels();\n labels[this.#labelColumnCount - 1] = rowLabel(plan.caption);\n rows.push(this.#row('item', root, vf, true, labels));\n });\n } else {\n rows.push(this.#row('grandTotal', root, -1, true, this.#newLabels()));\n }\n return;\n }\n const tabular = this.#layout.form === 'tabular';\n const enter = (node: AxisNode): number => tabular ? this.#enterTabular(node, rows) : this.#enterGrouped(node, rows);\n const leave = (node: AxisNode): void => {\n if (tabular) this.#leaveTabular(node, rows);\n else this.#leaveGrouped(node, rows);\n };\n yield* this.#walk(root, true, enter, leave, () => rows.length, rowUnits, (node, side) => this.#pendingRows(node, side, rows));\n this.#grandTotalRows(rows);\n }\n\n // A Sibling Window's Pending Rows on one side of its shown siblings (ADR-0370 section 3): each sibling there\n // the rows it would have, as its siblings shown have them, with no label and no value. In the Tabular form the\n // first of them, which stands first in its parent's block, takes the labels that block's first row shows.\n // Undefined where there are none; otherwise made a piece at a time, since a window may stand over millions\n // of siblings (PV-40).\n #pendingRows(node: AxisNode, side: PendingSide, rows: PivotReportRow[]): Generator<void, void> | undefined {\n const window = cubeParts(this.#cube).windows.get(node.id);\n if (window === undefined) return undefined;\n const count = side === 'before' ? window.before : window.after;\n if (count === 0) return undefined;\n const tabular = this.#layout.form === 'tabular';\n if (side === 'before' && tabular && node.item !== undefined) this.#tabularLabels(node, node.level);\n const first = side === 'before' ? 0 : window.before + shownCount(this.#rowAxis.childrenOf(node).length, window);\n const each = this.#valuesOnRows ? (tabular ? this.#valueCount : 1 + this.#valueCount) : 1;\n const labels = Object.freeze(this.#newLabels());\n return inPieces(count * each, rowUnits, (from, to) => {\n for (let at = from; at < to; at++) rows.push(makeRow('pending', node, -1, false, labels, this.#lineage, first + Math.floor(at / each)));\n });\n }\n\n #grandTotalRows(rows: PivotReportRow[]): void {\n if (!this.#layout.grandTotalRow || this.#valueCount === 0) return;\n const root = this.#rowAxis.root;\n if (this.#valuesOnRows) {\n for (let vf = 0; vf < this.#valueCount; vf++) rows.push(this.#row('grandTotal', root, vf, true, this.#grandTotalLabels(vf)));\n } else {\n rows.push(this.#row('grandTotal', root, -1, true, this.#grandTotalLabels(-1)));\n }\n }\n\n #newLabels(): PivotRowLabel[] {\n return Array.from({ length: this.#labelColumnCount }, () => noLabel);\n }\n\n #caption(vf: number): string {\n return elementAt(this.#values, vf).caption;\n }\n\n #grandTotalLabels(vf: number): PivotRowLabel[] {\n const labels = this.#newLabels();\n if (this.#layout.form === 'compact') {\n labels[0] = rowLabel(vf < 0 ? this.#word(pivotWordIds.grandTotal) : fillWord(this.#word(pivotWordIds.totalOf), this.#caption(vf)));\n return labels;\n }\n labels[0] = rowLabel(this.#word(pivotWordIds.grandTotal));\n if (vf >= 0) labels[this.#labelColumnCount - 1] = rowLabel(this.#caption(vf));\n return labels;\n }\n\n #toggleOf(node: AxisNode): PivotToggle | undefined {\n const level = node.level;\n if (level >= this.#rowLevels - 1) return undefined;\n const item = itemOf(node);\n return Object.freeze({\n field: elementAt(this.#rowPlacements, level).field,\n item: item.publicKey,\n itemLabel: this.#label(node, elementAt(this.#rowMeta, level)),\n isCollapsed: elementAt(this.#rowCollapse, level).isCollapsed(item),\n });\n }\n\n // The node's ancestor at a level, as the cube's version holds it.\n #ancestorAt(node: AxisNode, level: number): AxisNode {\n let at = node;\n while (at.level > level) at = parentOf(at);\n return this.#rowAxis.nodeOf(at);\n }\n\n // The Compact and Outline forms: a group row heads each outer Item's block. An innermost or collapsed\n // Item is its rows, and its children are not walked; an outer one is its group row, then its children,\n // then \u2014 when they stand at the bottom \u2014 its subtotals.\n #enterGrouped(node: AxisNode, rows: PivotReportRow[]): number {\n if (node.item === undefined) return 0;\n const level = node.level;\n const innermost = level === this.#rowLevels - 1;\n const collapsed = !innermost && elementAt(this.#rowCollapse, level).isCollapsed(node.item);\n if (innermost || collapsed) {\n if (this.#valuesOnRows) {\n rows.push(this.#row('group', node, -1, false, this.#itemLabels(node)));\n for (let vf = 0; vf < this.#valueCount; vf++) rows.push(this.#row('item', node, vf, true, this.#captionLabels(node, vf)));\n } else {\n rows.push(this.#row(innermost ? 'item' : 'group', node, -1, true, this.#itemLabels(node)));\n }\n return -1;\n }\n const { atTop } = this.#subtotalsOf(level);\n rows.push(this.#row('group', node, -1, atTop, this.#itemLabels(node)));\n return 0;\n }\n\n #leaveGrouped(node: AxisNode, rows: PivotReportRow[]): void {\n if (node.item === undefined) return;\n const { subtotals, atTop } = this.#subtotalsOf(node.level);\n if (!subtotals || atTop) return;\n if (this.#valuesOnRows) {\n for (let vf = 0; vf < this.#valueCount; vf++) rows.push(this.#row('subtotal', node, vf, true, this.#subtotalLabels(node, vf)));\n } else {\n rows.push(this.#row('subtotal', node, -1, true, this.#subtotalLabels(node, -1)));\n }\n }\n\n #subtotalsOf(level: number): { readonly subtotals: boolean; readonly atTop: boolean } {\n const subtotals = elementAt(this.#rowPlacements, level).subtotals && this.#valueCount > 0;\n return { subtotals, atTop: subtotals && this.#layout.subtotalsAtTop && !this.#valuesOnRows };\n }\n\n #itemLabels(node: AxisNode): PivotRowLabel[] {\n const labels = this.#newLabels();\n const level = node.level;\n if (this.#layout.form === 'compact') {\n labels[0] = this.#itemLabel(node, level, level, this.#toggleOf(node));\n return labels;\n }\n labels[level] = this.#itemLabel(node, level, 0, this.#toggleOf(node));\n this.#repeatOuter(labels, node, level - 1);\n return labels;\n }\n\n #captionLabels(node: AxisNode, vf: number): PivotRowLabel[] {\n const labels = this.#newLabels();\n if (this.#layout.form === 'compact') {\n labels[0] = rowLabel(this.#caption(vf), node.level + 1);\n return labels;\n }\n labels[this.#labelColumnCount - 1] = rowLabel(this.#caption(vf));\n this.#repeatOuter(labels, node, node.level);\n return labels;\n }\n\n #subtotalLabels(node: AxisNode, vf: number): PivotRowLabel[] {\n const labels = this.#newLabels();\n const level = node.level;\n const label = this.#label(node, elementAt(this.#rowMeta, level));\n if (this.#layout.form === 'compact') {\n labels[0] = rowLabel(vf < 0\n ? fillWord(this.#word(pivotWordIds.itemTotal), label)\n : fillWord(this.#word(pivotWordIds.itemValue), label, this.#caption(vf)), level);\n return labels;\n }\n labels[level] = rowLabel(fillWord(this.#word(pivotWordIds.itemTotal), label));\n if (vf >= 0) labels[this.#labelColumnCount - 1] = rowLabel(this.#caption(vf));\n this.#repeatOuter(labels, node, level - 1);\n return labels;\n }\n\n #repeatOuter(labels: PivotRowLabel[], node: AxisNode, upToLevel: number): void {\n if (!this.#layout.repeatItemLabels) return;\n for (let level = 0; level <= upToLevel; level++) labels[level] = this.#itemLabel(this.#ancestorAt(node, level), level);\n }\n\n // The Tabular form: no group rows \u2014 an outer Item's label stands on the first row of its block, and its\n // subtotal at the bottom.\n #enterTabular(node: AxisNode, rows: PivotReportRow[]): number {\n if (node.item === undefined) return 0;\n const level = node.level;\n this.#pending[level] = node;\n const innermost = level === this.#rowLevels - 1;\n const collapsed = !innermost && elementAt(this.#rowCollapse, level).isCollapsed(node.item);\n if (!innermost && !collapsed) return 0;\n const role: PivotRowRole = innermost ? 'item' : 'group';\n if (this.#valuesOnRows) {\n for (let vf = 0; vf < this.#valueCount; vf++) {\n const labels = this.#tabularLabels(node, level);\n labels[this.#labelColumnCount - 1] = rowLabel(this.#caption(vf));\n rows.push(this.#row(role, node, vf, true, labels));\n }\n } else {\n rows.push(this.#row(role, node, -1, true, this.#tabularLabels(node, level)));\n }\n return -1;\n }\n\n #leaveTabular(node: AxisNode, rows: PivotReportRow[]): void {\n if (node.item === undefined) return;\n const level = node.level;\n if (!elementAt(this.#rowPlacements, level).subtotals || this.#valueCount === 0) return;\n const total = fillWord(this.#word(pivotWordIds.itemTotal), this.#label(node, elementAt(this.#rowMeta, level)));\n for (let vf = this.#valuesOnRows ? 0 : -1; vf < (this.#valuesOnRows ? this.#valueCount : 0); vf++) {\n const labels = this.#tabularLabels(node, level - 1);\n labels[level] = rowLabel(total);\n if (vf >= 0) labels[this.#labelColumnCount - 1] = rowLabel(this.#caption(vf));\n rows.push(this.#row('subtotal', node, vf, true, labels));\n }\n }\n\n #tabularLabels(node: AxisNode, upToLevel: number): PivotRowLabel[] {\n const labels = this.#newLabels();\n for (let level = 0; level <= upToLevel; level++) {\n const ancestor = this.#ancestorAt(node, level);\n if (this.#pending[level] === ancestor) {\n labels[level] = this.#itemLabel(ancestor, level, 0, this.#toggleOf(ancestor));\n this.#pending[level] = undefined;\n } else if (this.#layout.repeatItemLabels) {\n labels[level] = this.#itemLabel(ancestor, level);\n }\n }\n return labels;\n }\n\n // ---- Order ----\n\n // A node's children in their field's order (ADR-0060). A short list is ordered at once, and so is every\n // list when the report is laid out at once; a long one in slices is ordered a piece at a time \u2014 its Order\n // Keys asked, the values it is ordered by read, and the sort \u2014 yielding once a piece's worth is done. Both\n // sort stably, so the two give one order.\n *#order(node: AxisNode, rows: boolean): Generator<void, readonly AxisNode[]> {\n if (this.#atOnce(node, rows)) return this.#orderAtOnce(node, rows);\n const children = this.#childrenOf(node, rows);\n const ordering = this.#ordering(node, rows);\n yield* inPieces(children.length, 2, ordering.prepare);\n const order = yield* sortedSteps(children.map((_, i) => i), ordering.compare);\n return this.#shown(node, rows, order.map(i => elementAt(children, i)));\n }\n\n // A row node's children as the report shows them: under a Sibling Window, all but its margins, which the cube\n // checked sort strictly beyond the window's edges, and each shown sibling's place among the set's kept.\n #shown(node: AxisNode, rows: boolean, ordered: readonly AxisNode[]): readonly AxisNode[] {\n const window = rows ? cubeParts(this.#cube).windows.get(node.id) : undefined;\n if (window === undefined) return ordered;\n const shown = ordered.slice(window.before > 0 ? 1 : 0, ordered.length - (window.after > 0 ? 1 : 0));\n shown.forEach((child, i) => this.#ranks.set(child.id, window.before + i));\n return shown;\n }\n\n #atOnce(node: AxisNode, rows: boolean): boolean {\n return !this.#sliced || this.#childrenOf(node, rows).length <= pieceUnits / 8;\n }\n\n #childrenOf(node: AxisNode, rows: boolean): readonly AxisNode[] {\n return (rows ? this.#rowAxis : this.#columnAxis).childrenOf(node);\n }\n\n // At once, the order is made as directly as it can be: this is every node's order in a report laid out at\n // once, and a few hundred thousand nodes' in a large one.\n #orderAtOnce(node: AxisNode, rows: boolean): readonly AxisNode[] {\n return this.#shown(node, rows, this.#sortAtOnce(node, rows));\n }\n\n #sortAtOnce(node: AxisNode, rows: boolean): readonly AxisNode[] {\n const level = node.level + 1;\n const placement = elementAt(rows ? this.#rowPlacements : this.#columnPlacements, level);\n if (placement.sort.byValue !== undefined) {\n const children = this.#childrenOf(node, rows);\n const ordering = this.#ordering(node, rows);\n ordering.prepare(0, children.length);\n return children.map((_, i) => i).toSorted(ordering.compare).map(i => elementAt(children, i));\n }\n const meta = elementAt(rows ? this.#rowMeta : this.#columnMeta, level);\n const order = new ItemOrder(meta, this.#labels, this.#options.culture, placement.sort.direction === 'descending');\n const children = this.#childrenOf(node, rows);\n for (const child of children) order.prepare(itemOf(child));\n return children.toSorted((a, b) => order.compare(itemOf(a), itemOf(b)));\n }\n\n // How a node's children are ordered: what is read of each child first \u2014 its Order Key, or the value it is\n // ordered by \u2014 and the comparison of two children by their places among them.\n #ordering(node: AxisNode, rows: boolean): ChildOrdering {\n const level = node.level + 1;\n const placement = elementAt(rows ? this.#rowPlacements : this.#columnPlacements, level);\n const meta = elementAt(rows ? this.#rowMeta : this.#columnMeta, level);\n const children = this.#childrenOf(node, rows);\n const descending = placement.sort.direction === 'descending';\n const culture = this.#options.culture;\n const byValue = placement.sort.byValue;\n if (byValue !== undefined) {\n const other = rows ? this.#columnAxis.root : this.#rowAxis.root;\n const byLabel = new ItemOrder(meta, this.#labels, culture, false, false);\n const keys: (number | undefined)[] = [];\n return {\n prepare: (from, to) => {\n for (let i = from; i < to; i++) {\n const child = elementAt(children, i);\n const value = rows ? this.#reader.shown(child, other, byValue) : this.#reader.shown(other, child, byValue);\n keys.push(value.kind === 'number' ? value.number : undefined);\n }\n },\n compare: (i, j) => {\n const x = keys[i];\n const y = keys[j];\n const xItem = itemOf(elementAt(children, i));\n const yItem = itemOf(elementAt(children, j));\n if (x === undefined || y === undefined) {\n if (x === undefined && y === undefined) return byLabel.compare(xItem, yItem);\n return x === undefined ? 1 : -1;\n }\n let compared = x < y ? -1 : x > y ? 1 : 0;\n if (descending) compared = -compared;\n return compared !== 0 ? compared : byLabel.compare(xItem, yItem);\n },\n };\n }\n const order = new ItemOrder(meta, this.#labels, culture, descending);\n return {\n prepare: (from, to) => {\n for (let i = from; i < to; i++) order.prepare(itemOf(elementAt(children, i)));\n },\n compare: (i, j) => order.compare(itemOf(elementAt(children, i)), itemOf(elementAt(children, j))),\n };\n }\n}\n\ninterface ChildOrdering {\n readonly prepare: (from: number, to: number) => void;\n readonly compare: (i: number, j: number) => number;\n}\n\ninterface WalkFrame {\n readonly node: AxisNode;\n readonly mark: number;\n readonly children: readonly AxisNode[];\n next: number;\n}\n\nfunction span(label: string, firstColumn: number, columnCount: number, tier: number, tierSpan: number): PivotHeaderSpan {\n return Object.freeze({ label, firstColumn, columnCount, tier, tierSpan });\n}\n\nfunction itemOf(node: AxisNode): ItemRef {\n if (node.item === undefined) throw new Error('Internal: the root has no Item.');\n return node.item;\n}\n\nfunction parentOf(node: AxisNode): AxisNode {\n if (node.parent === undefined) throw new Error('Internal: the root has no parent.');\n return node.parent;\n}\n", "// What each Field List gesture means (ADR-0061), as pure functions from a layout to the next. The\n// component, a substituted Chrome and a server apply the same rules: a field stands at most once across\n// Filters, Rows and Columns and its settings travel with it; it may stand in Values any number of times;\n// \u03A3 Values moves between Rows and Columns only and always stands last; and an index is where the entry is\n// inserted in the Area as it stands, the Area's count being its end. The C# engine's PivotLayoutEdits.\n\nimport { fieldMetas, numberFormatProblem, type PivotField } from '../fields/pivot-field';\nimport { itemKeysEqual, publicKeyId, type PivotItemKey } from '../items/item-key';\nimport { elementAt } from '../must';\nimport { resolveOptions, type PivotOptions } from '../report/labels';\nimport { valueCaptions } from '../report/report';\nimport { compareOrdinalIgnoringCase, isWhiteSpaceOnly } from '../text/casing';\nimport type { PivotAggregation, PivotArea, PivotAxis, PivotReportForm } from './pivot-enums';\nimport {\n createPivotFieldPlacement, createPivotValueField, isItemCollapsed, placementOf, placementsIn, pivotSort, sortsEqual, withLayout,\n withPlacement, type PivotFieldPlacement, type PivotLayout, type PivotSort, type PivotValueField, type PivotValueFieldInput,\n} from './pivot-layout';\n\n/** A placed entry of an Area, as the Field List shows it (ADR-0061): a field in Filters, Rows or Columns,\n * a Value Field, or \u03A3 Values, whose index is \u22121 and which stands last in its Area. */\nexport interface PivotEntry {\n /** The Area it stands in. */\n readonly area: PivotArea;\n /** Its index in that Area's list; \u22121 for \u03A3 Values. */\n readonly index: number;\n}\n\n/** \u03A3 Values, standing in the Area its axis names. */\nexport function valuesPseudoField(axis: PivotAxis): PivotEntry {\n return Object.freeze({ area: axis === 'rows' ? 'rows' : 'columns', index: -1 });\n}\n\n/** Whether an entry is \u03A3 Values. */\nexport function isValuesPseudoField(entry: PivotEntry): boolean {\n return entry.index === -1;\n}\n\n/** What the Field List reads of a field: its name, caption and declared type. */\nexport type PivotFieldInfo = Pick<PivotField, 'name' | 'caption' | 'type'>;\n\n/** Why the Field List refused an edit (ADR-0060/0061). */\nexport type PivotRefusal = 'hidesEveryItem' | 'captionTaken' | 'captionEmpty' | 'numberFormatInvalid';\n\n/** An edit that may be refused: the layout it produced, or the unchanged layout and why not. */\nexport interface PivotEditResult {\n /** The new layout, or the one given when refused. */\n readonly layout: PivotLayout;\n /** Why the edit was refused. */\n readonly refusal?: PivotRefusal;\n}\n\nconst refusalWords: Readonly<Record<PivotRefusal, string>> = Object.freeze({\n hidesEveryItem: 'refused-hides-every-item',\n captionTaken: 'refused-caption-taken',\n captionEmpty: 'refused-caption-empty',\n numberFormatInvalid: 'refused-number-format',\n});\n\n/** The id of a refusal's sentence among the report's words. */\nexport function refusalWord(refusal: PivotRefusal): string {\n return refusalWords[refusal];\n}\n\nfunction made(layout: PivotLayout): PivotEditResult {\n return Object.freeze({ layout });\n}\n\nfunction refused(layout: PivotLayout, refusal: PivotRefusal): PivotEditResult {\n return Object.freeze({ layout, refusal });\n}\n\n/**\n * One choice of the Layout menu on the Pivot Toolbar (ADR-0061): Excel's Design tab settings, under\n * Excel's names, in Excel's order \u2014 Subtotals, Grand Totals, then Report Layout. Excel's Blank Rows is left\n * out: the engine has no blank row.\n */\nexport type PivotLayoutChoice =\n | 'doNotShowSubtotals' | 'showSubtotalsAtBottom' | 'showSubtotalsAtTop'\n | 'grandTotalsOff' | 'grandTotalsOn' | 'grandTotalsOnRowsOnly' | 'grandTotalsOnColumnsOnly'\n | 'compactForm' | 'outlineForm' | 'tabularForm' | 'repeatItemLabels' | 'doNotRepeatItemLabels';\n\n/** The Layout menu's choices, in Excel's order. */\nexport const pivotLayoutChoices: readonly PivotLayoutChoice[] = Object.freeze([\n 'doNotShowSubtotals', 'showSubtotalsAtBottom', 'showSubtotalsAtTop',\n 'grandTotalsOff', 'grandTotalsOn', 'grandTotalsOnRowsOnly', 'grandTotalsOnColumnsOnly',\n 'compactForm', 'outlineForm', 'tabularForm', 'repeatItemLabels', 'doNotRepeatItemLabels',\n]);\n\n/** The Aggregation a new Value Field of a field takes: Sum for a field declared Number, Count for any\n * other (ADR-0060). */\nexport function defaultAggregation(field: PivotFieldInfo): PivotAggregation {\n return field.type === 'number' ? 'sum' : 'count';\n}\n\nfunction newValue(field: string, aggregation: PivotAggregation): PivotValueField {\n return createPivotValueField({ field, aggregation });\n}\n\n/** Ticking a field (ADR-0061): one standing nowhere goes to the end of Values when it is declared Number,\n * and to the end of Rows otherwise. A field already standing somewhere is left where it is. */\nexport function tickField(layout: PivotLayout, field: PivotFieldInfo): PivotLayout {\n if (placementOf(layout, field.name) !== undefined || layout.values.some(v => v.field === field.name)) return layout;\n return field.type === 'number'\n ? withLayout(layout, { values: Object.freeze([...layout.values, newValue(field.name, defaultAggregation(field))]) })\n : withLayout(layout, { rows: Object.freeze([...layout.rows, createPivotFieldPlacement(field.name)]) });\n}\n\n/** Unticking a field: it leaves every Area it stands in, each of its Value Fields included (ADR-0061). */\nexport function untickField(layout: PivotLayout, field: string): PivotLayout {\n let result = withLayout(layout, {\n filters: Object.freeze(layout.filters.filter(p => p.field !== field)),\n rows: Object.freeze(layout.rows.filter(p => p.field !== field)),\n columns: Object.freeze(layout.columns.filter(p => p.field !== field)),\n });\n for (let i = result.values.length - 1; i >= 0; i--) {\n if (elementAt(result.values, i).field === field) result = removeValue(result, i);\n }\n return same(layout, result) ? layout : result;\n}\n\n/** A field dropped from the list of fields on an Area at `index` (ADR-0061): in Values it is a new Value\n * Field, whatever else it stands in; in Filters, Rows or Columns it is placed there, moving out of\n * whichever of them it stood in, with its settings. */\nexport function placeField(layout: PivotLayout, field: PivotFieldInfo, area: PivotArea, index: number): PivotLayout {\n if (area === 'values') return insertValue(layout, newValue(field.name, defaultAggregation(field)), index);\n checkArea(area);\n const at = placementOf(layout, field.name);\n if (at !== undefined) return moveEntry(layout, at, area, index, field);\n return insert(layout, area, createPivotFieldPlacement(field.name), index);\n}\n\n/**\n * A placed entry dropped on an Area at `index` (ADR-0061). Within its own Area it is a reorder. A field\n * moving between Filters, Rows and Columns keeps its settings; one moving to Values leaves its Area and\n * becomes a Value Field; a Value Field moving to another Area leaves Values and its field is placed there.\n * \u03A3 Values moves between Rows and Columns only \u2014 anywhere else it stays \u2014 and always stands last. `field`\n * is the dragged entry's field, whose declared type decides a new Value Field's Aggregation; it is not read\n * for \u03A3 Values.\n */\nexport function moveEntry(layout: PivotLayout, entry: PivotEntry, area: PivotArea, index: number, field: PivotFieldInfo | undefined): PivotLayout {\n if (isValuesPseudoField(entry)) {\n if (area === 'rows') return layout.valuesAxis === 'rows' ? layout : withLayout(layout, { valuesAxis: 'rows' });\n if (area === 'columns') return layout.valuesAxis === 'columns' ? layout : withLayout(layout, { valuesAxis: 'columns' });\n return layout;\n }\n if (field === undefined) throw new TypeError('A dragged field entry names its field.');\n\n if (entry.area === 'values') {\n checkIndex(layout.values.length, entry.index);\n const value = elementAt(layout.values, entry.index);\n if (field.name !== value.field) throw new TypeError(`The dragged Value Field is '${value.field}', not '${field.name}'.`);\n if (area === 'values') return moveValue(layout, entry.index, index);\n const withoutValue = removeValue(layout, entry.index);\n const placed = placementOf(withoutValue, value.field);\n if (placed !== undefined) return moveEntry(withoutValue, placed, area, index, field);\n return insert(withoutValue, area, createPivotFieldPlacement(value.field), index);\n }\n\n checkArea(entry.area);\n const from = placementsIn(layout, entry.area);\n checkIndex(from.length, entry.index);\n const placement = elementAt(from, entry.index);\n if (field.name !== placement.field) throw new TypeError(`The dragged field is '${placement.field}', not '${field.name}'.`);\n if (area === 'values') {\n const without = replace(layout, entry.area, from.filter((_, i) => i !== entry.index));\n return insertValue(without, newValue(placement.field, defaultAggregation(field)), index);\n }\n checkArea(area);\n if (area === entry.area) {\n const target = clamp(index, from.length);\n if (target === entry.index || target === entry.index + 1) return layout;\n const reordered = from.filter((_, i) => i !== entry.index);\n reordered.splice(target > entry.index ? target - 1 : target, 0, placement);\n return replace(layout, area, reordered);\n }\n const removed = replace(layout, entry.area, from.filter((_, i) => i !== entry.index));\n return insert(removed, area, placement, index);\n}\n\n/** Removing an entry \u2014 Remove Field, or dragging it back to the list of fields (ADR-0061). \u03A3 Values cannot\n * be removed: it leaves when fewer than two Value Fields remain. */\nexport function removeEntry(layout: PivotLayout, entry: PivotEntry): PivotLayout {\n if (isValuesPseudoField(entry)) return layout;\n if (entry.area === 'values') {\n checkIndex(layout.values.length, entry.index);\n return removeValue(layout, entry.index);\n }\n checkArea(entry.area);\n const from = placementsIn(layout, entry.area);\n checkIndex(from.length, entry.index);\n return replace(layout, entry.area, from.filter((_, i) => i !== entry.index));\n}\n\n/**\n * A field's Hidden Items, as Filter\u2026 applies them (ADR-0060/0061): refused when they would hide every one\n * of `items` \u2014 the field's Items in the data \u2014 because a report of nothing reads as \"no data\". A key hidden\n * that no Item carries is kept: it hides the Item if later data brings it.\n */\nexport function setHiddenItems(layout: PivotLayout, field: string, hidden: Iterable<PivotItemKey>, items: readonly PivotItemKey[]): PivotEditResult {\n const set: PivotItemKey[] = [];\n const ids = new Set<string>();\n for (const key of hidden) {\n const id = publicKeyId(key);\n if (ids.has(id)) continue;\n ids.add(id);\n set.push(key);\n }\n if (items.length > 0 && items.every(item => ids.has(publicKeyId(item)))) return refused(layout, 'hidesEveryItem');\n return made(update(layout, field, p => createPivotFieldPlacement({ ...p, hiddenItems: set })));\n}\n\n/** A field's Item order \u2014 Sort A to Z, Z to A, or by a Value Field. */\nexport function setSort(layout: PivotLayout, field: string, sort: PivotSort): PivotLayout {\n const byValue = sort.byValue;\n if (byValue !== undefined && (byValue < 0 || byValue >= layout.values.length)) {\n throw new RangeError(`The layout has ${layout.values.length} Value Fields, and the sort names ${byValue}.`);\n }\n const checked = pivotSort(sort.direction, byValue);\n return update(layout, field, p => (sortsEqual(p.sort, checked) ? p : withPlacement(p, { sort: checked })));\n}\n\n/** A field's subtotals: Automatic (true) or None. */\nexport function setSubtotals(layout: PivotLayout, field: string, subtotals: boolean): PivotLayout {\n return update(layout, field, p => (p.subtotals === subtotals ? p : withPlacement(p, { subtotals })));\n}\n\n/** One Item collapsed or expanded, wherever it appears (ADR-0060). */\nexport function setCollapsed(layout: PivotLayout, field: string, item: PivotItemKey, collapsed: boolean): PivotLayout {\n return update(layout, field, p => {\n if (isItemCollapsed(p, item) === collapsed) return p;\n const toggled = p.toggledItems.some(key => itemKeysEqual(key, item))\n ? p.toggledItems.filter(key => !itemKeysEqual(key, item))\n : [...p.toggledItems, item];\n return createPivotFieldPlacement({ ...p, toggledItems: toggled });\n });\n}\n\n/** Expand or Collapse Entire Field: every Item of the field, with no exception. */\nexport function setFieldCollapsed(layout: PivotLayout, field: string, collapsed: boolean): PivotLayout {\n return update(layout, field, p => (p.collapsed === collapsed && p.toggledItems.length === 0\n ? p\n : withPlacement(p, { collapsed, toggledItems: Object.freeze([]) })));\n}\n\n/**\n * A Value Field's settings, as Value Field Settings\u2026 applies them (ADR-0060/0061): refused when its own\n * caption is empty, or is another Value Field's caption or a Pivot Field's, or when its number format\n * cannot be used. A caption is compared with the captions the report shows, in its words.\n */\nexport function setValueField(layout: PivotLayout, index: number, value: PivotValueFieldInput, fields: readonly PivotField[],\n options?: PivotOptions): PivotEditResult {\n checkIndex(layout.values.length, index);\n const caption = value.caption;\n if (caption !== undefined) {\n if (isWhiteSpaceOnly(caption)) return refused(layout, 'captionEmpty');\n const others = layout.values.filter((_, i) => i !== index);\n const otherCaptions = valueCaptions(others, fieldMetas(fields), resolveOptions(options));\n if (otherCaptions.some(c => compareOrdinalIgnoringCase(c, caption) === 0)\n || fields.some(f => compareOrdinalIgnoringCase(f.caption, caption) === 0)) {\n return refused(layout, 'captionTaken');\n }\n }\n if (value.numberFormat !== undefined && numberFormatProblem(value.numberFormat) !== undefined) return refused(layout, 'numberFormatInvalid');\n const values = [...layout.values];\n values[index] = createPivotValueField(value);\n return made(withLayout(layout, { values: Object.freeze(values) }));\n}\n\n/**\n * Each Value Field's caption as the Field List shows it in Values, and the report heads its columns (ADR-0060):\n * its own caption, or the default in the report's words, `Sum of Amount`, numbered to stay unique. A layout\n * not yet answered is captioned as the report will caption it.\n */\nexport function pivotValueCaptions(layout: PivotLayout, fields: readonly PivotField[], options?: PivotOptions): readonly string[] {\n return valueCaptions(layout.values, fieldMetas(fields), resolveOptions(options));\n}\n\n// ---- The Layout menu (ADR-0061) -----------------------------------------------------------------\n\n/**\n * A Layout menu choice applied (ADR-0061), as Excel's Design tab applies it. The Subtotals choices set\n * every field in Rows and Columns \u2014 Automatic, or None \u2014 and, for the two that show them, where they stand;\n * the Grand Totals choices set the two switches; the Report Layout choices set the form, or whether the\n * Outline and Tabular forms repeat their outer Items' labels. Everything else in the layout is kept, and a\n * choice that changes nothing returns the layout it was given.\n */\nexport function chooseLayout(layout: PivotLayout, choice: PivotLayoutChoice): PivotLayout {\n switch (choice) {\n case 'doNotShowSubtotals': return withSubtotals(layout, false);\n case 'showSubtotalsAtBottom': return withSubtotalsAt(withSubtotals(layout, true), false);\n case 'showSubtotalsAtTop': return withSubtotalsAt(withSubtotals(layout, true), true);\n case 'grandTotalsOff': return withGrandTotals(layout, false, false);\n case 'grandTotalsOn': return withGrandTotals(layout, true, true);\n case 'grandTotalsOnRowsOnly': return withGrandTotals(layout, false, true);\n case 'grandTotalsOnColumnsOnly': return withGrandTotals(layout, true, false);\n case 'compactForm': return withForm(layout, 'compact');\n case 'outlineForm': return withForm(layout, 'outline');\n case 'tabularForm': return withForm(layout, 'tabular');\n case 'repeatItemLabels': return layout.repeatItemLabels ? layout : withLayout(layout, { repeatItemLabels: true });\n case 'doNotRepeatItemLabels': return layout.repeatItemLabels ? withLayout(layout, { repeatItemLabels: false }) : layout;\n default: throw new RangeError(`Unknown PivotLayoutChoice (${String(choice satisfies never)}).`);\n }\n}\n\n/**\n * Whether a choice is what the report shows now \u2014 the Layout menu marks it (ADR-0061). Read from what is\n * painted: in the Tabular form, which puts every subtotal at the bottom, Show at Bottom is the current\n * Subtotals choice whatever the layout's setting; in the Compact form, which has no outer label columns,\n * neither label choice is. With no field in Rows or Columns no Subtotals choice is current, and with fields\n * that disagree, none is.\n */\nexport function isLayoutChosen(layout: PivotLayout, choice: PivotLayoutChoice): boolean {\n const fields = axisFields(layout);\n const atTop = subtotalsShownAtTop(layout);\n switch (choice) {\n case 'doNotShowSubtotals': return fields.length > 0 && fields.every(p => !p.subtotals);\n case 'showSubtotalsAtBottom': return fields.length > 0 && fields.every(p => p.subtotals) && !atTop;\n case 'showSubtotalsAtTop': return fields.length > 0 && fields.every(p => p.subtotals) && atTop;\n case 'grandTotalsOff': return !layout.grandTotalRow && !layout.grandTotalColumn;\n case 'grandTotalsOn': return layout.grandTotalRow && layout.grandTotalColumn;\n case 'grandTotalsOnRowsOnly': return !layout.grandTotalRow && layout.grandTotalColumn;\n case 'grandTotalsOnColumnsOnly': return layout.grandTotalRow && !layout.grandTotalColumn;\n case 'compactForm': return layout.form === 'compact';\n case 'outlineForm': return layout.form === 'outline';\n case 'tabularForm': return layout.form === 'tabular';\n case 'repeatItemLabels': return layout.form !== 'compact' && layout.repeatItemLabels;\n case 'doNotRepeatItemLabels': return layout.form !== 'compact' && !layout.repeatItemLabels;\n default: throw new RangeError(`Unknown PivotLayoutChoice (${String(choice satisfies never)}).`);\n }\n}\n\n/**\n * Whether a choice would change what the report shows (ADR-0061): the Layout menu disables one that would\n * not. The current choice never would. Nor would a Subtotals choice with no field in Rows or Columns, Show\n * at Top in the Tabular form, nor a label choice in the Compact form.\n */\nexport function layoutChoiceChanges(layout: PivotLayout, choice: PivotLayoutChoice): boolean {\n const fields = axisFields(layout);\n const someOff = fields.some(p => !p.subtotals);\n const atTop = subtotalsShownAtTop(layout);\n switch (choice) {\n case 'doNotShowSubtotals': return fields.some(p => p.subtotals);\n case 'showSubtotalsAtBottom': return fields.length > 0 && (someOff || atTop);\n case 'showSubtotalsAtTop': return fields.length > 0 && layout.form !== 'tabular' && (someOff || !atTop);\n case 'repeatItemLabels': return layout.form !== 'compact' && !layout.repeatItemLabels;\n case 'doNotRepeatItemLabels': return layout.form !== 'compact' && layout.repeatItemLabels;\n case 'grandTotalsOff':\n case 'grandTotalsOn':\n case 'grandTotalsOnRowsOnly':\n case 'grandTotalsOnColumnsOnly':\n case 'compactForm':\n case 'outlineForm':\n case 'tabularForm': return !isLayoutChosen(layout, choice);\n default: throw new RangeError(`Unknown PivotLayoutChoice (${String(choice satisfies never)}).`);\n }\n}\n\nfunction axisFields(layout: PivotLayout): readonly PivotFieldPlacement[] {\n return [...layout.rows, ...layout.columns];\n}\n\n// Where subtotals are painted: at the top only outside the Tabular form (ADR-0060).\nfunction subtotalsShownAtTop(layout: PivotLayout): boolean {\n return layout.subtotalsAtTop && layout.form !== 'tabular';\n}\n\nfunction withSubtotals(layout: PivotLayout, subtotals: boolean): PivotLayout {\n if (axisFields(layout).every(p => p.subtotals === subtotals)) return layout;\n const set = (placements: readonly PivotFieldPlacement[]): readonly PivotFieldPlacement[] =>\n Object.freeze(placements.map(p => (p.subtotals === subtotals ? p : withPlacement(p, { subtotals }))));\n return withLayout(layout, { rows: set(layout.rows), columns: set(layout.columns) });\n}\n\nfunction withSubtotalsAt(layout: PivotLayout, atTop: boolean): PivotLayout {\n return layout.subtotalsAtTop === atTop ? layout : withLayout(layout, { subtotalsAtTop: atTop });\n}\n\nfunction withGrandTotals(layout: PivotLayout, row: boolean, column: boolean): PivotLayout {\n return layout.grandTotalRow === row && layout.grandTotalColumn === column\n ? layout\n : withLayout(layout, { grandTotalRow: row, grandTotalColumn: column });\n}\n\nfunction withForm(layout: PivotLayout, form: PivotReportForm): PivotLayout {\n return layout.form === form ? layout : withLayout(layout, { form });\n}\n\n// ---- The parts ----------------------------------------------------------------------------------\n\nfunction clamp(index: number, count: number): number {\n return Math.min(Math.max(index, 0), count);\n}\n\nfunction insert(layout: PivotLayout, area: PivotArea, placement: PivotFieldPlacement, index: number): PivotLayout {\n const list = [...placementsIn(layout, area)];\n list.splice(clamp(index, list.length), 0, placement);\n return replace(layout, area, list);\n}\n\nfunction insertValue(layout: PivotLayout, value: PivotValueField, index: number): PivotLayout {\n const at = clamp(index, layout.values.length);\n const values = [...layout.values];\n values.splice(at, 0, value);\n // Value Fields at and after the insertion moved one along; an order by one follows it.\n return remap(withLayout(layout, { values: Object.freeze(values) }), old => (old >= at ? old + 1 : old));\n}\n\nfunction moveValue(layout: PivotLayout, from: number, index: number): PivotLayout {\n const target = clamp(index, layout.values.length);\n if (target === from || target === from + 1) return layout;\n const values = [...layout.values];\n const [moving] = values.splice(from, 1);\n if (moving === undefined) throw new Error('Internal: the moved Value Field was checked to stand in Values.');\n const to = target > from ? target - 1 : target;\n values.splice(to, 0, moving);\n return remap(withLayout(layout, { values: Object.freeze(values) }), old => {\n if (old === from) return to;\n if (from < to && old > from && old <= to) return old - 1;\n if (to < from && old >= to && old < from) return old + 1;\n return old;\n });\n}\n\nfunction removeValue(layout: PivotLayout, index: number): PivotLayout {\n const values = Object.freeze(layout.values.filter((_, i) => i !== index));\n // An order by the removed Value Field falls back to its label, in the same direction.\n return remap(withLayout(layout, { values }), old => (old === index ? undefined : old > index ? old - 1 : old));\n}\n\nfunction remap(layout: PivotLayout, map: (old: number) => number | undefined): PivotLayout {\n const mapped = (placements: readonly PivotFieldPlacement[]): readonly PivotFieldPlacement[] => Object.freeze(placements.map(p => {\n const old = p.sort.byValue;\n return old === undefined ? p : withPlacement(p, { sort: pivotSort(p.sort.direction, map(old)) });\n }));\n return withLayout(layout, { filters: mapped(layout.filters), rows: mapped(layout.rows), columns: mapped(layout.columns) });\n}\n\nfunction update(layout: PivotLayout, field: string, change: (placement: PivotFieldPlacement) => PivotFieldPlacement): PivotLayout {\n const at = placementOf(layout, field);\n if (at === undefined) throw new TypeError(`'${field}' stands in none of Filters, Rows and Columns.`);\n const placements = [...placementsIn(layout, at.area)];\n const before = elementAt(placements, at.index);\n const changed = change(before);\n if (changed === before) return layout;\n placements[at.index] = changed;\n return replace(layout, at.area, placements);\n}\n\nfunction replace(layout: PivotLayout, area: PivotArea, placements: readonly PivotFieldPlacement[]): PivotLayout {\n const frozen = Object.freeze([...placements]);\n switch (area) {\n case 'filters': return withLayout(layout, { filters: frozen });\n case 'rows': return withLayout(layout, { rows: frozen });\n case 'columns': return withLayout(layout, { columns: frozen });\n case 'values': throw new RangeError('Filters, Rows or Columns.');\n default: throw new RangeError(`Unknown PivotArea (${String(area satisfies never)}).`);\n }\n}\n\nfunction sameList<T>(one: readonly T[], other: readonly T[]): boolean {\n return one.length === other.length && one.every((item, i) => item === other[i]);\n}\n\nfunction same(one: PivotLayout, other: PivotLayout): boolean {\n return sameList(one.filters, other.filters) && sameList(one.rows, other.rows)\n && sameList(one.columns, other.columns) && sameList(one.values, other.values);\n}\n\nfunction checkArea(area: PivotArea): void {\n if (area !== 'filters' && area !== 'rows' && area !== 'columns') throw new RangeError(`Filters, Rows or Columns, not ${area}.`);\n}\n\nfunction checkIndex(count: number, index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= count) throw new RangeError(`The Area holds ${count} entries, and ${index} is none of them.`);\n}\n", "// A Pivot Source (ADR-0066): what answers a report's questions \u2014 the Leaf Aggregates of a question, a page\n// of a field's Items, a page of the records behind a cell \u2014 under a Source Version, or refuses by name.\n// The bundled sources answer over a Snapshot, or over records in memory read into one; a Consumer's own\n// source fetches its answers from a server. Every source refuses the same things the same way: a field it\n// does not have, and a part only Aggregations it does not offer read. The C# engine's PivotSource,\n// SnapshotPivotSource, RecordPivotSource, FetchingPivotSource and their pages.\n\nimport { applyChangeBatch, type ChangeBatch, type Snapshot, type SnapshotChange, type SnapshotDecimal } from '@ex-grid/data';\nimport { partsOf } from '../aggregates/parts';\nimport { PivotAnswer, PivotRefusals, type PivotSourceRefusal } from '../cube/answer';\nimport { partBits, placedFields, queriesEqual, type PivotDetailsQuery, type PivotItemsQuery, type PivotQuery } from '../cube/query';\nimport { declaredFields, type PivotField, type PivotRecordField } from '../fields/pivot-field';\nimport { compareInvariant, fromPublicKey, keyIdOf, toPublicKey, type ItemKey, type PivotItemKey } from '../items/item-key';\nimport { readRecordValue } from '../items/record-value';\nimport { pivotAggregations, type PivotAggregation } from '../layout/pivot-enums';\nimport { defined, elementAt, unreachable } from '../must';\nimport { foldedText } from '../text/casing';\nimport { AggregationPass, chunkRows, itemsOfField, itemsOfFieldSteps } from './aggregation-pass';\nimport { Slicer, checkedSlicing, runWhole, type CheckedSlicing, type PivotSlicing } from './slicing';\nimport { levelAnswerSteps } from '../levels/level-answers';\nimport { bindSnapshot, detailAt, itemKeyAt, recordSnapshot, type FieldBinding } from './binding';\nimport { checkBatchRecords, foldServerBatches, type ServerBatch } from './server-batches';\n\n// ---- What a source offers -----------------------------------------------------------------------\n\n/** The Aggregations a source answers, whether it can be refreshed, and whether it counts its fields' Items. */\nexport class PivotSourceFeatures {\n /** Every Aggregation, in the declared order. */\n static readonly all: PivotSourceFeatures = new PivotSourceFeatures(pivotAggregations);\n\n /** The Aggregations offered, in the declared order. */\n readonly aggregations: readonly PivotAggregation[];\n /** Whether Refresh asks the source again. */\n readonly canRefresh: boolean;\n /** Whether the source answers each field's count of Items ({@link PivotSource.itemCounts}, ADR-0370\n * section 3): the report then asks it once when the source is opened and again under a new Source\n * Version. */\n readonly countsItems: boolean;\n /** Whether the source answers a question carrying levels whose leaves pass its cap with the cells of the\n * groups shown ({@link PivotAnswer.isLevels}, ADR-0370 section 3): a report source over it then asks with the\n * groups its layout shows, and again when an expand shows groups the answer did not hold. */\n readonly answersLevels: boolean;\n\n /** The features of the Aggregations given, refusing one the engine does not know. */\n constructor(aggregations: Iterable<PivotAggregation>, canRefresh = false, countsItems = false, answersLevels = false) {\n const offered = new Set<PivotAggregation>();\n for (const aggregation of aggregations) {\n if (!pivotAggregations.includes(aggregation)) throw new RangeError(`Unknown PivotAggregation (${aggregation}).`);\n offered.add(aggregation);\n }\n this.aggregations = Object.freeze(pivotAggregations.filter(a => offered.has(a)));\n this.canRefresh = canRefresh;\n this.countsItems = countsItems;\n this.answersLevels = answersLevels;\n Object.freeze(this);\n }\n\n /** Whether the source answers an Aggregation. */\n offers(aggregation: PivotAggregation): boolean {\n return this.aggregations.includes(aggregation);\n }\n\n /** The Aggregations that read a part, when the source offers none of them; empty otherwise. */\n missingFor(part: number): readonly PivotAggregation[] {\n const readers = pivotAggregations.filter(a => partsOf(a) === part);\n return readers.some(a => this.offers(a)) ? [] : readers;\n }\n}\n\n// ---- The pages ----------------------------------------------------------------------------------\n\nfunction refusedError(what: string, refusal: PivotSourceRefusal): Error {\n return new Error(`The source refused to ${what}: ${refusal.message}`);\n}\n\n/** A page of a field's Items (ADR-0066), under the Source Version they were listed at, or a refusal. */\nexport class PivotItemPage {\n /** The refusal, when the source refused. */\n readonly refusal: PivotSourceRefusal | undefined;\n readonly #sourceVersion: string | undefined;\n readonly #items: readonly PivotItemKey[];\n readonly #total: number;\n\n private constructor(sourceVersion: string | undefined, items: readonly PivotItemKey[], total: number, refusal: PivotSourceRefusal | undefined) {\n this.#sourceVersion = sourceVersion;\n this.#items = items;\n this.#total = total;\n this.refusal = refusal;\n Object.freeze(this);\n }\n\n /** A page: the Items listed, and how many match in all. */\n static of(sourceVersion: string, items: readonly PivotItemKey[], total: number): PivotItemPage {\n if (typeof sourceVersion !== 'string') throw new TypeError('A page names its Source Version.');\n if (!Number.isSafeInteger(total)) throw new TypeError(`A page counts its Items in a whole number, not ${total}.`);\n if (total < items.length) throw new RangeError(`A page of ${items.length} Items has at least that many in total.`);\n return new PivotItemPage(sourceVersion, Object.freeze([...items]), total, undefined);\n }\n\n /** The source's refusal to list the Items. */\n static refused(refusal: PivotSourceRefusal): PivotItemPage {\n return new PivotItemPage(undefined, [], 0, refusal);\n }\n\n /** Whether the source refused. */\n get isRefused(): boolean {\n return this.refusal !== undefined;\n }\n\n /** The Source Version the Items were listed at. */\n get sourceVersion(): string {\n if (this.refusal !== undefined) throw refusedError('list Items', this.refusal);\n return defined(this.#sourceVersion, 'a page that was not refused has a Source Version');\n }\n\n /** The Items listed. */\n get items(): readonly PivotItemKey[] {\n if (this.refusal !== undefined) throw refusedError('list Items', this.refusal);\n return this.#items;\n }\n\n /** How many Items match in all, the listed ones included. */\n get total(): number {\n if (this.refusal !== undefined) throw refusedError('list Items', this.refusal);\n return this.#total;\n }\n}\n\n/** A value a record behind a cell carries: text, an exact number, a double, a date by its clock ticks, a\n * Boolean, or `null` for a Blank. A date part is the part's number. */\nexport type PivotDetailValue = string | SnapshotDecimal | number | bigint | boolean | null;\n\n/** One record behind a cell: each field's value, in the page's field order, and the Consumer's record where\n * the source holds one. */\nexport interface PivotDetailRecord {\n /** Each field's value, in the page's field order. */\n readonly values: readonly PivotDetailValue[];\n /** The Consumer's record, where the source holds one. */\n readonly record?: unknown;\n}\n\n/** A page of the records behind a cell (ADR-0063/0066), or a refusal. */\nexport class PivotDetailPage {\n /** The refusal, when the source refused. */\n readonly refusal: PivotSourceRefusal | undefined;\n readonly #sourceVersion: string | undefined;\n readonly #fields: readonly PivotField[];\n readonly #start: number;\n readonly #total: number;\n readonly #records: readonly PivotDetailRecord[];\n\n private constructor(sourceVersion: string | undefined, fields: readonly PivotField[], start: number, total: number,\n records: readonly PivotDetailRecord[], refusal: PivotSourceRefusal | undefined) {\n this.#sourceVersion = sourceVersion;\n this.#fields = fields;\n this.#start = start;\n this.#total = total;\n this.#records = records;\n this.refusal = refusal;\n Object.freeze(this);\n }\n\n /** A page: the fields, where it starts, how many records there are in all, and the records. */\n static of(sourceVersion: string, fields: readonly PivotField[], start: number, total: number, records: readonly PivotDetailRecord[]): PivotDetailPage {\n if (typeof sourceVersion !== 'string') throw new TypeError('A page names its Source Version.');\n if (!Number.isSafeInteger(start) || start < 0) throw new RangeError(`A page starts at a record from 0, not ${start}.`);\n if (!Number.isSafeInteger(total) || total < 0) throw new RangeError(`A page counts at least no record, not ${total}.`);\n if (records.length > 0 && start + records.length > total) {\n throw new RangeError(`A page of ${records.length} records from ${start} needs at least ${start + records.length} in total.`);\n }\n const copied = records.map(record => {\n if (record.values.length !== fields.length) {\n throw new TypeError(`A record carries ${record.values.length} values, and the page has ${fields.length} fields.`);\n }\n const values = Object.freeze([...record.values]);\n return Object.freeze(record.record === undefined ? { values } : { values, record: record.record });\n });\n return new PivotDetailPage(sourceVersion, Object.freeze([...fields]), start, total, Object.freeze(copied), undefined);\n }\n\n /** The source's refusal to show the records. */\n static refused(refusal: PivotSourceRefusal): PivotDetailPage {\n return new PivotDetailPage(undefined, [], 0, 0, [], refusal);\n }\n\n /** Whether the source refused. */\n get isRefused(): boolean {\n return this.refusal !== undefined;\n }\n\n /** The Source Version the records were read at. */\n get sourceVersion(): string {\n if (this.refusal !== undefined) throw refusedError('show the records', this.refusal);\n return defined(this.#sourceVersion, 'a page that was not refused has a Source Version');\n }\n\n /** The fields each record carries a value of, in order. */\n get fields(): readonly PivotField[] {\n if (this.refusal !== undefined) throw refusedError('show the records', this.refusal);\n return this.#fields;\n }\n\n /** The place of the page's first record among all of them. */\n get start(): number {\n if (this.refusal !== undefined) throw refusedError('show the records', this.refusal);\n return this.#start;\n }\n\n /** How many records are behind the cell in all. */\n get total(): number {\n if (this.refusal !== undefined) throw refusedError('show the records', this.refusal);\n return this.#total;\n }\n\n /** The page's records. */\n get records(): readonly PivotDetailRecord[] {\n if (this.refusal !== undefined) throw refusedError('show the records', this.refusal);\n return this.#records;\n }\n}\n\n/**\n * Each field's count of Items, under the Source Version it was counted at (ADR-0370 section 3): what a\n * server's source answers when its features declare {@link PivotSourceFeatures.countsItems}, so that the\n * Field List shows the count beside a field and a layout's leaves are bounded before it is asked\n * ({@link pivotLeafBound}). A field the source did not count is absent, never zero.\n */\nexport class PivotItemCounts {\n /** The Source Version the Items were counted at. */\n readonly sourceVersion: string;\n /** Each counted field's count of Items, by the field's name. */\n readonly counts: ReadonlyMap<string, number>;\n\n /** The counts of a Source Version, refusing a count that is not a whole number of at least 0. */\n constructor(sourceVersion: string, counts: Iterable<readonly [string, number]>) {\n if (typeof sourceVersion !== 'string') throw new TypeError('A Source Version is text.');\n const read = new Map<string, number>();\n for (const [field, count] of counts) {\n if (typeof field !== 'string' || field.length === 0) throw new TypeError('A counted field is named.');\n if (!Number.isSafeInteger(count)) throw new TypeError(`A field has a whole number of Items; '${field}' was counted ${count}.`);\n if (count < 0) throw new RangeError(`A field has no fewer than 0 Items; '${field}' was counted ${count}.`);\n if (read.has(field)) throw new TypeError(`The field '${field}' is counted twice.`);\n read.set(field, count);\n }\n this.sourceVersion = sourceVersion;\n this.counts = read;\n Object.freeze(this);\n }\n\n /** The field's count of Items, or `undefined` when the source did not count it. */\n countOf(field: string): number | undefined {\n return this.counts.get(field);\n }\n}\n\n// ---- The source ---------------------------------------------------------------------------------\n\n/** What a report asks its data (ADR-0066). Each question is answered under a Source Version, or refused. */\nexport interface PivotSource {\n /** The fields the source has. */\n readonly fields: readonly PivotField[];\n /** The Aggregations it answers. */\n readonly features: PivotSourceFeatures;\n /** The Leaf Aggregates of a question. */\n aggregate(query: PivotQuery, signal?: AbortSignal): Promise<PivotAnswer>;\n /** A page of a field's Items over all the data. */\n items(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage>;\n /** A page of the records behind a cell. */\n details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage>;\n /** Each field's count of Items now (ADR-0370 section 3), asked of a source whose features declare\n * {@link PivotSourceFeatures.countsItems}. The bundled sources answer it, for a server that answers from\n * one, and do not declare it: in the page, a layout past the cap is refused as soon as a count would be\n * known. */\n itemCounts?(signal?: AbortSignal): Promise<PivotItemCounts>;\n /** Tells `listener` each time the source's data moves on (ADR-0067, ADR-0370 section 3); the function\n * returned stops telling it. A source whose data never moves has none. */\n subscribe?(listener: (changed: PivotSourceChanged) => void): () => void;\n /** Refresh: lets go of whatever the source holds for its questions, so the next one is asked of its data.\n * A source that holds nothing past its data has none; a source that wraps another passes it on. */\n refresh?(): void;\n}\n\nfunction knows(fields: readonly PivotField[], name: string): boolean {\n return fields.some(field => field.name === name);\n}\n\n/** What every source refuses of a question, the same way: a field it does not have, and a part that only\n * Aggregations it does not offer read. */\nexport function queryRefusal(fields: readonly PivotField[], features: PivotSourceFeatures, query: PivotQuery): PivotSourceRefusal | undefined {\n for (const field of placedFields(query)) {\n if (!knows(fields, field.field)) return PivotRefusals.unknownField(field.field);\n }\n for (const value of query.values) {\n if (!knows(fields, value.field)) return PivotRefusals.unknownField(value.field);\n const parts = partBits(value.parts);\n for (const part of [1, 2, 4, 8]) {\n if ((parts & part) === 0) continue;\n const missing = features.missingFor(part);\n if (missing.length > 0) return PivotRefusals.aggregationNotOffered(value.field, missing);\n }\n }\n return undefined;\n}\n\n/** What every source refuses of a question for Items: a field it does not have. */\nexport function itemsRefusal(fields: readonly PivotField[], query: PivotItemsQuery): PivotSourceRefusal | undefined {\n return knows(fields, query.field) ? undefined : PivotRefusals.unknownField(query.field);\n}\n\n/** What every source refuses of a question for records: a field it does not have. */\nexport function detailsRefusal(fields: readonly PivotField[], query: PivotDetailsQuery): PivotSourceRefusal | undefined {\n for (const field of [...query.rowItems.map(i => i.field), ...query.columnItems.map(i => i.field), ...query.hiddenItems.map(h => h.field)]) {\n if (!knows(fields, field)) return PivotRefusals.unknownField(field);\n }\n return undefined;\n}\n\nfunction aborted(signal: AbortSignal | undefined): void {\n signal?.throwIfAborted();\n}\n\nfunction newIdentity(): string {\n return globalThis.crypto.randomUUID().replaceAll('-', '');\n}\n\n// A page of a field's Items: those whose text holds the search under OrdinalIgnoreCase, as C#'s Contains\n// finds it (the long s is not an s), in the invariant order, the first `max` of them.\nfunction itemPage(keys: readonly ItemKey[], query: PivotItemsQuery, sourceVersion: string): PivotItemPage {\n const search = query.search === undefined ? undefined : foldedText(query.search);\n const matches = search === undefined ? keys : keys.filter(key => {\n const value = toPublicKey(key).value;\n return value !== undefined && foldedText(value).includes(search);\n });\n const sorted = matches.toSorted(compareInvariant);\n return PivotItemPage.of(sourceVersion, sorted.slice(0, query.max).map(toPublicKey), sorted.length);\n}\n\n// The rows behind a cell, in the Snapshot's order: those carrying every Item of the paths and no Hidden\n// Item; the page's positions, and how many there are in all. It yields after each chunk of rows.\nfunction* rowsBehindSteps(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>, query: PivotDetailsQuery): Generator<void, { readonly rows: readonly number[]; readonly total: number }> {\n const bound = (field: string): FieldBinding => defined(bindings.get(field), `the field '${field}' is bound`);\n const conditions = [...query.rowItems, ...query.columnItems].map(step => ({ binding: bound(step.field), id: keyIdOf(fromPublicKey(step.item)) }));\n const hidden = query.hiddenItems.filter(h => h.hiddenItems.length > 0)\n .map(h => ({ binding: bound(h.field), ids: new Set(h.hiddenItems.map(key => keyIdOf(fromPublicKey(key)))) }));\n const rows: number[] = [];\n let total = 0;\n for (let row = 0; row < snapshot.rowCount; row++) {\n if (row % chunkRows === chunkRows - 1) yield;\n if (!conditions.every(c => keyIdOf(itemKeyAt(c.binding, row)) === c.id)) continue;\n if (hidden.some(h => h.ids.has(keyIdOf(itemKeyAt(h.binding, row))))) continue;\n if (total >= query.start && total - query.start < query.count) rows.push(row);\n total++;\n }\n return { rows, total };\n}\n\nfunction rowsBehind(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>, query: PivotDetailsQuery): { readonly rows: readonly number[]; readonly total: number } {\n return runWhole(rowsBehindSteps(snapshot, bindings, query));\n}\n\n/** What a source says when its data moved on (ADR-0067): the Source Version it answers under now. */\nexport interface PivotSourceChanged {\n /** The Source Version the source answers under from now; absent where the source does not know it yet,\n * as a server's notice may not, and the next answer carries it. A source over a Snapshot always knows it. */\n readonly sourceVersion?: string;\n}\n\n// A version a source answers under, and its fields' bindings to that version's columns.\ninterface Bound {\n readonly snapshot: Snapshot;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n}\n\n// The pass a source holds for the question it answered last, which batches are folded into; and the\n// batches applied while an answer was being assembled from it, to fold in once none is.\ninterface HeldPass {\n readonly pass: AggregationPass;\n assembling: number;\n readonly deferred: { readonly change: SnapshotChange; readonly bindings: ReadonlyMap<string, FieldBinding> }[];\n}\n\nlet aggregateOn: (source: SnapshotPivotSource, query: PivotQuery, slicer: Slicer) => Promise<PivotAnswer>;\n\n/** A source over a Snapshot asked a question on another's slices: a report source's pass, cube and report\n * share one Slicer, so the work yields only where a slice is spent, as the C# engine's does. */\nexport function aggregateSliced(source: SnapshotPivotSource, query: PivotQuery, slicer: Slicer): Promise<PivotAnswer> {\n return aggregateOn(source, query, slicer);\n}\n\n/** A Snapshot the source answers from, its fields' bindings, and the Source Version it answers under. */\nexport interface BoundSnapshot {\n readonly snapshot: Snapshot;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n readonly version: string;\n}\n\n/** What a report's computation reads of a Snapshot's source, which keeps its own pass (ADR-0153): not part of\n * the public surface. */\nexport interface SnapshotSourceLink {\n /** The Snapshot the source answers from now. */\n capture(): BoundSnapshot;\n /** Tells `listener` each Change Batch the source applies, with the next version's bindings, before its\n * subscribers are told; the function returned stops it. */\n watch(listener: (change: SnapshotChange, bindings: ReadonlyMap<string, FieldBinding>) => void): () => void;\n /** Keeps answering Items and records under the version a computation published. */\n remember(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>): void;\n /** The Source Version of a Snapshot of the source. */\n versionOf(snapshot: Snapshot): string;\n}\n\nlet linkOf: (source: SnapshotPivotSource) => SnapshotSourceLink;\n\n/** The link a report's computation keeps to a Snapshot's source. */\nexport function snapshotSourceLink(source: SnapshotPivotSource): SnapshotSourceLink {\n return linkOf(source);\n}\n\n/**\n * The bundled source over a Snapshot (ADR-0066): it answers every Aggregation under the version\n * `{identity}:{snapshot version}`, in slices (PV-40).\n *\n * **Live data** (ADR-0067): {@link SnapshotPivotSource.apply} takes a Change Batch. The Snapshot makes the next one, the answer the\n * source holds for its last question is brought up to date from what the batch removed and added rather than\n * read again \u2014 the exact parts by subtraction and addition, every other part recomputed for the leaves the\n * batch touched \u2014 and each listener {@link SnapshotPivotSource.subscribe}d is told the new Source Version. Asked the same question\n * again, the source answers from what it holds: after any sequence of batches, what a fresh source over the\n * Snapshot they made answers, read in that Snapshot's order, to the last bit. A batch applied while an answer\n * is assembled from what it holds waits until the answer is made, so that no answer is half a batch.\n *\n * It answers a field's Items and a cell's records under its current version and under the versions of its\n * last {@link SnapshotPivotSource.answersHeld} answers \u2014 a Snapshot is immutable, so their records still add\n * up \u2014 and refuses an older one.\n */\nexport class SnapshotPivotSource implements PivotSource {\n /** How many of its latest answers' versions the source keeps answering Items and records under, besides\n * its current one. */\n static readonly answersHeld = 4;\n\n /** The fields bound to the Snapshot's columns. */\n readonly fields: readonly PivotField[];\n /** Every Aggregation. */\n readonly features: PivotSourceFeatures = PivotSourceFeatures.all;\n readonly #declared: readonly PivotField[] | undefined;\n readonly #slicing: CheckedSlicing;\n readonly #id = newIdentity();\n readonly #answered: Bound[] = [];\n readonly #listeners = new Set<(changed: PivotSourceChanged) => void>();\n readonly #watchers = new Set<(change: SnapshotChange, bindings: ReadonlyMap<string, FieldBinding>) => void>();\n #snapshot: Snapshot;\n #bindings: ReadonlyMap<string, FieldBinding>;\n #held: HeldPass | undefined;\n #heldAnswer: PivotAnswer | undefined;\n\n /** A source over a Snapshot: `fields` bound to its columns, or one field per column; its work paced by\n * `slicing`. */\n constructor(snapshot: Snapshot, fields?: readonly PivotField[], slicing?: PivotSlicing) {\n const bound = bindSnapshot(snapshot, fields);\n this.fields = Object.freeze([...bound.fields]);\n this.#declared = fields;\n this.#bindings = bound.bindings;\n this.#snapshot = snapshot;\n this.#slicing = checkedSlicing(slicing);\n }\n\n /** The Snapshot the source answers from now: the one it was made with, or the one the last Change Batch\n * made. */\n get snapshot(): Snapshot {\n return this.#snapshot;\n }\n\n /** The version the source answers under now. */\n get sourceVersion(): string {\n return this.#versionOf(this.#snapshot);\n }\n\n #versionOf(snapshot: Snapshot): string {\n return `${this.#id}:${snapshot.version}`;\n }\n\n /** Tells `listener` each new Source Version, after the source has moved on to it; the function returned\n * stops telling it. */\n subscribe(listener: (changed: PivotSourceChanged) => void): () => void {\n if (typeof listener !== 'function') throw new TypeError('A listener is a function.');\n const held = (changed: PivotSourceChanged): void => {\n listener(changed);\n };\n this.#listeners.add(held);\n return () => {\n this.#listeners.delete(held);\n };\n }\n\n /**\n * Applies a Change Batch (ADR-0067): the Snapshot makes the next one, whole or not at all; the answer held\n * for the last question is brought up to date from what the batch removed and added; and each listener is\n * told the new Source Version, after the source has moved on. A batch the Snapshot refuses throws its\n * `SnapshotError`, and nothing of it is applied. An error a listener throws does not stop the others being\n * told, nor make the batch look refused: it is thrown again from a microtask, as an event listener's is.\n */\n apply(batch: ChangeBatch): SnapshotChange {\n const change = applyChangeBatch(this.#snapshot, batch);\n const bindings = bindSnapshot(change.after, this.#declared).bindings;\n this.#snapshot = change.after;\n this.#bindings = bindings;\n const held = this.#held;\n if (held !== undefined) {\n // An answer being assembled from the pass reads it between slices: the batch waits until it is\n // made, so that the answer is the version before the batch, whole.\n if (held.assembling > 0) held.deferred.push({ change, bindings });\n else if (!foldDeferred(held) || !foldHeld(held, change, bindings)) this.#held = undefined;\n }\n this.#heldAnswer = undefined;\n for (const watcher of Array.from(this.#watchers)) watcher(change, bindings);\n const changed = Object.freeze({ sourceVersion: this.#versionOf(change.after) });\n // A copy, so that a listener subscribed while the others are told is told from the next batch.\n for (const listener of Array.from(this.#listeners)) {\n // A listener that applied a batch itself has told every listener of the newer version.\n if (this.#snapshot !== change.after) break;\n try {\n listener(changed);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- the batch is applied whatever a listener does; its error is reported, as an event listener's is, not swallowed\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n return change;\n }\n\n /**\n * The Leaf Aggregates of a question, or a refusal, read in slices \u2014 or, for the question it answered last,\n * from the pass it holds and has folded every batch into since. Past the cap, a question carrying levels\n * is answered with the cells of the groups shown, at most that many (ADR-0370 section 3), though the source\n * does not declare it, for a server that answers from it. The answer is assembled in slices too, and a\n * cancelled question rejects with the signal's reason at the next slice.\n */\n async aggregate(query: PivotQuery, signal?: AbortSignal): Promise<PivotAnswer> {\n aborted(signal);\n const refusal = queryRefusal(this.fields, this.features, query);\n if (refusal !== undefined) return PivotAnswer.refused(refusal);\n return this.#aggregate(query, new Slicer(this.#slicing, signal));\n }\n\n static {\n linkOf = (source): SnapshotSourceLink => {\n const link: SnapshotSourceLink = {\n capture: () => Object.freeze({ snapshot: source.#snapshot, bindings: source.#bindings, version: source.#versionOf(source.#snapshot) }),\n watch: listener => {\n source.#watchers.add(listener);\n return () => {\n source.#watchers.delete(listener);\n };\n },\n remember: (snapshot, bindings) => {\n source.#remember(snapshot, bindings);\n },\n versionOf: snapshot => source.#versionOf(snapshot),\n };\n return Object.freeze(link);\n };\n aggregateOn = (source, query, slicer) => {\n const refusal = queryRefusal(source.fields, source.features, query);\n return refusal === undefined ? source.#aggregate(query, slicer) : Promise.resolve(PivotAnswer.refused(refusal));\n };\n }\n\n async #aggregate(query: PivotQuery, slicer: Slicer): Promise<PivotAnswer> {\n const snapshot = this.#snapshot;\n const bindings = this.#bindings;\n if (!this.#heldUpToDate()) this.#held = undefined;\n const held = this.#held;\n if (held !== undefined && queriesEqual(held.pass.query, query) && held.pass.snapshot === snapshot) {\n this.#remember(snapshot, bindings);\n if (this.#heldAnswer !== undefined) return this.#heldAnswer;\n return this.#assembleHeld(held, snapshot, slicer);\n }\n const pass = new AggregationPass(snapshot, bindings, query, snapshot.recordKey !== undefined);\n for (let at = 0; at < pass.rowCount;) {\n const to = Math.min(pass.rowCount, at + chunkRows);\n if (!pass.step(to)) break;\n at = to;\n await slicer.step();\n }\n let answer = await slicer.run(pass.answerSteps(this.#versionOf(snapshot)));\n // Past the cap, a question with levels is answered with the cells it shows (ADR-0370 section 3).\n if (pass.refusal?.kind === 'tooManyLeaves' && query.levels !== undefined) {\n answer = await slicer.run(levelAnswerSteps(snapshot, bindings, query, this.#versionOf(snapshot)));\n }\n if (pass.refusal === undefined && this.#snapshot === snapshot) {\n this.#held = { pass, assembling: 0, deferred: [] };\n this.#heldAnswer = answer;\n }\n if (!answer.isRefused) this.#remember(snapshot, bindings);\n return answer;\n }\n\n // An answer assembled from the pass held, in slices: a batch applied meanwhile waits, and is folded in\n // once no assembly reads the pass.\n async #assembleHeld(held: HeldPass, snapshot: Snapshot, slicer: Slicer): Promise<PivotAnswer> {\n held.assembling++;\n let answer: PivotAnswer;\n try {\n answer = await slicer.run(held.pass.answerSteps(this.#versionOf(snapshot)));\n } finally {\n held.assembling--;\n }\n if (this.#held === held && this.#snapshot === snapshot) this.#heldAnswer = answer;\n // The batches applied meanwhile are folded in by the next batch or question (#heldUpToDate).\n return answer;\n }\n\n // Folds in the batches the held pass deferred, once no answer is being assembled from it; false when one\n // could not be folded, and the pass is to be dropped.\n #heldUpToDate(): boolean {\n const held = this.#held;\n return held === undefined || held.assembling > 0 || foldDeferred(held);\n }\n\n // The Snapshot of a version the source still answers under, with its fields' bindings: the current one, or\n // one of its last answers'.\n #heldVersion(version: string): Bound | undefined {\n if (this.#versionOf(this.#snapshot) === version) return { snapshot: this.#snapshot, bindings: this.#bindings };\n return this.#answered.find(bound => this.#versionOf(bound.snapshot) === version);\n }\n\n #remember(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>): void {\n const at = this.#answered.findIndex(bound => bound.snapshot === snapshot);\n if (at >= 0) this.#answered.splice(at, 1);\n this.#answered.push({ snapshot, bindings });\n if (this.#answered.length > SnapshotPivotSource.answersHeld) this.#answered.shift();\n }\n\n /** A page of a field's Items over all the data of the version asked, read in slices; refused under a\n * version the source no longer holds. */\n async items(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage> {\n aborted(signal);\n const refusal = itemsRefusal(this.fields, query);\n if (refusal !== undefined) return PivotItemPage.refused(refusal);\n const bound = this.#heldVersion(query.sourceVersion);\n if (bound === undefined) return PivotItemPage.refused(PivotRefusals.sourceVersionNotHeld(query.sourceVersion));\n const { snapshot, bindings } = bound;\n const binding = defined(bindings.get(query.field), `the field '${query.field}' is bound`);\n const keys = await new Slicer(this.#slicing, signal).run(itemsOfFieldSteps(snapshot, binding));\n return itemPage(keys, query, query.sourceVersion);\n }\n\n /** Each field's count of Items in the current Snapshot, read in slices, field after field (ADR-0370\n * section 3): what a server answering from this source answers its Field List with. A count is the\n * length of the field's whole page of Items. */\n async itemCounts(signal?: AbortSignal): Promise<PivotItemCounts> {\n aborted(signal);\n const snapshot = this.#snapshot;\n const bindings = this.#bindings;\n const slicer = new Slicer(this.#slicing, signal);\n const counts: [string, number][] = [];\n for (const field of this.fields) {\n const keys = await slicer.run(itemsOfFieldSteps(snapshot, defined(bindings.get(field.name), `the field '${field.name}' is bound`)));\n counts.push([field.name, keys.length]);\n }\n return new PivotItemCounts(this.#versionOf(snapshot), counts);\n }\n\n /** A page of the records behind a cell in the version asked, in the Snapshot's order, read in slices;\n * refused under a version the source no longer holds. */\n async details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage> {\n aborted(signal);\n const refusal = detailsRefusal(this.fields, query);\n if (refusal !== undefined) return PivotDetailPage.refused(refusal);\n const held = this.#heldVersion(query.sourceVersion);\n if (held === undefined) return PivotDetailPage.refused(PivotRefusals.sourceVersionNotHeld(query.sourceVersion));\n const { snapshot, bindings } = held;\n const { rows, total } = await new Slicer(this.#slicing, signal).run(rowsBehindSteps(snapshot, bindings, query));\n const bound = this.fields.map(field => defined(bindings.get(field.name), `the field '${field.name}' is bound`));\n const records = rows.map(row => ({ values: bound.map(binding => detailAt(binding, row)) }));\n return PivotDetailPage.of(query.sourceVersion, this.fields, query.start, total, records);\n }\n}\n\n// Folds in the batches a held pass deferred, in order; false when one could not be folded.\nfunction foldDeferred(held: HeldPass): boolean {\n while (held.deferred.length > 0) {\n const next = defined(held.deferred.shift(), 'a deferred batch');\n if (!foldHeld(held, next.change, next.bindings)) return false;\n }\n return true;\n}\n\n// Folds a batch into the source's own pass. No computation reads what it touched, so that is forgotten at once.\nfunction foldHeld(held: HeldPass, change: SnapshotChange, bindings: ReadonlyMap<string, FieldBinding>): boolean {\n if (!held.pass.fold(change, bindings)) return false;\n held.pass.clearChanges();\n return true;\n}\n\n// A value as a record behind a cell carries it.\nfunction detailOfValue(raw: unknown): PivotDetailValue {\n const value = readRecordValue(raw);\n switch (value.kind) {\n case 'blank': return null;\n case 'text': return value.text;\n case 'decimal': return value.decimal;\n case 'double': return value.number;\n case 'date': return value.ticks;\n case 'boolean': return value.value;\n default: return unreachable(value);\n }\n}\n\nlet allItemsOfRecords: <TRecord>(source: RecordPivotSource<TRecord>, field: string) => readonly ItemKey[];\n\n/** Every Item of a field over all of a record source's records, in the order they were met. */\nexport function allItemsOf<TRecord>(source: RecordPivotSource<TRecord>, field: string): readonly ItemKey[] {\n return allItemsOfRecords(source, field);\n}\n\n/** The bundled source over records in memory (ADR-0066): read into a Snapshot on the first question, each\n * field through its accessor; it answers every Aggregation under one version, the records being fixed. */\nexport class RecordPivotSource<TRecord> implements PivotSource {\n /** The fields, each read through its accessor. */\n readonly fields: readonly PivotRecordField<TRecord>[];\n /** Every Aggregation. */\n readonly features: PivotSourceFeatures = PivotSourceFeatures.all;\n /** The one version the source answers under. */\n readonly sourceVersion = newIdentity();\n /** The records, as given. */\n readonly records: readonly TRecord[];\n #data: { readonly snapshot: Snapshot; readonly bindings: ReadonlyMap<string, FieldBinding> } | undefined;\n\n /** A source over records, refusing a name declared twice among the fields. */\n constructor(records: readonly TRecord[], fields: readonly PivotRecordField<TRecord>[]) {\n declaredFields(fields);\n this.records = records;\n this.fields = Object.freeze([...fields]);\n }\n\n // The Snapshot, read once; an accessor that throws fails every question, naming the row and the field.\n #read(): { readonly snapshot: Snapshot; readonly bindings: ReadonlyMap<string, FieldBinding> } {\n this.#data ??= recordSnapshot(this.records, this.fields);\n return this.#data;\n }\n\n /** The Leaf Aggregates of a question, or a refusal. */\n aggregate(query: PivotQuery, signal?: AbortSignal): Promise<PivotAnswer> {\n aborted(signal);\n return Promise.resolve(this.aggregateNow(query));\n }\n\n /** The Leaf Aggregates of a question, on the calling thread; past the cap, for a question carrying levels,\n * the cells of the groups shown (ADR-0370 section 3). */\n aggregateNow(query: PivotQuery): PivotAnswer {\n const refusal = queryRefusal(this.fields, this.features, query);\n if (refusal !== undefined) return PivotAnswer.refused(refusal);\n const { snapshot, bindings } = this.#read();\n const pass = new AggregationPass(snapshot, bindings, query);\n pass.step(pass.rowCount);\n const answer = pass.answer(this.sourceVersion);\n // Past the cap, a question with levels is answered with the cells it shows (ADR-0370 section 3).\n if (pass.refusal?.kind === 'tooManyLeaves' && query.levels !== undefined) {\n return runWhole(levelAnswerSteps(snapshot, bindings, query, this.sourceVersion));\n }\n return answer;\n }\n\n // Every Item of a field over all the records, in the order they were met.\n #allItems(field: string): readonly ItemKey[] {\n const { snapshot, bindings } = this.#read();\n return itemsOfField(snapshot, defined(bindings.get(field), `the field '${field}' is bound`));\n }\n\n static {\n allItemsOfRecords = (source, field) => source.#allItems(field);\n }\n\n /** A page of a field's Items. */\n items(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage> {\n aborted(signal);\n const refusal = itemsRefusal(this.fields, query);\n if (refusal !== undefined) return Promise.resolve(PivotItemPage.refused(refusal));\n if (query.sourceVersion !== this.sourceVersion) return Promise.resolve(PivotItemPage.refused(PivotRefusals.sourceVersionNotHeld(query.sourceVersion)));\n return Promise.resolve(itemPage(this.#allItems(query.field), query, this.sourceVersion));\n }\n\n /** Each field's count of Items over the records (ADR-0370 section 3). */\n itemCounts(signal?: AbortSignal): Promise<PivotItemCounts> {\n aborted(signal);\n return Promise.resolve(new PivotItemCounts(this.sourceVersion, this.fields.map(field => [field.name, this.#allItems(field.name).length] as const)));\n }\n\n /** A page of the records behind a cell, each carrying its record. */\n details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage> {\n aborted(signal);\n const refusal = detailsRefusal(this.fields, query);\n if (refusal !== undefined) return Promise.resolve(PivotDetailPage.refused(refusal));\n if (query.sourceVersion !== this.sourceVersion) return Promise.resolve(PivotDetailPage.refused(PivotRefusals.sourceVersionNotHeld(query.sourceVersion)));\n const { snapshot, bindings } = this.#read();\n const { rows, total } = rowsBehind(snapshot, bindings, query);\n const records = recordsAt(this.records, rows).map(record => ({ values: this.fields.map(field => detailOfValue(field.value(record))), record }));\n return Promise.resolve(PivotDetailPage.of(this.sourceVersion, this.fields, query.start, total, records));\n }\n\n /** The records behind a cell, in their order, refusing by name a field the source does not have. */\n recordsBehind(query: PivotDetailsQuery): readonly TRecord[] {\n const refusal = detailsRefusal(this.fields, query);\n if (refusal !== undefined) throw new Error(refusal.message);\n const { snapshot, bindings } = this.#read();\n return recordsAt(this.records, rowsBehind(snapshot, bindings, query).rows);\n }\n}\n\n// The records at rows given in ascending order: the Snapshot's rows are the records, in order.\nfunction recordsAt<TRecord>(records: readonly TRecord[], rows: readonly number[]): readonly TRecord[] {\n const wanted = new Set(rows);\n return records.filter((_, row) => wanted.has(row));\n}\n\n/** That a server's data moved on, however the Consumer learned it (ADR-0370 section 3): the question is asked\n * again. */\nexport interface PivotServerChanged {\n /** Names the notice: the data moved on, and its changes are not told. */\n readonly kind: 'changed';\n /** The Source Version the server answers under now, where the Consumer knows it. */\n readonly sourceVersion?: string;\n}\n\n/**\n * A server's Change Batch (ADR-0370 section 3): the records its data lost and the records it gained between two\n * Source Versions, each with its values in the source's field order, as a record behind a cell carries them \u2014\n * a date by its ticks, a date part by its number. A changed record is the old one lost and the new one\n * gained.\n */\nexport interface PivotServerChangeBatch {\n /** Names the notice: the records the data lost and gained are told. */\n readonly kind: 'changeBatch';\n /** The Source Version the batch starts from. */\n readonly from: string;\n /** The Source Version it makes. */\n readonly to: string;\n /** The records the data lost, each with the values it had. */\n readonly removed: readonly (readonly PivotDetailValue[])[];\n /** The records the data gained. */\n readonly added: readonly (readonly PivotDetailValue[])[];\n}\n\n/** What the Consumer's transport tells a fetching source: that the data moved on, or how. */\nexport type PivotServerNotice = PivotServerChanged | PivotServerChangeBatch;\n\n/** How a fetching source asks its server. */\nexport interface PivotFetchers {\n /** Asks the server for the Leaf Aggregates of a question. */\n readonly aggregate: (query: PivotQuery, signal?: AbortSignal) => Promise<PivotAnswer>;\n /** Asks the server for a page of a field's Items. */\n readonly items: (query: PivotItemsQuery, signal?: AbortSignal) => Promise<PivotItemPage>;\n /** Asks the server for a page of the records behind a cell. */\n readonly details: (query: PivotDetailsQuery, signal?: AbortSignal) => Promise<PivotDetailPage>;\n /** Asks the server for each field's count of Items, when the features declare that it counts them. */\n readonly itemCounts?: (signal?: AbortSignal) => Promise<PivotItemCounts>;\n /**\n * Starts the Consumer's transport telling the source that the server's data moved on (ADR-0370 section 3):\n * WebSocket, server-sent events, SignalR or polling, the Consumer's own. The source calls it when its first\n * listener subscribes, with the function the transport calls for each notice or Change Batch, and calls the\n * function it returns when its last listener leaves.\n */\n readonly subscribe?: (notify: (notice: PivotServerNotice) => void) => () => void;\n}\n\n// The answer a fetching source holds for the question it answered last, and the batches heard since.\ninterface HeldServerAnswer {\n readonly query: PivotQuery;\n readonly answer: PivotAnswer;\n readonly batches: ServerBatch[];\n // The records the batches carry: past the answer's leaves, asking again is the cheaper.\n records: number;\n}\n\n/**\n * A source whose answers a Consumer fetches from a server (ADR-0066). The engine refuses what every source\n * refuses before asking, and holds what comes back to the question: an answer to another question, more\n * Items or records than were asked for, or records of other fields fail by name.\n *\n * **Live data** (ADR-0370 section 3): the Consumer's transport, started by {@link PivotFetchers.subscribe},\n * tells the source that the server's data moved on, or hands it a Change Batch of the records the data lost\n * and gained. Each listener {@link FetchingPivotSource.subscribe}d is told the new Source Version. Asked the\n * question it answered last again, the source answers from the Leaf Aggregates it holds with the batches\n * folded in, where subtraction and addition keep every part they touch exactly; otherwise \u2014 a notice, a batch\n * out of chain, a sum that is a double, a product, a variance, an extreme a number left, Level Aggregates \u2014 it\n * asks the server again. An answer fetched while a notice or a batch arrived is not held.\n */\nexport class FetchingPivotSource implements PivotSource {\n /** The fields the server has. */\n readonly fields: readonly PivotField[];\n /** The Aggregations the server answers. */\n readonly features: PivotSourceFeatures;\n readonly #fetch: PivotFetchers;\n readonly #listeners = new Set<(changed: PivotSourceChanged) => void>();\n #stop: (() => void) | undefined;\n #held: HeldServerAnswer | undefined;\n // How many notices and batches the source has heard: an answer fetched across one is not held.\n #heard = 0;\n\n /** A source of the server's fields and Aggregations, asked through the fetchers; the features declare\n * that it counts Items exactly when a fetcher counts them. */\n constructor(fields: readonly PivotField[], features: PivotSourceFeatures, fetch: PivotFetchers) {\n declaredFields(fields);\n if (features.countsItems !== (fetch.itemCounts !== undefined)) {\n throw new TypeError(features.countsItems\n ? 'The source declares that it counts its fields\\' Items, and no fetcher counts them (ADR-0370 section 3).'\n : 'A fetcher counts the fields\\' Items, and the source\\'s features do not declare it (ADR-0370 section 3).');\n }\n this.fields = Object.freeze([...fields]);\n this.features = features;\n this.#fetch = fetch;\n }\n\n /** The server's Leaf Aggregates, held to the question; for the question answered last, the answer held\n * with the batches heard since folded in, where they fold. */\n async aggregate(query: PivotQuery, signal?: AbortSignal): Promise<PivotAnswer> {\n const refusal = queryRefusal(this.fields, this.features, query);\n if (refusal !== undefined) return PivotAnswer.refused(refusal);\n const held = this.#held;\n if (held !== undefined && queriesEqual(held.query, query)) {\n if (held.batches.length === 0) return held.answer;\n const folded = foldServerBatches(query, held.answer, held.batches, this.fields);\n this.#held = folded === undefined ? undefined : { query, answer: folded, batches: [], records: 0 };\n if (folded !== undefined) return folded;\n }\n const heard = this.#heard;\n const answer = await this.#fetch.aggregate(query, signal);\n if (!answer.isRefused) {\n const mismatch = answer.mismatch(query);\n if (mismatch !== undefined) throw new Error(`The server answered another question than the one asked: ${mismatch} (ADR-0066).`);\n }\n // Held to fold batches into: an answer of leaves, fetched while a transport runs to say what moves, with\n // nothing heard while it was asked. Without a transport nothing would say the answer went stale.\n this.#held = this.#stop !== undefined && !answer.isRefused && !answer.isLevels && heard === this.#heard\n ? { query, answer, batches: [], records: 0 }\n : undefined;\n return answer;\n }\n\n /** Tells `listener` each new Source Version the Consumer's transport reports, after the source has moved on\n * to it; the function returned stops telling it. The transport runs while a listener is subscribed. */\n subscribe(listener: (changed: PivotSourceChanged) => void): () => void {\n if (typeof listener !== 'function') throw new TypeError('A listener is a function.');\n const held = (changed: PivotSourceChanged): void => {\n listener(changed);\n };\n const fetch = this.#fetch;\n const starts = this.#listeners.size === 0 && fetch.subscribe !== undefined;\n this.#listeners.add(held);\n if (starts) {\n let stop: (() => void) | undefined;\n try {\n // Called on the fetchers, as the other fetchers are, so a fetcher written as a method keeps its `this`.\n stop = fetch.subscribe(notice => {\n this.#hear(notice);\n });\n } catch (error) {\n this.#listeners.delete(held);\n throw error;\n }\n if (typeof (stop as unknown) !== 'function') {\n this.#listeners.delete(held);\n throw new TypeError(\"The fetchers' subscribe returns the function that stops the transport (ADR-0370 section 3).\");\n }\n this.#stop = stop;\n }\n return () => {\n if (!this.#listeners.delete(held) || this.#listeners.size > 0) return;\n this.#stopTransport();\n };\n }\n\n /** Refresh: lets go of the answer held, so the next question is asked of the server. */\n refresh(): void {\n this.#held = undefined;\n }\n\n // Stops the transport, and lets go of the answer held: nothing would say what moves while it is stopped.\n #stopTransport(): void {\n const stop = this.#stop;\n this.#stop = undefined;\n this.#held = undefined;\n stop?.();\n }\n\n // A notice or a batch the Consumer's transport handed the source: checked whole before anything moves, so a\n // malformed one throws to the transport and changes nothing.\n #hear(notice: PivotServerNotice): void {\n if (typeof notice !== 'object' || (notice as unknown) === null) throw new TypeError('A notice is an object: changed, or changeBatch (ADR-0370 section 3).');\n let changed: PivotSourceChanged;\n switch (notice.kind) {\n case 'changed': {\n const version = notice.sourceVersion;\n if (version !== undefined && (typeof version !== 'string' || version.length === 0)) throw new TypeError('A notice names its Source Version with text, or not at all.');\n this.#held = undefined;\n changed = Object.freeze(version === undefined ? {} : { sourceVersion: version });\n break;\n }\n case 'changeBatch': {\n const batch = checkedBatch(notice, this.fields);\n const held = this.#held;\n const end = held === undefined ? undefined : (held.batches.at(-1)?.to ?? held.answer.sourceVersion);\n if (held === undefined || end !== batch.from || held.records + batch.removed.length + batch.added.length > held.answer.leafCount + chunkRows) {\n this.#held = undefined;\n } else {\n held.batches.push(batch);\n held.records += batch.removed.length + batch.added.length;\n }\n changed = Object.freeze({ sourceVersion: batch.to });\n break;\n }\n default:\n throw new TypeError(`'${String((notice as { readonly kind: unknown }).kind)}' is no notice a fetching source takes: changed, or changeBatch (ADR-0370 section 3).`);\n }\n this.#heard++;\n // A copy, so that a listener subscribed while the others are told is told from the next notice.\n for (const listener of Array.from(this.#listeners)) {\n try {\n listener(changed);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- the notice is taken whatever a listener does; its error is reported, as an event listener's is, not swallowed\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n\n /** The server's page of Items, held to the most asked for. */\n async items(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage> {\n const refusal = itemsRefusal(this.fields, query);\n if (refusal !== undefined) return PivotItemPage.refused(refusal);\n const page = await this.#fetch.items(query, signal);\n if (!page.isRefused && page.items.length > query.max) {\n throw new Error(`The server answered ${page.items.length} Items, and ${query.max} were asked for (ADR-0066).`);\n }\n return page;\n }\n\n /** The server's count of each field's Items (ADR-0370 section 3). Counts naming a field the source does\n * not declare are refused by name. */\n async itemCounts(signal?: AbortSignal): Promise<PivotItemCounts> {\n const fetch = this.#fetch.itemCounts;\n if (fetch === undefined) throw new Error('This Pivot Source does not count its fields\\' Items (ADR-0370 section 3).');\n const counts = await fetch(signal);\n for (const field of counts.counts.keys()) {\n if (!knows(this.fields, field)) throw new Error(`The server counted the Items of '${field}', a field the source does not declare (ADR-0370 section 3).`);\n }\n return counts;\n }\n\n /** The server's page of records, held to the fields and the page asked for. */\n async details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage> {\n const refusal = detailsRefusal(this.fields, query);\n if (refusal !== undefined) return PivotDetailPage.refused(refusal);\n const page = await this.#fetch.details(query, signal);\n if (page.isRefused) return page;\n const same = page.fields.length === this.fields.length\n && page.fields.every((field, i) => field.name === elementAt(this.fields, i).name && field.type === elementAt(this.fields, i).type);\n if (!same) {\n throw new Error(`The server's records carry the fields [${page.fields.map(f => f.name).join(', ')}], `\n + `and the source declares [${this.fields.map(f => f.name).join(', ')}] (ADR-0066).`);\n }\n if (page.records.length > query.count || page.start !== query.start) {\n throw new Error(`The server answered ${page.records.length} records from ${page.start}, and ${query.count} from ${query.start} were asked for (ADR-0066).`);\n }\n return page;\n }\n}\n\n// A Change Batch as the transport handed it, checked: its versions are text, and its records are the source's\n// fields' values, as they will be read.\nfunction checkedBatch(batch: PivotServerChangeBatch, fields: readonly PivotField[]): ServerBatch {\n const { from, to, removed, added } = batch;\n if (typeof from !== 'string' || from.length === 0 || typeof to !== 'string' || to.length === 0) {\n throw new TypeError('A Change Batch names the Source Versions it goes from and to, with text (ADR-0370 section 3).');\n }\n if (from === to) throw new TypeError(`A Change Batch goes from one Source Version to another, not from '${from}' to itself (ADR-0370 section 3).`);\n for (const [side, records] of [['removed', removed], ['added', added]] as const) {\n if (!Array.isArray(records)) throw new TypeError(`A Change Batch's ${side} records are an array (ADR-0370 section 3).`);\n try {\n checkBatchRecords(records, fields);\n } catch (error) {\n if (error instanceof Error) throw new TypeError(`A Change Batch's ${side} records: ${error.message}`, { cause: error });\n throw error;\n }\n }\n return Object.freeze({ from, to, removed: copiedRecords(removed), added: copiedRecords(added) });\n}\n\n// Records copied, so that a transport reusing its arrays changes nothing the source holds.\nfunction copiedRecords(records: readonly (readonly PivotDetailValue[])[]): readonly (readonly PivotDetailValue[])[] {\n return Object.freeze(records.map(record => Object.freeze([...record])));\n}\n", "// How a Pivot Field reads its values from a Snapshot (ADR-0060/0064/0066): one column \u2014 the field's own, or\n// the Date column a date part is a part of \u2014 or, for a field read through an accessor, one column per kind\n// of value the accessor returned, a row's value standing in exactly one of them, or in none for a Blank.\n// The second is how a field \"whose values are not all of the declared type is still pivoted as its values\n// are\". The C# engine's FieldBinding, RecordColumns and RowValues.\n\nimport { createSnapshot, SnapshotError, type Snapshot, type SnapshotColumn, type SnapshotColumnInput, type SnapshotDecimal, type SnapshotKind } from '@ex-grid/data';\nimport { declaredFields, datePartTitle, type PivotField, type PivotRecordField } from '../fields/pivot-field';\nimport { ItemKeys, type ItemKey } from '../items/item-key';\nimport { isDecimal, readRecordValue, type RecordValue } from '../items/record-value';\nimport type { PivotDatePart, PivotFieldType } from '../layout/pivot-enums';\nimport { defined, elementAt, unreachable } from '../must';\nimport { datePartOf } from '../words/pivot-words';\nimport { dateParts as datePartsOfTicks } from '../text/date-text';\nimport { decimalOfWhole, decimalToNumber } from '../aggregates/exact-decimal';\n\n/** One field's columns, and the part of a Date column it is. */\nexport interface FieldBinding {\n readonly field: PivotField;\n readonly columns: readonly SnapshotColumn[];\n /** The one column, when the field reads one. */\n readonly single: SnapshotColumn | undefined;\n readonly part: PivotDatePart | undefined;\n}\n\nfunction bindingOf(field: PivotField, columns: readonly SnapshotColumn[]): FieldBinding {\n return Object.freeze({ field, columns, single: columns.length === 1 ? columns[0] : undefined, part: field.datePart });\n}\n\n/** The field type a Snapshot column's kind declares by default. */\nexport function fieldTypeOf(kind: SnapshotKind): PivotFieldType {\n switch (kind) {\n case 'text': return 'text';\n case 'decimal':\n case 'integer':\n case 'double': return 'number';\n case 'date': return 'date';\n case 'boolean': return 'boolean';\n default: return unreachable(kind);\n }\n}\n\n/** The C# engine's name of a Snapshot kind: `Text`, `Decimal`. */\nexport function kindTitle(kind: SnapshotKind): string {\n return kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n\n/**\n * The fields of a Snapshot (ADR-0066): `fields` each bound to the column it names \u2014 its `column`, or its\n * own name \u2014 or, with none declared, one field per column, captioned as the column is and typed by its kind.\n * An unknown column is refused by name, and so is a date part of a column that is not a Date column.\n */\nexport function bindSnapshot(snapshot: Snapshot, fields: readonly PivotField[] | undefined): {\n readonly fields: readonly PivotField[];\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n} {\n const declared = fields === undefined ? snapshot.columns.map(defaultField) : [...declaredFields(fields).values()];\n const bindings = new Map<string, FieldBinding>();\n for (const field of declared) {\n const name = field.column ?? field.name;\n const column = snapshot.columns.find(candidate => candidate.name === name);\n if (column === undefined) {\n throw new TypeError(field.column === undefined\n ? `The Snapshot has no column named '${name}' for the Pivot Field '${field.name}'.`\n : `The Pivot Field '${field.name}' reads the column '${name}', and the Snapshot has no column of that name.`);\n }\n if (field.datePart !== undefined && column.kind !== 'date') {\n throw new TypeError(`The Pivot Field '${field.name}' is the ${datePartTitle(field.datePart)} of '${name}', which is a ${kindTitle(column.kind)} column, not a Date column.`);\n }\n bindings.set(field.name, bindingOf(field, [column]));\n }\n return { fields: Object.freeze(declared), bindings };\n}\n\nfunction defaultField(column: SnapshotColumn): PivotField {\n const field: { name: string; caption: string; type: PivotFieldType; itemOrder: readonly unknown[] } = {\n name: column.name,\n caption: column.caption.length === 0 ? column.name : column.caption,\n type: fieldTypeOf(column.kind),\n itemOrder: Object.freeze([]),\n };\n return Object.freeze(field);\n}\n\n// ---- Records into a Snapshot ----------------------------------------------------------------------\n\ntype ValueKind = 'text' | 'decimal' | 'double' | 'date' | 'boolean';\n\n/** One field's columns, made as its kinds are met, each holding every row read so far. */\nclass FieldColumns {\n readonly order: ValueKind[] = [];\n text: (string | null)[] | undefined;\n decimal: (SnapshotDecimal | null)[] | undefined;\n double: (number | null)[] | undefined;\n date: (bigint | null)[] | undefined;\n boolean: (boolean | null)[] | undefined;\n\n append(row: number, value: RecordValue): void {\n if (value.kind !== 'blank' && !this.order.includes(value.kind)) {\n this.order.push(value.kind);\n this.make(value.kind, row);\n }\n this.text?.push(value.kind === 'text' ? value.text : null);\n this.decimal?.push(value.kind === 'decimal' ? value.decimal : null);\n this.double?.push(value.kind === 'double' ? value.number : null);\n this.date?.push(value.kind === 'date' ? value.ticks : null);\n this.boolean?.push(value.kind === 'boolean' ? value.value : null);\n }\n\n // A field no value was read for \u2014 every value Blank, or no records \u2014 reads a Text column of Blanks.\n seal(rows: number): void {\n if (this.order.length > 0) return;\n this.order.push('text');\n this.make('text', rows);\n }\n\n inputs(f: number): SnapshotColumnInput[] {\n return this.order.map(kind => {\n const name = columnName(f, kind);\n switch (kind) {\n case 'text': return { name, kind, values: defined(this.text, name) };\n case 'decimal': return { name, kind, values: defined(this.decimal, name) };\n case 'double': return { name, kind, values: defined(this.double, name) };\n case 'date': return { name, kind, values: defined(this.date, name) };\n case 'boolean': return { name, kind, values: defined(this.boolean, name) };\n default: return unreachable(kind);\n }\n });\n }\n\n private make(kind: ValueKind, rows: number): void {\n const blanks = (): null[] => Array.from({ length: rows }, () => null);\n switch (kind) {\n case 'text': this.text = blanks(); return;\n case 'decimal': this.decimal = blanks(); return;\n case 'double': this.double = blanks(); return;\n case 'date': this.date = blanks(); return;\n case 'boolean': this.boolean = blanks(); return;\n default: unreachable(kind);\n }\n }\n}\n\nfunction columnName(field: number, kind: ValueKind): string {\n return `${field}:${kindTitle(kind)}`;\n}\n\n/**\n * The Snapshot behind a source over records: the records read once through the fields' accessors, each\n * value keeping its own kind, so a field is held as one column per kind its accessor returned \u2014 text, an\n * exact number (a bigint or a SnapshotDecimal), a double, a date, a Boolean \u2014 with each row's value in the\n * column of its kind and a Blank in the others. A field whose every value was Blank reads a Text column of\n * Blanks. An accessor that throws, or a date part read as anything but a date, fails the build whole,\n * naming the row and the field (ADR-0064).\n */\nexport function recordSnapshot<TRecord>(records: readonly TRecord[], fields: readonly PivotRecordField<TRecord>[]): {\n readonly snapshot: Snapshot;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n} {\n return snapshotOfValues(records, fields, (record, row, f) => {\n const field = elementAt(fields, f);\n let raw: unknown;\n try {\n raw = field.value(record);\n } catch (error) {\n const reason = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n throw new SnapshotError(`reading the value threw ${reason}`, { row: row + 1, column: field.name });\n }\n return readRecordValue(raw);\n });\n}\n\n/**\n * The Snapshot of records as a record behind a cell carries them (ADR-0370 section 3): each record's values in\n * `fields`' order \u2014 text, an exact number as a SnapshotDecimal, a double, a date by its ticks, a Boolean, or\n * `null` for a Blank \u2014 and a date part by its number, as {@link detailAt} gives it, so a date part is bound as\n * the number it is. A value of another kind, or a record of another length, fails the build whole, naming the\n * record and the field.\n */\nexport function detailSnapshot(records: readonly (readonly DetailValue[])[], fields: readonly PivotField[]): {\n readonly snapshot: Snapshot;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n} {\n records.forEach((record, row) => {\n if (!Array.isArray(record) || record.length !== fields.length) {\n throw new SnapshotError(`the record carries ${Array.isArray(record) ? String(record.length) : 'no array of'} values, and there are ${fields.length} fields`, { row: row + 1 });\n }\n });\n const asNumbers = fields.map(withoutDatePart);\n return snapshotOfValues(records, asNumbers, (record, _row, f) => {\n const value = elementAt(record, f);\n const part = elementAt(fields, f).datePart;\n if (part !== undefined && value !== null && typeof value !== 'number') {\n throw new TypeError(`The ${datePartTitle(part)} of a date travels as its number, and the record carries a ${isDecimal(value) ? 'decimal' : typeof value}.`);\n }\n // A date travels by its ticks; every other value is read as a Consumer's is.\n return typeof value === 'bigint' ? { kind: 'date', ticks: value } : readRecordValue(value);\n });\n}\n\n// A field read as the values it carries: a date part's are its numbers.\nfunction withoutDatePart(field: PivotField): PivotField {\n const { datePart, ...rest } = field;\n return datePart === undefined ? field : Object.freeze(rest);\n}\n\n/** A value of a record behind a cell: text, an exact number, a double, a date by its ticks, a Boolean, or a\n * Blank. */\nexport type DetailValue = string | number | bigint | boolean | SnapshotDecimal | null;\n\n// The Snapshot of `records`, each field's value in a record read by `read`, held as recordSnapshot holds it.\nfunction snapshotOfValues<TRecord>(records: readonly TRecord[], fields: readonly PivotField[], read: (record: TRecord, row: number, field: number) => RecordValue): {\n readonly snapshot: Snapshot;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n} {\n declaredFields(fields);\n const made = fields.map(() => new FieldColumns());\n records.forEach((record, row) => {\n fields.forEach((field, f) => {\n let value: RecordValue;\n try {\n value = read(record, row, f);\n } catch (error) {\n if (error instanceof TypeError || error instanceof RangeError) {\n throw new SnapshotError(error.message, { row: row + 1, column: field.name });\n }\n throw error;\n }\n if (field.datePart !== undefined && value.kind !== 'blank' && value.kind !== 'date') {\n throw new SnapshotError(`the value ${describe(value)} is not a date, and the field is the ${datePartTitle(field.datePart)} of a date.`,\n { row: row + 1, column: field.name });\n }\n elementAt(made, f).append(row, value);\n });\n });\n made.forEach(columns => columns.seal(records.length));\n const snapshot = createSnapshot({ columns: made.flatMap((columns, f) => columns.inputs(f)) });\n const bindings = new Map<string, FieldBinding>();\n fields.forEach((field, f) => {\n bindings.set(field.name, bindingOf(field, elementAt(made, f).order.map(kind => snapshot.column(columnName(f, kind)))));\n });\n return { snapshot, bindings };\n}\n\nfunction describe(value: RecordValue): string {\n switch (value.kind) {\n case 'text': return `'${value.text}' (text)`;\n case 'decimal': return `${value.decimal.mantissa} (decimal)`;\n case 'double': return `${value.number} (number)`;\n case 'boolean': return `${value.value} (boolean)`;\n case 'blank':\n case 'date': throw new Error('Internal: a Blank and a date are a date part\\'s values.');\n default: return unreachable(value);\n }\n}\n\n// ---- One row's value ----------------------------------------------------------------------------\n\n/** The part of a date, by its ticks. */\nexport function datePartOfTicks(part: PivotDatePart, ticks: bigint): number {\n const parts = datePartsOfTicks(ticks);\n return datePartOf(part, parts.year, parts.month);\n}\n\n/** The Item a row's value belongs to (ADR-0060), as the Item space maps it. */\nexport function itemKeyAt(binding: FieldBinding, row: number): ItemKey {\n for (const column of binding.columns) {\n if (column.isBlank(row)) continue;\n switch (column.kind) {\n case 'text': return ItemKeys.text(must(column.valueAt(row)));\n case 'decimal': return ItemKeys.number(decimalToNumber(must(column.valueAt(row))));\n case 'integer': return ItemKeys.number(Number(must(column.valueAt(row))));\n case 'double': return ItemKeys.number(must(column.valueAt(row)));\n case 'date': {\n const ticks = must(column.valueAt(row));\n return binding.part === undefined ? ItemKeys.date(ticks) : ItemKeys.number(datePartOfTicks(binding.part, ticks));\n }\n case 'boolean': return ItemKeys.boolean(must(column.valueAt(row)));\n default: return unreachable(column);\n }\n }\n return ItemKeys.blank;\n}\n\n/** A row's value as a record behind a cell carries it: text, an exact number as a SnapshotDecimal, a double,\n * a date by its ticks, a Boolean, or `null` for a Blank. A date part is its number. */\nexport function detailAt(binding: FieldBinding, row: number): DetailValue {\n for (const column of binding.columns) {\n if (column.isBlank(row)) continue;\n switch (column.kind) {\n case 'text': return must(column.valueAt(row));\n case 'decimal': return must(column.valueAt(row));\n case 'integer': return decimalOfWhole(must(column.valueAt(row)));\n case 'double': return must(column.valueAt(row));\n case 'date': {\n const ticks = must(column.valueAt(row));\n return binding.part === undefined ? ticks : datePartOfTicks(binding.part, ticks);\n }\n case 'boolean': return must(column.valueAt(row));\n default: return unreachable(column);\n }\n }\n return null;\n}\n\nfunction must<T>(value: T | null): T {\n if (value === null) throw new Error('Internal: a value that is not Blank reads as null.');\n return value;\n}\n", "// One question's pass over a Snapshot (ADR-0060/0066): every row's Items in the placed fields, the rows a\n// Hidden Item leaves out, the leaf of each included row, and the parts asked for, accumulated at each leaf;\n// then the Leaf Aggregates. The C# engine's ItemSpace, LeafIndex, ValueAccumulator and AggregationPass,\n// transcribed for a Snapshot that holds every row it has: the rows are read a chunk at a time, each placed\n// field's Items for the chunk column by column, as C# reads them, so Items are met \u2014 and numbered \u2014 in the\n// order C# meets them.\n\nimport type { DecimalColumn, IntegerColumn, Snapshot, SnapshotChange, SnapshotColumn, SnapshotDecimal, TextColumn } from '@ex-grid/data';\nimport { decimalCompare, decimalOfSum, decimalOfWhole, decimalToNumber, doubleOfSum, doubleOfWide, wideAdd } from '../aggregates/exact-decimal';\nimport { PartColumns, neumaier, partExtremes, partProduct, partSum, partVariance, sumToInexact, type SumPart } from '../aggregates/parts';\nimport { PivotAnswer, PivotAnswerAxis, PivotRefusals, answerValues, madeAnswer, type PivotSourceRefusal } from '../cube/answer';\nimport { partBits, type PivotQuery } from '../cube/query';\nimport { ItemKeys, fromPublicKey, keyIdOf, textItemKey, toPublicKey, type ItemKey, type PivotItemKey } from '../items/item-key';\nimport { foldedText } from '../text/casing';\nimport { elementAt, unreachable } from '../must';\nimport { datePartOfTicks, type FieldBinding } from './binding';\nimport { runWhole } from './slicing';\n\n/** The most rows read column by column at once, as C#'s pass reads them. */\nexport const chunkRows = 4096;\n\n/** The first row of a leaf that holds no record. */\nexport const noFirstRow = 0x7fffffff;\n\n// ---- Items --------------------------------------------------------------------------------------\n\n/**\n * One field's Items over a Snapshot (ADR-0060), and how each row maps to one. Text is told apart ignoring\n * case: the column's dictionary is folded, every code of one Item mapping to it, and the Item is spelled by\n * the lowest of its codes some row carries. A number is its value \u2014 an Integer 1, a Decimal 1.0 and a Double\n * 1 are one Item \u2014 and a non-finite Double is #NUM!. A date is its clock value, a date part the part's\n * number. Item indexes are handed out as Items are first met.\n */\nexport class ItemSpace {\n #binding: FieldBinding;\n readonly #hiddenKeys: ReadonlySet<string> | undefined;\n readonly #keys: ItemKey[] = [];\n readonly #hidden: boolean[] = [];\n readonly #firstCode: number[] = [];\n #textColumn: TextColumn | undefined;\n // The dictionary folded so far: each folded spelling's Item, and the last code of each Item's chain.\n readonly #itemOfText = new Map<string, number>();\n readonly #lastCode: number[] = [];\n readonly #itemOfCode: number[] = [];\n readonly #nextCode: number[] = [];\n readonly #presence: number[] = [];\n readonly #numbers = new Map<number, number>();\n readonly #dates = new Map<bigint, number>();\n readonly #parts = new Map<number, number>();\n #blank = -1;\n #error = -1;\n #false = -1;\n #true = -1;\n #noting = false;\n /** The text Items whose rows a Change Batch took away or brought since {@link clearChanges}, whose\n * spelling may have changed with them (ADR-0153). */\n readonly changedItems = new Set<number>();\n\n constructor(binding: FieldBinding, hidden: readonly PivotItemKey[] | undefined) {\n this.#binding = binding;\n if (hidden !== undefined && hidden.length > 0) this.#hiddenKeys = new Set(hidden.map(key => keyIdOf(fromPublicKey(key))));\n this.#textColumn = textColumnOf(binding);\n this.#fold();\n }\n\n /** The field and the columns it reads. */\n get binding(): FieldBinding {\n return this.#binding;\n }\n\n /**\n * The space over the next version of the Snapshot (ADR-0067): `binding` reads the same columns of the\n * version a Change Batch made, whose dictionary holds the one before's codes and those the batch brought.\n * The codes it brought are folded as the constructor folds the dictionary, so each Item keeps its index,\n * and an Item that first appears takes the next.\n */\n rebind(binding: FieldBinding): void {\n this.#noting = true;\n const text = textColumnOf(binding);\n if ((text === undefined) !== (this.#textColumn === undefined) || binding.columns.length !== this.#binding.columns.length) {\n throw new Error(`Internal: '${binding.field.name}' is bound to columns of other kinds in the next version.`);\n }\n this.#binding = binding;\n this.#textColumn = text;\n this.#fold();\n }\n\n /** Whether the field is one Text column's, whose Items are its dictionary's spellings and (blank). */\n get isText(): boolean {\n return this.#textColumn !== undefined && this.#binding.single !== undefined;\n }\n\n /** The (blank) Item's index, or \u22121 while no row has been Blank. */\n get blankItem(): number {\n return this.#blank;\n }\n\n /** Takes a row away from the spellings counted (ADR-0067): the row is no longer held, and a spelling no\n * row carries any more no longer labels its Item. Read in the version the row was held in. */\n unmap(row: number): void {\n const column = this.#textColumn;\n if (column === undefined) return;\n const code = column.codeAt(row);\n if (code < 0) return;\n this.#presence[code] = elementAt(this.#presence, code) - 1;\n this.changedItems.add(elementAt(this.#itemOfCode, code));\n }\n\n /** Forgets the Items {@link changedItems} names. */\n clearChanges(): void {\n this.changedItems.clear();\n }\n\n /** How many Items the space has handed out. */\n get count(): number {\n return this.#keys.length;\n }\n\n /** Whether the field hides any Item. */\n get hidesAny(): boolean {\n return this.#hiddenKeys !== undefined;\n }\n\n /** Whether an Item is hidden. */\n isHidden(item: number): boolean {\n return elementAt(this.#hidden, item);\n }\n\n /** The Item's key, a text Item by its lowest code's text. */\n keyOf(item: number): ItemKey {\n return elementAt(this.#keys, item);\n }\n\n /** The public key of an Item: a text Item spelled as the first of its codes some row carries. */\n publicKeyOf(item: number): PivotItemKey {\n return elementAt(this.#firstCode, item) < 0 ? toPublicKey(this.keyOf(item)) : textItemKey(this.#spelling(item));\n }\n\n /** The engine's key of an Item, a text Item spelled as {@link publicKeyOf} spells it. */\n spelledKeyOf(item: number): ItemKey {\n return elementAt(this.#firstCode, item) < 0 ? this.keyOf(item) : ItemKeys.text(this.#spelling(item));\n }\n\n #spelling(item: number): string {\n const column = defined(this.#textColumn);\n for (let code = elementAt(this.#firstCode, item); code >= 0; code = elementAt(this.#nextCode, code)) {\n if (elementAt(this.#presence, code) > 0) return elementAt(column.dictionary, code);\n }\n return elementAt(column.dictionary, elementAt(this.#firstCode, item));\n }\n\n // The Text column's dictionary, folded ignoring case in code order from the first code not folded yet: a\n // spelling joins the Item of an earlier one, or starts one.\n #fold(): void {\n const column = this.#textColumn;\n if (column === undefined) return;\n const dictionary = column.dictionary;\n for (let code = this.#itemOfCode.length; code < dictionary.length; code++) {\n const text = elementAt(dictionary, code);\n const folded = foldedText(text);\n let item = this.#itemOfText.get(folded);\n if (item === undefined) {\n item = this.#add(ItemKeys.text(text));\n this.#itemOfText.set(folded, item);\n this.#firstCode[item] = code;\n } else {\n this.#nextCode[elementAt(this.#lastCode, item)] = code;\n }\n this.#lastCode[item] = code;\n this.#itemOfCode.push(item);\n this.#nextCode.push(-1);\n this.#presence.push(0);\n }\n }\n\n /** The Items of rows [`from`, `from + items.length`), each text code counted. */\n map(from: number, items: Int32Array): void {\n const single = this.binding.single;\n if (single !== undefined) {\n this.#mapColumn(single, from, items, true);\n return;\n }\n items.fill(-1);\n for (const column of this.binding.columns) this.#mapColumn(column, from, items, false);\n for (let i = 0; i < items.length; i++) {\n if (elementAt(items, i) < 0) items[i] = this.#blankItem();\n }\n }\n\n #mapColumn(column: SnapshotColumn, from: number, items: Int32Array, blanks: boolean): void {\n for (let i = 0; i < items.length; i++) {\n const row = from + i;\n if (column.kind === 'text') {\n const code = column.codeAt(row);\n if (code < 0) {\n if (blanks) items[i] = this.#blankItem();\n continue;\n }\n const item = elementAt(this.#itemOfCode, code);\n items[i] = item;\n this.#presence[code] = elementAt(this.#presence, code) + 1;\n // Once batches are folded in, a row brought may change its Item's spelling.\n if (this.#noting) this.changedItems.add(item);\n continue;\n }\n if (column.isBlank(row)) {\n if (blanks) items[i] = this.#blankItem();\n continue;\n }\n items[i] = this.#itemOfValue(column, row);\n }\n }\n\n #itemOfValue(column: SnapshotColumn, row: number): number {\n switch (column.kind) {\n case 'decimal': return this.#number(decimalToNumber(present(column.valueAt(row))));\n case 'integer': return this.#number(Number(present(column.valueAt(row))));\n case 'double': return this.#number(present(column.valueAt(row)));\n case 'date': {\n const ticks = present(column.valueAt(row));\n const part = this.binding.part;\n return part === undefined ? this.#date(ticks) : this.#part(datePartOfTicks(part, ticks));\n }\n case 'boolean': return this.#boolean(present(column.valueAt(row)));\n case 'text': throw new Error('Internal: text is mapped by its codes.');\n default: return unreachable(column);\n }\n }\n\n #blankItem(): number {\n if (this.#blank < 0) this.#blank = this.#add(ItemKeys.blank);\n return this.#blank;\n }\n\n #boolean(value: boolean): number {\n if (value) {\n if (this.#true < 0) this.#true = this.#add(ItemKeys.boolean(true));\n return this.#true;\n }\n if (this.#false < 0) this.#false = this.#add(ItemKeys.boolean(false));\n return this.#false;\n }\n\n #number(value: number): number {\n if (!Number.isFinite(value)) {\n if (this.#error < 0) this.#error = this.#add(ItemKeys.error);\n return this.#error;\n }\n const number = value === 0 ? 0 : value;\n let item = this.#numbers.get(number);\n if (item === undefined) {\n item = this.#add(ItemKeys.number(number));\n this.#numbers.set(number, item);\n }\n return item;\n }\n\n #date(ticks: bigint): number {\n let item = this.#dates.get(ticks);\n if (item === undefined) {\n item = this.#add(ItemKeys.date(ticks));\n this.#dates.set(ticks, item);\n }\n return item;\n }\n\n #part(value: number): number {\n let item = this.#parts.get(value);\n if (item === undefined) {\n item = this.#add(ItemKeys.number(value));\n this.#parts.set(value, item);\n }\n return item;\n }\n\n #add(key: ItemKey): number {\n const item = this.#keys.length;\n this.#keys.push(key);\n this.#hidden.push(this.#hiddenKeys?.has(keyIdOf(key)) === true);\n this.#firstCode.push(-1);\n return item;\n }\n}\n\nfunction exactColumnOf(binding: FieldBinding): DecimalColumn | IntegerColumn | undefined {\n const single = binding.single;\n return single !== undefined && (single.kind === 'decimal' || single.kind === 'integer') && binding.part === undefined ? single : undefined;\n}\n\nfunction textColumnOf(binding: FieldBinding): TextColumn | undefined {\n let text: TextColumn | undefined;\n for (const column of binding.columns) {\n if (column.kind === 'text') text = column;\n }\n return text;\n}\n\nfunction present<T>(value: T | null): T {\n if (value === null) throw new Error('Internal: a value that is not Blank reads as null.');\n return value;\n}\n\nfunction defined<T>(value: T | undefined): T {\n if (value === undefined) throw new Error('Internal: a text Item without its Text column.');\n return value;\n}\n\n// ---- Leaves -------------------------------------------------------------------------------------\n\n/**\n * The leaves of one question (ADR-0066): one per combination of the row and column fields' Items that has\n * an included record, each with its Items and its record count, made in the order their first rows are\n * read. A trie of Items, a Map a level.\n */\nclass LeafIndex {\n readonly itemOfLeaf: number[][];\n readonly records: number[] = [];\n readonly #levels: number;\n readonly #maxLeaves: number;\n readonly #children: Map<number, number>[] = [new Map<number, number>()];\n\n constructor(levels: number, maxLeaves: number) {\n this.#levels = levels;\n this.#maxLeaves = maxLeaves;\n this.itemOfLeaf = Array.from({ length: levels }, () => []);\n }\n\n get count(): number {\n return this.records.length;\n }\n\n /**\n * Finds or makes the leaf of each row of a chunk; an excluded row gets \u22121. Answers how many rows were\n * consumed: all of them, or \u2014 when a new leaf would pass the cap \u2014 the rows before the one that would\n * make it, and `refused` (ADR-0066: the question is refused as soon as the cap is passed).\n */\n assign(items: readonly Int32Array[], excluded: Uint8Array, leaves: Int32Array, bounded = true): { consumed: number; refused: boolean } {\n for (let i = 0; i < leaves.length; i++) {\n if (elementAt(excluded, i) !== 0) {\n leaves[i] = -1;\n continue;\n }\n let leaf: number;\n if (this.#levels === 0) {\n if (this.count === 0 && bounded && !this.#canMake()) return { consumed: i, refused: true };\n if (this.count === 0) this.#make(items, i);\n leaf = 0;\n } else {\n let node = 0;\n for (let level = 0; level < this.#levels - 1; level++) {\n const children = elementAt(this.#children, node);\n const item = elementAt(elementAt(items, level), i);\n let next = children.get(item);\n if (next === undefined) {\n next = this.#children.length;\n this.#children.push(new Map());\n children.set(item, next);\n }\n node = next;\n }\n const last = elementAt(this.#children, node);\n const item = elementAt(elementAt(items, this.#levels - 1), i);\n let found = last.get(item);\n if (found === undefined) {\n if (bounded && !this.#canMake()) return { consumed: i, refused: true };\n found = this.#make(items, i);\n last.set(item, found);\n }\n leaf = found;\n }\n this.records[leaf] = elementAt(this.records, leaf) + 1;\n leaves[i] = leaf;\n }\n return { consumed: leaves.length, refused: false };\n }\n\n #canMake(): boolean {\n return this.count < this.#maxLeaves;\n }\n\n /** How many leaves hold a record: the leaves a fresh pass over the same rows would make. */\n get held(): number {\n let held = 0;\n for (const records of this.records) if (records > 0) held++;\n return held;\n }\n\n /** Whether a fresh pass over the rows held would make more leaves than the cap. */\n get passesCap(): boolean {\n return this.held > this.#maxLeaves;\n }\n\n #make(items: readonly Int32Array[], row: number): number {\n const leaf = this.records.length;\n this.records.push(0);\n for (let level = 0; level < this.#levels; level++) elementAt(this.itemOfLeaf, level).push(elementAt(elementAt(items, level), row));\n return leaf;\n }\n}\n\n// ---- Values -------------------------------------------------------------------------------------\n\n/**\n * One field in Values, accumulated at each leaf into the parts asked for (ADR-0060/0066). An Integer or\n * Decimal column is summed exactly as a whole number at a power of ten, so the order its numbers arrive in\n * cannot change the sum, and the finished sum is a decimal without trailing zeros, or a double where no\n * decimal holds it. A Double column is summed per row with Neumaier's compensation. Text, dates and Booleans\n * are counted and are never a number. A field read through an accessor whose values are of several kinds is\n * folded per row in the data's order, each value by its own kind.\n *\n * The whole number is kept in 128 bits, as C# keeps it, and past them the sum is a double from then on. C#\n * adds a run of a segment's 64-bit numbers before folding it into the sum, where this adds them one by one:\n * the two leave for double at the same number save where a sum within a run's reach of 2^127 is brought\n * back by the run's later numbers, and after leaving, C#'s double adds a run's total where this adds each.\n */\nclass ValueAccumulator {\n readonly field: string;\n readonly columns: PartColumns;\n #binding: FieldBinding;\n #exact: DecimalColumn | IntegerColumn | undefined;\n readonly #sum: boolean;\n readonly #extremes: boolean;\n readonly #perRow: boolean;\n // Each leaf's exact sum: a whole number at a power of ten.\n readonly #wide: bigint[] = [];\n readonly #wideScale: number[] = [];\n // The largest magnitude of a whole number summed, and the scales met: what bounds every partial sum a\n // fresh pass could reach, in any order (ADR-0067).\n #largest = 0n;\n #leastScale = Number.POSITIVE_INFINITY;\n #mostScale = 0;\n\n /** `absolutes`: the sum of each leaf's magnitudes is kept beside its sum, for a level answer (ADR-0370\n * section 3). */\n constructor(binding: FieldBinding, parts: number, absolutes = false) {\n this.field = binding.field.name;\n this.#binding = binding;\n this.columns = new PartColumns(parts);\n if (absolutes && (parts & partSum) !== 0) this.columns.trackAbsolutes();\n this.#exact = exactColumnOf(binding);\n this.#sum = (parts & partSum) !== 0;\n this.#extremes = (parts & partExtremes) !== 0;\n this.#perRow = (parts & (partProduct | partVariance)) !== 0;\n }\n\n /** The accumulator over the next version of the Snapshot: `binding` reads the same column there. */\n rebind(binding: FieldBinding): void {\n const exact = exactColumnOf(binding);\n if ((exact === undefined) !== (this.#exact === undefined) || binding.single?.kind !== this.#binding.single?.kind) {\n throw new Error(`Internal: '${binding.field.name}' is bound to a column of another kind in the next version.`);\n }\n this.#binding = binding;\n this.#exact = exact;\n }\n\n /**\n * Whether every part asked for is kept by subtraction and addition, in any order (ADR-0067): the counts,\n * and the sum of an Integer or a Decimal column, which is a whole number. Extremes, a product, a variance\n * and a Double's sum are recomputed from a leaf's records whenever a batch touches it.\n */\n get subtracts(): boolean {\n if (this.#binding.single === undefined || this.#extremes || this.#perRow) return false;\n return !this.#sum || this.#exact !== undefined;\n }\n\n /**\n * Takes row `row` of the version it was held in out of its leaf, as {@link accumulate} put it in; false\n * where the leaf cannot be kept so \u2014 a non-finite number left, a sum already a double, or a whole number\n * that would no longer fit \u2014 and is to be recomputed from its records.\n */\n trySubtract(leaf: number, row: number): boolean {\n const single = this.#binding.single;\n // A magnitude subtracted is not the sum the records' order adds: the leaf is recomputed.\n if (single === undefined || !this.subtracts) return false;\n const counts = elementAt(this.columns.counts, leaf);\n if (this.#binding.part !== undefined) {\n if (!single.isBlank(row)) counts.values--;\n return true;\n }\n switch (single.kind) {\n case 'decimal':\n case 'integer': {\n if (single.isBlank(row)) return true;\n if (this.#sum) {\n if (elementAt(defined(this.columns.sums), leaf).inexact) return false;\n const value = single.kind === 'decimal' ? present(single.valueAt(row)) : decimalOfWhole(present(single.valueAt(row)));\n const taken = wideAdd(elementAt(this.#wide, leaf), elementAt(this.#wideScale, leaf), -value.mantissa, value.scale);\n if (taken === undefined) return false;\n this.#wide[leaf] = taken.sum;\n this.#wideScale[leaf] = taken.scale;\n }\n counts.values--;\n counts.numbers--;\n return true;\n }\n case 'double': {\n if (single.isBlank(row)) return true;\n if (!Number.isFinite(present(single.valueAt(row)))) return false;\n counts.values--;\n counts.numbers--;\n return true;\n }\n case 'text':\n if (single.codeAt(row) >= 0) counts.values--;\n return true;\n case 'date':\n case 'boolean':\n if (!single.isBlank(row)) counts.values--;\n return true;\n default:\n return unreachable(single);\n }\n }\n\n /**\n * Whether a leaf's exact sum is what a fresh pass would make of its records in any order: no partial sum\n * of them can pass the 128 bits a whole number is kept in, so none goes over to a double. Where one\n * could, the leaf is recomputed in the Snapshot's order, as a fresh pass sums it.\n */\n keepsExactly(leaf: number): boolean {\n if (this.#exact === undefined || !this.#sum) return true;\n if (elementAt(defined(this.columns.sums), leaf).inexact) return false;\n const numbers = BigInt(elementAt(this.columns.counts, leaf).numbers);\n if (numbers === 0n) return true;\n const spread = BigInt(this.#mostScale - this.#leastScale);\n return numbers * this.#largest * 10n ** spread < 1n << 126n;\n }\n\n /** Empties a leaf, to be accumulated again from its records. */\n reset(leaf: number): void {\n this.columns.resetCell(leaf);\n this.#wide[leaf] = 0n;\n this.#wideScale[leaf] = 0;\n }\n\n /** Room for `leaves` leaves. */\n ensureLeaves(leaves: number): void {\n while (this.columns.count < leaves) {\n this.columns.addCell();\n this.#wide.push(0n);\n this.#wideScale.push(0);\n }\n }\n\n /** Folds rows [`from`, `from + leaves.length`) into their leaves; a row whose leaf is \u22121 is not read. */\n accumulate(from: number, leaves: Int32Array): void {\n const single = this.#binding.single;\n if (single === undefined) {\n this.#accumulateVariant(from, leaves);\n return;\n }\n for (let i = 0; i < leaves.length; i++) {\n const leaf = elementAt(leaves, i);\n if (leaf < 0) continue;\n const row = from + i;\n if (this.#binding.part !== undefined) {\n if (!single.isBlank(row)) this.columns.addOther(leaf);\n continue;\n }\n switch (single.kind) {\n case 'decimal':\n if (!single.isBlank(row)) this.#addExact(leaf, present(single.valueAt(row)));\n break;\n case 'integer':\n if (!single.isBlank(row)) this.#addExact(leaf, decimalOfWhole(present(single.valueAt(row))));\n break;\n case 'double':\n if (!single.isBlank(row)) this.columns.addDouble(leaf, present(single.valueAt(row)));\n break;\n case 'text':\n if (single.codeAt(row) >= 0) this.columns.addOther(leaf);\n break;\n case 'date':\n case 'boolean':\n if (!single.isBlank(row)) this.columns.addOther(leaf);\n break;\n default:\n unreachable(single);\n }\n }\n }\n\n // An exact column's number: counted, its sum kept as a whole number, its extremes compared exactly, and\n // the parts kept in double given the double C# converts its decimal to.\n #addExact(leaf: number, value: SnapshotDecimal): void {\n const counts = elementAt(this.columns.counts, leaf);\n const first = counts.numbers === 0;\n if (this.#sum) {\n const magnitude = value.mantissa < 0n ? -value.mantissa : value.mantissa;\n if (magnitude > this.#largest) this.#largest = magnitude;\n if (value.scale < this.#leastScale) this.#leastScale = value.scale;\n if (value.scale > this.#mostScale) this.#mostScale = value.scale;\n this.#addToSum(leaf, value);\n this.columns.addAbsolute(leaf, decimalToNumber(value));\n }\n if (this.#extremes) {\n const extremes = elementAt(defined(this.columns.extremes), leaf);\n if (first) {\n extremes.exactMin = value;\n extremes.exactMax = value;\n } else {\n if (decimalCompare(value, extremes.exactMin) < 0) extremes.exactMin = value;\n if (decimalCompare(value, extremes.exactMax) > 0) extremes.exactMax = value;\n }\n }\n if (this.#perRow) this.columns.addInexactParts(leaf, decimalToNumber(value), counts.numbers + 1);\n counts.values++;\n counts.numbers++;\n }\n\n // Adds a number to a leaf's exact sum; past 128 bits, the sum is a double from then on \u2014 money stays\n // exact until it cannot, then takes Excel's own arithmetic (ADR-0060).\n #addToSum(leaf: number, value: SnapshotDecimal): void {\n const sum = elementAt(defined(this.columns.sums), leaf);\n if (sum.inexact) {\n neumaier(sum, decimalToNumber(value));\n return;\n }\n const wide = elementAt(this.#wide, leaf);\n const wideScale = elementAt(this.#wideScale, leaf);\n const added = wideAdd(wide, wideScale, value.mantissa, value.scale);\n if (added !== undefined) {\n this.#wide[leaf] = added.sum;\n this.#wideScale[leaf] = added.scale;\n return;\n }\n sum.inexact = true;\n sum.double = doubleOfWide(wide, wideScale);\n sum.compensation = 0;\n neumaier(sum, decimalToNumber(value));\n }\n\n #accumulateVariant(from: number, leaves: Int32Array): void {\n for (let i = 0; i < leaves.length; i++) {\n const leaf = elementAt(leaves, i);\n if (leaf < 0) continue;\n const row = from + i;\n const column = this.#binding.columns.find(candidate => !candidate.isBlank(row));\n if (column === undefined) continue;\n switch (column.kind) {\n case 'decimal':\n this.columns.addExact(leaf, present(column.valueAt(row)));\n break;\n case 'integer':\n this.columns.addExact(leaf, decimalOfWhole(present(column.valueAt(row))));\n break;\n case 'double':\n this.columns.addDouble(leaf, present(column.valueAt(row)));\n break;\n case 'text':\n case 'date':\n case 'boolean':\n this.columns.addOther(leaf);\n break;\n default:\n unreachable(column);\n }\n }\n }\n\n /** The finished parts of the leaves `order` names, in that order. */\n finished(order: readonly number[]): PartColumns {\n const finished = new PartColumns(this.columns.parts);\n if (this.columns.absolutes !== undefined) finished.trackAbsolutes();\n for (const leaf of order) {\n const cell = finished.copyCell(this.columns, leaf);\n const sum: SumPart | undefined = this.#exact !== undefined && this.#sum ? elementAt(defined(finished.sums), cell) : undefined;\n if (sum !== undefined && !sum.inexact) {\n const wide = elementAt(this.#wide, leaf);\n const scale = elementAt(this.#wideScale, leaf);\n const exact = decimalOfSum(wide, scale);\n if (exact !== undefined) {\n sum.exact = exact;\n } else {\n sumToInexact(sum);\n sum.double = doubleOfSum(wide, scale);\n }\n }\n }\n finished.finish();\n finished.canonicalize();\n return finished;\n }\n}\n\n// ---- The pass -----------------------------------------------------------------------------------\n\n/**\n * One question's pass over a Snapshot. Every axis field's Items are taken for every row, left out or not:\n * Items are over all the data, and so is a text Item's first spelling (ADR-0060).\n *\n * When it keeps its rows (`keepRows`, over a Snapshot with a Record Key), it remembers each row's leaf, and\n * each row's Item of a field that is not one Text column's: a Change Batch is then folded into it\n * ({@link fold}) rather than read again (ADR-0067). After any sequence of batches it answers what a fresh\n * pass over the Snapshot they made answers, read in that Snapshot's order: the same leaves and Items, in the\n * same order, and every part to the last bit.\n */\nexport class AggregationPass {\n readonly query: PivotQuery;\n #snapshot: Snapshot;\n readonly #axis: ItemSpace[];\n readonly #filters: ItemSpace[];\n readonly #leaves: LeafIndex;\n readonly #values: ValueAccumulator[];\n #refusal: PivotSourceRefusal | undefined;\n #read = 0;\n // The rows kept (ADR-0067): each row's leaf, \u22121 for a row a Hidden Item leaves out; and each row's Item\n // of an axis field whose Items are met in the rows' order, for the order they were met in.\n #leafOf: Int32Array | undefined;\n #rowItems: (Int32Array | undefined)[];\n // Each kept row's place in the order the rows came, which a batch never reorders: a fresh pass's row\n // number until a batch is folded in. A changed record takes the place of a row the batch removed where it\n // stands, a record added a place after every other; so a leaf's first row by place is where a fresh pass\n // first meets it, though the rows are numbered again (ADR-0153).\n #places: Int32Array | undefined;\n #nextPlace = 0;\n // Whether a batch has been folded in: the Items and leaves are then numbered as they came, and the\n // answer lists them in the order a fresh pass would have met them.\n #folded = false;\n // The leaves the batches folded in since the last clearChanges took records from or brought them to.\n readonly #changedLeaves = new Set<number>();\n\n /** `levels`: the pass makes the leaves a level answer is merged from (ADR-0370 section 3) \u2014 as many as\n * there are, past the question's cap, each sum with the sum of its magnitudes beside it \u2014 and is never\n * kept. */\n constructor(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>, query: PivotQuery, keepRows = false, levels = false) {\n if (levels && keepRows) throw new Error('Internal: the pass a level answer is merged from is not kept.');\n this.query = query;\n this.#snapshot = snapshot;\n this.#axis = [...query.rows, ...query.columns].map(f => new ItemSpace(boundIn(bindings, f.field), f.hiddenItems));\n this.#filters = query.filters.filter(f => f.hiddenItems.length > 0).map(f => new ItemSpace(boundIn(bindings, f.field), f.hiddenItems));\n this.#values = query.values.map(v => new ValueAccumulator(boundIn(bindings, v.field), partBits(v.parts), levels));\n this.#leaves = new LeafIndex(this.#axis.length, levels ? Number.POSITIVE_INFINITY : query.maxLeaves);\n if (keepRows) {\n if ([...this.#axis, ...this.#filters].some(space => space.binding.single === undefined)) {\n throw new Error('Internal: a pass keeps the rows of a Snapshot whose fields each read one column.');\n }\n this.#leafOf = new Int32Array(snapshot.rowCount).fill(-1);\n }\n this.#rowItems = this.#axis.map(space => (keepRows && !space.isText ? new Int32Array(snapshot.rowCount) : undefined));\n }\n\n /** The Snapshot the pass has read: the one it began on, or the one the last batch folded in made. */\n get snapshot(): Snapshot {\n return this.#snapshot;\n }\n\n /** How many rows the pass steps over. */\n get rowCount(): number {\n return this.#snapshot.rowCount;\n }\n\n /** The refusal, once the answer would pass the cap on leaves. */\n get refusal(): PivotSourceRefusal | undefined {\n return this.#refusal;\n }\n\n /** How many leaves the pass has made, holding records or not. */\n get leafCount(): number {\n return this.#leaves.count;\n }\n\n /** How many records a leaf holds now: 0 for one a batch emptied. */\n recordsOf(leaf: number): number {\n return elementAt(this.#leaves.records, leaf);\n }\n\n /** The Item a leaf has at a level of the axes, the row fields' then the column fields'. */\n itemOfLeaf(level: number, leaf: number): number {\n return elementAt(elementAt(this.#leaves.itemOfLeaf, level), leaf);\n }\n\n /** The Items of a level of the axes, the row fields' then the column fields'. */\n axis(level: number): ItemSpace {\n return elementAt(this.#axis, level);\n }\n\n /** The leaves the batches folded in since {@link clearChanges} took records from or brought them to\n * (ADR-0153). */\n get changedLeaves(): ReadonlySet<number> {\n return this.#changedLeaves;\n }\n\n /** Forgets the leaves and Items the batches folded in so far touched. */\n clearChanges(): void {\n this.#changedLeaves.clear();\n for (const space of [...this.#axis, ...this.#filters]) space.clearChanges();\n }\n\n /** Each field in Values, finished at the leaves named, in that order: the parts an answer carries for them. */\n partsOf(leaves: readonly number[]): readonly PartColumns[] {\n return this.#values.map(values => values.finished(leaves));\n }\n\n /**\n * Where a fresh pass over the Snapshot first meets each leaf, by leaf: the place of its first record, which\n * orders the leaves as the answer lists them and as a total merges them, and which a batch moves only for a\n * leaf it touched (ADR-0153). A pass that keeps no\n * rows numbers its leaves as their first rows come, so a leaf's number stands for its row. A leaf that\n * holds no record has none: the largest number.\n */\n firstRows(): Int32Array {\n const count = this.#leaves.count;\n const leafOf = this.#leafOf;\n const first = new Int32Array(count).fill(noFirstRow);\n if (leafOf === undefined) {\n for (let leaf = 0; leaf < count; leaf++) if (elementAt(this.#leaves.records, leaf) > 0) first[leaf] = leaf;\n return first;\n }\n const places = this.#places;\n for (let row = leafOf.length - 1; row >= 0; row--) {\n const leaf = elementAt(leafOf, row);\n if (leaf >= 0) first[leaf] = places === undefined ? row : elementAt(places, row);\n }\n return first;\n }\n\n /** Reads the next rows, up to `to`, a chunk at a time; false once the question is refused. */\n step(to: number): boolean {\n while (this.#read < to) {\n const n = Math.min(chunkRows, to - this.#read);\n if (!this.#chunk(this.#read, n)) return false;\n this.#read += n;\n }\n return true;\n }\n\n #chunk(at: number, n: number): boolean {\n const { items, leaves, refused } = this.#assign(at, n, true);\n if (refused) {\n this.#refusal = PivotRefusals.tooManyLeaves(this.query.maxLeaves);\n return false;\n }\n this.#keep(at, items, leaves);\n for (const values of this.#values) {\n values.ensureLeaves(this.#leaves.count);\n values.accumulate(at, leaves);\n }\n return true;\n }\n\n // The Items and the leaves of rows [at, at + n): each placed field's Items, the rows a Hidden Item leaves\n // out, and the leaf of every other row.\n #assign(at: number, n: number, bounded: boolean): { items: Int32Array[]; leaves: Int32Array; refused: boolean } {\n const excluded = new Uint8Array(n);\n const items = this.#axis.map(space => {\n const mapped = new Int32Array(n);\n space.map(at, mapped);\n if (space.hidesAny) exclude(space, mapped, excluded);\n return mapped;\n });\n for (const filter of this.#filters) {\n const mapped = new Int32Array(n);\n filter.map(at, mapped);\n exclude(filter, mapped, excluded);\n }\n const leaves = new Int32Array(n);\n const { refused } = this.#leaves.assign(items, excluded, leaves, bounded);\n return { items, leaves, refused };\n }\n\n #keep(at: number, items: readonly Int32Array[], leaves: Int32Array): void {\n this.#leafOf?.set(leaves, at);\n this.#rowItems.forEach((kept, level) => kept?.set(elementAt(items, level), at));\n }\n\n /**\n * Brings the pass from the Snapshot it has read to the next version a Change Batch made (ADR-0067),\n * without reading again the rows the batch did not touch; `bindings` are the fields bound to that\n * version. False when it cannot \u2014 `change` does not start from the Snapshot read, it removes rows from a\n * pass that kept none, or a fresh pass would now pass the cap on leaves \u2014 and the pass is then to be\n * dropped, half folded, and the question asked afresh.\n *\n * 1. Each row removed, read in the version before, leaves its spellings and its leaf: the counts and an\n * Integer or Decimal sum by subtraction, a whole number's, which is exact in any order; a leaf whose\n * other parts it held is marked.\n * 2. The rows of the next version are the rows kept, in their order, and the rows the batch brought, in\n * their places: a changed record where the one it replaces stood, an added one at the end. Each row\n * brought is read as the pass reads any row; Items that first appear bring their leaves. A part kept\n * by subtraction takes its number in; any other part does where the row comes after every row kept,\n * as a fresh pass would take it last, and its leaf is marked where it does not.\n * 3. The marked leaves are recomputed from their rows, in the Snapshot's order, as a fresh pass computes\n * them: every step of a double counts.\n */\n fold(change: SnapshotChange, bindings: ReadonlyMap<string, FieldBinding>): boolean {\n if (change.before !== this.#snapshot || this.#refusal !== undefined || this.#read !== this.#snapshot.rowCount) return false;\n const leafOf = this.#leafOf;\n if (leafOf === undefined && change.removed.length > 0) return false;\n const marked = this.#values.map(() => new Set<number>());\n const touched = new Set<number>();\n const records = this.#leaves.records;\n\n // 1. The rows removed, read in the version before.\n for (const row of change.removed) {\n for (const space of [...this.#axis, ...this.#filters]) space.unmap(row);\n const leaf = leafOf === undefined ? -1 : elementAt(leafOf, row);\n if (leaf < 0) continue;\n records[leaf] = elementAt(records, leaf) - 1;\n touched.add(leaf);\n this.#changedLeaves.add(leaf);\n this.#values.forEach((values, v) => {\n const leaves = elementAt(marked, v);\n if (!leaves.has(leaf) && !values.trySubtract(leaf, row)) leaves.add(leaf);\n });\n }\n\n // 2. The rows of the next version.\n const after = change.after;\n for (const space of this.#axis) space.rebind(boundIn(bindings, space.binding.field.name));\n for (const space of this.#filters) space.rebind(boundIn(bindings, space.binding.field.name));\n for (const values of this.#values) values.rebind(boundIn(bindings, values.field));\n const rowCount = after.rowCount;\n const nextLeafOf = leafOf === undefined ? undefined : new Int32Array(rowCount);\n const nextItems = this.#rowItems.map(kept => (kept === undefined ? undefined : new Int32Array(rowCount)));\n const added = change.added;\n const places = this.#places;\n const placeOf = (row: number): number => (places === undefined ? row : elementAt(places, row));\n const nextPlaces = leafOf === undefined ? undefined : new Int32Array(rowCount);\n if (this.#places === undefined) this.#nextPlace = change.before.rowCount;\n // The last row of the next version that the one before held: a row brought after it comes last.\n let lastKept = -1;\n let removed = 0;\n let addedAt = 0;\n let before = 0;\n for (let row = 0; row < rowCount; row++) {\n if (addedAt < added.length && elementAt(added, addedAt) === row) {\n addedAt++;\n if (nextPlaces === undefined) continue;\n if (removed < change.removed.length && elementAt(change.removed, removed) === before) {\n // A record brought where rows were removed takes the place of the first of them.\n nextPlaces[row] = placeOf(before);\n removed++;\n before++;\n } else {\n // One brought after every row kept takes a new place; one before a row kept that took no\n // removed row's place is not a batch's shape, and the question is asked afresh.\n if (before < change.before.rowCount || this.#nextPlace >= noFirstRow) return false;\n nextPlaces[row] = this.#nextPlace++;\n }\n continue;\n }\n while (removed < change.removed.length && elementAt(change.removed, removed) === before) {\n removed++;\n before++;\n }\n if (nextPlaces !== undefined) nextPlaces[row] = placeOf(before);\n if (nextLeafOf !== undefined && leafOf !== undefined) nextLeafOf[row] = elementAt(leafOf, before);\n nextItems.forEach((next, level) => {\n const kept = this.#rowItems[level];\n if (next !== undefined && kept !== undefined) next[row] = elementAt(kept, before);\n });\n lastKept = row;\n before++;\n }\n this.#leafOf = nextLeafOf;\n this.#places = nextPlaces;\n this.#rowItems = nextItems;\n for (let first = 0; first < added.length;) {\n let end = first + 1;\n while (end < added.length && elementAt(added, end) === elementAt(added, end - 1) + 1) end++;\n const at = elementAt(added, first);\n const n = end - first;\n const { items, leaves } = this.#assign(at, n, false);\n this.#keep(at, items, leaves);\n for (const leaf of leaves) {\n if (leaf < 0) continue;\n touched.add(leaf);\n this.#changedLeaves.add(leaf);\n }\n this.#values.forEach((values, v) => {\n values.ensureLeaves(this.#leaves.count);\n const leavesMarked = elementAt(marked, v);\n if (values.subtracts) {\n values.accumulate(at, leaves);\n return;\n }\n // Taken in where a fresh pass would take it, last; otherwise the leaf is recomputed.\n const taken = leaves.map((leaf, i) => {\n if (leaf < 0 || leavesMarked.has(leaf)) return -1;\n if (at + i > lastKept) return leaf;\n leavesMarked.add(leaf);\n return -1;\n });\n values.accumulate(at, taken);\n });\n first = end;\n }\n this.#snapshot = after;\n this.#read = rowCount;\n this.#folded = true;\n if (this.#leaves.passesCap) return false;\n\n // 3. The leaves whose parts subtraction cannot keep as a fresh pass makes them.\n this.#values.forEach((values, v) => {\n const leaves = elementAt(marked, v);\n if (values.subtracts) {\n for (const leaf of touched) if (!values.keepsExactly(leaf)) leaves.add(leaf);\n }\n });\n if (marked.every(leaves => leaves.size === 0)) return true;\n // A pass that kept no rows' leaves cannot find a leaf's rows: it is asked afresh.\n if (this.#leafOf === undefined) return false;\n this.#recompute(marked);\n return true;\n }\n\n // Each field's marked leaves, from nothing, over the rows each holds, in the Snapshot's order: the\n // operations a fresh pass performs on that leaf, in the same order, so the parts come out the same to\n // the last bit. One sweep over the rows serves every field.\n #recompute(marked: readonly ReadonlySet<number>[]): void {\n const leafOf = defined(this.#leafOf);\n const fields = this.#values.flatMap((values, v) => {\n const leaves = elementAt(marked, v);\n if (leaves.size === 0) return [];\n const of = new Uint8Array(this.#leaves.count);\n for (const leaf of leaves) {\n values.reset(leaf);\n of[leaf] = 1;\n }\n return [{ values, of, masked: new Int32Array(chunkRows) }];\n });\n for (let at = 0; at < leafOf.length; at += chunkRows) {\n const n = Math.min(chunkRows, leafOf.length - at);\n for (const { values, of, masked } of fields) {\n let any = false;\n for (let i = 0; i < n; i++) {\n const leaf = elementAt(leafOf, at + i);\n const take = leaf >= 0 && elementAt(of, leaf) === 1;\n masked[i] = take ? leaf : -1;\n any ||= take;\n }\n if (any) values.accumulate(at, masked.subarray(0, n));\n }\n }\n }\n\n /** The Leaf Aggregates (ADR-0066): the leaves in the order their first rows come; each axis field's\n * Items that some leaf carries, in the order they were met, a text Item spelled by its first spelling\n * among the records; and each field in Values, finished. */\n answer(sourceVersion: string): PivotAnswer {\n return runWhole(this.answerSteps(sourceVersion));\n }\n\n /** {@link answer}, a step at a time: it yields after each piece of work, for a caller to slice (PV-40). */\n *answerSteps(sourceVersion: string): Generator<void, PivotAnswer> {\n if (this.#refusal !== undefined) return PivotAnswer.refused(this.#refusal);\n const order = yield* this.#leafOrder();\n const axes: PivotAnswerAxis[] = [];\n for (let level = 0; level < this.#axis.length; level++) {\n const space = elementAt(this.#axis, level);\n const itemOfLeaf = elementAt(this.#leaves.itemOfLeaf, level);\n const carried = new Uint8Array(space.count);\n for (const leaf of order) carried[elementAt(itemOfLeaf, leaf)] = 1;\n const renumbered = new Int32Array(space.count).fill(-1);\n const keys: PivotItemKey[] = [];\n for (const item of yield* this.#itemOrder(level)) {\n if (elementAt(carried, item) === 0) continue;\n renumbered[item] = keys.length;\n keys.push(space.publicKeyOf(item));\n }\n yield;\n const field = space.binding.field.name;\n axes.push(new PivotAnswerAxis(field, keys, order.map(leaf => elementAt(renumbered, elementAt(itemOfLeaf, leaf)))));\n yield;\n }\n const records = order.map(leaf => elementAt(this.#leaves.records, leaf));\n const values: ReturnType<typeof answerValues>[] = [];\n for (const accumulator of this.#values) {\n values.push(answerValues(accumulator.field, accumulator.finished(order), order.length));\n yield;\n }\n const rows = this.query.rows.length;\n return madeAnswer(sourceVersion, axes.slice(0, rows), axes.slice(rows), order.length, records, values);\n }\n\n // The leaves that hold records, in the order a fresh pass makes them: the order of their first rows.\n *#leafOrder(): Generator<void, number[]> {\n const held = this.#leaves.records.flatMap((records, leaf) => (records > 0 ? [leaf] : []));\n const leafOf = this.#leafOf;\n if (!this.#folded || leafOf === undefined) return held;\n const first = new Float64Array(this.#leaves.count).fill(Number.POSITIVE_INFINITY);\n for (let row = leafOf.length - 1; row >= 0; row--) {\n const leaf = elementAt(leafOf, row);\n if (leaf >= 0) first[leaf] = row;\n if (row % chunkRows === 0) yield;\n }\n return held.toSorted((a, b) => elementAt(first, a) - elementAt(first, b));\n }\n\n // A level's Items in the order a fresh pass meets them: a Text column's in its dictionary's order with\n // (blank) after them, any other field's in the order of the first rows that carry them.\n *#itemOrder(level: number): Generator<void, number[]> {\n const space = elementAt(this.#axis, level);\n const indexed = Array.from({ length: space.count }, (_, item) => item);\n if (!this.#folded) return indexed;\n if (space.isText) {\n const blank = space.blankItem;\n return blank < 0 ? indexed : [...indexed.filter(item => item !== blank), blank];\n }\n const rowItems = this.#rowItems[level];\n if (rowItems === undefined) return indexed;\n const first = new Float64Array(space.count).fill(Number.POSITIVE_INFINITY);\n for (let row = rowItems.length - 1; row >= 0; row--) {\n first[elementAt(rowItems, row)] = row;\n if (row % chunkRows === 0) yield;\n }\n return indexed.toSorted((a, b) => elementAt(first, a) - elementAt(first, b));\n }\n}\n\nfunction boundIn(bindings: ReadonlyMap<string, FieldBinding>, field: string): FieldBinding {\n const found = bindings.get(field);\n if (found === undefined) throw new Error(`Internal: '${field}' is not bound.`);\n return found;\n}\n\nfunction exclude(space: ItemSpace, items: Int32Array, excluded: Uint8Array): void {\n for (let i = 0; i < items.length; i++) {\n if (space.isHidden(elementAt(items, i))) excluded[i] = 1;\n }\n}\n\n/** A field's Items over all the data a Snapshot holds (ADR-0060/0066): every row's Item, not narrowed by any\n * Hidden Item, in the order they were met, a text Item spelled by its first spelling. */\nexport function itemsOfField(snapshot: Snapshot, binding: FieldBinding): readonly ItemKey[] {\n return runWhole(itemsOfFieldSteps(snapshot, binding));\n}\n\n/** {@link itemsOfField}, yielding after each chunk of rows (PV-40). */\nexport function* itemsOfFieldSteps(snapshot: Snapshot, binding: FieldBinding): Generator<void, readonly ItemKey[]> {\n const space = new ItemSpace(binding, undefined);\n const rows: number[] = [];\n for (let at = 0; at < snapshot.rowCount; at += chunkRows) {\n const n = Math.min(chunkRows, snapshot.rowCount - at);\n const items = new Int32Array(n);\n space.map(at, items);\n for (const item of items) rows[item] = (rows[item] ?? 0) + 1; // oxlint-disable-line ex-grid/no-stand-in-default -- an Item not met yet has no row\n yield;\n }\n const keys: ItemKey[] = [];\n for (let item = 0; item < space.count; item++) {\n if ((rows[item] ?? 0) > 0) keys.push(space.spelledKeyOf(item)); // oxlint-disable-line ex-grid/no-stand-in-default -- an Item no row carries has no row\n }\n return keys;\n}\n", "// The bundled sources' level answer (ADR-0370 section 3): for a question with levels whose leaves pass its cap,\n// a pass over every leaf there is, each sum with its magnitudes beside it, merged into the cells shown. The C#\n// engine's PivotLevelAnswers.AnswerAsync and FromLeavesAsync.\n//\n// Each leaf is merged, in the leaves' order, into every shown cell along it, as the cube merges a leaf into its\n// totals; the cells are numbered as the leaves first reach them, row groups deepest first and, within one,\n// column groups deepest first. The same arithmetic in the same order is what makes this answer the C#\n// engine's, bit for bit.\n//\n// Under a question's window, the cells are merged once to order each sibling set past the limit by its value\n// \u2014 among ties, by the order the leaves first reached them \u2014 and merged again with the siblings beyond each\n// margin merged into rest cells instead, a leaf at a time in the leaves' order, so a rest's parts are the\n// merge of its leaves as a cell's are.\n\nimport type { Snapshot } from '@ex-grid/data';\nimport { PartColumns } from '../aggregates/parts';\nimport { PivotAnswer, PivotAnswerAxis, PivotRefusals, answerColumns, answerValues, madeAnswer, type PivotAnswerWindow } from '../cube/answer';\nimport type { PivotLevelWindow, PivotLevels, PivotQuery } from '../cube/query';\nimport { publicKeyId, type PivotItemKey } from '../items/item-key';\nimport { defined, elementAt } from '../must';\nimport { AggregationPass, chunkRows } from '../source/aggregation-pass';\nimport type { FieldBinding } from '../source/binding';\nimport { inPieces, pieceUnits } from '../source/slicing';\nimport { cellPath, deepestShown, expandedItems, pathKey } from './level-shown';\n\n/** The level answer to `query` over `snapshot`, a step at a time (PV-40): a pass that is never kept \u2014 a Change\n * Batch is not folded into it \u2014 and the cells merged from its leaves. */\nexport function* levelAnswerSteps(snapshot: Snapshot, bindings: ReadonlyMap<string, FieldBinding>, query: PivotQuery, sourceVersion: string): Generator<void, PivotAnswer> {\n const pass = new AggregationPass(snapshot, bindings, query, false, true);\n for (let at = 0; at < pass.rowCount;) {\n const to = Math.min(pass.rowCount, at + chunkRows);\n if (!pass.step(to)) throw new Error('Internal: the pass a level answer is merged from has no cap to pass.');\n at = to;\n yield;\n }\n const leaves = yield* pass.answerSteps(sourceVersion);\n return yield* levelsFromLeavesSteps(query, leaves);\n}\n\n// Where a dropped sibling's leaves go: its window, by its provisional place, and the side.\ninterface Dropped {\n readonly window: number;\n readonly after: boolean;\n}\n\n// A window as the first merge plans it: its parent's path in the leaves' Items, its counts, and its dropped\n// siblings by their Item.\ninterface PlannedWindow {\n readonly parent: readonly number[];\n readonly before: number;\n readonly after: number;\n readonly dropped: ReadonlyMap<number, Dropped>;\n}\n\n// The cells merged from the leaves: each one's path in the leaves' Items, its rest code, its records and parts.\ninterface Merged {\n readonly paths: readonly (readonly number[])[];\n readonly rests: readonly number[];\n readonly records: readonly number[];\n readonly values: readonly PartColumns[];\n}\n\n/** The level answer to `query` merged from `leaves`, every leaf there is, each sum with its magnitudes beside\n * it; or, past the question's cap on cells, the refusal for it. A step at a time, as the cube is made. */\nexport function* levelsFromLeavesSteps(query: PivotQuery, leaves: PivotAnswer): Generator<void, PivotAnswer> {\n const levels = defined(query.levels, 'a level answer answers a question with levels');\n const window = levels.window;\n if (window === undefined || !levels.rows.some(rule => rule.order !== undefined)) {\n const whole = yield* mergeSteps(query, levels, leaves, undefined, false);\n return whole === undefined ? PivotAnswer.refused(PivotRefusals.tooManyLeaves(query.maxLeaves)) : answerOf(leaves, whole, []);\n }\n // The row groups at the grand total of the columns, every one, are what orders each set.\n const rowGroups = defined(yield* mergeSteps(query, levels, leaves, undefined, true), 'an uncapped merge is never refused');\n const planned = planWindows(levels, window, leaves, rowGroups);\n const cut = yield* mergeSteps(query, levels, leaves, planned.length === 0 ? undefined : windowTree(planned), false);\n if (cut === undefined) return PivotAnswer.refused(PivotRefusals.tooManyLeaves(query.maxLeaves));\n return answerOf(leaves, cut, planned);\n}\n\n// The planned windows by their parents' Items, level by level, so a leaf finds the window over each of its row\n// groups by its Items alone.\ninterface WindowTree {\n window: PlannedWindow | undefined;\n readonly children: Map<number, WindowTree>;\n}\n\nfunction windowTree(planned: readonly PlannedWindow[]): WindowTree {\n const root: WindowTree = { window: undefined, children: new Map() };\n for (const window of planned) {\n let node = root;\n for (const item of window.parent) {\n let child = node.children.get(item);\n if (child === undefined) {\n child = { window: undefined, children: new Map() };\n node.children.set(item, child);\n }\n node = child;\n }\n node.window = window;\n }\n return root;\n}\n\n// Merges every leaf into the cells shown along it; a leaf under a dropped sibling of a window is merged into that\n// window's rest cell instead, once a column group. Undefined past the cap; with `columnRootOnly`, only the cells at\n// the grand total of the columns, and never capped, for ordering each set before its window is cut.\nfunction* mergeSteps(query: PivotQuery, levels: PivotLevels, leaves: PivotAnswer, windows: WindowTree | undefined, columnRootOnly: boolean): Generator<void, Merged | undefined> {\n const capped = !columnRootOnly;\n const rows = leaves.rows;\n const columns = leaves.columns;\n const rowExpanded = expandedItems(levels.rows, rows);\n const columnExpanded = expandedItems(levels.columns, columns);\n const answered = leaves.values.map(answerColumns);\n const values = answered.map(other => {\n const parts = new PartColumns(other.parts);\n if (other.absolutes !== undefined) parts.trackAbsolutes();\n return parts;\n });\n const index = new Map<string, number>();\n const paths: number[][] = [];\n const rests: number[] = [];\n const records: number[] = [];\n // A leaf merges into as many cells as it has shown groups, each value's parts in each: a step falls about\n // every pieceUnits of them.\n const piece = Math.max(1, Math.floor(pieceUnits / ((rows.length + 1) * (columns.length + 1) * (1 + values.length))));\n for (let leaf = 0; leaf < leaves.leafCount; leaf++) {\n if (leaf > 0 && leaf % piece === 0) yield;\n const rowDeepest = deepestShown(rows, rowExpanded, leaf);\n const columnDeepest = columnRootOnly ? 0 : deepestShown(columns, columnExpanded, leaf);\n // The first level whose sibling along the leaf a window drops, and where its leaves go.\n let droppedAt = rowDeepest;\n let dropped: Dropped | undefined;\n let node = windows;\n for (let level = 0; level < rowDeepest && node !== undefined; level++) {\n const item = elementAt(rows, level).itemAt(leaf);\n const held = node.window?.dropped.get(item);\n if (held !== undefined) {\n droppedAt = level;\n dropped = held;\n break;\n }\n node = node.children.get(item);\n }\n for (let rowDepth = rowDeepest; rowDepth >= 0; rowDepth--) {\n if (dropped !== undefined && rowDepth > droppedAt + 1) continue;\n const rest = dropped !== undefined && rowDepth === droppedAt + 1 ? 2 * dropped.window + (dropped.after ? 1 : 0) : -1;\n for (let columnDepth = columnDeepest; columnDepth >= 0; columnDepth--) {\n const path = cellPath(rows, columns, leaf, rest < 0 ? rowDepth : droppedAt, columnDepth);\n const key = rest < 0 ? pathKey(path) : `${pathKey(path)}|${rest}`;\n let cell = index.get(key);\n if (cell === undefined) {\n cell = paths.length;\n if (capped && cell === query.maxLeaves) return undefined;\n index.set(key, cell);\n paths.push(path);\n rests.push(rest);\n records.push(0);\n for (const parts of values) parts.addCell();\n }\n records[cell] = elementAt(records, cell) + leaves.recordsAt(leaf);\n for (let v = 0; v < values.length; v++) elementAt(values, v).merge(cell, elementAt(answered, v), leaf);\n }\n }\n }\n for (const parts of values) {\n parts.finish();\n yield* inPieces(paths.length, 1, (from, to) => {\n parts.canonicalize(from, to);\n });\n }\n return { paths, rests, records, values };\n}\n\n// The windows of the sibling sets past the limit, outermost level first: a set under a sibling an outer window\n// drops is not answered, and has none.\nfunction planWindows(levels: PivotLevels, window: PivotLevelWindow, leaves: PivotAnswer, merged: Merged): PlannedWindow[] {\n const rows = leaves.rows;\n const rowCount = rows.length;\n // Each parent's children at the grand total of the columns, in the order the leaves first reached them.\n const children = new Map<string, number[]>();\n merged.paths.forEach((path, cell) => {\n if (path.slice(rowCount).some(item => item >= 0)) return;\n const depth = rowDepthOf(path, rowCount);\n if (depth === 0) return;\n const parent = path.slice(0, depth - 1).join(',');\n const siblings = children.get(parent);\n if (siblings === undefined) children.set(parent, [cell]);\n else siblings.push(cell);\n });\n const startOf = new Map(window.starts.map(start => [start.rows.map(publicKeyId).join('\\u0000'), start.start]));\n const planned: PlannedWindow[] = [];\n const droppedUnder = new Map<string, PlannedWindow>();\n const parents = [...children.keys()].map(key => (key === '' ? [] : key.split(',').map(Number)));\n parents.sort((a, b) => a.length - b.length);\n for (const parent of parents) {\n const depth = parent.length;\n const order = elementAt(levels.rows, depth).order;\n if (order === undefined) continue;\n // A set under a dropped sibling is merged into a rest: it has no window.\n let under = false;\n for (let level = 0; level < depth && !under; level++) {\n under = droppedUnder.get(parent.slice(0, level).join(','))?.dropped.has(elementAt(parent, level)) === true;\n }\n if (under) continue;\n const siblings = defined(children.get(parent.join(',')), 'a parent is one with children');\n if (siblings.length <= window.limit) continue;\n const values = elementAt(merged.values, order.value);\n const keys = new Map(siblings.map(cell => {\n const value = values.read(cell, order.aggregation);\n return [cell, value.kind === 'number' ? value.number : undefined];\n }));\n const keyOf = (cell: number): number | undefined => keys.get(cell);\n const ordered = siblings.toSorted((a, b) => {\n const x = keyOf(a);\n const y = keyOf(b);\n if (x === undefined || y === undefined) return x === undefined ? (y === undefined ? 0 : 1) : -1;\n const compared = x < y ? -1 : x > y ? 1 : 0;\n return order.descending ? -compared : compared;\n });\n const tied = (i: number, j: number): boolean => keyOf(elementAt(ordered, i)) === keyOf(elementAt(ordered, j));\n const count = ordered.length;\n const id = parent.map((item, level) => publicKeyId(elementAt(elementAt(rows, level).items, item))).join('\\u0000');\n const start = Math.min(startOf.get(id) ?? 0, count - window.limit); // oxlint-disable-line ex-grid/no-stand-in-default -- a window the question names no start for starts at the first sibling\n let first = start;\n while (first > 0 && tied(first - 1, start)) first--;\n let end = start + window.limit;\n while (end < count && tied(end, start + window.limit - 1)) end++;\n const dropped = new Map<number, Dropped>();\n const provisional = planned.length;\n const itemOf = (cell: number): number => elementAt(elementAt(merged.paths, cell), depth);\n for (let i = 0; i < first - 1; i++) dropped.set(itemOf(elementAt(ordered, i)), { window: provisional, after: false });\n for (let i = end + 1; i < count; i++) dropped.set(itemOf(elementAt(ordered, i)), { window: provisional, after: true });\n const made: PlannedWindow = { parent, before: first, after: count - end, dropped };\n planned.push(made);\n droppedUnder.set(parent.join(','), made);\n }\n return planned;\n}\n\n// The answer of merged cells, its Items renumbered to those some cell names, in the leaves' answer's order; its\n// windows in the order of their parents' cells at the grand total of the columns.\nfunction answerOf(leaves: PivotAnswer, merged: Merged, planned: readonly PlannedWindow[]): PivotAnswer {\n const rows = leaves.rows;\n const columns = leaves.columns;\n const rowCount = rows.length;\n const count = merged.paths.length;\n const renumberings = [...rows, ...columns].map((axis, level) => {\n const renumbered = Array.from({ length: axis.items.length }, () => -1);\n for (const path of merged.paths) {\n const item = elementAt(path, level);\n if (item >= 0) renumbered[item] = 0;\n }\n const items: PivotItemKey[] = [];\n renumbered.forEach((mark, item) => {\n if (mark < 0) return;\n renumbered[item] = items.length;\n items.push(elementAt(axis.items, item));\n });\n const itemOfCell = merged.paths.map(path => {\n const item = elementAt(path, level);\n return item < 0 ? -1 : elementAt(renumbered, item);\n });\n return { axis: new PivotAnswerAxis(axis.field, items, Object.freeze(itemOfCell)), renumbered };\n });\n const axes = renumberings.map(r => r.axis);\n const answerValuesOf = leaves.values.map((value, v) => answerValues(value.field, elementAt(merged.values, v), count));\n if (planned.length === 0) {\n return madeAnswer(leaves.sourceVersion, axes.slice(0, rowCount), axes.slice(rowCount), count, merged.records, answerValuesOf, true);\n }\n // Each window's parent's cell at the grand total, which places it.\n const cellOf = new Map<string, number>();\n merged.paths.forEach((path, cell) => {\n if (elementAt(merged.rests, cell) < 0 && path.slice(rowCount).every(item => item < 0)) {\n cellOf.set(path.slice(0, rowDepthOf(path, rowCount)).join(','), cell);\n }\n });\n const placeOf = planned.map(w => defined(cellOf.get(w.parent.join(',')), \"a window's parent's cell\"));\n const order = planned.map((_, w) => w).toSorted((a, b) => elementAt(placeOf, a) - elementAt(placeOf, b));\n const finalOf = Array.from({ length: planned.length }, () => 0);\n order.forEach((w, place) => {\n finalOf[w] = place;\n });\n const windows: PivotAnswerWindow[] = order.map(w => {\n const made = elementAt(planned, w);\n const parent = made.parent.map((item, level) => elementAt(elementAt(renumberings, level).renumbered, item));\n return Object.freeze({ parent: Object.freeze(parent), before: made.before, after: made.after });\n });\n const rests = merged.rests.map(code => (code < 0 ? -1 : 2 * elementAt(finalOf, Math.floor(code / 2)) + (code % 2)));\n return madeAnswer(leaves.sourceVersion, axes.slice(0, rowCount), axes.slice(rowCount), count, merged.records, answerValuesOf, true,\n Object.freeze({ windows: Object.freeze(windows), rests: Object.freeze(rests) }));\n}\n\n// How deep a cell's path is named along the rows.\nfunction rowDepthOf(path: readonly number[], rowCount: number): number {\n let depth = 0;\n while (depth < rowCount && elementAt(path, depth) >= 0) depth++;\n return depth;\n}\n", "// Live server data (ADR-0370 section 3): a server's Change Batch \u2014 the records its data lost and gained\n// between two Source Versions \u2014 folded into the Leaf Aggregates a fetching source holds. The records are read\n// as the bundled source reads records, into Leaf Aggregates of their own under the question held, so the\n// engine finds their leaves by the binding that answers the question; the server names no leaf. A part is\n// kept only where subtraction and addition keep it as the server answers it; anything else is asked again.\n\nimport { decimalCompare, decimalOfSum, wideAdd } from '../aggregates/exact-decimal';\nimport { partExtremes, partProduct, partSum, partVariance } from '../aggregates/parts';\nimport { PivotAnswer, PivotAnswerBuilder, type PivotAnswerValues, type PivotNumber } from '../cube/answer';\nimport { partBits, type PivotQuery } from '../cube/query';\nimport type { PivotField } from '../fields/pivot-field';\nimport { publicKeyId, type PivotItemKey } from '../items/item-key';\nimport { elementAt } from '../must';\nimport { AggregationPass } from './aggregation-pass';\nimport { detailSnapshot, type DetailValue } from './binding';\n\n/** A server's Change Batch as the source keeps it until it is folded: its versions and its records. */\nexport interface ServerBatch {\n readonly from: string;\n readonly to: string;\n readonly removed: readonly (readonly DetailValue[])[];\n readonly added: readonly (readonly DetailValue[])[];\n}\n\n// One leaf of an answer: its Items, outermost row field first, and where it stands in the answer.\ninterface LeafAt {\n readonly items: readonly PivotItemKey[];\n readonly answer: PivotAnswer;\n readonly leaf: number;\n}\n\n/** Checks a batch's records against the source's fields, as they will be read: a record of another length,\n * or a value of no kind a record carries, is refused with the Snapshot's error, naming the record. */\nexport function checkBatchRecords(records: readonly (readonly DetailValue[])[], fields: readonly PivotField[]): void {\n detailSnapshot(records, fields);\n}\n\n/**\n * `held` with `batches` folded in, in order, under the last batch's `to`; or `undefined` where the fold cannot\n * keep the answer as the server would answer it, and the question is to be asked again: a batch out of chain\n * with the answer, a leaf left with fewer than no records, a part touched that subtraction and addition do not\n * keep exactly, or a fold that passes the cap.\n */\nexport function foldServerBatches(query: PivotQuery, held: PivotAnswer, batches: readonly ServerBatch[], fields: readonly PivotField[]): PivotAnswer | undefined {\n if (held.isRefused || held.isLevels || batches.length === 0) return undefined;\n let version = held.sourceVersion;\n for (const batch of batches) {\n if (batch.from !== version) return undefined;\n version = batch.to;\n }\n const removed = answerOf(query, batches.flatMap(batch => batch.removed), fields);\n const added = answerOf(query, batches.flatMap(batch => batch.added), fields);\n if (removed === null || added === null) return undefined;\n const lost = leavesOf(removed);\n const gained = leavesOf(added);\n const builder = new PivotAnswerBuilder(query, version);\n const kept = new Set<string>();\n const place = (id: string, at: LeafAt | undefined): boolean => {\n kept.add(id);\n return foldLeaf(builder, query, at, lost.get(id), gained.get(id));\n };\n for (const [id, at] of leavesOf(held)) {\n if (!place(id, at)) return undefined;\n }\n for (const id of gained.keys()) {\n if (!kept.has(id) && !place(id, undefined)) return undefined;\n }\n // A record lost from a leaf the answer does not hold is a batch that does not match it.\n for (const id of lost.keys()) {\n if (!kept.has(id)) return undefined;\n }\n const answer = builder.build();\n return answer.isRefused ? undefined : answer;\n}\n\n// The Leaf Aggregates of records under the question; undefined for no records, null where the pass refuses.\nfunction answerOf(query: PivotQuery, records: readonly (readonly DetailValue[])[], fields: readonly PivotField[]): PivotAnswer | undefined | null {\n if (records.length === 0) return undefined;\n const { snapshot, bindings } = detailSnapshot(records, fields);\n const pass = new AggregationPass(snapshot, bindings, query);\n pass.step(pass.rowCount);\n const answer = pass.answer('');\n return answer.isRefused ? null : answer;\n}\n\nfunction leavesOf(answer: PivotAnswer | undefined): Map<string, LeafAt> {\n const leaves = new Map<string, LeafAt>();\n if (answer === undefined) return leaves;\n const axes = [...answer.rows, ...answer.columns];\n for (let leaf = 0; leaf < answer.leafCount; leaf++) {\n const items = axes.map(axis => elementAt(axis.items, axis.itemAt(leaf)));\n leaves.set(items.map(publicKeyId).join('\\u0000'), { items, answer, leaf });\n }\n return leaves;\n}\n\n// One leaf of the folded answer: held, less what was lost, plus what was gained. False where it cannot be kept.\nfunction foldLeaf(builder: PivotAnswerBuilder, query: PivotQuery, held: LeafAt | undefined, lost: LeafAt | undefined, gained: LeafAt | undefined): boolean {\n const records = recordsOf(held) - recordsOf(lost) + recordsOf(gained);\n if (records < 0) return false;\n const touched = lost !== undefined || gained !== undefined;\n if (records === 0) return query.values.every((_, v) => countsOf(held, v).values - countsOf(lost, v).values + countsOf(gained, v).values === 0);\n const items = (held ?? gained)?.items;\n if (items === undefined) return false;\n const leaf = builder.addLeaf(items, records);\n for (let v = 0; v < query.values.length; v++) {\n const parts = partBits(elementAt(query.values, v).parts);\n if (!touched) {\n copyParts(builder, leaf, v, parts, held);\n continue;\n }\n if (!foldValue(builder, leaf, v, parts, records, held, lost, gained)) return false;\n }\n return true;\n}\n\nfunction recordsOf(at: LeafAt | undefined): number {\n return at === undefined ? 0 : at.answer.recordsAt(at.leaf);\n}\n\nfunction valuesOf(at: LeafAt, v: number): PivotAnswerValues {\n return elementAt(at.answer.values, v);\n}\n\nfunction countsOf(at: LeafAt | undefined, v: number): { readonly values: number; readonly numbers: number; readonly nonFinite: boolean } {\n if (at === undefined) return { values: 0, numbers: 0, nonFinite: false };\n const values = valuesOf(at, v);\n return { values: values.valuesAt(at.leaf), numbers: values.numbersAt(at.leaf), nonFinite: values.nonFiniteAt(at.leaf) };\n}\n\n// A leaf no batch touched: its parts as held.\nfunction copyParts(builder: PivotAnswerBuilder, leaf: number, v: number, parts: number, held: LeafAt | undefined): void {\n if (held === undefined) throw new Error('Internal: a leaf no batch touched is a leaf the answer held.');\n const counts = countsOf(held, v);\n builder.setCounts(leaf, v, counts.values, counts.numbers, counts.nonFinite);\n const values = valuesOf(held, v);\n if ((parts & partSum) !== 0) builder.setSum(leaf, v, values.sumAt(held.leaf));\n if ((parts & partExtremes) !== 0) builder.setExtremes(leaf, v, values.minAt(held.leaf), values.maxAt(held.leaf));\n if ((parts & partProduct) !== 0) builder.setProduct(leaf, v, values.productAt(held.leaf));\n if ((parts & partVariance) !== 0) builder.setVariance(leaf, v, values.meanAt(held.leaf), values.m2At(held.leaf));\n}\n\n// One field in Values at a leaf a batch touched: the counts by subtraction and addition, an exact sum while it\n// stays within 128 bits, and the extremes where numbers came and none left. False for anything else.\nfunction foldValue(builder: PivotAnswerBuilder, leaf: number, v: number, parts: number, records: number,\n held: LeafAt | undefined, lost: LeafAt | undefined, gained: LeafAt | undefined): boolean {\n const was = countsOf(held, v);\n const out = countsOf(lost, v);\n const came = countsOf(gained, v);\n const values = was.values - out.values + came.values;\n const numbers = was.numbers - out.numbers + came.numbers;\n if (values < 0 || numbers < 0 || numbers > values || values > records) return false;\n // A non-finite number is not taken away; one brought in leaves only the counts to keep.\n if (out.nonFinite) return false;\n const nonFinite = was.nonFinite || came.nonFinite;\n const numbersMoved = out.numbers > 0 || came.numbers > 0;\n if (numbersMoved && (parts & (partProduct | partVariance)) !== 0) return false;\n if (numbersMoved && came.nonFinite && (parts & (partSum | partExtremes)) !== 0) return false;\n builder.setCounts(leaf, v, values, numbers, nonFinite);\n if ((parts & partSum) !== 0) {\n const sum = numbersMoved ? foldedSum(sumOf(held, v), sumOf(lost, v), sumOf(gained, v)) : sumOf(held ?? gained, v);\n if (sum === undefined) return false;\n builder.setSum(leaf, v, sum);\n }\n if ((parts & partExtremes) !== 0) {\n if (out.numbers > 0) return false;\n const extremes = foldedExtremes(held, gained, v);\n if (extremes === undefined) return false;\n builder.setExtremes(leaf, v, extremes.min, extremes.max);\n }\n // No number came or left: a product and a variance stand as the leaf's numbers made them.\n const base = held ?? gained;\n if (base === undefined) return false;\n if ((parts & partProduct) !== 0) builder.setProduct(leaf, v, valuesOf(base, v).productAt(base.leaf));\n if ((parts & partVariance) !== 0) builder.setVariance(leaf, v, valuesOf(base, v).meanAt(base.leaf), valuesOf(base, v).m2At(base.leaf));\n return true;\n}\n\nconst zero: PivotNumber = Object.freeze({ kind: 'exact', value: Object.freeze({ mantissa: 0n, scale: 0 }) });\n\nfunction sumOf(at: LeafAt | undefined, v: number): PivotNumber {\n return at === undefined ? zero : valuesOf(at, v).sumAt(at.leaf);\n}\n\n// held \u2212 lost + gained, exactly, or undefined where any is a double or the sum leaves 128 bits or a decimal.\nfunction foldedSum(held: PivotNumber, lost: PivotNumber, gained: PivotNumber): PivotNumber | undefined {\n if (held.kind !== 'exact' || lost.kind !== 'exact' || gained.kind !== 'exact') return undefined;\n const less = wideAdd(held.value.mantissa, held.value.scale, -lost.value.mantissa, lost.value.scale);\n if (less === undefined) return undefined;\n const more = wideAdd(less.sum, less.scale, gained.value.mantissa, gained.value.scale);\n if (more === undefined) return undefined;\n const sum = decimalOfSum(more.sum, more.scale);\n return sum === undefined ? undefined : { kind: 'exact', value: sum };\n}\n\n// The extremes of the numbers held and gained, none lost; the held one kept on a tie, as a pass that met it\n// first keeps it. Undefined where one side is exact and the other a double.\nfunction foldedExtremes(held: LeafAt | undefined, gained: LeafAt | undefined, v: number): { readonly min: PivotNumber; readonly max: PivotNumber } | undefined {\n const had = held !== undefined && countsOf(held, v).numbers > 0 ? held : undefined;\n const came = gained !== undefined && countsOf(gained, v).numbers > 0 ? gained : undefined;\n const source = had ?? came;\n if (source === undefined) {\n // No number at all: the extremes a leaf of no numbers carries, as held.\n const at = held ?? gained;\n if (at === undefined) return undefined;\n return { min: valuesOf(at, v).minAt(at.leaf), max: valuesOf(at, v).maxAt(at.leaf) };\n }\n if (had === undefined || came === undefined) return { min: valuesOf(source, v).minAt(source.leaf), max: valuesOf(source, v).maxAt(source.leaf) };\n const min = extreme(valuesOf(had, v).minAt(had.leaf), valuesOf(came, v).minAt(came.leaf), -1);\n const max = extreme(valuesOf(had, v).maxAt(had.leaf), valuesOf(came, v).maxAt(came.leaf), 1);\n return min === undefined || max === undefined ? undefined : { min, max };\n}\n\n// The one of two extremes further toward `side` (\u22121 the smaller, 1 the larger), `held` on a tie.\nfunction extreme(held: PivotNumber, came: PivotNumber, side: -1 | 1): PivotNumber | undefined {\n if (held.kind === 'exact' && came.kind === 'exact') return decimalCompare(came.value, held.value) === side ? came : held;\n if (held.kind === 'double' && came.kind === 'double') return Math.sign(came.value - held.value) === side ? came : held;\n return undefined;\n}\n", "// The most leaves a layout can make, from each field's count of Items (ADR-0370 section 3): the hint the\n// Field List marks a drop target with while a field is dragged over the leaf cap. The C# engine's\n// PivotLeafBound.\n\nimport { publicKeyId } from '../items/item-key';\nimport type { PivotLayout } from '../layout/pivot-layout';\nimport type { PivotItemCounts } from './pivot-source';\n\n/** Where a bound stops growing: 2^53 \u2212 1, the largest whole number held exactly, as the C# engine stops. */\nexport const pivotLeafBoundMost = Number.MAX_SAFE_INTEGER;\n\n/**\n * The most leaves `layout` can make, at most {@link pivotLeafBoundMost}: the product, over the fields in\n * Rows and Columns, of each field's count less the Items the layout hides of it. The leaves are the\n * combinations of those Items that some record carries, so they are never more while the counts are the\n * data's and every Hidden Item is among them; Filters and the Values add none. `undefined` when a field the\n * layout places in Rows or Columns was not counted. The bound is a hint for the drop target's mark only: a\n * count gone stale, or a Hidden Item the data no longer holds, moves the mark, never the answer, and the\n * question is asked with its `maxLeaves` all the same.\n */\nexport function pivotLeafBound(layout: PivotLayout, counts: PivotItemCounts): number | undefined {\n let bound = 1;\n for (const placement of [...layout.rows, ...layout.columns]) {\n const count = counts.countOf(placement.field);\n if (count === undefined) return undefined;\n const hidden = new Set(placement.hiddenItems.map(publicKeyId)).size;\n const shown = Math.max(0, count - hidden);\n bound = shown === 0 ? 0 : bound > Math.floor(pivotLeafBoundMost / shown) ? pivotLeafBoundMost : bound * shown;\n }\n return bound;\n}\n", "// Every Pivot Source question and answer as JSON (ADR-0066, ADR-0370 section 3), so it crosses to a server\n// unchanged: the C# engine's PivotJson, document for document, its refusals worded as it words them. Each\n// document names its format's version and its type, and a reader refuses a version it does not know rather\n// than half-read it. Both engines write one document as one text, to the byte: a string spelt as\n// System.Text.Json's default encoder spells it, a double in its shortest round-trip form.\n\nimport { decimalText, type SnapshotDecimal } from '@ex-grid/data';\nimport { noExtremes, noSum, PartColumns } from '../aggregates/parts';\nimport {\n PivotAnswer, PivotAnswerAxis, answerValues, madeAnswer, noWindowing, type PivotAnswerValues, type PivotAnswerWindow, type PivotAnswerWindowing, type PivotNumber,\n type PivotSourceRefusal, type PivotSourceRefusalKind,\n} from '../cube/answer';\nimport {\n partBits, pivotDetailsQuery, pivotItemsQuery, pivotParts, pivotQuery,\n type PivotDetailsQuery, type PivotFieldItem, type PivotItemsQuery, type PivotLevelOrder, type PivotLevelRule, type PivotLevelRuleInput, type PivotLevels,\n type PivotLevelWindowInput, type PivotPart, type PivotQuery, type PivotQueryField, type PivotQueryInput,\n} from '../cube/query';\nimport { PivotFormatError, PivotVersionError } from '../errors';\nimport { pivotField, type PivotField } from '../fields/pivot-field';\nimport { dateItemKey, itemKeyText, numberOfText, pivotItemKey, publicKeyId, ticksOfKeyText, type PivotItemKey } from '../items/item-key';\nimport { isDecimal } from '../items/record-value';\nimport { pivotAggregations, pivotItemKinds, type PivotDatePart, type PivotFieldType } from '../layout/pivot-enums';\nimport { isArray, isObject, JsonNumber, jsonArray, jsonDouble, jsonObject, jsonString, member, memberNames, namesWrittenTwice, readJson, type Json, type JsonObject } from '../json/json-text';\nimport { defined, elementAt } from '../must';\nimport {\n PivotDetailPage, PivotItemCounts, PivotItemPage, type PivotDetailRecord, type PivotDetailValue, type PivotServerChangeBatch, type PivotServerNotice,\n type PivotSourceChanged,\n} from './pivot-source';\n\nconst version = 1;\nconst dateFormat = \"yyyy-MM-dd'T'HH:mm:ss.FFFFFFF\";\nconst fieldTypes: readonly PivotFieldType[] = ['text', 'number', 'date', 'boolean'];\nconst dateParts: readonly PivotDatePart[] = ['year', 'quarter', 'month'];\nconst refusalKinds: readonly PivotSourceRefusalKind[] = ['tooManyLeaves', 'unknownField', 'aggregationNotOffered', 'sourceVersionNotHeld'];\n\ntype Members = [string, string][];\n\n// ---- Writing ----------------------------------------------------------------------------------------\n\nfunction document(type: string, members: Members): string {\n return jsonObject([['version', String(version)], ['type', jsonString(type)], ...members]);\n}\n\nfunction refusalMembers(refusal: PivotSourceRefusal): Members {\n const members: Members = [['kind', jsonString(refusal.kind)], ['message', jsonString(refusal.message)]];\n if (refusal.field !== undefined) members.push(['field', jsonString(refusal.field)]);\n if (refusal.limit !== undefined) members.push(['limit', String(refusal.limit)]);\n return [['refusal', jsonObject(members)]];\n}\n\nfunction keyJson(key: PivotItemKey): string {\n return jsonObject(key.value === undefined ? [['kind', jsonString(key.kind)]] : [['kind', jsonString(key.kind)], ['value', jsonString(key.value)]]);\n}\n\nfunction keysJson(keys: readonly PivotItemKey[]): string {\n return jsonArray(keys.map(keyJson));\n}\n\nfunction fieldsJson(fields: readonly PivotQueryField[]): string {\n return jsonArray(fields.map(field => jsonObject(field.hiddenItems.length > 0\n ? [['field', jsonString(field.field)], ['hiddenItems', keysJson(field.hiddenItems)]]\n : [['field', jsonString(field.field)]])));\n}\n\nfunction pathJson(path: readonly PivotFieldItem[]): string {\n return jsonArray(path.map(step => jsonObject([['field', jsonString(step.field)], ['item', keyJson(step.item)]])));\n}\n\nfunction partsJson(parts: readonly PivotPart[]): string {\n return jsonArray(parts.map(jsonString));\n}\n\n// The shortest text that reads back as the same double, as C#'s \"R\" writes it; NaN, Infinity and -Infinity by\n// name, as JavaScript and .NET both spell them.\nfunction doubleText(value: number): string {\n return Number.isFinite(value) ? jsonDouble(value) : String(value);\n}\n\n// A double that is always one: a JSON number, or its name when it is not finite.\nfunction doubleJson(value: number): string {\n return Number.isFinite(value) ? jsonDouble(value) : jsonString(doubleText(value));\n}\n\n// A part that is exact or not: an exact decimal is a JSON number, a double a string.\nfunction exactOrDoubleJson(number: PivotNumber): string {\n return number.kind === 'exact' ? decimalText(number.value) : jsonString(doubleText(number.value));\n}\n\n// A whole number a document holds in 32 bits, as the C# engine's int, refused here rather than by the reader.\nfunction int32Json(value: number, name: string): string {\n if (!Number.isInteger(value) || value < -(2 ** 31) || value >= 2 ** 31) {\n throw new RangeError(`'${name}' is ${value}, and a Pivot Source document holds it in 32 bits, as the C# engine does.`);\n }\n return String(value);\n}\n\nfunction leavesOf(leafCount: number, write: (leaf: number) => string): string {\n return jsonArray(Array.from({ length: leafCount }, (_, leaf) => write(leaf)));\n}\n\n// A field's rule of a question's levels: written only where it is not every Item expanded and ordered by label.\nfunction rulesJson(rules: readonly PivotLevelRule[]): string {\n return jsonArray(rules.map(rule => {\n const members: Members = [];\n if (rule.collapsed) members.push(['collapsed', 'true']);\n if (rule.toggledItems.length > 0) members.push(['toggledItems', keysJson(rule.toggledItems)]);\n if (rule.order !== undefined) {\n members.push(['order', jsonObject([\n ['value', String(rule.order.value)], ['aggregation', jsonString(rule.order.aggregation)], ['descending', String(rule.order.descending)],\n ])]);\n }\n return jsonObject(members);\n }));\n}\n\n// A question's levels: their rules, and the window when it carries one.\nfunction levelsJson(levels: PivotLevels): string {\n const members: Members = [['rows', rulesJson(levels.rows)], ['columns', rulesJson(levels.columns)]];\n const window = levels.window;\n if (window !== undefined) {\n members.push(['window', jsonObject([\n ['limit', int32Json(window.limit, 'limit')],\n ['starts', jsonArray(window.starts.map(start => jsonObject([['rows', keysJson(start.rows)], ['start', int32Json(start.start, 'start')]])))],\n ])]);\n }\n return jsonObject(members);\n}\n\n// An answer's windows and each cell's rest code, written only where it has a window.\nfunction windowingMembers(answer: PivotAnswer, leafCount: number): Members {\n const windows = answer.windows;\n if (windows.length === 0) return [];\n return [\n ['windows', jsonArray(windows.map(window => jsonObject([\n ['parent', jsonArray(window.parent.map(String))], ['before', int32Json(window.before, 'before')], ['after', int32Json(window.after, 'after')],\n ])))],\n ['rests', leavesOf(leafCount, cell => {\n const rest = answer.restAt(cell);\n return rest === undefined ? '-1' : String(2 * rest.window + (rest.side === 'after' ? 1 : 0));\n })],\n ];\n}\n\nfunction valuesJson(values: PivotAnswerValues, leafCount: number, levels: boolean): string {\n const parts = values.parts;\n const members: Members = [\n ['field', jsonString(values.field)],\n ['parts', partsJson(parts)],\n ['values', leavesOf(leafCount, leaf => String(values.valuesAt(leaf)))],\n ['numbers', leavesOf(leafCount, leaf => String(values.numbersAt(leaf)))],\n // Rare, so written as the leaves that have one.\n ['nonFinite', jsonArray(Array.from({ length: leafCount }, (_, leaf) => leaf).filter(leaf => values.nonFiniteAt(leaf)).map(String))],\n ];\n if (parts.includes('sum')) {\n members.push(['sum', leavesOf(leafCount, leaf => exactOrDoubleJson(values.sumAt(leaf)))]);\n // A level answer's double sum is carried with its magnitudes (ADR-0370 section 3); an exact one, and a\n // cell of #NUM!, whose parts are not read, with none.\n if (levels) {\n members.push(['absoluteSum', leavesOf(leafCount, leaf => {\n const absolute = values.absoluteSumAt(leaf);\n return absolute === undefined || Number.isNaN(absolute) ? 'null' : doubleJson(absolute);\n })]);\n }\n }\n if (parts.includes('extremes')) {\n members.push(['min', leavesOf(leafCount, leaf => exactOrDoubleJson(values.minAt(leaf)))]);\n members.push(['max', leavesOf(leafCount, leaf => exactOrDoubleJson(values.maxAt(leaf)))]);\n }\n if (parts.includes('product')) members.push(['product', leavesOf(leafCount, leaf => doubleJson(values.productAt(leaf)))]);\n if (parts.includes('variance')) {\n members.push(['mean', leavesOf(leafCount, leaf => doubleJson(values.meanAt(leaf)))]);\n members.push(['m2', leavesOf(leafCount, leaf => doubleJson(values.m2At(leaf)))]);\n }\n return jsonObject(members);\n}\n\nfunction axesJson(axes: readonly PivotAnswerAxis[], leafCount: number): string {\n return jsonArray(axes.map(axis => jsonObject([\n ['field', jsonString(axis.field)],\n ['items', keysJson(axis.items)],\n ['leaves', leavesOf(leafCount, leaf => String(axis.itemAt(leaf)))],\n ])));\n}\n\n// A detail value by its field's declared type; a value of another type is tagged with its own.\nfunction detailValueJson(type: PivotFieldType, value: PivotDetailValue): string {\n if (value === null) return 'null';\n if (type === 'text' && typeof value === 'string') return jsonString(value);\n if (type === 'number' && isDecimal(value)) return decimalText(value);\n if (type === 'number' && typeof value === 'number') return jsonString(doubleText(value));\n if (type === 'date' && typeof value === 'bigint') return jsonString(dateText(value));\n if (type === 'boolean' && typeof value === 'boolean') return String(value);\n if (typeof value === 'string') return jsonObject([['text', jsonString(value)]]);\n if (isDecimal(value)) return jsonObject([['number', decimalText(value)]]);\n if (typeof value === 'number') return jsonObject([['double', jsonString(doubleText(value))]]);\n if (typeof value === 'bigint') return jsonObject([['date', jsonString(dateText(value))]]);\n if (typeof value === 'boolean') return jsonObject([['boolean', String(value)]]);\n throw new TypeError(`A value of type ${typeof value} is no detail value: text, a number, a SnapshotDecimal, a date by its ticks, a Boolean, or null.`);\n}\n\n// A batch's records, each value by its field's declared type.\nfunction batchRecordsJson(records: readonly (readonly PivotDetailValue[])[], fields: readonly PivotField[], side: string): string {\n return jsonArray(records.map((record, r) => {\n // Typed as an array, and checked as one: a batch may come from a script that never met the type.\n const isRecord: boolean = Array.isArray(record);\n if (!isRecord || record.length !== fields.length) {\n throw new TypeError(`A Change Batch's ${side} record ${r + 1} carries ${isRecord ? String(record.length) : 'no array of'} values, and there are ${fields.length} fields.`);\n }\n return jsonArray(record.map((value, f) => {\n const field = elementAt(fields, f);\n // A date part crosses as its whole number, as the C# engine's decimal writes it.\n if (field.datePart !== undefined && typeof value === 'number' && Number.isSafeInteger(value)) return jsonObject([['number', String(value)]]);\n return detailValueJson(field.type, value);\n }));\n }));\n}\n\nconst batchVersions = 'A Change Batch goes from one Source Version to another, each named with text.';\n\nfunction dateText(ticks: bigint): string {\n return defined(dateItemKey(ticks).value, 'a date key has its text');\n}\n\n// ---- Reading ----------------------------------------------------------------------------------------\n\n// Opens a document: a JSON object naming its version \u2014 refused with a PivotVersionError when it is not one\n// this reader reads \u2014 and its type, refused with a PivotFormatError when it is not one expected. A value the\n// model refuses is a document this reader cannot take.\nfunction read<T>(json: string, type: string | readonly [string, string], take: (root: JsonObject, type: string) => T): T {\n if (typeof json !== 'string') throw new TypeError('A Pivot Source document is text.');\n try {\n JSON.parse(json);\n } catch (error) {\n throw new PivotFormatError('A Pivot Source document is JSON.', { cause: error });\n }\n const root = readJson(json);\n if (!isObject(root)) throw new PivotFormatError('A Pivot Source document is a JSON object.');\n const written = member(root, 'version');\n if (!(written instanceof JsonNumber)) throw new PivotFormatError('A Pivot Source document names its version.');\n if (written.int32 !== version) {\n throw new PivotVersionError(`A Pivot Source document of version ${written.raw} cannot be read; this reader reads version ${version}.`);\n }\n const actual = optionalString(root, 'type');\n const types = typeof type === 'string' ? [type] : type;\n if (actual === undefined || !types.includes(actual)) {\n throw new PivotFormatError(`The document is a Pivot Source '${actual ?? '(untyped)'}' document, not a '${types.join(\"' or a '\")}'.`); // oxlint-disable-line ex-grid/no-stand-in-default -- the refusal names a document that names no type\n }\n try {\n return take(root, actual);\n } catch (error) {\n if (error instanceof TypeError || error instanceof RangeError) {\n throw new PivotFormatError(`The document holds a value that cannot be: ${error.message}`, { cause: error });\n }\n throw error;\n }\n}\n\nfunction fieldList(fields: readonly { readonly name: string; readonly type: PivotFieldType; readonly datePart?: PivotDatePart | undefined }[]): string {\n return fields.map(field => `${field.name} (${field.datePart === undefined ? field.type : `${field.type} ${field.datePart}`})`).join(', ');\n}\n\n// A batch's records, required: a batch that leaves out what its data lost or gained is not the batch.\nfunction batchRecordsOf(root: JsonObject, side: string, fields: readonly PivotField[]): (readonly PivotDetailValue[])[] {\n if (member(root, side) === undefined) throw new PivotFormatError(`'${side}' is an array, and is required.`);\n return entries(root, side).map(record => {\n if (!isArray(record)) throw new PivotFormatError('A batch record is an array of values.');\n if (record.length !== fields.length) throw new PivotFormatError(`A batch record carries ${record.length} values, and the batch has ${fields.length} fields.`);\n return Object.freeze(record.map((value, f) => {\n const field = elementAt(fields, f);\n const taken = detailValueOf(value, field);\n // A date part crosses as its whole number, which a decimal holds: read as the number it is.\n return field.datePart !== undefined && isDecimal(taken) && taken.scale === 0 ? Number(taken.mantissa) : taken;\n }));\n });\n}\n\nfunction refusalOf(root: JsonObject): PivotSourceRefusal | undefined {\n const refusal = member(root, 'refusal');\n if (refusal === undefined) return undefined;\n if (!isObject(refusal)) throw new PivotFormatError(\"'refusal' is an object.\");\n const field = optionalString(refusal, 'field');\n const limit = member(refusal, 'limit');\n return Object.freeze({\n kind: named(refusal, 'kind', 'refusal kind', refusalKinds),\n message: string(refusal, 'message'),\n ...(field === undefined ? {} : { field }),\n ...(limit === undefined ? {} : { limit: integerValue(limit, 'limit') }),\n });\n}\n\nfunction fieldsOf(element: JsonObject, name: string): PivotQueryField[] {\n return objects(element, name).map(field => ({ field: string(field, 'field'), hiddenItems: keysOf(field, 'hiddenItems') }));\n}\n\nfunction pathOf(element: JsonObject, name: string): PivotFieldItem[] {\n return objects(element, name).map(step => {\n const item = member(step, 'item');\n if (item === undefined) throw new PivotFormatError(\"A step of a cell's path names its 'item'.\");\n return { field: string(step, 'field'), item: keyOf(item) };\n });\n}\n\nfunction keysOf(element: JsonObject, name: string): PivotItemKey[] {\n return entries(element, name).map(keyOf);\n}\n\nfunction keyOf(key: Json): PivotItemKey {\n if (!isObject(key)) throw new PivotFormatError(\"An Item is an object with its 'kind' and its 'value'.\");\n return pivotItemKey(named(key, 'kind', 'kind', pivotItemKinds), optionalString(key, 'value'));\n}\n\nfunction partsOf(element: JsonObject): PivotPart[] {\n return entries(element, 'parts').map(part => {\n if (typeof part !== 'string') throw new PivotFormatError('A part is named by a string.');\n const known = pivotParts.find(p => p === part);\n if (known === undefined) throw new PivotFormatError(`'${part}' is not a part this reader knows.`);\n return known;\n });\n}\n\nfunction axesOf(root: JsonObject, name: string, leafCount: number, levels: boolean): PivotAnswerAxis[] {\n return objects(root, name).map(axis => {\n const field = string(axis, 'field');\n const items = keysOf(axis, 'items');\n const distinct = new Set<string>();\n for (const item of items) {\n const id = publicKeyId(item);\n if (distinct.has(id)) throw new PivotFormatError(`'${field}' lists the Item ${itemKeyText(item)} twice; text Items are told apart ignoring case (ADR-0060).`);\n distinct.add(id);\n }\n const itemOfLeaf = column(axis, 'leaves', leafCount, entry => int32Value(entry, 'leaves'));\n itemOfLeaf.forEach((item, leaf) => {\n if ((item < 0 || item >= items.length) && !(levels && item === -1)) {\n throw new PivotFormatError(`${levels ? 'Cell' : 'Leaf'} ${leaf} names Item ${item} of '${field}', which has ${items.length}.`);\n }\n });\n return new PivotAnswerAxis(field, items, Object.freeze(itemOfLeaf));\n });\n}\n\nfunction valuesOf(element: JsonObject, records: readonly number[], levels: boolean): PivotAnswerValues {\n const field = string(element, 'field');\n const leafCount = records.length;\n const columns = new PartColumns(partBits(partsOf(element)));\n const values = column(element, 'values', leafCount, entry => integerValue(entry, 'values'));\n const numbers = column(element, 'numbers', leafCount, entry => integerValue(entry, 'numbers'));\n for (let leaf = 0; leaf < leafCount; leaf++) {\n const valueCount = elementAt(values, leaf);\n const numberCount = elementAt(numbers, leaf);\n const recordCount = elementAt(records, leaf);\n if (numberCount < 0 || numberCount > valueCount || valueCount > recordCount) {\n throw new PivotFormatError(`Leaf ${leaf} of '${field}' holds ${recordCount} records, ${valueCount} values and ${numberCount} numbers.`);\n }\n const cell = columns.addCell();\n const counts = elementAt(columns.counts, cell);\n counts.values = valueCount;\n counts.numbers = numberCount;\n }\n for (const entry of entries(element, 'nonFinite')) {\n const leaf = int32Value(entry, 'nonFinite');\n if (leaf < 0 || leaf >= leafCount) throw new PivotFormatError(`'nonFinite' names leaf ${leaf}, and the answer has ${leafCount}.`);\n elementAt(columns.counts, leaf).nonFinite = true;\n }\n if (columns.sums !== undefined) {\n const sums = columns.sums;\n const written = column(element, 'sum', leafCount, exactOrDoubleOf);\n written.forEach((sum, leaf) => {\n sums[leaf] = sum.kind === 'exact' ? { ...noSum(), exact: sum.value } : { ...noSum(), double: sum.value, inexact: true };\n });\n if (levels) {\n columns.trackAbsolutes();\n const absolutes = defined(columns.absolutes, 'the magnitudes tracked');\n const magnitudes = (entry: Json): number | undefined => {\n if (entry === null) return undefined;\n const absolute = doubleOf(entry);\n if (Number.isNaN(absolute) || absolute < 0) {\n throw new PivotFormatError(`A sum of magnitudes of '${field}' is ${rawOf(entry)}; it is a number not below 0, or null for none (ADR-0370 section 3).`);\n }\n return absolute;\n };\n column(element, 'absoluteSum', leafCount, magnitudes).forEach((absolute, leaf) => {\n if (elementAt(written, leaf).kind === 'exact' && absolute !== undefined) {\n throw new PivotFormatError(`Cell ${leaf}'s sum of '${field}' is exact, and carries a sum of magnitudes; only a double's does (ADR-0370 section 3).`);\n }\n absolutes[leaf] = absolute === undefined ? Number.NaN : absolute;\n });\n }\n }\n if (columns.extremes !== undefined) {\n const extremes = columns.extremes;\n const min = column(element, 'min', leafCount, exactOrDoubleOf);\n const max = column(element, 'max', leafCount, exactOrDoubleOf);\n for (let leaf = 0; leaf < leafCount; leaf++) {\n const low = elementAt(min, leaf);\n const high = elementAt(max, leaf);\n if (low.kind === 'exact' && high.kind === 'exact') extremes[leaf] = { ...noExtremes(), exactMin: low.value, exactMax: high.value };\n else if (low.kind === 'double' && high.kind === 'double') extremes[leaf] = { ...noExtremes(), min: low.value, max: high.value, inexact: true };\n else throw new PivotFormatError(`Leaf ${leaf} of '${field}' has one extreme exact and the other a double.`);\n }\n }\n if (columns.products !== undefined) {\n const products = columns.products;\n column(element, 'product', leafCount, doubleOf).forEach((product, leaf) => {\n products[leaf] = product;\n });\n }\n if (columns.variances !== undefined) {\n const variances = columns.variances;\n const mean = column(element, 'mean', leafCount, doubleOf);\n const m2 = column(element, 'm2', leafCount, doubleOf);\n for (let leaf = 0; leaf < leafCount; leaf++) variances[leaf] = { mean: elementAt(mean, leaf), m2: elementAt(m2, leaf) };\n }\n return answerValues(field, columns, leafCount);\n}\n\n// One array of an answer's columns: exactly one entry per leaf.\nfunction column<T>(element: JsonObject, name: string, leafCount: number, take: (entry: Json) => T): T[] {\n const written = member(element, name);\n if (!isArray(written)) throw new PivotFormatError(`'${name}' is an array, and is required.`);\n if (written.length !== leafCount) throw new PivotFormatError(`'${name}' has ${written.length} entries, and the answer has ${leafCount} leaves.`);\n return written.map(take);\n}\n\n// A part that is exact or not: a JSON number is an exact decimal, a JSON string a double.\nfunction exactOrDoubleOf(entry: Json): PivotNumber {\n if (entry instanceof JsonNumber) return Object.freeze({ kind: 'exact', value: exactOf(entry) });\n if (typeof entry === 'string') return Object.freeze({ kind: 'double', value: parseDouble(entry) });\n throw new PivotFormatError('An exact part is a number, and a double one a string.');\n}\n\nfunction exactOf(entry: JsonNumber): SnapshotDecimal {\n const exact = entry.decimal;\n if (exact === undefined) throw new PivotFormatError(`${entry.raw} is not an exact decimal; a double is written as a string.`);\n return exact;\n}\n\n// A double that is not finite, by its name, or `undefined` for any other text.\nfunction namedDouble(text: string): number | undefined {\n switch (text) {\n case 'NaN': return Number.NaN;\n case 'Infinity': return Number.POSITIVE_INFINITY;\n case '-Infinity': return Number.NEGATIVE_INFINITY;\n default: return undefined;\n }\n}\n\n// A flag, written only when it is true; false when it is left out.\nfunction optionalBool(element: JsonObject, name: string): boolean {\n const value = member(element, name);\n if (value === undefined) return false;\n if (typeof value !== 'boolean') throw new PivotFormatError(`'${name}' is true or false.`);\n return value;\n}\n\n// A question's levels, as the members of its settings: none where it carries none.\nfunction levelsOf(root: JsonObject): Pick<PivotQueryInput, 'levels'> {\n const levels = member(root, 'levels');\n if (levels === undefined) return {};\n if (!isObject(levels)) throw new PivotFormatError(\"'levels' is an object.\");\n const rules = (name: string): PivotLevelRuleInput[] => objects(levels, name).map(rule => {\n const order = member(rule, 'order');\n const input = { collapsed: optionalBool(rule, 'collapsed'), toggledItems: keysOf(rule, 'toggledItems') };\n return order === undefined ? input : { ...input, order: orderOf(order) };\n });\n const window = member(levels, 'window');\n const rows = rules('rows');\n const columns = rules('columns');\n return { levels: window === undefined ? { rows, columns } : { rows, columns, window: windowOf(window) } };\n}\n\nfunction orderOf(order: Json): PivotLevelOrder {\n if (!isObject(order)) throw new PivotFormatError(\"'order' is an object.\");\n const aggregation = string(order, 'aggregation');\n const known = pivotAggregations.find(a => a === aggregation);\n if (known === undefined) throw new PivotFormatError(`'${aggregation}' is not an Aggregation this reader knows.`);\n const descending = member(order, 'descending');\n if (typeof descending !== 'boolean') throw new PivotFormatError(\"'descending' is true or false, and is required.\");\n return { value: int32(order, 'value'), aggregation: known, descending };\n}\n\nfunction windowOf(window: Json): PivotLevelWindowInput {\n if (!isObject(window)) throw new PivotFormatError(\"'window' is an object.\");\n return {\n limit: int32(window, 'limit'),\n starts: objects(window, 'starts').map(start => ({ rows: keysOf(start, 'rows'), start: int32(start, 'start') })),\n };\n}\n\n// An answer's windows and rest codes: none where it has no window.\nfunction windowingOf(root: JsonObject, leafCount: number, levels: boolean): PivotAnswerWindowing {\n if (member(root, 'windows') === undefined) {\n if (member(root, 'rests') !== undefined) throw new PivotFormatError(\"The answer has 'rests' and no 'windows' (ADR-0370 section 3).\");\n return noWindowing;\n }\n if (!levels) throw new PivotFormatError('An answer of leaves has no window (ADR-0370 section 3).');\n const windows: PivotAnswerWindow[] = objects(root, 'windows').map(window => Object.freeze({\n parent: Object.freeze(entries(window, 'parent').map(entry => int32Value(entry, 'parent'))),\n before: int32(window, 'before'),\n after: int32(window, 'after'),\n }));\n if (windows.length === 0) throw new PivotFormatError(\"'windows' is left out where the answer has none.\");\n const rests = column(root, 'rests', leafCount, entry => int32Value(entry, 'rests'));\n return Object.freeze({ windows: Object.freeze(windows), rests: Object.freeze(rests) });\n}\n\n// A double: a JSON number, or a named literal.\nfunction doubleOf(entry: Json): number {\n if (entry instanceof JsonNumber) return entry.double;\n if (typeof entry !== 'string') throw new PivotFormatError('A double is a number, or NaN, Infinity or -Infinity.');\n const value = namedDouble(entry);\n if (value === undefined) throw new PivotFormatError(`'${entry}' is not NaN, Infinity or -Infinity; a finite double is a number.`);\n return value;\n}\n\n// A double's invariant text, NaN, Infinity and -Infinity by name.\nfunction parseDouble(text: string): number {\n const value = namedDouble(text) ?? numberOfText(text);\n if (value === undefined) throw new PivotFormatError(`'${text}' is not the invariant text of a double.`);\n return value;\n}\n\nfunction detailValueOf(entry: Json, field: PivotField): PivotDetailValue {\n if (entry === null) return null;\n if (isObject(entry)) return taggedValueOf(entry);\n if (typeof entry === 'string' && field.type === 'text') return entry;\n if (typeof entry === 'string' && field.type === 'number') return parseDouble(entry);\n if (typeof entry === 'string' && field.type === 'date') return ticksOf(entry);\n if (entry instanceof JsonNumber && field.type === 'number') return exactOf(entry);\n if (typeof entry === 'boolean' && field.type === 'boolean') return entry;\n throw new PivotFormatError(`A ${kindOf(entry)} is not a value of '${field.name}', declared ${typeTitle(field.type)}; a value of another type is tagged with its own.`);\n}\n\nfunction taggedValueOf(entry: JsonObject): PivotDetailValue {\n const names = memberNames(entry);\n const [tag] = names;\n if (names.length !== 1 || tag === undefined || namesWrittenTwice(entry).length > 0) {\n throw new PivotFormatError('A tagged detail value has one member: text, number, double, date or boolean.');\n }\n const value = defined(member(entry, tag), 'the tag\\'s value');\n if (tag === 'text' && typeof value === 'string') return value;\n if (tag === 'number' && value instanceof JsonNumber) return exactOf(value);\n if (tag === 'double' && typeof value === 'string') return parseDouble(value);\n if (tag === 'date' && typeof value === 'string') return ticksOf(value);\n if (tag === 'boolean' && typeof value === 'boolean') return value;\n throw new PivotFormatError(`'${tag}' with a ${kindOf(value)} is not a tagged detail value this reader knows.`);\n}\n\nfunction ticksOf(text: string): bigint {\n const ticks = ticksOfKeyText(text);\n if (ticks === undefined) throw new PivotFormatError(`'${text}' is not an ISO date (${dateFormat}).`);\n return ticks;\n}\n\n// A JSON value's kind as System.Text.Json's JsonValueKind names it.\nfunction kindOf(value: Json): string {\n if (value === null) return 'Null';\n if (value === true) return 'True';\n if (value === false) return 'False';\n if (value instanceof JsonNumber) return 'Number';\n if (typeof value === 'string') return 'String';\n return isArray(value) ? 'Array' : 'Object';\n}\n\n// A field type as C# names the enum member.\nfunction typeTitle(type: PivotFieldType): string {\n return type.charAt(0).toUpperCase() + type.slice(1);\n}\n\nfunction entries(element: JsonObject, name: string): readonly Json[] {\n const value = member(element, name);\n if (value === undefined) return [];\n if (!isArray(value)) throw new PivotFormatError(`'${name}' is an array.`);\n return value;\n}\n\nfunction objects(element: JsonObject, name: string): JsonObject[] {\n return entries(element, name).map(entry => {\n if (!isObject(entry)) throw new PivotFormatError(`An entry of '${name}' is not an object.`);\n return entry;\n });\n}\n\nfunction string(element: JsonObject, name: string): string {\n const value = member(element, name);\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string, and is required.`);\n return value;\n}\n\nfunction optionalString(element: JsonObject, name: string): string | undefined {\n const value = member(element, name);\n if (value === undefined) return undefined;\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string.`);\n return value;\n}\n\n// An integer member of an object, of 32 bits.\nfunction int32(element: JsonObject, name: string): number {\n const value = member(element, name);\n if (value === undefined) throw new PivotFormatError(`'${name}' is an integer, and is required.`);\n return int32Value(value, name);\n}\n\n// An integer value of 32 bits: a member's, or an entry of an array named by name.\nfunction int32Value(value: Json, name: string): number {\n const number = value instanceof JsonNumber ? value.int32 : undefined;\n if (number === undefined) throw new PivotFormatError(`'${name}' holds integers; ${rawOf(value)} is not one.`);\n return number;\n}\n\nfunction integer(element: JsonObject, name: string): number {\n const value = member(element, name);\n if (value === undefined) throw new PivotFormatError(`'${name}' is an integer, and is required.`);\n return integerValue(value, name);\n}\n\n// A whole number a double holds exactly, where C# reads a long.\nfunction integerValue(value: Json, name: string): number {\n const number = value instanceof JsonNumber ? value.integer : undefined;\n if (number === undefined) throw new PivotFormatError(`'${name}' holds integers; ${rawOf(value)} is not one.`);\n return number;\n}\n\n// A value as the document wrote it, as JsonElement.GetRawText gives it back, without its spaces.\nfunction rawOf(value: Json): string {\n if (value instanceof JsonNumber) return value.raw;\n if (isArray(value)) return `[${value.map(rawOf).join(',')}]`;\n if (isObject(value)) return `{${memberNames(value).map(name => `${JSON.stringify(name)}:${rawOf(defined(member(value, name), 'a member'))}`).join(',')}}`;\n return JSON.stringify(value);\n}\n\nfunction named<T extends string>(element: JsonObject, name: string, what: string, names: readonly T[]): T {\n const value = member(element, name);\n if (typeof value !== 'string') throw new PivotFormatError(`'${name}' is a string, and is required.`);\n const known = names.find(candidate => candidate === value);\n if (known === undefined) throw new PivotFormatError(`'${value}' is not a ${what} this reader knows.`);\n return known;\n}\n\n// ---- The documents ----------------------------------------------------------------------------------\n\n/**\n * Every Pivot Source question and answer as JSON (ADR-0066), so it crosses to a server unchanged \u2014 the C#\n * engine's `PivotJson`, which writes each document as the same text. Each document names its format's\n * `version` and its `type`; a reader refuses, with a {@link PivotVersionError}, a version it does not know\n * rather than half-read it, and, with a {@link PivotFormatError}, a document of another type or one that\n * cannot be, naming what is wrong. An exact decimal crosses as its digits and a double as its shortest\n * round-trip text, a non-finite one by name (`\"NaN\"`, `\"Infinity\"`, `\"-Infinity\"`); a part that is exact or\n * not, a sum or an extreme, is a JSON number when it is exact and a JSON string when it is a double. An\n * answer's leaves are written column by column: one array per level and per part, never an object per leaf.\n */\nexport const PivotJson = Object.freeze({\n /** The format version this writer writes and the only one this reader reads. */\n version,\n\n /** A question for the Leaf Aggregates, as JSON. */\n writeQuery(query: PivotQuery): string {\n return document('query', [\n ['rows', fieldsJson(query.rows)],\n ['columns', fieldsJson(query.columns)],\n ['filters', fieldsJson(query.filters)],\n ['values', jsonArray(query.values.map(value => jsonObject([['field', jsonString(value.field)], ['parts', partsJson(value.parts)]])))],\n ['maxLeaves', int32Json(query.maxLeaves, 'maxLeaves')],\n ...(query.levels === undefined ? [] : [['levels', levelsJson(query.levels)] as [string, string]]),\n ]);\n },\n\n /** The Leaf Aggregates, or a refusal, as JSON: the leaves column by column. */\n writeAnswer(answer: PivotAnswer): string {\n if (answer.refusal !== undefined) return document('answer', refusalMembers(answer.refusal));\n const leafCount = answer.leafCount;\n const levels = answer.isLevels;\n return document('answer', [\n ['sourceVersion', jsonString(answer.sourceVersion)],\n ...(levels ? [['levels', 'true'] as [string, string]] : []),\n ['rows', axesJson(answer.rows, leafCount)],\n ['columns', axesJson(answer.columns, leafCount)],\n ['records', leavesOf(leafCount, leaf => String(answer.recordsAt(leaf)))],\n ['values', jsonArray(answer.values.map(values => valuesJson(values, leafCount, levels)))],\n ...windowingMembers(answer, leafCount),\n ]);\n },\n\n /** A question for a field's Items, as JSON. */\n writeItemsQuery(query: PivotItemsQuery): string {\n const members: Members = [['field', jsonString(query.field)], ['sourceVersion', jsonString(query.sourceVersion)]];\n if (query.search !== undefined) members.push(['search', jsonString(query.search)]);\n members.push(['max', int32Json(query.max, 'max')]);\n return document('itemsQuery', members);\n },\n\n /** A page of Items, or a refusal, as JSON. */\n writeItemPage(page: PivotItemPage): string {\n if (page.refusal !== undefined) return document('itemPage', refusalMembers(page.refusal));\n return document('itemPage', [['sourceVersion', jsonString(page.sourceVersion)], ['items', keysJson(page.items)], ['total', int32Json(page.total, 'total')]]);\n },\n\n /** A question for the records behind a cell, as JSON. */\n writeDetailsQuery(query: PivotDetailsQuery): string {\n return document('detailsQuery', [\n ['sourceVersion', jsonString(query.sourceVersion)],\n ['rowItems', pathJson(query.rowItems)],\n ['columnItems', pathJson(query.columnItems)],\n ['hiddenItems', fieldsJson(query.hiddenItems)],\n ['start', int32Json(query.start, 'start')],\n ['count', int32Json(query.count, 'count')],\n ]);\n },\n\n /** A page of the records behind a cell, or a refusal, as JSON. Each value is written by its field's\n * declared type, and one of another type tagged with its own; the Consumer's own record objects are not\n * written. */\n writeDetailPage(page: PivotDetailPage): string {\n if (page.refusal !== undefined) return document('detailPage', refusalMembers(page.refusal));\n const fields = page.fields;\n return document('detailPage', [\n ['sourceVersion', jsonString(page.sourceVersion)],\n ['fields', jsonArray(fields.map(field => {\n const members: Members = [['name', jsonString(field.name)], ['type', jsonString(field.type)]];\n if (field.caption !== field.name) members.push(['caption', jsonString(field.caption)]);\n if (field.format !== undefined) members.push(['format', jsonString(field.format)]);\n return jsonObject(members);\n }))],\n ['start', int32Json(page.start, 'start')],\n ['total', String(page.total)],\n ['records', jsonArray(page.records.map(record => jsonArray(record.values.map((value, f) => detailValueJson(elementAt(fields, f).type, value)))))],\n ]);\n },\n\n /** A source's notice that its data moved on, as JSON. */\n writeSourceChanged(change: PivotSourceChanged): string {\n return document('sourceChanged', change.sourceVersion === undefined ? [] : [['sourceVersion', jsonString(change.sourceVersion)]]);\n },\n\n /**\n * A server's Change Batch (ADR-0370 section 3), as JSON: the records its data lost and gained between two\n * Source Versions, each value by its field's declared type, under the names and types of the fields they\n * are in, so a reader whose fields differ refuses the batch rather than place its values in the wrong ones.\n */\n writeChangeBatch(batch: PivotServerChangeBatch, fields: readonly PivotField[]): string {\n return document('changeBatch', [\n ['from', jsonString(batch.from)],\n ['to', jsonString(batch.to)],\n ['fields', jsonArray(fields.map(field => {\n const members: Members = [['name', jsonString(field.name)], ['type', jsonString(field.type)]];\n if (field.datePart !== undefined) members.push(['datePart', jsonString(field.datePart)]);\n return jsonObject(members);\n }))],\n ['removed', batchRecordsJson(batch.removed, fields, 'removed')],\n ['added', batchRecordsJson(batch.added, fields, 'added')],\n ]);\n },\n\n /** Each field's count of Items (ADR-0370 section 3), as JSON: `counts` holds a member per counted field. */\n writeItemCounts(counts: PivotItemCounts): string {\n return document('itemCounts', [\n ['sourceVersion', jsonString(counts.sourceVersion)],\n ['counts', jsonObject(Array.from(counts.counts, ([field, count]) => [field, String(count)] as const))],\n ]);\n },\n\n /** A question read back from {@link PivotJson.writeQuery}'s JSON. */\n readQuery(json: string): PivotQuery {\n return read(json, 'query', root => pivotQuery({\n rows: fieldsOf(root, 'rows'),\n columns: fieldsOf(root, 'columns'),\n filters: fieldsOf(root, 'filters'),\n values: objects(root, 'values').map(value => ({ field: string(value, 'field'), parts: partsOf(value) })),\n maxLeaves: int32(root, 'maxLeaves'),\n ...levelsOf(root),\n }));\n },\n\n /**\n * An answer read back from {@link PivotJson.writeAnswer}'s JSON. Refuses by name a leaf array of the wrong\n * length, an Item index out of range, two Items of one field that are one Item, counts that cannot be \u2014\n * more numbers than values, more values than records \u2014 and a part in a form it cannot be: an exact\n * number no decimal holds exactly among them, which is refused rather than rounded.\n */\n readAnswer(json: string): PivotAnswer {\n return read(json, 'answer', root => {\n const refusal = refusalOf(root);\n if (refusal !== undefined) return PivotAnswer.refused(refusal);\n const sourceVersion = string(root, 'sourceVersion');\n const levels = optionalBool(root, 'levels');\n const records = entries(root, 'records').map(entry => integerValue(entry, 'records'));\n records.forEach((count, leaf) => {\n if (count < 1) throw new PivotFormatError(levels ? `Cell ${leaf} holds ${count} records; a cell has records.` : `Leaf ${leaf} holds ${count} records; a leaf has records.`);\n });\n const rows = axesOf(root, 'rows', records.length, levels);\n const columns = axesOf(root, 'columns', records.length, levels);\n const values = objects(root, 'values').map(element => valuesOf(element, records, levels));\n return madeAnswer(sourceVersion, rows, columns, records.length, Object.freeze(records), values, levels, windowingOf(root, records.length, levels));\n });\n },\n\n /** A question for a field's Items read back from {@link PivotJson.writeItemsQuery}'s JSON. */\n readItemsQuery(json: string): PivotItemsQuery {\n return read(json, 'itemsQuery', root => {\n const search = optionalString(root, 'search');\n return pivotItemsQuery({ field: string(root, 'field'), sourceVersion: string(root, 'sourceVersion'), ...(search === undefined ? {} : { search }), max: int32(root, 'max') });\n });\n },\n\n /** A page of Items read back from {@link PivotJson.writeItemPage}'s JSON. */\n readItemPage(json: string): PivotItemPage {\n return read(json, 'itemPage', root => {\n const refusal = refusalOf(root);\n return refusal === undefined\n ? PivotItemPage.of(string(root, 'sourceVersion'), keysOf(root, 'items'), int32(root, 'total'))\n : PivotItemPage.refused(refusal);\n });\n },\n\n /** A question for the records behind a cell read back from {@link PivotJson.writeDetailsQuery}'s JSON. */\n readDetailsQuery(json: string): PivotDetailsQuery {\n return read(json, 'detailsQuery', root => pivotDetailsQuery({\n sourceVersion: string(root, 'sourceVersion'),\n rowItems: pathOf(root, 'rowItems'),\n columnItems: pathOf(root, 'columnItems'),\n hiddenItems: fieldsOf(root, 'hiddenItems'),\n start: int32(root, 'start'),\n count: int32(root, 'count'),\n }));\n },\n\n /** A page of the records behind a cell read back from {@link PivotJson.writeDetailPage}'s JSON, each value\n * read by its field's declared type. The records carry no object of the Consumer's: those never left the\n * process. */\n readDetailPage(json: string): PivotDetailPage {\n return read(json, 'detailPage', root => {\n const refusal = refusalOf(root);\n if (refusal !== undefined) return PivotDetailPage.refused(refusal);\n const fields = objects(root, 'fields').map(field => {\n const caption = optionalString(field, 'caption');\n const format = optionalString(field, 'format');\n return pivotField({\n name: string(field, 'name'),\n type: named(field, 'type', 'type', fieldTypes),\n ...(caption === undefined ? {} : { caption }),\n ...(format === undefined ? {} : { format }),\n });\n });\n const records = entries(root, 'records').map((record): PivotDetailRecord => {\n if (!isArray(record)) throw new PivotFormatError('A detail record is an array of values.');\n const values = record;\n if (values.length !== fields.length) throw new PivotFormatError(`A detail record carries ${values.length} values, and the page has ${fields.length} fields.`);\n return { values: values.map((value, f) => detailValueOf(value, elementAt(fields, f))) };\n });\n return PivotDetailPage.of(string(root, 'sourceVersion'), fields, int32(root, 'start'), integer(root, 'total'), records);\n });\n },\n\n /** A source's notice read back from {@link PivotJson.writeSourceChanged}'s JSON. */\n readSourceChanged(json: string): PivotSourceChanged {\n return read(json, 'sourceChanged', root => {\n const sourceVersion = optionalString(root, 'sourceVersion');\n return Object.freeze(sourceVersion === undefined ? {} : { sourceVersion });\n });\n },\n\n /**\n * A notice a server sent a fetching source (ADR-0370 section 3), read back from\n * {@link PivotJson.writeSourceChanged}'s or {@link PivotJson.writeChangeBatch}'s JSON, to hand to the fetchers'\n * `notify`. A batch is read against the source's `fields`: one written under other names or types, or in\n * another order, is refused by name.\n */\n readServerNotice(json: string, fields: readonly PivotField[]): PivotServerNotice {\n return read(json, ['sourceChanged', 'changeBatch'], (root, type): PivotServerNotice => {\n if (type === 'sourceChanged') {\n const sourceVersion = optionalString(root, 'sourceVersion');\n return Object.freeze(sourceVersion === undefined ? { kind: 'changed' } : { kind: 'changed', sourceVersion });\n }\n const from = string(root, 'from');\n const to = string(root, 'to');\n if (from.length === 0 || to.length === 0 || from === to) throw new TypeError(batchVersions);\n const written = objects(root, 'fields').map(field => {\n const part = member(field, 'datePart');\n return { name: string(field, 'name'), type: named(field, 'type', 'type', fieldTypes), datePart: part === undefined ? undefined : named(field, 'datePart', 'date part', dateParts) };\n });\n const differs = written.length !== fields.length || written.some((field, f) => {\n const own = elementAt(fields, f);\n return field.name !== own.name || field.type !== own.type || field.datePart !== own.datePart;\n });\n if (differs) throw new PivotFormatError(`The batch's fields are ${fieldList(written)}, and the source's are ${fieldList(fields)}.`);\n const removed = Object.freeze(batchRecordsOf(root, 'removed', fields));\n const added = Object.freeze(batchRecordsOf(root, 'added', fields));\n return Object.freeze({ kind: 'changeBatch', from, to, removed, added });\n });\n },\n\n /** Each field's count of Items read back from {@link PivotJson.writeItemCounts}'s JSON; a field named twice\n * is refused. */\n readItemCounts(json: string): PivotItemCounts {\n return read(json, 'itemCounts', root => {\n const counts = member(root, 'counts');\n if (!isObject(counts)) throw new PivotFormatError(\"'counts' is an object, and is required.\");\n const [twice] = namesWrittenTwice(counts);\n if (twice !== undefined) throw new PivotFormatError(`'counts' names '${twice}' twice.`);\n return new PivotItemCounts(string(root, 'sourceVersion'), memberNames(counts).map(field => [field, int32Value(defined(member(counts, field), 'a counted field'), 'counts')] as const));\n });\n },\n});\n", "// The pivot engine (ADR-0060/0066): a Pivot Source answers a question with the Leaf Aggregates; the engine\n// builds from them the row and column trees and every total, and lays them out into a Pivot Report. Pure,\n// with no UI. The C# engine's PivotEngine.\n\nimport type { PivotAnswer } from './cube/answer';\nimport { buildCube, buildCubeSteps, cubeHoldsFields, cubeHoldsWindows, cubeParts, ItemRef, type PivotCube } from './cube/cube';\nimport { placedFields, queryForLayout, type PivotQuery } from './cube/query';\nimport { fieldMeta, fieldMetas, numberFormatProblem, type FieldMeta, type PivotField, type PivotRecordField } from './fields/pivot-field';\nimport { fromPublicKey, keyIdOf, toPublicKey, type PivotItemKey } from './items/item-key';\nimport { pivotAggregations, type PivotArea } from './layout/pivot-enums';\nimport { createPivotFieldPlacement, placementOf, placementsIn, type PivotLayout } from './layout/pivot-layout';\nimport { defined, elementAt } from './must';\nimport { ItemLabels, ItemOrder, resolveOptions, type PivotOptions } from './report/labels';\nimport { buildReport, buildReportSteps, type PivotReport, type PivotReportRow } from './report/report';\nimport { allItemsOf, RecordPivotSource, type PivotItemPage } from './source/pivot-source';\nimport { Slicer, checkedSlicing, type PivotSlicing } from './source/slicing';\n\n/** One Item as Filter\u2026 lists it (ADR-0061): its key as a layout writes it, what it is painted as, and\n * whether the layout hides it now. */\nexport interface PivotItemInfo {\n /** The Item's key, as a layout writes it. */\n readonly key: PivotItemKey;\n /** What it is painted as. */\n readonly label: string;\n /** Whether the layout hides it now. */\n readonly isHidden: boolean;\n}\n\nconst areaTitles: Readonly<Record<PivotArea, string>> = Object.freeze({ filters: 'Filters', columns: 'Columns', rows: 'Rows', values: 'Values' });\nconst directions: readonly string[] = ['ascending', 'descending'];\nconst showValuesAs: readonly string[] = ['noCalculation', 'percentOfGrandTotal', 'percentOfColumnTotal', 'percentOfRowTotal'];\nconst axes: readonly string[] = ['columns', 'rows'];\nconst forms: readonly string[] = ['compact', 'outline', 'tabular'];\n\n/** Refuses by name a layout that names an undeclared field, stands a field in two of Filters, Rows and\n * Columns, orders by a Value Field it does not have, or carries a setting the engine does not know. */\nexport function validateLayout(layout: PivotLayout, declared: ReadonlyMap<string, unknown>): void {\n const standing = new Set<string>();\n for (const area of ['filters', 'columns', 'rows'] as const) {\n for (const placement of placementsIn(layout, area)) {\n if (!declared.has(placement.field)) {\n throw new Error(`The layout places '${placement.field}' in ${areaTitles[area]}, and no Pivot Field of that name is declared (ADR-0060).`);\n }\n if (standing.has(placement.field)) {\n throw new Error(`The layout places '${placement.field}' twice among Filters, Rows and Columns; a field stands in one of them at most (ADR-0061).`);\n }\n standing.add(placement.field);\n const byValue = placement.sort.byValue;\n if (byValue !== undefined && (byValue < 0 || byValue >= layout.values.length)) {\n throw new Error(`'${placement.field}' is ordered by Value Field ${byValue}, and the layout has ${layout.values.length} (ADR-0060).`);\n }\n if (!directions.includes(placement.sort.direction)) {\n throw new Error(`'${placement.field}' has an unknown sort direction (${placement.sort.direction}).`);\n }\n }\n }\n for (const value of layout.values) {\n if (!declared.has(value.field)) {\n throw new Error(`The layout places '${value.field}' in Values, and no Pivot Field of that name is declared (ADR-0060).`);\n }\n if (!pivotAggregations.includes(value.aggregation)) {\n throw new Error(`The Value Field of '${value.field}' has an unknown Aggregation (${value.aggregation}).`);\n }\n if (!showValuesAs.includes(value.showValuesAs)) {\n throw new Error(`The Value Field of '${value.field}' has an unknown Show Values As (${value.showValuesAs}).`);\n }\n const format = value.numberFormat;\n const problem = format === undefined ? undefined : numberFormatProblem(format);\n if (problem !== undefined) {\n throw new Error(`The Value Field of '${value.field}' has the number format '${format}', which ${problem} (ADR-0060).`);\n }\n }\n if (!axes.includes(layout.valuesAxis)) throw new Error(`Unknown ValuesAxis (${layout.valuesAxis}).`);\n if (!forms.includes(layout.form)) throw new Error(`Unknown report form (${layout.form}).`);\n}\n\n/**\n * The cube of a layout over records in memory, on the calling thread: the bundled source answers the\n * layout's question with no cap on leaves, and the cube is built from its leaves. Refuses by name what\n * {@link validateLayout} refuses, and a field list that declares a name twice.\n */\nexport function aggregatePivot<TRecord>(records: readonly TRecord[], fields: readonly PivotRecordField<TRecord>[], layout: PivotLayout): PivotCube {\n const source = new RecordPivotSource(records, fields);\n const meta = fieldMetas(fields);\n validateLayout(layout, meta);\n const query = queryForLayout(layout, Number.MAX_SAFE_INTEGER);\n const answer = source.aggregateNow(query);\n if (answer.refusal !== undefined) throw new Error(answer.refusal.message);\n return buildCube(query, answer, meta, field => allItemsOf(source, field));\n}\n\n/**\n * The cube of a Pivot Source's answer (ADR-0066): the row and column trees its leaves form, and every\n * subtotal and grand total merged from the leaves' parts \u2014 each total from its records, never from the\n * totals below it (ADR-0060). Refuses by name an answer to another question, a refusal, and a field\n * neither declared nor named by the question.\n */\nexport function pivotCube(query: PivotQuery, answer: PivotAnswer, fields: readonly PivotField[]): PivotCube {\n return buildCube(query, answer, fieldMetas(fields));\n}\n\n/**\n * {@link pivotCube} in slices (PV-40): the same steps over the answer's leaves and cells, a piece at a time,\n * yielding between slices as `slicing` paces them, so that a large answer's cube leaves the page painting. It\n * gives the cube {@link pivotCube} gives, and rejects with what it throws. Once `signal` is aborted, it stops at\n * the next slice and rejects with the signal's reason. A call begins a slice of its own, and its last slice ends\n * without a yield, as a source's question does: a caller that asks, makes the cube and lays out the report one\n * after another yields between them where the page must paint.\n */\nexport async function pivotCubeAsync(query: PivotQuery, answer: PivotAnswer, fields: readonly PivotField[],\n slicing?: PivotSlicing, signal?: AbortSignal): Promise<PivotCube> {\n const slicer = new Slicer(checkedSlicing(slicing), signal);\n return slicer.run(buildCubeSteps(query, answer, fieldMetas(fields)));\n}\n\n/**\n * Lays a cube out under a layout (ADR-0060): the rows, the label columns, the value columns and their\n * Header Group spans. Cheap \u2014 nothing is asked of the source. Refuses a layout the cube does not hold.\n */\nexport function pivotReport(cube: PivotCube, layout: PivotLayout, options?: PivotOptions): PivotReport {\n checkCubeHolds(cube, layout);\n return buildReport(cube, layout, resolveOptions(options));\n}\n\n/**\n * {@link pivotReport} in slices (PV-40): each tree walked a node at a time and thousands of siblings ordered\n * a piece at a time, yielding between slices as `slicing` paces them. It gives the report {@link pivotReport}\n * gives, and rejects with what it throws, an Order Key that fails included. Once `signal` is aborted, it stops at\n * the next slice and rejects with the signal's reason.\n */\nexport async function pivotReportAsync(cube: PivotCube, layout: PivotLayout, options?: PivotOptions,\n slicing?: PivotSlicing, signal?: AbortSignal): Promise<PivotReport> {\n const slicer = new Slicer(checkedSlicing(slicing), signal);\n checkCubeHolds(cube, layout);\n return slicer.run(buildReportSteps(cube, layout, resolveOptions(options)));\n}\n\n/** Refuses a layout the cube cannot lay out: one {@link validateLayout} refuses, or one it was not aggregated\n * for. */\nexport function checkCubeHolds(cube: PivotCube, layout: PivotLayout): void {\n validateLayout(layout, cubeParts(cube).meta);\n if (cubeHoldsFields(cube, layout) && !cubeHoldsWindows(cube, layout)) {\n throw new Error('The cube holds Sibling Windows cut by the orders and collapse its question asked, and this layout orders or '\n + 'collapses its windowed fields otherwise; ask the source again with levelQueryForLayout before laying it out (ADR-0370 section 3).');\n }\n if (!cube.holds(layout) && cubeHoldsFields(cube, layout)) {\n throw new Error('The cube was made from Level Aggregates of the groups its question showed, and this layout shows groups '\n + 'below them it does not hold; ask the source again with levelQueryForLayout before laying it out (ADR-0370 section 3).');\n }\n if (!cube.holds(layout)) {\n throw new Error('The cube was aggregated under other placed fields, Hidden Items or Value Fields than this layout '\n + 'has, or without the parts one of its Aggregations reads; ask again (aggregatePivot, or the '\n + 'source with queryForLayout) before laying it out (ADR-0060/0066).');\n }\n}\n\n/** Aggregates and lays out in one step: {@link aggregatePivot} then {@link pivotReport}. */\nexport function computePivot<TRecord>(records: readonly TRecord[], fields: readonly PivotRecordField<TRecord>[], layout: PivotLayout,\n options?: PivotOptions): PivotReport {\n return pivotReport(aggregatePivot(records, fields, layout), layout, options);\n}\n\n/**\n * Every Item of a placed field over all the records, in the field's order \u2014 what Filter\u2026 lists (ADR-0061)\n * \u2014 each with its label and whether it is hidden now. For a cube built by {@link aggregatePivot}; a cube\n * built from a source's answer asks the source for a page and lays it out with {@link itemsOfPage}.\n */\nexport function itemsOfCube(cube: PivotCube, layout: PivotLayout, field: string, options?: PivotOptions): readonly PivotItemInfo[] {\n if (placementOf(layout, field) === undefined && !placedFields(cube.query).some(f => f.field === field)) {\n throw new TypeError(`'${field}' stands in none of Filters, Rows and Columns of the layout.`);\n }\n const allItems = cubeParts(cube).allItems;\n if (allItems === undefined) {\n throw new Error(\"This cube was built from a Pivot Source's answer, which carries only the Items its leaves have; ask the \"\n + \"source for the field's Items (PivotSource.items) under the cube's Source Version (ADR-0066).\");\n }\n const meta = defined(cubeParts(cube).meta.get(field), `the field '${field}' has its meta`);\n return itemInfos(allItems(field).map(key => new ItemRef(key, toPublicKey(key))), meta, layout, field, options);\n}\n\n/**\n * A page of a field's Items as Filter\u2026 and the report filter band list them (ADR-0061): in the field's\n * order under the layout \u2014 its declared Items first, then by kind and label under the report's locale,\n * descending when the field is \u2014 each with its label and whether the layout hides it now.\n */\nexport function itemsOfPage(page: PivotItemPage, layout: PivotLayout, field: PivotField, options?: PivotOptions): readonly PivotItemInfo[] {\n return itemInfos(page.items.map(key => ItemRef.of(key)), fieldMeta(field), layout, field.name, options);\n}\n\nfunction itemInfos(items: readonly ItemRef[], meta: FieldMeta, layout: PivotLayout, field: string, options: PivotOptions | undefined): readonly PivotItemInfo[] {\n const at = placementOf(layout, field);\n const placement = at === undefined ? createPivotFieldPlacement(field) : elementAt(placementsIn(layout, at.area), at.index);\n const resolved = resolveOptions(options);\n const labels = new ItemLabels(resolved);\n const hidden = new Set(placement.hiddenItems.map(key => keyIdOf(fromPublicKey(key))));\n const order = new ItemOrder(meta, labels, resolved.culture, placement.sort.direction === 'descending' && placement.sort.byValue === undefined);\n for (const item of items) order.prepare(item);\n return Object.freeze(items.toSorted((x, y) => order.compare(x, y)).map(item => Object.freeze({\n key: item.publicKey, label: labels.of(item, meta), isHidden: hidden.has(keyIdOf(item.key)),\n })));\n}\n\n/**\n * The records behind one cell of a report \u2014 Show Details (ADR-0063) \u2014 in their order: those no Hidden Item\n * leaves out, carrying the row's Items and the column's. A label cell is value column \u22121, and is every\n * record of its row.\n */\nexport function recordsBehind<TRecord>(records: readonly TRecord[], fields: readonly PivotRecordField<TRecord>[], report: PivotReport,\n row: PivotReportRow, valueColumn: number): readonly TRecord[] {\n return new RecordPivotSource(records, fields).recordsBehind(report.detailsQuery(row, valueColumn));\n}\n", "// What a report source is asked and answers (ADR-0151, ADR-0152, ADR-0153), as ADR-0370 section 4 leaves\n// them: a Window of a report's rows, detached from the report, with the whole report's extent and columns, under\n// a Report Version that versioned operations \u2014 Copy, the Selection Summary, a field's Items \u2014 name back. Every\n// value here is plain data, so a Window crosses to a Web Worker and back as it is. ADR-0151's Window Changes\n// and their digest end with the server's report Windows (ADR-0370 section 3): a Window is answered whole.\n// The C# engine's PivotReportContract and PivotReportOperations.\n\nimport type { PivotSourceRefusal } from '../cube/answer';\nimport { everyRecord, placedFields, pivotDetailsQuery, queryForLayout, type PivotDetailsQuery, type PivotFieldItem } from '../cube/query';\nimport type { PivotItemInfo } from '../engine';\nimport type { PivotItemKey } from '../items/item-key';\nimport type { PivotColumnRole, PivotRowRole } from '../layout/pivot-enums';\nimport type { PivotLayout } from '../layout/pivot-layout';\nimport type { PivotNumber } from '../cube/answer';\nimport type { PivotHeaderSpan, PivotLabelColumn, PivotRowLabel } from '../report/report';\nimport type { PivotValue } from '../report/value';\nimport type { PivotLabelMetrics } from './label-metrics';\n\n/** The rows of a report asked for: from `start`, at most `count` of them. The whole report's row count is\n * the metadata's. */\nexport interface PivotReportWindow {\n /** The first row, from 0. */\n readonly start: number;\n /** The most rows. */\n readonly count: number;\n}\n\n/** A report's display settings, chosen explicitly: a locale never chooses the words (ADR-0151). */\nexport interface PivotReportSettings {\n /** The locale numbers and dates are written in and text is ordered by; the browser's language when left\n * out (ADR-0370 section 10). */\n readonly locale?: string;\n /** The report's words by id, for those the Consumer translates; English for the rest. */\n readonly words?: Readonly<Record<string, string>>;\n /** How long a change of the data stays marked for a cell first asked for after it, in milliseconds;\n * 1,000 when left out (ADR-0068). */\n readonly changeHighlightMs?: number;\n /** The label geometry the label columns' widths are estimated under, or none when no widths are wanted. */\n readonly labelMetrics?: PivotLabelMetrics;\n /** The Order Key a field's Items are ordered by, by the field's name: one of those the report source was\n * given, by its name (ADR-0152). */\n readonly orderKeyPolicies?: Readonly<Record<string, string>>;\n}\n\n/** What a report source is asked: a Window of the report a layout makes, under display settings. */\nexport interface PivotReportRequest {\n /** The request's identity, which its answer names back. */\n readonly requestId: string;\n /** The report's View State. */\n readonly layout: PivotLayout;\n /** Its locale, words, label geometry and Order Key policies. */\n readonly settings: PivotReportSettings;\n /** The rows wanted. */\n readonly window: PivotReportWindow;\n /** The Report Version of the Window the Consumer holds \u2014 the data it shows \u2014 or none. A request that\n * marks no changes (a layout gesture) lays out the data of that version, while the source holds it, and\n * not newer data the Consumer has not been shown; a row of the answer that the held Window shows alike is\n * the very row it holds (ADR-0152, ADR-0153). */\n readonly baseline?: string;\n /** The cap on the answer's leaves; 200,000 when left out (ADR-0066). */\n readonly maxLeaves?: number;\n /** Whether this gesture can mark changes of the data; a layout or display-setting gesture cannot. True\n * when left out. */\n readonly markChanges?: boolean;\n /** Asks a source that cannot tell its data changed again, though it said nothing: an explicit Refresh or\n * Retry (ADR-0153). */\n readonly refreshData?: boolean;\n}\n\n/** A row of a Window, detached from the report, the cube and the source. */\nexport interface PivotDisplayRow {\n /** What the row stands for. */\n readonly role: PivotRowRole;\n /** The Value Field the row shows, or \u22121 when its columns say. */\n readonly valueField: number;\n /** The row's Items, outermost first: with its role and Value Field, what it stands for across reports. */\n readonly items: readonly PivotItemKey[];\n /** Whether the row carries values: a group row whose subtotal stands at the bottom carries none. */\n readonly carriesValues: boolean;\n /** Its label in each label column. */\n readonly labels: readonly PivotRowLabel[];\n /** Its value in each value column, `undefined` for an empty cell. */\n readonly values: readonly (PivotValue | undefined)[];\n /** The row's Items, each with its field. */\n readonly rowPath: readonly PivotFieldItem[];\n /**\n * Per value cell, the change that last moved its shown text: the Report Version whose data changed it,\n * or `undefined` for a cell with no recent change and for every cell a layout gesture laid out. A cell keeps\n * its mark while its text does not change, after the source stops listing the change, so that its row\n * stays the same row. It says which change, never when: when a Change Highlight starts is the Consumer's,\n * on its own clock ({@link PivotChangeTimes}, ADR-0068).\n */\n readonly changedIn: readonly (string | undefined)[];\n}\n\n/** A value column of a report, with its Items. */\nexport interface PivotDisplayColumn {\n /** Its stable name. */\n readonly name: string;\n /** Its leaf header. */\n readonly header: string;\n /** An Item's column, a subtotal's, or the grand total's. */\n readonly role: PivotColumnRole;\n /** The Value Field it shows, or \u22121 when its rows say. */\n readonly valueField: number;\n /** The column's Items, each with its field. */\n readonly columnPath: readonly PivotFieldItem[];\n}\n\n/** The whole report's extent and columns, without its rows or its data. */\nexport interface PivotReportMetadata {\n /** The Report Version: one report, immutable, under its layout and settings. */\n readonly version: string;\n /** The Source Version the report was computed from. */\n readonly sourceVersion: string;\n /** Changes when the ordered sequence of the rows' identities changes. */\n readonly rowSequenceVersion: string;\n /** The layout it was laid out under. */\n readonly layout: PivotLayout;\n /** The settings it was laid out under. */\n readonly settings: PivotReportSettings;\n /** The whole report's row count, rows outside the Window included. */\n readonly rowCount: number;\n /** The label columns. */\n readonly labelColumns: readonly PivotLabelColumn[];\n /** The value columns. */\n readonly valueColumns: readonly PivotDisplayColumn[];\n /** The Header Group spans. */\n readonly headerSpans: readonly PivotHeaderSpan[];\n /** How many tiers the column header has above the leaf headers. */\n readonly headerTierCount: number;\n /** Each Value Field's caption. */\n readonly valueCaptions: readonly string[];\n /** The widest label of each label column under the settings' label geometry, in pixels; none without it. */\n readonly labelWidths: readonly number[];\n /** The changes the source still marks, newest first: a cell marked with one changed recently, and a\n * Consumer stamps each the first time it shows a Window listing it ({@link PivotChangeTimes}). A change\n * leaves the list once it is older than the settings' highlight duration, and never comes back. */\n readonly changeMarks: readonly string[];\n}\n\n/** Why a report source did not answer: `rowsNotAnswered` is a Copy or a Selection Summary that reaches Pending\n * Rows, the siblings a Pivot Source answered a Sibling Window beside (ADR-0370 section 3). */\nexport type PivotReportRefusalKind = 'reportVersionNotHeld' | 'unknownOrderKeyPolicy' | 'sourceRefused' | 'invalidRequest' | 'orderKeyFailed' | 'rowsNotAnswered';\n\n/** A refusal by name; an empty answer is never given in its place. */\nexport interface PivotReportRefusal {\n /** Why. */\n readonly kind: PivotReportRefusalKind;\n /** A sentence a person can read. */\n readonly message: string;\n /** The field it concerns, where one does. */\n readonly field?: string;\n /** The Pivot Source's own refusal, when it refused the question. */\n readonly sourceRefusal?: PivotSourceRefusal;\n}\n\n/** A Window as the Consumer holds it: the report's metadata, the Window answered, and its rows. */\nexport interface PivotReportState {\n /** The whole report's metadata. */\n readonly metadata: PivotReportMetadata;\n /** The Window answered. */\n readonly window: PivotReportWindow;\n /** Its rows, in order. */\n readonly rows: readonly PivotDisplayRow[];\n}\n\n/** A Window answered. */\nexport interface PivotReportAnswer extends PivotReportState {\n /** The request answered. */\n readonly requestId: string;\n /** None: the Window was answered. */\n readonly refusal?: undefined;\n}\n\n/** A Window refused. */\nexport interface PivotReportRefused {\n /** The request refused. */\n readonly requestId: string;\n /** The Window asked for. */\n readonly window: PivotReportWindow;\n /** Why. */\n readonly refusal: PivotReportRefusal;\n}\n\n/** A Window answered, or refused by name. */\nexport type PivotReportUpdate = PivotReportAnswer | PivotReportRefused;\n\n/** A field's Items as the report labels and orders them, under a Report Version. */\nexport interface PivotReportItemsQuery {\n /** The report the Items are listed for. */\n readonly version: string;\n /** The field. */\n readonly field: string;\n /** What the Items' text holds, where the source searches. */\n readonly search?: string;\n /** The most Items listed; 10,000 when left out. */\n readonly max?: number;\n}\n\n/** A field's Items in the report's order, or a refusal. */\nexport interface PivotReportItemsResult {\n /** The report answered. */\n readonly version: string;\n /** Its Source Version, or `''` where the version is not held. */\n readonly sourceVersion: string;\n /** The Items, labelled, in the field's order. */\n readonly items: readonly PivotItemInfo[];\n /** How many Items matched before the cap. */\n readonly total: number;\n /** Why they were not listed. */\n readonly refusal?: PivotReportRefusal;\n}\n\n/** A rectangle of a selection, its edges included: rows of the report, columns among the query's columns. */\nexport interface PivotReportRange {\n /** The first row. */\n readonly top: number;\n /** The first column. */\n readonly left: number;\n /** The last row. */\n readonly bottom: number;\n /** The last column. */\n readonly right: number;\n}\n\n/** A versioned Copy: each rectangle copied whole, in the order given. */\nexport interface PivotReportCopyQuery {\n /** The report the selection was made on. */\n readonly version: string;\n /** The columns' names, in the Consumer's order. */\n readonly columns: readonly string[];\n /** The selected rectangles. */\n readonly ranges: readonly PivotReportRange[];\n /** The most cells copied; 1,000,000 when left out. A copy past it is refused, never cut short (spine 1). */\n readonly maxCells?: number;\n}\n\n/** A copied cell: its text, and its locale-free form. */\nexport interface PivotReportCopyCell {\n /** The shown text. */\n readonly text: string;\n /** The raw, locale-free text \u2014 a number in full \u2014 or absent for a blank. */\n readonly raw?: string;\n /** Whether the raw text is a number. */\n readonly isNumber: boolean;\n}\n\n/** One copied rectangle, with its headers. */\nexport interface PivotReportCopyBlock {\n /** The headers, in the rectangle's column order. */\n readonly headers: readonly string[];\n /** Each header's raw form for a copy's HTML flavour: a number column Item's header carries its number in\n * full (ADR-0005's note of 2026-10-13), any other `undefined`. Absent when no header has one. */\n readonly headerRaws?: readonly (string | undefined)[];\n /** Every cell of its rows. */\n readonly rows: readonly (readonly PivotReportCopyCell[])[];\n}\n\n/** A Copy, or a refusal. */\nexport interface PivotReportCopyResult {\n /** The report answered. */\n readonly version: string;\n /** One block per rectangle asked for. */\n readonly blocks: readonly PivotReportCopyBlock[];\n /** Why it was not copied. */\n readonly refusal?: PivotReportRefusal;\n}\n\n/** A versioned Selection Summary; a cell under two rectangles is counted once. */\nexport interface PivotReportSummaryQuery {\n /** The report the selection was made on. */\n readonly version: string;\n /** The columns' names, in the Consumer's order. */\n readonly columns: readonly string[];\n /** The selected rectangles. */\n readonly ranges: readonly PivotReportRange[];\n /** The Focus row, whose number format the figures are shown in. */\n readonly focusRow?: number;\n /** The Focus column among the columns. */\n readonly focusColumn?: number;\n}\n\n/** The figures of a Selection Summary, or a refusal (ADR-0130). */\nexport interface PivotReportSummaryResult {\n /** The report answered. */\n readonly version: string;\n /** The cells that are not blank: Count. */\n readonly values: number;\n /** The cells that are numbers: Numerical Count. An error is not one. */\n readonly numbers: number;\n /** The sum, exact wherever every number was; absent with no number. */\n readonly sum?: PivotNumber;\n /** The smallest number; absent with no number. */\n readonly min?: PivotNumber;\n /** The largest number; absent with no number. */\n readonly max?: PivotNumber;\n /** An error was selected: Average, Min, Max and Sum are not shown, and Count and Numerical Count are. */\n readonly hasError: boolean;\n /** The Focus value's number format, where it has one. */\n readonly numberFormat?: string;\n /** The report's locale. */\n readonly locale: string;\n /** Why it was not summed. */\n readonly refusal?: PivotReportRefusal;\n}\n\n/**\n * The question for the records behind a cell of a report \u2014 Show Details (ADR-0063, ADR-0151) \u2014 from a row of\n * its Window and the report's own layout and columns: the row's Items, the value column's (none for a label\n * cell, column \u22121), the Hidden Items the report was computed under, the page, and its Source Version. Made of\n * values, it stays the same question after any later layout, and is answered while the Pivot Source holds that\n * Source Version.\n */\nexport function pivotReportDetailsQuery(metadata: PivotReportMetadata, row: PivotDisplayRow, valueColumn: number,\n start = 0, count: number = everyRecord): PivotDetailsQuery {\n if (!Number.isInteger(valueColumn) || valueColumn < -1 || valueColumn >= metadata.valueColumns.length) {\n throw new RangeError('Not a value column of the report, nor \u22121.');\n }\n if (row.values.length !== metadata.valueColumns.length) throw new TypeError(\"The row is not a row of this report's columns.\");\n const column = valueColumn < 0 ? undefined : metadata.valueColumns[valueColumn];\n return pivotDetailsQuery({\n sourceVersion: metadata.sourceVersion,\n rowItems: row.rowPath,\n columnItems: column === undefined ? [] : column.columnPath,\n hiddenItems: placedFields(queryForLayout(metadata.layout)).filter(field => field.hiddenItems.length > 0),\n start,\n count,\n });\n}\n", "// The label geometry a report source estimates its label columns' widths under (ADR-0151, ADR-0153): the\n// grid's resolved width of each character class, and of glyphs outside them, already scaled to the client's\n// font. The source never reads a browser's layout; it is told the geometry and estimates. The C# engine's\n// PivotReportLabelMetrics and PivotLabelSizing.\n\nimport { rowIdOf, type PivotReport, type PivotReportRow, type PivotRowKey } from '../report/report';\nimport { elementAt } from '../must';\nimport { pieceUnits } from '../source/slicing';\n\n/** The widths of the grid's character classes and of single glyphs, in pixels. Plain data, so it crosses\n * to a Worker as it is. */\nexport interface PivotLabelMetrics {\n /** `%`, `\u20AC`, `\u2212`, `+`, `#`. */\n readonly wideWidthPx: number;\n /** Digits, currency signs, `E`, `-`, the apostrophes and spaces numbers are grouped with, and the marks of\n * direction. */\n readonly digitWidthPx: number;\n /** `.`, `,`, `(`, `)`, `/`, `:` and the space. */\n readonly narrowWidthPx: number;\n /** A full-width character: CJK, kana, Hangul, full-width forms. */\n readonly fullWidthPx: number;\n /** Any other character. */\n readonly otherWidthPx: number;\n /** The padding on one side of a cell. */\n readonly cellHorizontalPaddingPx: number;\n /** The width of single glyphs outside the classes, by code point. */\n readonly glyphWidths?: Readonly<Record<number, number>>;\n}\n\n// The glyphs a geometry gives a width of its own; none when it gives none.\nfunction glyphsOf(metrics: PivotLabelMetrics): Readonly<Record<number, number>> {\n return metrics.glyphWidths ?? {}; // oxlint-disable-line ex-grid/no-stand-in-default -- no glyph widths are none\n}\n\nfunction positive(width: unknown): boolean {\n return typeof width === 'number' && Number.isFinite(width) && width > 0;\n}\n\n/** Refuses label geometry a width cannot be estimated under: a class width that is not finite and positive,\n * a negative padding, or a glyph that is no Unicode scalar or has no finite positive width. */\nexport function checkLabelMetrics(metrics: PivotLabelMetrics): void {\n for (const width of [metrics.wideWidthPx, metrics.digitWidthPx, metrics.narrowWidthPx, metrics.fullWidthPx, metrics.otherWidthPx]) {\n if (!positive(width)) throw new RangeError('Glyph widths must be finite and positive.');\n }\n const padding = metrics.cellHorizontalPaddingPx;\n if (typeof padding !== 'number' || !Number.isFinite(padding) || padding < 0) {\n throw new RangeError('A cell\\'s horizontal padding is finite and not negative.');\n }\n for (const [point, width] of Object.entries(glyphsOf(metrics))) {\n const code = Number(point);\n const scalar = Number.isInteger(code) && code >= 0 && code <= 0x10FFFF && (code < 0xD800 || code > 0xDFFF);\n if (!scalar || !positive(width)) throw new TypeError('A glyph needs a Unicode scalar and a finite positive width.');\n }\n}\n\n/** Whether two geometries estimate alike. */\nexport function sameLabelMetrics(a: PivotLabelMetrics | undefined, b: PivotLabelMetrics | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n const glyphs = Object.entries(glyphsOf(a));\n const others = glyphsOf(b);\n return a.wideWidthPx === b.wideWidthPx && a.digitWidthPx === b.digitWidthPx && a.narrowWidthPx === b.narrowWidthPx\n && a.fullWidthPx === b.fullWidthPx && a.otherWidthPx === b.otherWidthPx && a.cellHorizontalPaddingPx === b.cellHorizontalPaddingPx\n && glyphs.length === Object.keys(others).length && glyphs.every(([point, width]) => others[Number(point)] === width);\n}\n\nconst wide = new Set(['%', '\u20AC', '\u2212', '+', '#'].map(c => c.codePointAt(0)));\nconst narrow = new Set(['.', ',', '(', ')', '/', ':', ' '].map(c => c.codePointAt(0)));\nconst digitSigns = new Set(['$', '\u00A3', '\u00A5', '\u20B9', '\u20BA', '\u20AB', 'E', '-', '\\'', '\u2019', '\u00A0', '\u202F', '\u200E', '\u200F', '\u061C']\n .map(c => c.codePointAt(0)));\n\nfunction isDigitClass(c: number): boolean {\n return (c >= 0x30 && c <= 0x39) || digitSigns.has(c);\n}\n\nfunction isFullWidth(c: number): boolean {\n return (c >= 0x1100 && c <= 0x115F) // Hangul Jamo initials\n || (c >= 0x2E80 && c <= 0x303E) // CJK radicals, Kangxi, ideographic space and punctuation\n || (c >= 0x3041 && c <= 0x33FF) // kana, Bopomofo, Hangul compatibility, enclosed and compatibility CJK\n || (c >= 0x3400 && c <= 0x4DBF) // CJK Extension A\n || (c >= 0x4E00 && c <= 0x9FFF) // CJK Unified Ideographs\n || (c >= 0xA000 && c <= 0xA4CF) // Yi\n || (c >= 0xA960 && c <= 0xA97F) // Hangul Jamo Extended-A\n || (c >= 0xAC00 && c <= 0xD7A3) // Hangul syllables\n || (c >= 0xF900 && c <= 0xFAFF) // CJK Compatibility Ideographs\n || (c >= 0xFE10 && c <= 0xFE19) // vertical forms\n || (c >= 0xFE30 && c <= 0xFE6F) // CJK compatibility and small forms\n || (c >= 0xFF01 && c <= 0xFF60) // fullwidth forms\n || (c >= 0xFFE0 && c <= 0xFFE6) // fullwidth signs\n || (c >= 0x1F300 && c <= 0x1F64F) // pictographs and emoticons\n || (c >= 0x1F900 && c <= 0x1F9FF) // supplemental pictographs\n || (c >= 0x20000 && c <= 0x3FFFD); // CJK Extensions B onward\n}\n\nfunction widthOf(metrics: PivotLabelMetrics, point: number): number {\n if (wide.has(point)) return metrics.wideWidthPx;\n if (narrow.has(point)) return metrics.narrowWidthPx;\n if (isFullWidth(point)) return metrics.fullWidthPx;\n if (isDigitClass(point)) return metrics.digitWidthPx;\n const glyph = metrics.glyphWidths?.[point];\n return glyph === undefined ? metrics.otherWidthPx : glyph;\n}\n\n/** A label's text estimated under the geometry, both sides' padding included, without reading a browser's\n * layout. A lone surrogate is a character of the other class, as .NET reads it. */\nexport function estimateLabelPx(metrics: PivotLabelMetrics, text: string): number {\n let width = 2 * metrics.cellHorizontalPaddingPx;\n for (const character of text) width += widthOf(metrics, defined(character.codePointAt(0)));\n return width;\n}\n\nfunction defined(point: number | undefined): number {\n if (point === undefined) throw new Error('Internal: a character has no code point.');\n // .NET enumerates a lone surrogate as U+FFFD, which is of the other class.\n return point >= 0xD800 && point <= 0xDFFF ? 0xFFFD : point;\n}\n\n// .NET's Math.Round, which sends a tie to the even number (CONVENTIONS.md).\nfunction roundHalfToEven(value: number): number {\n const floor = Math.floor(value);\n const diff = value - floor;\n if (diff < 0.5) return floor;\n if (diff > 0.5) return floor + 1;\n return floor % 2 === 0 ? floor : floor + 1;\n}\n\nfunction rowWidth(row: PivotReportRow, column: number, metrics: PivotLabelMetrics): number {\n const label = elementAt(row.labels, column);\n if (label.text === undefined && label.toggle === undefined) return 0;\n const levels = label.indent + (label.toggle === undefined ? 0 : 1);\n return estimateLabelPx(metrics, label.text ?? '') + (roundHalfToEven(metrics.fullWidthPx) * levels); // oxlint-disable-line ex-grid/no-stand-in-default -- a label with a button and no text is the button's width alone, as the C# engine measures it\n}\n\n/** The widest label of each label column, every row measured, yielding between pieces of rows. */\nexport function* labelWidthSteps(report: PivotReport, metrics: PivotLabelMetrics): Generator<void, readonly number[]> {\n const widths = report.labelColumns.map(() => 0);\n const size = Math.max(1, Math.floor(pieceUnits / 4));\n for (let from = 0; from < report.rows.length; from += size) {\n if (from > 0) yield;\n const to = Math.min(report.rows.length, from + size);\n for (let r = from; r < to; r++) {\n const row = elementAt(report.rows, r);\n for (let column = 0; column < widths.length; column++) {\n widths[column] = Math.max(elementAt(widths, column), rowWidth(row, column, metrics));\n }\n }\n }\n return Object.freeze(widths);\n}\n\n/** The rows one computation's result changed: those it added or relabelled, and the keys of those it took away. */\nexport interface LabelBatch {\n readonly labels: readonly PivotReportRow[];\n readonly removed: readonly PivotRowKey[];\n}\n\n/**\n * The widest label of each label column, kept across a report's versions (ADR-0153): every row measured on a\n * reset or under new geometry, otherwise the rows the batches added or relabelled measured and the rows they\n * took away forgotten, batch by batch in order. It keeps only each row's widths, by its key, and how many rows\n * have each width. Every step sets a row's entry to what one batch says of it, so a pass cancelled half way and\n * begun again from the first batch ends where one pass uncancelled would have. The C# engine's\n * PivotLabelSizing.\n */\nexport class PivotLabelSizing {\n #metrics: PivotLabelMetrics | undefined;\n readonly #rows = new Map<string, readonly number[]>();\n #widths: Map<number, number>[] = [];\n\n /** The widths of `report`'s label columns under `metrics`. */\n *widthSteps(report: PivotReport, metrics: PivotLabelMetrics, batches: readonly LabelBatch[], reset: boolean): Generator<void, readonly number[]> {\n let units = 0;\n if (reset || this.#metrics === undefined || !sameLabelMetrics(this.#metrics, metrics) || this.#widths.length !== report.labelColumns.length) {\n this.#rows.clear();\n this.#widths = report.labelColumns.map(() => new Map<number, number>());\n // Not the metrics until every row is measured: a pass cancelled before then is begun again whole.\n this.#metrics = undefined;\n for (const row of report.rows) {\n this.#add(row, metrics);\n units += 4;\n if (units >= pieceUnits) {\n units = 0;\n yield;\n }\n }\n this.#metrics = metrics;\n } else {\n for (const { labels, removed } of batches) {\n for (const key of removed) this.#remove(rowKeyId(key));\n for (const row of labels) {\n this.#remove(rowKeyId(row.key));\n this.#add(row, metrics);\n units += 4;\n if (units >= pieceUnits) {\n units = 0;\n yield;\n }\n }\n }\n }\n return Object.freeze(this.#widths.map(column => {\n let widest = 0;\n for (const width of column.keys()) widest = Math.max(widest, width);\n return widest;\n }));\n }\n\n /** A version published without widths: the next one asked for measures every row, since the batches between\n * were not counted. */\n forget(): void {\n this.#metrics = undefined;\n }\n\n #add(row: PivotReportRow, metrics: PivotLabelMetrics): void {\n const widths = this.#widths.map((column, at) => {\n const width = rowWidth(row, at, metrics);\n const had = column.get(width);\n column.set(width, had === undefined ? 1 : had + 1);\n return width;\n });\n this.#rows.set(rowKeyId(row.key), widths);\n }\n\n #remove(id: string): void {\n const widths = this.#rows.get(id);\n if (widths === undefined) return;\n this.#rows.delete(id);\n widths.forEach((width, at) => {\n const column = elementAt(this.#widths, at);\n const count = column.get(width);\n if (count === undefined) throw new Error('Internal: a label width the sizing measured is not counted (ADR-0153).');\n if (count === 1) column.delete(width);\n else column.set(width, count - 1);\n });\n }\n}\n\nfunction rowKeyId(key: PivotRowKey): string {\n return rowIdOf(key.role, key.valueField, key.items);\n}\n", "// When the Consumer first showed each change of the data a report source marks \u2014 the time a Change Highlight\n// starts (ADR-0068) \u2014 stamped on the Consumer's own clock as it adopts a Window, never on the source's, which\n// may run in a Worker or on a server whose clock need not agree. The C# engine's PivotChangeTimes.\n\nimport type { PivotDisplayRow, PivotReportState } from './contract';\n\n/**\n * When this Consumer first showed each change a report source marks. A source marks each changed cell with\n * the Report Version whose data changed it ({@link PivotDisplayRow.changedIn}) and lists the changes it still\n * marks ({@link PivotReportMetadata.changeMarks}). A listed change is stamped the first time a Window of a\n * report listing it is adopted \u2014 whether or not that Window holds one of its cells \u2014 so a row first asked for\n * later, by a scroll, shows it as of that first time, and its highlight ends with the others of the change. A\n * change no longer listed is never stamped; a stamp is kept while the source lists its change or its highlight\n * has not ended, and once forgotten the change is never listed again, so none is stamped twice. One instance\n * serves a view for its lifetime, across new sources.\n */\nexport class PivotChangeTimes {\n readonly #stamps = new Map<string, number>();\n\n /** Takes a Window up as it is shown at `now`, on the Consumer's clock in milliseconds: each change its\n * report lists that is not stamped yet is stamped `now`, and each stamp whose change is no longer listed\n * and whose highlight of `highlightMs` has ended is forgotten. */\n adopt(state: PivotReportState, now: number, highlightMs: number): void {\n const listed = state.metadata.changeMarks;\n for (const [mark, at] of Array.from(this.#stamps)) {\n if (now - at >= highlightMs && !listed.includes(mark)) this.#stamps.delete(mark);\n }\n for (const mark of listed) {\n if (!this.#stamps.has(mark)) this.#stamps.set(mark, now);\n }\n }\n\n /** When the change `mark` names was first shown, or `undefined` for no mark or one not stamped. */\n at(mark: string | undefined): number | undefined {\n return mark === undefined ? undefined : this.#stamps.get(mark);\n }\n\n /** When the shown text of a row's value cell last changed with the data, as this Consumer first showed\n * it; `undefined` when it did not change recently. */\n changedAt(row: PivotDisplayRow, valueColumn: number): number | undefined {\n return valueColumn >= 0 && valueColumn < row.changedIn.length ? this.at(row.changedIn[valueColumn]) : undefined;\n }\n}\n", "// One report's calculation and display state over a Pivot Source it does not own (ADR-0151, ADR-0153): it\n// lays the report out under a request's layout and settings, answers the Window asked for, and keeps a bounded\n// number of Report Versions for the versioned operations \u2014 Copy, the Selection Summary, a field's Items \u2014\n// which never wait on a newer computation. It marks the cells a change of the data moved, for the Change\n// Highlight (ADR-0068). It runs where the Script Core's engine runs: on the page's thread or in a Worker\n// (ADR-0370 section 4). The C# engine's LocalPivotReportSource.\n\nimport { decimalText, type SnapshotDecimal } from '@ex-grid/data';\nimport {\n addDoubleToExtremes, addDoubleToSum, addExactToExtremes, addExactToSum, finishExtremes, finishSum, noExtremes, noSum,\n} from '../aggregates/parts';\nimport { decimalEquals } from '../aggregates/exact-decimal';\nimport { PivotComputationSession, type PivotComputationResult } from '../computation/session';\nimport { cubeParts, type PivotCube } from '../cube/cube';\nimport { defaultMaxLeaves, levelQueryForLayout, pivotItemsQuery, type PivotDetailsQuery, type PivotItemsQuery, type PivotLevelWindowInput, type PivotWindowStart } from '../cube/query';\nimport type { PivotNumber } from '../cube/answer';\nimport { checkCubeHolds, itemsOfPage } from '../engine';\nimport { PivotOrderKeyError } from '../errors';\nimport type { PivotField, PivotOrderKey } from '../fields/pivot-field';\nimport { readPivotLayoutJson, writePivotLayoutJson } from '../layout/layout-json';\nimport { defined, elementAt } from '../must';\nimport { resolveOptions, type PivotOptions } from '../report/labels';\nimport {\n buildReportSteps, pendingSpans, reachesPending, rowIdOf, rowLabelsAlike, sameRowsSteps, shownSiblings, siblingPlace, type PendingSpan, type PivotReport,\n type PivotReportRow, type PivotRowKey,\n} from '../report/report';\nimport type { PivotValue } from '../report/value';\nimport { publicKeyId } from '../items/item-key';\nimport { PivotJson } from '../source/pivot-json';\nimport { invariantNumbers } from '../text/invariant';\nimport { formatDouble } from '../text/number-text';\nimport {\n SnapshotPivotSource, type PivotDetailPage, type PivotItemPage, type PivotSource, type PivotSourceChanged, type PivotSourceFeatures,\n} from '../source/pivot-source';\nimport { checkedSlicing, pieceUnits, Slicer, type CheckedSlicing, type PivotSlicing } from '../source/slicing';\nimport type {\n PivotDisplayColumn, PivotDisplayRow, PivotReportCopyBlock, PivotReportCopyCell, PivotReportCopyQuery, PivotReportCopyResult,\n PivotReportItemsQuery, PivotReportItemsResult, PivotReportMetadata, PivotReportRange, PivotReportRefusal, PivotReportRequest,\n PivotReportSettings, PivotReportState, PivotReportSummaryQuery, PivotReportSummaryResult, PivotReportUpdate, PivotReportWindow,\n} from './contract';\nimport { checkLabelMetrics, PivotLabelSizing, sameLabelMetrics, type LabelBatch } from './label-metrics';\n\n/** How a report source learns that its data changed (ADR-0153), declared: `incremental` when the Pivot\n * Source names its changes \u2014 Change Batches \u2014 and `fullRefresh` when it cannot, and a notice of newer data\n * asks it again ({@link PivotReportRequest.refreshData}). */\nexport type PivotReportUpdateMode = 'incremental' | 'fullRefresh';\n\n/** The report boundary a Script Core asks (ADR-0151, ADR-0370 section 4): a Window of the report, and the\n * operations a Report Version names. An Engine Host that runs the engine in a Worker answers it across. */\nexport interface PivotReportSource {\n /** The fields offered to the Field List. */\n readonly fields: readonly PivotField[];\n /** The Aggregations offered. */\n readonly features: PivotSourceFeatures;\n /** How the source learns its data changed. */\n readonly updateMode: PivotReportUpdateMode;\n /** A Window of the report a request's layout makes, or a refusal by name. */\n window(request: PivotReportRequest, signal?: AbortSignal): Promise<PivotReportUpdate>;\n /** A field's Items, labelled and ordered as a held Report Version shows them. */\n items(query: PivotReportItemsQuery, signal?: AbortSignal): Promise<PivotReportItemsResult>;\n /** A field's Items as the Pivot Source lists them, under a Source Version. */\n rawItems(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage>;\n /** Every selected cell of a held Report Version, off-screen cells included. */\n copy(query: PivotReportCopyQuery, signal?: AbortSignal): Promise<PivotReportCopyResult>;\n /** The Selection Summary of a held Report Version. */\n summary(query: PivotReportSummaryQuery, signal?: AbortSignal): Promise<PivotReportSummaryResult>;\n /** A page of the records behind a cell, under the Source Version its question names (ADR-0151). */\n details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage>;\n /** Tells `listener` each time the Pivot Source's data moves on; the function returned stops it. */\n subscribe(listener: (changed: PivotSourceChanged) => void): () => void;\n /** Releases the report's state; the Pivot Source is not its to release. */\n dispose(): void;\n}\n\n/** What a local report source is made with. */\nexport interface LocalPivotReportSourceOptions {\n /** The Order Keys a request's settings may name for a field, by name (ADR-0152). */\n readonly orderKeys?: Readonly<Record<string, PivotOrderKey>>;\n /** How many Report Versions are held for the versioned operations; 2 when left out. The reports the\n * Change Highlight compares are held as well, for as long as they are marked (ADR-0153). */\n readonly versionsKept?: number;\n /** The clock that times how long a change stays marked, in milliseconds; `Date.now` when left out. It\n * only bounds what is kept: when a highlight starts is the Consumer's ({@link PivotChangeTimes}). */\n readonly now?: () => number;\n /** How the work shares the thread (PV-40). */\n readonly slicing?: PivotSlicing;\n}\n\n// A Report Version held: its metadata, the report, the source and fields it was computed with, and the\n// options it was laid out under.\ninterface HeldReport {\n readonly metadata: PivotReportMetadata;\n readonly report: PivotReport;\n readonly source: PivotSource;\n readonly fields: readonly PivotField[];\n readonly options: PivotOptions;\n}\n\nfunction keyId(key: PivotRowKey): string {\n return rowIdOf(key.role, key.valueField, key.items);\n}\n\nfunction displayId(row: PivotDisplayRow): string {\n return rowIdOf(row.role, row.valueField, row.items);\n}\n\n// A Source Version whose changes are marked: the report that shows it, the change's mark \u2014 the Report Version\n// that first published it, kept when the same data is laid out again \u2014 and when this source published it, on\n// this source's clock, which only bounds how long it is kept.\nclass HighlightVersion {\n readonly report: PivotReport;\n readonly mark: string;\n readonly at: number;\n readonly columns: ReadonlyMap<string, number>;\n #byKey: Map<string, PivotReportRow> | undefined;\n\n constructor(report: PivotReport, mark: string, at: number) {\n this.report = report;\n this.mark = mark;\n this.at = at;\n this.columns = new Map(report.valueColumns.map((column, index) => [column.name, index]));\n }\n\n row(key: PivotRowKey, id: string, hint: number): PivotReportRow | undefined {\n const rows = this.report.rows;\n const hinted = rows[hint];\n if (hinted?.key.equals(key) === true) return hinted;\n this.#byKey ??= new Map(rows.map(row => [keyId(row.key), row]));\n return this.#byKey.get(id);\n }\n}\n\n// A record's entries in one order; no record is no entries.\nfunction sortedEntries<T>(record: Readonly<Record<string, T>> | undefined): [string, T][] {\n return Object.entries(record ?? {}).toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)); // oxlint-disable-line ex-grid/no-stand-in-default -- no words or policies are none\n}\n\n// Settings written in one form, so that two that lay a report out alike compare equal.\nfunction settingsKey(settings: PivotReportSettings): string {\n const metrics = settings.labelMetrics;\n return JSON.stringify([\n optionsKeyOf(settings), highlightMs(settings), sortedEntries(settings.orderKeyPolicies),\n metrics === undefined ? null : [metrics.wideWidthPx, metrics.digitWidthPx, metrics.narrowWidthPx, metrics.fullWidthPx,\n metrics.otherWidthPx, metrics.cellHorizontalPaddingPx, sortedEntries(metrics.glyphWidths)],\n ]);\n}\n\nfunction sameSettings(a: PivotReportSettings, b: PivotReportSettings): boolean {\n return settingsKey(a) === settingsKey(b) && sameLabelMetrics(a.labelMetrics, b.labelMetrics);\n}\n\nfunction policiesKey(settings: PivotReportSettings): string {\n return JSON.stringify(sortedEntries(settings.orderKeyPolicies));\n}\n\n// What lays a report out alike: the locale and the words.\nfunction optionsKeyOf(settings: PivotReportSettings): string {\n return JSON.stringify([settings.locale ?? null, sortedEntries(settings.words)]); // oxlint-disable-line ex-grid/no-stand-in-default -- no locale is the browser's\n}\n\nfunction highlightMs(settings: PivotReportSettings): number {\n return settings.changeHighlightMs ?? 1000; // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0068: a highlight lasts a second unless told\n}\n\n// The settings as engine options: the locale, and the words given by id.\nfunction optionsOf(settings: PivotReportSettings): PivotOptions {\n const words = settings.words;\n const given = words === undefined ? undefined : new Map(Object.entries(words));\n const label = given === undefined ? undefined : (id: string): string | undefined => given.get(id);\n return Object.freeze({\n ...(settings.locale === undefined ? {} : { locale: settings.locale }),\n ...(label === undefined ? {} : { label }),\n });\n}\n\n// Refuses settings that are not data the source can lay a report out under.\nfunction checkSettings(settings: PivotReportSettings): void {\n const duration = settings.changeHighlightMs;\n if (duration !== undefined && (typeof duration !== 'number' || Number.isNaN(duration))) {\n throw new RangeError('A highlight lasts a number of milliseconds.');\n }\n for (const record of [settings.words, settings.orderKeyPolicies]) {\n for (const value of Object.values(record ?? {})) { // oxlint-disable-line ex-grid/no-stand-in-default -- no words or policies are none\n if (typeof value !== 'string') throw new TypeError('A word and an Order Key policy are named by strings.');\n }\n }\n if (settings.labelMetrics !== undefined) checkLabelMetrics(settings.labelMetrics);\n}\n\n// The settings as the source keeps them: a frozen copy, which a Consumer changing its own object afterwards\n// cannot reach.\nfunction frozenSettings(settings: PivotReportSettings): PivotReportSettings {\n const metrics = settings.labelMetrics;\n const glyphs = metrics?.glyphWidths;\n return Object.freeze({\n ...(settings.locale === undefined ? {} : { locale: settings.locale }),\n ...(settings.words === undefined ? {} : { words: Object.freeze({ ...settings.words }) }),\n ...(settings.changeHighlightMs === undefined ? {} : { changeHighlightMs: settings.changeHighlightMs }),\n ...(metrics === undefined ? {} : { labelMetrics: Object.freeze({ ...metrics, ...(glyphs === undefined ? {} : { glyphWidths: Object.freeze({ ...glyphs }) }) }) }),\n ...(settings.orderKeyPolicies === undefined ? {} : { orderKeyPolicies: Object.freeze({ ...settings.orderKeyPolicies }) }),\n });\n}\n\nfunction windowsEqual(a: PivotReportWindow, b: PivotReportWindow): boolean {\n return a.start === b.start && a.count === b.count;\n}\n\n// Two value cells alike as C#'s record compares them: their text, number, exact value and error.\nfunction valuesEqual(a: PivotValue | undefined, b: PivotValue | undefined): boolean {\n if (a === undefined || b === undefined) return a === b;\n if (a.text !== b.text || a.number !== b.number || a.error !== b.error) return false;\n if (a.exact === undefined || b.exact === undefined) return a.exact === b.exact;\n return decimalEquals(a.exact, b.exact);\n}\n\n// A row as one version kept shows it, and as the version before it does.\ninterface MarkedPair {\n readonly newer: HighlightVersion;\n readonly newRow: PivotReportRow | undefined;\n readonly older: HighlightVersion;\n readonly oldRow: PivotReportRow | undefined;\n}\n\n// The change that last moved a cell's shown text, among the versions kept: the newest whose text differs from\n// the version before it.\nfunction changedIn(pairs: readonly MarkedPair[], column: string): string | undefined {\n for (const { newer, newRow, older, oldRow } of pairs) {\n const nc = newer.columns.get(column);\n if (newRow === undefined || nc === undefined) continue;\n const oc = older.columns.get(column);\n if (oldRow === undefined || oc === undefined\n || (newer.report.valueAt(newRow, nc)?.text ?? '') !== (older.report.valueAt(oldRow, oc)?.text ?? '')) { // oxlint-disable-line ex-grid/no-stand-in-default -- an empty cell's text is nothing, as the C# engine compares it\n return newer.mark;\n }\n }\n return undefined;\n}\n\nfunction notHeld(version: string): PivotReportRefusal {\n return Object.freeze({ kind: 'reportVersionNotHeld', message: `Report Version '${version}' is no longer held.` });\n}\n\nfunction orderKeyFailed(failed: PivotOrderKeyError): PivotReportRefusal {\n return Object.freeze({ kind: 'orderKeyFailed', message: failed.message, field: failed.field });\n}\n\nfunction invalid(message: string): PivotReportRefusal {\n return Object.freeze({ kind: 'invalidRequest', message });\n}\n\nfunction newVersion(): string {\n return globalThis.crypto.randomUUID().replaceAll('-', '');\n}\n\n// A number as .NET's invariant ToString writes a double: its shortest round-trip text.\nfunction invariantText(value: number): string {\n return formatDouble(value, 'R', invariantNumbers);\n}\n\n// The report's cell in a column of the selection: a label column's index, or a value column's.\ninterface SelectedColumn {\n readonly value: boolean;\n readonly index: number;\n readonly header: string;\n readonly headerNumber: number | undefined;\n}\n\nfunction selectedColumns(report: PivotReport, names: readonly string[]): readonly SelectedColumn[] {\n const all = new Map<string, SelectedColumn>();\n report.labelColumns.forEach((c, index) => all.set(c.name, { value: false, index, header: c.header, headerNumber: undefined }));\n report.valueColumns.forEach((c, index) => all.set(c.name, { value: true, index, header: c.header, headerNumber: c.headerNumber }));\n return names.map(name => defined(all.get(name), `the column '${name}'`));\n}\n\nfunction checkRanges(report: PivotReport, names: readonly string[], ranges: readonly PivotReportRange[], maxCells: number): PivotReportRefusal | undefined {\n const known = new Set([...report.labelColumns.map(c => c.name), ...report.valueColumns.map(c => c.name)]);\n if (names.some(name => !known.has(name)) || new Set(names).size !== names.length) {\n return invalid('The selection names an unknown or repeated column.');\n }\n let count = 0;\n for (const r of ranges) {\n if (r.top < 0 || r.left < 0 || r.bottom < r.top || r.right < r.left || r.bottom >= report.rows.length || r.right >= names.length) {\n return invalid('The selection is outside the requested report.');\n }\n const cells = (r.bottom - r.top + 1) * (r.right - r.left + 1);\n if (cells > maxCells - count) return invalid(`Copy exceeds the limit of ${maxCells} cells.`);\n count += cells;\n }\n if (ranges.some(r => reachesPending(report, r.top, r.bottom))) return notAnswered('The selection reaches');\n return undefined;\n}\n\nfunction notAnswered(what: string): PivotReportRefusal {\n return Object.freeze({\n kind: 'rowsNotAnswered',\n message: `${what} rows the Pivot Source has not answered: it answered a window of siblings too many to answer whole, `\n + 'and the rows beside it are read only once the report is scrolled to them (ADR-0370 section 3).',\n });\n}\n\n// The most times a report Window asks again for Sibling Windows that hold it, each time because the data moved\n// on between two answers.\nconst windowAsks = 3;\n\n// The most siblings of a set ordered by a value answered whole, unless a report Window holds more rows.\nconst siblingWindowLimit = 1000;\n\nfunction checkRangeShape(ranges: unknown): void {\n if (!Array.isArray(ranges)) throw new TypeError('A selection is a list of rectangles.');\n for (const range of ranges as readonly unknown[]) {\n const r = range as Partial<Record<keyof PivotReportRange, unknown>>; // oxlint-disable-line typescript/no-unsafe-type-assertion -- each edge is checked here\n if (typeof range !== 'object' || range === null || ![r.top, r.left, r.bottom, r.right].every(edge => Number.isSafeInteger(edge))) {\n throw new TypeError('A rectangle of a selection has whole-number edges.');\n }\n }\n}\n\n// The cells of the union of the rectangles, each once, row by row: the rows cut into bands where a rectangle\n// starts or ends, each band's column intervals merged, so a large selection allocates no entry per cell.\nfunction* selectedCells(ranges: readonly PivotReportRange[]): Generator<readonly [number, number]> {\n const boundaries = [...new Set(ranges.flatMap(r => [r.top, r.bottom + 1]))].toSorted((a, b) => a - b);\n for (let b = 0; b + 1 < boundaries.length; b++) {\n const top = elementAt(boundaries, b);\n const intervals = ranges.filter(r => r.top <= top && r.bottom >= top).toSorted((x, y) => x.left - y.left);\n const merged: [number, number][] = [];\n for (const interval of intervals) {\n const lastInterval = merged.at(-1);\n if (lastInterval !== undefined && interval.left <= lastInterval[1] + 1) lastInterval[1] = Math.max(lastInterval[1], interval.right);\n else merged.push([interval.left, interval.right]);\n }\n for (let r = top; r < elementAt(boundaries, b + 1); r++) {\n for (const [left, right] of merged) {\n for (let c = left; c <= right; c++) yield [r, c];\n }\n }\n }\n}\n\n// The cell a copy carries: a number Item's label carries its number in full, as a value cell does (PV-7,\n// ADR-0005); any other label its text; a value cell its raw, locale-free number or its error.\nfunction copiedCell(report: PivotReport, row: PivotReportRow, column: SelectedColumn): PivotReportCopyCell {\n if (!column.value) {\n const label = elementAt(row.labels, column.index);\n const text = label.text ?? ''; // oxlint-disable-line ex-grid/no-stand-in-default -- an empty label copies as nothing, as the C# engine copies it\n if (label.number !== undefined) return Object.freeze({ text, raw: invariantText(label.number), isNumber: true });\n return Object.freeze(label.text === undefined ? { text, isNumber: false } : { text, raw: label.text, isNumber: false });\n }\n const cell = report.valueAt(row, column.index);\n if (cell === undefined) return Object.freeze({ text: '', isNumber: false });\n const raw = cell.error ?? (cell.exact === undefined ? invariantText(cell.number) : decimalText(cell.exact));\n return Object.freeze({ text: cell.text, raw, isNumber: cell.error === undefined });\n}\n\n// Whether the older report answered the place of a row the newer one shows: a row it does not hold is new where\n// it answered that place, and not known to be where the place stood beside a Sibling Window, among its Pending Rows.\nfunction answeredBy(older: PivotReport, newer: PivotReport, row: PivotReportRow): boolean {\n if (cubeParts(older.cube).windows.size === 0) return true;\n const place = siblingPlace(newer, row);\n if (place === undefined) return true;\n const shown = shownSiblings(older, place.parent);\n return shown === undefined || (place.rank >= shown[0] && place.rank < shown[1]);\n}\n\nfunction exactOrDouble(inexact: boolean, exact: SnapshotDecimal, value: number): PivotNumber {\n return Object.freeze(inexact ? { kind: 'double', value } : { kind: 'exact', value: exact });\n}\n\n// What the computation returned that no published version shows yet: a request cancelled after its computation\n// returned and before its version was published, or a version laid out aside. The next computation's result is\n// merged into it, and published with it.\nclass Unpublished {\n reset = false;\n rowSequenceChanged = false;\n readonly batches: LabelBatch[] = [];\n\n add(result: PivotComputationResult): void {\n this.rowSequenceChanged ||= result.rowSequenceChanged;\n if (result.isReset) {\n this.reset = true;\n this.batches.length = 0;\n } else if (!this.reset) {\n this.batches.push({ labels: result.labelChanges, removed: result.removedRows });\n }\n }\n}\n\n/**\n * A report source over a Pivot Source in memory \u2014 a Snapshot's, records', or a server's behind a fetching\n * source (ADR-0151). Each request lays the report out afresh where its question, layout or data changed,\n * answers the Window asked for with every row projected from the newest report, and holds the last\n * `versionsKept` Report Versions for the operations that name one. A row the held Window shows alike is the\n * very row it holds. A cell whose shown text a change of the data moved is marked with the version that\n * published the change, for as long as the settings' highlight lasts (ADR-0068, ADR-0153).\n *\n * Requests are answered one at a time, in the order made. Each runs its pass, cube, report and label widths\n * on one Slicer (PV-40), and a cancelled one rejects with its signal's reason, leaving the versions held as\n * they were. A versioned operation reads the version it names and never waits on a newer computation.\n */\nexport class LocalPivotReportSource implements PivotReportSource {\n readonly #source: PivotSource;\n readonly #orderKeys: ReadonlyMap<string, PivotOrderKey>;\n readonly #versionsKept: number;\n readonly #now: () => number;\n readonly #slicing: CheckedSlicing;\n readonly #listeners = new Set<(changed: PivotSourceChanged) => void>();\n readonly #unsubscribe: (() => void) | undefined;\n readonly #versions: HeldReport[] = [];\n readonly #windows = new Map<string, PivotReportState>();\n readonly #waiting: (() => void)[] = [];\n #highlight: HighlightVersion[] = [];\n #busy = false;\n #disposed = false;\n #dirty = true;\n #effectiveFields: readonly PivotField[];\n #settings: string | undefined;\n #layout: string | undefined;\n #maxLeaves = -1;\n // The computation, under the Order Key policies it orders by; what it returned that no version shows yet;\n // and the label widths kept across versions.\n #session: PivotComputationSession | undefined;\n #policies: string | undefined;\n #unpublished: Unpublished | undefined;\n // Where the Sibling Windows start, by their parent, for the layout last laid out; and the most siblings a set\n // is answered with whole, which grows to hold the largest report Window asked (ADR-0370 section 3).\n readonly #windowStarts = new Map<string, PivotWindowStart>();\n #windowLimit = siblingWindowLimit;\n // The question the starts are for, written in one form: a layout that asks another starts every window afresh.\n #startsQuestion: string | undefined;\n readonly #labelSizing = new PivotLabelSizing();\n\n /** A report source over `source`, which it does not own. Refuses, with a RangeError, a `versionsKept` that\n * is not a whole number of at least 1. */\n constructor(source: PivotSource, options: LocalPivotReportSourceOptions = {}) {\n const kept = options.versionsKept ?? 2; // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0153: two Report Versions unless told\n if (!Number.isSafeInteger(kept) || kept < 1) throw new RangeError(`A report source holds at least one Report Version, not ${String(kept)}.`);\n const keys = options.orderKeys ?? {}; // oxlint-disable-line ex-grid/no-stand-in-default -- no Order Keys registered are none\n for (const [name, key] of Object.entries(keys)) {\n if (typeof key !== 'function') throw new TypeError(`The Order Key '${name}' is a function.`);\n }\n const now = options.now ?? Date.now;\n if (typeof now !== 'function') throw new TypeError(\"A report source's clock is a function.\");\n this.#source = source;\n this.#effectiveFields = source.fields;\n this.#orderKeys = new Map(Object.entries(keys));\n this.#versionsKept = kept;\n this.#now = now;\n this.#slicing = checkedSlicing(options.slicing);\n this.#unsubscribe = source.subscribe?.(changed => {\n this.#sourceChanged(changed);\n });\n }\n\n /** The Pivot Source's fields. */\n get fields(): readonly PivotField[] {\n return this.#source.fields;\n }\n\n /** The Pivot Source's Aggregations. */\n get features(): PivotSourceFeatures {\n return this.#source.features;\n }\n\n /** `incremental` over a Snapshot, whose Change Batches name what changed; `fullRefresh` otherwise. */\n get updateMode(): PivotReportUpdateMode {\n return this.#source instanceof SnapshotPivotSource ? 'incremental' : 'fullRefresh';\n }\n\n #sourceChanged(changed: PivotSourceChanged): void {\n this.#dirty = true;\n this.#session?.sourceMoved();\n for (const listener of Array.from(this.#listeners)) {\n try {\n listener(changed);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- every listener is told whatever one does; its error is reported, as an event listener's is, not swallowed\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n\n /** Tells `listener` each new Source Version the Pivot Source reports \u2014 over a Snapshot, or from a server's\n * transport (ADR-0370 section 3); the function returned stops telling it. */\n subscribe(listener: (changed: PivotSourceChanged) => void): () => void {\n if (typeof listener !== 'function') throw new TypeError('A listener is a function.');\n const held = (changed: PivotSourceChanged): void => {\n listener(changed);\n };\n this.#listeners.add(held);\n return () => {\n this.#listeners.delete(held);\n };\n }\n\n #checkOpen(): void {\n if (this.#disposed) throw new Error('The report source is disposed; make another over the Pivot Source.');\n }\n\n async #enter(signal: AbortSignal | undefined): Promise<void> {\n if (this.#busy) {\n await new Promise<void>(resolve => {\n this.#waiting.push(resolve);\n });\n }\n this.#busy = true;\n if (signal?.aborted === true || this.#disposed) {\n this.#leave();\n signal?.throwIfAborted();\n this.#checkOpen();\n }\n }\n\n #leave(): void {\n const next = this.#waiting.shift();\n if (next === undefined) this.#busy = false;\n else next();\n }\n\n /**\n * A Window of the report the request's layout makes from the newest data \u2014 or, for a layout gesture that\n * names the Window it holds, from the data that Window shows \u2014 or a refusal by name: of the Pivot Source,\n * of an Order Key policy not registered, or of an Order Key that failed on an Item. Rejects with what a\n * layout the source cannot lay out throws, and with the signal's reason once it is aborted.\n */\n async window(request: PivotReportRequest, signal?: AbortSignal): Promise<PivotReportUpdate> {\n this.#checkOpen();\n const window = Object.freeze({ start: request.window.start, count: request.window.count });\n if (!Number.isSafeInteger(window.start) || !Number.isSafeInteger(window.count)) throw new TypeError('A report Window is whole numbers of rows.');\n if (window.start < 0 || window.count < 0) return Object.freeze({ requestId: request.requestId, window, refusal: invalid('The report Window is negative.') });\n checkSettings(request.settings);\n // The request as it was made: the version published keeps its layout and settings, which the Consumer's\n // own objects, changed afterwards, do not reach.\n const made: PivotReportRequest = Object.freeze({\n ...request, window, settings: frozenSettings(request.settings), layout: readPivotLayoutJson(writePivotLayoutJson(request.layout)),\n });\n await this.#enter(signal);\n try {\n return await this.#window(made, new Slicer(this.#slicing, signal));\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- an Order Key's failure is the request's refusal by name (ADR-0152); anything else is thrown on\n this.#dirty = true;\n if (error instanceof PivotOrderKeyError) return Object.freeze({ requestId: request.requestId, window, refusal: orderKeyFailed(error) });\n throw error;\n } finally {\n this.#leave();\n }\n }\n\n async #window(request: PivotReportRequest, slicer: Slicer): Promise<PivotReportUpdate> {\n const settings = settingsKey(request.settings);\n const layout = writePivotLayoutJson(request.layout);\n const maxLeaves = request.maxLeaves ?? defaultMaxLeaves;\n const markChanges = request.markChanges !== false;\n const refusedWith = (refusal: PivotReportRefusal): PivotReportUpdate => Object.freeze({ requestId: request.requestId, window: request.window, refusal });\n // The fields under the request's Order Key policies, adopted only with the version they publish: a request\n // refused or cancelled leaves the next one ordered by the policies its own settings name.\n let fields = this.#effectiveFields;\n if (this.#settings !== settings) {\n const resolvedFields = this.#resolveFields(request.settings);\n if ('kind' in resolvedFields) return refusedWith(resolvedFields);\n fields = resolvedFields;\n }\n let last = this.#versions[0];\n // The Window the Consumer holds, read before a publication below evicts its version.\n const baseline = request.baseline === undefined ? undefined : this.#windows.get(request.baseline);\n const previous = baseline !== undefined && windowsEqual(baseline.window, request.window) ? baseline : undefined;\n const from = request.window.start;\n const pendingIn = (report: PivotReport): readonly PendingSpan[] => pendingSpans(report, from, Math.min(report.rows.length, from + request.window.count));\n if (this.#source.features.answersLevels) {\n // The question as a window would carry it, its starts left out: the fields, the collapse and the orders.\n const question = PivotJson.writeQuery(levelQueryForLayout(request.layout, maxLeaves, { limit: 1 }));\n if (this.#startsQuestion !== question) this.#windowStarts.clear();\n this.#startsQuestion = question;\n }\n if (request.refreshData === true || this.#dirty || this.#unpublished !== undefined || this.#settings !== settings || this.#layout !== layout\n || this.#maxLeaves !== maxLeaves || last === undefined || pendingIn(last.report).length > 0) {\n const wasDirty = this.#dirty;\n this.#dirty = false;\n const resolved = resolveOptions(optionsOf(request.settings));\n const policies = policiesKey(request.settings);\n if (this.#session === undefined || this.#policies !== policies) {\n this.#session?.dispose();\n this.#session = new PivotComputationSession(this.#source, fields);\n this.#policies = policies;\n }\n let report: PivotReport;\n let detached = false;\n const shown = this.#shown(request, policies, maxLeaves, markChanges);\n if (shown !== undefined) {\n // A layout gesture lays out the data the Consumer shows \u2014 the request's baseline \u2014 which is older\n // than the newest computation: a version published for a request the Consumer discarded. Laid out\n // aside, that version is what the gesture shows; the newer data comes with the next request that\n // marks changes.\n checkCubeHolds(shown, request.layout);\n report = await slicer.run(buildReportSteps(shown, request.layout, resolved));\n (this.#unpublished ??= new Unpublished()).reset = true;\n detached = true;\n } else {\n const session = this.#session;\n const compute = (): Promise<PivotComputationResult> => session.compute({\n layout: request.layout, options: resolved, optionsKey: optionsKeyOf(request.settings), maxLeaves, slicing: this.#slicing, slicer,\n refreshData: request.refreshData === true, preferHeld: !markChanges, window: this.#levelWindow(),\n });\n let computed: PivotReport | undefined;\n let answeredAt: string | undefined;\n // A report Window that reaches Pending Rows asks again, each Sibling Window it reaches moved to hold\n // the rows asked for; that answer is checked, and holds them (ADR-0370 section 3). Only data that moved\n // on between two answers can leave the rows pending again, which asks once more, and then refuses.\n for (let asked = 0; computed === undefined; asked++) {\n if (asked === windowAsks) return refusedWith(notAnswered('The data changed each time it was asked for, and the report Window reaches'));\n const result = await compute();\n if (result.report === undefined) {\n this.#dirty = true;\n const refusal = defined(result.refusal, \"the computation's refusal\");\n return refusedWith(Object.freeze({ kind: 'sourceRefused', message: refusal.message, ...(refusal.field === undefined ? {} : { field: refusal.field }), sourceRefusal: refusal }));\n }\n // Kept until a version publishes it: a cancellation below must not lose the computation's changes,\n // which it returns once.\n (this.#unpublished ??= new Unpublished()).add(result);\n const spans = pendingIn(result.report);\n const at = result.report.cube.sourceVersion;\n if (spans.length === 0) computed = result.report;\n else if (answeredAt === at) throw new Error('Internal: the Sibling Windows asked for do not hold the report Window asked for (ADR-0370 section 3).');\n else this.#moveWindows(spans, request.window.count);\n answeredAt = at;\n }\n report = computed;\n }\n const unpublished = defined(this.#unpublished, 'what the computation returned, unpublished');\n const cube = report.cube;\n if (!markChanges && wasDirty && last?.metadata.sourceVersion === cube.sourceVersion) this.#dirty = true;\n const sameRows = last !== undefined && (last.report === report\n || (!unpublished.reset ? !unpublished.rowSequenceChanged : await slicer.run(sameRowsSteps(report, last.report))));\n const metrics = request.settings.labelMetrics;\n let widths: readonly number[] = Object.freeze([]);\n if (metrics === undefined) this.#labelSizing.forget();\n else widths = await slicer.run(this.#labelSizing.widthSteps(report, metrics, unpublished.batches, unpublished.reset));\n // Nothing below awaits: the version is published whole, or not at all; and not by a source disposed\n // while it was computed.\n this.#checkOpen();\n const version = newVersion();\n const marks = this.#rememberHighlight(version, report, request, markChanges, last);\n const metadata: PivotReportMetadata = Object.freeze({\n version,\n sourceVersion: cube.sourceVersion,\n rowSequenceVersion: last !== undefined && sameRows ? last.metadata.rowSequenceVersion : newVersion(),\n layout: request.layout,\n settings: request.settings,\n rowCount: report.rows.length,\n labelColumns: report.labelColumns,\n valueColumns: Object.freeze(report.valueColumns.map((column, index): PivotDisplayColumn => Object.freeze({\n name: column.name, header: column.header, role: column.role, valueField: column.valueField, columnPath: report.columnPath(index),\n }))),\n headerSpans: report.headerSpans,\n headerTierCount: report.headerTierCount,\n valueCaptions: report.valueCaptions,\n labelWidths: widths,\n changeMarks: marks,\n });\n last = Object.freeze({ metadata, report, source: this.#source, fields, options: optionsOf(request.settings) });\n this.#versions.unshift(last);\n while (this.#versions.length > this.#versionsKept) this.#windows.delete(defined(this.#versions.pop(), 'the oldest version').metadata.version);\n this.#settings = settings;\n this.#effectiveFields = fields;\n this.#layout = layout;\n this.#maxLeaves = maxLeaves;\n this.#unpublished = undefined;\n if (detached) {\n // The computation holds newer data than this version, under the layout it last laid out: its next\n // result is compared with this version afresh, and the next request computes.\n this.#unpublished = new Unpublished();\n this.#unpublished.reset = true;\n this.#dirty = true;\n }\n }\n const comparable = previous !== undefined && sameSettings(previous.metadata.settings, request.settings)\n && writePivotLayoutJson(previous.metadata.layout) === layout;\n const priorById = comparable ? new Map(previous.rows.map(row => [displayId(row), row])) : undefined;\n const priorColumns = previous === undefined ? undefined : new Map(previous.metadata.valueColumns.map((column, index) => [column.name, index]));\n const start = request.window.start;\n const count = Math.min(request.window.count, Math.max(0, last.metadata.rowCount - start));\n this.#pruneHighlight(this.#now(), highlightMs(request.settings));\n const rows: PivotDisplayRow[] = [];\n for (let i = 0; i < count; i++) {\n const row = elementAt(last.report.rows, start + i);\n const prior = priorById?.get(keyId(row.key));\n rows.push(this.#project(last.report, row, start + i, prior, comparable && markChanges, priorColumns));\n }\n const state: PivotReportState = Object.freeze({ metadata: last.metadata, window: request.window, rows: Object.freeze(rows) });\n this.#windows.set(last.metadata.version, state);\n return Object.freeze({ requestId: request.requestId, ...state });\n }\n\n // The window of the sets ordered by a value, as the session asks it once a question is refused whole.\n #levelWindow(): PivotLevelWindowInput {\n return Object.freeze({ limit: this.#windowLimit, starts: Object.freeze([...this.#windowStarts.values()]) });\n }\n\n // Moves each Sibling Window a report Window reaches so that it holds the siblings the Window's rows stand for,\n // centred on them, and grows the limit to hold every row the Window asks for.\n #moveWindows(spans: readonly PendingSpan[], rows: number): void {\n this.#windowLimit = Math.max(this.#windowLimit, rows);\n const limit = this.#windowLimit;\n for (const span of spans) {\n const held = span.last - span.first + 1;\n const start = Math.min(Math.max(0, span.first - Math.floor((limit - held) / 2)), Math.max(0, span.siblings - limit));\n this.#windowStarts.set(span.parent.map(publicKeyId).join('\\u0000'), Object.freeze({ rows: span.parent, start }));\n }\n }\n\n // The cube of the version the request names as its baseline \u2014 the data the Consumer shows \u2014 when a layout\n // gesture should lay it out rather than the newest computation's: held, from this Pivot Source under the\n // same Order Key policies, older than the newest cube, and holding the layout.\n #shown(request: PivotReportRequest, policies: string, maxLeaves: number, markChanges: boolean): PivotCube | undefined {\n const newest = this.#session?.heldCube;\n if (markChanges || request.baseline === undefined || newest === undefined) return undefined;\n const shown = this.#held(request.baseline);\n if (shown === undefined || shown.report.cube === newest || shown.source !== this.#source || policiesKey(shown.metadata.settings) !== policies) return undefined;\n const cube = shown.report.cube;\n // A cube of Sibling Windows is laid out by the computation, which moves its windows where the request reaches.\n if (cubeParts(cube).windows.size > 0) return undefined;\n return cube.holds(request.layout) && cube.query.maxLeaves === maxLeaves ? cube : undefined;\n }\n\n // The fields under the settings' Order Key policies, or the refusal of a policy that names an unknown field\n // or an Order Key not registered.\n #resolveFields(settings: PivotReportSettings): readonly PivotField[] | PivotReportRefusal {\n const policies = new Map(Object.entries(settings.orderKeyPolicies ?? {})); // oxlint-disable-line ex-grid/no-stand-in-default -- no policies are none\n const fields = this.fields;\n for (const name of policies.keys()) {\n if (!fields.some(field => field.name === name)) {\n return Object.freeze({ kind: 'unknownOrderKeyPolicy', message: `The Order Key policy names unknown field '${name}'.`, field: name });\n }\n }\n const effective: PivotField[] = [];\n for (const field of fields) {\n const id = policies.get(field.name);\n if (id === undefined) {\n effective.push(field);\n continue;\n }\n const key = this.#orderKeys.get(id);\n if (key === undefined) {\n return Object.freeze({ kind: 'unknownOrderKeyPolicy', message: `The Order Key policy '${id}' for '${field.name}' is not registered.`, field: field.name });\n }\n effective.push(Object.freeze({ ...field, orderKey: key }));\n }\n return Object.freeze(effective);\n }\n\n // A row of the Window, made from the report: the prior row itself when nothing it paints changed. A cell\n // keeps the mark it had while its text does not change, though the source no longer lists that change, so\n // that the row keeps its instance rather than paint again for a highlight that has ended.\n #project(report: PivotReport, row: PivotReportRow, rowIndex: number, prior: PivotDisplayRow | undefined, keepMarks: boolean,\n priorColumns: ReadonlyMap<string, number> | undefined): PivotDisplayRow {\n const path = report.rowPath(row);\n const columns = report.valueColumns;\n const values: (PivotValue | undefined)[] = [];\n const changed: (string | undefined)[] = [];\n const key = row.key;\n const marked = this.#highlightRows(key, keyId(key), rowIndex);\n let same = prior !== undefined && prior.role === row.role && prior.valueField === row.valueField\n && prior.carriesValues === row.carriesValues && prior.labels.length === row.labels.length\n && prior.labels.every((label, i) => rowLabelsAlike(label, elementAt(row.labels, i))) && prior.values.length === columns.length\n && prior.rowPath.length === path.length\n // By spelling, not as Items match: a parent's new spelling reaches its child's path (ADR-0153).\n && prior.rowPath.every((step, i) => step.field === elementAt(path, i).field && step.item.kind === elementAt(path, i).item.kind\n && step.item.value === elementAt(path, i).item.value);\n for (let c = 0; c < columns.length; c++) {\n const name = elementAt(columns, c).name;\n const value = report.valueAt(row, c);\n values.push(value);\n let mark = changedIn(marked, name);\n const oldColumn = priorColumns?.get(name);\n if (prior !== undefined && oldColumn !== undefined && oldColumn < prior.values.length) {\n if (mark === undefined && keepMarks) mark = prior.changedIn[oldColumn];\n same &&= oldColumn === c && valuesEqual(prior.values[oldColumn], value) && prior.changedIn[oldColumn] === mark;\n }\n changed.push(mark);\n }\n if (same && prior !== undefined) return prior;\n return Object.freeze({\n role: row.role, valueField: row.valueField, items: key.items, carriesValues: row.carriesValues, labels: row.labels,\n values: Object.freeze(values), rowPath: path, changedIn: Object.freeze(changed),\n });\n }\n\n // Keeps the reports of the Source Versions whose marks can still be shown, and their baseline; answers the\n // marks the source keeps now, newest first.\n #rememberHighlight(version: string, report: PivotReport, request: PivotReportRequest, markChanges: boolean, previous: HeldReport | undefined): readonly string[] {\n const at = this.#now();\n const first = this.#highlight[0];\n if (!markChanges || previous === undefined || writePivotLayoutJson(previous.metadata.layout) !== writePivotLayoutJson(request.layout)\n || !sameSettings(previous.metadata.settings, request.settings)) {\n this.#highlight = [];\n } else if (previous.metadata.sourceVersion === report.cube.sourceVersion && first !== undefined) {\n // The same data laid out again: its changes keep the mark and the time they were first published with.\n this.#highlight[0] = new HighlightVersion(report, first.mark, first.at);\n return this.#marks();\n }\n this.#highlight.unshift(new HighlightVersion(report, version, at));\n this.#pruneHighlight(at, highlightMs(request.settings));\n return this.#marks();\n }\n\n // The versions a cell can be marked with: each but the oldest, which is only the baseline the next newer\n // one is compared with.\n #marks(): readonly string[] {\n return Object.freeze(this.#highlight.slice(0, Math.max(0, this.#highlight.length - 1)).map(h => h.mark));\n }\n\n #pruneHighlight(now: number, duration: number): void {\n if (duration <= 0) {\n this.#highlight.splice(1);\n return;\n }\n for (let i = 0; i < this.#highlight.length - 1; i++) {\n if (now - elementAt(this.#highlight, i).at >= duration) {\n this.#highlight.splice(i + 1);\n break;\n }\n }\n }\n\n // The row in each version kept, paired with the row in the version before it, for the marks of its cells.\n #highlightRows(key: PivotRowKey, id: string, rowIndex: number): readonly MarkedPair[] {\n const pairs: MarkedPair[] = [];\n for (let i = 0; i + 1 < this.#highlight.length; i++) {\n const newer = elementAt(this.#highlight, i);\n const older = elementAt(this.#highlight, i + 1);\n const newRow = newer.row(key, id, rowIndex);\n const oldRow = older.row(key, id, rowIndex);\n if (oldRow === undefined && newRow !== undefined && !answeredBy(older.report, newer.report, newRow)) continue;\n pairs.push({ newer, newRow, older, oldRow });\n }\n return pairs;\n }\n\n #held(version: string): HeldReport | undefined {\n this.#checkOpen();\n return this.#versions.find(held => held.metadata.version === version);\n }\n\n /** A field's Items as the Pivot Source lists them, under a Source Version. */\n rawItems(query: PivotItemsQuery, signal?: AbortSignal): Promise<PivotItemPage> {\n this.#checkOpen();\n return this.#source.items(query, signal);\n }\n\n /** A field's Items labelled and ordered as a held Report Version shows them, under its Source Version; refused\n * by name for a version not held, a field not declared, the Pivot Source's refusal, and an Order Key that\n * fails on an Item. */\n async items(query: PivotReportItemsQuery, signal?: AbortSignal): Promise<PivotReportItemsResult> {\n signal?.throwIfAborted();\n const held = this.#held(query.version);\n const refused = (sourceVersion: string, refusal: PivotReportRefusal): PivotReportItemsResult =>\n Object.freeze({ version: query.version, sourceVersion, items: Object.freeze([]), total: 0, refusal });\n if (held === undefined) return refused('', notHeld(query.version));\n const field = held.fields.find(f => f.name === query.field);\n const max = query.max ?? 10_000; // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0061: Filter\u2026 lists 10,000 Items unless told\n if (field === undefined || !Number.isSafeInteger(max) || max < 0) {\n return refused(held.metadata.sourceVersion, invalid('Items needs a declared field and nonnegative cap.'));\n }\n const page = await held.source.items(pivotItemsQuery({\n field: query.field, sourceVersion: held.metadata.sourceVersion, max, ...(query.search === undefined ? {} : { search: query.search }),\n }), signal);\n if (page.refusal !== undefined) {\n return refused(held.metadata.sourceVersion, Object.freeze({ kind: 'sourceRefused', message: page.refusal.message, sourceRefusal: page.refusal }));\n }\n let items;\n try {\n items = itemsOfPage(page, held.report.layout, field, held.options);\n } catch (error) { // oxlint-disable-line ex-grid/no-catch -- an Order Key's failure is the listing's refusal by name (ADR-0152); anything else is thrown on\n if (error instanceof PivotOrderKeyError) return refused(held.metadata.sourceVersion, orderKeyFailed(error));\n throw error;\n }\n return Object.freeze({ version: query.version, sourceVersion: page.sourceVersion, items, total: page.total });\n }\n\n /** A page of the records behind a cell under the Source Version its question names (ADR-0151): answered while\n * the Pivot Source holds that version, however many layouts came since, and refused by it once it does not. */\n details(query: PivotDetailsQuery, signal?: AbortSignal): Promise<PivotDetailPage> {\n this.#checkOpen();\n return this.#source.details(query, signal);\n }\n\n /** Every selected cell of a held Report Version, each rectangle whole, in the order asked; refused by name for\n * a version not held, a column not the report's or named twice, a rectangle outside the report, and a copy\n * past `maxCells` \u2014 never cut short (spine 1). */\n async copy(query: PivotReportCopyQuery, signal?: AbortSignal): Promise<PivotReportCopyResult> {\n signal?.throwIfAborted();\n checkRangeShape(query.ranges);\n const held = this.#held(query.version);\n const refused = (refusal: PivotReportRefusal): PivotReportCopyResult => Object.freeze({ version: query.version, blocks: Object.freeze([]), refusal });\n if (held === undefined) return refused(notHeld(query.version));\n const maxCells = query.maxCells ?? 1_000_000; // oxlint-disable-line ex-grid/no-stand-in-default -- ADR-0152: a million cells unless told\n if (!Number.isSafeInteger(maxCells) || maxCells < 0) return refused(invalid('Copy needs a whole, nonnegative cap on its cells.'));\n const issue = checkRanges(held.report, query.columns, query.ranges, maxCells);\n if (issue !== undefined) return refused(issue);\n const blocks = await new Slicer(this.#slicing, signal).run(copySteps(held.report, selectedColumns(held.report, query.columns), query.ranges));\n return Object.freeze({ version: query.version, blocks });\n }\n\n /** The Selection Summary of a held Report Version: Count, Numerical Count, Sum, Min and Max, a cell under two\n * rectangles counted once, shown in the Focus value's format (ADR-0130). */\n async summary(query: PivotReportSummaryQuery, signal?: AbortSignal): Promise<PivotReportSummaryResult> {\n signal?.throwIfAborted();\n checkRangeShape(query.ranges);\n const held = this.#held(query.version);\n const refused = (refusal: PivotReportRefusal): PivotReportSummaryResult =>\n Object.freeze({ version: query.version, values: 0, numbers: 0, hasError: false, locale: '', refusal });\n if (held === undefined) return refused(notHeld(query.version));\n const issue = checkRanges(held.report, query.columns, query.ranges, Number.MAX_SAFE_INTEGER);\n if (issue !== undefined) return refused(issue);\n const report = held.report;\n const columns = selectedColumns(report, query.columns);\n const figures = await new Slicer(this.#slicing, signal).run(summarySteps(report, columns, query.ranges));\n // Shown in the Focus cell's Value Field format \u2014 Excel's status bar shows its figures in the active cell's\n // format \u2014 and G15 under General, as ExSheet's status bar writes a General cell's (ADR-0130).\n let numberFormat: string | undefined;\n const focusRow = query.focusRow;\n const focusColumn = query.focusColumn;\n const focus = focusColumn === undefined ? undefined : columns[focusColumn];\n if (focusRow !== undefined && focusRow >= 0 && focusRow < report.rows.length && focus?.value === true) {\n if (elementAt(report.rows, focusRow).role === 'pending') return refused(notAnswered('The Focus is on one of the'));\n const vf = report.valueFieldAt(elementAt(report.rows, focusRow), focus.index);\n if (vf >= 0) {\n const field = elementAt(report.layout.values, vf);\n numberFormat = field.numberFormat ?? (field.showValuesAs === 'noCalculation' ? 'G15' : '0.00%');\n }\n }\n return Object.freeze({ version: query.version, ...figures, ...(numberFormat === undefined ? {} : { numberFormat }), locale: report.locale });\n }\n\n /** Releases the report's state and stops hearing the Pivot Source, which it does not own: every later call\n * throws. */\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#unsubscribe?.();\n this.#listeners.clear();\n this.#versions.length = 0;\n this.#windows.clear();\n this.#highlight = [];\n this.#session?.dispose();\n this.#session = undefined;\n this.#unpublished = undefined;\n }\n}\n\nfunction* copySteps(report: PivotReport, columns: readonly SelectedColumn[], ranges: readonly PivotReportRange[]): Generator<void, readonly PivotReportCopyBlock[]> {\n const blocks: PivotReportCopyBlock[] = [];\n let cells = 0;\n for (const range of ranges) {\n const rows: (readonly PivotReportCopyCell[])[] = [];\n for (let r = range.top; r <= range.bottom; r++) {\n const row = elementAt(report.rows, r);\n const copied: PivotReportCopyCell[] = [];\n for (let c = range.left; c <= range.right; c++) copied.push(copiedCell(report, row, elementAt(columns, c)));\n rows.push(Object.freeze(copied));\n cells += copied.length;\n if (cells >= pieceUnits) {\n cells = 0;\n yield;\n }\n }\n const spanned = columns.slice(range.left, range.right + 1);\n // A number column Item's header carries its number in full for the HTML flavour (ADR-0005's note of\n // 2026-10-13).\n const raws = spanned.map(c => (c.headerNumber === undefined ? undefined : invariantText(c.headerNumber)));\n blocks.push(Object.freeze({\n headers: Object.freeze(spanned.map(c => c.header)), rows: Object.freeze(rows),\n ...(raws.some(raw => raw !== undefined) ? { headerRaws: Object.freeze(raws) } : {}),\n }));\n }\n return Object.freeze(blocks);\n}\n\nfunction* summarySteps(report: PivotReport, columns: readonly SelectedColumn[], ranges: readonly PivotReportRange[]): Generator<void, {\n readonly values: number; readonly numbers: number; readonly hasError: boolean; readonly sum?: PivotNumber; readonly min?: PivotNumber; readonly max?: PivotNumber;\n}> {\n let values = 0;\n let numbers = 0;\n let hasError = false;\n const sum = noSum();\n const extremes = noExtremes();\n let cells = 0;\n for (const [r, c] of selectedCells(ranges)) {\n if (++cells >= pieceUnits) {\n cells = 0;\n yield;\n }\n const row = elementAt(report.rows, r);\n const column = elementAt(columns, c);\n if (!column.value) {\n const text = elementAt(row.labels, column.index).text;\n if (text !== undefined && text !== '') values++;\n continue;\n }\n const value = report.valueAt(row, column.index);\n if (value === undefined) continue;\n values++;\n if (value.error !== undefined) {\n hasError = true;\n continue;\n }\n const first = numbers === 0;\n if (value.exact === undefined) {\n addDoubleToSum(sum, value.number, first);\n addDoubleToExtremes(extremes, value.number, first);\n } else {\n addExactToSum(sum, value.exact, first);\n addExactToExtremes(extremes, value.exact, first);\n }\n numbers++;\n }\n finishSum(sum);\n finishExtremes(extremes);\n if (numbers === 0) return Object.freeze({ values, numbers, hasError });\n return Object.freeze({\n values, numbers, hasError,\n sum: exactOrDouble(sum.inexact, sum.exact, sum.double),\n min: exactOrDouble(extremes.inexact, extremes.exactMin, extremes.min),\n max: exactOrDouble(extremes.inexact, extremes.exactMax, extremes.max),\n });\n}\n", "// A dense array by id that the versions of a computation share a page at a time (ADR-0153): a version is a\n// directory of pages, and an update copies the directory and each page it writes, never one a published\n// version reads. It reaches no earlier version, so letting one go keeps no history alive.\n\nconst pageBits = 8;\n\n/** How many entries a page holds. */\nexport const pageSize = 1 << pageBits;\n\nconst pageMask = pageSize - 1;\n\ntype Page<T> = readonly (T | undefined)[];\n\n/** A published version: read only. */\nexport class PagedArray<T> {\n readonly #pages: readonly (Page<T> | undefined)[];\n\n private constructor(pages: readonly (Page<T> | undefined)[]) {\n this.#pages = pages;\n }\n\n /** No entries. */\n static empty<T>(): PagedArray<T> {\n return new PagedArray<T>([]);\n }\n\n /** The entry at an id, or `undefined` for none. */\n get(id: number): T | undefined {\n return this.#pages[id >>> pageBits]?.[id & pageMask];\n }\n\n /** A writer of the next version, which starts as this one. */\n writer(): PagedWriter<T> {\n return new PagedWriter(this.#pages, pages => new PagedArray(pages));\n }\n}\n\n/** The next version, written: a page is copied the first time it is written. */\nexport class PagedWriter<T> {\n readonly #pages: (Page<T> | undefined)[];\n // The pages this writer copied: its own until it publishes.\n readonly #written = new Map<number, (T | undefined)[]>();\n readonly #publish: (pages: readonly (Page<T> | undefined)[]) => PagedArray<T>;\n\n constructor(pages: readonly (Page<T> | undefined)[], publish: (pages: readonly (Page<T> | undefined)[]) => PagedArray<T>) {\n this.#pages = [...pages];\n this.#publish = publish;\n }\n\n /** The entry at an id, as written so far. */\n get(id: number): T | undefined {\n return this.#pages[id >>> pageBits]?.[id & pageMask];\n }\n\n /** Writes the entry at an id; `undefined` takes it away. */\n set(id: number, value: T | undefined): void {\n const number = id >>> pageBits;\n let page = this.#written.get(number);\n if (page === undefined) {\n const held = this.#pages[number];\n page = held === undefined ? Array.from<T | undefined>({ length: pageSize }) : [...held];\n this.#written.set(number, page);\n this.#pages[number] = page;\n }\n page[id & pageMask] = value;\n }\n\n /** The version written, published: its pages frozen, and this writer no longer used. */\n freeze(): PagedArray<T> {\n for (const page of this.#written.values()) Object.freeze(page);\n return this.#publish(Object.freeze([...this.#pages]));\n }\n}\n", "// A computation's cells (ADR-0153): the first cube's own, which nothing writes once that cube is made, under\n// pages an update copies before it writes them, and the cell index likewise, the first cube's under an overlay\n// of the keys added or taken away since. A computation's first version copies nothing; a later one copies the\n// pages it wrote and shares every other. The C# engine's ComputationCells.\n\nimport type { SnapshotDecimal } from '@ex-grid/data';\nimport { decimalAdd } from '../aggregates/exact-decimal';\nimport { emptyValue, PartColumns, type AggregateValue } from '../aggregates/parts';\nimport { cellKey, type CubeCells } from '../cube/cube';\nimport type { PivotAggregation } from '../layout/pivot-enums';\nimport { defined, elementAt } from '../must';\nimport { PagedArray, pageSize, type PagedWriter } from './paged';\n\n// An initial key a later version took away.\nconst gone = -1;\n\n// The overlay of keys is merged into the index once it holds this many, and half as many as the index: so an\n// update copies a bounded overlay, and a long run of updates costs the index once more over every few of them.\nconst mergedFrom = 4096;\n\n/** A cell's parts, where a version holds them: each field's columns, and the cell's place in them. */\nexport interface CellAt {\n readonly columns: readonly PartColumns[];\n readonly offset: number;\n}\n\n/** One version of a computation's cells. */\nexport class ComputationCells implements CubeCells {\n readonly #initial: ReadonlyMap<number, number>;\n readonly #changed: ReadonlyMap<number, number>;\n readonly #baseline: readonly PartColumns[];\n readonly #baselineCount: number;\n readonly #pages: PagedArray<readonly PartColumns[]>;\n /** How many cells were ever numbered: the next cell's number. */\n readonly count: number;\n\n private constructor(initial: ReadonlyMap<number, number>, changed: ReadonlyMap<number, number>, baseline: readonly PartColumns[],\n baselineCount: number, pages: PagedArray<readonly PartColumns[]>, count: number) {\n this.#initial = initial;\n this.#changed = changed;\n this.#baseline = baseline;\n this.#baselineCount = baselineCount;\n this.#pages = pages;\n this.count = count;\n }\n\n /** A computation's first version: the first cube's cells, shared. */\n static of(cells: ReadonlyMap<number, number>, values: readonly PartColumns[]): ComputationCells {\n return new ComputationCells(cells, new Map(), values, cells.size, PagedArray.empty(), cells.size);\n }\n\n /** The cell a key names in this version, or `undefined` for none. */\n cellOf(key: number): number | undefined {\n const changed = this.#changed.get(key);\n if (changed !== undefined) return changed === gone ? undefined : changed;\n return this.#initial.get(key);\n }\n\n /** The cell a key names; it must name one. */\n mustCellOf(key: number): number {\n const cell = this.cellOf(key);\n if (cell === undefined) throw new Error(`Internal: no cell has the key ${key} (ADR-0153).`);\n return cell;\n }\n\n /** Where a cell's parts are in this version. */\n at(cell: number): CellAt {\n const page = this.#pages.get(Math.floor(cell / pageSize));\n return page === undefined ? { columns: this.#baseline, offset: cell } : { columns: page, offset: cell % pageSize };\n }\n\n read(row: number, column: number, source: number, aggregation: PivotAggregation): AggregateValue {\n const cell = this.cellOf(cellKey(row, column));\n if (cell === undefined) return emptyValue;\n const { columns, offset } = this.at(cell);\n return elementAt(columns, source).read(offset, aggregation);\n }\n\n /** A writer of the next version, which starts as this one. */\n writer(): CellsWriter {\n return new CellsWriter(this.#initial, this.#changed, this.#baseline, this.#baselineCount, this.#pages.writer(), this.count,\n (initial, changed, pages, count) => new ComputationCells(initial, changed, this.#baseline, this.#baselineCount, pages, count));\n }\n}\n\ntype Publish = (initial: ReadonlyMap<number, number>, changed: ReadonlyMap<number, number>, pages: PagedArray<readonly PartColumns[]>,\n count: number) => ComputationCells;\n\n/** The next version of the cells, written: a page copied the first time a cell of it is written, the overlay of\n * keys the first time a key is added or taken away. */\nexport class CellsWriter {\n readonly #initial: ReadonlyMap<number, number>;\n readonly #held: ReadonlyMap<number, number>;\n #changed: Map<number, number> | undefined;\n readonly #baseline: readonly PartColumns[];\n readonly #baselineCount: number;\n readonly #pages: PagedWriter<readonly PartColumns[]>;\n readonly #written = new Map<number, PartColumns[]>();\n readonly #publish: Publish;\n #count: number;\n\n constructor(initial: ReadonlyMap<number, number>, changed: ReadonlyMap<number, number>, baseline: readonly PartColumns[], baselineCount: number,\n pages: PagedWriter<readonly PartColumns[]>, count: number, publish: Publish) {\n this.#initial = initial;\n this.#held = changed;\n this.#baseline = baseline;\n this.#baselineCount = baselineCount;\n this.#pages = pages;\n this.#count = count;\n this.#publish = publish;\n }\n\n #overlay(): ReadonlyMap<number, number> {\n return this.#changed ?? this.#held;\n }\n\n #own(): Map<number, number> {\n this.#changed ??= new Map(this.#held);\n return this.#changed;\n }\n\n #cellOf(key: number): number | undefined {\n const changed = this.#overlay().get(key);\n if (changed !== undefined) return changed === gone ? undefined : changed;\n return this.#initial.get(key);\n }\n\n /** The cell a key names, numbered anew where it names none. */\n cell(key: number): number {\n const held = this.#cellOf(key);\n if (held !== undefined) return held;\n const cell = this.#count++;\n this.#own().set(key, cell);\n return cell;\n }\n\n /** Takes the key's cell away. */\n remove(key: number): void {\n if (this.#initial.has(key)) this.#own().set(key, gone);\n else if (this.#overlay().has(key)) this.#own().delete(key);\n }\n\n /** Where a cell's parts are, as written so far. */\n at(cell: number): CellAt {\n const page = this.#pages.get(Math.floor(cell / pageSize));\n return page === undefined ? { columns: this.#baseline, offset: cell } : { columns: page, offset: cell % pageSize };\n }\n\n // The page of a cell, this writer's own: copied from the version before, or from the first cube's cells.\n #write(cell: number): readonly PartColumns[] {\n const number = Math.floor(cell / pageSize);\n const own = this.#written.get(number);\n if (own !== undefined) return own;\n const held = this.#pages.get(number);\n const from = number * pageSize;\n const page = this.#baseline.map((baseline, v) => {\n const columns = new PartColumns(baseline.parts);\n for (let at = 0; at < pageSize; at++) {\n if (held !== undefined) columns.copyCell(elementAt(held, v), at);\n else if (from + at < this.#baselineCount) columns.copyCell(baseline, from + at);\n else columns.addCell();\n }\n return columns;\n });\n this.#written.set(number, page);\n this.#pages.set(number, page);\n return page;\n }\n\n /** Writes over a cell each field's parts at `at` of `values`. */\n put(cell: number, values: readonly PartColumns[], at: number): void {\n const page = this.#write(cell);\n page.forEach((columns, v) => {\n columns.setCell(cell % pageSize, elementAt(values, v), at);\n });\n }\n\n /**\n * Takes a leaf's parts before out of a total and puts its parts after in, where every part is a count or an\n * exact sum, which subtraction keeps exactly in any order (ADR-0153): `before` is `undefined` for a leaf that\n * is new, `after` for one emptied.\n */\n adjust(cell: number, before: CellAt | undefined, after: { readonly values: readonly PartColumns[]; readonly at: number } | undefined): void {\n const page = this.#write(cell);\n const offset = cell % pageSize;\n page.forEach((columns, v) => {\n const counts = elementAt(columns.counts, offset);\n const sums = columns.sums;\n if (after !== undefined) {\n const from = elementAt(after.values, v);\n const added = elementAt(from.counts, after.at);\n counts.values += added.values;\n counts.numbers += added.numbers;\n if (sums !== undefined) {\n const sum = elementAt(sums, offset);\n sum.exact = exactlyAdded(sum.exact, elementAt(defined(from.sums, 'the sums of a part kept by subtraction'), after.at).exact);\n }\n }\n if (before !== undefined) {\n const from = elementAt(before.columns, v);\n const taken = elementAt(from.counts, before.offset);\n counts.values -= taken.values;\n counts.numbers -= taken.numbers;\n if (sums !== undefined) {\n const sum = elementAt(sums, offset);\n sum.exact = exactlyAdded(sum.exact, negated(elementAt(defined(from.sums, 'the sums of a part kept by subtraction'), before.offset).exact));\n }\n }\n });\n }\n\n /** Empties a cell, to be merged again from its leaves. */\n reset(cell: number): void {\n for (const columns of this.#write(cell)) columns.resetCell(cell % pageSize);\n }\n\n /** Merges a leaf's cell into a total's. */\n merge(cell: number, leaf: number): void {\n const page = this.#write(cell);\n const { columns, offset } = this.at(leaf);\n page.forEach((into, v) => {\n into.merge(cell % pageSize, elementAt(columns, v), offset);\n });\n }\n\n /** Writes a cell's exact values in one form (ADR-0064). */\n finish(cell: number): void {\n const offset = cell % pageSize;\n for (const columns of this.#write(cell)) columns.canonicalize(offset, offset + 1);\n }\n\n /** The version written. */\n freeze(): ComputationCells {\n const pages = this.#pages.freeze();\n const changed = this.#overlay();\n if (changed.size < mergedFrom || changed.size * 2 < this.#initial.size) return this.#publish(this.#initial, changed, pages, this.#count);\n const merged = new Map(this.#initial);\n for (const [key, cell] of changed) {\n if (cell === gone) merged.delete(key);\n else merged.set(key, cell);\n }\n return this.#publish(merged, new Map(), pages, this.#count);\n }\n}\n\nfunction negated(value: SnapshotDecimal): SnapshotDecimal {\n return { mantissa: -value.mantissa, scale: value.scale };\n}\n\n// A sum the update keeps by addition: within the bound the computation checked, no decimal overflows.\nfunction exactlyAdded(a: SnapshotDecimal, b: SnapshotDecimal): SnapshotDecimal {\n const added = decimalAdd(a, b);\n if (added === undefined) throw new Error('Internal: an exact total that subtraction keeps overflowed (ADR-0153).');\n return added;\n}\n\n", "// One axis of a computation (ADR-0153): the first cube's tree, by node id, under an overlay of the nodes and the\n// child lists the updates since wrote. A version shares every page an update did not write; it reaches no\n// version before it, and nothing writes the first tree. The C# engine's ComputationAxis and its Working index.\n\nimport { AxisNode, ItemRef, type CubeAxis } from '../cube/cube';\nimport { keyIdOf, type PivotItemKey } from '../items/item-key';\nimport { elementAt } from '../must';\nimport type { AggregationPass } from '../source/aggregation-pass';\nimport { PagedArray, type PagedWriter } from './paged';\n\n/** One published version of an axis. A node's parents are this version's: a relabelled node's descendants are\n * made again under it. */\nexport class ComputationAxis implements CubeAxis {\n readonly root: AxisNode;\n readonly #initial: readonly AxisNode[];\n readonly #nodes: PagedArray<AxisNode>;\n readonly #children: PagedArray<readonly number[]>;\n readonly #relabelled: boolean;\n // Each child list read through the overlay, made once: a version never changes.\n readonly #read = new Map<number, readonly AxisNode[]>();\n\n constructor(initial: readonly AxisNode[], nodes: PagedArray<AxisNode>, children: PagedArray<readonly number[]>, relabelled: boolean) {\n this.#initial = initial;\n this.#nodes = nodes;\n this.#children = children;\n this.#relabelled = relabelled;\n this.root = this.node(0);\n }\n\n node(id: number): AxisNode {\n return this.#nodes.get(id) ?? elementAt(this.#initial, id);\n }\n\n nodeOf(node: AxisNode): AxisNode {\n return this.node(node.id);\n }\n\n childrenOf(node: AxisNode): readonly AxisNode[] {\n const ids = this.#children.get(node.id);\n // A list no update wrote, under no node an update relabelled, is the first tree's.\n if (ids === undefined && (!this.#relabelled || node.id >= this.#initial.length)) return node.id < this.#initial.length ? elementAt(this.#initial, node.id).children : [];\n let read = this.#read.get(node.id);\n if (read === undefined) {\n read = Object.freeze(ids === undefined ? elementAt(this.#initial, node.id).children.map(child => this.node(child.id)) : ids.map(id => this.node(id)));\n this.#read.set(node.id, read);\n }\n return read;\n }\n}\n\n/**\n * The working index of one axis, private to its computation. It starts as the first cube's tree, which it never\n * writes: a node an update makes, relabels or gives other children is written to the overlay it publishes. What\n * only an update reads \u2014 each parent's children by Item, and the nodes of each Item \u2014 is made the first time an\n * update reads it, so the first report costs what its own cube does.\n */\nexport class WorkingAxis {\n readonly #initial: readonly AxisNode[];\n #nodes: PagedArray<AxisNode> = PagedArray.empty();\n #children: PagedArray<readonly number[]> = PagedArray.empty();\n #nodeWriter: PagedWriter<AxisNode> | undefined;\n #childWriter: PagedWriter<readonly number[]> | undefined;\n #relabelled = false;\n // Each parent's children by their Item's key: made the first time an update looks for a child under it.\n readonly #paths = new Map<number, Map<string, number>>();\n // How many leaves each node is on the path of, by id; the root is not counted.\n #users: Int32Array;\n #next: number;\n // The label every node of an Item carries, by level and the pass's Item: an Item's nodes are labelled\n // alike, and relabelled together. And the nodes of each Item, made the first time an Item's label changes.\n readonly #labels: (PivotItemKey | undefined)[][];\n #byItem: Map<string, number[]> | undefined;\n /** The nodes an update made, relabelled, or gave other children, or that took a leaf on again. */\n readonly changed = new Set<number>();\n /** The nodes an update took the last leaf from. */\n readonly removed = new Set<number>();\n\n constructor(initial: readonly AxisNode[], levels: number) {\n this.#initial = initial;\n this.#next = initial.length;\n this.#users = new Int32Array(Math.max(16, initial.length + Math.floor(initial.length / 8)));\n this.#labels = Array.from({ length: levels }, () => []);\n }\n\n /** Begins an update: nothing changed yet. */\n begin(): void {\n this.changed.clear();\n this.removed.clear();\n }\n\n /** The version written so far, published. */\n freeze(): ComputationAxis {\n if (this.#nodeWriter !== undefined) this.#nodes = this.#nodeWriter.freeze();\n if (this.#childWriter !== undefined) this.#children = this.#childWriter.freeze();\n this.#nodeWriter = undefined;\n this.#childWriter = undefined;\n return new ComputationAxis(this.#initial, this.#nodes, this.#children, this.#relabelled);\n }\n\n /** The root, as the overlay holds it. */\n get root(): AxisNode {\n return this.#node(0);\n }\n\n #node(id: number): AxisNode {\n return (this.#nodeWriter === undefined ? this.#nodes.get(id) : this.#nodeWriter.get(id)) ?? elementAt(this.#initial, id);\n }\n\n #setNode(node: AxisNode): void {\n this.#nodeWriter ??= this.#nodes.writer();\n this.#nodeWriter.set(node.id, node);\n }\n\n #setChildren(parent: number, ids: readonly number[]): void {\n this.#childWriter ??= this.#children.writer();\n this.#childWriter.set(parent, Object.freeze(ids));\n }\n\n /** A leaf the first cube holds, at the node the cube made for it: every node on its path counts it, and each\n * Item on the path is labelled as the cube labelled it. `start` is the axis's first level among the pass's. */\n use(pass: AggregationPass, leaf: number, start: number, node: AxisNode): void {\n for (let at = node; at.parent !== undefined; at = at.parent) {\n this.#users[at.id] = elementAt(this.#users, at.id) + 1;\n const labels = elementAt(this.#labels, at.level);\n const item = pass.itemOfLeaf(start + at.level, leaf);\n labels[item] ??= itemOf(at).publicKey;\n }\n }\n\n /** The node a leaf the batches brought stands at, made where it is new, and counted on each node of its\n * path: a node that took its first leaf, or took one again, joins its parent's children. */\n addLeaf(pass: AggregationPass, leaf: number, start: number, count: number): AxisNode {\n let parent = this.root;\n for (let level = 0; level < count; level++) {\n const space = pass.axis(start + level);\n const item = pass.itemOfLeaf(start + level, leaf);\n const paths = this.#pathsUnder(parent.id);\n const key = keyIdOf(space.keyOf(item));\n let id = paths.get(key);\n if (id === undefined) {\n id = this.#next++;\n const label = space.publicKeyOf(item);\n this.#setNode(new AxisNode(id, level, parent, ItemRef.of(label)));\n paths.set(key, id);\n this.#ensureUsers(id);\n // The Item's first node sets the label its nodes carry. A node made with a newer spelling than\n // the others carry came with a batch that touched its Item, so relabel brings the others to it.\n const labels = elementAt(this.#labels, level);\n labels[item] ??= label;\n if (this.#byItem !== undefined) nodesOf(this.#byItem, level, key).push(id);\n }\n const users = elementAt(this.#users, id);\n this.#users[id] = users + 1;\n if (users === 0) {\n const siblings = this.#childIds(parent.id);\n if (!siblings.includes(id)) this.#setChildren(parent.id, [...siblings, id]);\n this.changed.add(id);\n this.changed.add(parent.id);\n }\n parent = this.#node(id);\n }\n return parent;\n }\n\n /** Takes a leaf off each node of its path: a node left with none leaves its parent's children. */\n removeLeaf(leaf: AxisNode): void {\n for (let node = leaf; node.parent !== undefined; node = node.parent) {\n const users = elementAt(this.#users, node.id) - 1;\n this.#users[node.id] = users;\n if (users !== 0) continue;\n const parent = node.parent.id;\n this.#setChildren(parent, this.#childIds(parent).filter(id => id !== node.id));\n this.removed.add(node.id);\n this.changed.add(parent);\n }\n }\n\n /** Relabels the nodes of each Item a batch touched whose spelling changed: a text Item is labelled by its\n * first spelling among the records present (ADR-0060). */\n relabel(pass: AggregationPass, start: number, count: number): void {\n for (let level = 0; level < count; level++) {\n const space = pass.axis(start + level);\n const labels = elementAt(this.#labels, level);\n for (const item of space.changedItems) {\n // An Item no node carries has no label to change.\n const label = labels[item];\n if (label === undefined) continue;\n const key = space.publicKeyOf(item);\n if (label.kind === key.kind && label.value === key.value) continue;\n labels[item] = key;\n const ids = this.#nodesByItem().get(itemId(level, keyIdOf(space.keyOf(item))));\n if (ids === undefined) continue;\n for (const id of ids) {\n const before = this.#node(id);\n const held = itemOf(before).publicKey;\n if (held.kind === key.kind && held.value === key.value) continue;\n const node = new AxisNode(id, before.level, before.parent, ItemRef.of(key));\n this.#setNode(node);\n this.#relabelled = true;\n if (elementAt(this.#users, id) > 0) this.changed.add(id);\n this.#reparent(node);\n }\n }\n }\n }\n\n // Every node ever made under a relabelled one, made again under it: a node's path, read up its parents, is\n // then spelled as this version spells it, wherever it is read from.\n #reparent(parent: AxisNode): void {\n for (const id of this.#pathsUnder(parent.id).values()) {\n const child = this.#node(id);\n const node = new AxisNode(id, child.level, parent, child.item);\n this.#setNode(node);\n if (elementAt(this.#users, id) > 0) this.changed.add(id);\n this.#reparent(node);\n }\n }\n\n #ensureUsers(id: number): void {\n if (id < this.#users.length) return;\n const grown = new Int32Array(Math.max(id + 1, this.#users.length * 2));\n grown.set(this.#users);\n this.#users = grown;\n }\n\n #childIds(parent: number): readonly number[] {\n const written = this.#childWriter === undefined ? this.#children.get(parent) : this.#childWriter.get(parent);\n if (written !== undefined) return written;\n if (parent >= this.#initial.length) return [];\n return elementAt(this.#initial, parent).children.map(child => child.id);\n }\n\n #pathsUnder(parent: number): Map<string, number> {\n let paths = this.#paths.get(parent);\n if (paths !== undefined) return paths;\n paths = new Map();\n if (parent < this.#initial.length) {\n for (const child of elementAt(this.#initial, parent).children) paths.set(keyIdOf(itemOf(child).key), child.id);\n }\n this.#paths.set(parent, paths);\n return paths;\n }\n\n // Every node but the root, by its level and Item: the first cube's and the updates'.\n #nodesByItem(): Map<string, number[]> {\n if (this.#byItem !== undefined) return this.#byItem;\n const index = new Map<string, number[]>();\n for (let id = 1; id < this.#next; id++) {\n const node = this.#node(id);\n if (node.item !== undefined) nodesOf(index, node.level, keyIdOf(node.item.key)).push(id);\n }\n this.#byItem = index;\n return index;\n }\n}\n\nfunction itemId(level: number, key: string): string {\n return `${level}\\u0001${key}`;\n}\n\nfunction nodesOf(index: Map<string, number[]>, level: number, key: string): number[] {\n const id = itemId(level, key);\n let nodes = index.get(id);\n if (nodes === undefined) {\n nodes = [];\n index.set(id, nodes);\n }\n return nodes;\n}\n\nfunction itemOf(node: AxisNode): ItemRef {\n if (node.item === undefined) throw new Error('Internal: the root has no Item.');\n return node.item;\n}\n", "// The leaves of one total, ordered by their first record, then their number: the order a fresh pass merges them\n// in (ADR-0153). A set of (first record, leaf) pairs: the pairs the computation began with, sorted once, and the\n// few that updates added or took away since \u2014 so beginning a computation costs two arrays a total, not an\n// entry a leaf. The C# engine's ComputationCube.Members.\n\nimport { elementAt } from '../must';\n\nexport class Members {\n #firsts: Int32Array | number[] = [];\n #leaves: Int32Array | number[] = [];\n #count = 0;\n // Positions among the first pairs no longer members.\n #gone: Set<number> | undefined;\n // Members the first pairs do not hold, by `first,leaf`.\n #added: Map<string, readonly [number, number]> | undefined;\n\n /** How many leaves the total holds. */\n get count(): number {\n let count = this.#count;\n if (this.#gone !== undefined) count -= this.#gone.size;\n if (this.#added !== undefined) count += this.#added.size;\n return count;\n }\n\n /** A pair the computation begins with; {@link seal} orders them. */\n append(first: number, leaf: number): void {\n if (!Array.isArray(this.#firsts) || !Array.isArray(this.#leaves)) throw new Error('Internal: a total\\'s first leaves are sealed (ADR-0153).');\n this.#firsts.push(first);\n this.#leaves.push(leaf);\n this.#count++;\n }\n\n /** Ends the first pairs: sorted, where they did not come in order. */\n seal(): void {\n const firsts = Int32Array.from(this.#firsts);\n const leaves = Int32Array.from(this.#leaves);\n let sorted = true;\n for (let i = 1; i < this.#count && sorted; i++) sorted = compare(elementAt(firsts, i - 1), elementAt(leaves, i - 1), elementAt(firsts, i), elementAt(leaves, i)) < 0;\n if (sorted) {\n this.#firsts = firsts;\n this.#leaves = leaves;\n return;\n }\n const order = Array.from({ length: this.#count }, (_, i) => i)\n .toSorted((a, b) => compare(elementAt(firsts, a), elementAt(leaves, a), elementAt(firsts, b), elementAt(leaves, b)));\n this.#firsts = Int32Array.from(order, i => elementAt(firsts, i));\n this.#leaves = Int32Array.from(order, i => elementAt(leaves, i));\n }\n\n // The position of a pair among the first ones, or \u22121.\n #find(first: number, leaf: number): number {\n let low = 0;\n let high = this.#count - 1;\n while (low <= high) {\n const middle = (low + high) >>> 1;\n const compared = compare(elementAt(this.#firsts, middle), elementAt(this.#leaves, middle), first, leaf);\n if (compared === 0) return middle;\n if (compared < 0) low = middle + 1;\n else high = middle - 1;\n }\n return -1;\n }\n\n /** Makes a leaf a member at its first record. */\n add(first: number, leaf: number): void {\n const at = this.#find(first, leaf);\n if (at >= 0) this.#gone?.delete(at);\n else (this.#added ??= new Map()).set(`${first},${leaf}`, [first, leaf]);\n }\n\n /** Takes a leaf at its first record out. */\n remove(first: number, leaf: number): void {\n if (this.#added?.delete(`${first},${leaf}`) === true) return;\n const at = this.#find(first, leaf);\n if (at >= 0) (this.#gone ??= new Set()).add(at);\n }\n\n /** The members' leaves, in order. */\n *leaves(): Generator<number, void> {\n const added = this.#added === undefined ? [] : [...this.#added.values()].toSorted((a, b) => compare(a[0], a[1], b[0], b[1]));\n let next = 0;\n for (let at = 0; at < this.#count; at++) {\n if (this.#gone?.has(at) === true) continue;\n const first = elementAt(this.#firsts, at);\n const leaf = elementAt(this.#leaves, at);\n for (let pair = added[next]; pair !== undefined && compare(pair[0], pair[1], first, leaf) < 0; pair = added[++next]) yield pair[1];\n yield leaf;\n }\n for (let pair = added[next]; pair !== undefined; pair = added[++next]) yield pair[1];\n }\n}\n\nfunction compare(firstA: number, leafA: number, firstB: number, leafB: number): number {\n return firstA !== firstB ? firstA - firstB : leafA - leafB;\n}\n", "// A computation's cube (ADR-0153): the cells, trees and leaves of the cube a fresh pass made, kept up to date\n// from the leaves each Change Batch touched \u2014 a total by subtraction where every part allows it, merged again\n// from its leaves, in the order a fresh pass merges them, where one does not. Its working indexes are its\n// own; every cube it publishes is immutable. The C# engine's ComputationCube.\n\nimport { decimalCompare } from '../aggregates/exact-decimal';\nimport { partSum, type PartColumns } from '../aggregates/parts';\nimport { cellKey, cubeWith, type AxisNode, type CubeBuild, type PivotCube } from '../cube/cube';\nimport { defined, elementAt } from '../must';\nimport { noFirstRow, type AggregationPass } from '../source/aggregation-pass';\nimport { pieceUnits } from '../source/slicing';\nimport { ComputationCells } from './cells';\nimport { WorkingAxis } from './axis';\nimport { Members } from './members';\n\n// The largest exact total subtraction keeps, and the most decimal places: within them every partial sum of a\n// total's leaves is exact in any order, at most 2^31 leaves each within 10^12 at six places needing fewer than\n// 96 bits. A guard on the work only, never a cap on the data: past it, a total is merged again in order.\nconst additiveBound = { mantissa: 1_000_000_000_000n, scale: 0 };\nconst additiveScale = 6;\n\n/** Counts units of work and says when a piece's worth is done, for the work to yield. */\nexport class Pace {\n #units = 0;\n\n /** Adds a step's units; true once a piece's worth is done. */\n spent(units: number): boolean {\n this.#units += units;\n if (this.#units < pieceUnits) return false;\n this.#units = 0;\n return true;\n }\n}\n\n/** The computation of one question's cube, updated in place from the pass it was made from. */\nexport class ComputationCube {\n // Each leaf of the pass, by its number: the nodes it stands at, its records, and its first record \u2014 where a\n // fresh pass meets it, which orders the merges into its totals. A leaf with no records has no nodes.\n readonly #leafRow: (AxisNode | undefined)[] = [];\n readonly #leafColumn: (AxisNode | undefined)[] = [];\n readonly #leafRecords: number[] = [];\n readonly #leafFirst: number[] = [];\n // Each total's leaves, by first record: what a total that subtraction cannot keep exact is merged again\n // from. Made from the leaves held the first time an update needs them, so a question never updated makes\n // none (PV-21).\n #members: Map<number, Members> | undefined;\n readonly #rows: WorkingAxis;\n readonly #columns: WorkingAxis;\n #cells: ComputationCells;\n #cube: PivotCube;\n readonly #rowFields: number;\n readonly #columnFields: number;\n // The leaves whose parts subtraction cannot keep exactly, and how many there are.\n readonly #nonAdditive = new Set<number>();\n /** The row nodes on the path of a leaf the last update changed: a value sort under them may move. */\n readonly valueRows = new Set<number>();\n /** The column nodes on the path of a leaf the last update changed. */\n readonly valueColumns = new Set<number>();\n\n private constructor(cube: PivotCube, cells: ComputationCells, rows: WorkingAxis, columns: WorkingAxis, rowFields: number, columnFields: number) {\n this.#cube = cube;\n this.#cells = cells;\n this.#rows = rows;\n this.#columns = columns;\n this.#rowFields = rowFields;\n this.#columnFields = columnFields;\n }\n\n /** The cube the computation last published. */\n get cube(): PivotCube {\n return this.#cube;\n }\n\n /** The row nodes the last update made, relabelled, gave other children or took a leaf back to. */\n get changedRowNodes(): ReadonlySet<number> {\n return this.#rows.changed;\n }\n\n /** The column nodes the last update made, relabelled, gave other children or took a leaf back to. */\n get changedColumnNodes(): ReadonlySet<number> {\n return this.#columns.changed;\n }\n\n /** The column nodes the last update took the last leaf from. */\n get removedColumnNodes(): ReadonlySet<number> {\n return this.#columns.removed;\n }\n\n /**\n * The computation of a cube the pass's answer made: its cells, trees and leaves taken as the cube holds them.\n * `build` is what the cube's build made: the nodes of each of the answer's leaves, which are the pass's\n * leaves that hold records, in their order.\n */\n static *create(cube: PivotCube, build: CubeBuild, pass: AggregationPass): Generator<void, ComputationCube> {\n const rowFields = pass.query.rows.length;\n const columnFields = pass.query.columns.length;\n const rows = new WorkingAxis(build.rowNodes, rowFields);\n const columns = new WorkingAxis(build.columnNodes, columnFields);\n const made = new ComputationCube(cube, ComputationCells.of(build.cells, build.values), rows, columns, rowFields, columnFields);\n const first = pass.firstRows();\n const pace = new Pace();\n let answered = 0;\n for (let leaf = 0; leaf < pass.leafCount; leaf++) {\n const records = pass.recordsOf(leaf);\n if (records === 0) continue;\n if (answered === build.rowLeaves.length) throw new Error('Internal: the cube holds fewer leaves than the pass it was made from (ADR-0153).');\n made.#hold(pass, leaf, elementAt(build.rowLeaves, answered), elementAt(build.columnLeaves, answered), records, elementAt(first, leaf));\n answered++;\n if (pace.spent(1 + rowFields + columnFields)) yield;\n }\n if (answered !== build.rowLeaves.length) throw new Error('Internal: the cube holds more leaves than the pass it was made from (ADR-0153).');\n return made;\n }\n\n // A leaf of the first cube, at the nodes the cube made for it.\n #hold(pass: AggregationPass, leaf: number, row: AxisNode, column: AxisNode, records: number, first: number): void {\n this.#rows.use(pass, leaf, 0, row);\n this.#columns.use(pass, leaf, this.#rowFields, column);\n this.#keep(leaf, row, column, records, first);\n const { columns, offset } = this.#cells.at(this.#cells.mustCellOf(cellKey(row.id, column.id)));\n if (!additive(columns, offset)) this.#nonAdditive.add(leaf);\n }\n\n #keep(leaf: number, row: AxisNode | undefined, column: AxisNode | undefined, records: number, first: number): void {\n this.#leafRow[leaf] = row;\n this.#leafColumn[leaf] = column;\n this.#leafRecords[leaf] = records;\n this.#leafFirst[leaf] = first;\n }\n\n // Each total's leaves, made from the leaves held, a piece at a time, the first time an update needs them.\n // The leaves are listed in their number's order and sorted once by their first record.\n *#membersSteps(): Generator<void, Map<number, Members>> {\n if (this.#members !== undefined) return this.#members;\n const made = new Map<number, Members>();\n const pace = new Pace();\n const weight = (1 + this.#rowFields) * (1 + this.#columnFields);\n for (let leaf = 0; leaf < this.#leafRow.length; leaf++) {\n const row = this.#leafRow[leaf];\n const column = this.#leafColumn[leaf];\n if (row === undefined || column === undefined) continue;\n const first = elementAt(this.#leafFirst, leaf);\n for (const total of totals(row, column)) membersIn(made, total).append(first, leaf);\n if (pace.spent(weight)) yield;\n }\n for (const members of made.values()) members.seal();\n this.#members = made;\n return made;\n }\n\n /**\n * Brings the cube up to the batches the pass folded in since it was last updated, and publishes it under\n * `version`: the leaves the pass names as changed are written, each total over them adjusted or merged again,\n * and the Items whose spelling changed relabelled. Run to its end once begun: a cancellation is not heard.\n */\n *update(pass: AggregationPass, version: string): Generator<void, PivotCube> {\n // Made before the batch changes any leaf held: they are the leaves before it.\n const allMembers = yield* this.#membersSteps();\n this.#rows.begin();\n this.#columns.begin();\n this.valueRows.clear();\n this.valueColumns.clear();\n const changed = [...pass.changedLeaves].toSorted((a, b) => a - b);\n const values = pass.partsOf(changed);\n const first = pass.firstRows();\n // Subtraction keeps a total only where every leaf it held, and every leaf it holds now, is kept by it.\n const additiveBefore = this.#nonAdditive.size === 0;\n for (let at = 0; at < changed.length; at++) {\n const leaf = elementAt(changed, at);\n if (pass.recordsOf(leaf) !== 0 && !additive(values, at)) this.#nonAdditive.add(leaf);\n else this.#nonAdditive.delete(leaf);\n }\n const additiveNow = this.#nonAdditive.size === 0 && additiveBefore;\n const write = this.#cells.writer();\n const touched = new Set<number>();\n let included = this.#cube.includedRecordCount;\n const pace = new Pace();\n for (let at = 0; at < changed.length; at++) {\n if (pace.spent(1 + this.#rowFields + this.#columnFields)) yield;\n const leaf = elementAt(changed, at);\n const records = pass.recordsOf(leaf);\n const heldRow = this.#leafRow[leaf];\n const heldColumn = this.#leafColumn[leaf];\n const held = heldRow !== undefined && heldColumn !== undefined;\n included += records - (held ? elementAt(this.#leafRecords, leaf) : 0);\n if (!held && records === 0) continue;\n let row: AxisNode;\n let column: AxisNode;\n let oldFirst: number;\n if (held) {\n row = heldRow;\n column = heldColumn;\n oldFirst = elementAt(this.#leafFirst, leaf);\n } else {\n row = this.#rows.addLeaf(pass, leaf, 0, this.#rowFields);\n column = this.#columns.addLeaf(pass, leaf, this.#rowFields, this.#columnFields);\n oldFirst = elementAt(first, leaf);\n for (const total of totals(row, column)) membersIn(allMembers, total).add(oldFirst, leaf);\n }\n for (let r: AxisNode | undefined = row; r !== undefined; r = r.parent) this.valueRows.add(r.id);\n for (let c: AxisNode | undefined = column; c !== undefined; c = c.parent) this.valueColumns.add(c.id);\n const key = cellKey(row.id, column.id);\n const affected = [...totals(row, column)];\n for (const total of affected) touched.add(total);\n if (additiveNow) {\n const before = held ? this.#cells.at(this.#cells.mustCellOf(key)) : undefined;\n const after = records > 0 ? { values, at } : undefined;\n for (const total of affected) write.adjust(write.cell(total), before, after);\n }\n if (records === 0) {\n write.remove(key);\n this.#rows.removeLeaf(row);\n this.#columns.removeLeaf(column);\n for (const total of affected) mustMembers(allMembers, total).remove(oldFirst, leaf);\n this.#keep(leaf, undefined, undefined, 0, noFirstRow);\n } else {\n const nextFirst = elementAt(first, leaf);\n if (oldFirst !== nextFirst) {\n for (const total of affected) {\n const members = mustMembers(allMembers, total);\n members.remove(oldFirst, leaf);\n members.add(nextFirst, leaf);\n }\n }\n this.#keep(leaf, row, column, records, nextFirst);\n write.put(write.cell(key), values, at);\n }\n }\n for (const total of touched) {\n const members = mustMembers(allMembers, total);\n if (members.count === 0) {\n write.remove(total);\n continue;\n }\n const cell = write.cell(total);\n if (additiveNow) {\n write.finish(cell);\n continue;\n }\n write.reset(cell);\n for (const leaf of members.leaves()) {\n write.merge(cell, write.cell(cellKey(defined(this.#leafRow[leaf], 'the row of a leaf a total lists').id, defined(this.#leafColumn[leaf], 'the column of a leaf a total lists').id)));\n if (pace.spent(1)) yield;\n }\n write.finish(cell);\n }\n this.#rows.relabel(pass, 0, this.#rowFields);\n this.#columns.relabel(pass, this.#rowFields, this.#columnFields);\n this.#cells = write.freeze();\n this.#cube = cubeWith(this.#cube, version, included, this.#rows.freeze(), this.#columns.freeze(), this.#cells);\n return this.#cube;\n }\n}\n\n// Whether every part of a leaf's cell is kept exactly by subtraction: counts, and an exact sum within the bound,\n// and no non-finite number.\nfunction additive(parts: readonly PartColumns[], cell: number): boolean {\n for (const columns of parts) {\n if ((columns.parts & ~partSum) !== 0 || elementAt(columns.counts, cell).nonFinite) return false;\n const sums = columns.sums;\n if (sums === undefined) continue;\n const sum = elementAt(sums, cell);\n if (sum.inexact || sum.exact.scale > additiveScale) return false;\n const magnitude = sum.exact.mantissa < 0n ? { mantissa: -sum.exact.mantissa, scale: sum.exact.scale } : sum.exact;\n if (decimalCompare(magnitude, additiveBound) > 0) return false;\n }\n return true;\n}\n\n// Every total a leaf at `row` and `column` is merged into: each pair of their own nodes or ancestors but the leaf's.\nfunction* totals(row: AxisNode, column: AxisNode): Generator<number, void> {\n for (let r: AxisNode | undefined = row; r !== undefined; r = r.parent) {\n for (let c: AxisNode | undefined = column; c !== undefined; c = c.parent) {\n if (r !== row || c !== column) yield cellKey(r.id, c.id);\n }\n }\n}\n\nfunction membersIn(all: Map<number, Members>, total: number): Members {\n let members = all.get(total);\n if (members === undefined) {\n members = new Members();\n all.set(total, members);\n }\n return members;\n}\n\nfunction mustMembers(all: ReadonlyMap<number, Members>, total: number): Members {\n const members = all.get(total);\n if (members === undefined) throw new Error('Internal: a total the update touches lists no leaves (ADR-0153).');\n return members;\n}\n\n", "// A computation's report structure (ADR-0153). Only the working index is mutable: a published part and its\n// children's sequence reach immutable rows and parts, never this index or an earlier report.\n//\n// The first report of a layout is laid out as one array of rows, node by node as the walk lays it out: its\n// structure is the base, an entry a node saying where its rows lie. An update lays a node out again only where\n// the data asks it to; the node is then split out of the part it lies in \u2014 its own rows, and a part for each\n// child \u2014 and the versions share every part an update did not touch. Each version's rows are its parts read in\n// order. The C# engine's ComputationReport.\n\nimport { cubeParts, type AxisNode, type PivotCube } from '../cube/cube';\nimport type { PivotLayout } from '../layout/pivot-layout';\nimport { defined, elementAt } from '../must';\nimport { ReportBuilder, rowLabelsAlike, type PivotReport, type PivotReportRow, type PivotRowKey, type PivotRowLabel } from '../report/report';\nimport { inPieces } from '../source/slicing';\nimport { Pace, type ComputationCube } from './cube';\n\n// A node laid out.\ninterface Laid {\n readonly pendingFrom: number;\n readonly order: readonly number[];\n // Where the node stands among its parent's children, as the parent last ordered them.\n position: number;\n // Its subtree's rows: its own before its children's, then its own after them, and all of them.\n readonly before: number;\n readonly after: number;\n readonly rows: number;\n // The part that is its subtree; `undefined` while that lies within an ancestor's first part.\n published: Part | undefined;\n}\n\ntype Part = FirstLayout | Branch;\n\n// A subtree as it was first laid out: its rows in order, in an array of its own.\nclass FirstLayout {\n readonly rows: readonly PivotReportRow[];\n\n constructor(rows: readonly PivotReportRow[]) {\n this.rows = rows;\n }\n\n get count(): number {\n return this.rows.length;\n }\n\n readInto(rows: PivotReportRow[]): void {\n for (const row of this.rows) rows.push(row);\n }\n}\n\n// A subtree an update laid out: its own rows, and its children's parts between them.\nclass Branch {\n readonly before: readonly PivotReportRow[];\n readonly children: Children | undefined;\n readonly after: readonly PivotReportRow[];\n readonly count: number;\n\n constructor(before: readonly PivotReportRow[], children: Children | undefined, after: readonly PivotReportRow[]) {\n this.before = before;\n this.children = children;\n this.after = after;\n this.count = before.length + (children === undefined ? 0 : children.rows) + after.length;\n }\n\n readInto(rows: PivotReportRow[]): void {\n for (const row of this.before) rows.push(row);\n this.children?.readInto(rows);\n for (const row of this.after) rows.push(row);\n }\n}\n\n// A balanced sequence of siblings with their subtrees' row counts. Replacing one child's part shares every\n// sibling and copies only its logarithmic path.\nclass Children {\n readonly left: Children | undefined;\n readonly value: Part;\n readonly right: Children | undefined;\n readonly count: number;\n readonly rows: number;\n\n constructor(left: Children | undefined, value: Part, right: Children | undefined) {\n this.left = left;\n this.value = value;\n this.right = right;\n this.count = 1 + (left === undefined ? 0 : left.count) + (right === undefined ? 0 : right.count);\n this.rows = value.count + (left === undefined ? 0 : left.rows) + (right === undefined ? 0 : right.rows);\n }\n\n static of(values: readonly Part[], start: number, count: number): Children | undefined {\n if (count === 0) return undefined;\n const half = Math.floor(count / 2);\n return new Children(Children.of(values, start, half), elementAt(values, start + half), Children.of(values, start + half + 1, count - half - 1));\n }\n\n set(index: number, value: Part): Children {\n const before = this.left === undefined ? 0 : this.left.count;\n if (index < before) return new Children(defined(this.left, 'the left of a balanced list').set(index, value), this.value, this.right);\n if (index > before) return new Children(this.left, this.value, defined(this.right, 'the right of a balanced list').set(index - before - 1, value));\n return this.value === value ? this : new Children(this.left, value, this.right);\n }\n\n readInto(rows: PivotReportRow[]): void {\n this.left?.readInto(rows);\n this.value.readInto(rows);\n this.right?.readInto(rows);\n }\n}\n\n/** One layout's report, kept up to date with its computation's cube. */\nexport class ComputationReport {\n // By node id, which the cube hands out densely.\n readonly #nodes: (Laid | undefined)[] = [];\n readonly #dirtyChildren = new Map<number, Set<number>>();\n readonly #reorder = new Set<number>();\n readonly #relabel = new Set<number>();\n readonly #labels: PivotReportRow[] = [];\n readonly #removed: PivotRowKey[] = [];\n #builder: ReportBuilder | undefined;\n #pace = new Pace();\n #rowSequenceChanged = false;\n\n /** The rows the last update added, or whose labels or whether they carry values changed. */\n get labelChanges(): readonly PivotReportRow[] {\n return this.#labels;\n }\n\n /** The keys of the rows the last update took away. */\n get removedRows(): readonly PivotRowKey[] {\n return this.#removed;\n }\n\n /** Whether the last report laid out, or updated, moved the rows' sequence. */\n get rowSequenceChanged(): boolean {\n return this.#rowSequenceChanged;\n }\n\n #prepare(builder: ReportBuilder): void {\n this.#builder = builder;\n this.#pace = new Pace();\n this.#dirtyChildren.clear();\n this.#reorder.clear();\n this.#relabel.clear();\n this.#labels.length = 0;\n this.#removed.length = 0;\n this.#rowSequenceChanged = false;\n }\n\n get #made(): ReportBuilder {\n if (this.#builder === undefined) throw new Error('Internal: the report structure was laid out by no builder.');\n return this.#builder;\n }\n\n get #layout(): PivotLayout {\n return this.#made.layout;\n }\n\n #rowNode(id: number): AxisNode {\n return cubeParts(this.#made.cube).rows.node(id);\n }\n\n /**\n * Lays out the first report of a layout, and the structure its updates follow, in one walk of the row tree:\n * each node's own rows and its children in their order \u2014 the rows a node lays out when an update lays it out\n * again. `builder` holds the cube and the layout, checked already.\n */\n *initialize(builder: ReportBuilder): Generator<void, PivotReport> {\n this.#prepare(builder);\n const rows: PivotReportRow[] = [];\n const root = cubeParts(builder.cube).rows.root;\n yield* this.#layOut(root, 0, 0, rows);\n const first = new FirstLayout(rows);\n defined(this.#nodes[root.id], 'the root laid out').published = first;\n this.#rowSequenceChanged = true;\n return yield* builder.buildAround(rows);\n }\n\n // A node's subtree as first laid out, appended to `rows`: its own rows before its children's, its children in\n // their order, then its own rows after them.\n *#layOut(node: AxisNode, position: number, pendingFrom: number, rows: PivotReportRow[]): Generator<void, void> {\n const start = rows.length;\n const own = yield* this.#made.rowsOf(node, pendingFrom);\n yield* appended(rows, own.before);\n let order: readonly number[] = [];\n if (own.descend) {\n const ordered = yield* this.#made.orderedChildren(node);\n order = ordered.map(child => child.id);\n for (let i = 0; i < ordered.length; i++) {\n yield* this.#layOut(elementAt(ordered, i), i, this.#made.childPendingFrom(node, i, pendingFrom), rows);\n if (this.#pace.spent(1)) yield;\n }\n }\n yield* appended(rows, own.after);\n this.#nodes[node.id] = {\n pendingFrom, order, position, before: own.before.length, after: own.after.length, rows: rows.length - start, published: undefined,\n };\n if (this.#pace.spent(1 + own.before.length + own.after.length)) yield;\n }\n\n #dirty(node: AxisNode): void {\n for (let current = node; current.parent !== undefined; current = current.parent) {\n let children = this.#dirtyChildren.get(current.parent.id);\n if (children === undefined) {\n children = new Set();\n this.#dirtyChildren.set(current.parent.id, children);\n }\n children.add(current.id);\n }\n }\n\n /** The report of `cube`, which the computation updated from `previous`'s: only the nodes the update touched\n * laid out again, and every other row shared with `previous`. Run to its end once begun. */\n *update(previous: PivotReport, cube: PivotCube, computation: ComputationCube): Generator<void, PivotReport> {\n this.#prepare(ReportBuilder.again(cube, previous));\n const layout = this.#layout;\n for (const id of computation.changedRowNodes) {\n const node = this.#rowNode(id);\n this.#relabel.add(id);\n this.#reorder.add(id);\n if (node.parent !== undefined) this.#reorder.add(node.parent.id);\n this.#dirty(node);\n }\n // A value sort follows the number shown. Percentages of the column or the grand total may move every\n // sibling order; otherwise only the ancestors of a leaf changed need an order.\n for (const id of computation.valueRows) {\n const node = this.#rowNode(id);\n if (node.parent !== undefined && elementAt(layout.rows, node.level).sort.byValue !== undefined) {\n this.#reorder.add(node.parent.id);\n this.#dirty(this.#rowNode(node.parent.id));\n }\n }\n if (computation.valueRows.size > 0 && layout.rows.some(p => p.sort.byValue !== undefined)\n && layout.values.some(v => v.showValuesAs === 'percentOfGrandTotal' || v.showValuesAs === 'percentOfColumnTotal')) {\n for (let id = 0; id < this.#nodes.length; id++) {\n if (this.#nodes[id] === undefined) continue;\n const node = this.#rowNode(id);\n const next = layout.rows[node.level + 1];\n if (next?.sort.byValue !== undefined) {\n this.#reorder.add(id);\n this.#dirty(node);\n }\n }\n }\n const root = yield* this.#updateNode(cubeParts(cube).rows.root, 0, 0, false);\n const columnsChanged = computation.changedColumnNodes.size > 0 || computation.removedColumnNodes.size > 0\n || (computation.valueColumns.size > 0 && layout.columns.some(p => p.sort.byValue !== undefined));\n const rows: PivotReportRow[] = [];\n root.readInto(rows);\n return yield* this.#made.withRows(previous, rows, columnsChanged);\n }\n\n *#updateNode(node: AxisNode, position: number, pendingFrom: number, ancestorLabelChanged: boolean): Generator<void, Part> {\n const layout = this.#layout;\n const held = this.#nodes[node.id];\n const tabular = layout.form === 'tabular';\n const boundary = held !== undefined && held.pendingFrom !== pendingFrom && tabular;\n const relabelled = this.#relabel.has(node.id);\n const labelsChanged = held === undefined || boundary || relabelled || ancestorLabelChanged;\n const needsOrder = held === undefined || this.#reorder.has(node.id);\n const dirtyChildren = this.#dirtyChildren.get(node.id);\n if (held !== undefined && !labelsChanged && !needsOrder && dirtyChildren === undefined) {\n held.position = position;\n return defined(held.published, 'a node\\'s rows as published');\n }\n // Laid out again: split out of the part it was first laid out in.\n const branch = held === undefined ? undefined : this.#split(node.id);\n const own = yield* this.#made.rowsOf(node, pendingFrom);\n const before = this.#keep(own.before, branch?.before);\n const after = this.#keep(own.after, branch?.after);\n const forceChildren = (ancestorLabelChanged || relabelled) && layout.repeatItemLabels;\n const firstLabelChanged = (ancestorLabelChanged || relabelled) && tabular && pendingFrom <= node.level;\n let children = branch?.children;\n let order: readonly number[] = held === undefined ? [] : held.order;\n if (own.descend) {\n const ordered = needsOrder ? yield* this.#made.orderedChildren(node) : undefined;\n const next = ordered === undefined ? order : ordered.map(child => child.id);\n const reordered = order.length !== next.length || order.some((id, i) => id !== next[i]);\n if (held === undefined || reordered) {\n this.#rowSequenceChanged = true;\n if (order.length > 0) {\n const surviving = new Set(next);\n for (const old of order) if (!surviving.has(old)) this.#remove(old);\n }\n const orderedChildren = defined(ordered, 'a node\\'s children in order');\n const parts: Part[] = [];\n for (let i = 0; i < orderedChildren.length; i++) {\n // The children as ordered: each the node the cube holds now.\n parts.push(yield* this.#updateNode(elementAt(orderedChildren, i), i, this.#made.childPendingFrom(node, i, pendingFrom),\n forceChildren || (i === 0 && firstLabelChanged)));\n if (this.#pace.spent(1)) yield;\n }\n children = Children.of(parts, 0, parts.length);\n order = next;\n } else {\n const affected = new Set<number>(forceChildren ? order : []);\n if (!forceChildren && dirtyChildren !== undefined) for (const id of dirtyChildren) affected.add(id);\n if ((boundary || firstLabelChanged) && order.length > 0) affected.add(elementAt(order, 0));\n for (const id of affected) {\n // A child the order holds: one it no longer holds is not laid out.\n const child = this.#nodes[id];\n if (child === undefined || child.position >= order.length || order[child.position] !== id) continue;\n const at = child.position;\n const made = yield* this.#updateNode(this.#rowNode(id), at, this.#made.childPendingFrom(node, at, pendingFrom),\n forceChildren || (at === 0 && firstLabelChanged));\n children = defined(children, 'a node\\'s children as laid out').set(at, made);\n }\n }\n } else if (order.length > 0) {\n for (const old of order) this.#remove(old);\n children = undefined;\n order = [];\n this.#rowSequenceChanged = true;\n }\n const published = branch !== undefined && before === branch.before && after === branch.after && children === branch.children\n ? branch : new Branch(before, children, after);\n this.#nodes[node.id] = {\n pendingFrom, order, position, before: before.length, after: after.length, rows: published.count, published,\n };\n if (this.#pace.spent(1 + before.length + after.length)) yield;\n return published;\n }\n\n // A node first laid out lies in one part with its subtree. Laid out again, it is split: its own rows, and a\n // part for each child holding the child's subtree \u2014 copied out, so that a later version holds only the rows\n // it shows.\n #split(id: number): Branch {\n const held = defined(this.#nodes[id], 'a node laid out');\n const published = defined(held.published, 'a node\\'s rows as published');\n if (published instanceof Branch) return published;\n const rows = published.rows;\n let children: Children | undefined;\n if (held.order.length > 0) {\n const parts: Part[] = [];\n let at = held.before;\n for (const childId of held.order) {\n const child = defined(this.#nodes[childId], 'a child laid out');\n const part = new FirstLayout(rows.slice(at, at + child.rows));\n child.published = part;\n parts.push(part);\n at += child.rows;\n }\n children = Children.of(parts, 0, parts.length);\n }\n const made = new Branch(rows.slice(0, held.before), children, rows.slice(rows.length - held.after));\n held.published = made;\n return made;\n }\n\n // A node's own rows as laid out again: each the row held for its key where it shows alike, so the Window\n // keeps that row's instance; the rows that are new or show otherwise are the label changes.\n #keep(made: PivotReportRow[], held: readonly PivotReportRow[] | undefined): readonly PivotReportRow[] {\n if (held === undefined) {\n // A node laid out for the first time: its rows are new.\n for (const row of made) this.#labels.push(row);\n return made;\n }\n let identical = held.length === made.length;\n for (let i = 0; i < made.length; i++) {\n const row = elementAt(made, i);\n const prior = held.find(candidate => candidate.key.equals(row.key));\n // Its Items spelt alike too: a row whose Item took another spelling stands for it as it is now spelt.\n if (prior !== undefined && prior.carriesValues === row.carriesValues && sameLabels(prior.labels, row.labels)\n && spelledAlike(prior.key, row.key)) made[i] = prior;\n else this.#labels.push(row);\n identical &&= held[i] === made[i];\n }\n return identical ? held : made;\n }\n\n #remove(id: number): void {\n const held = defined(this.#nodes[id], 'a node laid out');\n const published = defined(held.published, 'a node\\'s rows as published');\n if (published instanceof FirstLayout) {\n this.#removeFirst(id, published.rows, 0);\n return;\n }\n for (const row of published.before) this.#removed.push(row.key);\n for (const row of published.after) this.#removed.push(row.key);\n for (const child of held.order) this.#remove(child);\n this.#nodes[id] = undefined;\n }\n\n // A subtree as first laid out, within `rows` from `start`: its own rows, then its children's.\n #removeFirst(id: number, rows: readonly PivotReportRow[], start: number): void {\n const held = defined(this.#nodes[id], 'a node laid out');\n for (let i = start; i < start + held.before; i++) this.#removed.push(elementAt(rows, i).key);\n for (let i = start + held.rows - held.after; i < start + held.rows; i++) this.#removed.push(elementAt(rows, i).key);\n let at = start + held.before;\n for (const child of held.order) {\n const count = defined(this.#nodes[child], 'a child laid out').rows;\n this.#removeFirst(child, rows, at);\n at += count;\n }\n this.#nodes[id] = undefined;\n }\n}\n\n// Two keys of one row, whose Items are spelt alike.\n// A node's own rows appended to `rows` a piece at a time: a Sibling Window's Pending Rows may be a million.\nfunction* appended(rows: PivotReportRow[], own: readonly PivotReportRow[]): Generator<void, void> {\n yield* inPieces(own.length, 1, (from, to) => {\n for (let at = from; at < to; at++) rows.push(elementAt(own, at));\n });\n}\n\nfunction spelledAlike(a: PivotRowKey, b: PivotRowKey): boolean {\n return a.items.every((item, i) => item.kind === elementAt(b.items, i).kind && item.value === elementAt(b.items, i).value);\n}\n\nfunction sameLabels(a: readonly PivotRowLabel[], b: readonly PivotRowLabel[]): boolean {\n return a.length === b.length && a.every((label, i) => rowLabelsAlike(label, elementAt(b, i)));\n}\n\n", "// A report's computation (ADR-0153): the pass, the cube and the report laid out from it, kept up to date from\n// the Change Batches a Snapshot's source applies \u2014 each batch folded into the pass, and only the leaves, totals\n// and rows it touched written again. Every report it returns is immutable. The C# engine's\n// PivotComputationSession.\n//\n// Cancellation is heard only where the session's own state is whole, so a cancelled computation never costs the\n// next its incremental state. Before any of it changes, a cancellation stops the work and nothing is kept.\n// Folding the pending batches into the pass changes its working indexes in place: from the first batch folded,\n// the work goes on, still yielding between slices, until the cube and the report have followed and the result\n// is returned, and a cancellation that lands meanwhile is not heard. A new computation \u2014 a new question, a\n// batch the pass cannot fold, a Pivot Source's answer \u2014 and a report laid out afresh are built aside and adopted\n// together at the end, so cancelling one leaves the state before as it was. A result's changes are relative to\n// the result returned before it, whenever the cancellations landed.\n\nimport type { SnapshotChange } from '@ex-grid/data';\nimport type { PivotSourceRefusal } from '../cube/answer';\nimport { buildCubeSteps, cubeParts, type CubeBuild, type PivotCube } from '../cube/cube';\nimport { levelQueryForLayout, queriesEqual, queryForLayout, type PivotLevelWindowInput, type PivotQuery } from '../cube/query';\nimport { checkCubeHolds } from '../engine';\nimport { fieldMetas, type PivotField } from '../fields/pivot-field';\nimport { writePivotLayoutJson } from '../layout/layout-json';\nimport type { PivotLayout } from '../layout/pivot-layout';\nimport type { ResolvedOptions } from '../report/labels';\nimport { ReportBuilder, type PivotReport, type PivotReportRow, type PivotRowKey } from '../report/report';\nimport { AggregationPass, chunkRows } from '../source/aggregation-pass';\nimport type { FieldBinding } from '../source/binding';\nimport {\n queryRefusal, SnapshotPivotSource, snapshotSourceLink, type PivotSource, type SnapshotSourceLink,\n} from '../source/pivot-source';\nimport { Slicer, type CheckedSlicing } from '../source/slicing';\nimport { ComputationCube } from './cube';\nimport { ComputationReport } from './report';\n\n// The most Change Batches held for a pass while no Window asks for them; past it the pass is let go.\nconst pendingBound = 1024;\n\n// The most questions remembered as refused whole past the cap, newest first: a guard on memory, never on the data.\nconst windowedBound = 16;\n\n/** One complete computation, or the Pivot Source's refusal. */\nexport interface PivotComputationResult {\n /** The complete, immutable report; `undefined` with a refusal. */\n readonly report: PivotReport | undefined;\n /** Why no report was made. */\n readonly refusal: PivotSourceRefusal | undefined;\n /** Whether the report was laid out afresh \u2014 a new question, layout or options, or a computation begun again \u2014\n * so that its rows are to be taken whole rather than as the changes below. */\n readonly isReset: boolean;\n /** The rows the update added, or whose labels changed; none for a report laid out afresh. */\n readonly labelChanges: readonly PivotReportRow[];\n /** The keys of the rows the update took away. */\n readonly removedRows: readonly PivotRowKey[];\n /** Whether the rows' sequence moved from the result returned before. */\n readonly rowSequenceChanged: boolean;\n}\n\n/** What a computation is asked: the layout and its options, the cap on leaves, and how it is paced. */\nexport interface PivotComputationRequest {\n readonly layout: PivotLayout;\n readonly options: ResolvedOptions;\n /** The options written in one form: two that lay a report out alike are equal. */\n readonly optionsKey: string;\n readonly maxLeaves: number;\n /** How the work is paced. */\n readonly slicing: CheckedSlicing;\n /** The request's slices, which its signal cancels: the work built aside runs on them. */\n readonly slicer: Slicer;\n /** Asks a Pivot Source that names no changes again (ADR-0153). */\n readonly refreshData: boolean;\n /** Lays the layout out from the cube held, without the batches pending, where that cube holds it: a layout\n * gesture shows the data it was made on. */\n readonly preferHeld: boolean;\n /** Where the Sibling Windows start, for a Pivot Source that answers Level Aggregates (ADR-0370 section 3): asked\n * once the source refused the question whole past the cap, and from then on for that question. */\n readonly window?: PivotLevelWindowInput;\n}\n\ninterface Pending {\n readonly change: SnapshotChange;\n readonly bindings: ReadonlyMap<string, FieldBinding>;\n}\n\nfunction refused(refusal: PivotSourceRefusal, reset: boolean): PivotComputationResult {\n return Object.freeze({ report: undefined, refusal, isReset: reset, labelChanges: [], removedRows: [], rowSequenceChanged: false });\n}\n\n/** A report's computation over a Pivot Source it does not own. Asked one computation at a time. */\nexport class PivotComputationSession {\n readonly #source: PivotSource;\n readonly #fields: readonly PivotField[];\n readonly #link: SnapshotSourceLink | undefined;\n readonly #unwatch: (() => void) | undefined;\n #pending: Pending[] = [];\n #pass: AggregationPass | undefined;\n #bindings: ReadonlyMap<string, FieldBinding> | undefined;\n #computation: ComputationCube | undefined;\n // How many times a source that cannot name its changes said its data moved on, and how many of those the\n // cube held was asked after: a held cube older than a notice is not reused.\n #notices = 0;\n #noticesAnswered = 0;\n // The report last returned, and its structure: always laid out from the newest cube the session holds, so\n // the data held and the report shown from it are one.\n #report: PivotReport | undefined;\n #structure: ComputationReport | undefined;\n #layout: string | undefined;\n #options: string | undefined;\n // The questions without windows that the source refused past the cap, newest first: asked with windows from then on.\n #windowed: PivotQuery[] = [];\n #busy = false;\n #disposed = false;\n\n /** A computation over `source`, under `fields` \u2014 the source's own, or with the Order Keys a report's\n * policies give. */\n constructor(source: PivotSource, fields: readonly PivotField[]) {\n this.#source = source;\n this.#fields = fields;\n if (source instanceof SnapshotPivotSource) {\n const link = snapshotSourceLink(source);\n this.#link = link;\n this.#unwatch = link.watch((change, bindings) => {\n // With no pass held and none being made, the next computation reads the Snapshot whole.\n if (this.#pass === undefined && !this.#busy) return;\n this.#pending.push({ change, bindings });\n // Batches no Window asks for are not held without end: past a bound, the pass they would be\n // folded into is let go, and the next computation reads the Snapshot whole. A guard on memory,\n // never on the data.\n if (!this.#busy && this.#pending.length > pendingBound) {\n this.#pass = undefined;\n this.#computation = undefined;\n this.#pending = [];\n }\n });\n }\n }\n\n /** The newest cube the session holds \u2014 the one the report it last returned was laid out from \u2014 or\n * `undefined` before its first result. */\n get heldCube(): PivotCube | undefined {\n return this.#report?.cube;\n }\n\n /** Computes the newest complete report under the request's layout and options, or the Pivot Source's refusal.\n * Rejects with what a layout the cube cannot lay out throws, an Order Key's failure, and \u2014 before the state\n * held changes \u2014 the signal's reason once it is aborted. */\n async compute(request: PivotComputationRequest): Promise<PivotComputationResult> {\n if (this.#disposed) throw new Error('Internal: a computation session is used after it was disposed.');\n if (this.#busy) throw new Error('Internal: a computation session is asked one computation at a time.');\n this.#busy = true;\n // Set while the computation held is changed in place: a failure then \u2014 never a cancellation, which is\n // not heard there \u2014 leaves it half made, and it is dropped.\n const state = { inPlace: false };\n try {\n return await this.#compute(request, changing => {\n state.inPlace = changing;\n });\n } catch (error) {\n if (state.inPlace) this.#drop();\n throw error;\n } finally {\n this.#busy = false;\n // Disposed while it ran: what it made is dropped.\n if (this.#isDisposed()) this.#drop();\n }\n }\n\n async #compute(request: PivotComputationRequest, inPlace: (changing: boolean) => void): Promise<PivotComputationResult> {\n const { layout, options, maxLeaves, slicing } = request;\n // Where a cancellation is heard: work that changes nothing the session keeps.\n const aside = request.slicer;\n const signal = aside.signal;\n signal?.throwIfAborted();\n const source = this.#source;\n // A source that answers Level Aggregates is asked with the groups the layout shows (ADR-0370 section 3): it\n // answers with the leaves when they fit the cap, and with the groups' cells when they do not.\n const unwindowed = source.features.answersLevels ? levelQueryForLayout(layout, maxLeaves) : queryForLayout(layout, maxLeaves);\n // A source that answers Level Aggregates and refused the question whole past the cap is asked for windows of\n // the sets ordered by a value (ADR-0370 section 3); none is asked while the question fits.\n const windowed = request.window === undefined || !source.features.answersLevels ? undefined : levelQueryForLayout(layout, maxLeaves, request.window);\n const windowable = windowed?.levels?.rows.some(rule => rule.order !== undefined) === true;\n let query = windowable && this.#windowed.some(asked => queriesEqual(asked, unwindowed)) ? windowed : unwindowed;\n const layoutName = writePivotLayoutJson(layout);\n // Where it is not: the work that carries batches folded in place through to a whole state.\n let whole: Slicer | undefined;\n let cube: PivotCube;\n // A new computation, built aside and adopted with the report.\n let made: { readonly pass: AggregationPass; readonly bindings: ReadonlyMap<string, FieldBinding>; readonly computation: ComputationCube } | undefined;\n let updated = false;\n let answered = false;\n let noticesAsked = this.#noticesAnswered;\n const held = this.#report;\n const link = this.#link;\n if (request.preferHeld && held !== undefined && holdsAsked(held.cube, layout, query)) {\n cube = held.cube;\n } else if (link !== undefined) {\n const refusal = queryRefusal(source.fields, source.features, query);\n if (refusal !== undefined) return refused(refusal, false);\n const captured = link.capture();\n const changes = this.#pending.filter(pending => pending.change.after.version <= captured.snapshot.version);\n const pass = this.#pass;\n const computation = this.#computation;\n let incremental = pass !== undefined && computation !== undefined && held !== undefined && queriesEqual(pass.query, query);\n if (incremental && pass !== undefined && changes.some(pending => pending.change.after.version > pass.snapshot.version)) {\n inPlace(true);\n whole = new Slicer(slicing, undefined);\n for (const { change, bindings } of changes) {\n if (change.after.version <= pass.snapshot.version) continue;\n if (!pass.fold(change, bindings)) {\n // The batch reaches past what the pass read, or the leaves passed the cap: the pass may be\n // half folded, and is dropped before anything is awaited. The report held is whole and\n // stays; the question is asked afresh below.\n this.#pass = undefined;\n this.#computation = undefined;\n inPlace(false);\n incremental = false;\n break;\n }\n this.#bindings = bindings;\n }\n updated = incremental;\n }\n if (updated && pass !== undefined && computation !== undefined && whole !== undefined) {\n cube = await whole.run(computation.update(pass, link.versionOf(pass.snapshot)));\n pass.clearChanges();\n } else if (incremental && held !== undefined) {\n cube = held.cube;\n } else {\n const fresh = new AggregationPass(captured.snapshot, captured.bindings, query, captured.snapshot.recordKey !== undefined);\n for (let at = 0; at < fresh.rowCount;) {\n const to = Math.min(fresh.rowCount, at + chunkRows);\n if (!fresh.step(to)) break;\n at = to;\n await aside.step();\n }\n const answer = await aside.run(fresh.answerSteps(captured.version));\n if (answer.refusal !== undefined) return refused(answer.refusal, true);\n // The cube the engine makes, and the nodes it made for each leaf, which the computation starts from.\n let build: CubeBuild | undefined;\n cube = await aside.run(buildCubeSteps(query, answer, fieldMetas(this.#fields), undefined, b => {\n build = b;\n }));\n if (build === undefined) throw new Error('Internal: the cube was made without what its build made.');\n made = { pass: fresh, bindings: captured.bindings, computation: await aside.run(ComputationCube.create(cube, build, fresh)) };\n }\n } else if (!request.refreshData && this.#noticesAnswered === this.#notices && held !== undefined && holdsAsked(held.cube, layout, query)) {\n // A source that cannot name its changes is asked again for a refresh (ADR-0153), and once it says its\n // data moved on (ADR-0370 section 3).\n cube = held.cube;\n } else {\n answered = true;\n noticesAsked = this.#notices;\n // Refresh goes to the server, past the answer a fetching source folds batches into.\n if (request.refreshData) source.refresh?.();\n await aside.step();\n let answer = await source.aggregate(query, signal);\n signal?.throwIfAborted();\n if (answer.refusal?.kind === 'tooManyLeaves' && query === unwindowed && windowable) {\n this.#windowed = [unwindowed, ...this.#windowed.slice(0, windowedBound - 1)];\n query = windowed;\n await aside.step();\n answer = await source.aggregate(query, signal);\n signal?.throwIfAborted();\n }\n if (answer.refusal !== undefined) return refused(answer.refusal, true);\n cube = await aside.run(buildCubeSteps(query, answer, fieldMetas(this.#fields)));\n }\n const relayout = made !== undefined || answered || held === undefined || this.#structure === undefined\n || this.#layout !== layoutName || this.#options !== request.optionsKey;\n let report: PivotReport;\n let structure: ComputationReport;\n if (relayout) {\n // Laid out afresh, aside: a cancellation drops it, unless the batches it follows were folded in place,\n // which it then completes.\n checkCubeHolds(cube, layout);\n if (!updated) signal?.throwIfAborted();\n structure = new ComputationReport();\n report = await (updated && whole !== undefined ? whole : aside).run(structure.initialize(new ReportBuilder(cube, layout, options, true)));\n } else if (updated && whole !== undefined && this.#structure !== undefined && this.#computation !== undefined) {\n structure = this.#structure;\n report = await whole.run(structure.update(held, cube, this.#computation));\n } else if (this.#structure !== undefined) {\n structure = this.#structure;\n report = held;\n } else {\n throw new Error('Internal: a computation found no report to keep.');\n }\n\n // Adopted together; nothing below awaits.\n inPlace(false);\n if (made !== undefined) {\n this.#pass = made.pass;\n this.#bindings = made.bindings;\n this.#computation = made.computation;\n }\n const kept = this.#pass;\n if (link !== undefined && kept !== undefined && this.#bindings !== undefined) {\n link.remember(kept.snapshot, this.#bindings);\n this.#pending = this.#pending.filter(pending => pending.change.after.version > kept.snapshot.version);\n }\n this.#report = report;\n this.#structure = structure;\n this.#layout = layoutName;\n this.#noticesAnswered = noticesAsked;\n this.#options = request.optionsKey;\n const changes = updated && !relayout;\n return Object.freeze({\n report,\n refusal: undefined,\n isReset: relayout,\n labelChanges: changes ? Object.freeze([...structure.labelChanges]) : [],\n removedRows: changes ? Object.freeze([...structure.removedRows]) : [],\n rowSequenceChanged: relayout || (updated && structure.rowSequenceChanged),\n });\n }\n\n #drop(): void {\n this.#windowed = [];\n this.#pass = undefined;\n this.#bindings = undefined;\n this.#computation = undefined;\n this.#report = undefined;\n this.#structure = undefined;\n this.#layout = undefined;\n this.#options = undefined;\n }\n\n /** Tells the session that a source that cannot name its changes said its data moved on: the next\n * computation asks it again rather than lay the held cube out. */\n sourceMoved(): void {\n this.#notices++;\n }\n\n /** Stops hearing changes and lets the computation go; the Pivot Source stays. */\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#unwatch?.();\n this.#pending = [];\n if (!this.#busy) this.#drop();\n }\n\n // Read through a call: a computation awaits, and the session may be disposed meanwhile.\n #isDisposed(): boolean {\n return this.#disposed;\n }\n}\n\n// Whether a cube held answers the question a layout asks: it holds the layout under the same cap, and a cube of\n// Sibling Windows was asked for them where this question asks \u2014 the same orders, collapse and starts.\nfunction holdsAsked(cube: PivotCube, layout: PivotLayout, query: PivotQuery): boolean {\n return cube.holds(layout) && cube.query.maxLeaves === query.maxLeaves && (cubeParts(cube).windows.size === 0 || queriesEqual(cube.query, query));\n}\n"],
|
|
5
|
+
"mappings": "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,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,IAAI,CAAC;AAAA,EACpB,CAAC,KAAO,KAAO,IAAI,CAAC;AAAA,EACpB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,OAAO,CAAC;AAAA,EACvB,CAAC,KAAO,KAAO,MAAM,CAAC;AAAA,EACtB,CAAC,KAAO,KAAO,K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AAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;AAAA;AAAA,EACV,CAAC,OAAQ,CAAC;A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",
|
|
6
|
+
"names": ["showValuesAs", "refused", "name", "buffer", "digits", "exact", "zero", "within", "badFormat", "ticksPerDay", "digits", "exact", "column", "showValuesAs", "form", "digits", "name", "entries", "version", "name", "showValuesAs", "names", "ticksOf", "dateParts", "name", "column", "ticksOf", "scientific", "digits", "limit", "ticksPerDay", "key", "ascending", "names", "must", "orderOf", "named", "axes", "path", "named", "restSides", "grouped", "name", "named", "axes", "cellKey", "made", "compare", "exact", "name", "read", "windowOf", "column", "keyOf", "compare", "column", "sameFields", "axes", "made", "checked", "column", "name", "made", "run", "children", "keys", "checked", "column", "form", "declared", "name", "column", "read", "made", "describe", "must", "column", "defined", "item", "exact", "wide", "refused", "axes", "carried", "keys", "blank", "path", "keys", "keyOf", "itemOf", "made", "axes", "version", "answerOf", "axes", "read", "name", "keys", "version", "keys", "same", "decimalText", "fieldTypes", "dateParts", "keyJson", "keys", "path", "decimalText", "name", "leavesOf", "axes", "optionalString", "limit", "string", "partsOf", "valuesOf", "exactOf", "exact", "ticksOf", "names", "declared", "column", "defined", "column", "column", "highlightMs", "decimalText", "column", "read", "itemOf", "made", "column", "version", "made", "refused", "made", "changes", "column", "version", "names", "name", "decimalText", "exact", "keys", "made", "sameRows", "limit", "span", "path", "same", "refused"]
|
|
7
|
+
}
|