@fluidframework/merge-tree 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/api-report/merge-tree.legacy.alpha.api.md +20 -0
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +1 -29
- package/dist/attributionCollection.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -4
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +0 -2
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +1 -30
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +131 -167
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +16 -1
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +5 -2
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +8 -54
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +0 -2
- package/dist/properties.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +0 -14
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +0 -2
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +1 -3
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +1 -4
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +1 -11
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +0 -1
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +0 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +1 -9
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +0 -4
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +36 -27
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +1 -1
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +2 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +29 -11
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.spec.js +55 -0
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +0 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +17 -7
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +0 -4
- package/dist/zamboni.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +1 -29
- package/lib/attributionCollection.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +3 -4
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +0 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +1 -30
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +132 -168
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +16 -1
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +5 -2
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +8 -54
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +0 -2
- package/lib/properties.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +0 -14
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +0 -2
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +1 -3
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +1 -4
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +1 -11
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +0 -1
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +0 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +1 -9
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +0 -4
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +37 -28
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +1 -1
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts +2 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +30 -12
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.spec.js +55 -0
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +0 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +18 -8
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +0 -4
- package/lib/zamboni.js.map +1 -1
- package/package.json +22 -21
- package/src/attributionCollection.ts +14 -42
- package/src/client.ts +8 -9
- package/src/index.ts +1 -0
- package/src/localReference.ts +1 -3
- package/src/mergeTree.ts +185 -208
- package/src/mergeTreeNodes.ts +22 -3
- package/src/partialLengths.ts +23 -68
- package/src/properties.ts +1 -3
- package/src/revertibles.ts +7 -21
- package/src/segmentGroupCollection.ts +1 -3
- package/src/segmentPropertiesManager.ts +0 -1
- package/src/snapshotLoader.ts +2 -4
- package/src/snapshotV1.ts +5 -15
- package/src/snapshotlegacy.ts +1 -2
- package/src/sortedSegmentSet.ts +3 -10
- package/src/sortedSet.ts +2 -6
- package/src/zamboni.ts +4 -8
- package/tsconfig.json +1 -0
package/dist/mergeTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable no-bitwise */\n\nimport { assert, Heap, IComparer } from \"@fluidframework/core-utils/internal\";\nimport { DataProcessingError, UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IAttributionCollectionSerializer } from \"./attributionCollection.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { Client } from \"./client.js\";\nimport { DoublyLinkedList, ListNode } from \"./collections/index.js\";\nimport {\n\tNonCollabClient,\n\tTreeMaintenanceSequenceNumber,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"./constants.js\";\nimport { EndOfTreeSegment, StartOfTreeSegment } from \"./endOfTreeSegment.js\";\nimport {\n\tLocalReferenceCollection,\n\tLocalReferencePosition,\n\tSlidingPreference,\n\tanyLocalReferencePosition,\n\tfilterLocalReferencePositions,\n} from \"./localReference.js\";\nimport {\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeSegmentDelta,\n\tMergeTreeDeltaCallback,\n\tMergeTreeMaintenanceCallback,\n\tMergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback.js\";\nimport {\n\tNodeAction,\n\tbackwardExcursion,\n\tdepthFirstNodeWalk,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"./mergeTreeNodeWalk.js\";\nimport {\n\tBlockAction,\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tIMergeNode,\n\tIMoveInfo,\n\tIRemovalInfo,\n\tISegment,\n\tISegmentAction,\n\tISegmentChanges,\n\tISegmentLeaf,\n\tInsertContext,\n\tMarker,\n\tMaxNodesInBlock,\n\tMergeBlock,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n\treservedMarkerIdKey,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n} from \"./mergeTreeNodes.js\";\nimport type { TrackingGroup } from \"./mergeTreeTracking.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\tIMergeTreeDeltaOp,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"./ops.js\";\nimport { PartialSequenceLengths } from \"./partialLengths.js\";\nimport { PerspectiveImpl, isSegmentPresent } from \"./perspective.js\";\nimport { PropertySet, createMap, extend, extendIfUndefined } from \"./properties.js\";\nimport {\n\tDetachedReferencePosition,\n\tReferencePosition,\n\trefGetTileLabels,\n\trefHasTileLabel,\n\trefTypeIncludesFlag,\n} from \"./referencePositions.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { PropertiesRollback } from \"./segmentPropertiesManager.js\";\nimport { endpointPosAndSide, type SequencePlace } from \"./sequencePlace.js\";\nimport { zamboniSegments } from \"./zamboni.js\";\n\nfunction wasRemovedAfter(seg: ISegment, seq: number): boolean {\n\treturn (\n\t\tseg.removedSeq !== UnassignedSequenceNumber &&\n\t\t(seg.removedSeq === undefined || seg.removedSeq > seq)\n\t);\n}\n\nfunction markSegmentMoved(seg: ISegment, moveInfo: IMoveInfo): void {\n\tseg.moveDst = moveInfo.moveDst;\n\tseg.movedClientIds = [...moveInfo.movedClientIds];\n\tseg.movedSeqs = [moveInfo.movedSeq];\n\tseg.movedSeq = moveInfo.movedSeq;\n\tseg.localMovedSeq = moveInfo.localMovedSeq;\n\tseg.wasMovedOnInsert = moveInfo.wasMovedOnInsert;\n}\n\nfunction isMoved(segment: ISegment): segment is ISegment & IMoveInfo {\n\treturn toMoveInfo(segment) !== undefined;\n}\n\nfunction isRemoved(segment: ISegment): segment is ISegment & IRemovalInfo {\n\treturn toRemovalInfo(segment) !== undefined;\n}\n\nfunction isRemovedAndAcked(segment: ISegment): segment is ISegment & IRemovalInfo {\n\tconst removalInfo = toRemovalInfo(segment);\n\treturn removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;\n}\n\nfunction isMovedAndAcked(segment: ISegment): segment is ISegment & IMoveInfo {\n\tconst moveInfo = toMoveInfo(segment);\n\treturn moveInfo !== undefined && moveInfo.movedSeq !== UnassignedSequenceNumber;\n}\n\nfunction isRemovedAndAckedOrMovedAndAcked(segment: ISegment): boolean {\n\treturn isRemovedAndAcked(segment) || isMovedAndAcked(segment);\n}\n\nfunction isRemovedOrMoved(segment: ISegment): boolean {\n\treturn isRemoved(segment) || isMoved(segment);\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode): number | undefined {\n\tif (!node.isLeaf()) {\n\t\treturn node.cachedLength;\n\t}\n\treturn mergeTree.localNetLength(node);\n}\n\nconst LRUSegmentComparer: IComparer<LRUSegment> = {\n\tmin: { maxSeq: -2 },\n\tcompare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IMergeTreeOptions {\n\tcatchUpBlobName?: string;\n\t/**\n\t * Whether or not reference positions can slide to special endpoint segments\n\t * denoting the positions immediately before the start and immediately after\n\t * the end of the string.\n\t *\n\t * This is primarily useful in the case of interval stickiness.\n\t */\n\tmergeTreeReferencesCanSlideToEndpoint?: boolean;\n\tmergeTreeSnapshotChunkSize?: number;\n\t/**\n\t * Whether to use the SnapshotV1 format over SnapshotLegacy.\n\t *\n\t * SnapshotV1 stores a view of the merge-tree at the current sequence number, preserving merge metadata\n\t * (e.g. clientId, seq, etc.) only for segment changes within the collab window.\n\t *\n\t * SnapshotLegacy stores a view of the merge-tree at the minimum sequence number along with the ops between\n\t * the minimum sequence number and the current sequence number.\n\t *\n\t * Both formats merge segments where possible (see {@link ISegment.canAppend})\n\t *\n\t * default: false\n\t *\n\t * @remarks\n\t * Despite the \"legacy\"/\"V1\" naming, both formats are actively used at the time of writing. SharedString\n\t * uses legacy and Matrix uses V1.\n\t */\n\tnewMergeTreeSnapshotFormat?: boolean;\n\n\t/**\n\t * Options related to attribution\n\t */\n\tattribution?: IMergeTreeAttributionOptions;\n\n\t/**\n\t * Enables support for the obliterate operation -- a stronger form of remove\n\t * which deletes concurrently inserted segments\n\t *\n\t * Obliterate is currently experimental and may not work in all scenarios.\n\t *\n\t * Default value: false\n\t */\n\tmergeTreeEnableObliterate?: boolean;\n\n\t/**\n\t * Enables support for reconnecting when obliterate operations are present\n\t *\n\t * Obliterate is currently experimental and may not work in all scenarios.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmergeTreeEnableObliterateReconnect?: boolean;\n}\nexport function errorIfOptionNotTrue(\n\toptions: IMergeTreeOptions | undefined,\n\toption: keyof IMergeTreeOptions,\n): void {\n\tif (options?.[option] !== true) {\n\t\tthrow new Error(`${option} is not enabled.`);\n\t}\n}\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IMergeTreeAttributionOptions {\n\t/**\n\t * If enabled, segments will store attribution keys which can be used with the runtime to determine\n\t * attribution information (i.e. who created the content and when it was created).\n\t *\n\t * This flag only applied to new documents: if a snapshot is loaded, whether or not attribution keys\n\t * are tracked is determined by the presence of existing attribution keys in the snapshot.\n\t *\n\t * default: false\n\t */\n\ttrack?: boolean;\n\n\t/**\n\t * Provides a policy for how to track attribution data on segments.\n\t * This option must be provided if either:\n\t * - `track` is set to true\n\t * - a document containing existing attribution information is loaded\n\t */\n\tpolicyFactory?: () => AttributionPolicy;\n}\n\n/**\n * Implements policy dictating which kinds of operations should be attributed and how.\n * @sealed\n * @legacy\n * @alpha\n */\nexport interface AttributionPolicy {\n\t/**\n\t * Enables tracking attribution information for operations on this merge-tree.\n\t * This function is expected to subscribe to appropriate change events in order\n\t * to manage any attribution data it stores on segments.\n\t *\n\t * This must be done in an eventually consistent fashion.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tattach: (client: Client) => void;\n\t/**\n\t * Disables tracking attribution information on segments.\n\t */\n\tdetach: () => void;\n\t/***/\n\tisAttached: boolean;\n\t/**\n\t * Serializer capable of serializing any attribution data this policy stores on segments.\n\t */\n\tserializer: IAttributionCollectionSerializer;\n}\n\n/**\n * @internal\n */\nexport interface LRUSegment {\n\tsegment?: ISegmentLeaf;\n\tmaxSeq: number;\n}\n\nexport interface IRootMergeBlock extends MergeBlock {\n\tmergeTree?: MergeTree;\n}\n\nexport function findRootMergeBlock(\n\tsegmentOrNode: IMergeNode | undefined,\n): IRootMergeBlock | undefined {\n\tif (segmentOrNode === undefined) {\n\t\treturn undefined;\n\t}\n\tlet maybeRoot: IRootMergeBlock | undefined = segmentOrNode.isLeaf()\n\t\t? segmentOrNode.parent\n\t\t: segmentOrNode;\n\twhile (maybeRoot?.parent !== undefined) {\n\t\tmaybeRoot = maybeRoot.parent;\n\t}\n\n\treturn maybeRoot?.mergeTree === undefined ? undefined : maybeRoot;\n}\n\n/**\n * Find the segment to which a reference will slide if it needs to slide, or undefined if there\n * is no valid segment (i.e. the tree is empty).\n *\n * @param segment - The segment to slide from.\n * @param cache - Optional cache mapping segments to their sliding destinations.\n * Excursions will be avoided for segments in the cache, and the cache will be populated with\n * entries for all segments visited during excursion.\n * This can reduce the number of times the tree needs to be scanned if a range containing many\n * SlideOnRemove references is removed.\n * @internal\n */\nfunction getSlideToSegment(\n\tsegment: ISegment | undefined,\n\tslidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\tcache?: Map<ISegment, { seg?: ISegment }>,\n\tuseNewSlidingBehavior: boolean = false,\n): [ISegment | undefined, \"start\" | \"end\" | undefined] {\n\tif (\n\t\t!segment ||\n\t\t!isRemovedAndAckedOrMovedAndAcked(segment) ||\n\t\tsegment.endpointType !== undefined\n\t) {\n\t\treturn [segment, undefined];\n\t}\n\n\tconst cachedSegment = cache?.get(segment);\n\tif (cachedSegment !== undefined) {\n\t\treturn [cachedSegment.seg, undefined];\n\t}\n\tconst result: { seg?: ISegment } = {};\n\tcache?.set(segment, result);\n\tconst goFurtherToFindSlideToSegment = (seg: ISegment): boolean => {\n\t\tif (seg.seq !== UnassignedSequenceNumber && !isRemovedAndAckedOrMovedAndAcked(seg)) {\n\t\t\tresult.seg = seg;\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tcache !== undefined &&\n\t\t\t(seg.removedSeq === segment.removedSeq || seg.movedSeq === segment.movedSeq)\n\t\t) {\n\t\t\tcache.set(seg, result);\n\t\t}\n\t\treturn true;\n\t};\n\n\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\tbackwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t} else {\n\t\tforwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t}\n\tif (result.seg !== undefined) {\n\t\treturn [result.seg, undefined];\n\t}\n\n\t// in the new sliding behavior, we don't look in the opposite direction\n\t// if we fail to find a segment to slide to in the right direction.\n\t//\n\t// in other words, rather than going `forward ?? backward ?? detached` (or\n\t// `backward ?? forward ?? detached`), we would slide `forward ?? detached`\n\t// or `backward ?? detached`\n\t//\n\t// in both of these cases detached may be substituted for one of the special\n\t// endpoint segments, if such behavior is enabled\n\tif (!useNewSlidingBehavior) {\n\t\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\t\tforwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t\t} else {\n\t\t\tbackwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t\t}\n\t}\n\n\tlet maybeEndpoint: \"start\" | \"end\" | undefined;\n\n\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\tmaybeEndpoint = \"start\";\n\t} else if (slidingPreference === SlidingPreference.FORWARD) {\n\t\tmaybeEndpoint = \"end\";\n\t}\n\n\treturn [result.seg, maybeEndpoint];\n}\n\n/**\n * Returns the position to slide a reference to if a slide is required.\n * @param segoff - The segment and offset to slide from\n * @returns segment and offset to slide the reference to\n * @internal\n */\nexport function getSlideToSegoff(\n\tsegoff: { segment: ISegment | undefined; offset: number | undefined },\n\tslidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\tuseNewSlidingBehavior: boolean = false,\n): {\n\tsegment: ISegment | undefined;\n\toffset: number | undefined;\n} {\n\tif (segoff.segment === undefined) {\n\t\treturn segoff;\n\t}\n\tconst [segment, _] = getSlideToSegment(\n\t\tsegoff.segment,\n\t\tslidingPreference,\n\t\tundefined,\n\t\tuseNewSlidingBehavior,\n\t);\n\tif (segment === segoff.segment) {\n\t\treturn segoff;\n\t}\n\tconst offset =\n\t\tsegment && segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;\n\treturn {\n\t\tsegment,\n\t\toffset,\n\t};\n}\n\nconst forwardPred = (ref: LocalReferencePosition): boolean =>\n\tref.slidingPreference !== SlidingPreference.BACKWARD;\nconst backwardPred = (ref: LocalReferencePosition): boolean =>\n\tref.slidingPreference === SlidingPreference.BACKWARD;\n\n/**\n * @internal\n */\nexport class MergeTree {\n\tpublic static readonly options = {\n\t\tincrementalUpdate: true,\n\t\tinsertAfterRemovedSegs: true,\n\t\tzamboniSegments: true,\n\t};\n\n\tprivate static readonly theUnfinishedNode = { childCount: -1 } as unknown as MergeBlock;\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic readonly collabWindow = new CollaborationWindow();\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic readonly pendingSegments = new DoublyLinkedList<SegmentGroup>();\n\n\tpublic readonly segmentsToScour = new Heap<LRUSegment>(LRUSegmentComparer);\n\n\tpublic readonly attributionPolicy: AttributionPolicy | undefined;\n\n\t/**\n\t * Whether or not all blocks in the mergeTree currently have information about local partial lengths computed.\n\t * This information is only necessary on reconnect, and otherwise costly to bookkeep.\n\t * This field enables tracking whether partials need to be recomputed using localSeq information.\n\t */\n\tprivate localPartialsComputed = false;\n\t// for now assume only markers have ids and so point directly at the Segment\n\t// if we need to have pointers to non-markers, we can change to point at local refs\n\tprivate readonly idToMarker = new Map<string, Marker>();\n\tpublic mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n\tpublic mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n\t/**\n\t * Array containing the sequence number of all move operations within the\n\t * collab window\n\t *\n\t * When a segment is inserted, we must traverse to the left and right of it\n\t * to determine whether the segment was inserted into an obliterated range.\n\t * By keeping track of all move seqs, we can significantly reduce the search\n\t * space we must traverse.\n\t *\n\t * Sequence numbers in `moveSeqs` are sorted to accelerate bookkeeping.\n\t *\n\t * See https://github.com/microsoft/FluidFramework/blob/main/packages/dds/merge-tree/docs/Obliterate.md#remote-perspective\n\t * for additional context\n\t */\n\tprivate moveSeqs: number[] = [];\n\n\t/**\n\t * Similar to moveSeqs, but tracks local moves. These are not the move\n\t * operations within the collab window, but rather local moves that have\n\t * not been acked.\n\t */\n\tprivate readonly localMoveSeqs: Set<number> = new Set();\n\n\t/**\n\t * Groups of segments moved by local moves/obliterates\n\t *\n\t * When a local obliterate is acked, we must also ack segments that were\n\t * concurrently obliterated on insert. We check this segment group to find\n\t * such segments\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate readonly locallyMovedSegments: Map<number, SegmentGroup> = new Map();\n\n\tpublic constructor(public options?: IMergeTreeOptions) {\n\t\tthis._root = this.makeBlock(0);\n\t\tthis._root.mergeTree = this;\n\t\tthis.attributionPolicy = options?.attribution?.policyFactory?.();\n\t}\n\n\tprivate _root: IRootMergeBlock;\n\tpublic get root(): IRootMergeBlock {\n\t\treturn this._root;\n\t}\n\n\tpublic set root(value: IRootMergeBlock) {\n\t\tthis._root = value;\n\t\tvalue.mergeTree = this;\n\t}\n\n\tpublic makeBlock(childCount: number): MergeBlock {\n\t\tconst block = new MergeBlock(childCount);\n\t\tblock.ordinal = \"\";\n\t\treturn block;\n\t}\n\n\t/**\n\t * Compute the net length of this segment from a local perspective.\n\t * @param segment - Segment whose length to find\n\t * @param localSeq - localSeq at which to find the length of this segment. If not provided,\n\t * default is to consider the local client's current perspective. Only local sequence\n\t * numbers corresponding to un-acked operations give valid results.\n\t */\n\tpublic localNetLength(\n\t\tsegment: ISegment,\n\t\trefSeq?: number,\n\t\tlocalSeq?: number,\n\t): number | undefined {\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst moveInfo = toMoveInfo(segment);\n\t\tif (localSeq === undefined) {\n\t\t\tif (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t\tif (\n\t\t\t\t\t(!!removalInfo && !seqLTE(removalInfo.removedSeq, this.collabWindow.minSeq)) ||\n\t\t\t\t\t(!!moveInfo && !seqLTE(moveInfo.movedSeq, this.collabWindow.minSeq))\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\t// this segment removed and outside the collab window which means it is zamboni eligible\n\t\t\t\t// this also means the segment could not exist, so we should not consider it\n\t\t\t\t// when making decisions about conflict resolutions\n\t\t\t\treturn undefined;\n\t\t\t} else {\n\t\t\t\treturn segment.cachedLength;\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\trefSeq !== undefined,\n\t\t\t0x398 /* localSeq provided for local length without refSeq */,\n\t\t);\n\t\tassert(segment.seq !== undefined, 0x399 /* segment with no seq in mergeTree */);\n\t\tconst { seq, removedSeq, localRemovedSeq, movedSeq, localMovedSeq } = segment;\n\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\tassert(\n\t\t\t\tsegment.localSeq !== undefined,\n\t\t\t\t0x39a /* unacked segment with undefined localSeq */,\n\t\t\t);\n\t\t\t// inserted locally, still un-acked\n\t\t\tif (\n\t\t\t\tsegment.localSeq > localSeq ||\n\t\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||\n\t\t\t\t(localMovedSeq !== undefined && localMovedSeq <= localSeq)\n\t\t\t) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tconst { cachedLength } = segment;\n\t\t\treturn cachedLength;\n\t\t} else {\n\t\t\t// inserted remotely\n\t\t\tif (\n\t\t\t\tseq > refSeq ||\n\t\t\t\t(removedSeq !== undefined &&\n\t\t\t\t\tremovedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tremovedSeq <= refSeq) ||\n\t\t\t\t(movedSeq !== undefined &&\n\t\t\t\t\tmovedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tmovedSeq <= refSeq) ||\n\t\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||\n\t\t\t\t(localMovedSeq !== undefined && localMovedSeq <= localSeq)\n\t\t\t) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn segment.cachedLength;\n\t\t}\n\t}\n\n\tpublic unlinkMarker(marker: Marker): void {\n\t\tconst id = marker.getId();\n\t\tif (id) {\n\t\t\tthis.idToMarker.delete(id);\n\t\t}\n\t}\n\n\tprivate addNode(block: MergeBlock, node: IMergeNode): number {\n\t\tconst index = block.childCount++;\n\t\tblock.assignChild(node, index, false);\n\t\treturn index;\n\t}\n\n\tpublic reloadFromSegments(segments: ISegment[]): void {\n\t\t// This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n\t\tassert(\n\t\t\t!this.collabWindow.collaborating,\n\t\t\t0x049 /* \"Trying to reload from segments while collaborating!\" */,\n\t\t);\n\n\t\tconst maxChildren = MaxNodesInBlock - 1;\n\n\t\t// Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n\t\tconst buildMergeBlock = (nodes: IMergeNode[]): IRootMergeBlock => {\n\t\t\tconst blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n\t\t\tconst blocks: MergeBlock[] = Array.from({ length: blockCount }); // Pre-alloc array to collect nodes\n\n\t\t\t// For each block in this level of the B-Tree...\n\t\t\tfor (\n\t\t\t\tlet nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n\t\t\t\tblockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n\t\t\t\tblockIndex++ // Advance to next block in this layer.\n\t\t\t) {\n\t\t\t\tconst block = (blocks[blockIndex] = this.makeBlock(0));\n\n\t\t\t\t// For each child of the current block, insert a node (while we have nodes left)\n\t\t\t\t// and update the block's info.\n\t\t\t\tfor (\n\t\t\t\t\tlet childIndex = 0;\n\t\t\t\t\tchildIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n\t\t\t\t\tchildIndex++, nodeIndex++ // Advance to next child & node\n\t\t\t\t) {\n\t\t\t\t\t// Insert the next node into the current block\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\tthis.addNode(block, nodes[nodeIndex]!);\n\t\t\t\t}\n\n\t\t\t\t// Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n\t\t\t\t// but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n\t\t\t\t// snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n\t\t\t\tthis.blockUpdate(block);\n\t\t\t}\n\n\t\t\treturn blocks.length === 1 // If there is only one block at this layer...\n\t\t\t\t? // Non null asserting here because of the length check above\n\t\t\t\t\tblocks[0]! // ...then we're done. Return the root.\n\t\t\t\t: buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n\t\t};\n\t\tif (segments.length > 0) {\n\t\t\tthis.root = buildMergeBlock(segments);\n\t\t\tthis.nodeUpdateOrdinals(this.root);\n\t\t} else {\n\t\t\tthis.root = this.makeBlock(0);\n\t\t}\n\t}\n\n\t// For now assume min starts at zero\n\tpublic startCollaboration(localClientId: number, minSeq: number, currentSeq: number): void {\n\t\tthis.collabWindow.clientId = localClientId;\n\t\tthis.collabWindow.minSeq = minSeq;\n\t\tthis.collabWindow.collaborating = true;\n\t\tthis.collabWindow.currentSeq = currentSeq;\n\t\tthis.nodeUpdateLengthNewStructure(this.root, true);\n\t}\n\n\tprivate addToLRUSet(leaf: ISegmentLeaf, seq: number): void {\n\t\t// If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n\t\t// add the segment and mark the mark the node now.\n\n\t\t// TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n\t\t// segments from a snapshot. We currently skip these for now.\n\t\tif (leaf.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n\t\t\tleaf.parent!.needsScour = true;\n\t\t\tthis.segmentsToScour.add({ segment: leaf, maxSeq: seq });\n\t\t}\n\t}\n\n\tpublic getLength(refSeq: number, clientId: number): number {\n\t\treturn this.blockLength(this.root, refSeq, clientId);\n\t}\n\n\t/**\n\t * Returns the current length of the MergeTree for the local client.\n\t */\n\tpublic get length(): number | undefined {\n\t\treturn this.root.cachedLength;\n\t}\n\n\tpublic getPosition(\n\t\tnode: IMergeNode,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): number {\n\t\tif (node.isLeaf() && node.endpointType === \"start\") {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet totalOffset = 0;\n\t\tlet parent = node.parent;\n\t\tlet prevParent: MergeBlock | undefined;\n\t\twhile (parent) {\n\t\t\tconst children = parent.children;\n\t\t\tfor (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\tconst child = children[childIndex]!;\n\t\t\t\tif ((!!prevParent && child === prevParent) || child === node) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ttotalOffset += this.nodeLength(child, refSeq, clientId, localSeq) ?? 0;\n\t\t\t}\n\t\t\tprevParent = parent;\n\t\t\tparent = parent.parent;\n\t\t}\n\t\treturn totalOffset;\n\t}\n\n\tpublic getContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\tassert(\n\t\t\tlocalSeq === undefined || clientId === this.collabWindow.clientId,\n\t\t\t0x39b /* localSeq provided for non-local client */,\n\t\t);\n\t\tlet segment: T | undefined;\n\t\tlet offset: number | undefined;\n\n\t\tconst leaf = (\n\t\t\tleafSeg: ISegment,\n\t\t\tsegpos: number,\n\t\t\t_refSeq: number,\n\t\t\t_clientId: number,\n\t\t\tstart: number,\n\t\t): boolean => {\n\t\t\tsegment = leafSeg as T;\n\t\t\toffset = start;\n\t\t\treturn false;\n\t\t};\n\t\tthis.nodeMap(refSeq, clientId, leaf, undefined, undefined, pos, pos + 1, localSeq);\n\t\treturn { segment, offset };\n\t}\n\n\t/**\n\t * Slides or removes references from the provided list of segments.\n\t *\n\t * The order of the references is preserved for references of the same sliding\n\t * preference. Relative order between references that slide backward and those\n\t * that slide forward is not preserved, even in the case when they slide to\n\t * the same segment.\n\t *\n\t * @remarks\n\t *\n\t * 1. Preserving the order of the references is a useful property for reference-based undo/redo\n\t * (see revertibles.ts).\n\t *\n\t * 2. For use cases which necessitate eventual consistency across clients,\n\t * this method should only be called with segments for which the current client sequence number is\n\t * max(remove segment sequence number, add reference sequence number).\n\t * See `packages\\dds\\merge-tree\\REFERENCEPOSITIONS.md`\n\t *\n\t * @param segments - An array of (not necessarily contiguous) segments with increasing ordinals.\n\t */\n\tprivate slideAckedRemovedSegmentReferences(segments: ISegment[]): void {\n\t\t// References are slid in groups to preserve their order.\n\t\tlet currentForwardSlideGroup: LocalReferenceCollection[] = [];\n\t\tlet currentBackwardSlideGroup: LocalReferenceCollection[] = [];\n\n\t\tlet currentForwardMaybeEndpoint: \"start\" | \"end\" | undefined;\n\t\tlet currentForwardSlideDestination: ISegment | undefined;\n\t\tlet currentForwardSlideIsForward: boolean | undefined;\n\n\t\tlet currentBackwardMaybeEndpoint: \"start\" | \"end\" | undefined;\n\t\tlet currentBackwardSlideDestination: ISegment | undefined;\n\t\tlet currentBackwardSlideIsForward: boolean | undefined;\n\n\t\tconst slideGroup = (\n\t\t\tcurrentSlideDestination: ISegmentLeaf | undefined,\n\t\t\tcurrentSlideIsForward: boolean | undefined,\n\t\t\tcurrentSlideGroup: LocalReferenceCollection[],\n\t\t\tpred: (ref: LocalReferencePosition) => boolean,\n\t\t\tmaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t): void => {\n\t\t\tif (currentSlideIsForward === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nonEndpointRefsToAdd = currentSlideGroup.map((collection) =>\n\t\t\t\tfilterLocalReferencePositions(\n\t\t\t\t\tcollection,\n\t\t\t\t\t(ref) => pred(ref) && (maybeEndpoint ? !ref.canSlideToEndpoint : true),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst endpointRefsToAdd = currentSlideGroup.map((collection) =>\n\t\t\t\tfilterLocalReferencePositions(\n\t\t\t\t\tcollection,\n\t\t\t\t\t(ref) => pred(ref) && !!ref.canSlideToEndpoint,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (maybeEndpoint) {\n\t\t\t\tconst endpoint = maybeEndpoint === \"start\" ? this.startOfTree : this.endOfTree;\n\t\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(endpoint);\n\t\t\t\tif (currentSlideIsForward) {\n\t\t\t\t\tlocalRefs.addBeforeTombstones(...endpointRefsToAdd);\n\t\t\t\t} else {\n\t\t\t\t\tlocalRefs.addAfterTombstones(...endpointRefsToAdd);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentSlideDestination === undefined) {\n\t\t\t\tfor (const collection of currentSlideGroup) {\n\t\t\t\t\tfor (const ref of collection) {\n\t\t\t\t\t\tif (pred(ref) && !refTypeIncludesFlag(ref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\t\t\tref.callbacks?.beforeSlide?.(ref);\n\t\t\t\t\t\t\tcollection.removeLocalRef(ref);\n\t\t\t\t\t\t\tref.callbacks?.afterSlide?.(ref);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);\n\t\t\t\tif (currentSlideIsForward) {\n\t\t\t\t\tlocalRefs.addBeforeTombstones(...nonEndpointRefsToAdd);\n\t\t\t\t} else {\n\t\t\t\t\tlocalRefs.addAfterTombstones(...nonEndpointRefsToAdd);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst trySlideSegment = (\n\t\t\tsegment: ISegment,\n\t\t\tcurrentSlideDestination: ISegment | undefined,\n\t\t\tcurrentSlideIsForward: boolean | undefined,\n\t\t\tcurrentSlideGroup: LocalReferenceCollection[],\n\t\t\tpred: (ref: LocalReferencePosition) => boolean,\n\t\t\tslidingPreference: SlidingPreference,\n\t\t\tcurrentMaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t\treassign: (\n\t\t\t\tlocalRefs: LocalReferenceCollection,\n\t\t\t\tslideToSegment: ISegment | undefined,\n\t\t\t\tslideIsForward: boolean,\n\t\t\t\tmaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t\t) => void,\n\t\t): void => {\n\t\t\t// avoid sliding logic if this segment doesn't have any references\n\t\t\t// with the given sliding preference\n\t\t\tif (!segment.localRefs || !anyLocalReferencePosition(segment.localRefs, pred)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [slideToSegment, maybeEndpoint] = getSlideToSegment(\n\t\t\t\tsegment,\n\t\t\t\tslidingPreference,\n\t\t\t\tslidingPreference === SlidingPreference.FORWARD\n\t\t\t\t\t? forwardSegmentCache\n\t\t\t\t\t: backwardSegmentCache,\n\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint,\n\t\t\t);\n\t\t\tconst slideIsForward =\n\t\t\t\tslideToSegment === undefined ? false : slideToSegment.ordinal > segment.ordinal;\n\n\t\t\tif (\n\t\t\t\tslideToSegment !== currentSlideDestination ||\n\t\t\t\tslideIsForward !== currentSlideIsForward ||\n\t\t\t\tmaybeEndpoint !== currentMaybeEndpoint\n\t\t\t) {\n\t\t\t\tslideGroup(\n\t\t\t\t\tcurrentSlideDestination,\n\t\t\t\t\tcurrentSlideIsForward,\n\t\t\t\t\tcurrentSlideGroup,\n\t\t\t\t\tpred,\n\t\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint ? maybeEndpoint : undefined,\n\t\t\t\t);\n\t\t\t\treassign(\n\t\t\t\t\tsegment.localRefs,\n\t\t\t\t\tslideToSegment,\n\t\t\t\t\tslideIsForward,\n\t\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint ? maybeEndpoint : undefined,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurrentSlideGroup.push(segment.localRefs);\n\t\t\t}\n\t\t};\n\n\t\tconst forwardSegmentCache = new Map<ISegment, { seg?: ISegment }>();\n\t\tconst backwardSegmentCache = new Map<ISegment, { seg?: ISegment }>();\n\t\tfor (const segment of segments) {\n\t\t\tassert(\n\t\t\t\tisRemovedAndAckedOrMovedAndAcked(segment),\n\t\t\t\t0x2f1 /* slideReferences from a segment which has not been removed and acked */,\n\t\t\t);\n\t\t\tif (segment.localRefs === undefined || segment.localRefs.empty) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttrySlideSegment(\n\t\t\t\tsegment,\n\t\t\t\tcurrentForwardSlideDestination,\n\t\t\t\tcurrentForwardSlideIsForward,\n\t\t\t\tcurrentForwardSlideGroup,\n\t\t\t\tforwardPred,\n\t\t\t\tSlidingPreference.FORWARD,\n\t\t\t\tcurrentForwardMaybeEndpoint,\n\t\t\t\t(localRefs, slideToSegment, slideIsForward, maybeEndpoint) => {\n\t\t\t\t\tcurrentForwardSlideGroup = [localRefs];\n\t\t\t\t\tcurrentForwardSlideDestination = slideToSegment;\n\t\t\t\t\tcurrentForwardSlideIsForward = slideIsForward;\n\t\t\t\t\tcurrentForwardMaybeEndpoint = maybeEndpoint;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttrySlideSegment(\n\t\t\t\tsegment,\n\t\t\t\tcurrentBackwardSlideDestination,\n\t\t\t\tcurrentBackwardSlideIsForward,\n\t\t\t\tcurrentBackwardSlideGroup,\n\t\t\t\tbackwardPred,\n\t\t\t\tSlidingPreference.BACKWARD,\n\t\t\t\tcurrentBackwardMaybeEndpoint,\n\t\t\t\t(localRefs, slideToSegment, slideIsForward, maybeEndpoint) => {\n\t\t\t\t\tcurrentBackwardSlideGroup = [localRefs];\n\t\t\t\t\tcurrentBackwardSlideDestination = slideToSegment;\n\t\t\t\t\tcurrentBackwardSlideIsForward = slideIsForward;\n\t\t\t\t\tcurrentBackwardMaybeEndpoint = maybeEndpoint;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tslideGroup(\n\t\t\tcurrentForwardSlideDestination,\n\t\t\tcurrentForwardSlideIsForward,\n\t\t\tcurrentForwardSlideGroup,\n\t\t\tforwardPred,\n\t\t\tcurrentForwardMaybeEndpoint,\n\t\t);\n\t\tslideGroup(\n\t\t\tcurrentBackwardSlideDestination,\n\t\t\tcurrentBackwardSlideIsForward,\n\t\t\tcurrentBackwardSlideGroup,\n\t\t\tbackwardPred,\n\t\t\tcurrentBackwardMaybeEndpoint,\n\t\t);\n\t}\n\n\tprivate blockLength(node: MergeBlock, refSeq: number, clientId: number): number {\n\t\treturn this.collabWindow.collaborating && clientId !== this.collabWindow.clientId\n\t\t\t? node.partialLengths!.getPartialLength(refSeq, clientId)\n\t\t\t: node.cachedLength ?? 0;\n\t}\n\n\t/**\n\t * Compute local partial length information\n\t *\n\t * Public only for use by internal tests\n\t */\n\tpublic computeLocalPartials(refSeq: number): void {\n\t\tif (this.localPartialsComputed) {\n\t\t\treturn;\n\t\t}\n\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst rebaseCollabWindow = new CollaborationWindow();\n\t\trebaseCollabWindow.loadFrom(this.collabWindow);\n\t\tif (refSeq < this.collabWindow.minSeq) {\n\t\t\trebaseCollabWindow.minSeq = refSeq;\n\t\t}\n\t\tthis.root.partialLengths = PartialSequenceLengths.combine(\n\t\t\tthis.root,\n\t\t\trebaseCollabWindow,\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t);\n\t\tthis.localPartialsComputed = true;\n\t}\n\n\tprivate nodeLength(\n\t\tnode: IMergeNode,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): number | undefined {\n\t\tif (!this.collabWindow.collaborating || this.collabWindow.clientId === clientId) {\n\t\t\tif (node.isLeaf()) {\n\t\t\t\treturn this.localNetLength(node, refSeq, localSeq);\n\t\t\t} else if (localSeq === undefined) {\n\t\t\t\t// Local client sees all segments, even when collaborating\n\t\t\t\treturn node.cachedLength;\n\t\t\t} else {\n\t\t\t\tthis.computeLocalPartials(refSeq);\n\n\t\t\t\t// Local client should see all segments except those after localSeq.\n\t\t\t\tconst partialLen = node.partialLengths!.getPartialLength(refSeq, clientId, localSeq);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(\n\t\t\t\t\tthis,\n\t\t\t\t\tnode,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tclientId,\n\t\t\t\t\tlocalSeq,\n\t\t\t\t);\n\n\t\t\t\treturn partialLen;\n\t\t\t}\n\t\t} else {\n\t\t\t// Sequence number within window\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tconst segment = node;\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\tif (removalInfo !== undefined) {\n\t\t\t\t\tif (seqLTE(removalInfo.removedSeq, this.collabWindow.minSeq)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tseqLTE(removalInfo.removedSeq, refSeq) ||\n\t\t\t\t\t\tremovalInfo.removedClientIds.includes(clientId)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (moveInfo !== undefined) {\n\t\t\t\t\tif (seqLTE(moveInfo.movedSeq, this.collabWindow.minSeq)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tseqLTE(moveInfo.movedSeq, refSeq) ||\n\t\t\t\t\t\tmoveInfo.movedClientIds.includes(clientId)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn seqLTE(node.seq ?? 0, refSeq) || segment.clientId === clientId\n\t\t\t\t\t? segment.cachedLength\n\t\t\t\t\t: 0;\n\t\t\t} else {\n\t\t\t\tconst partialLen = node.partialLengths!.getPartialLength(refSeq, clientId);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);\n\n\t\t\t\treturn partialLen;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setMinSeq(minSeq: number): void {\n\t\tassert(\n\t\t\tminSeq <= this.collabWindow.currentSeq,\n\t\t\t0x04e /* \"Trying to set minSeq above currentSeq of collab window!\" */,\n\t\t);\n\n\t\t// Only move forward\n\t\tassert(\n\t\t\tthis.collabWindow.minSeq <= minSeq,\n\t\t\t0x04f /* \"minSeq of collab window > target minSeq!\" */,\n\t\t);\n\n\t\tif (minSeq > this.collabWindow.minSeq) {\n\t\t\tthis.collabWindow.minSeq = minSeq;\n\t\t\tconst firstMoveSeqIdx = this.moveSeqs.findIndex((seq) => seq >= minSeq);\n\t\t\tthis.moveSeqs = firstMoveSeqIdx === -1 ? [] : this.moveSeqs.slice(firstMoveSeqIdx);\n\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\tzamboniSegments(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the count of elements before the given reference position from the given perspective.\n\t *\n\t * @param refPos - The reference position to resolve.\n\t * @param refSeq - The number of the latest sequenced change to consider.\n\t * Defaults to including all edits which have been applied.\n\t * @param clientId - The ID of the client from whose perspective to resolve this reference. Defaults to the current client.\n\t * @param localSeq - The local sequence number to consider. Defaults to including all local edits.\n\t */\n\tpublic referencePositionToLocalPosition(\n\t\trefPos: ReferencePosition,\n\t\trefSeq = Number.MAX_SAFE_INTEGER,\n\t\tclientId = this.collabWindow.clientId,\n\t\tlocalSeq: number | undefined = this.collabWindow.localSeq,\n\t): number {\n\t\tconst seg: ISegmentLeaf | undefined = refPos.getSegment();\n\t\tif (seg?.parent === undefined) {\n\t\t\t// We have no idea where this reference is, because it refers to a segment which is not in the tree.\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\t\tif (refPos.isLeaf()) {\n\t\t\treturn this.getPosition(refPos, refSeq, clientId, localSeq);\n\t\t}\n\t\tif (refTypeIncludesFlag(refPos, ReferenceType.Transient) || seg.localRefs?.has(refPos)) {\n\t\t\tif (\n\t\t\t\tseg !== this.startOfTree &&\n\t\t\t\tseg !== this.endOfTree &&\n\t\t\t\t!isSegmentPresent(seg, { refSeq, localSeq })\n\t\t\t) {\n\t\t\t\tconst forward = refPos.slidingPreference === SlidingPreference.FORWARD;\n\t\t\t\tconst slideSeq =\n\t\t\t\t\tseg.movedSeq !== UnassignedSequenceNumber && seg.movedSeq !== undefined\n\t\t\t\t\t\t? seg.movedSeq\n\t\t\t\t\t\t: seg.removedSeq !== UnassignedSequenceNumber && seg.removedSeq !== undefined\n\t\t\t\t\t\t\t? seg.removedSeq\n\t\t\t\t\t\t\t: refSeq;\n\t\t\t\tconst slideLocalSeq = seg.localMovedSeq ?? seg.localRemovedSeq;\n\t\t\t\tconst perspective = new PerspectiveImpl(this, {\n\t\t\t\t\trefSeq: slideSeq,\n\t\t\t\t\tlocalSeq: slideLocalSeq,\n\t\t\t\t});\n\t\t\t\tconst slidSegment = perspective.nextSegment(seg, forward);\n\t\t\t\treturn (\n\t\t\t\t\tthis.getPosition(slidSegment, refSeq, clientId, localSeq) +\n\t\t\t\t\t(forward ? 0 : slidSegment.cachedLength === 0 ? 0 : slidSegment.cachedLength - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn this.getPosition(seg, refSeq, clientId, localSeq) + refPos.getOffset();\n\t\t}\n\t\treturn DetachedReferencePosition;\n\t}\n\n\t/**\n\t * Finds the nearest reference with ReferenceType.Tile to `startPos` in the direction dictated by `forwards`.\n\t * Uses depthFirstNodeWalk in addition to block-accelerated functionality. The search position will be included in\n\t * the nodes to walk, so searching on all positions, including the endpoints, can be considered inclusive.\n\t * Any out of bound search positions will return undefined, so in order to search the whole string, a forward\n\t * search can begin at 0, or a backward search can begin at length-1.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param clientId - clientId dictating the perspective to search from\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the string should be searched in the forward or backward direction\n\t */\n\tpublic searchForMarker(\n\t\tstartPos: number,\n\t\tclientId: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): Marker | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment(startPos, UniversalSequenceNumber, clientId);\n\t\tconst segWithParent: ISegmentLeaf | undefined = segment;\n\t\tif (segWithParent?.parent === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tdepthFirstNodeWalk(\n\t\t\tsegWithParent.parent,\n\t\t\tsegWithParent,\n\t\t\t(node) => {\n\t\t\t\tif (node.isLeaf()) {\n\t\t\t\t\tif (Marker.is(node) && refHasTileLabel(node, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = node;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst marker = forwards\n\t\t\t\t\t\t? node.leftmostTiles[markerLabel]\n\t\t\t\t\t\t: node.rightmostTiles[markerLabel];\n\t\t\t\t\tif (marker !== undefined) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tmarker.isLeaf() && Marker.is(marker),\n\t\t\t\t\t\t\t0x751 /* Object returned is not a valid marker */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfoundMarker = marker;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn foundMarker === undefined ? NodeAction.Skip : NodeAction.Exit;\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tforwards,\n\t\t);\n\n\t\treturn foundMarker;\n\t}\n\n\tprivate updateRoot(splitNode: MergeBlock | undefined): void {\n\t\tif (splitNode !== undefined) {\n\t\t\tconst newRoot = this.makeBlock(2);\n\t\t\tnewRoot.assignChild(this.root, 0, false);\n\t\t\tnewRoot.assignChild(splitNode, 1, false);\n\t\t\tthis.root = newRoot;\n\t\t\tthis.nodeUpdateOrdinals(this.root);\n\t\t\tthis.nodeUpdateLengthNewStructure(this.root);\n\t\t}\n\t}\n\n\t/**\n\t * Assign sequence number to existing segment; update partial lengths to reflect the change\n\t * @param seq - sequence number given by server to pending segment\n\t */\n\tpublic ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst seq = opArgs.sequencedMessage!.sequenceNumber;\n\t\tconst pendingSegmentGroup = this.pendingSegments.shift()?.data;\n\t\tconst nodesToUpdate: MergeBlock[] = [];\n\t\tlet overwrite = false;\n\t\tif (pendingSegmentGroup !== undefined) {\n\t\t\tconst deltaSegments: IMergeTreeSegmentDelta[] = [];\n\t\t\tconst overlappingRemoves: boolean[] = [];\n\t\t\tpendingSegmentGroup.segments.map((pendingSegment: ISegmentLeaf) => {\n\t\t\t\tconst localMovedSeq = pendingSegment.localMovedSeq;\n\t\t\t\tconst overlappingRemove = !pendingSegment.ack(pendingSegmentGroup, opArgs);\n\n\t\t\t\tif (opArgs.op.type === MergeTreeDeltaType.OBLITERATE && localMovedSeq !== undefined) {\n\t\t\t\t\tconst locallyMovedSegments = this.locallyMovedSegments.get(localMovedSeq);\n\n\t\t\t\t\tif (locallyMovedSegments) {\n\t\t\t\t\t\t// Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\t\t\t\tlocallyMovedSegments.segments.forEach((segment: ISegmentLeaf) => {\n\t\t\t\t\t\t\tsegment.localMovedSeq = undefined;\n\n\t\t\t\t\t\t\tif (!nodesToUpdate.includes(segment.parent!)) {\n\t\t\t\t\t\t\t\tnodesToUpdate.push(segment.parent!);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (segment.movedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\t\tsegment.movedSeq = seq;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis.locallyMovedSegments.delete(localMovedSeq);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toverwrite = overlappingRemove || overwrite;\n\n\t\t\t\tif (opArgs.op.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\t\tif (seq !== this.moveSeqs[this.moveSeqs.length - 1]) {\n\t\t\t\t\t\tthis.moveSeqs.push(seq);\n\t\t\t\t\t}\n\t\t\t\t\tif (localMovedSeq !== undefined) {\n\t\t\t\t\t\tthis.localMoveSeqs.delete(localMovedSeq);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toverlappingRemoves.push(overlappingRemove);\n\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\tthis.addToLRUSet(pendingSegment, seq);\n\t\t\t\t}\n\t\t\t\tif (!nodesToUpdate.includes(pendingSegment.parent!)) {\n\t\t\t\t\tnodesToUpdate.push(pendingSegment.parent!);\n\t\t\t\t}\n\t\t\t\tdeltaSegments.push({\n\t\t\t\t\tsegment: pendingSegment,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Perform slides after all segments have been acked, so that\n\t\t\t// positions after slide are final\n\t\t\tif (\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE ||\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE\n\t\t\t) {\n\t\t\t\tthis.slideAckedRemovedSegmentReferences(pendingSegmentGroup.segments);\n\t\t\t}\n\n\t\t\tthis.mergeTreeMaintenanceCallback?.(\n\t\t\t\t{\n\t\t\t\t\tdeltaSegments,\n\t\t\t\t\toperation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n\t\t\t\t},\n\t\t\t\topArgs,\n\t\t\t);\n\t\t\tconst clientId = this.collabWindow.clientId;\n\t\t\tfor (const node of nodesToUpdate) {\n\t\t\t\tthis.blockUpdatePathLengths(node, seq, clientId, overwrite);\n\t\t\t}\n\t\t}\n\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tprivate addToPendingList(\n\t\tsegment: ISegment,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tsegmentGroup?: SegmentGroup,\n\t\tlocalSeq?: number,\n\t\tpreviousProps?: PropertySet,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): SegmentGroup {\n\t\tlet _segmentGroup = segmentGroup;\n\t\tif (_segmentGroup === undefined) {\n\t\t\t_segmentGroup = {\n\t\t\t\tsegments: [],\n\t\t\t\tlocalSeq,\n\t\t\t\trefSeq: this.collabWindow.currentSeq,\n\t\t\t};\n\t\t\tif (previousProps) {\n\t\t\t\t_segmentGroup.previousProps = [];\n\t\t\t}\n\t\t\tthis.pendingSegments.push(_segmentGroup);\n\t\t}\n\n\t\tif (\n\t\t\t(!_segmentGroup.previousProps && !!previousProps) ||\n\t\t\t(!!_segmentGroup.previousProps && !previousProps)\n\t\t) {\n\t\t\tthrow new Error(\"All segments in group should have previousProps or none\");\n\t\t}\n\t\tif (previousProps) {\n\t\t\t_segmentGroup.previousProps!.push(previousProps);\n\t\t}\n\n\t\tsegment.segmentGroups.enqueue(_segmentGroup);\n\t\treturn _segmentGroup;\n\t}\n\n\t// TODO: error checking\n\tpublic getMarkerFromId(id: string): Marker | undefined {\n\t\tconst marker = this.idToMarker.get(id);\n\t\treturn marker === undefined ||\n\t\t\tisRemoved(marker) ||\n\t\t\t(isMoved(marker) && marker.moveDst === undefined)\n\t\t\t? undefined\n\t\t\t: marker;\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t * @param refseq - The reference sequence number at which to compute the position.\n\t * @param clientId - The client id with which to compute the position.\n\t */\n\tpublic posFromRelativePos(\n\t\trelativePos: IRelativePosition,\n\t\trefseq = this.collabWindow.currentSeq,\n\t\tclientId = this.collabWindow.clientId,\n\t): number {\n\t\tlet pos = -1;\n\t\tlet marker: Marker | undefined;\n\t\tif (relativePos.id) {\n\t\t\tmarker = this.getMarkerFromId(relativePos.id);\n\t\t}\n\t\tif (marker) {\n\t\t\tpos = this.getPosition(marker, refseq, clientId);\n\t\t\tif (relativePos.before) {\n\t\t\t\tif (relativePos.offset !== undefined) {\n\t\t\t\t\tpos -= relativePos.offset;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpos += marker.cachedLength;\n\t\t\t\tif (relativePos.offset !== undefined) {\n\t\t\t\t\tpos += relativePos.offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pos;\n\t}\n\n\tpublic insertSegments(\n\t\tpos: number,\n\t\tsegments: ISegment[],\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\topArgs: IMergeTreeDeltaOpArgs | undefined,\n\t): void {\n\t\tthis.ensureIntervalBoundary(pos, refSeq, clientId);\n\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n\t\tthis.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n\t\t// opArgs == undefined => loading snapshot or test code\n\t\tif (opArgs !== undefined) {\n\t\t\tconst deltaSegments = segments\n\t\t\t\t.filter((segment) => !toMoveInfo(segment))\n\t\t\t\t.map((segment) => ({ segment }));\n\n\t\t\tif (deltaSegments.length > 0) {\n\t\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\t\t\tdeltaSegments,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tMergeTree.options.zamboniSegments &&\n\t\t\tseq !== UnassignedSequenceNumber\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence. The client ref seq must be above the minimum sequence number\n\t * or the return value will be undefined.\n\t * Generally this method is used in conjunction with signals which provide\n\t * point in time values for the below parameters, and is useful for things\n\t * like displaying user position. It should not be used with persisted values\n\t * as persisted values will quickly become invalid as the remoteClientRefSeq\n\t * moves below the minimum sequence number\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: number,\n\t): number | undefined {\n\t\tif (remoteClientRefSeq < this.collabWindow.minSeq) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst segmentInfo = this.getContainingSegment(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tremoteClientId,\n\t\t);\n\n\t\tconst { currentSeq, clientId } = this.collabWindow;\n\n\t\tif (segmentInfo?.segment) {\n\t\t\tconst segmentPosition = this.getPosition(segmentInfo.segment, currentSeq, clientId);\n\t\t\treturn segmentPosition + segmentInfo.offset!;\n\t\t} else {\n\t\t\tif (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n\t\t\t\treturn this.getLength(currentSeq, clientId);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate blockInsert<T extends ISegmentLeaf>(\n\t\tpos: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\tlocalSeq: number | undefined,\n\t\tnewSegments: T[],\n\t): void {\n\t\t// Keeping this function within the scope of blockInsert for readability.\n\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\tconst continueFrom = (node: MergeBlock): boolean => {\n\t\t\tlet siblingExists = false;\n\t\t\tforwardExcursion(node, () => {\n\t\t\t\tsiblingExists = true;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\treturn siblingExists;\n\t\t};\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup;\n\t\tconst saveIfLocal = (locSegment: ISegment): void => {\n\t\t\t// Save segment so we can assign sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tlocSegment.seq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n\t\t\t\t}\n\t\t\t\t// LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n\t\t\t\t// In all other cases this has to be true (checked by addToLRUSet):\n\t\t\t\t// locSegment.seq > this.collabWindow.currentSeq\n\t\t\t\telse if (\n\t\t\t\t\tlocSegment.seq! > this.collabWindow.minSeq &&\n\t\t\t\t\tMergeTree.options.zamboniSegments\n\t\t\t\t) {\n\t\t\t\t\tthis.addToLRUSet(locSegment, locSegment.seq!);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst onLeaf = (\n\t\t\tsegment: ISegment | undefined,\n\t\t\t_pos: number,\n\t\t\tcontext: InsertContext,\n\t\t\t// Keeping this function within the scope of blockInsert for readability.\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\t): ISegmentChanges => {\n\t\t\tconst segmentChanges: ISegmentChanges = {};\n\t\t\tif (segment) {\n\t\t\t\t// Insert before segment\n\t\t\t\tsegmentChanges.replaceCurrent = context.candidateSegment;\n\t\t\t\tsegmentChanges.next = segment;\n\t\t\t} else {\n\t\t\t\tsegmentChanges.next = context.candidateSegment;\n\t\t\t}\n\t\t\treturn segmentChanges;\n\t\t};\n\n\t\t// TODO: build tree from segs and insert all at once\n\t\tlet insertPos = pos;\n\t\tfor (const newSegment of newSegments) {\n\t\t\tif (newSegment.cachedLength > 0) {\n\t\t\t\tnewSegment.seq = seq;\n\t\t\t\tnewSegment.localSeq = localSeq;\n\t\t\t\tnewSegment.clientId = clientId;\n\t\t\t\tif (Marker.is(newSegment)) {\n\t\t\t\t\tconst markerId = newSegment.getId();\n\t\t\t\t\tif (markerId) {\n\t\t\t\t\t\tthis.idToMarker.set(markerId, newSegment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq, {\n\t\t\t\t\tleaf: onLeaf,\n\t\t\t\t\tcandidateSegment: newSegment,\n\t\t\t\t\tcontinuePredicate: continueFrom,\n\t\t\t\t});\n\n\t\t\t\tif (newSegment.parent === undefined) {\n\t\t\t\t\t// Indicates an attempt to insert past the end of the merge-tree's content.\n\t\t\t\t\tconst errorConstructor = localSeq === undefined ? DataProcessingError : UsageError;\n\t\t\t\t\tthrow new errorConstructor(\"MergeTree insert failed\", {\n\t\t\t\t\t\tcurrentSeq: this.collabWindow.currentSeq,\n\t\t\t\t\t\tminSeq: this.collabWindow.minSeq,\n\t\t\t\t\t\tsegSeq: newSegment.seq,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.updateRoot(splitNode);\n\t\t\t\tsaveIfLocal(newSegment);\n\n\t\t\t\tinsertPos += newSegment.cachedLength;\n\n\t\t\t\tif (!this.options?.mergeTreeEnableObliterate) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet moveUpperBound = Number.POSITIVE_INFINITY;\n\t\t\t\tconst smallestSeqMoveOp = this.getSmallestSeqMoveOp();\n\n\t\t\t\tif (smallestSeqMoveOp === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst leftAckedSegments: Record<number, ISegment> = {};\n\t\t\t\tconst leftLocalSegments: Record<number, ISegment> = {};\n\n\t\t\t\tlet _localMovedSeq: number | undefined;\n\t\t\t\tlet _movedSeq: number | undefined;\n\t\t\t\tlet movedClientIds: number[] | undefined;\n\n\t\t\t\tconst findLeftMovedSegment = (seg: ISegment): boolean => {\n\t\t\t\t\tconst movedSeqs = seg.movedSeqs?.filter((movedSeq) => movedSeq >= refSeq) ?? [];\n\t\t\t\t\tconst localMovedSeqs = seg.localMovedSeq ? [seg.localMovedSeq] : [];\n\t\t\t\t\tfor (const movedSeq of movedSeqs) {\n\t\t\t\t\t\tleftAckedSegments[movedSeq] = seg;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const localMovedSeq of localMovedSeqs) {\n\t\t\t\t\t\tleftLocalSegments[localMovedSeq] = seg;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((seg.movedSeqs?.length ?? 0) > 0 || localMovedSeqs.length > 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isRemoved(seg) || wasRemovedAfter(seg, moveUpperBound)) {\n\t\t\t\t\t\tmoveUpperBound = Math.min(moveUpperBound, seg.seq ?? Number.POSITIVE_INFINITY);\n\t\t\t\t\t}\n\t\t\t\t\t// If we've reached a segment that existed before any of our in-collab-window move ops\n\t\t\t\t\t// happened, no need to continue.\n\t\t\t\t\treturn moveUpperBound >= smallestSeqMoveOp;\n\t\t\t\t};\n\n\t\t\t\tconst findRightMovedSegment = (seg: ISegment): boolean => {\n\t\t\t\t\tconst movedSeqs = seg.movedSeqs?.filter((movedSeq) => movedSeq >= refSeq) ?? [];\n\t\t\t\t\tconst localMovedSeqs = seg.localMovedSeq ? [seg.localMovedSeq] : [];\n\n\t\t\t\t\tfor (const movedSeq of movedSeqs) {\n\t\t\t\t\t\tconst left = leftAckedSegments[movedSeq];\n\t\t\t\t\t\tif (left) {\n\t\t\t\t\t\t\t_movedSeq = movedSeq;\n\t\t\t\t\t\t\tconst clientIdIdx = left.movedSeqs?.indexOf(movedSeq) ?? -1;\n\t\t\t\t\t\t\tconst movedClientId = left.movedClientIds?.[clientIdIdx];\n\t\t\t\t\t\t\tassert(movedClientId !== undefined, 0x869 /* expected client id to exist */);\n\t\t\t\t\t\t\tmovedClientIds = [movedClientId];\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const localMovedSeq of localMovedSeqs) {\n\t\t\t\t\t\tconst left = leftLocalSegments[localMovedSeq];\n\t\t\t\t\t\tif (left) {\n\t\t\t\t\t\t\t_localMovedSeq = localMovedSeq;\n\t\t\t\t\t\t\tconst clientIdIdx = left.movedSeqs?.indexOf(UnassignedSequenceNumber) ?? -1;\n\t\t\t\t\t\t\tconst movedClientId = left.movedClientIds?.[clientIdIdx];\n\t\t\t\t\t\t\tassert(movedClientId !== undefined, 0x86a /* expected client id to exist */);\n\t\t\t\t\t\t\tmovedClientIds = [movedClientId];\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((seg.movedSeqs?.length ?? 0) || localMovedSeqs.length > 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isRemoved(seg) || wasRemovedAfter(seg, moveUpperBound)) {\n\t\t\t\t\t\tmoveUpperBound = Math.min(moveUpperBound, seg.seq ?? Number.POSITIVE_INFINITY);\n\t\t\t\t\t}\n\t\t\t\t\t// If we've reached a segment that existed before any of our in-collab-window move ops\n\t\t\t\t\t// happened, no need to continue.\n\t\t\t\t\treturn moveUpperBound >= smallestSeqMoveOp;\n\t\t\t\t};\n\n\t\t\t\tbackwardExcursion(newSegment, findLeftMovedSegment);\n\t\t\t\tmoveUpperBound = Number.POSITIVE_INFINITY;\n\t\t\t\tforwardExcursion(newSegment, findRightMovedSegment);\n\n\t\t\t\tif (_localMovedSeq !== undefined || _movedSeq !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tmovedClientIds !== undefined,\n\t\t\t\t\t\t0x86b /* movedClientIds should be set if local/moved seq is set */,\n\t\t\t\t\t);\n\t\t\t\t\tconst moveInfo = {\n\t\t\t\t\t\tmovedClientIds,\n\t\t\t\t\t\tmovedSeq: _movedSeq ?? UnassignedSequenceNumber,\n\t\t\t\t\t\tmovedSeqs: _movedSeq === undefined ? [UnassignedSequenceNumber] : [_movedSeq],\n\t\t\t\t\t\tlocalMovedSeq: _localMovedSeq,\n\t\t\t\t\t\twasMovedOnInsert: (_movedSeq ?? -1) !== UnassignedSequenceNumber,\n\t\t\t\t\t};\n\n\t\t\t\t\tmarkSegmentMoved(newSegment, moveInfo);\n\n\t\t\t\t\tif (moveInfo.localMovedSeq !== undefined) {\n\t\t\t\t\t\tconst movedSegmentGroup = this.locallyMovedSegments.get(moveInfo.localMovedSeq);\n\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tmovedSegmentGroup !== undefined,\n\t\t\t\t\t\t\t0x86c /* expected segment group to exist */,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.addToPendingList(newSegment, movedSegmentGroup, localSeq);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (newSegment.parent) {\n\t\t\t\t\t\tthis.blockUpdatePathLengths(newSegment.parent, seq, clientId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly splitLeafSegment = (\n\t\tsegment: ISegment | undefined,\n\t\tpos: number,\n\t): ISegmentChanges => {\n\t\tif (!(pos > 0 && segment)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst next = segment.splitAt(pos)!;\n\t\tthis.mergeTreeMaintenanceCallback?.(\n\t\t\t{\n\t\t\t\toperation: MergeTreeMaintenanceType.SPLIT,\n\t\t\t\tdeltaSegments: [{ segment }, { segment: next }],\n\t\t\t},\n\t\t\tundefined,\n\t\t);\n\n\t\treturn { next };\n\t};\n\n\tprivate ensureIntervalBoundary(\n\t\tpos: number | \"start\" | \"end\",\n\t\trefSeq: number,\n\t\tclientId: number,\n\t): void {\n\t\tconst splitNode = this.insertingWalk(\n\t\t\tthis.root,\n\t\t\tpos,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\tTreeMaintenanceSequenceNumber,\n\t\t\t{ leaf: this.splitLeafSegment },\n\t\t);\n\t\tthis.updateRoot(splitNode);\n\t}\n\n\t// Assume called only when pos == len\n\tprivate breakTie(pos: number, node: IMergeNode, seq: number): boolean {\n\t\tif (node.isLeaf()) {\n\t\t\tif (pos !== 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// normalize the seq numbers\n\t\t\t// if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n\t\t\t// seq for comparison, as it will get a seq higher than any other seq once sequences\n\t\t\t// if the current seg is local (UnassignedSequenceNumber) give it the second highest\n\t\t\t// possible seq, as the highest is reserved for the previous.\n\t\t\tconst newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n\t\t\tconst segSeq =\n\t\t\t\tnode.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n\n\t\t\treturn (\n\t\t\t\tnewSeq > segSeq ||\n\t\t\t\t(node.movedSeq !== undefined &&\n\t\t\t\t\tnode.movedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tnode.movedSeq > seq) ||\n\t\t\t\t(node.removedSeq !== undefined &&\n\t\t\t\t\tnode.removedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tnode.removedSeq > seq)\n\t\t\t);\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate getSmallestSeqMoveOp(): number | undefined {\n\t\treturn this.moveSeqs[0] ?? (this.localMoveSeqs.size > 0 ? -1 : undefined);\n\t}\n\n\tprivate insertingWalk(\n\t\tblock: MergeBlock,\n\t\tpos: number | \"start\" | \"end\",\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\tcontext: InsertContext,\n\t\tisLastChildBlock: boolean = true,\n\t): MergeBlock | undefined {\n\t\tlet _pos: number;\n\t\tif (pos === \"start\") {\n\t\t\t_pos = 0;\n\t\t} else if (pos === \"end\") {\n\t\t\t_pos = this.root.mergeTree?.getLength(refSeq, clientId) ?? 0;\n\t\t} else {\n\t\t\t_pos = pos;\n\t\t}\n\n\t\tconst children = block.children;\n\t\tlet childIndex: number;\n\t\tlet child: IMergeNode;\n\t\tlet newNode: IMergeNode | undefined;\n\t\tlet fromSplit: MergeBlock | undefined;\n\t\tfor (childIndex = 0; childIndex < block.childCount; childIndex++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tchild = children[childIndex]!;\n\t\t\t// ensure we walk down the far edge of the tree, even if all sub-tree is eligible for zamboni\n\t\t\tconst isLastNonLeafBlock =\n\t\t\t\tisLastChildBlock && !child.isLeaf() && childIndex === block.childCount - 1;\n\t\t\tconst len =\n\t\t\t\tthis.nodeLength(child, refSeq, clientId) ?? (isLastChildBlock ? 0 : undefined);\n\n\t\t\tif (len === undefined) {\n\t\t\t\t// if the seg len is undefined, the segment\n\t\t\t\t// will be removed, so should just be skipped for now\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tassert(len >= 0, 0x4bc /* Length should not be negative */);\n\n\t\t\tif (_pos < len || (_pos === len && this.breakTie(_pos, child, seq))) {\n\t\t\t\t// Found entry containing pos\n\t\t\t\tif (child.isLeaf()) {\n\t\t\t\t\tconst segment = child;\n\t\t\t\t\tconst segmentChanges = context.leaf(segment, _pos, context);\n\t\t\t\t\tif (segmentChanges.replaceCurrent) {\n\t\t\t\t\t\tblock.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n\t\t\t\t\t\tsegmentChanges.replaceCurrent.ordinal = child.ordinal;\n\t\t\t\t\t}\n\t\t\t\t\tif (segmentChanges.next) {\n\t\t\t\t\t\tnewNode = segmentChanges.next;\n\t\t\t\t\t\tchildIndex++; // Insert after\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No change\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst childBlock = child;\n\t\t\t\t\t// Internal node\n\t\t\t\t\tconst splitNode = this.insertingWalk(\n\t\t\t\t\t\tchildBlock,\n\t\t\t\t\t\t_pos,\n\t\t\t\t\t\trefSeq,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tisLastNonLeafBlock,\n\t\t\t\t\t);\n\t\t\t\t\tif (splitNode === undefined) {\n\t\t\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t} else if (splitNode === MergeTree.theUnfinishedNode) {\n\t\t\t\t\t\t_pos -= len; // Act as if shifted segment\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewNode = splitNode;\n\t\t\t\t\t\tfromSplit = splitNode;\n\t\t\t\t\t\tchildIndex++; // Insert after\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t_pos -= len;\n\t\t\t}\n\t\t}\n\t\tif (!newNode && _pos === 0) {\n\t\t\tif (context.continuePredicate?.(block)) {\n\t\t\t\treturn MergeTree.theUnfinishedNode;\n\t\t\t} else {\n\t\t\t\tconst segmentChanges = context.leaf(undefined, _pos, context);\n\t\t\t\tnewNode = segmentChanges.next;\n\t\t\t\t// Assert segmentChanges.replaceCurrent === undefined\n\t\t\t}\n\t\t}\n\t\tif (newNode) {\n\t\t\tfor (let i = block.childCount; i > childIndex; i--) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\tblock.children[i] = block.children[i - 1]!;\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\tblock.children[i]!.index = i;\n\t\t\t}\n\t\t\tblock.assignChild(newNode, childIndex, false);\n\t\t\tblock.childCount++;\n\t\t\tblock.setOrdinal(newNode, childIndex);\n\t\t\tif (block.childCount < MaxNodesInBlock) {\n\t\t\t\tif (fromSplit) {\n\t\t\t\t\tthis.nodeUpdateOrdinals(fromSplit);\n\t\t\t\t}\n\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t\treturn undefined;\n\t\t\t} else {\n\t\t\t\t// Don't update ordinals because higher block will do it\n\t\t\t\tconst newNodeFromSplit = this.split(block);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, block, refSeq, clientId);\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(\n\t\t\t\t\tthis,\n\t\t\t\t\tnewNodeFromSplit,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tclientId,\n\t\t\t\t);\n\n\t\t\t\treturn newNodeFromSplit;\n\t\t\t}\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate split(node: MergeBlock): MergeBlock {\n\t\tconst halfCount = MaxNodesInBlock / 2;\n\t\tconst newNode = this.makeBlock(halfCount);\n\t\tnode.childCount = halfCount;\n\t\t// Update ordinals to reflect lowered child count\n\t\tthis.nodeUpdateOrdinals(node);\n\t\tfor (let i = 0; i < halfCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tnewNode.assignChild(node.children[halfCount + i]!, i, false);\n\t\t\tnode.children[halfCount + i] = undefined!;\n\t\t}\n\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\tthis.nodeUpdateLengthNewStructure(newNode);\n\t\treturn newNode;\n\t}\n\n\tpublic nodeUpdateOrdinals(block: MergeBlock): void {\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tconst child = block.children[i]!;\n\t\t\tblock.setOrdinal(child, i);\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\tthis.nodeUpdateOrdinals(child);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Annotate a range with properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @param refSeq - The reference sequence number to use to apply the annotate\n\t * @param clientId - The id of the client making the annotate\n\t * @param seq - The sequence number of the annotate operation\n\t * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n\t * @param rollback - Whether this is for a local rollback and what kind\n\t */\n\tpublic annotateRange(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\trollback: PropertiesRollback = PropertiesRollback.None,\n\t): void {\n\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\tconst deltaSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup | undefined;\n\t\tconst annotateSegment = (segment: ISegment): boolean => {\n\t\t\tassert(\n\t\t\t\t!Marker.is(segment) ||\n\t\t\t\t\t!(reservedMarkerIdKey in props) ||\n\t\t\t\t\tprops.markerId === segment.properties?.markerId,\n\t\t\t\t0x5ad /* Cannot change the markerId of an existing marker */,\n\t\t\t);\n\t\t\tconst propertyDeltas = segment.addProperties(\n\t\t\t\tprops,\n\t\t\t\tseq,\n\t\t\t\tthis.collabWindow.collaborating,\n\t\t\t\trollback,\n\t\t\t);\n\t\t\tif (!isRemovedOrMoved(segment)) {\n\t\t\t\tdeltaSegments.push({ segment, propertyDeltas });\n\t\t\t}\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tsegmentGroup,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.nodeMap(refSeq, clientId, annotateSegment, undefined, undefined, start, end);\n\n\t\t// OpArgs == undefined => test code\n\t\tif (deltaSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\tdeltaSegments,\n\t\t\t});\n\t\t}\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tpublic obliterateRange(\n\t\tstart: SequencePlace,\n\t\tend: SequencePlace,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\toverwrite: boolean = false,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t): void {\n\t\terrorIfOptionNotTrue(this.options, \"mergeTreeEnableObliterate\");\n\n\t\tconst { startPos, startSide, endPos, endSide } = endpointPosAndSide(start, end);\n\n\t\tassert(\n\t\t\tstartPos !== undefined &&\n\t\t\t\tendPos !== undefined &&\n\t\t\t\tstartSide !== undefined &&\n\t\t\t\tendSide !== undefined &&\n\t\t\t\tstartPos !== \"end\" &&\n\t\t\t\tendPos !== \"start\",\n\t\t\t0x9e2 /* start and end cannot be undefined because they were not passed in as undefined */,\n\t\t);\n\n\t\tthis.ensureIntervalBoundary(startPos, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(endPos, refSeq, clientId);\n\n\t\tlet _overwrite = overwrite;\n\t\tconst localOverlapWithRefs: ISegment[] = [];\n\t\tconst movedSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\tif (seq !== UnassignedSequenceNumber && seq !== this.moveSeqs[this.moveSeqs.length - 1]) {\n\t\t\tthis.moveSeqs.push(seq);\n\t\t} else if (seq === UnassignedSequenceNumber && localSeq !== undefined) {\n\t\t\tthis.localMoveSeqs.add(localSeq);\n\t\t}\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup;\n\t\tconst markMoved = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tconst existingMoveInfo = toMoveInfo(segment);\n\t\t\tif (startSide) segment.startSide = startSide;\n\t\t\tif (endSide) segment.endSide = endSide;\n\n\t\t\tif (\n\t\t\t\tclientId !== segment.clientId &&\n\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\t\t(refSeq < segment.seq || segment.seq === UnassignedSequenceNumber)\n\t\t\t) {\n\t\t\t\tsegment.wasMovedOnInsert = true;\n\t\t\t}\n\n\t\t\tif (existingMoveInfo === undefined) {\n\t\t\t\tsegment.movedClientIds = [clientId];\n\t\t\t\tsegment.movedSeq = seq;\n\t\t\t\tsegment.localMovedSeq = localSeq;\n\t\t\t\tsegment.movedSeqs = [seq];\n\n\t\t\t\tif (!toRemovalInfo(segment)) {\n\t\t\t\t\tmovedSegments.push({ segment });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_overwrite = true;\n\t\t\t\tif (existingMoveInfo.movedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t// we moved this locally, but someone else moved it first\n\t\t\t\t\t// so put them at the head of the list\n\t\t\t\t\t// The list isn't ordered, but we keep the first move at the head\n\t\t\t\t\t// for partialLengths bookkeeping purposes\n\t\t\t\t\texistingMoveInfo.movedClientIds.unshift(clientId);\n\n\t\t\t\t\texistingMoveInfo.movedSeq = seq;\n\t\t\t\t\texistingMoveInfo.movedSeqs.unshift(seq);\n\t\t\t\t\tif (segment.localRefs?.empty === false) {\n\t\t\t\t\t\tlocalOverlapWithRefs.push(segment);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Do not replace earlier sequence number for move\n\t\t\t\t\texistingMoveInfo.movedClientIds.push(clientId);\n\t\t\t\t\texistingMoveInfo.movedSeqs.push(seq);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Save segment so can assign moved sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tconst afterMarkMoved = (\n\t\t\tnode: MergeBlock,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tif (_overwrite) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(node, seq, clientId);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.nodeMap(\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\tmarkMoved,\n\t\t\tundefined,\n\t\t\tafterMarkMoved,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tundefined,\n\t\t\tseq === UnassignedSequenceNumber ? undefined : seq,\n\t\t);\n\n\t\tthis.slideAckedRemovedSegmentReferences(localOverlapWithRefs);\n\t\t// opArgs == undefined => test code\n\t\tif (movedSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.OBLITERATE,\n\t\t\t\tdeltaSegments: movedSegments,\n\t\t\t});\n\t\t}\n\n\t\tif (segmentGroup! && localSeq !== undefined) {\n\t\t\tthis.locallyMovedSegments.set(localSeq, segmentGroup);\n\t\t}\n\n\t\t// these events are newly removed\n\t\t// so we slide after eventing in case the consumer wants to make reference\n\t\t// changes at remove time, like add a ref to track undo redo.\n\t\tif (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {\n\t\t\tthis.slideAckedRemovedSegmentReferences(movedSegments.map(({ segment }) => segment));\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tpublic markRangeRemoved(\n\t\tstart: number,\n\t\tend: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\toverwrite = false,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t): void {\n\t\tlet _overwrite = overwrite;\n\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup;\n\t\tconst removedSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localOverlapWithRefs: ISegment[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\tconst markRemoved = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tconst existingRemovalInfo = toRemovalInfo(segment);\n\n\t\t\tif (existingRemovalInfo === undefined) {\n\t\t\t\tsegment.removedClientIds = [clientId];\n\t\t\t\tsegment.removedSeq = seq;\n\t\t\t\tsegment.localRemovedSeq = localSeq;\n\n\t\t\t\tif (!toMoveInfo(segment)) {\n\t\t\t\t\tremovedSegments.push({ segment });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_overwrite = true;\n\t\t\t\tif (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t// we removed this locally, but someone else removed it first\n\t\t\t\t\t// so put them at the head of the list\n\t\t\t\t\t// The list isn't ordered, but we keep the first removal at the head\n\t\t\t\t\t// for partialLengths bookkeeping purposes\n\t\t\t\t\texistingRemovalInfo.removedClientIds.unshift(clientId);\n\n\t\t\t\t\texistingRemovalInfo.removedSeq = seq;\n\t\t\t\t\tif (segment.localRefs?.empty === false) {\n\t\t\t\t\t\tlocalOverlapWithRefs.push(segment);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Do not replace earlier sequence number for remove\n\t\t\t\t\texistingRemovalInfo.removedClientIds.push(clientId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Save segment so we can assign removed sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\tconst afterMarkRemoved = (\n\t\t\tnode: MergeBlock,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tif (_overwrite) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(node, seq, clientId);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\tthis.nodeMap(refSeq, clientId, markRemoved, undefined, afterMarkRemoved, start, end);\n\t\t// these segments are already viewed as being removed locally and are not event-ed\n\t\t// so can slide non-StayOnRemove refs immediately\n\t\tthis.slideAckedRemovedSegmentReferences(localOverlapWithRefs);\n\t\t// opArgs == undefined => test code\n\t\tif (removedSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.REMOVE,\n\t\t\t\tdeltaSegments: removedSegments,\n\t\t\t});\n\t\t}\n\t\t// these events are newly removed\n\t\t// so we slide after eventing in case the consumer wants to make reference\n\t\t// changes at remove time, like add a ref to track undo redo.\n\t\tif (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {\n\t\t\tthis.slideAckedRemovedSegmentReferences(removedSegments.map(({ segment }) => segment));\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\t/**\n\t * Revert an unacked local op\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic rollback(op: IMergeTreeDeltaOp, localOpMetadata: SegmentGroup): void {\n\t\tif (op.type === MergeTreeDeltaType.REMOVE) {\n\t\t\tconst pendingSegmentGroup = this.pendingSegments.pop?.()?.data;\n\t\t\tif (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata) {\n\t\t\t\tthrow new Error(\"Rollback op doesn't match last edit\");\n\t\t\t}\n\t\t\t// Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored\n\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\tpendingSegmentGroup.segments.forEach((segment: ISegmentLeaf) => {\n\t\t\t\tconst segmentSegmentGroup = segment.segmentGroups?.pop?.();\n\t\t\t\tassert(\n\t\t\t\t\tsegmentSegmentGroup === pendingSegmentGroup,\n\t\t\t\t\t0x3ee /* Unexpected segmentGroup in segment */,\n\t\t\t\t);\n\n\t\t\t\tassert(\n\t\t\t\t\tsegment.removedClientIds !== undefined &&\n\t\t\t\t\t\tsegment.removedClientIds[0] === this.collabWindow.clientId,\n\t\t\t\t\t0x39d /* Rollback segment removedClientId does not match local client */,\n\t\t\t\t);\n\t\t\t\tsegment.removedClientIds = undefined;\n\t\t\t\tsegment.removedSeq = undefined;\n\t\t\t\tsegment.localRemovedSeq = undefined;\n\n\t\t\t\t// Note: optional chaining short-circuits:\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#short-circuiting\n\t\t\t\tthis.mergeTreeDeltaCallback?.(\n\t\t\t\t\t{ op: createInsertSegmentOp(this.findRollbackPosition(segment), segment) },\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tfor (\n\t\t\t\t\tlet updateNode = segment.parent;\n\t\t\t\t\tupdateNode !== undefined;\n\t\t\t\t\tupdateNode = updateNode.parent\n\t\t\t\t) {\n\t\t\t\t\tthis.blockUpdateLength(\n\t\t\t\t\t\tupdateNode,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (\n\t\t\top.type === MergeTreeDeltaType.INSERT ||\n\t\t\top.type === MergeTreeDeltaType.ANNOTATE\n\t\t) {\n\t\t\tconst pendingSegmentGroup = this.pendingSegments.pop?.()?.data;\n\t\t\tif (\n\t\t\t\tpendingSegmentGroup === undefined ||\n\t\t\t\tpendingSegmentGroup !== localOpMetadata ||\n\t\t\t\t(op.type === MergeTreeDeltaType.ANNOTATE && !pendingSegmentGroup.previousProps)\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Rollback op doesn't match last edit\");\n\t\t\t}\n\t\t\tlet i = 0;\n\t\t\tfor (const segment of pendingSegmentGroup.segments) {\n\t\t\t\tconst segmentSegmentGroup = segment.segmentGroups.pop?.();\n\t\t\t\tassert(\n\t\t\t\t\tsegmentSegmentGroup === pendingSegmentGroup,\n\t\t\t\t\t0x3ef /* Unexpected segmentGroup in segment */,\n\t\t\t\t);\n\n\t\t\t\tconst start = this.findRollbackPosition(segment);\n\t\t\t\tif (op.type === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tsegment.seq = UniversalSequenceNumber;\n\t\t\t\t\tsegment.localSeq = undefined;\n\t\t\t\t\tconst removeOp = createRemoveRangeOp(start, start + segment.cachedLength);\n\t\t\t\t\tthis.markRangeRemoved(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + segment.cachedLength,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{ op: removeOp },\n\t\t\t\t\t);\n\t\t\t\t} /* op.type === MergeTreeDeltaType.ANNOTATE */ else {\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\tconst props = pendingSegmentGroup.previousProps![i]!;\n\t\t\t\t\tconst annotateOp = createAnnotateRangeOp(start, start + segment.cachedLength, props);\n\t\t\t\t\tthis.annotateRange(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + segment.cachedLength,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\t{ op: annotateOp },\n\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\tPropertiesRollback.Rollback,\n\t\t\t\t\t);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"Unsupported op type for rollback\");\n\t\t}\n\t}\n\n\t/**\n\t * Walk the segments up to the current segment and calculate its position\n\t */\n\tprivate findRollbackPosition(segment: ISegment): number {\n\t\tlet segmentPosition = 0;\n\t\twalkAllChildSegments(this.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If not removed, increase position\n\t\t\tif (seg.removedSeq === undefined) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\treturn segmentPosition;\n\t}\n\n\tpublic nodeUpdateLengthNewStructure(node: MergeBlock, recur = false): void {\n\t\tthis.blockUpdate(node);\n\t\tif (this.collabWindow.collaborating) {\n\t\t\tthis.localPartialsComputed = false;\n\t\t\tnode.partialLengths = PartialSequenceLengths.combine(node, this.collabWindow, recur);\n\t\t}\n\t}\n\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\tconst segment: ISegmentLeaf | undefined = lref.getSegment();\n\t\treturn segment?.localRefs?.removeLocalRef(lref);\n\t}\n\n\tstartOfTree = new StartOfTreeSegment(this);\n\tendOfTree = new EndOfTreeSegment(this);\n\n\tpublic createLocalReferencePosition(\n\t\t_segment: ISegmentLeaf | \"start\" | \"end\",\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tif (\n\t\t\t_segment !== \"start\" &&\n\t\t\t_segment !== \"end\" &&\n\t\t\tisRemovedAndAckedOrMovedAndAcked(_segment) &&\n\t\t\t!refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove | ReferenceType.Transient) &&\n\t\t\t_segment.endpointType === undefined\n\t\t) {\n\t\t\tthrow new UsageError(\n\t\t\t\t\"Can only create SlideOnRemove or Transient local reference position on a removed or obliterated segment\",\n\t\t\t);\n\t\t}\n\n\t\tlet segment: ISegmentLeaf;\n\n\t\tif (_segment === \"start\") {\n\t\t\tsegment = this.startOfTree;\n\t\t} else if (_segment === \"end\") {\n\t\t\tsegment = this.endOfTree;\n\t\t} else {\n\t\t\tsegment = _segment;\n\t\t}\n\n\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\n\t\tconst segRef = localRefs.createLocalRef(\n\t\t\toffset,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\n\t\treturn segRef;\n\t}\n\n\t// Segments should either be removed remotely, removed locally, or inserted locally\n\tprivate normalizeAdjacentSegments(affectedSegments: DoublyLinkedList<ISegmentLeaf>): void {\n\t\t// Eagerly demand this since we're about to shift elements in the list around\n\t\tconst currentOrder = Array.from(affectedSegments, ({ data: seg }) => ({\n\t\t\tparent: seg.parent,\n\t\t\tindex: seg.index,\n\t\t\tordinal: seg.ordinal,\n\t\t}));\n\n\t\t// Last segment which was not affected locally.\n\t\tlet lastLocalSegment = affectedSegments.last;\n\t\twhile (lastLocalSegment !== undefined && isRemovedAndAcked(lastLocalSegment.data)) {\n\t\t\tlastLocalSegment = lastLocalSegment.prev;\n\t\t}\n\n\t\tif (!lastLocalSegment) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (\n\t\t\tlet segmentToSlide: ListNode<ISegment> | undefined = lastLocalSegment,\n\t\t\t\tnearerSegment = lastLocalSegment?.prev;\n\t\t\tsegmentToSlide !== undefined;\n\t\t\tsegmentToSlide = nearerSegment, nearerSegment = nearerSegment?.prev\n\t\t) {\n\t\t\t// Slide iterCur forward as far as possible\n\t\t\tif (isRemovedAndAcked(segmentToSlide.data)) {\n\t\t\t\t// Slide past all segments that are not also remotely removed\n\t\t\t\taffectedSegments.remove(segmentToSlide);\n\t\t\t\taffectedSegments.insertAfter(lastLocalSegment, segmentToSlide.data);\n\t\t\t} else if (isRemoved(segmentToSlide.data)) {\n\t\t\t\tassert(\n\t\t\t\t\tsegmentToSlide.data.localRemovedSeq !== undefined,\n\t\t\t\t\t0x54d /* Removed segment that hasnt had its removal acked should be locally removed */,\n\t\t\t\t);\n\t\t\t\t// Slide each locally removed item past all segments that have localSeq > lremoveItem.localSeq\n\t\t\t\t// but not past remotely removed segments;\n\t\t\t\tlet cur = segmentToSlide;\n\t\t\t\tlet scan = cur.next;\n\t\t\t\twhile (\n\t\t\t\t\tscan !== undefined &&\n\t\t\t\t\t!isRemovedAndAcked(scan.data) &&\n\t\t\t\t\tscan.data.localSeq !== undefined &&\n\t\t\t\t\tscan.data.localSeq > segmentToSlide.data.localRemovedSeq\n\t\t\t\t) {\n\t\t\t\t\tcur = scan;\n\t\t\t\t\tscan = scan.next;\n\t\t\t\t}\n\t\t\t\tif (cur !== segmentToSlide) {\n\t\t\t\t\taffectedSegments.remove(segmentToSlide);\n\t\t\t\t\taffectedSegments.insertAfter(cur, segmentToSlide.data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst newOrder = Array.from(affectedSegments, ({ data }) => data);\n\t\tfor (const seg of newOrder)\n\t\t\tseg.localRefs?.walkReferences((lref) => lref.callbacks?.beforeSlide?.(lref));\n\t\tconst perSegmentTrackingGroups = new Map<ISegment, TrackingGroup[]>();\n\t\tfor (const segment of newOrder) {\n\t\t\tconst { trackingCollection } = segment;\n\t\t\tconst trackingGroups = [...trackingCollection.trackingGroups];\n\t\t\tperSegmentTrackingGroups.set(segment, trackingGroups);\n\t\t\tfor (const group of trackingCollection.trackingGroups) {\n\t\t\t\ttrackingCollection.unlink(group);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < newOrder.length; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tconst seg = newOrder[i]!;\n\t\t\tconst { parent, index, ordinal } = currentOrder[i]!;\n\t\t\tparent?.assignChild(seg, index, false);\n\t\t\tseg.ordinal = ordinal;\n\t\t}\n\n\t\tfor (const [segment, groups] of perSegmentTrackingGroups.entries()) {\n\t\t\tfor (const group of groups) {\n\t\t\t\tsegment.trackingCollection.link(group);\n\t\t\t}\n\t\t}\n\n\t\t// Finally, update internal node bookkeeping on ancestors of the swapped nodes.\n\t\t// Toposort would improve this by a log factor, but probably not worth the added code size\n\t\tconst depths = new Map<IMergeNode, number>();\n\t\tconst computeDepth = (block: IMergeNode): number => {\n\t\t\tif (!depths.has(block)) {\n\t\t\t\tdepths.set(block, block.parent === undefined ? 0 : 1 + computeDepth(block.parent));\n\t\t\t}\n\t\t\treturn depths.get(block)!;\n\t\t};\n\t\tfor (const element of newOrder) {\n\t\t\tcomputeDepth(element);\n\t\t}\n\t\tfor (const [node] of [...depths.entries()].sort((a, b) => b[1] - a[1])) {\n\t\t\tif (!node.isLeaf()) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t}\n\t\t}\n\t\tfor (const seg of newOrder)\n\t\t\tseg.localRefs?.walkReferences((lref) => lref.callbacks?.afterSlide?.(lref));\n\t}\n\n\t/**\n\t * Normalizes the segments nearby `segmentGroup` to be ordered as they would if the op submitting `segmentGroup`\n\t * is rebased to the current sequence number.\n\t * This primarily affects the ordering of adjacent segments that were removed between the original submission of\n\t * the local ops and now.\n\t * Consider the following sequence of events:\n\t * Initial state: \"hi my friend\" (seq: 0)\n\t * - Client 1 inserts \"good \" to make \"hi my good friend\" (op1, refSeq: 0)\n\t * - Client 2 deletes \"my \" to make \"hi friend\" (op2, refSeq: 0)\n\t * - op2 is sequenced giving seq 1\n\t * - Client 1 disconnects and reconnects at seq: 1.\n\t *\n\t * At this point in time, client 1 will have segments [\"hi \", Removed\"my \", Local\"good \", \"friend\"].\n\t * However, the rebased op that it submits will cause client 2 to have segments\n\t * [\"hi \", Local\"good \", Removed\"my \", \"friend\"].\n\t *\n\t * The difference in ordering can be problematic for tie-breaking concurrently inserted segments in some scenarios.\n\t * Rather than incur extra work tie-breaking these scenarios for all clients, when client 1 rebases its operation,\n\t * it can fix up its local state to align with what would be expected of the op it resubmits.\n\t */\n\tpublic normalizeSegmentsOnRebase(): void {\n\t\tlet currentRangeToNormalize = new DoublyLinkedList<ISegment>();\n\t\tlet rangeContainsLocalSegs = false;\n\t\tlet rangeContainsRemoteRemovedSegs = false;\n\t\tconst normalize = (): void => {\n\t\t\tif (\n\t\t\t\trangeContainsLocalSegs &&\n\t\t\t\trangeContainsRemoteRemovedSegs &&\n\t\t\t\tcurrentRangeToNormalize.length > 1\n\t\t\t) {\n\t\t\t\tthis.normalizeAdjacentSegments(currentRangeToNormalize);\n\t\t\t}\n\t\t};\n\t\twalkAllChildSegments(this.root, (seg) => {\n\t\t\tif (isRemoved(seg) || seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tif (isRemovedAndAcked(seg)) {\n\t\t\t\t\trangeContainsRemoteRemovedSegs = true;\n\t\t\t\t}\n\t\t\t\tif (seg.seq === UnassignedSequenceNumber) {\n\t\t\t\t\trangeContainsLocalSegs = true;\n\t\t\t\t}\n\t\t\t\tcurrentRangeToNormalize.push(seg);\n\t\t\t} else {\n\t\t\t\tnormalize();\n\t\t\t\tcurrentRangeToNormalize = new DoublyLinkedList<ISegment>();\n\t\t\t\trangeContainsLocalSegs = false;\n\t\t\t\trangeContainsRemoteRemovedSegs = false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tnormalize();\n\t}\n\tprivate blockUpdate(block: MergeBlock): void {\n\t\tlet len: number | undefined;\n\n\t\tconst rightmostTiles = createMap<Marker>();\n\t\tconst leftmostTiles = createMap<Marker>();\n\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\tconst node = block.children[i]!;\n\t\t\tconst nodeLength = nodeTotalLength(this, node);\n\t\t\tif (nodeLength !== undefined) {\n\t\t\t\tlen ??= 0;\n\t\t\t\tlen += nodeLength;\n\t\t\t}\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tconst segment = node;\n\t\t\t\tif ((this.localNetLength(segment) ?? 0) > 0 && Marker.is(segment)) {\n\t\t\t\t\tconst markerId = segment.getId();\n\t\t\t\t\t// Also in insertMarker but need for reload segs case\n\t\t\t\t\t// can add option for this only from reload segs\n\t\t\t\t\tif (markerId) {\n\t\t\t\t\t\tthis.idToMarker.set(markerId, segment);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (refTypeIncludesFlag(segment, ReferenceType.Tile)) {\n\t\t\t\t\t\tconst tileLabels = refGetTileLabels(segment);\n\t\t\t\t\t\tif (tileLabels) {\n\t\t\t\t\t\t\tfor (const tileLabel of tileLabels) {\n\t\t\t\t\t\t\t\t// this depends on walking children in order\n\t\t\t\t\t\t\t\t// The later, and right most children overwrite\n\t\t\t\t\t\t\t\t// whereas early, and left most do not overwrite\n\t\t\t\t\t\t\t\trightmostTiles[tileLabel] = segment;\n\t\t\t\t\t\t\t\tleftmostTiles[tileLabel] ??= segment;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\textend(rightmostTiles, node.rightmostTiles);\n\t\t\t\textendIfUndefined(leftmostTiles, node.leftmostTiles);\n\t\t\t}\n\t\t}\n\t\tblock.leftmostTiles = leftmostTiles;\n\t\tblock.rightmostTiles = rightmostTiles;\n\t\tblock.cachedLength = len;\n\t}\n\n\tpublic blockUpdatePathLengths(\n\t\tstartBlock: MergeBlock | undefined,\n\t\tseq: number,\n\t\tclientId: number,\n\t\tnewStructure = false,\n\t): void {\n\t\tlet block: MergeBlock | undefined = startBlock;\n\t\twhile (block !== undefined) {\n\t\t\tif (newStructure) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(block);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t}\n\t\t\tblock = block.parent;\n\t\t}\n\t}\n\n\tprivate blockUpdateLength(node: MergeBlock, seq: number, clientId: number): void {\n\t\tthis.blockUpdate(node);\n\t\tthis.localPartialsComputed = false;\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tseq !== TreeMaintenanceSequenceNumber\n\t\t) {\n\t\t\tif (\n\t\t\t\tnode.partialLengths !== undefined &&\n\t\t\t\tMergeTree.options.incrementalUpdate &&\n\t\t\t\tclientId !== NonCollabClient\n\t\t\t) {\n\t\t\t\tnode.partialLengths.update(node, seq, clientId, this.collabWindow);\n\t\t\t} else {\n\t\t\t\tnode.partialLengths = PartialSequenceLengths.combine(node, this.collabWindow);\n\t\t\t}\n\n\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, node, seq, clientId);\n\t\t}\n\t}\n\n\t/**\n\t * Map over all visible segments in a given range\n\t *\n\t * A segment is visible if its length is greater than 0\n\t *\n\t * See `this.nodeMap` for additional documentation\n\t */\n\tpublic mapRange<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\taccum: TClientData,\n\t\tstart?: number,\n\t\tend?: number,\n\t\tsplitRange: boolean = false,\n\t\tvisibilitySeq: number = refSeq,\n\t): void {\n\t\tif (splitRange) {\n\t\t\tif (start) {\n\t\t\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\t\t}\n\t\t\tif (end) {\n\t\t\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\t\t}\n\t\t}\n\t\tthis.nodeMap(\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\thandler,\n\t\t\taccum,\n\t\t\tundefined,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tundefined,\n\t\t\tvisibilitySeq,\n\t\t);\n\t}\n\n\t/**\n\t * Map over all visible segments in a given range\n\t *\n\t * A segment is visible if its length is greater than 0\n\t *\n\t * @param refSeq - The sequence number used to determine the range (start\n\t * and end positions) of segments to iterate over.\n\t *\n\t * @param visibilitySeq - An additional sequence number to further configure\n\t * segment visibility during traversal. This is the same as refSeq, except\n\t * in the case of obliterate.\n\t *\n\t * In the case where `refSeq == visibilitySeq`, mapping is done on all\n\t * visible segments from `start` to `end`.\n\t *\n\t * If a segment is invisible at both `visibilitySeq` and `refSeq`, then it\n\t * will not be traversed and mapped. Otherwise, if the segment is visible at\n\t * either seq, it will be mapped.\n\t *\n\t * If a segment is only visible at `visibilitySeq`, it will still be mapped,\n\t * but it will not count as a segment within the range. That is, it will be\n\t * ignored for the purposes of tracking when traversal should end.\n\t */\n\tprivate nodeMap<TClientData>(\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tleaf: ISegmentAction<TClientData>,\n\t\taccum: TClientData,\n\t\tpost?: BlockAction<TClientData>,\n\t\tstart: SequencePlace = 0,\n\t\tend?: SequencePlace,\n\t\tlocalSeq?: number,\n\t\tvisibilitySeq: number = refSeq,\n\t): void {\n\t\tconst maybeEndPos = end ?? this.nodeLength(this.root, refSeq, clientId, localSeq) ?? 0;\n\t\tif (maybeEndPos === start) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet pos = 0;\n\t\tlet { startPos, endPos } = endpointPosAndSide(start, end);\n\n\t\tstartPos = startPos === \"start\" || startPos === undefined ? 0 : startPos;\n\t\tendPos =\n\t\t\tendPos === \"end\" || endPos === undefined\n\t\t\t\t? this.root.mergeTree?.getLength(refSeq, clientId) ?? 0\n\t\t\t\t: endPos;\n\t\tassert(\n\t\t\tstartPos !== \"end\" && endPos !== \"start\",\n\t\t\t0x9e3 /* start cannot be 'end' and end cannot be 'start' */,\n\t\t);\n\t\tdepthFirstNodeWalk(\n\t\t\tthis.root,\n\t\t\tthis.root.children[0],\n\t\t\t(node) => {\n\t\t\t\tif (endPos <= pos) {\n\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t}\n\n\t\t\t\tconst len = this.nodeLength(node, visibilitySeq, clientId, localSeq);\n\t\t\t\tconst lenAtRefSeq =\n\t\t\t\t\t(visibilitySeq === refSeq\n\t\t\t\t\t\t? len\n\t\t\t\t\t\t: this.nodeLength(node, refSeq, clientId, localSeq)) ?? 0;\n\n\t\t\t\tconst isUnackedAndInObliterate =\n\t\t\t\t\tvisibilitySeq !== refSeq &&\n\t\t\t\t\t(!node.isLeaf() || node.seq === UnassignedSequenceNumber);\n\n\t\t\t\tif (\n\t\t\t\t\t(len === undefined && lenAtRefSeq === 0) ||\n\t\t\t\t\t(len === 0 && !isUnackedAndInObliterate && lenAtRefSeq === 0)\n\t\t\t\t) {\n\t\t\t\t\treturn NodeAction.Skip;\n\t\t\t\t}\n\n\t\t\t\tconst nextPos = pos + lenAtRefSeq;\n\t\t\t\t// start is beyond the current node, so we can skip it\n\t\t\t\tif (typeof startPos === \"number\" && startPos >= nextPos) {\n\t\t\t\t\tpos = nextPos;\n\t\t\t\t\treturn NodeAction.Skip;\n\t\t\t\t}\n\n\t\t\t\tif (node.isLeaf()) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tleaf(node, pos, refSeq, clientId, startPos - pos, endPos - pos, accum) === false\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t\t}\n\t\t\t\t\tpos = nextPos;\n\t\t\t\t}\n\t\t\t},\n\t\t\tundefined,\n\t\t\tpost === undefined\n\t\t\t\t? undefined\n\t\t\t\t: (block): boolean =>\n\t\t\t\t\t\tpost(block, pos, refSeq, clientId, startPos - pos, endPos - pos, accum),\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable no-bitwise */\n\nimport { assert, Heap, IComparer } from \"@fluidframework/core-utils/internal\";\nimport { DataProcessingError, UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IAttributionCollectionSerializer } from \"./attributionCollection.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { Client } from \"./client.js\";\nimport { DoublyLinkedList, ListNode } from \"./collections/index.js\";\nimport {\n\tNonCollabClient,\n\tTreeMaintenanceSequenceNumber,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"./constants.js\";\nimport { EndOfTreeSegment, StartOfTreeSegment } from \"./endOfTreeSegment.js\";\nimport {\n\tLocalReferenceCollection,\n\tLocalReferencePosition,\n\tSlidingPreference,\n\tanyLocalReferencePosition,\n\tcreateDetachedLocalReferencePosition,\n\tfilterLocalReferencePositions,\n} from \"./localReference.js\";\nimport {\n\tIMergeTreeDeltaOpArgs,\n\tIMergeTreeSegmentDelta,\n\tMergeTreeDeltaCallback,\n\tMergeTreeMaintenanceCallback,\n\tMergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback.js\";\nimport {\n\tNodeAction,\n\tbackwardExcursion,\n\tdepthFirstNodeWalk,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"./mergeTreeNodeWalk.js\";\nimport {\n\tBlockAction,\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tIMergeNode,\n\tIMoveInfo,\n\tIRemovalInfo,\n\tISegment,\n\tISegmentAction,\n\tISegmentChanges,\n\tISegmentLeaf,\n\tInsertContext,\n\tMarker,\n\tMaxNodesInBlock,\n\tMergeBlock,\n\t// eslint-disable-next-line import/no-deprecated\n\tSegmentGroup,\n\treservedMarkerIdKey,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n\t// eslint-disable-next-line import/no-deprecated\n\ttype ObliterateInfo,\n} from \"./mergeTreeNodes.js\";\nimport type { TrackingGroup } from \"./mergeTreeTracking.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"./opBuilder.js\";\nimport {\n\tIMergeTreeDeltaOp,\n\tIRelativePosition,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"./ops.js\";\nimport { PartialSequenceLengths } from \"./partialLengths.js\";\nimport { PerspectiveImpl, isSegmentPresent } from \"./perspective.js\";\nimport { PropertySet, createMap, extend, extendIfUndefined } from \"./properties.js\";\nimport {\n\tDetachedReferencePosition,\n\tReferencePosition,\n\trefGetTileLabels,\n\trefHasTileLabel,\n\trefTypeIncludesFlag,\n} from \"./referencePositions.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { PropertiesRollback } from \"./segmentPropertiesManager.js\";\nimport { endpointPosAndSide, type SequencePlace } from \"./sequencePlace.js\";\nimport { SortedSegmentSet } from \"./sortedSegmentSet.js\";\nimport { zamboniSegments } from \"./zamboni.js\";\n\nfunction markSegmentMoved(seg: ISegment, moveInfo: IMoveInfo): void {\n\tseg.moveDst = moveInfo.moveDst;\n\tseg.movedClientIds = [...moveInfo.movedClientIds];\n\tseg.movedSeqs = [moveInfo.movedSeq];\n\tseg.movedSeq = moveInfo.movedSeq;\n\tseg.localMovedSeq = moveInfo.localMovedSeq;\n\tseg.wasMovedOnInsert = moveInfo.wasMovedOnInsert;\n}\n\nfunction isMoved(segment: ISegment): segment is ISegment & IMoveInfo {\n\treturn toMoveInfo(segment) !== undefined;\n}\n\nfunction isRemoved(segment: ISegment): segment is ISegment & IRemovalInfo {\n\treturn toRemovalInfo(segment) !== undefined;\n}\n\nfunction isRemovedAndAcked(segment: ISegment): segment is ISegment & IRemovalInfo {\n\tconst removalInfo = toRemovalInfo(segment);\n\treturn removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;\n}\n\nfunction isMovedAndAcked(segment: ISegment): segment is ISegment & IMoveInfo {\n\tconst moveInfo = toMoveInfo(segment);\n\treturn moveInfo !== undefined && moveInfo.movedSeq !== UnassignedSequenceNumber;\n}\n\nfunction isRemovedAndAckedOrMovedAndAcked(segment: ISegment): boolean {\n\treturn isRemovedAndAcked(segment) || isMovedAndAcked(segment);\n}\n\nfunction isRemovedOrMoved(segment: ISegment): boolean {\n\treturn isRemoved(segment) || isMoved(segment);\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode): number | undefined {\n\tif (!node.isLeaf()) {\n\t\treturn node.cachedLength;\n\t}\n\treturn mergeTree.localNetLength(node);\n}\n\nconst LRUSegmentComparer: IComparer<LRUSegment> = {\n\tmin: { maxSeq: -2 },\n\tcompare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IMergeTreeOptions {\n\tcatchUpBlobName?: string;\n\t/**\n\t * Whether or not reference positions can slide to special endpoint segments\n\t * denoting the positions immediately before the start and immediately after\n\t * the end of the string.\n\t *\n\t * This is primarily useful in the case of interval stickiness.\n\t */\n\tmergeTreeReferencesCanSlideToEndpoint?: boolean;\n\tmergeTreeSnapshotChunkSize?: number;\n\t/**\n\t * Whether to use the SnapshotV1 format over SnapshotLegacy.\n\t *\n\t * SnapshotV1 stores a view of the merge-tree at the current sequence number, preserving merge metadata\n\t * (e.g. clientId, seq, etc.) only for segment changes within the collab window.\n\t *\n\t * SnapshotLegacy stores a view of the merge-tree at the minimum sequence number along with the ops between\n\t * the minimum sequence number and the current sequence number.\n\t *\n\t * Both formats merge segments where possible (see {@link ISegment.canAppend})\n\t *\n\t * default: false\n\t *\n\t * @remarks\n\t * Despite the \"legacy\"/\"V1\" naming, both formats are actively used at the time of writing. SharedString\n\t * uses legacy and Matrix uses V1.\n\t */\n\tnewMergeTreeSnapshotFormat?: boolean;\n\n\t/**\n\t * Options related to attribution\n\t */\n\tattribution?: IMergeTreeAttributionOptions;\n\n\t/**\n\t * Enables support for the obliterate operation -- a stronger form of remove\n\t * which deletes concurrently inserted segments\n\t *\n\t * Obliterate is currently experimental and may not work in all scenarios.\n\t *\n\t * Default value: false\n\t */\n\tmergeTreeEnableObliterate?: boolean;\n\n\t/**\n\t * Enables support for reconnecting when obliterate operations are present\n\t *\n\t * Obliterate is currently experimental and may not work in all scenarios.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmergeTreeEnableObliterateReconnect?: boolean;\n}\nexport function errorIfOptionNotTrue(\n\toptions: IMergeTreeOptions | undefined,\n\toption: keyof IMergeTreeOptions,\n): void {\n\tif (options?.[option] !== true) {\n\t\tthrow new Error(`${option} is not enabled.`);\n\t}\n}\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IMergeTreeAttributionOptions {\n\t/**\n\t * If enabled, segments will store attribution keys which can be used with the runtime to determine\n\t * attribution information (i.e. who created the content and when it was created).\n\t *\n\t * This flag only applied to new documents: if a snapshot is loaded, whether or not attribution keys\n\t * are tracked is determined by the presence of existing attribution keys in the snapshot.\n\t *\n\t * default: false\n\t */\n\ttrack?: boolean;\n\n\t/**\n\t * Provides a policy for how to track attribution data on segments.\n\t * This option must be provided if either:\n\t * - `track` is set to true\n\t * - a document containing existing attribution information is loaded\n\t */\n\tpolicyFactory?: () => AttributionPolicy;\n}\n\n/**\n * Implements policy dictating which kinds of operations should be attributed and how.\n * @sealed\n * @legacy\n * @alpha\n */\nexport interface AttributionPolicy {\n\t/**\n\t * Enables tracking attribution information for operations on this merge-tree.\n\t * This function is expected to subscribe to appropriate change events in order\n\t * to manage any attribution data it stores on segments.\n\t *\n\t * This must be done in an eventually consistent fashion.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tattach: (client: Client) => void;\n\t/**\n\t * Disables tracking attribution information on segments.\n\t */\n\tdetach: () => void;\n\t/***/\n\tisAttached: boolean;\n\t/**\n\t * Serializer capable of serializing any attribution data this policy stores on segments.\n\t */\n\tserializer: IAttributionCollectionSerializer;\n}\n\n/**\n * @internal\n */\nexport interface LRUSegment {\n\tsegment?: ISegmentLeaf;\n\tmaxSeq: number;\n}\n\nexport interface IRootMergeBlock extends MergeBlock {\n\tmergeTree?: MergeTree;\n}\n\nexport function findRootMergeBlock(\n\tsegmentOrNode: IMergeNode | undefined,\n): IRootMergeBlock | undefined {\n\tif (segmentOrNode === undefined) {\n\t\treturn undefined;\n\t}\n\tlet maybeRoot: IRootMergeBlock | undefined = segmentOrNode.isLeaf()\n\t\t? segmentOrNode.parent\n\t\t: segmentOrNode;\n\twhile (maybeRoot?.parent !== undefined) {\n\t\tmaybeRoot = maybeRoot.parent;\n\t}\n\n\treturn maybeRoot?.mergeTree === undefined ? undefined : maybeRoot;\n}\n\n/**\n * Find the segment to which a reference will slide if it needs to slide, or undefined if there\n * is no valid segment (i.e. the tree is empty).\n *\n * @param segment - The segment to slide from.\n * @param cache - Optional cache mapping segments to their sliding destinations.\n * Excursions will be avoided for segments in the cache, and the cache will be populated with\n * entries for all segments visited during excursion.\n * This can reduce the number of times the tree needs to be scanned if a range containing many\n * SlideOnRemove references is removed.\n * @internal\n */\nfunction getSlideToSegment(\n\tsegment: ISegment | undefined,\n\tslidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\tcache?: Map<ISegment, { seg?: ISegment }>,\n\tuseNewSlidingBehavior: boolean = false,\n): [ISegment | undefined, \"start\" | \"end\" | undefined] {\n\tif (\n\t\t!segment ||\n\t\t!isRemovedAndAckedOrMovedAndAcked(segment) ||\n\t\tsegment.endpointType !== undefined\n\t) {\n\t\treturn [segment, undefined];\n\t}\n\n\tconst cachedSegment = cache?.get(segment);\n\tif (cachedSegment !== undefined) {\n\t\treturn [cachedSegment.seg, undefined];\n\t}\n\tconst result: { seg?: ISegment } = {};\n\tcache?.set(segment, result);\n\tconst goFurtherToFindSlideToSegment = (seg: ISegment): boolean => {\n\t\tif (seg.seq !== UnassignedSequenceNumber && !isRemovedAndAckedOrMovedAndAcked(seg)) {\n\t\t\tresult.seg = seg;\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tcache !== undefined &&\n\t\t\t(seg.removedSeq === segment.removedSeq || seg.movedSeq === segment.movedSeq)\n\t\t) {\n\t\t\tcache.set(seg, result);\n\t\t}\n\t\treturn true;\n\t};\n\n\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\tbackwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t} else {\n\t\tforwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t}\n\tif (result.seg !== undefined) {\n\t\treturn [result.seg, undefined];\n\t}\n\n\t// in the new sliding behavior, we don't look in the opposite direction\n\t// if we fail to find a segment to slide to in the right direction.\n\t//\n\t// in other words, rather than going `forward ?? backward ?? detached` (or\n\t// `backward ?? forward ?? detached`), we would slide `forward ?? detached`\n\t// or `backward ?? detached`\n\t//\n\t// in both of these cases detached may be substituted for one of the special\n\t// endpoint segments, if such behavior is enabled\n\tif (!useNewSlidingBehavior) {\n\t\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\t\tforwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t\t} else {\n\t\t\tbackwardExcursion(segment, goFurtherToFindSlideToSegment);\n\t\t}\n\t}\n\n\tlet maybeEndpoint: \"start\" | \"end\" | undefined;\n\n\tif (slidingPreference === SlidingPreference.BACKWARD) {\n\t\tmaybeEndpoint = \"start\";\n\t} else if (slidingPreference === SlidingPreference.FORWARD) {\n\t\tmaybeEndpoint = \"end\";\n\t}\n\n\treturn [result.seg, maybeEndpoint];\n}\n\n/**\n * Returns the position to slide a reference to if a slide is required.\n * @param segoff - The segment and offset to slide from\n * @returns segment and offset to slide the reference to\n * @internal\n */\nexport function getSlideToSegoff(\n\tsegoff: { segment: ISegment | undefined; offset: number | undefined },\n\tslidingPreference: SlidingPreference = SlidingPreference.FORWARD,\n\tuseNewSlidingBehavior: boolean = false,\n): {\n\tsegment: ISegment | undefined;\n\toffset: number | undefined;\n} {\n\tif (segoff.segment === undefined) {\n\t\treturn segoff;\n\t}\n\tconst [segment, _] = getSlideToSegment(\n\t\tsegoff.segment,\n\t\tslidingPreference,\n\t\tundefined,\n\t\tuseNewSlidingBehavior,\n\t);\n\tif (segment === segoff.segment) {\n\t\treturn segoff;\n\t}\n\tconst offset =\n\t\tsegment && segment.ordinal < segoff.segment.ordinal ? segment.cachedLength - 1 : 0;\n\treturn {\n\t\tsegment,\n\t\toffset,\n\t};\n}\n\nconst forwardPred = (ref: LocalReferencePosition): boolean =>\n\tref.slidingPreference !== SlidingPreference.BACKWARD;\nconst backwardPred = (ref: LocalReferencePosition): boolean =>\n\tref.slidingPreference === SlidingPreference.BACKWARD;\n\nclass Obliterates {\n\t/**\n\t * Array containing the all move operations within the\n\t * collab window.\n\t *\n\t * The moves are stored in sequence order which accelerates clean up in setMinSeq\n\t *\n\t * See https://github.com/microsoft/FluidFramework/blob/main/packages/dds/merge-tree/docs/Obliterate.md#remote-perspective\n\t * for additional context\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate readonly seqOrdered = new DoublyLinkedList<ObliterateInfo>();\n\n\t/**\n\t * This contains a sorted lists of all obliterate starts\n\t * and is used to accelerate finding overlapping obliterates\n\t * as well as determining if there are any obliterates at all.\n\t */\n\tprivate readonly startOrdered = new SortedSegmentSet<LocalReferencePosition>();\n\n\tconstructor(private readonly mergeTree: MergeTree) {}\n\n\tpublic setMinSeq(minSeq: number): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n\t\twhile (!this.seqOrdered.empty && this.seqOrdered.first?.data.seq! <= minSeq) {\n\t\t\tconst ob = this.seqOrdered.shift()!;\n\t\t\tthis.startOrdered.remove(ob.data.start);\n\t\t\tthis.mergeTree.removeLocalReferencePosition(ob.data.start);\n\t\t\tthis.mergeTree.removeLocalReferencePosition(ob.data.end);\n\t\t}\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic addOrUpdate(obliterateInfo: ObliterateInfo): void {\n\t\tconst { seq, start } = obliterateInfo;\n\t\tif (seq !== UnassignedSequenceNumber) {\n\t\t\tthis.seqOrdered.push(obliterateInfo);\n\t\t}\n\t\tthis.startOrdered.addOrUpdate(start);\n\t}\n\n\tpublic empty(): boolean {\n\t\treturn this.startOrdered.size === 0;\n\t}\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic findOverlapping(seg: ISegment): Iterable<ObliterateInfo> {\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst overlapping: ObliterateInfo[] = [];\n\t\tfor (const start of this.startOrdered.items) {\n\t\t\tif (start.getSegment()!.ordinal <= seg.ordinal) {\n\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\tconst ob = start.properties?.obliterate as ObliterateInfo;\n\t\t\t\tif (ob.end.getSegment()!.ordinal >= seg.ordinal) {\n\t\t\t\t\toverlapping.push(ob);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// the start is past the seg, so exit\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn overlapping;\n\t}\n}\n\n/**\n * @internal\n */\nexport class MergeTree {\n\tpublic static readonly options = {\n\t\tincrementalUpdate: true,\n\t\tinsertAfterRemovedSegs: true,\n\t\tzamboniSegments: true,\n\t};\n\n\tprivate static readonly theUnfinishedNode = { childCount: -1 } as unknown as MergeBlock;\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic readonly collabWindow = new CollaborationWindow();\n\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic readonly pendingSegments = new DoublyLinkedList<SegmentGroup>();\n\n\tpublic readonly segmentsToScour = new Heap<LRUSegment>(LRUSegmentComparer);\n\n\tpublic readonly attributionPolicy: AttributionPolicy | undefined;\n\n\t/**\n\t * Whether or not all blocks in the mergeTree currently have information about local partial lengths computed.\n\t * This information is only necessary on reconnect, and otherwise costly to bookkeep.\n\t * This field enables tracking whether partials need to be recomputed using localSeq information.\n\t */\n\tprivate localPartialsComputed = false;\n\t// for now assume only markers have ids and so point directly at the Segment\n\t// if we need to have pointers to non-markers, we can change to point at local refs\n\tprivate readonly idToMarker = new Map<string, Marker>();\n\tpublic mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n\tpublic mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n\tprivate readonly obliterates = new Obliterates(this);\n\n\tpublic constructor(public options?: IMergeTreeOptions) {\n\t\tthis._root = this.makeBlock(0);\n\t\tthis._root.mergeTree = this;\n\t\tthis.attributionPolicy = options?.attribution?.policyFactory?.();\n\t}\n\n\tprivate _root: IRootMergeBlock;\n\tpublic get root(): IRootMergeBlock {\n\t\treturn this._root;\n\t}\n\n\tpublic set root(value: IRootMergeBlock) {\n\t\tthis._root = value;\n\t\tvalue.mergeTree = this;\n\t}\n\n\tpublic makeBlock(childCount: number): MergeBlock {\n\t\tconst block = new MergeBlock(childCount);\n\t\tblock.ordinal = \"\";\n\t\treturn block;\n\t}\n\n\t/**\n\t * Compute the net length of this segment from a local perspective.\n\t * @param segment - Segment whose length to find\n\t * @param localSeq - localSeq at which to find the length of this segment. If not provided,\n\t * default is to consider the local client's current perspective. Only local sequence\n\t * numbers corresponding to un-acked operations give valid results.\n\t */\n\tpublic localNetLength(\n\t\tsegment: ISegment,\n\t\trefSeq?: number,\n\t\tlocalSeq?: number,\n\t): number | undefined {\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst moveInfo = toMoveInfo(segment);\n\t\tif (localSeq === undefined) {\n\t\t\tif (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t\tif (\n\t\t\t\t\t(!!removalInfo && !seqLTE(removalInfo.removedSeq, this.collabWindow.minSeq)) ||\n\t\t\t\t\t(!!moveInfo && !seqLTE(moveInfo.movedSeq, this.collabWindow.minSeq))\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\t// this segment removed and outside the collab window which means it is zamboni eligible\n\t\t\t\t// this also means the segment could not exist, so we should not consider it\n\t\t\t\t// when making decisions about conflict resolutions\n\t\t\t\treturn undefined;\n\t\t\t} else {\n\t\t\t\treturn segment.cachedLength;\n\t\t\t}\n\t\t}\n\n\t\tassert(\n\t\t\trefSeq !== undefined,\n\t\t\t0x398 /* localSeq provided for local length without refSeq */,\n\t\t);\n\t\tassert(segment.seq !== undefined, 0x399 /* segment with no seq in mergeTree */);\n\t\tconst { seq, removedSeq, localRemovedSeq, movedSeq, localMovedSeq } = segment;\n\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\tassert(\n\t\t\t\tsegment.localSeq !== undefined,\n\t\t\t\t0x39a /* unacked segment with undefined localSeq */,\n\t\t\t);\n\t\t\t// inserted locally, still un-acked\n\t\t\tif (\n\t\t\t\tsegment.localSeq > localSeq ||\n\t\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||\n\t\t\t\t(localMovedSeq !== undefined && localMovedSeq <= localSeq)\n\t\t\t) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tconst { cachedLength } = segment;\n\t\t\treturn cachedLength;\n\t\t} else {\n\t\t\t// inserted remotely\n\t\t\tif (\n\t\t\t\tseq > refSeq ||\n\t\t\t\t(removedSeq !== undefined &&\n\t\t\t\t\tremovedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tremovedSeq <= refSeq) ||\n\t\t\t\t(movedSeq !== undefined &&\n\t\t\t\t\tmovedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tmovedSeq <= refSeq) ||\n\t\t\t\t(localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||\n\t\t\t\t(localMovedSeq !== undefined && localMovedSeq <= localSeq)\n\t\t\t) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn segment.cachedLength;\n\t\t}\n\t}\n\n\tpublic unlinkMarker(marker: Marker): void {\n\t\tconst id = marker.getId();\n\t\tif (id) {\n\t\t\tthis.idToMarker.delete(id);\n\t\t}\n\t}\n\n\tprivate addNode(block: MergeBlock, node: IMergeNode): number {\n\t\tconst index = block.childCount++;\n\t\tblock.assignChild(node, index, false);\n\t\treturn index;\n\t}\n\n\tpublic reloadFromSegments(segments: ISegment[]): void {\n\t\t// This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n\t\tassert(\n\t\t\t!this.collabWindow.collaborating,\n\t\t\t0x049 /* \"Trying to reload from segments while collaborating!\" */,\n\t\t);\n\n\t\tconst maxChildren = MaxNodesInBlock - 1;\n\n\t\t// Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n\t\tconst buildMergeBlock = (nodes: IMergeNode[]): IRootMergeBlock => {\n\t\t\tconst blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n\t\t\tconst blocks: MergeBlock[] = Array.from({ length: blockCount }); // Pre-alloc array to collect nodes\n\n\t\t\t// For each block in this level of the B-Tree...\n\t\t\tfor (\n\t\t\t\tlet nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n\t\t\t\tblockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n\t\t\t\tblockIndex++ // Advance to next block in this layer.\n\t\t\t) {\n\t\t\t\tconst block = (blocks[blockIndex] = this.makeBlock(0));\n\n\t\t\t\t// For each child of the current block, insert a node (while we have nodes left)\n\t\t\t\t// and update the block's info.\n\t\t\t\tfor (\n\t\t\t\t\tlet childIndex = 0;\n\t\t\t\t\tchildIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n\t\t\t\t\tchildIndex++, nodeIndex++ // Advance to next child & node\n\t\t\t\t) {\n\t\t\t\t\t// Insert the next node into the current block\n\t\t\t\t\tthis.addNode(block, nodes[nodeIndex]);\n\t\t\t\t}\n\n\t\t\t\t// Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n\t\t\t\t// but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n\t\t\t\t// snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n\t\t\t\tthis.blockUpdate(block);\n\t\t\t}\n\n\t\t\treturn blocks.length === 1 // If there is only one block at this layer...\n\t\t\t\t? blocks[0] // ...then we're done. Return the root.\n\t\t\t\t: buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n\t\t};\n\t\tif (segments.length > 0) {\n\t\t\tthis.root = buildMergeBlock(segments);\n\t\t\tthis.nodeUpdateOrdinals(this.root);\n\t\t} else {\n\t\t\tthis.root = this.makeBlock(0);\n\t\t}\n\t}\n\n\t// For now assume min starts at zero\n\tpublic startCollaboration(localClientId: number, minSeq: number, currentSeq: number): void {\n\t\tthis.collabWindow.clientId = localClientId;\n\t\tthis.collabWindow.minSeq = minSeq;\n\t\tthis.collabWindow.collaborating = true;\n\t\tthis.collabWindow.currentSeq = currentSeq;\n\t\tthis.nodeUpdateLengthNewStructure(this.root, true);\n\t}\n\n\tprivate addToLRUSet(leaf: ISegmentLeaf, seq: number): void {\n\t\t// If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n\t\t// add the segment and mark the mark the node now.\n\n\t\t// TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n\t\t// segments from a snapshot. We currently skip these for now.\n\t\tif (leaf.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n\t\t\tleaf.parent!.needsScour = true;\n\t\t\tthis.segmentsToScour.add({ segment: leaf, maxSeq: seq });\n\t\t}\n\t}\n\n\tpublic getLength(refSeq: number, clientId: number): number {\n\t\treturn this.blockLength(this.root, refSeq, clientId);\n\t}\n\n\t/**\n\t * Returns the current length of the MergeTree for the local client.\n\t */\n\tpublic get length(): number | undefined {\n\t\treturn this.root.cachedLength;\n\t}\n\n\tpublic getPosition(\n\t\tnode: IMergeNode,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): number {\n\t\tif (node.isLeaf() && node.endpointType === \"start\") {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet totalOffset = 0;\n\t\tlet parent = node.parent;\n\t\tlet prevParent: MergeBlock | undefined;\n\t\twhile (parent) {\n\t\t\tconst children = parent.children;\n\t\t\tfor (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t\t\tconst child = children[childIndex];\n\t\t\t\tif ((!!prevParent && child === prevParent) || child === node) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ttotalOffset += this.nodeLength(child, refSeq, clientId, localSeq) ?? 0;\n\t\t\t}\n\t\t\tprevParent = parent;\n\t\t\tparent = parent.parent;\n\t\t}\n\t\treturn totalOffset;\n\t}\n\n\tpublic getContainingSegment<T extends ISegment>(\n\t\tpos: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): {\n\t\tsegment: T | undefined;\n\t\toffset: number | undefined;\n\t} {\n\t\tassert(\n\t\t\tlocalSeq === undefined || clientId === this.collabWindow.clientId,\n\t\t\t0x39b /* localSeq provided for non-local client */,\n\t\t);\n\t\tlet segment: T | undefined;\n\t\tlet offset: number | undefined;\n\n\t\tconst leaf = (\n\t\t\tleafSeg: ISegment,\n\t\t\tsegpos: number,\n\t\t\t_refSeq: number,\n\t\t\t_clientId: number,\n\t\t\tstart: number,\n\t\t): boolean => {\n\t\t\tsegment = leafSeg as T;\n\t\t\toffset = start;\n\t\t\treturn false;\n\t\t};\n\t\tthis.nodeMap(refSeq, clientId, leaf, undefined, undefined, pos, pos + 1, localSeq);\n\t\treturn { segment, offset };\n\t}\n\n\t/**\n\t * Slides or removes references from the provided list of segments.\n\t *\n\t * The order of the references is preserved for references of the same sliding\n\t * preference. Relative order between references that slide backward and those\n\t * that slide forward is not preserved, even in the case when they slide to\n\t * the same segment.\n\t *\n\t * @remarks\n\t *\n\t * 1. Preserving the order of the references is a useful property for reference-based undo/redo\n\t * (see revertibles.ts).\n\t *\n\t * 2. For use cases which necessitate eventual consistency across clients,\n\t * this method should only be called with segments for which the current client sequence number is\n\t * max(remove segment sequence number, add reference sequence number).\n\t * See `packages\\dds\\merge-tree\\REFERENCEPOSITIONS.md`\n\t *\n\t * @param segments - An array of (not necessarily contiguous) segments with increasing ordinals.\n\t */\n\tprivate slideAckedRemovedSegmentReferences(segments: ISegment[]): void {\n\t\t// References are slid in groups to preserve their order.\n\t\tlet currentForwardSlideGroup: LocalReferenceCollection[] = [];\n\t\tlet currentBackwardSlideGroup: LocalReferenceCollection[] = [];\n\n\t\tlet currentForwardMaybeEndpoint: \"start\" | \"end\" | undefined;\n\t\tlet currentForwardSlideDestination: ISegment | undefined;\n\t\tlet currentForwardSlideIsForward: boolean | undefined;\n\n\t\tlet currentBackwardMaybeEndpoint: \"start\" | \"end\" | undefined;\n\t\tlet currentBackwardSlideDestination: ISegment | undefined;\n\t\tlet currentBackwardSlideIsForward: boolean | undefined;\n\n\t\tconst slideGroup = (\n\t\t\tcurrentSlideDestination: ISegmentLeaf | undefined,\n\t\t\tcurrentSlideIsForward: boolean | undefined,\n\t\t\tcurrentSlideGroup: LocalReferenceCollection[],\n\t\t\tpred: (ref: LocalReferencePosition) => boolean,\n\t\t\tmaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t): void => {\n\t\t\tif (currentSlideIsForward === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nonEndpointRefsToAdd = currentSlideGroup.map((collection) =>\n\t\t\t\tfilterLocalReferencePositions(\n\t\t\t\t\tcollection,\n\t\t\t\t\t(ref) => pred(ref) && (maybeEndpoint ? !ref.canSlideToEndpoint : true),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst endpointRefsToAdd = currentSlideGroup.map((collection) =>\n\t\t\t\tfilterLocalReferencePositions(\n\t\t\t\t\tcollection,\n\t\t\t\t\t(ref) => pred(ref) && !!ref.canSlideToEndpoint,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (maybeEndpoint) {\n\t\t\t\tconst endpoint = maybeEndpoint === \"start\" ? this.startOfTree : this.endOfTree;\n\t\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(endpoint);\n\t\t\t\tif (currentSlideIsForward) {\n\t\t\t\t\tlocalRefs.addBeforeTombstones(...endpointRefsToAdd);\n\t\t\t\t} else {\n\t\t\t\t\tlocalRefs.addAfterTombstones(...endpointRefsToAdd);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentSlideDestination === undefined) {\n\t\t\t\tfor (const collection of currentSlideGroup) {\n\t\t\t\t\tfor (const ref of collection) {\n\t\t\t\t\t\tif (pred(ref) && !refTypeIncludesFlag(ref, ReferenceType.StayOnRemove)) {\n\t\t\t\t\t\t\tref.callbacks?.beforeSlide?.(ref);\n\t\t\t\t\t\t\tcollection.removeLocalRef(ref);\n\t\t\t\t\t\t\tref.callbacks?.afterSlide?.(ref);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);\n\t\t\t\tif (currentSlideIsForward) {\n\t\t\t\t\tlocalRefs.addBeforeTombstones(...nonEndpointRefsToAdd);\n\t\t\t\t} else {\n\t\t\t\t\tlocalRefs.addAfterTombstones(...nonEndpointRefsToAdd);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst trySlideSegment = (\n\t\t\tsegment: ISegment,\n\t\t\tcurrentSlideDestination: ISegment | undefined,\n\t\t\tcurrentSlideIsForward: boolean | undefined,\n\t\t\tcurrentSlideGroup: LocalReferenceCollection[],\n\t\t\tpred: (ref: LocalReferencePosition) => boolean,\n\t\t\tslidingPreference: SlidingPreference,\n\t\t\tcurrentMaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t\treassign: (\n\t\t\t\tlocalRefs: LocalReferenceCollection,\n\t\t\t\tslideToSegment: ISegment | undefined,\n\t\t\t\tslideIsForward: boolean,\n\t\t\t\tmaybeEndpoint: \"start\" | \"end\" | undefined,\n\t\t\t) => void,\n\t\t): void => {\n\t\t\t// avoid sliding logic if this segment doesn't have any references\n\t\t\t// with the given sliding preference\n\t\t\tif (!segment.localRefs || !anyLocalReferencePosition(segment.localRefs, pred)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [slideToSegment, maybeEndpoint] = getSlideToSegment(\n\t\t\t\tsegment,\n\t\t\t\tslidingPreference,\n\t\t\t\tslidingPreference === SlidingPreference.FORWARD\n\t\t\t\t\t? forwardSegmentCache\n\t\t\t\t\t: backwardSegmentCache,\n\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint,\n\t\t\t);\n\t\t\tconst slideIsForward =\n\t\t\t\tslideToSegment === undefined ? false : slideToSegment.ordinal > segment.ordinal;\n\n\t\t\tif (\n\t\t\t\tslideToSegment !== currentSlideDestination ||\n\t\t\t\tslideIsForward !== currentSlideIsForward ||\n\t\t\t\tmaybeEndpoint !== currentMaybeEndpoint\n\t\t\t) {\n\t\t\t\tslideGroup(\n\t\t\t\t\tcurrentSlideDestination,\n\t\t\t\t\tcurrentSlideIsForward,\n\t\t\t\t\tcurrentSlideGroup,\n\t\t\t\t\tpred,\n\t\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint ? maybeEndpoint : undefined,\n\t\t\t\t);\n\t\t\t\treassign(\n\t\t\t\t\tsegment.localRefs,\n\t\t\t\t\tslideToSegment,\n\t\t\t\t\tslideIsForward,\n\t\t\t\t\tthis.options?.mergeTreeReferencesCanSlideToEndpoint ? maybeEndpoint : undefined,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurrentSlideGroup.push(segment.localRefs);\n\t\t\t}\n\t\t};\n\n\t\tconst forwardSegmentCache = new Map<ISegment, { seg?: ISegment }>();\n\t\tconst backwardSegmentCache = new Map<ISegment, { seg?: ISegment }>();\n\t\tfor (const segment of segments) {\n\t\t\tassert(\n\t\t\t\tisRemovedAndAckedOrMovedAndAcked(segment),\n\t\t\t\t0x2f1 /* slideReferences from a segment which has not been removed and acked */,\n\t\t\t);\n\t\t\tif (segment.localRefs === undefined || segment.localRefs.empty) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttrySlideSegment(\n\t\t\t\tsegment,\n\t\t\t\tcurrentForwardSlideDestination,\n\t\t\t\tcurrentForwardSlideIsForward,\n\t\t\t\tcurrentForwardSlideGroup,\n\t\t\t\tforwardPred,\n\t\t\t\tSlidingPreference.FORWARD,\n\t\t\t\tcurrentForwardMaybeEndpoint,\n\t\t\t\t(localRefs, slideToSegment, slideIsForward, maybeEndpoint) => {\n\t\t\t\t\tcurrentForwardSlideGroup = [localRefs];\n\t\t\t\t\tcurrentForwardSlideDestination = slideToSegment;\n\t\t\t\t\tcurrentForwardSlideIsForward = slideIsForward;\n\t\t\t\t\tcurrentForwardMaybeEndpoint = maybeEndpoint;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\ttrySlideSegment(\n\t\t\t\tsegment,\n\t\t\t\tcurrentBackwardSlideDestination,\n\t\t\t\tcurrentBackwardSlideIsForward,\n\t\t\t\tcurrentBackwardSlideGroup,\n\t\t\t\tbackwardPred,\n\t\t\t\tSlidingPreference.BACKWARD,\n\t\t\t\tcurrentBackwardMaybeEndpoint,\n\t\t\t\t(localRefs, slideToSegment, slideIsForward, maybeEndpoint) => {\n\t\t\t\t\tcurrentBackwardSlideGroup = [localRefs];\n\t\t\t\t\tcurrentBackwardSlideDestination = slideToSegment;\n\t\t\t\t\tcurrentBackwardSlideIsForward = slideIsForward;\n\t\t\t\t\tcurrentBackwardMaybeEndpoint = maybeEndpoint;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tslideGroup(\n\t\t\tcurrentForwardSlideDestination,\n\t\t\tcurrentForwardSlideIsForward,\n\t\t\tcurrentForwardSlideGroup,\n\t\t\tforwardPred,\n\t\t\tcurrentForwardMaybeEndpoint,\n\t\t);\n\t\tslideGroup(\n\t\t\tcurrentBackwardSlideDestination,\n\t\t\tcurrentBackwardSlideIsForward,\n\t\t\tcurrentBackwardSlideGroup,\n\t\t\tbackwardPred,\n\t\t\tcurrentBackwardMaybeEndpoint,\n\t\t);\n\t}\n\n\tprivate blockLength(node: MergeBlock, refSeq: number, clientId: number): number {\n\t\treturn this.collabWindow.collaborating && clientId !== this.collabWindow.clientId\n\t\t\t? node.partialLengths!.getPartialLength(refSeq, clientId)\n\t\t\t: node.cachedLength ?? 0;\n\t}\n\n\t/**\n\t * Compute local partial length information\n\t *\n\t * Public only for use by internal tests\n\t */\n\tpublic computeLocalPartials(refSeq: number): void {\n\t\tif (this.localPartialsComputed) {\n\t\t\treturn;\n\t\t}\n\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst rebaseCollabWindow = new CollaborationWindow();\n\t\trebaseCollabWindow.loadFrom(this.collabWindow);\n\t\tif (refSeq < this.collabWindow.minSeq) {\n\t\t\trebaseCollabWindow.minSeq = refSeq;\n\t\t}\n\t\tthis.root.partialLengths = PartialSequenceLengths.combine(\n\t\t\tthis.root,\n\t\t\trebaseCollabWindow,\n\t\t\ttrue,\n\t\t\ttrue,\n\t\t);\n\t\tthis.localPartialsComputed = true;\n\t}\n\n\tprivate nodeLength(\n\t\tnode: IMergeNode,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t): number | undefined {\n\t\tif (!this.collabWindow.collaborating || this.collabWindow.clientId === clientId) {\n\t\t\tif (node.isLeaf()) {\n\t\t\t\treturn this.localNetLength(node, refSeq, localSeq);\n\t\t\t} else if (localSeq === undefined) {\n\t\t\t\t// Local client sees all segments, even when collaborating\n\t\t\t\treturn node.cachedLength;\n\t\t\t} else {\n\t\t\t\tthis.computeLocalPartials(refSeq);\n\n\t\t\t\t// Local client should see all segments except those after localSeq.\n\t\t\t\tconst partialLen = node.partialLengths!.getPartialLength(refSeq, clientId, localSeq);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(\n\t\t\t\t\tthis,\n\t\t\t\t\tnode,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tclientId,\n\t\t\t\t\tlocalSeq,\n\t\t\t\t);\n\n\t\t\t\treturn partialLen;\n\t\t\t}\n\t\t} else {\n\t\t\t// Sequence number within window\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tconst segment = node;\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\tif (removalInfo !== undefined) {\n\t\t\t\t\tif (seqLTE(removalInfo.removedSeq, this.collabWindow.minSeq)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tseqLTE(removalInfo.removedSeq, refSeq) ||\n\t\t\t\t\t\tremovalInfo.removedClientIds.includes(clientId)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (moveInfo !== undefined) {\n\t\t\t\t\tif (seqLTE(moveInfo.movedSeq, this.collabWindow.minSeq)) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tseqLTE(moveInfo.movedSeq, refSeq) ||\n\t\t\t\t\t\tmoveInfo.movedClientIds.includes(clientId)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn seqLTE(node.seq ?? 0, refSeq) || segment.clientId === clientId\n\t\t\t\t\t? segment.cachedLength\n\t\t\t\t\t: 0;\n\t\t\t} else {\n\t\t\t\tconst partialLen = node.partialLengths!.getPartialLength(refSeq, clientId);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);\n\n\t\t\t\treturn partialLen;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setMinSeq(minSeq: number): void {\n\t\tassert(\n\t\t\tminSeq <= this.collabWindow.currentSeq,\n\t\t\t0x04e /* \"Trying to set minSeq above currentSeq of collab window!\" */,\n\t\t);\n\n\t\t// Only move forward\n\t\tassert(\n\t\t\tthis.collabWindow.minSeq <= minSeq,\n\t\t\t0x04f /* \"minSeq of collab window > target minSeq!\" */,\n\t\t);\n\n\t\tif (minSeq > this.collabWindow.minSeq) {\n\t\t\tthis.collabWindow.minSeq = minSeq;\n\t\t\tthis.obliterates.setMinSeq(minSeq);\n\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\tzamboniSegments(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the count of elements before the given reference position from the given perspective.\n\t *\n\t * @param refPos - The reference position to resolve.\n\t * @param refSeq - The number of the latest sequenced change to consider.\n\t * Defaults to including all edits which have been applied.\n\t * @param clientId - The ID of the client from whose perspective to resolve this reference. Defaults to the current client.\n\t * @param localSeq - The local sequence number to consider. Defaults to including all local edits.\n\t */\n\tpublic referencePositionToLocalPosition(\n\t\trefPos: ReferencePosition,\n\t\trefSeq = Number.MAX_SAFE_INTEGER,\n\t\tclientId = this.collabWindow.clientId,\n\t\tlocalSeq: number | undefined = this.collabWindow.localSeq,\n\t): number {\n\t\tconst seg: ISegmentLeaf | undefined = refPos.getSegment();\n\t\tif (seg?.parent === undefined) {\n\t\t\t// We have no idea where this reference is, because it refers to a segment which is not in the tree.\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\t\tif (refPos.isLeaf()) {\n\t\t\treturn this.getPosition(refPos, refSeq, clientId, localSeq);\n\t\t}\n\t\tif (refTypeIncludesFlag(refPos, ReferenceType.Transient) || seg.localRefs?.has(refPos)) {\n\t\t\tif (\n\t\t\t\tseg !== this.startOfTree &&\n\t\t\t\tseg !== this.endOfTree &&\n\t\t\t\t!isSegmentPresent(seg, { refSeq, localSeq })\n\t\t\t) {\n\t\t\t\tconst forward = refPos.slidingPreference === SlidingPreference.FORWARD;\n\t\t\t\tconst slideSeq =\n\t\t\t\t\tseg.movedSeq !== UnassignedSequenceNumber && seg.movedSeq !== undefined\n\t\t\t\t\t\t? seg.movedSeq\n\t\t\t\t\t\t: seg.removedSeq !== UnassignedSequenceNumber && seg.removedSeq !== undefined\n\t\t\t\t\t\t\t? seg.removedSeq\n\t\t\t\t\t\t\t: refSeq;\n\t\t\t\tconst slideLocalSeq = seg.localMovedSeq ?? seg.localRemovedSeq;\n\t\t\t\tconst perspective = new PerspectiveImpl(this, {\n\t\t\t\t\trefSeq: slideSeq,\n\t\t\t\t\tlocalSeq: slideLocalSeq,\n\t\t\t\t});\n\t\t\t\tconst slidSegment = perspective.nextSegment(seg, forward);\n\t\t\t\treturn (\n\t\t\t\t\tthis.getPosition(slidSegment, refSeq, clientId, localSeq) +\n\t\t\t\t\t(forward ? 0 : slidSegment.cachedLength === 0 ? 0 : slidSegment.cachedLength - 1)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn this.getPosition(seg, refSeq, clientId, localSeq) + refPos.getOffset();\n\t\t}\n\t\treturn DetachedReferencePosition;\n\t}\n\n\t/**\n\t * Finds the nearest reference with ReferenceType.Tile to `startPos` in the direction dictated by `forwards`.\n\t * Uses depthFirstNodeWalk in addition to block-accelerated functionality. The search position will be included in\n\t * the nodes to walk, so searching on all positions, including the endpoints, can be considered inclusive.\n\t * Any out of bound search positions will return undefined, so in order to search the whole string, a forward\n\t * search can begin at 0, or a backward search can begin at length-1.\n\t *\n\t * @param startPos - Position at which to start the search\n\t * @param clientId - clientId dictating the perspective to search from\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the string should be searched in the forward or backward direction\n\t */\n\tpublic searchForMarker(\n\t\tstartPos: number,\n\t\tclientId: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): Marker | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment(startPos, UniversalSequenceNumber, clientId);\n\t\tconst segWithParent: ISegmentLeaf | undefined = segment;\n\t\tif (segWithParent?.parent === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tdepthFirstNodeWalk(\n\t\t\tsegWithParent.parent,\n\t\t\tsegWithParent,\n\t\t\t(node) => {\n\t\t\t\tif (node.isLeaf()) {\n\t\t\t\t\tif (Marker.is(node) && refHasTileLabel(node, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = node;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst marker = forwards\n\t\t\t\t\t\t? node.leftmostTiles[markerLabel]\n\t\t\t\t\t\t: node.rightmostTiles[markerLabel];\n\t\t\t\t\tif (marker !== undefined) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tmarker.isLeaf() && Marker.is(marker),\n\t\t\t\t\t\t\t0x751 /* Object returned is not a valid marker */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfoundMarker = marker;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn foundMarker === undefined ? NodeAction.Skip : NodeAction.Exit;\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tforwards,\n\t\t);\n\n\t\treturn foundMarker;\n\t}\n\n\tprivate updateRoot(splitNode: MergeBlock | undefined): void {\n\t\tif (splitNode !== undefined) {\n\t\t\tconst newRoot = this.makeBlock(2);\n\t\t\tnewRoot.assignChild(this.root, 0, false);\n\t\t\tnewRoot.assignChild(splitNode, 1, false);\n\t\t\tthis.root = newRoot;\n\t\t\tthis.nodeUpdateOrdinals(this.root);\n\t\t\tthis.nodeUpdateLengthNewStructure(this.root);\n\t\t}\n\t}\n\n\t/**\n\t * Assign sequence number to existing segment; update partial lengths to reflect the change\n\t * @param seq - sequence number given by server to pending segment\n\t */\n\tpublic ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs): void {\n\t\tconst seq = opArgs.sequencedMessage!.sequenceNumber;\n\t\tconst pendingSegmentGroup = this.pendingSegments.shift()?.data;\n\t\tconst nodesToUpdate: MergeBlock[] = [];\n\t\tlet overwrite = false;\n\t\tif (pendingSegmentGroup !== undefined) {\n\t\t\tconst deltaSegments: IMergeTreeSegmentDelta[] = [];\n\t\t\tconst overlappingRemoves: boolean[] = [];\n\t\t\tpendingSegmentGroup.segments.map((pendingSegment: ISegmentLeaf) => {\n\t\t\t\tconst overlappingRemove = !pendingSegment.ack(pendingSegmentGroup, opArgs);\n\n\t\t\t\toverwrite = overlappingRemove || overwrite;\n\n\t\t\t\toverlappingRemoves.push(overlappingRemove);\n\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\tthis.addToLRUSet(pendingSegment, seq);\n\t\t\t\t}\n\t\t\t\tif (!nodesToUpdate.includes(pendingSegment.parent!)) {\n\t\t\t\t\tnodesToUpdate.push(pendingSegment.parent!);\n\t\t\t\t}\n\t\t\t\tdeltaSegments.push({\n\t\t\t\t\tsegment: pendingSegment,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif (opArgs.op.type === MergeTreeDeltaType.OBLITERATE) {\n\t\t\t\tthis.obliterates.addOrUpdate(pendingSegmentGroup.obliterateInfo!);\n\t\t\t}\n\n\t\t\t// Perform slides after all segments have been acked, so that\n\t\t\t// positions after slide are final\n\t\t\tif (\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.REMOVE ||\n\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE\n\t\t\t) {\n\t\t\t\tthis.slideAckedRemovedSegmentReferences(pendingSegmentGroup.segments);\n\t\t\t}\n\n\t\t\tthis.mergeTreeMaintenanceCallback?.(\n\t\t\t\t{\n\t\t\t\t\tdeltaSegments,\n\t\t\t\t\toperation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n\t\t\t\t},\n\t\t\t\topArgs,\n\t\t\t);\n\t\t\tconst clientId = this.collabWindow.clientId;\n\t\t\tfor (const node of nodesToUpdate) {\n\t\t\t\tthis.blockUpdatePathLengths(node, seq, clientId, overwrite);\n\t\t\t}\n\t\t}\n\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tprivate addToPendingList(\n\t\tsegment: ISegment,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tsegmentGroup?: SegmentGroup,\n\t\tlocalSeq?: number,\n\t\tpreviousProps?: PropertySet,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t): SegmentGroup {\n\t\tlet _segmentGroup = segmentGroup;\n\t\tif (_segmentGroup === undefined) {\n\t\t\t_segmentGroup = {\n\t\t\t\tsegments: [],\n\t\t\t\tlocalSeq,\n\t\t\t\trefSeq: this.collabWindow.currentSeq,\n\t\t\t};\n\t\t\tif (previousProps) {\n\t\t\t\t_segmentGroup.previousProps = [];\n\t\t\t}\n\t\t\tthis.pendingSegments.push(_segmentGroup);\n\t\t}\n\n\t\tif (\n\t\t\t(!_segmentGroup.previousProps && !!previousProps) ||\n\t\t\t(!!_segmentGroup.previousProps && !previousProps)\n\t\t) {\n\t\t\tthrow new Error(\"All segments in group should have previousProps or none\");\n\t\t}\n\t\tif (previousProps) {\n\t\t\t_segmentGroup.previousProps!.push(previousProps);\n\t\t}\n\n\t\tsegment.segmentGroups.enqueue(_segmentGroup);\n\t\treturn _segmentGroup;\n\t}\n\n\t// TODO: error checking\n\tpublic getMarkerFromId(id: string): Marker | undefined {\n\t\tconst marker = this.idToMarker.get(id);\n\t\treturn marker === undefined ||\n\t\t\tisRemoved(marker) ||\n\t\t\t(isMoved(marker) && marker.moveDst === undefined)\n\t\t\t? undefined\n\t\t\t: marker;\n\t}\n\n\t/**\n\t * Given a position specified relative to a marker id, lookup the marker\n\t * and convert the position to a character position.\n\t * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n\t * @param refseq - The reference sequence number at which to compute the position.\n\t * @param clientId - The client id with which to compute the position.\n\t */\n\tpublic posFromRelativePos(\n\t\trelativePos: IRelativePosition,\n\t\trefseq = this.collabWindow.currentSeq,\n\t\tclientId = this.collabWindow.clientId,\n\t): number {\n\t\tlet pos = -1;\n\t\tlet marker: Marker | undefined;\n\t\tif (relativePos.id) {\n\t\t\tmarker = this.getMarkerFromId(relativePos.id);\n\t\t}\n\t\tif (marker) {\n\t\t\tpos = this.getPosition(marker, refseq, clientId);\n\t\t\tif (relativePos.before) {\n\t\t\t\tif (relativePos.offset !== undefined) {\n\t\t\t\t\tpos -= relativePos.offset;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpos += marker.cachedLength;\n\t\t\t\tif (relativePos.offset !== undefined) {\n\t\t\t\t\tpos += relativePos.offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pos;\n\t}\n\n\tpublic insertSegments(\n\t\tpos: number,\n\t\tsegments: ISegment[],\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\topArgs: IMergeTreeDeltaOpArgs | undefined,\n\t): void {\n\t\tthis.ensureIntervalBoundary(pos, refSeq, clientId);\n\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n\t\tthis.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n\t\t// opArgs == undefined => loading snapshot or test code\n\t\tif (opArgs !== undefined) {\n\t\t\tconst deltaSegments = segments\n\t\t\t\t.filter((segment) => !toMoveInfo(segment))\n\t\t\t\t.map((segment) => ({ segment }));\n\n\t\t\tif (deltaSegments.length > 0) {\n\t\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\t\t\tdeltaSegments,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tMergeTree.options.zamboniSegments &&\n\t\t\tseq !== UnassignedSequenceNumber\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a remote client's position against the local sequence\n\t * and returns the remote client's position relative to the local\n\t * sequence. The client ref seq must be above the minimum sequence number\n\t * or the return value will be undefined.\n\t * Generally this method is used in conjunction with signals which provide\n\t * point in time values for the below parameters, and is useful for things\n\t * like displaying user position. It should not be used with persisted values\n\t * as persisted values will quickly become invalid as the remoteClientRefSeq\n\t * moves below the minimum sequence number\n\t * @param remoteClientPosition - The remote client's position to resolve\n\t * @param remoteClientRefSeq - The reference sequence number of the remote client\n\t * @param remoteClientId - The client id of the remote client\n\t */\n\tpublic resolveRemoteClientPosition(\n\t\tremoteClientPosition: number,\n\t\tremoteClientRefSeq: number,\n\t\tremoteClientId: number,\n\t): number | undefined {\n\t\tif (remoteClientRefSeq < this.collabWindow.minSeq) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst segmentInfo = this.getContainingSegment(\n\t\t\tremoteClientPosition,\n\t\t\tremoteClientRefSeq,\n\t\t\tremoteClientId,\n\t\t);\n\n\t\tconst { currentSeq, clientId } = this.collabWindow;\n\n\t\tif (segmentInfo?.segment) {\n\t\t\tconst segmentPosition = this.getPosition(segmentInfo.segment, currentSeq, clientId);\n\t\t\treturn segmentPosition + segmentInfo.offset!;\n\t\t} else {\n\t\t\tif (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n\t\t\t\treturn this.getLength(currentSeq, clientId);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate blockInsert<T extends ISegmentLeaf>(\n\t\tpos: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\tlocalSeq: number | undefined,\n\t\tnewSegments: T[],\n\t): void {\n\t\t// Keeping this function within the scope of blockInsert for readability.\n\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\tconst continueFrom = (node: MergeBlock): boolean => {\n\t\t\tlet siblingExists = false;\n\t\t\tforwardExcursion(node, () => {\n\t\t\t\tsiblingExists = true;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\treturn siblingExists;\n\t\t};\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup;\n\t\tconst saveIfLocal = (locSegment: ISegment): void => {\n\t\t\t// Save segment so we can assign sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tlocSegment.seq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n\t\t\t\t}\n\t\t\t\t// LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n\t\t\t\t// In all other cases this has to be true (checked by addToLRUSet):\n\t\t\t\t// locSegment.seq > this.collabWindow.currentSeq\n\t\t\t\telse if (\n\t\t\t\t\tlocSegment.seq! > this.collabWindow.minSeq &&\n\t\t\t\t\tMergeTree.options.zamboniSegments\n\t\t\t\t) {\n\t\t\t\t\tthis.addToLRUSet(locSegment, locSegment.seq!);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst onLeaf = (\n\t\t\tsegment: ISegment | undefined,\n\t\t\t_pos: number,\n\t\t\tcontext: InsertContext,\n\t\t\t// Keeping this function within the scope of blockInsert for readability.\n\t\t\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\t\t): ISegmentChanges => {\n\t\t\tconst segmentChanges: ISegmentChanges = {};\n\t\t\tif (segment) {\n\t\t\t\t// Insert before segment\n\t\t\t\tsegmentChanges.replaceCurrent = context.candidateSegment;\n\t\t\t\tsegmentChanges.next = segment;\n\t\t\t} else {\n\t\t\t\tsegmentChanges.next = context.candidateSegment;\n\t\t\t}\n\t\t\treturn segmentChanges;\n\t\t};\n\n\t\t// TODO: build tree from segs and insert all at once\n\t\tlet insertPos = pos;\n\t\tfor (const newSegment of newSegments) {\n\t\t\tif (newSegment.cachedLength > 0) {\n\t\t\t\tnewSegment.seq = seq;\n\t\t\t\tnewSegment.localSeq = localSeq;\n\t\t\t\tnewSegment.clientId = clientId;\n\t\t\t\tif (Marker.is(newSegment)) {\n\t\t\t\t\tconst markerId = newSegment.getId();\n\t\t\t\t\tif (markerId) {\n\t\t\t\t\t\tthis.idToMarker.set(markerId, newSegment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq, {\n\t\t\t\t\tleaf: onLeaf,\n\t\t\t\t\tcandidateSegment: newSegment,\n\t\t\t\t\tcontinuePredicate: continueFrom,\n\t\t\t\t});\n\n\t\t\t\tif (newSegment.parent === undefined) {\n\t\t\t\t\t// Indicates an attempt to insert past the end of the merge-tree's content.\n\t\t\t\t\tconst errorConstructor = localSeq === undefined ? DataProcessingError : UsageError;\n\t\t\t\t\tthrow new errorConstructor(\"MergeTree insert failed\", {\n\t\t\t\t\t\tcurrentSeq: this.collabWindow.currentSeq,\n\t\t\t\t\t\tminSeq: this.collabWindow.minSeq,\n\t\t\t\t\t\tsegSeq: newSegment.seq,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.updateRoot(splitNode);\n\t\t\t\tsaveIfLocal(newSegment);\n\n\t\t\t\tinsertPos += newSegment.cachedLength;\n\n\t\t\t\tif (!this.options?.mergeTreeEnableObliterate || this.obliterates.empty()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\tlet oldest: ObliterateInfo | undefined;\n\t\t\t\tlet normalizedOldestSeq: number = 0;\n\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\tlet newest: ObliterateInfo | undefined;\n\t\t\t\tlet normalizedNewestSeq: number = 0;\n\t\t\t\tconst movedClientIds: number[] = [];\n\t\t\t\tconst movedSeqs: number[] = [];\n\t\t\t\tfor (const ob of this.obliterates.findOverlapping(newSegment)) {\n\t\t\t\t\t// compute a normalized seq that takes into account local seqs\n\t\t\t\t\t// but is still comparable to remote seqs to keep the checks below easy\n\t\t\t\t\t// REMOTE SEQUENCE NUMBERS LOCAL SEQUENCE NUMBERS\n\t\t\t\t\t// [0, 1, 2, 3, ..., 100, ..., 1000, ..., (MAX - MaxLocalSeq), L1, L2, L3, L4, ..., L100, ..., L1000, ...(MAX)]\n\t\t\t\t\tconst normalizedObSeq =\n\t\t\t\t\t\tob.seq === UnassignedSequenceNumber\n\t\t\t\t\t\t\t? Number.MAX_SAFE_INTEGER - this.collabWindow.localSeq + ob.localSeq!\n\t\t\t\t\t\t\t: ob.seq;\n\t\t\t\t\tif (normalizedObSeq > refSeq) {\n\t\t\t\t\t\tif (oldest === undefined || normalizedOldestSeq > normalizedObSeq) {\n\t\t\t\t\t\t\tnormalizedOldestSeq = normalizedObSeq;\n\t\t\t\t\t\t\toldest = ob;\n\t\t\t\t\t\t\tmovedClientIds.unshift(ob.clientId);\n\t\t\t\t\t\t\tmovedSeqs.unshift(ob.seq);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (newest === undefined || normalizedNewestSeq < normalizedObSeq) {\n\t\t\t\t\t\t\t\tnormalizedNewestSeq = normalizedObSeq;\n\t\t\t\t\t\t\t\tnewest = ob;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmovedClientIds.push(ob.clientId);\n\t\t\t\t\t\t\tmovedSeqs.push(ob.seq);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (oldest && newest?.clientId !== clientId) {\n\t\t\t\t\tconst moveInfo: IMoveInfo = {\n\t\t\t\t\t\tmovedClientIds,\n\t\t\t\t\t\tmovedSeq: oldest.seq,\n\t\t\t\t\t\tmovedSeqs,\n\t\t\t\t\t\tlocalMovedSeq: oldest.localSeq,\n\t\t\t\t\t\twasMovedOnInsert: oldest.seq !== UnassignedSequenceNumber,\n\t\t\t\t\t};\n\n\t\t\t\t\tmarkSegmentMoved(newSegment, moveInfo);\n\n\t\t\t\t\tif (moveInfo.localMovedSeq !== undefined) {\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\toldest.segmentGroup !== undefined,\n\t\t\t\t\t\t\t0x86c /* expected segment group to exist */,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.addToPendingList(newSegment, oldest.segmentGroup);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (newSegment.parent) {\n\t\t\t\t\t\tthis.blockUpdatePathLengths(newSegment.parent, seq, clientId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly splitLeafSegment = (\n\t\tsegment: ISegment | undefined,\n\t\tpos: number,\n\t): ISegmentChanges => {\n\t\tif (!(pos > 0 && segment)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst next = segment.splitAt(pos)!;\n\t\tthis.mergeTreeMaintenanceCallback?.(\n\t\t\t{\n\t\t\t\toperation: MergeTreeMaintenanceType.SPLIT,\n\t\t\t\tdeltaSegments: [{ segment }, { segment: next }],\n\t\t\t},\n\t\t\tundefined,\n\t\t);\n\n\t\treturn { next };\n\t};\n\n\tprivate ensureIntervalBoundary(\n\t\tpos: number | \"start\" | \"end\",\n\t\trefSeq: number,\n\t\tclientId: number,\n\t): void {\n\t\tconst splitNode = this.insertingWalk(\n\t\t\tthis.root,\n\t\t\tpos,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\tTreeMaintenanceSequenceNumber,\n\t\t\t{ leaf: this.splitLeafSegment },\n\t\t);\n\t\tthis.updateRoot(splitNode);\n\t}\n\n\t// Assume called only when pos == len\n\tprivate breakTie(pos: number, node: IMergeNode, seq: number): boolean {\n\t\tif (node.isLeaf()) {\n\t\t\tif (pos !== 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// normalize the seq numbers\n\t\t\t// if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n\t\t\t// seq for comparison, as it will get a seq higher than any other seq once sequences\n\t\t\t// if the current seg is local (UnassignedSequenceNumber) give it the second highest\n\t\t\t// possible seq, as the highest is reserved for the previous.\n\t\t\tconst newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n\t\t\tconst segSeq =\n\t\t\t\tnode.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n\n\t\t\treturn (\n\t\t\t\tnewSeq > segSeq ||\n\t\t\t\t(node.movedSeq !== undefined &&\n\t\t\t\t\tnode.movedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tnode.movedSeq > seq) ||\n\t\t\t\t(node.removedSeq !== undefined &&\n\t\t\t\t\tnode.removedSeq !== UnassignedSequenceNumber &&\n\t\t\t\t\tnode.removedSeq > seq)\n\t\t\t);\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate insertingWalk(\n\t\tblock: MergeBlock,\n\t\tpos: number | \"start\" | \"end\",\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\tcontext: InsertContext,\n\t\tisLastChildBlock: boolean = true,\n\t): MergeBlock | undefined {\n\t\tlet _pos: number;\n\t\tif (pos === \"start\") {\n\t\t\t_pos = 0;\n\t\t} else if (pos === \"end\") {\n\t\t\t_pos = this.root.mergeTree?.getLength(refSeq, clientId) ?? 0;\n\t\t} else {\n\t\t\t_pos = pos;\n\t\t}\n\n\t\tconst children = block.children;\n\t\tlet childIndex: number;\n\t\tlet child: IMergeNode;\n\t\tlet newNode: IMergeNode | undefined;\n\t\tlet fromSplit: MergeBlock | undefined;\n\t\tfor (childIndex = 0; childIndex < block.childCount; childIndex++) {\n\t\t\tchild = children[childIndex];\n\t\t\t// ensure we walk down the far edge of the tree, even if all sub-tree is eligible for zamboni\n\t\t\tconst isLastNonLeafBlock =\n\t\t\t\tisLastChildBlock && !child.isLeaf() && childIndex === block.childCount - 1;\n\t\t\tconst len =\n\t\t\t\tthis.nodeLength(child, refSeq, clientId) ?? (isLastChildBlock ? 0 : undefined);\n\n\t\t\tif (len === undefined) {\n\t\t\t\t// if the seg len is undefined, the segment\n\t\t\t\t// will be removed, so should just be skipped for now\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tassert(len >= 0, 0x4bc /* Length should not be negative */);\n\n\t\t\tif (_pos < len || (_pos === len && this.breakTie(_pos, child, seq))) {\n\t\t\t\t// Found entry containing pos\n\t\t\t\tif (child.isLeaf()) {\n\t\t\t\t\tconst segment = child;\n\t\t\t\t\tconst segmentChanges = context.leaf(segment, _pos, context);\n\t\t\t\t\tif (segmentChanges.replaceCurrent) {\n\t\t\t\t\t\tblock.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n\t\t\t\t\t\tsegmentChanges.replaceCurrent.ordinal = child.ordinal;\n\t\t\t\t\t}\n\t\t\t\t\tif (segmentChanges.next) {\n\t\t\t\t\t\tnewNode = segmentChanges.next;\n\t\t\t\t\t\tchildIndex++; // Insert after\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No change\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst childBlock = child;\n\t\t\t\t\t// Internal node\n\t\t\t\t\tconst splitNode = this.insertingWalk(\n\t\t\t\t\t\tchildBlock,\n\t\t\t\t\t\t_pos,\n\t\t\t\t\t\trefSeq,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tisLastNonLeafBlock,\n\t\t\t\t\t);\n\t\t\t\t\tif (splitNode === undefined) {\n\t\t\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t} else if (splitNode === MergeTree.theUnfinishedNode) {\n\t\t\t\t\t\t_pos -= len; // Act as if shifted segment\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewNode = splitNode;\n\t\t\t\t\t\tfromSplit = splitNode;\n\t\t\t\t\t\tchildIndex++; // Insert after\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t_pos -= len;\n\t\t\t}\n\t\t}\n\t\tif (!newNode && _pos === 0) {\n\t\t\tif (context.continuePredicate?.(block)) {\n\t\t\t\treturn MergeTree.theUnfinishedNode;\n\t\t\t} else {\n\t\t\t\tconst segmentChanges = context.leaf(undefined, _pos, context);\n\t\t\t\tnewNode = segmentChanges.next;\n\t\t\t\t// Assert segmentChanges.replaceCurrent === undefined\n\t\t\t}\n\t\t}\n\t\tif (newNode) {\n\t\t\tfor (let i = block.childCount; i > childIndex; i--) {\n\t\t\t\tblock.children[i] = block.children[i - 1];\n\t\t\t\tblock.children[i].index = i;\n\t\t\t}\n\t\t\tblock.assignChild(newNode, childIndex, false);\n\t\t\tblock.childCount++;\n\t\t\tblock.setOrdinal(newNode, childIndex);\n\t\t\tif (block.childCount < MaxNodesInBlock) {\n\t\t\t\tif (fromSplit) {\n\t\t\t\t\tthis.nodeUpdateOrdinals(fromSplit);\n\t\t\t\t}\n\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t\treturn undefined;\n\t\t\t} else {\n\t\t\t\t// Don't update ordinals because higher block will do it\n\t\t\t\tconst newNodeFromSplit = this.split(block);\n\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, block, refSeq, clientId);\n\t\t\t\tPartialSequenceLengths.options.verifyExpected?.(\n\t\t\t\t\tthis,\n\t\t\t\t\tnewNodeFromSplit,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tclientId,\n\t\t\t\t);\n\n\t\t\t\treturn newNodeFromSplit;\n\t\t\t}\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate split(node: MergeBlock): MergeBlock {\n\t\tconst halfCount = MaxNodesInBlock / 2;\n\t\tconst newNode = this.makeBlock(halfCount);\n\t\tnode.childCount = halfCount;\n\t\t// Update ordinals to reflect lowered child count\n\t\tthis.nodeUpdateOrdinals(node);\n\t\tfor (let i = 0; i < halfCount; i++) {\n\t\t\tnewNode.assignChild(node.children[halfCount + i], i, false);\n\t\t\tnode.children[halfCount + i] = undefined!;\n\t\t}\n\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\tthis.nodeUpdateLengthNewStructure(newNode);\n\t\treturn newNode;\n\t}\n\n\tpublic nodeUpdateOrdinals(block: MergeBlock): void {\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tblock.setOrdinal(child, i);\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\tthis.nodeUpdateOrdinals(child);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Annotate a range with properties\n\t * @param start - The inclusive start position of the range to annotate\n\t * @param end - The exclusive end position of the range to annotate\n\t * @param props - The properties to annotate the range with\n\t * @param refSeq - The reference sequence number to use to apply the annotate\n\t * @param clientId - The id of the client making the annotate\n\t * @param seq - The sequence number of the annotate operation\n\t * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n\t * @param rollback - Whether this is for a local rollback and what kind\n\t */\n\tpublic annotateRange(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\trollback: PropertiesRollback = PropertiesRollback.None,\n\t): void {\n\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\tconst deltaSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup | undefined;\n\t\tconst annotateSegment = (segment: ISegment): boolean => {\n\t\t\tassert(\n\t\t\t\t!Marker.is(segment) ||\n\t\t\t\t\t!(reservedMarkerIdKey in props) ||\n\t\t\t\t\tprops.markerId === segment.properties?.markerId,\n\t\t\t\t0x5ad /* Cannot change the markerId of an existing marker */,\n\t\t\t);\n\t\t\tconst propertyDeltas = segment.addProperties(\n\t\t\t\tprops,\n\t\t\t\tseq,\n\t\t\t\tthis.collabWindow.collaborating,\n\t\t\t\trollback,\n\t\t\t);\n\t\t\tif (!isRemovedOrMoved(segment)) {\n\t\t\t\tdeltaSegments.push({ segment, propertyDeltas });\n\t\t\t}\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (seq === UnassignedSequenceNumber) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tsegmentGroup,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.nodeMap(refSeq, clientId, annotateSegment, undefined, undefined, start, end);\n\n\t\t// OpArgs == undefined => test code\n\t\tif (deltaSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\tdeltaSegments,\n\t\t\t});\n\t\t}\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tpublic obliterateRange(\n\t\tstart: SequencePlace,\n\t\tend: SequencePlace,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\toverwrite: boolean = false,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t): void {\n\t\terrorIfOptionNotTrue(this.options, \"mergeTreeEnableObliterate\");\n\n\t\tconst { startPos, startSide, endPos, endSide } = endpointPosAndSide(start, end);\n\n\t\tassert(\n\t\t\tstartPos !== undefined &&\n\t\t\t\tendPos !== undefined &&\n\t\t\t\tstartSide !== undefined &&\n\t\t\t\tendSide !== undefined &&\n\t\t\t\tstartPos !== \"end\" &&\n\t\t\t\tendPos !== \"start\",\n\t\t\t0x9e2 /* start and end cannot be undefined because they were not passed in as undefined */,\n\t\t);\n\n\t\tthis.ensureIntervalBoundary(startPos, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(endPos, refSeq, clientId);\n\n\t\tlet _overwrite = overwrite;\n\t\tconst localOverlapWithRefs: ISegment[] = [];\n\t\tconst movedSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tconst obliterate: ObliterateInfo = {\n\t\t\tclientId,\n\t\t\tend: createDetachedLocalReferencePosition(undefined),\n\t\t\trefSeq,\n\t\t\tseq,\n\t\t\tstart: createDetachedLocalReferencePosition(undefined),\n\t\t\tlocalSeq,\n\t\t\tsegmentGroup: undefined,\n\t\t};\n\t\tconst normalizedStartPos = startPos === \"start\" || startPos === undefined ? 0 : startPos;\n\t\tconst normalizedEndPos =\n\t\t\tendPos === \"end\" || endPos === undefined ? this.getLength(refSeq, clientId) : endPos;\n\n\t\tconst { segment: startSeg } = this.getContainingSegment(\n\t\t\tnormalizedStartPos,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t);\n\t\tconst { segment: endSeg } = this.getContainingSegment(\n\t\t\tnormalizedEndPos - 1,\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t);\n\t\tassert(\n\t\t\tstartSeg !== undefined && endSeg !== undefined,\n\t\t\t0xa3f /* segments cannot be undefined */,\n\t\t);\n\n\t\tobliterate.start = this.createLocalReferencePosition(\n\t\t\tstartSeg,\n\t\t\t0,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\t{\n\t\t\t\tobliterate,\n\t\t\t},\n\t\t);\n\n\t\tobliterate.end = this.createLocalReferencePosition(\n\t\t\tendSeg,\n\t\t\tendSeg.cachedLength - 1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\t{\n\t\t\t\tobliterate,\n\t\t\t},\n\t\t);\n\n\t\tconst markMoved = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tconst existingMoveInfo = toMoveInfo(segment);\n\t\t\tif (\n\t\t\t\tclientId !== segment.clientId &&\n\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\t\t(refSeq < segment.seq || segment.seq === UnassignedSequenceNumber)\n\t\t\t) {\n\t\t\t\tsegment.wasMovedOnInsert = true;\n\t\t\t}\n\n\t\t\tif (existingMoveInfo === undefined) {\n\t\t\t\tsegment.movedClientIds = [clientId];\n\t\t\t\tsegment.movedSeq = seq;\n\t\t\t\tsegment.localMovedSeq = localSeq;\n\t\t\t\tsegment.movedSeqs = [seq];\n\n\t\t\t\tif (!toRemovalInfo(segment)) {\n\t\t\t\t\tmovedSegments.push({ segment });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_overwrite = true;\n\t\t\t\tif (existingMoveInfo.movedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t// we moved this locally, but someone else moved it first\n\t\t\t\t\t// so put them at the head of the list\n\t\t\t\t\t// The list isn't ordered, but we keep the first move at the head\n\t\t\t\t\t// for partialLengths bookkeeping purposes\n\t\t\t\t\texistingMoveInfo.movedClientIds.unshift(clientId);\n\n\t\t\t\t\texistingMoveInfo.movedSeq = seq;\n\t\t\t\t\texistingMoveInfo.movedSeqs.unshift(seq);\n\t\t\t\t\tif (segment.localRefs?.empty === false) {\n\t\t\t\t\t\tlocalOverlapWithRefs.push(segment);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Do not replace earlier sequence number for move\n\t\t\t\t\texistingMoveInfo.movedClientIds.push(clientId);\n\t\t\t\t\texistingMoveInfo.movedSeqs.push(seq);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Save segment so can assign moved sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tsegment.movedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tobliterate.segmentGroup = this.addToPendingList(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tobliterate.segmentGroup,\n\t\t\t\t\t\tlocalSeq,\n\t\t\t\t\t);\n\t\t\t\t\tobliterate.segmentGroup.obliterateInfo ??= obliterate;\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tconst afterMarkMoved = (\n\t\t\tnode: MergeBlock,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tif (_overwrite) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(node, seq, clientId);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tthis.nodeMap(\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\tmarkMoved,\n\t\t\tundefined,\n\t\t\tafterMarkMoved,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tundefined,\n\t\t\tseq === UnassignedSequenceNumber ? undefined : seq,\n\t\t);\n\n\t\tthis.obliterates.addOrUpdate(obliterate);\n\n\t\tthis.slideAckedRemovedSegmentReferences(localOverlapWithRefs);\n\t\t// opArgs == undefined => test code\n\t\tif (movedSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.OBLITERATE,\n\t\t\t\tdeltaSegments: movedSegments,\n\t\t\t});\n\t\t}\n\n\t\t// these events are newly removed\n\t\t// so we slide after eventing in case the consumer wants to make reference\n\t\t// changes at remove time, like add a ref to track undo redo.\n\t\tif (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {\n\t\t\tthis.slideAckedRemovedSegmentReferences(movedSegments.map(({ segment }) => segment));\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\tpublic markRangeRemoved(\n\t\tstart: number,\n\t\tend: number,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tseq: number,\n\t\toverwrite = false,\n\t\topArgs: IMergeTreeDeltaOpArgs,\n\t): void {\n\t\tlet _overwrite = overwrite;\n\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tlet segmentGroup: SegmentGroup;\n\t\tconst removedSegments: IMergeTreeSegmentDelta[] = [];\n\t\tconst localOverlapWithRefs: ISegment[] = [];\n\t\tconst localSeq =\n\t\t\tseq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\t\tconst markRemoved = (\n\t\t\tsegment: ISegment,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tconst existingRemovalInfo = toRemovalInfo(segment);\n\n\t\t\tif (existingRemovalInfo === undefined) {\n\t\t\t\tsegment.removedClientIds = [clientId];\n\t\t\t\tsegment.removedSeq = seq;\n\t\t\t\tsegment.localRemovedSeq = localSeq;\n\n\t\t\t\tif (!toMoveInfo(segment)) {\n\t\t\t\t\tremovedSegments.push({ segment });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_overwrite = true;\n\t\t\t\tif (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t// we removed this locally, but someone else removed it first\n\t\t\t\t\t// so put them at the head of the list\n\t\t\t\t\t// The list isn't ordered, but we keep the first removal at the head\n\t\t\t\t\t// for partialLengths bookkeeping purposes\n\t\t\t\t\texistingRemovalInfo.removedClientIds.unshift(clientId);\n\n\t\t\t\t\texistingRemovalInfo.removedSeq = seq;\n\t\t\t\t\tif (segment.localRefs?.empty === false) {\n\t\t\t\t\t\tlocalOverlapWithRefs.push(segment);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Do not replace earlier sequence number for remove\n\t\t\t\t\texistingRemovalInfo.removedClientIds.push(clientId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Save segment so we can assign removed sequence number when acked by server\n\t\t\tif (this.collabWindow.collaborating) {\n\t\t\t\tif (\n\t\t\t\t\tsegment.removedSeq === UnassignedSequenceNumber &&\n\t\t\t\t\tclientId === this.collabWindow.clientId\n\t\t\t\t) {\n\t\t\t\t\tsegmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n\t\t\t\t} else {\n\t\t\t\t\tif (MergeTree.options.zamboniSegments) {\n\t\t\t\t\t\tthis.addToLRUSet(segment, seq);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\tconst afterMarkRemoved = (\n\t\t\tnode: MergeBlock,\n\t\t\tpos: number,\n\t\t\t_start: number,\n\t\t\t_end: number,\n\t\t): boolean => {\n\t\t\tif (_overwrite) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(node, seq, clientId);\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\tthis.nodeMap(refSeq, clientId, markRemoved, undefined, afterMarkRemoved, start, end);\n\t\t// these segments are already viewed as being removed locally and are not event-ed\n\t\t// so can slide non-StayOnRemove refs immediately\n\t\tthis.slideAckedRemovedSegmentReferences(localOverlapWithRefs);\n\t\t// opArgs == undefined => test code\n\t\tif (removedSegments.length > 0) {\n\t\t\tthis.mergeTreeDeltaCallback?.(opArgs, {\n\t\t\t\toperation: MergeTreeDeltaType.REMOVE,\n\t\t\t\tdeltaSegments: removedSegments,\n\t\t\t});\n\t\t}\n\t\t// these events are newly removed\n\t\t// so we slide after eventing in case the consumer wants to make reference\n\t\t// changes at remove time, like add a ref to track undo redo.\n\t\tif (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {\n\t\t\tthis.slideAckedRemovedSegmentReferences(removedSegments.map(({ segment }) => segment));\n\t\t}\n\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tMergeTree.options.zamboniSegments\n\t\t) {\n\t\t\tzamboniSegments(this);\n\t\t}\n\t}\n\n\t/**\n\t * Revert an unacked local op\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\tpublic rollback(op: IMergeTreeDeltaOp, localOpMetadata: SegmentGroup): void {\n\t\tif (op.type === MergeTreeDeltaType.REMOVE) {\n\t\t\tconst pendingSegmentGroup = this.pendingSegments.pop?.()?.data;\n\t\t\tif (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata) {\n\t\t\t\tthrow new Error(\"Rollback op doesn't match last edit\");\n\t\t\t}\n\t\t\t// Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored\n\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\tpendingSegmentGroup.segments.forEach((segment: ISegmentLeaf) => {\n\t\t\t\tconst segmentSegmentGroup = segment.segmentGroups?.pop?.();\n\t\t\t\tassert(\n\t\t\t\t\tsegmentSegmentGroup === pendingSegmentGroup,\n\t\t\t\t\t0x3ee /* Unexpected segmentGroup in segment */,\n\t\t\t\t);\n\n\t\t\t\tassert(\n\t\t\t\t\tsegment.removedClientIds !== undefined &&\n\t\t\t\t\t\tsegment.removedClientIds[0] === this.collabWindow.clientId,\n\t\t\t\t\t0x39d /* Rollback segment removedClientId does not match local client */,\n\t\t\t\t);\n\t\t\t\tsegment.removedClientIds = undefined;\n\t\t\t\tsegment.removedSeq = undefined;\n\t\t\t\tsegment.localRemovedSeq = undefined;\n\n\t\t\t\t// Note: optional chaining short-circuits:\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#short-circuiting\n\t\t\t\tthis.mergeTreeDeltaCallback?.(\n\t\t\t\t\t{ op: createInsertSegmentOp(this.findRollbackPosition(segment), segment) },\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeDeltaType.INSERT,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tfor (\n\t\t\t\t\tlet updateNode = segment.parent;\n\t\t\t\t\tupdateNode !== undefined;\n\t\t\t\t\tupdateNode = updateNode.parent\n\t\t\t\t) {\n\t\t\t\t\tthis.blockUpdateLength(\n\t\t\t\t\t\tupdateNode,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (\n\t\t\top.type === MergeTreeDeltaType.INSERT ||\n\t\t\top.type === MergeTreeDeltaType.ANNOTATE\n\t\t) {\n\t\t\tconst pendingSegmentGroup = this.pendingSegments.pop?.()?.data;\n\t\t\tif (\n\t\t\t\tpendingSegmentGroup === undefined ||\n\t\t\t\tpendingSegmentGroup !== localOpMetadata ||\n\t\t\t\t(op.type === MergeTreeDeltaType.ANNOTATE && !pendingSegmentGroup.previousProps)\n\t\t\t) {\n\t\t\t\tthrow new Error(\"Rollback op doesn't match last edit\");\n\t\t\t}\n\t\t\tlet i = 0;\n\t\t\tfor (const segment of pendingSegmentGroup.segments) {\n\t\t\t\tconst segmentSegmentGroup = segment.segmentGroups.pop?.();\n\t\t\t\tassert(\n\t\t\t\t\tsegmentSegmentGroup === pendingSegmentGroup,\n\t\t\t\t\t0x3ef /* Unexpected segmentGroup in segment */,\n\t\t\t\t);\n\n\t\t\t\tconst start = this.findRollbackPosition(segment);\n\t\t\t\tif (op.type === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tsegment.seq = UniversalSequenceNumber;\n\t\t\t\t\tsegment.localSeq = undefined;\n\t\t\t\t\tconst removeOp = createRemoveRangeOp(start, start + segment.cachedLength);\n\t\t\t\t\tthis.markRangeRemoved(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + segment.cachedLength,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t{ op: removeOp },\n\t\t\t\t\t);\n\t\t\t\t} /* op.type === MergeTreeDeltaType.ANNOTATE */ else {\n\t\t\t\t\tconst props = pendingSegmentGroup.previousProps![i];\n\t\t\t\t\tconst annotateOp = createAnnotateRangeOp(start, start + segment.cachedLength, props);\n\t\t\t\t\tthis.annotateRange(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tstart + segment.cachedLength,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\tthis.collabWindow.clientId,\n\t\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\t\t{ op: annotateOp },\n\t\t\t\t\t\t// eslint-disable-next-line import/no-deprecated\n\t\t\t\t\t\tPropertiesRollback.Rollback,\n\t\t\t\t\t);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\"Unsupported op type for rollback\");\n\t\t}\n\t}\n\n\t/**\n\t * Walk the segments up to the current segment and calculate its position\n\t */\n\tprivate findRollbackPosition(segment: ISegment): number {\n\t\tlet segmentPosition = 0;\n\t\twalkAllChildSegments(this.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If not removed, increase position\n\t\t\tif (seg.removedSeq === undefined) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\treturn segmentPosition;\n\t}\n\n\tpublic nodeUpdateLengthNewStructure(node: MergeBlock, recur = false): void {\n\t\tthis.blockUpdate(node);\n\t\tif (this.collabWindow.collaborating) {\n\t\t\tthis.localPartialsComputed = false;\n\t\t\tnode.partialLengths = PartialSequenceLengths.combine(node, this.collabWindow, recur);\n\t\t}\n\t}\n\n\tpublic removeLocalReferencePosition(\n\t\tlref: LocalReferencePosition,\n\t): LocalReferencePosition | undefined {\n\t\tconst segment: ISegmentLeaf | undefined = lref.getSegment();\n\t\treturn segment?.localRefs?.removeLocalRef(lref);\n\t}\n\n\tstartOfTree = new StartOfTreeSegment(this);\n\tendOfTree = new EndOfTreeSegment(this);\n\n\tpublic createLocalReferencePosition(\n\t\t_segment: ISegmentLeaf | \"start\" | \"end\",\n\t\toffset: number,\n\t\trefType: ReferenceType,\n\t\tproperties: PropertySet | undefined,\n\t\tslidingPreference?: SlidingPreference,\n\t\tcanSlideToEndpoint?: boolean,\n\t): LocalReferencePosition {\n\t\tif (\n\t\t\t_segment !== \"start\" &&\n\t\t\t_segment !== \"end\" &&\n\t\t\tisRemovedAndAckedOrMovedAndAcked(_segment) &&\n\t\t\t!refTypeIncludesFlag(\n\t\t\t\trefType,\n\t\t\t\tReferenceType.SlideOnRemove | ReferenceType.Transient | ReferenceType.StayOnRemove,\n\t\t\t) &&\n\t\t\t_segment.endpointType === undefined\n\t\t) {\n\t\t\tthrow new UsageError(\n\t\t\t\t\"Can only create SlideOnRemove or Transient local reference position on a removed or obliterated segment\",\n\t\t\t);\n\t\t}\n\n\t\tlet segment: ISegmentLeaf;\n\n\t\tif (_segment === \"start\") {\n\t\t\tsegment = this.startOfTree;\n\t\t} else if (_segment === \"end\") {\n\t\t\tsegment = this.endOfTree;\n\t\t} else {\n\t\t\tsegment = _segment;\n\t\t}\n\n\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\n\t\tconst segRef = localRefs.createLocalRef(\n\t\t\toffset,\n\t\t\trefType,\n\t\t\tproperties,\n\t\t\tslidingPreference,\n\t\t\tcanSlideToEndpoint,\n\t\t);\n\n\t\treturn segRef;\n\t}\n\n\t// Segments should either be removed remotely, removed locally, or inserted locally\n\tprivate normalizeAdjacentSegments(affectedSegments: DoublyLinkedList<ISegmentLeaf>): void {\n\t\t// Eagerly demand this since we're about to shift elements in the list around\n\t\tconst currentOrder = Array.from(affectedSegments, ({ data: seg }) => ({\n\t\t\tparent: seg.parent,\n\t\t\tindex: seg.index,\n\t\t\tordinal: seg.ordinal,\n\t\t}));\n\n\t\t// Last segment which was not affected locally.\n\t\tlet lastLocalSegment = affectedSegments.last;\n\t\twhile (lastLocalSegment !== undefined && isRemovedAndAcked(lastLocalSegment.data)) {\n\t\t\tlastLocalSegment = lastLocalSegment.prev;\n\t\t}\n\n\t\tif (!lastLocalSegment) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (\n\t\t\tlet segmentToSlide: ListNode<ISegment> | undefined = lastLocalSegment,\n\t\t\t\tnearerSegment = lastLocalSegment?.prev;\n\t\t\tsegmentToSlide !== undefined;\n\t\t\tsegmentToSlide = nearerSegment, nearerSegment = nearerSegment?.prev\n\t\t) {\n\t\t\t// Slide iterCur forward as far as possible\n\t\t\tif (isRemovedAndAcked(segmentToSlide.data)) {\n\t\t\t\t// Slide past all segments that are not also remotely removed\n\t\t\t\taffectedSegments.remove(segmentToSlide);\n\t\t\t\taffectedSegments.insertAfter(lastLocalSegment, segmentToSlide.data);\n\t\t\t} else if (isRemoved(segmentToSlide.data)) {\n\t\t\t\tassert(\n\t\t\t\t\tsegmentToSlide.data.localRemovedSeq !== undefined,\n\t\t\t\t\t0x54d /* Removed segment that hasnt had its removal acked should be locally removed */,\n\t\t\t\t);\n\t\t\t\t// Slide each locally removed item past all segments that have localSeq > lremoveItem.localSeq\n\t\t\t\t// but not past remotely removed segments;\n\t\t\t\tlet cur = segmentToSlide;\n\t\t\t\tlet scan = cur.next;\n\t\t\t\twhile (\n\t\t\t\t\tscan !== undefined &&\n\t\t\t\t\t!isRemovedAndAcked(scan.data) &&\n\t\t\t\t\tscan.data.localSeq !== undefined &&\n\t\t\t\t\tscan.data.localSeq > segmentToSlide.data.localRemovedSeq\n\t\t\t\t) {\n\t\t\t\t\tcur = scan;\n\t\t\t\t\tscan = scan.next;\n\t\t\t\t}\n\t\t\t\tif (cur !== segmentToSlide) {\n\t\t\t\t\taffectedSegments.remove(segmentToSlide);\n\t\t\t\t\taffectedSegments.insertAfter(cur, segmentToSlide.data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst newOrder = Array.from(affectedSegments, ({ data }) => data);\n\t\tfor (const seg of newOrder)\n\t\t\tseg.localRefs?.walkReferences((lref) => lref.callbacks?.beforeSlide?.(lref));\n\t\tconst perSegmentTrackingGroups = new Map<ISegment, TrackingGroup[]>();\n\t\tfor (const segment of newOrder) {\n\t\t\tconst { trackingCollection } = segment;\n\t\t\tconst trackingGroups = [...trackingCollection.trackingGroups];\n\t\t\tperSegmentTrackingGroups.set(segment, trackingGroups);\n\t\t\tfor (const group of trackingCollection.trackingGroups) {\n\t\t\t\ttrackingCollection.unlink(group);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < newOrder.length; i++) {\n\t\t\tconst seg = newOrder[i];\n\t\t\tconst { parent, index, ordinal } = currentOrder[i];\n\t\t\tparent?.assignChild(seg, index, false);\n\t\t\tseg.ordinal = ordinal;\n\t\t}\n\n\t\tfor (const [segment, groups] of perSegmentTrackingGroups.entries()) {\n\t\t\tfor (const group of groups) {\n\t\t\t\tsegment.trackingCollection.link(group);\n\t\t\t}\n\t\t}\n\n\t\t// Finally, update internal node bookkeeping on ancestors of the swapped nodes.\n\t\t// Toposort would improve this by a log factor, but probably not worth the added code size\n\t\tconst depths = new Map<IMergeNode, number>();\n\t\tconst computeDepth = (block: IMergeNode): number => {\n\t\t\tif (!depths.has(block)) {\n\t\t\t\tdepths.set(block, block.parent === undefined ? 0 : 1 + computeDepth(block.parent));\n\t\t\t}\n\t\t\treturn depths.get(block)!;\n\t\t};\n\t\tfor (const element of newOrder) {\n\t\t\tcomputeDepth(element);\n\t\t}\n\t\tfor (const [node] of [...depths.entries()].sort((a, b) => b[1] - a[1])) {\n\t\t\tif (!node.isLeaf()) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(node);\n\t\t\t}\n\t\t}\n\t\tfor (const seg of newOrder)\n\t\t\tseg.localRefs?.walkReferences((lref) => lref.callbacks?.afterSlide?.(lref));\n\t}\n\n\t/**\n\t * Normalizes the segments nearby `segmentGroup` to be ordered as they would if the op submitting `segmentGroup`\n\t * is rebased to the current sequence number.\n\t * This primarily affects the ordering of adjacent segments that were removed between the original submission of\n\t * the local ops and now.\n\t * Consider the following sequence of events:\n\t * Initial state: \"hi my friend\" (seq: 0)\n\t * - Client 1 inserts \"good \" to make \"hi my good friend\" (op1, refSeq: 0)\n\t * - Client 2 deletes \"my \" to make \"hi friend\" (op2, refSeq: 0)\n\t * - op2 is sequenced giving seq 1\n\t * - Client 1 disconnects and reconnects at seq: 1.\n\t *\n\t * At this point in time, client 1 will have segments [\"hi \", Removed\"my \", Local\"good \", \"friend\"].\n\t * However, the rebased op that it submits will cause client 2 to have segments\n\t * [\"hi \", Local\"good \", Removed\"my \", \"friend\"].\n\t *\n\t * The difference in ordering can be problematic for tie-breaking concurrently inserted segments in some scenarios.\n\t * Rather than incur extra work tie-breaking these scenarios for all clients, when client 1 rebases its operation,\n\t * it can fix up its local state to align with what would be expected of the op it resubmits.\n\t */\n\tpublic normalizeSegmentsOnRebase(): void {\n\t\tlet currentRangeToNormalize = new DoublyLinkedList<ISegment>();\n\t\tlet rangeContainsLocalSegs = false;\n\t\tlet rangeContainsRemoteRemovedSegs = false;\n\t\tconst normalize = (): void => {\n\t\t\tif (\n\t\t\t\trangeContainsLocalSegs &&\n\t\t\t\trangeContainsRemoteRemovedSegs &&\n\t\t\t\tcurrentRangeToNormalize.length > 1\n\t\t\t) {\n\t\t\t\tthis.normalizeAdjacentSegments(currentRangeToNormalize);\n\t\t\t}\n\t\t};\n\t\twalkAllChildSegments(this.root, (seg) => {\n\t\t\tif (isRemoved(seg) || seg.seq === UnassignedSequenceNumber) {\n\t\t\t\tif (isRemovedAndAcked(seg)) {\n\t\t\t\t\trangeContainsRemoteRemovedSegs = true;\n\t\t\t\t}\n\t\t\t\tif (seg.seq === UnassignedSequenceNumber) {\n\t\t\t\t\trangeContainsLocalSegs = true;\n\t\t\t\t}\n\t\t\t\tcurrentRangeToNormalize.push(seg);\n\t\t\t} else {\n\t\t\t\tnormalize();\n\t\t\t\tcurrentRangeToNormalize = new DoublyLinkedList<ISegment>();\n\t\t\t\trangeContainsLocalSegs = false;\n\t\t\t\trangeContainsRemoteRemovedSegs = false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tnormalize();\n\t}\n\tprivate blockUpdate(block: MergeBlock): void {\n\t\tlet len: number | undefined;\n\n\t\tconst rightmostTiles = createMap<Marker>();\n\t\tconst leftmostTiles = createMap<Marker>();\n\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst node = block.children[i];\n\t\t\tconst nodeLength = nodeTotalLength(this, node);\n\t\t\tif (nodeLength !== undefined) {\n\t\t\t\tlen ??= 0;\n\t\t\t\tlen += nodeLength;\n\t\t\t}\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tconst segment = node;\n\t\t\t\tif ((this.localNetLength(segment) ?? 0) > 0 && Marker.is(segment)) {\n\t\t\t\t\tconst markerId = segment.getId();\n\t\t\t\t\t// Also in insertMarker but need for reload segs case\n\t\t\t\t\t// can add option for this only from reload segs\n\t\t\t\t\tif (markerId) {\n\t\t\t\t\t\tthis.idToMarker.set(markerId, segment);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (refTypeIncludesFlag(segment, ReferenceType.Tile)) {\n\t\t\t\t\t\tconst tileLabels = refGetTileLabels(segment);\n\t\t\t\t\t\tif (tileLabels) {\n\t\t\t\t\t\t\tfor (const tileLabel of tileLabels) {\n\t\t\t\t\t\t\t\t// this depends on walking children in order\n\t\t\t\t\t\t\t\t// The later, and right most children overwrite\n\t\t\t\t\t\t\t\t// whereas early, and left most do not overwrite\n\t\t\t\t\t\t\t\trightmostTiles[tileLabel] = segment;\n\t\t\t\t\t\t\t\tleftmostTiles[tileLabel] ??= segment;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\textend(rightmostTiles, node.rightmostTiles);\n\t\t\t\textendIfUndefined(leftmostTiles, node.leftmostTiles);\n\t\t\t}\n\t\t}\n\t\tblock.leftmostTiles = leftmostTiles;\n\t\tblock.rightmostTiles = rightmostTiles;\n\t\tblock.cachedLength = len;\n\t}\n\n\tpublic blockUpdatePathLengths(\n\t\tstartBlock: MergeBlock | undefined,\n\t\tseq: number,\n\t\tclientId: number,\n\t\tnewStructure = false,\n\t): void {\n\t\tlet block: MergeBlock | undefined = startBlock;\n\t\twhile (block !== undefined) {\n\t\t\tif (newStructure) {\n\t\t\t\tthis.nodeUpdateLengthNewStructure(block);\n\t\t\t} else {\n\t\t\t\tthis.blockUpdateLength(block, seq, clientId);\n\t\t\t}\n\t\t\tblock = block.parent;\n\t\t}\n\t}\n\n\tprivate blockUpdateLength(node: MergeBlock, seq: number, clientId: number): void {\n\t\tthis.blockUpdate(node);\n\t\tthis.localPartialsComputed = false;\n\t\tif (\n\t\t\tthis.collabWindow.collaborating &&\n\t\t\tseq !== UnassignedSequenceNumber &&\n\t\t\tseq !== TreeMaintenanceSequenceNumber\n\t\t) {\n\t\t\tif (\n\t\t\t\tnode.partialLengths !== undefined &&\n\t\t\t\tMergeTree.options.incrementalUpdate &&\n\t\t\t\tclientId !== NonCollabClient\n\t\t\t) {\n\t\t\t\tnode.partialLengths.update(node, seq, clientId, this.collabWindow);\n\t\t\t} else {\n\t\t\t\tnode.partialLengths = PartialSequenceLengths.combine(node, this.collabWindow);\n\t\t\t}\n\n\t\t\tPartialSequenceLengths.options.verifyExpected?.(this, node, seq, clientId);\n\t\t}\n\t}\n\n\t/**\n\t * Map over all visible segments in a given range\n\t *\n\t * A segment is visible if its length is greater than 0\n\t *\n\t * See `this.nodeMap` for additional documentation\n\t */\n\tpublic mapRange<TClientData>(\n\t\thandler: ISegmentAction<TClientData>,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\taccum: TClientData,\n\t\tstart?: number,\n\t\tend?: number,\n\t\tsplitRange: boolean = false,\n\t\tvisibilitySeq: number = refSeq,\n\t): void {\n\t\tif (splitRange) {\n\t\t\tif (start) {\n\t\t\t\tthis.ensureIntervalBoundary(start, refSeq, clientId);\n\t\t\t}\n\t\t\tif (end) {\n\t\t\t\tthis.ensureIntervalBoundary(end, refSeq, clientId);\n\t\t\t}\n\t\t}\n\t\tthis.nodeMap(\n\t\t\trefSeq,\n\t\t\tclientId,\n\t\t\thandler,\n\t\t\taccum,\n\t\t\tundefined,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tundefined,\n\t\t\tvisibilitySeq,\n\t\t);\n\t}\n\n\t/**\n\t * Map over all visible segments in a given range\n\t *\n\t * A segment is visible if its length is greater than 0\n\t *\n\t * @param refSeq - The sequence number used to determine the range (start\n\t * and end positions) of segments to iterate over.\n\t *\n\t * @param visibilitySeq - An additional sequence number to further configure\n\t * segment visibility during traversal. This is the same as refSeq, except\n\t * in the case of obliterate.\n\t *\n\t * In the case where `refSeq == visibilitySeq`, mapping is done on all\n\t * visible segments from `start` to `end`.\n\t *\n\t * If a segment is invisible at both `visibilitySeq` and `refSeq`, then it\n\t * will not be traversed and mapped. Otherwise, if the segment is visible at\n\t * either seq, it will be mapped.\n\t *\n\t * If a segment is only visible at `visibilitySeq`, it will still be mapped,\n\t * but it will not count as a segment within the range. That is, it will be\n\t * ignored for the purposes of tracking when traversal should end.\n\t */\n\tprivate nodeMap<TClientData>(\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tleaf: ISegmentAction<TClientData>,\n\t\taccum: TClientData,\n\t\tpost?: BlockAction<TClientData>,\n\t\tstart: SequencePlace = 0,\n\t\tend?: SequencePlace,\n\t\tlocalSeq?: number,\n\t\tvisibilitySeq: number = refSeq,\n\t): void {\n\t\tconst maybeEndPos = end ?? this.nodeLength(this.root, refSeq, clientId, localSeq) ?? 0;\n\t\tif (maybeEndPos === start) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet pos = 0;\n\t\tlet { startPos, endPos } = endpointPosAndSide(start, end);\n\n\t\tstartPos = startPos === \"start\" || startPos === undefined ? 0 : startPos;\n\t\tendPos =\n\t\t\tendPos === \"end\" || endPos === undefined\n\t\t\t\t? this.root.mergeTree?.getLength(refSeq, clientId) ?? 0\n\t\t\t\t: endPos;\n\t\tassert(\n\t\t\tstartPos !== \"end\" && endPos !== \"start\",\n\t\t\t0x9e3 /* start cannot be 'end' and end cannot be 'start' */,\n\t\t);\n\t\tdepthFirstNodeWalk(\n\t\t\tthis.root,\n\t\t\tthis.root.children[0],\n\t\t\t(node) => {\n\t\t\t\tif (endPos <= pos) {\n\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t}\n\n\t\t\t\tconst len = this.nodeLength(node, visibilitySeq, clientId, localSeq);\n\t\t\t\tconst lenAtRefSeq =\n\t\t\t\t\t(visibilitySeq === refSeq\n\t\t\t\t\t\t? len\n\t\t\t\t\t\t: this.nodeLength(node, refSeq, clientId, localSeq)) ?? 0;\n\n\t\t\t\tconst isUnackedAndInObliterate =\n\t\t\t\t\tvisibilitySeq !== refSeq &&\n\t\t\t\t\t(!node.isLeaf() || node.seq === UnassignedSequenceNumber);\n\n\t\t\t\tif (\n\t\t\t\t\t(len === undefined && lenAtRefSeq === 0) ||\n\t\t\t\t\t(len === 0 && !isUnackedAndInObliterate && lenAtRefSeq === 0)\n\t\t\t\t) {\n\t\t\t\t\treturn NodeAction.Skip;\n\t\t\t\t}\n\n\t\t\t\tconst nextPos = pos + lenAtRefSeq;\n\t\t\t\t// start is beyond the current node, so we can skip it\n\t\t\t\tif (typeof startPos === \"number\" && startPos >= nextPos) {\n\t\t\t\t\tpos = nextPos;\n\t\t\t\t\treturn NodeAction.Skip;\n\t\t\t\t}\n\n\t\t\t\tif (node.isLeaf()) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tleaf(node, pos, refSeq, clientId, startPos - pos, endPos - pos, accum) === false\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t\t}\n\t\t\t\t\tpos = nextPos;\n\t\t\t\t}\n\t\t\t},\n\t\t\tundefined,\n\t\t\tpost === undefined\n\t\t\t\t? undefined\n\t\t\t\t: (block): boolean =>\n\t\t\t\t\t\tpost(block, pos, refSeq, clientId, startPos - pos, endPos - pos, accum),\n\t\t);\n\t}\n}\n"]}
|