detached 86aa468

fix(ansi): snapshot when rows outside the chosen scroll region moved

A damage batch with two scroll regions was planned as one scroll plus text spans, leaving the second region shifted on the client. The scroll fast path now also requires rows outside its region to match the committed shadow or be covered by text damage, and falls back to a snapshot otherwise. The differential oracle now fails on any ANSI replay mismatch.
commit
86aa468f06cd8fb3af948c3eeb0c0d43af1cd1e5
author
brice · · 2026-10-02 12:15 UTC
parent
4bd8450
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
4 files · +188 -151
M ansi/scroll.go +33 -0
@@ -69,6 +69,13 @@ func canApplyScrollAgainst(frame CellSource, scroll Damage, damage []Damage, com
6969 }
7070 }
7171 }
72+ // The plan emits one scroll plus text/clear spans. Rows outside the chosen
73+ // region must therefore already match the committed shadow wherever damage
74+ // does not repaint them; another scroll region in the same batch moves rows
75+ // without text damage and must fall back to a snapshot.
76+ if !outsideScrollMatches(frame, scroll, damage, committed) {
77+ return false
78+ }
7279 switch frame := frame.(type) {
7380 case Frame:
7481 return canApplyDenseScrollAgainst(frame, scroll, damage, committed)
@@ -113,6 +120,32 @@ func canApplyDenseScrollAgainst(frame Frame, scroll Damage, damage []Damage, com
113120 return true
114121 }
115122
123+func outsideScrollMatches(frame CellSource, scroll Damage, damage []Damage, committed Frame) bool {
124+ dense, isDense := frame.(Frame)
125+ if pointer, ok := frame.(*Frame); ok {
126+ dense, isDense = *pointer, true
127+ }
128+ columns := frame.Columns()
129+ for y := range frame.Rows() {
130+ if y >= scroll.Y && y < scroll.Y+scroll.Height {
131+ continue
132+ }
133+ if isDense && core.RowsEqualAt(committed, y, dense, y) {
134+ continue
135+ }
136+ for x := range columns {
137+ committedCell, frameCell := committed.Cell(x, y), frame.Cell(x, y)
138+ if committedCell == frameCell || committedCell.Equal(frameCell) {
139+ continue
140+ }
141+ if !damageCoversCell(damage, x, y) {
142+ return false
143+ }
144+ }
145+ }
146+ return true
147+}
148+
116149 func scrollRetainedRows(scroll Damage) (start, end, offset int) {
117150 if scroll.Kind == DamageScrollDown {
118151 return scroll.Y + scroll.Count, scroll.Y + scroll.Height, -scroll.Count
@@ -69,6 +69,13 @@ func canApplyScrollAgainst(frame CellSource, scroll Damage, damage []Damage, com
69 }69 }
70 }70 }
71 }71 }
72+ // The plan emits one scroll plus text/clear spans. Rows outside the chosen
73+ // region must therefore already match the committed shadow wherever damage
74+ // does not repaint them; another scroll region in the same batch moves rows
75+ // without text damage and must fall back to a snapshot.
76+ if !outsideScrollMatches(frame, scroll, damage, committed) {
77+ return false
78+ }
72 switch frame := frame.(type) {79 switch frame := frame.(type) {
73 case Frame:80 case Frame:
74 return canApplyDenseScrollAgainst(frame, scroll, damage, committed)81 return canApplyDenseScrollAgainst(frame, scroll, damage, committed)
@@ -113,6 +120,32 @@ func canApplyDenseScrollAgainst(frame Frame, scroll Damage, damage []Damage, com
113 return true120 return true
114 }121 }
115 122
123+func outsideScrollMatches(frame CellSource, scroll Damage, damage []Damage, committed Frame) bool {
124+ dense, isDense := frame.(Frame)
125+ if pointer, ok := frame.(*Frame); ok {
126+ dense, isDense = *pointer, true
127+ }
128+ columns := frame.Columns()
129+ for y := range frame.Rows() {
130+ if y >= scroll.Y && y < scroll.Y+scroll.Height {
131+ continue
132+ }
133+ if isDense && core.RowsEqualAt(committed, y, dense, y) {
134+ continue
135+ }
136+ for x := range columns {
137+ committedCell, frameCell := committed.Cell(x, y), frame.Cell(x, y)
138+ if committedCell == frameCell || committedCell.Equal(frameCell) {
139+ continue
140+ }
141+ if !damageCoversCell(damage, x, y) {
142+ return false
143+ }
144+ }
145+ }
146+ return true
147+}
148+
116 func scrollRetainedRows(scroll Damage) (start, end, offset int) {149 func scrollRetainedRows(scroll Damage) (start, end, offset int) {
117 if scroll.Kind == DamageScrollDown {150 if scroll.Kind == DamageScrollDown {
118 return scroll.Y + scroll.Count, scroll.Y + scroll.Height, -scroll.Count151 return scroll.Y + scroll.Count, scroll.Y + scroll.Height, -scroll.Count
A ansi/scroll_multi_region_test.go +54 -0
@@ -0,0 +1,54 @@
1+package ansi_test
2+
3+import (
4+ "testing"
5+
6+ vt "github.com/bnema/vev-vt"
7+ "github.com/bnema/vev-vt/ansi"
8+ core "github.com/bnema/vev-vt/core"
9+)
10+
11+// Two scroll regions in one damage batch cannot be expressed as one scroll
12+// plus text spans; the renderer must still reproduce the source exactly.
13+func TestTwoScrollRegionsInOneBatchReplayExactly(t *testing.T) {
14+ for _, sourceKind := range []string{"screen", "frame", "pointer"} {
15+ t.Run(sourceKind, func(t *testing.T) {
16+ s := vt.NewScreen(10, 8)
17+ s.Write([]byte("\x1b[1;1Ha0\r\na1\r\na2\r\na3\r\nb4\r\nb5\r\nb6\r\nb7"))
18+ r := ansi.New(ansi.Capabilities{})
19+ replay := vt.NewScreen(10, 8)
20+ draw := func() {
21+ var source core.CellSource = s
22+ if sourceKind != "screen" {
23+ frame := core.NewFrame(10, 8)
24+ for y := range 8 {
25+ for x := range 10 {
26+ frame.Set(x, y, s.Cell(x, y))
27+ }
28+ }
29+ source = frame
30+ if sourceKind == "pointer" {
31+ source = &frame
32+ }
33+ }
34+ prepared, err := r.Prepare(source, s.Damage(), false)
35+ if err != nil {
36+ t.Fatal(err)
37+ }
38+ prepared.Commit()
39+ replay.Write(prepared.Bytes())
40+ s.ClearDamage()
41+ }
42+ draw()
43+ s.Write([]byte("\x1b[1;4r\x1b[4;1H\nX\x1b[5;8r\x1b[8;1H\n\nY\x1b[r"))
44+ draw()
45+ for y := range 8 {
46+ for x := range 10 {
47+ if want, got := s.Cell(x, y), replay.Cell(x, y); want.Rune != got.Rune {
48+ t.Fatalf("cell (%d,%d) = %q, want %q", x, y, got.Rune, want.Rune)
49+ }
50+ }
51+ }
52+ })
53+ }
54+}
@@ -0,0 +1,54 @@
1+package ansi_test
2+
3+import (
4+ "testing"
5+
6+ vt "github.com/bnema/vev-vt"
7+ "github.com/bnema/vev-vt/ansi"
8+ core "github.com/bnema/vev-vt/core"
9+)
10+
11+// Two scroll regions in one damage batch cannot be expressed as one scroll
12+// plus text spans; the renderer must still reproduce the source exactly.
13+func TestTwoScrollRegionsInOneBatchReplayExactly(t *testing.T) {
14+ for _, sourceKind := range []string{"screen", "frame", "pointer"} {
15+ t.Run(sourceKind, func(t *testing.T) {
16+ s := vt.NewScreen(10, 8)
17+ s.Write([]byte("\x1b[1;1Ha0\r\na1\r\na2\r\na3\r\nb4\r\nb5\r\nb6\r\nb7"))
18+ r := ansi.New(ansi.Capabilities{})
19+ replay := vt.NewScreen(10, 8)
20+ draw := func() {
21+ var source core.CellSource = s
22+ if sourceKind != "screen" {
23+ frame := core.NewFrame(10, 8)
24+ for y := range 8 {
25+ for x := range 10 {
26+ frame.Set(x, y, s.Cell(x, y))
27+ }
28+ }
29+ source = frame
30+ if sourceKind == "pointer" {
31+ source = &frame
32+ }
33+ }
34+ prepared, err := r.Prepare(source, s.Damage(), false)
35+ if err != nil {
36+ t.Fatal(err)
37+ }
38+ prepared.Commit()
39+ replay.Write(prepared.Bytes())
40+ s.ClearDamage()
41+ }
42+ draw()
43+ s.Write([]byte("\x1b[1;4r\x1b[4;1H\nX\x1b[5;8r\x1b[8;1H\n\nY\x1b[r"))
44+ draw()
45+ for y := range 8 {
46+ for x := range 10 {
47+ if want, got := s.Cell(x, y), replay.Cell(x, y); want.Rune != got.Rune {
48+ t.Fatalf("cell (%d,%d) = %q, want %q", x, y, got.Rune, want.Rune)
49+ }
50+ }
51+ }
52+ })
53+ }
54+}
M oracle_test.go +4 -18
@@ -78,8 +78,6 @@ type oracleRun struct {
7878 h hash.Hash
7979 dump *bufio.Writer
8080 events []string
81-
82- replayMismatches int
8381 }
8482
8583 func (o *oracleRun) emit(format string, args ...any) {
@@ -467,12 +465,9 @@ func (o *oracleRun) render(step int) {
467465 }
468466 }
469467
470-// applyReplay feeds committed ANSI output to an independent VT and compares
471-// the visible grid with the source. Mismatches are known renderer defects on
472-// the baseline (for example two scroll regions in one damage batch), so they
473-// are hashed into the transcript instead of failing: a performance change must
474-// neither add nor remove one. The replay is then resynchronized from a full
475-// draw, matching the renderer's committed belief.
468+// applyReplay feeds committed ANSI output to an independent VT and requires
469+// the visible grid to match the source. This semantic check does not depend on
470+// the golden file.
476471 func (o *oracleRun) applyReplay(out []byte, step int) {
477472 s := o.screen
478473 if o.replay == nil || o.replay.Columns() != s.Columns() || o.replay.Rows() != s.Rows() {
@@ -483,15 +478,7 @@ func (o *oracleRun) applyReplay(out []byte, step int) {
483478 for x := range s.Columns() {
484479 want, got := s.Cell(x, y), o.replay.Cell(x, y)
485480 if want.Rune != got.Rune || want.Continuation != got.Continuation || !want.Style.Equal(got.Style) {
486- o.replayMismatches++
487- o.emit("replay-mismatch step %d at (%d,%d): got %s want %s", step, x, y, formatCell(got), formatCell(want))
488- o.replay = vt.NewScreen(s.Columns(), s.Rows())
489- full, err := ansi.New(ansi.Capabilities{}).Draw(s, []core.Damage{core.FullRedraw()})
490- if err != nil {
491- o.t.Fatalf("seed %d: resync draw: %v", o.sc.seed, err)
492- }
493- o.replay.Write(full)
494- return
481+ o.t.Fatalf("seed %d step %d: ANSI replay mismatch at (%d,%d): got %s want %s", o.sc.seed, step, x, y, formatCell(got), formatCell(want))
495482 }
496483 }
497484 }
@@ -569,7 +556,6 @@ func runOracleScenario(t *testing.T, idx int) string {
569556 digests = append(digests, fmt.Sprintf("%02d/%03d %s", idx, step, hex.EncodeToString(o.h.Sum(nil))[:24]))
570557 }
571558 }
572- digests = append(digests, fmt.Sprintf("%02d replay-mismatches=%d", idx, o.replayMismatches))
573559 return strings.Join(digests, "\n")
574560 }
575561
@@ -78,8 +78,6 @@ type oracleRun struct {
78 h hash.Hash78 h hash.Hash
79 dump *bufio.Writer79 dump *bufio.Writer
80 events []string80 events []string
81-
82- replayMismatches int
83 }81 }
84 82
85 func (o *oracleRun) emit(format string, args ...any) {83 func (o *oracleRun) emit(format string, args ...any) {
@@ -467,12 +465,9 @@ func (o *oracleRun) render(step int) {
467 }465 }
468 }466 }
469 467
470-// applyReplay feeds committed ANSI output to an independent VT and compares468+// applyReplay feeds committed ANSI output to an independent VT and requires
471-// the visible grid with the source. Mismatches are known renderer defects on469+// the visible grid to match the source. This semantic check does not depend on
472-// the baseline (for example two scroll regions in one damage batch), so they470+// the golden file.
473-// are hashed into the transcript instead of failing: a performance change must
474-// neither add nor remove one. The replay is then resynchronized from a full
475-// draw, matching the renderer's committed belief.
476 func (o *oracleRun) applyReplay(out []byte, step int) {471 func (o *oracleRun) applyReplay(out []byte, step int) {
477 s := o.screen472 s := o.screen
478 if o.replay == nil || o.replay.Columns() != s.Columns() || o.replay.Rows() != s.Rows() {473 if o.replay == nil || o.replay.Columns() != s.Columns() || o.replay.Rows() != s.Rows() {
@@ -483,15 +478,7 @@ func (o *oracleRun) applyReplay(out []byte, step int) {
483 for x := range s.Columns() {478 for x := range s.Columns() {
484 want, got := s.Cell(x, y), o.replay.Cell(x, y)479 want, got := s.Cell(x, y), o.replay.Cell(x, y)
485 if want.Rune != got.Rune || want.Continuation != got.Continuation || !want.Style.Equal(got.Style) {480 if want.Rune != got.Rune || want.Continuation != got.Continuation || !want.Style.Equal(got.Style) {
486- o.replayMismatches++481+ o.t.Fatalf("seed %d step %d: ANSI replay mismatch at (%d,%d): got %s want %s", o.sc.seed, step, x, y, formatCell(got), formatCell(want))
487- o.emit("replay-mismatch step %d at (%d,%d): got %s want %s", step, x, y, formatCell(got), formatCell(want))
488- o.replay = vt.NewScreen(s.Columns(), s.Rows())
489- full, err := ansi.New(ansi.Capabilities{}).Draw(s, []core.Damage{core.FullRedraw()})
490- if err != nil {
491- o.t.Fatalf("seed %d: resync draw: %v", o.sc.seed, err)
492- }
493- o.replay.Write(full)
494- return
495 }482 }
496 }483 }
497 }484 }
@@ -569,7 +556,6 @@ func runOracleScenario(t *testing.T, idx int) string {
569 digests = append(digests, fmt.Sprintf("%02d/%03d %s", idx, step, hex.EncodeToString(o.h.Sum(nil))[:24]))556 digests = append(digests, fmt.Sprintf("%02d/%03d %s", idx, step, hex.EncodeToString(o.h.Sum(nil))[:24]))
570 }557 }
571 }558 }
572- digests = append(digests, fmt.Sprintf("%02d replay-mismatches=%d", idx, o.replayMismatches))
573 return strings.Join(digests, "\n")559 return strings.Join(digests, "\n")
574 }560 }
575 561
M testdata/oracle/golden.txt +97 -133
@@ -1,29 +1,27 @@
11 00/019 55a72c4c8d1c1a0e00550a15
22 00/039 4beaddfc77e4110f80524b38
33 00/059 a5c2085be8baec4f551edd92
4-00/079 e0ab87b780d0639fe8b96d12
5-00/099 b079ef26a0bb72ced471f499
6-00/119 f1ab642fcb4bfd4b3a7a03e6
7-00/139 27629663856dfa65244e102d
8-00/159 b3aaf605acd5327d41968195
9-00/179 9bb85c80ee152ab540d7ddab
10-00/199 6b4469404f496d823ad9e125
11-00/219 729e470dc8268f158fd3fe65
12-00/239 4c7ace24a712cd597c20d2e4
13-00 replay-mismatches=1
4+00/079 8bb94cfe1ed22a49a4a87e02
5+00/099 d575a05b8d36aabeed57f4bc
6+00/119 40726b31f079ddb1206aad61
7+00/139 22efecf809e0cb839cb073d5
8+00/159 543183f4a516938dc9348a4f
9+00/179 4e20ff78f152fcbe5137d54b
10+00/199 7037d94f724ee16e55d96bed
11+00/219 6fbae174dc09053ec6f6bd07
12+00/239 b9cc6a0d303e3b79c13f8d19
1413 01/019 92d98f04143705d463e00d5a
1514 01/039 0c887b0db21e564acbeb140b
1615 01/059 4a1d21d32fb2e2dbb8a0a048
1716 01/079 8c494398433b3f3292105b68
1817 01/099 878ad5680b0b65efb2788c78
1918 01/119 eba0201db6d4a0a544c7bc26
20-01/139 c366adc9bda774bbe629aa7f
21-01/159 82c5bf666042fdf83dea91dc
22-01/179 6c8e00e2c5851df5fc4d4531
23-01/199 e02a755cc1869e5c2135b076
24-01/219 d641dd26646f5cd455575cb9
25-01/239 7b59cd0114a7b8a5d044dd5b
26-01 replay-mismatches=1
19+01/139 ce963cc5a23ffa5df867e30f
20+01/159 955c009f90fc40447bef222f
21+01/179 63624eaa51d667926773f7d6
22+01/199 742853e0e88b47c1d665f98b
23+01/219 c171d410ea73dbdc71607520
24+01/239 d009dd0730df60baf58c58a2
2725 02/019 3e82372b6cb2ef730fbd402c
2826 02/039 398deed5e521d0788101775d
2927 02/059 21401dc4b8bee3c8c6dce2ff
@@ -36,7 +34,6 @@
3634 02/199 73e6310d3e4c2a02a0aac70f
3735 02/219 38ffab48e284151fed6243a1
3836 02/239 dee6444cff6f5bdda9f190a1
39-02 replay-mismatches=0
4037 03/019 23e37ad503fc5be744f00967
4138 03/039 ec34adbb74097df59cc75e32
4239 03/059 85c664d4a3ad1d484c5118b3
@@ -47,9 +44,8 @@
4744 03/159 dfd6d2abbad3a1be1e3d6ecc
4845 03/179 99e59e60677d6d5ec88631a0
4946 03/199 8fe8fc36ce8901c3bf214f23
50-03/219 20b7f922c656a2e197d4589e
51-03/239 045ae146ae096692a82f7211
52-03 replay-mismatches=1
47+03/219 a27e68abb075486983744a02
48+03/239 5eb1a5f31fda06ffcf7e74b8
5349 04/019 4faa96c672855d38d5f009b9
5450 04/039 45daf6da341e0be752176143
5551 04/059 b210cfeb355ca92703eb5a7d
@@ -62,7 +58,6 @@
6258 04/199 33b567344c5ba4cbb11073b7
6359 04/219 98d41d64e511dc4f992f9ddd
6460 04/239 a873589f7cbf01ab97712424
65-04 replay-mismatches=0
6661 05/019 68d508ff98ffe9c97d491512
6762 05/039 22833aa6ac5590fd5c51a10c
6863 05/059 f37316a5530d28ea4d386599
@@ -75,7 +70,6 @@
7570 05/199 cb964d13d6ed459f435eca69
7671 05/219 945a552afa3fc038c0d0d49d
7772 05/239 bb39be7fce9c2c1f3a7dd6a3
78-05 replay-mismatches=0
7973 06/019 9f70eb84e027a0da12cf789e
8074 06/039 fd1b4d60360d797d01dcf980
8175 06/059 e957cf36ed0da231cc781732
@@ -88,7 +82,6 @@
8882 06/199 bcad1567aa6b13757337ca65
8983 06/219 6d9e62599ea93901fbb98bda
9084 06/239 12ad1caedd5346ab013bd936
91-06 replay-mismatches=0
9285 07/019 771e7f8f79ce9d77f0bb56ff
9386 07/039 031ed4ce8ac59a36ac7c1365
9487 07/059 2516663f39582c63aa218218
@@ -99,9 +92,8 @@
9992 07/159 ac33e3c1365cc8c449a0d77b
10093 07/179 92874af432d8106e7d39dd73
10194 07/199 6a9cdfd7f92ce4e2fc62bc5d
102-07/219 b3f6403504ede15a9d1f283b
103-07/239 a38515a32d34854dc6e2f4f7
104-07 replay-mismatches=1
95+07/219 40b3fb6542a9c48e6b1d5d03
96+07/239 10ecce8a3a41880bd86674e5
10597 08/019 29e2816bc5d015ce2d23c05c
10698 08/039 2a86fe7ff64d840cd8569737
10799 08/059 51239ba60dc3b8f1b5078c45
@@ -114,7 +106,6 @@
114106 08/199 52482d634ba2b06bf34693dd
115107 08/219 1b3e53ed97faccd2061b9e26
116108 08/239 c4ea1ea89908641b93e41266
117-08 replay-mismatches=0
118109 09/019 4c119ea37ab5f5aaf7ab50f3
119110 09/039 a1efea7a141d9b5481317d21
120111 09/059 a0cce6141ccb877fe5e71f53
@@ -127,7 +118,6 @@
127118 09/199 369339d7370f38fcc22a12b9
128119 09/219 b9eec1e382e0500d5f1edde7
129120 09/239 c99a2183f2174d1e39502356
130-09 replay-mismatches=0
131121 10/019 f1b345ef33635fe6028f81b4
132122 10/039 bb0ee5ddb6ba0461e8747c48
133123 10/059 7b0a1d3c4fcef2b20317695f
@@ -140,33 +130,30 @@
140130 10/199 b9f0bdae9c7a31f6ca8bcbe6
141131 10/219 14e56199cd1442fc6793d65b
142132 10/239 8c43ab2d5bde3b2fda977ddd
143-10 replay-mismatches=0
144-11/019 e3eb02d62746d50757d63d18
145-11/039 070fa14e017eb9ba3056672d
146-11/059 8b016d3845f5d47e91b1826b
147-11/079 75ce3f04d3082bc4788d6c96
148-11/099 2b7cf678237f6988de3396a3
149-11/119 230ebcd9a41d473aaed1896e
150-11/139 a0473a1fc49d7c12f20b41be
151-11/159 b9ef5849eaeefbe486770b76
152-11/179 b3c43da50034693c385b844b
153-11/199 7145d045e0724186ce73059a
154-11/219 ee6f5fc91e84ee8214060439
155-11/239 f4307d6e12b1cd2db37a8032
156-11 replay-mismatches=0
133+11/019 c93975e62fac424f33e30dbd
134+11/039 d346876e1b164d0cd0627c43
135+11/059 01e960a0c2e2ff6e67700683
136+11/079 1dc0f11f0abb3b5fc9f24e7c
137+11/099 08d0c2c91fc7f7b8bc077073
138+11/119 c25c0212819cece6d0639b16
139+11/139 05f7ae1225aab0d0cf837327
140+11/159 0b421f3d3607eed3fdd06a22
141+11/179 dd0db71df59ff3782d710188
142+11/199 8f76f1ddbcb47375a2539363
143+11/219 82ad6598f848e6ed7ab84f16
144+11/239 581acb7b5585a2cb9127aabe
157145 12/019 4fade3921f5735064355eec1
158-12/039 e2aab8e88f7241073e73eb05
159-12/059 2b1492eeb901a30dddcecfea
160-12/079 809ab3f1339fe2c10da81dc6
161-12/099 09759c1960ee25243130cec7
162-12/119 d40b61390be6b1ade0fc9798
163-12/139 dd23c4487248a1236597baf8
164-12/159 6ccc55f91c960571ebc0f2dc
165-12/179 2165c2c3b2a0fd7a597c1251
166-12/199 679db69d3aee6356dafac627
167-12/219 eff11bcec70127843617c651
168-12/239 af6d8b16a1eb290229dd6000
169-12 replay-mismatches=1
146+12/039 4752e78884537c49b3a981a6
147+12/059 8d24a113e07ffe7f2ee85d92
148+12/079 b664d979cc6ff5402f46feb5
149+12/099 71a4e7544cc95fed335b866a
150+12/119 f3e962c48f6477dc9e36cba6
151+12/139 88ad314b543b01991001d0ff
152+12/159 c496c6f531b311b533c5d8dc
153+12/179 902d77ceb40bc233976eab25
154+12/199 ae45efdbdedea0732816ddd9
155+12/219 a9b16863b78bef550c8f3a45
156+12/239 42f9034b8b4fd71772b18bb3
170157 13/019 ef8a3432b61607340356a764
171158 13/039 4e823b712c6aab07bcd5764e
172159 13/059 90b7e616d2c528faeee0f72b
@@ -179,7 +166,6 @@
179166 13/199 84a14ed35e312f14e0c4d220
180167 13/219 8382c4d6025f22cddd967535
181168 13/239 4e3ac44cff6dfa7d7a843378
182-13 replay-mismatches=0
183169 14/019 747d54cdf75a492242809318
184170 14/039 e6530a9282bd6095e15a9677
185171 14/059 715de56023e1afc30c1feea1
@@ -192,20 +178,18 @@
192178 14/199 f5992df3d18c885bcaab4496
193179 14/219 38e1a9fe90723b701c438464
194180 14/239 c90fb86719f7e4613e3720c2
195-14 replay-mismatches=0
196181 15/019 95e07748c709fa34a80ceff7
197-15/039 4186ba13b89b2952cb8407b1
198-15/059 e113b092eeaeb7ba23f36f0b
199-15/079 c9ad53bbc38faf68af448dbe
200-15/099 6207b08ba91d6e0c93f27540
201-15/119 edffb952f657ba998d07de73
202-15/139 5c874878a9a518b08627f52d
203-15/159 e7c63b49c6f3ebb122ab821b
204-15/179 edb533ed1dcf2d238f7db6a9
205-15/199 80fa50afb7b21ddcc958e13e
206-15/219 f602f7cb0510d54ab8c94ff9
207-15/239 3ac7cd4affba36e038a2254b
208-15 replay-mismatches=2
182+15/039 17f763741791d1ce05af5d23
183+15/059 91afaa9890df8d7e1704a824
184+15/079 f7b444177e7de8fbd6ffb68c
185+15/099 c1a6b419a58119e00553b73b
186+15/119 e087eec2596edb2fbb67b309
187+15/139 2f6949b8d82d85d0ed0e1945
188+15/159 d870e1d84bf822c53958e42e
189+15/179 e61ad13af00d508f72ca02e9
190+15/199 c2e3de3f26a36097e8df792e
191+15/219 6d50c5b64eca9d2ece1e3556
192+15/239 6c7b58a0ed8591a241ab438d
209193 16/019 4314babccb7675abd6328c32
210194 16/039 3e6ee1b339dab4ff5e0c8b34
211195 16/059 1afd8504d6a0be4d6cc9c3c3
@@ -218,7 +202,6 @@
218202 16/199 210f0c4ad73131d2b465b362
219203 16/219 4b62676c69410e9b6f9d8f26
220204 16/239 72f70f009e426f88b33ebdae
221-16 replay-mismatches=0
222205 17/019 1a06602479d8e795ee95c965
223206 17/039 c7e7eb54ee63d9e7e23ceaca
224207 17/059 51c34ba1a80d55b1f9ae42fa
@@ -231,7 +214,6 @@
231214 17/199 55b35801df62b3250963613d
232215 17/219 1cb11bbb2c5dd8995094be53
233216 17/239 6a146a19d7c534c4766e98f8
234-17 replay-mismatches=0
235217 18/019 a1d2576637f54892892ea0b4
236218 18/039 4415a2923a28b75a5aa0dbfb
237219 18/059 2bac49c23f1c09f170c68dc2
@@ -244,20 +226,18 @@
244226 18/199 c523b55eb720c065fc6134ac
245227 18/219 0f367277325b630ce5bc634f
246228 18/239 e04b873c6820a46bfd2f4873
247-18 replay-mismatches=0
248229 19/019 2db955914f2e068e72cf8dfa
249230 19/039 ec344560f2bb7de5f25fdb78
250231 19/059 d1a41ae321f1449d256cf19d
251-19/079 c0d8a7ed784bd9d278c61bfa
252-19/099 f91e7a807eea1aac3f05da1f
253-19/119 36d47e23f93682f8f8bd720b
254-19/139 b227a962815dfd349d06722f
255-19/159 5552419605856137ee5e3384
256-19/179 0c7cf6585dcbaa42d05758c1
257-19/199 ebcee2469216bd045f79d9a7
258-19/219 d5bdec7e45121f8f757c12df
259-19/239 ae4abbf3362cbcba26878acd
260-19 replay-mismatches=1
232+19/079 8faf99af914b67a155d5ec77
233+19/099 4e1d07972fad7ea30ae47405
234+19/119 25c71afea29fbd715e2a4475
235+19/139 c6aa86c0ecbc79508ca55d21
236+19/159 f4f99d1ac2eb88ec22a12895
237+19/179 48e52a38bcee4b40556c3ad5
238+19/199 0000d0003982f1b02a05c031
239+19/219 8a3fe5821bfca2452396d384
240+19/239 f80259caca42e4bec5999fbd
261241 20/019 3c776bd6d460be5f6bcd060e
262242 20/039 ef65b757bd137499a352d5ae
263243 20/059 1cfcab4ffbc08c619e97bcd5
@@ -266,11 +246,10 @@
266246 20/119 cb7f9cf61ef176f01706ac77
267247 20/139 f9edefe5603a815455b563ff
268248 20/159 cf8862d058a774e0fdb18628
269-20/179 82daa9b9d7f4edc82a424a4a
270-20/199 fe78853df2a403308904f8e2
271-20/219 0895c29599a30db493020dd2
272-20/239 0e2310234476bea5dbb44cf0
273-20 replay-mismatches=1
249+20/179 abfad109898597588888b96d
250+20/199 a619ae4048d75c8eb123bc03
251+20/219 e97c8dda4681c61c2597a6b6
252+20/239 d3c1276233a20ff99b540e84
274253 21/019 357ece3eab75324d3823a6a4
275254 21/039 fe4501bedc7017bc40ff0509
276255 21/059 c97dc13dbcd996b58361777e
@@ -280,10 +259,9 @@
280259 21/139 034216a3e7d38b221d5a8811
281260 21/159 adc62b539970ad3123cb4175
282261 21/179 0323505afc602891ba38d7ac
283-21/199 577472eed259f3abc0aaa526
284-21/219 5d1dc3faa423707ac2ca4ba7
285-21/239 068abdef9483e1760da84d41
286-21 replay-mismatches=1
262+21/199 2c8eb6ab3e644c91102d47c5
263+21/219 c88b6d036e56dd9bf2772e84
264+21/239 1541f980765b4f40cd846615
287265 22/019 6fc626ac7796049f3457a9a7
288266 22/039 e9214d74742e6ab1a1c8baf0
289267 22/059 72e63b2a0100e4153851a23d
@@ -296,7 +274,6 @@
296274 22/199 9fe1387f10258c696fd9e783
297275 22/219 3009560abe632e04450f7f41
298276 22/239 fe8d129db62a73ae9b9650bf
299-22 replay-mismatches=0
300277 23/019 20cb94d03695ad09763e03d2
301278 23/039 6c18ee020345a7699fd75494
302279 23/059 f85c5ecebab82f1126f3c964
@@ -309,20 +286,18 @@
309286 23/199 ddee2d89e0897e90f9a6df78
310287 23/219 65e4440830b9f98e48fe3a11
311288 23/239 e8ca9cf0699b2c6333e0cb3e
312-23 replay-mismatches=0
313289 24/019 b7fdbacf57cb0af4d47225ba
314-24/039 2a75c514d5b6525aaae38b3c
315-24/059 25cfe1b7ea38dca8b287dfcb
316-24/079 f26ad4606c3aa14fdd999af4
317-24/099 3e2f4c94e77ee245d7b1feb2
318-24/119 17ea49879ca006a1a9cc6f7a
319-24/139 90243c3b758308f0dd7982d3
320-24/159 c734adf4c419ccaccb7b344b
321-24/179 f4f0b4818a87d2d735361f5b
322-24/199 16acbd765f02caece9941217
323-24/219 a4605530cb75474769714cf4
324-24/239 ea3ffdb6ec8b58fe625b928a
325-24 replay-mismatches=1
290+24/039 a6c7f740d5d06f67495f9e33
291+24/059 43a01382b5ac0c1ae9bed9cc
292+24/079 b1920c5092ae3660a5d16b80
293+24/099 6c5e0cce477b33f47b106ea3
294+24/119 6d6f085ab19ecfad1a4a2120
295+24/139 9547bae694f87fb2c2b3d311
296+24/159 4acc87c8a3480147416549a0
297+24/179 e0f7f82de3ea5bbb6bc4c259
298+24/199 accc2199dff19d266f855064
299+24/219 a763e81bff4e145b46922cf3
300+24/239 5299c46a14f4fa125c9b8611
326301 25/019 eb73f8f3bb46422a6a12fc8f
327302 25/039 823c96945f71196e67f10f65
328303 25/059 c04f006b9f600ecd075cec6a
@@ -335,7 +310,6 @@
335310 25/199 4b7c1cd9781ec41bf596b764
336311 25/219 ad62688c776574ab5c442de7
337312 25/239 22e025d483651540c55002c6
338-25 replay-mismatches=0
339313 26/019 122c0cce3cc0ece13ce6f89a
340314 26/039 0999ef9b5da72bc75cef9d49
341315 26/059 2efdbf6da4b726f10f2878d1
@@ -348,7 +322,6 @@
348322 26/199 5f21c27026ba98b0a9d5d51c
349323 26/219 2fcb984adf0b347e0da88d33
350324 26/239 200f40ed44f86ce04857c1ef
351-26 replay-mismatches=0
352325 27/019 ee2c010c41b9f0e5f70ce2b3
353326 27/039 91ab08fb270466abbfb06c54
354327 27/059 2e73fe488420a5de3866e7e3
@@ -361,20 +334,18 @@
361334 27/199 85bc90436e42fca40bd64d3c
362335 27/219 f0dbe3da68c8dd144c3dd9b7
363336 27/239 214002b3d936e2fe396aae01
364-27 replay-mismatches=0
365337 28/019 3ee1c2f031af3ad67ae50ebc
366338 28/039 07508b3af21ec20fadeefe55
367339 28/059 dfa63544d3d6a817a9212067
368-28/079 1855612e92d140c47b8abd1d
369-28/099 bcb387773cfd286bf68b7b7d
370-28/119 1f742786b7a0328e4e513984
371-28/139 491e0249e093af7d1fa703e3
372-28/159 7e72e1e6ffbd2f8191ff7116
373-28/179 daa22f39fc629726df0fd80c
374-28/199 ad54c46914aa19908c0a9880
375-28/219 54e180efdd3796a13c1c7670
376-28/239 8f0e0e94c590745fc2dc7678
377-28 replay-mismatches=1
340+28/079 237f6a260f672d353323e622
341+28/099 3fa387d797ef0467f5e6e7e3
342+28/119 e25b9e12f6c5b3b03510cc14
343+28/139 1740ba1423fde72696b1cb5f
344+28/159 087e829214051615d334f3ef
345+28/179 86a425ae6b5b0e26b2d91ade
346+28/199 38502b27dac76ac25e7d8b3b
347+28/219 407ae66e6aa5fd9602e5e5ce
348+28/239 b2630d52745798f40a5a034d
378349 29/019 72e981fc506bfdd3bbf15c37
379350 29/039 8c46bcf213fe0e9cf159a7d2
380351 29/059 213c8dd3d5bcda3abb11ab05
@@ -386,8 +357,7 @@
386357 29/179 afb819e69c5c53d51d49d446
387358 29/199 78df663b24d8507a469a7959
388359 29/219 e40592fde61b5e14bf73242a
389-29/239 9500a168ffd9142d6bdbde5a
390-29 replay-mismatches=0
360+29/239 b6629ebed5f6c79374cf4cb8
391361 30/019 ea74787caee42ed3665575ed
392362 30/039 91b5e5afa5d3bb06b087f6ad
393363 30/059 ab536abe78f0cf27cdf94a75
@@ -400,7 +370,6 @@
400370 30/199 f1fe2d3081c9ccfc7413e3a9
401371 30/219 5c1dad4fffc15226a5eebe51
402372 30/239 966ff4c469452f7951326c5e
403-30 replay-mismatches=0
404373 31/019 869af9273a068555a7c65e06
405374 31/039 af9002bdf228a2e1f034df74
406375 31/059 375fd592eea7fdb3ce4a7563
@@ -413,7 +382,6 @@
413382 31/199 1c76b93d064c496485782148
414383 31/219 8a23244f3e0b25b774aaabbb
415384 31/239 6b47e6b3998cf340d47f2dc9
416-31 replay-mismatches=0
417385 32/019 ed11b0c6e02dfce865d49934
418386 32/039 bd3bbe698e10adf1f5fbc490
419387 32/059 fb530e83cb69ec498ccd32a7
@@ -426,7 +394,6 @@
426394 32/199 2c188342e677e30c8ffe7f9e
427395 32/219 7fc717e4fbfd57748ab342e3
428396 32/239 506a3d22b3e2ff760873e0fb
429-32 replay-mismatches=0
430397 33/019 75e34d5589c8f836a06d090e
431398 33/039 372c230667e378656b2af4ff
432399 33/059 938b86084dbb06afa4454b27
@@ -439,7 +406,6 @@
439406 33/199 a269fac1fd59ac746cdcc3ed
440407 33/219 8efc32f7b432b011f6862afb
441408 33/239 360719a27cebdd0863b2e775
442-33 replay-mismatches=0
443409 34/019 93dcae1fc2bfd6779aff1aff
444410 34/039 e4c849c2eb75db26ab3e4a69
445411 34/059 f44f95efd2e73205143c656c
@@ -452,17 +418,15 @@
452418 34/199 d60cdab9e926b1a975ab7c68
453419 34/219 70311db1c213b30d8622a677
454420 34/239 16c8a61f803eef432762550b
455-34 replay-mismatches=0
456421 35/019 6ce6075f205b75f864a11ca6
457422 35/039 8375248e74a353fc4ec62d73
458423 35/059 794e546c0d3346dc3965043f
459424 35/079 f4a4a12dd0c59cfa3a7036b4
460425 35/099 a424a229392a35da8d937062
461-35/119 28415d77a2772ddc9ff46361
462-35/139 b142770cfec4946c445f1925
463-35/159 a2c6d28bb5442fa733cf8ea3
464-35/179 0c4f1446420ee3280f18090c
465-35/199 d8ab4d4487ea3bb519574059
466-35/219 f3f1d026b78975accc285f57
467-35/239 a734eb4db0f69306dc7a5630
468-35 replay-mismatches=1
426+35/119 5e71329265c6c2ddfdebda4d
427+35/139 6aa980472b2f18fe51c96a53
428+35/159 c677d854790176770b89c39b
429+35/179 aa982fd9d111a2bfe2cd0342
430+35/199 ce9d070f4fa6d77de1426eca
431+35/219 a867713adf7f878aaac51716
432+35/239 336185b759391ae1b9650572
@@ -1,29 +1,27 @@
1 00/019 55a72c4c8d1c1a0e00550a151 00/019 55a72c4c8d1c1a0e00550a15
2 00/039 4beaddfc77e4110f80524b382 00/039 4beaddfc77e4110f80524b38
3 00/059 a5c2085be8baec4f551edd923 00/059 a5c2085be8baec4f551edd92
4-00/079 e0ab87b780d0639fe8b96d124+00/079 8bb94cfe1ed22a49a4a87e02
5-00/099 b079ef26a0bb72ced471f4995+00/099 d575a05b8d36aabeed57f4bc
6-00/119 f1ab642fcb4bfd4b3a7a03e66+00/119 40726b31f079ddb1206aad61
7-00/139 27629663856dfa65244e102d7+00/139 22efecf809e0cb839cb073d5
8-00/159 b3aaf605acd5327d419681958+00/159 543183f4a516938dc9348a4f
9-00/179 9bb85c80ee152ab540d7ddab9+00/179 4e20ff78f152fcbe5137d54b
10-00/199 6b4469404f496d823ad9e12510+00/199 7037d94f724ee16e55d96bed
11-00/219 729e470dc8268f158fd3fe6511+00/219 6fbae174dc09053ec6f6bd07
12-00/239 4c7ace24a712cd597c20d2e412+00/239 b9cc6a0d303e3b79c13f8d19
13-00 replay-mismatches=1
14 01/019 92d98f04143705d463e00d5a13 01/019 92d98f04143705d463e00d5a
15 01/039 0c887b0db21e564acbeb140b14 01/039 0c887b0db21e564acbeb140b
16 01/059 4a1d21d32fb2e2dbb8a0a04815 01/059 4a1d21d32fb2e2dbb8a0a048
17 01/079 8c494398433b3f3292105b6816 01/079 8c494398433b3f3292105b68
18 01/099 878ad5680b0b65efb2788c7817 01/099 878ad5680b0b65efb2788c78
19 01/119 eba0201db6d4a0a544c7bc2618 01/119 eba0201db6d4a0a544c7bc26
20-01/139 c366adc9bda774bbe629aa7f19+01/139 ce963cc5a23ffa5df867e30f
21-01/159 82c5bf666042fdf83dea91dc20+01/159 955c009f90fc40447bef222f
22-01/179 6c8e00e2c5851df5fc4d453121+01/179 63624eaa51d667926773f7d6
23-01/199 e02a755cc1869e5c2135b07622+01/199 742853e0e88b47c1d665f98b
24-01/219 d641dd26646f5cd455575cb923+01/219 c171d410ea73dbdc71607520
25-01/239 7b59cd0114a7b8a5d044dd5b24+01/239 d009dd0730df60baf58c58a2
26-01 replay-mismatches=1
27 02/019 3e82372b6cb2ef730fbd402c25 02/019 3e82372b6cb2ef730fbd402c
28 02/039 398deed5e521d0788101775d26 02/039 398deed5e521d0788101775d
29 02/059 21401dc4b8bee3c8c6dce2ff27 02/059 21401dc4b8bee3c8c6dce2ff
@@ -36,7 +34,6 @@
36 02/199 73e6310d3e4c2a02a0aac70f34 02/199 73e6310d3e4c2a02a0aac70f
37 02/219 38ffab48e284151fed6243a135 02/219 38ffab48e284151fed6243a1
38 02/239 dee6444cff6f5bdda9f190a136 02/239 dee6444cff6f5bdda9f190a1
39-02 replay-mismatches=0
40 03/019 23e37ad503fc5be744f0096737 03/019 23e37ad503fc5be744f00967
41 03/039 ec34adbb74097df59cc75e3238 03/039 ec34adbb74097df59cc75e32
42 03/059 85c664d4a3ad1d484c5118b339 03/059 85c664d4a3ad1d484c5118b3
@@ -47,9 +44,8 @@
47 03/159 dfd6d2abbad3a1be1e3d6ecc44 03/159 dfd6d2abbad3a1be1e3d6ecc
48 03/179 99e59e60677d6d5ec88631a045 03/179 99e59e60677d6d5ec88631a0
49 03/199 8fe8fc36ce8901c3bf214f2346 03/199 8fe8fc36ce8901c3bf214f23
50-03/219 20b7f922c656a2e197d4589e47+03/219 a27e68abb075486983744a02
51-03/239 045ae146ae096692a82f721148+03/239 5eb1a5f31fda06ffcf7e74b8
52-03 replay-mismatches=1
53 04/019 4faa96c672855d38d5f009b949 04/019 4faa96c672855d38d5f009b9
54 04/039 45daf6da341e0be75217614350 04/039 45daf6da341e0be752176143
55 04/059 b210cfeb355ca92703eb5a7d51 04/059 b210cfeb355ca92703eb5a7d
@@ -62,7 +58,6 @@
62 04/199 33b567344c5ba4cbb11073b758 04/199 33b567344c5ba4cbb11073b7
63 04/219 98d41d64e511dc4f992f9ddd59 04/219 98d41d64e511dc4f992f9ddd
64 04/239 a873589f7cbf01ab9771242460 04/239 a873589f7cbf01ab97712424
65-04 replay-mismatches=0
66 05/019 68d508ff98ffe9c97d49151261 05/019 68d508ff98ffe9c97d491512
67 05/039 22833aa6ac5590fd5c51a10c62 05/039 22833aa6ac5590fd5c51a10c
68 05/059 f37316a5530d28ea4d38659963 05/059 f37316a5530d28ea4d386599
@@ -75,7 +70,6 @@
75 05/199 cb964d13d6ed459f435eca6970 05/199 cb964d13d6ed459f435eca69
76 05/219 945a552afa3fc038c0d0d49d71 05/219 945a552afa3fc038c0d0d49d
77 05/239 bb39be7fce9c2c1f3a7dd6a372 05/239 bb39be7fce9c2c1f3a7dd6a3
78-05 replay-mismatches=0
79 06/019 9f70eb84e027a0da12cf789e73 06/019 9f70eb84e027a0da12cf789e
80 06/039 fd1b4d60360d797d01dcf98074 06/039 fd1b4d60360d797d01dcf980
81 06/059 e957cf36ed0da231cc78173275 06/059 e957cf36ed0da231cc781732
@@ -88,7 +82,6 @@
88 06/199 bcad1567aa6b13757337ca6582 06/199 bcad1567aa6b13757337ca65
89 06/219 6d9e62599ea93901fbb98bda83 06/219 6d9e62599ea93901fbb98bda
90 06/239 12ad1caedd5346ab013bd93684 06/239 12ad1caedd5346ab013bd936
91-06 replay-mismatches=0
92 07/019 771e7f8f79ce9d77f0bb56ff85 07/019 771e7f8f79ce9d77f0bb56ff
93 07/039 031ed4ce8ac59a36ac7c136586 07/039 031ed4ce8ac59a36ac7c1365
94 07/059 2516663f39582c63aa21821887 07/059 2516663f39582c63aa218218
@@ -99,9 +92,8 @@
99 07/159 ac33e3c1365cc8c449a0d77b92 07/159 ac33e3c1365cc8c449a0d77b
100 07/179 92874af432d8106e7d39dd7393 07/179 92874af432d8106e7d39dd73
101 07/199 6a9cdfd7f92ce4e2fc62bc5d94 07/199 6a9cdfd7f92ce4e2fc62bc5d
102-07/219 b3f6403504ede15a9d1f283b95+07/219 40b3fb6542a9c48e6b1d5d03
103-07/239 a38515a32d34854dc6e2f4f796+07/239 10ecce8a3a41880bd86674e5
104-07 replay-mismatches=1
105 08/019 29e2816bc5d015ce2d23c05c97 08/019 29e2816bc5d015ce2d23c05c
106 08/039 2a86fe7ff64d840cd856973798 08/039 2a86fe7ff64d840cd8569737
107 08/059 51239ba60dc3b8f1b5078c4599 08/059 51239ba60dc3b8f1b5078c45
@@ -114,7 +106,6 @@
114 08/199 52482d634ba2b06bf34693dd106 08/199 52482d634ba2b06bf34693dd
115 08/219 1b3e53ed97faccd2061b9e26107 08/219 1b3e53ed97faccd2061b9e26
116 08/239 c4ea1ea89908641b93e41266108 08/239 c4ea1ea89908641b93e41266
117-08 replay-mismatches=0
118 09/019 4c119ea37ab5f5aaf7ab50f3109 09/019 4c119ea37ab5f5aaf7ab50f3
119 09/039 a1efea7a141d9b5481317d21110 09/039 a1efea7a141d9b5481317d21
120 09/059 a0cce6141ccb877fe5e71f53111 09/059 a0cce6141ccb877fe5e71f53
@@ -127,7 +118,6 @@
127 09/199 369339d7370f38fcc22a12b9118 09/199 369339d7370f38fcc22a12b9
128 09/219 b9eec1e382e0500d5f1edde7119 09/219 b9eec1e382e0500d5f1edde7
129 09/239 c99a2183f2174d1e39502356120 09/239 c99a2183f2174d1e39502356
130-09 replay-mismatches=0
131 10/019 f1b345ef33635fe6028f81b4121 10/019 f1b345ef33635fe6028f81b4
132 10/039 bb0ee5ddb6ba0461e8747c48122 10/039 bb0ee5ddb6ba0461e8747c48
133 10/059 7b0a1d3c4fcef2b20317695f123 10/059 7b0a1d3c4fcef2b20317695f
@@ -140,33 +130,30 @@
140 10/199 b9f0bdae9c7a31f6ca8bcbe6130 10/199 b9f0bdae9c7a31f6ca8bcbe6
141 10/219 14e56199cd1442fc6793d65b131 10/219 14e56199cd1442fc6793d65b
142 10/239 8c43ab2d5bde3b2fda977ddd132 10/239 8c43ab2d5bde3b2fda977ddd
143-10 replay-mismatches=0133+11/019 c93975e62fac424f33e30dbd
144-11/019 e3eb02d62746d50757d63d18134+11/039 d346876e1b164d0cd0627c43
145-11/039 070fa14e017eb9ba3056672d135+11/059 01e960a0c2e2ff6e67700683
146-11/059 8b016d3845f5d47e91b1826b136+11/079 1dc0f11f0abb3b5fc9f24e7c
147-11/079 75ce3f04d3082bc4788d6c96137+11/099 08d0c2c91fc7f7b8bc077073
148-11/099 2b7cf678237f6988de3396a3138+11/119 c25c0212819cece6d0639b16
149-11/119 230ebcd9a41d473aaed1896e139+11/139 05f7ae1225aab0d0cf837327
150-11/139 a0473a1fc49d7c12f20b41be140+11/159 0b421f3d3607eed3fdd06a22
151-11/159 b9ef5849eaeefbe486770b76141+11/179 dd0db71df59ff3782d710188
152-11/179 b3c43da50034693c385b844b142+11/199 8f76f1ddbcb47375a2539363
153-11/199 7145d045e0724186ce73059a143+11/219 82ad6598f848e6ed7ab84f16
154-11/219 ee6f5fc91e84ee8214060439144+11/239 581acb7b5585a2cb9127aabe
155-11/239 f4307d6e12b1cd2db37a8032
156-11 replay-mismatches=0
157 12/019 4fade3921f5735064355eec1145 12/019 4fade3921f5735064355eec1
158-12/039 e2aab8e88f7241073e73eb05146+12/039 4752e78884537c49b3a981a6
159-12/059 2b1492eeb901a30dddcecfea147+12/059 8d24a113e07ffe7f2ee85d92
160-12/079 809ab3f1339fe2c10da81dc6148+12/079 b664d979cc6ff5402f46feb5
161-12/099 09759c1960ee25243130cec7149+12/099 71a4e7544cc95fed335b866a
162-12/119 d40b61390be6b1ade0fc9798150+12/119 f3e962c48f6477dc9e36cba6
163-12/139 dd23c4487248a1236597baf8151+12/139 88ad314b543b01991001d0ff
164-12/159 6ccc55f91c960571ebc0f2dc152+12/159 c496c6f531b311b533c5d8dc
165-12/179 2165c2c3b2a0fd7a597c1251153+12/179 902d77ceb40bc233976eab25
166-12/199 679db69d3aee6356dafac627154+12/199 ae45efdbdedea0732816ddd9
167-12/219 eff11bcec70127843617c651155+12/219 a9b16863b78bef550c8f3a45
168-12/239 af6d8b16a1eb290229dd6000156+12/239 42f9034b8b4fd71772b18bb3
169-12 replay-mismatches=1
170 13/019 ef8a3432b61607340356a764157 13/019 ef8a3432b61607340356a764
171 13/039 4e823b712c6aab07bcd5764e158 13/039 4e823b712c6aab07bcd5764e
172 13/059 90b7e616d2c528faeee0f72b159 13/059 90b7e616d2c528faeee0f72b
@@ -179,7 +166,6 @@
179 13/199 84a14ed35e312f14e0c4d220166 13/199 84a14ed35e312f14e0c4d220
180 13/219 8382c4d6025f22cddd967535167 13/219 8382c4d6025f22cddd967535
181 13/239 4e3ac44cff6dfa7d7a843378168 13/239 4e3ac44cff6dfa7d7a843378
182-13 replay-mismatches=0
183 14/019 747d54cdf75a492242809318169 14/019 747d54cdf75a492242809318
184 14/039 e6530a9282bd6095e15a9677170 14/039 e6530a9282bd6095e15a9677
185 14/059 715de56023e1afc30c1feea1171 14/059 715de56023e1afc30c1feea1
@@ -192,20 +178,18 @@
192 14/199 f5992df3d18c885bcaab4496178 14/199 f5992df3d18c885bcaab4496
193 14/219 38e1a9fe90723b701c438464179 14/219 38e1a9fe90723b701c438464
194 14/239 c90fb86719f7e4613e3720c2180 14/239 c90fb86719f7e4613e3720c2
195-14 replay-mismatches=0
196 15/019 95e07748c709fa34a80ceff7181 15/019 95e07748c709fa34a80ceff7
197-15/039 4186ba13b89b2952cb8407b1182+15/039 17f763741791d1ce05af5d23
198-15/059 e113b092eeaeb7ba23f36f0b183+15/059 91afaa9890df8d7e1704a824
199-15/079 c9ad53bbc38faf68af448dbe184+15/079 f7b444177e7de8fbd6ffb68c
200-15/099 6207b08ba91d6e0c93f27540185+15/099 c1a6b419a58119e00553b73b
201-15/119 edffb952f657ba998d07de73186+15/119 e087eec2596edb2fbb67b309
202-15/139 5c874878a9a518b08627f52d187+15/139 2f6949b8d82d85d0ed0e1945
203-15/159 e7c63b49c6f3ebb122ab821b188+15/159 d870e1d84bf822c53958e42e
204-15/179 edb533ed1dcf2d238f7db6a9189+15/179 e61ad13af00d508f72ca02e9
205-15/199 80fa50afb7b21ddcc958e13e190+15/199 c2e3de3f26a36097e8df792e
206-15/219 f602f7cb0510d54ab8c94ff9191+15/219 6d50c5b64eca9d2ece1e3556
207-15/239 3ac7cd4affba36e038a2254b192+15/239 6c7b58a0ed8591a241ab438d
208-15 replay-mismatches=2
209 16/019 4314babccb7675abd6328c32193 16/019 4314babccb7675abd6328c32
210 16/039 3e6ee1b339dab4ff5e0c8b34194 16/039 3e6ee1b339dab4ff5e0c8b34
211 16/059 1afd8504d6a0be4d6cc9c3c3195 16/059 1afd8504d6a0be4d6cc9c3c3
@@ -218,7 +202,6 @@
218 16/199 210f0c4ad73131d2b465b362202 16/199 210f0c4ad73131d2b465b362
219 16/219 4b62676c69410e9b6f9d8f26203 16/219 4b62676c69410e9b6f9d8f26
220 16/239 72f70f009e426f88b33ebdae204 16/239 72f70f009e426f88b33ebdae
221-16 replay-mismatches=0
222 17/019 1a06602479d8e795ee95c965205 17/019 1a06602479d8e795ee95c965
223 17/039 c7e7eb54ee63d9e7e23ceaca206 17/039 c7e7eb54ee63d9e7e23ceaca
224 17/059 51c34ba1a80d55b1f9ae42fa207 17/059 51c34ba1a80d55b1f9ae42fa
@@ -231,7 +214,6 @@
231 17/199 55b35801df62b3250963613d214 17/199 55b35801df62b3250963613d
232 17/219 1cb11bbb2c5dd8995094be53215 17/219 1cb11bbb2c5dd8995094be53
233 17/239 6a146a19d7c534c4766e98f8216 17/239 6a146a19d7c534c4766e98f8
234-17 replay-mismatches=0
235 18/019 a1d2576637f54892892ea0b4217 18/019 a1d2576637f54892892ea0b4
236 18/039 4415a2923a28b75a5aa0dbfb218 18/039 4415a2923a28b75a5aa0dbfb
237 18/059 2bac49c23f1c09f170c68dc2219 18/059 2bac49c23f1c09f170c68dc2
@@ -244,20 +226,18 @@
244 18/199 c523b55eb720c065fc6134ac226 18/199 c523b55eb720c065fc6134ac
245 18/219 0f367277325b630ce5bc634f227 18/219 0f367277325b630ce5bc634f
246 18/239 e04b873c6820a46bfd2f4873228 18/239 e04b873c6820a46bfd2f4873
247-18 replay-mismatches=0
248 19/019 2db955914f2e068e72cf8dfa229 19/019 2db955914f2e068e72cf8dfa
249 19/039 ec344560f2bb7de5f25fdb78230 19/039 ec344560f2bb7de5f25fdb78
250 19/059 d1a41ae321f1449d256cf19d231 19/059 d1a41ae321f1449d256cf19d
251-19/079 c0d8a7ed784bd9d278c61bfa232+19/079 8faf99af914b67a155d5ec77
252-19/099 f91e7a807eea1aac3f05da1f233+19/099 4e1d07972fad7ea30ae47405
253-19/119 36d47e23f93682f8f8bd720b234+19/119 25c71afea29fbd715e2a4475
254-19/139 b227a962815dfd349d06722f235+19/139 c6aa86c0ecbc79508ca55d21
255-19/159 5552419605856137ee5e3384236+19/159 f4f99d1ac2eb88ec22a12895
256-19/179 0c7cf6585dcbaa42d05758c1237+19/179 48e52a38bcee4b40556c3ad5
257-19/199 ebcee2469216bd045f79d9a7238+19/199 0000d0003982f1b02a05c031
258-19/219 d5bdec7e45121f8f757c12df239+19/219 8a3fe5821bfca2452396d384
259-19/239 ae4abbf3362cbcba26878acd240+19/239 f80259caca42e4bec5999fbd
260-19 replay-mismatches=1
261 20/019 3c776bd6d460be5f6bcd060e241 20/019 3c776bd6d460be5f6bcd060e
262 20/039 ef65b757bd137499a352d5ae242 20/039 ef65b757bd137499a352d5ae
263 20/059 1cfcab4ffbc08c619e97bcd5243 20/059 1cfcab4ffbc08c619e97bcd5
@@ -266,11 +246,10 @@
266 20/119 cb7f9cf61ef176f01706ac77246 20/119 cb7f9cf61ef176f01706ac77
267 20/139 f9edefe5603a815455b563ff247 20/139 f9edefe5603a815455b563ff
268 20/159 cf8862d058a774e0fdb18628248 20/159 cf8862d058a774e0fdb18628
269-20/179 82daa9b9d7f4edc82a424a4a249+20/179 abfad109898597588888b96d
270-20/199 fe78853df2a403308904f8e2250+20/199 a619ae4048d75c8eb123bc03
271-20/219 0895c29599a30db493020dd2251+20/219 e97c8dda4681c61c2597a6b6
272-20/239 0e2310234476bea5dbb44cf0252+20/239 d3c1276233a20ff99b540e84
273-20 replay-mismatches=1
274 21/019 357ece3eab75324d3823a6a4253 21/019 357ece3eab75324d3823a6a4
275 21/039 fe4501bedc7017bc40ff0509254 21/039 fe4501bedc7017bc40ff0509
276 21/059 c97dc13dbcd996b58361777e255 21/059 c97dc13dbcd996b58361777e
@@ -280,10 +259,9 @@
280 21/139 034216a3e7d38b221d5a8811259 21/139 034216a3e7d38b221d5a8811
281 21/159 adc62b539970ad3123cb4175260 21/159 adc62b539970ad3123cb4175
282 21/179 0323505afc602891ba38d7ac261 21/179 0323505afc602891ba38d7ac
283-21/199 577472eed259f3abc0aaa526262+21/199 2c8eb6ab3e644c91102d47c5
284-21/219 5d1dc3faa423707ac2ca4ba7263+21/219 c88b6d036e56dd9bf2772e84
285-21/239 068abdef9483e1760da84d41264+21/239 1541f980765b4f40cd846615
286-21 replay-mismatches=1
287 22/019 6fc626ac7796049f3457a9a7265 22/019 6fc626ac7796049f3457a9a7
288 22/039 e9214d74742e6ab1a1c8baf0266 22/039 e9214d74742e6ab1a1c8baf0
289 22/059 72e63b2a0100e4153851a23d267 22/059 72e63b2a0100e4153851a23d
@@ -296,7 +274,6 @@
296 22/199 9fe1387f10258c696fd9e783274 22/199 9fe1387f10258c696fd9e783
297 22/219 3009560abe632e04450f7f41275 22/219 3009560abe632e04450f7f41
298 22/239 fe8d129db62a73ae9b9650bf276 22/239 fe8d129db62a73ae9b9650bf
299-22 replay-mismatches=0
300 23/019 20cb94d03695ad09763e03d2277 23/019 20cb94d03695ad09763e03d2
301 23/039 6c18ee020345a7699fd75494278 23/039 6c18ee020345a7699fd75494
302 23/059 f85c5ecebab82f1126f3c964279 23/059 f85c5ecebab82f1126f3c964
@@ -309,20 +286,18 @@
309 23/199 ddee2d89e0897e90f9a6df78286 23/199 ddee2d89e0897e90f9a6df78
310 23/219 65e4440830b9f98e48fe3a11287 23/219 65e4440830b9f98e48fe3a11
311 23/239 e8ca9cf0699b2c6333e0cb3e288 23/239 e8ca9cf0699b2c6333e0cb3e
312-23 replay-mismatches=0
313 24/019 b7fdbacf57cb0af4d47225ba289 24/019 b7fdbacf57cb0af4d47225ba
314-24/039 2a75c514d5b6525aaae38b3c290+24/039 a6c7f740d5d06f67495f9e33
315-24/059 25cfe1b7ea38dca8b287dfcb291+24/059 43a01382b5ac0c1ae9bed9cc
316-24/079 f26ad4606c3aa14fdd999af4292+24/079 b1920c5092ae3660a5d16b80
317-24/099 3e2f4c94e77ee245d7b1feb2293+24/099 6c5e0cce477b33f47b106ea3
318-24/119 17ea49879ca006a1a9cc6f7a294+24/119 6d6f085ab19ecfad1a4a2120
319-24/139 90243c3b758308f0dd7982d3295+24/139 9547bae694f87fb2c2b3d311
320-24/159 c734adf4c419ccaccb7b344b296+24/159 4acc87c8a3480147416549a0
321-24/179 f4f0b4818a87d2d735361f5b297+24/179 e0f7f82de3ea5bbb6bc4c259
322-24/199 16acbd765f02caece9941217298+24/199 accc2199dff19d266f855064
323-24/219 a4605530cb75474769714cf4299+24/219 a763e81bff4e145b46922cf3
324-24/239 ea3ffdb6ec8b58fe625b928a300+24/239 5299c46a14f4fa125c9b8611
325-24 replay-mismatches=1
326 25/019 eb73f8f3bb46422a6a12fc8f301 25/019 eb73f8f3bb46422a6a12fc8f
327 25/039 823c96945f71196e67f10f65302 25/039 823c96945f71196e67f10f65
328 25/059 c04f006b9f600ecd075cec6a303 25/059 c04f006b9f600ecd075cec6a
@@ -335,7 +310,6 @@
335 25/199 4b7c1cd9781ec41bf596b764310 25/199 4b7c1cd9781ec41bf596b764
336 25/219 ad62688c776574ab5c442de7311 25/219 ad62688c776574ab5c442de7
337 25/239 22e025d483651540c55002c6312 25/239 22e025d483651540c55002c6
338-25 replay-mismatches=0
339 26/019 122c0cce3cc0ece13ce6f89a313 26/019 122c0cce3cc0ece13ce6f89a
340 26/039 0999ef9b5da72bc75cef9d49314 26/039 0999ef9b5da72bc75cef9d49
341 26/059 2efdbf6da4b726f10f2878d1315 26/059 2efdbf6da4b726f10f2878d1
@@ -348,7 +322,6 @@
348 26/199 5f21c27026ba98b0a9d5d51c322 26/199 5f21c27026ba98b0a9d5d51c
349 26/219 2fcb984adf0b347e0da88d33323 26/219 2fcb984adf0b347e0da88d33
350 26/239 200f40ed44f86ce04857c1ef324 26/239 200f40ed44f86ce04857c1ef
351-26 replay-mismatches=0
352 27/019 ee2c010c41b9f0e5f70ce2b3325 27/019 ee2c010c41b9f0e5f70ce2b3
353 27/039 91ab08fb270466abbfb06c54326 27/039 91ab08fb270466abbfb06c54
354 27/059 2e73fe488420a5de3866e7e3327 27/059 2e73fe488420a5de3866e7e3
@@ -361,20 +334,18 @@
361 27/199 85bc90436e42fca40bd64d3c334 27/199 85bc90436e42fca40bd64d3c
362 27/219 f0dbe3da68c8dd144c3dd9b7335 27/219 f0dbe3da68c8dd144c3dd9b7
363 27/239 214002b3d936e2fe396aae01336 27/239 214002b3d936e2fe396aae01
364-27 replay-mismatches=0
365 28/019 3ee1c2f031af3ad67ae50ebc337 28/019 3ee1c2f031af3ad67ae50ebc
366 28/039 07508b3af21ec20fadeefe55338 28/039 07508b3af21ec20fadeefe55
367 28/059 dfa63544d3d6a817a9212067339 28/059 dfa63544d3d6a817a9212067
368-28/079 1855612e92d140c47b8abd1d340+28/079 237f6a260f672d353323e622
369-28/099 bcb387773cfd286bf68b7b7d341+28/099 3fa387d797ef0467f5e6e7e3
370-28/119 1f742786b7a0328e4e513984342+28/119 e25b9e12f6c5b3b03510cc14
371-28/139 491e0249e093af7d1fa703e3343+28/139 1740ba1423fde72696b1cb5f
372-28/159 7e72e1e6ffbd2f8191ff7116344+28/159 087e829214051615d334f3ef
373-28/179 daa22f39fc629726df0fd80c345+28/179 86a425ae6b5b0e26b2d91ade
374-28/199 ad54c46914aa19908c0a9880346+28/199 38502b27dac76ac25e7d8b3b
375-28/219 54e180efdd3796a13c1c7670347+28/219 407ae66e6aa5fd9602e5e5ce
376-28/239 8f0e0e94c590745fc2dc7678348+28/239 b2630d52745798f40a5a034d
377-28 replay-mismatches=1
378 29/019 72e981fc506bfdd3bbf15c37349 29/019 72e981fc506bfdd3bbf15c37
379 29/039 8c46bcf213fe0e9cf159a7d2350 29/039 8c46bcf213fe0e9cf159a7d2
380 29/059 213c8dd3d5bcda3abb11ab05351 29/059 213c8dd3d5bcda3abb11ab05
@@ -386,8 +357,7 @@
386 29/179 afb819e69c5c53d51d49d446357 29/179 afb819e69c5c53d51d49d446
387 29/199 78df663b24d8507a469a7959358 29/199 78df663b24d8507a469a7959
388 29/219 e40592fde61b5e14bf73242a359 29/219 e40592fde61b5e14bf73242a
389-29/239 9500a168ffd9142d6bdbde5a360+29/239 b6629ebed5f6c79374cf4cb8
390-29 replay-mismatches=0
391 30/019 ea74787caee42ed3665575ed361 30/019 ea74787caee42ed3665575ed
392 30/039 91b5e5afa5d3bb06b087f6ad362 30/039 91b5e5afa5d3bb06b087f6ad
393 30/059 ab536abe78f0cf27cdf94a75363 30/059 ab536abe78f0cf27cdf94a75
@@ -400,7 +370,6 @@
400 30/199 f1fe2d3081c9ccfc7413e3a9370 30/199 f1fe2d3081c9ccfc7413e3a9
401 30/219 5c1dad4fffc15226a5eebe51371 30/219 5c1dad4fffc15226a5eebe51
402 30/239 966ff4c469452f7951326c5e372 30/239 966ff4c469452f7951326c5e
403-30 replay-mismatches=0
404 31/019 869af9273a068555a7c65e06373 31/019 869af9273a068555a7c65e06
405 31/039 af9002bdf228a2e1f034df74374 31/039 af9002bdf228a2e1f034df74
406 31/059 375fd592eea7fdb3ce4a7563375 31/059 375fd592eea7fdb3ce4a7563
@@ -413,7 +382,6 @@
413 31/199 1c76b93d064c496485782148382 31/199 1c76b93d064c496485782148
414 31/219 8a23244f3e0b25b774aaabbb383 31/219 8a23244f3e0b25b774aaabbb
415 31/239 6b47e6b3998cf340d47f2dc9384 31/239 6b47e6b3998cf340d47f2dc9
416-31 replay-mismatches=0
417 32/019 ed11b0c6e02dfce865d49934385 32/019 ed11b0c6e02dfce865d49934
418 32/039 bd3bbe698e10adf1f5fbc490386 32/039 bd3bbe698e10adf1f5fbc490
419 32/059 fb530e83cb69ec498ccd32a7387 32/059 fb530e83cb69ec498ccd32a7
@@ -426,7 +394,6 @@
426 32/199 2c188342e677e30c8ffe7f9e394 32/199 2c188342e677e30c8ffe7f9e
427 32/219 7fc717e4fbfd57748ab342e3395 32/219 7fc717e4fbfd57748ab342e3
428 32/239 506a3d22b3e2ff760873e0fb396 32/239 506a3d22b3e2ff760873e0fb
429-32 replay-mismatches=0
430 33/019 75e34d5589c8f836a06d090e397 33/019 75e34d5589c8f836a06d090e
431 33/039 372c230667e378656b2af4ff398 33/039 372c230667e378656b2af4ff
432 33/059 938b86084dbb06afa4454b27399 33/059 938b86084dbb06afa4454b27
@@ -439,7 +406,6 @@
439 33/199 a269fac1fd59ac746cdcc3ed406 33/199 a269fac1fd59ac746cdcc3ed
440 33/219 8efc32f7b432b011f6862afb407 33/219 8efc32f7b432b011f6862afb
441 33/239 360719a27cebdd0863b2e775408 33/239 360719a27cebdd0863b2e775
442-33 replay-mismatches=0
443 34/019 93dcae1fc2bfd6779aff1aff409 34/019 93dcae1fc2bfd6779aff1aff
444 34/039 e4c849c2eb75db26ab3e4a69410 34/039 e4c849c2eb75db26ab3e4a69
445 34/059 f44f95efd2e73205143c656c411 34/059 f44f95efd2e73205143c656c
@@ -452,17 +418,15 @@
452 34/199 d60cdab9e926b1a975ab7c68418 34/199 d60cdab9e926b1a975ab7c68
453 34/219 70311db1c213b30d8622a677419 34/219 70311db1c213b30d8622a677
454 34/239 16c8a61f803eef432762550b420 34/239 16c8a61f803eef432762550b
455-34 replay-mismatches=0
456 35/019 6ce6075f205b75f864a11ca6421 35/019 6ce6075f205b75f864a11ca6
457 35/039 8375248e74a353fc4ec62d73422 35/039 8375248e74a353fc4ec62d73
458 35/059 794e546c0d3346dc3965043f423 35/059 794e546c0d3346dc3965043f
459 35/079 f4a4a12dd0c59cfa3a7036b4424 35/079 f4a4a12dd0c59cfa3a7036b4
460 35/099 a424a229392a35da8d937062425 35/099 a424a229392a35da8d937062
461-35/119 28415d77a2772ddc9ff46361426+35/119 5e71329265c6c2ddfdebda4d
462-35/139 b142770cfec4946c445f1925427+35/139 6aa980472b2f18fe51c96a53
463-35/159 a2c6d28bb5442fa733cf8ea3428+35/159 c677d854790176770b89c39b
464-35/179 0c4f1446420ee3280f18090c429+35/179 aa982fd9d111a2bfe2cd0342
465-35/199 d8ab4d4487ea3bb519574059430+35/199 ce9d070f4fa6d77de1426eca
466-35/219 f3f1d026b78975accc285f57431+35/219 a867713adf7f878aaac51716
467-35/239 a734eb4db0f69306dc7a5630432+35/239 336185b759391ae1b9650572
468-35 replay-mismatches=1

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 13

↑↓ moveenter openesc close