@fluidframework/merge-tree 2.12.0 → 2.13.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/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +0 -2
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +6 -16
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -28
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +2 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +8 -7
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +190 -216
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +3 -2
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +76 -162
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +100 -112
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +0 -2
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +28 -26
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +3 -2
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +11 -4
- package/dist/perspective.js.map +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +4 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +10 -11
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +4 -4
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +0 -6
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +257 -0
- package/dist/segmentInfos.d.ts.map +1 -0
- package/dist/segmentInfos.js +166 -0
- package/dist/segmentInfos.js.map +1 -0
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +38 -44
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +9 -12
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -2
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +5 -3
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +5 -8
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +0 -2
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +1 -5
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +15 -12
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +3 -2
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +6 -6
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/dirname.cjs +0 -1
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -4
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +3 -0
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +2 -3
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/propertyManager.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +2 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +15 -3
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +2 -2
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +4 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +8 -6
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +29 -27
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +6 -4
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testUtils.d.ts +2 -2
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +32 -8
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +12 -6
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +8 -7
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +0 -2
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +6 -16
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +40 -29
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +2 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +8 -7
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +177 -205
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +3 -2
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +76 -162
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +95 -108
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +0 -2
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +25 -23
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +3 -2
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +11 -4
- package/lib/perspective.js.map +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +4 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +8 -9
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +4 -4
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +0 -6
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +257 -0
- package/lib/segmentInfos.d.ts.map +1 -0
- package/lib/segmentInfos.js +145 -0
- package/lib/segmentInfos.js.map +1 -0
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +38 -44
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +9 -12
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +2 -2
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +5 -3
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +5 -8
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +0 -2
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +0 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +15 -12
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +3 -2
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/dirname.cjs +0 -1
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/index.d.ts +1 -1
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +3 -0
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +1 -2
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/propertyManager.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +2 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +15 -3
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +2 -2
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +4 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +8 -6
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +30 -28
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +5 -3
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testUtils.d.ts +2 -2
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +9 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +2 -2
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +12 -6
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -6
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -17
- package/src/MergeTreeTextHelper.ts +2 -4
- package/src/attributionPolicy.ts +5 -13
- package/src/client.ts +55 -44
- package/src/endOfTreeSegment.ts +3 -3
- package/src/index.ts +4 -6
- package/src/mergeTree.ts +245 -282
- package/src/mergeTreeNodeWalk.ts +3 -2
- package/src/mergeTreeNodes.ts +190 -322
- package/src/mergeTreeTracking.ts +0 -3
- package/src/partialLengths.ts +42 -27
- package/src/perspective.ts +27 -4
- package/src/referencePositions.ts +4 -1
- package/src/revertibles.ts +19 -13
- package/src/segmentGroupCollection.ts +7 -18
- package/src/segmentInfos.ts +377 -0
- package/src/snapshotLoader.ts +60 -57
- package/src/snapshotV1.ts +14 -16
- package/src/snapshotlegacy.ts +12 -17
- package/src/sortedSegmentSet.ts +6 -8
- package/src/zamboni.ts +10 -12
|
@@ -12,6 +12,7 @@ const constants_js_1 = require("../constants.js");
|
|
|
12
12
|
const mergeTreeNodeWalk_js_1 = require("../mergeTreeNodeWalk.js");
|
|
13
13
|
const mergeTreeTracking_js_1 = require("../mergeTreeTracking.js");
|
|
14
14
|
const ops_js_1 = require("../ops.js");
|
|
15
|
+
const segmentInfos_js_1 = require("../segmentInfos.js");
|
|
15
16
|
const sequencePlace_js_1 = require("../sequencePlace.js");
|
|
16
17
|
const testClient_js_1 = require("./testClient.js");
|
|
17
18
|
const testClientLogger_js_1 = require("./testClientLogger.js");
|
|
@@ -70,11 +71,13 @@ describe("client.applyMsg", () => {
|
|
|
70
71
|
switch (i % 6) {
|
|
71
72
|
case 0:
|
|
72
73
|
case 5: {
|
|
74
|
+
(0, segmentInfos_js_1.assertRemoved)(seg);
|
|
73
75
|
node_assert_1.strict.equal(seg.removedSeq, msg.sequenceNumber, "removed segment has unexpected id");
|
|
74
76
|
break;
|
|
75
77
|
}
|
|
76
78
|
case 1:
|
|
77
79
|
case 4: {
|
|
80
|
+
(0, segmentInfos_js_1.assertInserted)(seg);
|
|
78
81
|
node_assert_1.strict.equal(seg.seq, msg.sequenceNumber, "inserted segment has unexpected id");
|
|
79
82
|
break;
|
|
80
83
|
}
|
|
@@ -85,23 +88,23 @@ describe("client.applyMsg", () => {
|
|
|
85
88
|
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, 0);
|
|
86
89
|
for (let i = 0; i < client.getText().length; i++) {
|
|
87
90
|
const segmentInfo = client.getContainingSegment(i);
|
|
88
|
-
node_assert_1.strict.notEqual(segmentInfo.segment?.seq, constants_js_1.UnassignedSequenceNumber, "all segments should be acked");
|
|
91
|
+
node_assert_1.strict.notEqual((0, segmentInfos_js_1.toInsertionInfo)(segmentInfo.segment)?.seq, constants_js_1.UnassignedSequenceNumber, "all segments should be acked");
|
|
89
92
|
(0, node_assert_1.strict)(segmentInfo.segment?.segmentGroups?.empty !== false, "there should be no outstanding segmentGroups");
|
|
90
93
|
}
|
|
91
94
|
});
|
|
92
95
|
it("insertTextLocal", () => {
|
|
93
96
|
const op = client.insertTextLocal(0, "abc");
|
|
94
97
|
const segmentInfo = client.getContainingSegment(0);
|
|
95
|
-
node_assert_1.strict.equal(segmentInfo.segment?.seq, constants_js_1.UnassignedSequenceNumber);
|
|
98
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toInsertionInfo)(segmentInfo.segment)?.seq, constants_js_1.UnassignedSequenceNumber);
|
|
96
99
|
client.applyMsg(client.makeOpMessage(op, 17));
|
|
97
|
-
node_assert_1.strict.equal(segmentInfo.segment?.seq, 17);
|
|
100
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toInsertionInfo)(segmentInfo.segment)?.seq, 17);
|
|
98
101
|
});
|
|
99
102
|
it("removeRangeLocal", () => {
|
|
100
103
|
const segmentInfo = client.getContainingSegment(0);
|
|
101
104
|
const removeOp = client.removeRangeLocal(0, 1);
|
|
102
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
105
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
103
106
|
client.applyMsg(client.makeOpMessage(removeOp, 17));
|
|
104
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, 17);
|
|
107
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, 17);
|
|
105
108
|
});
|
|
106
109
|
it("annotateSegmentLocal", () => {
|
|
107
110
|
const props = {
|
|
@@ -122,13 +125,13 @@ describe("client.applyMsg", () => {
|
|
|
122
125
|
const annotateOp = client.annotateRangeLocal(start, end, props);
|
|
123
126
|
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, 1);
|
|
124
127
|
const removeOp = client.removeRangeLocal(start, end);
|
|
125
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
128
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
126
129
|
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, 2);
|
|
127
130
|
client.applyMsg(client.makeOpMessage(annotateOp, 17));
|
|
128
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
131
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
129
132
|
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, 1);
|
|
130
133
|
client.applyMsg(client.makeOpMessage(removeOp, 18, 0));
|
|
131
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, 18);
|
|
134
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, 18);
|
|
132
135
|
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, 0);
|
|
133
136
|
});
|
|
134
137
|
it("multiple interleaved annotateSegmentLocal", () => {
|
|
@@ -156,18 +159,18 @@ describe("client.applyMsg", () => {
|
|
|
156
159
|
const end = 5;
|
|
157
160
|
const initialText = client.getText();
|
|
158
161
|
const initialLength = initialText.length;
|
|
159
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, undefined);
|
|
162
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, undefined);
|
|
160
163
|
(0, node_assert_1.strict)(segmentInfo.segment?.segmentGroups?.empty !== false);
|
|
161
164
|
const removeOp = client.removeRangeLocal(start, end);
|
|
162
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
165
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, constants_js_1.UnassignedSequenceNumber);
|
|
163
166
|
node_assert_1.strict.equal(segmentInfo.segment?.segmentGroups?.size, 1);
|
|
164
167
|
const remoteMessage = client.makeOpMessage(removeOp, 17);
|
|
165
168
|
remoteMessage.clientId = "remoteClient";
|
|
166
169
|
client.applyMsg(remoteMessage);
|
|
167
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);
|
|
170
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, remoteMessage.sequenceNumber);
|
|
168
171
|
node_assert_1.strict.equal(segmentInfo.segment?.segmentGroups.size, 1);
|
|
169
172
|
client.applyMsg(client.makeOpMessage(removeOp, 18, 0));
|
|
170
|
-
node_assert_1.strict.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);
|
|
173
|
+
node_assert_1.strict.equal((0, segmentInfos_js_1.toRemovalInfo)(segmentInfo.segment)?.removedSeq, remoteMessage.sequenceNumber);
|
|
171
174
|
(0, node_assert_1.strict)(segmentInfo.segment?.segmentGroups.empty);
|
|
172
175
|
node_assert_1.strict.equal(client.getLength(), initialLength - (end - start));
|
|
173
176
|
node_assert_1.strict.equal(client.getText(), initialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,6DAA6D;AAE7D,6CAA+C;AAE/C,uEAA2E;AAE3E,uEAAwE;AAExE,kDAA2D;AAC3D,kEAA+D;AAE/D,kEAAwD;AACxD,sCAA8D;AAC9D,0DAA2C;AAG3C,mDAA6C;AAC7C,+DAAsF;AAEtF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,MAAM,eAAe,GAAG,WAAW,CAAC;IACpC,MAAM,gBAAgB,GAAG,YAAY,CAAC;IACtC,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,0BAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;QACJ,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,QAAQ,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC7E,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBAED,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBAED,KAAK,CAAC,CAAC;gBACP,KAAK,CAAC,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC7E,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE;wBAChD,GAAG,EAAE,GAAG,CAAC,EAAE;qBACX,CAAC,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACP,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACT,oBAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC5C,CAAC;YACF,CAAC;QACF,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC;YAClD,IAAA,oBAAM,EACL,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,KAAK,SAAS,EAC1D,kDAAkD,CAClD,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACf,KAAK,CAAC,CAAC;oBACP,KAAK,CAAC,CAAC,CAAC,CAAC;wBACR,oBAAM,CAAC,KAAK,CACX,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,cAAc,EAClB,mCAAmC,CACnC,CAAC;wBACF,MAAM;oBACP,CAAC;oBAED,KAAK,CAAC,CAAC;oBACP,KAAK,CAAC,CAAC,CAAC,CAAC;wBACR,oBAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,EAAE,oCAAoC,CAAC,CAAC;wBAChF,MAAM;oBACP,CAAC;oBAED,QAAQ;gBACT,CAAC;YACF,CAAC;QACF,CAAC;QACD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;YAEjE,oBAAM,CAAC,QAAQ,CACd,WAAW,CAAC,OAAO,EAAE,GAAG,EACxB,uCAAwB,EACxB,8BAA8B,CAC9B,CAAC;YACF,IAAA,oBAAM,EACL,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,KAAK,EACnD,8CAA8C,CAC9C,CAAC;QACH,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;QAEjE,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,uCAAwB,CAAC,CAAC;QAEjE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9C,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE/C,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,uCAAwB,CAAC,CAAC;QAExE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,KAAK;SACV,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAElD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9C,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QAEpC,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,KAAK;SACV,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEhE,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAErD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,uCAAwB,CAAC,CAAC;QACxE,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,uCAAwB,CAAC,CAAC;QACxE,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,IAAI,WAAW,GAAW,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QAClD,MAAM,QAAQ,GAAgC,EAAE,CAAC;QACjD,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG;gBACb,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,KAAK;aACV,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAEpE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;YAElE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,CAAC;QACd,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;QAEzC,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACzD,IAAA,oBAAM,EAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAErD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,uCAAwB,CAAC,CAAC;QACxE,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,GAAG,cAAc,CAAC;QAExC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAE/B,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5E,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5E,IAAA,oBAAM,EAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QACjD,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,aAAa,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAChE,oBAAM,CAAC,KAAK,CACX,MAAM,CAAC,OAAO,EAAE,EAChB,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,0BAAU,EAAE,CAAC;QACtC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,YAAY,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/E,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG;YAChB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YAC3D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAC1D,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACvE,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SACtE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAClF,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC;YACpF,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;YAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;SACjE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;YACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SAChE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG;YAChB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;YACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;SAChE,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,QAAQ,CAAC,IAAI,CACZ,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAChE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CACnE,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE7E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C,EAAE,YAAY,EAAE,aAAa,EAAE,EAC/B,GAAG,EACH,GAAG,EACH,GAAG,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EACjE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAChE,CAAC;QACF,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAE3E,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;oBACxD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3B,gFAAgF;QAChF,4CAA4C;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAE5E,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;oBACxD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,IAAI,0BAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,0BAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAE,CAAC;QACxF,MAAM,GAAG,GAAG,OAAO,CAAC,wBAAwB,EAAG,CAAC;QAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CACrC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,EAChD,EAAE,GAAG,CACL,CAAC;QACF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnE,IAAA,oBAAM,EAAC,aAAa,CAAC,IAAI,KAAK,2BAAkB,CAAC,KAAK,CAAC,CAAC;QACxD,oBAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,IAAI,0BAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,0BAAU,EAAE,CAAC;QACjC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,EAAE,GAAG,CAAC;QAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAElE,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAElD,6DAA6D;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAe,CAAC,EAAE;YACvD,uBAAuB,EAAE,cAAc,CAAC,uBAAuB;YAC/D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SACjC,CAAC,CAAC;QACH,oBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,oBAAM,CAAC,WAAW,CAAE,GAAG,CAAC,OAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE3D,oFAAoF;QACpF,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7E,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAe,CAAC,EAAE;YACnD,uBAAuB,EAAE,cAAc,CAAC,uBAAuB;YAC/D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SACjC,CAAC,CAAC;QACH,oBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,GAAgC,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAkC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAE9E,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CACjE,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;gBAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE5E,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CACjE,CAAC;QAEF,kBAAkB;QAClB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACb,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACP,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;QAEH,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAChE,CAAC;QAEF,2BAA2B;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxB,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACP,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;QAEH,wCAAwC;QACxC,MAAM,GAAG,GAAG;YACX,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAE;YACtC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,EAAG;SACzC,CAAC;QACF,MAAM,GAAG,GAAG;YACX,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAE;YACtC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,EAAG;SACzC,CAAC;QAEF,uBAAuB;QACvB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAe,CAAC,CAAC,CAAC;QAC5E,IAAA,oBAAM,EAAC,OAAO,KAAK,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,4BAA4B,CACjD,OAAO,EACP,MAAM,EACN,sBAAa,CAAC,MAAM,EACpB,SAAS,CACT,CAAC;QAEF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG;YACf,WAAW,EAAE,CAAC,IAAI,EAAQ,EAAE;gBAC3B,IAAA,oBAAM,EAAC,IAAI,KAAK,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACvC,YAAY,EAAE,CAAC;YAChB,CAAC;YACD,UAAU,EAAE,CAAC,IAAI,EAAQ,EAAE;gBAC1B,IAAA,oBAAM,EAAC,IAAI,KAAK,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACvC,WAAW,EAAE,CAAC;YACf,CAAC;SACD,CAAC;QAEF,gCAAgC;QAChC,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE;YAClD,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnE,8CAA8C;QAC9C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAExF,MAAM,aAAa,GAAG,IAAI,oCAAa,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,IAAA,2CAAoB,EAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACtD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,oBAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACrD,oBAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACxF,oBAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACnD,oBAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAElD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAA,oBAAM,EAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,2CAA2C,CAAC,CAAC;QAC7E,CAAC;QACD,8BAA8B;QAC9B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE;aAChD,EACD,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAE5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;iBACR;aACD,CAAC,EACF,GAAG,EAAE,CACL,EACD,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;iBACR;aACD,CAAC,EACF,GAAG,EAAE,CACL,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC5D,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE;aAChD,EACD,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAE5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC,CAAC;iBACT;aACD,CAAC,EACF,GAAG,EAAE,CACL,EACD,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,CAAC;iBACN;aACD,CAAC,EACF,GAAG,EAAE,CACL,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC5D,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE;aAChD,EACD,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAE5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;iBACR;aACD,CAAC,EACF,GAAG,EAAE,CACL,EACD,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,CAAC;iBACN;aACD,CAAC,EACF,GAAG,EAAE,CACL,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACpE,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE;aAChD,EACD,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAE5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;iBACR;aACD,CAAC,EACF,GAAG,EAAE,CACL,EACD,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE;oBACJ,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,CAAC;oBACN,GAAG,EAAE,CAAC;iBACN;aACD,CAAC,EACF,GAAG,EAAE,CACL,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,oBAAM,CAAC,eAAe,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE;aAChD,EACD,GAAG,CACH,CAAC;YAEF,IAAI,CAAC;gBACJ,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE;oBACxC,GAAG,EAAE;wBACJ,KAAK,EAAE,CAAC;wBACR,GAAG,EAAE,CAAC;wBACN,GAAG,EAAE,CAAC;qBACN;iBACD,CAAC,CAAC;gBACH,oBAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACzB,IAAA,oBAAM,EAAC,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAC,CAAC;gBAC5B,oBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,0BAAe,CAAC,UAAU,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,6CAA6C;QAC7C,8BAA8B;QAC9B,0EAA0E;QAC1E,wEAAwE;QACxE,wEAAwE;QACxE,iEAAiE;QACjE,wEAAwE;QACxE,uEAAuE;QACvE,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,wEAAwE;QACxE,oEAAoE;QACpE,wEAAwE;QACxE,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC3C,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,MAAM;gBACpB,OAAO,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE;aAClF,EACD,GAAG,EACH,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAE5C,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EACpF,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CACjE,CAAC;YACF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG;oBAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAE5E,GAAG,CAAC,IAAI,CACP,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAClE,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAC7B,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,MAAM,EAAE,EAC7B,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,KAAK,EAAE,CAC5B,EACD,EAAE,GAAG,CACL,EACD,OAAO,CAAC,CAAC,CAAC,aAAa,CACtB,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAC7B,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,MAAM,EAAE,EAC7B,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,KAAK,EAAE,CAC5B,EACD,EAAE,GAAG,CACL,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YAEF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,+BAA+B;QAC/B,sDAAsD;QACtD,wDAAwD;QACxD,wDAAwD;QACxD,wDAAwD;QACxD,uDAAuD;QACvD,yDAAyD;QACzD,wDAAwD;QACxD,0DAA0D;QAC1D,yDAAyD;QACzD,0DAA0D;QAC1D,yDAAyD;QACzD,2DAA2D;QAC3D,0DAA0D;QAC1D,6DAA6D;QAC7D,4DAA4D;QAC5D,6DAA6D;QAC7D,4DAA4D;QAC5D,6DAA6D;QAC7D,4DAA4D;QAC5D,4DAA4D;QAC5D,yDAAyD;QACzD,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,IAAA,iDAA2B,EAC1C;gBACC,YAAY,EAAE,WAAW;gBACzB,OAAO,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE;aAClF,EACD,GAAG,EACH,GAAG,CACH,CAAC;YACF,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,GAAG,GAAgC,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAEpB,GAAG,CAAC,IAAI,CACP,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAC9D,CAAC,CAAC,aAAa,CACd,CAAC,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAI,CAAC,MAAM,EAAE,CAAC,EACpF,EAAE,GAAG,CACL,EACD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EACjD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EACjD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAChD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EACjD,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAC9D,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YAEF,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACxD,MAAM,WAAW,GAAG,IAAI,0BAAU,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,IAAI,0BAAU,EAAE,CAAC;YACtC,MAAM,GAAG,GAAgC,EAAE,CAAC;YAC5C,WAAW,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YACxD,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,EAC7C,CAAC,EACD,CAAC,EACD,eAAe,EACf,CAAC,CACD,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,oBAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC;YACrC,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,eAAe;YACf,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,oBAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC9E,IAAI,mBAAuC,CAAC;YAC5C,MAAM,WAAW,GAAG,IAAI,0BAAU,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;YACpF,MAAM,YAAY,GAAG,IAAI,0BAAU,EAAE,CAAC;YACtC,MAAM,GAAG,GAAgC,EAAE,CAAC;YAC5C,WAAW,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YACxD,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;YAC1D,mBAAmB,GAAG,CAAC,CAAC;YAExB,MAAM,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACpE,iGAAiG;YACjG,gFAAgF;YAChF,8GAA8G;YAC9G,kEAAkE;YAClE,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;YAErF,GAAG,CAAC,IAAI,CACP,YAAY,CAAC,aAAa,CACzB,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC;YACtC,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,gBAAgB;YAChB,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,oBAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAExD,GAAG,CAAC,IAAI,CACP,WAAW,CAAC,aAAa,CACxB,WAAW,CAAC,mBAAmB,CAC9B,aAAc,EACd,WAAW,CAAC,wBAAwB,EAAG,CACvC;YACD,SAAS,CAAC,EAAE;YACZ,YAAY,CAAC,EAAE,EACf,eAAe;YACf,YAAY,CAAC,EAAE,CACf,CACD,CAAC;YACF,mBAAmB,GAAG,EAAE,CAAC;YAEzB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YAED,oBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,oBAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","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\nimport { strict as assert } from \"node:assert\";\n\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { isFluidError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegmentLeaf, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { Side } from \"../sequencePlace.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\tsegmentInfo.segment?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups?.empty !== false,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tassert.equal(segmentInfo.segment?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(segmentInfo.segment?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment<ISegmentLeaf>(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegmentLeaf[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"annotateRangeAdjust\", () => {\n\t\tit(\"validate local and remote adjust combine\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 2 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 2 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with min\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: -1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\tmax: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 1 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 1 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with min and max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 0,\n\t\t\t\t\t\t\tmax: 0,\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate min must be less than max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\tkey: {\n\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\tmax: 1,\n\t\t\t\t\t\tmin: 2,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tassert.fail(\"should fail\");\n\t\t\t} catch (error: unknown) {\n\t\t\t\tassert(isFluidError(error));\n\t\t\t\tassert.equal(error.errorType, FluidErrorTypes.usageError);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"obliterate\", () => {\n\t\t// \top types: 0) insert 1) remove 2) annotate\n\t\t// Clients: 3 Ops: 3 Round: 86\n\t\t// op | client A | op | client B | op | client C\n\t\t// | BBB-C- | | BBB-C- | | BBB-C-\n\t\t// | BBB-C- | L:558:B0@3 | BBB__-C- | | BBB-C-\n\t\t// | | | BB | |\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@2,4 | BB_-_-\n\t\t// | | | BB | | - -\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@1,2 | B__-_-\n\t\t// | | | BB | | -- -\n\t\t// 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | B__BB-_-\n\t\t// | | | | | -- -\n\t\t// 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | B_-BB-\n\t\t// | | | | | -\n\t\t// 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B--BB-\n\t\tit(\"sided obliterate regression test\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, clients.B.getLength()), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(2, \"C\"), ++seq),\n\t\t\t);\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(3, \"BB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t\t\t{ pos: 3, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 1, side: Side.Before },\n\t\t\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t});\n\n\t\t// MergeTree insert failed:\n\t\t// \t\tClients: 2 Ops: 8 Round: 4\n\t\t// op | client A | op | client B\n\t\t// | BBBBB BBB- | | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B2@1,7 | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B4@6,8 | BBBBB B__-\n\t\t// | | | --\n\t\t// | BBBBB BBB- | L:88:B0@5 | BBBBB _B__-\n\t\t// | | | B --\n\t\t// | BBBBB BBB- | L:88:B0@2 | BB_BBB _B__-\n\t\t// | | | B B --\n\t\t// | BBBBB BBB- | L:88:B1@4,6 | BB_B__ _B__-\n\t\t// | | | B -- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B___ _B__-\n\t\t// | | | B B-- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// | BBBBB BBB- | L:88:B2@0,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 89:88:B2@1,7 | BBBBB BBB- | 89:88:B2@1,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 90:88:B4@6,8 | B------- | 90:88:B4@6,8 | BB_B ____ _B--\n\t\t// | | | B BB-- B\n\t\tit(\"obliterate with mergeTree insert fails\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"BBBBB BBB\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tconst b = clients.B;\n\n\t\t\tops.push(\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(1, 7, { foo: 1 }), ++seq),\n\t\t\t\tb.makeOpMessage(\n\t\t\t\t\tb.obliterateRangeLocal({ pos: 6, side: Side.Before }, { pos: 8, side: Side.Before }),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(5, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(2, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.removeRangeLocal(4, 6), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(4, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(0, 7, { bar: 2 }), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"BBBBBB B\" });\n\t\t});\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.spec.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\nimport { strict as assert } from \"node:assert\";\n\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { isFluidError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegmentPrivate, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport {\n\tassertInserted,\n\tassertRemoved,\n\ttoInsertionInfo,\n\ttoRemovalInfo,\n} from \"../segmentInfos.js\";\nimport { Side } from \"../sequencePlace.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassertRemoved(seg);\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassertInserted(seg);\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\ttoInsertionInfo(segmentInfo.segment)?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups?.empty !== false,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tassert.equal(toInsertionInfo(segmentInfo.segment)?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(toInsertionInfo(segmentInfo.segment)?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentPrivate>(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(toRemovalInfo(segmentInfo.segment)?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment<ISegmentPrivate>(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment<ISegmentPrivate>(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegmentPrivate[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"annotateRangeAdjust\", () => {\n\t\tit(\"validate local and remote adjust combine\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 2 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 2 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with min\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: -1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\tmax: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 1 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 1 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate local and remote adjust combine with min and max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t\tclients.B.makeOpMessage(\n\t\t\t\t\tclients.B.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\tdelta: 0,\n\t\t\t\t\t\t\tmax: 0,\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tseq++,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\tassert.deepStrictEqual({ ...clients.A.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tassert.deepStrictEqual({ ...clients.B.getPropertiesAtPosition(2) }, { key: 0 });\n\t\t\tlogger.validate({ baseText: \"0123456789\" });\n\t\t});\n\n\t\tit(\"validate min must be less than max\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123456789\",\n\t\t\t\t\toptions: { mergeTreeEnableAnnotateAdjust: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tclients.A.annotateAdjustRangeLocal(1, 3, {\n\t\t\t\t\tkey: {\n\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\tmax: 1,\n\t\t\t\t\t\tmin: 2,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tassert.fail(\"should fail\");\n\t\t\t} catch (error: unknown) {\n\t\t\t\tassert(isFluidError(error));\n\t\t\t\tassert.equal(error.errorType, FluidErrorTypes.usageError);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"obliterate\", () => {\n\t\t// \top types: 0) insert 1) remove 2) annotate\n\t\t// Clients: 3 Ops: 3 Round: 86\n\t\t// op | client A | op | client B | op | client C\n\t\t// | BBB-C- | | BBB-C- | | BBB-C-\n\t\t// | BBB-C- | L:558:B0@3 | BBB__-C- | | BBB-C-\n\t\t// | | | BB | |\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@2,4 | BB_-_-\n\t\t// | | | BB | | - -\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@1,2 | B__-_-\n\t\t// | | | BB | | -- -\n\t\t// 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | B__BB-_-\n\t\t// | | | | | -- -\n\t\t// 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | B_-BB-\n\t\t// | | | | | -\n\t\t// 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B--BB-\n\t\tit(\"sided obliterate regression test\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, clients.B.getLength()), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(2, \"C\"), ++seq),\n\t\t\t);\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(3, \"BB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t\t\t{ pos: 3, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 1, side: Side.Before },\n\t\t\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t});\n\n\t\t// MergeTree insert failed:\n\t\t// \t\tClients: 2 Ops: 8 Round: 4\n\t\t// op | client A | op | client B\n\t\t// | BBBBB BBB- | | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B2@1,7 | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B4@6,8 | BBBBB B__-\n\t\t// | | | --\n\t\t// | BBBBB BBB- | L:88:B0@5 | BBBBB _B__-\n\t\t// | | | B --\n\t\t// | BBBBB BBB- | L:88:B0@2 | BB_BBB _B__-\n\t\t// | | | B B --\n\t\t// | BBBBB BBB- | L:88:B1@4,6 | BB_B__ _B__-\n\t\t// | | | B -- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B___ _B__-\n\t\t// | | | B B-- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// | BBBBB BBB- | L:88:B2@0,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 89:88:B2@1,7 | BBBBB BBB- | 89:88:B2@1,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 90:88:B4@6,8 | B------- | 90:88:B4@6,8 | BB_B ____ _B--\n\t\t// | | | B BB-- B\n\t\tit(\"obliterate with mergeTree insert fails\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"BBBBB BBB\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tconst b = clients.B;\n\n\t\t\tops.push(\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(1, 7, { foo: 1 }), ++seq),\n\t\t\t\tb.makeOpMessage(\n\t\t\t\t\tb.obliterateRangeLocal({ pos: 6, side: Side.Before }, { pos: 8, side: Side.Before }),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(5, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(2, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.removeRangeLocal(4, 6), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(4, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(0, 7, { bar: 2 }), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"BBBBBB B\" });\n\t\t});\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.attributionFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.attributionFarm.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA+C;AAE/C,gFAAgF;AAChF,oFAAiF;AAGjF,kEAAqG;AAGrG,+EASuC;AACvC,mDAA6C;AAC7C,+DAAyD;AAElD,MAAM,aAAa,GAAkB,CAC3C,MAAkB,EAClB,OAAe,EACf,KAAa,EACZ,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;AAJxE,QAAA,aAAa,iBAI2D;AAErF,MAAM,cAAc,GACe;IAClC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IAC3B,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IAC1B,gBAAgB,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IACtC,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,CAAC,yCAAW,EAAE,qBAAa,EAAE,oCAAM,CAAC;IAChD,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC;CACxC,CAAC;AAEF,IAAA,oCAAY,EAAC,uBAAuB,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IACvD,6EAA6E;IAC7E,MAAM,WAAW,GAAG,IAAA,iDAAmB,GAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAA,2CAAa,EAAC,cAAc,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9E,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;QAC5D,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,IAAA,iDAAuB,EAC1E,YAAY,CACZ,EAAE,CAAC;YACH,EAAE,CAAC,mBAAmB,OAAO,IAAI,MAAM,IAAI,gBAAgB,EAAE,EAAE,KAAK,IAAI,EAAE;gBACzE,MAAM,MAAM,GAAG,IAAA,kCAAU,EAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;gBAEvE,MAAM,OAAO,GAAiB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;qBACrD,IAAI,CAAC,CAAC,CAAC;qBACP,GAAG,CACH,GAAG,EAAE,CACJ,IAAI,0BAAU,CAAC;oBACd,WAAW,EAAE;wBACZ,KAAK,EAAE,IAAI;wBACX,aAAa,EACZ,IAAA,iFAA0D,EAAC,aAAa,CAAC;qBAC1E;iBACD,CAAC,CACH,CAAC;gBACH,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE;oBAAE,CAAC,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAErF,MAAM,wBAAwB,GAAG,CAChC,MAAkB,EAClB,GAAW,EAKC,EAAE;oBACd,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"client.attributionFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.attributionFarm.spec.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\nimport { strict as assert } from \"node:assert\";\n\nimport { describeFuzz, makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport { createPropertyTrackingAndInsertionAttributionPolicyFactory } from \"../attributionPolicy.js\";\nimport type { ISegmentPrivate } from \"../mergeTreeNodes.js\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tTestOperation,\n\tgenerateClientNames,\n\tinsert,\n\tremoveRange,\n\tresolveRanges,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\n\nexport const annotateRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n) => client.annotateRangeLocal(opStart, opEnd, { trackedProp: client.longClientId });\n\nconst defaultOptions: Record<\"initLen\" | \"modLen\", IConfigRange> &\n\tIMergeTreeOperationRunnerConfig = {\n\tinitLen: { min: 2, max: 4 },\n\tmodLen: { min: 1, max: 8 },\n\topsPerRoundRange: { min: 10, max: 40 },\n\trounds: 10,\n\toperations: [removeRange, annotateRange, insert],\n\tgrowthFunc: (input: number) => input * 2,\n};\n\ndescribeFuzz(\"MergeTree.Attribution\", ({ testCount }) => {\n\t// Generate a list of single character client names, support up to 69 clients\n\tconst clientNames = generateClientNames();\n\tconst rangeOptions = resolveRanges(defaultOptions, defaultOptions.growthFunc);\n\tfor (let extraSeed = 0; extraSeed < testCount; extraSeed++) {\n\t\tfor (const { initLen, modLen, opsPerRoundRange } of generatePairwiseOptions(\n\t\t\trangeOptions,\n\t\t)) {\n\t\t\tit(`AttributionFarm_${initLen}_${modLen}_${opsPerRoundRange}`, async () => {\n\t\t\t\tconst random = makeRandom(0xdeadbeef, initLen, modLen, extraSeed ?? 0);\n\n\t\t\t\tconst clients: TestClient[] = Array.from({ length: 3 })\n\t\t\t\t\t.fill(0)\n\t\t\t\t\t.map(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tnew TestClient({\n\t\t\t\t\t\t\t\tattribution: {\n\t\t\t\t\t\t\t\t\ttrack: true,\n\t\t\t\t\t\t\t\t\tpolicyFactory:\n\t\t\t\t\t\t\t\t\t\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory(\"trackedProp\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\tfor (const [i, c] of clients.entries()) c.startOrUpdateCollaboration(clientNames[i]);\n\n\t\t\t\tconst getAttributionAtPosition = (\n\t\t\t\t\tclient: TestClient,\n\t\t\t\t\tpos: number,\n\t\t\t\t):\n\t\t\t\t\t| {\n\t\t\t\t\t\t\t[name: string]: AttributionKey | undefined;\n\t\t\t\t\t }\n\t\t\t\t\t| undefined => {\n\t\t\t\t\tconst { segment, offset } = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\t\t\t\tif (segment?.attribution === undefined || offset === undefined) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst { attribution } = segment;\n\t\t\t\t\tlet channels: { [name: string]: AttributionKey | undefined } | undefined;\n\t\t\t\t\tconst result: {\n\t\t\t\t\t\troot: AttributionKey | undefined;\n\t\t\t\t\t\tchannels?: { [name: string]: AttributionKey | undefined };\n\t\t\t\t\t} = {\n\t\t\t\t\t\troot: attribution.getAtOffset(offset),\n\t\t\t\t\t};\n\t\t\t\t\tfor (const name of attribution.channelNames) {\n\t\t\t\t\t\t(channels ??= {})[name] = attribution.getAtOffset(offset, name);\n\t\t\t\t\t\tresult.channels = channels;\n\t\t\t\t\t}\n\t\t\t\t\treturn channels;\n\t\t\t\t};\n\n\t\t\t\tconst validateAnnotation = (reason: string, workload: () => void): void => {\n\t\t\t\t\tconst preWorkload = TestClientLogger.toString(clients);\n\t\t\t\t\tworkload();\n\t\t\t\t\tconst attributions = Array.from({ length: clients[0].getLength() }).map((_, i) =>\n\t\t\t\t\t\tgetAttributionAtPosition(clients[0], i),\n\t\t\t\t\t);\n\t\t\t\t\tfor (let c = 1; c < clients.length; c++) {\n\t\t\t\t\t\tfor (let i = 0; i < clients[c].getLength(); i++) {\n\t\t\t\t\t\t\tconst attribution0 = attributions[i];\n\t\t\t\t\t\t\tconst attributionC = getAttributionAtPosition(clients[c], i);\n\t\t\t\t\t\t\tif (attribution0 !== attributionC) {\n\t\t\t\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\t\t\t\tattribution0,\n\t\t\t\t\t\t\t\t\tattributionC,\n\t\t\t\t\t\t\t\t\t`${reason}:\\n${preWorkload}\\n${TestClientLogger.toString([\n\t\t\t\t\t\t\t\t\t\tclients[0],\n\t\t\t\t\t\t\t\t\t\tclients[c],\n\t\t\t\t\t\t\t\t\t])}`,\n\t\t\t\t\t\t\t\t);\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\n\t\t\t\tlet seq = 0;\n\n\t\t\t\tvalidateAnnotation(\"Initialize\", () => {\n\t\t\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, initLen, defaultOptions);\n\t\t\t\t});\n\n\t\t\t\tvalidateAnnotation(\"After Init Zamboni\", () => {\n\t\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\t\tfor (const c of clients) c.updateMinSeq(i);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tvalidateAnnotation(\"After More Ops\", () => {\n\t\t\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, modLen, defaultOptions);\n\t\t\t\t});\n\n\t\t\t\tvalidateAnnotation(\"After Final Zamboni\", () => {\n\t\t\t\t\t// trigger zamboni multiple times as it is incremental\n\t\t\t\t\tfor (let i = clients[0].getCollabWindow().minSeq; i <= seq; i++) {\n\t\t\t\t\t\tfor (const c of clients) c.updateMinSeq(i);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n});\n"]}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
8
8
|
const node_assert_1 = require("node:assert");
|
|
9
|
+
const mergeTreeNodes_js_1 = require("../mergeTreeNodes.js");
|
|
9
10
|
const textSegment_js_1 = require("../textSegment.js");
|
|
10
11
|
const testClient_js_1 = require("./testClient.js");
|
|
11
12
|
describe("client.getPosition", () => {
|
|
@@ -31,7 +32,7 @@ describe("client.getPosition", () => {
|
|
|
31
32
|
});
|
|
32
33
|
it("Deleted Segment", () => {
|
|
33
34
|
client.removeRangeLocal(segPos, segPos + 1);
|
|
34
|
-
node_assert_1.strict.
|
|
35
|
+
node_assert_1.strict.strictEqual((0, mergeTreeNodes_js_1.segmentIsRemoved)(segment), true);
|
|
35
36
|
const pos = client.getPosition(segment);
|
|
36
37
|
node_assert_1.strict.strictEqual(pos, segPos);
|
|
37
38
|
});
|
|
@@ -41,7 +42,7 @@ describe("client.getPosition", () => {
|
|
|
41
42
|
for (const c of "hello world") {
|
|
42
43
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(client.getLength(), c), client.getCurrentSeq() + 1, client.getCurrentSeq(), undefined, client.getCurrentSeq()));
|
|
43
44
|
}
|
|
44
|
-
node_assert_1.strict.
|
|
45
|
+
node_assert_1.strict.strictEqual((0, mergeTreeNodes_js_1.segmentIsRemoved)(segment), true);
|
|
45
46
|
const pos = client.getPosition(segment);
|
|
46
47
|
node_assert_1.strict.strictEqual(pos, -1);
|
|
47
48
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.getPosition.spec.js","sourceRoot":"","sources":["../../src/test/client.getPosition.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,6DAA6D;AAE7D,6CAA+C;
|
|
1
|
+
{"version":3,"file":"client.getPosition.spec.js","sourceRoot":"","sources":["../../src/test/client.getPosition.spec.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\nimport { strict as assert } from \"node:assert\";\n\nimport { segmentIsRemoved, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"client.getPosition\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\tlet segment: TextSegment;\n\tconst segPos = 4;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\n\t\tconst segOff = client.getContainingSegment<ISegmentPrivate>(segPos);\n\t\tassert(TextSegment.is(segOff.segment!));\n\t\tassert.strictEqual(segOff.offset, 0);\n\t\tassert.strictEqual(segOff.segment.text, \"o\");\n\t\tsegment = segOff.segment;\n\t});\n\n\tit(\"Existing Segment\", () => {\n\t\tconst pos = client.getPosition(segment);\n\t\tassert.strictEqual(pos, segPos);\n\t});\n\n\tit(\"Deleted Segment\", () => {\n\t\tclient.removeRangeLocal(segPos, segPos + 1);\n\t\tassert.strictEqual(segmentIsRemoved(segment), true);\n\t\tconst pos = client.getPosition(segment);\n\t\tassert.strictEqual(pos, segPos);\n\t});\n\n\tit(\"Detached Segment\", () => {\n\t\tclient.applyMsg(client.makeOpMessage(client.removeRangeLocal(segPos, segPos + 1), 1));\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tassert.strictEqual(segmentIsRemoved(segment), true);\n\n\t\tconst pos = client.getPosition(segment);\n\t\tassert.strictEqual(pos, -1);\n\t});\n\n\tit(\"Moved Segment\", () => {\n\t\tclient.removeRangeLocal(segPos - 1, segPos);\n\t\tconst pos = client.getPosition(segment);\n\t\tassert.strictEqual(pos, segPos - 1);\n\t});\n});\n"]}
|