github.com/janelia-flyem/dvid@v1.0.0/datatype/labelarray/mutate_test.go (about) 1 package labelarray 2 3 import ( 4 "bytes" 5 "compress/gzip" 6 "encoding/binary" 7 "encoding/json" 8 "fmt" 9 "io" 10 "io/ioutil" 11 "math/rand" 12 "net/http" 13 "reflect" 14 "runtime" 15 "sync" 16 "testing" 17 "time" 18 19 "github.com/janelia-flyem/dvid/datastore" 20 "github.com/janelia-flyem/dvid/datatype/common/downres" 21 "github.com/janelia-flyem/dvid/datatype/common/labels" 22 "github.com/janelia-flyem/dvid/dvid" 23 "github.com/janelia-flyem/dvid/server" 24 25 lz4 "github.com/janelia-flyem/go/golz4-updated" 26 ) 27 28 type testBody struct { 29 label uint64 30 offset, size dvid.Point3d // these are just to give ROI of voxelSpans 31 blockSpans dvid.Spans 32 voxelSpans dvid.Spans // in DVID coordinates, not relative coordinates 33 } 34 35 var emptyBody = testBody{ 36 label: 0, 37 offset: dvid.Point3d{}, 38 size: dvid.Point3d{}, 39 blockSpans: dvid.Spans{}, 40 voxelSpans: dvid.Spans{}, 41 } 42 43 func checkSparsevolsCoarse(t *testing.T, encoding []byte) { 44 length := len(encoding) 45 var i int 46 for label := uint64(1); label <= 3; label++ { 47 if i+28 >= length { 48 t.Fatalf("Expected label %d but only %d bytes remain in encoding\n", label, len(encoding[i:])) 49 } 50 gotLabel := binary.LittleEndian.Uint64(encoding[i : i+8]) 51 if gotLabel != label { 52 t.Errorf("Expected label %d, got label %d in returned coarse sparsevols\n", label, gotLabel) 53 } 54 i += 8 55 var spans dvid.Spans 56 if err := spans.UnmarshalBinary(encoding[i:]); err != nil { 57 t.Errorf("Error in decoding coarse sparse volume: %v\n", err) 58 return 59 } 60 i += 4 + len(spans)*16 61 b := bodies[label-1] 62 if !reflect.DeepEqual(spans, b.blockSpans) { 63 _, fn, line, _ := runtime.Caller(1) 64 t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans [%s:%d]:\n%s\n", b.label, b.blockSpans, fn, line, spans) 65 } 66 } 67 } 68 69 // Makes sure the coarse sparse volume encoding matches the body. 70 func (b testBody) checkCoarse(t *testing.T, encoding []byte) { 71 // Get to the # spans and RLE in encoding 72 spansEncoding := encoding[8:] 73 var spans dvid.Spans 74 if err := spans.UnmarshalBinary(spansEncoding); err != nil { 75 t.Errorf("Error in decoding coarse sparse volume: %v\n", err) 76 return 77 } 78 79 // Check those spans match the body voxels. 80 if !reflect.DeepEqual(spans, b.blockSpans) { 81 _, fn, line, _ := runtime.Caller(1) 82 t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans [%s:%d]:\n%s\n", b.label, b.blockSpans, fn, line, spans) 83 } 84 } 85 86 // Makes sure the sparse volume encoding matches the actual body voxels. 87 func (b testBody) checkSparseVol(t *testing.T, encoding []byte, bounds dvid.OptionalBounds) { 88 if len(encoding) < 12 { 89 t.Fatalf("Bad encoded sparsevol received. Only %d bytes\n", len(encoding)) 90 } 91 92 // Get to the # spans and RLE in encoding 93 spansEncoding := encoding[8:] 94 var spans dvid.Spans 95 if err := spans.UnmarshalBinary(spansEncoding); err != nil { 96 t.Fatalf("Error in decoding sparse volume: %v\n", err) 97 } 98 99 // Create potentially bounded spans 100 expected := dvid.Spans{} 101 if bounds.IsSet() { 102 for _, span := range b.voxelSpans { 103 if bounds.OutsideY(span[1]) || bounds.OutsideZ(span[0]) { 104 continue 105 } 106 expected = append(expected, span) 107 } 108 } else { 109 expected = b.voxelSpans 110 } 111 112 // Check those spans match the body voxels. 113 gotNorm := spans.Normalize() 114 expectNorm := expected.Normalize() 115 if !reflect.DeepEqual(gotNorm, expectNorm) { 116 for _, got := range gotNorm { 117 bad := true 118 for _, expect := range expectNorm { 119 if reflect.DeepEqual(got, expect) { 120 bad = false 121 } 122 } 123 if bad { 124 fmt.Printf("Got unexpected span: %s\n", got) 125 } 126 } 127 for _, expect := range expectNorm { 128 bad := true 129 for _, got := range gotNorm { 130 if reflect.DeepEqual(got, expect) { 131 bad = false 132 } 133 } 134 if bad { 135 fmt.Printf("Never got expected span: %s\n", expect) 136 } 137 } 138 _, fn, line, _ := runtime.Caller(1) 139 t.Fatalf("Expected %d fine spans for label %d [%s:%d]:\n%s\nGot %d spans:\n%s\nAfter Norm:%s\n", len(expectNorm), b.label, fn, line, expectNorm, len(spans), spans, gotNorm) 140 } 141 } 142 143 // Makes sure the sparse volume encoding matches a downres of actual body voxels. 144 func (b testBody) checkScaledSparseVol(t *testing.T, encoding []byte, scale uint8, bounds dvid.OptionalBounds) { 145 if len(encoding) < 12 { 146 t.Fatalf("Bad encoded sparsevol received. Only %d bytes\n", len(encoding)) 147 } 148 149 // Make down-res volume of body 150 vol := newTestVolume(128, 128, 128) 151 vol.addBody(b, 1) 152 vol.downres(scale) 153 154 // Get to the # spans and RLE in encoding 155 spansEncoding := encoding[8:] 156 var spans dvid.Spans 157 if err := spans.UnmarshalBinary(spansEncoding); err != nil { 158 t.Fatalf("Error in decoding sparse volume: %v\n", err) 159 } 160 161 // Check those spans are within the body voxels. 162 for _, span := range spans { 163 z, y, x0, x1 := span.Unpack() 164 if x1 >= vol.size[0] || y >= vol.size[1] || z >= vol.size[2] { 165 t.Fatalf("Span %s is outside bound of scale %d volume of size %s\n", span, scale, vol.size) 166 } 167 pos := z*vol.size[0]*vol.size[1] + y*vol.size[0] + x0 168 for x := x0; x <= x1; x++ { 169 label := binary.LittleEndian.Uint64(vol.data[pos*8 : pos*8+8]) 170 if label != 1 { 171 t.Fatalf("Received body at scale %d has voxel at (%d,%d,%d) but that voxel is label %d, not in body %d\n", scale, x, y, z, label, b.label) 172 return 173 } 174 pos++ 175 } 176 } 177 } 178 179 // checks use of binary blocks format 180 func (b testBody) checkBinarySparseVol(t *testing.T, r io.Reader) { 181 binBlocks, err := labels.ReceiveBinaryBlocks(r) 182 if err != nil { 183 _, fn, line, _ := runtime.Caller(1) 184 t.Fatalf("Error trying to decode binary blocks for body %d [%s:%d]: %v\n", b.label, fn, line, err) 185 } 186 187 expected := newTestVolume(128, 128, 128) 188 expected.addBody(b, 1) 189 190 got := newTestVolume(128, 128, 128) 191 got.addBlocks(t, binBlocks, 1) 192 193 if err := expected.equals(got); err != nil { 194 _, fn, line, _ := runtime.Caller(1) 195 t.Fatalf("error getting binary blocks for body %d [%s:%d]: %v\n", b.label, fn, line, err) 196 } 197 } 198 199 // checks use of binary blocks format + scaling 200 func (b testBody) checkScaledBinarySparseVol(t *testing.T, r io.Reader, scale uint8) { 201 binBlocks, err := labels.ReceiveBinaryBlocks(r) 202 if err != nil { 203 t.Fatalf("Error trying to decode binary blocks for body %d: %v\n", b.label, err) 204 } 205 206 expected := newTestVolume(128, 128, 128) 207 expected.addBody(b, 1) 208 expected.downres(scale) 209 210 n := int32(128 >> scale) 211 got := newTestVolume(n, n, n) 212 got.addBlocks(t, binBlocks, 1) 213 214 if err := expected.equals(got); err != nil { 215 _, fn, line, _ := runtime.Caller(1) 216 t.Fatalf("error getting binary blocks for body %d, scale %d [%s:%d]: %v\n", b.label, scale, fn, line, err) 217 } 218 } 219 220 // Sees if the given block span has any of this test body label in it. 221 func (b testBody) isDeleted(t *testing.T, encoding []byte, bspan dvid.Span) bool { 222 // Get to the # spans and RLE in encoding 223 spansEncoding := encoding[8:] 224 var spans dvid.Spans 225 if err := spans.UnmarshalBinary(spansEncoding); err != nil { 226 t.Fatalf("Error in decoding sparse volume: %v\n", err) 227 return false 228 } 229 230 // Iterate true spans to see if any are in the blocks given. 231 for _, span := range spans { 232 bx0 := span[2] / 32 233 bx1 := span[3] / 32 234 by := span[1] / 32 235 bz := span[0] / 32 236 237 within_x := (bx0 >= bspan[2] && bx0 <= bspan[3]) || (bx1 >= bspan[2] && bx1 <= bspan[3]) 238 if bz == bspan[0] && by == bspan[1] && within_x { 239 return false 240 } 241 } 242 return true 243 } 244 245 func checkSpans(t *testing.T, encoding []byte, minx, maxx int32) { 246 // Get to the # spans and RLE in encoding 247 spansEncoding := encoding[8:] 248 var spans dvid.Spans 249 if err := spans.UnmarshalBinary(spansEncoding); err != nil { 250 t.Errorf("Error in decoding coarse sparse volume: %v\n", err) 251 return 252 } 253 for _, span := range spans { 254 if span[2] < minx { 255 t.Errorf("Found span violating min x %d: %s\n", minx, span) 256 return 257 } 258 if span[3] > maxx { 259 t.Errorf("Found span violating max x %d: %s\n", maxx, span) 260 } 261 } 262 } 263 264 // Sets voxels in body to given label. 265 func (v *testVolume) addBody(body testBody, label uint64) { 266 nx := v.size[0] 267 nxy := nx * v.size[1] 268 for _, span := range body.voxelSpans { 269 z, y, x0, x1 := span.Unpack() 270 p := (z*nxy + y*nx) * 8 271 for i := p + x0*8; i <= p+x1*8; i += 8 { 272 binary.LittleEndian.PutUint64(v.data[i:i+8], label) 273 } 274 } 275 } 276 277 // Returns true if all voxels in test volume for given body has label. 278 func (v *testVolume) isLabel(label uint64, body *testBody) bool { 279 nx := v.size[0] 280 nxy := nx * v.size[1] 281 for _, span := range body.voxelSpans { 282 z, y, x0, x1 := span.Unpack() 283 p := (z*nxy + y*nx) * 8 284 for i := p + x0*8; i <= p+x1*8; i += 8 { 285 curLabel := binary.LittleEndian.Uint64(v.data[i : i+8]) 286 if curLabel != label { 287 return false 288 } 289 } 290 } 291 return true 292 } 293 294 // Returns true if any voxel in test volume has given label. 295 func (v *testVolume) hasLabel(label uint64, body *testBody) bool { 296 nx := v.size[0] 297 nxy := nx * v.size[1] 298 for _, span := range body.voxelSpans { 299 z, y, x0, x1 := span.Unpack() 300 p := (z*nxy + y*nx) * 8 301 for i := p + x0*8; i <= p+x1*8; i += 8 { 302 curLabel := binary.LittleEndian.Uint64(v.data[i : i+8]) 303 if curLabel == label { 304 return true 305 } 306 } 307 } 308 return false 309 } 310 311 func createLabelTestVolume(t *testing.T, uuid dvid.UUID, name string) *testVolume { 312 // Setup test label blocks that are non-intersecting. 313 volume := newTestVolume(128, 128, 128) 314 volume.addBody(body1, 1) 315 volume.addBody(body2, 2) 316 volume.addBody(body3, 3) 317 volume.addBody(body4, 4) 318 319 // Send data over HTTP to populate a data instance 320 volume.put(t, uuid, name) 321 return volume 322 } 323 324 func createLabelTest2Volume(t *testing.T, uuid dvid.UUID, name string) *testVolume { 325 // Setup test label blocks that are non-intersecting. 326 volume := newTestVolume(128, 128, 128) 327 volume.addBody(body6, 6) 328 volume.addBody(body7, 7) 329 330 // Send data over HTTP to populate a data instance using mutable flag 331 volume.putMutable(t, uuid, name) 332 return volume 333 } 334 335 func TestSparseVolumes(t *testing.T) { 336 if err := server.OpenTest(); err != nil { 337 t.Fatalf("can't open test server: %v\n", err) 338 } 339 defer server.CloseTest() 340 341 // Create testbed volume and data instances 342 uuid, _ := initTestRepo() 343 var config dvid.Config 344 config.Set("MaxDownresLevel", "2") 345 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 346 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 347 labelVol := createLabelTestVolume(t, uuid, "labels") 348 349 gotVol := newTestVolume(128, 128, 128) 350 gotVol.get(t, uuid, "labels") 351 if err := gotVol.equals(labelVol); err != nil { 352 t.Fatalf("Couldn't get back simple 128x128x128 label volume that was written: %v\n", err) 353 } 354 355 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 356 t.Fatalf("Error blocking on labels updating: %v\n", err) 357 } 358 if err := downres.BlockOnUpdating(uuid, "labels"); err != nil { 359 t.Fatalf("Error blocking on update for labels: %v\n", err) 360 } 361 time.Sleep(1 * time.Second) 362 363 dataservice, err := datastore.GetDataByUUIDName(uuid, "labels") 364 if err != nil { 365 t.Fatalf("couldn't get labels data instance from datastore: %v\n", err) 366 } 367 labels, ok := dataservice.(*Data) 368 if !ok { 369 t.Fatalf("Returned data instance for 'labels' instance was not labelarray.Data!\n") 370 } 371 if labels.MaxRepoLabel != 4 { 372 t.Errorf("Expected max repo label to be 4, got %d\n", labels.MaxRepoLabel) 373 } 374 v, err := datastore.VersionFromUUID(uuid) 375 if err != nil { 376 t.Errorf("couldn't get version id from uuid %s: %v\n", uuid, err) 377 } 378 if len(labels.MaxLabel) != 1 || labels.MaxLabel[v] != 4 { 379 t.Errorf("bad MaxLabels: %v\n", labels.MaxLabel) 380 } 381 maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil) 382 if string(maxLabelResp) != `{"maxlabel": 4}` { 383 t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp)) 384 } 385 386 badReqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/0", server.WebAPIPath, uuid) 387 server.TestBadHTTP(t, "GET", badReqStr, nil) 388 389 for _, label := range []uint64{1, 2, 3, 4} { 390 // Get the coarse sparse volumes for each label and make sure they are correct. 391 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, label) 392 encoding := server.TestHTTP(t, "GET", reqStr, nil) 393 bodies[label-1].checkCoarse(t, encoding) 394 } 395 396 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevols-coarse/1/3", server.WebAPIPath, uuid) 397 encoding := server.TestHTTP(t, "GET", reqStr, nil) 398 checkSparsevolsCoarse(t, encoding) 399 400 for _, label := range []uint64{1, 2, 3, 4} { 401 // Check fast HEAD requests 402 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label) 403 resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil) 404 if resp.Code != http.StatusOK { 405 t.Errorf("HEAD on %s did not return OK. Status = %d\n", reqStr, resp.Code) 406 } 407 408 // Check full sparse volumes 409 encoding = server.TestHTTP(t, "GET", reqStr, nil) 410 lenEncoding := len(encoding) 411 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 412 413 // check one downres 414 encoding = server.TestHTTP(t, "GET", reqStr+"?scale=1", nil) 415 bodies[label-1].checkScaledSparseVol(t, encoding, 1, dvid.OptionalBounds{}) 416 417 // check two downres 418 encoding = server.TestHTTP(t, "GET", reqStr+"?scale=2", nil) 419 bodies[label-1].checkScaledSparseVol(t, encoding, 2, dvid.OptionalBounds{}) 420 421 // Check with lz4 compression 422 uncompressed := make([]byte, lenEncoding) 423 compressed := server.TestHTTP(t, "GET", reqStr+"?compression=lz4", nil) 424 if err := lz4.Uncompress(compressed, uncompressed); err != nil { 425 t.Fatalf("error uncompressing lz4 for sparsevol %d GET: %v\n", label, err) 426 } 427 bodies[label-1].checkSparseVol(t, uncompressed, dvid.OptionalBounds{}) 428 429 // Check with gzip compression 430 compressed = server.TestHTTP(t, "GET", reqStr+"?compression=gzip", nil) 431 b := bytes.NewBuffer(compressed) 432 var err error 433 r, err := gzip.NewReader(b) 434 if err != nil { 435 t.Fatalf("error creating gzip reader: %v\n", err) 436 } 437 var buffer bytes.Buffer 438 _, err = io.Copy(&buffer, r) 439 if err != nil { 440 t.Fatalf("error copying gzip data: %v\n", err) 441 } 442 err = r.Close() 443 if err != nil { 444 t.Fatalf("error closing gzip: %v\n", err) 445 } 446 encoding = buffer.Bytes() 447 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 448 449 // // check sparse vol + scaling using binary blocks compression 450 // reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?format=blocks", server.WebAPIPath, uuid, label) 451 // resp = server.TestHTTPResponse(t, "GET", reqStr, nil) 452 // bodies[label-1].checkBinarySparseVol(t, resp.Body) 453 454 // resp = server.TestHTTPResponse(t, "GET", reqStr+"?scale=1", nil) 455 // bodies[label-1].checkScaledBinarySparseVol(t, resp.Body, 1) 456 457 // resp = server.TestHTTPResponse(t, "GET", reqStr+"?scale=2", nil) 458 // bodies[label-1].checkScaledBinarySparseVol(t, resp.Body, 2) 459 460 // Check Y/Z restriction 461 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?miny=30&maxy=50&minz=20&maxz=40", server.WebAPIPath, uuid, label) 462 if label != 4 { 463 encoding = server.TestHTTP(t, "GET", reqStr, nil) 464 var bound dvid.OptionalBounds 465 bound.SetMinY(30) 466 bound.SetMaxY(50) 467 bound.SetMinZ(20) 468 bound.SetMaxZ(40) 469 bodies[label-1].checkSparseVol(t, encoding, bound) 470 } else { 471 server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found 472 } 473 474 // Check X restriction 475 minx := int32(20) 476 maxx := int32(47) 477 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?minx=%d&maxx=%d", server.WebAPIPath, uuid, label, minx, maxx) 478 if label != 4 { 479 encoding = server.TestHTTP(t, "GET", reqStr, nil) 480 checkSpans(t, encoding, minx, maxx) 481 } else { 482 server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found 483 } 484 } 485 486 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-size/1", server.WebAPIPath, uuid) 487 sizeResp := server.TestHTTP(t, "GET", reqStr, nil) 488 if string(sizeResp) != `{"numblocks": 3, "minvoxel": [0, 32, 0], "maxvoxel": [31, 63, 95]}` { 489 t.Errorf("bad response to sparsevol-size endpoint: %s\n", string(sizeResp)) 490 } 491 492 // Make sure non-existent bodies return proper HEAD responses. 493 headReq := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 10) 494 resp := server.TestHTTPResponse(t, "HEAD", headReq, nil) 495 if resp.Code != http.StatusNoContent { 496 t.Errorf("HEAD on %s did not return 204 (No Content). Status = %d\n", headReq, resp.Code) 497 } 498 } 499 500 func Test16x16x16SparseVolumes(t *testing.T) { 501 if err := server.OpenTest(); err != nil { 502 t.Fatalf("can't open test server: %v\n", err) 503 } 504 defer server.CloseTest() 505 506 // Create testbed volume and data instances 507 uuid, _ := initTestRepo() 508 var config dvid.Config 509 config.Set("BlockSize", "16,16,16") // Since RLE encoding spans blocks now, should work for smaller block size. 510 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 511 labelVol := createLabelTestVolume(t, uuid, "labels") 512 513 gotVol := newTestVolume(128, 128, 128) 514 gotVol.get(t, uuid, "labels") 515 if err := gotVol.equals(labelVol); err != nil { 516 t.Fatalf("Couldn't get back simple 128x128x128 label volume that was written: %v\n", err) 517 } 518 519 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 520 t.Fatalf("Error blocking on labels updating: %v\n", err) 521 } 522 time.Sleep(1 * time.Second) 523 524 for _, label := range []uint64{1, 2, 3, 4} { 525 // Check fast HEAD requests 526 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label) 527 resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil) 528 if resp.Code != http.StatusOK { 529 t.Errorf("HEAD on %s did not return OK. Status = %d\n", reqStr, resp.Code) 530 } 531 532 // Check full sparse volumes 533 encoding := server.TestHTTP(t, "GET", reqStr, nil) 534 fmt.Printf("Got %d bytes back from %s\n", len(encoding), reqStr) 535 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 536 537 // Check with lz4 compression 538 compressed := server.TestHTTP(t, "GET", reqStr+"?compression=lz4", nil) 539 if err := lz4.Uncompress(compressed, encoding); err != nil { 540 t.Fatalf("error uncompressing lz4: %v\n", err) 541 } 542 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 543 544 // Check with gzip compression 545 compressed = server.TestHTTP(t, "GET", reqStr+"?compression=gzip", nil) 546 b := bytes.NewBuffer(compressed) 547 var err error 548 r, err := gzip.NewReader(b) 549 if err != nil { 550 t.Fatalf("error creating gzip reader: %v\n", err) 551 } 552 var buffer bytes.Buffer 553 _, err = io.Copy(&buffer, r) 554 if err != nil { 555 t.Fatalf("error copying gzip data: %v\n", err) 556 } 557 err = r.Close() 558 if err != nil { 559 t.Fatalf("error closing gzip: %v\n", err) 560 } 561 encoding = buffer.Bytes() 562 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 563 564 // Check Y/Z restriction 565 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?miny=30&maxy=50&minz=20&maxz=40", server.WebAPIPath, uuid, label) 566 if label != 4 { 567 encoding = server.TestHTTP(t, "GET", reqStr, nil) 568 var bound dvid.OptionalBounds 569 bound.SetMinY(30) 570 bound.SetMaxY(50) 571 bound.SetMinZ(20) 572 bound.SetMaxZ(40) 573 bodies[label-1].checkSparseVol(t, encoding, bound) 574 } else { 575 server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found 576 } 577 578 // Check X restriction 579 minx := int32(20) 580 maxx := int32(47) 581 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d?minx=%d&maxx=%d", server.WebAPIPath, uuid, label, minx, maxx) 582 if label != 4 { 583 encoding = server.TestHTTP(t, "GET", reqStr, nil) 584 checkSpans(t, encoding, minx, maxx) 585 } else { 586 server.TestBadHTTP(t, "GET", reqStr, nil) // Should be not found 587 } 588 } 589 590 // Make sure non-existent bodies return proper HEAD responses. 591 headReq := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 10) 592 resp := server.TestHTTPResponse(t, "HEAD", headReq, nil) 593 if resp.Code != http.StatusNoContent { 594 t.Errorf("HEAD on %s did not return 204 (No Content). Status = %d\n", headReq, resp.Code) 595 } 596 } 597 598 func TestMergeLabels(t *testing.T) { 599 if err := server.OpenTest(); err != nil { 600 t.Fatalf("can't open test server: %v\n", err) 601 } 602 defer server.CloseTest() 603 604 // Create testbed volume and data instances 605 uuid, _ := initTestRepo() 606 var config dvid.Config 607 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 608 609 expected := createLabelTestVolume(t, uuid, "labels") 610 expected.addBody(body3, 2) 611 612 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 613 t.Fatalf("Error blocking on sync of labels: %v\n", err) 614 } 615 616 // Make sure max label is consistent 617 reqStr := fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid) 618 r := server.TestHTTP(t, "GET", reqStr, nil) 619 jsonVal := make(map[string]uint64) 620 if err := json.Unmarshal(r, &jsonVal); err != nil { 621 t.Errorf("Unable to get maxlabel from server. Instead got: %v\n", jsonVal) 622 } 623 maxlabel, ok := jsonVal["maxlabel"] 624 if !ok { 625 t.Errorf("The maxlabel query did not yield max label. Instead got: %v\n", jsonVal) 626 } 627 if maxlabel != 4 { 628 t.Errorf("Expected max label to be 4, instead got %d\n", maxlabel) 629 } 630 631 // Test merge of 3 into 2 632 testMerge := mergeJSON(`[2, 3]`) 633 testMerge.send(t, uuid, "labels") 634 635 // Make sure label 3 sparsevol has been removed. 636 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 3) 637 server.TestBadHTTP(t, "GET", reqStr, nil) 638 639 // Make sure label changes are correct after completion 640 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 641 t.Fatalf("Error blocking on sync of labels: %v\n", err) 642 } 643 644 retrieved := newTestVolume(128, 128, 128) 645 retrieved.get(t, uuid, "labels") 646 if len(retrieved.data) != 8*128*128*128 { 647 t.Errorf("Retrieved labelvol volume is incorrect size\n") 648 } 649 if !retrieved.isLabel(2, &body2) { 650 t.Errorf("Expected label 2 original voxels to remain. Instead some were removed.\n") 651 } 652 if retrieved.hasLabel(3, &body3) { 653 t.Errorf("Found label 3 when all label 3 should have been merged into label 2!\n") 654 } 655 if !retrieved.isLabel(2, &body3) { 656 t.Errorf("Incomplete merging. Label 2 should have taken over full extent of label 3\n") 657 } 658 if err := retrieved.equals(expected); err != nil { 659 t.Errorf("Merged label volume: %v\n", err) 660 } 661 } 662 663 func TestSplitCoarseLabel(t *testing.T) { 664 if err := server.OpenTest(); err != nil { 665 t.Fatalf("can't open test server: %v\n", err) 666 } 667 defer server.CloseTest() 668 669 // Create testbed volume and data instances 670 uuid, _ := initTestRepo() 671 var config dvid.Config 672 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 673 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 674 675 // Post label volume and setup expected volume after split of block coords (2, 1, 1) and (2, 1, 2) 676 expected := createLabelTestVolume(t, uuid, "labels") 677 fromLabel := uint64(4) 678 toLabel := uint64(5) 679 nx := expected.size[0] 680 nxy := nx * expected.size[1] 681 var x, y, z int32 682 for z = 0; z < 128; z++ { 683 bz := z / 32 684 if bz != 1 && bz != 2 { 685 continue 686 } 687 for y = 0; y < 128; y++ { 688 by := y / 32 689 if by != 1 { 690 continue 691 } 692 for x = 0; x < 128; x++ { 693 bx := x / 32 694 if (bz == 1 && bx == 2) || (bz == 2 && bx == 2) { 695 i := (z*nxy + y*nx + x) * 8 696 label := binary.LittleEndian.Uint64(expected.data[i : i+8]) 697 if label == fromLabel { 698 binary.LittleEndian.PutUint64(expected.data[i:i+8], toLabel) 699 } 700 } 701 } 702 } 703 } 704 705 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 706 t.Fatalf("Error blocking on sync of labels: %v\n", err) 707 } 708 709 // Make sure sparsevol for original body 4 is correct 710 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4) 711 encoding := server.TestHTTP(t, "GET", reqStr, nil) 712 fmt.Printf("Checking original body 4 is correct\n") 713 body4.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 714 715 // Create the encoding for split area in block coordinates. 716 rles := dvid.RLEs{ 717 dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), 718 dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1), 719 } 720 buf := new(bytes.Buffer) 721 buf.WriteByte(dvid.EncodingBinary) 722 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 723 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 724 buf.WriteByte(byte(0)) // reserved for later 725 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 726 binary.Write(buf, binary.LittleEndian, uint32(2)) // Placeholder for # spans 727 rleBytes, err := rles.MarshalBinary() 728 if err != nil { 729 t.Errorf("Unable to serialize RLEs: %v\n", err) 730 } 731 buf.Write(rleBytes) 732 733 // Submit the coarse split 734 reqStr = fmt.Sprintf("%snode/%s/labels/split-coarse/%d", server.WebAPIPath, uuid, 4) 735 r := server.TestHTTP(t, "POST", reqStr, buf) 736 jsonVal := make(map[string]uint64) 737 if err := json.Unmarshal(r, &jsonVal); err != nil { 738 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 739 } 740 newlabel, ok := jsonVal["label"] 741 if !ok { 742 t.Errorf("The split request did not yield label value. Instead got: %v\n", jsonVal) 743 } 744 if newlabel != 5 { 745 t.Errorf("Expected split label to be 5, instead got %d\n", newlabel) 746 } 747 748 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 749 t.Fatalf("Error blocking on sync of labels: %v\n", err) 750 } 751 maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil) 752 if string(maxLabelResp) != `{"maxlabel": 5}` { 753 t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp)) 754 } 755 756 // Make sure labels are correct 757 retrieved := newTestVolume(128, 128, 128) 758 retrieved.get(t, uuid, "labels") 759 if len(retrieved.data) != 8*128*128*128 { 760 t.Errorf("Retrieved post-split volume is incorrect size\n") 761 } 762 if err := retrieved.equals(expected); err != nil { 763 t.Errorf("Split label volume not equal to expected volume: %v\n", err) 764 } 765 766 // make sure the sparse volume for new label is correct 767 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, toLabel) 768 encoding = server.TestHTTP(t, "GET", reqStr, nil) 769 if len(encoding) != len(rleBytes)+12 { 770 t.Errorf("expected %d bytes from GET /sparsevol-coarse, got %d bytes\n", len(rleBytes)+12, len(encoding)) 771 } 772 if len(encoding) < 12 { 773 t.Fatalf("bad sparsevol-coarse encoding. Expected at least 12 bytes, got %d\n", len(encoding)) 774 } 775 numSpans := binary.LittleEndian.Uint32(encoding[8:12]) 776 if numSpans != 2 { 777 t.Errorf("Expected 2 blocks, got %d blocks after split coarse.\n", numSpans) 778 } 779 coarseRLEs := new(dvid.RLEs) 780 if err := coarseRLEs.UnmarshalBinary(encoding[12:]); err != nil { 781 t.Fatalf("error unmarshaling coarse sparsevolume: %v\n", err) 782 } 783 if len(*coarseRLEs) != 2 { 784 t.Fatalf("expected 2 blocks in sparsevol after split, got: %v\n", *coarseRLEs) 785 } 786 expectedRLEs := dvid.RLEs{dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1)} 787 for i, rle := range *coarseRLEs { 788 if !rle.StartPt().Equals(expectedRLEs[i].StartPt()) { 789 t.Errorf("Bad block %d: expected %s, got %s\n", i, expectedRLEs[i], rle) 790 } 791 } 792 } 793 794 func TestSplitCoarseGivenLabel(t *testing.T) { 795 if err := server.OpenTest(); err != nil { 796 t.Fatalf("can't open test server: %v\n", err) 797 } 798 defer server.CloseTest() 799 800 // Create testbed volume and data instances 801 uuid, _ := initTestRepo() 802 var config dvid.Config 803 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 804 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 805 806 // Post label volume and setup expected volume after split of block coords (2, 1, 1) and (3, 1, 2) 807 expected := createLabelTestVolume(t, uuid, "labels") 808 fromLabel := uint64(4) 809 toLabel := uint64(8127) 810 nx := expected.size[0] 811 nxy := nx * expected.size[1] 812 var x, y, z int32 813 for z = 0; z < 128; z++ { 814 bz := z / 32 815 if bz != 1 && bz != 2 { 816 continue 817 } 818 for y = 0; y < 128; y++ { 819 by := y / 32 820 if by != 1 { 821 continue 822 } 823 for x = 0; x < 128; x++ { 824 bx := x / 32 825 if (bz == 1 && bx == 2) || (bz == 2 && bx == 2) { 826 i := (z*nxy + y*nx + x) * 8 827 label := binary.LittleEndian.Uint64(expected.data[i : i+8]) 828 if label == fromLabel { 829 binary.LittleEndian.PutUint64(expected.data[i:i+8], toLabel) 830 } 831 } 832 } 833 } 834 } 835 836 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 837 t.Fatalf("Error blocking on sync of labels: %v\n", err) 838 } 839 840 // Create the encoding for split area in block coordinates. 841 rles := dvid.RLEs{ 842 dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), 843 dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1), 844 } 845 buf := new(bytes.Buffer) 846 buf.WriteByte(dvid.EncodingBinary) 847 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 848 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 849 buf.WriteByte(byte(0)) // reserved for later 850 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 851 binary.Write(buf, binary.LittleEndian, uint32(2)) // Placeholder for # spans 852 rleBytes, err := rles.MarshalBinary() 853 if err != nil { 854 t.Errorf("Unable to serialize RLEs: %v\n", err) 855 } 856 buf.Write(rleBytes) 857 858 // Submit the coarse split 859 reqStr := fmt.Sprintf("%snode/%s/labels/split-coarse/%d?splitlabel=8127", server.WebAPIPath, uuid, 4) 860 r := server.TestHTTP(t, "POST", reqStr, buf) 861 jsonVal := make(map[string]uint64) 862 if err := json.Unmarshal(r, &jsonVal); err != nil { 863 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 864 } 865 newlabel, ok := jsonVal["label"] 866 if !ok { 867 t.Errorf("The split request did not yield label value. Instead got: %v\n", jsonVal) 868 } 869 if newlabel != 8127 { 870 t.Errorf("Expected split label to be 8127, instead got %d\n", newlabel) 871 } 872 873 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 874 t.Fatalf("Error blocking on sync of labels: %v\n", err) 875 } 876 877 maxLabelResp := server.TestHTTP(t, "GET", fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid), nil) 878 if string(maxLabelResp) != `{"maxlabel": 8127}` { 879 t.Errorf("bad response to maxlabel endpoint: %s\n", string(maxLabelResp)) 880 } 881 882 // Make sure labels are correct 883 retrieved := newTestVolume(128, 128, 128) 884 retrieved.get(t, uuid, "labels") 885 if len(retrieved.data) != 8*128*128*128 { 886 t.Errorf("Retrieved post-split volume is incorrect size\n") 887 } 888 if err := retrieved.equals(expected); err != nil { 889 t.Errorf("Split label volume not equal to expected volume: %v\n", err) 890 } 891 892 // make sure the sparse volume for new label is correct 893 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol-coarse/%d", server.WebAPIPath, uuid, toLabel) 894 encoding := server.TestHTTP(t, "GET", reqStr, nil) 895 if len(encoding) != len(rleBytes)+12 { 896 t.Errorf("expected %d bytes from GET /sparsevol-coarse, got %d bytes\n", len(rleBytes)+12, len(encoding)) 897 } 898 if len(encoding) < 12 { 899 t.Fatalf("bad sparsevol-coarse encoding. Expected at least 12 bytes, got %d\n", len(encoding)) 900 } 901 numSpans := binary.LittleEndian.Uint32(encoding[8:12]) 902 if numSpans != 2 { 903 t.Errorf("Expected 2 blocks, got %d blocks after split coarse.\n", numSpans) 904 } 905 coarseRLEs := new(dvid.RLEs) 906 if err := coarseRLEs.UnmarshalBinary(encoding[12:]); err != nil { 907 t.Fatalf("error unmarshaling coarse sparsevolume: %v\n", err) 908 } 909 if len(*coarseRLEs) != 2 { 910 t.Fatalf("expected 2 blocks in sparsevol after split, got: %v\n", *coarseRLEs) 911 } 912 expectedRLEs := dvid.RLEs{dvid.NewRLE(dvid.Point3d{2, 1, 1}, 1), dvid.NewRLE(dvid.Point3d{2, 1, 2}, 1)} 913 for i, rle := range *coarseRLEs { 914 if !rle.StartPt().Equals(expectedRLEs[i].StartPt()) { 915 t.Errorf("Bad block %d: expected %s, got %s\n", i, expectedRLEs[i], rle) 916 } 917 } 918 } 919 920 func TestSplitLabel(t *testing.T) { 921 if err := server.OpenTest(); err != nil { 922 t.Fatalf("can't open test server: %v\n", err) 923 } 924 defer server.CloseTest() 925 926 // Create testbed volume and data instances 927 uuid, _ := initTestRepo() 928 var config dvid.Config 929 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 930 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 931 932 // Post label volume and setup expected volume after split. 933 expected := createLabelTestVolume(t, uuid, "labels") 934 expected.addBody(bodysplit, 5) 935 936 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 937 t.Fatalf("Error blocking on sync of labels: %v\n", err) 938 } 939 940 // Make sure sparsevol for original body 4 is correct 941 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4) 942 encoding := server.TestHTTP(t, "GET", reqStr, nil) 943 fmt.Printf("Checking original body 4 is correct\n") 944 body4.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 945 946 // Create the sparsevol encoding for split area 947 numspans := len(bodysplit.voxelSpans) 948 rles := make(dvid.RLEs, numspans, numspans) 949 for i, span := range bodysplit.voxelSpans { 950 start := dvid.Point3d{span[2], span[1], span[0]} 951 length := span[3] - span[2] + 1 952 rles[i] = dvid.NewRLE(start, length) 953 } 954 955 // Create the split sparse volume binary 956 buf := new(bytes.Buffer) 957 buf.WriteByte(dvid.EncodingBinary) 958 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 959 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 960 buf.WriteByte(byte(0)) // reserved for later 961 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 962 binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans 963 rleBytes, err := rles.MarshalBinary() 964 if err != nil { 965 t.Errorf("Unable to serialize RLEs: %v\n", err) 966 } 967 buf.Write(rleBytes) 968 969 // Verify the max label is 4 970 reqStr = fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid) 971 jsonStr := server.TestHTTP(t, "GET", reqStr, nil) 972 expectedJSON := `{"maxlabel": 4}` 973 if string(jsonStr) != expectedJSON { 974 t.Errorf("Expected this JSON returned from maxlabel:\n%s\nGot:\n%s\n", expectedJSON, string(jsonStr)) 975 } 976 977 // Submit the split sparsevol for body 4 using RLES "bodysplit" 978 reqStr = fmt.Sprintf("%snode/%s/labels/split/%d", server.WebAPIPath, uuid, 4) 979 r := server.TestHTTP(t, "POST", reqStr, buf) 980 jsonVal := make(map[string]uint64) 981 if err := json.Unmarshal(r, &jsonVal); err != nil { 982 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 983 } 984 newlabel, ok := jsonVal["label"] 985 if !ok { 986 t.Errorf("The split request did not yield label value. Instead got: %v\n", jsonVal) 987 } 988 if newlabel != 5 { 989 t.Errorf("Expected split label to be 5, instead got %d\n", newlabel) 990 } 991 992 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 993 t.Fatalf("Error blocking on sync of labels: %v\n", err) 994 } 995 996 retrieved := newTestVolume(128, 128, 128) 997 retrieved.get(t, uuid, "labels") 998 if len(retrieved.data) != 8*128*128*128 { 999 t.Errorf("Retrieved post-split volume is incorrect size\n") 1000 } 1001 if err := retrieved.equals(expected); err != nil { 1002 t.Errorf("Split label volume not equal to expected volume: %v\n", err) 1003 } 1004 1005 // Check split body 5 usine legacy RLEs 1006 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 5) 1007 encoding = server.TestHTTP(t, "GET", reqStr, nil) 1008 bodysplit.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1009 1010 // Make sure sparsevol for original body 4 is correct 1011 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 4) 1012 encoding = server.TestHTTP(t, "GET", reqStr, nil) 1013 bodyleft.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1014 1015 // Do a merge of two after the split 1016 testMerge := mergeJSON(`[4, 5]`) 1017 testMerge.send(t, uuid, "labels") 1018 1019 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1020 t.Fatalf("Error blocking on bodies update: %v\n", err) 1021 } 1022 1023 // Make sure we wind up with original body 4 1024 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/4", server.WebAPIPath, uuid) 1025 encoding = server.TestHTTP(t, "GET", reqStr, nil) 1026 body4.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1027 } 1028 1029 // Same as TestSplitLabel but now designate the actual split label 1030 func TestSplitGivenLabel(t *testing.T) { 1031 if err := server.OpenTest(); err != nil { 1032 t.Fatalf("can't open test server: %v\n", err) 1033 } 1034 defer server.CloseTest() 1035 1036 // Create testbed volume and data instances 1037 uuid, _ := initTestRepo() 1038 var config dvid.Config 1039 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 1040 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 1041 1042 // Post label volume and setup expected volume after split. 1043 expected := createLabelTestVolume(t, uuid, "labels") 1044 expected.addBody(bodyleft, 4) 1045 expected.addBody(bodysplit, 23) 1046 1047 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1048 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1049 } 1050 1051 // Create the sparsevol encoding for split area 1052 numspans := len(bodysplit.voxelSpans) 1053 rles := make(dvid.RLEs, numspans, numspans) 1054 for i, span := range bodysplit.voxelSpans { 1055 start := dvid.Point3d{span[2], span[1], span[0]} 1056 length := span[3] - span[2] + 1 1057 rles[i] = dvid.NewRLE(start, length) 1058 } 1059 1060 // Create the split sparse volume binary 1061 buf := new(bytes.Buffer) 1062 buf.WriteByte(dvid.EncodingBinary) 1063 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 1064 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 1065 buf.WriteByte(byte(0)) // reserved for later 1066 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 1067 binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans 1068 rleBytes, err := rles.MarshalBinary() 1069 if err != nil { 1070 t.Errorf("Unable to serialize RLEs: %v\n", err) 1071 } 1072 buf.Write(rleBytes) 1073 1074 // Submit the split sparsevol for body 4a 1075 reqStr := fmt.Sprintf("%snode/%s/labels/split/%d?splitlabel=23", server.WebAPIPath, uuid, 4) 1076 r := server.TestHTTP(t, "POST", reqStr, buf) 1077 jsonVal := make(map[string]uint64) 1078 if err := json.Unmarshal(r, &jsonVal); err != nil { 1079 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 1080 } 1081 newlabel, ok := jsonVal["label"] 1082 if !ok { 1083 t.Errorf("The split request did not yield label value. Instead got: %v\n", jsonVal) 1084 } 1085 if newlabel != 23 { 1086 t.Errorf("Expected split label to be assigned label 23, instead got %d\n", newlabel) 1087 } 1088 } 1089 1090 func TestMergeSplitLabel(t *testing.T) { 1091 if err := server.OpenTest(); err != nil { 1092 t.Fatalf("can't open test server: %v\n", err) 1093 } 1094 defer server.CloseTest() 1095 1096 // Create testbed volume and data instances 1097 uuid, _ := initTestRepo() 1098 var config dvid.Config 1099 config.Set("BlockSize", "32,32,32") // Previous test data was on 32^3 blocks 1100 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 1101 1102 // Post standard label 1-4 volume 1103 expected := createLabelTestVolume(t, uuid, "labels") 1104 1105 // Get expected volume if we add label 3 to 4. 1106 expected.addBody(body3, 4) 1107 1108 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1109 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1110 } 1111 1112 // Test merge of 3 into 4 1113 testMerge := mergeJSON(`[4, 3]`) 1114 testMerge.send(t, uuid, "labels") 1115 1116 // Make sure label changes are correct after completion 1117 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1118 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1119 } 1120 1121 // Make sure label 3 sparsevol has been removed. 1122 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 3) 1123 server.TestBadHTTP(t, "GET", reqStr, nil) 1124 1125 retrieved := newTestVolume(128, 128, 128) 1126 retrieved.get(t, uuid, "labels") 1127 if len(retrieved.data) != 8*128*128*128 { 1128 t.Errorf("Retrieved labelvol volume is incorrect size\n") 1129 } 1130 if !retrieved.isLabel(2, &body2) { 1131 t.Errorf("Expected label 2 original voxels to remain. Instead some were removed.\n") 1132 } 1133 if retrieved.hasLabel(3, &body3) { 1134 t.Errorf("Found label 3 when all label 3 should have been merged into label 4!\n") 1135 } 1136 if !retrieved.isLabel(4, &body3) { 1137 t.Errorf("Incomplete merging. Label 4 should have taken over full extent of label 3\n") 1138 } 1139 if err := retrieved.equals(expected); err != nil { 1140 t.Errorf("Merged label volume not equal to expected merged volume: %v\n", err) 1141 } 1142 1143 // Create the sparsevol encoding for split area of 4 1144 numspans := len(bodysplit.voxelSpans) 1145 rles := make(dvid.RLEs, numspans, numspans) 1146 for i, span := range bodysplit.voxelSpans { 1147 start := dvid.Point3d{span[2], span[1], span[0]} 1148 length := span[3] - span[2] + 1 1149 rles[i] = dvid.NewRLE(start, length) 1150 } 1151 1152 // Create the split sparse volume binary 1153 buf := new(bytes.Buffer) 1154 buf.WriteByte(dvid.EncodingBinary) 1155 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 1156 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 1157 buf.WriteByte(byte(0)) // reserved for later 1158 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 1159 binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans 1160 rleBytes, err := rles.MarshalBinary() 1161 if err != nil { 1162 t.Errorf("Unable to serialize RLEs: %v\n", err) 1163 } 1164 buf.Write(rleBytes) 1165 1166 // Verify the max label is 4 1167 reqStr = fmt.Sprintf("%snode/%s/labels/maxlabel", server.WebAPIPath, uuid) 1168 jsonStr := server.TestHTTP(t, "GET", reqStr, nil) 1169 expectedJSON := `{"maxlabel": 4}` 1170 if string(jsonStr) != expectedJSON { 1171 t.Errorf("Expected this JSON returned from maxlabel:\n%s\nGot:\n%s\n", expectedJSON, string(jsonStr)) 1172 } 1173 1174 // Submit the split sparsevol for body 4a (-> 5) 1175 reqStr = fmt.Sprintf("%snode/%s/labels/split/4", server.WebAPIPath, uuid) 1176 r := server.TestHTTP(t, "POST", reqStr, buf) 1177 jsonVal := make(map[string]uint64) 1178 if err := json.Unmarshal(r, &jsonVal); err != nil { 1179 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 1180 } 1181 newlabel, ok := jsonVal["label"] 1182 if !ok { 1183 t.Errorf("The split request did not yield label value. Instead got: %v\n", jsonVal) 1184 } 1185 if newlabel != 5 { 1186 t.Errorf("Expected split label to be 5, instead got %d\n", newlabel) 1187 } 1188 1189 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1190 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1191 } 1192 1193 retrieved = newTestVolume(128, 128, 128) 1194 retrieved.get(t, uuid, "labels") 1195 if len(retrieved.data) != 8*128*128*128 { 1196 t.Errorf("Retrieved post-split volume is incorrect size\n") 1197 } 1198 expected.addBody(bodysplit, 5) 1199 if err := retrieved.equals(expected); err != nil { 1200 t.Errorf("Split label volume not equal to expected volume: %v\n", err) 1201 } 1202 1203 // Make sure new body 5 is what we sent 1204 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, 5) 1205 encoding := server.TestHTTP(t, "GET", reqStr, nil) 1206 bodysplit.checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1207 } 1208 1209 func TestMultiscaleMergeSplit(t *testing.T) { 1210 testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}} 1211 // var testConfig server.TestConfig 1212 if err := server.OpenTest(testConfig); err != nil { 1213 t.Fatalf("can't open test server: %v\n", err) 1214 } 1215 defer server.CloseTest() 1216 1217 // Create testbed volume 1218 uuid, _ := initTestRepo() 1219 var config dvid.Config 1220 config.Set("MaxDownresLevel", "2") 1221 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 1222 1223 // Create an easily interpreted label volume with a couple of labels. 1224 volume := newTestVolume(128, 128, 128) 1225 volume.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1) 1226 volume.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 2) 1227 volume.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 13) 1228 volume.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209) 1229 volume.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311) 1230 volume.put(t, uuid, "labels") 1231 1232 // Verify initial ingest for hi-res 1233 if err := downres.BlockOnUpdating(uuid, "labels"); err != nil { 1234 t.Fatalf("Error blocking on update for labels: %v\n", err) 1235 } 1236 hires := newTestVolume(128, 128, 128) 1237 hires.get(t, uuid, "labels") 1238 hires.verifyLabel(t, 1, 45, 45, 45) 1239 hires.verifyLabel(t, 2, 50, 50, 100) 1240 hires.verifyLabel(t, 13, 100, 60, 60) 1241 hires.verifyLabel(t, 209, 55, 100, 55) 1242 hires.verifyLabel(t, 311, 81, 81, 41) 1243 1244 // Check the first downres: 64^3 1245 downres1 := newTestVolume(64, 64, 64) 1246 downres1.getScale(t, uuid, "labels", 1) 1247 downres1.verifyLabel(t, 0, 35, 34, 2) 1248 downres1.verifyLabel(t, 1, 30, 30, 30) 1249 downres1.verifyLabel(t, 2, 21, 21, 45) 1250 downres1.verifyLabel(t, 13, 45, 21, 36) 1251 downres1.verifyLabel(t, 209, 21, 50, 35) 1252 downres1.verifyLabel(t, 311, 45, 55, 35) 1253 expected1 := newTestVolume(64, 64, 64) 1254 expected1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1) 1255 expected1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 2) 1256 expected1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 13) 1257 expected1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209) 1258 expected1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311) 1259 if err := expected1.equals(downres1); err != nil { 1260 t.Errorf("1st downres isn't what is expected: %v\n", err) 1261 } 1262 1263 // Check the second downres to voxel: 32^3 1264 downres2 := newTestVolume(32, 32, 32) 1265 downres2.getScale(t, uuid, "labels", 2) 1266 downres2.verifyLabel(t, 0, 15, 16, 2) 1267 expected2 := newTestVolume(32, 32, 32) 1268 expected2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1) 1269 expected2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 2) 1270 expected2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 13) 1271 expected2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209) 1272 expected2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311) 1273 if err := expected2.equals(downres2); err != nil { 1274 t.Errorf("2nd downres isn't what is expected: %v\n", err) 1275 } 1276 1277 // Test merge of 2 and 13 into 1 1278 testMerge := mergeJSON(`[1, 2, 13]`) 1279 testMerge.send(t, uuid, "labels") 1280 1281 // Make sure labels 2 and 13 sparsevol has been removed. 1282 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/2", server.WebAPIPath, uuid) 1283 server.TestBadHTTP(t, "GET", reqStr, nil) 1284 1285 reqStr = fmt.Sprintf("%snode/%s/labels/sparsevol/13", server.WebAPIPath, uuid) 1286 server.TestBadHTTP(t, "GET", reqStr, nil) 1287 1288 // Make sure label changes are correct after completion of merge 1289 if err := downres.BlockOnUpdating(uuid, "labels"); err != nil { 1290 t.Fatalf("Error blocking on update for labels: %v\n", err) 1291 } 1292 retrieved := newTestVolume(128, 128, 128) 1293 retrieved.get(t, uuid, "labels") 1294 merged := newTestVolume(128, 128, 128) 1295 merged.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1) 1296 merged.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 1) 1297 merged.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 1) 1298 merged.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209) 1299 merged.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311) 1300 if err := merged.equals(retrieved); err != nil { 1301 t.Errorf("Merged label volume not equal to expected merged volume: %v\n", err) 1302 } 1303 1304 retrieved1 := newTestVolume(64, 64, 64) 1305 retrieved1.getScale(t, uuid, "labels", 1) 1306 retrieved1.verifyLabel(t, 0, 35, 34, 2) 1307 merged1 := newTestVolume(64, 64, 64) 1308 merged1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1) 1309 merged1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 1) 1310 merged1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 1) 1311 merged1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209) 1312 merged1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311) 1313 if err := retrieved1.equals(merged1); err != nil { 1314 t.Errorf("Merged label volume downres #1 not equal to expected merged volume: %v\n", err) 1315 } 1316 1317 retrieved2 := newTestVolume(32, 32, 32) 1318 retrieved2.getScale(t, uuid, "labels", 2) 1319 merged2 := newTestVolume(32, 32, 32) 1320 merged2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1) 1321 merged2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 1) 1322 merged2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 1) 1323 merged2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209) 1324 merged2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311) 1325 if err := retrieved2.equals(merged2); err != nil { 1326 t.Errorf("Merged label volume downres #2 not equal to expected merged volume: %v\n", err) 1327 } 1328 1329 // Create the sparsevol encoding for split area that used to be body 13 1330 numspans := 40 * 40 1331 rles := make(dvid.RLEs, numspans, numspans) 1332 length := int32(40) 1333 i := 0 1334 for z := int32(40); z < 80; z++ { 1335 for y := int32(40); y < 80; y++ { 1336 start := dvid.Point3d{80, y, z} 1337 rles[i] = dvid.NewRLE(start, length) 1338 i++ 1339 } 1340 } 1341 1342 // Create the split sparse volume binary 1343 buf := new(bytes.Buffer) 1344 buf.WriteByte(dvid.EncodingBinary) 1345 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 1346 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 1347 buf.WriteByte(byte(0)) // reserved for later 1348 binary.Write(buf, binary.LittleEndian, uint32(numspans*40)) // Placeholder for # voxels 1349 binary.Write(buf, binary.LittleEndian, uint32(numspans)) // Placeholder for # spans 1350 rleBytes, err := rles.MarshalBinary() 1351 if err != nil { 1352 t.Errorf("Unable to serialize RLEs: %v\n", err) 1353 } 1354 buf.Write(rleBytes) 1355 1356 // Submit the split sparsevol and assign to label 28 1357 reqStr = fmt.Sprintf("%snode/%s/labels/split/1?splitlabel=28", server.WebAPIPath, uuid) 1358 r := server.TestHTTP(t, "POST", reqStr, buf) 1359 jsonVal := make(map[string]uint64) 1360 if err := json.Unmarshal(r, &jsonVal); err != nil { 1361 t.Errorf("Unable to get new label from split. Instead got: %v\n", jsonVal) 1362 } 1363 1364 // Test all the multiscales for correct split volume. 1365 1366 // Make sure label changes are correct after completion of merge 1367 if err := downres.BlockOnUpdating(uuid, "labels"); err != nil { 1368 t.Fatalf("Error blocking on sync of split of labels: %v\n", err) 1369 } 1370 retrieved.get(t, uuid, "labels") 1371 split := newTestVolume(128, 128, 128) 1372 split.addSubvol(dvid.Point3d{40, 40, 40}, dvid.Point3d{40, 40, 40}, 1) 1373 split.addSubvol(dvid.Point3d{40, 40, 80}, dvid.Point3d{40, 40, 40}, 1) 1374 split.addSubvol(dvid.Point3d{80, 40, 40}, dvid.Point3d{40, 40, 40}, 28) 1375 split.addSubvol(dvid.Point3d{40, 80, 40}, dvid.Point3d{40, 40, 40}, 209) 1376 split.addSubvol(dvid.Point3d{80, 80, 40}, dvid.Point3d{40, 40, 40}, 311) 1377 if err := retrieved.equals(split); err != nil { 1378 t.Errorf("Split label volume not equal to expected split volume: %v\n", err) 1379 } 1380 1381 retrieved1.getScale(t, uuid, "labels", 1) 1382 retrieved1.verifyLabel(t, 0, 35, 34, 2) 1383 split1 := newTestVolume(64, 64, 64) 1384 split1.addSubvol(dvid.Point3d{20, 20, 20}, dvid.Point3d{20, 20, 20}, 1) 1385 split1.addSubvol(dvid.Point3d{20, 20, 40}, dvid.Point3d{20, 20, 20}, 1) 1386 split1.addSubvol(dvid.Point3d{40, 20, 20}, dvid.Point3d{20, 20, 20}, 28) 1387 split1.addSubvol(dvid.Point3d{20, 40, 20}, dvid.Point3d{20, 20, 20}, 209) 1388 split1.addSubvol(dvid.Point3d{40, 40, 20}, dvid.Point3d{20, 20, 20}, 311) 1389 split1.verifyLabel(t, 0, 35, 34, 2) 1390 if err := retrieved1.equals(split1); err != nil { 1391 t.Errorf("Split label volume downres #1 not equal to expected split volume: %v\n", err) 1392 } 1393 1394 retrieved2.getScale(t, uuid, "labels", 2) 1395 split2 := newTestVolume(32, 32, 32) 1396 split2.addSubvol(dvid.Point3d{10, 10, 10}, dvid.Point3d{10, 10, 10}, 1) 1397 split2.addSubvol(dvid.Point3d{10, 10, 20}, dvid.Point3d{10, 10, 10}, 1) 1398 split2.addSubvol(dvid.Point3d{20, 10, 10}, dvid.Point3d{10, 10, 10}, 28) 1399 split2.addSubvol(dvid.Point3d{10, 20, 10}, dvid.Point3d{10, 10, 10}, 209) 1400 split2.addSubvol(dvid.Point3d{20, 20, 10}, dvid.Point3d{10, 10, 10}, 311) 1401 if err := retrieved2.equals(split2); err != nil { 1402 t.Errorf("Split label volume downres #2 not equal to expected split volume: %v\n", err) 1403 } 1404 } 1405 1406 // Test that mutable labelarray POST will accurately remove prior bodies. 1407 func TestMutableLabelblkPOST(t *testing.T) { 1408 testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}} 1409 // var testConfig server.TestConfig 1410 if err := server.OpenTest(testConfig); err != nil { 1411 t.Fatalf("can't open test server: %v\n", err) 1412 } 1413 defer server.CloseTest() 1414 1415 // Create testbed volume and data instances 1416 uuid, _ := initTestRepo() 1417 var config dvid.Config 1418 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 1419 1420 // Post labels 1-4 1421 createLabelTestVolume(t, uuid, "labels") 1422 1423 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1424 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1425 } 1426 1427 // Make sure we have labels 1-4 sparsevol 1428 for _, label := range []uint64{1, 2, 3, 4} { 1429 // Check fast HEAD requests 1430 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label) 1431 resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil) 1432 if resp.Code != http.StatusOK { 1433 t.Errorf("HEAD on %s did not return OK. Status = %d\n", reqStr, resp.Code) 1434 } 1435 1436 // Check full sparse volumes 1437 encoding := server.TestHTTP(t, "GET", reqStr, nil) 1438 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1439 } 1440 1441 // Post labels 6-7 1442 createLabelTest2Volume(t, uuid, "labels") 1443 1444 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1445 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1446 } 1447 1448 // Make sure that labels 1-4 have no more sparse vol. 1449 for _, label := range []uint64{1, 2, 3, 4} { 1450 // Check full sparse volumes aren't retrievable anymore 1451 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label) 1452 server.TestBadHTTP(t, "GET", reqStr, nil) 1453 1454 // Make sure non-existent bodies return proper HEAD responses. 1455 resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil) 1456 if resp.Code != http.StatusNoContent { 1457 t.Errorf("HEAD on %s did not return 204 (No Content). Status = %d\n", reqStr, resp.Code) 1458 } 1459 } 1460 1461 // Make sure labels 6-7 are available as sparse vol. 1462 for _, label := range []uint64{6, 7} { 1463 // Check fast HEAD requests 1464 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevol/%d", server.WebAPIPath, uuid, label) 1465 resp := server.TestHTTPResponse(t, "HEAD", reqStr, nil) 1466 if resp.Code != http.StatusOK { 1467 t.Errorf("HEAD on %s did not return OK. Status = %d\n", reqStr, resp.Code) 1468 } 1469 1470 // Check full sparse volumes 1471 encoding := server.TestHTTP(t, "GET", reqStr, nil) 1472 bodies[label-1].checkSparseVol(t, encoding, dvid.OptionalBounds{}) 1473 } 1474 } 1475 1476 func TestConcurrentMutations(t *testing.T) { 1477 testConfig := server.TestConfig{CacheSize: map[string]int{"labelarray": 10}} 1478 // var testConfig server.TestConfig 1479 if err := server.OpenTest(testConfig); err != nil { 1480 t.Fatalf("can't open test server: %v\n", err) 1481 } 1482 defer server.CloseTest() 1483 1484 // Create testbed volume and data instances 1485 uuid, _ := initTestRepo() 1486 var config dvid.Config // use native 64^3 blocks 1487 server.CreateTestInstance(t, uuid, "labelarray", "labels", config) 1488 1489 // Make three parallel bodies that are within same blocks to test handling of concurrent 1490 // ops on same blocks. 1491 tbody1 := testBody{ // 72 x 4 x 4 horizontal bar 1492 label: 1, 1493 offset: dvid.Point3d{9, 68, 68}, 1494 size: dvid.Point3d{72, 4, 4}, 1495 blockSpans: []dvid.Span{ 1496 {1, 1, 0, 1}, 1497 }, 1498 voxelSpans: []dvid.Span{ 1499 {68, 68, 9, 80}, 1500 {68, 69, 9, 80}, 1501 {68, 70, 9, 80}, 1502 {68, 71, 9, 80}, 1503 {69, 68, 9, 80}, 1504 {69, 69, 9, 80}, 1505 {69, 70, 9, 80}, 1506 {69, 71, 9, 80}, 1507 {70, 68, 9, 80}, 1508 {70, 69, 9, 80}, 1509 {70, 70, 9, 80}, 1510 {70, 71, 9, 80}, 1511 {71, 68, 9, 80}, 1512 {71, 69, 9, 80}, 1513 {71, 70, 9, 80}, 1514 {71, 71, 9, 80}, 1515 }, 1516 } 1517 tbody2 := testBody{ // 72 x 4 x 4 horizontal bar 1518 label: 2, 1519 offset: dvid.Point3d{9, 68, 72}, 1520 size: dvid.Point3d{72, 4, 4}, 1521 blockSpans: []dvid.Span{ 1522 {1, 1, 0, 1}, 1523 }, 1524 voxelSpans: []dvid.Span{ 1525 {72, 68, 9, 80}, 1526 {72, 69, 9, 80}, 1527 {72, 70, 9, 80}, 1528 {72, 71, 9, 80}, 1529 {73, 68, 9, 80}, 1530 {73, 69, 9, 80}, 1531 {73, 70, 9, 80}, 1532 {73, 71, 9, 80}, 1533 {74, 68, 9, 80}, 1534 {74, 69, 9, 80}, 1535 {74, 70, 9, 80}, 1536 {74, 71, 9, 80}, 1537 {75, 68, 9, 80}, 1538 {75, 69, 9, 80}, 1539 {75, 70, 9, 80}, 1540 {75, 71, 9, 80}, 1541 }, 1542 } 1543 tbody3 := testBody{ // 72 x 4 x 4 horizontal bar 1544 label: 3, 1545 offset: dvid.Point3d{9, 68, 76}, 1546 size: dvid.Point3d{72, 4, 4}, 1547 blockSpans: []dvid.Span{ 1548 {1, 1, 0, 1}, 1549 }, 1550 voxelSpans: []dvid.Span{ 1551 {76, 68, 9, 80}, 1552 {76, 69, 9, 80}, 1553 {76, 70, 9, 80}, 1554 {76, 71, 9, 80}, 1555 {77, 68, 9, 80}, 1556 {77, 69, 9, 80}, 1557 {77, 70, 9, 80}, 1558 {77, 71, 9, 80}, 1559 {78, 68, 9, 80}, 1560 {78, 69, 9, 80}, 1561 {78, 70, 9, 80}, 1562 {78, 71, 9, 80}, 1563 {79, 68, 9, 80}, 1564 {79, 69, 9, 80}, 1565 {79, 70, 9, 80}, 1566 {79, 71, 9, 80}, 1567 }, 1568 } 1569 testbodies := [3]testBody{tbody1, tbody2, tbody3} 1570 1571 tvol := newTestVolume(192, 128, 128) 1572 tvol.addBody(tbody1, 1) 1573 tvol.addBody(tbody2, 2) 1574 tvol.addBody(tbody3, 3) 1575 tvol.put(t, uuid, "labels") 1576 1577 if err := datastore.BlockOnUpdating(uuid, "labels"); err != nil { 1578 t.Fatalf("Error blocking on sync of labels: %v\n", err) 1579 } 1580 1581 retrieved := newTestVolume(192, 128, 128) 1582 retrieved.get(t, uuid, "labels") 1583 if len(retrieved.data) != 8*192*128*128 { 1584 t.Errorf("Retrieved labelvol volume is incorrect size\n") 1585 } 1586 if err := retrieved.equals(tvol); err != nil { 1587 t.Errorf("Initial put not working: %v\n", err) 1588 } 1589 1590 // Run concurrent split/merge ops on each body where split is random location in X. 1591 wg := new(sync.WaitGroup) 1592 wg.Add(3) 1593 go func() { 1594 for n := 0; n < 30; n++ { 1595 tbody1.splitmerge(t, uuid, "labels") 1596 } 1597 wg.Done() 1598 }() 1599 go func() { 1600 for n := 0; n < 30; n++ { 1601 tbody2.splitmerge(t, uuid, "labels") 1602 } 1603 wg.Done() 1604 }() 1605 go func() { 1606 for n := 0; n < 30; n++ { 1607 tbody3.splitmerge(t, uuid, "labels") 1608 } 1609 wg.Done() 1610 }() 1611 wg.Wait() 1612 1613 retrieved2 := newTestVolume(192, 128, 128) 1614 retrieved2.get(t, uuid, "labels") 1615 if len(retrieved2.data) != 8*192*128*128 { 1616 t.Errorf("Retrieved labelvol volume is incorrect size\n") 1617 } 1618 if err := retrieved2.equals(tvol); err != nil { 1619 t.Errorf("Concurrent split/merge producing bad result: %v\n", err) 1620 } 1621 1622 reqStr := fmt.Sprintf("%snode/%s/labels/sparsevols-coarse/1/3", server.WebAPIPath, uuid) 1623 encoding := server.TestHTTP(t, "GET", reqStr, nil) 1624 var i int 1625 for label := uint64(1); label <= 3; label++ { 1626 if i+28 > len(encoding) { 1627 t.Fatalf("Expected label %d but only %d bytes remain in encoding\n", label, len(encoding[i:])) 1628 } 1629 gotLabel := binary.LittleEndian.Uint64(encoding[i : i+8]) 1630 if gotLabel != label { 1631 t.Errorf("Expected label %d, got label %d in returned coarse sparsevols\n", label, gotLabel) 1632 } 1633 i += 8 1634 var spans dvid.Spans 1635 if err := spans.UnmarshalBinary(encoding[i:]); err != nil { 1636 t.Errorf("Error in decoding coarse sparse volume: %v\n", err) 1637 return 1638 } 1639 i += 4 + len(spans)*16 1640 b := testbodies[label-1] 1641 if !reflect.DeepEqual(spans, b.blockSpans) { 1642 t.Errorf("Expected coarse spans for label %d:\n%s\nGot spans:\n%s\n", b.label, b.blockSpans, spans) 1643 } 1644 } 1645 } 1646 1647 func (b testBody) splitmerge(t *testing.T, uuid dvid.UUID, name dvid.InstanceName) { 1648 var rles dvid.RLEs 1649 var y, z, length int32 1650 length = 15 1651 startx := int32(rand.Intn(int(b.offset[0] + b.size[0] - length))) 1652 for z = 0; z < 4; z++ { 1653 for y = 0; y < 4; y++ { 1654 pos := dvid.Point3d{startx, b.offset[1] + y, b.offset[2] + z} 1655 rles = append(rles, dvid.NewRLE(pos, length)) 1656 } 1657 } 1658 dvid.Infof("Starting split for label %d at x = %d ...\n", b.label, startx) 1659 1660 buf := new(bytes.Buffer) 1661 buf.WriteByte(dvid.EncodingBinary) 1662 binary.Write(buf, binary.LittleEndian, uint8(3)) // # of dimensions 1663 binary.Write(buf, binary.LittleEndian, byte(0)) // dimension of run (X = 0) 1664 buf.WriteByte(byte(0)) // reserved for later 1665 binary.Write(buf, binary.LittleEndian, uint32(0)) // Placeholder for # voxels 1666 binary.Write(buf, binary.LittleEndian, uint32(16)) // Placeholder for # spans 1667 rleBytes, err := rles.MarshalBinary() 1668 if err != nil { 1669 t.Errorf("Unable to serialize RLEs: %v\n", err) 1670 } 1671 buf.Write(rleBytes) 1672 splitBytes := buf.Bytes() 1673 1674 var newlabel uint64 1675 reqStr := fmt.Sprintf("%snode/%s/%s/split/%d", server.WebAPIPath, uuid, name, b.label) 1676 tries := 0 1677 notDone := true 1678 for notDone { 1679 tries++ 1680 dvid.Infof("Trying split %d of label %d ...\n", tries, b.label) 1681 resp := server.TestHTTPResponse(t, "POST", reqStr, bytes.NewBuffer(splitBytes)) 1682 var retbytes []byte 1683 if resp.Body != nil { 1684 retbytes, err = ioutil.ReadAll(resp.Body) 1685 if err != nil { 1686 t.Fatalf("could not read response body for split %d of label %d: %v\n", tries, b.label, err) 1687 } 1688 } 1689 switch resp.Code { 1690 case http.StatusOK: 1691 jsonVal := make(map[string]uint64) 1692 if err := json.Unmarshal(retbytes, &jsonVal); err != nil { 1693 t.Fatalf("Unable to get new label from split. Instead got: %v\n", jsonVal) 1694 } 1695 var ok bool 1696 newlabel, ok = jsonVal["label"] 1697 if !ok { 1698 t.Fatalf("The split request did not yield label value. Instead got: %v\n", jsonVal) 1699 } 1700 notDone = false 1701 case http.StatusBadRequest: 1702 dvid.Infof("Bad split response. Waiting...\n") 1703 time.Sleep(10 * time.Millisecond) 1704 buf.Reset() 1705 default: 1706 var retstr string 1707 if retbytes != nil { 1708 retstr = string(retbytes) 1709 } 1710 t.Fatalf("Error in response to split, status code %d: %s\n", resp.Code, retstr) 1711 } 1712 } 1713 1714 // Merge them back. 1715 testMerge := fmt.Sprintf(`[%d, %d]`, b.label, newlabel) 1716 reqStr = fmt.Sprintf("%snode/%s/%s/merge", server.WebAPIPath, uuid, name) 1717 dvid.Infof("Starting merge for label %d -> %d\n", newlabel, b.label) 1718 tries = 0 1719 notDone = true 1720 for notDone { 1721 tries++ 1722 dvid.Infof("Trying merge %d for label %d -> %d ...\n", tries, newlabel, b.label) 1723 resp := server.TestHTTPResponse(t, "POST", reqStr, bytes.NewBufferString(testMerge)) 1724 switch resp.Code { 1725 case http.StatusOK: 1726 notDone = false 1727 case http.StatusBadRequest: 1728 dvid.Infof("Bad merge response. Waiting...\n") 1729 time.Sleep(10 * time.Millisecond) 1730 default: 1731 var retstr string 1732 if resp.Body != nil { 1733 retbytes, err := ioutil.ReadAll(resp.Body) 1734 if err != nil { 1735 t.Fatalf("Error trying to read response body from request %q: %v\n", reqStr, err) 1736 break 1737 } else { 1738 retstr = string(retbytes) 1739 } 1740 } 1741 t.Fatalf("Error in response to merge, status code %d: %s\n", resp.Code, retstr) 1742 } 1743 } 1744 } 1745 1746 var ( 1747 body1 = testBody{ 1748 label: 1, 1749 offset: dvid.Point3d{10, 40, 10}, 1750 size: dvid.Point3d{20, 20, 80}, 1751 blockSpans: []dvid.Span{ 1752 {0, 1, 0, 0}, 1753 {1, 1, 0, 0}, 1754 {2, 1, 0, 0}, 1755 }, 1756 voxelSpans: []dvid.Span{ 1757 {10, 40, 10, 29}, {10, 41, 10, 29}, {10, 42, 10, 29}, {10, 43, 10, 29}, {10, 44, 10, 29}, 1758 {10, 45, 10, 29}, {10, 46, 10, 29}, {10, 47, 10, 29}, {10, 48, 10, 29}, {10, 49, 10, 29}, 1759 {10, 50, 10, 29}, {10, 51, 10, 29}, {10, 52, 10, 29}, {10, 53, 10, 29}, {10, 54, 10, 29}, 1760 {10, 55, 10, 29}, {10, 56, 10, 29}, {10, 57, 10, 29}, {10, 58, 10, 29}, {10, 59, 10, 29}, 1761 {11, 40, 10, 29}, {11, 41, 10, 29}, {11, 42, 10, 29}, {11, 43, 10, 29}, {11, 44, 10, 29}, 1762 {11, 45, 10, 29}, {11, 46, 10, 29}, {11, 47, 10, 29}, {11, 48, 10, 29}, {11, 49, 10, 29}, 1763 {11, 50, 10, 29}, {11, 51, 10, 29}, {11, 52, 10, 29}, {11, 53, 10, 29}, {11, 54, 10, 29}, 1764 {11, 55, 10, 29}, {11, 56, 10, 29}, {11, 57, 10, 29}, {11, 58, 10, 29}, {11, 59, 10, 29}, 1765 {12, 40, 10, 29}, {12, 41, 10, 29}, {12, 42, 10, 29}, {12, 43, 10, 29}, {12, 44, 10, 29}, 1766 {12, 45, 10, 29}, {12, 46, 10, 29}, {12, 47, 10, 29}, {12, 48, 10, 29}, {12, 49, 10, 29}, 1767 {12, 50, 10, 29}, {12, 51, 10, 29}, {12, 52, 10, 29}, {12, 53, 10, 29}, {12, 54, 10, 29}, 1768 {12, 55, 10, 29}, {12, 56, 10, 29}, {12, 57, 10, 29}, {12, 58, 10, 29}, {12, 59, 10, 29}, 1769 {13, 40, 10, 29}, {13, 41, 10, 29}, {13, 42, 10, 29}, {13, 43, 10, 29}, {13, 44, 10, 29}, 1770 {13, 45, 10, 29}, {13, 46, 10, 29}, {13, 47, 10, 29}, {13, 48, 10, 29}, {13, 49, 10, 29}, 1771 {13, 50, 10, 29}, {13, 51, 10, 29}, {13, 52, 10, 29}, {13, 53, 10, 29}, {13, 54, 10, 29}, 1772 {13, 55, 10, 29}, {13, 56, 10, 29}, {13, 57, 10, 29}, {13, 58, 10, 29}, {13, 59, 10, 29}, 1773 {14, 40, 10, 29}, {14, 41, 10, 29}, {14, 42, 10, 29}, {14, 43, 10, 29}, {14, 44, 10, 29}, 1774 {14, 45, 10, 29}, {14, 46, 10, 29}, {14, 47, 10, 29}, {14, 48, 10, 29}, {14, 49, 10, 29}, 1775 {14, 50, 10, 29}, {14, 51, 10, 29}, {14, 52, 10, 29}, {14, 53, 10, 29}, {14, 54, 10, 29}, 1776 {14, 55, 10, 29}, {14, 56, 10, 29}, {14, 57, 10, 29}, {14, 58, 10, 29}, {14, 59, 10, 29}, 1777 {15, 40, 10, 29}, {15, 41, 10, 29}, {15, 42, 10, 29}, {15, 43, 10, 29}, {15, 44, 10, 29}, 1778 {15, 45, 10, 29}, {15, 46, 10, 29}, {15, 47, 10, 29}, {15, 48, 10, 29}, {15, 49, 10, 29}, 1779 {15, 50, 10, 29}, {15, 51, 10, 29}, {15, 52, 10, 29}, {15, 53, 10, 29}, {15, 54, 10, 29}, 1780 {15, 55, 10, 29}, {15, 56, 10, 29}, {15, 57, 10, 29}, {15, 58, 10, 29}, {15, 59, 10, 29}, 1781 {16, 40, 10, 29}, {16, 41, 10, 29}, {16, 42, 10, 29}, {16, 43, 10, 29}, {16, 44, 10, 29}, 1782 {16, 45, 10, 29}, {16, 46, 10, 29}, {16, 47, 10, 29}, {16, 48, 10, 29}, {16, 49, 10, 29}, 1783 {16, 50, 10, 29}, {16, 51, 10, 29}, {16, 52, 10, 29}, {16, 53, 10, 29}, {16, 54, 10, 29}, 1784 {16, 55, 10, 29}, {16, 56, 10, 29}, {16, 57, 10, 29}, {16, 58, 10, 29}, {16, 59, 10, 29}, 1785 {17, 40, 10, 29}, {17, 41, 10, 29}, {17, 42, 10, 29}, {17, 43, 10, 29}, {17, 44, 10, 29}, 1786 {17, 45, 10, 29}, {17, 46, 10, 29}, {17, 47, 10, 29}, {17, 48, 10, 29}, {17, 49, 10, 29}, 1787 {17, 50, 10, 29}, {17, 51, 10, 29}, {17, 52, 10, 29}, {17, 53, 10, 29}, {17, 54, 10, 29}, 1788 {17, 55, 10, 29}, {17, 56, 10, 29}, {17, 57, 10, 29}, {17, 58, 10, 29}, {17, 59, 10, 29}, 1789 {18, 40, 10, 29}, {18, 41, 10, 29}, {18, 42, 10, 29}, {18, 43, 10, 29}, {18, 44, 10, 29}, 1790 {18, 45, 10, 29}, {18, 46, 10, 29}, {18, 47, 10, 29}, {18, 48, 10, 29}, {18, 49, 10, 29}, 1791 {18, 50, 10, 29}, {18, 51, 10, 29}, {18, 52, 10, 29}, {18, 53, 10, 29}, {18, 54, 10, 29}, 1792 {18, 55, 10, 29}, {18, 56, 10, 29}, {18, 57, 10, 29}, {18, 58, 10, 29}, {18, 59, 10, 29}, 1793 {19, 40, 10, 29}, {19, 41, 10, 29}, {19, 42, 10, 29}, {19, 43, 10, 29}, {19, 44, 10, 29}, 1794 {19, 45, 10, 29}, {19, 46, 10, 29}, {19, 47, 10, 29}, {19, 48, 10, 29}, {19, 49, 10, 29}, 1795 {19, 50, 10, 29}, {19, 51, 10, 29}, {19, 52, 10, 29}, {19, 53, 10, 29}, {19, 54, 10, 29}, 1796 {19, 55, 10, 29}, {19, 56, 10, 29}, {19, 57, 10, 29}, {19, 58, 10, 29}, {19, 59, 10, 29}, 1797 {20, 40, 10, 29}, {20, 41, 10, 29}, {20, 42, 10, 29}, {20, 43, 10, 29}, {20, 44, 10, 29}, 1798 {20, 45, 10, 29}, {20, 46, 10, 29}, {20, 47, 10, 29}, {20, 48, 10, 29}, {20, 49, 10, 29}, 1799 {20, 50, 10, 29}, {20, 51, 10, 29}, {20, 52, 10, 29}, {20, 53, 10, 29}, {20, 54, 10, 29}, 1800 {20, 55, 10, 29}, {20, 56, 10, 29}, {20, 57, 10, 29}, {20, 58, 10, 29}, {20, 59, 10, 29}, 1801 {21, 40, 10, 29}, {21, 41, 10, 29}, {21, 42, 10, 29}, {21, 43, 10, 29}, {21, 44, 10, 29}, 1802 {21, 45, 10, 29}, {21, 46, 10, 29}, {21, 47, 10, 29}, {21, 48, 10, 29}, {21, 49, 10, 29}, 1803 {21, 50, 10, 29}, {21, 51, 10, 29}, {21, 52, 10, 29}, {21, 53, 10, 29}, {21, 54, 10, 29}, 1804 {21, 55, 10, 29}, {21, 56, 10, 29}, {21, 57, 10, 29}, {21, 58, 10, 29}, {21, 59, 10, 29}, 1805 {22, 40, 10, 29}, {22, 41, 10, 29}, {22, 42, 10, 29}, {22, 43, 10, 29}, {22, 44, 10, 29}, 1806 {22, 45, 10, 29}, {22, 46, 10, 29}, {22, 47, 10, 29}, {22, 48, 10, 29}, {22, 49, 10, 29}, 1807 {22, 50, 10, 29}, {22, 51, 10, 29}, {22, 52, 10, 29}, {22, 53, 10, 29}, {22, 54, 10, 29}, 1808 {22, 55, 10, 29}, {22, 56, 10, 29}, {22, 57, 10, 29}, {22, 58, 10, 29}, {22, 59, 10, 29}, 1809 {23, 40, 10, 29}, {23, 41, 10, 29}, {23, 42, 10, 29}, {23, 43, 10, 29}, {23, 44, 10, 29}, 1810 {23, 45, 10, 29}, {23, 46, 10, 29}, {23, 47, 10, 29}, {23, 48, 10, 29}, {23, 49, 10, 29}, 1811 {23, 50, 10, 29}, {23, 51, 10, 29}, {23, 52, 10, 29}, {23, 53, 10, 29}, {23, 54, 10, 29}, 1812 {23, 55, 10, 29}, {23, 56, 10, 29}, {23, 57, 10, 29}, {23, 58, 10, 29}, {23, 59, 10, 29}, 1813 {24, 40, 10, 29}, {24, 41, 10, 29}, {24, 42, 10, 29}, {24, 43, 10, 29}, {24, 44, 10, 29}, 1814 {24, 45, 10, 29}, {24, 46, 10, 29}, {24, 47, 10, 29}, {24, 48, 10, 29}, {24, 49, 10, 29}, 1815 {24, 50, 10, 29}, {24, 51, 10, 29}, {24, 52, 10, 29}, {24, 53, 10, 29}, {24, 54, 10, 29}, 1816 {24, 55, 10, 29}, {24, 56, 10, 29}, {24, 57, 10, 29}, {24, 58, 10, 29}, {24, 59, 10, 29}, 1817 {25, 40, 10, 29}, {25, 41, 10, 29}, {25, 42, 10, 29}, {25, 43, 10, 29}, {25, 44, 10, 29}, 1818 {25, 45, 10, 29}, {25, 46, 10, 29}, {25, 47, 10, 29}, {25, 48, 10, 29}, {25, 49, 10, 29}, 1819 {25, 50, 10, 29}, {25, 51, 10, 29}, {25, 52, 10, 29}, {25, 53, 10, 29}, {25, 54, 10, 29}, 1820 {25, 55, 10, 29}, {25, 56, 10, 29}, {25, 57, 10, 29}, {25, 58, 10, 29}, {25, 59, 10, 29}, 1821 {26, 40, 10, 29}, {26, 41, 10, 29}, {26, 42, 10, 29}, {26, 43, 10, 29}, {26, 44, 10, 29}, 1822 {26, 45, 10, 29}, {26, 46, 10, 29}, {26, 47, 10, 29}, {26, 48, 10, 29}, {26, 49, 10, 29}, 1823 {26, 50, 10, 29}, {26, 51, 10, 29}, {26, 52, 10, 29}, {26, 53, 10, 29}, {26, 54, 10, 29}, 1824 {26, 55, 10, 29}, {26, 56, 10, 29}, {26, 57, 10, 29}, {26, 58, 10, 29}, {26, 59, 10, 29}, 1825 {27, 40, 10, 29}, {27, 41, 10, 29}, {27, 42, 10, 29}, {27, 43, 10, 29}, {27, 44, 10, 29}, 1826 {27, 45, 10, 29}, {27, 46, 10, 29}, {27, 47, 10, 29}, {27, 48, 10, 29}, {27, 49, 10, 29}, 1827 {27, 50, 10, 29}, {27, 51, 10, 29}, {27, 52, 10, 29}, {27, 53, 10, 29}, {27, 54, 10, 29}, 1828 {27, 55, 10, 29}, {27, 56, 10, 29}, {27, 57, 10, 29}, {27, 58, 10, 29}, {27, 59, 10, 29}, 1829 {28, 40, 10, 29}, {28, 41, 10, 29}, {28, 42, 10, 29}, {28, 43, 10, 29}, {28, 44, 10, 29}, 1830 {28, 45, 10, 29}, {28, 46, 10, 29}, {28, 47, 10, 29}, {28, 48, 10, 29}, {28, 49, 10, 29}, 1831 {28, 50, 10, 29}, {28, 51, 10, 29}, {28, 52, 10, 29}, {28, 53, 10, 29}, {28, 54, 10, 29}, 1832 {28, 55, 10, 29}, {28, 56, 10, 29}, {28, 57, 10, 29}, {28, 58, 10, 29}, {28, 59, 10, 29}, 1833 {29, 40, 10, 29}, {29, 41, 10, 29}, {29, 42, 10, 29}, {29, 43, 10, 29}, {29, 44, 10, 29}, 1834 {29, 45, 10, 29}, {29, 46, 10, 29}, {29, 47, 10, 29}, {29, 48, 10, 29}, {29, 49, 10, 29}, 1835 {29, 50, 10, 29}, {29, 51, 10, 29}, {29, 52, 10, 29}, {29, 53, 10, 29}, {29, 54, 10, 29}, 1836 {29, 55, 10, 29}, {29, 56, 10, 29}, {29, 57, 10, 29}, {29, 58, 10, 29}, {29, 59, 10, 29}, 1837 {30, 40, 10, 29}, {30, 41, 10, 29}, {30, 42, 10, 29}, {30, 43, 10, 29}, {30, 44, 10, 29}, 1838 {30, 45, 10, 29}, {30, 46, 10, 29}, {30, 47, 10, 29}, {30, 48, 10, 29}, {30, 49, 10, 29}, 1839 {30, 50, 10, 29}, {30, 51, 10, 29}, {30, 52, 10, 29}, {30, 53, 10, 29}, {30, 54, 10, 29}, 1840 {30, 55, 10, 29}, {30, 56, 10, 29}, {30, 57, 10, 29}, {30, 58, 10, 29}, {30, 59, 10, 29}, 1841 {31, 40, 10, 29}, {31, 41, 10, 29}, {31, 42, 10, 29}, {31, 43, 10, 29}, {31, 44, 10, 29}, 1842 {31, 45, 10, 29}, {31, 46, 10, 29}, {31, 47, 10, 29}, {31, 48, 10, 29}, {31, 49, 10, 29}, 1843 {31, 50, 10, 29}, {31, 51, 10, 29}, {31, 52, 10, 29}, {31, 53, 10, 29}, {31, 54, 10, 29}, 1844 {31, 55, 10, 29}, {31, 56, 10, 29}, {31, 57, 10, 29}, {31, 58, 10, 29}, {31, 59, 10, 29}, 1845 {32, 40, 10, 29}, {32, 41, 10, 29}, {32, 42, 10, 29}, {32, 43, 10, 29}, {32, 44, 10, 29}, 1846 {32, 45, 10, 29}, {32, 46, 10, 29}, {32, 47, 10, 29}, {32, 48, 10, 29}, {32, 49, 10, 29}, 1847 {32, 50, 10, 29}, {32, 51, 10, 29}, {32, 52, 10, 29}, {32, 53, 10, 29}, {32, 54, 10, 29}, 1848 {32, 55, 10, 29}, {32, 56, 10, 29}, {32, 57, 10, 29}, {32, 58, 10, 29}, {32, 59, 10, 29}, 1849 {33, 40, 10, 29}, {33, 41, 10, 29}, {33, 42, 10, 29}, {33, 43, 10, 29}, {33, 44, 10, 29}, 1850 {33, 45, 10, 29}, {33, 46, 10, 29}, {33, 47, 10, 29}, {33, 48, 10, 29}, {33, 49, 10, 29}, 1851 {33, 50, 10, 29}, {33, 51, 10, 29}, {33, 52, 10, 29}, {33, 53, 10, 29}, {33, 54, 10, 29}, 1852 {33, 55, 10, 29}, {33, 56, 10, 29}, {33, 57, 10, 29}, {33, 58, 10, 29}, {33, 59, 10, 29}, 1853 {34, 40, 10, 29}, {34, 41, 10, 29}, {34, 42, 10, 29}, {34, 43, 10, 29}, {34, 44, 10, 29}, 1854 {34, 45, 10, 29}, {34, 46, 10, 29}, {34, 47, 10, 29}, {34, 48, 10, 29}, {34, 49, 10, 29}, 1855 {34, 50, 10, 29}, {34, 51, 10, 29}, {34, 52, 10, 29}, {34, 53, 10, 29}, {34, 54, 10, 29}, 1856 {34, 55, 10, 29}, {34, 56, 10, 29}, {34, 57, 10, 29}, {34, 58, 10, 29}, {34, 59, 10, 29}, 1857 {35, 40, 10, 29}, {35, 41, 10, 29}, {35, 42, 10, 29}, {35, 43, 10, 29}, {35, 44, 10, 29}, 1858 {35, 45, 10, 29}, {35, 46, 10, 29}, {35, 47, 10, 29}, {35, 48, 10, 29}, {35, 49, 10, 29}, 1859 {35, 50, 10, 29}, {35, 51, 10, 29}, {35, 52, 10, 29}, {35, 53, 10, 29}, {35, 54, 10, 29}, 1860 {35, 55, 10, 29}, {35, 56, 10, 29}, {35, 57, 10, 29}, {35, 58, 10, 29}, {35, 59, 10, 29}, 1861 {36, 40, 10, 29}, {36, 41, 10, 29}, {36, 42, 10, 29}, {36, 43, 10, 29}, {36, 44, 10, 29}, 1862 {36, 45, 10, 29}, {36, 46, 10, 29}, {36, 47, 10, 29}, {36, 48, 10, 29}, {36, 49, 10, 29}, 1863 {36, 50, 10, 29}, {36, 51, 10, 29}, {36, 52, 10, 29}, {36, 53, 10, 29}, {36, 54, 10, 29}, 1864 {36, 55, 10, 29}, {36, 56, 10, 29}, {36, 57, 10, 29}, {36, 58, 10, 29}, {36, 59, 10, 29}, 1865 {37, 40, 10, 29}, {37, 41, 10, 29}, {37, 42, 10, 29}, {37, 43, 10, 29}, {37, 44, 10, 29}, 1866 {37, 45, 10, 29}, {37, 46, 10, 29}, {37, 47, 10, 29}, {37, 48, 10, 29}, {37, 49, 10, 29}, 1867 {37, 50, 10, 29}, {37, 51, 10, 29}, {37, 52, 10, 29}, {37, 53, 10, 29}, {37, 54, 10, 29}, 1868 {37, 55, 10, 29}, {37, 56, 10, 29}, {37, 57, 10, 29}, {37, 58, 10, 29}, {37, 59, 10, 29}, 1869 {38, 40, 10, 29}, {38, 41, 10, 29}, {38, 42, 10, 29}, {38, 43, 10, 29}, {38, 44, 10, 29}, 1870 {38, 45, 10, 29}, {38, 46, 10, 29}, {38, 47, 10, 29}, {38, 48, 10, 29}, {38, 49, 10, 29}, 1871 {38, 50, 10, 29}, {38, 51, 10, 29}, {38, 52, 10, 29}, {38, 53, 10, 29}, {38, 54, 10, 29}, 1872 {38, 55, 10, 29}, {38, 56, 10, 29}, {38, 57, 10, 29}, {38, 58, 10, 29}, {38, 59, 10, 29}, 1873 {39, 40, 10, 29}, {39, 41, 10, 29}, {39, 42, 10, 29}, {39, 43, 10, 29}, {39, 44, 10, 29}, 1874 {39, 45, 10, 29}, {39, 46, 10, 29}, {39, 47, 10, 29}, {39, 48, 10, 29}, {39, 49, 10, 29}, 1875 {39, 50, 10, 29}, {39, 51, 10, 29}, {39, 52, 10, 29}, {39, 53, 10, 29}, {39, 54, 10, 29}, 1876 {39, 55, 10, 29}, {39, 56, 10, 29}, {39, 57, 10, 29}, {39, 58, 10, 29}, {39, 59, 10, 29}, 1877 {40, 40, 10, 29}, {40, 41, 10, 29}, {40, 42, 10, 29}, {40, 43, 10, 29}, {40, 44, 10, 29}, 1878 {40, 45, 10, 29}, {40, 46, 10, 29}, {40, 47, 10, 29}, {40, 48, 10, 29}, {40, 49, 10, 29}, 1879 {40, 50, 10, 29}, {40, 51, 10, 29}, {40, 52, 10, 29}, {40, 53, 10, 29}, {40, 54, 10, 29}, 1880 {40, 55, 10, 29}, {40, 56, 10, 29}, {40, 57, 10, 29}, {40, 58, 10, 29}, {40, 59, 10, 29}, 1881 {41, 40, 10, 29}, {41, 41, 10, 29}, {41, 42, 10, 29}, {41, 43, 10, 29}, {41, 44, 10, 29}, 1882 {41, 45, 10, 29}, {41, 46, 10, 29}, {41, 47, 10, 29}, {41, 48, 10, 29}, {41, 49, 10, 29}, 1883 {41, 50, 10, 29}, {41, 51, 10, 29}, {41, 52, 10, 29}, {41, 53, 10, 29}, {41, 54, 10, 29}, 1884 {41, 55, 10, 29}, {41, 56, 10, 29}, {41, 57, 10, 29}, {41, 58, 10, 29}, {41, 59, 10, 29}, 1885 {42, 40, 10, 29}, {42, 41, 10, 29}, {42, 42, 10, 29}, {42, 43, 10, 29}, {42, 44, 10, 29}, 1886 {42, 45, 10, 29}, {42, 46, 10, 29}, {42, 47, 10, 29}, {42, 48, 10, 29}, {42, 49, 10, 29}, 1887 {42, 50, 10, 29}, {42, 51, 10, 29}, {42, 52, 10, 29}, {42, 53, 10, 29}, {42, 54, 10, 29}, 1888 {42, 55, 10, 29}, {42, 56, 10, 29}, {42, 57, 10, 29}, {42, 58, 10, 29}, {42, 59, 10, 29}, 1889 {43, 40, 10, 29}, {43, 41, 10, 29}, {43, 42, 10, 29}, {43, 43, 10, 29}, {43, 44, 10, 29}, 1890 {43, 45, 10, 29}, {43, 46, 10, 29}, {43, 47, 10, 29}, {43, 48, 10, 29}, {43, 49, 10, 29}, 1891 {43, 50, 10, 29}, {43, 51, 10, 29}, {43, 52, 10, 29}, {43, 53, 10, 29}, {43, 54, 10, 29}, 1892 {43, 55, 10, 29}, {43, 56, 10, 29}, {43, 57, 10, 29}, {43, 58, 10, 29}, {43, 59, 10, 29}, 1893 {44, 40, 10, 29}, {44, 41, 10, 29}, {44, 42, 10, 29}, {44, 43, 10, 29}, {44, 44, 10, 29}, 1894 {44, 45, 10, 29}, {44, 46, 10, 29}, {44, 47, 10, 29}, {44, 48, 10, 29}, {44, 49, 10, 29}, 1895 {44, 50, 10, 29}, {44, 51, 10, 29}, {44, 52, 10, 29}, {44, 53, 10, 29}, {44, 54, 10, 29}, 1896 {44, 55, 10, 29}, {44, 56, 10, 29}, {44, 57, 10, 29}, {44, 58, 10, 29}, {44, 59, 10, 29}, 1897 {45, 40, 10, 29}, {45, 41, 10, 29}, {45, 42, 10, 29}, {45, 43, 10, 29}, {45, 44, 10, 29}, 1898 {45, 45, 10, 29}, {45, 46, 10, 29}, {45, 47, 10, 29}, {45, 48, 10, 29}, {45, 49, 10, 29}, 1899 {45, 50, 10, 29}, {45, 51, 10, 29}, {45, 52, 10, 29}, {45, 53, 10, 29}, {45, 54, 10, 29}, 1900 {45, 55, 10, 29}, {45, 56, 10, 29}, {45, 57, 10, 29}, {45, 58, 10, 29}, {45, 59, 10, 29}, 1901 {46, 40, 10, 29}, {46, 41, 10, 29}, {46, 42, 10, 29}, {46, 43, 10, 29}, {46, 44, 10, 29}, 1902 {46, 45, 10, 29}, {46, 46, 10, 29}, {46, 47, 10, 29}, {46, 48, 10, 29}, {46, 49, 10, 29}, 1903 {46, 50, 10, 29}, {46, 51, 10, 29}, {46, 52, 10, 29}, {46, 53, 10, 29}, {46, 54, 10, 29}, 1904 {46, 55, 10, 29}, {46, 56, 10, 29}, {46, 57, 10, 29}, {46, 58, 10, 29}, {46, 59, 10, 29}, 1905 {47, 40, 10, 29}, {47, 41, 10, 29}, {47, 42, 10, 29}, {47, 43, 10, 29}, {47, 44, 10, 29}, 1906 {47, 45, 10, 29}, {47, 46, 10, 29}, {47, 47, 10, 29}, {47, 48, 10, 29}, {47, 49, 10, 29}, 1907 {47, 50, 10, 29}, {47, 51, 10, 29}, {47, 52, 10, 29}, {47, 53, 10, 29}, {47, 54, 10, 29}, 1908 {47, 55, 10, 29}, {47, 56, 10, 29}, {47, 57, 10, 29}, {47, 58, 10, 29}, {47, 59, 10, 29}, 1909 {48, 40, 10, 29}, {48, 41, 10, 29}, {48, 42, 10, 29}, {48, 43, 10, 29}, {48, 44, 10, 29}, 1910 {48, 45, 10, 29}, {48, 46, 10, 29}, {48, 47, 10, 29}, {48, 48, 10, 29}, {48, 49, 10, 29}, 1911 {48, 50, 10, 29}, {48, 51, 10, 29}, {48, 52, 10, 29}, {48, 53, 10, 29}, {48, 54, 10, 29}, 1912 {48, 55, 10, 29}, {48, 56, 10, 29}, {48, 57, 10, 29}, {48, 58, 10, 29}, {48, 59, 10, 29}, 1913 {49, 40, 10, 29}, {49, 41, 10, 29}, {49, 42, 10, 29}, {49, 43, 10, 29}, {49, 44, 10, 29}, 1914 {49, 45, 10, 29}, {49, 46, 10, 29}, {49, 47, 10, 29}, {49, 48, 10, 29}, {49, 49, 10, 29}, 1915 {49, 50, 10, 29}, {49, 51, 10, 29}, {49, 52, 10, 29}, {49, 53, 10, 29}, {49, 54, 10, 29}, 1916 {49, 55, 10, 29}, {49, 56, 10, 29}, {49, 57, 10, 29}, {49, 58, 10, 29}, {49, 59, 10, 29}, 1917 {50, 40, 10, 29}, {50, 41, 10, 29}, {50, 42, 10, 29}, {50, 43, 10, 29}, {50, 44, 10, 29}, 1918 {50, 45, 10, 29}, {50, 46, 10, 29}, {50, 47, 10, 29}, {50, 48, 10, 29}, {50, 49, 10, 29}, 1919 {50, 50, 10, 29}, {50, 51, 10, 29}, {50, 52, 10, 29}, {50, 53, 10, 29}, {50, 54, 10, 29}, 1920 {50, 55, 10, 29}, {50, 56, 10, 29}, {50, 57, 10, 29}, {50, 58, 10, 29}, {50, 59, 10, 29}, 1921 {51, 40, 10, 29}, {51, 41, 10, 29}, {51, 42, 10, 29}, {51, 43, 10, 29}, {51, 44, 10, 29}, 1922 {51, 45, 10, 29}, {51, 46, 10, 29}, {51, 47, 10, 29}, {51, 48, 10, 29}, {51, 49, 10, 29}, 1923 {51, 50, 10, 29}, {51, 51, 10, 29}, {51, 52, 10, 29}, {51, 53, 10, 29}, {51, 54, 10, 29}, 1924 {51, 55, 10, 29}, {51, 56, 10, 29}, {51, 57, 10, 29}, {51, 58, 10, 29}, {51, 59, 10, 29}, 1925 {52, 40, 10, 29}, {52, 41, 10, 29}, {52, 42, 10, 29}, {52, 43, 10, 29}, {52, 44, 10, 29}, 1926 {52, 45, 10, 29}, {52, 46, 10, 29}, {52, 47, 10, 29}, {52, 48, 10, 29}, {52, 49, 10, 29}, 1927 {52, 50, 10, 29}, {52, 51, 10, 29}, {52, 52, 10, 29}, {52, 53, 10, 29}, {52, 54, 10, 29}, 1928 {52, 55, 10, 29}, {52, 56, 10, 29}, {52, 57, 10, 29}, {52, 58, 10, 29}, {52, 59, 10, 29}, 1929 {53, 40, 10, 29}, {53, 41, 10, 29}, {53, 42, 10, 29}, {53, 43, 10, 29}, {53, 44, 10, 29}, 1930 {53, 45, 10, 29}, {53, 46, 10, 29}, {53, 47, 10, 29}, {53, 48, 10, 29}, {53, 49, 10, 29}, 1931 {53, 50, 10, 29}, {53, 51, 10, 29}, {53, 52, 10, 29}, {53, 53, 10, 29}, {53, 54, 10, 29}, 1932 {53, 55, 10, 29}, {53, 56, 10, 29}, {53, 57, 10, 29}, {53, 58, 10, 29}, {53, 59, 10, 29}, 1933 {54, 40, 10, 29}, {54, 41, 10, 29}, {54, 42, 10, 29}, {54, 43, 10, 29}, {54, 44, 10, 29}, 1934 {54, 45, 10, 29}, {54, 46, 10, 29}, {54, 47, 10, 29}, {54, 48, 10, 29}, {54, 49, 10, 29}, 1935 {54, 50, 10, 29}, {54, 51, 10, 29}, {54, 52, 10, 29}, {54, 53, 10, 29}, {54, 54, 10, 29}, 1936 {54, 55, 10, 29}, {54, 56, 10, 29}, {54, 57, 10, 29}, {54, 58, 10, 29}, {54, 59, 10, 29}, 1937 {55, 40, 10, 29}, {55, 41, 10, 29}, {55, 42, 10, 29}, {55, 43, 10, 29}, {55, 44, 10, 29}, 1938 {55, 45, 10, 29}, {55, 46, 10, 29}, {55, 47, 10, 29}, {55, 48, 10, 29}, {55, 49, 10, 29}, 1939 {55, 50, 10, 29}, {55, 51, 10, 29}, {55, 52, 10, 29}, {55, 53, 10, 29}, {55, 54, 10, 29}, 1940 {55, 55, 10, 29}, {55, 56, 10, 29}, {55, 57, 10, 29}, {55, 58, 10, 29}, {55, 59, 10, 29}, 1941 {56, 40, 10, 29}, {56, 41, 10, 29}, {56, 42, 10, 29}, {56, 43, 10, 29}, {56, 44, 10, 29}, 1942 {56, 45, 10, 29}, {56, 46, 10, 29}, {56, 47, 10, 29}, {56, 48, 10, 29}, {56, 49, 10, 29}, 1943 {56, 50, 10, 29}, {56, 51, 10, 29}, {56, 52, 10, 29}, {56, 53, 10, 29}, {56, 54, 10, 29}, 1944 {56, 55, 10, 29}, {56, 56, 10, 29}, {56, 57, 10, 29}, {56, 58, 10, 29}, {56, 59, 10, 29}, 1945 {57, 40, 10, 29}, {57, 41, 10, 29}, {57, 42, 10, 29}, {57, 43, 10, 29}, {57, 44, 10, 29}, 1946 {57, 45, 10, 29}, {57, 46, 10, 29}, {57, 47, 10, 29}, {57, 48, 10, 29}, {57, 49, 10, 29}, 1947 {57, 50, 10, 29}, {57, 51, 10, 29}, {57, 52, 10, 29}, {57, 53, 10, 29}, {57, 54, 10, 29}, 1948 {57, 55, 10, 29}, {57, 56, 10, 29}, {57, 57, 10, 29}, {57, 58, 10, 29}, {57, 59, 10, 29}, 1949 {58, 40, 10, 29}, {58, 41, 10, 29}, {58, 42, 10, 29}, {58, 43, 10, 29}, {58, 44, 10, 29}, 1950 {58, 45, 10, 29}, {58, 46, 10, 29}, {58, 47, 10, 29}, {58, 48, 10, 29}, {58, 49, 10, 29}, 1951 {58, 50, 10, 29}, {58, 51, 10, 29}, {58, 52, 10, 29}, {58, 53, 10, 29}, {58, 54, 10, 29}, 1952 {58, 55, 10, 29}, {58, 56, 10, 29}, {58, 57, 10, 29}, {58, 58, 10, 29}, {58, 59, 10, 29}, 1953 {59, 40, 10, 29}, {59, 41, 10, 29}, {59, 42, 10, 29}, {59, 43, 10, 29}, {59, 44, 10, 29}, 1954 {59, 45, 10, 29}, {59, 46, 10, 29}, {59, 47, 10, 29}, {59, 48, 10, 29}, {59, 49, 10, 29}, 1955 {59, 50, 10, 29}, {59, 51, 10, 29}, {59, 52, 10, 29}, {59, 53, 10, 29}, {59, 54, 10, 29}, 1956 {59, 55, 10, 29}, {59, 56, 10, 29}, {59, 57, 10, 29}, {59, 58, 10, 29}, {59, 59, 10, 29}, 1957 {60, 40, 10, 29}, {60, 41, 10, 29}, {60, 42, 10, 29}, {60, 43, 10, 29}, {60, 44, 10, 29}, 1958 {60, 45, 10, 29}, {60, 46, 10, 29}, {60, 47, 10, 29}, {60, 48, 10, 29}, {60, 49, 10, 29}, 1959 {60, 50, 10, 29}, {60, 51, 10, 29}, {60, 52, 10, 29}, {60, 53, 10, 29}, {60, 54, 10, 29}, 1960 {60, 55, 10, 29}, {60, 56, 10, 29}, {60, 57, 10, 29}, {60, 58, 10, 29}, {60, 59, 10, 29}, 1961 {61, 40, 10, 29}, {61, 41, 10, 29}, {61, 42, 10, 29}, {61, 43, 10, 29}, {61, 44, 10, 29}, 1962 {61, 45, 10, 29}, {61, 46, 10, 29}, {61, 47, 10, 29}, {61, 48, 10, 29}, {61, 49, 10, 29}, 1963 {61, 50, 10, 29}, {61, 51, 10, 29}, {61, 52, 10, 29}, {61, 53, 10, 29}, {61, 54, 10, 29}, 1964 {61, 55, 10, 29}, {61, 56, 10, 29}, {61, 57, 10, 29}, {61, 58, 10, 29}, {61, 59, 10, 29}, 1965 {62, 40, 10, 29}, {62, 41, 10, 29}, {62, 42, 10, 29}, {62, 43, 10, 29}, {62, 44, 10, 29}, 1966 {62, 45, 10, 29}, {62, 46, 10, 29}, {62, 47, 10, 29}, {62, 48, 10, 29}, {62, 49, 10, 29}, 1967 {62, 50, 10, 29}, {62, 51, 10, 29}, {62, 52, 10, 29}, {62, 53, 10, 29}, {62, 54, 10, 29}, 1968 {62, 55, 10, 29}, {62, 56, 10, 29}, {62, 57, 10, 29}, {62, 58, 10, 29}, {62, 59, 10, 29}, 1969 {63, 40, 10, 29}, {63, 41, 10, 29}, {63, 42, 10, 29}, {63, 43, 10, 29}, {63, 44, 10, 29}, 1970 {63, 45, 10, 29}, {63, 46, 10, 29}, {63, 47, 10, 29}, {63, 48, 10, 29}, {63, 49, 10, 29}, 1971 {63, 50, 10, 29}, {63, 51, 10, 29}, {63, 52, 10, 29}, {63, 53, 10, 29}, {63, 54, 10, 29}, 1972 {63, 55, 10, 29}, {63, 56, 10, 29}, {63, 57, 10, 29}, {63, 58, 10, 29}, {63, 59, 10, 29}, 1973 {64, 40, 10, 29}, {64, 41, 10, 29}, {64, 42, 10, 29}, {64, 43, 10, 29}, {64, 44, 10, 29}, 1974 {64, 45, 10, 29}, {64, 46, 10, 29}, {64, 47, 10, 29}, {64, 48, 10, 29}, {64, 49, 10, 29}, 1975 {64, 50, 10, 29}, {64, 51, 10, 29}, {64, 52, 10, 29}, {64, 53, 10, 29}, {64, 54, 10, 29}, 1976 {64, 55, 10, 29}, {64, 56, 10, 29}, {64, 57, 10, 29}, {64, 58, 10, 29}, {64, 59, 10, 29}, 1977 {65, 40, 10, 29}, {65, 41, 10, 29}, {65, 42, 10, 29}, {65, 43, 10, 29}, {65, 44, 10, 29}, 1978 {65, 45, 10, 29}, {65, 46, 10, 29}, {65, 47, 10, 29}, {65, 48, 10, 29}, {65, 49, 10, 29}, 1979 {65, 50, 10, 29}, {65, 51, 10, 29}, {65, 52, 10, 29}, {65, 53, 10, 29}, {65, 54, 10, 29}, 1980 {65, 55, 10, 29}, {65, 56, 10, 29}, {65, 57, 10, 29}, {65, 58, 10, 29}, {65, 59, 10, 29}, 1981 {66, 40, 10, 29}, {66, 41, 10, 29}, {66, 42, 10, 29}, {66, 43, 10, 29}, {66, 44, 10, 29}, 1982 {66, 45, 10, 29}, {66, 46, 10, 29}, {66, 47, 10, 29}, {66, 48, 10, 29}, {66, 49, 10, 29}, 1983 {66, 50, 10, 29}, {66, 51, 10, 29}, {66, 52, 10, 29}, {66, 53, 10, 29}, {66, 54, 10, 29}, 1984 {66, 55, 10, 29}, {66, 56, 10, 29}, {66, 57, 10, 29}, {66, 58, 10, 29}, {66, 59, 10, 29}, 1985 {67, 40, 10, 29}, {67, 41, 10, 29}, {67, 42, 10, 29}, {67, 43, 10, 29}, {67, 44, 10, 29}, 1986 {67, 45, 10, 29}, {67, 46, 10, 29}, {67, 47, 10, 29}, {67, 48, 10, 29}, {67, 49, 10, 29}, 1987 {67, 50, 10, 29}, {67, 51, 10, 29}, {67, 52, 10, 29}, {67, 53, 10, 29}, {67, 54, 10, 29}, 1988 {67, 55, 10, 29}, {67, 56, 10, 29}, {67, 57, 10, 29}, {67, 58, 10, 29}, {67, 59, 10, 29}, 1989 {68, 40, 10, 29}, {68, 41, 10, 29}, {68, 42, 10, 29}, {68, 43, 10, 29}, {68, 44, 10, 29}, 1990 {68, 45, 10, 29}, {68, 46, 10, 29}, {68, 47, 10, 29}, {68, 48, 10, 29}, {68, 49, 10, 29}, 1991 {68, 50, 10, 29}, {68, 51, 10, 29}, {68, 52, 10, 29}, {68, 53, 10, 29}, {68, 54, 10, 29}, 1992 {68, 55, 10, 29}, {68, 56, 10, 29}, {68, 57, 10, 29}, {68, 58, 10, 29}, {68, 59, 10, 29}, 1993 {69, 40, 10, 29}, {69, 41, 10, 29}, {69, 42, 10, 29}, {69, 43, 10, 29}, {69, 44, 10, 29}, 1994 {69, 45, 10, 29}, {69, 46, 10, 29}, {69, 47, 10, 29}, {69, 48, 10, 29}, {69, 49, 10, 29}, 1995 {69, 50, 10, 29}, {69, 51, 10, 29}, {69, 52, 10, 29}, {69, 53, 10, 29}, {69, 54, 10, 29}, 1996 {69, 55, 10, 29}, {69, 56, 10, 29}, {69, 57, 10, 29}, {69, 58, 10, 29}, {69, 59, 10, 29}, 1997 {70, 40, 10, 29}, {70, 41, 10, 29}, {70, 42, 10, 29}, {70, 43, 10, 29}, {70, 44, 10, 29}, 1998 {70, 45, 10, 29}, {70, 46, 10, 29}, {70, 47, 10, 29}, {70, 48, 10, 29}, {70, 49, 10, 29}, 1999 {70, 50, 10, 29}, {70, 51, 10, 29}, {70, 52, 10, 29}, {70, 53, 10, 29}, {70, 54, 10, 29}, 2000 {70, 55, 10, 29}, {70, 56, 10, 29}, {70, 57, 10, 29}, {70, 58, 10, 29}, {70, 59, 10, 29}, 2001 {71, 40, 10, 29}, {71, 41, 10, 29}, {71, 42, 10, 29}, {71, 43, 10, 29}, {71, 44, 10, 29}, 2002 {71, 45, 10, 29}, {71, 46, 10, 29}, {71, 47, 10, 29}, {71, 48, 10, 29}, {71, 49, 10, 29}, 2003 {71, 50, 10, 29}, {71, 51, 10, 29}, {71, 52, 10, 29}, {71, 53, 10, 29}, {71, 54, 10, 29}, 2004 {71, 55, 10, 29}, {71, 56, 10, 29}, {71, 57, 10, 29}, {71, 58, 10, 29}, {71, 59, 10, 29}, 2005 {72, 40, 10, 29}, {72, 41, 10, 29}, {72, 42, 10, 29}, {72, 43, 10, 29}, {72, 44, 10, 29}, 2006 {72, 45, 10, 29}, {72, 46, 10, 29}, {72, 47, 10, 29}, {72, 48, 10, 29}, {72, 49, 10, 29}, 2007 {72, 50, 10, 29}, {72, 51, 10, 29}, {72, 52, 10, 29}, {72, 53, 10, 29}, {72, 54, 10, 29}, 2008 {72, 55, 10, 29}, {72, 56, 10, 29}, {72, 57, 10, 29}, {72, 58, 10, 29}, {72, 59, 10, 29}, 2009 {73, 40, 10, 29}, {73, 41, 10, 29}, {73, 42, 10, 29}, {73, 43, 10, 29}, {73, 44, 10, 29}, 2010 {73, 45, 10, 29}, {73, 46, 10, 29}, {73, 47, 10, 29}, {73, 48, 10, 29}, {73, 49, 10, 29}, 2011 {73, 50, 10, 29}, {73, 51, 10, 29}, {73, 52, 10, 29}, {73, 53, 10, 29}, {73, 54, 10, 29}, 2012 {73, 55, 10, 29}, {73, 56, 10, 29}, {73, 57, 10, 29}, {73, 58, 10, 29}, {73, 59, 10, 29}, 2013 {74, 40, 10, 29}, {74, 41, 10, 29}, {74, 42, 10, 29}, {74, 43, 10, 29}, {74, 44, 10, 29}, 2014 {74, 45, 10, 29}, {74, 46, 10, 29}, {74, 47, 10, 29}, {74, 48, 10, 29}, {74, 49, 10, 29}, 2015 {74, 50, 10, 29}, {74, 51, 10, 29}, {74, 52, 10, 29}, {74, 53, 10, 29}, {74, 54, 10, 29}, 2016 {74, 55, 10, 29}, {74, 56, 10, 29}, {74, 57, 10, 29}, {74, 58, 10, 29}, {74, 59, 10, 29}, 2017 {75, 40, 10, 29}, {75, 41, 10, 29}, {75, 42, 10, 29}, {75, 43, 10, 29}, {75, 44, 10, 29}, 2018 {75, 45, 10, 29}, {75, 46, 10, 29}, {75, 47, 10, 29}, {75, 48, 10, 29}, {75, 49, 10, 29}, 2019 {75, 50, 10, 29}, {75, 51, 10, 29}, {75, 52, 10, 29}, {75, 53, 10, 29}, {75, 54, 10, 29}, 2020 {75, 55, 10, 29}, {75, 56, 10, 29}, {75, 57, 10, 29}, {75, 58, 10, 29}, {75, 59, 10, 29}, 2021 {76, 40, 10, 29}, {76, 41, 10, 29}, {76, 42, 10, 29}, {76, 43, 10, 29}, {76, 44, 10, 29}, 2022 {76, 45, 10, 29}, {76, 46, 10, 29}, {76, 47, 10, 29}, {76, 48, 10, 29}, {76, 49, 10, 29}, 2023 {76, 50, 10, 29}, {76, 51, 10, 29}, {76, 52, 10, 29}, {76, 53, 10, 29}, {76, 54, 10, 29}, 2024 {76, 55, 10, 29}, {76, 56, 10, 29}, {76, 57, 10, 29}, {76, 58, 10, 29}, {76, 59, 10, 29}, 2025 {77, 40, 10, 29}, {77, 41, 10, 29}, {77, 42, 10, 29}, {77, 43, 10, 29}, {77, 44, 10, 29}, 2026 {77, 45, 10, 29}, {77, 46, 10, 29}, {77, 47, 10, 29}, {77, 48, 10, 29}, {77, 49, 10, 29}, 2027 {77, 50, 10, 29}, {77, 51, 10, 29}, {77, 52, 10, 29}, {77, 53, 10, 29}, {77, 54, 10, 29}, 2028 {77, 55, 10, 29}, {77, 56, 10, 29}, {77, 57, 10, 29}, {77, 58, 10, 29}, {77, 59, 10, 29}, 2029 {78, 40, 10, 29}, {78, 41, 10, 29}, {78, 42, 10, 29}, {78, 43, 10, 29}, {78, 44, 10, 29}, 2030 {78, 45, 10, 29}, {78, 46, 10, 29}, {78, 47, 10, 29}, {78, 48, 10, 29}, {78, 49, 10, 29}, 2031 {78, 50, 10, 29}, {78, 51, 10, 29}, {78, 52, 10, 29}, {78, 53, 10, 29}, {78, 54, 10, 29}, 2032 {78, 55, 10, 29}, {78, 56, 10, 29}, {78, 57, 10, 29}, {78, 58, 10, 29}, {78, 59, 10, 29}, 2033 {79, 40, 10, 29}, {79, 41, 10, 29}, {79, 42, 10, 29}, {79, 43, 10, 29}, {79, 44, 10, 29}, 2034 {79, 45, 10, 29}, {79, 46, 10, 29}, {79, 47, 10, 29}, {79, 48, 10, 29}, {79, 49, 10, 29}, 2035 {79, 50, 10, 29}, {79, 51, 10, 29}, {79, 52, 10, 29}, {79, 53, 10, 29}, {79, 54, 10, 29}, 2036 {79, 55, 10, 29}, {79, 56, 10, 29}, {79, 57, 10, 29}, {79, 58, 10, 29}, {79, 59, 10, 29}, 2037 {80, 40, 10, 29}, {80, 41, 10, 29}, {80, 42, 10, 29}, {80, 43, 10, 29}, {80, 44, 10, 29}, 2038 {80, 45, 10, 29}, {80, 46, 10, 29}, {80, 47, 10, 29}, {80, 48, 10, 29}, {80, 49, 10, 29}, 2039 {80, 50, 10, 29}, {80, 51, 10, 29}, {80, 52, 10, 29}, {80, 53, 10, 29}, {80, 54, 10, 29}, 2040 {80, 55, 10, 29}, {80, 56, 10, 29}, {80, 57, 10, 29}, {80, 58, 10, 29}, {80, 59, 10, 29}, 2041 {81, 40, 10, 29}, {81, 41, 10, 29}, {81, 42, 10, 29}, {81, 43, 10, 29}, {81, 44, 10, 29}, 2042 {81, 45, 10, 29}, {81, 46, 10, 29}, {81, 47, 10, 29}, {81, 48, 10, 29}, {81, 49, 10, 29}, 2043 {81, 50, 10, 29}, {81, 51, 10, 29}, {81, 52, 10, 29}, {81, 53, 10, 29}, {81, 54, 10, 29}, 2044 {81, 55, 10, 29}, {81, 56, 10, 29}, {81, 57, 10, 29}, {81, 58, 10, 29}, {81, 59, 10, 29}, 2045 {82, 40, 10, 29}, {82, 41, 10, 29}, {82, 42, 10, 29}, {82, 43, 10, 29}, {82, 44, 10, 29}, 2046 {82, 45, 10, 29}, {82, 46, 10, 29}, {82, 47, 10, 29}, {82, 48, 10, 29}, {82, 49, 10, 29}, 2047 {82, 50, 10, 29}, {82, 51, 10, 29}, {82, 52, 10, 29}, {82, 53, 10, 29}, {82, 54, 10, 29}, 2048 {82, 55, 10, 29}, {82, 56, 10, 29}, {82, 57, 10, 29}, {82, 58, 10, 29}, {82, 59, 10, 29}, 2049 {83, 40, 10, 29}, {83, 41, 10, 29}, {83, 42, 10, 29}, {83, 43, 10, 29}, {83, 44, 10, 29}, 2050 {83, 45, 10, 29}, {83, 46, 10, 29}, {83, 47, 10, 29}, {83, 48, 10, 29}, {83, 49, 10, 29}, 2051 {83, 50, 10, 29}, {83, 51, 10, 29}, {83, 52, 10, 29}, {83, 53, 10, 29}, {83, 54, 10, 29}, 2052 {83, 55, 10, 29}, {83, 56, 10, 29}, {83, 57, 10, 29}, {83, 58, 10, 29}, {83, 59, 10, 29}, 2053 {84, 40, 10, 29}, {84, 41, 10, 29}, {84, 42, 10, 29}, {84, 43, 10, 29}, {84, 44, 10, 29}, 2054 {84, 45, 10, 29}, {84, 46, 10, 29}, {84, 47, 10, 29}, {84, 48, 10, 29}, {84, 49, 10, 29}, 2055 {84, 50, 10, 29}, {84, 51, 10, 29}, {84, 52, 10, 29}, {84, 53, 10, 29}, {84, 54, 10, 29}, 2056 {84, 55, 10, 29}, {84, 56, 10, 29}, {84, 57, 10, 29}, {84, 58, 10, 29}, {84, 59, 10, 29}, 2057 {85, 40, 10, 29}, {85, 41, 10, 29}, {85, 42, 10, 29}, {85, 43, 10, 29}, {85, 44, 10, 29}, 2058 {85, 45, 10, 29}, {85, 46, 10, 29}, {85, 47, 10, 29}, {85, 48, 10, 29}, {85, 49, 10, 29}, 2059 {85, 50, 10, 29}, {85, 51, 10, 29}, {85, 52, 10, 29}, {85, 53, 10, 29}, {85, 54, 10, 29}, 2060 {85, 55, 10, 29}, {85, 56, 10, 29}, {85, 57, 10, 29}, {85, 58, 10, 29}, {85, 59, 10, 29}, 2061 {86, 40, 10, 29}, {86, 41, 10, 29}, {86, 42, 10, 29}, {86, 43, 10, 29}, {86, 44, 10, 29}, 2062 {86, 45, 10, 29}, {86, 46, 10, 29}, {86, 47, 10, 29}, {86, 48, 10, 29}, {86, 49, 10, 29}, 2063 {86, 50, 10, 29}, {86, 51, 10, 29}, {86, 52, 10, 29}, {86, 53, 10, 29}, {86, 54, 10, 29}, 2064 {86, 55, 10, 29}, {86, 56, 10, 29}, {86, 57, 10, 29}, {86, 58, 10, 29}, {86, 59, 10, 29}, 2065 {87, 40, 10, 29}, {87, 41, 10, 29}, {87, 42, 10, 29}, {87, 43, 10, 29}, {87, 44, 10, 29}, 2066 {87, 45, 10, 29}, {87, 46, 10, 29}, {87, 47, 10, 29}, {87, 48, 10, 29}, {87, 49, 10, 29}, 2067 {87, 50, 10, 29}, {87, 51, 10, 29}, {87, 52, 10, 29}, {87, 53, 10, 29}, {87, 54, 10, 29}, 2068 {87, 55, 10, 29}, {87, 56, 10, 29}, {87, 57, 10, 29}, {87, 58, 10, 29}, {87, 59, 10, 29}, 2069 {88, 40, 10, 29}, {88, 41, 10, 29}, {88, 42, 10, 29}, {88, 43, 10, 29}, {88, 44, 10, 29}, 2070 {88, 45, 10, 29}, {88, 46, 10, 29}, {88, 47, 10, 29}, {88, 48, 10, 29}, {88, 49, 10, 29}, 2071 {88, 50, 10, 29}, {88, 51, 10, 29}, {88, 52, 10, 29}, {88, 53, 10, 29}, {88, 54, 10, 29}, 2072 {88, 55, 10, 29}, {88, 56, 10, 29}, {88, 57, 10, 29}, {88, 58, 10, 29}, {88, 59, 10, 29}, 2073 {89, 40, 10, 29}, {89, 41, 10, 29}, {89, 42, 10, 29}, {89, 43, 10, 29}, {89, 44, 10, 29}, 2074 {89, 45, 10, 29}, {89, 46, 10, 29}, {89, 47, 10, 29}, {89, 48, 10, 29}, {89, 49, 10, 29}, 2075 {89, 50, 10, 29}, {89, 51, 10, 29}, {89, 52, 10, 29}, {89, 53, 10, 29}, {89, 54, 10, 29}, 2076 {89, 55, 10, 29}, {89, 56, 10, 29}, {89, 57, 10, 29}, {89, 58, 10, 29}, {89, 59, 10, 29}, 2077 }, 2078 } 2079 body2 = testBody{ 2080 label: 2, 2081 offset: dvid.Point3d{30, 20, 40}, 2082 size: dvid.Point3d{50, 50, 20}, 2083 blockSpans: []dvid.Span{ 2084 {1, 0, 0, 2}, 2085 {1, 1, 0, 2}, 2086 {1, 2, 0, 2}, 2087 }, 2088 voxelSpans: []dvid.Span{ 2089 {40, 20, 30, 31}, {40, 21, 30, 31}, {40, 22, 30, 31}, {40, 23, 30, 31}, {40, 24, 30, 31}, 2090 {40, 25, 30, 31}, {40, 26, 30, 31}, {40, 27, 30, 31}, {40, 28, 30, 31}, {40, 29, 30, 31}, 2091 {40, 30, 30, 31}, {40, 31, 30, 31}, {41, 20, 30, 31}, {41, 21, 30, 31}, {41, 22, 30, 31}, 2092 {41, 23, 30, 31}, {41, 24, 30, 31}, {41, 25, 30, 31}, {41, 26, 30, 31}, {41, 27, 30, 31}, 2093 {41, 28, 30, 31}, {41, 29, 30, 31}, {41, 30, 30, 31}, {41, 31, 30, 31}, {42, 20, 30, 31}, 2094 {42, 21, 30, 31}, {42, 22, 30, 31}, {42, 23, 30, 31}, {42, 24, 30, 31}, {42, 25, 30, 31}, 2095 {42, 26, 30, 31}, {42, 27, 30, 31}, {42, 28, 30, 31}, {42, 29, 30, 31}, {42, 30, 30, 31}, 2096 {42, 31, 30, 31}, {43, 20, 30, 31}, {43, 21, 30, 31}, {43, 22, 30, 31}, {43, 23, 30, 31}, 2097 {43, 24, 30, 31}, {43, 25, 30, 31}, {43, 26, 30, 31}, {43, 27, 30, 31}, {43, 28, 30, 31}, 2098 {43, 29, 30, 31}, {43, 30, 30, 31}, {43, 31, 30, 31}, {44, 20, 30, 31}, {44, 21, 30, 31}, 2099 {44, 22, 30, 31}, {44, 23, 30, 31}, {44, 24, 30, 31}, {44, 25, 30, 31}, {44, 26, 30, 31}, 2100 {44, 27, 30, 31}, {44, 28, 30, 31}, {44, 29, 30, 31}, {44, 30, 30, 31}, {44, 31, 30, 31}, 2101 {45, 20, 30, 31}, {45, 21, 30, 31}, {45, 22, 30, 31}, {45, 23, 30, 31}, {45, 24, 30, 31}, 2102 {45, 25, 30, 31}, {45, 26, 30, 31}, {45, 27, 30, 31}, {45, 28, 30, 31}, {45, 29, 30, 31}, 2103 {45, 30, 30, 31}, {45, 31, 30, 31}, {46, 20, 30, 31}, {46, 21, 30, 31}, {46, 22, 30, 31}, 2104 {46, 23, 30, 31}, {46, 24, 30, 31}, {46, 25, 30, 31}, {46, 26, 30, 31}, {46, 27, 30, 31}, 2105 {46, 28, 30, 31}, {46, 29, 30, 31}, {46, 30, 30, 31}, {46, 31, 30, 31}, {47, 20, 30, 31}, 2106 {47, 21, 30, 31}, {47, 22, 30, 31}, {47, 23, 30, 31}, {47, 24, 30, 31}, {47, 25, 30, 31}, 2107 {47, 26, 30, 31}, {47, 27, 30, 31}, {47, 28, 30, 31}, {47, 29, 30, 31}, {47, 30, 30, 31}, 2108 {47, 31, 30, 31}, {48, 20, 30, 31}, {48, 21, 30, 31}, {48, 22, 30, 31}, {48, 23, 30, 31}, 2109 {48, 24, 30, 31}, {48, 25, 30, 31}, {48, 26, 30, 31}, {48, 27, 30, 31}, {48, 28, 30, 31}, 2110 {48, 29, 30, 31}, {48, 30, 30, 31}, {48, 31, 30, 31}, {49, 20, 30, 31}, {49, 21, 30, 31}, 2111 {49, 22, 30, 31}, {49, 23, 30, 31}, {49, 24, 30, 31}, {49, 25, 30, 31}, {49, 26, 30, 31}, 2112 {49, 27, 30, 31}, {49, 28, 30, 31}, {49, 29, 30, 31}, {49, 30, 30, 31}, {49, 31, 30, 31}, 2113 {50, 20, 30, 31}, {50, 21, 30, 31}, {50, 22, 30, 31}, {50, 23, 30, 31}, {50, 24, 30, 31}, 2114 {50, 25, 30, 31}, {50, 26, 30, 31}, {50, 27, 30, 31}, {50, 28, 30, 31}, {50, 29, 30, 31}, 2115 {50, 30, 30, 31}, {50, 31, 30, 31}, {51, 20, 30, 31}, {51, 21, 30, 31}, {51, 22, 30, 31}, 2116 {51, 23, 30, 31}, {51, 24, 30, 31}, {51, 25, 30, 31}, {51, 26, 30, 31}, {51, 27, 30, 31}, 2117 {51, 28, 30, 31}, {51, 29, 30, 31}, {51, 30, 30, 31}, {51, 31, 30, 31}, {52, 20, 30, 31}, 2118 {52, 21, 30, 31}, {52, 22, 30, 31}, {52, 23, 30, 31}, {52, 24, 30, 31}, {52, 25, 30, 31}, 2119 {52, 26, 30, 31}, {52, 27, 30, 31}, {52, 28, 30, 31}, {52, 29, 30, 31}, {52, 30, 30, 31}, 2120 {52, 31, 30, 31}, {53, 20, 30, 31}, {53, 21, 30, 31}, {53, 22, 30, 31}, {53, 23, 30, 31}, 2121 {53, 24, 30, 31}, {53, 25, 30, 31}, {53, 26, 30, 31}, {53, 27, 30, 31}, {53, 28, 30, 31}, 2122 {53, 29, 30, 31}, {53, 30, 30, 31}, {53, 31, 30, 31}, {54, 20, 30, 31}, {54, 21, 30, 31}, 2123 {54, 22, 30, 31}, {54, 23, 30, 31}, {54, 24, 30, 31}, {54, 25, 30, 31}, {54, 26, 30, 31}, 2124 {54, 27, 30, 31}, {54, 28, 30, 31}, {54, 29, 30, 31}, {54, 30, 30, 31}, {54, 31, 30, 31}, 2125 {55, 20, 30, 31}, {55, 21, 30, 31}, {55, 22, 30, 31}, {55, 23, 30, 31}, {55, 24, 30, 31}, 2126 {55, 25, 30, 31}, {55, 26, 30, 31}, {55, 27, 30, 31}, {55, 28, 30, 31}, {55, 29, 30, 31}, 2127 {55, 30, 30, 31}, {55, 31, 30, 31}, {56, 20, 30, 31}, {56, 21, 30, 31}, {56, 22, 30, 31}, 2128 {56, 23, 30, 31}, {56, 24, 30, 31}, {56, 25, 30, 31}, {56, 26, 30, 31}, {56, 27, 30, 31}, 2129 {56, 28, 30, 31}, {56, 29, 30, 31}, {56, 30, 30, 31}, {56, 31, 30, 31}, {57, 20, 30, 31}, 2130 {57, 21, 30, 31}, {57, 22, 30, 31}, {57, 23, 30, 31}, {57, 24, 30, 31}, {57, 25, 30, 31}, 2131 {57, 26, 30, 31}, {57, 27, 30, 31}, {57, 28, 30, 31}, {57, 29, 30, 31}, {57, 30, 30, 31}, 2132 {57, 31, 30, 31}, {58, 20, 30, 31}, {58, 21, 30, 31}, {58, 22, 30, 31}, {58, 23, 30, 31}, 2133 {58, 24, 30, 31}, {58, 25, 30, 31}, {58, 26, 30, 31}, {58, 27, 30, 31}, {58, 28, 30, 31}, 2134 {58, 29, 30, 31}, {58, 30, 30, 31}, {58, 31, 30, 31}, {59, 20, 30, 31}, {59, 21, 30, 31}, 2135 {59, 22, 30, 31}, {59, 23, 30, 31}, {59, 24, 30, 31}, {59, 25, 30, 31}, {59, 26, 30, 31}, 2136 {59, 27, 30, 31}, {59, 28, 30, 31}, {59, 29, 30, 31}, {59, 30, 30, 31}, {59, 31, 30, 31}, 2137 {40, 20, 32, 63}, {40, 21, 32, 63}, {40, 22, 32, 63}, {40, 23, 32, 63}, {40, 24, 32, 63}, 2138 {40, 25, 32, 63}, {40, 26, 32, 63}, {40, 27, 32, 63}, {40, 28, 32, 63}, {40, 29, 32, 63}, 2139 {40, 30, 32, 63}, {40, 31, 32, 63}, {41, 20, 32, 63}, {41, 21, 32, 63}, {41, 22, 32, 63}, 2140 {41, 23, 32, 63}, {41, 24, 32, 63}, {41, 25, 32, 63}, {41, 26, 32, 63}, {41, 27, 32, 63}, 2141 {41, 28, 32, 63}, {41, 29, 32, 63}, {41, 30, 32, 63}, {41, 31, 32, 63}, {42, 20, 32, 63}, 2142 {42, 21, 32, 63}, {42, 22, 32, 63}, {42, 23, 32, 63}, {42, 24, 32, 63}, {42, 25, 32, 63}, 2143 {42, 26, 32, 63}, {42, 27, 32, 63}, {42, 28, 32, 63}, {42, 29, 32, 63}, {42, 30, 32, 63}, 2144 {42, 31, 32, 63}, {43, 20, 32, 63}, {43, 21, 32, 63}, {43, 22, 32, 63}, {43, 23, 32, 63}, 2145 {43, 24, 32, 63}, {43, 25, 32, 63}, {43, 26, 32, 63}, {43, 27, 32, 63}, {43, 28, 32, 63}, 2146 {43, 29, 32, 63}, {43, 30, 32, 63}, {43, 31, 32, 63}, {44, 20, 32, 63}, {44, 21, 32, 63}, 2147 {44, 22, 32, 63}, {44, 23, 32, 63}, {44, 24, 32, 63}, {44, 25, 32, 63}, {44, 26, 32, 63}, 2148 {44, 27, 32, 63}, {44, 28, 32, 63}, {44, 29, 32, 63}, {44, 30, 32, 63}, {44, 31, 32, 63}, 2149 {45, 20, 32, 63}, {45, 21, 32, 63}, {45, 22, 32, 63}, {45, 23, 32, 63}, {45, 24, 32, 63}, 2150 {45, 25, 32, 63}, {45, 26, 32, 63}, {45, 27, 32, 63}, {45, 28, 32, 63}, {45, 29, 32, 63}, 2151 {45, 30, 32, 63}, {45, 31, 32, 63}, {46, 20, 32, 63}, {46, 21, 32, 63}, {46, 22, 32, 63}, 2152 {46, 23, 32, 63}, {46, 24, 32, 63}, {46, 25, 32, 63}, {46, 26, 32, 63}, {46, 27, 32, 63}, 2153 {46, 28, 32, 63}, {46, 29, 32, 63}, {46, 30, 32, 63}, {46, 31, 32, 63}, {47, 20, 32, 63}, 2154 {47, 21, 32, 63}, {47, 22, 32, 63}, {47, 23, 32, 63}, {47, 24, 32, 63}, {47, 25, 32, 63}, 2155 {47, 26, 32, 63}, {47, 27, 32, 63}, {47, 28, 32, 63}, {47, 29, 32, 63}, {47, 30, 32, 63}, 2156 {47, 31, 32, 63}, {48, 20, 32, 63}, {48, 21, 32, 63}, {48, 22, 32, 63}, {48, 23, 32, 63}, 2157 {48, 24, 32, 63}, {48, 25, 32, 63}, {48, 26, 32, 63}, {48, 27, 32, 63}, {48, 28, 32, 63}, 2158 {48, 29, 32, 63}, {48, 30, 32, 63}, {48, 31, 32, 63}, {49, 20, 32, 63}, {49, 21, 32, 63}, 2159 {49, 22, 32, 63}, {49, 23, 32, 63}, {49, 24, 32, 63}, {49, 25, 32, 63}, {49, 26, 32, 63}, 2160 {49, 27, 32, 63}, {49, 28, 32, 63}, {49, 29, 32, 63}, {49, 30, 32, 63}, {49, 31, 32, 63}, 2161 {50, 20, 32, 63}, {50, 21, 32, 63}, {50, 22, 32, 63}, {50, 23, 32, 63}, {50, 24, 32, 63}, 2162 {50, 25, 32, 63}, {50, 26, 32, 63}, {50, 27, 32, 63}, {50, 28, 32, 63}, {50, 29, 32, 63}, 2163 {50, 30, 32, 63}, {50, 31, 32, 63}, {51, 20, 32, 63}, {51, 21, 32, 63}, {51, 22, 32, 63}, 2164 {51, 23, 32, 63}, {51, 24, 32, 63}, {51, 25, 32, 63}, {51, 26, 32, 63}, {51, 27, 32, 63}, 2165 {51, 28, 32, 63}, {51, 29, 32, 63}, {51, 30, 32, 63}, {51, 31, 32, 63}, {52, 20, 32, 63}, 2166 {52, 21, 32, 63}, {52, 22, 32, 63}, {52, 23, 32, 63}, {52, 24, 32, 63}, {52, 25, 32, 63}, 2167 {52, 26, 32, 63}, {52, 27, 32, 63}, {52, 28, 32, 63}, {52, 29, 32, 63}, {52, 30, 32, 63}, 2168 {52, 31, 32, 63}, {53, 20, 32, 63}, {53, 21, 32, 63}, {53, 22, 32, 63}, {53, 23, 32, 63}, 2169 {53, 24, 32, 63}, {53, 25, 32, 63}, {53, 26, 32, 63}, {53, 27, 32, 63}, {53, 28, 32, 63}, 2170 {53, 29, 32, 63}, {53, 30, 32, 63}, {53, 31, 32, 63}, {54, 20, 32, 63}, {54, 21, 32, 63}, 2171 {54, 22, 32, 63}, {54, 23, 32, 63}, {54, 24, 32, 63}, {54, 25, 32, 63}, {54, 26, 32, 63}, 2172 {54, 27, 32, 63}, {54, 28, 32, 63}, {54, 29, 32, 63}, {54, 30, 32, 63}, {54, 31, 32, 63}, 2173 {55, 20, 32, 63}, {55, 21, 32, 63}, {55, 22, 32, 63}, {55, 23, 32, 63}, {55, 24, 32, 63}, 2174 {55, 25, 32, 63}, {55, 26, 32, 63}, {55, 27, 32, 63}, {55, 28, 32, 63}, {55, 29, 32, 63}, 2175 {55, 30, 32, 63}, {55, 31, 32, 63}, {56, 20, 32, 63}, {56, 21, 32, 63}, {56, 22, 32, 63}, 2176 {56, 23, 32, 63}, {56, 24, 32, 63}, {56, 25, 32, 63}, {56, 26, 32, 63}, {56, 27, 32, 63}, 2177 {56, 28, 32, 63}, {56, 29, 32, 63}, {56, 30, 32, 63}, {56, 31, 32, 63}, {57, 20, 32, 63}, 2178 {57, 21, 32, 63}, {57, 22, 32, 63}, {57, 23, 32, 63}, {57, 24, 32, 63}, {57, 25, 32, 63}, 2179 {57, 26, 32, 63}, {57, 27, 32, 63}, {57, 28, 32, 63}, {57, 29, 32, 63}, {57, 30, 32, 63}, 2180 {57, 31, 32, 63}, {58, 20, 32, 63}, {58, 21, 32, 63}, {58, 22, 32, 63}, {58, 23, 32, 63}, 2181 {58, 24, 32, 63}, {58, 25, 32, 63}, {58, 26, 32, 63}, {58, 27, 32, 63}, {58, 28, 32, 63}, 2182 {58, 29, 32, 63}, {58, 30, 32, 63}, {58, 31, 32, 63}, {59, 20, 32, 63}, {59, 21, 32, 63}, 2183 {59, 22, 32, 63}, {59, 23, 32, 63}, {59, 24, 32, 63}, {59, 25, 32, 63}, {59, 26, 32, 63}, 2184 {59, 27, 32, 63}, {59, 28, 32, 63}, {59, 29, 32, 63}, {59, 30, 32, 63}, {59, 31, 32, 63}, 2185 {40, 20, 64, 79}, {40, 21, 64, 79}, {40, 22, 64, 79}, {40, 23, 64, 79}, {40, 24, 64, 79}, 2186 {40, 25, 64, 79}, {40, 26, 64, 79}, {40, 27, 64, 79}, {40, 28, 64, 79}, {40, 29, 64, 79}, 2187 {40, 30, 64, 79}, {40, 31, 64, 79}, {41, 20, 64, 79}, {41, 21, 64, 79}, {41, 22, 64, 79}, 2188 {41, 23, 64, 79}, {41, 24, 64, 79}, {41, 25, 64, 79}, {41, 26, 64, 79}, {41, 27, 64, 79}, 2189 {41, 28, 64, 79}, {41, 29, 64, 79}, {41, 30, 64, 79}, {41, 31, 64, 79}, {42, 20, 64, 79}, 2190 {42, 21, 64, 79}, {42, 22, 64, 79}, {42, 23, 64, 79}, {42, 24, 64, 79}, {42, 25, 64, 79}, 2191 {42, 26, 64, 79}, {42, 27, 64, 79}, {42, 28, 64, 79}, {42, 29, 64, 79}, {42, 30, 64, 79}, 2192 {42, 31, 64, 79}, {43, 20, 64, 79}, {43, 21, 64, 79}, {43, 22, 64, 79}, {43, 23, 64, 79}, 2193 {43, 24, 64, 79}, {43, 25, 64, 79}, {43, 26, 64, 79}, {43, 27, 64, 79}, {43, 28, 64, 79}, 2194 {43, 29, 64, 79}, {43, 30, 64, 79}, {43, 31, 64, 79}, {44, 20, 64, 79}, {44, 21, 64, 79}, 2195 {44, 22, 64, 79}, {44, 23, 64, 79}, {44, 24, 64, 79}, {44, 25, 64, 79}, {44, 26, 64, 79}, 2196 {44, 27, 64, 79}, {44, 28, 64, 79}, {44, 29, 64, 79}, {44, 30, 64, 79}, {44, 31, 64, 79}, 2197 {45, 20, 64, 79}, {45, 21, 64, 79}, {45, 22, 64, 79}, {45, 23, 64, 79}, {45, 24, 64, 79}, 2198 {45, 25, 64, 79}, {45, 26, 64, 79}, {45, 27, 64, 79}, {45, 28, 64, 79}, {45, 29, 64, 79}, 2199 {45, 30, 64, 79}, {45, 31, 64, 79}, {46, 20, 64, 79}, {46, 21, 64, 79}, {46, 22, 64, 79}, 2200 {46, 23, 64, 79}, {46, 24, 64, 79}, {46, 25, 64, 79}, {46, 26, 64, 79}, {46, 27, 64, 79}, 2201 {46, 28, 64, 79}, {46, 29, 64, 79}, {46, 30, 64, 79}, {46, 31, 64, 79}, {47, 20, 64, 79}, 2202 {47, 21, 64, 79}, {47, 22, 64, 79}, {47, 23, 64, 79}, {47, 24, 64, 79}, {47, 25, 64, 79}, 2203 {47, 26, 64, 79}, {47, 27, 64, 79}, {47, 28, 64, 79}, {47, 29, 64, 79}, {47, 30, 64, 79}, 2204 {47, 31, 64, 79}, {48, 20, 64, 79}, {48, 21, 64, 79}, {48, 22, 64, 79}, {48, 23, 64, 79}, 2205 {48, 24, 64, 79}, {48, 25, 64, 79}, {48, 26, 64, 79}, {48, 27, 64, 79}, {48, 28, 64, 79}, 2206 {48, 29, 64, 79}, {48, 30, 64, 79}, {48, 31, 64, 79}, {49, 20, 64, 79}, {49, 21, 64, 79}, 2207 {49, 22, 64, 79}, {49, 23, 64, 79}, {49, 24, 64, 79}, {49, 25, 64, 79}, {49, 26, 64, 79}, 2208 {49, 27, 64, 79}, {49, 28, 64, 79}, {49, 29, 64, 79}, {49, 30, 64, 79}, {49, 31, 64, 79}, 2209 {50, 20, 64, 79}, {50, 21, 64, 79}, {50, 22, 64, 79}, {50, 23, 64, 79}, {50, 24, 64, 79}, 2210 {50, 25, 64, 79}, {50, 26, 64, 79}, {50, 27, 64, 79}, {50, 28, 64, 79}, {50, 29, 64, 79}, 2211 {50, 30, 64, 79}, {50, 31, 64, 79}, {51, 20, 64, 79}, {51, 21, 64, 79}, {51, 22, 64, 79}, 2212 {51, 23, 64, 79}, {51, 24, 64, 79}, {51, 25, 64, 79}, {51, 26, 64, 79}, {51, 27, 64, 79}, 2213 {51, 28, 64, 79}, {51, 29, 64, 79}, {51, 30, 64, 79}, {51, 31, 64, 79}, {52, 20, 64, 79}, 2214 {52, 21, 64, 79}, {52, 22, 64, 79}, {52, 23, 64, 79}, {52, 24, 64, 79}, {52, 25, 64, 79}, 2215 {52, 26, 64, 79}, {52, 27, 64, 79}, {52, 28, 64, 79}, {52, 29, 64, 79}, {52, 30, 64, 79}, 2216 {52, 31, 64, 79}, {53, 20, 64, 79}, {53, 21, 64, 79}, {53, 22, 64, 79}, {53, 23, 64, 79}, 2217 {53, 24, 64, 79}, {53, 25, 64, 79}, {53, 26, 64, 79}, {53, 27, 64, 79}, {53, 28, 64, 79}, 2218 {53, 29, 64, 79}, {53, 30, 64, 79}, {53, 31, 64, 79}, {54, 20, 64, 79}, {54, 21, 64, 79}, 2219 {54, 22, 64, 79}, {54, 23, 64, 79}, {54, 24, 64, 79}, {54, 25, 64, 79}, {54, 26, 64, 79}, 2220 {54, 27, 64, 79}, {54, 28, 64, 79}, {54, 29, 64, 79}, {54, 30, 64, 79}, {54, 31, 64, 79}, 2221 {55, 20, 64, 79}, {55, 21, 64, 79}, {55, 22, 64, 79}, {55, 23, 64, 79}, {55, 24, 64, 79}, 2222 {55, 25, 64, 79}, {55, 26, 64, 79}, {55, 27, 64, 79}, {55, 28, 64, 79}, {55, 29, 64, 79}, 2223 {55, 30, 64, 79}, {55, 31, 64, 79}, {56, 20, 64, 79}, {56, 21, 64, 79}, {56, 22, 64, 79}, 2224 {56, 23, 64, 79}, {56, 24, 64, 79}, {56, 25, 64, 79}, {56, 26, 64, 79}, {56, 27, 64, 79}, 2225 {56, 28, 64, 79}, {56, 29, 64, 79}, {56, 30, 64, 79}, {56, 31, 64, 79}, {57, 20, 64, 79}, 2226 {57, 21, 64, 79}, {57, 22, 64, 79}, {57, 23, 64, 79}, {57, 24, 64, 79}, {57, 25, 64, 79}, 2227 {57, 26, 64, 79}, {57, 27, 64, 79}, {57, 28, 64, 79}, {57, 29, 64, 79}, {57, 30, 64, 79}, 2228 {57, 31, 64, 79}, {58, 20, 64, 79}, {58, 21, 64, 79}, {58, 22, 64, 79}, {58, 23, 64, 79}, 2229 {58, 24, 64, 79}, {58, 25, 64, 79}, {58, 26, 64, 79}, {58, 27, 64, 79}, {58, 28, 64, 79}, 2230 {58, 29, 64, 79}, {58, 30, 64, 79}, {58, 31, 64, 79}, {59, 20, 64, 79}, {59, 21, 64, 79}, 2231 {59, 22, 64, 79}, {59, 23, 64, 79}, {59, 24, 64, 79}, {59, 25, 64, 79}, {59, 26, 64, 79}, 2232 {59, 27, 64, 79}, {59, 28, 64, 79}, {59, 29, 64, 79}, {59, 30, 64, 79}, {59, 31, 64, 79}, 2233 {40, 32, 30, 31}, {40, 33, 30, 31}, {40, 34, 30, 31}, {40, 35, 30, 31}, {40, 36, 30, 31}, 2234 {40, 37, 30, 31}, {40, 38, 30, 31}, {40, 39, 30, 31}, {40, 40, 30, 31}, {40, 41, 30, 31}, 2235 {40, 42, 30, 31}, {40, 43, 30, 31}, {40, 44, 30, 31}, {40, 45, 30, 31}, {40, 46, 30, 31}, 2236 {40, 47, 30, 31}, {40, 48, 30, 31}, {40, 49, 30, 31}, {40, 50, 30, 31}, {40, 51, 30, 31}, 2237 {40, 52, 30, 31}, {40, 53, 30, 31}, {40, 54, 30, 31}, {40, 55, 30, 31}, {40, 56, 30, 31}, 2238 {40, 57, 30, 31}, {40, 58, 30, 31}, {40, 59, 30, 31}, {40, 60, 30, 31}, {40, 61, 30, 31}, 2239 {40, 62, 30, 31}, {40, 63, 30, 31}, {41, 32, 30, 31}, {41, 33, 30, 31}, {41, 34, 30, 31}, 2240 {41, 35, 30, 31}, {41, 36, 30, 31}, {41, 37, 30, 31}, {41, 38, 30, 31}, {41, 39, 30, 31}, 2241 {41, 40, 30, 31}, {41, 41, 30, 31}, {41, 42, 30, 31}, {41, 43, 30, 31}, {41, 44, 30, 31}, 2242 {41, 45, 30, 31}, {41, 46, 30, 31}, {41, 47, 30, 31}, {41, 48, 30, 31}, {41, 49, 30, 31}, 2243 {41, 50, 30, 31}, {41, 51, 30, 31}, {41, 52, 30, 31}, {41, 53, 30, 31}, {41, 54, 30, 31}, 2244 {41, 55, 30, 31}, {41, 56, 30, 31}, {41, 57, 30, 31}, {41, 58, 30, 31}, {41, 59, 30, 31}, 2245 {41, 60, 30, 31}, {41, 61, 30, 31}, {41, 62, 30, 31}, {41, 63, 30, 31}, {42, 32, 30, 31}, 2246 {42, 33, 30, 31}, {42, 34, 30, 31}, {42, 35, 30, 31}, {42, 36, 30, 31}, {42, 37, 30, 31}, 2247 {42, 38, 30, 31}, {42, 39, 30, 31}, {42, 40, 30, 31}, {42, 41, 30, 31}, {42, 42, 30, 31}, 2248 {42, 43, 30, 31}, {42, 44, 30, 31}, {42, 45, 30, 31}, {42, 46, 30, 31}, {42, 47, 30, 31}, 2249 {42, 48, 30, 31}, {42, 49, 30, 31}, {42, 50, 30, 31}, {42, 51, 30, 31}, {42, 52, 30, 31}, 2250 {42, 53, 30, 31}, {42, 54, 30, 31}, {42, 55, 30, 31}, {42, 56, 30, 31}, {42, 57, 30, 31}, 2251 {42, 58, 30, 31}, {42, 59, 30, 31}, {42, 60, 30, 31}, {42, 61, 30, 31}, {42, 62, 30, 31}, 2252 {42, 63, 30, 31}, {43, 32, 30, 31}, {43, 33, 30, 31}, {43, 34, 30, 31}, {43, 35, 30, 31}, 2253 {43, 36, 30, 31}, {43, 37, 30, 31}, {43, 38, 30, 31}, {43, 39, 30, 31}, {43, 40, 30, 31}, 2254 {43, 41, 30, 31}, {43, 42, 30, 31}, {43, 43, 30, 31}, {43, 44, 30, 31}, {43, 45, 30, 31}, 2255 {43, 46, 30, 31}, {43, 47, 30, 31}, {43, 48, 30, 31}, {43, 49, 30, 31}, {43, 50, 30, 31}, 2256 {43, 51, 30, 31}, {43, 52, 30, 31}, {43, 53, 30, 31}, {43, 54, 30, 31}, {43, 55, 30, 31}, 2257 {43, 56, 30, 31}, {43, 57, 30, 31}, {43, 58, 30, 31}, {43, 59, 30, 31}, {43, 60, 30, 31}, 2258 {43, 61, 30, 31}, {43, 62, 30, 31}, {43, 63, 30, 31}, {44, 32, 30, 31}, {44, 33, 30, 31}, 2259 {44, 34, 30, 31}, {44, 35, 30, 31}, {44, 36, 30, 31}, {44, 37, 30, 31}, {44, 38, 30, 31}, 2260 {44, 39, 30, 31}, {44, 40, 30, 31}, {44, 41, 30, 31}, {44, 42, 30, 31}, {44, 43, 30, 31}, 2261 {44, 44, 30, 31}, {44, 45, 30, 31}, {44, 46, 30, 31}, {44, 47, 30, 31}, {44, 48, 30, 31}, 2262 {44, 49, 30, 31}, {44, 50, 30, 31}, {44, 51, 30, 31}, {44, 52, 30, 31}, {44, 53, 30, 31}, 2263 {44, 54, 30, 31}, {44, 55, 30, 31}, {44, 56, 30, 31}, {44, 57, 30, 31}, {44, 58, 30, 31}, 2264 {44, 59, 30, 31}, {44, 60, 30, 31}, {44, 61, 30, 31}, {44, 62, 30, 31}, {44, 63, 30, 31}, 2265 {45, 32, 30, 31}, {45, 33, 30, 31}, {45, 34, 30, 31}, {45, 35, 30, 31}, {45, 36, 30, 31}, 2266 {45, 37, 30, 31}, {45, 38, 30, 31}, {45, 39, 30, 31}, {45, 40, 30, 31}, {45, 41, 30, 31}, 2267 {45, 42, 30, 31}, {45, 43, 30, 31}, {45, 44, 30, 31}, {45, 45, 30, 31}, {45, 46, 30, 31}, 2268 {45, 47, 30, 31}, {45, 48, 30, 31}, {45, 49, 30, 31}, {45, 50, 30, 31}, {45, 51, 30, 31}, 2269 {45, 52, 30, 31}, {45, 53, 30, 31}, {45, 54, 30, 31}, {45, 55, 30, 31}, {45, 56, 30, 31}, 2270 {45, 57, 30, 31}, {45, 58, 30, 31}, {45, 59, 30, 31}, {45, 60, 30, 31}, {45, 61, 30, 31}, 2271 {45, 62, 30, 31}, {45, 63, 30, 31}, {46, 32, 30, 31}, {46, 33, 30, 31}, {46, 34, 30, 31}, 2272 {46, 35, 30, 31}, {46, 36, 30, 31}, {46, 37, 30, 31}, {46, 38, 30, 31}, {46, 39, 30, 31}, 2273 {46, 40, 30, 31}, {46, 41, 30, 31}, {46, 42, 30, 31}, {46, 43, 30, 31}, {46, 44, 30, 31}, 2274 {46, 45, 30, 31}, {46, 46, 30, 31}, {46, 47, 30, 31}, {46, 48, 30, 31}, {46, 49, 30, 31}, 2275 {46, 50, 30, 31}, {46, 51, 30, 31}, {46, 52, 30, 31}, {46, 53, 30, 31}, {46, 54, 30, 31}, 2276 {46, 55, 30, 31}, {46, 56, 30, 31}, {46, 57, 30, 31}, {46, 58, 30, 31}, {46, 59, 30, 31}, 2277 {46, 60, 30, 31}, {46, 61, 30, 31}, {46, 62, 30, 31}, {46, 63, 30, 31}, {47, 32, 30, 31}, 2278 {47, 33, 30, 31}, {47, 34, 30, 31}, {47, 35, 30, 31}, {47, 36, 30, 31}, {47, 37, 30, 31}, 2279 {47, 38, 30, 31}, {47, 39, 30, 31}, {47, 40, 30, 31}, {47, 41, 30, 31}, {47, 42, 30, 31}, 2280 {47, 43, 30, 31}, {47, 44, 30, 31}, {47, 45, 30, 31}, {47, 46, 30, 31}, {47, 47, 30, 31}, 2281 {47, 48, 30, 31}, {47, 49, 30, 31}, {47, 50, 30, 31}, {47, 51, 30, 31}, {47, 52, 30, 31}, 2282 {47, 53, 30, 31}, {47, 54, 30, 31}, {47, 55, 30, 31}, {47, 56, 30, 31}, {47, 57, 30, 31}, 2283 {47, 58, 30, 31}, {47, 59, 30, 31}, {47, 60, 30, 31}, {47, 61, 30, 31}, {47, 62, 30, 31}, 2284 {47, 63, 30, 31}, {48, 32, 30, 31}, {48, 33, 30, 31}, {48, 34, 30, 31}, {48, 35, 30, 31}, 2285 {48, 36, 30, 31}, {48, 37, 30, 31}, {48, 38, 30, 31}, {48, 39, 30, 31}, {48, 40, 30, 31}, 2286 {48, 41, 30, 31}, {48, 42, 30, 31}, {48, 43, 30, 31}, {48, 44, 30, 31}, {48, 45, 30, 31}, 2287 {48, 46, 30, 31}, {48, 47, 30, 31}, {48, 48, 30, 31}, {48, 49, 30, 31}, {48, 50, 30, 31}, 2288 {48, 51, 30, 31}, {48, 52, 30, 31}, {48, 53, 30, 31}, {48, 54, 30, 31}, {48, 55, 30, 31}, 2289 {48, 56, 30, 31}, {48, 57, 30, 31}, {48, 58, 30, 31}, {48, 59, 30, 31}, {48, 60, 30, 31}, 2290 {48, 61, 30, 31}, {48, 62, 30, 31}, {48, 63, 30, 31}, {49, 32, 30, 31}, {49, 33, 30, 31}, 2291 {49, 34, 30, 31}, {49, 35, 30, 31}, {49, 36, 30, 31}, {49, 37, 30, 31}, {49, 38, 30, 31}, 2292 {49, 39, 30, 31}, {49, 40, 30, 31}, {49, 41, 30, 31}, {49, 42, 30, 31}, {49, 43, 30, 31}, 2293 {49, 44, 30, 31}, {49, 45, 30, 31}, {49, 46, 30, 31}, {49, 47, 30, 31}, {49, 48, 30, 31}, 2294 {49, 49, 30, 31}, {49, 50, 30, 31}, {49, 51, 30, 31}, {49, 52, 30, 31}, {49, 53, 30, 31}, 2295 {49, 54, 30, 31}, {49, 55, 30, 31}, {49, 56, 30, 31}, {49, 57, 30, 31}, {49, 58, 30, 31}, 2296 {49, 59, 30, 31}, {49, 60, 30, 31}, {49, 61, 30, 31}, {49, 62, 30, 31}, {49, 63, 30, 31}, 2297 {50, 32, 30, 31}, {50, 33, 30, 31}, {50, 34, 30, 31}, {50, 35, 30, 31}, {50, 36, 30, 31}, 2298 {50, 37, 30, 31}, {50, 38, 30, 31}, {50, 39, 30, 31}, {50, 40, 30, 31}, {50, 41, 30, 31}, 2299 {50, 42, 30, 31}, {50, 43, 30, 31}, {50, 44, 30, 31}, {50, 45, 30, 31}, {50, 46, 30, 31}, 2300 {50, 47, 30, 31}, {50, 48, 30, 31}, {50, 49, 30, 31}, {50, 50, 30, 31}, {50, 51, 30, 31}, 2301 {50, 52, 30, 31}, {50, 53, 30, 31}, {50, 54, 30, 31}, {50, 55, 30, 31}, {50, 56, 30, 31}, 2302 {50, 57, 30, 31}, {50, 58, 30, 31}, {50, 59, 30, 31}, {50, 60, 30, 31}, {50, 61, 30, 31}, 2303 {50, 62, 30, 31}, {50, 63, 30, 31}, {51, 32, 30, 31}, {51, 33, 30, 31}, {51, 34, 30, 31}, 2304 {51, 35, 30, 31}, {51, 36, 30, 31}, {51, 37, 30, 31}, {51, 38, 30, 31}, {51, 39, 30, 31}, 2305 {51, 40, 30, 31}, {51, 41, 30, 31}, {51, 42, 30, 31}, {51, 43, 30, 31}, {51, 44, 30, 31}, 2306 {51, 45, 30, 31}, {51, 46, 30, 31}, {51, 47, 30, 31}, {51, 48, 30, 31}, {51, 49, 30, 31}, 2307 {51, 50, 30, 31}, {51, 51, 30, 31}, {51, 52, 30, 31}, {51, 53, 30, 31}, {51, 54, 30, 31}, 2308 {51, 55, 30, 31}, {51, 56, 30, 31}, {51, 57, 30, 31}, {51, 58, 30, 31}, {51, 59, 30, 31}, 2309 {51, 60, 30, 31}, {51, 61, 30, 31}, {51, 62, 30, 31}, {51, 63, 30, 31}, {52, 32, 30, 31}, 2310 {52, 33, 30, 31}, {52, 34, 30, 31}, {52, 35, 30, 31}, {52, 36, 30, 31}, {52, 37, 30, 31}, 2311 {52, 38, 30, 31}, {52, 39, 30, 31}, {52, 40, 30, 31}, {52, 41, 30, 31}, {52, 42, 30, 31}, 2312 {52, 43, 30, 31}, {52, 44, 30, 31}, {52, 45, 30, 31}, {52, 46, 30, 31}, {52, 47, 30, 31}, 2313 {52, 48, 30, 31}, {52, 49, 30, 31}, {52, 50, 30, 31}, {52, 51, 30, 31}, {52, 52, 30, 31}, 2314 {52, 53, 30, 31}, {52, 54, 30, 31}, {52, 55, 30, 31}, {52, 56, 30, 31}, {52, 57, 30, 31}, 2315 {52, 58, 30, 31}, {52, 59, 30, 31}, {52, 60, 30, 31}, {52, 61, 30, 31}, {52, 62, 30, 31}, 2316 {52, 63, 30, 31}, {53, 32, 30, 31}, {53, 33, 30, 31}, {53, 34, 30, 31}, {53, 35, 30, 31}, 2317 {53, 36, 30, 31}, {53, 37, 30, 31}, {53, 38, 30, 31}, {53, 39, 30, 31}, {53, 40, 30, 31}, 2318 {53, 41, 30, 31}, {53, 42, 30, 31}, {53, 43, 30, 31}, {53, 44, 30, 31}, {53, 45, 30, 31}, 2319 {53, 46, 30, 31}, {53, 47, 30, 31}, {53, 48, 30, 31}, {53, 49, 30, 31}, {53, 50, 30, 31}, 2320 {53, 51, 30, 31}, {53, 52, 30, 31}, {53, 53, 30, 31}, {53, 54, 30, 31}, {53, 55, 30, 31}, 2321 {53, 56, 30, 31}, {53, 57, 30, 31}, {53, 58, 30, 31}, {53, 59, 30, 31}, {53, 60, 30, 31}, 2322 {53, 61, 30, 31}, {53, 62, 30, 31}, {53, 63, 30, 31}, {54, 32, 30, 31}, {54, 33, 30, 31}, 2323 {54, 34, 30, 31}, {54, 35, 30, 31}, {54, 36, 30, 31}, {54, 37, 30, 31}, {54, 38, 30, 31}, 2324 {54, 39, 30, 31}, {54, 40, 30, 31}, {54, 41, 30, 31}, {54, 42, 30, 31}, {54, 43, 30, 31}, 2325 {54, 44, 30, 31}, {54, 45, 30, 31}, {54, 46, 30, 31}, {54, 47, 30, 31}, {54, 48, 30, 31}, 2326 {54, 49, 30, 31}, {54, 50, 30, 31}, {54, 51, 30, 31}, {54, 52, 30, 31}, {54, 53, 30, 31}, 2327 {54, 54, 30, 31}, {54, 55, 30, 31}, {54, 56, 30, 31}, {54, 57, 30, 31}, {54, 58, 30, 31}, 2328 {54, 59, 30, 31}, {54, 60, 30, 31}, {54, 61, 30, 31}, {54, 62, 30, 31}, {54, 63, 30, 31}, 2329 {55, 32, 30, 31}, {55, 33, 30, 31}, {55, 34, 30, 31}, {55, 35, 30, 31}, {55, 36, 30, 31}, 2330 {55, 37, 30, 31}, {55, 38, 30, 31}, {55, 39, 30, 31}, {55, 40, 30, 31}, {55, 41, 30, 31}, 2331 {55, 42, 30, 31}, {55, 43, 30, 31}, {55, 44, 30, 31}, {55, 45, 30, 31}, {55, 46, 30, 31}, 2332 {55, 47, 30, 31}, {55, 48, 30, 31}, {55, 49, 30, 31}, {55, 50, 30, 31}, {55, 51, 30, 31}, 2333 {55, 52, 30, 31}, {55, 53, 30, 31}, {55, 54, 30, 31}, {55, 55, 30, 31}, {55, 56, 30, 31}, 2334 {55, 57, 30, 31}, {55, 58, 30, 31}, {55, 59, 30, 31}, {55, 60, 30, 31}, {55, 61, 30, 31}, 2335 {55, 62, 30, 31}, {55, 63, 30, 31}, {56, 32, 30, 31}, {56, 33, 30, 31}, {56, 34, 30, 31}, 2336 {56, 35, 30, 31}, {56, 36, 30, 31}, {56, 37, 30, 31}, {56, 38, 30, 31}, {56, 39, 30, 31}, 2337 {56, 40, 30, 31}, {56, 41, 30, 31}, {56, 42, 30, 31}, {56, 43, 30, 31}, {56, 44, 30, 31}, 2338 {56, 45, 30, 31}, {56, 46, 30, 31}, {56, 47, 30, 31}, {56, 48, 30, 31}, {56, 49, 30, 31}, 2339 {56, 50, 30, 31}, {56, 51, 30, 31}, {56, 52, 30, 31}, {56, 53, 30, 31}, {56, 54, 30, 31}, 2340 {56, 55, 30, 31}, {56, 56, 30, 31}, {56, 57, 30, 31}, {56, 58, 30, 31}, {56, 59, 30, 31}, 2341 {56, 60, 30, 31}, {56, 61, 30, 31}, {56, 62, 30, 31}, {56, 63, 30, 31}, {57, 32, 30, 31}, 2342 {57, 33, 30, 31}, {57, 34, 30, 31}, {57, 35, 30, 31}, {57, 36, 30, 31}, {57, 37, 30, 31}, 2343 {57, 38, 30, 31}, {57, 39, 30, 31}, {57, 40, 30, 31}, {57, 41, 30, 31}, {57, 42, 30, 31}, 2344 {57, 43, 30, 31}, {57, 44, 30, 31}, {57, 45, 30, 31}, {57, 46, 30, 31}, {57, 47, 30, 31}, 2345 {57, 48, 30, 31}, {57, 49, 30, 31}, {57, 50, 30, 31}, {57, 51, 30, 31}, {57, 52, 30, 31}, 2346 {57, 53, 30, 31}, {57, 54, 30, 31}, {57, 55, 30, 31}, {57, 56, 30, 31}, {57, 57, 30, 31}, 2347 {57, 58, 30, 31}, {57, 59, 30, 31}, {57, 60, 30, 31}, {57, 61, 30, 31}, {57, 62, 30, 31}, 2348 {57, 63, 30, 31}, {58, 32, 30, 31}, {58, 33, 30, 31}, {58, 34, 30, 31}, {58, 35, 30, 31}, 2349 {58, 36, 30, 31}, {58, 37, 30, 31}, {58, 38, 30, 31}, {58, 39, 30, 31}, {58, 40, 30, 31}, 2350 {58, 41, 30, 31}, {58, 42, 30, 31}, {58, 43, 30, 31}, {58, 44, 30, 31}, {58, 45, 30, 31}, 2351 {58, 46, 30, 31}, {58, 47, 30, 31}, {58, 48, 30, 31}, {58, 49, 30, 31}, {58, 50, 30, 31}, 2352 {58, 51, 30, 31}, {58, 52, 30, 31}, {58, 53, 30, 31}, {58, 54, 30, 31}, {58, 55, 30, 31}, 2353 {58, 56, 30, 31}, {58, 57, 30, 31}, {58, 58, 30, 31}, {58, 59, 30, 31}, {58, 60, 30, 31}, 2354 {58, 61, 30, 31}, {58, 62, 30, 31}, {58, 63, 30, 31}, {59, 32, 30, 31}, {59, 33, 30, 31}, 2355 {59, 34, 30, 31}, {59, 35, 30, 31}, {59, 36, 30, 31}, {59, 37, 30, 31}, {59, 38, 30, 31}, 2356 {59, 39, 30, 31}, {59, 40, 30, 31}, {59, 41, 30, 31}, {59, 42, 30, 31}, {59, 43, 30, 31}, 2357 {59, 44, 30, 31}, {59, 45, 30, 31}, {59, 46, 30, 31}, {59, 47, 30, 31}, {59, 48, 30, 31}, 2358 {59, 49, 30, 31}, {59, 50, 30, 31}, {59, 51, 30, 31}, {59, 52, 30, 31}, {59, 53, 30, 31}, 2359 {59, 54, 30, 31}, {59, 55, 30, 31}, {59, 56, 30, 31}, {59, 57, 30, 31}, {59, 58, 30, 31}, 2360 {59, 59, 30, 31}, {59, 60, 30, 31}, {59, 61, 30, 31}, {59, 62, 30, 31}, {59, 63, 30, 31}, 2361 {40, 32, 32, 63}, {40, 33, 32, 63}, {40, 34, 32, 63}, {40, 35, 32, 63}, {40, 36, 32, 63}, 2362 {40, 37, 32, 63}, {40, 38, 32, 63}, {40, 39, 32, 63}, {40, 40, 32, 63}, {40, 41, 32, 63}, 2363 {40, 42, 32, 63}, {40, 43, 32, 63}, {40, 44, 32, 63}, {40, 45, 32, 63}, {40, 46, 32, 63}, 2364 {40, 47, 32, 63}, {40, 48, 32, 63}, {40, 49, 32, 63}, {40, 50, 32, 63}, {40, 51, 32, 63}, 2365 {40, 52, 32, 63}, {40, 53, 32, 63}, {40, 54, 32, 63}, {40, 55, 32, 63}, {40, 56, 32, 63}, 2366 {40, 57, 32, 63}, {40, 58, 32, 63}, {40, 59, 32, 63}, {40, 60, 32, 63}, {40, 61, 32, 63}, 2367 {40, 62, 32, 63}, {40, 63, 32, 63}, {41, 32, 32, 63}, {41, 33, 32, 63}, {41, 34, 32, 63}, 2368 {41, 35, 32, 63}, {41, 36, 32, 63}, {41, 37, 32, 63}, {41, 38, 32, 63}, {41, 39, 32, 63}, 2369 {41, 40, 32, 63}, {41, 41, 32, 63}, {41, 42, 32, 63}, {41, 43, 32, 63}, {41, 44, 32, 63}, 2370 {41, 45, 32, 63}, {41, 46, 32, 63}, {41, 47, 32, 63}, {41, 48, 32, 63}, {41, 49, 32, 63}, 2371 {41, 50, 32, 63}, {41, 51, 32, 63}, {41, 52, 32, 63}, {41, 53, 32, 63}, {41, 54, 32, 63}, 2372 {41, 55, 32, 63}, {41, 56, 32, 63}, {41, 57, 32, 63}, {41, 58, 32, 63}, {41, 59, 32, 63}, 2373 {41, 60, 32, 63}, {41, 61, 32, 63}, {41, 62, 32, 63}, {41, 63, 32, 63}, {42, 32, 32, 63}, 2374 {42, 33, 32, 63}, {42, 34, 32, 63}, {42, 35, 32, 63}, {42, 36, 32, 63}, {42, 37, 32, 63}, 2375 {42, 38, 32, 63}, {42, 39, 32, 63}, {42, 40, 32, 63}, {42, 41, 32, 63}, {42, 42, 32, 63}, 2376 {42, 43, 32, 63}, {42, 44, 32, 63}, {42, 45, 32, 63}, {42, 46, 32, 63}, {42, 47, 32, 63}, 2377 {42, 48, 32, 63}, {42, 49, 32, 63}, {42, 50, 32, 63}, {42, 51, 32, 63}, {42, 52, 32, 63}, 2378 {42, 53, 32, 63}, {42, 54, 32, 63}, {42, 55, 32, 63}, {42, 56, 32, 63}, {42, 57, 32, 63}, 2379 {42, 58, 32, 63}, {42, 59, 32, 63}, {42, 60, 32, 63}, {42, 61, 32, 63}, {42, 62, 32, 63}, 2380 {42, 63, 32, 63}, {43, 32, 32, 63}, {43, 33, 32, 63}, {43, 34, 32, 63}, {43, 35, 32, 63}, 2381 {43, 36, 32, 63}, {43, 37, 32, 63}, {43, 38, 32, 63}, {43, 39, 32, 63}, {43, 40, 32, 63}, 2382 {43, 41, 32, 63}, {43, 42, 32, 63}, {43, 43, 32, 63}, {43, 44, 32, 63}, {43, 45, 32, 63}, 2383 {43, 46, 32, 63}, {43, 47, 32, 63}, {43, 48, 32, 63}, {43, 49, 32, 63}, {43, 50, 32, 63}, 2384 {43, 51, 32, 63}, {43, 52, 32, 63}, {43, 53, 32, 63}, {43, 54, 32, 63}, {43, 55, 32, 63}, 2385 {43, 56, 32, 63}, {43, 57, 32, 63}, {43, 58, 32, 63}, {43, 59, 32, 63}, {43, 60, 32, 63}, 2386 {43, 61, 32, 63}, {43, 62, 32, 63}, {43, 63, 32, 63}, {44, 32, 32, 63}, {44, 33, 32, 63}, 2387 {44, 34, 32, 63}, {44, 35, 32, 63}, {44, 36, 32, 63}, {44, 37, 32, 63}, {44, 38, 32, 63}, 2388 {44, 39, 32, 63}, {44, 40, 32, 63}, {44, 41, 32, 63}, {44, 42, 32, 63}, {44, 43, 32, 63}, 2389 {44, 44, 32, 63}, {44, 45, 32, 63}, {44, 46, 32, 63}, {44, 47, 32, 63}, {44, 48, 32, 63}, 2390 {44, 49, 32, 63}, {44, 50, 32, 63}, {44, 51, 32, 63}, {44, 52, 32, 63}, {44, 53, 32, 63}, 2391 {44, 54, 32, 63}, {44, 55, 32, 63}, {44, 56, 32, 63}, {44, 57, 32, 63}, {44, 58, 32, 63}, 2392 {44, 59, 32, 63}, {44, 60, 32, 63}, {44, 61, 32, 63}, {44, 62, 32, 63}, {44, 63, 32, 63}, 2393 {45, 32, 32, 63}, {45, 33, 32, 63}, {45, 34, 32, 63}, {45, 35, 32, 63}, {45, 36, 32, 63}, 2394 {45, 37, 32, 63}, {45, 38, 32, 63}, {45, 39, 32, 63}, {45, 40, 32, 63}, {45, 41, 32, 63}, 2395 {45, 42, 32, 63}, {45, 43, 32, 63}, {45, 44, 32, 63}, {45, 45, 32, 63}, {45, 46, 32, 63}, 2396 {45, 47, 32, 63}, {45, 48, 32, 63}, {45, 49, 32, 63}, {45, 50, 32, 63}, {45, 51, 32, 63}, 2397 {45, 52, 32, 63}, {45, 53, 32, 63}, {45, 54, 32, 63}, {45, 55, 32, 63}, {45, 56, 32, 63}, 2398 {45, 57, 32, 63}, {45, 58, 32, 63}, {45, 59, 32, 63}, {45, 60, 32, 63}, {45, 61, 32, 63}, 2399 {45, 62, 32, 63}, {45, 63, 32, 63}, {46, 32, 32, 63}, {46, 33, 32, 63}, {46, 34, 32, 63}, 2400 {46, 35, 32, 63}, {46, 36, 32, 63}, {46, 37, 32, 63}, {46, 38, 32, 63}, {46, 39, 32, 63}, 2401 {46, 40, 32, 63}, {46, 41, 32, 63}, {46, 42, 32, 63}, {46, 43, 32, 63}, {46, 44, 32, 63}, 2402 {46, 45, 32, 63}, {46, 46, 32, 63}, {46, 47, 32, 63}, {46, 48, 32, 63}, {46, 49, 32, 63}, 2403 {46, 50, 32, 63}, {46, 51, 32, 63}, {46, 52, 32, 63}, {46, 53, 32, 63}, {46, 54, 32, 63}, 2404 {46, 55, 32, 63}, {46, 56, 32, 63}, {46, 57, 32, 63}, {46, 58, 32, 63}, {46, 59, 32, 63}, 2405 {46, 60, 32, 63}, {46, 61, 32, 63}, {46, 62, 32, 63}, {46, 63, 32, 63}, {47, 32, 32, 63}, 2406 {47, 33, 32, 63}, {47, 34, 32, 63}, {47, 35, 32, 63}, {47, 36, 32, 63}, {47, 37, 32, 63}, 2407 {47, 38, 32, 63}, {47, 39, 32, 63}, {47, 40, 32, 63}, {47, 41, 32, 63}, {47, 42, 32, 63}, 2408 {47, 43, 32, 63}, {47, 44, 32, 63}, {47, 45, 32, 63}, {47, 46, 32, 63}, {47, 47, 32, 63}, 2409 {47, 48, 32, 63}, {47, 49, 32, 63}, {47, 50, 32, 63}, {47, 51, 32, 63}, {47, 52, 32, 63}, 2410 {47, 53, 32, 63}, {47, 54, 32, 63}, {47, 55, 32, 63}, {47, 56, 32, 63}, {47, 57, 32, 63}, 2411 {47, 58, 32, 63}, {47, 59, 32, 63}, {47, 60, 32, 63}, {47, 61, 32, 63}, {47, 62, 32, 63}, 2412 {47, 63, 32, 63}, {48, 32, 32, 63}, {48, 33, 32, 63}, {48, 34, 32, 63}, {48, 35, 32, 63}, 2413 {48, 36, 32, 63}, {48, 37, 32, 63}, {48, 38, 32, 63}, {48, 39, 32, 63}, {48, 40, 32, 63}, 2414 {48, 41, 32, 63}, {48, 42, 32, 63}, {48, 43, 32, 63}, {48, 44, 32, 63}, {48, 45, 32, 63}, 2415 {48, 46, 32, 63}, {48, 47, 32, 63}, {48, 48, 32, 63}, {48, 49, 32, 63}, {48, 50, 32, 63}, 2416 {48, 51, 32, 63}, {48, 52, 32, 63}, {48, 53, 32, 63}, {48, 54, 32, 63}, {48, 55, 32, 63}, 2417 {48, 56, 32, 63}, {48, 57, 32, 63}, {48, 58, 32, 63}, {48, 59, 32, 63}, {48, 60, 32, 63}, 2418 {48, 61, 32, 63}, {48, 62, 32, 63}, {48, 63, 32, 63}, {49, 32, 32, 63}, {49, 33, 32, 63}, 2419 {49, 34, 32, 63}, {49, 35, 32, 63}, {49, 36, 32, 63}, {49, 37, 32, 63}, {49, 38, 32, 63}, 2420 {49, 39, 32, 63}, {49, 40, 32, 63}, {49, 41, 32, 63}, {49, 42, 32, 63}, {49, 43, 32, 63}, 2421 {49, 44, 32, 63}, {49, 45, 32, 63}, {49, 46, 32, 63}, {49, 47, 32, 63}, {49, 48, 32, 63}, 2422 {49, 49, 32, 63}, {49, 50, 32, 63}, {49, 51, 32, 63}, {49, 52, 32, 63}, {49, 53, 32, 63}, 2423 {49, 54, 32, 63}, {49, 55, 32, 63}, {49, 56, 32, 63}, {49, 57, 32, 63}, {49, 58, 32, 63}, 2424 {49, 59, 32, 63}, {49, 60, 32, 63}, {49, 61, 32, 63}, {49, 62, 32, 63}, {49, 63, 32, 63}, 2425 {50, 32, 32, 63}, {50, 33, 32, 63}, {50, 34, 32, 63}, {50, 35, 32, 63}, {50, 36, 32, 63}, 2426 {50, 37, 32, 63}, {50, 38, 32, 63}, {50, 39, 32, 63}, {50, 40, 32, 63}, {50, 41, 32, 63}, 2427 {50, 42, 32, 63}, {50, 43, 32, 63}, {50, 44, 32, 63}, {50, 45, 32, 63}, {50, 46, 32, 63}, 2428 {50, 47, 32, 63}, {50, 48, 32, 63}, {50, 49, 32, 63}, {50, 50, 32, 63}, {50, 51, 32, 63}, 2429 {50, 52, 32, 63}, {50, 53, 32, 63}, {50, 54, 32, 63}, {50, 55, 32, 63}, {50, 56, 32, 63}, 2430 {50, 57, 32, 63}, {50, 58, 32, 63}, {50, 59, 32, 63}, {50, 60, 32, 63}, {50, 61, 32, 63}, 2431 {50, 62, 32, 63}, {50, 63, 32, 63}, {51, 32, 32, 63}, {51, 33, 32, 63}, {51, 34, 32, 63}, 2432 {51, 35, 32, 63}, {51, 36, 32, 63}, {51, 37, 32, 63}, {51, 38, 32, 63}, {51, 39, 32, 63}, 2433 {51, 40, 32, 63}, {51, 41, 32, 63}, {51, 42, 32, 63}, {51, 43, 32, 63}, {51, 44, 32, 63}, 2434 {51, 45, 32, 63}, {51, 46, 32, 63}, {51, 47, 32, 63}, {51, 48, 32, 63}, {51, 49, 32, 63}, 2435 {51, 50, 32, 63}, {51, 51, 32, 63}, {51, 52, 32, 63}, {51, 53, 32, 63}, {51, 54, 32, 63}, 2436 {51, 55, 32, 63}, {51, 56, 32, 63}, {51, 57, 32, 63}, {51, 58, 32, 63}, {51, 59, 32, 63}, 2437 {51, 60, 32, 63}, {51, 61, 32, 63}, {51, 62, 32, 63}, {51, 63, 32, 63}, {52, 32, 32, 63}, 2438 {52, 33, 32, 63}, {52, 34, 32, 63}, {52, 35, 32, 63}, {52, 36, 32, 63}, {52, 37, 32, 63}, 2439 {52, 38, 32, 63}, {52, 39, 32, 63}, {52, 40, 32, 63}, {52, 41, 32, 63}, {52, 42, 32, 63}, 2440 {52, 43, 32, 63}, {52, 44, 32, 63}, {52, 45, 32, 63}, {52, 46, 32, 63}, {52, 47, 32, 63}, 2441 {52, 48, 32, 63}, {52, 49, 32, 63}, {52, 50, 32, 63}, {52, 51, 32, 63}, {52, 52, 32, 63}, 2442 {52, 53, 32, 63}, {52, 54, 32, 63}, {52, 55, 32, 63}, {52, 56, 32, 63}, {52, 57, 32, 63}, 2443 {52, 58, 32, 63}, {52, 59, 32, 63}, {52, 60, 32, 63}, {52, 61, 32, 63}, {52, 62, 32, 63}, 2444 {52, 63, 32, 63}, {53, 32, 32, 63}, {53, 33, 32, 63}, {53, 34, 32, 63}, {53, 35, 32, 63}, 2445 {53, 36, 32, 63}, {53, 37, 32, 63}, {53, 38, 32, 63}, {53, 39, 32, 63}, {53, 40, 32, 63}, 2446 {53, 41, 32, 63}, {53, 42, 32, 63}, {53, 43, 32, 63}, {53, 44, 32, 63}, {53, 45, 32, 63}, 2447 {53, 46, 32, 63}, {53, 47, 32, 63}, {53, 48, 32, 63}, {53, 49, 32, 63}, {53, 50, 32, 63}, 2448 {53, 51, 32, 63}, {53, 52, 32, 63}, {53, 53, 32, 63}, {53, 54, 32, 63}, {53, 55, 32, 63}, 2449 {53, 56, 32, 63}, {53, 57, 32, 63}, {53, 58, 32, 63}, {53, 59, 32, 63}, {53, 60, 32, 63}, 2450 {53, 61, 32, 63}, {53, 62, 32, 63}, {53, 63, 32, 63}, {54, 32, 32, 63}, {54, 33, 32, 63}, 2451 {54, 34, 32, 63}, {54, 35, 32, 63}, {54, 36, 32, 63}, {54, 37, 32, 63}, {54, 38, 32, 63}, 2452 {54, 39, 32, 63}, {54, 40, 32, 63}, {54, 41, 32, 63}, {54, 42, 32, 63}, {54, 43, 32, 63}, 2453 {54, 44, 32, 63}, {54, 45, 32, 63}, {54, 46, 32, 63}, {54, 47, 32, 63}, {54, 48, 32, 63}, 2454 {54, 49, 32, 63}, {54, 50, 32, 63}, {54, 51, 32, 63}, {54, 52, 32, 63}, {54, 53, 32, 63}, 2455 {54, 54, 32, 63}, {54, 55, 32, 63}, {54, 56, 32, 63}, {54, 57, 32, 63}, {54, 58, 32, 63}, 2456 {54, 59, 32, 63}, {54, 60, 32, 63}, {54, 61, 32, 63}, {54, 62, 32, 63}, {54, 63, 32, 63}, 2457 {55, 32, 32, 63}, {55, 33, 32, 63}, {55, 34, 32, 63}, {55, 35, 32, 63}, {55, 36, 32, 63}, 2458 {55, 37, 32, 63}, {55, 38, 32, 63}, {55, 39, 32, 63}, {55, 40, 32, 63}, {55, 41, 32, 63}, 2459 {55, 42, 32, 63}, {55, 43, 32, 63}, {55, 44, 32, 63}, {55, 45, 32, 63}, {55, 46, 32, 63}, 2460 {55, 47, 32, 63}, {55, 48, 32, 63}, {55, 49, 32, 63}, {55, 50, 32, 63}, {55, 51, 32, 63}, 2461 {55, 52, 32, 63}, {55, 53, 32, 63}, {55, 54, 32, 63}, {55, 55, 32, 63}, {55, 56, 32, 63}, 2462 {55, 57, 32, 63}, {55, 58, 32, 63}, {55, 59, 32, 63}, {55, 60, 32, 63}, {55, 61, 32, 63}, 2463 {55, 62, 32, 63}, {55, 63, 32, 63}, {56, 32, 32, 63}, {56, 33, 32, 63}, {56, 34, 32, 63}, 2464 {56, 35, 32, 63}, {56, 36, 32, 63}, {56, 37, 32, 63}, {56, 38, 32, 63}, {56, 39, 32, 63}, 2465 {56, 40, 32, 63}, {56, 41, 32, 63}, {56, 42, 32, 63}, {56, 43, 32, 63}, {56, 44, 32, 63}, 2466 {56, 45, 32, 63}, {56, 46, 32, 63}, {56, 47, 32, 63}, {56, 48, 32, 63}, {56, 49, 32, 63}, 2467 {56, 50, 32, 63}, {56, 51, 32, 63}, {56, 52, 32, 63}, {56, 53, 32, 63}, {56, 54, 32, 63}, 2468 {56, 55, 32, 63}, {56, 56, 32, 63}, {56, 57, 32, 63}, {56, 58, 32, 63}, {56, 59, 32, 63}, 2469 {56, 60, 32, 63}, {56, 61, 32, 63}, {56, 62, 32, 63}, {56, 63, 32, 63}, {57, 32, 32, 63}, 2470 {57, 33, 32, 63}, {57, 34, 32, 63}, {57, 35, 32, 63}, {57, 36, 32, 63}, {57, 37, 32, 63}, 2471 {57, 38, 32, 63}, {57, 39, 32, 63}, {57, 40, 32, 63}, {57, 41, 32, 63}, {57, 42, 32, 63}, 2472 {57, 43, 32, 63}, {57, 44, 32, 63}, {57, 45, 32, 63}, {57, 46, 32, 63}, {57, 47, 32, 63}, 2473 {57, 48, 32, 63}, {57, 49, 32, 63}, {57, 50, 32, 63}, {57, 51, 32, 63}, {57, 52, 32, 63}, 2474 {57, 53, 32, 63}, {57, 54, 32, 63}, {57, 55, 32, 63}, {57, 56, 32, 63}, {57, 57, 32, 63}, 2475 {57, 58, 32, 63}, {57, 59, 32, 63}, {57, 60, 32, 63}, {57, 61, 32, 63}, {57, 62, 32, 63}, 2476 {57, 63, 32, 63}, {58, 32, 32, 63}, {58, 33, 32, 63}, {58, 34, 32, 63}, {58, 35, 32, 63}, 2477 {58, 36, 32, 63}, {58, 37, 32, 63}, {58, 38, 32, 63}, {58, 39, 32, 63}, {58, 40, 32, 63}, 2478 {58, 41, 32, 63}, {58, 42, 32, 63}, {58, 43, 32, 63}, {58, 44, 32, 63}, {58, 45, 32, 63}, 2479 {58, 46, 32, 63}, {58, 47, 32, 63}, {58, 48, 32, 63}, {58, 49, 32, 63}, {58, 50, 32, 63}, 2480 {58, 51, 32, 63}, {58, 52, 32, 63}, {58, 53, 32, 63}, {58, 54, 32, 63}, {58, 55, 32, 63}, 2481 {58, 56, 32, 63}, {58, 57, 32, 63}, {58, 58, 32, 63}, {58, 59, 32, 63}, {58, 60, 32, 63}, 2482 {58, 61, 32, 63}, {58, 62, 32, 63}, {58, 63, 32, 63}, {59, 32, 32, 63}, {59, 33, 32, 63}, 2483 {59, 34, 32, 63}, {59, 35, 32, 63}, {59, 36, 32, 63}, {59, 37, 32, 63}, {59, 38, 32, 63}, 2484 {59, 39, 32, 63}, {59, 40, 32, 63}, {59, 41, 32, 63}, {59, 42, 32, 63}, {59, 43, 32, 63}, 2485 {59, 44, 32, 63}, {59, 45, 32, 63}, {59, 46, 32, 63}, {59, 47, 32, 63}, {59, 48, 32, 63}, 2486 {59, 49, 32, 63}, {59, 50, 32, 63}, {59, 51, 32, 63}, {59, 52, 32, 63}, {59, 53, 32, 63}, 2487 {59, 54, 32, 63}, {59, 55, 32, 63}, {59, 56, 32, 63}, {59, 57, 32, 63}, {59, 58, 32, 63}, 2488 {59, 59, 32, 63}, {59, 60, 32, 63}, {59, 61, 32, 63}, {59, 62, 32, 63}, {59, 63, 32, 63}, 2489 {40, 32, 64, 79}, {40, 33, 64, 79}, {40, 34, 64, 79}, {40, 35, 64, 79}, {40, 36, 64, 79}, 2490 {40, 37, 64, 79}, {40, 38, 64, 79}, {40, 39, 64, 79}, {40, 40, 64, 79}, {40, 41, 64, 79}, 2491 {40, 42, 64, 79}, {40, 43, 64, 79}, {40, 44, 64, 79}, {40, 45, 64, 79}, {40, 46, 64, 79}, 2492 {40, 47, 64, 79}, {40, 48, 64, 79}, {40, 49, 64, 79}, {40, 50, 64, 79}, {40, 51, 64, 79}, 2493 {40, 52, 64, 79}, {40, 53, 64, 79}, {40, 54, 64, 79}, {40, 55, 64, 79}, {40, 56, 64, 79}, 2494 {40, 57, 64, 79}, {40, 58, 64, 79}, {40, 59, 64, 79}, {40, 60, 64, 79}, {40, 61, 64, 79}, 2495 {40, 62, 64, 79}, {40, 63, 64, 79}, {41, 32, 64, 79}, {41, 33, 64, 79}, {41, 34, 64, 79}, 2496 {41, 35, 64, 79}, {41, 36, 64, 79}, {41, 37, 64, 79}, {41, 38, 64, 79}, {41, 39, 64, 79}, 2497 {41, 40, 64, 79}, {41, 41, 64, 79}, {41, 42, 64, 79}, {41, 43, 64, 79}, {41, 44, 64, 79}, 2498 {41, 45, 64, 79}, {41, 46, 64, 79}, {41, 47, 64, 79}, {41, 48, 64, 79}, {41, 49, 64, 79}, 2499 {41, 50, 64, 79}, {41, 51, 64, 79}, {41, 52, 64, 79}, {41, 53, 64, 79}, {41, 54, 64, 79}, 2500 {41, 55, 64, 79}, {41, 56, 64, 79}, {41, 57, 64, 79}, {41, 58, 64, 79}, {41, 59, 64, 79}, 2501 {41, 60, 64, 79}, {41, 61, 64, 79}, {41, 62, 64, 79}, {41, 63, 64, 79}, {42, 32, 64, 79}, 2502 {42, 33, 64, 79}, {42, 34, 64, 79}, {42, 35, 64, 79}, {42, 36, 64, 79}, {42, 37, 64, 79}, 2503 {42, 38, 64, 79}, {42, 39, 64, 79}, {42, 40, 64, 79}, {42, 41, 64, 79}, {42, 42, 64, 79}, 2504 {42, 43, 64, 79}, {42, 44, 64, 79}, {42, 45, 64, 79}, {42, 46, 64, 79}, {42, 47, 64, 79}, 2505 {42, 48, 64, 79}, {42, 49, 64, 79}, {42, 50, 64, 79}, {42, 51, 64, 79}, {42, 52, 64, 79}, 2506 {42, 53, 64, 79}, {42, 54, 64, 79}, {42, 55, 64, 79}, {42, 56, 64, 79}, {42, 57, 64, 79}, 2507 {42, 58, 64, 79}, {42, 59, 64, 79}, {42, 60, 64, 79}, {42, 61, 64, 79}, {42, 62, 64, 79}, 2508 {42, 63, 64, 79}, {43, 32, 64, 79}, {43, 33, 64, 79}, {43, 34, 64, 79}, {43, 35, 64, 79}, 2509 {43, 36, 64, 79}, {43, 37, 64, 79}, {43, 38, 64, 79}, {43, 39, 64, 79}, {43, 40, 64, 79}, 2510 {43, 41, 64, 79}, {43, 42, 64, 79}, {43, 43, 64, 79}, {43, 44, 64, 79}, {43, 45, 64, 79}, 2511 {43, 46, 64, 79}, {43, 47, 64, 79}, {43, 48, 64, 79}, {43, 49, 64, 79}, {43, 50, 64, 79}, 2512 {43, 51, 64, 79}, {43, 52, 64, 79}, {43, 53, 64, 79}, {43, 54, 64, 79}, {43, 55, 64, 79}, 2513 {43, 56, 64, 79}, {43, 57, 64, 79}, {43, 58, 64, 79}, {43, 59, 64, 79}, {43, 60, 64, 79}, 2514 {43, 61, 64, 79}, {43, 62, 64, 79}, {43, 63, 64, 79}, {44, 32, 64, 79}, {44, 33, 64, 79}, 2515 {44, 34, 64, 79}, {44, 35, 64, 79}, {44, 36, 64, 79}, {44, 37, 64, 79}, {44, 38, 64, 79}, 2516 {44, 39, 64, 79}, {44, 40, 64, 79}, {44, 41, 64, 79}, {44, 42, 64, 79}, {44, 43, 64, 79}, 2517 {44, 44, 64, 79}, {44, 45, 64, 79}, {44, 46, 64, 79}, {44, 47, 64, 79}, {44, 48, 64, 79}, 2518 {44, 49, 64, 79}, {44, 50, 64, 79}, {44, 51, 64, 79}, {44, 52, 64, 79}, {44, 53, 64, 79}, 2519 {44, 54, 64, 79}, {44, 55, 64, 79}, {44, 56, 64, 79}, {44, 57, 64, 79}, {44, 58, 64, 79}, 2520 {44, 59, 64, 79}, {44, 60, 64, 79}, {44, 61, 64, 79}, {44, 62, 64, 79}, {44, 63, 64, 79}, 2521 {45, 32, 64, 79}, {45, 33, 64, 79}, {45, 34, 64, 79}, {45, 35, 64, 79}, {45, 36, 64, 79}, 2522 {45, 37, 64, 79}, {45, 38, 64, 79}, {45, 39, 64, 79}, {45, 40, 64, 79}, {45, 41, 64, 79}, 2523 {45, 42, 64, 79}, {45, 43, 64, 79}, {45, 44, 64, 79}, {45, 45, 64, 79}, {45, 46, 64, 79}, 2524 {45, 47, 64, 79}, {45, 48, 64, 79}, {45, 49, 64, 79}, {45, 50, 64, 79}, {45, 51, 64, 79}, 2525 {45, 52, 64, 79}, {45, 53, 64, 79}, {45, 54, 64, 79}, {45, 55, 64, 79}, {45, 56, 64, 79}, 2526 {45, 57, 64, 79}, {45, 58, 64, 79}, {45, 59, 64, 79}, {45, 60, 64, 79}, {45, 61, 64, 79}, 2527 {45, 62, 64, 79}, {45, 63, 64, 79}, {46, 32, 64, 79}, {46, 33, 64, 79}, {46, 34, 64, 79}, 2528 {46, 35, 64, 79}, {46, 36, 64, 79}, {46, 37, 64, 79}, {46, 38, 64, 79}, {46, 39, 64, 79}, 2529 {46, 40, 64, 79}, {46, 41, 64, 79}, {46, 42, 64, 79}, {46, 43, 64, 79}, {46, 44, 64, 79}, 2530 {46, 45, 64, 79}, {46, 46, 64, 79}, {46, 47, 64, 79}, {46, 48, 64, 79}, {46, 49, 64, 79}, 2531 {46, 50, 64, 79}, {46, 51, 64, 79}, {46, 52, 64, 79}, {46, 53, 64, 79}, {46, 54, 64, 79}, 2532 {46, 55, 64, 79}, {46, 56, 64, 79}, {46, 57, 64, 79}, {46, 58, 64, 79}, {46, 59, 64, 79}, 2533 {46, 60, 64, 79}, {46, 61, 64, 79}, {46, 62, 64, 79}, {46, 63, 64, 79}, {47, 32, 64, 79}, 2534 {47, 33, 64, 79}, {47, 34, 64, 79}, {47, 35, 64, 79}, {47, 36, 64, 79}, {47, 37, 64, 79}, 2535 {47, 38, 64, 79}, {47, 39, 64, 79}, {47, 40, 64, 79}, {47, 41, 64, 79}, {47, 42, 64, 79}, 2536 {47, 43, 64, 79}, {47, 44, 64, 79}, {47, 45, 64, 79}, {47, 46, 64, 79}, {47, 47, 64, 79}, 2537 {47, 48, 64, 79}, {47, 49, 64, 79}, {47, 50, 64, 79}, {47, 51, 64, 79}, {47, 52, 64, 79}, 2538 {47, 53, 64, 79}, {47, 54, 64, 79}, {47, 55, 64, 79}, {47, 56, 64, 79}, {47, 57, 64, 79}, 2539 {47, 58, 64, 79}, {47, 59, 64, 79}, {47, 60, 64, 79}, {47, 61, 64, 79}, {47, 62, 64, 79}, 2540 {47, 63, 64, 79}, {48, 32, 64, 79}, {48, 33, 64, 79}, {48, 34, 64, 79}, {48, 35, 64, 79}, 2541 {48, 36, 64, 79}, {48, 37, 64, 79}, {48, 38, 64, 79}, {48, 39, 64, 79}, {48, 40, 64, 79}, 2542 {48, 41, 64, 79}, {48, 42, 64, 79}, {48, 43, 64, 79}, {48, 44, 64, 79}, {48, 45, 64, 79}, 2543 {48, 46, 64, 79}, {48, 47, 64, 79}, {48, 48, 64, 79}, {48, 49, 64, 79}, {48, 50, 64, 79}, 2544 {48, 51, 64, 79}, {48, 52, 64, 79}, {48, 53, 64, 79}, {48, 54, 64, 79}, {48, 55, 64, 79}, 2545 {48, 56, 64, 79}, {48, 57, 64, 79}, {48, 58, 64, 79}, {48, 59, 64, 79}, {48, 60, 64, 79}, 2546 {48, 61, 64, 79}, {48, 62, 64, 79}, {48, 63, 64, 79}, {49, 32, 64, 79}, {49, 33, 64, 79}, 2547 {49, 34, 64, 79}, {49, 35, 64, 79}, {49, 36, 64, 79}, {49, 37, 64, 79}, {49, 38, 64, 79}, 2548 {49, 39, 64, 79}, {49, 40, 64, 79}, {49, 41, 64, 79}, {49, 42, 64, 79}, {49, 43, 64, 79}, 2549 {49, 44, 64, 79}, {49, 45, 64, 79}, {49, 46, 64, 79}, {49, 47, 64, 79}, {49, 48, 64, 79}, 2550 {49, 49, 64, 79}, {49, 50, 64, 79}, {49, 51, 64, 79}, {49, 52, 64, 79}, {49, 53, 64, 79}, 2551 {49, 54, 64, 79}, {49, 55, 64, 79}, {49, 56, 64, 79}, {49, 57, 64, 79}, {49, 58, 64, 79}, 2552 {49, 59, 64, 79}, {49, 60, 64, 79}, {49, 61, 64, 79}, {49, 62, 64, 79}, {49, 63, 64, 79}, 2553 {50, 32, 64, 79}, {50, 33, 64, 79}, {50, 34, 64, 79}, {50, 35, 64, 79}, {50, 36, 64, 79}, 2554 {50, 37, 64, 79}, {50, 38, 64, 79}, {50, 39, 64, 79}, {50, 40, 64, 79}, {50, 41, 64, 79}, 2555 {50, 42, 64, 79}, {50, 43, 64, 79}, {50, 44, 64, 79}, {50, 45, 64, 79}, {50, 46, 64, 79}, 2556 {50, 47, 64, 79}, {50, 48, 64, 79}, {50, 49, 64, 79}, {50, 50, 64, 79}, {50, 51, 64, 79}, 2557 {50, 52, 64, 79}, {50, 53, 64, 79}, {50, 54, 64, 79}, {50, 55, 64, 79}, {50, 56, 64, 79}, 2558 {50, 57, 64, 79}, {50, 58, 64, 79}, {50, 59, 64, 79}, {50, 60, 64, 79}, {50, 61, 64, 79}, 2559 {50, 62, 64, 79}, {50, 63, 64, 79}, {51, 32, 64, 79}, {51, 33, 64, 79}, {51, 34, 64, 79}, 2560 {51, 35, 64, 79}, {51, 36, 64, 79}, {51, 37, 64, 79}, {51, 38, 64, 79}, {51, 39, 64, 79}, 2561 {51, 40, 64, 79}, {51, 41, 64, 79}, {51, 42, 64, 79}, {51, 43, 64, 79}, {51, 44, 64, 79}, 2562 {51, 45, 64, 79}, {51, 46, 64, 79}, {51, 47, 64, 79}, {51, 48, 64, 79}, {51, 49, 64, 79}, 2563 {51, 50, 64, 79}, {51, 51, 64, 79}, {51, 52, 64, 79}, {51, 53, 64, 79}, {51, 54, 64, 79}, 2564 {51, 55, 64, 79}, {51, 56, 64, 79}, {51, 57, 64, 79}, {51, 58, 64, 79}, {51, 59, 64, 79}, 2565 {51, 60, 64, 79}, {51, 61, 64, 79}, {51, 62, 64, 79}, {51, 63, 64, 79}, {52, 32, 64, 79}, 2566 {52, 33, 64, 79}, {52, 34, 64, 79}, {52, 35, 64, 79}, {52, 36, 64, 79}, {52, 37, 64, 79}, 2567 {52, 38, 64, 79}, {52, 39, 64, 79}, {52, 40, 64, 79}, {52, 41, 64, 79}, {52, 42, 64, 79}, 2568 {52, 43, 64, 79}, {52, 44, 64, 79}, {52, 45, 64, 79}, {52, 46, 64, 79}, {52, 47, 64, 79}, 2569 {52, 48, 64, 79}, {52, 49, 64, 79}, {52, 50, 64, 79}, {52, 51, 64, 79}, {52, 52, 64, 79}, 2570 {52, 53, 64, 79}, {52, 54, 64, 79}, {52, 55, 64, 79}, {52, 56, 64, 79}, {52, 57, 64, 79}, 2571 {52, 58, 64, 79}, {52, 59, 64, 79}, {52, 60, 64, 79}, {52, 61, 64, 79}, {52, 62, 64, 79}, 2572 {52, 63, 64, 79}, {53, 32, 64, 79}, {53, 33, 64, 79}, {53, 34, 64, 79}, {53, 35, 64, 79}, 2573 {53, 36, 64, 79}, {53, 37, 64, 79}, {53, 38, 64, 79}, {53, 39, 64, 79}, {53, 40, 64, 79}, 2574 {53, 41, 64, 79}, {53, 42, 64, 79}, {53, 43, 64, 79}, {53, 44, 64, 79}, {53, 45, 64, 79}, 2575 {53, 46, 64, 79}, {53, 47, 64, 79}, {53, 48, 64, 79}, {53, 49, 64, 79}, {53, 50, 64, 79}, 2576 {53, 51, 64, 79}, {53, 52, 64, 79}, {53, 53, 64, 79}, {53, 54, 64, 79}, {53, 55, 64, 79}, 2577 {53, 56, 64, 79}, {53, 57, 64, 79}, {53, 58, 64, 79}, {53, 59, 64, 79}, {53, 60, 64, 79}, 2578 {53, 61, 64, 79}, {53, 62, 64, 79}, {53, 63, 64, 79}, {54, 32, 64, 79}, {54, 33, 64, 79}, 2579 {54, 34, 64, 79}, {54, 35, 64, 79}, {54, 36, 64, 79}, {54, 37, 64, 79}, {54, 38, 64, 79}, 2580 {54, 39, 64, 79}, {54, 40, 64, 79}, {54, 41, 64, 79}, {54, 42, 64, 79}, {54, 43, 64, 79}, 2581 {54, 44, 64, 79}, {54, 45, 64, 79}, {54, 46, 64, 79}, {54, 47, 64, 79}, {54, 48, 64, 79}, 2582 {54, 49, 64, 79}, {54, 50, 64, 79}, {54, 51, 64, 79}, {54, 52, 64, 79}, {54, 53, 64, 79}, 2583 {54, 54, 64, 79}, {54, 55, 64, 79}, {54, 56, 64, 79}, {54, 57, 64, 79}, {54, 58, 64, 79}, 2584 {54, 59, 64, 79}, {54, 60, 64, 79}, {54, 61, 64, 79}, {54, 62, 64, 79}, {54, 63, 64, 79}, 2585 {55, 32, 64, 79}, {55, 33, 64, 79}, {55, 34, 64, 79}, {55, 35, 64, 79}, {55, 36, 64, 79}, 2586 {55, 37, 64, 79}, {55, 38, 64, 79}, {55, 39, 64, 79}, {55, 40, 64, 79}, {55, 41, 64, 79}, 2587 {55, 42, 64, 79}, {55, 43, 64, 79}, {55, 44, 64, 79}, {55, 45, 64, 79}, {55, 46, 64, 79}, 2588 {55, 47, 64, 79}, {55, 48, 64, 79}, {55, 49, 64, 79}, {55, 50, 64, 79}, {55, 51, 64, 79}, 2589 {55, 52, 64, 79}, {55, 53, 64, 79}, {55, 54, 64, 79}, {55, 55, 64, 79}, {55, 56, 64, 79}, 2590 {55, 57, 64, 79}, {55, 58, 64, 79}, {55, 59, 64, 79}, {55, 60, 64, 79}, {55, 61, 64, 79}, 2591 {55, 62, 64, 79}, {55, 63, 64, 79}, {56, 32, 64, 79}, {56, 33, 64, 79}, {56, 34, 64, 79}, 2592 {56, 35, 64, 79}, {56, 36, 64, 79}, {56, 37, 64, 79}, {56, 38, 64, 79}, {56, 39, 64, 79}, 2593 {56, 40, 64, 79}, {56, 41, 64, 79}, {56, 42, 64, 79}, {56, 43, 64, 79}, {56, 44, 64, 79}, 2594 {56, 45, 64, 79}, {56, 46, 64, 79}, {56, 47, 64, 79}, {56, 48, 64, 79}, {56, 49, 64, 79}, 2595 {56, 50, 64, 79}, {56, 51, 64, 79}, {56, 52, 64, 79}, {56, 53, 64, 79}, {56, 54, 64, 79}, 2596 {56, 55, 64, 79}, {56, 56, 64, 79}, {56, 57, 64, 79}, {56, 58, 64, 79}, {56, 59, 64, 79}, 2597 {56, 60, 64, 79}, {56, 61, 64, 79}, {56, 62, 64, 79}, {56, 63, 64, 79}, {57, 32, 64, 79}, 2598 {57, 33, 64, 79}, {57, 34, 64, 79}, {57, 35, 64, 79}, {57, 36, 64, 79}, {57, 37, 64, 79}, 2599 {57, 38, 64, 79}, {57, 39, 64, 79}, {57, 40, 64, 79}, {57, 41, 64, 79}, {57, 42, 64, 79}, 2600 {57, 43, 64, 79}, {57, 44, 64, 79}, {57, 45, 64, 79}, {57, 46, 64, 79}, {57, 47, 64, 79}, 2601 {57, 48, 64, 79}, {57, 49, 64, 79}, {57, 50, 64, 79}, {57, 51, 64, 79}, {57, 52, 64, 79}, 2602 {57, 53, 64, 79}, {57, 54, 64, 79}, {57, 55, 64, 79}, {57, 56, 64, 79}, {57, 57, 64, 79}, 2603 {57, 58, 64, 79}, {57, 59, 64, 79}, {57, 60, 64, 79}, {57, 61, 64, 79}, {57, 62, 64, 79}, 2604 {57, 63, 64, 79}, {58, 32, 64, 79}, {58, 33, 64, 79}, {58, 34, 64, 79}, {58, 35, 64, 79}, 2605 {58, 36, 64, 79}, {58, 37, 64, 79}, {58, 38, 64, 79}, {58, 39, 64, 79}, {58, 40, 64, 79}, 2606 {58, 41, 64, 79}, {58, 42, 64, 79}, {58, 43, 64, 79}, {58, 44, 64, 79}, {58, 45, 64, 79}, 2607 {58, 46, 64, 79}, {58, 47, 64, 79}, {58, 48, 64, 79}, {58, 49, 64, 79}, {58, 50, 64, 79}, 2608 {58, 51, 64, 79}, {58, 52, 64, 79}, {58, 53, 64, 79}, {58, 54, 64, 79}, {58, 55, 64, 79}, 2609 {58, 56, 64, 79}, {58, 57, 64, 79}, {58, 58, 64, 79}, {58, 59, 64, 79}, {58, 60, 64, 79}, 2610 {58, 61, 64, 79}, {58, 62, 64, 79}, {58, 63, 64, 79}, {59, 32, 64, 79}, {59, 33, 64, 79}, 2611 {59, 34, 64, 79}, {59, 35, 64, 79}, {59, 36, 64, 79}, {59, 37, 64, 79}, {59, 38, 64, 79}, 2612 {59, 39, 64, 79}, {59, 40, 64, 79}, {59, 41, 64, 79}, {59, 42, 64, 79}, {59, 43, 64, 79}, 2613 {59, 44, 64, 79}, {59, 45, 64, 79}, {59, 46, 64, 79}, {59, 47, 64, 79}, {59, 48, 64, 79}, 2614 {59, 49, 64, 79}, {59, 50, 64, 79}, {59, 51, 64, 79}, {59, 52, 64, 79}, {59, 53, 64, 79}, 2615 {59, 54, 64, 79}, {59, 55, 64, 79}, {59, 56, 64, 79}, {59, 57, 64, 79}, {59, 58, 64, 79}, 2616 {59, 59, 64, 79}, {59, 60, 64, 79}, {59, 61, 64, 79}, {59, 62, 64, 79}, {59, 63, 64, 79}, 2617 {40, 64, 30, 31}, {40, 65, 30, 31}, {40, 66, 30, 31}, {40, 67, 30, 31}, {40, 68, 30, 31}, 2618 {40, 69, 30, 31}, {41, 64, 30, 31}, {41, 65, 30, 31}, {41, 66, 30, 31}, {41, 67, 30, 31}, 2619 {41, 68, 30, 31}, {41, 69, 30, 31}, {42, 64, 30, 31}, {42, 65, 30, 31}, {42, 66, 30, 31}, 2620 {42, 67, 30, 31}, {42, 68, 30, 31}, {42, 69, 30, 31}, {43, 64, 30, 31}, {43, 65, 30, 31}, 2621 {43, 66, 30, 31}, {43, 67, 30, 31}, {43, 68, 30, 31}, {43, 69, 30, 31}, {44, 64, 30, 31}, 2622 {44, 65, 30, 31}, {44, 66, 30, 31}, {44, 67, 30, 31}, {44, 68, 30, 31}, {44, 69, 30, 31}, 2623 {45, 64, 30, 31}, {45, 65, 30, 31}, {45, 66, 30, 31}, {45, 67, 30, 31}, {45, 68, 30, 31}, 2624 {45, 69, 30, 31}, {46, 64, 30, 31}, {46, 65, 30, 31}, {46, 66, 30, 31}, {46, 67, 30, 31}, 2625 {46, 68, 30, 31}, {46, 69, 30, 31}, {47, 64, 30, 31}, {47, 65, 30, 31}, {47, 66, 30, 31}, 2626 {47, 67, 30, 31}, {47, 68, 30, 31}, {47, 69, 30, 31}, {48, 64, 30, 31}, {48, 65, 30, 31}, 2627 {48, 66, 30, 31}, {48, 67, 30, 31}, {48, 68, 30, 31}, {48, 69, 30, 31}, {49, 64, 30, 31}, 2628 {49, 65, 30, 31}, {49, 66, 30, 31}, {49, 67, 30, 31}, {49, 68, 30, 31}, {49, 69, 30, 31}, 2629 {50, 64, 30, 31}, {50, 65, 30, 31}, {50, 66, 30, 31}, {50, 67, 30, 31}, {50, 68, 30, 31}, 2630 {50, 69, 30, 31}, {51, 64, 30, 31}, {51, 65, 30, 31}, {51, 66, 30, 31}, {51, 67, 30, 31}, 2631 {51, 68, 30, 31}, {51, 69, 30, 31}, {52, 64, 30, 31}, {52, 65, 30, 31}, {52, 66, 30, 31}, 2632 {52, 67, 30, 31}, {52, 68, 30, 31}, {52, 69, 30, 31}, {53, 64, 30, 31}, {53, 65, 30, 31}, 2633 {53, 66, 30, 31}, {53, 67, 30, 31}, {53, 68, 30, 31}, {53, 69, 30, 31}, {54, 64, 30, 31}, 2634 {54, 65, 30, 31}, {54, 66, 30, 31}, {54, 67, 30, 31}, {54, 68, 30, 31}, {54, 69, 30, 31}, 2635 {55, 64, 30, 31}, {55, 65, 30, 31}, {55, 66, 30, 31}, {55, 67, 30, 31}, {55, 68, 30, 31}, 2636 {55, 69, 30, 31}, {56, 64, 30, 31}, {56, 65, 30, 31}, {56, 66, 30, 31}, {56, 67, 30, 31}, 2637 {56, 68, 30, 31}, {56, 69, 30, 31}, {57, 64, 30, 31}, {57, 65, 30, 31}, {57, 66, 30, 31}, 2638 {57, 67, 30, 31}, {57, 68, 30, 31}, {57, 69, 30, 31}, {58, 64, 30, 31}, {58, 65, 30, 31}, 2639 {58, 66, 30, 31}, {58, 67, 30, 31}, {58, 68, 30, 31}, {58, 69, 30, 31}, {59, 64, 30, 31}, 2640 {59, 65, 30, 31}, {59, 66, 30, 31}, {59, 67, 30, 31}, {59, 68, 30, 31}, {59, 69, 30, 31}, 2641 {40, 64, 32, 63}, {40, 65, 32, 63}, {40, 66, 32, 63}, {40, 67, 32, 63}, {40, 68, 32, 63}, 2642 {40, 69, 32, 63}, {41, 64, 32, 63}, {41, 65, 32, 63}, {41, 66, 32, 63}, {41, 67, 32, 63}, 2643 {41, 68, 32, 63}, {41, 69, 32, 63}, {42, 64, 32, 63}, {42, 65, 32, 63}, {42, 66, 32, 63}, 2644 {42, 67, 32, 63}, {42, 68, 32, 63}, {42, 69, 32, 63}, {43, 64, 32, 63}, {43, 65, 32, 63}, 2645 {43, 66, 32, 63}, {43, 67, 32, 63}, {43, 68, 32, 63}, {43, 69, 32, 63}, {44, 64, 32, 63}, 2646 {44, 65, 32, 63}, {44, 66, 32, 63}, {44, 67, 32, 63}, {44, 68, 32, 63}, {44, 69, 32, 63}, 2647 {45, 64, 32, 63}, {45, 65, 32, 63}, {45, 66, 32, 63}, {45, 67, 32, 63}, {45, 68, 32, 63}, 2648 {45, 69, 32, 63}, {46, 64, 32, 63}, {46, 65, 32, 63}, {46, 66, 32, 63}, {46, 67, 32, 63}, 2649 {46, 68, 32, 63}, {46, 69, 32, 63}, {47, 64, 32, 63}, {47, 65, 32, 63}, {47, 66, 32, 63}, 2650 {47, 67, 32, 63}, {47, 68, 32, 63}, {47, 69, 32, 63}, {48, 64, 32, 63}, {48, 65, 32, 63}, 2651 {48, 66, 32, 63}, {48, 67, 32, 63}, {48, 68, 32, 63}, {48, 69, 32, 63}, {49, 64, 32, 63}, 2652 {49, 65, 32, 63}, {49, 66, 32, 63}, {49, 67, 32, 63}, {49, 68, 32, 63}, {49, 69, 32, 63}, 2653 {50, 64, 32, 63}, {50, 65, 32, 63}, {50, 66, 32, 63}, {50, 67, 32, 63}, {50, 68, 32, 63}, 2654 {50, 69, 32, 63}, {51, 64, 32, 63}, {51, 65, 32, 63}, {51, 66, 32, 63}, {51, 67, 32, 63}, 2655 {51, 68, 32, 63}, {51, 69, 32, 63}, {52, 64, 32, 63}, {52, 65, 32, 63}, {52, 66, 32, 63}, 2656 {52, 67, 32, 63}, {52, 68, 32, 63}, {52, 69, 32, 63}, {53, 64, 32, 63}, {53, 65, 32, 63}, 2657 {53, 66, 32, 63}, {53, 67, 32, 63}, {53, 68, 32, 63}, {53, 69, 32, 63}, {54, 64, 32, 63}, 2658 {54, 65, 32, 63}, {54, 66, 32, 63}, {54, 67, 32, 63}, {54, 68, 32, 63}, {54, 69, 32, 63}, 2659 {55, 64, 32, 63}, {55, 65, 32, 63}, {55, 66, 32, 63}, {55, 67, 32, 63}, {55, 68, 32, 63}, 2660 {55, 69, 32, 63}, {56, 64, 32, 63}, {56, 65, 32, 63}, {56, 66, 32, 63}, {56, 67, 32, 63}, 2661 {56, 68, 32, 63}, {56, 69, 32, 63}, {57, 64, 32, 63}, {57, 65, 32, 63}, {57, 66, 32, 63}, 2662 {57, 67, 32, 63}, {57, 68, 32, 63}, {57, 69, 32, 63}, {58, 64, 32, 63}, {58, 65, 32, 63}, 2663 {58, 66, 32, 63}, {58, 67, 32, 63}, {58, 68, 32, 63}, {58, 69, 32, 63}, {59, 64, 32, 63}, 2664 {59, 65, 32, 63}, {59, 66, 32, 63}, {59, 67, 32, 63}, {59, 68, 32, 63}, {59, 69, 32, 63}, 2665 {40, 64, 64, 79}, {40, 65, 64, 79}, {40, 66, 64, 79}, {40, 67, 64, 79}, {40, 68, 64, 79}, 2666 {40, 69, 64, 79}, {41, 64, 64, 79}, {41, 65, 64, 79}, {41, 66, 64, 79}, {41, 67, 64, 79}, 2667 {41, 68, 64, 79}, {41, 69, 64, 79}, {42, 64, 64, 79}, {42, 65, 64, 79}, {42, 66, 64, 79}, 2668 {42, 67, 64, 79}, {42, 68, 64, 79}, {42, 69, 64, 79}, {43, 64, 64, 79}, {43, 65, 64, 79}, 2669 {43, 66, 64, 79}, {43, 67, 64, 79}, {43, 68, 64, 79}, {43, 69, 64, 79}, {44, 64, 64, 79}, 2670 {44, 65, 64, 79}, {44, 66, 64, 79}, {44, 67, 64, 79}, {44, 68, 64, 79}, {44, 69, 64, 79}, 2671 {45, 64, 64, 79}, {45, 65, 64, 79}, {45, 66, 64, 79}, {45, 67, 64, 79}, {45, 68, 64, 79}, 2672 {45, 69, 64, 79}, {46, 64, 64, 79}, {46, 65, 64, 79}, {46, 66, 64, 79}, {46, 67, 64, 79}, 2673 {46, 68, 64, 79}, {46, 69, 64, 79}, {47, 64, 64, 79}, {47, 65, 64, 79}, {47, 66, 64, 79}, 2674 {47, 67, 64, 79}, {47, 68, 64, 79}, {47, 69, 64, 79}, {48, 64, 64, 79}, {48, 65, 64, 79}, 2675 {48, 66, 64, 79}, {48, 67, 64, 79}, {48, 68, 64, 79}, {48, 69, 64, 79}, {49, 64, 64, 79}, 2676 {49, 65, 64, 79}, {49, 66, 64, 79}, {49, 67, 64, 79}, {49, 68, 64, 79}, {49, 69, 64, 79}, 2677 {50, 64, 64, 79}, {50, 65, 64, 79}, {50, 66, 64, 79}, {50, 67, 64, 79}, {50, 68, 64, 79}, 2678 {50, 69, 64, 79}, {51, 64, 64, 79}, {51, 65, 64, 79}, {51, 66, 64, 79}, {51, 67, 64, 79}, 2679 {51, 68, 64, 79}, {51, 69, 64, 79}, {52, 64, 64, 79}, {52, 65, 64, 79}, {52, 66, 64, 79}, 2680 {52, 67, 64, 79}, {52, 68, 64, 79}, {52, 69, 64, 79}, {53, 64, 64, 79}, {53, 65, 64, 79}, 2681 {53, 66, 64, 79}, {53, 67, 64, 79}, {53, 68, 64, 79}, {53, 69, 64, 79}, {54, 64, 64, 79}, 2682 {54, 65, 64, 79}, {54, 66, 64, 79}, {54, 67, 64, 79}, {54, 68, 64, 79}, {54, 69, 64, 79}, 2683 {55, 64, 64, 79}, {55, 65, 64, 79}, {55, 66, 64, 79}, {55, 67, 64, 79}, {55, 68, 64, 79}, 2684 {55, 69, 64, 79}, {56, 64, 64, 79}, {56, 65, 64, 79}, {56, 66, 64, 79}, {56, 67, 64, 79}, 2685 {56, 68, 64, 79}, {56, 69, 64, 79}, {57, 64, 64, 79}, {57, 65, 64, 79}, {57, 66, 64, 79}, 2686 {57, 67, 64, 79}, {57, 68, 64, 79}, {57, 69, 64, 79}, {58, 64, 64, 79}, {58, 65, 64, 79}, 2687 {58, 66, 64, 79}, {58, 67, 64, 79}, {58, 68, 64, 79}, {58, 69, 64, 79}, {59, 64, 64, 79}, 2688 {59, 65, 64, 79}, {59, 66, 64, 79}, {59, 67, 64, 79}, {59, 68, 64, 79}, {59, 69, 64, 79}, 2689 }, 2690 } 2691 body3 = testBody{ 2692 label: 3, 2693 offset: dvid.Point3d{40, 40, 10}, 2694 size: dvid.Point3d{20, 20, 30}, 2695 blockSpans: []dvid.Span{ 2696 {0, 1, 1, 1}, 2697 {1, 1, 1, 1}, 2698 }, 2699 voxelSpans: []dvid.Span{ 2700 {10, 40, 40, 59}, {10, 41, 40, 59}, {10, 42, 40, 59}, {10, 43, 40, 59}, {10, 44, 40, 59}, 2701 {10, 45, 40, 59}, {10, 46, 40, 59}, {10, 47, 40, 59}, {10, 48, 40, 59}, {10, 49, 40, 59}, 2702 {10, 50, 40, 59}, {10, 51, 40, 59}, {10, 52, 40, 59}, {10, 53, 40, 59}, {10, 54, 40, 59}, 2703 {10, 55, 40, 59}, {10, 56, 40, 59}, {10, 57, 40, 59}, {10, 58, 40, 59}, {10, 59, 40, 59}, 2704 {11, 40, 40, 59}, {11, 41, 40, 59}, {11, 42, 40, 59}, {11, 43, 40, 59}, {11, 44, 40, 59}, 2705 {11, 45, 40, 59}, {11, 46, 40, 59}, {11, 47, 40, 59}, {11, 48, 40, 59}, {11, 49, 40, 59}, 2706 {11, 50, 40, 59}, {11, 51, 40, 59}, {11, 52, 40, 59}, {11, 53, 40, 59}, {11, 54, 40, 59}, 2707 {11, 55, 40, 59}, {11, 56, 40, 59}, {11, 57, 40, 59}, {11, 58, 40, 59}, {11, 59, 40, 59}, 2708 {12, 40, 40, 59}, {12, 41, 40, 59}, {12, 42, 40, 59}, {12, 43, 40, 59}, {12, 44, 40, 59}, 2709 {12, 45, 40, 59}, {12, 46, 40, 59}, {12, 47, 40, 59}, {12, 48, 40, 59}, {12, 49, 40, 59}, 2710 {12, 50, 40, 59}, {12, 51, 40, 59}, {12, 52, 40, 59}, {12, 53, 40, 59}, {12, 54, 40, 59}, 2711 {12, 55, 40, 59}, {12, 56, 40, 59}, {12, 57, 40, 59}, {12, 58, 40, 59}, {12, 59, 40, 59}, 2712 {13, 40, 40, 59}, {13, 41, 40, 59}, {13, 42, 40, 59}, {13, 43, 40, 59}, {13, 44, 40, 59}, 2713 {13, 45, 40, 59}, {13, 46, 40, 59}, {13, 47, 40, 59}, {13, 48, 40, 59}, {13, 49, 40, 59}, 2714 {13, 50, 40, 59}, {13, 51, 40, 59}, {13, 52, 40, 59}, {13, 53, 40, 59}, {13, 54, 40, 59}, 2715 {13, 55, 40, 59}, {13, 56, 40, 59}, {13, 57, 40, 59}, {13, 58, 40, 59}, {13, 59, 40, 59}, 2716 {14, 40, 40, 59}, {14, 41, 40, 59}, {14, 42, 40, 59}, {14, 43, 40, 59}, {14, 44, 40, 59}, 2717 {14, 45, 40, 59}, {14, 46, 40, 59}, {14, 47, 40, 59}, {14, 48, 40, 59}, {14, 49, 40, 59}, 2718 {14, 50, 40, 59}, {14, 51, 40, 59}, {14, 52, 40, 59}, {14, 53, 40, 59}, {14, 54, 40, 59}, 2719 {14, 55, 40, 59}, {14, 56, 40, 59}, {14, 57, 40, 59}, {14, 58, 40, 59}, {14, 59, 40, 59}, 2720 {15, 40, 40, 59}, {15, 41, 40, 59}, {15, 42, 40, 59}, {15, 43, 40, 59}, {15, 44, 40, 59}, 2721 {15, 45, 40, 59}, {15, 46, 40, 59}, {15, 47, 40, 59}, {15, 48, 40, 59}, {15, 49, 40, 59}, 2722 {15, 50, 40, 59}, {15, 51, 40, 59}, {15, 52, 40, 59}, {15, 53, 40, 59}, {15, 54, 40, 59}, 2723 {15, 55, 40, 59}, {15, 56, 40, 59}, {15, 57, 40, 59}, {15, 58, 40, 59}, {15, 59, 40, 59}, 2724 {16, 40, 40, 59}, {16, 41, 40, 59}, {16, 42, 40, 59}, {16, 43, 40, 59}, {16, 44, 40, 59}, 2725 {16, 45, 40, 59}, {16, 46, 40, 59}, {16, 47, 40, 59}, {16, 48, 40, 59}, {16, 49, 40, 59}, 2726 {16, 50, 40, 59}, {16, 51, 40, 59}, {16, 52, 40, 59}, {16, 53, 40, 59}, {16, 54, 40, 59}, 2727 {16, 55, 40, 59}, {16, 56, 40, 59}, {16, 57, 40, 59}, {16, 58, 40, 59}, {16, 59, 40, 59}, 2728 {17, 40, 40, 59}, {17, 41, 40, 59}, {17, 42, 40, 59}, {17, 43, 40, 59}, {17, 44, 40, 59}, 2729 {17, 45, 40, 59}, {17, 46, 40, 59}, {17, 47, 40, 59}, {17, 48, 40, 59}, {17, 49, 40, 59}, 2730 {17, 50, 40, 59}, {17, 51, 40, 59}, {17, 52, 40, 59}, {17, 53, 40, 59}, {17, 54, 40, 59}, 2731 {17, 55, 40, 59}, {17, 56, 40, 59}, {17, 57, 40, 59}, {17, 58, 40, 59}, {17, 59, 40, 59}, 2732 {18, 40, 40, 59}, {18, 41, 40, 59}, {18, 42, 40, 59}, {18, 43, 40, 59}, {18, 44, 40, 59}, 2733 {18, 45, 40, 59}, {18, 46, 40, 59}, {18, 47, 40, 59}, {18, 48, 40, 59}, {18, 49, 40, 59}, 2734 {18, 50, 40, 59}, {18, 51, 40, 59}, {18, 52, 40, 59}, {18, 53, 40, 59}, {18, 54, 40, 59}, 2735 {18, 55, 40, 59}, {18, 56, 40, 59}, {18, 57, 40, 59}, {18, 58, 40, 59}, {18, 59, 40, 59}, 2736 {19, 40, 40, 59}, {19, 41, 40, 59}, {19, 42, 40, 59}, {19, 43, 40, 59}, {19, 44, 40, 59}, 2737 {19, 45, 40, 59}, {19, 46, 40, 59}, {19, 47, 40, 59}, {19, 48, 40, 59}, {19, 49, 40, 59}, 2738 {19, 50, 40, 59}, {19, 51, 40, 59}, {19, 52, 40, 59}, {19, 53, 40, 59}, {19, 54, 40, 59}, 2739 {19, 55, 40, 59}, {19, 56, 40, 59}, {19, 57, 40, 59}, {19, 58, 40, 59}, {19, 59, 40, 59}, 2740 {20, 40, 40, 59}, {20, 41, 40, 59}, {20, 42, 40, 59}, {20, 43, 40, 59}, {20, 44, 40, 59}, 2741 {20, 45, 40, 59}, {20, 46, 40, 59}, {20, 47, 40, 59}, {20, 48, 40, 59}, {20, 49, 40, 59}, 2742 {20, 50, 40, 59}, {20, 51, 40, 59}, {20, 52, 40, 59}, {20, 53, 40, 59}, {20, 54, 40, 59}, 2743 {20, 55, 40, 59}, {20, 56, 40, 59}, {20, 57, 40, 59}, {20, 58, 40, 59}, {20, 59, 40, 59}, 2744 {21, 40, 40, 59}, {21, 41, 40, 59}, {21, 42, 40, 59}, {21, 43, 40, 59}, {21, 44, 40, 59}, 2745 {21, 45, 40, 59}, {21, 46, 40, 59}, {21, 47, 40, 59}, {21, 48, 40, 59}, {21, 49, 40, 59}, 2746 {21, 50, 40, 59}, {21, 51, 40, 59}, {21, 52, 40, 59}, {21, 53, 40, 59}, {21, 54, 40, 59}, 2747 {21, 55, 40, 59}, {21, 56, 40, 59}, {21, 57, 40, 59}, {21, 58, 40, 59}, {21, 59, 40, 59}, 2748 {22, 40, 40, 59}, {22, 41, 40, 59}, {22, 42, 40, 59}, {22, 43, 40, 59}, {22, 44, 40, 59}, 2749 {22, 45, 40, 59}, {22, 46, 40, 59}, {22, 47, 40, 59}, {22, 48, 40, 59}, {22, 49, 40, 59}, 2750 {22, 50, 40, 59}, {22, 51, 40, 59}, {22, 52, 40, 59}, {22, 53, 40, 59}, {22, 54, 40, 59}, 2751 {22, 55, 40, 59}, {22, 56, 40, 59}, {22, 57, 40, 59}, {22, 58, 40, 59}, {22, 59, 40, 59}, 2752 {23, 40, 40, 59}, {23, 41, 40, 59}, {23, 42, 40, 59}, {23, 43, 40, 59}, {23, 44, 40, 59}, 2753 {23, 45, 40, 59}, {23, 46, 40, 59}, {23, 47, 40, 59}, {23, 48, 40, 59}, {23, 49, 40, 59}, 2754 {23, 50, 40, 59}, {23, 51, 40, 59}, {23, 52, 40, 59}, {23, 53, 40, 59}, {23, 54, 40, 59}, 2755 {23, 55, 40, 59}, {23, 56, 40, 59}, {23, 57, 40, 59}, {23, 58, 40, 59}, {23, 59, 40, 59}, 2756 {24, 40, 40, 59}, {24, 41, 40, 59}, {24, 42, 40, 59}, {24, 43, 40, 59}, {24, 44, 40, 59}, 2757 {24, 45, 40, 59}, {24, 46, 40, 59}, {24, 47, 40, 59}, {24, 48, 40, 59}, {24, 49, 40, 59}, 2758 {24, 50, 40, 59}, {24, 51, 40, 59}, {24, 52, 40, 59}, {24, 53, 40, 59}, {24, 54, 40, 59}, 2759 {24, 55, 40, 59}, {24, 56, 40, 59}, {24, 57, 40, 59}, {24, 58, 40, 59}, {24, 59, 40, 59}, 2760 {25, 40, 40, 59}, {25, 41, 40, 59}, {25, 42, 40, 59}, {25, 43, 40, 59}, {25, 44, 40, 59}, 2761 {25, 45, 40, 59}, {25, 46, 40, 59}, {25, 47, 40, 59}, {25, 48, 40, 59}, {25, 49, 40, 59}, 2762 {25, 50, 40, 59}, {25, 51, 40, 59}, {25, 52, 40, 59}, {25, 53, 40, 59}, {25, 54, 40, 59}, 2763 {25, 55, 40, 59}, {25, 56, 40, 59}, {25, 57, 40, 59}, {25, 58, 40, 59}, {25, 59, 40, 59}, 2764 {26, 40, 40, 59}, {26, 41, 40, 59}, {26, 42, 40, 59}, {26, 43, 40, 59}, {26, 44, 40, 59}, 2765 {26, 45, 40, 59}, {26, 46, 40, 59}, {26, 47, 40, 59}, {26, 48, 40, 59}, {26, 49, 40, 59}, 2766 {26, 50, 40, 59}, {26, 51, 40, 59}, {26, 52, 40, 59}, {26, 53, 40, 59}, {26, 54, 40, 59}, 2767 {26, 55, 40, 59}, {26, 56, 40, 59}, {26, 57, 40, 59}, {26, 58, 40, 59}, {26, 59, 40, 59}, 2768 {27, 40, 40, 59}, {27, 41, 40, 59}, {27, 42, 40, 59}, {27, 43, 40, 59}, {27, 44, 40, 59}, 2769 {27, 45, 40, 59}, {27, 46, 40, 59}, {27, 47, 40, 59}, {27, 48, 40, 59}, {27, 49, 40, 59}, 2770 {27, 50, 40, 59}, {27, 51, 40, 59}, {27, 52, 40, 59}, {27, 53, 40, 59}, {27, 54, 40, 59}, 2771 {27, 55, 40, 59}, {27, 56, 40, 59}, {27, 57, 40, 59}, {27, 58, 40, 59}, {27, 59, 40, 59}, 2772 {28, 40, 40, 59}, {28, 41, 40, 59}, {28, 42, 40, 59}, {28, 43, 40, 59}, {28, 44, 40, 59}, 2773 {28, 45, 40, 59}, {28, 46, 40, 59}, {28, 47, 40, 59}, {28, 48, 40, 59}, {28, 49, 40, 59}, 2774 {28, 50, 40, 59}, {28, 51, 40, 59}, {28, 52, 40, 59}, {28, 53, 40, 59}, {28, 54, 40, 59}, 2775 {28, 55, 40, 59}, {28, 56, 40, 59}, {28, 57, 40, 59}, {28, 58, 40, 59}, {28, 59, 40, 59}, 2776 {29, 40, 40, 59}, {29, 41, 40, 59}, {29, 42, 40, 59}, {29, 43, 40, 59}, {29, 44, 40, 59}, 2777 {29, 45, 40, 59}, {29, 46, 40, 59}, {29, 47, 40, 59}, {29, 48, 40, 59}, {29, 49, 40, 59}, 2778 {29, 50, 40, 59}, {29, 51, 40, 59}, {29, 52, 40, 59}, {29, 53, 40, 59}, {29, 54, 40, 59}, 2779 {29, 55, 40, 59}, {29, 56, 40, 59}, {29, 57, 40, 59}, {29, 58, 40, 59}, {29, 59, 40, 59}, 2780 {30, 40, 40, 59}, {30, 41, 40, 59}, {30, 42, 40, 59}, {30, 43, 40, 59}, {30, 44, 40, 59}, 2781 {30, 45, 40, 59}, {30, 46, 40, 59}, {30, 47, 40, 59}, {30, 48, 40, 59}, {30, 49, 40, 59}, 2782 {30, 50, 40, 59}, {30, 51, 40, 59}, {30, 52, 40, 59}, {30, 53, 40, 59}, {30, 54, 40, 59}, 2783 {30, 55, 40, 59}, {30, 56, 40, 59}, {30, 57, 40, 59}, {30, 58, 40, 59}, {30, 59, 40, 59}, 2784 {31, 40, 40, 59}, {31, 41, 40, 59}, {31, 42, 40, 59}, {31, 43, 40, 59}, {31, 44, 40, 59}, 2785 {31, 45, 40, 59}, {31, 46, 40, 59}, {31, 47, 40, 59}, {31, 48, 40, 59}, {31, 49, 40, 59}, 2786 {31, 50, 40, 59}, {31, 51, 40, 59}, {31, 52, 40, 59}, {31, 53, 40, 59}, {31, 54, 40, 59}, 2787 {31, 55, 40, 59}, {31, 56, 40, 59}, {31, 57, 40, 59}, {31, 58, 40, 59}, {31, 59, 40, 59}, 2788 {32, 40, 40, 59}, {32, 41, 40, 59}, {32, 42, 40, 59}, {32, 43, 40, 59}, {32, 44, 40, 59}, 2789 {32, 45, 40, 59}, {32, 46, 40, 59}, {32, 47, 40, 59}, {32, 48, 40, 59}, {32, 49, 40, 59}, 2790 {32, 50, 40, 59}, {32, 51, 40, 59}, {32, 52, 40, 59}, {32, 53, 40, 59}, {32, 54, 40, 59}, 2791 {32, 55, 40, 59}, {32, 56, 40, 59}, {32, 57, 40, 59}, {32, 58, 40, 59}, {32, 59, 40, 59}, 2792 {33, 40, 40, 59}, {33, 41, 40, 59}, {33, 42, 40, 59}, {33, 43, 40, 59}, {33, 44, 40, 59}, 2793 {33, 45, 40, 59}, {33, 46, 40, 59}, {33, 47, 40, 59}, {33, 48, 40, 59}, {33, 49, 40, 59}, 2794 {33, 50, 40, 59}, {33, 51, 40, 59}, {33, 52, 40, 59}, {33, 53, 40, 59}, {33, 54, 40, 59}, 2795 {33, 55, 40, 59}, {33, 56, 40, 59}, {33, 57, 40, 59}, {33, 58, 40, 59}, {33, 59, 40, 59}, 2796 {34, 40, 40, 59}, {34, 41, 40, 59}, {34, 42, 40, 59}, {34, 43, 40, 59}, {34, 44, 40, 59}, 2797 {34, 45, 40, 59}, {34, 46, 40, 59}, {34, 47, 40, 59}, {34, 48, 40, 59}, {34, 49, 40, 59}, 2798 {34, 50, 40, 59}, {34, 51, 40, 59}, {34, 52, 40, 59}, {34, 53, 40, 59}, {34, 54, 40, 59}, 2799 {34, 55, 40, 59}, {34, 56, 40, 59}, {34, 57, 40, 59}, {34, 58, 40, 59}, {34, 59, 40, 59}, 2800 {35, 40, 40, 59}, {35, 41, 40, 59}, {35, 42, 40, 59}, {35, 43, 40, 59}, {35, 44, 40, 59}, 2801 {35, 45, 40, 59}, {35, 46, 40, 59}, {35, 47, 40, 59}, {35, 48, 40, 59}, {35, 49, 40, 59}, 2802 {35, 50, 40, 59}, {35, 51, 40, 59}, {35, 52, 40, 59}, {35, 53, 40, 59}, {35, 54, 40, 59}, 2803 {35, 55, 40, 59}, {35, 56, 40, 59}, {35, 57, 40, 59}, {35, 58, 40, 59}, {35, 59, 40, 59}, 2804 {36, 40, 40, 59}, {36, 41, 40, 59}, {36, 42, 40, 59}, {36, 43, 40, 59}, {36, 44, 40, 59}, 2805 {36, 45, 40, 59}, {36, 46, 40, 59}, {36, 47, 40, 59}, {36, 48, 40, 59}, {36, 49, 40, 59}, 2806 {36, 50, 40, 59}, {36, 51, 40, 59}, {36, 52, 40, 59}, {36, 53, 40, 59}, {36, 54, 40, 59}, 2807 {36, 55, 40, 59}, {36, 56, 40, 59}, {36, 57, 40, 59}, {36, 58, 40, 59}, {36, 59, 40, 59}, 2808 {37, 40, 40, 59}, {37, 41, 40, 59}, {37, 42, 40, 59}, {37, 43, 40, 59}, {37, 44, 40, 59}, 2809 {37, 45, 40, 59}, {37, 46, 40, 59}, {37, 47, 40, 59}, {37, 48, 40, 59}, {37, 49, 40, 59}, 2810 {37, 50, 40, 59}, {37, 51, 40, 59}, {37, 52, 40, 59}, {37, 53, 40, 59}, {37, 54, 40, 59}, 2811 {37, 55, 40, 59}, {37, 56, 40, 59}, {37, 57, 40, 59}, {37, 58, 40, 59}, {37, 59, 40, 59}, 2812 {38, 40, 40, 59}, {38, 41, 40, 59}, {38, 42, 40, 59}, {38, 43, 40, 59}, {38, 44, 40, 59}, 2813 {38, 45, 40, 59}, {38, 46, 40, 59}, {38, 47, 40, 59}, {38, 48, 40, 59}, {38, 49, 40, 59}, 2814 {38, 50, 40, 59}, {38, 51, 40, 59}, {38, 52, 40, 59}, {38, 53, 40, 59}, {38, 54, 40, 59}, 2815 {38, 55, 40, 59}, {38, 56, 40, 59}, {38, 57, 40, 59}, {38, 58, 40, 59}, {38, 59, 40, 59}, 2816 {39, 40, 40, 59}, {39, 41, 40, 59}, {39, 42, 40, 59}, {39, 43, 40, 59}, {39, 44, 40, 59}, 2817 {39, 45, 40, 59}, {39, 46, 40, 59}, {39, 47, 40, 59}, {39, 48, 40, 59}, {39, 49, 40, 59}, 2818 {39, 50, 40, 59}, {39, 51, 40, 59}, {39, 52, 40, 59}, {39, 53, 40, 59}, {39, 54, 40, 59}, 2819 {39, 55, 40, 59}, {39, 56, 40, 59}, {39, 57, 40, 59}, {39, 58, 40, 59}, {39, 59, 40, 59}, 2820 }, 2821 } 2822 body4 = testBody{ 2823 label: 4, 2824 offset: dvid.Point3d{75, 40, 60}, 2825 size: dvid.Point3d{20, 20, 30}, 2826 blockSpans: []dvid.Span{ 2827 {1, 1, 2, 2}, 2828 {2, 1, 2, 2}, 2829 }, 2830 voxelSpans: []dvid.Span{ 2831 {60, 40, 75, 94}, {60, 41, 75, 94}, {60, 42, 75, 94}, {60, 43, 75, 94}, {60, 44, 75, 94}, 2832 {60, 45, 75, 94}, {60, 46, 75, 94}, {60, 47, 75, 94}, {60, 48, 75, 94}, {60, 49, 75, 94}, 2833 {60, 50, 75, 94}, {60, 51, 75, 94}, {60, 52, 75, 94}, {60, 53, 75, 94}, {60, 54, 75, 94}, 2834 {60, 55, 75, 94}, {60, 56, 75, 94}, {60, 57, 75, 94}, {60, 58, 75, 94}, {60, 59, 75, 94}, 2835 {61, 40, 75, 94}, {61, 41, 75, 94}, {61, 42, 75, 94}, {61, 43, 75, 94}, {61, 44, 75, 94}, 2836 {61, 45, 75, 94}, {61, 46, 75, 94}, {61, 47, 75, 94}, {61, 48, 75, 94}, {61, 49, 75, 94}, 2837 {61, 50, 75, 94}, {61, 51, 75, 94}, {61, 52, 75, 94}, {61, 53, 75, 94}, {61, 54, 75, 94}, 2838 {61, 55, 75, 94}, {61, 56, 75, 94}, {61, 57, 75, 94}, {61, 58, 75, 94}, {61, 59, 75, 94}, 2839 {62, 40, 75, 94}, {62, 41, 75, 94}, {62, 42, 75, 94}, {62, 43, 75, 94}, {62, 44, 75, 94}, 2840 {62, 45, 75, 94}, {62, 46, 75, 94}, {62, 47, 75, 94}, {62, 48, 75, 94}, {62, 49, 75, 94}, 2841 {62, 50, 75, 94}, {62, 51, 75, 94}, {62, 52, 75, 94}, {62, 53, 75, 94}, {62, 54, 75, 94}, 2842 {62, 55, 75, 94}, {62, 56, 75, 94}, {62, 57, 75, 94}, {62, 58, 75, 94}, {62, 59, 75, 94}, 2843 {63, 40, 75, 94}, {63, 41, 75, 94}, {63, 42, 75, 94}, {63, 43, 75, 94}, {63, 44, 75, 94}, 2844 {63, 45, 75, 94}, {63, 46, 75, 94}, {63, 47, 75, 94}, {63, 48, 75, 94}, {63, 49, 75, 94}, 2845 {63, 50, 75, 94}, {63, 51, 75, 94}, {63, 52, 75, 94}, {63, 53, 75, 94}, {63, 54, 75, 94}, 2846 {63, 55, 75, 94}, {63, 56, 75, 94}, {63, 57, 75, 94}, {63, 58, 75, 94}, {63, 59, 75, 94}, 2847 {64, 40, 75, 94}, {64, 41, 75, 94}, {64, 42, 75, 94}, {64, 43, 75, 94}, {64, 44, 75, 94}, 2848 {64, 45, 75, 94}, {64, 46, 75, 94}, {64, 47, 75, 94}, {64, 48, 75, 94}, {64, 49, 75, 94}, 2849 {64, 50, 75, 94}, {64, 51, 75, 94}, {64, 52, 75, 94}, {64, 53, 75, 94}, {64, 54, 75, 94}, 2850 {64, 55, 75, 94}, {64, 56, 75, 94}, {64, 57, 75, 94}, {64, 58, 75, 94}, {64, 59, 75, 94}, 2851 {65, 40, 75, 94}, {65, 41, 75, 94}, {65, 42, 75, 94}, {65, 43, 75, 94}, {65, 44, 75, 94}, 2852 {65, 45, 75, 94}, {65, 46, 75, 94}, {65, 47, 75, 94}, {65, 48, 75, 94}, {65, 49, 75, 94}, 2853 {65, 50, 75, 94}, {65, 51, 75, 94}, {65, 52, 75, 94}, {65, 53, 75, 94}, {65, 54, 75, 94}, 2854 {65, 55, 75, 94}, {65, 56, 75, 94}, {65, 57, 75, 94}, {65, 58, 75, 94}, {65, 59, 75, 94}, 2855 {66, 40, 75, 94}, {66, 41, 75, 94}, {66, 42, 75, 94}, {66, 43, 75, 94}, {66, 44, 75, 94}, 2856 {66, 45, 75, 94}, {66, 46, 75, 94}, {66, 47, 75, 94}, {66, 48, 75, 94}, {66, 49, 75, 94}, 2857 {66, 50, 75, 94}, {66, 51, 75, 94}, {66, 52, 75, 94}, {66, 53, 75, 94}, {66, 54, 75, 94}, 2858 {66, 55, 75, 94}, {66, 56, 75, 94}, {66, 57, 75, 94}, {66, 58, 75, 94}, {66, 59, 75, 94}, 2859 {67, 40, 75, 94}, {67, 41, 75, 94}, {67, 42, 75, 94}, {67, 43, 75, 94}, {67, 44, 75, 94}, 2860 {67, 45, 75, 94}, {67, 46, 75, 94}, {67, 47, 75, 94}, {67, 48, 75, 94}, {67, 49, 75, 94}, 2861 {67, 50, 75, 94}, {67, 51, 75, 94}, {67, 52, 75, 94}, {67, 53, 75, 94}, {67, 54, 75, 94}, 2862 {67, 55, 75, 94}, {67, 56, 75, 94}, {67, 57, 75, 94}, {67, 58, 75, 94}, {67, 59, 75, 94}, 2863 {68, 40, 75, 94}, {68, 41, 75, 94}, {68, 42, 75, 94}, {68, 43, 75, 94}, {68, 44, 75, 94}, 2864 {68, 45, 75, 94}, {68, 46, 75, 94}, {68, 47, 75, 94}, {68, 48, 75, 94}, {68, 49, 75, 94}, 2865 {68, 50, 75, 94}, {68, 51, 75, 94}, {68, 52, 75, 94}, {68, 53, 75, 94}, {68, 54, 75, 94}, 2866 {68, 55, 75, 94}, {68, 56, 75, 94}, {68, 57, 75, 94}, {68, 58, 75, 94}, {68, 59, 75, 94}, 2867 {69, 40, 75, 94}, {69, 41, 75, 94}, {69, 42, 75, 94}, {69, 43, 75, 94}, {69, 44, 75, 94}, 2868 {69, 45, 75, 94}, {69, 46, 75, 94}, {69, 47, 75, 94}, {69, 48, 75, 94}, {69, 49, 75, 94}, 2869 {69, 50, 75, 94}, {69, 51, 75, 94}, {69, 52, 75, 94}, {69, 53, 75, 94}, {69, 54, 75, 94}, 2870 {69, 55, 75, 94}, {69, 56, 75, 94}, {69, 57, 75, 94}, {69, 58, 75, 94}, {69, 59, 75, 94}, 2871 {70, 40, 75, 94}, {70, 41, 75, 94}, {70, 42, 75, 94}, {70, 43, 75, 94}, {70, 44, 75, 94}, 2872 {70, 45, 75, 94}, {70, 46, 75, 94}, {70, 47, 75, 94}, {70, 48, 75, 94}, {70, 49, 75, 94}, 2873 {70, 50, 75, 94}, {70, 51, 75, 94}, {70, 52, 75, 94}, {70, 53, 75, 94}, {70, 54, 75, 94}, 2874 {70, 55, 75, 94}, {70, 56, 75, 94}, {70, 57, 75, 94}, {70, 58, 75, 94}, {70, 59, 75, 94}, 2875 {71, 40, 75, 94}, {71, 41, 75, 94}, {71, 42, 75, 94}, {71, 43, 75, 94}, {71, 44, 75, 94}, 2876 {71, 45, 75, 94}, {71, 46, 75, 94}, {71, 47, 75, 94}, {71, 48, 75, 94}, {71, 49, 75, 94}, 2877 {71, 50, 75, 94}, {71, 51, 75, 94}, {71, 52, 75, 94}, {71, 53, 75, 94}, {71, 54, 75, 94}, 2878 {71, 55, 75, 94}, {71, 56, 75, 94}, {71, 57, 75, 94}, {71, 58, 75, 94}, {71, 59, 75, 94}, 2879 {72, 40, 75, 94}, {72, 41, 75, 94}, {72, 42, 75, 94}, {72, 43, 75, 94}, {72, 44, 75, 94}, 2880 {72, 45, 75, 94}, {72, 46, 75, 94}, {72, 47, 75, 94}, {72, 48, 75, 94}, {72, 49, 75, 94}, 2881 {72, 50, 75, 94}, {72, 51, 75, 94}, {72, 52, 75, 94}, {72, 53, 75, 94}, {72, 54, 75, 94}, 2882 {72, 55, 75, 94}, {72, 56, 75, 94}, {72, 57, 75, 94}, {72, 58, 75, 94}, {72, 59, 75, 94}, 2883 {73, 40, 75, 94}, {73, 41, 75, 94}, {73, 42, 75, 94}, {73, 43, 75, 94}, {73, 44, 75, 94}, 2884 {73, 45, 75, 94}, {73, 46, 75, 94}, {73, 47, 75, 94}, {73, 48, 75, 94}, {73, 49, 75, 94}, 2885 {73, 50, 75, 94}, {73, 51, 75, 94}, {73, 52, 75, 94}, {73, 53, 75, 94}, {73, 54, 75, 94}, 2886 {73, 55, 75, 94}, {73, 56, 75, 94}, {73, 57, 75, 94}, {73, 58, 75, 94}, {73, 59, 75, 94}, 2887 {74, 40, 75, 94}, {74, 41, 75, 94}, {74, 42, 75, 94}, {74, 43, 75, 94}, {74, 44, 75, 94}, 2888 {74, 45, 75, 94}, {74, 46, 75, 94}, {74, 47, 75, 94}, {74, 48, 75, 94}, {74, 49, 75, 94}, 2889 {74, 50, 75, 94}, {74, 51, 75, 94}, {74, 52, 75, 94}, {74, 53, 75, 94}, {74, 54, 75, 94}, 2890 {74, 55, 75, 94}, {74, 56, 75, 94}, {74, 57, 75, 94}, {74, 58, 75, 94}, {74, 59, 75, 94}, 2891 {75, 40, 75, 94}, {75, 41, 75, 94}, {75, 42, 75, 94}, {75, 43, 75, 94}, {75, 44, 75, 94}, 2892 {75, 45, 75, 94}, {75, 46, 75, 94}, {75, 47, 75, 94}, {75, 48, 75, 94}, {75, 49, 75, 94}, 2893 {75, 50, 75, 94}, {75, 51, 75, 94}, {75, 52, 75, 94}, {75, 53, 75, 94}, {75, 54, 75, 94}, 2894 {75, 55, 75, 94}, {75, 56, 75, 94}, {75, 57, 75, 94}, {75, 58, 75, 94}, {75, 59, 75, 94}, 2895 {76, 40, 75, 94}, {76, 41, 75, 94}, {76, 42, 75, 94}, {76, 43, 75, 94}, {76, 44, 75, 94}, 2896 {76, 45, 75, 94}, {76, 46, 75, 94}, {76, 47, 75, 94}, {76, 48, 75, 94}, {76, 49, 75, 94}, 2897 {76, 50, 75, 94}, {76, 51, 75, 94}, {76, 52, 75, 94}, {76, 53, 75, 94}, {76, 54, 75, 94}, 2898 {76, 55, 75, 94}, {76, 56, 75, 94}, {76, 57, 75, 94}, {76, 58, 75, 94}, {76, 59, 75, 94}, 2899 {77, 40, 75, 94}, {77, 41, 75, 94}, {77, 42, 75, 94}, {77, 43, 75, 94}, {77, 44, 75, 94}, 2900 {77, 45, 75, 94}, {77, 46, 75, 94}, {77, 47, 75, 94}, {77, 48, 75, 94}, {77, 49, 75, 94}, 2901 {77, 50, 75, 94}, {77, 51, 75, 94}, {77, 52, 75, 94}, {77, 53, 75, 94}, {77, 54, 75, 94}, 2902 {77, 55, 75, 94}, {77, 56, 75, 94}, {77, 57, 75, 94}, {77, 58, 75, 94}, {77, 59, 75, 94}, 2903 {78, 40, 75, 94}, {78, 41, 75, 94}, {78, 42, 75, 94}, {78, 43, 75, 94}, {78, 44, 75, 94}, 2904 {78, 45, 75, 94}, {78, 46, 75, 94}, {78, 47, 75, 94}, {78, 48, 75, 94}, {78, 49, 75, 94}, 2905 {78, 50, 75, 94}, {78, 51, 75, 94}, {78, 52, 75, 94}, {78, 53, 75, 94}, {78, 54, 75, 94}, 2906 {78, 55, 75, 94}, {78, 56, 75, 94}, {78, 57, 75, 94}, {78, 58, 75, 94}, {78, 59, 75, 94}, 2907 {79, 40, 75, 94}, {79, 41, 75, 94}, {79, 42, 75, 94}, {79, 43, 75, 94}, {79, 44, 75, 94}, 2908 {79, 45, 75, 94}, {79, 46, 75, 94}, {79, 47, 75, 94}, {79, 48, 75, 94}, {79, 49, 75, 94}, 2909 {79, 50, 75, 94}, {79, 51, 75, 94}, {79, 52, 75, 94}, {79, 53, 75, 94}, {79, 54, 75, 94}, 2910 {79, 55, 75, 94}, {79, 56, 75, 94}, {79, 57, 75, 94}, {79, 58, 75, 94}, {79, 59, 75, 94}, 2911 {80, 40, 75, 94}, {80, 41, 75, 94}, {80, 42, 75, 94}, {80, 43, 75, 94}, {80, 44, 75, 94}, 2912 {80, 45, 75, 94}, {80, 46, 75, 94}, {80, 47, 75, 94}, {80, 48, 75, 94}, {80, 49, 75, 94}, 2913 {80, 50, 75, 94}, {80, 51, 75, 94}, {80, 52, 75, 94}, {80, 53, 75, 94}, {80, 54, 75, 94}, 2914 {80, 55, 75, 94}, {80, 56, 75, 94}, {80, 57, 75, 94}, {80, 58, 75, 94}, {80, 59, 75, 94}, 2915 {81, 40, 75, 94}, {81, 41, 75, 94}, {81, 42, 75, 94}, {81, 43, 75, 94}, {81, 44, 75, 94}, 2916 {81, 45, 75, 94}, {81, 46, 75, 94}, {81, 47, 75, 94}, {81, 48, 75, 94}, {81, 49, 75, 94}, 2917 {81, 50, 75, 94}, {81, 51, 75, 94}, {81, 52, 75, 94}, {81, 53, 75, 94}, {81, 54, 75, 94}, 2918 {81, 55, 75, 94}, {81, 56, 75, 94}, {81, 57, 75, 94}, {81, 58, 75, 94}, {81, 59, 75, 94}, 2919 {82, 40, 75, 94}, {82, 41, 75, 94}, {82, 42, 75, 94}, {82, 43, 75, 94}, {82, 44, 75, 94}, 2920 {82, 45, 75, 94}, {82, 46, 75, 94}, {82, 47, 75, 94}, {82, 48, 75, 94}, {82, 49, 75, 94}, 2921 {82, 50, 75, 94}, {82, 51, 75, 94}, {82, 52, 75, 94}, {82, 53, 75, 94}, {82, 54, 75, 94}, 2922 {82, 55, 75, 94}, {82, 56, 75, 94}, {82, 57, 75, 94}, {82, 58, 75, 94}, {82, 59, 75, 94}, 2923 {83, 40, 75, 94}, {83, 41, 75, 94}, {83, 42, 75, 94}, {83, 43, 75, 94}, {83, 44, 75, 94}, 2924 {83, 45, 75, 94}, {83, 46, 75, 94}, {83, 47, 75, 94}, {83, 48, 75, 94}, {83, 49, 75, 94}, 2925 {83, 50, 75, 94}, {83, 51, 75, 94}, {83, 52, 75, 94}, {83, 53, 75, 94}, {83, 54, 75, 94}, 2926 {83, 55, 75, 94}, {83, 56, 75, 94}, {83, 57, 75, 94}, {83, 58, 75, 94}, {83, 59, 75, 94}, 2927 {84, 40, 75, 94}, {84, 41, 75, 94}, {84, 42, 75, 94}, {84, 43, 75, 94}, {84, 44, 75, 94}, 2928 {84, 45, 75, 94}, {84, 46, 75, 94}, {84, 47, 75, 94}, {84, 48, 75, 94}, {84, 49, 75, 94}, 2929 {84, 50, 75, 94}, {84, 51, 75, 94}, {84, 52, 75, 94}, {84, 53, 75, 94}, {84, 54, 75, 94}, 2930 {84, 55, 75, 94}, {84, 56, 75, 94}, {84, 57, 75, 94}, {84, 58, 75, 94}, {84, 59, 75, 94}, 2931 {85, 40, 75, 94}, {85, 41, 75, 94}, {85, 42, 75, 94}, {85, 43, 75, 94}, {85, 44, 75, 94}, 2932 {85, 45, 75, 94}, {85, 46, 75, 94}, {85, 47, 75, 94}, {85, 48, 75, 94}, {85, 49, 75, 94}, 2933 {85, 50, 75, 94}, {85, 51, 75, 94}, {85, 52, 75, 94}, {85, 53, 75, 94}, {85, 54, 75, 94}, 2934 {85, 55, 75, 94}, {85, 56, 75, 94}, {85, 57, 75, 94}, {85, 58, 75, 94}, {85, 59, 75, 94}, 2935 {86, 40, 75, 94}, {86, 41, 75, 94}, {86, 42, 75, 94}, {86, 43, 75, 94}, {86, 44, 75, 94}, 2936 {86, 45, 75, 94}, {86, 46, 75, 94}, {86, 47, 75, 94}, {86, 48, 75, 94}, {86, 49, 75, 94}, 2937 {86, 50, 75, 94}, {86, 51, 75, 94}, {86, 52, 75, 94}, {86, 53, 75, 94}, {86, 54, 75, 94}, 2938 {86, 55, 75, 94}, {86, 56, 75, 94}, {86, 57, 75, 94}, {86, 58, 75, 94}, {86, 59, 75, 94}, 2939 {87, 40, 75, 94}, {87, 41, 75, 94}, {87, 42, 75, 94}, {87, 43, 75, 94}, {87, 44, 75, 94}, 2940 {87, 45, 75, 94}, {87, 46, 75, 94}, {87, 47, 75, 94}, {87, 48, 75, 94}, {87, 49, 75, 94}, 2941 {87, 50, 75, 94}, {87, 51, 75, 94}, {87, 52, 75, 94}, {87, 53, 75, 94}, {87, 54, 75, 94}, 2942 {87, 55, 75, 94}, {87, 56, 75, 94}, {87, 57, 75, 94}, {87, 58, 75, 94}, {87, 59, 75, 94}, 2943 {88, 40, 75, 94}, {88, 41, 75, 94}, {88, 42, 75, 94}, {88, 43, 75, 94}, {88, 44, 75, 94}, 2944 {88, 45, 75, 94}, {88, 46, 75, 94}, {88, 47, 75, 94}, {88, 48, 75, 94}, {88, 49, 75, 94}, 2945 {88, 50, 75, 94}, {88, 51, 75, 94}, {88, 52, 75, 94}, {88, 53, 75, 94}, {88, 54, 75, 94}, 2946 {88, 55, 75, 94}, {88, 56, 75, 94}, {88, 57, 75, 94}, {88, 58, 75, 94}, {88, 59, 75, 94}, 2947 {89, 40, 75, 94}, {89, 41, 75, 94}, {89, 42, 75, 94}, {89, 43, 75, 94}, {89, 44, 75, 94}, 2948 {89, 45, 75, 94}, {89, 46, 75, 94}, {89, 47, 75, 94}, {89, 48, 75, 94}, {89, 49, 75, 94}, 2949 {89, 50, 75, 94}, {89, 51, 75, 94}, {89, 52, 75, 94}, {89, 53, 75, 94}, {89, 54, 75, 94}, 2950 {89, 55, 75, 94}, {89, 56, 75, 94}, {89, 57, 75, 94}, {89, 58, 75, 94}, {89, 59, 75, 94}, 2951 }, 2952 } 2953 bodyleft = testBody{ 2954 label: 4, 2955 offset: dvid.Point3d{75, 40, 60}, 2956 size: dvid.Point3d{20, 20, 21}, 2957 blockSpans: []dvid.Span{ 2958 {1, 1, 2, 2}, 2959 {2, 1, 2, 2}, 2960 }, 2961 voxelSpans: []dvid.Span{ 2962 {60, 40, 75, 94}, {60, 41, 75, 94}, {60, 42, 75, 94}, {60, 43, 75, 94}, {60, 44, 75, 94}, 2963 {60, 45, 75, 94}, {60, 46, 75, 94}, {60, 47, 75, 94}, {60, 48, 75, 94}, {60, 49, 75, 94}, 2964 {60, 50, 75, 94}, {60, 51, 75, 94}, {60, 52, 75, 94}, {60, 53, 75, 94}, {60, 54, 75, 94}, 2965 {60, 55, 75, 94}, {60, 56, 75, 94}, {60, 57, 75, 94}, {60, 58, 75, 94}, {60, 59, 75, 94}, 2966 {61, 40, 75, 94}, {61, 41, 75, 94}, {61, 42, 75, 94}, {61, 43, 75, 94}, {61, 44, 75, 94}, 2967 {61, 45, 75, 94}, {61, 46, 75, 94}, {61, 47, 75, 94}, {61, 48, 75, 94}, {61, 49, 75, 94}, 2968 {61, 50, 75, 94}, {61, 51, 75, 94}, {61, 52, 75, 94}, {61, 53, 75, 94}, {61, 54, 75, 94}, 2969 {61, 55, 75, 94}, {61, 56, 75, 94}, {61, 57, 75, 94}, {61, 58, 75, 94}, {61, 59, 75, 94}, 2970 {62, 40, 75, 94}, {62, 41, 75, 94}, {62, 42, 75, 94}, {62, 43, 75, 94}, {62, 44, 75, 94}, 2971 {62, 45, 75, 94}, {62, 46, 75, 94}, {62, 47, 75, 94}, {62, 48, 75, 94}, {62, 49, 75, 94}, 2972 {62, 50, 75, 94}, {62, 51, 75, 94}, {62, 52, 75, 94}, {62, 53, 75, 94}, {62, 54, 75, 94}, 2973 {62, 55, 75, 94}, {62, 56, 75, 94}, {62, 57, 75, 94}, {62, 58, 75, 94}, {62, 59, 75, 94}, 2974 {63, 40, 75, 94}, {63, 41, 75, 94}, {63, 42, 75, 94}, {63, 43, 75, 94}, {63, 44, 75, 94}, 2975 {63, 45, 75, 94}, {63, 46, 75, 94}, {63, 47, 75, 94}, {63, 48, 75, 94}, {63, 49, 75, 94}, 2976 {63, 50, 75, 94}, {63, 51, 75, 94}, {63, 52, 75, 94}, {63, 53, 75, 94}, {63, 54, 75, 94}, 2977 {63, 55, 75, 94}, {63, 56, 75, 94}, {63, 57, 75, 94}, {63, 58, 75, 94}, {63, 59, 75, 94}, 2978 {64, 40, 75, 94}, {64, 41, 75, 94}, {64, 42, 75, 94}, {64, 43, 75, 94}, {64, 44, 75, 94}, 2979 {64, 45, 75, 94}, {64, 46, 75, 94}, {64, 47, 75, 94}, {64, 48, 75, 94}, {64, 49, 75, 94}, 2980 {64, 50, 75, 94}, {64, 51, 75, 94}, {64, 52, 75, 94}, {64, 53, 75, 94}, {64, 54, 75, 94}, 2981 {64, 55, 75, 94}, {64, 56, 75, 94}, {64, 57, 75, 94}, {64, 58, 75, 94}, {64, 59, 75, 94}, 2982 {65, 40, 75, 94}, {65, 41, 75, 94}, {65, 42, 75, 94}, {65, 43, 75, 94}, {65, 44, 75, 94}, 2983 {65, 45, 75, 94}, {65, 46, 75, 94}, {65, 47, 75, 94}, {65, 48, 75, 94}, {65, 49, 75, 94}, 2984 {65, 50, 75, 94}, {65, 51, 75, 94}, {65, 52, 75, 94}, {65, 53, 75, 94}, {65, 54, 75, 94}, 2985 {65, 55, 75, 94}, {65, 56, 75, 94}, {65, 57, 75, 94}, {65, 58, 75, 94}, {65, 59, 75, 94}, 2986 {66, 40, 75, 94}, {66, 41, 75, 94}, {66, 42, 75, 94}, {66, 43, 75, 94}, {66, 44, 75, 94}, 2987 {66, 45, 75, 94}, {66, 46, 75, 94}, {66, 47, 75, 94}, {66, 48, 75, 94}, {66, 49, 75, 94}, 2988 {66, 50, 75, 94}, {66, 51, 75, 94}, {66, 52, 75, 94}, {66, 53, 75, 94}, {66, 54, 75, 94}, 2989 {66, 55, 75, 94}, {66, 56, 75, 94}, {66, 57, 75, 94}, {66, 58, 75, 94}, {66, 59, 75, 94}, 2990 {67, 40, 75, 94}, {67, 41, 75, 94}, {67, 42, 75, 94}, {67, 43, 75, 94}, {67, 44, 75, 94}, 2991 {67, 45, 75, 94}, {67, 46, 75, 94}, {67, 47, 75, 94}, {67, 48, 75, 94}, {67, 49, 75, 94}, 2992 {67, 50, 75, 94}, {67, 51, 75, 94}, {67, 52, 75, 94}, {67, 53, 75, 94}, {67, 54, 75, 94}, 2993 {67, 55, 75, 94}, {67, 56, 75, 94}, {67, 57, 75, 94}, {67, 58, 75, 94}, {67, 59, 75, 94}, 2994 {68, 40, 75, 94}, {68, 41, 75, 94}, {68, 42, 75, 94}, {68, 43, 75, 94}, {68, 44, 75, 94}, 2995 {68, 45, 75, 94}, {68, 46, 75, 94}, {68, 47, 75, 94}, {68, 48, 75, 94}, {68, 49, 75, 94}, 2996 {68, 50, 75, 94}, {68, 51, 75, 94}, {68, 52, 75, 94}, {68, 53, 75, 94}, {68, 54, 75, 94}, 2997 {68, 55, 75, 94}, {68, 56, 75, 94}, {68, 57, 75, 94}, {68, 58, 75, 94}, {68, 59, 75, 94}, 2998 {69, 40, 75, 94}, {69, 41, 75, 94}, {69, 42, 75, 94}, {69, 43, 75, 94}, {69, 44, 75, 94}, 2999 {69, 45, 75, 94}, {69, 46, 75, 94}, {69, 47, 75, 94}, {69, 48, 75, 94}, {69, 49, 75, 94}, 3000 {69, 50, 75, 94}, {69, 51, 75, 94}, {69, 52, 75, 94}, {69, 53, 75, 94}, {69, 54, 75, 94}, 3001 {69, 55, 75, 94}, {69, 56, 75, 94}, {69, 57, 75, 94}, {69, 58, 75, 94}, {69, 59, 75, 94}, 3002 {70, 40, 75, 94}, {70, 41, 75, 94}, {70, 42, 75, 94}, {70, 43, 75, 94}, {70, 44, 75, 94}, 3003 {70, 45, 75, 94}, {70, 46, 75, 94}, {70, 47, 75, 94}, {70, 48, 75, 94}, {70, 49, 75, 94}, 3004 {70, 50, 75, 94}, {70, 51, 75, 94}, {70, 52, 75, 94}, {70, 53, 75, 94}, {70, 54, 75, 94}, 3005 {70, 55, 75, 94}, {70, 56, 75, 94}, {70, 57, 75, 94}, {70, 58, 75, 94}, {70, 59, 75, 94}, 3006 {71, 40, 75, 94}, {71, 41, 75, 94}, {71, 42, 75, 94}, {71, 43, 75, 94}, {71, 44, 75, 94}, 3007 {71, 45, 75, 94}, {71, 46, 75, 94}, {71, 47, 75, 94}, {71, 48, 75, 94}, {71, 49, 75, 94}, 3008 {71, 50, 75, 94}, {71, 51, 75, 94}, {71, 52, 75, 94}, {71, 53, 75, 94}, {71, 54, 75, 94}, 3009 {71, 55, 75, 94}, {71, 56, 75, 94}, {71, 57, 75, 94}, {71, 58, 75, 94}, {71, 59, 75, 94}, 3010 {72, 40, 75, 94}, {72, 41, 75, 94}, {72, 42, 75, 94}, {72, 43, 75, 94}, {72, 44, 75, 94}, 3011 {72, 45, 75, 94}, {72, 46, 75, 94}, {72, 47, 75, 94}, {72, 48, 75, 94}, {72, 49, 75, 94}, 3012 {72, 50, 75, 94}, {72, 51, 75, 94}, {72, 52, 75, 94}, {72, 53, 75, 94}, {72, 54, 75, 94}, 3013 {72, 55, 75, 94}, {72, 56, 75, 94}, {72, 57, 75, 94}, {72, 58, 75, 94}, {72, 59, 75, 94}, 3014 {73, 40, 75, 94}, {73, 41, 75, 94}, {73, 42, 75, 94}, {73, 43, 75, 94}, {73, 44, 75, 94}, 3015 {73, 45, 75, 94}, {73, 46, 75, 94}, {73, 47, 75, 94}, {73, 48, 75, 94}, {73, 49, 75, 94}, 3016 {73, 50, 75, 94}, {73, 51, 75, 94}, {73, 52, 75, 94}, {73, 53, 75, 94}, {73, 54, 75, 94}, 3017 {73, 55, 75, 94}, {73, 56, 75, 94}, {73, 57, 75, 94}, {73, 58, 75, 94}, {73, 59, 75, 94}, 3018 {74, 40, 75, 94}, {74, 41, 75, 94}, {74, 42, 75, 94}, {74, 43, 75, 94}, {74, 44, 75, 94}, 3019 {74, 45, 75, 94}, {74, 46, 75, 94}, {74, 47, 75, 94}, {74, 48, 75, 94}, {74, 49, 75, 94}, 3020 {74, 50, 75, 94}, {74, 51, 75, 94}, {74, 52, 75, 94}, {74, 53, 75, 94}, {74, 54, 75, 94}, 3021 {74, 55, 75, 94}, {74, 56, 75, 94}, {74, 57, 75, 94}, {74, 58, 75, 94}, {74, 59, 75, 94}, 3022 {75, 40, 75, 94}, {75, 41, 75, 94}, {75, 42, 75, 94}, {75, 43, 75, 94}, {75, 44, 75, 94}, 3023 {75, 45, 75, 94}, {75, 46, 75, 94}, {75, 47, 75, 94}, {75, 48, 75, 94}, {75, 49, 75, 94}, 3024 {75, 50, 75, 94}, {75, 51, 75, 94}, {75, 52, 75, 94}, {75, 53, 75, 94}, {75, 54, 75, 94}, 3025 {75, 55, 75, 94}, {75, 56, 75, 94}, {75, 57, 75, 94}, {75, 58, 75, 94}, {75, 59, 75, 94}, 3026 {76, 40, 75, 94}, {76, 41, 75, 94}, {76, 42, 75, 94}, {76, 43, 75, 94}, {76, 44, 75, 94}, 3027 {76, 45, 75, 94}, {76, 46, 75, 94}, {76, 47, 75, 94}, {76, 48, 75, 94}, {76, 49, 75, 94}, 3028 {76, 50, 75, 94}, {76, 51, 75, 94}, {76, 52, 75, 94}, {76, 53, 75, 94}, {76, 54, 75, 94}, 3029 {76, 55, 75, 94}, {76, 56, 75, 94}, {76, 57, 75, 94}, {76, 58, 75, 94}, {76, 59, 75, 94}, 3030 {77, 40, 75, 94}, {77, 41, 75, 94}, {77, 42, 75, 94}, {77, 43, 75, 94}, {77, 44, 75, 94}, 3031 {77, 45, 75, 94}, {77, 46, 75, 94}, {77, 47, 75, 94}, {77, 48, 75, 94}, {77, 49, 75, 94}, 3032 {77, 50, 75, 94}, {77, 51, 75, 94}, {77, 52, 75, 94}, {77, 53, 75, 94}, {77, 54, 75, 94}, 3033 {77, 55, 75, 94}, {77, 56, 75, 94}, {77, 57, 75, 94}, {77, 58, 75, 94}, {77, 59, 75, 94}, 3034 {78, 40, 75, 94}, {78, 41, 75, 94}, {78, 42, 75, 94}, {78, 43, 75, 94}, {78, 44, 75, 94}, 3035 {78, 45, 75, 94}, {78, 46, 75, 94}, {78, 47, 75, 94}, {78, 48, 75, 94}, {78, 49, 75, 94}, 3036 {78, 50, 75, 94}, {78, 51, 75, 94}, {78, 52, 75, 94}, {78, 53, 75, 94}, {78, 54, 75, 94}, 3037 {78, 55, 75, 94}, {78, 56, 75, 94}, {78, 57, 75, 94}, {78, 58, 75, 94}, {78, 59, 75, 94}, 3038 {79, 40, 75, 94}, {79, 41, 75, 94}, {79, 42, 75, 94}, {79, 43, 75, 94}, {79, 44, 75, 94}, 3039 {79, 45, 75, 94}, {79, 46, 75, 94}, {79, 47, 75, 94}, {79, 48, 75, 94}, {79, 49, 75, 94}, 3040 {79, 50, 75, 94}, {79, 51, 75, 94}, {79, 52, 75, 94}, {79, 53, 75, 94}, {79, 54, 75, 94}, 3041 {79, 55, 75, 94}, {79, 56, 75, 94}, {79, 57, 75, 94}, {79, 58, 75, 94}, {79, 59, 75, 94}, 3042 {80, 40, 75, 80}, {80, 40, 87, 89}, {80, 40, 93, 94}, 3043 }, 3044 } 3045 bodysplit = testBody{ 3046 label: 5, 3047 offset: dvid.Point3d{75, 40, 80}, 3048 size: dvid.Point3d{20, 20, 10}, 3049 blockSpans: []dvid.Span{ 3050 {2, 1, 2, 2}, 3051 }, 3052 voxelSpans: []dvid.Span{ 3053 {80, 40, 81, 86}, {80, 40, 90, 92}, // These first 2 test splits interleaved in one span. 3054 {80, 41, 75, 94}, {80, 42, 75, 94}, {80, 43, 75, 94}, {80, 44, 75, 94}, 3055 {80, 45, 75, 94}, {80, 46, 75, 94}, {80, 47, 75, 94}, {80, 48, 75, 94}, {80, 49, 75, 94}, 3056 {80, 50, 75, 94}, {80, 51, 75, 94}, {80, 52, 75, 94}, {80, 53, 75, 94}, {80, 54, 75, 94}, 3057 {80, 55, 75, 94}, {80, 56, 75, 94}, {80, 57, 75, 94}, {80, 58, 75, 94}, {80, 59, 75, 94}, 3058 {81, 40, 75, 94}, {81, 41, 75, 94}, {81, 42, 75, 94}, {81, 43, 75, 94}, {81, 44, 75, 94}, 3059 {81, 45, 75, 94}, {81, 46, 75, 94}, {81, 47, 75, 94}, {81, 48, 75, 94}, {81, 49, 75, 94}, 3060 {81, 50, 75, 94}, {81, 51, 75, 94}, {81, 52, 75, 94}, {81, 53, 75, 94}, {81, 54, 75, 94}, 3061 {81, 55, 75, 94}, {81, 56, 75, 94}, {81, 57, 75, 94}, {81, 58, 75, 94}, {81, 59, 75, 94}, 3062 {82, 40, 75, 94}, {82, 41, 75, 94}, {82, 42, 75, 94}, {82, 43, 75, 94}, {82, 44, 75, 94}, 3063 {82, 45, 75, 94}, {82, 46, 75, 94}, {82, 47, 75, 94}, {82, 48, 75, 94}, {82, 49, 75, 94}, 3064 {82, 50, 75, 94}, {82, 51, 75, 94}, {82, 52, 75, 94}, {82, 53, 75, 94}, {82, 54, 75, 94}, 3065 {82, 55, 75, 94}, {82, 56, 75, 94}, {82, 57, 75, 94}, {82, 58, 75, 94}, {82, 59, 75, 94}, 3066 {83, 40, 75, 94}, {83, 41, 75, 94}, {83, 42, 75, 94}, {83, 43, 75, 94}, {83, 44, 75, 94}, 3067 {83, 45, 75, 94}, {83, 46, 75, 94}, {83, 47, 75, 94}, {83, 48, 75, 94}, {83, 49, 75, 94}, 3068 {83, 50, 75, 94}, {83, 51, 75, 94}, {83, 52, 75, 94}, {83, 53, 75, 94}, {83, 54, 75, 94}, 3069 {83, 55, 75, 94}, {83, 56, 75, 94}, {83, 57, 75, 94}, {83, 58, 75, 94}, {83, 59, 75, 94}, 3070 {84, 40, 75, 94}, {84, 41, 75, 94}, {84, 42, 75, 94}, {84, 43, 75, 94}, {84, 44, 75, 94}, 3071 {84, 45, 75, 94}, {84, 46, 75, 94}, {84, 47, 75, 94}, {84, 48, 75, 94}, {84, 49, 75, 94}, 3072 {84, 50, 75, 94}, {84, 51, 75, 94}, {84, 52, 75, 94}, {84, 53, 75, 94}, {84, 54, 75, 94}, 3073 {84, 55, 75, 94}, {84, 56, 75, 94}, {84, 57, 75, 94}, {84, 58, 75, 94}, {84, 59, 75, 94}, 3074 {85, 40, 75, 94}, {85, 41, 75, 94}, {85, 42, 75, 94}, {85, 43, 75, 94}, {85, 44, 75, 94}, 3075 {85, 45, 75, 94}, {85, 46, 75, 94}, {85, 47, 75, 94}, {85, 48, 75, 94}, {85, 49, 75, 94}, 3076 {85, 50, 75, 94}, {85, 51, 75, 94}, {85, 52, 75, 94}, {85, 53, 75, 94}, {85, 54, 75, 94}, 3077 {85, 55, 75, 94}, {85, 56, 75, 94}, {85, 57, 75, 94}, {85, 58, 75, 94}, {85, 59, 75, 94}, 3078 {86, 40, 75, 94}, {86, 41, 75, 94}, {86, 42, 75, 94}, {86, 43, 75, 94}, {86, 44, 75, 94}, 3079 {86, 45, 75, 94}, {86, 46, 75, 94}, {86, 47, 75, 94}, {86, 48, 75, 94}, {86, 49, 75, 94}, 3080 {86, 50, 75, 94}, {86, 51, 75, 94}, {86, 52, 75, 94}, {86, 53, 75, 94}, {86, 54, 75, 94}, 3081 {86, 55, 75, 94}, {86, 56, 75, 94}, {86, 57, 75, 94}, {86, 58, 75, 94}, {86, 59, 75, 94}, 3082 {87, 40, 75, 94}, {87, 41, 75, 94}, {87, 42, 75, 94}, {87, 43, 75, 94}, {87, 44, 75, 94}, 3083 {87, 45, 75, 94}, {87, 46, 75, 94}, {87, 47, 75, 94}, {87, 48, 75, 94}, {87, 49, 75, 94}, 3084 {87, 50, 75, 94}, {87, 51, 75, 94}, {87, 52, 75, 94}, {87, 53, 75, 94}, {87, 54, 75, 94}, 3085 {87, 55, 75, 94}, {87, 56, 75, 94}, {87, 57, 75, 94}, {87, 58, 75, 94}, {87, 59, 75, 94}, 3086 {88, 40, 75, 94}, {88, 41, 75, 94}, {88, 42, 75, 94}, {88, 43, 75, 94}, {88, 44, 75, 94}, 3087 {88, 45, 75, 94}, {88, 46, 75, 94}, {88, 47, 75, 94}, {88, 48, 75, 94}, {88, 49, 75, 94}, 3088 {88, 50, 75, 94}, {88, 51, 75, 94}, {88, 52, 75, 94}, {88, 53, 75, 94}, {88, 54, 75, 94}, 3089 {88, 55, 75, 94}, {88, 56, 75, 94}, {88, 57, 75, 94}, {88, 58, 75, 94}, {88, 59, 75, 94}, 3090 {89, 40, 75, 94}, {89, 41, 75, 94}, {89, 42, 75, 94}, {89, 43, 75, 94}, {89, 44, 75, 94}, 3091 {89, 45, 75, 94}, {89, 46, 75, 94}, {89, 47, 75, 94}, {89, 48, 75, 94}, {89, 49, 75, 94}, 3092 {89, 50, 75, 94}, {89, 51, 75, 94}, {89, 52, 75, 94}, {89, 53, 75, 94}, {89, 54, 75, 94}, 3093 {89, 55, 75, 94}, {89, 56, 75, 94}, {89, 57, 75, 94}, {89, 58, 75, 94}, {89, 59, 75, 94}, 3094 }, 3095 } 3096 body6 = testBody{ 3097 label: 6, 3098 offset: dvid.Point3d{8, 10, 7}, 3099 size: dvid.Point3d{52, 50, 10}, 3100 blockSpans: []dvid.Span{ 3101 {0, 0, 0, 1}, 3102 {0, 1, 0, 1}, 3103 }, 3104 voxelSpans: []dvid.Span{ 3105 {8, 11, 9, 31}, {8, 12, 9, 59}, {8, 13, 9, 59}, {8, 14, 9, 59}, 3106 {8, 15, 19, 59}, {8, 16, 19, 59}, {8, 17, 19, 59}, {8, 18, 19, 59}, 3107 {8, 19, 29, 59}, {8, 20, 29, 59}, {8, 21, 29, 59}, {8, 22, 29, 59}, 3108 {8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59}, 3109 {8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59}, 3110 {8, 27, 39, 59}, {8, 28, 39, 59}, {8, 29, 39, 59}, {8, 30, 39, 59}, 3111 {8, 31, 39, 59}, {8, 32, 39, 59}, {8, 33, 39, 59}, {8, 34, 39, 59}, 3112 {8, 35, 39, 59}, {8, 36, 39, 59}, {8, 37, 45, 59}, {8, 38, 39, 59}, 3113 {8, 39, 39, 59}, {8, 40, 39, 59}, {8, 41, 42, 59}, {8, 42, 39, 56}, 3114 {8, 43, 39, 59}, {8, 44, 39, 59}, {8, 45, 39, 59}, {8, 46, 39, 50}, 3115 3116 {8, 11, 9, 59}, {8, 12, 9, 59}, {8, 13, 9, 59}, {8, 14, 9, 59}, 3117 {8, 15, 19, 59}, {8, 16, 19, 59}, {8, 17, 19, 59}, {8, 18, 19, 59}, 3118 {8, 19, 29, 59}, {8, 20, 29, 59}, {8, 21, 29, 59}, {8, 22, 29, 59}, 3119 {8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59}, 3120 {8, 23, 39, 59}, {8, 24, 39, 59}, {8, 25, 39, 59}, {8, 26, 39, 59}, 3121 {8, 27, 39, 59}, {8, 28, 39, 59}, {8, 29, 39, 59}, {8, 30, 39, 59}, 3122 {8, 31, 39, 59}, {8, 32, 39, 59}, {8, 33, 39, 59}, {8, 34, 39, 59}, 3123 {8, 35, 39, 59}, {8, 36, 39, 59}, {8, 37, 45, 59}, {8, 38, 39, 59}, 3124 {8, 39, 39, 59}, {8, 40, 39, 59}, {8, 41, 42, 59}, {8, 42, 39, 56}, 3125 {8, 43, 39, 59}, {8, 44, 39, 59}, {8, 45, 39, 59}, {8, 46, 39, 50}, 3126 3127 {9, 11, 9, 59}, {9, 12, 9, 59}, {9, 13, 9, 59}, {9, 14, 9, 59}, 3128 {9, 15, 19, 59}, {9, 16, 19, 59}, {9, 17, 19, 59}, {9, 18, 19, 59}, 3129 {9, 19, 29, 59}, {9, 20, 29, 59}, {9, 21, 29, 59}, {9, 22, 29, 59}, 3130 {9, 23, 39, 59}, {9, 24, 39, 59}, {9, 25, 39, 59}, {9, 26, 39, 59}, 3131 {9, 23, 39, 59}, {9, 24, 39, 59}, {9, 25, 39, 59}, {9, 26, 39, 59}, 3132 {9, 27, 39, 59}, {9, 28, 39, 59}, {9, 29, 39, 59}, {9, 30, 39, 59}, 3133 {9, 31, 39, 59}, {9, 32, 39, 59}, {9, 33, 39, 59}, {9, 34, 39, 59}, 3134 {9, 35, 39, 59}, {9, 36, 39, 59}, {9, 37, 45, 59}, {9, 38, 39, 59}, 3135 {9, 39, 39, 59}, {9, 40, 39, 59}, {9, 41, 42, 59}, {9, 42, 39, 56}, 3136 {9, 43, 39, 59}, {9, 44, 39, 59}, {9, 45, 39, 59}, {9, 46, 39, 50}, 3137 3138 {10, 11, 9, 59}, {10, 12, 9, 59}, {10, 13, 9, 59}, {10, 14, 9, 59}, 3139 {10, 15, 19, 59}, {10, 16, 19, 59}, {10, 17, 19, 59}, {10, 18, 19, 59}, 3140 {10, 19, 29, 59}, {10, 20, 29, 59}, {10, 21, 29, 59}, {10, 22, 29, 59}, 3141 {10, 23, 39, 59}, {10, 24, 39, 59}, {10, 25, 39, 59}, {10, 26, 39, 59}, 3142 {10, 23, 39, 59}, {10, 24, 39, 59}, {10, 25, 39, 59}, {10, 26, 39, 59}, 3143 {10, 27, 39, 59}, {10, 28, 39, 59}, {10, 29, 39, 59}, {10, 30, 39, 59}, 3144 {10, 31, 39, 59}, {10, 32, 39, 59}, {10, 33, 39, 59}, {10, 34, 39, 59}, 3145 {10, 35, 39, 59}, {10, 36, 39, 59}, {10, 37, 45, 59}, {10, 38, 39, 59}, 3146 {10, 39, 39, 59}, {10, 40, 39, 59}, {10, 41, 42, 59}, {10, 42, 39, 56}, 3147 {10, 43, 39, 59}, {10, 44, 39, 59}, {10, 45, 39, 59}, {10, 46, 39, 50}, 3148 3149 {11, 11, 9, 59}, {11, 12, 9, 59}, {11, 13, 9, 59}, {11, 14, 9, 59}, 3150 {11, 15, 19, 59}, {11, 16, 19, 59}, {11, 17, 19, 59}, {11, 18, 19, 59}, 3151 {11, 19, 29, 59}, {11, 20, 29, 59}, {11, 21, 29, 59}, {11, 22, 29, 59}, 3152 {11, 23, 39, 59}, {11, 24, 39, 59}, {11, 25, 39, 59}, {11, 26, 39, 59}, 3153 {11, 23, 39, 59}, {11, 24, 39, 59}, {11, 25, 39, 59}, {11, 26, 39, 59}, 3154 {11, 27, 39, 59}, {11, 28, 39, 59}, {11, 29, 39, 59}, {11, 30, 39, 59}, 3155 {11, 31, 39, 59}, {11, 32, 39, 59}, {11, 33, 39, 59}, {11, 34, 39, 59}, 3156 {11, 35, 39, 59}, {11, 36, 39, 59}, {11, 37, 45, 59}, {11, 38, 39, 59}, 3157 {11, 39, 39, 59}, {11, 40, 39, 59}, {11, 41, 42, 59}, {11, 42, 39, 56}, 3158 {11, 43, 39, 59}, {11, 44, 39, 59}, {11, 45, 39, 59}, {11, 46, 39, 50}, 3159 3160 {12, 11, 9, 59}, {12, 12, 9, 59}, {12, 13, 9, 59}, {12, 14, 9, 59}, 3161 {12, 15, 19, 59}, {12, 16, 19, 59}, {12, 17, 19, 59}, {12, 18, 19, 59}, 3162 {12, 19, 29, 59}, {12, 20, 29, 59}, {12, 21, 29, 59}, {12, 22, 29, 59}, 3163 {12, 23, 39, 59}, {12, 24, 39, 59}, {12, 25, 39, 59}, {12, 26, 39, 59}, 3164 {12, 23, 39, 59}, {12, 24, 39, 59}, {12, 25, 39, 59}, {12, 26, 39, 59}, 3165 {12, 27, 39, 59}, {12, 28, 39, 59}, {12, 29, 39, 59}, {12, 30, 39, 59}, 3166 {12, 31, 39, 59}, {12, 32, 39, 59}, {12, 33, 39, 59}, {12, 34, 39, 59}, 3167 {12, 35, 39, 59}, {12, 36, 39, 59}, {12, 37, 45, 59}, {12, 38, 39, 59}, 3168 {12, 39, 39, 59}, {12, 40, 39, 59}, {12, 41, 42, 59}, {12, 42, 39, 56}, 3169 {12, 43, 39, 59}, {12, 44, 39, 59}, {12, 45, 39, 59}, {12, 46, 39, 50}, 3170 }, 3171 } 3172 body7 = testBody{ 3173 label: 7, 3174 offset: dvid.Point3d{68, 10, 7}, 3175 size: dvid.Point3d{52, 50, 10}, 3176 blockSpans: []dvid.Span{ 3177 {2, 0, 0, 1}, 3178 {2, 1, 0, 1}, 3179 }, 3180 voxelSpans: []dvid.Span{ 3181 {78, 11, 9, 59}, {78, 12, 9, 59}, {78, 13, 9, 59}, {78, 14, 9, 59}, 3182 {78, 15, 19, 59}, {78, 16, 19, 59}, {78, 17, 19, 59}, {78, 18, 19, 59}, 3183 {78, 19, 29, 59}, {78, 20, 29, 59}, {78, 21, 29, 59}, {78, 22, 29, 59}, 3184 {78, 23, 39, 59}, {78, 24, 39, 59}, {78, 25, 39, 59}, {78, 26, 39, 59}, 3185 {78, 23, 39, 59}, {78, 24, 39, 59}, {78, 25, 39, 59}, {78, 26, 39, 59}, 3186 {78, 27, 39, 59}, {78, 28, 39, 59}, {78, 29, 39, 59}, {78, 30, 39, 59}, 3187 {78, 31, 39, 59}, {78, 32, 39, 59}, {78, 33, 39, 59}, {78, 34, 39, 59}, 3188 {78, 35, 39, 59}, {78, 36, 39, 59}, {78, 37, 45, 59}, {78, 38, 39, 59}, 3189 {78, 39, 39, 59}, {78, 40, 39, 59}, {78, 41, 42, 59}, {78, 42, 39, 56}, 3190 {78, 43, 39, 59}, {78, 44, 39, 59}, {78, 45, 39, 59}, {78, 46, 39, 50}, 3191 3192 {79, 11, 9, 59}, {79, 12, 9, 59}, {79, 13, 9, 59}, {79, 14, 9, 59}, 3193 {79, 15, 19, 59}, {79, 16, 19, 59}, {79, 17, 19, 59}, {79, 18, 19, 59}, 3194 {79, 19, 29, 59}, {79, 20, 29, 59}, {79, 21, 29, 59}, {79, 22, 29, 59}, 3195 {79, 23, 39, 59}, {79, 24, 39, 59}, {79, 25, 39, 59}, {79, 26, 39, 59}, 3196 {79, 23, 39, 59}, {79, 24, 39, 59}, {79, 25, 39, 59}, {79, 26, 39, 59}, 3197 {79, 27, 39, 59}, {79, 28, 39, 59}, {79, 29, 39, 59}, {79, 30, 39, 59}, 3198 {79, 31, 39, 59}, {79, 32, 39, 59}, {79, 33, 39, 59}, {79, 34, 39, 59}, 3199 {79, 35, 39, 59}, {79, 36, 39, 59}, {79, 37, 45, 59}, {79, 38, 39, 59}, 3200 {79, 39, 39, 59}, {79, 40, 39, 59}, {79, 41, 42, 59}, {79, 42, 39, 56}, 3201 {79, 43, 39, 59}, {79, 44, 39, 59}, {79, 45, 39, 59}, {79, 46, 39, 50}, 3202 3203 {80, 11, 9, 59}, {80, 12, 9, 59}, {80, 13, 9, 59}, {80, 14, 9, 59}, 3204 {80, 15, 19, 59}, {80, 16, 19, 59}, {80, 17, 19, 59}, {80, 18, 19, 59}, 3205 {80, 19, 29, 59}, {80, 20, 29, 59}, {80, 21, 29, 59}, {80, 22, 29, 59}, 3206 {80, 23, 39, 59}, {80, 24, 39, 59}, {80, 25, 39, 59}, {80, 26, 39, 59}, 3207 {80, 23, 39, 59}, {80, 24, 39, 59}, {80, 25, 39, 59}, {80, 26, 39, 59}, 3208 {80, 27, 39, 59}, {80, 28, 39, 59}, {80, 29, 39, 59}, {80, 30, 39, 59}, 3209 {80, 31, 39, 59}, {80, 32, 39, 59}, {80, 33, 39, 59}, {80, 34, 39, 59}, 3210 {80, 35, 39, 59}, {80, 36, 39, 59}, {80, 37, 45, 59}, {80, 38, 39, 59}, 3211 {80, 39, 39, 59}, {80, 40, 39, 59}, {80, 41, 42, 59}, {80, 42, 39, 56}, 3212 {80, 43, 39, 59}, {80, 44, 39, 59}, {80, 45, 39, 59}, {80, 46, 39, 50}, 3213 3214 {81, 11, 9, 59}, {81, 12, 9, 59}, {81, 13, 9, 59}, {81, 14, 9, 59}, 3215 {81, 15, 19, 59}, {81, 16, 19, 59}, {81, 17, 19, 59}, {81, 18, 19, 59}, 3216 {81, 19, 29, 59}, {81, 20, 29, 59}, {81, 21, 29, 59}, {81, 22, 29, 59}, 3217 {81, 23, 39, 59}, {81, 24, 39, 59}, {81, 25, 39, 59}, {81, 26, 39, 59}, 3218 {81, 23, 39, 59}, {81, 24, 39, 59}, {81, 25, 39, 59}, {81, 26, 39, 59}, 3219 {81, 27, 39, 59}, {81, 28, 39, 59}, {81, 29, 39, 59}, {81, 30, 39, 59}, 3220 {81, 31, 39, 59}, {81, 32, 39, 59}, {81, 33, 39, 59}, {81, 34, 39, 59}, 3221 {81, 35, 39, 59}, {81, 36, 39, 59}, {81, 37, 45, 59}, {81, 38, 39, 59}, 3222 {81, 39, 39, 59}, {81, 40, 39, 59}, {81, 41, 42, 59}, {81, 42, 39, 56}, 3223 {81, 43, 39, 59}, {81, 44, 39, 59}, {81, 45, 39, 59}, {81, 46, 39, 50}, 3224 3225 {82, 11, 9, 59}, {82, 12, 9, 59}, {82, 13, 9, 59}, {82, 14, 9, 59}, 3226 {82, 15, 19, 59}, {82, 16, 19, 59}, {82, 17, 19, 59}, {82, 18, 19, 59}, 3227 {82, 19, 29, 59}, {82, 20, 29, 59}, {82, 21, 29, 59}, {82, 22, 29, 59}, 3228 {82, 23, 39, 59}, {82, 24, 39, 59}, {82, 25, 39, 59}, {82, 26, 39, 59}, 3229 {82, 23, 39, 59}, {82, 24, 39, 59}, {82, 25, 39, 59}, {82, 26, 39, 59}, 3230 {82, 27, 39, 59}, {82, 28, 39, 59}, {82, 29, 39, 59}, {82, 30, 39, 59}, 3231 {82, 31, 39, 59}, {82, 32, 39, 59}, {82, 33, 39, 59}, {82, 34, 39, 59}, 3232 {82, 35, 39, 59}, {82, 36, 39, 59}, {82, 37, 45, 59}, {82, 38, 39, 59}, 3233 {82, 39, 39, 59}, {82, 40, 39, 59}, {82, 41, 42, 59}, {82, 42, 39, 56}, 3234 {82, 43, 39, 59}, {82, 44, 39, 59}, {82, 45, 39, 59}, {82, 46, 39, 50}, 3235 }, 3236 } 3237 bodies = []testBody{ 3238 body1, body2, body3, body4, bodysplit, body6, body7, 3239 } 3240 )