@ricsam/formula-engine 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/cjs/core/autofill-utils.cjs +68 -2
  2. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  3. package/dist/cjs/core/engine-snapshot.cjs +2 -2
  4. package/dist/cjs/core/engine-snapshot.cjs.map +3 -3
  5. package/dist/cjs/core/engine.cjs +47 -3
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/copy-manager.cjs +163 -14
  8. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  9. package/dist/cjs/core/managers/range-metadata-manager.cjs +135 -0
  10. package/dist/cjs/core/managers/range-metadata-manager.cjs.map +10 -0
  11. package/dist/cjs/core/types.cjs.map +1 -1
  12. package/dist/cjs/package.json +1 -1
  13. package/dist/mjs/core/autofill-utils.mjs +68 -2
  14. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  15. package/dist/mjs/core/engine-snapshot.mjs +2 -2
  16. package/dist/mjs/core/engine-snapshot.mjs.map +3 -3
  17. package/dist/mjs/core/engine.mjs +47 -3
  18. package/dist/mjs/core/engine.mjs.map +3 -3
  19. package/dist/mjs/core/managers/copy-manager.mjs +163 -14
  20. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  21. package/dist/mjs/core/managers/range-metadata-manager.mjs +95 -0
  22. package/dist/mjs/core/managers/range-metadata-manager.mjs.map +10 -0
  23. package/dist/mjs/core/types.mjs.map +1 -1
  24. package/dist/mjs/package.json +1 -1
  25. package/dist/types/core/autofill-utils.d.ts +7 -1
  26. package/dist/types/core/engine-snapshot.d.ts +4 -2
  27. package/dist/types/core/engine.d.ts +32 -1
  28. package/dist/types/core/managers/copy-manager.d.ts +11 -1
  29. package/dist/types/core/managers/range-metadata-manager.d.ts +22 -0
  30. package/dist/types/core/types.d.ts +19 -6
  31. package/package.json +1 -1
@@ -16,6 +16,7 @@ import { DependencyManager } from "./managers/dependency-manager.mjs";
16
16
  import { StyleManager } from "./managers/style-manager.mjs";
17
17
  import { CopyManager } from "./managers/copy-manager.mjs";
18
18
  import { ReferenceManager } from "./managers/reference-manager.mjs";
19
+ import { RangeMetadataManager } from "./managers/range-metadata-manager.mjs";
19
20
  import {
20
21
  ENGINE_SNAPSHOT_VERSION
21
22
  } from "./engine-snapshot.mjs";
