Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MODIFICATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ New code, not derived from MaxCDCL.
| Progress output | Default mode prints `c trying d:`, `c d_lb:`, `c d_ub:`, `c d:`, `o` |
| Quiet / debug | Default `verb=0`; child stdout to `/dev/null`; `-v` / `-debug` for solver log |
| CLI flags | `-no-card`, `-card-sinz`, `-card-mto`, `-card-both-force`, `-cpu-lim`, `-q` |
| Matrix path resolution (2026-10-11) | A bare code name resolves to `data/matrices/<code>` if its `_Hx.txt` exists there, else to the first of `data/matrices/tier0` … `tier5` containing it (benchmark matrices are organized in tier subdirectories, see `data/matrices/README.md`); a path containing `/` is used as given |
| Interleaved CSS split (GH-73, PI-approved 2026-10-09, experimental) | Default MaxCDCL path computes d = min(dX, dZ) by a global bound search over the X-type and Z-type halves (doubling feasibility probes, tie-break probes, ordered capped optimisation); only global bounds are forwarded; `-joint` keeps the original encoding |
| Per-half symmetry breaking (GH-85, interaction GH-73 x GH-75, experimental) | Split path only: candidate qubit permutations (GH-75 family) are kept for a CSS half only if GF(2) row-space checks prove they preserve rs(Hpar) and rs([Hpar;Glog]) of that half (plain maps only, no XZ-dual maps); optimum-preserving orbit clauses over the half variables (unit clause for transitive groups, orbit chain otherwise) in every oracle instance of that half. `-no-symbreak` = GH-73 split; `-symbreak-report` prints per-half generators/orbits; `-joint`, dumps and RoundingSat unchanged. See `optimization/experiments/GH-85/`. |

Expand Down
25 changes: 18 additions & 7 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ See file headers in src/solver/ for exact attribution per file.
5. Benchmark matrices from codeDistancePYPI (MIT)
-------------------------------------------------

Location: data/matrices/
Location: data/matrices/ (tier subdirectories tier0 .. tier5; see
data/matrices/README.md)

Some example parity-check and logical-operator data in this repository
were derived from the codeDistancePYPI project:
Expand All @@ -105,24 +106,27 @@ DistQLDPC changes applied to upstream data:
If d is not certified, the stem uses `unknown`. Upstream example IDs
are listed below where files were renamed.

Codes in data/matrices/ derived from codeDistancePYPI examples
Codes in data/matrices/tier*/ derived from codeDistancePYPI examples
(after format conversion and stem rename):

LP_* (from upstream AJ_*):
LP_34_20_2 (AJ_01), LP_136_32_4 (AJ_04), LP_238_44_6 (AJ_07),
LP_340_56_8 (AJ_10), LP_442_68_10 (AJ_13),
LP_1768_224_unknown (AJ_52)
LP_* (from upstream xu_*):
LP_544_80_12 (xu_16), LP_714_100_unknown (xu_21)
xu_* (kept upstream ids): xu_30, xu_42
PK_* — PK_31
LP_544_80_12 (xu_16), LP_714_100_unknown (xu_21),
LP_1020_136_unknown (was xu_30), LP_1428_184_unknown (was xu_42)
LP_* (from upstream PK_*):
LP_1054_140_unknown (was PK_31)
TN_* — TN_36_8_3 (was QT_36_8_3), TN_36_8_4, TN_54_11_4 (was QT_54_11_4),
TN_72_8_8, TN_72_14_4 (was QT_72_14_4), TN_108_2_12, TN_144_2_13,
TN_180_2_17, TN_200_10_10 (was QT_200_10_10), TN_216_4_18,
TN_250_10_15 (was QT_250_10_15), TN_252_2_21, TN_288_2_24,
TN_324_4_25, TN_360_4_24, TN_396_4_26, TN_432_8_33, TN_468_4_31,
TN_324_4_25, TN_360_4_unknown (was TN_360_4_24), TN_396_4_26,
TN_432_8_33, TN_468_4_31,
TN_496_2_32, TN_504_2_45, TN_540_4_40, TN_576_2_57, TN_576_2_59,
TN_612_2_52, TN_648_10_71, TN_648_14_50, TN_684_2_29
TN_612_2_52, TN_648_10_unknown (was TN_648_10_71), TN_648_14_50,
TN_684_2_29

