{
  "version": 3,
  "sources": ["../../../../src/core/managers/evaluation-manager.ts"],
  "sourcesContent": [
    "import { flags } from \"../../debug/flags.mjs\";\nimport { AstEvaluationNode } from \"../../evaluator/dependency-nodes/ast-evaluation-node.mjs\";\nimport { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.mjs\";\nimport { EvaluationContext } from \"../../evaluator/evaluation-context.mjs\";\nimport {\n  EvaluationError,\n  SheetNotFoundError,\n} from \"../../evaluator/evaluation-error.mjs\";\nimport { RangeEvaluationNode } from \"../../evaluator/range-evaluation-node.mjs\";\nimport { normalizeSerializedCellValue } from \"../../parser/formatter.mjs\";\nimport { FormulaEvaluator } from \"../../evaluator/formula-evaluator.mjs\";\nimport {\n  FormulaError,\n  type CellAddress,\n  type CellInRangeResult,\n  type CellValue,\n  type ErrorEvaluationResult,\n  type EvaluateAllCellsResult,\n  type EvaluationOrder,\n  type FunctionEvaluationResult,\n  type SerializedCellValue,\n  type SingleEvaluationResult,\n  type SpreadsheetRange,\n  type ValueEvaluationResult,\n} from \"../types.mjs\";\nimport {\n  captureEvaluationErrors,\n  getAbsoluteRange,\n  cellAddressToKey,\n  checkRangeIntersection,\n  getCellReference,\n  getRangeIntersection,\n  getRelativeRange,\n  isCellInRange,\n  parseCellReference,\n  rangeAddressToKey,\n} from \"../utils.mjs\";\nimport type { DependencyManager } from \"./dependency-manager.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.mjs\";\nimport { EmptyCellEvaluationNode } from \"../../evaluator/dependency-nodes/empty-cell-evaluation-node.mjs\";\nimport type { TableManager } from \"./table-manager.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport { VirtualCellValueNode } from \"../../evaluator/dependency-nodes/virtual-cell-value-node.mjs\";\nimport { ResourceDependencyNode } from \"../../evaluator/dependency-nodes/resource-dependency-node.mjs\";\nimport type {\n  NodeSnapshotId,\n  SerializedCellInRangeResultSnapshot,\n  SerializedErrorEvaluationResultSnapshot,\n  SerializedEvaluateAllCellsResultSnapshot,\n  SerializedFunctionEvaluationResultSnapshot,\n  SerializedSingleEvaluationResultSnapshot,\n  SerializedSpillMetaEvaluationResultSnapshot,\n  SerializedSpilledValuesEvaluationResultSnapshot,\n} from \"../engine-snapshot.mjs\";\nimport type { MutationInvalidation } from \"../mutation-invalidation.mjs\";\n\nexport class EvaluationManager {\n  private isEvaluating = false;\n\n  constructor(\n    private workbookManager: WorkbookManager,\n    private tableManager: TableManager,\n    private formulaEvaluator: FormulaEvaluator,\n    private dependencyManager: DependencyManager\n  ) {}\n\n  clearEvaluationCache(): void {\n    this.dependencyManager.clearEvaluationCache();\n  }\n\n  private dependsOnNode(\n    candidate: DependencyNode,\n    target: DependencyNode,\n    visited: Set<DependencyNode> = new Set()\n  ): boolean {\n    if (candidate === target) {\n      return true;\n    }\n\n    if (visited.has(candidate)) {\n      return false;\n    }\n    visited.add(candidate);\n\n    for (const dep of candidate.getDependencies()) {\n      if (this.dependsOnNode(dep, target, visited)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  invalidateFromMutation(footprint: MutationInvalidation): void {\n    this.dependencyManager.invalidateFromMutation(footprint);\n  }\n\n  evaluationResultToSerializedValue(\n    evaluation: SingleEvaluationResult,\n    cellAddress: CellAddress,\n    debug?: boolean\n  ): SerializedCellValue {\n    if (\n      evaluation.type !== \"error\" &&\n      evaluation.type !== \"awaiting-evaluation\"\n    ) {\n      const value = evaluation.result;\n\n      return value.type === \"infinity\"\n        ? value.sign === \"positive\"\n          ? \"INFINITY\"\n          : \"-INFINITY\"\n        : value.value;\n    }\n\n    if (evaluation.type === \"awaiting-evaluation\") {\n      return (\n        evaluation.errAddress.key +\n        \" is awaiting evaluation of \" +\n        evaluation.waitingFor.key\n      );\n    }\n\n    if (debug) {\n      const errAddress = evaluation.errAddress.key;\n      if (errAddress === cellAddressToKey(cellAddress)) {\n        return evaluation.err + \" \" + evaluation.message;\n      }\n      return (\n        evaluation.err +\n        \" in \" +\n        evaluation.errAddress.key +\n        \" \" +\n        evaluation.message\n      );\n    }\n\n    return evaluation.err;\n  }\n\n  private buildSnapshotOrigin(\n    node: CellValueNode | SpillMetaNode | AstEvaluationNode\n  ): CellAddress {\n    if (\"cellAddress\" in node) {\n      return node.cellAddress;\n    }\n\n    const contextDependency = node.getContextDependency();\n    return {\n      workbookName: contextDependency.workbookName ?? \"__snapshot__\",\n      sheetName: contextDependency.sheetName ?? \"__snapshot__\",\n      colIndex: contextDependency.colIndex ?? 0,\n      rowIndex: contextDependency.rowIndex ?? 0,\n    };\n  }\n\n  private serializeErrorEvaluationResultSnapshot(\n    evaluation: Exclude<ErrorEvaluationResult, { type: \"awaiting-evaluation\" }>,\n    getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n  ): SerializedErrorEvaluationResultSnapshot {\n    return {\n      type: \"error\",\n      err: evaluation.err,\n      message: evaluation.message,\n      errAddressId: getNodeSnapshotId(evaluation.errAddress),\n      sourceCell: evaluation.sourceCell,\n    };\n  }\n\n  serializeSingleEvaluationResultSnapshot(\n    evaluation: SingleEvaluationResult,\n    getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n  ): SerializedSingleEvaluationResultSnapshot | undefined {\n    if (evaluation.type === \"awaiting-evaluation\") {\n      return undefined;\n    }\n\n    if (evaluation.type === \"error\") {\n      return this.serializeErrorEvaluationResultSnapshot(\n        evaluation,\n        getNodeSnapshotId\n      );\n    }\n\n    return {\n      type: \"value\",\n      result: evaluation.result,\n      sourceCell: evaluation.sourceCell,\n    };\n  }\n\n  deserializeSingleEvaluationResultSnapshot(\n    evaluation: SerializedSingleEvaluationResultSnapshot,\n    resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n  ): SingleEvaluationResult {\n    if (evaluation.type === \"error\") {\n      return {\n        type: \"error\",\n        err: evaluation.err,\n        message: evaluation.message,\n        errAddress: resolveNodeSnapshotId(evaluation.errAddressId),\n        sourceCell: evaluation.sourceCell,\n      };\n    }\n\n    return {\n      type: \"value\",\n      result: evaluation.result,\n      sourceCell: evaluation.sourceCell,\n    };\n  }\n\n  serializeEvaluateAllCellsResultSnapshot(\n    evaluation: EvaluateAllCellsResult,\n    getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n  ): SerializedEvaluateAllCellsResultSnapshot | undefined {\n    if (evaluation.type === \"awaiting-evaluation\") {\n      return undefined;\n    }\n\n    if (evaluation.type === \"error\") {\n      return this.serializeErrorEvaluationResultSnapshot(\n        evaluation,\n        getNodeSnapshotId\n      );\n    }\n\n    const values: SerializedCellInRangeResultSnapshot[] = [];\n    for (const value of evaluation.values) {\n      const serialized = this.serializeSingleEvaluationResultSnapshot(\n        value.result,\n        getNodeSnapshotId\n      );\n      if (!serialized) {\n        return undefined;\n      }\n      values.push({\n        relativePos: value.relativePos,\n        result: serialized,\n      });\n    }\n\n    return {\n      type: \"values\",\n      values,\n    };\n  }\n\n  deserializeEvaluateAllCellsResultSnapshot(\n    evaluation: SerializedEvaluateAllCellsResultSnapshot,\n    resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n  ): EvaluateAllCellsResult {\n    if (evaluation.type === \"error\") {\n      return this.deserializeSingleEvaluationResultSnapshot(\n        evaluation,\n        resolveNodeSnapshotId\n      ) as ErrorEvaluationResult;\n    }\n\n    return {\n      type: \"values\",\n      values: evaluation.values.map((value) => ({\n        relativePos: value.relativePos,\n        result: this.deserializeSingleEvaluationResultSnapshot(\n          value.result,\n          resolveNodeSnapshotId\n        ),\n      })),\n    };\n  }\n\n  serializeFunctionEvaluationResultSnapshot(\n    evaluation: FunctionEvaluationResult,\n    options: {\n      sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n      getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n    }\n  ): SerializedFunctionEvaluationResultSnapshot | undefined {\n    if (evaluation.type !== \"spilled-values\") {\n      return this.serializeSingleEvaluationResultSnapshot(\n        evaluation,\n        options.getNodeSnapshotId\n      );\n    }\n\n    const origin = this.buildSnapshotOrigin(options.sourceNode);\n    const spillArea = evaluation.spillArea(origin);\n    const relativeSpillArea = getRelativeRange(spillArea, {\n      colIndex: origin.colIndex,\n      rowIndex: origin.rowIndex,\n    });\n\n    if (evaluation.sourceRange) {\n      return {\n        type: \"spilled-values\",\n        spill: {\n          kind: \"source-range\",\n          relativeSpillArea,\n          source: evaluation.source,\n          sourceCell: evaluation.sourceCell,\n          sourceRange: evaluation.sourceRange,\n        },\n      };\n    }\n\n    if (\n      relativeSpillArea.width.type !== \"number\" ||\n      relativeSpillArea.height.type !== \"number\"\n    ) {\n      return undefined;\n    }\n\n    const context = new EvaluationContext(\n      this.tableManager,\n      options.sourceNode,\n      origin\n    );\n    const values: SerializedCellInRangeResultSnapshot[] = [];\n\n    for (let y = 0; y < relativeSpillArea.height.value; y++) {\n      for (let x = 0; x < relativeSpillArea.width.value; x++) {\n        const result = captureEvaluationErrors(options.sourceNode, () =>\n          evaluation.evaluate({ x, y }, context)\n        );\n        const serialized = this.serializeSingleEvaluationResultSnapshot(\n          result,\n          options.getNodeSnapshotId\n        );\n        if (!serialized) {\n          return undefined;\n        }\n        values.push({\n          relativePos: { x, y },\n          result: serialized,\n        });\n      }\n    }\n\n    return {\n      type: \"spilled-values\",\n      spill: {\n        kind: \"materialized\",\n        relativeSpillArea,\n        source: evaluation.source,\n        sourceCell: evaluation.sourceCell,\n        sourceRange: evaluation.sourceRange,\n        values,\n      },\n    };\n  }\n\n  deserializeFunctionEvaluationResultSnapshot(\n    evaluation: SerializedFunctionEvaluationResultSnapshot,\n    resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n  ): FunctionEvaluationResult {\n    if (evaluation.type !== \"spilled-values\") {\n      return this.deserializeSingleEvaluationResultSnapshot(\n        evaluation,\n        resolveNodeSnapshotId\n      );\n    }\n\n    const spillSnapshot = evaluation.spill;\n    if (spillSnapshot.kind === \"materialized\") {\n      const values = new Map(\n        spillSnapshot.values.map((value) => [\n          `${value.relativePos.x},${value.relativePos.y}`,\n          this.deserializeSingleEvaluationResultSnapshot(\n            value.result,\n            resolveNodeSnapshotId\n          ),\n        ])\n      );\n\n      return {\n        type: \"spilled-values\",\n        source: spillSnapshot.source,\n        sourceCell: spillSnapshot.sourceCell,\n        sourceRange: spillSnapshot.sourceRange,\n        spillArea: (origin) =>\n          getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n            colIndex: origin.colIndex,\n            rowIndex: origin.rowIndex,\n          }),\n        evaluate: (spillOffset) =>\n          values.get(`${spillOffset.x},${spillOffset.y}`) ?? {\n            type: \"value\",\n            result: this.convertScalarValueToCellValue(\"\"),\n          },\n        evaluateAllCells: () => ({\n          type: \"values\",\n          values: spillSnapshot.values.map((value) => ({\n            relativePos: value.relativePos,\n            result: this.deserializeSingleEvaluationResultSnapshot(\n              value.result,\n              resolveNodeSnapshotId\n            ),\n          })),\n        }),\n      };\n    }\n\n    return {\n      type: \"spilled-values\",\n      source: spillSnapshot.source,\n      sourceCell: spillSnapshot.sourceCell,\n      sourceRange: spillSnapshot.sourceRange,\n      spillArea: (origin) =>\n        getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n          colIndex: origin.colIndex,\n          rowIndex: origin.rowIndex,\n        }),\n      evaluate: (spillOffset, context) => {\n        const cellAddress: CellAddress = {\n          workbookName: spillSnapshot.sourceRange.workbookName,\n          sheetName: spillSnapshot.sourceRange.sheetName,\n          colIndex: spillSnapshot.sourceRange.range.start.col + spillOffset.x,\n          rowIndex: spillSnapshot.sourceRange.range.start.row + spillOffset.y,\n        };\n\n        const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n          cellAddressToKey(cellAddress)\n        );\n        context.dependencyNode.addDependency(evalNode);\n        return evalNode.evaluationResult;\n      },\n      evaluateAllCells: ({ intersection, context, origin }) => {\n        let range = spillSnapshot.sourceRange.range;\n        if (intersection) {\n          const relativeRange = getRelativeRange(intersection, origin);\n          const projectedIntersection = getAbsoluteRange(relativeRange, {\n            colIndex: spillSnapshot.sourceRange.range.start.col,\n            rowIndex: spillSnapshot.sourceRange.range.start.row,\n          });\n          const nextRange = getRangeIntersection(\n            spillSnapshot.sourceRange.range,\n            projectedIntersection\n          );\n          if (nextRange) {\n            range = nextRange;\n          }\n        }\n\n        const rangeAddress = {\n          workbookName: spillSnapshot.sourceRange.workbookName,\n          sheetName: spillSnapshot.sourceRange.sheetName,\n          range,\n        };\n\n        const rangeNode = this.dependencyManager.getRangeNode(\n          rangeAddressToKey(rangeAddress)\n        );\n        context.dependencyNode.addDependency(rangeNode);\n        return rangeNode.result;\n      },\n    };\n  }\n\n  serializeSpillMetaEvaluationResultSnapshot(\n    evaluation: SpillMetaNode[\"evaluationResult\"],\n    options: {\n      sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n      getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n    }\n  ): SerializedSpillMetaEvaluationResultSnapshot | undefined {\n    if (evaluation.type === \"does-not-spill\") {\n      return { type: \"does-not-spill\" };\n    }\n\n    if (evaluation.type === \"error\") {\n      return this.serializeErrorEvaluationResultSnapshot(\n        evaluation,\n        options.getNodeSnapshotId\n      );\n    }\n\n    const serialized = this.serializeFunctionEvaluationResultSnapshot(\n      evaluation,\n      options\n    );\n    if (!serialized || serialized.type !== \"spilled-values\") {\n      return undefined;\n    }\n\n    return serialized;\n  }\n\n  deserializeSpillMetaEvaluationResultSnapshot(\n    evaluation: SerializedSpillMetaEvaluationResultSnapshot,\n    resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n  ): SpillMetaNode[\"evaluationResult\"] {\n    if (evaluation.type === \"does-not-spill\") {\n      return evaluation;\n    }\n\n    if (evaluation.type === \"error\") {\n      return this.deserializeSingleEvaluationResultSnapshot(\n        evaluation,\n        resolveNodeSnapshotId\n      ) as SpillMetaNode[\"evaluationResult\"];\n    }\n\n    return this.deserializeFunctionEvaluationResultSnapshot(\n      evaluation,\n      resolveNodeSnapshotId\n    ) as SpillMetaNode[\"evaluationResult\"];\n  }\n\n  evaluateEmptyCell(node: EmptyCellEvaluationNode): void {\n    if (node.resolved) {\n      const result = node.evaluationResult;\n      if (result && result.type !== \"awaiting-evaluation\") {\n        return;\n      }\n    }\n\n    this.dependencyManager.unregisterNode(node);\n    node.resetDirectDepsUpdated();\n\n    const ctx = new EvaluationContext(\n      this.tableManager,\n      node,\n      node.cellAddress\n    );\n    const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);\n\n    if (inSpilled) {\n      // if we are spilling then we can just add the spill origin as a dependency and evaluate the spilled value\n      const spillTarget = this.dependencyManager.getSpilledAddress(\n        node.cellAddress,\n        inSpilled\n      );\n      const spillOriginKey = cellAddressToKey(inSpilled.origin).replace(\n        /^[^:]+:/,\n        \"spill-meta:\"\n      );\n      const spillMetaNode =\n        this.dependencyManager.getSpillMetaNode(spillOriginKey);\n      node.addDependency(spillMetaNode);\n      const result = spillMetaNode.evaluationResult;\n      if (result.type === \"spilled-values\") {\n        // let's evaluate the spilled value to extract dependencies\n        const evaluation = captureEvaluationErrors(spillMetaNode, () => {\n          return result.evaluate(spillTarget.spillOffset, ctx);\n        });\n        node.setEvaluationResult(evaluation);\n      }\n    } else {\n      // upgrade any frontier dependencies that spill into the range\n      node.upgradeFrontierDependencies();\n\n      const evaluationResult: SingleEvaluationResult = {\n        type: \"value\",\n        result: this.convertScalarValueToCellValue(\"\"),\n      };\n      // for now let's just store the empty value, the next time the cell is evaluated isSpilled will be true and the spilled value will be evaluated\n      node.setEvaluationResult(evaluationResult);\n    }\n\n    this.dependencyManager.registerNode(node);\n  }\n\n  evaluateRangeNode(node: RangeEvaluationNode): void {\n    if (node.resolved) {\n      return;\n    }\n\n    this.dependencyManager.unregisterNode(node);\n    node.resetDirectDepsUpdated();\n\n    const result = captureEvaluationErrors(node, (): EvaluateAllCellsResult => {\n      node.upgradeFrontierDependencies();\n\n      const evalOrder = node.getRangeEvalOrder();\n      const circularEntryCache = new Map<DependencyNode, boolean>();\n      const shouldSkipCircularEntry = (candidate: DependencyNode) => {\n        const cached = circularEntryCache.get(candidate);\n        if (cached !== undefined) {\n          return cached;\n        }\n\n        // If a cell inside the range depends back on the range itself, including\n        // its current value would count a circular result back into the same\n        // aggregate on a later rerun.\n        const isCircular = this.dependsOnNode(candidate, node);\n        circularEntryCache.set(candidate, isCircular);\n        return isCircular;\n      };\n\n      const results: CellInRangeResult[] = [];\n\n      for (const entry of evalOrder) {\n        if (entry.type === \"value\") {\n          if (shouldSkipCircularEntry(entry.node)) {\n            continue;\n          }\n\n          const entryAddress = entry.address;\n          const result = entry.node.evaluationResult;\n\n          const relativePos = {\n            x: entryAddress.colIndex - node.address.range.start.col,\n            y: entryAddress.rowIndex - node.address.range.start.row,\n          };\n\n          results.push({ result: result, relativePos });\n        } else if (\n          entry.type === \"empty_cell\" ||\n          entry.type === \"empty_range\"\n        ) {\n          for (const candidateNode of entry.candidates) {\n            if (shouldSkipCircularEntry(candidateNode)) {\n              continue;\n            }\n\n            if (candidateNode.evaluationResult.type === \"spilled-values\") {\n              const spillArea = candidateNode.evaluationResult.spillArea(\n                candidateNode.cellAddress\n              );\n              if (entry.type === \"empty_range\") {\n                const intersects = checkRangeIntersection(\n                  spillArea,\n                  entry.address.range\n                );\n                if (intersects) {\n                  // When a spilled range intersects with our target range, we need to evaluate\n                  // only the cells that fall within the intersection area.\n                  //\n                  // Example: If cell A10 contains a spilled range that covers A10:B11,\n                  // and our target range is B10:INFINITY, then we only want to evaluate\n                  // the intersection B10:B11 from the spilled range.\n                  //\n                  // The evaluateAllCells method expects the intersection to be passed\n                  // so it can limit evaluation to only the relevant cells.\n                  const ctx = new EvaluationContext(\n                    this.tableManager,\n                    node,\n                    candidateNode.cellAddress\n                  );\n                  const spilledResults =\n                    candidateNode.evaluationResult.evaluateAllCells.call(\n                      this.formulaEvaluator,\n                      {\n                        context: ctx,\n                        evaluate: candidateNode.evaluationResult.evaluate,\n                        intersection: entry.address.range,\n                        origin: candidateNode.cellAddress,\n                        lookupOrder: \"col-major\",\n                      }\n                    );\n\n                  if (spilledResults.type === \"values\") {\n                    results.push(...spilledResults.values);\n                  } else {\n                    return spilledResults;\n                  }\n                }\n              } else {\n                const intersects = isCellInRange(entry.address, spillArea);\n                if (intersects) {\n                  // When a spilled range intersects with our target range, we need to evaluate\n                  // only the cells that fall within the intersection area.\n                  //\n                  // Example: If cell A10 contains a spilled range that covers A10:B11,\n                  // and our target range is B10:INFINITY, then we only want to evaluate\n                  // the intersection B10:B11 from the spilled range.\n                  //\n                  // The evaluateAllCells method expects the intersection to be passed\n                  // so it can limit evaluation to only the relevant cells.\n\n                  const relativePos = {\n                    x:\n                      entry.address.colIndex -\n                      candidateNode.cellAddress.colIndex,\n                    y:\n                      entry.address.rowIndex -\n                      candidateNode.cellAddress.rowIndex,\n                  };\n                  const ctx = new EvaluationContext(\n                    this.tableManager,\n                    node,\n                    candidateNode.cellAddress\n                  );\n                  const spilledResult = candidateNode.evaluationResult.evaluate(\n                    relativePos,\n                    ctx\n                  );\n\n                  results.push({\n                    relativePos: {\n                      x: entry.address.colIndex - node.address.range.start.col,\n                      y: entry.address.rowIndex - node.address.range.start.row,\n                    },\n                    result: spilledResult,\n                  });\n                }\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        type: \"values\",\n        values: results,\n      };\n    });\n\n    node.setResult(result);\n    this.dependencyManager.registerNode(node);\n  }\n\n  evaluateCellNode(\n    node: CellValueNode | SpillMetaNode | VirtualCellValueNode\n  ): void {\n    // Enable caching for resolved nodes\n    if (node.resolved) {\n      return;\n    }\n\n    const finalizePersistentNode = () => {\n      if (node instanceof VirtualCellValueNode) {\n        return;\n      }\n\n      this.dependencyManager.registerNode(node);\n    };\n\n    if (!(node instanceof VirtualCellValueNode)) {\n      this.dependencyManager.unregisterNode(node);\n    }\n    node.resetDirectDepsUpdated();\n\n    const ctx = new EvaluationContext(\n      this.tableManager,\n      node,\n      node.cellAddress\n    );\n\n    if (node instanceof CellValueNode && node.spillMeta) {\n      // we are evaluating a e.g. A1 in A1=SEQUENCE(10), where we want the value in the cell in A1, i.e. 1\n      // As A1 is already pointing to a spill meta node, everything has been setup already,\n      // we just need to evaluate the spill origin and assign the result to the currentDepNode\n      const spillOrigin = node.spillMeta;\n      if (spillOrigin.evaluationResult.type === \"spilled-values\") {\n        const result = spillOrigin.evaluationResult.evaluate(\n          { x: 0, y: 0 },\n          ctx\n        );\n        node.setEvaluationResult(result);\n        finalizePersistentNode();\n        return;\n      }\n    }\n\n    let content: SerializedCellValue;\n    try {\n      if (node instanceof VirtualCellValueNode) {\n        content = node.cellValue;\n      } else {\n        content = this.workbookManager.getSerializedCellValue(node.cellAddress);\n      }\n    } catch (err) {\n      const evaluationResult: ErrorEvaluationResult = {\n        type: \"error\",\n        err: FormulaError.ERROR,\n        message: \"Syntax error\",\n        errAddress: node,\n      };\n      node.setEvaluationResult(evaluationResult);\n      if (!(node instanceof VirtualCellValueNode)) {\n        this.dependencyManager.registerNode(node);\n      }\n      return;\n    }\n\n    if (typeof content !== \"string\" || !content.startsWith(\"=\")) {\n      if (node instanceof SpillMetaNode) {\n        node.setEvaluationResult({\n          type: \"does-not-spill\",\n        });\n        finalizePersistentNode();\n        return;\n      }\n      // Static value cells cannot have frontier dependencies\n      const result: ValueEvaluationResult = {\n        type: \"value\",\n        result: this.convertScalarValueToCellValue(content),\n      };\n      node.setEvaluationResult(result);\n      finalizePersistentNode();\n      return;\n    }\n\n    let evaluation: FunctionEvaluationResult = captureEvaluationErrors(\n      node,\n      () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx)\n    );\n\n    // the evaluated cell IS A spilling formula, e.g. if dependencyKey points to A1, then the formula is e.g. A1=SEQUENCE(10), or A1=A3:B5\n    if (evaluation.type === \"spilled-values\") {\n      const spillArea = evaluation.spillArea(node.cellAddress);\n\n      if (!this.canSpill(node.cellAddress, spillArea)) {\n        // Override evaluation with SPILL error, but continue execution to set up nodes\n        evaluation = {\n          type: \"error\",\n          err: FormulaError.SPILL,\n          message: \"Cannot spill - area is blocked\",\n          errAddress: node,\n        };\n      } else {\n        // Spill succeeds - register it\n        this.dependencyManager.setSpilledValue(node.key, {\n          spillOnto: spillArea,\n          origin: node.cellAddress,\n        });\n      }\n\n      // Set up spill meta node and evaluation results (even if spill failed)\n      if (node instanceof SpillMetaNode) {\n        // we have already setup an origin/spill meta node relationship,\n        // so we are just reevaluating the spill meta node here\n        node.setEvaluationResult(evaluation);\n        finalizePersistentNode();\n      } else {\n        const spillMetaNode = this.dependencyManager.getSpillMetaNode(\n          node.key.replace(/^[^:]+:/, \"spill-meta:\")\n        );\n\n        node.addDependency(spillMetaNode);\n        node.setSpillMetaNode(spillMetaNode);\n        spillMetaNode.setEvaluationResult(evaluation);\n        this.dependencyManager.registerNode(spillMetaNode);\n\n        if (evaluation.type === \"spilled-values\") {\n          const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);\n          node.setEvaluationResult(originResult);\n        } else {\n          // Spill failed - set error on origin cell\n          node.setEvaluationResult(evaluation);\n        }\n      }\n      finalizePersistentNode();\n      return;\n    }\n\n    if (evaluation.type === \"value\") {\n      if (node instanceof SpillMetaNode) {\n        node.setEvaluationResult({\n          type: \"does-not-spill\",\n        });\n        finalizePersistentNode();\n        return;\n      } else {\n        node.setEvaluationResult(evaluation);\n        finalizePersistentNode();\n        return;\n      }\n    }\n\n    node.setEvaluationResult(evaluation);\n    finalizePersistentNode();\n  }\n\n  evaluateDependencyNode(dependency: DependencyNode): void {\n    if (dependency instanceof EmptyCellEvaluationNode) {\n      this.evaluateEmptyCell(dependency);\n      return;\n    }\n    if (dependency instanceof RangeEvaluationNode) {\n      this.evaluateRangeNode(dependency);\n      return;\n    }\n    if (\n      dependency instanceof CellValueNode ||\n      dependency instanceof VirtualCellValueNode\n    ) {\n      this.evaluateCellNode(dependency);\n      return;\n    }\n    if (dependency instanceof AstEvaluationNode) {\n      return;\n    }\n    if (dependency instanceof ResourceDependencyNode) {\n      return;\n    }\n    if (dependency instanceof SpillMetaNode) {\n      this.evaluateCellNode(dependency);\n      return;\n    }\n    throw new Error(\"Invalid dependency: \" + (dependency as any).key);\n  }\n\n  /**\n   * User exposed method to evaluate a formula\n   */\n  evaluateFormula(\n    /**\n     * formula for example\n     */\n    cellValue: SerializedCellValue,\n    cellAddress: CellAddress\n  ): SerializedCellValue {\n    if (this.isEvaluating) {\n      throw new Error(\"Evaluation in progress\");\n    }\n\n    const node = this.dependencyManager.getVirtualCellValueNode(\n      cellAddress,\n      cellValue\n    );\n\n    if (node.evaluationResult.type === \"awaiting-evaluation\") {\n      this.evaluateCell(node);\n    }\n\n    const result = node.evaluationResult;\n\n    return this.evaluationResultToSerializedValue(result, cellAddress);\n  }\n\n  /**\n   * Evaluates a cell by building the evaluation order and evaluating the dependencies in order\n   */\n  evaluateCell(\n    node: CellValueNode | EmptyCellEvaluationNode | VirtualCellValueNode\n  ): void {\n    if (this.isEvaluating) {\n      throw new Error(\"Evaluation in progress\");\n    }\n    this.isEvaluating = true;\n\n    let precalculatedPlan: EvaluationOrder | undefined;\n\n    let requiresReRun = true;\n    while (requiresReRun) {\n      requiresReRun = false;\n\n      // Use DependencyManager to build evaluation order\n      const evaluationPlan =\n        precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);\n\n      if (evaluationPlan.hasCycle) {\n        const evaluationResult: ErrorEvaluationResult = {\n          type: \"error\",\n          err: FormulaError.CYCLE,\n          message: Array.from(evaluationPlan.cycleNodes ?? [])\n            .map((node) => node.key)\n            .join(\" -> \"),\n          errAddress: node,\n        };\n        // cycle detected\n        if (evaluationPlan.cycleNodes) {\n          for (const node of evaluationPlan.cycleNodes) {\n            if (\n              !(node instanceof RangeEvaluationNode) &&\n              !(node instanceof ResourceDependencyNode)\n            ) {\n              node.setEvaluationResult(evaluationResult);\n            }\n          }\n        }\n        this.isEvaluating = false;\n      }\n\n      // Evaluate all dependencies in order\n      const timeStart = performance.now();\n      const durations: { duration: number; key: string }[] = [];\n      let numResolved = 0;\n      if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n        // console.profile();\n      }\n      evaluationPlan.evaluationOrder.forEach((dependency) => {\n        const start = performance.now();\n        if (dependency.resolved) {\n          numResolved++;\n        }\n        this.evaluateDependencyNode(dependency);\n\n        const end = performance.now();\n        if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n          durations.push({ duration: end - start, key: dependency.key });\n        }\n      });\n      if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n        // console.profileEnd();\n      }\n      if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n        const percentResolved = Math.round(\n          (100 * numResolved) / evaluationPlan.evaluationOrder.size\n        );\n        const avgDuration =\n          durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;\n        console.log(\n          `%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(\n            performance.now() - timeStart\n          ).toFixed(\n            1\n          )}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(\n            2\n          )}ms avg`,\n          \"color:#83aaff;font-weight:bold;\",\n          \"color:#fff;font-weight:bold;\",\n          \"color:#7fff9e\",\n          \"color:#85baff\",\n          \"color:#ffdfa3\"\n        );\n      }\n\n      this.dependencyManager.markResolvedNodes(node);\n\n      const nextEvaluationPlan =\n        this.dependencyManager.buildEvaluationOrder(node);\n\n      this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);\n\n      precalculatedPlan = nextEvaluationPlan;\n\n      // Check if new dependencies were discovered during evaluation\n      if (nextEvaluationPlan.hash !== evaluationPlan.hash) {\n        requiresReRun = true;\n      } else {\n        this.isEvaluating = false;\n        return;\n      }\n    }\n    this.isEvaluating = false;\n  }\n\n  convertScalarValueToCellValue(val: SerializedCellValue): CellValue {\n    if (val === \"INFINITY\") {\n      return { type: \"infinity\", sign: \"positive\" };\n    }\n    if (val === \"-INFINITY\") {\n      return { type: \"infinity\", sign: \"negative\" };\n    }\n    if (typeof val === \"number\") {\n      return { type: \"number\", value: val };\n    }\n    if (typeof val === \"boolean\") {\n      return { type: \"boolean\", value: val };\n    }\n    if (typeof val === \"undefined\") {\n      return { type: \"string\", value: \"\" };\n    }\n    return { type: \"string\", value: val };\n  }\n\n  // todo optimize using workbook manager\n  canSpill(spillCandidate: CellAddress, spillArea: SpreadsheetRange): boolean {\n    // Check if the spill origin cell is inside a table - spilling formulas cannot exist in tables\n    if (this.tableManager.isCellInTable(spillCandidate)) {\n      return false;\n    }\n\n    // Check if the spill area would intersect with any table - formulas cannot spill into tables\n    if (\n      this.tableManager.doesRangeIntersectTable(\n        spillCandidate.workbookName,\n        spillCandidate.sheetName,\n        spillArea\n      )\n    ) {\n      return false;\n    }\n\n    const sheet = this.workbookManager.getSheet(spillCandidate);\n    if (!sheet) {\n      throw new SheetNotFoundError(spillCandidate.sheetName);\n    }\n    const cellId = getCellReference(spillCandidate);\n    const content = sheet.content.get(cellId);\n    if (!content) {\n      throw new EvaluationError(FormulaError.REF, `Cell not found: ${cellId}`);\n    }\n    for (const spilledValue of this.dependencyManager.spilledValues) {\n      if (\n        spilledValue.origin.workbookName !== spillCandidate.workbookName ||\n        spilledValue.origin.sheetName !== spillCandidate.sheetName\n      ) {\n        continue;\n      }\n      if (\n        spilledValue.origin.colIndex === spillCandidate.colIndex &&\n        spilledValue.origin.rowIndex === spillCandidate.rowIndex\n      ) {\n        // we are already have a spill, this one will be replaced\n        continue;\n      }\n\n      if (checkRangeIntersection(spillArea, spilledValue.spillOnto)) {\n        return false;\n      }\n    }\n    // let's just check the raw data if there is something in the range\n    for (const key of sheet.content.keys()) {\n      const cellAddress = parseCellReference(key);\n      const endCol = spillArea.end.col;\n      const endRow = spillArea.end.row;\n\n      if (\n        cellAddress.colIndex === spillCandidate.colIndex &&\n        cellAddress.rowIndex === spillCandidate.rowIndex\n      ) {\n        continue;\n      }\n\n      if (endCol.type === \"number\" && endRow.type === \"number\") {\n        if (\n          cellAddress.colIndex >= spillArea.start.col &&\n          cellAddress.colIndex <= endCol.value &&\n          cellAddress.rowIndex >= spillArea.start.row &&\n          cellAddress.rowIndex <= endRow.value\n        ) {\n          if (\n            normalizeSerializedCellValue(sheet.content.get(key)) !== undefined\n          ) {\n            // there is something in the range, so we can't spill\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  getCellEvaluationResult(\n    cellAddress: CellAddress\n  ): SingleEvaluationResult | undefined {\n    if (this.isEvaluating) {\n      throw new Error(\"Evaluation in progress\");\n    }\n\n    const nodeKey = cellAddressToKey(cellAddress);\n    const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);\n\n    const sheet = this.workbookManager.getSheet(cellAddress);\n    if (!sheet) {\n      throw new SheetNotFoundError(cellAddress.sheetName);\n    }\n\n    if (node.evaluationResult.type === \"awaiting-evaluation\") {\n      // if (cellAddressToKey(cellAddress).includes(\"G10\")) {\n      //   console.group(\"Evaluation of G10\");\n      //   flags.isProfiling = true;\n      //   console.time(\"Evaluation of G10\");\n      //   console.profile(\"Evaluation of G10\");\n      // }\n      this.evaluateCell(node);\n      // if (flags.isProfiling) {\n      //   flags.isProfiling = false;\n      //   console.timeEnd(\"Evaluation of G10\");\n      //   console.profileEnd(\"Evaluation of G10\");\n      //   console.groupEnd();\n      // }\n    }\n\n    const result = node.evaluationResult;\n\n    return result;\n  }\n}\n"
  ],
  "mappings": "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",
  "debugId": "E28F2E811FD149C364756E2164756E21",
  "names": []
}