@@ -47,6 +48,7 @@ class FormulaEngine {
47
48
  autoFillManager;
48
49
  dependencyManager;
49
50
  styleManager;
51
+ rangeMetadataManager;
50
52
  copyManager;
51
53
  referenceManager;
52
54
  _workbookManager;
@@ -57,6 +59,7 @@ class FormulaEngine {
57
59
  _autoFillManager;
58
60
  _dependencyManager;
59
61
  _styleManager;
62
+ _rangeMetadataManager;
60
63
  constructor() {
61
64
  this.eventManager = new EventManager;
62
65
  this.workbookManager = new WorkbookManager;
@@ -67,8 +70,9 @@ class FormulaEngine {
67
70
  const formulaEvaluator = new FormulaEvaluator(this.tableManager, this.dependencyManager, this.namedExpressionManager);
68
71
  this.evaluationManager = new EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
69
72
  this.styleManager = new StyleManager(this.evaluationManager);
70
- this.copyManager = new CopyManager(this.workbookManager, this.evaluationManager, this.styleManager);
71
- this.autoFillManager = new AutoFill(this.workbookManager, this.styleManager);
73
+ this.rangeMetadataManager = new RangeMetadataManager;
74
+ this.copyManager = new CopyManager(this.workbookManager, this.evaluationManager, this.styleManager, this.rangeMetadataManager);
75
+ this.autoFillManager = new AutoFill(this.workbookManager, this.styleManager, this.rangeMetadataManager);
72
76
  this.referenceManager = new ReferenceManager;
73
77
  this._workbookManager = this.workbookManager;
74
78
  this._namedExpressionManager = this.namedExpressionManager;
@@ -78,6 +82,7 @@ class FormulaEngine {
78
82
  this._autoFillManager = this.autoFillManager;
79
83
  this._dependencyManager = this.dependencyManager;
80
84
  this._styleManager = this.styleManager;
85
+ this._rangeMetadataManager = this.rangeMetadataManager;
81
86
  }
82
87
  static buildEmpty() {
83
88
  return new FormulaEngine;
@@ -189,6 +194,30 @@ class FormulaEngine {
189
194
  getWorkbookMetadata(workbookName) {
190
195
  return this.workbookManager.getWorkbookMetadata(workbookName);
191
196
  }
197
+ addRangeMetadata(metadata) {
198
+ const id = this.rangeMetadataManager.addRangeMetadata(metadata);
199
+ this.emitUpdate();
200
+ return id;
201
+ }
202
+ removeRangeMetadata(id) {
203
+ const removed = this.rangeMetadataManager.removeRangeMetadata(id);
204
+ if (removed) {
205
+ this.emitUpdate();
206
+ }
207
+ }
208
+ getAllRangeMetadata() {
209
+ return this.rangeMetadataManager.getAllRangeMetadata();
210
+ }
211
+ getRangeMetadataForCell(address) {
212
+ return this.rangeMetadataManager.getRangeMetadataForCell(address);
213
+ }
214
+ getRangeMetadataIntersectingWithRange(range) {
215
+ return this.rangeMetadataManager.getRangeMetadataIntersectingWithRange(range);
216
+ }
217
+ clearRangeMetadata(range) {
218
+ this.rangeMetadataManager.clearRangeMetadataInRange(range);
219
+ this.emitUpdate();
220
+ }
192
221
  createRef(address) {
193
222
  return this.referenceManager.createRef(address);
194
223
  }
@@ -649,6 +678,7 @@ class FormulaEngine {
649
678
  this.namedExpressionManager.removeSheet(opts);
650
679
  this.tableManager.removeSheet(opts);
651
680
  this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);
681
+ this.rangeMetadataManager.removeSheetRangeMetadata(opts.workbookName, opts.sheetName);
652
682
  this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);
653
683
  this.emitMutation({
654
684
  touchedCells: [],
@@ -662,6 +692,7 @@ class FormulaEngine {
662
692
  this.namedExpressionManager.renameSheet(opts);
663
693
  this.tableManager.updateTablesForSheetRename(opts);
664
694
  this.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
695
+ this.rangeMetadataManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
665
696
  const changedCells = this.workbookManager.updateAllFormulas((formula) => renameSheetInFormula({
666
697
  formula,
667
698
  oldSheetName: opts.sheetName,
@@ -754,6 +785,7 @@ class FormulaEngine {
754
785
  this.namedExpressionManager.removeWorkbook(workbookName);
755
786
  this.tableManager.removeWorkbook(workbookName);
756
787
  this.styleManager.removeWorkbookStyles(workbookName);
788
+ this.rangeMetadataManager.removeWorkbookRangeMetadata(workbookName);
757
789
  this.referenceManager.invalidateWorkbook(workbookName);
758
790
  this.emitMutation({
759
791
  touchedCells: [],
@@ -846,6 +878,14 @@ class FormulaEngine {
846
878
  });
847
879
  }
848
880
  }
881
+ for (const metadata of this.rangeMetadataManager.getAllRangeMetadata()) {
882
+ if (metadata.areas.some((area) => area.workbookName === fromWorkbookName)) {
883
+ this.rangeMetadataManager.addRangeMetadata({
884
+ metadata: metadata.metadata,
885
+ areas: metadata.areas.map((area) => area.workbookName === fromWorkbookName ? { ...area, workbookName: toWorkbookName } : area)
886
+ });
887
+ }
888
+ }
849
889
  this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => renameWorkbookInFormula({
850
890
  formula,
851
891
  oldWorkbookName: fromWorkbookName,
@@ -862,6 +902,7 @@ class FormulaEngine {
862
902
  this.namedExpressionManager.renameWorkbook(opts);
863
903
  this.tableManager.updateTablesForWorkbookRename(opts);
864
904
  this.styleManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
905
+ this.rangeMetadataManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
865
906
  const changedCells = this.workbookManager.updateAllFormulas((formula) => renameWorkbookInFormula({
866
907
  formula,
867
908
  oldWorkbookName: opts.workbookName,
@@ -939,6 +980,7 @@ class FormulaEngine {
939
980
  tables: this.tableManager.tables,
940
981
  conditionalStyles: this.styleManager.getAllConditionalStyles(),
941
982
  cellStyles: this.styleManager.getAllCellStyles(),
983
+ rangeMetadata: this.rangeMetadataManager.getAllRangeMetadata(),
942
984
  references: this.referenceManager.getAllReferences()
943
985
  };
944
986
  }
@@ -955,6 +997,7 @@ class FormulaEngine {
955
997
  namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),
956
998
  table: this.tableManager.toSnapshot(),
957
999
  style: this.styleManager.toSnapshot(),
1000
+ rangeMetadata: this.rangeMetadataManager.toSnapshot(),
958
1001
  reference: this.referenceManager.toSnapshot(),
959
1002
  dependency: evaluationSnapshots.dependency,
960
1003
  cache: evaluationSnapshots.cache
@@ -1003,6 +1046,7 @@ class FormulaEngine {
1003
1046
  this.namedExpressionManager.restoreFromSnapshot(deserialized.managers.namedExpression);
1004
1047
  this.tableManager.restoreFromSnapshot(deserialized.managers.table);
1005
1048
  this.styleManager.restoreFromSnapshot(deserialized.managers.style);
1049
+ this.rangeMetadataManager.restoreFromSnapshot(deserialized.managers.rangeMetadata);
1006
1050
  this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);
1007
1051
  this.dependencyManager.restoreFromSnapshot({
1008
1052
  dependency: deserialized.managers.dependency,
@@ -1015,4 +1059,4 @@ export {
1015
1059
  FormulaEngine
1016
1060
  };
1017
1061
 
1018
- //# debugId=571CAE65F6B93C1664756E2164756E21
1062
+ //# debugId=C4AB97ECFD760E2E64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/engine.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type NamedExpression,\n type RangeAddress,\n type ReplaceChange,\n type ReplaceTarget,\n type SearchMatch,\n type SearchOptions,\n type SerializedCellValue,\n type Sheet,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.mjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.mjs\";\nimport { AutoFill } from \"./autofill-utils.mjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.mjs\";\nimport { deserialize, serialize } from \"./map-serializer.mjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.mjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.mjs\";\nimport { renameTableInFormula } from \"./table-renamer.mjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.mjs\";\nimport { getCellReference, parseCellReference } from \"./utils.mjs\";\nimport { CacheManager } from \"./managers/cache-manager.mjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.mjs\";\nimport { TableManager } from \"./managers/table-manager.mjs\";\nimport { EventManager } from \"./managers/event-manager.mjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.mjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.mjs\";\nimport { StyleManager } from \"./managers/style-manager.mjs\";\nimport { CopyManager } from \"./managers/copy-manager.mjs\";\nimport { ReferenceManager } from \"./managers/reference-manager.mjs\";\nimport {\n ENGINE_SNAPSHOT_VERSION,\n type EngineSnapshot,\n} from \"./engine-snapshot.mjs\";\nimport {\n buildFormulaTouchedCells,\n buildSheetContentTouchedCells,\n buildTableContextChangedCells,\n buildTableTouchedCells,\n buildTouchedCells,\n captureCellContents,\n getFiniteRangeAddresses,\n getMutationAddressKey,\n getNamedExpressionScopeResourceKeys,\n mergeTouchedCells,\n type MutationInvalidation,\n} from \"./mutation-invalidation.mjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"./resource-keys.mjs\";\n\ntype Metadata = {\n cell?: unknown;\n sheet?: unknown;\n workbook?: unknown;\n};\n\ntype MetadataType<\n TMetadata extends Metadata,\n TKey extends keyof Metadata\n> = TMetadata[TKey];\n\n /**\n * Main FormulaEngine class\n * @template TMetadata - Consumer-defined metadata shape with optional cell, sheet, and workbook entries.\n */\nexport class FormulaEngine<TMetadata extends Metadata = Metadata> {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private copyManager: CopyManager;\n private referenceManager: ReferenceManager;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n\n constructor() {\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(this.evaluationManager);\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager\n );\n\n this.referenceManager = new ReferenceManager();\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n }\n\n /**\n * Static factory method to build an empty engine\n * @template TMetadata - Consumer-defined metadata shape with optional cell, sheet, and workbook entries.\n */\n static buildEmpty<TMetadata extends Metadata = Metadata>() {\n return new FormulaEngine<TMetadata>();\n }\n\n private emitMutation(footprint: MutationInvalidation): void {\n this.evaluationManager.invalidateFromMutation(footprint);\n this.eventManager.emitUpdate();\n }\n\n private emitUpdate(): void {\n this.eventManager.emitUpdate();\n }\n\n private getExistingSheetContent(opts: {\n workbookName: string;\n sheetName: string;\n }): Map<string, SerializedCellValue> | undefined {\n const sheet = this.workbookManager.getSheet(opts);\n return sheet ? new Map(sheet.content) : undefined;\n }\n\n private getWorkbookResourceKeys(workbookName: string): string[] {\n const resourceKeys = new Set<string>([getWorkbookResourceKey(workbookName)]);\n\n for (const sheetName of this.workbookManager\n .getWorkbooks()\n .get(workbookName)\n ?.sheets.keys() ?? []) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n }\n\n for (const tableName of this.tableManager.getTables(workbookName).keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n\n const namedExpressions = this.namedExpressionManager.getNamedExpressions();\n for (const name of namedExpressions.workbookExpressions\n .get(workbookName)\n ?.keys() ?? []) {\n resourceKeys.add(\n getNamedExpressionResourceKey({ expressionName: name, workbookName })\n );\n }\n for (const [sheetName, expressions] of namedExpressions.sheetExpressions.get(\n workbookName\n ) ?? []) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n for (const name of expressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n }\n\n return Array.from(resourceKeys);\n }\n\n private getSheetResourceKeys(opts: {\n workbookName: string;\n sheetName: string;\n }): string[] {\n const resourceKeys = new Set<string>([\n getWorkbookResourceKey(opts.workbookName),\n getSheetResourceKey(opts),\n ]);\n\n for (const [tableName, table] of this.tableManager.getTables(\n opts.workbookName\n )) {\n if (table.sheetName === opts.sheetName) {\n resourceKeys.add(\n getTableResourceKey({ workbookName: opts.workbookName, tableName })\n );\n }\n }\n\n const sheetExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .sheetExpressions.get(opts.workbookName)\n ?.get(opts.sheetName);\n for (const name of sheetExpressions?.keys() ?? []) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n );\n }\n\n return Array.from(resourceKeys);\n }\n\n private assertNamedExpressionScopeExists(opts: {\n workbookName?: string;\n sheetName?: string;\n }): void {\n if (opts.sheetName && !opts.workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (!opts.workbookName) {\n return;\n }\n\n if (!this.workbookManager.getWorkbooks().has(opts.workbookName)) {\n throw new Error(`Workbook not found: ${opts.workbookName}`);\n }\n\n if (\n opts.sheetName &&\n !this.workbookManager.getSheet({\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n ) {\n throw new Error(`Sheet not found: ${opts.sheetName}`);\n }\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n /**\n * Set metadata for a cell\n * Metadata can contain rich text, links, comments, or any consumer-defined data\n */\n setCellMetadata(\n address: CellAddress,\n metadata: MetadataType<TMetadata, \"cell\"> | undefined\n ): void {\n this.workbookManager.setCellMetadata(address, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a cell\n */\n getCellMetadata(\n address: CellAddress\n ): MetadataType<TMetadata, \"cell\"> | undefined {\n const metadata = this.workbookManager.getCellMetadata(address);\n return metadata as MetadataType<TMetadata, \"cell\"> | undefined;\n }\n\n /**\n * Get all cell metadata for a sheet (serialized as Map)\n */\n getSheetMetadataSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, MetadataType<TMetadata, \"sheet\">> {\n return this.workbookManager.getSheetMetadataSerialized(opts) as Map<\n string,\n MetadataType<TMetadata, \"sheet\">\n >;\n }\n\n /**\n * Set metadata for a sheet\n * Sheet metadata can contain text boxes, frozen panes, print settings, or any consumer-defined data\n */\n setSheetMetadata(\n opts: { workbookName: string; sheetName: string },\n metadata: MetadataType<TMetadata, \"sheet\">\n ): void {\n this.workbookManager.setSheetMetadata(opts, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a sheet\n */\n getSheetMetadata(opts: {\n workbookName: string;\n sheetName: string;\n }): MetadataType<TMetadata, \"sheet\"> | undefined {\n return this.workbookManager.getSheetMetadata(opts) as\n | MetadataType<TMetadata, \"sheet\">\n | undefined;\n }\n\n /**\n * Set metadata for a workbook\n * Workbook metadata can contain themes, document properties, settings, or any consumer-defined data\n */\n setWorkbookMetadata(\n workbookName: string,\n metadata: MetadataType<TMetadata, \"workbook\">\n ): void {\n this.workbookManager.setWorkbookMetadata(workbookName, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a workbook\n */\n getWorkbookMetadata(\n workbookName: string\n ): MetadataType<TMetadata, \"workbook\"> | undefined {\n return this.workbookManager.getWorkbookMetadata(workbookName) as\n | MetadataType<TMetadata, \"workbook\">\n | undefined;\n }\n\n //#endregion\n\n //#region Reference Tracking\n /**\n * Create a tracked reference to a range\n * Returns a stable UUID that can be used to retrieve the address later\n * The reference automatically updates when sheets/workbooks are renamed\n */\n createRef(address: RangeAddress): string {\n return this.referenceManager.createRef(address);\n }\n\n /**\n * Get the current address for a tracked reference\n * Returns undefined if reference doesn't exist or has been invalidated\n */\n getRefAddress(refId: string): RangeAddress | undefined {\n return this.referenceManager.getRefAddress(refId);\n }\n\n /**\n * Delete a tracked reference\n * Returns true if the reference was deleted, false if it didn't exist\n */\n deleteRef(refId: string): boolean {\n return this.referenceManager.deleteRef(refId);\n }\n\n /**\n * Get all invalid reference IDs\n * Useful for cleanup after sheet/workbook deletions\n */\n getInvalidRefs(): string[] {\n return this.referenceManager.getInvalidRefs();\n }\n //#endregion\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string,\n cellAddress: CellAddress\n ): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.assertNamedExpressionScopeExists(opts);\n this.namedExpressionManager.addNamedExpression(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n\n removeNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n const removed = this.namedExpressionManager.removeNamedExpression(opts);\n if (removed) {\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n }\n\n /**\n * Check if a named expression exists\n */\n hasNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n const scope =\n opts.sheetName && opts.workbookName\n ? {\n type: \"sheet\" as const,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }\n : opts.workbookName\n ? { type: \"workbook\" as const, workbookName: opts.workbookName }\n : { type: \"global\" as const };\n\n return !!this.namedExpressionManager.getNamedExpression({\n name: opts.expressionName,\n scope,\n });\n }\n\n updateNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.namedExpressionManager.updateNamedExpression(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n\n renameNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): void {\n this.namedExpressionManager.renameNamedExpression(opts);\n\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameNamedExpressionInFormula(\n formula,\n opts.expressionName,\n opts.newName\n )\n );\n\n const changedNamedExpressions =\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameNamedExpressionInFormula(\n formula,\n opts.expressionName,\n opts.newName\n )\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: [\n getNamedExpressionResourceKey({\n expressionName: opts.expressionName,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }),\n getNamedExpressionResourceKey({\n expressionName: opts.newName,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }),\n ...changedNamedExpressions,\n ],\n });\n }\n\n setNamedExpressions(\n opts: (\n | { type: \"global\" }\n | { type: \"sheet\"; sheetName: string; workbookName: string }\n | { type: \"workbook\"; workbookName: string }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n const allExpressions = this.namedExpressionManager.getNamedExpressions();\n let previousExpressions: Map<string, NamedExpression> | undefined;\n\n if (opts.type === \"global\") {\n previousExpressions = new Map(allExpressions.globalExpressions);\n } else if (opts.type === \"workbook\") {\n previousExpressions = new Map(\n allExpressions.workbookExpressions.get(opts.workbookName) || []\n );\n } else {\n const sheetExpressions = allExpressions.sheetExpressions\n .get(opts.workbookName)\n ?.get(opts.sheetName);\n previousExpressions = new Map(sheetExpressions || []);\n }\n\n this.namedExpressionManager.setNamedExpressions(opts);\n\n const scope =\n opts.type === \"global\"\n ? {}\n : opts.type === \"workbook\"\n ? { workbookName: opts.workbookName }\n : {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n };\n\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [\n ...getNamedExpressionScopeResourceKeys(\n previousExpressions.keys(),\n scope\n ),\n ...getNamedExpressionScopeResourceKeys(opts.expressions.keys(), scope),\n ],\n });\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }): void {\n const table = this.tableManager.addTable({\n ...props,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n this.emitMutation({\n touchedCells: buildTableTouchedCells(this.workbookManager, [table]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [table]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: props.workbookName,\n tableName: props.tableName,\n }),\n ],\n });\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ): void {\n const oldTable = this.tableManager.getTable({\n workbookName,\n name: names.oldName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n this.tableManager.renameTable(workbookName, names);\n\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n const changedNamedExpressions =\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n const newTable = this.tableManager.getTable({\n workbookName,\n name: names.newName,\n });\n\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, [oldTableSnapshot]),\n buildTableTouchedCells(this.workbookManager, [newTable]),\n buildFormulaTouchedCells(changedCells)\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot, newTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName,\n tableName: names.oldName,\n }),\n getTableResourceKey({\n workbookName,\n tableName: names.newName,\n }),\n ...changedNamedExpressions,\n ],\n });\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }): void {\n const oldTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n this.tableManager.updateTable({\n ...opts,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n const newTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, [oldTableSnapshot]),\n buildTableTouchedCells(this.workbookManager, [newTable])\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot, newTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: opts.workbookName,\n tableName: opts.tableName,\n }),\n ],\n });\n }\n\n removeTable(opts: { tableName: string; workbookName: string }): void {\n const oldTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n const found = this.tableManager.removeTable(opts);\n if (found) {\n this.emitMutation({\n touchedCells: buildTableTouchedCells(this.workbookManager, [\n oldTableSnapshot,\n ]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: opts.workbookName,\n tableName: opts.tableName,\n }),\n ],\n });\n }\n }\n\n private getAllTables(): TableDefinition[] {\n return Array.from(this.tableManager.tables.values()).flatMap((tables) =>\n Array.from(tables.values()).map((table) => ({\n ...table,\n headers: new Map(table.headers),\n }))\n );\n }\n\n /**\n * Check if a table exists\n */\n hasTable(opts: { tableName: string; workbookName: string }): boolean {\n return !!this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n /**\n * Get a table definition by name\n */\n getTable(opts: {\n tableName: string;\n workbookName: string;\n }): TableDefinition | undefined {\n return this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>): void {\n const oldTables = this.getAllTables();\n const newTables = Array.from(tables.values()).flatMap((workbookTables) =>\n Array.from(workbookTables.values())\n );\n const resourceKeys = new Set<string>();\n for (const table of [...oldTables, ...newTables]) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName: table.workbookName,\n tableName: table.name,\n })\n );\n }\n\n this.tableManager.resetTables(tables);\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, oldTables),\n buildTableTouchedCells(this.workbookManager, newTables)\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [...oldTables, ...newTables]\n ),\n resourceKeys: Array.from(resourceKeys),\n });\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.styleManager.addConditionalStyle(style);\n this.emitUpdate();\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): void {\n const removed = this.styleManager.removeConditionalStyle(\n workbookName,\n index\n );\n if (removed) {\n this.emitUpdate();\n }\n }\n\n /**\n * Get the count of conditional styles for a workbook\n */\n getConditionalStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllConditionalStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Get all cell styles (for testing and serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return this.styleManager.getAllCellStyles();\n }\n\n /**\n * Get all conditional styles (for testing and serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return this.styleManager.getAllConditionalStyles();\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.styleManager.addCellStyle(style);\n this.emitUpdate();\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): void {\n const removed = this.styleManager.removeCellStyle(workbookName, index);\n if (removed) {\n this.emitUpdate();\n }\n }\n\n /**\n * Get the count of direct cell styles for a workbook\n */\n getCellStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllCellStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.styleManager.clearCellStyles(range);\n this.emitUpdate();\n }\n\n //#endregion\n\n //#region Copy/Paste\n private getTopLeftCell(cells: CellAddress[]): CellAddress {\n let topLeft = cells[0]!;\n for (const cell of cells) {\n if (\n cell.rowIndex < topLeft.rowIndex ||\n (cell.rowIndex === topLeft.rowIndex &&\n cell.colIndex < topLeft.colIndex)\n ) {\n topLeft = cell;\n }\n }\n return topLeft;\n }\n\n private dedupeAddresses(addresses: CellAddress[]): CellAddress[] {\n return Array.from(\n new Map(addresses.map((address) => [getMutationAddressKey(address), address]))\n .values()\n );\n }\n\n private getPasteTouchedAddresses(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): CellAddress[] {\n if (source.length === 0) {\n return [];\n }\n\n const topLeft = this.getTopLeftCell(source);\n const colOffset = target.colIndex - topLeft.colIndex;\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const targetCells = source.map((sourceCell) => ({\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n }));\n\n return this.dedupeAddresses(\n options.cut ? [...source, ...targetCells] : targetCells\n );\n }\n\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (source.length === 0) {\n return;\n }\n\n const touchedAddresses = this.getPasteTouchedAddresses(\n source,\n target,\n options\n );\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.copyManager.pasteCells(source, target, options);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n *\n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n *\n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n const touchedAddresses = this.dedupeAddresses([\n ...targetRanges.flatMap((targetRange) =>\n getFiniteRangeAddresses(targetRange)\n ),\n ...(options.cut ? getFiniteRangeAddresses(seedRange) : []),\n ]);\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.copyManager.fillAreas(seedRange, targetRanges, options);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n *\n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n *\n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // If cut operation, always use pasteCells (never fillAreas)\n // Cut should be a simple move operation, not a fill\n if (options.cut === true) {\n for (const area of pasteSelection.areas) {\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: area.start.col,\n rowIndex: area.start.row,\n };\n this.pasteCells(sourceCells, target, options);\n }\n return;\n }\n\n // For copy operations (not cut), use smart paste/fill logic\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol =\n area.end.col.type === \"number\" ? area.end.col.value : pasteStartCol;\n const pasteEndRow =\n area.end.row.type === \"number\" ? area.end.row.value : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n\n /**\n * Move a single cell to a new location\n * Updates all formula references that point to the moved cell\n *\n * @param source - The cell to move\n * @param target - The destination cell address\n *\n * @example\n * // Move A1 to D5. If B1 contains =A1, it will be updated to =D5\n * engine.moveCell(\n * { workbookName, sheetName, colIndex: 0, rowIndex: 0 },\n * { workbookName, sheetName, colIndex: 3, rowIndex: 4 }\n * );\n */\n moveCell(source: CellAddress, target: CellAddress): void {\n this.pasteCells([source], target, {\n cut: true,\n type: \"formula\",\n include: \"all\",\n });\n }\n\n /**\n * Move a range of cells to a new location\n * Updates all formula references that point to the moved cells\n *\n * @param sourceRange - The range to move\n * @param target - The top-left destination cell address\n *\n * @example\n * // Move A1:D5 to F10. If E1 contains =SUM(A1:D5), it will be updated to =SUM(F10:I14)\n * engine.moveRange(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 3 }, row: { type: \"number\", value: 4 } }\n * }\n * },\n * { workbookName, sheetName, colIndex: 5, rowIndex: 9 }\n * );\n */\n moveRange(sourceRange: RangeAddress, target: CellAddress): void {\n const cells = this.copyManager.expandRangeToCells(sourceRange);\n this.pasteCells(cells, target, {\n cut: true,\n type: \"formula\",\n include: \"all\",\n });\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }): Sheet {\n const sheet = this.workbookManager.addSheet(opts);\n this.namedExpressionManager.addSheet(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getSheetResourceKey(opts)],\n });\n return sheet;\n }\n\n createSheet(opts: {\n workbookName: string;\n sheetName?: string;\n baseName?: string;\n }): Sheet {\n const sheetName =\n opts.sheetName ??\n this.workbookManager.getNextAvailableSheetName(\n opts.workbookName,\n opts.baseName\n );\n\n return this.addSheet({\n workbookName: opts.workbookName,\n sheetName,\n });\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }): void {\n const resourceKeys = this.getSheetResourceKeys(opts);\n this.workbookManager.removeSheet(opts);\n this.namedExpressionManager.removeSheet(opts);\n this.tableManager.removeSheet(opts);\n this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);\n this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"sheet\", ...opts }],\n });\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n const oldResourceKeys = this.getSheetResourceKeys(opts);\n\n this.workbookManager.renameSheet(opts);\n this.namedExpressionManager.renameSheet(opts);\n this.tableManager.updateTablesForSheetRename(opts);\n this.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n this.referenceManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: Array.from(\n new Set([\n ...oldResourceKeys,\n ...this.getSheetResourceKeys({\n workbookName: opts.workbookName,\n sheetName: opts.newSheetName,\n }),\n ])\n ),\n });\n }\n\n /**\n * Check if a sheet exists\n */\n hasSheet(opts: { workbookName: string; sheetName: string }): boolean {\n return !!this.workbookManager.getSheet(opts);\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getOrderedSheets(workbookName: string) {\n return this.workbookManager.getOrderedSheets(workbookName);\n }\n\n getOrderedSheetNames(workbookName: string) {\n return this.workbookManager.getOrderedSheetNames(workbookName);\n }\n\n getNextAvailableSheetName(workbookName: string, baseName?: string) {\n return this.workbookManager.getNextAvailableSheetName(\n workbookName,\n baseName\n );\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n /**\n * Search raw stored string content without evaluating cell values.\n */\n search(\n query: string,\n options?: SearchOptions\n ): SearchMatch[] {\n return this.workbookManager.search(query, options);\n }\n\n /**\n * Replace one specific search occurrence inside one addressed cell.\n */\n replace(\n query: string,\n replacement: string,\n target: ReplaceTarget,\n options?: { caseSensitive?: boolean }\n ): ReplaceChange {\n const prepared = this.workbookManager.prepareReplace(\n query,\n replacement,\n target,\n options\n );\n\n this.workbookManager.setCellContent(prepared.address, prepared.afterContent);\n this.emitMutation({\n touchedCells: buildTouchedCells([\n {\n address: prepared.address,\n before: prepared.beforeContent,\n after: prepared.afterContent,\n },\n ]),\n resourceKeys: [],\n });\n\n return prepared.change;\n }\n\n /**\n * Replace all matching raw string occurrences within the requested scope.\n */\n replaceAll(\n query: string,\n replacement: string,\n options?: SearchOptions\n ): ReplaceChange[] {\n const preparedReplacements = this.workbookManager.prepareReplaceAll(\n query,\n replacement,\n options\n );\n\n if (preparedReplacements.length === 0) {\n return [];\n }\n\n for (const prepared of preparedReplacements) {\n this.workbookManager.setCellContent(prepared.address, prepared.afterContent);\n }\n\n this.emitMutation({\n touchedCells: buildTouchedCells(\n preparedReplacements.map((prepared) => ({\n address: prepared.address,\n before: prepared.beforeContent,\n after: prepared.afterContent,\n }))\n ),\n resourceKeys: [],\n });\n\n return preparedReplacements.flatMap((prepared) => prepared.changes);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string): void {\n this.workbookManager.addWorkbook(workbookName);\n this.namedExpressionManager.addWorkbook(workbookName);\n this.tableManager.addWorkbook(workbookName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(workbookName)],\n });\n }\n\n removeWorkbook(workbookName: string): void {\n const resourceKeys = this.getWorkbookResourceKeys(workbookName);\n this.workbookManager.removeWorkbook(workbookName);\n this.namedExpressionManager.removeWorkbook(workbookName);\n this.tableManager.removeWorkbook(workbookName);\n this.styleManager.removeWorkbookStyles(workbookName);\n this.referenceManager.invalidateWorkbook(workbookName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"workbook\", workbookName }],\n });\n }\n\n /**\n * Check if a workbook exists\n */\n hasWorkbook(workbookName: string): boolean {\n return this.workbookManager.getWorkbooks().has(workbookName);\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string): void {\n const sourceWorkbook = this.workbookManager\n .getWorkbooks()\n .get(fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${fromWorkbookName}\" not found`);\n }\n if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {\n throw new Error(`Target workbook \"${toWorkbookName}\" already exists`);\n }\n\n this.workbookManager.addWorkbook(toWorkbookName);\n this.namedExpressionManager.addWorkbook(toWorkbookName);\n this.tableManager.addWorkbook(toWorkbookName);\n\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n this.workbookManager.addSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n this.namedExpressionManager.addSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n this.workbookManager.setSheetContent(\n { workbookName: toWorkbookName, sheetName },\n new Map(sheet.content)\n );\n\n const targetSheet = this.workbookManager.getSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n if (targetSheet) {\n targetSheet.metadata = new Map(sheet.metadata);\n if (sheet.sheetMetadata !== undefined) {\n targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);\n }\n }\n }\n\n const targetWorkbook = this.workbookManager\n .getWorkbooks()\n .get(toWorkbookName);\n if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {\n targetWorkbook.workbookMetadata = structuredClone(\n sourceWorkbook.workbookMetadata\n );\n }\n\n const namedExpressions = this.namedExpressionManager.getNamedExpressions();\n const sourceWorkbookExpressions =\n namedExpressions.workbookExpressions.get(fromWorkbookName);\n if (sourceWorkbookExpressions) {\n for (const [expressionName, expression] of sourceWorkbookExpressions) {\n this.namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: toWorkbookName,\n });\n }\n }\n\n const sourceSheetExpressions =\n namedExpressions.sheetExpressions.get(fromWorkbookName);\n if (sourceSheetExpressions) {\n for (const [sheetName, expressions] of sourceSheetExpressions) {\n for (const [expressionName, expression] of expressions) {\n this.namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: toWorkbookName,\n sheetName,\n });\n }\n }\n }\n\n const sourceTables = this.tableManager.tables.get(fromWorkbookName);\n if (sourceTables) {\n for (const [tableName] of sourceTables) {\n this.tableManager.copyTable(\n { workbookName: fromWorkbookName, tableName },\n { workbookName: toWorkbookName, tableName }\n );\n }\n }\n\n for (const style of this.styleManager.getAllConditionalStyles()) {\n if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {\n this.styleManager.addConditionalStyle({\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === fromWorkbookName\n ? { ...area, workbookName: toWorkbookName }\n : area\n ),\n });\n }\n }\n\n for (const style of this.styleManager.getAllCellStyles()) {\n if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {\n this.styleManager.addCellStyle({\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === fromWorkbookName\n ? { ...area, workbookName: toWorkbookName }\n : area\n ),\n });\n }\n }\n\n this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: fromWorkbookName,\n newWorkbookName: toWorkbookName,\n })\n );\n\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(toWorkbookName)],\n });\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n const oldResourceKeys = this.getWorkbookResourceKeys(opts.workbookName);\n\n this.workbookManager.renameWorkbook(opts);\n this.namedExpressionManager.renameWorkbook(opts);\n this.tableManager.updateTablesForWorkbookRename(opts);\n this.styleManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: opts.workbookName,\n newWorkbookName: opts.newWorkbookName,\n })\n );\n this.referenceManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: Array.from(\n new Set([\n ...oldResourceKeys,\n ...this.getWorkbookResourceKeys(opts.newWorkbookName),\n ])\n ),\n });\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n const previousContent = this.getExistingSheetContent(opts);\n this.workbookManager.setSheetContent(opts, content);\n this.emitMutation({\n touchedCells: buildSheetContentTouchedCells(\n opts,\n previousContent,\n content\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Set the content of a single cell.\n */\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n const previousValue = this.workbookManager.getCellContent(address);\n this.workbookManager.setCellContent(address, content);\n this.emitMutation({\n touchedCells: buildTouchedCells([\n {\n address,\n before: previousValue,\n after: content,\n },\n ]),\n resourceKeys: [],\n });\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ): void {\n const touchedAddresses = this.dedupeAddresses(\n fillRanges.flatMap((range) =>\n getFiniteRangeAddresses({\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range,\n })\n )\n );\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.autoFillManager.fill(opts, seedRange, fillRanges, direction);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n const clearedCells = Array.from(\n this.workbookManager.iterateCellsInRange(address)\n );\n const before = captureCellContents(this.workbookManager, clearedCells);\n\n this.workbookManager.clearSpreadsheetRange(address);\n\n this.emitMutation({\n touchedCells: buildTouchedCells(\n clearedCells.map((cellAddress) => ({\n address: cellAddress,\n before: before.get(getMutationAddressKey(cellAddress)),\n after: undefined,\n }))\n ),\n resourceKeys: [],\n });\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n references: this.referenceManager.getAllReferences(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n private buildSerializedSnapshot(): EngineSnapshot {\n const evaluationSnapshots = this.dependencyManager.toSnapshot(\n this.evaluationManager\n );\n const workbookSnapshot = this.workbookManager.toSnapshot();\n\n return {\n version: ENGINE_SNAPSHOT_VERSION,\n managers: {\n workbook: workbookSnapshot,\n namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),\n table: this.tableManager.toSnapshot(),\n style: this.styleManager.toSnapshot(),\n reference: this.referenceManager.toSnapshot(),\n dependency: evaluationSnapshots.dependency,\n cache: evaluationSnapshots.cache,\n },\n };\n }\n\n private buildNamedExpressionSnapshot(\n workbookSnapshot: EngineSnapshot[\"managers\"][\"workbook\"]\n ): EngineSnapshot[\"managers\"][\"namedExpression\"] {\n const namedExpressions = this.namedExpressionManager.toSnapshot();\n const workbookExpressions = new Map<string, Map<string, NamedExpression>>();\n const sheetExpressions = new Map<\n string,\n Map<string, Map<string, NamedExpression>>\n >();\n\n workbookSnapshot.forEach((workbook) => {\n const sourceWorkbookExpressions =\n namedExpressions.workbookExpressions.get(workbook.name);\n workbookExpressions.set(\n workbook.name,\n new Map(sourceWorkbookExpressions ?? [])\n );\n\n const sourceSheets = namedExpressions.sheetExpressions.get(\n workbook.name\n );\n const workbookSheetExpressions = new Map<\n string,\n Map<string, NamedExpression>\n >();\n workbook.sheets.forEach((_, sheetName) => {\n workbookSheetExpressions.set(\n sheetName,\n new Map(sourceSheets?.get(sheetName) ?? [])\n );\n });\n sheetExpressions.set(workbook.name, workbookSheetExpressions);\n });\n\n return {\n sheetExpressions,\n workbookExpressions,\n globalExpressions: new Map(namedExpressions.globalExpressions),\n };\n }\n\n serializeEngine(): string {\n return serialize(this.buildSerializedSnapshot());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as Partial<EngineSnapshot>;\n if (\n !deserialized ||\n typeof deserialized !== \"object\" ||\n !(\"version\" in deserialized) ||\n (deserialized.version !== ENGINE_SNAPSHOT_VERSION) ||\n !deserialized.managers\n ) {\n throw new Error(\n `Unsupported serialized engine format. Expected EngineSnapshot version ${ENGINE_SNAPSHOT_VERSION}.`\n );\n }\n\n this.namedExpressionManager.clear();\n this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);\n\n deserialized.managers.workbook.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.restoreFromSnapshot(\n deserialized.managers.namedExpression\n );\n this.tableManager.restoreFromSnapshot(deserialized.managers.table);\n this.styleManager.restoreFromSnapshot(deserialized.managers.style);\n this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);\n this.dependencyManager.restoreFromSnapshot(\n {\n dependency: deserialized.managers.dependency,\n cache: deserialized.managers.cache,\n },\n this.evaluationManager\n );\n\n this.eventManager.emitUpdate();\n }\n //#endregion\n}\n"
5
+ "/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type NamedExpression,\n type RangeAddress,\n type RangeMetadata,\n type RangeMetadataInput,\n type ReplaceChange,\n type ReplaceTarget,\n type SearchMatch,\n type SearchOptions,\n type SerializedCellValue,\n type Sheet,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.mjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.mjs\";\nimport { AutoFill } from \"./autofill-utils.mjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.mjs\";\nimport { deserialize, serialize } from \"./map-serializer.mjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.mjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.mjs\";\nimport { renameTableInFormula } from \"./table-renamer.mjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.mjs\";\nimport { getCellReference, parseCellReference } from \"./utils.mjs\";\nimport { CacheManager } from \"./managers/cache-manager.mjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.mjs\";\nimport { TableManager } from \"./managers/table-manager.mjs\";\nimport { EventManager } from \"./managers/event-manager.mjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.mjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.mjs\";\nimport { StyleManager } from \"./managers/style-manager.mjs\";\nimport { CopyManager } from \"./managers/copy-manager.mjs\";\nimport { ReferenceManager } from \"./managers/reference-manager.mjs\";\nimport { RangeMetadataManager } from \"./managers/range-metadata-manager.mjs\";\nimport {\n ENGINE_SNAPSHOT_VERSION,\n type EngineSnapshot,\n} from \"./engine-snapshot.mjs\";\nimport {\n buildFormulaTouchedCells,\n buildSheetContentTouchedCells,\n buildTableContextChangedCells,\n buildTableTouchedCells,\n buildTouchedCells,\n captureCellContents,\n getFiniteRangeAddresses,\n getMutationAddressKey,\n getNamedExpressionScopeResourceKeys,\n mergeTouchedCells,\n type MutationInvalidation,\n} from \"./mutation-invalidation.mjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"./resource-keys.mjs\";\n\ntype Metadata = {\n cell?: unknown;\n range?: unknown;\n sheet?: unknown;\n workbook?: unknown;\n};\n\ntype MetadataType<\n TMetadata extends Metadata,\n TKey extends keyof Metadata\n> = TMetadata[TKey];\n\n /**\n * Main FormulaEngine class\n * @template TMetadata - Consumer-defined metadata shape with optional cell, sheet, and workbook entries.\n */\nexport class FormulaEngine<TMetadata extends Metadata = Metadata> {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private rangeMetadataManager: RangeMetadataManager<MetadataType<TMetadata, \"range\">>;\n private copyManager: CopyManager;\n private referenceManager: ReferenceManager;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n public _rangeMetadataManager: RangeMetadataManager<MetadataType<TMetadata, \"range\">>;\n\n constructor() {\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(this.evaluationManager);\n this.rangeMetadataManager = new RangeMetadataManager<\n MetadataType<TMetadata, \"range\">\n >();\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager,\n this.rangeMetadataManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager,\n this.rangeMetadataManager\n );\n\n this.referenceManager = new ReferenceManager();\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n this._rangeMetadataManager = this.rangeMetadataManager;\n }\n\n /**\n * Static factory method to build an empty engine\n * @template TMetadata - Consumer-defined metadata shape with optional cell, sheet, and workbook entries.\n */\n static buildEmpty<TMetadata extends Metadata = Metadata>() {\n return new FormulaEngine<TMetadata>();\n }\n\n private emitMutation(footprint: MutationInvalidation): void {\n this.evaluationManager.invalidateFromMutation(footprint);\n this.eventManager.emitUpdate();\n }\n\n private emitUpdate(): void {\n this.eventManager.emitUpdate();\n }\n\n private getExistingSheetContent(opts: {\n workbookName: string;\n sheetName: string;\n }): Map<string, SerializedCellValue> | undefined {\n const sheet = this.workbookManager.getSheet(opts);\n return sheet ? new Map(sheet.content) : undefined;\n }\n\n private getWorkbookResourceKeys(workbookName: string): string[] {\n const resourceKeys = new Set<string>([getWorkbookResourceKey(workbookName)]);\n\n for (const sheetName of this.workbookManager\n .getWorkbooks()\n .get(workbookName)\n ?.sheets.keys() ?? []) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n }\n\n for (const tableName of this.tableManager.getTables(workbookName).keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n\n const namedExpressions = this.namedExpressionManager.getNamedExpressions();\n for (const name of namedExpressions.workbookExpressions\n .get(workbookName)\n ?.keys() ?? []) {\n resourceKeys.add(\n getNamedExpressionResourceKey({ expressionName: name, workbookName })\n );\n }\n for (const [sheetName, expressions] of namedExpressions.sheetExpressions.get(\n workbookName\n ) ?? []) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n for (const name of expressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n }\n\n return Array.from(resourceKeys);\n }\n\n private getSheetResourceKeys(opts: {\n workbookName: string;\n sheetName: string;\n }): string[] {\n const resourceKeys = new Set<string>([\n getWorkbookResourceKey(opts.workbookName),\n getSheetResourceKey(opts),\n ]);\n\n for (const [tableName, table] of this.tableManager.getTables(\n opts.workbookName\n )) {\n if (table.sheetName === opts.sheetName) {\n resourceKeys.add(\n getTableResourceKey({ workbookName: opts.workbookName, tableName })\n );\n }\n }\n\n const sheetExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .sheetExpressions.get(opts.workbookName)\n ?.get(opts.sheetName);\n for (const name of sheetExpressions?.keys() ?? []) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n );\n }\n\n return Array.from(resourceKeys);\n }\n\n private assertNamedExpressionScopeExists(opts: {\n workbookName?: string;\n sheetName?: string;\n }): void {\n if (opts.sheetName && !opts.workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (!opts.workbookName) {\n return;\n }\n\n if (!this.workbookManager.getWorkbooks().has(opts.workbookName)) {\n throw new Error(`Workbook not found: ${opts.workbookName}`);\n }\n\n if (\n opts.sheetName &&\n !this.workbookManager.getSheet({\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n ) {\n throw new Error(`Sheet not found: ${opts.sheetName}`);\n }\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n /**\n * Set metadata for a cell\n * Metadata can contain rich text, links, comments, or any consumer-defined data\n */\n setCellMetadata(\n address: CellAddress,\n metadata: MetadataType<TMetadata, \"cell\"> | undefined\n ): void {\n this.workbookManager.setCellMetadata(address, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a cell\n */\n getCellMetadata(\n address: CellAddress\n ): MetadataType<TMetadata, \"cell\"> | undefined {\n const metadata = this.workbookManager.getCellMetadata(address);\n return metadata as MetadataType<TMetadata, \"cell\"> | undefined;\n }\n\n /**\n * Get all cell metadata for a sheet (serialized as Map)\n */\n getSheetMetadataSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, MetadataType<TMetadata, \"sheet\">> {\n return this.workbookManager.getSheetMetadataSerialized(opts) as Map<\n string,\n MetadataType<TMetadata, \"sheet\">\n >;\n }\n\n /**\n * Set metadata for a sheet\n * Sheet metadata can contain text boxes, frozen panes, print settings, or any consumer-defined data\n */\n setSheetMetadata(\n opts: { workbookName: string; sheetName: string },\n metadata: MetadataType<TMetadata, \"sheet\">\n ): void {\n this.workbookManager.setSheetMetadata(opts, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a sheet\n */\n getSheetMetadata(opts: {\n workbookName: string;\n sheetName: string;\n }): MetadataType<TMetadata, \"sheet\"> | undefined {\n return this.workbookManager.getSheetMetadata(opts) as\n | MetadataType<TMetadata, \"sheet\">\n | undefined;\n }\n\n /**\n * Set metadata for a workbook\n * Workbook metadata can contain themes, document properties, settings, or any consumer-defined data\n */\n setWorkbookMetadata(\n workbookName: string,\n metadata: MetadataType<TMetadata, \"workbook\">\n ): void {\n this.workbookManager.setWorkbookMetadata(workbookName, metadata);\n this.emitUpdate();\n }\n\n /**\n * Get metadata for a workbook\n */\n getWorkbookMetadata(\n workbookName: string\n ): MetadataType<TMetadata, \"workbook\"> | undefined {\n return this.workbookManager.getWorkbookMetadata(workbookName) as\n | MetadataType<TMetadata, \"workbook\">\n | undefined;\n }\n\n /**\n * Add metadata attached to one or more ranges.\n * Range metadata is arbitrary consumer-defined data that follows range\n * copy/paste, autofill, workbook/sheet rename, and serialization flows.\n */\n addRangeMetadata(\n metadata: RangeMetadataInput<MetadataType<TMetadata, \"range\">>\n ): string {\n const id = this.rangeMetadataManager.addRangeMetadata(metadata);\n this.emitUpdate();\n return id;\n }\n\n /**\n * Remove a range metadata entry by id.\n */\n removeRangeMetadata(id: string): void {\n const removed = this.rangeMetadataManager.removeRangeMetadata(id);\n if (removed) {\n this.emitUpdate();\n }\n }\n\n /**\n * Get all range metadata entries.\n */\n getAllRangeMetadata(): RangeMetadata<MetadataType<TMetadata, \"range\">>[] {\n return this.rangeMetadataManager.getAllRangeMetadata();\n }\n\n /**\n * Get range metadata entries that apply to a specific cell.\n */\n getRangeMetadataForCell(\n address: CellAddress\n ): RangeMetadata<MetadataType<TMetadata, \"range\">>[] {\n return this.rangeMetadataManager.getRangeMetadataForCell(address);\n }\n\n /**\n * Get range metadata entries intersecting with a range.\n */\n getRangeMetadataIntersectingWithRange(\n range: RangeAddress\n ): RangeMetadata<MetadataType<TMetadata, \"range\">>[] {\n return this.rangeMetadataManager.getRangeMetadataIntersectingWithRange(\n range\n );\n }\n\n /**\n * Clear range metadata from a range, preserving non-overlapping portions.\n */\n clearRangeMetadata(range: RangeAddress): void {\n this.rangeMetadataManager.clearRangeMetadataInRange(range);\n this.emitUpdate();\n }\n\n //#endregion\n\n //#region Reference Tracking\n /**\n * Create a tracked reference to a range\n * Returns a stable UUID that can be used to retrieve the address later\n * The reference automatically updates when sheets/workbooks are renamed\n */\n createRef(address: RangeAddress): string {\n return this.referenceManager.createRef(address);\n }\n\n /**\n * Get the current address for a tracked reference\n * Returns undefined if reference doesn't exist or has been invalidated\n */\n getRefAddress(refId: string): RangeAddress | undefined {\n return this.referenceManager.getRefAddress(refId);\n }\n\n /**\n * Delete a tracked reference\n * Returns true if the reference was deleted, false if it didn't exist\n */\n deleteRef(refId: string): boolean {\n return this.referenceManager.deleteRef(refId);\n }\n\n /**\n * Get all invalid reference IDs\n * Useful for cleanup after sheet/workbook deletions\n */\n getInvalidRefs(): string[] {\n return this.referenceManager.getInvalidRefs();\n }\n //#endregion\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string,\n cellAddress: CellAddress\n ): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.assertNamedExpressionScopeExists(opts);\n this.namedExpressionManager.addNamedExpression(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n\n removeNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n const removed = this.namedExpressionManager.removeNamedExpression(opts);\n if (removed) {\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n }\n\n /**\n * Check if a named expression exists\n */\n hasNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n const scope =\n opts.sheetName && opts.workbookName\n ? {\n type: \"sheet\" as const,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }\n : opts.workbookName\n ? { type: \"workbook\" as const, workbookName: opts.workbookName }\n : { type: \"global\" as const };\n\n return !!this.namedExpressionManager.getNamedExpression({\n name: opts.expressionName,\n scope,\n });\n }\n\n updateNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.namedExpressionManager.updateNamedExpression(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getNamedExpressionResourceKey(opts)],\n });\n }\n\n renameNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): void {\n this.namedExpressionManager.renameNamedExpression(opts);\n\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameNamedExpressionInFormula(\n formula,\n opts.expressionName,\n opts.newName\n )\n );\n\n const changedNamedExpressions =\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameNamedExpressionInFormula(\n formula,\n opts.expressionName,\n opts.newName\n )\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: [\n getNamedExpressionResourceKey({\n expressionName: opts.expressionName,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }),\n getNamedExpressionResourceKey({\n expressionName: opts.newName,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }),\n ...changedNamedExpressions,\n ],\n });\n }\n\n setNamedExpressions(\n opts: (\n | { type: \"global\" }\n | { type: \"sheet\"; sheetName: string; workbookName: string }\n | { type: \"workbook\"; workbookName: string }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n const allExpressions = this.namedExpressionManager.getNamedExpressions();\n let previousExpressions: Map<string, NamedExpression> | undefined;\n\n if (opts.type === \"global\") {\n previousExpressions = new Map(allExpressions.globalExpressions);\n } else if (opts.type === \"workbook\") {\n previousExpressions = new Map(\n allExpressions.workbookExpressions.get(opts.workbookName) || []\n );\n } else {\n const sheetExpressions = allExpressions.sheetExpressions\n .get(opts.workbookName)\n ?.get(opts.sheetName);\n previousExpressions = new Map(sheetExpressions || []);\n }\n\n this.namedExpressionManager.setNamedExpressions(opts);\n\n const scope =\n opts.type === \"global\"\n ? {}\n : opts.type === \"workbook\"\n ? { workbookName: opts.workbookName }\n : {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n };\n\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [\n ...getNamedExpressionScopeResourceKeys(\n previousExpressions.keys(),\n scope\n ),\n ...getNamedExpressionScopeResourceKeys(opts.expressions.keys(), scope),\n ],\n });\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }): void {\n const table = this.tableManager.addTable({\n ...props,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n this.emitMutation({\n touchedCells: buildTableTouchedCells(this.workbookManager, [table]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [table]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: props.workbookName,\n tableName: props.tableName,\n }),\n ],\n });\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ): void {\n const oldTable = this.tableManager.getTable({\n workbookName,\n name: names.oldName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n this.tableManager.renameTable(workbookName, names);\n\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n const changedNamedExpressions =\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n const newTable = this.tableManager.getTable({\n workbookName,\n name: names.newName,\n });\n\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, [oldTableSnapshot]),\n buildTableTouchedCells(this.workbookManager, [newTable]),\n buildFormulaTouchedCells(changedCells)\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot, newTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName,\n tableName: names.oldName,\n }),\n getTableResourceKey({\n workbookName,\n tableName: names.newName,\n }),\n ...changedNamedExpressions,\n ],\n });\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }): void {\n const oldTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n this.tableManager.updateTable({\n ...opts,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n const newTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, [oldTableSnapshot]),\n buildTableTouchedCells(this.workbookManager, [newTable])\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot, newTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: opts.workbookName,\n tableName: opts.tableName,\n }),\n ],\n });\n }\n\n removeTable(opts: { tableName: string; workbookName: string }): void {\n const oldTable = this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n const oldTableSnapshot = oldTable\n ? { ...oldTable, headers: new Map(oldTable.headers) }\n : undefined;\n\n const found = this.tableManager.removeTable(opts);\n if (found) {\n this.emitMutation({\n touchedCells: buildTableTouchedCells(this.workbookManager, [\n oldTableSnapshot,\n ]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [oldTableSnapshot]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: opts.workbookName,\n tableName: opts.tableName,\n }),\n ],\n });\n }\n }\n\n private getAllTables(): TableDefinition[] {\n return Array.from(this.tableManager.tables.values()).flatMap((tables) =>\n Array.from(tables.values()).map((table) => ({\n ...table,\n headers: new Map(table.headers),\n }))\n );\n }\n\n /**\n * Check if a table exists\n */\n hasTable(opts: { tableName: string; workbookName: string }): boolean {\n return !!this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n /**\n * Get a table definition by name\n */\n getTable(opts: {\n tableName: string;\n workbookName: string;\n }): TableDefinition | undefined {\n return this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>): void {\n const oldTables = this.getAllTables();\n const newTables = Array.from(tables.values()).flatMap((workbookTables) =>\n Array.from(workbookTables.values())\n );\n const resourceKeys = new Set<string>();\n for (const table of [...oldTables, ...newTables]) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName: table.workbookName,\n tableName: table.name,\n })\n );\n }\n\n this.tableManager.resetTables(tables);\n this.emitMutation({\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.workbookManager, oldTables),\n buildTableTouchedCells(this.workbookManager, newTables)\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.workbookManager,\n [...oldTables, ...newTables]\n ),\n resourceKeys: Array.from(resourceKeys),\n });\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.styleManager.addConditionalStyle(style);\n this.emitUpdate();\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): void {\n const removed = this.styleManager.removeConditionalStyle(\n workbookName,\n index\n );\n if (removed) {\n this.emitUpdate();\n }\n }\n\n /**\n * Get the count of conditional styles for a workbook\n */\n getConditionalStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllConditionalStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Get all cell styles (for testing and serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return this.styleManager.getAllCellStyles();\n }\n\n /**\n * Get all conditional styles (for testing and serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return this.styleManager.getAllConditionalStyles();\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.styleManager.addCellStyle(style);\n this.emitUpdate();\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): void {\n const removed = this.styleManager.removeCellStyle(workbookName, index);\n if (removed) {\n this.emitUpdate();\n }\n }\n\n /**\n * Get the count of direct cell styles for a workbook\n */\n getCellStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllCellStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.styleManager.clearCellStyles(range);\n this.emitUpdate();\n }\n\n //#endregion\n\n //#region Copy/Paste\n private getTopLeftCell(cells: CellAddress[]): CellAddress {\n let topLeft = cells[0]!;\n for (const cell of cells) {\n if (\n cell.rowIndex < topLeft.rowIndex ||\n (cell.rowIndex === topLeft.rowIndex &&\n cell.colIndex < topLeft.colIndex)\n ) {\n topLeft = cell;\n }\n }\n return topLeft;\n }\n\n private dedupeAddresses(addresses: CellAddress[]): CellAddress[] {\n return Array.from(\n new Map(addresses.map((address) => [getMutationAddressKey(address), address]))\n .values()\n );\n }\n\n private getPasteTouchedAddresses(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): CellAddress[] {\n if (source.length === 0) {\n return [];\n }\n\n const topLeft = this.getTopLeftCell(source);\n const colOffset = target.colIndex - topLeft.colIndex;\n const rowOffset = target.rowIndex - topLeft.rowIndex;\n const targetCells = source.map((sourceCell) => ({\n workbookName: target.workbookName,\n sheetName: target.sheetName,\n colIndex: sourceCell.colIndex + colOffset,\n rowIndex: sourceCell.rowIndex + rowOffset,\n }));\n\n return this.dedupeAddresses(\n options.cut ? [...source, ...targetCells] : targetCells\n );\n }\n\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n if (source.length === 0) {\n return;\n }\n\n const touchedAddresses = this.getPasteTouchedAddresses(\n source,\n target,\n options\n );\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.copyManager.pasteCells(source, target, options);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n *\n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n *\n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n const touchedAddresses = this.dedupeAddresses([\n ...targetRanges.flatMap((targetRange) =>\n getFiniteRangeAddresses(targetRange)\n ),\n ...(options.cut ? getFiniteRangeAddresses(seedRange) : []),\n ]);\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.copyManager.fillAreas(seedRange, targetRanges, options);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n *\n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n *\n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // If cut operation, always use pasteCells (never fillAreas)\n // Cut should be a simple move operation, not a fill\n if (options.cut === true) {\n for (const area of pasteSelection.areas) {\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: area.start.col,\n rowIndex: area.start.row,\n };\n this.pasteCells(sourceCells, target, options);\n }\n return;\n }\n\n // For copy operations (not cut), use smart paste/fill logic\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol =\n area.end.col.type === \"number\" ? area.end.col.value : pasteStartCol;\n const pasteEndRow =\n area.end.row.type === \"number\" ? area.end.row.value : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n\n /**\n * Move a single cell to a new location\n * Updates all formula references that point to the moved cell\n *\n * @param source - The cell to move\n * @param target - The destination cell address\n *\n * @example\n * // Move A1 to D5. If B1 contains =A1, it will be updated to =D5\n * engine.moveCell(\n * { workbookName, sheetName, colIndex: 0, rowIndex: 0 },\n * { workbookName, sheetName, colIndex: 3, rowIndex: 4 }\n * );\n */\n moveCell(source: CellAddress, target: CellAddress): void {\n this.pasteCells([source], target, {\n cut: true,\n type: \"formula\",\n include: \"all\",\n });\n }\n\n /**\n * Move a range of cells to a new location\n * Updates all formula references that point to the moved cells\n *\n * @param sourceRange - The range to move\n * @param target - The top-left destination cell address\n *\n * @example\n * // Move A1:D5 to F10. If E1 contains =SUM(A1:D5), it will be updated to =SUM(F10:I14)\n * engine.moveRange(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 3 }, row: { type: \"number\", value: 4 } }\n * }\n * },\n * { workbookName, sheetName, colIndex: 5, rowIndex: 9 }\n * );\n */\n moveRange(sourceRange: RangeAddress, target: CellAddress): void {\n const cells = this.copyManager.expandRangeToCells(sourceRange);\n this.pasteCells(cells, target, {\n cut: true,\n type: \"formula\",\n include: \"all\",\n });\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }): Sheet {\n const sheet = this.workbookManager.addSheet(opts);\n this.namedExpressionManager.addSheet(opts);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getSheetResourceKey(opts)],\n });\n return sheet;\n }\n\n createSheet(opts: {\n workbookName: string;\n sheetName?: string;\n baseName?: string;\n }): Sheet {\n const sheetName =\n opts.sheetName ??\n this.workbookManager.getNextAvailableSheetName(\n opts.workbookName,\n opts.baseName\n );\n\n return this.addSheet({\n workbookName: opts.workbookName,\n sheetName,\n });\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }): void {\n const resourceKeys = this.getSheetResourceKeys(opts);\n this.workbookManager.removeSheet(opts);\n this.namedExpressionManager.removeSheet(opts);\n this.tableManager.removeSheet(opts);\n this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);\n this.rangeMetadataManager.removeSheetRangeMetadata(\n opts.workbookName,\n opts.sheetName\n );\n this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"sheet\", ...opts }],\n });\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n const oldResourceKeys = this.getSheetResourceKeys(opts);\n\n this.workbookManager.renameSheet(opts);\n this.namedExpressionManager.renameSheet(opts);\n this.tableManager.updateTablesForSheetRename(opts);\n this.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n this.rangeMetadataManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n this.referenceManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: Array.from(\n new Set([\n ...oldResourceKeys,\n ...this.getSheetResourceKeys({\n workbookName: opts.workbookName,\n sheetName: opts.newSheetName,\n }),\n ])\n ),\n });\n }\n\n /**\n * Check if a sheet exists\n */\n hasSheet(opts: { workbookName: string; sheetName: string }): boolean {\n return !!this.workbookManager.getSheet(opts);\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getOrderedSheets(workbookName: string) {\n return this.workbookManager.getOrderedSheets(workbookName);\n }\n\n getOrderedSheetNames(workbookName: string) {\n return this.workbookManager.getOrderedSheetNames(workbookName);\n }\n\n getNextAvailableSheetName(workbookName: string, baseName?: string) {\n return this.workbookManager.getNextAvailableSheetName(\n workbookName,\n baseName\n );\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n /**\n * Search raw stored string content without evaluating cell values.\n */\n search(\n query: string,\n options?: SearchOptions\n ): SearchMatch[] {\n return this.workbookManager.search(query, options);\n }\n\n /**\n * Replace one specific search occurrence inside one addressed cell.\n */\n replace(\n query: string,\n replacement: string,\n target: ReplaceTarget,\n options?: { caseSensitive?: boolean }\n ): ReplaceChange {\n const prepared = this.workbookManager.prepareReplace(\n query,\n replacement,\n target,\n options\n );\n\n this.workbookManager.setCellContent(prepared.address, prepared.afterContent);\n this.emitMutation({\n touchedCells: buildTouchedCells([\n {\n address: prepared.address,\n before: prepared.beforeContent,\n after: prepared.afterContent,\n },\n ]),\n resourceKeys: [],\n });\n\n return prepared.change;\n }\n\n /**\n * Replace all matching raw string occurrences within the requested scope.\n */\n replaceAll(\n query: string,\n replacement: string,\n options?: SearchOptions\n ): ReplaceChange[] {\n const preparedReplacements = this.workbookManager.prepareReplaceAll(\n query,\n replacement,\n options\n );\n\n if (preparedReplacements.length === 0) {\n return [];\n }\n\n for (const prepared of preparedReplacements) {\n this.workbookManager.setCellContent(prepared.address, prepared.afterContent);\n }\n\n this.emitMutation({\n touchedCells: buildTouchedCells(\n preparedReplacements.map((prepared) => ({\n address: prepared.address,\n before: prepared.beforeContent,\n after: prepared.afterContent,\n }))\n ),\n resourceKeys: [],\n });\n\n return preparedReplacements.flatMap((prepared) => prepared.changes);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string): void {\n this.workbookManager.addWorkbook(workbookName);\n this.namedExpressionManager.addWorkbook(workbookName);\n this.tableManager.addWorkbook(workbookName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(workbookName)],\n });\n }\n\n removeWorkbook(workbookName: string): void {\n const resourceKeys = this.getWorkbookResourceKeys(workbookName);\n this.workbookManager.removeWorkbook(workbookName);\n this.namedExpressionManager.removeWorkbook(workbookName);\n this.tableManager.removeWorkbook(workbookName);\n this.styleManager.removeWorkbookStyles(workbookName);\n this.rangeMetadataManager.removeWorkbookRangeMetadata(workbookName);\n this.referenceManager.invalidateWorkbook(workbookName);\n this.emitMutation({\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"workbook\", workbookName }],\n });\n }\n\n /**\n * Check if a workbook exists\n */\n hasWorkbook(workbookName: string): boolean {\n return this.workbookManager.getWorkbooks().has(workbookName);\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string): void {\n const sourceWorkbook = this.workbookManager\n .getWorkbooks()\n .get(fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${fromWorkbookName}\" not found`);\n }\n if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {\n throw new Error(`Target workbook \"${toWorkbookName}\" already exists`);\n }\n\n this.workbookManager.addWorkbook(toWorkbookName);\n this.namedExpressionManager.addWorkbook(toWorkbookName);\n this.tableManager.addWorkbook(toWorkbookName);\n\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n this.workbookManager.addSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n this.namedExpressionManager.addSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n this.workbookManager.setSheetContent(\n { workbookName: toWorkbookName, sheetName },\n new Map(sheet.content)\n );\n\n const targetSheet = this.workbookManager.getSheet({\n workbookName: toWorkbookName,\n sheetName,\n });\n if (targetSheet) {\n targetSheet.metadata = new Map(sheet.metadata);\n if (sheet.sheetMetadata !== undefined) {\n targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);\n }\n }\n }\n\n const targetWorkbook = this.workbookManager\n .getWorkbooks()\n .get(toWorkbookName);\n if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {\n targetWorkbook.workbookMetadata = structuredClone(\n sourceWorkbook.workbookMetadata\n );\n }\n\n const namedExpressions = this.namedExpressionManager.getNamedExpressions();\n const sourceWorkbookExpressions =\n namedExpressions.workbookExpressions.get(fromWorkbookName);\n if (sourceWorkbookExpressions) {\n for (const [expressionName, expression] of sourceWorkbookExpressions) {\n this.namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: toWorkbookName,\n });\n }\n }\n\n const sourceSheetExpressions =\n namedExpressions.sheetExpressions.get(fromWorkbookName);\n if (sourceSheetExpressions) {\n for (const [sheetName, expressions] of sourceSheetExpressions) {\n for (const [expressionName, expression] of expressions) {\n this.namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: toWorkbookName,\n sheetName,\n });\n }\n }\n }\n\n const sourceTables = this.tableManager.tables.get(fromWorkbookName);\n if (sourceTables) {\n for (const [tableName] of sourceTables) {\n this.tableManager.copyTable(\n { workbookName: fromWorkbookName, tableName },\n { workbookName: toWorkbookName, tableName }\n );\n }\n }\n\n for (const style of this.styleManager.getAllConditionalStyles()) {\n if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {\n this.styleManager.addConditionalStyle({\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === fromWorkbookName\n ? { ...area, workbookName: toWorkbookName }\n : area\n ),\n });\n }\n }\n\n for (const style of this.styleManager.getAllCellStyles()) {\n if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {\n this.styleManager.addCellStyle({\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === fromWorkbookName\n ? { ...area, workbookName: toWorkbookName }\n : area\n ),\n });\n }\n }\n\n for (const metadata of this.rangeMetadataManager.getAllRangeMetadata()) {\n if (metadata.areas.some((area) => area.workbookName === fromWorkbookName)) {\n this.rangeMetadataManager.addRangeMetadata({\n metadata: metadata.metadata,\n areas: metadata.areas.map((area) =>\n area.workbookName === fromWorkbookName\n ? { ...area, workbookName: toWorkbookName }\n : area\n ),\n });\n }\n }\n\n this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: fromWorkbookName,\n newWorkbookName: toWorkbookName,\n })\n );\n\n this.emitMutation({\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(toWorkbookName)],\n });\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n const oldResourceKeys = this.getWorkbookResourceKeys(opts.workbookName);\n\n this.workbookManager.renameWorkbook(opts);\n this.namedExpressionManager.renameWorkbook(opts);\n this.tableManager.updateTablesForWorkbookRename(opts);\n this.styleManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n this.rangeMetadataManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n const changedCells = this.workbookManager.updateAllFormulas((formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: opts.workbookName,\n newWorkbookName: opts.newWorkbookName,\n })\n );\n this.referenceManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n\n this.emitMutation({\n touchedCells: buildFormulaTouchedCells(changedCells),\n resourceKeys: Array.from(\n new Set([\n ...oldResourceKeys,\n ...this.getWorkbookResourceKeys(opts.newWorkbookName),\n ])\n ),\n });\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n const previousContent = this.getExistingSheetContent(opts);\n this.workbookManager.setSheetContent(opts, content);\n this.emitMutation({\n touchedCells: buildSheetContentTouchedCells(\n opts,\n previousContent,\n content\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Set the content of a single cell.\n */\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n const previousValue = this.workbookManager.getCellContent(address);\n this.workbookManager.setCellContent(address, content);\n this.emitMutation({\n touchedCells: buildTouchedCells([\n {\n address,\n before: previousValue,\n after: content,\n },\n ]),\n resourceKeys: [],\n });\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ): void {\n const touchedAddresses = this.dedupeAddresses(\n fillRanges.flatMap((range) =>\n getFiniteRangeAddresses({\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range,\n })\n )\n );\n const before = captureCellContents(this.workbookManager, touchedAddresses);\n\n this.autoFillManager.fill(opts, seedRange, fillRanges, direction);\n\n const after = captureCellContents(this.workbookManager, touchedAddresses);\n this.emitMutation({\n touchedCells: buildTouchedCells(\n touchedAddresses.map((address) => ({\n address,\n before: before.get(getMutationAddressKey(address)),\n after: after.get(getMutationAddressKey(address)),\n }))\n ),\n resourceKeys: [],\n });\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n const clearedCells = Array.from(\n this.workbookManager.iterateCellsInRange(address)\n );\n const before = captureCellContents(this.workbookManager, clearedCells);\n\n this.workbookManager.clearSpreadsheetRange(address);\n\n this.emitMutation({\n touchedCells: buildTouchedCells(\n clearedCells.map((cellAddress) => ({\n address: cellAddress,\n before: before.get(getMutationAddressKey(cellAddress)),\n after: undefined,\n }))\n ),\n resourceKeys: [],\n });\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n rangeMetadata: this.rangeMetadataManager.getAllRangeMetadata(),\n references: this.referenceManager.getAllReferences(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n private buildSerializedSnapshot(): EngineSnapshot {\n const evaluationSnapshots = this.dependencyManager.toSnapshot(\n this.evaluationManager\n );\n const workbookSnapshot = this.workbookManager.toSnapshot();\n\n return {\n version: ENGINE_SNAPSHOT_VERSION,\n managers: {\n workbook: workbookSnapshot,\n namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),\n table: this.tableManager.toSnapshot(),\n style: this.styleManager.toSnapshot(),\n rangeMetadata: this.rangeMetadataManager.toSnapshot(),\n reference: this.referenceManager.toSnapshot(),\n dependency: evaluationSnapshots.dependency,\n cache: evaluationSnapshots.cache,\n },\n };\n }\n\n private buildNamedExpressionSnapshot(\n workbookSnapshot: EngineSnapshot[\"managers\"][\"workbook\"]\n ): EngineSnapshot[\"managers\"][\"namedExpression\"] {\n const namedExpressions = this.namedExpressionManager.toSnapshot();\n const workbookExpressions = new Map<string, Map<string, NamedExpression>>();\n const sheetExpressions = new Map<\n string,\n Map<string, Map<string, NamedExpression>>\n >();\n\n workbookSnapshot.forEach((workbook) => {\n const sourceWorkbookExpressions =\n namedExpressions.workbookExpressions.get(workbook.name);\n workbookExpressions.set(\n workbook.name,\n new Map(sourceWorkbookExpressions ?? [])\n );\n\n const sourceSheets = namedExpressions.sheetExpressions.get(\n workbook.name\n );\n const workbookSheetExpressions = new Map<\n string,\n Map<string, NamedExpression>\n >();\n workbook.sheets.forEach((_, sheetName) => {\n workbookSheetExpressions.set(\n sheetName,\n new Map(sourceSheets?.get(sheetName) ?? [])\n );\n });\n sheetExpressions.set(workbook.name, workbookSheetExpressions);\n });\n\n return {\n sheetExpressions,\n workbookExpressions,\n globalExpressions: new Map(namedExpressions.globalExpressions),\n };\n }\n\n serializeEngine(): string {\n return serialize(this.buildSerializedSnapshot());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as Partial<EngineSnapshot>;\n if (\n !deserialized ||\n typeof deserialized !== \"object\" ||\n !(\"version\" in deserialized) ||\n (deserialized.version !== ENGINE_SNAPSHOT_VERSION) ||\n !deserialized.managers\n ) {\n throw new Error(\n `Unsupported serialized engine format. Expected EngineSnapshot version ${ENGINE_SNAPSHOT_VERSION}.`\n );\n }\n\n this.namedExpressionManager.clear();\n this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);\n\n deserialized.managers.workbook.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.restoreFromSnapshot(\n deserialized.managers.namedExpression\n );\n this.tableManager.restoreFromSnapshot(deserialized.managers.table);\n this.styleManager.restoreFromSnapshot(deserialized.managers.style);\n this.rangeMetadataManager.restoreFromSnapshot(\n deserialized.managers.rangeMetadata\n );\n this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);\n this.dependencyManager.restoreFromSnapshot(\n {\n dependency: deserialized.managers.dependency,\n cache: deserialized.managers.cache,\n },\n this.evaluationManager\n );\n\n this.eventManager.emitUpdate();\n }\n //#endregion\n}\n"
6
6
  ],
7
- "mappings": ";AA0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBO,MAAM,cAAqD;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,WAAW,GAAG;AAAA,IACZ,KAAK,eAAe,IAAI;AAAA,IACxB,KAAK,kBAAkB,IAAI;AAAA,IAC3B,KAAK,yBAAyB,IAAI;AAAA,IAClC,KAAK,eAAe,IAAI,aAAa,KAAK,eAAe;AAAA,IACzD,MAAM,eAAe,IAAI;AAAA,IACzB,KAAK,oBAAoB,IAAI,kBAC3B,cACA,KAAK,eACP;AAAA,IAEA,MAAM,mBAAmB,IAAI,iBAC3B,KAAK,cACL,KAAK,mBACL,KAAK,sBACP;AAAA,IAEA,KAAK,oBAAoB,IAAI,kBAC3B,KAAK,iBACL,KAAK,cACL,kBACA,KAAK,iBACP;AAAA,IAEA,KAAK,eAAe,IAAI,aAAa,KAAK,iBAAiB;AAAA,IAC3D,KAAK,cAAc,IAAI,YACrB,KAAK,iBACL,KAAK,mBACL,KAAK,YACP;AAAA,IAEA,KAAK,kBAAkB,IAAI,SACzB,KAAK,iBACL,KAAK,YACP;AAAA,IAEA,KAAK,mBAAmB,IAAI;AAAA,IAE5B,KAAK,mBAAmB,KAAK;AAAA,IAC7B,KAAK,0BAA0B,KAAK;AAAA,IACpC,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,qBAAqB,KAAK;AAAA,IAC/B,KAAK,mBAAmB,KAAK;AAAA,IAC7B,KAAK,qBAAqB,KAAK;AAAA,IAC/B,KAAK,gBAAgB,KAAK;AAAA;AAAA,SAOrB,UAAiD,GAAG;AAAA,IACzD,OAAO,IAAI;AAAA;AAAA,EAGL,YAAY,CAAC,WAAuC;AAAA,IAC1D,KAAK,kBAAkB,uBAAuB,SAAS;AAAA,IACvD,KAAK,aAAa,WAAW;AAAA;AAAA,EAGvB,UAAU,GAAS;AAAA,IACzB,KAAK,aAAa,WAAW;AAAA;AAAA,EAGvB,uBAAuB,CAAC,MAGiB;AAAA,IAC/C,MAAM,QAAQ,KAAK,gBAAgB,SAAS,IAAI;AAAA,IAChD,OAAO,QAAQ,IAAI,IAAI,MAAM,OAAO,IAAI;AAAA;AAAA,EAGlC,uBAAuB,CAAC,cAAgC;AAAA,IAC9D,MAAM,eAAe,IAAI,IAAY,CAAC,uBAAuB,YAAY,CAAC,CAAC;AAAA,IAE3E,WAAW,aAAa,KAAK,gBAC1B,aAAa,EACb,IAAI,YAAY,GACf,OAAO,KAAK,KAAK,CAAC,GAAG;AAAA,MACvB,aAAa,IAAI,oBAAoB,EAAE,cAAc,UAAU,CAAC,CAAC;AAAA,IACnE;AAAA,IAEA,WAAW,aAAa,KAAK,aAAa,UAAU,YAAY,EAAE,KAAK,GAAG;AAAA,MACxE,aAAa,IAAI,oBAAoB,EAAE,cAAc,UAAU,CAAC,CAAC;AAAA,IACnE;AAAA,IAEA,MAAM,mBAAmB,KAAK,uBAAuB,oBAAoB;AAAA,IACzE,WAAW,QAAQ,iBAAiB,oBACjC,IAAI,YAAY,GACf,KAAK,KAAK,CAAC,GAAG;AAAA,MAChB,aAAa,IACX,8BAA8B,EAAE,gBAAgB,MAAM,aAAa,CAAC,CACtE;AAAA,IACF;AAAA,IACA,YAAY,WAAW,gBAAgB,iBAAiB,iBAAiB,IACvE,YACF,KAAK,CAAC,GAAG;AAAA,MACP,aAAa,IAAI,oBAAoB,EAAE,cAAc,UAAU,CAAC,CAAC;AAAA,MACjE,WAAW,QAAQ,YAAY,KAAK,GAAG;AAAA,QACrC,aAAa,IACX,8BAA8B;AAAA,UAC5B,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,QACF,CAAC,CACH;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,MAAM,KAAK,YAAY;AAAA;AAAA,EAGxB,oBAAoB,CAAC,MAGhB;AAAA,IACX,MAAM,eAAe,IAAI,IAAY;AAAA,MACnC,uBAAuB,KAAK,YAAY;AAAA,MACxC,oBAAoB,IAAI;AAAA,IAC1B,CAAC;AAAA,IAED,YAAY,WAAW,UAAU,KAAK,aAAa,UACjD,KAAK,YACP,GAAG;AAAA,MACD,IAAI,MAAM,cAAc,KAAK,WAAW;AAAA,QACtC,aAAa,IACX,oBAAoB,EAAE,cAAc,KAAK,cAAc,UAAU,CAAC,CACpE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,mBAAmB,KAAK,uBAC3B,oBAAoB,EACpB,iBAAiB,IAAI,KAAK,YAAY,GACrC,IAAI,KAAK,SAAS;AAAA,IACtB,WAAW,QAAQ,kBAAkB,KAAK,KAAK,CAAC,GAAG;AAAA,MACjD,aAAa,IACX,8BAA8B;AAAA,QAC5B,gBAAgB;AAAA,QAChB,cAAc,KAAK;AAAA,QACnB,WAAW,KAAK;AAAA,MAClB,CAAC,CACH;AAAA,IACF;AAAA,IAEA,OAAO,MAAM,KAAK,YAAY;AAAA;AAAA,EAGxB,gCAAgC,CAAC,MAGhC;AAAA,IACP,IAAI,KAAK,aAAa,CAAC,KAAK,cAAc;AAAA,MACxC,MAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAAA,IAEA,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,KAAK,gBAAgB,aAAa,EAAE,IAAI,KAAK,YAAY,GAAG;AAAA,MAC/D,MAAM,IAAI,MAAM,uBAAuB,KAAK,cAAc;AAAA,IAC5D;AAAA,IAEA,IACE,KAAK,aACL,CAAC,KAAK,gBAAgB,SAAS;AAAA,MAC7B,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,IAClB,CAAC,GACD;AAAA,MACA,MAAM,IAAI,MAAM,oBAAoB,KAAK,WAAW;AAAA,IACtD;AAAA;AAAA,EAIF,uBAAuB,CACrB,aACoC;AAAA,IACpC,OAAO,KAAK,kBAAkB,wBAAwB,WAAW;AAAA;AAAA,EAGnE,YAAY,CAAC,aAA0B,OAAsC;AAAA,IAC3E,MAAM,SAAS,KAAK,wBAAwB,WAAW;AAAA,IACvD,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,KAAK,kBAAkB,kCAC5B,QACA,aACA,KACF;AAAA;AAAA,EAOF,eAAe,CACb,SACA,UACM;AAAA,IACN,KAAK,gBAAgB,gBAAgB,SAAS,QAAQ;AAAA,IACtD,KAAK,WAAW;AAAA;AAAA,EAMlB,eAAe,CACb,SAC6C;AAAA,IAC7C,MAAM,WAAW,KAAK,gBAAgB,gBAAgB,OAAO;AAAA,IAC7D,OAAO;AAAA;AAAA,EAMT,0BAA0B,CAAC,MAGuB;AAAA,IAChD,OAAO,KAAK,gBAAgB,2BAA2B,IAAI;AAAA;AAAA,EAU7D,gBAAgB,CACd,MACA,UACM;AAAA,IACN,KAAK,gBAAgB,iBAAiB,MAAM,QAAQ;AAAA,IACpD,KAAK,WAAW;AAAA;AAAA,EAMlB,gBAAgB,CAAC,MAGgC;AAAA,IAC/C,OAAO,KAAK,gBAAgB,iBAAiB,IAAI;AAAA;AAAA,EASnD,mBAAmB,CACjB,cACA,UACM;AAAA,IACN,KAAK,gBAAgB,oBAAoB,cAAc,QAAQ;AAAA,IAC/D,KAAK,WAAW;AAAA;AAAA,EAMlB,mBAAmB,CACjB,cACiD;AAAA,IACjD,OAAO,KAAK,gBAAgB,oBAAoB,YAAY;AAAA;AAAA,EAa9D,SAAS,CAAC,SAA+B;AAAA,IACvC,OAAO,KAAK,iBAAiB,UAAU,OAAO;AAAA;AAAA,EAOhD,aAAa,CAAC,OAAyC;AAAA,IACrD,OAAO,KAAK,iBAAiB,cAAc,KAAK;AAAA;AAAA,EAOlD,SAAS,CAAC,OAAwB;AAAA,IAChC,OAAO,KAAK,iBAAiB,UAAU,KAAK;AAAA;AAAA,EAO9C,cAAc,GAAa;AAAA,IACzB,OAAO,KAAK,iBAAiB,eAAe;AAAA;AAAA,EAI9C,eAAe,CAIb,SACA,aACqB;AAAA,IACrB,OAAO,KAAK,kBAAkB,gBAAgB,SAAS,WAAW;AAAA;AAAA,EAGpE,iBAAiB,CACf,SACoC;AAAA,IACpC,MAAM,IAAI,MAAM,iBAAiB;AAAA;AAAA,EAGnC,iBAAiB,CACf,SACoC;AAAA,IACpC,MAAM,IAAI,MAAM,iBAAiB;AAAA;AAAA,EAMnC,kBAAkB,CAAC,MAKhB;AAAA,IACD,KAAK,iCAAiC,IAAI;AAAA,IAC1C,KAAK,uBAAuB,mBAAmB,IAAI;AAAA,IACnD,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,8BAA8B,IAAI,CAAC;AAAA,IACpD,CAAC;AAAA;AAAA,EAGH,qBAAqB,CAAC,MAIb;AAAA,IACP,MAAM,UAAU,KAAK,uBAAuB,sBAAsB,IAAI;AAAA,IACtE,IAAI,SAAS;AAAA,MACX,KAAK,aAAa;AAAA,QAChB,cAAc,CAAC;AAAA,QACf,cAAc,CAAC,8BAA8B,IAAI,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AAAA;AAAA,EAMF,kBAAkB,CAAC,MAIP;AAAA,IACV,MAAM,QACJ,KAAK,aAAa,KAAK,eACnB;AAAA,MACE,MAAM;AAAA,MACN,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,IAClB,IACA,KAAK,eACL,EAAE,MAAM,YAAqB,cAAc,KAAK,aAAa,IAC7D,EAAE,MAAM,SAAkB;AAAA,IAEhC,OAAO,CAAC,CAAC,KAAK,uBAAuB,mBAAmB;AAAA,MACtD,MAAM,KAAK;AAAA,MACX;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,qBAAqB,CAAC,MAKb;AAAA,IACP,KAAK,uBAAuB,sBAAsB,IAAI;AAAA,IACtD,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,8BAA8B,IAAI,CAAC;AAAA,IACpD,CAAC;AAAA;AAAA,EAGH,qBAAqB,CAAC,MAKb;AAAA,IACP,KAAK,uBAAuB,sBAAsB,IAAI;AAAA,IAEtD,MAAM,eAAe,KAAK,gBAAgB,kBAAkB,CAAC,YAC3D,+BACE,SACA,KAAK,gBACL,KAAK,OACP,CACF;AAAA,IAEA,MAAM,0BACJ,KAAK,uBAAuB,0BAA0B,CAAC,YACrD,+BACE,SACA,KAAK,gBACL,KAAK,OACP,CACF;AAAA,IAEF,KAAK,aAAa;AAAA,MAChB,cAAc,yBAAyB,YAAY;AAAA,MACnD,cAAc;AAAA,QACZ,8BAA8B;AAAA,UAC5B,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,8BAA8B;AAAA,UAC5B,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,mBAAmB,CACjB,MAOA;AAAA,IACA,MAAM,iBAAiB,KAAK,uBAAuB,oBAAoB;AAAA,IACvE,IAAI;AAAA,IAEJ,IAAI,KAAK,SAAS,UAAU;AAAA,MAC1B,sBAAsB,IAAI,IAAI,eAAe,iBAAiB;AAAA,IAChE,EAAO,SAAI,KAAK,SAAS,YAAY;AAAA,MACnC,sBAAsB,IAAI,IACxB,eAAe,oBAAoB,IAAI,KAAK,YAAY,KAAK,CAAC,CAChE;AAAA,IACF,EAAO;AAAA,MACL,MAAM,mBAAmB,eAAe,iBACrC,IAAI,KAAK,YAAY,GACpB,IAAI,KAAK,SAAS;AAAA,MACtB,sBAAsB,IAAI,IAAI,oBAAoB,CAAC,CAAC;AAAA;AAAA,IAGtD,KAAK,uBAAuB,oBAAoB,IAAI;AAAA,IAEpD,MAAM,QACJ,KAAK,SAAS,WACV,CAAC,IACD,KAAK,SAAS,aACd,EAAE,cAAc,KAAK,aAAa,IAClC;AAAA,MACE,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,IAClB;AAAA,IAEN,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,QACZ,GAAG,oCACD,oBAAoB,KAAK,GACzB,KACF;AAAA,QACA,GAAG,oCAAoC,KAAK,YAAY,KAAK,GAAG,KAAK;AAAA,MACvE;AAAA,IACF,CAAC;AAAA;AAAA,EAKH,QAAQ,CAAC,OAOA;AAAA,IACP,MAAM,QAAQ,KAAK,aAAa,SAAS;AAAA,SACpC;AAAA,MACH,cAAc,CAAC,gBACb,KAAK,aAAa,WAAW;AAAA,IACjC,CAAC;AAAA,IAED,KAAK,aAAa;AAAA,MAChB,cAAc,uBAAuB,KAAK,iBAAiB,CAAC,KAAK,CAAC;AAAA,MAClE,0BAA0B,8BACxB,KAAK,iBACL,CAAC,KAAK,CACR;AAAA,MACA,cAAc;AAAA,QACZ,oBAAoB;AAAA,UAClB,cAAc,MAAM;AAAA,UACpB,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,WAAW,CACT,cACA,OACM;AAAA,IACN,MAAM,WAAW,KAAK,aAAa,SAAS;AAAA,MAC1C;AAAA,MACA,MAAM,MAAM;AAAA,IACd,CAAC;AAAA,IACD,MAAM,mBAAmB,WACrB,KAAK,UAAU,SAAS,IAAI,IAAI,SAAS,OAAO,EAAE,IAClD;AAAA,IAEJ,KAAK,aAAa,YAAY,cAAc,KAAK;AAAA,IAEjD,MAAM,eAAe,KAAK,gBAAgB,kBAAkB,CAAC,YAC3D,qBAAqB,SAAS,MAAM,SAAS,MAAM,OAAO,CAC5D;AAAA,IAEA,MAAM,0BACJ,KAAK,uBAAuB,0BAA0B,CAAC,YACrD,qBAAqB,SAAS,MAAM,SAAS,MAAM,OAAO,CAC5D;AAAA,IAEF,MAAM,WAAW,KAAK,aAAa,SAAS;AAAA,MAC1C;AAAA,MACA,MAAM,MAAM;AAAA,IACd,CAAC;AAAA,IAED,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,uBAAuB,KAAK,iBAAiB,CAAC,gBAAgB,CAAC,GAC/D,uBAAuB,KAAK,iBAAiB,CAAC,QAAQ,CAAC,GACvD,yBAAyB,YAAY,CACvC;AAAA,MACA,0BAA0B,8BACxB,KAAK,iBACL,CAAC,kBAAkB,QAAQ,CAC7B;AAAA,MACA,cAAc;AAAA,QACZ,oBAAoB;AAAA,UAClB;AAAA,UACA,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,QACD,oBAAoB;AAAA,UAClB;AAAA,UACA,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,QACD,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,MAOH;AAAA,IACP,MAAM,WAAW,KAAK,aAAa,SAAS;AAAA,MAC1C,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,IACD,MAAM,mBAAmB,WACrB,KAAK,UAAU,SAAS,IAAI,IAAI,SAAS,OAAO,EAAE,IAClD;AAAA,IAEJ,KAAK,aAAa,YAAY;AAAA,SACzB;AAAA,MACH,cAAc,CAAC,gBACb,KAAK,aAAa,WAAW;AAAA,IACjC,CAAC;AAAA,IAED,MAAM,WAAW,KAAK,aAAa,SAAS;AAAA,MAC1C,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,IAED,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,uBAAuB,KAAK,iBAAiB,CAAC,gBAAgB,CAAC,GAC/D,uBAAuB,KAAK,iBAAiB,CAAC,QAAQ,CAAC,CACzD;AAAA,MACA,0BAA0B,8BACxB,KAAK,iBACL,CAAC,kBAAkB,QAAQ,CAC7B;AAAA,MACA,cAAc;AAAA,QACZ,oBAAoB;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,MAAyD;AAAA,IACnE,MAAM,WAAW,KAAK,aAAa,SAAS;AAAA,MAC1C,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,IACD,MAAM,mBAAmB,WACrB,KAAK,UAAU,SAAS,IAAI,IAAI,SAAS,OAAO,EAAE,IAClD;AAAA,IAEJ,MAAM,QAAQ,KAAK,aAAa,YAAY,IAAI;AAAA,IAChD,IAAI,OAAO;AAAA,MACT,KAAK,aAAa;AAAA,QAChB,cAAc,uBAAuB,KAAK,iBAAiB;AAAA,UACzD;AAAA,QACF,CAAC;AAAA,QACD,0BAA0B,8BACxB,KAAK,iBACL,CAAC,gBAAgB,CACnB;AAAA,QACA,cAAc;AAAA,UACZ,oBAAoB;AAAA,YAClB,cAAc,KAAK;AAAA,YACnB,WAAW,KAAK;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,EAGM,YAAY,GAAsB;AAAA,IACxC,OAAO,MAAM,KAAK,KAAK,aAAa,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,WAC5D,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,SACvC;AAAA,MACH,SAAS,IAAI,IAAI,MAAM,OAAO;AAAA,IAChC,EAAE,CACJ;AAAA;AAAA,EAMF,QAAQ,CAAC,MAA4D;AAAA,IACnE,OAAO,CAAC,CAAC,KAAK,aAAa,SAAS;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA;AAAA,EAMH,QAAQ,CAAC,MAGuB;AAAA,IAC9B,OAAO,KAAK,aAAa,SAAS;AAAA,MAChC,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,QAAyD;AAAA,IACnE,MAAM,YAAY,KAAK,aAAa;AAAA,IACpC,MAAM,YAAY,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,mBACrD,MAAM,KAAK,eAAe,OAAO,CAAC,CACpC;AAAA,IACA,MAAM,eAAe,IAAI;AAAA,IACzB,WAAW,SAAS,CAAC,GAAG,WAAW,GAAG,SAAS,GAAG;AAAA,MAChD,aAAa,IACX,oBAAoB;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,WAAW,MAAM;AAAA,MACnB,CAAC,CACH;AAAA,IACF;AAAA,IAEA,KAAK,aAAa,YAAY,MAAM;AAAA,IACpC,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,uBAAuB,KAAK,iBAAiB,SAAS,GACtD,uBAAuB,KAAK,iBAAiB,SAAS,CACxD;AAAA,MACA,0BAA0B,8BACxB,KAAK,iBACL,CAAC,GAAG,WAAW,GAAG,SAAS,CAC7B;AAAA,MACA,cAAc,MAAM,KAAK,YAAY;AAAA,IACvC,CAAC;AAAA;AAAA,EAGH,SAAS,CAAC,cAAsB;AAAA,IAC9B,OAAO,KAAK,aAAa,UAAU,YAAY;AAAA;AAAA,EAGjD,aAAa,CAAC,aAAuD;AAAA,IACnE,OAAO,KAAK,aAAa,cAAc,WAAW;AAAA;AAAA,EASpD,mBAAmB,CAAC,OAA+B;AAAA,IACjD,KAAK,aAAa,oBAAoB,KAAK;AAAA,IAC3C,KAAK,WAAW;AAAA;AAAA,EAMlB,sBAAsB,CAAC,cAAsB,OAAqB;AAAA,IAChE,MAAM,UAAU,KAAK,aAAa,uBAChC,cACA,KACF;AAAA,IACA,IAAI,SAAS;AAAA,MACX,KAAK,WAAW;AAAA,IAClB;AAAA;AAAA,EAMF,wBAAwB,CAAC,cAA8B;AAAA,IACrD,MAAM,YAAY,KAAK,aAAa,wBAAwB;AAAA,IAC5D,OAAO,UAAU,OAAO,CAAC,MACvB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,iBAAiB,YAAY,CACrD,EAAE;AAAA;AAAA,EAMJ,yCAAyC,CACvC,OACoB;AAAA,IACpB,OAAO,KAAK,aAAa,0CAA0C,KAAK;AAAA;AAAA,EAM1E,YAAY,CAAC,aAAiD;AAAA,IAC5D,OAAO,KAAK,aAAa,aAAa,WAAW;AAAA;AAAA,EAMnD,gBAAgB,GAAsB;AAAA,IACpC,OAAO,KAAK,aAAa,iBAAiB;AAAA;AAAA,EAM5C,uBAAuB,GAAuB;AAAA,IAC5C,OAAO,KAAK,aAAa,wBAAwB;AAAA;AAAA,EAMnD,YAAY,CAAC,OAA8B;AAAA,IACzC,KAAK,aAAa,aAAa,KAAK;AAAA,IACpC,KAAK,WAAW;AAAA;AAAA,EAMlB,eAAe,CAAC,cAAsB,OAAqB;AAAA,IACzD,MAAM,UAAU,KAAK,aAAa,gBAAgB,cAAc,KAAK;AAAA,IACrE,IAAI,SAAS;AAAA,MACX,KAAK,WAAW;AAAA,IAClB;AAAA;AAAA,EAMF,iBAAiB,CAAC,cAA8B;AAAA,IAC9C,MAAM,YAAY,KAAK,aAAa,iBAAiB;AAAA,IACrD,OAAO,UAAU,OAAO,CAAC,MACvB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,iBAAiB,YAAY,CACrD,EAAE;AAAA;AAAA,EAMJ,8BAA8B,CAAC,OAAwC;AAAA,IACrE,OAAO,KAAK,aAAa,+BAA+B,KAAK;AAAA;AAAA,EAQ/D,gBAAgB,CAAC,OAAkD;AAAA,IACjE,OAAO,KAAK,aAAa,iBAAiB,KAAK;AAAA;AAAA,EAOjD,eAAe,CAAC,OAA2B;AAAA,IACzC,KAAK,aAAa,gBAAgB,KAAK;AAAA,IACvC,KAAK,WAAW;AAAA;AAAA,EAMV,cAAc,CAAC,OAAmC;AAAA,IACxD,IAAI,UAAU,MAAM;AAAA,IACpB,WAAW,QAAQ,OAAO;AAAA,MACxB,IACE,KAAK,WAAW,QAAQ,YACvB,KAAK,aAAa,QAAQ,YACzB,KAAK,WAAW,QAAQ,UAC1B;AAAA,QACA,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAGD,eAAe,CAAC,WAAyC;AAAA,IAC/D,OAAO,MAAM,KACX,IAAI,IAAI,UAAU,IAAI,CAAC,YAAY,CAAC,sBAAsB,OAAO,GAAG,OAAO,CAAC,CAAC,EAC1E,OAAO,CACZ;AAAA;AAAA,EAGM,wBAAwB,CAC9B,QACA,QACA,SACe;AAAA,IACf,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB,OAAO,CAAC;AAAA,IACV;AAAA,IAEA,MAAM,UAAU,KAAK,eAAe,MAAM;AAAA,IAC1C,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC5C,MAAM,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC5C,MAAM,cAAc,OAAO,IAAI,CAAC,gBAAgB;AAAA,MAC9C,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,UAAU,WAAW,WAAW;AAAA,MAChC,UAAU,WAAW,WAAW;AAAA,IAClC,EAAE;AAAA,IAEF,OAAO,KAAK,gBACV,QAAQ,MAAM,CAAC,GAAG,QAAQ,GAAG,WAAW,IAAI,WAC9C;AAAA;AAAA,EAMF,UAAU,CACR,QACA,QACA,SACM;AAAA,IACN,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,MAAM,mBAAmB,KAAK,yBAC5B,QACA,QACA,OACF;AAAA,IACA,MAAM,SAAS,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IAEzE,KAAK,YAAY,WAAW,QAAQ,QAAQ,OAAO;AAAA,IAEnD,MAAM,QAAQ,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IACxE,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,iBAAiB,IAAI,CAAC,aAAa;AAAA,QACjC;AAAA,QACA,QAAQ,OAAO,IAAI,sBAAsB,OAAO,CAAC;AAAA,QACjD,OAAO,MAAM,IAAI,sBAAsB,OAAO,CAAC;AAAA,MACjD,EAAE,CACJ;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAkCH,SAAS,CACP,WACA,cACA,SACM;AAAA,IACN,MAAM,mBAAmB,KAAK,gBAAgB;AAAA,MAC5C,GAAG,aAAa,QAAQ,CAAC,gBACvB,wBAAwB,WAAW,CACrC;AAAA,MACA,GAAI,QAAQ,MAAM,wBAAwB,SAAS,IAAI,CAAC;AAAA,IAC1D,CAAC;AAAA,IACD,MAAM,SAAS,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IAEzE,KAAK,YAAY,UAAU,WAAW,cAAc,OAAO;AAAA,IAE3D,MAAM,QAAQ,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IACxE,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,iBAAiB,IAAI,CAAC,aAAa;AAAA,QACjC;AAAA,QACA,QAAQ,OAAO,IAAI,sBAAsB,OAAO,CAAC;AAAA,QACjD,OAAO,MAAM,IAAI,sBAAsB,OAAO,CAAC;AAAA,MACjD,EAAE,CACJ;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EA4BH,UAAU,CACR,aACA,gBAKA,SACM;AAAA,IACN,IAAI,YAAY,WAAW,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,IAIA,IAAI,QAAQ,QAAQ,MAAM;AAAA,MACxB,WAAW,QAAQ,eAAe,OAAO;AAAA,QACvC,MAAM,SAAsB;AAAA,UAC1B,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,UAAU,KAAK,MAAM;AAAA,UACrB,UAAU,KAAK,MAAM;AAAA,QACvB;AAAA,QACA,KAAK,WAAW,aAAa,QAAQ,OAAO;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,IAIA,MAAM,eAAe,KAAK,mBAAmB,WAAW;AAAA,IACxD,MAAM,cAAc,aAAa,SAAS,aAAa,SAAS;AAAA,IAChE,MAAM,eAAe,aAAa,SAAS,aAAa,SAAS;AAAA,IAGjE,MAAM,YAA0B;AAAA,MAC9B,cAAc,YAAY,GAAI;AAAA,MAC9B,WAAW,YAAY,GAAI;AAAA,MAC3B,OAAO;AAAA,QACL,OAAO,EAAE,KAAK,aAAa,QAAQ,KAAK,aAAa,OAAO;AAAA,QAC5D,KAAK;AAAA,UACH,KAAK,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO;AAAA,UAClD,KAAK,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,IAGA,WAAW,QAAQ,eAAe,OAAO;AAAA,MACvC,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACjC,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACjC,MAAM,cACJ,KAAK,IAAI,IAAI,SAAS,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,MACxD,MAAM,cACJ,KAAK,IAAI,IAAI,SAAS,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,MAExD,MAAM,aAAa,cAAc,gBAAgB;AAAA,MACjD,MAAM,cAAc,cAAc,gBAAgB;AAAA,MAGlD,MAAM,aAAa,aAAa,eAAe,cAAc;AAAA,MAE7D,IAAI,YAAY;AAAA,QAEd,MAAM,cAA4B;AAAA,UAChC,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,OAAO;AAAA,YACL,OAAO,EAAE,KAAK,eAAe,KAAK,cAAc;AAAA,YAChD,KAAK;AAAA,cACH,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,cAC1C,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAAA,QAEA,KAAK,UAAU,WAAW,CAAC,WAAW,GAAG,OAAO;AAAA,MAClD,EAAO;AAAA,QAEL,MAAM,SAAsB;AAAA,UAC1B,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QAEA,KAAK,WAAW,aAAa,QAAQ,OAAO;AAAA;AAAA,IAEhD;AAAA;AAAA,EAMM,kBAAkB,CAAC,OAKzB;AAAA,IACA,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,IAEA,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IAEb,WAAW,QAAQ,OAAO;AAAA,MACxB,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,IACzC;AAAA,IAEA,OAAO,EAAE,QAAQ,QAAQ,QAAQ,OAAO;AAAA;AAAA,EAiB1C,QAAQ,CAAC,QAAqB,QAA2B;AAAA,IACvD,KAAK,WAAW,CAAC,MAAM,GAAG,QAAQ;AAAA,MAChC,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA;AAAA,EAwBH,SAAS,CAAC,aAA2B,QAA2B;AAAA,IAC9D,MAAM,QAAQ,KAAK,YAAY,mBAAmB,WAAW;AAAA,IAC7D,KAAK,WAAW,OAAO,QAAQ;AAAA,MAC7B,KAAK;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA;AAAA,EAKH,QAAQ,CAAC,MAA0D;AAAA,IACjE,MAAM,QAAQ,KAAK,gBAAgB,SAAS,IAAI;AAAA,IAChD,KAAK,uBAAuB,SAAS,IAAI;AAAA,IACzC,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,oBAAoB,IAAI,CAAC;AAAA,IAC1C,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,EAGT,WAAW,CAAC,MAIF;AAAA,IACR,MAAM,YACJ,KAAK,aACL,KAAK,gBAAgB,0BACnB,KAAK,cACL,KAAK,QACP;AAAA,IAEF,OAAO,KAAK,SAAS;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,MAAyD;AAAA,IACnE,MAAM,eAAe,KAAK,qBAAqB,IAAI;AAAA,IACnD,KAAK,gBAAgB,YAAY,IAAI;AAAA,IACrC,KAAK,uBAAuB,YAAY,IAAI;AAAA,IAC5C,KAAK,aAAa,YAAY,IAAI;AAAA,IAClC,KAAK,aAAa,kBAAkB,KAAK,cAAc,KAAK,SAAS;AAAA,IACrE,KAAK,iBAAiB,gBAAgB,KAAK,cAAc,KAAK,SAAS;AAAA,IACvE,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf;AAAA,MACA,eAAe,CAAC,EAAE,MAAM,YAAY,KAAK,CAAC;AAAA,IAC5C,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,MAIH;AAAA,IACP,MAAM,kBAAkB,KAAK,qBAAqB,IAAI;AAAA,IAEtD,KAAK,gBAAgB,YAAY,IAAI;AAAA,IACrC,KAAK,uBAAuB,YAAY,IAAI;AAAA,IAC5C,KAAK,aAAa,2BAA2B,IAAI;AAAA,IACjD,KAAK,aAAa,gBAChB,KAAK,cACL,KAAK,WACL,KAAK,YACP;AAAA,IACA,MAAM,eAAe,KAAK,gBAAgB,kBAAkB,CAAC,YAC3D,qBAAqB;AAAA,MACnB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,IACrB,CAAC,CACH;AAAA,IACA,KAAK,iBAAiB,gBACpB,KAAK,cACL,KAAK,WACL,KAAK,YACP;AAAA,IAEA,KAAK,aAAa;AAAA,MAChB,cAAc,yBAAyB,YAAY;AAAA,MACnD,cAAc,MAAM,KAClB,IAAI,IAAI;AAAA,QACN,GAAG;AAAA,QACH,GAAG,KAAK,qBAAqB;AAAA,UAC3B,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC,CACH;AAAA,IACF,CAAC;AAAA;AAAA,EAMH,QAAQ,CAAC,MAA4D;AAAA,IACnE,OAAO,CAAC,CAAC,KAAK,gBAAgB,SAAS,IAAI;AAAA;AAAA,EAG7C,SAAS,CAAC,cAAsB;AAAA,IAC9B,OAAO,KAAK,gBAAgB,UAAU,YAAY;AAAA;AAAA,EAGpD,gBAAgB,CAAC,cAAsB;AAAA,IACrC,OAAO,KAAK,gBAAgB,iBAAiB,YAAY;AAAA;AAAA,EAG3D,oBAAoB,CAAC,cAAsB;AAAA,IACzC,OAAO,KAAK,gBAAgB,qBAAqB,YAAY;AAAA;AAAA,EAG/D,yBAAyB,CAAC,cAAsB,UAAmB;AAAA,IACjE,OAAO,KAAK,gBAAgB,0BAC1B,cACA,QACF;AAAA;AAAA,EAGF,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,KAIC;AAAA,IACD,OAAO,KAAK,gBAAgB,SAAS,EAAE,cAAc,UAAU,CAAC;AAAA;AAAA,EAGlE,kBAAkB,CAAC,MAGkB;AAAA,IACnC,OAAO,KAAK,gBAAgB,mBAAmB,IAAI;AAAA;AAAA,EAMrD,MAAM,CACJ,OACA,SACe;AAAA,IACf,OAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AAAA;AAAA,EAMnD,OAAO,CACL,OACA,aACA,QACA,SACe;AAAA,IACf,MAAM,WAAW,KAAK,gBAAgB,eACpC,OACA,aACA,QACA,OACF;AAAA,IAEA,KAAK,gBAAgB,eAAe,SAAS,SAAS,SAAS,YAAY;AAAA,IAC3E,KAAK,aAAa;AAAA,MAChB,cAAc,kBAAkB;AAAA,QAC9B;AAAA,UACE,SAAS,SAAS;AAAA,UAClB,QAAQ,SAAS;AAAA,UACjB,OAAO,SAAS;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MACD,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA,IAED,OAAO,SAAS;AAAA;AAAA,EAMlB,UAAU,CACR,OACA,aACA,SACiB;AAAA,IACjB,MAAM,uBAAuB,KAAK,gBAAgB,kBAChD,OACA,aACA,OACF;AAAA,IAEA,IAAI,qBAAqB,WAAW,GAAG;AAAA,MACrC,OAAO,CAAC;AAAA,IACV;AAAA,IAEA,WAAW,YAAY,sBAAsB;AAAA,MAC3C,KAAK,gBAAgB,eAAe,SAAS,SAAS,SAAS,YAAY;AAAA,IAC7E;AAAA,IAEA,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,qBAAqB,IAAI,CAAC,cAAc;AAAA,QACtC,SAAS,SAAS;AAAA,QAClB,QAAQ,SAAS;AAAA,QACjB,OAAO,SAAS;AAAA,MAClB,EAAE,CACJ;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA,IAED,OAAO,qBAAqB,QAAQ,CAAC,aAAa,SAAS,OAAO;AAAA;AAAA,EAMpE,WAAW,CAAC,cAA4B;AAAA,IACtC,KAAK,gBAAgB,YAAY,YAAY;AAAA,IAC7C,KAAK,uBAAuB,YAAY,YAAY;AAAA,IACpD,KAAK,aAAa,YAAY,YAAY;AAAA,IAC1C,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,uBAAuB,YAAY,CAAC;AAAA,IACrD,CAAC;AAAA;AAAA,EAGH,cAAc,CAAC,cAA4B;AAAA,IACzC,MAAM,eAAe,KAAK,wBAAwB,YAAY;AAAA,IAC9D,KAAK,gBAAgB,eAAe,YAAY;AAAA,IAChD,KAAK,uBAAuB,eAAe,YAAY;AAAA,IACvD,KAAK,aAAa,eAAe,YAAY;AAAA,IAC7C,KAAK,aAAa,qBAAqB,YAAY;AAAA,IACnD,KAAK,iBAAiB,mBAAmB,YAAY;AAAA,IACrD,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf;AAAA,MACA,eAAe,CAAC,EAAE,MAAM,YAAY,aAAa,CAAC;AAAA,IACpD,CAAC;AAAA;AAAA,EAMH,WAAW,CAAC,cAA+B;AAAA,IACzC,OAAO,KAAK,gBAAgB,aAAa,EAAE,IAAI,YAAY;AAAA;AAAA,EAG7D,aAAa,CAAC,kBAA0B,gBAA8B;AAAA,IACpE,MAAM,iBAAiB,KAAK,gBACzB,aAAa,EACb,IAAI,gBAAgB;AAAA,IACvB,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,oBAAoB,6BAA6B;AAAA,IACnE;AAAA,IACA,IAAI,KAAK,gBAAgB,aAAa,EAAE,IAAI,cAAc,GAAG;AAAA,MAC3D,MAAM,IAAI,MAAM,oBAAoB,gCAAgC;AAAA,IACtE;AAAA,IAEA,KAAK,gBAAgB,YAAY,cAAc;AAAA,IAC/C,KAAK,uBAAuB,YAAY,cAAc;AAAA,IACtD,KAAK,aAAa,YAAY,cAAc;AAAA,IAE5C,YAAY,WAAW,UAAU,eAAe,QAAQ;AAAA,MACtD,KAAK,gBAAgB,SAAS;AAAA,QAC5B,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,MACD,KAAK,uBAAuB,SAAS;AAAA,QACnC,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,MACD,KAAK,gBAAgB,gBACnB,EAAE,cAAc,gBAAgB,UAAU,GAC1C,IAAI,IAAI,MAAM,OAAO,CACvB;AAAA,MAEA,MAAM,cAAc,KAAK,gBAAgB,SAAS;AAAA,QAChD,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,MACD,IAAI,aAAa;AAAA,QACf,YAAY,WAAW,IAAI,IAAI,MAAM,QAAQ;AAAA,QAC7C,IAAI,MAAM,kBAAkB,WAAW;AAAA,UACrC,YAAY,gBAAgB,gBAAgB,MAAM,aAAa;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB,KAAK,gBACzB,aAAa,EACb,IAAI,cAAc;AAAA,IACrB,IAAI,kBAAkB,eAAe,qBAAqB,WAAW;AAAA,MACnE,eAAe,mBAAmB,gBAChC,eAAe,gBACjB;AAAA,IACF;AAAA,IAEA,MAAM,mBAAmB,KAAK,uBAAuB,oBAAoB;AAAA,IACzE,MAAM,4BACJ,iBAAiB,oBAAoB,IAAI,gBAAgB;AAAA,IAC3D,IAAI,2BAA2B;AAAA,MAC7B,YAAY,gBAAgB,eAAe,2BAA2B;AAAA,QACpE,KAAK,uBAAuB,mBAAmB;AAAA,UAC7C;AAAA,UACA,YAAY,WAAW;AAAA,UACvB,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAM,yBACJ,iBAAiB,iBAAiB,IAAI,gBAAgB;AAAA,IACxD,IAAI,wBAAwB;AAAA,MAC1B,YAAY,WAAW,gBAAgB,wBAAwB;AAAA,QAC7D,YAAY,gBAAgB,eAAe,aAAa;AAAA,UACtD,KAAK,uBAAuB,mBAAmB;AAAA,YAC7C;AAAA,YACA,YAAY,WAAW;AAAA,YACvB,cAAc;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,eAAe,KAAK,aAAa,OAAO,IAAI,gBAAgB;AAAA,IAClE,IAAI,cAAc;AAAA,MAChB,YAAY,cAAc,cAAc;AAAA,QACtC,KAAK,aAAa,UAChB,EAAE,cAAc,kBAAkB,UAAU,GAC5C,EAAE,cAAc,gBAAgB,UAAU,CAC5C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,KAAK,aAAa,wBAAwB,GAAG;AAAA,MAC/D,IAAI,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,iBAAiB,gBAAgB,GAAG;AAAA,QACtE,KAAK,aAAa,oBAAoB;AAAA,aACjC;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,CAAC,SACtB,KAAK,iBAAiB,mBAClB,KAAK,MAAM,cAAc,eAAe,IACxC,IACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,WAAW,SAAS,KAAK,aAAa,iBAAiB,GAAG;AAAA,MACxD,IAAI,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,iBAAiB,gBAAgB,GAAG;AAAA,QACtE,KAAK,aAAa,aAAa;AAAA,aAC1B;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,CAAC,SACtB,KAAK,iBAAiB,mBAClB,KAAK,MAAM,cAAc,eAAe,IACxC,IACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,KAAK,gBAAgB,0BAA0B,gBAAgB,CAAC,YAC9D,wBAAwB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB,CAAC,CACH;AAAA,IAEA,KAAK,aAAa;AAAA,MAChB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,uBAAuB,cAAc,CAAC;AAAA,IACvD,CAAC;AAAA;AAAA,EAGH,cAAc,CAAC,MAAyD;AAAA,IACtE,MAAM,kBAAkB,KAAK,wBAAwB,KAAK,YAAY;AAAA,IAEtE,KAAK,gBAAgB,eAAe,IAAI;AAAA,IACxC,KAAK,uBAAuB,eAAe,IAAI;AAAA,IAC/C,KAAK,aAAa,8BAA8B,IAAI;AAAA,IACpD,KAAK,aAAa,mBAChB,KAAK,cACL,KAAK,eACP;AAAA,IACA,MAAM,eAAe,KAAK,gBAAgB,kBAAkB,CAAC,YAC3D,wBAAwB;AAAA,MACtB;AAAA,MACA,iBAAiB,KAAK;AAAA,MACtB,iBAAiB,KAAK;AAAA,IACxB,CAAC,CACH;AAAA,IACA,KAAK,iBAAiB,mBACpB,KAAK,cACL,KAAK,eACP;AAAA,IAEA,KAAK,aAAa;AAAA,MAChB,cAAc,yBAAyB,YAAY;AAAA,MACnD,cAAc,MAAM,KAClB,IAAI,IAAI;AAAA,QACN,GAAG;AAAA,QACH,GAAG,KAAK,wBAAwB,KAAK,eAAe;AAAA,MACtD,CAAC,CACH;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,YAAY,GAAG;AAAA,IACb,OAAO,KAAK,gBAAgB,aAAa;AAAA;AAAA,EAW3C,eAAe,CACb,MACA,SACA;AAAA,IACA,MAAM,kBAAkB,KAAK,wBAAwB,IAAI;AAAA,IACzD,KAAK,gBAAgB,gBAAgB,MAAM,OAAO;AAAA,IAClD,KAAK,aAAa;AAAA,MAChB,cAAc,8BACZ,MACA,iBACA,OACF;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAMH,cAAc,CAAC,SAAsB,SAA8B;AAAA,IACjE,MAAM,gBAAgB,KAAK,gBAAgB,eAAe,OAAO;AAAA,IACjE,KAAK,gBAAgB,eAAe,SAAS,OAAO;AAAA,IACpD,KAAK,aAAa;AAAA,MAChB,cAAc,kBAAkB;AAAA,QAC9B;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EASH,QAAQ,CACN,MAIA,WAIA,YAIA,WACM;AAAA,IACN,MAAM,mBAAmB,KAAK,gBAC5B,WAAW,QAAQ,CAAC,UAClB,wBAAwB;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC,CACH,CACF;AAAA,IACA,MAAM,SAAS,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IAEzE,KAAK,gBAAgB,KAAK,MAAM,WAAW,YAAY,SAAS;AAAA,IAEhE,MAAM,QAAQ,oBAAoB,KAAK,iBAAiB,gBAAgB;AAAA,IACxE,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,iBAAiB,IAAI,CAAC,aAAa;AAAA,QACjC;AAAA,QACA,QAAQ,OAAO,IAAI,sBAAsB,OAAO,CAAC;AAAA,QACjD,OAAO,MAAM,IAAI,sBAAsB,OAAO,CAAC;AAAA,MACjD,EAAE,CACJ;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAMH,qBAAqB,CAAC,SAAuB;AAAA,IAC3C,MAAM,eAAe,MAAM,KACzB,KAAK,gBAAgB,oBAAoB,OAAO,CAClD;AAAA,IACA,MAAM,SAAS,oBAAoB,KAAK,iBAAiB,YAAY;AAAA,IAErE,KAAK,gBAAgB,sBAAsB,OAAO;AAAA,IAElD,KAAK,aAAa;AAAA,MAChB,cAAc,kBACZ,aAAa,IAAI,CAAC,iBAAiB;AAAA,QACjC,SAAS;AAAA,QACT,QAAQ,OAAO,IAAI,sBAAsB,WAAW,CAAC;AAAA,QACrD,OAAO;AAAA,MACT,EAAE,CACJ;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAKH,QAAQ,GAAG;AAAA,IACT,OAAO;AAAA,MACL,WAAW,KAAK,gBAAgB,aAAa;AAAA,MAC7C,kBAAkB,KAAK,uBAAuB,oBAAoB;AAAA,MAClE,QAAQ,KAAK,aAAa;AAAA,MAC1B,mBAAmB,KAAK,aAAa,wBAAwB;AAAA,MAC7D,YAAY,KAAK,aAAa,iBAAiB;AAAA,MAC/C,YAAY,KAAK,iBAAiB,iBAAiB;AAAA,IACrD;AAAA;AAAA,EAGF,QAAQ,CAAC,UAAsB;AAAA,IAC7B,OAAO,KAAK,aAAa,SAAS,QAAQ;AAAA;AAAA,EAGpC,uBAAuB,GAAmB;AAAA,IAChD,MAAM,sBAAsB,KAAK,kBAAkB,WACjD,KAAK,iBACP;AAAA,IACA,MAAM,mBAAmB,KAAK,gBAAgB,WAAW;AAAA,IAEzD,OAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR,UAAU;AAAA,QACV,iBAAiB,KAAK,6BAA6B,gBAAgB;AAAA,QACnE,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC,WAAW,KAAK,iBAAiB,WAAW;AAAA,QAC5C,YAAY,oBAAoB;AAAA,QAChC,OAAO,oBAAoB;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA,EAGM,4BAA4B,CAClC,kBAC+C;AAAA,IAC/C,MAAM,mBAAmB,KAAK,uBAAuB,WAAW;AAAA,IAChE,MAAM,sBAAsB,IAAI;AAAA,IAChC,MAAM,mBAAmB,IAAI;AAAA,IAK7B,iBAAiB,QAAQ,CAAC,aAAa;AAAA,MACrC,MAAM,4BACJ,iBAAiB,oBAAoB,IAAI,SAAS,IAAI;AAAA,MACxD,oBAAoB,IAClB,SAAS,MACT,IAAI,IAAI,6BAA6B,CAAC,CAAC,CACzC;AAAA,MAEA,MAAM,eAAe,iBAAiB,iBAAiB,IACrD,SAAS,IACX;AAAA,MACA,MAAM,2BAA2B,IAAI;AAAA,MAIrC,SAAS,OAAO,QAAQ,CAAC,GAAG,cAAc;AAAA,QACxC,yBAAyB,IACvB,WACA,IAAI,IAAI,cAAc,IAAI,SAAS,KAAK,CAAC,CAAC,CAC5C;AAAA,OACD;AAAA,MACD,iBAAiB,IAAI,SAAS,MAAM,wBAAwB;AAAA,KAC7D;AAAA,IAED,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,mBAAmB,IAAI,IAAI,iBAAiB,iBAAiB;AAAA,IAC/D;AAAA;AAAA,EAGF,eAAe,GAAW;AAAA,IACxB,OAAO,UAAU,KAAK,wBAAwB,CAAC;AAAA;AAAA,EAGjD,uBAAuB,CAAC,MAAc;AAAA,IACpC,MAAM,eAAe,YAAY,IAAI;AAAA,IACrC,IACE,CAAC,gBACD,OAAO,iBAAiB,YACxB,EAAE,aAAa,iBACd,aAAa,YAAY,2BAC1B,CAAC,aAAa,UACd;AAAA,MACA,MAAM,IAAI,MACR,yEAAyE,0BAC3E;AAAA,IACF;AAAA,IAEA,KAAK,uBAAuB,MAAM;AAAA,IAClC,KAAK,gBAAgB,oBAAoB,aAAa,SAAS,QAAQ;AAAA,IAEvE,aAAa,SAAS,SAAS,QAAQ,CAAC,aAAa;AAAA,MACnD,KAAK,uBAAuB,YAAY,SAAS,IAAI;AAAA,MACrD,SAAS,OAAO,QAAQ,CAAC,UAAU;AAAA,QACjC,KAAK,uBAAuB,SAAS;AAAA,UACnC,cAAc,SAAS;AAAA,UACvB,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,uBAAuB,oBAC1B,aAAa,SAAS,eACxB;AAAA,IACA,KAAK,aAAa,oBAAoB,aAAa,SAAS,KAAK;AAAA,IACjE,KAAK,aAAa,oBAAoB,aAAa,SAAS,KAAK;AAAA,IACjE,KAAK,iBAAiB,oBAAoB,aAAa,SAAS,SAAS;AAAA,IACzE,KAAK,kBAAkB,oBACrB;AAAA,MACE,YAAY,aAAa,SAAS;AAAA,MAClC,OAAO,aAAa,SAAS;AAAA,IAC/B,GACA,KAAK,iBACP;AAAA,IAEA,KAAK,aAAa,WAAW;AAAA;AAGjC;",
8
- "debugId": "571CAE65F6B93C1664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "C4AB97ECFD760E2E64756E2164756E21",
9
9
  "names": []
10
10
  }