Other files under data/matrices/ (e.g. BB_*, GB_*) are not listed
here and are provided under the DistQLDPC repository license unless
Expand All @@ -133,6 +137,13 @@ aligned with QDistSAT:
BB_144_14_14 (was BB_144_14_0), BB_288_12_unknown (was BB_288_12_18),
BB_360_12_unknown (was BB_360_12_24), GB_144_12_8 (was GB_144_12_24),
GB_144_12_12 (was GB_144_12_37).
Renamed 2026-10-11 (PI decision; same matrices, stem = {family}_{n}_{k}_{d}
with n = columns of Hx, k = rows of Gx): LP_1054_140_unknown (was PK_31),
LP_1020_136_unknown (was xu_30), LP_1428_184_unknown (was xu_42),
TN_648_10_unknown (was TN_648_10_71; the bundled logical bases contain
weight-52 nontrivial logicals, so d <= 52 and 71 was not a valid distance),
TN_360_4_unknown (was TN_360_4_24; matrices identical to QDistSAT's
TN_360_4_unknown, distance not certified here).

Redistribution of the MIT-derived matrix files must retain the upstream
copyright and permission notice above (or the full MIT license text from
Expand Down
18 changes: 11 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ The last line `o 6` is the distance (or the best upper bound found before timeou

## Input: four matrix files

For a code named `<code>`, put four text files in one directory (default: `data/matrices/`):
For a code named `<code>`, put four text files in one directory (default: `data/matrices/`; the bundled benchmark codes live in tier subdirectories `data/matrices/tier0` … `tier5`, see [data/matrices/README.md](data/matrices/README.md)):

| File | Role |
|------|------|
Expand All @@ -40,7 +40,7 @@ For a code named `<code>`, put four text files in one directory (default: `data/

**File format:** each line is one binary row; entries are `0` or `1` separated by spaces. Lines starting with `#` are comments. All four matrices must have the same number of columns `n` (qubits).

**Stem names** use `{family}_{n}_{k}_{d}` (e.g. `BB_72_12_6`, `LP_34_20_2`). Use `unknown` when minimum distance is not certified. Upstream `AJ_*` / `xu_*` ids are recorded in [NOTICE](NOTICE).
**Stem names** use `{family}_{n}_{k}_{d}` (e.g. `BB_72_12_6`, `LP_34_20_2`), family in `BB`, `GB`, `LP`, `TN`. Use `unknown` when minimum distance is not certified. Upstream `AJ_*` / `xu_*` / `PK_*` ids and renames are recorded in [NOTICE](NOTICE) and [data/matrices/README.md](data/matrices/README.md).

Example layout:

Expand All @@ -52,11 +52,13 @@ data/matrices/
MY_CODE_Gz.txt
```

Run with a path prefix (with or without directory):
Run with a path prefix (with or without directory). A bare name is looked up in `data/matrices/` first, then in `data/matrices/tier0` … `tier5` (first match wins); a name containing `/` is used as given:

```bash
./bin/distqldpc MY_CODE
./bin/distqldpc data/matrices/MY_CODE
./bin/distqldpc LP_34_20_2 # -> data/matrices/tier0/LP_34_20_2
./bin/distqldpc data/matrices/tier0/LP_34_20_2
```

---
Expand All @@ -69,11 +71,12 @@ You only need to **author** the parity checks `Hx` and `Hz`. The logical bases `
# write data/matrices/MY_CODE_Gx.txt and MY_CODE_Gz.txt from Hx/Hz
python3 scripts/compute_logicals.py MY_CODE

# custom directory
# custom directory (flat; e.g. a tier directory)
python3 scripts/compute_logicals.py --dir path/to/matrices MY_CODE

# batch: all codes that have Hx + Hz but no Gx/Gz yet
# batch: all codes in one directory that have Hx + Hz but no Gx/Gz yet
python3 scripts/compute_logicals.py --all
python3 scripts/compute_logicals.py --dir data/matrices/tier0 --all

# replace existing Gx/Gz
python3 scripts/compute_logicals.py --overwrite MY_CODE
Expand All @@ -89,7 +92,7 @@ In symplectic form (used internally by the solver): Gx rows become `[0 | z]`, Gz
Optional: remove redundant stabilizer rows or sparsify checks before distance search:

```bash
python3 scripts/preprocess_matrices.py --src data/matrices --root data
python3 scripts/preprocess_matrices.py --src data/matrices/tier0 --root data
# writes data/s1/ and data/s2/ variants; re-run compute_logicals on those if needed
```

Expand Down Expand Up @@ -181,6 +184,7 @@ Optimization experiments must follow the [optimization loop policy](docs/OPTIMIZ
```bash
python3 scripts/benchmark_matrices.py
python3 scripts/benchmark_matrices.py --all --timeout 180
python3 scripts/benchmark_matrices.py --matrices-dir data/matrices/tier1 --all # one data tier
python3 scripts/benchmark_matrices.py --compare-roundingsat
```

Expand All @@ -206,7 +210,7 @@ Requires **g++** and **zlib**. Binary: `bin/distqldpc`.
```
src/core/distqldpc.cc # CLI, QLDPC encoding, fork/pipe
src/solver/ # MaxCDCL MaxSAT engine
data/matrices/ # example codes (Hx, Hz, Gx, Gz)
data/matrices/tierN/ # benchmark codes (Hx, Hz, Gx, Gz) by tier; see data/matrices/README.md
```

---
Expand Down
71 changes: 71 additions & 0 deletions data/matrices/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Benchmark matrices

Each code `<stem>` is four text files `<stem>_Hx.txt`, `<stem>_Hz.txt`, `<stem>_Gx.txt`,
`<stem>_Gz.txt` (format: [README](../../README.md#input-four-matrix-files)). The 50 bundled
codes are organized by benchmark tier in `tier0/` … `tier5/` (PI decision 2026-10-11).
Every code is in exactly one tier.

`bin/distqldpc <stem>` resolves a bare name to `data/matrices/<stem>` if `<stem>_Hx.txt`
is there, else to the first of `tier0` … `tier5` that contains it; a name containing `/`
is used as given (`./bin/distqldpc data/matrices/tier3/BB_144_12_12`).
`scripts/benchmark_matrices.py` searches the same way (`--matrices-dir data/matrices/tierN`
restricts it to one tier). `scripts/compute_logicals.py --dir` and
`scripts/preprocess_matrices.py --src` take one flat directory, e.g. `data/matrices/tier0`.

## Tiers

`[[n, k, d]]`: n = columns of Hx, k = rows of Gx, d = certified distance (`unknown` if not
certified).

| Tier | Purpose / timeout | Codes `[[n, k, d]]` |
|------|-------------------|---------------------|
| tier0 | correctness / smoke (small) | LP_34_20_2 [[34,20,2]], TN_36_8_3 [[36,8,3]], TN_36_8_4 [[36,8,4]], TN_54_11_4 [[54,11,4]], BB_72_12_6 [[72,12,6]], TN_72_14_4 [[72,14,4]], TN_72_8_8 [[72,8,8]], TN_108_2_12 [[108,2,12]], LP_136_32_4 [[136,32,4]], TN_200_10_10 [[200,10,10]] |
| tier1 | lightweight performance filter | BB_90_8_10 [[90,8,10]], BB_108_8_10 [[108,8,10]], GB_144_12_8 [[144,12,8]], LP_238_44_6 [[238,44,6]] |
| tier2 | medium filter | LP_340_56_8 [[340,56,8]] |
| tier3 | decisive set | BB_144_12_12 [[144,12,12]], BB_144_14_14 [[144,14,14]], GB_144_12_12 [[144,12,12]], TN_144_2_13 [[144,2,13]], LP_442_68_10 [[442,68,10]], LP_544_80_12 [[544,80,12]] |
| tier4 | hard; timeout 2000 s | TN_250_10_15 [[250,10,15]], BB_288_12_unknown [[288,12,?]], LP_714_100_unknown [[714,100,?]] |
| tier5 | very hard; timeout 21600 s (6 h) | TN_180_2_17 [[180,2,17]], TN_216_4_18 [[216,4,18]], TN_252_2_21 [[252,2,21]], TN_288_2_24 [[288,2,24]], TN_324_4_25 [[324,4,25]], BB_360_12_unknown [[360,12,?]], TN_360_4_unknown [[360,4,?]], TN_396_4_26 [[396,4,26]], TN_432_8_33 [[432,8,33]], TN_468_4_31 [[468,4,31]], TN_496_2_32 [[496,2,32]], TN_504_2_45 [[504,2,45]], TN_540_4_40 [[540,4,40]], TN_576_2_57 [[576,2,57]], TN_576_2_59 [[576,2,59]], TN_612_2_52 [[612,2,52]], TN_648_10_unknown [[648,10,?]], TN_648_14_50 [[648,14,50]], TN_684_2_29 [[684,2,29]], BB_756_16_34 [[756,16,34]], BB_864_4_40 [[864,4,40]], LP_1020_136_unknown [[1020,136,?]], LP_1054_140_unknown [[1054,140,?]], BB_1080_4_54 [[1080,4,54]], LP_1428_184_unknown [[1428,184,?]], LP_1768_224_unknown [[1768,224,?]] |

Counts: tier0 10, tier1 4, tier2 1, tier3 6, tier4 3, tier5 26 (total 50).

**Timeouts.** tier4: 2000 s per instance; tier5: 21600 s (6 h) per instance.
tier0–tier3 are the filtering tiers of the
[optimization loop policy](../../docs/OPTIMIZATION_LOOP_POLICY.md) (Tier 0 correctness/smoke,
Tier 1 lightweight filter, Tier 2 medium filter, Tier 3 decisive set); the policy fixes no
numeric wall-clock limit for them, so the limit is recorded in each experiment's
pre-registered plan and kept identical for baseline and candidate. Note that the policy's
Tier 3 decision set also lists `TN_250_10_15`, which is stored in `tier4/` under the
2026-10-11 layout.

## Naming rule

`{family}_{n}_{k}_{d}` with family in `BB`, `GB`, `LP`, `TN`; n = columns of Hx, k = rows
of Gx, d = certified minimum distance, or `unknown` if not certified. `GB` keeps its own
prefix (not merged into `BB`). Former `PK_*` / `xu_*` codes are `LP_*`; former `QT_*`
codes are `TN_*`. Upstream ids and attribution are recorded in [NOTICE](../../NOTICE),
section 5.

## Rename history

| Date | Old | New | Note |
|------|-----|-----|------|
| 2026-10-11 | PK_31 | LP_1054_140_unknown | n=1054, k=140 |
| 2026-10-11 | xu_30 | LP_1020_136_unknown | n=1020, k=136 |
| 2026-10-11 | xu_42 | LP_1428_184_unknown | n=1428, k=184 |
| 2026-10-11 | TN_360_4_24 | TN_360_4_unknown | matrices identical to QDistSAT's `data/tier5/TN_360_4_unknown_*` (Hx/Hz byte-identical; Gx/Gz header comment aligned, so all four files are byte-identical); d not certified |
| 2026-10-11 | TN_648_10_71 | TN_648_10_unknown | bundled logical bases contain weight-52 nontrivial logicals, so d <= 52; exact d unknown |
| earlier | BB_144_14_0 | BB_144_14_14 | aligned with QDistSAT |
| earlier | BB_288_12_18 | BB_288_12_unknown | aligned with QDistSAT |
| earlier | BB_360_12_24 | BB_360_12_unknown | aligned with QDistSAT |
| earlier | GB_144_12_24 | GB_144_12_8 | aligned with QDistSAT |
| earlier | GB_144_12_37 | GB_144_12_12 | aligned with QDistSAT |
| earlier | QT_36_8_3, QT_54_11_4, QT_72_14_4, QT_200_10_10, QT_250_10_15 | TN_36_8_3, TN_54_11_4, TN_72_14_4, TN_200_10_10, TN_250_10_15 | QT -> TN |
| earlier | AJ_01, AJ_04, AJ_07, AJ_10, AJ_13, AJ_52; xu_16, xu_21 | LP_34_20_2, LP_136_32_4, LP_238_44_6, LP_340_56_8, LP_442_68_10, LP_1768_224_unknown; LP_544_80_12, LP_714_100_unknown | upstream codeDistancePYPI ids |

## Open items

- **TN_648_10_unknown:** d <= 52 (weight-52 nontrivial logicals in the bundled bases); the
exact distance is unknown.
- **BB_288_12_unknown / LP_714_100_unknown:** current main reports d = 18 and d = 16
respectively. These are pending results awaiting internal cross-checks; the stems will be
renamed to `BB_288_12_18` / `LP_714_100_16` only after the cross-checks agree.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# n=1020 Z-type logical rows ker(Hx)/row(Hz) parity xu_30_Hx.txt
# n=1020 Z-type logical rows ker(Hx)/row(Hz) parity LP_1020_136_unknown_Hx.txt
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Expand Down
Loading
Loading