diff --git a/docs/analysis/horizon/new-pow.md b/docs/analysis/horizon/new-pow.md index 282faf68b..dda5cdc99 100644 --- a/docs/analysis/horizon/new-pow.md +++ b/docs/analysis/horizon/new-pow.md @@ -10,9 +10,10 @@ Josh's mandate, verbatim: "if we create a new way of hashing or a new way of pro |---|---| | 19:05 | Lane started. Read: preamble, CLAUDE.md, the two personas, spec 01 (whole), 04, 07, chip-model-v3 (whole), asic-resistance-history (sections 0 to 3 and 4.3, 5), latency-shadow-2026-10-06 (whole), counter-asic-3-status sections 1 to 5, counter-asic-3-node section 6 (the P2 signalling rule), int8-matrix-family sections 1 to 3, scratch-soundness verdict, proving-methods (whole), fud-ledger M1, M7, M16, M22, M28, P2, F13, proto-cuda host.cu and the mx8-genesis pack (kernel.cu, memhard.h, program.h, vectors.h), proto-cuda/emu, family-probe.cu, the fleet's prover-tiers-real-cards.md, bench-log line 2582 (rental cost) | | 19:25 | Fleet agent asked for two boxes; answered at 19:29: two quiet RTX 4090s (RunPod, nvcc 12.8 at /usr/local/cuda/bin, directory /root/horizon-newpow, until 22:30Z). No quiet Ampere card exists tonight; a loaded 3090 is offered. Main's note: cost rows use bench-log 2582 (USD 0.0117 per MH/s-hour) | -| 19:35 | File skeleton written. Two prototype sub-agents launched (budget two at once): `mma-shadow` on box 1 (47.47.180.77), `state-dataset` on box 2 (213.173.98.36) plus CPU rows on igneum-build-1. Designs being written in this file meanwhile | +| 19:35 | File skeleton written. Two prototype sub-agents launched (budget two at once): `mma-shadow` on box 1 (), `state-dataset` on box 2 () plus CPU rows on igneum-build-1. Designs being written in this file meanwhile | | 19:41 | Section 3 complete: the three designs, the one-table comparison, the migration path. Scheme A's verdict is already visible in its own numbers (A1 dead on 2.9 MB of openings per block, A2 dead on sampleability and a 32 to 40 ms proof verify; A0 is scheme C with the trace as state). Prototypes running: `mma-shadow` (box 1) and `state-dataset` (box 2 and igneum-build-1). mm8 two-output correction sent to the prototype | -| (next) | Section 4 reviews (cryptographer, consensus engineer, two per scheme); the pick; section 5 measured rows as they land; section 6 verdicts; section 7 ranked next steps | +| 19:50 | Section 4 (reviews, the pick: B and C), section 7 (ranked next steps) and section 8 (open questions) written. Scheme C prototype complete and measured on box 2 and igneum-build-1: hash rate and watts unchanged (63.08 vs 63.09 MH/s, 207 W), build +1.4 ms, verifier +0.11 to 0.21 ms per unit, bit-exact 1,024 of 1,024 items and 128 of 128 lanes; rows in 5.2. Scheme B ladder running on box 1 (R = 0, 8, 32, 128 measured, 512 in progress) | +| 20:20 | Scheme B ladder complete on box 1 (R = 0 to 512, rate flat at 63.08 MH/s, 201 to 216 W, every fingerprint PTX = reference, 1,024 of 1,024 lanes at every R, verifier delta 0.05 to 4.39 ms). Sections 5.1, 5.3, 6 and 9 written. Box 2 released 19:53Z; box 1 released on the mma agent's report. File complete | ## 1. What was read and the facts this lane stands on @@ -133,8 +134,8 @@ So the fleet splits by generation: Turing-and-later NVIDIA and RDNA 3-and-later | Scheme | What it is | Chip edge per joule vs the 5090 (f = 1 chip, chip-model-v3 method) | Verifier ms per unit (model, then measured in section 5) | Vendor bit-exactness | Ships as class v5? | |---|---|---|---|---|---| | A, mining is proving | A1 committed codeword, A2 proving steps: dead on bytes and on sampleability; A0 trace-as-dataset survives and is C with the trace as state | A0 unchanged (5.1x GDDR7); A1, A2 not priced | A0: 2.06 + the leaf-read row; A1: 2.9 MB of openings; A2: 32 to 40 ms | A0 adds the zkVM executor to consensus | NEVER as mining = proving; A0 folds into C | -| B, tensor-shaped shadow | class v3 plus `8 R` int8 8x8x16 tile steps per hash in the PTX fragment layout, two outputs per lane | memory + `8 R x 1,024 x e_mac x k_mma`; `k_mma` near 1 with a floor near 0.5 (approximate); rows from the measured `e_mac` in 5.3 | 2.06 + about 0.9 microseconds per step per unit scalar (R = 128: +0.9 ms; R = 512: +3.7 ms); VNNI 4x to 16x less | native on sm_75+ and RDNA 3+ (AMD layout unverified); emulated on Pascal, RDNA 2, Apple | prototype further; a class v5 candidate after the AMD gate | -| C, stored state | the daily dataset derives from the execution state snapshot; kernel unchanged; a state sample per block | unchanged (5.1x GDDR7, 7.5x to 9.2x HBM3); the f = 0 chip disappears | 2.06 + 4,096 leaf reads (section 5.2) | nothing vendor-specific; the serialisation is the consensus risk | prototype further; a class v5 candidate on its own or beside B | +| B, tensor-shaped shadow | class v3 plus `8 R` int8 8x8x16 tile steps per hash in the PTX fragment layout, two outputs per lane | memory + `8 R x 1,024 x e_mac x k_mma`; `k_mma` near 1 with a floor near 0.5 (approximate); rows from the measured `e_mac` in 5.3 | 2.06 + about 0.9 microseconds per step per unit scalar (R = 128: +0.9 ms; R = 512: +3.7 ms); VNNI 4x to 16x less | native on sm_75+ and RDNA 3+ (AMD layout unverified); emulated on Pascal, RDNA 2, Apple | before measurement: prototype further. After section 5: NEVER as class content (the block costs the honest card 0.056 to 0.70 pJ per multiply-add, so it forces no joules on a chip); kept as reserve R8 evidence | +| C, stored state | the daily dataset derives from the execution state snapshot; kernel unchanged; a state sample per block | unchanged (5.1x GDDR7, 7.5x to 9.2x HBM3); the f = 0 chip disappears | 2.06 + 4,096 leaf reads (section 5.2) | nothing vendor-specific; the serialisation is the consensus risk | before measurement: prototype further. After section 5: SHIP as the class v5 candidate | ### 3.5 Migration through the class system (common to B and C) @@ -165,7 +166,7 @@ Written by this lane in the persona files' voices (`.claude/agents/cryptographer ### 4.4 The pick -B and C are the two to prototype: both are class objects on the shipped hash, both leave the dataset's memory bound untouched, and they compose (B is kernel text, C is the daily build). A is not prototyped: A1 and A2 fail on bytes and on sampleability before any kernel, and A0 is C with a worse data source. The order of merit at this point, before measurement: C first (no vendor risk, unchanged hash rate by construction, a real new property per block, the pool caveat stated), B second (a real lever against the f = 1 chip with a bounded `k`, a vendor split and an unverified AMD layout). Section 6 revisits the order on the measured rows. +B and C are the two to prototype: both are class objects on the shipped hash, both leave the dataset's memory bound untouched, and they compose (B is kernel text, C is the daily build). A is not prototyped: A1 and A2 fail on bytes and on sampleability before any kernel, and A0 is C with a worse data source. The order of merit at this point, before measurement: C first (no vendor risk, unchanged hash rate by construction, a real new property per block, the pool caveat stated), B second (a real lever against the f = 1 chip with a bounded `k`, a vendor split and an unverified AMD layout). Section 6 revisits the order on the measured rows: C holds, B retires into the reserve. ## 5. The prototypes and the measured rows @@ -173,31 +174,115 @@ Both prototypes live under `proto-newpow/` with a README carrying the exact comm ### 5.1 `mma-shadow` (scheme B), box 1 -ROWS_B +Prototype: `proto-newpow/mma-shadow/` (README with every command, `kernel_mm8.cu` with the PTX path and the `IGNEUM_MM8_REF` reference path, `bench.cu`, `verify_ref.c`, `gen_block.py`, `gen_ref_program.py`, `run.sh`, `out/` with every log and csv). Box 1: RTX 4090 24 GB (128 SMs), driver 570.172 (the box reports 570, not the 595 of box 2), nvcc 12.8.93, `-arch=sm_89`, 1 warp per block, 10 timed batches of 2^24 after a warm-up, power from `nvidia-smi` at 1 Hz over a 25-s sustained phase (mean after its first 10 s), idle 15.0 to 15.3 W. The two-output tile form of section 3.2 was built (the single-output form never was). Run 19:36 to 19:52 UTC. + +| R (steps per iteration) | mm8 per hash (8 R) | MH/s (GPU time) | Ratio to R = 0 | Watts, mean | Block watts over R = 0 | SM MHz | Microjoules per hash | Marginal pJ per multiply-add | Fingerprint (2^24 at base 0) | PTX = reference path | CPU = GPU (1,024 lanes) | Verifier block delta, ms per unit (box core, scalar C) | Registers per thread | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 0 (control) | 0 | 63.08 | 1.000 | 201.2 | 0 | 2,670 | 3.19 | | 7c28cfb06c5c65a9 (the pack's; the 3 pack vectors PASS standalone and in batch) | yes | 1,024 of 1,024 | 0 (the R = 0 run read -0.10, noise) | 29 | +| 8 | 64 | 63.08 | 1.000 | 204.1 | 2.9 | 2,670 | 3.24 | 0.70 | 06fc2593bfb94b4f | yes | 1,024 of 1,024 | +0.05 | 30 | +| 32 | 256 | 63.08 | 1.000 | 207.7 | 6.5 | 2,670 | 3.29 | 0.39 | 26e83a65f519c865 | yes | 1,024 of 1,024 | +0.17 | 29 | +| 128 | 1,024 | 63.08 | 1.000 | 212.7 | 11.5 | 2,670 | 3.37 | 0.17 | 42223c2113188335 | yes | 1,024 of 1,024 | +1.14 | 32 | +| 512 | 4,096 | 63.08 | 1.000 | 215.9 | 14.7 | 2,670 | 3.42 | 0.056 | 02b7002d747f3711 | yes | 1,024 of 1,024 | +4.39 | 36 | + +Sustained rates over the power window 63.07 to 63.03 MH/s at every R; wall and event rates agree to 0.01 MH/s; no spills, no stack, temperature 58 to 64 C, no throttling. The verifier totals in the box's logs (about 10 ms per unit) are a naive scalar interpreter with a lazy `mh_word` per load on a shared Zen 4 core at load 13 and are not comparable to the project's Rust verifier (2.06 ms per unit on an M5 Max core, interleaved); the block delta is the number: about 1.1 microseconds per `mm8` step per unit, 32 lanes x 32 byte products in plain loops. (At R = 512 the card issues about 258 G tiles per second, 2.6 x 10^14 multiply-adds per second, in the region of 40 percent of the 4090's dense int8 tensor peak, approximate from the published TOPS figure, so R = 512 is near the top of the free band, not its middle.) + +What the rows say: + +1. The tensor block is free in hash rate to R = 512 on the 4090: 4,096 tile instructions per hash leave the rate at 63.08 MH/s to the third decimal. The kernel is latency-bound on its 128 dependent loads and the tensor work fills stalls that were already there, as the ALU shadow did on the 5090 to 150,800 ops (`latency-shadow-2026-10-06.md` 5). +2. The block costs the honest card almost nothing in energy: 2.9 to 14.7 W, 0.70 pJ per multiply-add at R = 8 falling to 0.056 pJ at R = 512 (the tensor path's fixed cost amortised), 0.05 to 0.23 microjoules per hash on a 3.19 microjoule hash (+1.6 to +7.2 percent). The ALU shadow at N = 100,000 costs the 5090 0.6 microjoules per hash (11 pJ per counted op, `latency-shadow-2026-10-06.md` 5, item 4); the tensor block at its free-band ceiling costs a third of that. +3. That is the finding, and it is negative for the scheme's purpose (section 5.3): a shadow lever moves the chip's edge only by the joules it makes the HONEST card spend on work the chip cannot do more cheaply. The tensor path is so efficient on the GPU that the block adds 0.23 microjoules at most, so at `k = 1` the chip's edge falls from 6.9x to 4.9x on GDDR7 against this 4090, where the ALU shadow took the 5090 from 5.6x to 2.1x, and the tensor block costs the verifier 26x more per unit of chip-forcing energy (4.39 ms scalar per 0.23 microjoules against 0.17 ms per 0.6 microjoules). The property the design hoped for (`k_mma` near 1 because the GPU's tensor engine is near the floor) is real and is exactly why the lever is weak: there are no joules in it to force. +4. The correctness chain holds at every rung: the PTX fragment read and the plain-integer reference agree on all 2^24 lanes at every R, and the CPU interpreter matches the GPU on 1,024 lanes at every R; the probe's fragment layout (`family-probe.cu` mm8 `warp_ref`) was used as written and needed no correction. Registers 29 to 36, occupancy unchanged. This is the first class-shaped evidence that an `mm8` family is cheap and exact for the honest NVIDIA card, which is what the reserve entry R8 needs; it is not evidence for a class v5. + +Consequences per tier (B at R = 128, the largest R whose scalar verifier delta stays near 1 ms): + +| Tier | Meaning | What to do | +|---|---|---| +| NVIDIA Turing and later (RTX 20 to 50 series), any memory size | rate unchanged, +11.5 W on a 4090 (+5.7 percent), per-pound unchanged, per-watt 0.95x | nothing; the block would not be adopted on this evidence | +| NVIDIA Pascal (GTX 10 series) | emulation at about 16 steps per `mm8` (approximate): 1,024 per hash is about 16,000 counted steps, inside the latency shadow of a 1080-class card by the counted-ops rule, approximate; unmeasured | the emulation path exists in the kernel text (`IGNEUM_MM8_REF`) and is bit-exact; a GTX 1080 row is owed if B ever proceeds | +| AMD RDNA 3 and 4 | the WMMA layout is unverified (status item 6); emulation otherwise at about 12 to 16 steps per `mm8` | the gate of section 7 rank 2 stays open; not worth running unless B proceeds | +| Apple | emulation at about 10 steps per `mm8` (approximate), 10,000 counted steps at R = 128 inside the M5 Max's 130,000 ceiling | owed; not worth running unless B proceeds | +| Rig, pool user | nothing changes in shares; a rig pays the block's watts per card | nothing | +| Node operator (verifier) | +1.14 ms per unit scalar at R = 128 (+55 percent of 2.06 ms), +4.39 ms at R = 512; a SIMD byte-dot path would cut it 4x to 16x (approximate) | the verifier cost per joule forced is the reason the scheme loses to the ALU shadow | +| A chip | must carry a tensor array per 32 lanes in flight; at the measured block energy it pays at most 0.23 microjoules per hash more than today at `k = 1`, 0.07 at `k = 0.3` | the chip's edge barely moves (5.3) | ### 5.2 `state-dataset` (scheme C), box 2 and igneum-build-1 -ROWS_C +Prototype: `proto-newpow/state-dataset/` (README with every command and log; `kernel_sd.cu` = the pack's kernel plus `igneum_leaves` and `igneum_build_sd`, the hash kernel byte for byte the pack's; `verify_sd.c` the 32-lane C interpreter and the item check; `cpu_rows.c` the igneum-build-1 rows). Box 2: RTX 4090 24 GB, driver 595.91, nvcc 12.8, host EPYC 7352; igneum-build-1 EPYC 9454P at load 19 to 32 (shared), one core pinned, nice 19. Run 19:34 to 19:50 UTC. The leaf stand-in: one ChaCha12 block of (sigma, S, t, 0, tag) with `S = K XOR 0x5a5a5a5a` (the README defines it). + +| Row | Control (mx8-genesis) | sd1 | Reading | +|---|---|---|---| +| Hash rate, 10 batches of 2^24, two passes | 63.083, 63.083 MH/s | 63.088, 63.087 MH/s | equal within 0.01 percent: the kernel is the same binary over a dataset of the same shape | +| Watts, mean after 10 s of a 20-s window; SM MHz | 207.6, 205.2 W; 2,745 | 207.9, 206.5 W; 2,745 | equal within the 2 W run-to-run noise; 3.27 microjoules per hash on this 4090 (the 5090 is 2.34 to 2.65) | +| MH/s per W | 0.304, 0.307 | 0.303, 0.305 | unchanged | +| Cache fill, GPU | 1.81, 1.85 ms | 1.85, 1.85 ms | unchanged | +| Leaf array (2^24 ChaCha12 blocks, 1 GiB) on the GPU | none | 5.49 ms | the synthetic stand-in; a real snapshot comes from the node | +| Dataset build, second pass | 30.55 ms | 31.98 ms | +1.43 ms (+4.7 percent): one coalesced 64 B read per item | +| Chunked build (leaves streamed from pinned host memory in 64 MiB or 256 MiB chunks, one stream) | | 75.8 ms, 75.5 ms | PCIe-bound: 62 ms of copy (17.2 GB/s on this box) plus the build, partly serialised; two streams would hide most of the build (not done) | +| Device memory during the build (context 395 MiB included) | 1,675 MiB | 2,699 MiB resident leaves; 1,741 MiB chunked at 64 MiB; 1,933 at 256 MiB | while hashing 1,803 MiB in every mode (leaves freed) | +| 2^24 fingerprint at base 0 | 7c28cfb06c5c65a9 (the pack's, both passes) | d5b0c16390cad0e8 (four runs) | | +| Pack vectors (3 warps, standalone and in batch); dataset head, word [MASK], 64 Mac samples | PASS | n/a (new values; sd1 base 0 lane 0 = b600edbed969becc) | the harness is the pack's | +| Build bit-exact: 1,024 random items, GPU words against the plain C host derivation | 1,024 of 1,024 | 1,024 of 1,024 (also after both chunked rebuilds); 64 device leaves = host leaves | | +| Hash bit-exact: 4 dumped warps (128 lanes) against the C interpreter with lazy `mh_word` / `mh_word_sd` | 128 of 128 (and 32 of 32 against the Mac vector at base 0) | 128 of 128 | | +| Host cache FNV-1a 64 | 48c4f5bf24166b2e = the Mac's | same | | + +The CPU rows (igneum-build-1, ms per unit of 4,096 items, 100 units; two readings at load 19 and 31): + +| Row | Reading 1 | Reading 2 | Per item | +|---|---|---|---| +| (i) 4,096 random 64 B reads from a 2 GiB resident leaf array | 0.108 ms (0.092 to 0.172) | 0.163 ms | 26 to 40 ns | +| (i) the same from an 8 GiB array (the year-12 size) | 0.139 ms | 0.209 ms | 34 to 51 ns | +| (ii) 4,096 leaves derived on the fly (one ChaCha12 block each) | 0.284 ms | 0.285 ms | 69 ns | +| (iii) 4,096 x `mh_item` on the host cache, naive, no interleaving | 9.01 ms | 11.24 ms | 2.2 to 2.7 microseconds | +| 4,096 x (leaf read + `mh_item_sd`), naive | 9.31 ms | 11.64 ms | | +| Daily leaf array on CPU (2^24 blocks): one core / 32 threads | 1.67 s / 0.073 s | 1.68 s / 0.083 s | 100 ns per leaf | +| Host cache fill (256 MiB), one core | 0.447 s | 0.452 s | | +| Light-client sample: distinct items touched by lane 0's 128 loads | 128 of 2^24 | | 128 openings x 25 levels x 32 B + 128 x 64 B = 108 KiB per lane; 3.4 MiB per 32-lane unit before dedup (arithmetic) | + +Reading, against the gate: the project's Rust verifier does the 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items (the naive C figure here, 9 to 11 ms, is an upper bound and is not the production verifier); sd1 adds 0.11 to 0.21 ms per unit when the verifier holds the state in RAM (+5 to +10 percent of 2.06 ms; about +0.3 to +0.5 ms on a 2019-class core by the 2.5x rule), so the class v3 verifier plus sd1 sits at about 2.2 ms on the M5 Max core and about 5.7 ms on the 2019-class core, inside the 10 ms gate with the x8 margin intact. The snapshot's own cost is the state read on the node, not the leaf hashing (1.7 s on one core for 2^24 leaves). + +Consequences per tier (sd1): + +| Tier | Meaning | What to do | +|---|---|---| +| Home miner, one 8 GB card | hash rate, watts and MH/s per W unchanged (measured equal); the build must stream the leaves (resident leaves at the designed 2 GiB dataset would peak at about 4.6 GiB, approximate; chunked 64 MiB about 2.7 GiB, approximate, measured 1,741 MiB at 1 GiB), so the 8 GB mine-and-prove profiles of `prover-tiers-real-cards.md` keep their memory | ship chunked only; the kernel already takes an item range, so chunking needed no kernel change | +| 12, 16, 24, 32 GB cards | unchanged in rate and watts; the daily build +1.4 ms resident or about 76 ms streamed (about 150 ms at 2 GiB, approximate) | nothing | +| AMD and Apple | the hash kernel is untouched, so the measured class v3 rates stand (18.9 MH/s on the 9070 XT, 27.1 on the M5 Max); the build kernels gain one 64 B read per item in OpenCL and Metal | the two build kernels in the emitter's other dialects | +| Rig | per card as above; one 2 GiB snapshot per day per rig, shared by its cards | the node beside the rig serves it over loopback | +| Pool user | a 2 GiB download per day from the pool, or the pool ships the built dataset; today a pool user needs nothing but the day key | the pool protocol (spec 09) gains a daily snapshot or dataset fetch | +| Solo miner | must run a node with execution (it already does for templates) and hold the state | nothing new beyond RAM | +| Node operator | +2 GiB RAM for the snapshot (+4 GiB at year 4), a daily serialisation pass, the verifier +0.11 to 0.21 ms per unit | the node RAM budget stays inside a 16 GB home node at launch sizes | +| Light client, holder | a verifiable sample of 128 state leaves per lane per block exists; checking it costs 108 KiB per lane fetched on demand, so it is an availability spot check, not a light verification of PoW | rank 6 of section 7 | +| Prover, rollup customer | nothing | | ### 5.3 The chip rows on the measured numbers -CHIP_ROWS +Method: `sim/horizon/new-pow/chip_rows.py` (the chip-model-v3 section 5.4 f = 1 chip plus the block's measured energy times `k`; the card figures are 5.1's; every chip figure is arithmetic on `chip-model-v3.md`'s cited and approximate memory figures). The denominator here is the 4090 measured tonight (3.19 microjoules per hash at the control, a card whose memory system is half the 5090's), not the 5090, so the R = 0 column reads 6.9x where `chip-model-v3.md` reads 5.1x for the 5090; the movement with R is the row that matters. + +| Scheme and setting | Honest card microjoules per hash | Chip, GDDR7, k = 1 / 0.5 / 0.3 (microjoules) | Edge over the card, GDDR7 | Chip, one HBM3 stack, k = 1 / 0.5 / 0.3 | Edge, HBM3 | +|---|---|---|---|---|---| +| Class v3 today (R = 0, the 4090 control) | 3.19 | 0.466 | 6.9x | 0.321 | 9.9x | +| B at R = 128 (1,024 tiles per hash, block 0.18 microjoules) | 3.37 | 0.646 / 0.556 / 0.520 | 5.2x / 6.1x / 6.5x | 0.501 / 0.411 / 0.375 | 6.7x / 8.2x / 9.0x | +| B at R = 512 (4,096 tiles per hash, block 0.23 microjoules, the free band's top) | 3.42 | 0.696 / 0.581 / 0.535 | 4.9x / 5.9x / 6.4x | 0.551 / 0.436 / 0.390 | 6.2x / 7.8x / 8.8x | +| For comparison, the ALU shadow at N = 100,000 on the 5090 (`latency-shadow-2026-10-06.md` 6, measured 3.27 microjoules at the 431 W cap) | 3.27 | 1.59 / 1.03 / 0.80 | 2.1x / 3.2x / 4.1x | 1.44 / 0.88 / 0.66 | 2.3x / 3.7x / 5.0x | +| C (sd1) at any size | unchanged (measured equal) | 0.466 | unchanged | 0.321 | unchanged; the f = 0 recompute chip must add 2 GiB of DRAM and becomes this chip | + +Reading: B moves the f = 1 chip's edge by 1.4x to 2x at `k = 1` and by 1.1x at `k = 0.3`, at a verifier cost of 1.1 to 4.4 ms per unit (scalar); the ALU shadow moves it by 2.7x at `k = 1` and 1.4x at `k = 0.3` at 0.17 ms per unit. On every axis the measured tensor block is the weaker lever, for the reason stated in 5.1 item 3. C moves nothing and claims nothing against the chip; its merit is elsewhere. ## 6. Verdicts | Scheme | Verdict | Why, in one line | |---|---|---| | A, mining is proving | NEVER (A1, A2); A0 folds into C | one proof per segment is not a distribution of puzzles; the bytes (2.9 MB of openings per block) or the verify (32 to 40 ms) kill every form that is not "hold the trace", and holding the trace is C with a worse data source | -| B, tensor-shaped shadow | VERDICT_B | -| C, stored state | VERDICT_C | +| B, tensor-shaped shadow | NEVER as class v5 content for the anti-chip purpose; the measurement (0.056 to 0.70 pJ per multiply-add, 15 W for 4,096 tiles per hash) is the reason. KEEP the `mm8` family as reserve R8 with the two-output correction, for datapath diversity, not for joules | +| C, stored state | SHIP AS CLASS v5 CANDIDATE (through the spec items of 4.3 and the Devnet 2 gate): hash rate and watts unchanged by construction and measured equal, build +1.4 ms, verifier +0.11 to 0.21 ms per unit, bit-exact on 1,024 items and 128 lanes; a new property per block (a random sample of state) and a new requirement per mining operation (hold the state); the open decision is what a header verifier is asked to hold | **A, in full.** The mandate asked for something never done, and "mining is proving" is the thing everybody has wanted and nobody has shipped; this lane's contribution is the reason, stated as a bound rather than a feeling: the useful fraction of a proving-as-lottery scheme is (proving work per segment) / (network hashes per segment), 8 percent at 1 GH/s and 0.08 percent at 100 GH/s on this chain's measured figures, because gas sets one and the security budget sets the other, and a puzzle whose verifier either recomputes the piece or verifies a 32 to 40 ms proof cannot sit under a 10 ms gate. The 80/20 split stays. Ledger F13's answer stands and gains this bound. What survives (A0) is scheme C. -VERDICT_BC_PROSE +NEVER as class v5 content for the anti-chip purpose; the measurement (0.056 to 0.70 pJ per multiply-add, 15 W for 4,096 tiles per hash) is the reason. KEEP the `mm8` family as reserve R8 with the two-output correction, for datapath diversity, not for joulesC_PROSE ## 7. Ranked next steps -Hours are agent hours (Josh's rule: Claude-side work takes hours). Each gate is a measurable pass line. Consequence per tier is the row's own. +Hours are agent hours (Josh's rule: Claude-side work takes hours). Each gate is a measurable pass line. Consequence per tier is the row's own. Ranks 2, 3 and 4 were written as B's gates before the ladder landed; after section 5 they are WITHDRAWN (B is not carried forward as class content; the rows stay so the reasoning is visible) and the live order is 1, 5, 6, 7, 8. | Rank | Proposal | Evidence | Model | Hours | Consequence per tier | Gate | |---|---|---|---|---|---|---| @@ -236,4 +321,8 @@ One paragraph each. ## 9. Summary for the coordinator -SUMMARY +This lane wrote three candidate proofs of work for Igneum, reviewed each in two personas, prototyped the two that survived on real cards, and measured. (1) Scheme C, the dataset derived from the chain's execution state, is the one to carry forward as the class v5 candidate: measured on an RTX 4090 the hash rate and watts are unchanged to the third decimal (63.08 MH/s, 207 W, the kernel is byte for byte the shipped one), the daily build grows by 1.4 ms resident or about 76 ms streamed, the verifier by 0.11 to 0.21 ms per unit with the state in RAM, every GPU item and lane agrees with the plain C derivation (1,024 of 1,024, 128 of 128); it forces every mining operation to hold state, names 128 random state leaves per lane per block, and removes the f = 0 recompute chip as a category; its costs are a 2 GiB daily delivery for pool miners and three spec items (canonical serialisation, a pruning-proof witness, the pause rule). (2) Scheme B, a tensor-shaped shadow of int8 8x8x16 tiles, is bit-exact on NVIDIA at every rung (2^24 lanes PTX = reference, 1,024 lanes CPU = GPU, R = 8 to 512) and free in hash rate to 4,096 tiles per hash, and that is exactly why it fails as an anti-chip lever: it costs the honest card 0.056 to 0.70 pJ per multiply-add and at most 0.23 microjoules per hash, so the f = 1 chip's edge moves from 6.9x to 4.9x at k = 1 against the 4090 where the class v4 ALU shadow moved the 5090's from 5.6x to 2.1x, at 26x the verifier cost per joule forced; never as class content, kept as the evidence and the two-output correction for reserve family R8. (3) Scheme A, mining is proving, is never: one proof per segment is not a distribution of puzzles; the useful fraction is bounded by proving work per segment over network hashes per segment (8 percent at 1 GH/s, 0.08 percent at 100 GH/s on this chain's measured figures); every form that is not "hold the trace" dies on 2.9 MB of openings per block or a 32 to 40 ms proof verify, and "hold the trace" is scheme C with a worse data source. + +1. Scheme C costs nothing in hash rate or watts (63.083 against 63.088 MH/s, 205 to 208 W on the 4090, measured) and 0.11 to 0.21 ms per unit of verifier time (measured on igneum-build-1), so class v5 can carry it; the model is `item_sd(t) = item(t) with s ^= leaf(t)` over the day's certified state root. +2. The tensor shadow moves the f = 1 chip's per-joule edge by at most 1.4x (6.9x to 4.9x at k = 1, R = 512) for 4.39 ms of scalar verifier per unit, against 2.7x for 0.17 ms from the ALU shadow; the model is `chip_rows.py` on the measured block energy of 0.23 microjoules per hash. +3. Mining cannot be proving on a lottery with a 10 ms verifier: the useful fraction is bounded by 5 GPU-seconds of proving per 8-second segment over the network's hashes in that segment, 8 percent at 1 GH/s and falling with the hash rate; the model is that ratio on `prover-tiers-real-cards.md` and bench-log 2582. diff --git a/proto-newpow/mma-shadow/README.md b/proto-newpow/mma-shadow/README.md new file mode 100644 index 000000000..7409548a9 --- /dev/null +++ b/proto-newpow/mma-shadow/README.md @@ -0,0 +1,125 @@ +# mma-shadow: prototype kernel for class "mx8+mm8xR" (Horizon lane 8, new proof of work) + +Measured 6 October 2026 on GPU box 1 (RTX 4090 24 GB). Everything here lives in this directory; the pack files +(kernel.cu, memhard.h, program.h, vectors.h) are verbatim copies of proto-cuda/packs-ca2-mixer/mx8-genesis. + +## The scheme + +The shipped mx8 hash (8 iterations of 64 straight-line instructions over r0..r7, 16 dataset loads, 8 shuffles, the +fold) plus a block of R `mm8` steps at the end of every iteration, after instruction 63 and before the next +iteration samples `sel`, so 8 x R mm8 steps per hash. Nothing else changes. One mm8 step k with drawn registers +(a_k, b_k, c_k, c2_k), a_k != b_k, c_k != c2_k: the 32 lanes' r[a] form A (8 x 16 u8, lane l holds +A[l >> 2][4 (l & 3) .. +3], byte 0 = lowest k), the 32 lanes' r[b] form B (16 x 8 u8, lane l holds +B[4 (l & 3) .. +3][l >> 2]), C = A x B exact in int32, and lane l does r[c] += C[l >> 2][2 (l & 3)] and +r[c2] += C[l >> 2][2 (l & 3) + 1], both modulo 2^32. That is the PTX `mma.sync.aligned.m8n8k16.row.col.s32.u8.u8.s32` +fragment layout with a zero accumulator (d0 into r[c], d1 into r[c2]), the same arithmetic as the mm8 `warp_ref` in +proto-cuda/family-probe.cu. Both tile outputs are consumed per step (design correction received 6 Oct 2026 before +anything was measured, so the single-output `bit` form was never built). The draws come from a SplitMix64 stream +seeded with FNV-1a-64 of "igneum-mm8/igneum-genesis" (seed 0x79f1fc5b6ed6112e): a = below(8); b = below(7), +b += (b >= a); c = below(8); c2 = below(7), c2 += (c2 >= c). R is the compile-time macro `IGNEUM_MM8_R`; R = 0 is +the control and is bit-exact with the pack (3 vector warps and the 2^24 fingerprint 7c28cfb06c5c65a9). + +## Files + +| File | What | +|---|---| +| `gen_block.py` | draws the 512-step table, writes `mm8_block.h` (packed uint16 table + X-macro step list) | +| `kernel_mm8.cu` | the pack's kernel.cu with r0..r7 as `uint32_t r[8]` (mechanical rewrite, same arithmetic) and the mm8 block; PTX path by default, `-DIGNEUM_MM8_REF` for the shuffle-and-byte-product reference path (12 shuffles + 32 byte products per lane per step). Cache fill, build and launch wrappers unchanged | +| `bench.cu` | harness derived from proto-cuda/host.cu (serve mode stripped): device info, `igneum_hash_info` registers and occupancy, GPU cache fill + host fill + FNV check, GPU dataset build + self-test, pack vectors at R = 0, 2^24 fingerprint at base nonce 0, 1 warm-up + 10 timed batches (CUDA events), `--sustain S` for the power meter, `--dump file n` | +| `gen_ref_program.py` | turns the 64 instruction lines of kernel.cu into the 32-lane C interpreter body `ref_program.inc` (nothing transcribed by hand) | +| `verify_ref.c` | plain C CPU reference: host cache (65536 segments), lazy `mh_word` loads, register-major interpreter, mm8 block in the spec layout, fold; compares a dump, then times the verifier per unit | +| `run.sh` | the ladder R in {0, 8, 32, 128, 512}: builds, power sampling, fingerprints, dumps, CPU check, summary | +| `summarise.py` | builds the RESULTS table from `out/` | + +## Exact commands (on the box, under /root/horizon-newpow/mma-shadow) + +``` +export PATH=/usr/local/cuda/bin:$PATH +python3 gen_block.py mm8_block.h +python3 gen_ref_program.py kernel.cu +gcc -O2 -o verify_ref verify_ref.c +for R in 0 8 32 128 512; do + nvcc -O3 -std=c++17 -arch=sm_89 -DIGNEUM_MM8_R=$R -Xptxas -v -o bench_$R bench.cu kernel_mm8.cu + nvcc -O3 -std=c++17 -arch=sm_89 -DIGNEUM_MM8_R=$R -DIGNEUM_MM8_REF -o bench_${R}_ref bench.cu kernel_mm8.cu + nvidia-smi --query-gpu=power.draw,clocks.sm,temperature.gpu,utilization.gpu,timestamp --format=csv,noheader -l 1 > out/power_$R.csv & + ./bench_$R --batches 10 --sustain 25 --dump out/dump_$R.txt 32 > out/bench_$R.log + kill %1 + ./bench_${R}_ref --fingerprint-only --no-host-cache > out/bench_${R}_ref.log + taskset -c 2 ./verify_ref out/dump_$R.txt $R --time > out/verify_$R.log # add --self-test at R = 0 +done +python3 summarise.py > out/results.md +``` +`./run.sh` is exactly that sequence (plus the idle baseline and the PTX == ref fingerprint comparison). From the +Mac: `rsync -az -e "ssh -i ~/.ssh/igneum-fleet -p " proto-newpow/mma-shadow/ root@:/root/horizon-newpow/mma-shadow/` +then `touch *` on the far side before building. + +## Card and driver + +NVIDIA GeForce RTX 4090, 128 SMs, cc 8.9, 24 GB. Driver 570.172.08 (the brief said 595; nvidia-smi reports 570.172.08), +CUDA 12.8 (nvcc V12.8.93), g++ 13.3.0, Ubuntu 24.04, 96 CPU threads. Idle baseline before the run: 15.0 to 15.3 W at +210 MHz SM, 45 C, 0 % utilisation. The host carried a CPU load average of about 13 from other tenants during the run +(the GPU itself was idle and ours alone); that is why the verifier timings were pinned to one core. + +## Method notes + +- Timing: one warm-up batch (also the fingerprint batch) then 10 timed batches of 2^24 hashes between CUDA events, + 1 warp per block (the pack bench default, 24 resident warps per SM at 29 registers). Power: nvidia-smi at 1 Hz + during a 25 s sustained phase after the timed batches; the mean takes samples from 10 s after the sustain start to + its end (the timestamps are in the csv). Microjoules per hash = mean watts / (MH/s x 10^6) x 10^6. +- Fingerprint = FNV-1a 64 over the 2^24 little-endian u64 outputs at base nonce 0. The PTX build and the reference + build must agree (the reference is the plain-integer byte-product form of the same fragment layout). +- CPU == GPU: 32 warps at SplitMix64(0x1234) 32-aligned bases, 1,024 lanes, recomputed by `verify_ref`. +- The verifier here is a naive register-major interpreter with no interleaving and a lazy `mh_word` per load + (72 mixer applications and 8 cache reads per word, 4,096 words per unit). It is slower than the project's Rust + verifier (2.06 ms per unit on an M5 Max core) on this box's core, so the number that matters is the mm8 block + delta (ms per unit at R minus ms per unit at R = 0), not the total. + +## RESULTS (6 Oct 2026, RTX 4090, driver 570.172.08, CUDA 12.8, sm_89, 1 warp/block, batch 2^24 x 10) + +| R | mm8 per hash (8R) | MH/s (GPU time) | ratio to R = 0 | watts mean (sustain, after first 10 s) | SM MHz | uJ per hash | max C | fingerprint (2^24 at base 0) | PTX == ref | CPU == GPU lanes | verifier ms per unit on the box core: R = 0, R, block delta | regs per thread (PTX build) | regs (ref build) | blocks per SM (cudaOccupancy) | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 0 | 0 | 63.08 | 1.000 | 201.2 | 2670 | 3.19 | 58 | 7c28cfb06c5c65a9 (matches the pack) | yes | 1024 of 1024 | 10.18, 10.08, -0.10 (noise) | 29 | 29 | 24 (24 warps/SM, 50 %) | +| 8 | 64 | 63.08 | 1.000 | 204.1 | 2670 | 3.24 | 62 | 06fc2593bfb94b4f | yes | 1024 of 1024 | 9.93, 9.97, +0.05 | 30 | 77 | 24 | +| 32 | 256 | 63.08 | 1.000 | 207.7 | 2670 | 3.29 | 63 | 26e83a65f519c865 | yes | 1024 of 1024 | 10.08, 10.24, +0.17 | 29 | 151 | 24 | +| 128 | 1024 | 63.08 | 1.000 | 212.7 | 2670 | 3.37 | 64 | 42223c2113188335 | yes | 1024 of 1024 | 10.18, 11.33, +1.14 | 32 | 175 | 24 | +| 512 | 4096 | 63.08 | 1.000 | 215.9 | 2670 | 3.42 | 61 | 02b7002d747f3711 | yes | 1024 of 1024 | 9.89, 14.28, +4.39 | 36 | 213 | 24 | + +Sustained MH/s over the 25 s power window: 63.075, 63.074, 63.072, 63.034, 63.073 for R = 0, 8, 32, 128, 512 (wall, +including a sync per batch). Wall and GPU-event rates agree to 0.01 MH/s at every R. Idle baseline 15.0 to 15.3 W. +Registers per thread at R = 0, 8, 32, 128, 512: 29, 30, 29, 32, 36 (PTX path), no spills, no stack, at every R. +R = 0 self-checks: cache FNV 48c4f5bf24166b2e PASS (GPU == host fill word for word), dataset head, [MASK], 64 random +points and 64 Mac samples PASS, the pack's 3 vector warps PASS standalone and in batch, fingerprint 7c28cfb06c5c65a9. +The C interpreter also reproduces the 3 pack vectors at R = 0 (`--self-test`). + +## What the numbers say + +- On the RTX 4090 the mm8 block is free in hash rate up to R = 512: 4,096 tensor instructions per hash leave the + rate at 63.08 MH/s, identical to the control to the third decimal. The kernel is latency-bound on the 16 dependent + random loads per iteration; the tensor work fills stalls that were already there. At R = 512 the card issues about + 2.6 x 10^11 mma.m8n8k16 per second, roughly 2.7 x 10^14 u8 multiply-adds per second (1,024 per instruction), which is + in the region of 40 % of the card's dense int8 tensor peak (approximate, from the published TOPS figure). So the + next doublings would start to cost hash rate; R = 512 is near the top of the free band, not in the middle of it. +- Power is the only GPU cost that moves: 201 W to 216 W (+7.3 %) and 3.19 to 3.42 uJ per hash (+7.2 %) from R = 0 + to R = 512. SM clock stayed pinned at 2670 MHz at every R, temperature peaked at 64 C, no throttling seen. +- Correctness chain holds at every rung: the PTX fragment read and the plain-integer reference path agree on all + 2^24 lanes of the fingerprint batch at every R, and the CPU interpreter matches the GPU on all 1,024 dumped lanes. + The probe's fragment layout (family-probe.cu `warp_ref`, mm8) was used as written and needed no correction. +- Verifier cost of the block on the box's core: about 1.1 us per mm8 step per unit (32 lanes x 32 byte products, + naive loops), so +1.14 ms per unit at R = 128 and +4.39 ms per unit at R = 512. Against the project's Rust verifier + at 2.06 ms per unit, R = 512 would roughly triple verification time unless the block is vectorised (the 8 x 8 x 16 + tile is 1,024 MACs, a few hundred ns with SIMD, approximate); R = 32 adds 0.17 ms per unit (+8 % of 2.06 ms) and + R = 128 adds 1.14 ms (+55 %). The totals in the table (about 10 ms per unit) are this naive interpreter's cost + with a lazy mh_word per load and are not comparable to the Rust verifier; the delta column is the number to use. +- The reference-path build is only a correctness oracle: fully unrolled it reaches 213 registers at R = 512 (8 blocks + per SM) and was never timed. + +## Raw outputs + +`out/` holds everything the box produced: `run.log` (the whole run), `bench_R.log` and `bench_R_ref.log`, +`power_R.csv` (1 Hz: W, SM MHz, C, util, timestamp), `power_idle.csv`, `ptxas_R.txt` and `ptxas_R_ref.txt`, +`dump_R.txt` (32 warps, 1,024 lanes), `verify_R.log`, `results.md` (summarise.py). + +## What was cut + +Nothing from the brief. The host 1 GiB dataset was never built on the CPU (lazy `mh_word`, as allowed). The 32-lane +dump bases are 32-bit, so base + 31 cannot overflow (base = low32(next()) & ~31). diff --git a/proto-newpow/mma-shadow/bench.cu b/proto-newpow/mma-shadow/bench.cu new file mode 100644 index 000000000..ae0c87b4f --- /dev/null +++ b/proto-newpow/mma-shadow/bench.cu @@ -0,0 +1,308 @@ +// bench.cu (proto-newpow/mma-shadow): host harness for the mx8+mm8xR prototype, derived from proto-cuda/host.cu +// with serve mode stripped. TEST HARNESS ONLY: no pool, no network, no wallet. +// +// Build: nvcc -O3 -std=c++17 -arch=sm_89 -DIGNEUM_MM8_R= [-DIGNEUM_MM8_REF] -o bench_ bench.cu kernel_mm8.cu +// Steps: device info, kernel registers and occupancy, GPU cache fill + host cache fill + check (FNV, head, last), +// GPU dataset build + self-test (head, [MASK], 64 random points vs host mh_word, Mac samples), the pack's 3 vector warps +// (R == 0 only; they must PASS), the 2^24 batch fingerprint at base nonce 0 (FNV-1a 64 over the output bytes), timing +// (1 warm-up + N timed batches with CUDA events), an optional sustain phase for the power meter, and --dump. +#include +#include +#include +#include +#include +#include +#include +#include +#include "program.h" +#include "vectors.h" +#include "memhard.h" +#include "mm8_block.h" +#ifndef IGNEUM_MM8_R +#define IGNEUM_MM8_R 0 +#endif + +#define CUDA_CHECK(call) do { cudaError_t err_ = (call); if (err_ != cudaSuccess) { \ + std::fprintf(stderr, "CUDA error: %s (%d)\n at %s:%d\n in %s\n", cudaGetErrorString(err_), (int)err_, __FILE__, __LINE__, #call); \ + std::exit(2); } } while (0) + +static double wallMs() { + using namespace std::chrono; + return duration(steady_clock::now().time_since_epoch()).count(); +} +static double epochS() { + using namespace std::chrono; + return duration(system_clock::now().time_since_epoch()).count(); +} +static uint64_t fnv1a64(const void* p, size_t n) { + const uint8_t* b = (const uint8_t*)p; + uint64_t h = 0xcbf29ce484222325ull; + for (size_t i = 0; i < n; ++i) { h ^= b[i]; h *= 0x100000001b3ull; } + return h; +} +static uint64_t splitmix64(uint64_t& s) { + s += 0x9E3779B97F4A7C15ull; + uint64_t z = s; + z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ull; + z = (z ^ (z >> 27)) * 0x94D049BB133111EBull; + return z ^ (z >> 31); +} + +static const uint32_t CACHE_WORDS = 1u << IGNEUM_CACHE_LOG2_WORDS; +static uint32_t* gCache = nullptr; +static std::vector hCache; + +static bool setupCache(bool hostFill) { + size_t bytes = (size_t)CACHE_WORDS * 4u; + CUDA_CHECK(cudaMalloc((void**)&gCache, bytes)); + cudaEvent_t e0, e1; + CUDA_CHECK(cudaEventCreate(&e0)); CUDA_CHECK(cudaEventCreate(&e1)); + float ms[2] = {0.f, 0.f}; + for (int pass = 0; pass < 2; ++pass) { + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(igneum_launch_cache_fill(gCache, IGNEUM_CACHE_SEGMENTS)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + CUDA_CHECK(cudaEventElapsedTime(&ms[pass], e0, e1)); + } + std::printf("cache fill (GPU): %.2f ms first, %.2f ms second (%u MiB)\n", ms[0], ms[1], (unsigned)(bytes >> 20)); + std::vector dev(CACHE_WORDS); + CUDA_CHECK(cudaMemcpy(dev.data(), gCache, bytes, cudaMemcpyDeviceToHost)); + uint64_t fnvDev = fnv1a64(dev.data(), bytes); + bool fnvOk = fnvDev == IGNEUM_CACHE_FNV64; + bool headOk = std::memcmp(dev.data(), IGNEUM_CACHE_HEAD, 64) == 0; + bool lastOk = std::memcmp(dev.data() + CACHE_WORDS - 16u, IGNEUM_CACHE_LAST, 64) == 0; + bool same = true; + double hostMs = 0; + if (hostFill) { + hCache.assign(CACHE_WORDS, 0u); + double h0 = wallMs(); + for (uint32_t seg = 0; seg < IGNEUM_CACHE_SEGMENTS; ++seg) mh_cache_segment(hCache.data(), seg); + hostMs = wallMs() - h0; + same = std::memcmp(dev.data(), hCache.data(), bytes) == 0; + std::printf("cache fill (host, one thread): %.1f ms, GPU == host all words: %s\n", hostMs, same ? "PASS" : "FAIL"); + } else { + hCache.swap(dev); // the device cache (FNV-checked) serves the host-side dataset derivation + } + bool pass = fnvOk && headOk && lastOk && same; + std::printf("cache check: %s (device FNV-1a 64 %016llx vs Mac %016llx %s, head %s, last line %s)\n", + pass ? "PASS" : "FAIL", (unsigned long long)fnvDev, (unsigned long long)IGNEUM_CACHE_FNV64, + fnvOk ? "PASS" : "FAIL", headOk ? "PASS" : "FAIL", lastOk ? "PASS" : "FAIL"); + CUDA_CHECK(cudaEventDestroy(e0)); CUDA_CHECK(cudaEventDestroy(e1)); + return pass; +} + +static bool compareWarp(const uint64_t* got, const uint64_t* want, uint32_t base, const char* how) { + int bad = 0, first = -1; + for (int l = 0; l < 32; ++l) if (got[l] != want[l]) { if (first < 0) first = l; ++bad; } + if (bad == 0) std::printf("verify warp base %u %s: PASS\n", base, how); + else std::printf("verify warp base %u %s: FAIL %d of 32 lanes differ, first lane %d: gpu=%016llx expected=%016llx\n", + base, how, bad, first, (unsigned long long)got[first], (unsigned long long)want[first]); + return bad == 0; +} + +static void usage() { + std::printf("bench_R [--batches 10] [--block-warps 1] [--batch-log2 24] [--fingerprint-only] [--sustain S] [--no-host-cache]\n" + " [--dump ] [--device 0]\n" + " --fingerprint-only skip the timed batches (for the reference build)\n" + " --sustain S after the timed batches keep launching batches for S seconds (power meter window)\n" + " --dump file n write n whole warps at SplitMix64(0x1234) 32-aligned bases as lines: base lane value_hex\n" + " --no-host-cache skip the one-thread host cache fill (the FNV-checked device cache then feeds the host derivation)\n"); +} + +int main(int argc, char** argv) { + int batches = 10, blockWarps = 1, batchLog2 = 24, device = 0, dumpN = 0; + double sustain = 0; + bool fpOnly = false, hostCache = true; + std::string dumpFile; + for (int i = 1; i < argc; ++i) { + std::string a = argv[i]; + auto nextInt = [&](int& dst) { if (i + 1 >= argc) { usage(); std::exit(2); } dst = std::atoi(argv[++i]); }; + if (a == "--batches") nextInt(batches); + else if (a == "--block-warps") nextInt(blockWarps); + else if (a == "--batch-log2") nextInt(batchLog2); + else if (a == "--device") nextInt(device); + else if (a == "--fingerprint-only") fpOnly = true; + else if (a == "--no-host-cache") hostCache = false; + else if (a == "--sustain") { if (i + 1 >= argc) { usage(); return 2; } sustain = std::atof(argv[++i]); } + else if (a == "--dump") { if (i + 2 >= argc) { usage(); return 2; } dumpFile = argv[++i]; dumpN = std::atoi(argv[++i]); } + else if (a == "-h" || a == "--help") { usage(); return 0; } + else { std::printf("unknown argument %s\n", argv[i]); usage(); return 2; } + } + if (blockWarps < 1 || blockWarps > 32 || batchLog2 < 10 || batchLog2 > 28 || batches < 1) { usage(); return 2; } + + std::printf("mma-shadow bench pack \"%s\" class mx8+mm8xR R = %d mm8 per hash = %d path = %s\n", + IGNEUM_SEED_STRING, IGNEUM_MM8_R, 8 * IGNEUM_MM8_R, +#ifdef IGNEUM_MM8_REF + "reference (shuffles + byte products)" +#else + "PTX mma.sync.m8n8k16.u8" +#endif + ); + std::printf("mm8 table seed 0x%016llx (first steps: %s)\n", (unsigned long long)IGNEUM_MM8_SEED, "see mm8_block.h"); + + int count = 0; + CUDA_CHECK(cudaGetDeviceCount(&count)); + if (count == 0 || device >= count) { std::printf("FAIL: no CUDA device %d\n", device); return 2; } + CUDA_CHECK(cudaSetDevice(device)); + cudaDeviceProp prop; std::memset(&prop, 0, sizeof(prop)); + CUDA_CHECK(cudaGetDeviceProperties(&prop, device)); + int drv = 0, rt = 0; CUDA_CHECK(cudaDriverGetVersion(&drv)); CUDA_CHECK(cudaRuntimeGetVersion(&rt)); + int clk = 0, memclk = 0, bus = 0, l2 = 0, thrSM = 0; + cudaDeviceGetAttribute(&clk, cudaDevAttrClockRate, device); + cudaDeviceGetAttribute(&memclk, cudaDevAttrMemoryClockRate, device); + cudaDeviceGetAttribute(&bus, cudaDevAttrGlobalMemoryBusWidth, device); + cudaDeviceGetAttribute(&l2, cudaDevAttrL2CacheSize, device); + cudaDeviceGetAttribute(&thrSM, cudaDevAttrMaxThreadsPerMultiProcessor, device); + cudaGetLastError(); + std::printf("GPU: %s (%d SMs, cc %d.%d, %.0f MiB) SM clock %d MHz, mem clock %d MHz, bus %d bits, L2 %d MiB, max %d threads/SM\n", + prop.name, prop.multiProcessorCount, prop.major, prop.minor, (double)prop.totalGlobalMem / 1048576.0, + clk / 1000, memclk / 1000, bus, l2 / 1048576, thrSM); + std::printf("CUDA: driver %d.%d, runtime %d.%d\n", drv / 1000, (drv % 100) / 10, rt / 1000, (rt % 100) / 10); + int regs = 0, blocksPerSM = 0; + CUDA_CHECK(igneum_hash_info(®s, &blocksPerSM, (uint32_t)blockWarps)); + std::printf("igneum_hash_info: %d registers/thread, %d resident blocks/SM at %d warp(s)/block = %d resident warps/SM (%.1f%% of %d)\n", + regs, blocksPerSM, blockWarps, blocksPerSM * blockWarps, 100.0 * blocksPerSM * blockWarps * 32 / thrSM, thrSM / 32); + + bool cachePass = setupCache(hostCache); + + uint32_t nonces = 1u << batchLog2; + uint32_t mask = IGNEUM_MASK; + uint64_t dsBytes = (uint64_t)(mask + 1u) * 4ull; + uint32_t* dDs = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dDs, (size_t)dsBytes)); + uint64_t* dOut = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dOut, (size_t)nonces * sizeof(uint64_t))); + cudaEvent_t e0, e1; + CUDA_CHECK(cudaEventCreate(&e0)); CUDA_CHECK(cudaEventCreate(&e1)); + float buildMs[2] = {0.f, 0.f}; + for (int pass = 0; pass < 2; ++pass) { + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(igneum_launch_build(dDs, gCache, (mask + 1u) / 16u)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + CUDA_CHECK(cudaEventElapsedTime(&buildMs[pass], e0, e1)); + } + std::printf("dataset build (GPU, %llu MiB): %.2f ms first, %.2f ms second\n", (unsigned long long)(dsBytes >> 20), buildMs[0], buildMs[1]); + + // Dataset self-test + bool dsPass; + { + uint32_t head[16]; + CUDA_CHECK(cudaMemcpy(head, dDs, sizeof(head), cudaMemcpyDeviceToHost)); + int badHead = 0; + for (int i = 0; i < 16; ++i) if (head[i] != IGNEUM_DS_HEAD[i]) { if (!badHead) std::printf(" dataset[%d] = %08x, Mac %08x\n", i, head[i], IGNEUM_DS_HEAD[i]); ++badHead; } + uint32_t last = 0; + CUDA_CHECK(cudaMemcpy(&last, dDs + IGNEUM_DS_LAST_INDEX, 4, cudaMemcpyDeviceToHost)); + bool lastOk = last == IGNEUM_DS_LAST; + int badRnd = 0; + uint64_t s = 0x9E3779B97F4A7C15ull ^ (uint64_t)(mask + 1u); + for (int k = 0; k < 64; ++k) { + uint32_t idx = (uint32_t)splitmix64(s) & mask, v = 0; + CUDA_CHECK(cudaMemcpy(&v, dDs + idx, 4, cudaMemcpyDeviceToHost)); + uint32_t want = mh_word(hCache.data(), idx); + if (v != want) { if (!badRnd) std::printf(" dataset[%u] = %08x, host derivation %08x\n", idx, v, want); ++badRnd; } + } + int badSample = 0; + for (int k = 0; k < IGNEUM_DS_SAMPLES; ++k) { + uint32_t v = 0; + CUDA_CHECK(cudaMemcpy(&v, dDs + IGNEUM_DS_SAMPLE_INDEX[k], 4, cudaMemcpyDeviceToHost)); + if (v != IGNEUM_DS_SAMPLE_VALUE[k]) { if (!badSample) std::printf(" dataset[%u] = %08x, Mac %08x\n", IGNEUM_DS_SAMPLE_INDEX[k], v, IGNEUM_DS_SAMPLE_VALUE[k]); ++badSample; } + } + dsPass = badHead == 0 && lastOk && badRnd == 0 && badSample == 0; + std::printf("dataset self-test: %s (head 16 %s, [MASK] %s, 64 random points vs host derivation %s, %d Mac samples %s)\n", + dsPass ? "PASS" : "FAIL", badHead == 0 ? "PASS" : "FAIL", lastOk ? "PASS" : "FAIL", + badRnd == 0 ? "PASS" : "FAIL", (int)IGNEUM_DS_SAMPLES, badSample == 0 ? "PASS" : "FAIL"); + } + + // Pack vectors (R == 0 only: at R > 0 the function is different by design) + bool vecPass = true; + uint64_t got[32]; + if (IGNEUM_MM8_R == 0) { + for (int w = 0; w < IGNEUM_VEC_WARPS; ++w) { + CUDA_CHECK(igneum_launch_hash(dDs, dOut, IGNEUM_VEC_BASE[w], mask, 32u, 1u)); + CUDA_CHECK(cudaDeviceSynchronize()); + CUDA_CHECK(cudaMemcpy(got, dOut, sizeof(got), cudaMemcpyDeviceToHost)); + vecPass = compareWarp(got, IGNEUM_VEC_OUT[w], IGNEUM_VEC_BASE[w], "(pack vector, standalone)") && vecPass; + } + } else { + std::printf("pack vectors: not applicable at R = %d (checked at R = 0 only)\n", IGNEUM_MM8_R); + } + + // Warm-up batch at base 0 = the fingerprint batch + double w0 = wallMs(); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, 0u, mask, nonces, (uint32_t)blockWarps)); + CUDA_CHECK(cudaDeviceSynchronize()); + double w1 = wallMs(); + std::vector hOut(nonces); + CUDA_CHECK(cudaMemcpy(hOut.data(), dOut, (size_t)nonces * 8u, cudaMemcpyDeviceToHost)); + uint64_t fp = fnv1a64(hOut.data(), (size_t)nonces * 8u); + std::printf("warm-up batch: %u hashes in %.2f ms wall\n", nonces, w1 - w0); + std::printf("fingerprint: %016llx (FNV-1a 64 over the 2^%d outputs at base nonce 0, little-endian u64 bytes)%s\n", + (unsigned long long)fp, batchLog2, + IGNEUM_MM8_R == 0 ? (fp == 0x7c28cfb06c5c65a9ull ? " == 7c28cfb06c5c65a9 PASS" : " != 7c28cfb06c5c65a9 FAIL") : ""); + bool fpPass = (IGNEUM_MM8_R != 0) || fp == 0x7c28cfb06c5c65a9ull; + if (IGNEUM_MM8_R == 0 && batchLog2 >= 20) { + for (int w = 0; w < IGNEUM_VEC_WARPS; ++w) { + if ((uint64_t)IGNEUM_VEC_BASE[w] + 32ull > nonces) continue; + vecPass = compareWarp(hOut.data() + IGNEUM_VEC_BASE[w], IGNEUM_VEC_OUT[w], IGNEUM_VEC_BASE[w], "(pack vector, in batch)") && vecPass; + } + } + + double mhs = 0, mhsWall = 0, mhsSustain = 0; + if (!fpOnly) { + CUDA_CHECK(cudaEventRecord(e0)); + double t0 = wallMs(); + for (int b = 1; b <= batches; ++b) { + uint32_t base = (uint32_t)((uint64_t)b * (uint64_t)nonces); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, base, mask, nonces, (uint32_t)blockWarps)); + } + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + double t1 = wallMs(); + float gpuMs = 0.f; + CUDA_CHECK(cudaEventElapsedTime(&gpuMs, e0, e1)); + double total = (double)nonces * batches; + mhs = total / (gpuMs / 1000.0) / 1e6; + mhsWall = total / ((t1 - t0) / 1000.0) / 1e6; + std::printf("timed: %d batches x %u hashes: GPU %.2f ms -> %.3f MH/s (GPU time), wall %.2f ms -> %.3f MH/s\n", + batches, nonces, gpuMs, mhs, t1 - t0, mhsWall); + if (sustain > 0) { + double s0 = epochS(), sw0 = wallMs(); + long long n = 0; + std::printf("sustain start epoch %.3f\n", s0); std::fflush(stdout); + while (wallMs() - sw0 < sustain * 1000.0) { + uint32_t base = (uint32_t)((uint64_t)(n + batches + 1) * (uint64_t)nonces); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, base, mask, nonces, (uint32_t)blockWarps)); + CUDA_CHECK(cudaDeviceSynchronize()); + ++n; + } + double s1 = epochS(); + mhsSustain = (double)n * nonces / (s1 - s0) / 1e6; + std::printf("sustain end epoch %.3f: %lld batches in %.2f s -> %.3f MH/s (wall, incl. sync)\n", s1, n, s1 - s0, mhsSustain); + } + } + + if (dumpN > 0) { + FILE* f = std::fopen(dumpFile.c_str(), "w"); + if (!f) { std::printf("FAIL: cannot open %s\n", dumpFile.c_str()); return 2; } + uint64_t s = 0x1234ull; + for (int i = 0; i < dumpN; ++i) { + uint32_t base = (uint32_t)splitmix64(s) & ~31u; + CUDA_CHECK(igneum_launch_hash(dDs, dOut, base, mask, 32u, 1u)); + CUDA_CHECK(cudaDeviceSynchronize()); + CUDA_CHECK(cudaMemcpy(got, dOut, sizeof(got), cudaMemcpyDeviceToHost)); + for (int l = 0; l < 32; ++l) std::fprintf(f, "%u %d %016llx\n", base, l, (unsigned long long)got[l]); + } + std::fclose(f); + std::printf("dump: %d warps (%d lanes) written to %s\n", dumpN, 32 * dumpN, dumpFile.c_str()); + } + + bool overall = cachePass && dsPass && vecPass && fpPass; + std::printf("SUMMARY R=%d regs=%d blocksPerSM=%d mhs=%.3f mhs_wall=%.3f mhs_sustain=%.3f fingerprint=%016llx cache=%s dataset=%s vectors=%s\n", + IGNEUM_MM8_R, regs, blocksPerSM, mhs, mhsWall, mhsSustain, (unsigned long long)fp, + cachePass ? "PASS" : "FAIL", dsPass ? "PASS" : "FAIL", IGNEUM_MM8_R == 0 ? (vecPass ? "PASS" : "FAIL") : "n/a"); + std::printf("OVERALL: %s\n", overall ? "PASS" : "FAIL"); + CUDA_CHECK(cudaFree(dOut)); CUDA_CHECK(cudaFree(dDs)); CUDA_CHECK(cudaFree(gCache)); + return overall ? 0 : 1; +} diff --git a/proto-newpow/mma-shadow/gen_block.py b/proto-newpow/mma-shadow/gen_block.py new file mode 100644 index 000000000..57369d54d --- /dev/null +++ b/proto-newpow/mma-shadow/gen_block.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# gen_block.py: draws the mm8 block table for the mx8+mm8xR prototype and writes mm8_block.h. +# Stream: SplitMix64 seeded with FNV-1a-64 of the bytes "igneum-mm8/igneum-genesis". +# Per step k: a = below(8); b = below(7), b += (b >= a); c = below(8); c2 = below(7), c2 += (c2 >= c). +# Step semantics: r[c] += C[l >> 2][2 * (l & 3)] (PTX d0), r[c2] += C[l >> 2][2 * (l & 3) + 1] (PTX d1), both mod 2^32. +import sys + +MASK64 = (1 << 64) - 1 +R_MAX = 512 + +def fnv1a64(data: bytes) -> int: + h = 0xcbf29ce484222325 + for byte in data: + h ^= byte + h = (h * 0x100000001b3) & MASK64 + return h + +class SplitMix64: + def __init__(self, seed: int): + self.s = seed & MASK64 + def next(self) -> int: + self.s = (self.s + 0x9E3779B97F4A7C15) & MASK64 + z = self.s + z = ((z ^ (z >> 30)) * 0xBF58476D1CE4E5B9) & MASK64 + z = ((z ^ (z >> 27)) * 0x94D049BB133111EB) & MASK64 + return z ^ (z >> 31) + def below(self, n: int) -> int: + return self.next() % n + +def main(): + seed_text = b"igneum-mm8/igneum-genesis" + seed = fnv1a64(seed_text) + rng = SplitMix64(seed) + rows = [] + for k in range(R_MAX): + a = rng.below(8) + b = rng.below(7) + b += 1 if b >= a else 0 + c = rng.below(8) + c2 = rng.below(7) + c2 += 1 if c2 >= c else 0 + assert a != b and 0 <= b < 8 and c != c2 and 0 <= c2 < 8 + rows.append((a, b, c, c2)) + out = [] + out.append("// Generated by gen_block.py. mm8 block draws for class mx8+mm8xR, seed text \"%s\"," % seed_text.decode()) + out.append("// FNV-1a-64 seed 0x%016x, SplitMix64 stream. Step k uses (a, b, c, c2) = row k: r[c] += d0, r[c2] += d1. Do not edit by hand." % seed) + out.append("#pragma once") + out.append("#ifdef __cplusplus") + out.append("#include ") + out.append("#else") + out.append("#include ") + out.append("#endif") + out.append("#define IGNEUM_MM8_R_MAX %d" % R_MAX) + out.append("#define IGNEUM_MM8_SEED 0x%016xull" % seed) + out.append("// Packed uint16: a = v & 7, b = (v >> 3) & 7, c = (v >> 6) & 7, c2 = (v >> 9) & 7.") + out.append("#define IGNEUM_MM8_TABLE_INIT { \\") + for i in range(0, R_MAX, 16): + chunk = rows[i:i+16] + vals = ["0x%03xu" % (a | (b << 3) | (c << 6) | (c2 << 9)) for (a, b, c, c2) in chunk] + out.append(" " + ", ".join(vals) + (", \\" if i + 16 < R_MAX else " }")) + out.append("// X-macro list: X(k, a, b, c, c2) for every step k in 0..R_MAX-1. The kernel guards each with k < IGNEUM_MM8_R,") + out.append("// so the register indices are compile-time constants (r[] stays in registers, no local memory).") + out.append("#define IGNEUM_MM8_STEPS(X) \\") + for k, (a, b, c, c2) in enumerate(rows): + out.append(" X(%d, %d, %d, %d, %d)%s" % (k, a, b, c, c2, " \\" if k + 1 < R_MAX else "")) + out.append("// Readable form, step: a b c c2") + for k, (a, b, c, c2) in enumerate(rows): + out.append("// %3d: %d %d %d %d" % (k, a, b, c, c2)) + path = sys.argv[1] if len(sys.argv) > 1 else "mm8_block.h" + with open(path, "w") as f: + f.write("\n".join(out) + "\n") + print("seed 0x%016x, %d steps, first 4: %s -> %s" % (seed, R_MAX, rows[:4], path)) + +if __name__ == "__main__": + main() diff --git a/proto-newpow/mma-shadow/gen_ref_program.py b/proto-newpow/mma-shadow/gen_ref_program.py new file mode 100644 index 000000000..fba564256 --- /dev/null +++ b/proto-newpow/mma-shadow/gen_ref_program.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# gen_ref_program.py: turns the 64 instruction lines of the pack's kernel.cu into a 32-lane C interpreter body +# (ref_program.inc, included by verify_ref.c). Register-major: R[8][32]. A shuffle copies its source register +# into T before the lane loop and reads T[l ^ mask]. Loads become mh_word(cache, x & mask) (lazy dataset). +import re, sys +src = open(sys.argv[1] if len(sys.argv) > 1 else "kernel.cu").read().split("\n") +lines = [l for l in src if re.search(r"//\s*\d+ (mad|xor|load|shfl|mulhi|rotr|or|add|sub|mul|rotl)\s*$", l)] +assert len(lines) == 64, len(lines) +out = ["// Generated by gen_ref_program.py from the pack's kernel.cu. Do not edit by hand.", + "// Expects: uint32_t R[8][32], T[32], SEL[32]; const uint32_t* cache; uint32_t mask; macro L = for (int l = 0; l < 32; ++l)."] +for i, l in enumerate(lines): + body, comment = l.strip().rsplit("//", 1) + body = body.strip() + m = re.search(r"__shfl_xor_sync\(0xffffffffu, r(\d), (\d+)\)", body) + if m: + out.append(" memcpy(T, R[%s], sizeof T);" % m.group(1)) + body = body.replace(m.group(0), "T[l ^ %s]" % m.group(2)) + body = re.sub(r"ds\[(r\d) & mask\]", r"mh_word(cache, \1 & mask)", body) + body = re.sub(r"\br([0-7])\b", r"R[\1][l]", body) + body = body.replace("__umulhi(", "umulhi(").replace("sel ", "SEL[l] ") + out.append(" L { %s } //%s" % (body, comment)) +open("ref_program.inc", "w").write("\n".join(out) + "\n") +print("wrote ref_program.inc with %d instructions" % len(lines)) diff --git a/proto-newpow/mma-shadow/kernel.cu b/proto-newpow/mma-shadow/kernel.cu new file mode 100644 index 000000000..e22472314 --- /dev/null +++ b/proto-newpow/mma-shadow/kernel.cu @@ -0,0 +1,164 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Bit-exact twin of the Metal kernel for the same seed (see proto-cuda/CHECKLIST.md and program.metal). +// Compiled ahead of time by nvcc together with proto-cuda/host.cu. No NVRTC. +#include +#include +#include "program.h" +#include "memhard.h" + +__device__ __forceinline__ uint32_t splitmix32(uint32_t x) { + x ^= x >> 16; x *= 0x7feb352du; + x ^= x >> 15; x *= 0x846ca68bu; + x ^= x >> 16; + return x; +} +// n is a literal in 1..31 at every call site, so both shift amounts are in 1..31. +__device__ __forceinline__ uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +// n is masked to 0..31; the second shift amount is masked too, so n == 0 gives x. +__device__ __forceinline__ uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +__device__ __forceinline__ uint32_t ds_elem(uint32_t i, uint32_t d0, uint32_t d1) { + uint32_t x = i ^ d0; + x *= 0x9E3779B1u; x ^= x >> 15; + x += d1; + x *= 0x85EBCA77u; x ^= x >> 13; + x *= 0xC2B2AE3Du; x ^= x >> 16; + return x; +} + +// Memory-hard dataset (MEMHARD.md). One thread per cache segment; one thread per 64-byte dataset item. +// The core functions (mh_cache_segment, mh_item) are in memhard.h and are also compiled for the host. +__global__ void igneum_cache_fill(uint32_t* cache, uint32_t nSegments) { + uint32_t seg = blockIdx.x * blockDim.x + threadIdx.x; + if (seg < nSegments) mh_cache_segment(cache, seg); +} +__global__ void igneum_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + uint32_t t = blockIdx.x * blockDim.x + threadIdx.x; + if (t < nItems) { + uint32_t s[16]; + mh_item(cache, t, s); + uint32_t* d = ds + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i]; + } +} + +// One hash per thread. blockDim.x is a multiple of 32; lane = threadIdx.x & 31 and every +// __shfl_xor_sync stays inside the lane's own warp, exactly like simd_shuffle_xor inside a +// 32-wide Metal SIMD group. Control flow is uniform, so the full 0xffffffff member mask is valid. +__global__ void igneum_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask) { + uint32_t gid = blockIdx.x * blockDim.x + threadIdx.x; + uint32_t nonce = baseNonce + gid; + uint32_t r0, r1, r2, r3, r4, r5, r6, r7; + { uint32_t x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r0 = x ^ 0x1a155b25u; } // SEEDW[0], 0x9e3779b9u * 1u, SEEDW[1] + { uint32_t x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r1 = x ^ 0xfddfb732u; } // SEEDW[1], 0x9e3779b9u * 2u, SEEDW[2] + { uint32_t x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r2 = x ^ 0x4b5af2e8u; } // SEEDW[2], 0x9e3779b9u * 3u, SEEDW[3] + { uint32_t x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r3 = x ^ 0xc55caf33u; } // SEEDW[3], 0x9e3779b9u * 4u, SEEDW[4] + { uint32_t x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r4 = x ^ 0xa27c13b7u; } // SEEDW[4], 0x9e3779b9u * 5u, SEEDW[5] + { uint32_t x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r5 = x ^ 0x06628a48u; } // SEEDW[5], 0x9e3779b9u * 6u, SEEDW[6] + { uint32_t x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r6 = x ^ 0x03852469u; } // SEEDW[6], 0x9e3779b9u * 7u, SEEDW[7] + { uint32_t x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r7 = x ^ 0x67a9a7beu; } // SEEDW[7], 0x9e3779b9u * 8u, SEEDW[0] + + for (uint32_t it = 0u; it < 8u; ++it) { + uint32_t sel = r0; + r2 = r3 * r4 + r2; // 0 mad + r2 = r1 * r1 + r2; // 1 mad + r2 = r3 * r2 + r2; // 2 mad + r3 = r3 ^ r5; // 3 xor + r7 = r7 ^ ds[r2 & mask]; // 4 load + r5 = r5 ^ ds[r7 & mask]; // 5 load + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r4, 8); // 6 shfl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // 7 shfl + r1 = __umulhi(r1, r5); // 8 mulhi + r6 = rotr_var(r6, r3); // 9 rotr + r3 = r3 | r4; // 10 or + r4 = r4 ^ ds[r3 & mask]; // 11 load + r0 = __umulhi(r0, r4); // 12 mulhi + r5 = r5 + r1 + ((((sel >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); // 13 add + r0 = r0 ^ ds[r4 & mask]; // 14 load + r2 = r2 - r4; // 15 sub + r2 = r2 ^ ds[r0 & mask]; // 16 load + r7 = r7 ^ ds[r2 & mask]; // 17 load + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // 18 shfl + r5 = r5 * r0; // 19 mul + r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // 20 shfl + r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // 21 shfl + r6 = __umulhi(r6, r2); // 22 mulhi + r6 = r6 ^ ds[r1 & mask]; // 23 load + r5 = r5 * r0; // 24 mul + r5 = rotl_imm(r5, 19u); // 25 rotl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r6, 2); // 26 shfl + r0 = r0 ^ r5; // 27 xor + r0 = r0 ^ r4; // 28 xor + r3 = r3 - r0; // 29 sub + r5 = r5 * r1; // 30 mul + r7 = r7 ^ ds[r2 & mask]; // 31 load + r1 = r1 ^ ds[r0 & mask]; // 32 load + r5 = r5 ^ r6; // 33 xor + r5 = r5 ^ ds[r1 & mask]; // 34 load + r0 = __umulhi(r0, r5); // 35 mulhi + r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // 36 shfl + r7 = r7 ^ ds[r0 & mask]; // 37 load + r3 = r3 + r1 + ((((sel >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); // 38 add + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // 39 shfl + r2 = r2 ^ r5; // 40 xor + r3 = r6 * r3 + r3; // 41 mad + r6 = r6 - r7; // 42 sub + r7 = r7 ^ r0; // 43 xor + r1 = r1 ^ ds[r7 & mask]; // 44 load + r2 = r2 * r3; // 45 mul + r1 = __umulhi(r1, r5); // 46 mulhi + r4 = r4 - r3; // 47 sub + r2 = rotr_var(r2, r6); // 48 rotr + r3 = r3 ^ ds[r5 & mask]; // 49 load + r1 = r1 + r5 + ((((sel >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); // 50 add + r0 = r0 * r2; // 51 mul + r0 = r0 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); // 52 add + r1 = r1 + r0 + ((((sel >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); // 53 add + r7 = rotl_imm(r7, 14u); // 54 rotl + r3 = r3 + r7 + ((((sel >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); // 55 add + r6 = r6 ^ ds[r7 & mask]; // 56 load + r1 = rotr_var(r1, r5); // 57 rotr + r5 = r5 ^ ds[r4 & mask]; // 58 load + r6 = r6 ^ ds[r2 & mask]; // 59 load + r3 = r5 * r0 + r3; // 60 mad + r5 = r5 + r7 + ((((sel >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); // 61 add + r4 = r4 + r6 + ((((sel >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); // 62 add + r5 = rotl_imm(r5, 19u); // 63 rotl + } + uint32_t lo = r0 ^ rotl_imm(r1, 7u) ^ rotl_imm(r2, 14u) ^ rotl_imm(r3, 21u); + uint32_t hi = r4 ^ rotl_imm(r5, 9u) ^ rotl_imm(r6, 18u) ^ rotl_imm(r7, 27u); + out[gid] = ((uint64_t)hi << 32) | (uint64_t)lo; +} + +// Host-side launch wrappers. Declared in program.h, called from host.cu. +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments) { + if (nSegments == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nSegments + block - 1u) / block; + igneum_cache_fill<<>>(cache, nSegments); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_build<<>>(ds, cache, nItems); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps) { + if (blockWarps == 0u || blockWarps > 32u) return cudaErrorInvalidValue; + uint32_t block = 32u * blockWarps; + if (nonces == 0u || (nonces % block) != 0u) return cudaErrorInvalidValue; + igneum_hash<<>>(ds, out, baseNonce, mask); + return cudaGetLastError(); +} + +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps) { + cudaFuncAttributes attr; + cudaError_t e = cudaFuncGetAttributes(&attr, igneum_hash); + if (e != cudaSuccess) return e; + *numRegs = attr.numRegs; + return cudaOccupancyMaxActiveBlocksPerMultiprocessor(blocksPerSM, igneum_hash, (int)(32u * blockWarps), 0); +} diff --git a/proto-newpow/mma-shadow/kernel_mm8.cu b/proto-newpow/mma-shadow/kernel_mm8.cu new file mode 100644 index 000000000..90a976f7a --- /dev/null +++ b/proto-newpow/mma-shadow/kernel_mm8.cu @@ -0,0 +1,217 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Bit-exact twin of the Metal kernel for the same seed (see proto-cuda/CHECKLIST.md and program.metal). +// kernel_mm8.cu (proto-newpow/mma-shadow): the pack's kernel.cu with r0..r7 rewritten as uint32_t r[8] (same arithmetic) +// and a block of IGNEUM_MM8_R mm8 steps at the end of every iteration (class "mx8+mm8xR"). IGNEUM_MM8_R 0 is the control +// and is bit-exact with the pack. Define IGNEUM_MM8_REF for the shuffle-and-byte-product reference path instead of the PTX mma. +// Step semantics (6 Oct 2026 correction): both tile outputs are consumed, r[c] += d0 and r[c2] += d1. +// Cache fill, dataset build and the launch wrappers are the pack's text, unchanged. +#include +#include +#include "program.h" +#include "memhard.h" +#include "mm8_block.h" +#ifndef IGNEUM_MM8_R +#define IGNEUM_MM8_R 0 +#endif +#if IGNEUM_MM8_R < 0 || IGNEUM_MM8_R > IGNEUM_MM8_R_MAX +#error "IGNEUM_MM8_R out of range" +#endif + +__device__ __forceinline__ uint32_t splitmix32(uint32_t x) { + x ^= x >> 16; x *= 0x7feb352du; + x ^= x >> 15; x *= 0x846ca68bu; + x ^= x >> 16; + return x; +} +// n is a literal in 1..31 at every call site, so both shift amounts are in 1..31. +__device__ __forceinline__ uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +// n is masked to 0..31; the second shift amount is masked too, so n == 0 gives x. +__device__ __forceinline__ uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +__device__ __forceinline__ uint32_t ds_elem(uint32_t i, uint32_t d0, uint32_t d1) { + uint32_t x = i ^ d0; + x *= 0x9E3779B1u; x ^= x >> 15; + x += d1; + x *= 0x85EBCA77u; x ^= x >> 13; + x *= 0xC2B2AE3Du; x ^= x >> 16; + return x; +} + +// Memory-hard dataset (MEMHARD.md). One thread per cache segment; one thread per 64-byte dataset item. +// The core functions (mh_cache_segment, mh_item) are in memhard.h and are also compiled for the host. +__global__ void igneum_cache_fill(uint32_t* cache, uint32_t nSegments) { + uint32_t seg = blockIdx.x * blockDim.x + threadIdx.x; + if (seg < nSegments) mh_cache_segment(cache, seg); +} +__global__ void igneum_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + uint32_t t = blockIdx.x * blockDim.x + threadIdx.x; + if (t < nItems) { + uint32_t s[16]; + mh_item(cache, t, s); + uint32_t* d = ds + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i]; + } +} + +// One hash per thread. blockDim.x is a multiple of 32; lane = threadIdx.x & 31 and every + +// One mm8 step. A = the 32 lanes' r[a] (8 x 16 u8, lane l holds A[l >> 2][4 * (l & 3) .. +3], byte 0 = lowest k), +// B = the 32 lanes' r[b] (16 x 8 u8, lane l holds B[4 * (l & 3) .. +3][l >> 2]). C = A * B exact in int32. +// Lane l adds C[l >> 2][2 * (l & 3)] into r[c] and C[l >> 2][2 * (l & 3) + 1] into r[c2], both modulo 2^32 (c != c2), +// so every step consumes both outputs of the tile. This is the PTX mma.m8n8k16 .u8 fragment layout (d0, d1), the same +// arithmetic as proto-cuda/family-probe.cu's mm8 warp_ref. +#ifdef IGNEUM_MM8_REF +// Reference path: gather A's row (l >> 2) and B's two columns 2 * (l & 3) and 2 * (l & 3) + 1 with 12 shuffles, +// then 32 byte products per lane in plain integer code. +__device__ __forceinline__ void mm8_pair(uint32_t av, uint32_t bv, uint32_t lane, uint32_t& d0, uint32_t& d1) { + uint32_t row = lane >> 2, col0 = 2u * (lane & 3u); + uint32_t acc0 = 0u, acc1 = 0u; + #pragma unroll + for (uint32_t j = 0u; j < 4u; ++j) { + uint32_t aw = __shfl_sync(0xffffffffu, av, (int)(4u * row + j)); + uint32_t bw0 = __shfl_sync(0xffffffffu, bv, (int)(4u * col0 + j)); + uint32_t bw1 = __shfl_sync(0xffffffffu, bv, (int)(4u * (col0 + 1u) + j)); + #pragma unroll + for (uint32_t t = 0u; t < 4u; ++t) { + uint32_t ab = (aw >> (8u * t)) & 0xffu; + acc0 += ab * ((bw0 >> (8u * t)) & 0xffu); + acc1 += ab * ((bw1 >> (8u * t)) & 0xffu); + } + } + d0 = acc0; d1 = acc1; +} +#else +// Native path: one tensor instruction with a zero accumulator, d0 and d1 straight out of the fragment. +__device__ __forceinline__ void mm8_pair(uint32_t av, uint32_t bv, uint32_t lane, uint32_t& d0, uint32_t& d1) { + (void)lane; + asm("mma.sync.aligned.m8n8k16.row.col.s32.u8.u8.s32 {%0,%1}, {%2}, {%3}, {%4,%5};" + : "=r"(d0), "=r"(d1) : "r"(av), "r"(bv), "r"(0u), "r"(0u)); +} +#endif +#define IGNEUM_MM8_STEP(k, a, b, c, c2) if ((k) < IGNEUM_MM8_R) { uint32_t d0_, d1_; mm8_pair(r[a], r[b], lane, d0_, d1_); r[c] += d0_; r[c2] += d1_; } + +// __shfl_xor_sync stays inside the lane's own warp, exactly like simd_shuffle_xor inside a +// 32-wide Metal SIMD group. Control flow is uniform, so the full 0xffffffff member mask is valid. +__global__ void igneum_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask) { + uint32_t gid = blockIdx.x * blockDim.x + threadIdx.x; + uint32_t nonce = baseNonce + gid; + uint32_t r[8]; + uint32_t lane = threadIdx.x & 31u; + (void)lane; + { uint32_t x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r[0] = x ^ 0x1a155b25u; } // SEEDW[0], 0x9e3779b9u * 1u, SEEDW[1] + { uint32_t x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r[1] = x ^ 0xfddfb732u; } // SEEDW[1], 0x9e3779b9u * 2u, SEEDW[2] + { uint32_t x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r[2] = x ^ 0x4b5af2e8u; } // SEEDW[2], 0x9e3779b9u * 3u, SEEDW[3] + { uint32_t x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r[3] = x ^ 0xc55caf33u; } // SEEDW[3], 0x9e3779b9u * 4u, SEEDW[4] + { uint32_t x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r[4] = x ^ 0xa27c13b7u; } // SEEDW[4], 0x9e3779b9u * 5u, SEEDW[5] + { uint32_t x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r[5] = x ^ 0x06628a48u; } // SEEDW[5], 0x9e3779b9u * 6u, SEEDW[6] + { uint32_t x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r[6] = x ^ 0x03852469u; } // SEEDW[6], 0x9e3779b9u * 7u, SEEDW[7] + { uint32_t x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r[7] = x ^ 0x67a9a7beu; } // SEEDW[7], 0x9e3779b9u * 8u, SEEDW[0] + + for (uint32_t it = 0u; it < 8u; ++it) { + uint32_t sel = r[0]; + r[2] = r[3] * r[4] + r[2]; // 0 mad + r[2] = r[1] * r[1] + r[2]; // 1 mad + r[2] = r[3] * r[2] + r[2]; // 2 mad + r[3] = r[3] ^ r[5]; // 3 xor + r[7] = r[7] ^ ds[r[2] & mask]; // 4 load + r[5] = r[5] ^ ds[r[7] & mask]; // 5 load + r[1] = r[1] ^ __shfl_xor_sync(0xffffffffu, r[4], 8); // 6 shfl + r[7] = r[7] ^ __shfl_xor_sync(0xffffffffu, r[3], 8); // 7 shfl + r[1] = __umulhi(r[1], r[5]); // 8 mulhi + r[6] = rotr_var(r[6], r[3]); // 9 rotr + r[3] = r[3] | r[4]; // 10 or + r[4] = r[4] ^ ds[r[3] & mask]; // 11 load + r[0] = __umulhi(r[0], r[4]); // 12 mulhi + r[5] = r[5] + r[1] + ((((sel >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); // 13 add + r[0] = r[0] ^ ds[r[4] & mask]; // 14 load + r[2] = r[2] - r[4]; // 15 sub + r[2] = r[2] ^ ds[r[0] & mask]; // 16 load + r[7] = r[7] ^ ds[r[2] & mask]; // 17 load + r[7] = r[7] ^ __shfl_xor_sync(0xffffffffu, r[3], 4); // 18 shfl + r[5] = r[5] * r[0]; // 19 mul + r[3] = r[3] ^ __shfl_xor_sync(0xffffffffu, r[4], 2); // 20 shfl + r[2] = r[2] ^ __shfl_xor_sync(0xffffffffu, r[4], 16); // 21 shfl + r[6] = __umulhi(r[6], r[2]); // 22 mulhi + r[6] = r[6] ^ ds[r[1] & mask]; // 23 load + r[5] = r[5] * r[0]; // 24 mul + r[5] = rotl_imm(r[5], 19u); // 25 rotl + r[7] = r[7] ^ __shfl_xor_sync(0xffffffffu, r[6], 2); // 26 shfl + r[0] = r[0] ^ r[5]; // 27 xor + r[0] = r[0] ^ r[4]; // 28 xor + r[3] = r[3] - r[0]; // 29 sub + r[5] = r[5] * r[1]; // 30 mul + r[7] = r[7] ^ ds[r[2] & mask]; // 31 load + r[1] = r[1] ^ ds[r[0] & mask]; // 32 load + r[5] = r[5] ^ r[6]; // 33 xor + r[5] = r[5] ^ ds[r[1] & mask]; // 34 load + r[0] = __umulhi(r[0], r[5]); // 35 mulhi + r[5] = r[5] ^ __shfl_xor_sync(0xffffffffu, r[2], 4); // 36 shfl + r[7] = r[7] ^ ds[r[0] & mask]; // 37 load + r[3] = r[3] + r[1] + ((((sel >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); // 38 add + r[1] = r[1] ^ __shfl_xor_sync(0xffffffffu, r[5], 4); // 39 shfl + r[2] = r[2] ^ r[5]; // 40 xor + r[3] = r[6] * r[3] + r[3]; // 41 mad + r[6] = r[6] - r[7]; // 42 sub + r[7] = r[7] ^ r[0]; // 43 xor + r[1] = r[1] ^ ds[r[7] & mask]; // 44 load + r[2] = r[2] * r[3]; // 45 mul + r[1] = __umulhi(r[1], r[5]); // 46 mulhi + r[4] = r[4] - r[3]; // 47 sub + r[2] = rotr_var(r[2], r[6]); // 48 rotr + r[3] = r[3] ^ ds[r[5] & mask]; // 49 load + r[1] = r[1] + r[5] + ((((sel >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); // 50 add + r[0] = r[0] * r[2]; // 51 mul + r[0] = r[0] + r[2] + ((((sel >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); // 52 add + r[1] = r[1] + r[0] + ((((sel >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); // 53 add + r[7] = rotl_imm(r[7], 14u); // 54 rotl + r[3] = r[3] + r[7] + ((((sel >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); // 55 add + r[6] = r[6] ^ ds[r[7] & mask]; // 56 load + r[1] = rotr_var(r[1], r[5]); // 57 rotr + r[5] = r[5] ^ ds[r[4] & mask]; // 58 load + r[6] = r[6] ^ ds[r[2] & mask]; // 59 load + r[3] = r[5] * r[0] + r[3]; // 60 mad + r[5] = r[5] + r[7] + ((((sel >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); // 61 add + r[4] = r[4] + r[6] + ((((sel >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); // 62 add + r[5] = rotl_imm(r[5], 19u); // 63 rotl +#if IGNEUM_MM8_R > 0 + // mm8 block: IGNEUM_MM8_R steps after instruction 63, before the next iteration samples sel. + IGNEUM_MM8_STEPS(IGNEUM_MM8_STEP) +#endif + } + uint32_t lo = r[0] ^ rotl_imm(r[1], 7u) ^ rotl_imm(r[2], 14u) ^ rotl_imm(r[3], 21u); + uint32_t hi = r[4] ^ rotl_imm(r[5], 9u) ^ rotl_imm(r[6], 18u) ^ rotl_imm(r[7], 27u); + out[gid] = ((uint64_t)hi << 32) | (uint64_t)lo; +} + +// Host-side launch wrappers. Declared in program.h, called from host.cu. +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments) { + if (nSegments == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nSegments + block - 1u) / block; + igneum_cache_fill<<>>(cache, nSegments); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_build<<>>(ds, cache, nItems); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps) { + if (blockWarps == 0u || blockWarps > 32u) return cudaErrorInvalidValue; + uint32_t block = 32u * blockWarps; + if (nonces == 0u || (nonces % block) != 0u) return cudaErrorInvalidValue; + igneum_hash<<>>(ds, out, baseNonce, mask); + return cudaGetLastError(); +} + +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps) { + cudaFuncAttributes attr; + cudaError_t e = cudaFuncGetAttributes(&attr, igneum_hash); + if (e != cudaSuccess) return e; + *numRegs = attr.numRegs; + return cudaOccupancyMaxActiveBlocksPerMultiprocessor(blocksPerSM, igneum_hash, (int)(32u * blockWarps), 0); +} diff --git a/proto-newpow/mma-shadow/memhard.h b/proto-newpow/mma-shadow/memhard.h new file mode 100644 index 000000000..f7f34c732 --- /dev/null +++ b/proto-newpow/mma-shadow/memhard.h @@ -0,0 +1,109 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Memory-hard dataset core, the same text that the Mac's Metal kernels and CPU verifier were checked against. +// Included by kernel.cu (device), host.cu (host reference) and proto-opencl/host.c (C99 host reference). +// See proto-metal/MEMHARD.md for the construction. kernel.cl carries the same text in OpenCL C. +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif +#if defined(__CUDACC__) +#define IGNEUM_HD __host__ __device__ __forceinline__ +#elif defined(_MSC_VER) && !defined(__cplusplus) +#define IGNEUM_HD static __inline +#else +#define IGNEUM_HD static inline +#endif +// Memory-hard dataset core (MEMHARD.md). Cache: 2^26 words in 2^16 segments of 64 chained ChaCha12 lines. +// Item: 8 rounds of 8 x seed-parameterised mixer + one 64-byte cache read, then 8 x final mixer (class v3, mixer multiplier 8, +// docs/plans/mixer-x4.md: the round key of application j of round r is 0x9E3779B9 * (r * m + j + 1)). All parameters are literals. +#define MH_CACHE_LINE_MASK 0x003fffffu +#define MH_SEGMENT_LINES 64u +#define MH_QR(a, b, c, d, r1, r2, r3, r4) { a += b; d ^= a; d = mh_rotl(d, r1); c += d; b ^= c; b = mh_rotl(b, r2); a += b; d ^= a; d = mh_rotl(d, r3); c += d; b ^= c; b = mh_rotl(b, r4); } +IGNEUM_HD uint32_t mh_rotl(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } // n in 1..31 at every call site + +// y = ChaCha12 core(x) + x +IGNEUM_HD void mh_chacha_block(const uint32_t* x, uint32_t* y) { + for (uint32_t i = 0u; i < 16u; ++i) y[i] = x[i]; + for (uint32_t r = 0u; r < 6u; ++r) { + MH_QR(y[0], y[4], y[8], y[12], 16u, 12u, 8u, 7u) MH_QR(y[1], y[5], y[9], y[13], 16u, 12u, 8u, 7u) + MH_QR(y[2], y[6], y[10], y[14], 16u, 12u, 8u, 7u) MH_QR(y[3], y[7], y[11], y[15], 16u, 12u, 8u, 7u) + MH_QR(y[0], y[5], y[10], y[15], 16u, 12u, 8u, 7u) MH_QR(y[1], y[6], y[11], y[12], 16u, 12u, 8u, 7u) + MH_QR(y[2], y[7], y[8], y[13], 16u, 12u, 8u, 7u) MH_QR(y[3], y[4], y[9], y[14], 16u, 12u, 8u, 7u) + } + for (uint32_t i = 0u; i < 16u; ++i) y[i] += x[i]; +} + +// One cache segment: 64 chained lines written at cache[seg * 1024]. in_j = prev ^ (sigma || K || seg || j || tag), prev_0 = 0. +IGNEUM_HD void mh_cache_segment(uint32_t* cache, uint32_t seg) { + uint32_t prev[16]; uint32_t x[16]; uint32_t y[16]; + for (uint32_t i = 0u; i < 16u; ++i) prev[i] = 0u; + for (uint32_t j = 0u; j < MH_SEGMENT_LINES; ++j) { + x[0] = 0x61707865u ^ prev[0]; x[1] = 0x3320646eu ^ prev[1]; x[2] = 0x79622d32u ^ prev[2]; x[3] = 0x6b206574u ^ prev[3]; + x[4] = 0x3067619fu ^ prev[4]; + x[5] = 0x3c269176u ^ prev[5]; + x[6] = 0x84a03b03u ^ prev[6]; + x[7] = 0xf8c63294u ^ prev[7]; + x[8] = 0xff977c5bu ^ prev[8]; + x[9] = 0xe60def3eu ^ prev[9]; + x[10] = 0x63630141u ^ prev[10]; + x[11] = 0xb8fbcb58u ^ prev[11]; + x[12] = seg ^ prev[12]; x[13] = j ^ prev[13]; x[14] = 0x49676e65u ^ prev[14]; x[15] = 0x756d4d48u ^ prev[15]; + mh_chacha_block(x, y); + uint32_t* line = cache + ((seg * MH_SEGMENT_LINES + j) * 16u); + for (uint32_t i = 0u; i < 16u; ++i) { line[i] = y[i]; prev[i] = y[i]; } + } +} + +// M_r: per word (s ^ (RC + rk)) * MUL, then a column round and a diagonal round with the seed-drawn rotations. +IGNEUM_HD void mh_mixer(uint32_t* s, uint32_t rk) { + s[0] = (s[0] ^ (0xbab68293u + rk)) * 0x42146205u; + s[1] = (s[1] ^ (0xcc162340u + rk)) * 0x52cbe0fbu; + s[2] = (s[2] ^ (0x6ce151ccu + rk)) * 0x7ecf4a03u; + s[3] = (s[3] ^ (0xe62b8997u + rk)) * 0x6728907fu; + s[4] = (s[4] ^ (0xc9c80297u + rk)) * 0xd81d9751u; + s[5] = (s[5] ^ (0xf74a1654u + rk)) * 0x132952c3u; + s[6] = (s[6] ^ (0x3d704af5u + rk)) * 0xf60de277u; + s[7] = (s[7] ^ (0x3cf522b7u + rk)) * 0x05358035u; + s[8] = (s[8] ^ (0x2b9cac04u + rk)) * 0xbaf6499du; + s[9] = (s[9] ^ (0xa880ac10u + rk)) * 0xe4db9667u; + s[10] = (s[10] ^ (0x13e5dd1du + rk)) * 0x3e98f45du; + s[11] = (s[11] ^ (0x6fc3e233u + rk)) * 0xd0004eddu; + s[12] = (s[12] ^ (0x2d83eeacu + rk)) * 0x2691630du; + s[13] = (s[13] ^ (0x9006e8bfu + rk)) * 0x9beb3bcfu; + s[14] = (s[14] ^ (0x2c4b5362u + rk)) * 0xab310379u; + s[15] = (s[15] ^ (0x31b49ee2u + rk)) * 0x99cfb423u; + MH_QR(s[0], s[4], s[8], s[12], 20u, 20u, 19u, 4u) MH_QR(s[1], s[5], s[9], s[13], 20u, 20u, 19u, 4u) + MH_QR(s[2], s[6], s[10], s[14], 20u, 20u, 19u, 4u) MH_QR(s[3], s[7], s[11], s[15], 20u, 20u, 19u, 4u) + MH_QR(s[0], s[5], s[10], s[15], 26u, 3u, 3u, 27u) MH_QR(s[1], s[6], s[11], s[12], 26u, 3u, 3u, 27u) + MH_QR(s[2], s[7], s[8], s[13], 26u, 3u, 3u, 27u) MH_QR(s[3], s[4], s[9], s[14], 26u, 3u, 3u, 27u) +} + +// Item t: 16 words. s = (K, t * MUL[i] + RC[i]); 8 rounds of 8 x mixer + cache line s[0] & mask; 8 x final mixer. +IGNEUM_HD void mh_item(const uint32_t* cache, uint32_t t, uint32_t* s) { + s[0] = 0x3067619fu; + s[1] = 0x3c269176u; + s[2] = 0x84a03b03u; + s[3] = 0xf8c63294u; + s[4] = 0xff977c5bu; + s[5] = 0xe60def3eu; + s[6] = 0x63630141u; + s[7] = 0xb8fbcb58u; + s[8] = t * 0x42146205u + 0xbab68293u; + s[9] = t * 0x52cbe0fbu + 0xcc162340u; + s[10] = t * 0x7ecf4a03u + 0x6ce151ccu; + s[11] = t * 0x6728907fu + 0xe62b8997u; + s[12] = t * 0xd81d9751u + 0xc9c80297u; + s[13] = t * 0x132952c3u + 0xf74a1654u; + s[14] = t * 0xf60de277u + 0x3d704af5u; + s[15] = t * 0x05358035u + 0x3cf522b7u; + for (uint32_t r = 0u; r < 8u; ++r) { + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (r * 8u + j + 1u)); + const uint32_t* line = cache + ((s[0] & MH_CACHE_LINE_MASK) * 16u); + for (uint32_t i = 0u; i < 16u; ++i) s[i] ^= line[i]; + } + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (64u + j + 1u)); +} +// dataset[w] without the dataset: derive item w >> 4 and take word w & 15. +IGNEUM_HD uint32_t mh_word(const uint32_t* cache, uint32_t w) { uint32_t s[16]; mh_item(cache, w >> 4u, s); return s[w & 15u]; } diff --git a/proto-newpow/mma-shadow/mm8_block.h b/proto-newpow/mma-shadow/mm8_block.h new file mode 100644 index 000000000..c5762d5f9 --- /dev/null +++ b/proto-newpow/mma-shadow/mm8_block.h @@ -0,0 +1,1072 @@ +// Generated by gen_block.py. mm8 block draws for class mx8+mm8xR, seed text "igneum-mm8/igneum-genesis", +// FNV-1a-64 seed 0x79f1fc5b6ed6112e, SplitMix64 stream. Step k uses (a, b, c, c2) = row k: r[c] += d0, r[c2] += d1. Do not edit by hand. +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif +#define IGNEUM_MM8_R_MAX 512 +#define IGNEUM_MM8_SEED 0x79f1fc5b6ed6112eull +// Packed uint16: a = v & 7, b = (v >> 3) & 7, c = (v >> 6) & 7, c2 = (v >> 9) & 7. +#define IGNEUM_MM8_TABLE_INIT { \ + 0x0f8u, 0x60cu, 0xe73u, 0xf61u, 0x50fu, 0x50eu, 0xe43u, 0x048u, 0xcddu, 0x3efu, 0xf37u, 0x3ecu, 0x32au, 0x32bu, 0xd63u, 0xae6u, \ + 0x5c8u, 0xae2u, 0xb1cu, 0x287u, 0x5d4u, 0x108u, 0x2cdu, 0x18cu, 0x35du, 0xe84u, 0x154u, 0xaaeu, 0xacfu, 0x76bu, 0xdebu, 0xf42u, \ + 0xf5eu, 0xc33u, 0x762u, 0x054u, 0x1a6u, 0xd18u, 0x467u, 0x783u, 0x738u, 0xa30u, 0xa0du, 0x36cu, 0xee0u, 0x044u, 0xb98u, 0xf60u, \ + 0x9e7u, 0x68eu, 0x2b9u, 0x5c4u, 0xea1u, 0x5deu, 0xf48u, 0xbddu, 0x4e9u, 0xb91u, 0x832u, 0xb04u, 0x415u, 0xe61u, 0x70bu, 0xedeu, \ + 0xa6eu, 0x597u, 0x40bu, 0xf0du, 0x66au, 0xe30u, 0x8ccu, 0x2fcu, 0x29eu, 0x29au, 0xf38u, 0x237u, 0xb8au, 0x2b7u, 0x4f7u, 0x0d9u, \ + 0x766u, 0xef2u, 0x73bu, 0x1b0u, 0x8a8u, 0x115u, 0x707u, 0xabbu, 0x106u, 0xfbau, 0x2a9u, 0xdc2u, 0xdcdu, 0x66au, 0xd01u, 0xdeau, \ + 0x5fcu, 0x2ebu, 0x2c8u, 0x8c2u, 0x35fu, 0xad4u, 0x09cu, 0x2eau, 0xa2cu, 0xbe9u, 0x30du, 0x1beu, 0x2c4u, 0xc6cu, 0x314u, 0xa5au, \ + 0xcbau, 0x81au, 0x9b5u, 0x703u, 0xd4bu, 0x7b0u, 0x078u, 0x331u, 0x810u, 0x085u, 0xa83u, 0xaa6u, 0x8b7u, 0x2d1u, 0x3cbu, 0x578u, \ + 0xe83u, 0xcceu, 0x1cbu, 0xd20u, 0xbd7u, 0xa29u, 0x667u, 0xbbeu, 0x8f5u, 0x36au, 0xafdu, 0x633u, 0xe99u, 0x3f2u, 0x78fu, 0x72fu, \ + 0x74du, 0x3e1u, 0xc3eu, 0x35eu, 0xddau, 0xbe9u, 0xc95u, 0x8d9u, 0xf16u, 0x041u, 0xbdeu, 0xec4u, 0x711u, 0x7c5u, 0xf1au, 0xcfau, \ + 0xe0fu, 0x632u, 0x974u, 0x67cu, 0xb2bu, 0xa70u, 0x2b5u, 0x95eu, 0x650u, 0x82fu, 0x5b9u, 0x1c6u, 0x472u, 0xc41u, 0x1b5u, 0x239u, \ + 0x45eu, 0x1efu, 0xc98u, 0x888u, 0x0e6u, 0x7d5u, 0x062u, 0x4cbu, 0x313u, 0x84bu, 0xecbu, 0x591u, 0x7a7u, 0x811u, 0x31eu, 0x58fu, \ + 0x7d6u, 0x574u, 0x760u, 0x7f0u, 0x337u, 0x667u, 0xdc5u, 0x9dau, 0xc53u, 0xf1cu, 0xb22u, 0x9b2u, 0xbb8u, 0x4dau, 0x33eu, 0x9d9u, \ + 0xb9au, 0x0d6u, 0x56cu, 0x45au, 0xcd5u, 0xe51u, 0xaf9u, 0x428u, 0xf22u, 0xeb8u, 0xa81u, 0xc3eu, 0xc13u, 0x061u, 0xf42u, 0x697u, \ + 0x7e2u, 0x7aeu, 0xf38u, 0xaeeu, 0x691u, 0x770u, 0xd4eu, 0x3e5u, 0xce8u, 0x781u, 0xddau, 0x998u, 0xf8du, 0xcc8u, 0xd20u, 0xc51u, \ + 0xf08u, 0xe42u, 0x093u, 0x9ebu, 0xefeu, 0x6bau, 0xf4fu, 0xf97u, 0x354u, 0x1c4u, 0x521u, 0xe1fu, 0x728u, 0xf30u, 0x2fau, 0x7cdu, \ + 0xc4au, 0x0e8u, 0xbe0u, 0xdf0u, 0xee3u, 0x2a8u, 0xb39u, 0x691u, 0x797u, 0xef3u, 0xbbbu, 0xc9fu, 0x5fdu, 0xf38u, 0x35fu, 0x5cdu, \ + 0x5eau, 0x5d3u, 0x096u, 0x0beu, 0xe93u, 0x9bcu, 0x10eu, 0xe26u, 0x885u, 0x393u, 0xbbcu, 0x303u, 0x503u, 0xf47u, 0x2ccu, 0x85fu, \ + 0x371u, 0xfbdu, 0x379u, 0x984u, 0x15au, 0xdd0u, 0xba3u, 0x225u, 0x0b5u, 0xbdau, 0xbf1u, 0x475u, 0xe35u, 0x9a7u, 0xbb4u, 0xf1du, \ + 0x7d5u, 0x2b4u, 0xb2cu, 0x220u, 0xcf4u, 0xcf9u, 0x60bu, 0x18au, 0xafeu, 0x4c7u, 0x77bu, 0x685u, 0x7feu, 0x17bu, 0x351u, 0xfb5u, \ + 0xc78u, 0xe67u, 0x18au, 0x091u, 0xc54u, 0xb2bu, 0xacbu, 0xbb3u, 0x2e3u, 0xf55u, 0x0f3u, 0x5a3u, 0x9eeu, 0x0b8u, 0x5efu, 0x477u, \ + 0x715u, 0x7b9u, 0x290u, 0x9c6u, 0xd0eu, 0xa83u, 0x151u, 0xbbeu, 0xf10u, 0x827u, 0x330u, 0x869u, 0x187u, 0x2f7u, 0x5c8u, 0xf35u, \ + 0x73bu, 0x218u, 0xea2u, 0x67cu, 0x5fcu, 0xa21u, 0x546u, 0x851u, 0x0dfu, 0x20cu, 0x59eu, 0xc0au, 0x36fu, 0xc9eu, 0xaa5u, 0x68cu, \ + 0x719u, 0xc95u, 0x391u, 0x0d1u, 0x18au, 0x62fu, 0x42bu, 0x0aeu, 0x113u, 0x583u, 0x34cu, 0xbddu, 0xc53u, 0x0afu, 0x4d7u, 0x421u, \ + 0xbe0u, 0xa6cu, 0x101u, 0xa50u, 0xcc2u, 0x78du, 0xc0au, 0x08eu, 0x68cu, 0xe58u, 0x8cfu, 0x69cu, 0x185u, 0xb2fu, 0xad8u, 0xe6cu, \ + 0x37bu, 0x06bu, 0x473u, 0x8fdu, 0xe3eu, 0x297u, 0xf37u, 0x119u, 0x1f8u, 0x0b4u, 0xc1cu, 0xecdu, 0x379u, 0x0c5u, 0x1c5u, 0x1c7u, \ + 0x959u, 0x86eu, 0x557u, 0x0cfu, 0xb3bu, 0xcb1u, 0xd51u, 0x795u, 0xbbcu, 0xe5eu, 0x883u, 0xcaau, 0x3afu, 0xbdeu, 0x148u, 0x175u, \ + 0x8ddu, 0xbe5u, 0xf48u, 0x793u, 0xc18u, 0x815u, 0x15eu, 0xb2au, 0x8c5u, 0x52cu, 0x706u, 0x0eau, 0x08cu, 0xe2cu, 0xa38u, 0xa17u, \ + 0x105u, 0x885u, 0x7a5u, 0x5dfu, 0xa21u, 0xebeu, 0x2a6u, 0xf42u, 0x868u, 0x379u, 0xacbu, 0x844u, 0x44au, 0x7eeu, 0x64cu, 0x56eu, \ + 0xbbau, 0xf9fu, 0xe48u, 0x2feu, 0xbcdu, 0x984u, 0x9a9u, 0x9a9u, 0xad9u, 0xef1u, 0x8ebu, 0x99fu, 0x657u, 0x062u, 0x0c3u, 0x55fu, \ + 0x94fu, 0x06bu, 0x08eu, 0x3f5u, 0x4c4u, 0x715u, 0xbe1u, 0xeabu, 0xd51u, 0x33bu, 0x374u, 0x4f7u, 0xd56u, 0x55au, 0x9bcu, 0xdecu, \ + 0x333u, 0x2f0u, 0xba5u, 0x7b5u, 0x562u, 0x067u, 0x4d7u, 0x7bau, 0xeb3u, 0x0eeu, 0x30bu, 0xe19u, 0xdd9u, 0xcd1u, 0x665u, 0xcccu } +// X-macro list: X(k, a, b, c, c2) for every step k in 0..R_MAX-1. The kernel guards each with k < IGNEUM_MM8_R, +// so the register indices are compile-time constants (r[] stays in registers, no local memory). +#define IGNEUM_MM8_STEPS(X) \ + X(0, 0, 7, 3, 0) \ + X(1, 4, 1, 0, 3) \ + X(2, 3, 6, 1, 7) \ + X(3, 1, 4, 5, 7) \ + X(4, 7, 1, 4, 2) \ + X(5, 6, 1, 4, 2) \ + X(6, 3, 0, 1, 7) \ + X(7, 0, 1, 1, 0) \ + X(8, 5, 3, 3, 6) \ + X(9, 7, 5, 7, 1) \ + X(10, 7, 6, 4, 7) \ + X(11, 4, 5, 7, 1) \ + X(12, 2, 5, 4, 1) \ + X(13, 3, 5, 4, 1) \ + X(14, 3, 4, 5, 6) \ + X(15, 6, 4, 3, 5) \ + X(16, 0, 1, 7, 2) \ + X(17, 2, 4, 3, 5) \ + X(18, 4, 3, 4, 5) \ + X(19, 7, 0, 2, 1) \ + X(20, 4, 2, 7, 2) \ + X(21, 0, 1, 4, 0) \ + X(22, 5, 1, 3, 1) \ + X(23, 4, 1, 6, 0) \ + X(24, 5, 3, 5, 1) \ + X(25, 4, 0, 2, 7) \ + X(26, 4, 2, 5, 0) \ + X(27, 6, 5, 2, 5) \ + X(28, 7, 1, 3, 5) \ + X(29, 3, 5, 5, 3) \ + X(30, 3, 5, 7, 6) \ + X(31, 2, 0, 5, 7) \ + X(32, 6, 3, 5, 7) \ + X(33, 3, 6, 0, 6) \ + X(34, 2, 4, 5, 3) \ + X(35, 4, 2, 1, 0) \ + X(36, 6, 4, 6, 0) \ + X(37, 0, 3, 4, 6) \ + X(38, 7, 4, 1, 2) \ + X(39, 3, 0, 6, 3) \ + X(40, 0, 7, 4, 3) \ + X(41, 0, 6, 0, 5) \ + X(42, 5, 1, 0, 5) \ + X(43, 4, 5, 5, 1) \ + X(44, 0, 4, 3, 7) \ + X(45, 4, 0, 1, 0) \ + X(46, 0, 3, 6, 5) \ + X(47, 0, 4, 5, 7) \ + X(48, 7, 4, 7, 4) \ + X(49, 6, 1, 2, 3) \ + X(50, 1, 7, 2, 1) \ + X(51, 4, 0, 7, 2) \ + X(52, 1, 4, 2, 7) \ + X(53, 6, 3, 7, 2) \ + X(54, 0, 1, 5, 7) \ + X(55, 5, 3, 7, 5) \ + X(56, 1, 5, 3, 2) \ + X(57, 1, 2, 6, 5) \ + X(58, 2, 6, 0, 4) \ + X(59, 4, 0, 4, 5) \ + X(60, 5, 2, 0, 2) \ + X(61, 1, 4, 1, 7) \ + X(62, 3, 1, 4, 3) \ + X(63, 6, 3, 3, 7) \ + X(64, 6, 5, 1, 5) \ + X(65, 7, 2, 6, 2) \ + X(66, 3, 1, 0, 2) \ + X(67, 5, 1, 4, 7) \ + X(68, 2, 5, 1, 3) \ + X(69, 0, 6, 0, 7) \ + X(70, 4, 1, 3, 4) \ + X(71, 4, 7, 3, 1) \ + X(72, 6, 3, 2, 1) \ + X(73, 2, 3, 2, 1) \ + X(74, 0, 7, 4, 7) \ + X(75, 7, 6, 0, 1) \ + X(76, 2, 1, 6, 5) \ + X(77, 7, 6, 2, 1) \ + X(78, 7, 6, 3, 2) \ + X(79, 1, 3, 3, 0) \ + X(80, 6, 4, 5, 3) \ + X(81, 2, 6, 3, 7) \ + X(82, 3, 7, 4, 3) \ + X(83, 0, 6, 6, 0) \ + X(84, 0, 5, 2, 4) \ + X(85, 5, 2, 4, 0) \ + X(86, 7, 0, 4, 3) \ + X(87, 3, 7, 2, 5) \ + X(88, 6, 0, 4, 0) \ + X(89, 2, 7, 6, 7) \ + X(90, 1, 5, 2, 1) \ + X(91, 2, 0, 7, 6) \ + X(92, 5, 1, 7, 6) \ + X(93, 2, 5, 1, 3) \ + X(94, 1, 0, 4, 6) \ + X(95, 2, 5, 7, 6) \ + X(96, 4, 7, 7, 2) \ + X(97, 3, 5, 3, 1) \ + X(98, 0, 1, 3, 1) \ + X(99, 2, 0, 3, 4) \ + X(100, 7, 3, 5, 1) \ + X(101, 4, 2, 3, 5) \ + X(102, 4, 3, 2, 0) \ + X(103, 2, 5, 3, 1) \ + X(104, 4, 5, 0, 5) \ + X(105, 1, 5, 7, 5) \ + X(106, 5, 1, 4, 1) \ + X(107, 6, 7, 6, 0) \ + X(108, 4, 0, 3, 1) \ + X(109, 4, 5, 1, 6) \ + X(110, 4, 2, 4, 1) \ + X(111, 2, 3, 1, 5) \ + X(112, 2, 7, 2, 6) \ + X(113, 2, 3, 0, 4) \ + X(114, 5, 6, 6, 4) \ + X(115, 3, 0, 4, 3) \ + X(116, 3, 1, 5, 6) \ + X(117, 0, 6, 6, 3) \ + X(118, 0, 7, 1, 0) \ + X(119, 1, 6, 4, 1) \ + X(120, 0, 2, 0, 4) \ + X(121, 5, 0, 2, 0) \ + X(122, 3, 0, 2, 5) \ + X(123, 6, 4, 2, 5) \ + X(124, 7, 6, 2, 4) \ + X(125, 1, 2, 3, 1) \ + X(126, 3, 1, 7, 1) \ + X(127, 0, 7, 5, 2) \ + X(128, 3, 0, 2, 7) \ + X(129, 6, 1, 3, 6) \ + X(130, 3, 1, 7, 0) \ + X(131, 0, 4, 4, 6) \ + X(132, 7, 2, 7, 5) \ + X(133, 1, 5, 0, 5) \ + X(134, 7, 4, 1, 3) \ + X(135, 6, 7, 6, 5) \ + X(136, 5, 6, 3, 4) \ + X(137, 2, 5, 5, 1) \ + X(138, 5, 7, 3, 5) \ + X(139, 3, 6, 0, 3) \ + X(140, 1, 3, 2, 7) \ + X(141, 2, 6, 7, 1) \ + X(142, 7, 1, 6, 3) \ + X(143, 7, 5, 4, 3) \ + X(144, 5, 1, 5, 3) \ + X(145, 1, 4, 7, 1) \ + X(146, 6, 7, 0, 6) \ + X(147, 6, 3, 5, 1) \ + X(148, 2, 3, 7, 6) \ + X(149, 1, 5, 7, 5) \ + X(150, 5, 2, 2, 6) \ + X(151, 1, 3, 3, 4) \ + X(152, 6, 2, 4, 7) \ + X(153, 1, 0, 1, 0) \ + X(154, 6, 3, 7, 5) \ + X(155, 4, 0, 3, 7) \ + X(156, 1, 2, 4, 3) \ + X(157, 5, 0, 7, 3) \ + X(158, 2, 3, 4, 7) \ + X(159, 2, 7, 3, 6) \ + X(160, 7, 1, 0, 7) \ + X(161, 2, 6, 0, 3) \ + X(162, 4, 6, 5, 4) \ + X(163, 4, 7, 1, 3) \ + X(164, 3, 5, 4, 5) \ + X(165, 0, 6, 1, 5) \ + X(166, 5, 6, 2, 1) \ + X(167, 6, 3, 5, 4) \ + X(168, 0, 2, 1, 3) \ + X(169, 7, 5, 0, 4) \ + X(170, 1, 7, 6, 2) \ + X(171, 6, 0, 7, 0) \ + X(172, 2, 6, 1, 2) \ + X(173, 1, 0, 1, 6) \ + X(174, 5, 6, 6, 0) \ + X(175, 1, 7, 0, 1) \ + X(176, 6, 3, 1, 2) \ + X(177, 7, 5, 7, 0) \ + X(178, 0, 3, 2, 6) \ + X(179, 0, 1, 2, 4) \ + X(180, 6, 4, 3, 0) \ + X(181, 5, 2, 7, 3) \ + X(182, 2, 4, 1, 0) \ + X(183, 3, 1, 3, 2) \ + X(184, 3, 2, 4, 1) \ + X(185, 3, 1, 1, 4) \ + X(186, 3, 1, 3, 7) \ + X(187, 1, 2, 6, 2) \ + X(188, 7, 4, 6, 3) \ + X(189, 1, 2, 0, 4) \ + X(190, 6, 3, 4, 1) \ + X(191, 7, 1, 6, 2) \ + X(192, 6, 2, 7, 3) \ + X(193, 4, 6, 5, 2) \ + X(194, 0, 4, 5, 3) \ + X(195, 0, 6, 7, 3) \ + X(196, 7, 6, 4, 1) \ + X(197, 7, 4, 1, 3) \ + X(198, 5, 0, 7, 6) \ + X(199, 2, 3, 7, 4) \ + X(200, 3, 2, 1, 6) \ + X(201, 4, 3, 4, 7) \ + X(202, 2, 4, 4, 5) \ + X(203, 2, 6, 6, 4) \ + X(204, 0, 7, 6, 5) \ + X(205, 2, 3, 3, 2) \ + X(206, 6, 7, 4, 1) \ + X(207, 1, 3, 7, 4) \ + X(208, 2, 3, 6, 5) \ + X(209, 6, 2, 3, 0) \ + X(210, 4, 5, 5, 2) \ + X(211, 2, 3, 1, 2) \ + X(212, 5, 2, 3, 6) \ + X(213, 1, 2, 1, 7) \ + X(214, 1, 7, 3, 5) \ + X(215, 0, 5, 0, 2) \ + X(216, 2, 4, 4, 7) \ + X(217, 0, 7, 2, 7) \ + X(218, 1, 0, 2, 5) \ + X(219, 6, 7, 0, 6) \ + X(220, 3, 2, 0, 6) \ + X(221, 1, 4, 1, 0) \ + X(222, 2, 0, 5, 7) \ + X(223, 7, 2, 2, 3) \ + X(224, 2, 4, 7, 3) \ + X(225, 6, 5, 6, 3) \ + X(226, 0, 7, 4, 7) \ + X(227, 6, 5, 3, 5) \ + X(228, 1, 2, 2, 3) \ + X(229, 0, 6, 5, 3) \ + X(230, 6, 1, 5, 6) \ + X(231, 5, 4, 7, 1) \ + X(232, 0, 5, 3, 6) \ + X(233, 1, 0, 6, 3) \ + X(234, 2, 3, 7, 6) \ + X(235, 0, 3, 6, 4) \ + X(236, 5, 1, 6, 7) \ + X(237, 0, 1, 3, 6) \ + X(238, 0, 4, 4, 6) \ + X(239, 1, 2, 1, 6) \ + X(240, 0, 1, 4, 7) \ + X(241, 2, 0, 1, 7) \ + X(242, 3, 2, 2, 0) \ + X(243, 3, 5, 7, 4) \ + X(244, 6, 7, 3, 7) \ + X(245, 2, 7, 2, 3) \ + X(246, 7, 1, 5, 7) \ + X(247, 7, 2, 6, 7) \ + X(248, 4, 2, 5, 1) \ + X(249, 4, 0, 7, 0) \ + X(250, 1, 4, 4, 2) \ + X(251, 7, 3, 0, 7) \ + X(252, 0, 5, 4, 3) \ + X(253, 0, 6, 4, 7) \ + X(254, 2, 7, 3, 1) \ + X(255, 5, 1, 7, 3) \ + X(256, 2, 1, 1, 6) \ + X(257, 0, 5, 3, 0) \ + X(258, 0, 4, 7, 5) \ + X(259, 0, 6, 7, 6) \ + X(260, 3, 4, 3, 7) \ + X(261, 0, 5, 2, 1) \ + X(262, 1, 7, 4, 5) \ + X(263, 1, 2, 2, 3) \ + X(264, 7, 2, 6, 3) \ + X(265, 3, 6, 3, 7) \ + X(266, 3, 7, 6, 5) \ + X(267, 7, 3, 2, 6) \ + X(268, 5, 7, 7, 2) \ + X(269, 0, 7, 4, 7) \ + X(270, 7, 3, 5, 1) \ + X(271, 5, 1, 7, 2) \ + X(272, 2, 5, 7, 2) \ + X(273, 3, 2, 7, 2) \ + X(274, 6, 2, 2, 0) \ + X(275, 6, 7, 2, 0) \ + X(276, 3, 2, 2, 7) \ + X(277, 4, 7, 6, 4) \ + X(278, 6, 1, 4, 0) \ + X(279, 6, 4, 0, 7) \ + X(280, 5, 0, 2, 4) \ + X(281, 3, 2, 6, 1) \ + X(282, 4, 7, 6, 5) \ + X(283, 3, 0, 4, 1) \ + X(284, 3, 0, 4, 2) \ + X(285, 7, 0, 5, 7) \ + X(286, 4, 1, 3, 1) \ + X(287, 7, 3, 1, 4) \ + X(288, 1, 6, 5, 1) \ + X(289, 5, 7, 6, 7) \ + X(290, 1, 7, 5, 1) \ + X(291, 4, 0, 6, 4) \ + X(292, 2, 3, 5, 0) \ + X(293, 0, 2, 7, 6) \ + X(294, 3, 4, 6, 5) \ + X(295, 5, 4, 0, 1) \ + X(296, 5, 6, 2, 0) \ + X(297, 2, 3, 7, 5) \ + X(298, 1, 6, 7, 5) \ + X(299, 5, 6, 1, 2) \ + X(300, 5, 6, 0, 7) \ + X(301, 7, 4, 6, 4) \ + X(302, 4, 6, 6, 5) \ + X(303, 5, 3, 4, 7) \ + X(304, 5, 2, 7, 3) \ + X(305, 4, 6, 2, 1) \ + X(306, 4, 5, 4, 5) \ + X(307, 0, 4, 0, 1) \ + X(308, 4, 6, 3, 6) \ + X(309, 1, 7, 3, 6) \ + X(310, 3, 1, 0, 3) \ + X(311, 2, 1, 6, 0) \ + X(312, 6, 7, 3, 5) \ + X(313, 7, 0, 3, 2) \ + X(314, 3, 7, 5, 3) \ + X(315, 5, 0, 2, 3) \ + X(316, 6, 7, 7, 3) \ + X(317, 3, 7, 5, 0) \ + X(318, 1, 2, 5, 1) \ + X(319, 5, 6, 6, 7) \ + X(320, 0, 7, 1, 6) \ + X(321, 7, 4, 1, 7) \ + X(322, 2, 1, 6, 0) \ + X(323, 1, 2, 2, 0) \ + X(324, 4, 2, 1, 6) \ + X(325, 3, 5, 4, 5) \ + X(326, 3, 1, 3, 5) \ + X(327, 3, 6, 6, 5) \ + X(328, 3, 4, 3, 1) \ + X(329, 5, 2, 5, 7) \ + X(330, 3, 6, 3, 0) \ + X(331, 3, 4, 6, 2) \ + X(332, 6, 5, 7, 4) \ + X(333, 0, 7, 2, 0) \ + X(334, 7, 5, 7, 2) \ + X(335, 7, 6, 1, 2) \ + X(336, 5, 2, 4, 3) \ + X(337, 1, 7, 6, 3) \ + X(338, 0, 2, 2, 1) \ + X(339, 6, 0, 7, 4) \ + X(340, 6, 1, 4, 6) \ + X(341, 3, 0, 2, 5) \ + X(342, 1, 2, 5, 0) \ + X(343, 6, 7, 6, 5) \ + X(344, 0, 2, 4, 7) \ + X(345, 7, 4, 0, 4) \ + X(346, 0, 6, 4, 1) \ + X(347, 1, 5, 1, 4) \ + X(348, 7, 0, 6, 0) \ + X(349, 7, 6, 3, 1) \ + X(350, 0, 1, 7, 2) \ + X(351, 5, 6, 4, 7) \ + X(352, 3, 7, 4, 3) \ + X(353, 0, 3, 0, 1) \ + X(354, 2, 4, 2, 7) \ + X(355, 4, 7, 1, 3) \ + X(356, 4, 7, 7, 2) \ + X(357, 1, 4, 0, 5) \ + X(358, 6, 0, 5, 2) \ + X(359, 1, 2, 1, 4) \ + X(360, 7, 3, 3, 0) \ + X(361, 4, 1, 0, 1) \ + X(362, 6, 3, 6, 2) \ + X(363, 2, 1, 0, 6) \ + X(364, 7, 5, 5, 1) \ + X(365, 6, 3, 2, 6) \ + X(366, 5, 4, 2, 5) \ + X(367, 4, 1, 2, 3) \ + X(368, 1, 3, 4, 3) \ + X(369, 5, 2, 2, 6) \ + X(370, 1, 2, 6, 1) \ + X(371, 1, 2, 3, 0) \ + X(372, 2, 1, 6, 0) \ + X(373, 7, 5, 0, 3) \ + X(374, 3, 5, 0, 2) \ + X(375, 6, 5, 2, 0) \ + X(376, 3, 2, 4, 0) \ + X(377, 3, 0, 6, 2) \ + X(378, 4, 1, 5, 1) \ + X(379, 5, 3, 7, 5) \ + X(380, 3, 2, 1, 6) \ + X(381, 7, 5, 2, 0) \ + X(382, 7, 2, 3, 2) \ + X(383, 1, 4, 0, 2) \ + X(384, 0, 4, 7, 5) \ + X(385, 4, 5, 1, 5) \ + X(386, 1, 0, 4, 0) \ + X(387, 0, 2, 1, 5) \ + X(388, 2, 0, 3, 6) \ + X(389, 5, 1, 6, 3) \ + X(390, 2, 1, 0, 6) \ + X(391, 6, 1, 2, 0) \ + X(392, 4, 1, 2, 3) \ + X(393, 0, 3, 1, 7) \ + X(394, 7, 1, 3, 4) \ + X(395, 4, 3, 2, 3) \ + X(396, 5, 0, 6, 0) \ + X(397, 7, 5, 4, 5) \ + X(398, 0, 3, 3, 5) \ + X(399, 4, 5, 1, 7) \ + X(400, 3, 7, 5, 1) \ + X(401, 3, 5, 1, 0) \ + X(402, 3, 6, 1, 2) \ + X(403, 5, 7, 3, 4) \ + X(404, 6, 7, 0, 7) \ + X(405, 7, 2, 2, 1) \ + X(406, 7, 6, 4, 7) \ + X(407, 1, 3, 4, 0) \ + X(408, 0, 7, 7, 0) \ + X(409, 4, 6, 2, 0) \ + X(410, 4, 3, 0, 6) \ + X(411, 5, 1, 3, 7) \ + X(412, 1, 7, 5, 1) \ + X(413, 5, 0, 3, 0) \ + X(414, 5, 0, 7, 0) \ + X(415, 7, 0, 7, 0) \ + X(416, 1, 3, 5, 4) \ + X(417, 6, 5, 1, 4) \ + X(418, 7, 2, 5, 2) \ + X(419, 7, 1, 3, 0) \ + X(420, 3, 7, 4, 5) \ + X(421, 1, 6, 2, 6) \ + X(422, 1, 2, 5, 6) \ + X(423, 5, 2, 6, 3) \ + X(424, 4, 7, 6, 5) \ + X(425, 6, 3, 1, 7) \ + X(426, 3, 0, 2, 4) \ + X(427, 2, 5, 2, 6) \ + X(428, 7, 5, 6, 1) \ + X(429, 6, 3, 7, 5) \ + X(430, 0, 1, 5, 0) \ + X(431, 5, 6, 5, 0) \ + X(432, 5, 3, 3, 4) \ + X(433, 5, 4, 7, 5) \ + X(434, 0, 1, 5, 7) \ + X(435, 3, 2, 6, 3) \ + X(436, 0, 3, 0, 6) \ + X(437, 5, 2, 0, 4) \ + X(438, 6, 3, 5, 0) \ + X(439, 2, 5, 4, 5) \ + X(440, 5, 0, 3, 4) \ + X(441, 4, 5, 4, 2) \ + X(442, 6, 0, 4, 3) \ + X(443, 2, 5, 3, 0) \ + X(444, 4, 1, 2, 0) \ + X(445, 4, 5, 0, 7) \ + X(446, 0, 7, 0, 5) \ + X(447, 7, 2, 0, 5) \ + X(448, 5, 0, 4, 0) \ + X(449, 5, 0, 2, 4) \ + X(450, 5, 4, 6, 3) \ + X(451, 7, 3, 7, 2) \ + X(452, 1, 4, 0, 5) \ + X(453, 6, 7, 2, 7) \ + X(454, 6, 4, 2, 1) \ + X(455, 2, 0, 5, 7) \ + X(456, 0, 5, 1, 4) \ + X(457, 1, 7, 5, 1) \ + X(458, 3, 1, 3, 5) \ + X(459, 4, 0, 1, 4) \ + X(460, 2, 1, 1, 2) \ + X(461, 6, 5, 7, 3) \ + X(462, 4, 1, 1, 3) \ + X(463, 6, 5, 5, 2) \ + X(464, 2, 7, 6, 5) \ + X(465, 7, 3, 6, 7) \ + X(466, 0, 1, 1, 7) \ + X(467, 6, 7, 3, 1) \ + X(468, 5, 1, 7, 5) \ + X(469, 4, 0, 6, 4) \ + X(470, 1, 5, 6, 4) \ + X(471, 1, 5, 6, 4) \ + X(472, 1, 3, 3, 5) \ + X(473, 1, 6, 3, 7) \ + X(474, 3, 5, 3, 4) \ + X(475, 7, 3, 6, 4) \ + X(476, 7, 2, 1, 3) \ + X(477, 2, 4, 1, 0) \ + X(478, 3, 0, 3, 0) \ + X(479, 7, 3, 5, 2) \ + X(480, 7, 1, 5, 4) \ + X(481, 3, 5, 1, 0) \ + X(482, 6, 1, 2, 0) \ + X(483, 5, 6, 7, 1) \ + X(484, 4, 0, 3, 2) \ + X(485, 5, 2, 4, 3) \ + X(486, 1, 4, 7, 5) \ + X(487, 3, 5, 2, 7) \ + X(488, 1, 2, 5, 6) \ + X(489, 3, 7, 4, 1) \ + X(490, 4, 6, 5, 1) \ + X(491, 7, 6, 3, 2) \ + X(492, 6, 2, 5, 6) \ + X(493, 2, 3, 5, 2) \ + X(494, 4, 7, 6, 4) \ + X(495, 4, 5, 7, 6) \ + X(496, 3, 6, 4, 1) \ + X(497, 0, 6, 3, 1) \ + X(498, 5, 4, 6, 5) \ + X(499, 5, 6, 6, 3) \ + X(500, 2, 4, 5, 2) \ + X(501, 7, 4, 1, 0) \ + X(502, 7, 2, 3, 2) \ + X(503, 2, 7, 6, 3) \ + X(504, 3, 6, 2, 7) \ + X(505, 6, 5, 3, 0) \ + X(506, 3, 1, 4, 1) \ + X(507, 1, 3, 0, 7) \ + X(508, 1, 3, 7, 6) \ + X(509, 1, 2, 3, 6) \ + X(510, 5, 4, 1, 3) \ + X(511, 4, 1, 3, 6) +// Readable form, step: a b c c2 +// 0: 0 7 3 0 +// 1: 4 1 0 3 +// 2: 3 6 1 7 +// 3: 1 4 5 7 +// 4: 7 1 4 2 +// 5: 6 1 4 2 +// 6: 3 0 1 7 +// 7: 0 1 1 0 +// 8: 5 3 3 6 +// 9: 7 5 7 1 +// 10: 7 6 4 7 +// 11: 4 5 7 1 +// 12: 2 5 4 1 +// 13: 3 5 4 1 +// 14: 3 4 5 6 +// 15: 6 4 3 5 +// 16: 0 1 7 2 +// 17: 2 4 3 5 +// 18: 4 3 4 5 +// 19: 7 0 2 1 +// 20: 4 2 7 2 +// 21: 0 1 4 0 +// 22: 5 1 3 1 +// 23: 4 1 6 0 +// 24: 5 3 5 1 +// 25: 4 0 2 7 +// 26: 4 2 5 0 +// 27: 6 5 2 5 +// 28: 7 1 3 5 +// 29: 3 5 5 3 +// 30: 3 5 7 6 +// 31: 2 0 5 7 +// 32: 6 3 5 7 +// 33: 3 6 0 6 +// 34: 2 4 5 3 +// 35: 4 2 1 0 +// 36: 6 4 6 0 +// 37: 0 3 4 6 +// 38: 7 4 1 2 +// 39: 3 0 6 3 +// 40: 0 7 4 3 +// 41: 0 6 0 5 +// 42: 5 1 0 5 +// 43: 4 5 5 1 +// 44: 0 4 3 7 +// 45: 4 0 1 0 +// 46: 0 3 6 5 +// 47: 0 4 5 7 +// 48: 7 4 7 4 +// 49: 6 1 2 3 +// 50: 1 7 2 1 +// 51: 4 0 7 2 +// 52: 1 4 2 7 +// 53: 6 3 7 2 +// 54: 0 1 5 7 +// 55: 5 3 7 5 +// 56: 1 5 3 2 +// 57: 1 2 6 5 +// 58: 2 6 0 4 +// 59: 4 0 4 5 +// 60: 5 2 0 2 +// 61: 1 4 1 7 +// 62: 3 1 4 3 +// 63: 6 3 3 7 +// 64: 6 5 1 5 +// 65: 7 2 6 2 +// 66: 3 1 0 2 +// 67: 5 1 4 7 +// 68: 2 5 1 3 +// 69: 0 6 0 7 +// 70: 4 1 3 4 +// 71: 4 7 3 1 +// 72: 6 3 2 1 +// 73: 2 3 2 1 +// 74: 0 7 4 7 +// 75: 7 6 0 1 +// 76: 2 1 6 5 +// 77: 7 6 2 1 +// 78: 7 6 3 2 +// 79: 1 3 3 0 +// 80: 6 4 5 3 +// 81: 2 6 3 7 +// 82: 3 7 4 3 +// 83: 0 6 6 0 +// 84: 0 5 2 4 +// 85: 5 2 4 0 +// 86: 7 0 4 3 +// 87: 3 7 2 5 +// 88: 6 0 4 0 +// 89: 2 7 6 7 +// 90: 1 5 2 1 +// 91: 2 0 7 6 +// 92: 5 1 7 6 +// 93: 2 5 1 3 +// 94: 1 0 4 6 +// 95: 2 5 7 6 +// 96: 4 7 7 2 +// 97: 3 5 3 1 +// 98: 0 1 3 1 +// 99: 2 0 3 4 +// 100: 7 3 5 1 +// 101: 4 2 3 5 +// 102: 4 3 2 0 +// 103: 2 5 3 1 +// 104: 4 5 0 5 +// 105: 1 5 7 5 +// 106: 5 1 4 1 +// 107: 6 7 6 0 +// 108: 4 0 3 1 +// 109: 4 5 1 6 +// 110: 4 2 4 1 +// 111: 2 3 1 5 +// 112: 2 7 2 6 +// 113: 2 3 0 4 +// 114: 5 6 6 4 +// 115: 3 0 4 3 +// 116: 3 1 5 6 +// 117: 0 6 6 3 +// 118: 0 7 1 0 +// 119: 1 6 4 1 +// 120: 0 2 0 4 +// 121: 5 0 2 0 +// 122: 3 0 2 5 +// 123: 6 4 2 5 +// 124: 7 6 2 4 +// 125: 1 2 3 1 +// 126: 3 1 7 1 +// 127: 0 7 5 2 +// 128: 3 0 2 7 +// 129: 6 1 3 6 +// 130: 3 1 7 0 +// 131: 0 4 4 6 +// 132: 7 2 7 5 +// 133: 1 5 0 5 +// 134: 7 4 1 3 +// 135: 6 7 6 5 +// 136: 5 6 3 4 +// 137: 2 5 5 1 +// 138: 5 7 3 5 +// 139: 3 6 0 3 +// 140: 1 3 2 7 +// 141: 2 6 7 1 +// 142: 7 1 6 3 +// 143: 7 5 4 3 +// 144: 5 1 5 3 +// 145: 1 4 7 1 +// 146: 6 7 0 6 +// 147: 6 3 5 1 +// 148: 2 3 7 6 +// 149: 1 5 7 5 +// 150: 5 2 2 6 +// 151: 1 3 3 4 +// 152: 6 2 4 7 +// 153: 1 0 1 0 +// 154: 6 3 7 5 +// 155: 4 0 3 7 +// 156: 1 2 4 3 +// 157: 5 0 7 3 +// 158: 2 3 4 7 +// 159: 2 7 3 6 +// 160: 7 1 0 7 +// 161: 2 6 0 3 +// 162: 4 6 5 4 +// 163: 4 7 1 3 +// 164: 3 5 4 5 +// 165: 0 6 1 5 +// 166: 5 6 2 1 +// 167: 6 3 5 4 +// 168: 0 2 1 3 +// 169: 7 5 0 4 +// 170: 1 7 6 2 +// 171: 6 0 7 0 +// 172: 2 6 1 2 +// 173: 1 0 1 6 +// 174: 5 6 6 0 +// 175: 1 7 0 1 +// 176: 6 3 1 2 +// 177: 7 5 7 0 +// 178: 0 3 2 6 +// 179: 0 1 2 4 +// 180: 6 4 3 0 +// 181: 5 2 7 3 +// 182: 2 4 1 0 +// 183: 3 1 3 2 +// 184: 3 2 4 1 +// 185: 3 1 1 4 +// 186: 3 1 3 7 +// 187: 1 2 6 2 +// 188: 7 4 6 3 +// 189: 1 2 0 4 +// 190: 6 3 4 1 +// 191: 7 1 6 2 +// 192: 6 2 7 3 +// 193: 4 6 5 2 +// 194: 0 4 5 3 +// 195: 0 6 7 3 +// 196: 7 6 4 1 +// 197: 7 4 1 3 +// 198: 5 0 7 6 +// 199: 2 3 7 4 +// 200: 3 2 1 6 +// 201: 4 3 4 7 +// 202: 2 4 4 5 +// 203: 2 6 6 4 +// 204: 0 7 6 5 +// 205: 2 3 3 2 +// 206: 6 7 4 1 +// 207: 1 3 7 4 +// 208: 2 3 6 5 +// 209: 6 2 3 0 +// 210: 4 5 5 2 +// 211: 2 3 1 2 +// 212: 5 2 3 6 +// 213: 1 2 1 7 +// 214: 1 7 3 5 +// 215: 0 5 0 2 +// 216: 2 4 4 7 +// 217: 0 7 2 7 +// 218: 1 0 2 5 +// 219: 6 7 0 6 +// 220: 3 2 0 6 +// 221: 1 4 1 0 +// 222: 2 0 5 7 +// 223: 7 2 2 3 +// 224: 2 4 7 3 +// 225: 6 5 6 3 +// 226: 0 7 4 7 +// 227: 6 5 3 5 +// 228: 1 2 2 3 +// 229: 0 6 5 3 +// 230: 6 1 5 6 +// 231: 5 4 7 1 +// 232: 0 5 3 6 +// 233: 1 0 6 3 +// 234: 2 3 7 6 +// 235: 0 3 6 4 +// 236: 5 1 6 7 +// 237: 0 1 3 6 +// 238: 0 4 4 6 +// 239: 1 2 1 6 +// 240: 0 1 4 7 +// 241: 2 0 1 7 +// 242: 3 2 2 0 +// 243: 3 5 7 4 +// 244: 6 7 3 7 +// 245: 2 7 2 3 +// 246: 7 1 5 7 +// 247: 7 2 6 7 +// 248: 4 2 5 1 +// 249: 4 0 7 0 +// 250: 1 4 4 2 +// 251: 7 3 0 7 +// 252: 0 5 4 3 +// 253: 0 6 4 7 +// 254: 2 7 3 1 +// 255: 5 1 7 3 +// 256: 2 1 1 6 +// 257: 0 5 3 0 +// 258: 0 4 7 5 +// 259: 0 6 7 6 +// 260: 3 4 3 7 +// 261: 0 5 2 1 +// 262: 1 7 4 5 +// 263: 1 2 2 3 +// 264: 7 2 6 3 +// 265: 3 6 3 7 +// 266: 3 7 6 5 +// 267: 7 3 2 6 +// 268: 5 7 7 2 +// 269: 0 7 4 7 +// 270: 7 3 5 1 +// 271: 5 1 7 2 +// 272: 2 5 7 2 +// 273: 3 2 7 2 +// 274: 6 2 2 0 +// 275: 6 7 2 0 +// 276: 3 2 2 7 +// 277: 4 7 6 4 +// 278: 6 1 4 0 +// 279: 6 4 0 7 +// 280: 5 0 2 4 +// 281: 3 2 6 1 +// 282: 4 7 6 5 +// 283: 3 0 4 1 +// 284: 3 0 4 2 +// 285: 7 0 5 7 +// 286: 4 1 3 1 +// 287: 7 3 1 4 +// 288: 1 6 5 1 +// 289: 5 7 6 7 +// 290: 1 7 5 1 +// 291: 4 0 6 4 +// 292: 2 3 5 0 +// 293: 0 2 7 6 +// 294: 3 4 6 5 +// 295: 5 4 0 1 +// 296: 5 6 2 0 +// 297: 2 3 7 5 +// 298: 1 6 7 5 +// 299: 5 6 1 2 +// 300: 5 6 0 7 +// 301: 7 4 6 4 +// 302: 4 6 6 5 +// 303: 5 3 4 7 +// 304: 5 2 7 3 +// 305: 4 6 2 1 +// 306: 4 5 4 5 +// 307: 0 4 0 1 +// 308: 4 6 3 6 +// 309: 1 7 3 6 +// 310: 3 1 0 3 +// 311: 2 1 6 0 +// 312: 6 7 3 5 +// 313: 7 0 3 2 +// 314: 3 7 5 3 +// 315: 5 0 2 3 +// 316: 6 7 7 3 +// 317: 3 7 5 0 +// 318: 1 2 5 1 +// 319: 5 6 6 7 +// 320: 0 7 1 6 +// 321: 7 4 1 7 +// 322: 2 1 6 0 +// 323: 1 2 2 0 +// 324: 4 2 1 6 +// 325: 3 5 4 5 +// 326: 3 1 3 5 +// 327: 3 6 6 5 +// 328: 3 4 3 1 +// 329: 5 2 5 7 +// 330: 3 6 3 0 +// 331: 3 4 6 2 +// 332: 6 5 7 4 +// 333: 0 7 2 0 +// 334: 7 5 7 2 +// 335: 7 6 1 2 +// 336: 5 2 4 3 +// 337: 1 7 6 3 +// 338: 0 2 2 1 +// 339: 6 0 7 4 +// 340: 6 1 4 6 +// 341: 3 0 2 5 +// 342: 1 2 5 0 +// 343: 6 7 6 5 +// 344: 0 2 4 7 +// 345: 7 4 0 4 +// 346: 0 6 4 1 +// 347: 1 5 1 4 +// 348: 7 0 6 0 +// 349: 7 6 3 1 +// 350: 0 1 7 2 +// 351: 5 6 4 7 +// 352: 3 7 4 3 +// 353: 0 3 0 1 +// 354: 2 4 2 7 +// 355: 4 7 1 3 +// 356: 4 7 7 2 +// 357: 1 4 0 5 +// 358: 6 0 5 2 +// 359: 1 2 1 4 +// 360: 7 3 3 0 +// 361: 4 1 0 1 +// 362: 6 3 6 2 +// 363: 2 1 0 6 +// 364: 7 5 5 1 +// 365: 6 3 2 6 +// 366: 5 4 2 5 +// 367: 4 1 2 3 +// 368: 1 3 4 3 +// 369: 5 2 2 6 +// 370: 1 2 6 1 +// 371: 1 2 3 0 +// 372: 2 1 6 0 +// 373: 7 5 0 3 +// 374: 3 5 0 2 +// 375: 6 5 2 0 +// 376: 3 2 4 0 +// 377: 3 0 6 2 +// 378: 4 1 5 1 +// 379: 5 3 7 5 +// 380: 3 2 1 6 +// 381: 7 5 2 0 +// 382: 7 2 3 2 +// 383: 1 4 0 2 +// 384: 0 4 7 5 +// 385: 4 5 1 5 +// 386: 1 0 4 0 +// 387: 0 2 1 5 +// 388: 2 0 3 6 +// 389: 5 1 6 3 +// 390: 2 1 0 6 +// 391: 6 1 2 0 +// 392: 4 1 2 3 +// 393: 0 3 1 7 +// 394: 7 1 3 4 +// 395: 4 3 2 3 +// 396: 5 0 6 0 +// 397: 7 5 4 5 +// 398: 0 3 3 5 +// 399: 4 5 1 7 +// 400: 3 7 5 1 +// 401: 3 5 1 0 +// 402: 3 6 1 2 +// 403: 5 7 3 4 +// 404: 6 7 0 7 +// 405: 7 2 2 1 +// 406: 7 6 4 7 +// 407: 1 3 4 0 +// 408: 0 7 7 0 +// 409: 4 6 2 0 +// 410: 4 3 0 6 +// 411: 5 1 3 7 +// 412: 1 7 5 1 +// 413: 5 0 3 0 +// 414: 5 0 7 0 +// 415: 7 0 7 0 +// 416: 1 3 5 4 +// 417: 6 5 1 4 +// 418: 7 2 5 2 +// 419: 7 1 3 0 +// 420: 3 7 4 5 +// 421: 1 6 2 6 +// 422: 1 2 5 6 +// 423: 5 2 6 3 +// 424: 4 7 6 5 +// 425: 6 3 1 7 +// 426: 3 0 2 4 +// 427: 2 5 2 6 +// 428: 7 5 6 1 +// 429: 6 3 7 5 +// 430: 0 1 5 0 +// 431: 5 6 5 0 +// 432: 5 3 3 4 +// 433: 5 4 7 5 +// 434: 0 1 5 7 +// 435: 3 2 6 3 +// 436: 0 3 0 6 +// 437: 5 2 0 4 +// 438: 6 3 5 0 +// 439: 2 5 4 5 +// 440: 5 0 3 4 +// 441: 4 5 4 2 +// 442: 6 0 4 3 +// 443: 2 5 3 0 +// 444: 4 1 2 0 +// 445: 4 5 0 7 +// 446: 0 7 0 5 +// 447: 7 2 0 5 +// 448: 5 0 4 0 +// 449: 5 0 2 4 +// 450: 5 4 6 3 +// 451: 7 3 7 2 +// 452: 1 4 0 5 +// 453: 6 7 2 7 +// 454: 6 4 2 1 +// 455: 2 0 5 7 +// 456: 0 5 1 4 +// 457: 1 7 5 1 +// 458: 3 1 3 5 +// 459: 4 0 1 4 +// 460: 2 1 1 2 +// 461: 6 5 7 3 +// 462: 4 1 1 3 +// 463: 6 5 5 2 +// 464: 2 7 6 5 +// 465: 7 3 6 7 +// 466: 0 1 1 7 +// 467: 6 7 3 1 +// 468: 5 1 7 5 +// 469: 4 0 6 4 +// 470: 1 5 6 4 +// 471: 1 5 6 4 +// 472: 1 3 3 5 +// 473: 1 6 3 7 +// 474: 3 5 3 4 +// 475: 7 3 6 4 +// 476: 7 2 1 3 +// 477: 2 4 1 0 +// 478: 3 0 3 0 +// 479: 7 3 5 2 +// 480: 7 1 5 4 +// 481: 3 5 1 0 +// 482: 6 1 2 0 +// 483: 5 6 7 1 +// 484: 4 0 3 2 +// 485: 5 2 4 3 +// 486: 1 4 7 5 +// 487: 3 5 2 7 +// 488: 1 2 5 6 +// 489: 3 7 4 1 +// 490: 4 6 5 1 +// 491: 7 6 3 2 +// 492: 6 2 5 6 +// 493: 2 3 5 2 +// 494: 4 7 6 4 +// 495: 4 5 7 6 +// 496: 3 6 4 1 +// 497: 0 6 3 1 +// 498: 5 4 6 5 +// 499: 5 6 6 3 +// 500: 2 4 5 2 +// 501: 7 4 1 0 +// 502: 7 2 3 2 +// 503: 2 7 6 3 +// 504: 3 6 2 7 +// 505: 6 5 3 0 +// 506: 3 1 4 1 +// 507: 1 3 0 7 +// 508: 1 3 7 6 +// 509: 1 2 3 6 +// 510: 5 4 1 3 +// 511: 4 1 3 6 diff --git a/proto-newpow/mma-shadow/out/bench_0.log b/proto-newpow/mma-shadow/out/bench_0.log new file mode 100644 index 000000000..82a1e6348 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_0.log @@ -0,0 +1,24 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 0 mm8 per hash = 0 path = PTX mma.sync.m8n8k16.u8 +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.93 ms first, 1.89 ms second (256 MiB) +cache fill (host, one thread): 375.8 ms, GPU == host all words: PASS +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.62 ms first, 30.55 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +verify warp base 0 (pack vector, standalone): PASS +verify warp base 4096 (pack vector, standalone): PASS +verify warp base 1000000 (pack vector, standalone): PASS +warm-up batch: 16777216 hashes in 266.01 ms wall +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +verify warp base 0 (pack vector, in batch): PASS +verify warp base 4096 (pack vector, in batch): PASS +verify warp base 1000000 (pack vector, in batch): PASS +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.74 ms -> 63.078 MH/s +sustain start epoch 1791315749.655 +sustain end epoch 1791315774.658: 94 batches in 25.00 s -> 63.075 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_0.txt +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.075 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_0_ref.log b/proto-newpow/mma-shadow/out/bench_0_ref.log new file mode 100644 index 000000000..b88329e86 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_0_ref.log @@ -0,0 +1,19 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 0 mm8 per hash = 0 path = reference (shuffles + byte products) +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.80 ms first, 1.77 ms second (256 MiB) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.58 ms first, 30.51 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +verify warp base 0 (pack vector, standalone): PASS +verify warp base 4096 (pack vector, standalone): PASS +verify warp base 1000000 (pack vector, standalone): PASS +warm-up batch: 16777216 hashes in 266.00 ms wall +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +verify warp base 0 (pack vector, in batch): PASS +verify warp base 4096 (pack vector, in batch): PASS +verify warp base 1000000 (pack vector, in batch): PASS +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_128.log b/proto-newpow/mma-shadow/out/bench_128.log new file mode 100644 index 000000000..1b35a61af --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_128.log @@ -0,0 +1,19 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 128 mm8 per hash = 1024 path = PTX mma.sync.m8n8k16.u8 +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 32 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.91 ms first, 1.87 ms second (256 MiB) +cache fill (host, one thread): 347.9 ms, GPU == host all words: PASS +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.61 ms first, 30.56 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 128 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 265.96 ms wall +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.82 ms -> 63.077 MH/s (GPU time), wall 2659.83 ms -> 63.076 MH/s +sustain start epoch 1791315890.874 +sustain end epoch 1791315915.893: 94 batches in 25.02 s -> 63.034 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_128.txt +SUMMARY R=128 regs=32 blocksPerSM=24 mhs=63.077 mhs_wall=63.076 mhs_sustain=63.034 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_128_ref.log b/proto-newpow/mma-shadow/out/bench_128_ref.log new file mode 100644 index 000000000..228c3a13a --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_128_ref.log @@ -0,0 +1,14 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 128 mm8 per hash = 1024 path = reference (shuffles + byte products) +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 175 registers/thread, 8 resident blocks/SM at 1 warp(s)/block = 8 resident warps/SM (16.7% of 48) +cache fill (GPU): 1.78 ms first, 1.79 ms second (256 MiB) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.58 ms first, 30.52 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 128 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 447.05 ms wall +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=128 regs=175 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_32.log b/proto-newpow/mma-shadow/out/bench_32.log new file mode 100644 index 000000000..ba9fc0b88 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_32.log @@ -0,0 +1,19 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 32 mm8 per hash = 256 path = PTX mma.sync.m8n8k16.u8 +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.90 ms first, 1.87 ms second (256 MiB) +cache fill (host, one thread): 349.6 ms, GPU == host all words: PASS +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.62 ms first, 30.56 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 32 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 266.00 ms wall +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.75 ms -> 63.078 MH/s (GPU time), wall 2659.77 ms -> 63.078 MH/s +sustain start epoch 1791315833.292 +sustain end epoch 1791315858.296: 94 batches in 25.00 s -> 63.072 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_32.txt +SUMMARY R=32 regs=29 blocksPerSM=24 mhs=63.078 mhs_wall=63.078 mhs_sustain=63.072 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_32_ref.log b/proto-newpow/mma-shadow/out/bench_32_ref.log new file mode 100644 index 000000000..29549b98d --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_32_ref.log @@ -0,0 +1,14 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 32 mm8 per hash = 256 path = reference (shuffles + byte products) +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 151 registers/thread, 12 resident blocks/SM at 1 warp(s)/block = 12 resident warps/SM (25.0% of 48) +cache fill (GPU): 1.80 ms first, 1.77 ms second (256 MiB) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.57 ms first, 30.52 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 32 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 265.96 ms wall +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=32 regs=151 blocksPerSM=12 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_512.log b/proto-newpow/mma-shadow/out/bench_512.log new file mode 100644 index 000000000..7d4ce4e70 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_512.log @@ -0,0 +1,19 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 512 mm8 per hash = 4096 path = PTX mma.sync.m8n8k16.u8 +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 36 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.93 ms first, 1.89 ms second (256 MiB) +cache fill (host, one thread): 348.1 ms, GPU == host all words: PASS +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.62 ms first, 30.54 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 512 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 265.98 ms wall +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.85 ms -> 63.076 MH/s (GPU time), wall 2659.86 ms -> 63.075 MH/s +sustain start epoch 1791316287.337 +sustain end epoch 1791316312.340: 94 batches in 25.00 s -> 63.073 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_512.txt +SUMMARY R=512 regs=36 blocksPerSM=24 mhs=63.076 mhs_wall=63.075 mhs_sustain=63.073 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_512_ref.log b/proto-newpow/mma-shadow/out/bench_512_ref.log new file mode 100644 index 000000000..614808958 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_512_ref.log @@ -0,0 +1,14 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 512 mm8 per hash = 4096 path = reference (shuffles + byte products) +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 213 registers/thread, 8 resident blocks/SM at 1 warp(s)/block = 8 resident warps/SM (16.7% of 48) +cache fill (GPU): 1.82 ms first, 1.78 ms second (256 MiB) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.58 ms first, 30.52 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 512 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 994.87 ms wall +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=512 regs=213 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_8.log b/proto-newpow/mma-shadow/out/bench_8.log new file mode 100644 index 000000000..8af41bc27 --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_8.log @@ -0,0 +1,19 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 8 mm8 per hash = 64 path = PTX mma.sync.m8n8k16.u8 +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 30 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.92 ms first, 1.86 ms second (256 MiB) +cache fill (host, one thread): 349.8 ms, GPU == host all words: PASS +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.61 ms first, 30.55 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 8 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 266.01 ms wall +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.75 ms -> 63.078 MH/s +sustain start epoch 1791315790.867 +sustain end epoch 1791315815.870: 94 batches in 25.00 s -> 63.074 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_8.txt +SUMMARY R=8 regs=30 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.074 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/bench_8_ref.log b/proto-newpow/mma-shadow/out/bench_8_ref.log new file mode 100644 index 000000000..7751f8bed --- /dev/null +++ b/proto-newpow/mma-shadow/out/bench_8_ref.log @@ -0,0 +1,14 @@ +mma-shadow bench pack "igneum-genesis" class mx8+mm8xR R = 8 mm8 per hash = 64 path = reference (shuffles + byte products) +mm8 table seed 0x79f1fc5b6ed6112e (first steps: see mm8_block.h) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24092 MiB) SM clock 2520 MHz, mem clock 10501 MHz, bus 384 bits, L2 72 MiB, max 1536 threads/SM +CUDA: driver 12.8, runtime 12.8 +igneum_hash_info: 77 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache fill (GPU): 1.81 ms first, 1.79 ms second (256 MiB) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset build (GPU, 1024 MiB): 30.59 ms first, 30.52 ms second +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +pack vectors: not applicable at R = 8 (checked at R = 0 only) +warm-up batch: 16777216 hashes in 265.99 ms wall +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=8 regs=77 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS diff --git a/proto-newpow/mma-shadow/out/dump_0.txt b/proto-newpow/mma-shadow/out/dump_0.txt new file mode 100644 index 000000000..8e49d4cc3 --- /dev/null +++ b/proto-newpow/mma-shadow/out/dump_0.txt @@ -0,0 +1,1024 @@ +3588372608 0 d737761e92a697bc +3588372608 1 7cf5d4185f629903 +3588372608 2 ae9e165c74c0e356 +3588372608 3 3e815f4c78d8191b +3588372608 4 6d5fe9a4dc0bffae +3588372608 5 6bc1f4d66babc650 +3588372608 6 eb1cbe11bd340a57 +3588372608 7 3dc8492b27665c39 +3588372608 8 7607923a0ce14204 +3588372608 9 ad0d0c30b5fb98be +3588372608 10 82aacbb5e5aaa9d7 +3588372608 11 ff724a9847693c29 +3588372608 12 7d025e7543809643 +3588372608 13 46db361426489b6e +3588372608 14 84920b7658750381 +3588372608 15 9a5cb1d0c648f942 +3588372608 16 264af2ce53cd9fb3 +3588372608 17 407c674090870484 +3588372608 18 a424e8442fc60cc2 +3588372608 19 63b6a4bd39997fd8 +3588372608 20 b1d89ddfe2b17fec +3588372608 21 8e4c98cc2eb8671d +3588372608 22 7505407c2f5efa01 +3588372608 23 7f137aff34883655 +3588372608 24 da8468a53571b10f +3588372608 25 ed001007bbd7e5c9 +3588372608 26 e2e42a306733418c +3588372608 27 7e9af94d9ffbb573 +3588372608 28 cd245a1571d1645d +3588372608 29 2bb343ed663d6603 +3588372608 30 662038e02e9a4ac6 +3588372608 31 87888f492f3a56fc +1023626400 0 be052745905fde0a +1023626400 1 9501051e48d05afc +1023626400 2 c7611ee25aa25c85 +1023626400 3 42dc1849e6f0be5e +1023626400 4 0b597a1c3a122d8b +1023626400 5 74d55d2a9014eb21 +1023626400 6 52ff62e9281a2be2 +1023626400 7 a3bd691551face14 +1023626400 8 c5aeafc7241cea50 +1023626400 9 9510dd246ee8f239 +1023626400 10 6cba68f215c19157 +1023626400 11 c3fd02d67e7e4d9e +1023626400 12 62839cae250311e7 +1023626400 13 a92579a17796c0d2 +1023626400 14 e6954765dd6f6083 +1023626400 15 eab6a705167e195b +1023626400 16 39d230dde17b8039 +1023626400 17 eb3662aa6444a30d +1023626400 18 5c90d512a9ec5f40 +1023626400 19 894ed47b1ab31bb7 +1023626400 20 928f5df57e3110f6 +1023626400 21 219c2d4743a30f8e +1023626400 22 3a055ab93b57173b +1023626400 23 bd328564737d2f91 +1023626400 24 e4badbb662cc8837 +1023626400 25 d9eebc788ef78315 +1023626400 26 0010f5ebdbd2199e +1023626400 27 cbb172f25defc4e3 +1023626400 28 46720e453cc9c140 +1023626400 29 0c99f7f61d2d8bbf +1023626400 30 77fd7ffcc3dae0a2 +1023626400 31 ef455575df7bc816 +3929384352 0 6285782eec68e457 +3929384352 1 90b9deded50365b5 +3929384352 2 7751f705476ae14f +3929384352 3 62b7d52f5dfb5d15 +3929384352 4 1e049b675bbddbea +3929384352 5 6a5005745f35b9b6 +3929384352 6 e3aba945d63d7650 +3929384352 7 5d5f18209a79eb2b +3929384352 8 dc6cb890767bce9a +3929384352 9 fd36a31d86765984 +3929384352 10 73e176dc2c5eb6cc +3929384352 11 1696dbb22bbf6f84 +3929384352 12 f0e5260690196661 +3929384352 13 b1d826cd86b2f465 +3929384352 14 bc763b4329a32906 +3929384352 15 767501c7f097d6df +3929384352 16 ebc2ab245511bae1 +3929384352 17 fd15b17cc3c0ccf1 +3929384352 18 9b3d2f8213c2011f +3929384352 19 ce05efe6c15d17af +3929384352 20 fb16d7362dec3983 +3929384352 21 479151acbe68bb4c +3929384352 22 2ff4ef097ba3ba1a +3929384352 23 ae8ed717b7711d0a +3929384352 24 de93e0ba16965038 +3929384352 25 5ade69e7fe742a38 +3929384352 26 0e8811e0b4ba44f7 +3929384352 27 fef4708914dd637c +3929384352 28 63b04c5f8f2f9941 +3929384352 29 d070da7753246f94 +3929384352 30 201ee1025bd4772d +3929384352 31 b93d4c070b52c4c0 +1113183520 0 0eb606a688fd65fc +1113183520 1 085ef4199b602785 +1113183520 2 8e2a3cae5f1c0c0d +1113183520 3 c05779fb7016d149 +1113183520 4 bac8431050e45d9d +1113183520 5 35d2b69d4636c55e +1113183520 6 d9d40338c3880c87 +1113183520 7 36fc20f604f2562b +1113183520 8 e5501268296813ca +1113183520 9 2a11e77d6f2a4c23 +1113183520 10 c9943415139689a9 +1113183520 11 7408013e306b76f5 +1113183520 12 c77a33dbeabc3f62 +1113183520 13 8f818ff2abed3d0f +1113183520 14 a946aaae877a156f +1113183520 15 3191223e7be5c33e +1113183520 16 128f2831dbcb709c +1113183520 17 d5af6b31c8fcdc3d +1113183520 18 cecf20c41373a293 +1113183520 19 47e78c119b85624e +1113183520 20 bca7bad393a346dc +1113183520 21 abd36e65c261bf02 +1113183520 22 c268df3ee7c1dcdd +1113183520 23 2fd1b263d99ba643 +1113183520 24 be831307bfe28330 +1113183520 25 ba9dc122e7ef238d +1113183520 26 df519a1d4a4dd367 +1113183520 27 dddd43cfaba2615f +1113183520 28 f6da59736ecff87f +1113183520 29 811b37e35f878343 +1113183520 30 673e685c84b530ce +1113183520 31 2e40ae6e28824e95 +1774593184 0 9ea159523d8477dc +1774593184 1 e2afc9c2dcdfa760 +1774593184 2 77859e09b9e62ea0 +1774593184 3 22c94854591c8aa2 +1774593184 4 4d51a8d51ac33532 +1774593184 5 339d83515cc4e55b +1774593184 6 46689708d27ca400 +1774593184 7 9939954f16be5416 +1774593184 8 c2d1214398d53201 +1774593184 9 adf9969f01a0af5f +1774593184 10 1e6d3f18472ce54d +1774593184 11 9a564512b07f9c6d +1774593184 12 a751bd52f21a3bbd +1774593184 13 35da405fae85b4fc +1774593184 14 d36dc78eb7d556a5 +1774593184 15 1cadc04b64fc2759 +1774593184 16 5a5e316ea609c3e2 +1774593184 17 4c408fd9e08ccb80 +1774593184 18 cbe4f9a35d82e553 +1774593184 19 c10c6ae05223a341 +1774593184 20 af9016c6fffb62aa +1774593184 21 6b17b9ee862a6e82 +1774593184 22 ab52897c3a07bbbf +1774593184 23 6878ececb5f5ef34 +1774593184 24 f2689f9c8470caa8 +1774593184 25 58e7237fd9191682 +1774593184 26 e33683d520ad54e7 +1774593184 27 84f273eca1e21943 +1774593184 28 3b320fbcc420d3e1 +1774593184 29 a3e5bea3ddc75bee +1774593184 30 e4b274226521a896 +1774593184 31 b94398b2a5a86020 +637272864 0 1127439264e59a6a +637272864 1 5c808166735a647d +637272864 2 25193e7ed2233622 +637272864 3 b5eae07a2e1d9f68 +637272864 4 5fe80e0aef35ae33 +637272864 5 2e1df6ad254f0f09 +637272864 6 85b7f9a5e26b7ad7 +637272864 7 58fe52100bf07f13 +637272864 8 b5e1a5feb7d05ea1 +637272864 9 86c00d184e5b7743 +637272864 10 aae2f3142ddb3982 +637272864 11 aa5472921c9607c5 +637272864 12 dcce91527cf8e124 +637272864 13 089ca6a8f11ec62e +637272864 14 e005f10ec2a93e73 +637272864 15 3ab3a78e2b0b09f3 +637272864 16 53c001d437ac6bf4 +637272864 17 3819c8ce7190332b +637272864 18 096ad5541455f5fd +637272864 19 31f332b22c9b3a9e +637272864 20 ce57cda1402732ee +637272864 21 ac62b6bc42889050 +637272864 22 cbd72e1e4ee5b5a3 +637272864 23 2e601656c3b248f9 +637272864 24 b8d35947f3b6363e +637272864 25 f55cac0605d25e86 +637272864 26 65ce1ca375eaabfb +637272864 27 e352ee7e412362ba +637272864 28 29b6c45ff3ccf1bc +637272864 29 fee9c2190f4ecc20 +637272864 30 ee0f3986e731414c +637272864 31 35ab6a7129a5d77c +2482166944 0 24b114685e8644e8 +2482166944 1 dc1021bb1d4fd113 +2482166944 2 22256e24d23de4d3 +2482166944 3 b574ddffdf9960e4 +2482166944 4 44069905b781f836 +2482166944 5 12a06a994e13d46f +2482166944 6 4f6c9a92238c776c +2482166944 7 4f6088b4205034cc +2482166944 8 f56561d2b020d709 +2482166944 9 edd371d51254d46a +2482166944 10 2b975d8d14cab985 +2482166944 11 c7dd5cdbe388e283 +2482166944 12 c0a4a7827f98de16 +2482166944 13 5bcfe2cc996724ef +2482166944 14 227c39186d7120ff +2482166944 15 85aba274ccaaa4b8 +2482166944 16 e4c6a90de9b4deb4 +2482166944 17 638528746fd3dd82 +2482166944 18 1828ef67145b5bd0 +2482166944 19 aac7fdee9d575450 +2482166944 20 2ea2b2c67f7f4a2f +2482166944 21 decef73fefe0cee3 +2482166944 22 8b71d608b84fd578 +2482166944 23 e75b6031e321ca4f +2482166944 24 ec3cf4690769f370 +2482166944 25 a45bd706ad389f05 +2482166944 26 62de8e316ad3b759 +2482166944 27 1fa47e5df3999098 +2482166944 28 5e302331b7706cd3 +2482166944 29 6aafd4071720ce35 +2482166944 30 37b7eee1ddf9bf1c +2482166944 31 b0e52fda2eceb5a3 +1243715392 0 693035a21348de6e +1243715392 1 2821d8bf14b81cf1 +1243715392 2 31433344bb5c34db +1243715392 3 74583a5c59c32e30 +1243715392 4 c9075fc1d32ead05 +1243715392 5 897b67a8ce7b5f95 +1243715392 6 7b26a34b58bb4e50 +1243715392 7 08fda775f596836c +1243715392 8 38fabdb6b8b87bc2 +1243715392 9 a690cf5199b11bf5 +1243715392 10 528a34d63a3a34ff +1243715392 11 6686b6c67864e7b2 +1243715392 12 a35a9e2f9ba91cc7 +1243715392 13 ce41e987a45b8609 +1243715392 14 92bd7bfcf9c48ede +1243715392 15 3a8a40881594e0bb +1243715392 16 68d45d64537b2e36 +1243715392 17 78b2d9f278591dfb +1243715392 18 7268ce1ee8aea82b +1243715392 19 511452e849f3adad +1243715392 20 d53b89a0667c2329 +1243715392 21 b7cbfab7c8603380 +1243715392 22 d51a8758dd7dbae4 +1243715392 23 d732c6332256ee2e +1243715392 24 2e6e396cc125fe31 +1243715392 25 d4a40804f415d949 +1243715392 26 a6e364d2a8ddf234 +1243715392 27 2af5338f634db43b +1243715392 28 5459e13d2e26c78f +1243715392 29 d69b0f56e69dd8da +1243715392 30 2d511bc5bc4fff49 +1243715392 31 3fe1cc67c22b1816 +209806816 0 e71249f996fccd41 +209806816 1 98604a4aa75c9396 +209806816 2 f575ed9a55a6e1ef +209806816 3 717eae32df9b88c8 +209806816 4 b98a780488db0063 +209806816 5 38022428d13b1afd +209806816 6 0fbbb6584f149400 +209806816 7 2e55e6e13c650dc9 +209806816 8 f5fe60e9cd800dc6 +209806816 9 64fef5a74cf7e93d +209806816 10 8a13e89b78f9f5f4 +209806816 11 4d5629168bde6b43 +209806816 12 19124170d5a37e23 +209806816 13 227d0c94547e95fc +209806816 14 5bed713fd8e77ab4 +209806816 15 4c9da2cfe24ad554 +209806816 16 87d05a61a48e7ea1 +209806816 17 5c7dd307fe6021a6 +209806816 18 8da0a5a17f27bff1 +209806816 19 19d927a1e490fc86 +209806816 20 13c132259de17833 +209806816 21 dc0e6c8b31093c15 +209806816 22 6d3fed5d6b5b578a +209806816 23 86559d33a77c3387 +209806816 24 e166097e6f5cf715 +209806816 25 0c78184009f6bdaf +209806816 26 d670c46305c66649 +209806816 27 ff806ffb1fb12184 +209806816 28 903eee0b0ef8a267 +209806816 29 06253a9f3046be42 +209806816 30 a1ffa2e7ce22629e +209806816 31 f277122a1dd0b612 +3395624224 0 1fec46ce3c168305 +3395624224 1 d15ad1b953ae198d +3395624224 2 82bdb28c3f8ba54c +3395624224 3 36b214601279d489 +3395624224 4 a49d880de44e2a32 +3395624224 5 8f32dd1c427f8927 +3395624224 6 44a0dc752ba43d54 +3395624224 7 14d5fa93f51d4b20 +3395624224 8 0accb9024d8180d0 +3395624224 9 7f916803a7562f08 +3395624224 10 fca7c652bb0e2709 +3395624224 11 0a4602b4c02b78ea +3395624224 12 bbb3b28dbe674ab2 +3395624224 13 bb69a6f1f485d68b +3395624224 14 7d2e5be7d1c1fa15 +3395624224 15 77e5b1df398d16b4 +3395624224 16 67d396910c23c664 +3395624224 17 54826e658795f33a +3395624224 18 42a3eb292fe05631 +3395624224 19 75956458e5d82d7b +3395624224 20 aea74d7df2ebbc3d +3395624224 21 4d52bdde670624ea +3395624224 22 345ddc96ee7b66c3 +3395624224 23 a230e97c7297e3f6 +3395624224 24 79a2f2bb54049379 +3395624224 25 a7515d45b29ede97 +3395624224 26 915a9478b253c5f0 +3395624224 27 9fd48860f3087aa1 +3395624224 28 d71e037af0a83384 +3395624224 29 7c35a90bde98b9c9 +3395624224 30 822ec9bfea08705b +3395624224 31 8e783f528fe020bd +3886889632 0 14766a0cf487303f +3886889632 1 67628abd8fb0137c +3886889632 2 508c532162ecd6be +3886889632 3 23f9a638a08bbdc8 +3886889632 4 b266af51160fda91 +3886889632 5 f6e2c89cabe9cef3 +3886889632 6 c6db75e95b84140e +3886889632 7 5d3b93ad07d15886 +3886889632 8 6f1de045388b154f +3886889632 9 f03edb7043342957 +3886889632 10 b47d36b2b30ad809 +3886889632 11 75c29adb387459b2 +3886889632 12 436ab3ea755a2b52 +3886889632 13 f83a354c4c7e48c6 +3886889632 14 4dfb6f5372fc1041 +3886889632 15 6bbb77eedffaadf0 +3886889632 16 c61756c76124a45a +3886889632 17 91dba24a7ace5755 +3886889632 18 6f41bf98d3461c50 +3886889632 19 d2d01f2b36423bae +3886889632 20 65f0796a52b74008 +3886889632 21 a6ca72478f7b6411 +3886889632 22 ce8268642760f16f +3886889632 23 30c1b8ae6dbb38d1 +3886889632 24 636d407c509ac111 +3886889632 25 e29319538a376ecf +3886889632 26 04b53b086484ccd1 +3886889632 27 781adeb7ab9fa217 +3886889632 28 91cc9a9a320add69 +3886889632 29 df7f94ba04241d23 +3886889632 30 06174f247d1f2cd1 +3886889632 31 7eef5424f424e875 +2045577696 0 b1601239a1d28f64 +2045577696 1 deb833e7a690b6ff +2045577696 2 13549fb326487db4 +2045577696 3 d1709c20b54bd2cd +2045577696 4 f6f7a746da5ccfa8 +2045577696 5 c2f31cb8b646d90f +2045577696 6 0e8289b7c0227bde +2045577696 7 8dcd98692937065e +2045577696 8 7dd627ea236b6419 +2045577696 9 5c7eb3b923df69f2 +2045577696 10 15feab951809cfce +2045577696 11 8abb931a14ad09d1 +2045577696 12 3a4ff6bebfdccddf +2045577696 13 e29e460e2e1779e4 +2045577696 14 1aaa2cc6946c0464 +2045577696 15 2cac17cc3a4ed0ec +2045577696 16 cd1b9c4541668b79 +2045577696 17 8e944de67a9e3526 +2045577696 18 15fc4fb09b6a22d1 +2045577696 19 90a880e9f1898cd7 +2045577696 20 0647e5e3331ae564 +2045577696 21 afb6bd365be2b7a3 +2045577696 22 d6ac8b5964b81341 +2045577696 23 1ceb2c18f887001e +2045577696 24 2223486b01786c0b +2045577696 25 562c6814e263b1c5 +2045577696 26 5532afc7bd9f214b +2045577696 27 b62eabf0a1418d30 +2045577696 28 d81e69b725e64faa +2045577696 29 ff446c21e1a2be2b +2045577696 30 339af576926877d9 +2045577696 31 1fe41a36bdc129ba +2073778688 0 a58494d2cd05a46d +2073778688 1 1d19ae35946fbd02 +2073778688 2 a8240272ea14fe87 +2073778688 3 ca012903d3e3195a +2073778688 4 55a6aed302802800 +2073778688 5 27f23a9e688c60e8 +2073778688 6 134c581dce8fad69 +2073778688 7 18e6f7f4f22ca1dc +2073778688 8 d59baf3c6c48686d +2073778688 9 6bdcf604492fef7f +2073778688 10 3bcbda17d3eb8ef6 +2073778688 11 8e1a47ae5db4da54 +2073778688 12 39b1d2a7b1944cb7 +2073778688 13 8575d587393c26f1 +2073778688 14 b71519c64ffd72a7 +2073778688 15 692e70418eda02a0 +2073778688 16 545c421f4ecb5cd6 +2073778688 17 47d57511eb76e018 +2073778688 18 2c4e87d71ceca50c +2073778688 19 81db3191f79a1803 +2073778688 20 4d878af887118ed3 +2073778688 21 7628394cd9cb5ee5 +2073778688 22 ca71f131c311a2bd +2073778688 23 185ff4e76829a497 +2073778688 24 accaa7b7bc36371f +2073778688 25 3b207f87efbf39b3 +2073778688 26 505b38d4f48860e9 +2073778688 27 1832fdd876c545ae +2073778688 28 6ec6398bff09c56d +2073778688 29 d603490e3cd774d6 +2073778688 30 8e14f38a10d06bcf +2073778688 31 e02e255765c5ce19 +10993408 0 4f8e1a33945e9a09 +10993408 1 67e9e80483e88ba1 +10993408 2 95446e159e338a6b +10993408 3 8b1fdc56e4a00aa9 +10993408 4 13665631a192c724 +10993408 5 d1064b26b35e6b2a +10993408 6 5c100fef4c1dfd03 +10993408 7 3783af767bdf035a +10993408 8 177c75ac121f1aff +10993408 9 6d3b53a21856f19e +10993408 10 7b045bfcc8df2aee +10993408 11 6987be5d66a2708f +10993408 12 ee87f819cc8dee8d +10993408 13 da9165e9f75ba0c1 +10993408 14 ec63ca7755e1a692 +10993408 15 a97b86cb873688e2 +10993408 16 21fc5ea888dcde21 +10993408 17 66166c55613c2120 +10993408 18 4891e1d8a6afb587 +10993408 19 3b2b277503500638 +10993408 20 2f69352c3bdbb673 +10993408 21 069a836616e375bb +10993408 22 c29a0ec14041b1fa +10993408 23 29b3b940d88a17e3 +10993408 24 2d270b24ef310ace +10993408 25 783d7c242607fabb +10993408 26 44e3989870a0d0ba +10993408 27 143081bedaa5d1e4 +10993408 28 941d0ef6483c4fab +10993408 29 b51bc8157d904e18 +10993408 30 c8c5283a8b1f0dbb +10993408 31 5dd0d71b699ee45b +3490840416 0 e0e431dd005cf063 +3490840416 1 25894ada33cbf479 +3490840416 2 d517831cf3eee844 +3490840416 3 07c8b522e79f6b02 +3490840416 4 3bc6bdee83ca3580 +3490840416 5 13b78f3bcd2f26a9 +3490840416 6 ea3400b06414b1be +3490840416 7 89ee337657bcfca4 +3490840416 8 a79807b334f46141 +3490840416 9 b1c9097729ec2d84 +3490840416 10 0ef35a073d36fbed +3490840416 11 074cf9b1d6fee2ed +3490840416 12 e5d67113c8e8825c +3490840416 13 5e5b56237e36bf3d +3490840416 14 90c239e76a433baa +3490840416 15 b9f91d32d137705e +3490840416 16 cc0ba108ddd53c43 +3490840416 17 609970887b1c4f66 +3490840416 18 e78856ddec756072 +3490840416 19 5206dd546b34b727 +3490840416 20 7f2d55d9848ab1e5 +3490840416 21 3742f231a758c15b +3490840416 22 768bd45ba3c1c184 +3490840416 23 f5116ab177ecf1ae +3490840416 24 82f3e8a04f472039 +3490840416 25 bab5430ac22478bc +3490840416 26 c5d5d7fc84bdf629 +3490840416 27 737a453034597eef +3490840416 28 72861e733fead4a2 +3490840416 29 1b73b5d2515725ca +3490840416 30 17ddf29a626c1a84 +3490840416 31 750805b3b3b3e48b +2848373920 0 c0ecfa7e9b8fe5b7 +2848373920 1 92cc5213e5c4ddc6 +2848373920 2 9a9d94ae055ba278 +2848373920 3 d3bfe95ea3f1e8c4 +2848373920 4 ddf62823d892ad8d +2848373920 5 8ce6d6e82ee9701a +2848373920 6 32ee714d528dbe39 +2848373920 7 0130d214a04c6e4b +2848373920 8 84d66499c6424779 +2848373920 9 0c3bca92759552db +2848373920 10 79ead18250825508 +2848373920 11 7be19f91139ef6d7 +2848373920 12 982b2251c56718a6 +2848373920 13 18a38ad4f945124f +2848373920 14 849276bdfa5034aa +2848373920 15 9541c8b0bc875b13 +2848373920 16 f0250063612db9a4 +2848373920 17 a9207e39f2b0627d +2848373920 18 a5414c46d0765b09 +2848373920 19 d5648bc3a1a3c8d4 +2848373920 20 630bfdec30e73b12 +2848373920 21 464d3d95eb81d517 +2848373920 22 127ff11fb6e063e0 +2848373920 23 797c7af6eb93a26e +2848373920 24 9d6900627ff4ee89 +2848373920 25 643c4194c8a6df1e +2848373920 26 a97db67cb86f6c90 +2848373920 27 003e1bfac097b72c +2848373920 28 399be73895b4a2dd +2848373920 29 b07c81511f6b733d +2848373920 30 d065e7d5bf9f2c2d +2848373920 31 341e568900cc679b +2880556800 0 49ee828d30759c80 +2880556800 1 eb107a87c4735add +2880556800 2 a9c77d66a5d0807a +2880556800 3 ea33ea5f715390b5 +2880556800 4 f976f3603fc99d66 +2880556800 5 a35a6a3fb5b052f0 +2880556800 6 f5df9f5682b10284 +2880556800 7 6a928016affa8991 +2880556800 8 a4ead3bc81d72add +2880556800 9 c54fd56640bec294 +2880556800 10 12d34ed5ed843350 +2880556800 11 ab10d630df15e610 +2880556800 12 5c79f247071120cb +2880556800 13 4b19c9b89edb7c63 +2880556800 14 4a18a787ec4c49e6 +2880556800 15 6ee41150caefd74c +2880556800 16 d6f3ad83db9a8e7d +2880556800 17 a867bf207bb340e3 +2880556800 18 f1e8fabc25847d64 +2880556800 19 82ad8cda84e82e51 +2880556800 20 199b7217a3cda03e +2880556800 21 82ea73515a53246d +2880556800 22 78e8f52452cd4e7b +2880556800 23 203f5163d04c33a1 +2880556800 24 1df4bed1dc3588d1 +2880556800 25 2eb798a88844717f +2880556800 26 5878e1c2da6c88bb +2880556800 27 44dccc1accf45187 +2880556800 28 b28f08f778b83f82 +2880556800 29 027849fdc70a856f +2880556800 30 2e9d2e65018c1f14 +2880556800 31 f670e2a45fd267a9 +3625086080 0 85b778815aa4d8cb +3625086080 1 01c1944996c43d42 +3625086080 2 eae0dcb50e562fee +3625086080 3 5fa257467b3b4f9b +3625086080 4 e646f48f4264ef4f +3625086080 5 ed53b5bdce4c2e34 +3625086080 6 1e076c32980c1ee7 +3625086080 7 a40f3ee15c8d6561 +3625086080 8 437322e856835adc +3625086080 9 c4e42140171603c5 +3625086080 10 ea3c2ce70d9edca1 +3625086080 11 da556a6044c11bae +3625086080 12 e0d46c1b3d59ec6e +3625086080 13 d17d02aa3917f6b8 +3625086080 14 ecfa8842cb9180a7 +3625086080 15 8de79e252ccbd96f +3625086080 16 d340b4cc0736a5f1 +3625086080 17 34676a59772445f6 +3625086080 18 6cd9cd9e1ef69de5 +3625086080 19 f608b8b8a2c01cbc +3625086080 20 33360f62b523304a +3625086080 21 af3eb35919641bb2 +3625086080 22 efe5852de525efcd +3625086080 23 f9cff03667bcf02b +3625086080 24 2da3cbd6767b91e3 +3625086080 25 08e661bee5749d06 +3625086080 26 d550cb17625eb197 +3625086080 27 284ff6818d2493b0 +3625086080 28 d28e35a03b7d83ba +3625086080 29 80dfc3e49119dec2 +3625086080 30 d14cff9ef91a80d8 +3625086080 31 566064295be44225 +2537065920 0 21788983438b806c +2537065920 1 3311559e8958eb74 +2537065920 2 09f540632cbe9c78 +2537065920 3 b5df556592aa52a4 +2537065920 4 15b8e19e388161c3 +2537065920 5 55f91129c12bb4d1 +2537065920 6 f3ca2d43f17131a2 +2537065920 7 5e0f5e7762d30982 +2537065920 8 44c01e6fe6d5d0f4 +2537065920 9 78704abee2ad0e5a +2537065920 10 a7d3b3b64ac59a13 +2537065920 11 de6d2cc58f3c4b0c +2537065920 12 02a79e2b525ec75f +2537065920 13 91eb93dcac4f08ab +2537065920 14 2787859ef7ac9483 +2537065920 15 3ea931ad7c95430c +2537065920 16 95c0d16de04a4f5d +2537065920 17 8f6d36bea39d1a90 +2537065920 18 f54097a9a1d9d43d +2537065920 19 f4d92a257a7cc9d9 +2537065920 20 40ff66b335b146a5 +2537065920 21 bfc88e11927dde50 +2537065920 22 52ef1fc0fd5ce0e0 +2537065920 23 1fc698a91213bd47 +2537065920 24 33eca3ed601f3597 +2537065920 25 4b6b84e78f963ecb +2537065920 26 bacccd251afa8ce6 +2537065920 27 c67da57d4d3ab47b +2537065920 28 8f408fbdcd016742 +2537065920 29 1a00b0c29cc1d764 +2537065920 30 e25f7ffc2cb39730 +2537065920 31 2f982e5004860192 +1646897088 0 eb4339dc1f862181 +1646897088 1 b0f40325991b61ad +1646897088 2 934444542229201a +1646897088 3 9b785c33f4dc5ec3 +1646897088 4 4825241ec47f7f9d +1646897088 5 521fc425c12f0f9b +1646897088 6 3ce835c68a67b77e +1646897088 7 75df760a902d5b1f +1646897088 8 3b6555d5a0361272 +1646897088 9 8ec7112737da961a +1646897088 10 1d33eb74360cfde9 +1646897088 11 994510862de6f59c +1646897088 12 f7c27e2ef5e213d7 +1646897088 13 0bdbc796191073ec +1646897088 14 5576a929aa749dd2 +1646897088 15 69cc751cebc27f9a +1646897088 16 95a9adfc9657384b +1646897088 17 552c46a03c3e88f9 +1646897088 18 391505c7a3c4f248 +1646897088 19 533236e35ebdb1d0 +1646897088 20 2523203d167f49c4 +1646897088 21 6ce9648c10fe1888 +1646897088 22 2347b2f22a1cd93f +1646897088 23 7713357d11c6e038 +1646897088 24 6e5138c8b05d5105 +1646897088 25 b147e168263ad259 +1646897088 26 fe9f1e0056a89c5e +1646897088 27 4b6e8fa4507a9bb6 +1646897088 28 348bae4ebeb2bc56 +1646897088 29 ada906491a11115d +1646897088 30 57921ef3e86974b9 +1646897088 31 f39e933fd5bcd814 +1124098848 0 42fc135c3e5222d5 +1124098848 1 48eb3c7aa3d4d853 +1124098848 2 9f5e3dff92dd3e55 +1124098848 3 2aaeb7fba82377bc +1124098848 4 8b6eaac0a826d920 +1124098848 5 fdb79c7dbff07552 +1124098848 6 c77e09254a241139 +1124098848 7 2c894be1b0fe2454 +1124098848 8 a88ac781a4448bb8 +1124098848 9 ba770ad008845f36 +1124098848 10 deacb16c1041b594 +1124098848 11 c2fb40740b298eba +1124098848 12 731c21a8b50e8ba9 +1124098848 13 0301812b71c4eecc +1124098848 14 131d9a7f09b14cb5 +1124098848 15 1255915dcef2d520 +1124098848 16 c840dde9f07a1a96 +1124098848 17 26b39e4e16d441b2 +1124098848 18 6be82d99bc47a0a4 +1124098848 19 408681501e09f02b +1124098848 20 f91de4a757cd6100 +1124098848 21 f5ba461bb5b1054a +1124098848 22 219b80a88353822f +1124098848 23 bc5df482eb662697 +1124098848 24 998117de3e9affd4 +1124098848 25 1ff15299ae6c6ccd +1124098848 26 3dfd95d13c45aeee +1124098848 27 7413bdae1d02bce8 +1124098848 28 68a9d9077e868cdc +1124098848 29 7cad7cb6e5fb686e +1124098848 30 c22f6ba850edef74 +1124098848 31 06b644d0797ad03a +387203520 0 24dabcec501857b7 +387203520 1 41f48dabd8649489 +387203520 2 8b8f07a0f5ab45d5 +387203520 3 457cd8f1b11fdb21 +387203520 4 7ca0cba8e8666e88 +387203520 5 2e8512c406a6c853 +387203520 6 071c56b93a4011ef +387203520 7 898f253d20f84db8 +387203520 8 beb8e4fec34db393 +387203520 9 d335ef7e8d3c7a93 +387203520 10 e2e9db1ccb4e7d4e +387203520 11 3b74ecea387dc19c +387203520 12 3f7465e138c006c3 +387203520 13 ddd588bd8ce331f9 +387203520 14 c1a980b037b4b06a +387203520 15 22f9d6e4431c23ae +387203520 16 0de4fe7026afbcf8 +387203520 17 2eaa405e9f5695fa +387203520 18 577cea0bc1eb5845 +387203520 19 7f65f38e78aad5a4 +387203520 20 abced6d51e54befc +387203520 21 2b5e8692c1d3e059 +387203520 22 a18ad2fcaa81a5a2 +387203520 23 686c46966b132dca +387203520 24 935027768d92bab5 +387203520 25 e8742bd56b925dfa +387203520 26 6db837fb8e8d7409 +387203520 27 e5638764bc37d0ce +387203520 28 81346b62baf4c3d7 +387203520 29 3eaa04710cd20889 +387203520 30 13a49255c10bd072 +387203520 31 a0c15df321c6cdc9 +3641908288 0 cb06486162a06ab7 +3641908288 1 8bf38bf1b5493e21 +3641908288 2 a29271d911ea080c +3641908288 3 6f640309385f1c77 +3641908288 4 4a5df84d7a810a5a +3641908288 5 799fe0749d1c0dd2 +3641908288 6 8492c498f10cff0b +3641908288 7 1cf79a48b799f2df +3641908288 8 e2ac9e3c5a260840 +3641908288 9 c5d2de42865fc826 +3641908288 10 84b30ec00e30b228 +3641908288 11 7c641704363ed272 +3641908288 12 28ca2385415b4f25 +3641908288 13 7daff9ddc96cd2f8 +3641908288 14 f7efdb35b7515cc4 +3641908288 15 2e5af811efcf7321 +3641908288 16 4c6919bf559ce73d +3641908288 17 d13b335a10f0e18d +3641908288 18 7f9eaefa766a39a9 +3641908288 19 c8fec4275509ebea +3641908288 20 25699848c4ab0fe3 +3641908288 21 a8efd3866d5eccd6 +3641908288 22 4d90f5e2865f5def +3641908288 23 db418354175dc510 +3641908288 24 a8dcf8b43ba5be01 +3641908288 25 a5756cc3a93925ee +3641908288 26 16682279e2550c50 +3641908288 27 05bc8a2462255b5b +3641908288 28 c7ee98e8338356b1 +3641908288 29 461782875fb38d6e +3641908288 30 28049ffd992dc6cc +3641908288 31 92750b61528f821a +3687510528 0 ea6e261e83180b98 +3687510528 1 1b937369d56be18c +3687510528 2 5b2fff88d54912c1 +3687510528 3 6c45283170f300cb +3687510528 4 6fb1a431630e2748 +3687510528 5 a1401254c5150e1f +3687510528 6 2be01869da0ef9fd +3687510528 7 e123ed9b71e6e294 +3687510528 8 00c133b11fa0db6d +3687510528 9 e0fe070cb41e60f4 +3687510528 10 393d47c9b03f87ef +3687510528 11 f42e24d87def7d7b +3687510528 12 955b6d8b0f18e3b9 +3687510528 13 384803073ccb124c +3687510528 14 dc55de6814e199e0 +3687510528 15 4dc349507c6292f8 +3687510528 16 21f3d44fe16cef79 +3687510528 17 106f5386e63624dc +3687510528 18 dac908068078bc9c +3687510528 19 c63e3229c98e5e39 +3687510528 20 f186d3b51a9cba7b +3687510528 21 f798932e0d144cbe +3687510528 22 e68e7bfdbd839127 +3687510528 23 694455cf85bda4df +3687510528 24 dd3809a1f1bb6e41 +3687510528 25 6f3d367c6f6c1d5f +3687510528 26 b248f6d0e301a2f6 +3687510528 27 91768c2028af9546 +3687510528 28 cd11cdce97864bef +3687510528 29 955112f2eaa01e70 +3687510528 30 9173b24681428fe7 +3687510528 31 c5d978a64f1f4b79 +1013821568 0 6bcd1189f377e0fe +1013821568 1 168f9e7e24bba6d0 +1013821568 2 c77a4dc715660617 +1013821568 3 a36b7156e3e9954c +1013821568 4 355f92924c272f0f +1013821568 5 8244616f2a63e69d +1013821568 6 da5039b0c6649dad +1013821568 7 616f68c3d4eaf1c2 +1013821568 8 c369ad00e5de0d82 +1013821568 9 0a2e3330e45e2ecb +1013821568 10 eb986b1d45665ed7 +1013821568 11 423c7f2011516912 +1013821568 12 74dcc9c59e077074 +1013821568 13 e0178993fe6624d3 +1013821568 14 d86e2fd6f1da09d3 +1013821568 15 1e85dd3220b47432 +1013821568 16 e8b499f6ae76ef90 +1013821568 17 b80232c4bbf74ca1 +1013821568 18 7294cf8183235ca6 +1013821568 19 d462a371eb5187d4 +1013821568 20 d36ddcd1e4edde70 +1013821568 21 c7f11911fb2e2021 +1013821568 22 8c92c5243d13b282 +1013821568 23 908a9961f2df7cb4 +1013821568 24 a0ef3be4490b8ed5 +1013821568 25 901ffc676bf6d053 +1013821568 26 03c98b07ec7c6bd0 +1013821568 27 74cf77aa043fe17d +1013821568 28 e5cc4c3ec0432344 +1013821568 29 91f5ea9ca97e2bb0 +1013821568 30 28a15d1e4d62871f +1013821568 31 afacb2b62446cad2 +2576145536 0 10ab83fd77159266 +2576145536 1 a501c9aa93bc8ad5 +2576145536 2 6efd1f994cad1c8e +2576145536 3 7f155082ab282481 +2576145536 4 b6a9574aa728532e +2576145536 5 367ec4ee74166200 +2576145536 6 6f18a70ea73d30f9 +2576145536 7 2ac496ff86878af5 +2576145536 8 0f5fc16c7bcb2e6a +2576145536 9 4aba1aab7d8b265e +2576145536 10 80b063e8092693cf +2576145536 11 ace118efc87956f3 +2576145536 12 063411944b021748 +2576145536 13 143652bf8f193b30 +2576145536 14 c5dcf6cdf3442c81 +2576145536 15 14d129ff45942dde +2576145536 16 e752b6fdd42c2af4 +2576145536 17 e6b676d31328f16f +2576145536 18 b994d75624d84bfc +2576145536 19 ea83ef6e98b18a36 +2576145536 20 c44d59d9e60ec8eb +2576145536 21 e8b35539ab8bad0b +2576145536 22 6829407d89759228 +2576145536 23 3f699b9a9f1ec9d6 +2576145536 24 a29c9ab6608e7f5d +2576145536 25 143b1db0dcd0db07 +2576145536 26 5fd2400f256a6a2a +2576145536 27 7fe2c031c97fb678 +2576145536 28 497cb4a6d8719560 +2576145536 29 4dc0fdfce1dd25dc +2576145536 30 055d967961406c9d +2576145536 31 df3dd6d4c97240b3 +1011030784 0 0e01643aa7175d64 +1011030784 1 2b9dca2b888e7d70 +1011030784 2 fe3538a441f0bca7 +1011030784 3 13984d8ade5ac650 +1011030784 4 50398589ae587264 +1011030784 5 e0c0106b027e6b02 +1011030784 6 d1d3733dec656bac +1011030784 7 ee4a757f67514a7f +1011030784 8 be6f92ce35ef3db5 +1011030784 9 857f20a8f9e6cb87 +1011030784 10 07e75d6e6b0277cc +1011030784 11 22c775a7c4219ba0 +1011030784 12 6480760303ee8913 +1011030784 13 77b66b4e19528f90 +1011030784 14 62099a7ef7e0e5ac +1011030784 15 8287d168bd97ed65 +1011030784 16 2650aab7428ec42a +1011030784 17 a62cfcdcef2d2eaa +1011030784 18 0367bc5eff98c60d +1011030784 19 2378baf2d478d277 +1011030784 20 2f4e6897b26add60 +1011030784 21 656be56572bf6fd6 +1011030784 22 a0b04ad712bfd01f +1011030784 23 d9f276c0d5d8d922 +1011030784 24 979bf125509ad4b6 +1011030784 25 7b06961b058e5e31 +1011030784 26 32fa7c2b07b46865 +1011030784 27 662dde81de4a9709 +1011030784 28 399a4290db7ca28b +1011030784 29 2f5fca8a1e9e4da8 +1011030784 30 847d24c1b6615832 +1011030784 31 4f0b1d1c54202191 +37357152 0 14f921330a134de3 +37357152 1 16049df20f087d68 +37357152 2 32671c231d400cda +37357152 3 1efc539662967bf1 +37357152 4 3e4e3af690b555e2 +37357152 5 ce34ceca071f452a +37357152 6 d6c115525af2e0aa +37357152 7 648ed0f58496d96b +37357152 8 c0e7893cae8fbca4 +37357152 9 e8889ef2e95b8993 +37357152 10 cc205433528365ca +37357152 11 3c999fbf16b289b8 +37357152 12 53a1161303620b75 +37357152 13 30051bded32abaf0 +37357152 14 b848a729f3ecfac8 +37357152 15 67eff85823c49eb7 +37357152 16 5f72ded9bf4b16e5 +37357152 17 dedf05e35772d843 +37357152 18 15cef2e5ee49536e +37357152 19 667bc287065fdf03 +37357152 20 077c11bbb2c68496 +37357152 21 8484a74f2d5ec5d2 +37357152 22 a073b4719f3b97e2 +37357152 23 f434d821d1fcb909 +37357152 24 b9e69ca201c6eaa0 +37357152 25 15a5f7ad53901c4d +37357152 26 39873837a2d207d6 +37357152 27 1821f07b833f62b1 +37357152 28 bac33c566e6dcba5 +37357152 29 fbc8afac59b1a4d6 +37357152 30 c19515d8deaa9517 +37357152 31 d7412491c5c206a0 +4139829536 0 bc50131e42dfaea2 +4139829536 1 538f40eeac54d577 +4139829536 2 9026cffeba9db052 +4139829536 3 cb506cc7995d95c3 +4139829536 4 dddb6b507ce230bb +4139829536 5 89921a98efedde67 +4139829536 6 660ac2e52627fb1f +4139829536 7 45ed5b5e0e38dd95 +4139829536 8 437f92de01f446be +4139829536 9 ea22d5033a6174a7 +4139829536 10 f683a02bdf9b5b74 +4139829536 11 945a7e818590c5fb +4139829536 12 885ce15e03e50732 +4139829536 13 b7cd11a88aee37fd +4139829536 14 49bab07c836d4b8a +4139829536 15 7318789161355ac2 +4139829536 16 99f354a1a839296c +4139829536 17 ca41888f24d08fcf +4139829536 18 3170493ca7f99ded +4139829536 19 7604f3b07740fb57 +4139829536 20 08acd1c5bc2ec7a5 +4139829536 21 a80f52f4b4051419 +4139829536 22 3d79df3b8fc2c10a +4139829536 23 8a5088fb66f752df +4139829536 24 435dbf58bfb870bf +4139829536 25 d8fbd490706dcef7 +4139829536 26 76c576ee477a40c6 +4139829536 27 f69e18f8cd6043e6 +4139829536 28 9616f4813338e39e +4139829536 29 7476a5ff70b4742b +4139829536 30 90cd78b80f312ce4 +4139829536 31 2bbbe11ed06696d8 +3985725632 0 8c3efe55f40eeb90 +3985725632 1 41090468ec366bea +3985725632 2 3520c0d6cd3ee6a5 +3985725632 3 b5d1e180a65a7123 +3985725632 4 1d6905a98fd59e5f +3985725632 5 9eb69b448837dd22 +3985725632 6 8cc1a7d240f183a1 +3985725632 7 25b04bb72ff91961 +3985725632 8 129f974c70e3b43a +3985725632 9 d3b1e45c7387b9e6 +3985725632 10 2d04962d5b399705 +3985725632 11 38d08e216c566782 +3985725632 12 9f4742521f5fd705 +3985725632 13 983449b59eb205f7 +3985725632 14 7c09ad8b0e64e816 +3985725632 15 7a0e14763f50a16b +3985725632 16 c93255adfae92ff6 +3985725632 17 1cb52707c8e4a23b +3985725632 18 f68e9aaadab709c4 +3985725632 19 bf00a709aabad4c3 +3985725632 20 cece5625a6a583ba +3985725632 21 0af3ee3c4c5ab7d5 +3985725632 22 39604feeee8b39ed +3985725632 23 d7d6cb43eadf2934 +3985725632 24 5396952a7bcdae39 +3985725632 25 a2f1dc962ea8eed4 +3985725632 26 5dbc9f3fdd57960f +3985725632 27 42e64748d93efe3c +3985725632 28 4b8373804f51cf58 +3985725632 29 6be960aee9f1ff5b +3985725632 30 c4048a9fa8e3610f +3985725632 31 46d5ba3fe0ed0900 +3974419104 0 a36c8e6ba59a0302 +3974419104 1 0c2aea805d9af2e9 +3974419104 2 28f221a698950148 +3974419104 3 01d8c113d337a982 +3974419104 4 683bcd012f5df265 +3974419104 5 fb2b2b40f224be4e +3974419104 6 0be3bdaa22131888 +3974419104 7 c0a839a1b34476b3 +3974419104 8 05ca35c598ab5d6a +3974419104 9 72526e7dff723ee0 +3974419104 10 2bb6d3342502e3ef +3974419104 11 834e22c8949bcdb1 +3974419104 12 73fda0803ce0486f +3974419104 13 97f1f13c8ee97e58 +3974419104 14 6c2f4731214e10a5 +3974419104 15 7420bef5af940d87 +3974419104 16 fe5d01e91c7263ba +3974419104 17 952f98430fd53e7d +3974419104 18 b04d7edb57722ec1 +3974419104 19 04b4a5c9b8dd8049 +3974419104 20 20a98d8361e6611d +3974419104 21 f8f046330004a56b +3974419104 22 672b4b628f6105d9 +3974419104 23 e8d06079312b2a12 +3974419104 24 8810daed0afa6b56 +3974419104 25 c7f70173d1493739 +3974419104 26 6815fd99a985c909 +3974419104 27 c0476d095cee3b43 +3974419104 28 d3383ec95de3480e +3974419104 29 0049fdf10d37831e +3974419104 30 66544e81377183f2 +3974419104 31 6b36dcab92622556 +798615936 0 9a5c5001a9b7c936 +798615936 1 dc8209ebe32bc3b1 +798615936 2 e059dc0ffcc07ea1 +798615936 3 f1bb305694196a72 +798615936 4 1e36143f6aed08bb +798615936 5 91025f923a7c75cf +798615936 6 10cd7f518c66277b +798615936 7 85843633bba25b4a +798615936 8 d1cfaf2c73341112 +798615936 9 0de2ed66679d7a71 +798615936 10 e13ad05d471d7aec +798615936 11 c90cc5960bb67ace +798615936 12 0433fa912b27cff7 +798615936 13 2522707882748a76 +798615936 14 226173b621652f57 +798615936 15 93ce6fb614ff260d +798615936 16 e88180b9604c47d8 +798615936 17 fe937ba610f338f3 +798615936 18 3ff541cf37641232 +798615936 19 1d2585d473f976e8 +798615936 20 fc17e1260e68d63f +798615936 21 c246b92ef0885e54 +798615936 22 d7fcbbc5999f6970 +798615936 23 f295b7384585ff06 +798615936 24 d067e811f10bdefc +798615936 25 72c4b811a20dbd3c +798615936 26 cc51dab7642ff6d6 +798615936 27 f22f3e2ca8af7ff7 +798615936 28 f0791f5a4267ae13 +798615936 29 50948cb146f14c12 +798615936 30 8bc9b2081ccac30c +798615936 31 0d59b2761655ba6d diff --git a/proto-newpow/mma-shadow/out/dump_128.txt b/proto-newpow/mma-shadow/out/dump_128.txt new file mode 100644 index 000000000..2c85051e2 --- /dev/null +++ b/proto-newpow/mma-shadow/out/dump_128.txt @@ -0,0 +1,1024 @@ +3588372608 0 4a25fc3216f62439 +3588372608 1 458c49e91ee0cd4a +3588372608 2 e743ab32dcbc05f9 +3588372608 3 da547dc276eacbaa +3588372608 4 337c22edd756756d +3588372608 5 f573d3af03180ff1 +3588372608 6 e1aa6c6138e835ce +3588372608 7 59d394941dd4d2aa +3588372608 8 1a2c98a7616ad8f3 +3588372608 9 2ab8f855e3d75ff6 +3588372608 10 f49d2b5021025a1f +3588372608 11 13b6573d5c2088e0 +3588372608 12 f8422f5ec38b770f +3588372608 13 79ae740d0fdef98e +3588372608 14 3c4fda6e823b319a +3588372608 15 dc2aa39b75670989 +3588372608 16 b67c39b4f8c714ee +3588372608 17 8b747a8684ba79e2 +3588372608 18 593f9ac91bada77a +3588372608 19 0049a9eb08b237b7 +3588372608 20 d37dee522db3d0e6 +3588372608 21 85c35ce7cce6e112 +3588372608 22 c50333521dca0c7a +3588372608 23 1153547796459e84 +3588372608 24 be50b50aa35d16f4 +3588372608 25 f7ce30c56ffcba86 +3588372608 26 db881cd6a13a7f79 +3588372608 27 b8bf53f23607a267 +3588372608 28 3a175dc3fd726dd1 +3588372608 29 763ae24d967d0943 +3588372608 30 11f80dca76117527 +3588372608 31 b5df4b9d97e99584 +1023626400 0 72234b8e31143287 +1023626400 1 0cba13c9a5923178 +1023626400 2 51d9e44bfcf5e672 +1023626400 3 1f4598b0d12bde91 +1023626400 4 db9b1e2e110b552b +1023626400 5 5081cba9f787978c +1023626400 6 51b86932955d11f9 +1023626400 7 31716d301ee31d1b +1023626400 8 a8ebad92704f7561 +1023626400 9 1ed500c58ff137f1 +1023626400 10 35b7b6bd89744578 +1023626400 11 f07712ce1ac6c6bf +1023626400 12 8f193f190849c1cd +1023626400 13 ccbdc2351131777f +1023626400 14 09774a6a8d128419 +1023626400 15 918267cdcd86a477 +1023626400 16 8489739b3027ed25 +1023626400 17 f04278371f653b4f +1023626400 18 a7600ba5a38ec6fd +1023626400 19 c9a49ed17d9329be +1023626400 20 8faba1dc45ca0b04 +1023626400 21 df09b43af0921219 +1023626400 22 151b0b28133ab821 +1023626400 23 80ac77f2591ee4ad +1023626400 24 4a175354299c837b +1023626400 25 2156a73ab267d1f5 +1023626400 26 de7de4d9d18e7aa6 +1023626400 27 3ae41693e0eb4d7f +1023626400 28 32e9a7a26939b2ef +1023626400 29 02fbf2541b3c894d +1023626400 30 32101fe4e9773847 +1023626400 31 7e75841c8c93bc2d +3929384352 0 2488581e4570f56c +3929384352 1 43ef5caa37a0fbfa +3929384352 2 4d0afe839ccbc1aa +3929384352 3 482f2404e39a4356 +3929384352 4 aa75c5cbd79611cc +3929384352 5 638f4c6f325b43ec +3929384352 6 76c24322fe541abe +3929384352 7 cd2dcc8d1ad5b14d +3929384352 8 f55f174bfc068d97 +3929384352 9 e985f9d92b594a74 +3929384352 10 296fd35799f3f1c5 +3929384352 11 947dc4c4911740e5 +3929384352 12 d5162c7134b59c44 +3929384352 13 ba6145d91fdcc01a +3929384352 14 5d09e270bb773f03 +3929384352 15 5983a321748572d6 +3929384352 16 30d0e8d4f2a3cb23 +3929384352 17 d45d20959b2dc570 +3929384352 18 80ef01d4c3463cce +3929384352 19 dcfeeaaa97ba8775 +3929384352 20 3c9dfbbc0ad1c717 +3929384352 21 fdf97ca06ed47dc7 +3929384352 22 4fc1250e34055e87 +3929384352 23 fa89bd14a8a49a95 +3929384352 24 51779aee86c8238b +3929384352 25 b9dd00995e9a0add +3929384352 26 4d3c3f98bdc69bda +3929384352 27 bdfbad1b1f9b4e91 +3929384352 28 7dfc506f121a6e7b +3929384352 29 1b73ecb58d30b37e +3929384352 30 8dcc697c0e972af8 +3929384352 31 97f3de08ee6fbb99 +1113183520 0 f75467cbfde8c437 +1113183520 1 29fc3b0ce4017fe4 +1113183520 2 a4496fafea9e9bec +1113183520 3 eb8146904bd32919 +1113183520 4 dbea8558708b3af9 +1113183520 5 8d37300920ecc3f2 +1113183520 6 aca59dde7a387a95 +1113183520 7 58c38a3aacb105e7 +1113183520 8 8dcb970b9e26474c +1113183520 9 240f5ba2f7b3c46d +1113183520 10 a82ab550bdc29140 +1113183520 11 2b8081c012fceed1 +1113183520 12 4fbf179b5b340166 +1113183520 13 e876c5311266e720 +1113183520 14 930859a163413cb6 +1113183520 15 befbcc02cf298cd6 +1113183520 16 5fef04eb01d4ccbd +1113183520 17 01896398179c673e +1113183520 18 a5a962632157adbe +1113183520 19 92f8b685048ec367 +1113183520 20 14cbfda68dc1677a +1113183520 21 00ce967c5a8db345 +1113183520 22 7314679411509e14 +1113183520 23 7ed58ed0b5cdb3c3 +1113183520 24 88e8bebd0ea5ff45 +1113183520 25 d31daeb8b4f04ffd +1113183520 26 854591d9c67656c5 +1113183520 27 b0bcc6f66dd24f09 +1113183520 28 39f67bdfd6883f14 +1113183520 29 90e8988f9de166af +1113183520 30 7d1a719f6c5507fc +1113183520 31 461b55a0c7c80057 +1774593184 0 1e962a8b16a56920 +1774593184 1 c66a617550814ef4 +1774593184 2 46bf2cb2cbf84683 +1774593184 3 c088fcc3316320d9 +1774593184 4 796ac5463eeb1443 +1774593184 5 b882d72fbfe82956 +1774593184 6 eca8cc77dc5f503a +1774593184 7 580dba64fc948f77 +1774593184 8 d14baff035c5d161 +1774593184 9 fce91b2e4ff39e9f +1774593184 10 0de3ab01a7729977 +1774593184 11 d113da064146e673 +1774593184 12 b66f9d88110a162a +1774593184 13 121024f323dbbda0 +1774593184 14 4dcb9c5e958b0173 +1774593184 15 a29285ba93392394 +1774593184 16 6aa7944de1bc35ed +1774593184 17 8b2fb21814d87f39 +1774593184 18 9c4d5aae7e8c8c52 +1774593184 19 76b8b02db5337c74 +1774593184 20 bcdb3f0fe769ed7b +1774593184 21 fcea34d31500ba3d +1774593184 22 cf7b893f95cbf6e3 +1774593184 23 4c09ff2798acdf58 +1774593184 24 99eb3428abcfb977 +1774593184 25 6cc4bd5c95da2a35 +1774593184 26 8bbf324d511d60bf +1774593184 27 d3dbcb5f427a3ccf +1774593184 28 9805c1535dd54fc7 +1774593184 29 f42847a9134ff57c +1774593184 30 6dd5548a8f16b2d1 +1774593184 31 fe325a463e0e33b0 +637272864 0 d3ce17f4a3fe9f09 +637272864 1 f9b2994a8933b382 +637272864 2 5f8319e59ab5293f +637272864 3 a216dd9204f6b8c4 +637272864 4 2bd9331dbe2d90b1 +637272864 5 0b654dace2c9a715 +637272864 6 d0a848459bf20f4d +637272864 7 064565de478b5000 +637272864 8 4e7cde9587cf53e8 +637272864 9 026b50d2b79d4385 +637272864 10 f1c3c5a516972bcb +637272864 11 29540b2e8ba4b276 +637272864 12 dccfd807fcafee50 +637272864 13 5f0b9b006263e0e5 +637272864 14 9980d72d308a147b +637272864 15 639eda895ba3442d +637272864 16 cb7c822efc079973 +637272864 17 89bc07e9e78f74bb +637272864 18 523e785d50d6cbd7 +637272864 19 936b54f370aa588a +637272864 20 438d886d8d13e99f +637272864 21 97fffd9e2d76ddd9 +637272864 22 342990bb1b85975b +637272864 23 96fc7e39384816d3 +637272864 24 9d41e75404b93c41 +637272864 25 c0eeeeb9662c2531 +637272864 26 f6b9834f7d79a077 +637272864 27 d5dec538d2dbee27 +637272864 28 8b47dfffdbb83ed9 +637272864 29 d7e3058883bbc299 +637272864 30 384c44c0fa837aa0 +637272864 31 76cf840f4b23be7c +2482166944 0 9b56c9abd75fee38 +2482166944 1 629f1596225afe93 +2482166944 2 7624ff9be59202e8 +2482166944 3 457e3205ea84598f +2482166944 4 5edd34f96edf3a9c +2482166944 5 cf921103338b930d +2482166944 6 53e83d2cc131fa9c +2482166944 7 5268da8f53b53163 +2482166944 8 3fa7b35f2477bcc9 +2482166944 9 70942a2b4c4a3140 +2482166944 10 57185c53e8c1ccab +2482166944 11 ec6f19c294644e3f +2482166944 12 13f1cb6be74d5e2c +2482166944 13 196ee562aaf9c9bd +2482166944 14 96b5da5c69462cbb +2482166944 15 9ffd7fc90219a89b +2482166944 16 cf6f10e9a1fa75bd +2482166944 17 9386f52e11bc0827 +2482166944 18 b90b423223d5fbc7 +2482166944 19 2616cdc068952325 +2482166944 20 38f7699bdf219d54 +2482166944 21 942c66463b1451b4 +2482166944 22 9e29a6752d3b6fc1 +2482166944 23 c3db1ce8c91871b5 +2482166944 24 3d104037de383386 +2482166944 25 e6e0e2f916d04049 +2482166944 26 c508dc49fe71a7fb +2482166944 27 ce4d71315ea951c6 +2482166944 28 5167fd130d1280c4 +2482166944 29 2a8dbdda567997d3 +2482166944 30 ee56c8d2cf0eeb99 +2482166944 31 cd40071212f06319 +1243715392 0 01b8d60d27f07fe3 +1243715392 1 06f14059c63a406e +1243715392 2 71de422b2c86fbe6 +1243715392 3 e8aeb96ba69ad890 +1243715392 4 5b669304f56f2f4c +1243715392 5 a35f09eee5f41e14 +1243715392 6 0c6ed867ca01025d +1243715392 7 02ea5c419541269f +1243715392 8 017f0421426bd18f +1243715392 9 ad46637e41a4fcd0 +1243715392 10 39c40253d424e921 +1243715392 11 5171971f6c887b88 +1243715392 12 7ef235e073aabef8 +1243715392 13 0ef9abf91914828d +1243715392 14 1dc34b626e32d280 +1243715392 15 862ab3f1eb5da79c +1243715392 16 1824dbc8aa5ec6b3 +1243715392 17 7c905f43ca6ed1c2 +1243715392 18 9e223265aff3849e +1243715392 19 8cfad31e76d2784e +1243715392 20 dfc59deda41a226a +1243715392 21 a93270da71f2ac6f +1243715392 22 11a598607e424a33 +1243715392 23 39be0449f838dede +1243715392 24 0d9d5fc5b8b18eba +1243715392 25 70a06b65f5faa3e1 +1243715392 26 99a48ea075be2905 +1243715392 27 d11f4c1cbcf4d988 +1243715392 28 b43afa5b63cff3e4 +1243715392 29 57598190930f7894 +1243715392 30 225d3a881340fc5c +1243715392 31 7c9f5fb795831dd0 +209806816 0 263e61e9c194b224 +209806816 1 3891e81969e4291f +209806816 2 a61ca812b2f972e9 +209806816 3 2a6efbd9bcf0f645 +209806816 4 35bdbd4f7b556197 +209806816 5 22d057dde654abe6 +209806816 6 2d03c7c3ef0d4445 +209806816 7 07ea19f8def8e9a3 +209806816 8 208a0ad87bfcfc6b +209806816 9 83ddaacf1bd7fb4a +209806816 10 06863fe557329937 +209806816 11 53066fb670b5912c +209806816 12 1d6d084aa51abaa0 +209806816 13 25aaa4ee02937495 +209806816 14 950d99ec19c73fe2 +209806816 15 b5d88ca7eccfb7a5 +209806816 16 732cc07fda2ed1ad +209806816 17 9333cc595c9d072c +209806816 18 1d7a87d5724033b9 +209806816 19 4e8f06dcc2a8ac1f +209806816 20 b4c7c7715a599558 +209806816 21 febdc50f70919246 +209806816 22 41b6a43d104803b3 +209806816 23 6e8c090fe502ce41 +209806816 24 8ddec49234c5495b +209806816 25 2ed44edbbee0c44f +209806816 26 844d8ed8606d3591 +209806816 27 20cc18dc41603e2b +209806816 28 a348aeb113ffd545 +209806816 29 f596c9b4af8ad33b +209806816 30 bcdad2c5d77ef902 +209806816 31 32703d04609964be +3395624224 0 3c4cd25a1560b1f1 +3395624224 1 614dda62aa1b08c5 +3395624224 2 1fa6259abce2060b +3395624224 3 489be04338c92129 +3395624224 4 8285420043794b0c +3395624224 5 00b7da0595c8edd6 +3395624224 6 6df39bf06f8129bf +3395624224 7 ada9a55e888c04c3 +3395624224 8 f53e8f45374e918e +3395624224 9 7a98af24df9c4e92 +3395624224 10 2a457bcf51b04523 +3395624224 11 e391d3d0dadbd61c +3395624224 12 ebe486424fd21dde +3395624224 13 4251f807a35ef7aa +3395624224 14 3b1b89ff13a0f67d +3395624224 15 12d40c799de76ec6 +3395624224 16 df97af567e3bccd8 +3395624224 17 37d2acf8d027a8d9 +3395624224 18 2c9d62c026efd08c +3395624224 19 b3de3b769ad7ba05 +3395624224 20 71d7cf8f01df1d49 +3395624224 21 5e6f45bb5e8d317a +3395624224 22 fb792f230222417e +3395624224 23 155135f272e855cc +3395624224 24 984c28823d11040d +3395624224 25 236448a883b6c355 +3395624224 26 17b9b5397b3564ef +3395624224 27 e972df1817a43270 +3395624224 28 64af55dc0497d6bd +3395624224 29 10dca26aa5561355 +3395624224 30 25dda39b59ee8398 +3395624224 31 acfade27288fbb93 +3886889632 0 d736cb52615f6434 +3886889632 1 188c152ff639b567 +3886889632 2 2aab90a5407237b3 +3886889632 3 302b5d85f2b4dfce +3886889632 4 983d38fe8e2b77de +3886889632 5 e3f2fe9406e0ae42 +3886889632 6 8f9c832d5cd5f18c +3886889632 7 2771137c8cff99dc +3886889632 8 4e38758825151ca6 +3886889632 9 ad9bc7913f03aa21 +3886889632 10 fcc5b57d9772d29c +3886889632 11 18a7b22b6c60f680 +3886889632 12 6845261da82f13f6 +3886889632 13 1178d2fa079f2a3f +3886889632 14 57644c4359023248 +3886889632 15 eeca2a3bcd4d2dd0 +3886889632 16 d20b9c13de35085d +3886889632 17 b9dd81e4b8dff1f3 +3886889632 18 a819aeb579853fa8 +3886889632 19 d13bea2692e95eae +3886889632 20 10257619a42812ad +3886889632 21 b824fd6455ac43ae +3886889632 22 d810ce60cd13235e +3886889632 23 e9447b351c9a0749 +3886889632 24 cecbdb77805f29b2 +3886889632 25 e337db5425179abe +3886889632 26 dc5d01169395e025 +3886889632 27 96d15f57da9997c9 +3886889632 28 06fbd338800df3c4 +3886889632 29 c9079f16b84cfa8b +3886889632 30 4f3114526f7200e3 +3886889632 31 3fa0c0be8551eb75 +2045577696 0 b149bfd24052a1d5 +2045577696 1 be1c2d077bd307dd +2045577696 2 fd75f491255f616e +2045577696 3 18a25c00a47aca5a +2045577696 4 2d67c181c67b9466 +2045577696 5 17fd545a36053e2a +2045577696 6 015fc6ab41f87074 +2045577696 7 00496baf3ab1caa3 +2045577696 8 97e56d82e024069e +2045577696 9 2f954894e15f64af +2045577696 10 7567f3b039dacf02 +2045577696 11 854527a95bd59e46 +2045577696 12 d930dd0594c25fbb +2045577696 13 49845de450dfe2fc +2045577696 14 c61aa386bae18acb +2045577696 15 7acb000ec289792e +2045577696 16 378d3b7bf6009ead +2045577696 17 5dac54b248655607 +2045577696 18 2d57999d0b00af06 +2045577696 19 85e7c7da16e28873 +2045577696 20 b8ac523b949b5802 +2045577696 21 88a99ea72d6820d1 +2045577696 22 cc5a7e1f06efe3fb +2045577696 23 fdd892c140a84054 +2045577696 24 8d8c7e1a8f49d4af +2045577696 25 d144f94e8281d4af +2045577696 26 1993e06fc25a3a95 +2045577696 27 ee3f629aef6d9dd6 +2045577696 28 15119ba621a2eccf +2045577696 29 c4db670ce7e2d2d6 +2045577696 30 701b129d40e7df03 +2045577696 31 51050fff4b6895f6 +2073778688 0 f172fcd7aa159a08 +2073778688 1 1de79e4784173674 +2073778688 2 8ec8c27f178b40c0 +2073778688 3 17fed4d62f170638 +2073778688 4 c37448a1aad1a3aa +2073778688 5 6f8ab9fc1c8c5f2b +2073778688 6 473b2028619788fc +2073778688 7 e2b279ca9a66c7dd +2073778688 8 a43942b0339cc57b +2073778688 9 89ca6ea08656f212 +2073778688 10 b59f875cfe263882 +2073778688 11 67102e81c6ffcd0d +2073778688 12 57af9ddddec1cd4e +2073778688 13 09a525fce5198c23 +2073778688 14 65681e84dd5abea8 +2073778688 15 627f04ced9ee749b +2073778688 16 1f0b18ae4cf91106 +2073778688 17 70e1d8d4ea0a77f7 +2073778688 18 5c078a6f838a51cd +2073778688 19 26f4d66e70ace89d +2073778688 20 f370b00954ae0e69 +2073778688 21 a78d66a2347bc356 +2073778688 22 5f1705de6bccd745 +2073778688 23 be949e9b78abe108 +2073778688 24 db35efd92ff119ce +2073778688 25 20bdae478cc38d1d +2073778688 26 9a77dfc32b6cc2e8 +2073778688 27 81dd92d275e64fe7 +2073778688 28 bdca40fee475e70a +2073778688 29 ddb8edcf090172f1 +2073778688 30 6b59599491b6da2c +2073778688 31 6f84fa4802ba5552 +10993408 0 b98ef4fe04606a1e +10993408 1 4e7ccf67e77fe3d6 +10993408 2 c9eb4ab4d7fcf539 +10993408 3 a24e9de70d1d7055 +10993408 4 58378be3a88ae732 +10993408 5 4de648a315a5a39f +10993408 6 c7d410d2e4bbbf9d +10993408 7 4e64acdd366268ed +10993408 8 56f0bed89eb546de +10993408 9 554f07dc54bc2376 +10993408 10 b10e555007f19228 +10993408 11 b890622d86f3f891 +10993408 12 d3315aa7552bef93 +10993408 13 bed2402378ea937c +10993408 14 95c7695e8d0f98cb +10993408 15 6500451c871990ca +10993408 16 4cc50e1b19f340fa +10993408 17 f451631aee1d6591 +10993408 18 86572581696e9c15 +10993408 19 767eb85e72a5a621 +10993408 20 1f3fe98e88fe1ebc +10993408 21 e2f891fb85a79d4b +10993408 22 e63c3255c07a0efa +10993408 23 2bac2a14fec123a5 +10993408 24 14afbf1c1c6052ce +10993408 25 5d1150d51c094456 +10993408 26 45adcce7c2492201 +10993408 27 dc4bfbd9c809f6df +10993408 28 073217d92e98b50f +10993408 29 b9ab26f21ed70958 +10993408 30 ee01c18da48a9450 +10993408 31 7ac4e32a1c7efcf4 +3490840416 0 2e476c82edc01ecb +3490840416 1 95d9ad474615f983 +3490840416 2 6771f703f64f1574 +3490840416 3 4996fe68f141c576 +3490840416 4 01783f60508212d3 +3490840416 5 27fd6d86518db2a1 +3490840416 6 fb0c045714bfd643 +3490840416 7 4abb01a1586db20e +3490840416 8 ba3a40dfb01662c7 +3490840416 9 7ce5614e6bfdee9c +3490840416 10 f278874e8e88e36a +3490840416 11 eef46aa05b62e781 +3490840416 12 942abae22c9a40ae +3490840416 13 8bb0915cba7e342b +3490840416 14 d429b7b059f48b9f +3490840416 15 fc4c262b3de30b44 +3490840416 16 a8aa749282453319 +3490840416 17 2d408acf1a2ec996 +3490840416 18 b8e9c42dd9170d08 +3490840416 19 2e9ea1bb70498d27 +3490840416 20 f31ba48007f1d593 +3490840416 21 c14e114e51dfa2b1 +3490840416 22 4aae19e455ae15fd +3490840416 23 e9112c4cf9696b2c +3490840416 24 d68ea018f0a2bd0a +3490840416 25 1448a0e8512c8ed7 +3490840416 26 0253d19e4acacd7e +3490840416 27 b24bc2dca6834505 +3490840416 28 8e45a7a93fe0d859 +3490840416 29 5b6c8806a9b14d50 +3490840416 30 ea368258ba9b3c35 +3490840416 31 6b1b79aa6a93bc6b +2848373920 0 63c5e0e694554767 +2848373920 1 e681479b4e0c889b +2848373920 2 bfee0fc8d3f93974 +2848373920 3 cf4189c376046cbc +2848373920 4 42dfd396603a3f65 +2848373920 5 5c0868bb073e0cc0 +2848373920 6 b74fbe9973beeb66 +2848373920 7 6030d34ece2fb267 +2848373920 8 79eebbbc6e54db72 +2848373920 9 5d249007504102db +2848373920 10 2eedaf9e472c03c0 +2848373920 11 1aaf0efb3a337c73 +2848373920 12 76f4b76d0d7db4c7 +2848373920 13 b34de75381cd200f +2848373920 14 77dd091fedf331ec +2848373920 15 1e88dd0a0181ccb0 +2848373920 16 ddf827a2a350c3de +2848373920 17 39ae2f13ff3a8385 +2848373920 18 1403da4a310df0e5 +2848373920 19 79ad86b5d6e31ef1 +2848373920 20 157bcd1c621b2286 +2848373920 21 dcb5a6829048e7fc +2848373920 22 551ecf1c22f9bc8b +2848373920 23 d0cf2086b03001f1 +2848373920 24 181a28ea25cad14c +2848373920 25 5e8583cba91bfdee +2848373920 26 be14d9a2c282ee0b +2848373920 27 590ec4e91eba6ecd +2848373920 28 6c7b81ddc8e74668 +2848373920 29 ce4ff7361a3df125 +2848373920 30 7044b5ec8ba428e5 +2848373920 31 2bcbb9e0b81ada76 +2880556800 0 2073463d62ab5497 +2880556800 1 7294fbe5a7d4f8c5 +2880556800 2 016b7c67661d0f2f +2880556800 3 4bb83e75da89f596 +2880556800 4 5c02b08ed5a9897c +2880556800 5 04e1dd87aaf901b0 +2880556800 6 83b97bc2a8f46ed7 +2880556800 7 7ecc1265e63f7342 +2880556800 8 732915fc8892647a +2880556800 9 ec46d3c70d6a80fb +2880556800 10 b5cabb3004dba84a +2880556800 11 1063eced338a5b9a +2880556800 12 b25d52e83357cb9d +2880556800 13 2eb38adb53aaebe6 +2880556800 14 a8afd012937bcac6 +2880556800 15 30a4f1dadcf49e61 +2880556800 16 34c4ab5128b7856f +2880556800 17 5183149a491fac97 +2880556800 18 d1434a021c42dc19 +2880556800 19 ed1e34805a6a85d9 +2880556800 20 d53992d41e95da81 +2880556800 21 d8b67fe8e263caf9 +2880556800 22 6fdc1025526ff10a +2880556800 23 e4d1d5652f9331e2 +2880556800 24 95ab552f91afb008 +2880556800 25 5d1e388ece461464 +2880556800 26 f9ee5ca9f2bdee28 +2880556800 27 f7ce2fd70daf700a +2880556800 28 ec206ce44f0b10a5 +2880556800 29 2ff6c9c5d88b3ecb +2880556800 30 8f3b411fc7f51fd4 +2880556800 31 bcd13b240fac3e49 +3625086080 0 e4b1f79b99242e80 +3625086080 1 fa4f03b58895dcb0 +3625086080 2 ee767b3714913bf0 +3625086080 3 9cf4a1ac4af31b2c +3625086080 4 c95d11f3e8f2a6d0 +3625086080 5 f7f4ca70ebcf2486 +3625086080 6 f1c975a2ce1fef0a +3625086080 7 762627d634eafe98 +3625086080 8 ae41645b95de8ad1 +3625086080 9 6fc73c7859f01fbe +3625086080 10 a34fca7080949c05 +3625086080 11 3e136c0dc6c29948 +3625086080 12 2e946c018b985153 +3625086080 13 63f8e7eda0487e1e +3625086080 14 450f2e5484c96c43 +3625086080 15 a3bae3132542cc6c +3625086080 16 eb2717460d6557d7 +3625086080 17 976544582595b710 +3625086080 18 3311cae103b58431 +3625086080 19 689037dfff728472 +3625086080 20 72797dd441733518 +3625086080 21 1412e331d898dc92 +3625086080 22 de9506a034129ee0 +3625086080 23 7b2cf1ab09153a39 +3625086080 24 f5e358545c7e5d64 +3625086080 25 12be5d7f35b1424a +3625086080 26 5ba00ae3bf4f418d +3625086080 27 25c88a0d4af1a2b2 +3625086080 28 825cf86bcce913a7 +3625086080 29 8085786e6adcf802 +3625086080 30 01a810fb1ea84448 +3625086080 31 c7e3307bd6490cce +2537065920 0 031b988b7601d6b1 +2537065920 1 fd5c84c02f9c3d4a +2537065920 2 1780ec6a3f0c96ed +2537065920 3 eb5a0355c43f9ebe +2537065920 4 0274c977c4a388c7 +2537065920 5 0467b9a02bbb8949 +2537065920 6 d757fe71f5882226 +2537065920 7 6515c9c4d6b6bea9 +2537065920 8 13ffa8c9060e7564 +2537065920 9 ea24fa2ad7131a13 +2537065920 10 ff862148a7226528 +2537065920 11 013766c7d5dab348 +2537065920 12 3be036c353ebb040 +2537065920 13 92842f51f9ed8e95 +2537065920 14 d5545d547f2a8d26 +2537065920 15 d3621812cbfa072f +2537065920 16 a27c420685dddb6b +2537065920 17 ebc3e25e27f6e574 +2537065920 18 22ef0bdb2ad221e6 +2537065920 19 85fd9af47d0c7a36 +2537065920 20 8f1416259dac8502 +2537065920 21 89d3b33558a28d4f +2537065920 22 80470263d8252ad8 +2537065920 23 f0744a0d86f3b6a4 +2537065920 24 0be2a36ec2460e0d +2537065920 25 1748ea78b0b7b28b +2537065920 26 12c44e0f279ab01c +2537065920 27 442f9d9bc4d8c87f +2537065920 28 e5588914cba601f4 +2537065920 29 ffa2baae31c5ae19 +2537065920 30 c2bcd86424f53fd6 +2537065920 31 344e70c32b597954 +1646897088 0 576193044b9f3500 +1646897088 1 237d7f09cd2cf65b +1646897088 2 bcfbec4b90508c54 +1646897088 3 b1a1c7f0b5d938a6 +1646897088 4 41081e545120d684 +1646897088 5 f277f87fe6782a1a +1646897088 6 04888b973bc9cbf9 +1646897088 7 2725559532ab0009 +1646897088 8 de5349e11a00c686 +1646897088 9 a52f7a652c3b39e4 +1646897088 10 2cd888c2027b6b74 +1646897088 11 ed73d69faa21b4c3 +1646897088 12 d8e6ea25be868ce3 +1646897088 13 da009996342c1f05 +1646897088 14 9deff21a45bbc5e4 +1646897088 15 84f5320ed32f164e +1646897088 16 3722b94327bf7674 +1646897088 17 f373793c8a7f2731 +1646897088 18 97bd97e9c4e17179 +1646897088 19 d869338499e265d9 +1646897088 20 8e24aeaf5d448704 +1646897088 21 bb176955a40b6a53 +1646897088 22 113b6a803e923d44 +1646897088 23 a5a7d946b59a3c89 +1646897088 24 f96744fd030fb96d +1646897088 25 009e94cece18ef2f +1646897088 26 2d3d6f53ba1d75ca +1646897088 27 266a77d988ba55ba +1646897088 28 e8861745c31dc305 +1646897088 29 b46506d3bb020604 +1646897088 30 b338fdf1e8272696 +1646897088 31 8e3300faa00a2b80 +1124098848 0 fab4efdf45e1a80f +1124098848 1 9b8eb7dcd038e0b2 +1124098848 2 7579ad2c89d4d69d +1124098848 3 c8c41595c27d0649 +1124098848 4 31adfbfd01fe31c7 +1124098848 5 1d3f484e07b9b009 +1124098848 6 b0b6a777762d580f +1124098848 7 42498d0e9375dc13 +1124098848 8 f99572c7b47e5f9c +1124098848 9 4631ff25521badae +1124098848 10 a3cdc1143055e905 +1124098848 11 90f3765575251dbd +1124098848 12 f002800468331794 +1124098848 13 88b23839588659f2 +1124098848 14 61b70c38c11d198f +1124098848 15 a605217547d40916 +1124098848 16 92f7b9c9f5df77e6 +1124098848 17 129b6f0a451b369e +1124098848 18 ba6164669a40b7fc +1124098848 19 818b829989455162 +1124098848 20 51bb42cb5d0ff5cf +1124098848 21 4142b54063a2ae64 +1124098848 22 93aa6e112b9351d3 +1124098848 23 0a98d111b0e51bb5 +1124098848 24 b75a11915b7197d6 +1124098848 25 826a7d50ea98fe20 +1124098848 26 3655e1b40d5bbb77 +1124098848 27 3f2797ea0fe63b5d +1124098848 28 88c9b04c4ea7fd9f +1124098848 29 82e4ac72e5e8a1e7 +1124098848 30 382574e7a9ffa3ff +1124098848 31 1d2bd26564302c5a +387203520 0 84bfe0e05aba6b01 +387203520 1 9dba568aaf1b676d +387203520 2 9a8f794d2283108a +387203520 3 b63e6f4bde97134a +387203520 4 6cf18bcd3502637e +387203520 5 0c5e40e5a9dc8685 +387203520 6 8eb3a383529e3f43 +387203520 7 44ff6254661f9ab1 +387203520 8 36bf69483dffbd21 +387203520 9 83272895709262f4 +387203520 10 f0b48b820030e429 +387203520 11 b241fe7f591a0962 +387203520 12 c3cd58bd59361542 +387203520 13 107415a28d5e8409 +387203520 14 cf505ede3e51447e +387203520 15 23342dd6f2f91167 +387203520 16 90b5026019bf44a4 +387203520 17 d17f9fc5a902f4d4 +387203520 18 dca677191fbde46c +387203520 19 21f00ff636d3ae49 +387203520 20 e3a2e22307a13abf +387203520 21 3cc59dbd8ddc90a6 +387203520 22 31368848d5a5a4ad +387203520 23 f712c10b68f6f3f5 +387203520 24 7ad6d9e0346637d5 +387203520 25 c7373c51845ee364 +387203520 26 6b3b098f09f636d1 +387203520 27 deb9fc6d80001b52 +387203520 28 1291a0de1087a128 +387203520 29 b58ea66b886fd15a +387203520 30 a65e388d063037a5 +387203520 31 0ba843e1b23d6037 +3641908288 0 fb84b706ef66bec7 +3641908288 1 2b29942ef4171030 +3641908288 2 cb5ace169d7fcd6e +3641908288 3 56e0931fbb5daa66 +3641908288 4 aa5b0ca4bc6941b9 +3641908288 5 5a743fce44b3124c +3641908288 6 53f0b979f4ec0ef6 +3641908288 7 6aa83f9ccd035f2c +3641908288 8 0569150d955fd068 +3641908288 9 6914040cc73af948 +3641908288 10 d172fa8fdde01fda +3641908288 11 5fa47622248f2116 +3641908288 12 1eaad0c33ea2a9d3 +3641908288 13 6578044637ae601d +3641908288 14 2f512950378a184a +3641908288 15 109386130da2027a +3641908288 16 5be94fa4d1b7f2b6 +3641908288 17 ff3653e0a3129c2a +3641908288 18 5619c18f8b223e65 +3641908288 19 29d4a391316dad1c +3641908288 20 70ed001ae2c29798 +3641908288 21 7526d0b645349096 +3641908288 22 d66ed5656fe4c806 +3641908288 23 11bbbb3d21ea476d +3641908288 24 4e642488b8a3aa1a +3641908288 25 ca8ec624742df82b +3641908288 26 5436cbe43acae383 +3641908288 27 43d7de72458920ef +3641908288 28 1e88ec3f8dd398dd +3641908288 29 fc13e6add66b100e +3641908288 30 c65fed958c4078d3 +3641908288 31 1e147b68ed346344 +3687510528 0 f203ab407e66a326 +3687510528 1 22f515757ece7ce2 +3687510528 2 8065b9ff553c578e +3687510528 3 19b99de1f0b4e306 +3687510528 4 71becf282a71d93d +3687510528 5 8f3b4172e41277e4 +3687510528 6 48f6c51c51813eca +3687510528 7 d1ee9d6375938ab7 +3687510528 8 ceed24c64cd74823 +3687510528 9 1e62dd9220b5f1cf +3687510528 10 ed015dd1ad898cb6 +3687510528 11 e50b54268a28cf6e +3687510528 12 b32d04b3b4e3b95a +3687510528 13 26ecef42a0b6d96e +3687510528 14 61c5629b618ea272 +3687510528 15 d7733d6d024d27d7 +3687510528 16 66be45d9f3094a76 +3687510528 17 4987a517b5512a79 +3687510528 18 3696b91140e195e0 +3687510528 19 d589b60a2db03875 +3687510528 20 f567c08baf908749 +3687510528 21 7d336807f216575f +3687510528 22 b406f86acaec0f9f +3687510528 23 ea2aea354a5e19f6 +3687510528 24 8224fa375d3d65f6 +3687510528 25 bdee61310e719ee3 +3687510528 26 3a98de911baf2911 +3687510528 27 7a4c26692b41634f +3687510528 28 675457d9e9155a57 +3687510528 29 19e73a936929380b +3687510528 30 f172b56c046eb0b9 +3687510528 31 497be38b8cb13eab +1013821568 0 306bde1908bf8797 +1013821568 1 6ccb237504f9f8b0 +1013821568 2 8df5b9d4b0dcc12f +1013821568 3 750c5997e9ab9478 +1013821568 4 ee802326d207e948 +1013821568 5 524450b4c843941c +1013821568 6 382dffd71be2aa31 +1013821568 7 7ac348903acbfc89 +1013821568 8 ab97d4054edfaffc +1013821568 9 5a681ac0efed2177 +1013821568 10 22fc1ad59ff2872f +1013821568 11 694d053837a6c2eb +1013821568 12 84e1582886048afc +1013821568 13 995dd7ca2f714e50 +1013821568 14 2a6ad0e4702a1eee +1013821568 15 c7fd3ba2a87290ba +1013821568 16 c8954a1006f428e5 +1013821568 17 56cfa1fa0001f2cc +1013821568 18 2907139241b529a8 +1013821568 19 224524e1c64c0f2b +1013821568 20 88d407cb37d3a6f2 +1013821568 21 73655c29984f30c8 +1013821568 22 c2d2197ae11ca0dd +1013821568 23 b6f446c2e480024b +1013821568 24 74426645607bec97 +1013821568 25 18ece7e5dcdcfbe7 +1013821568 26 d3079366025100fa +1013821568 27 6973113439bd869c +1013821568 28 09d4f9861bafd5ba +1013821568 29 d84d710a70b2f25e +1013821568 30 eb62250bbb640951 +1013821568 31 11c8d96a428b9054 +2576145536 0 e20d1ff290dab089 +2576145536 1 88aaff853e86739b +2576145536 2 94fda301d06cce49 +2576145536 3 0759dd1884a52352 +2576145536 4 f32cf4c020b4423e +2576145536 5 92915ac66c65439f +2576145536 6 ea97eefcf47d4e3d +2576145536 7 60bfca807cbdee95 +2576145536 8 7f01ef26d99675b6 +2576145536 9 4b24874869ffb8ee +2576145536 10 1d7d91484ecdfb2a +2576145536 11 d48b81ac02d88a9a +2576145536 12 1daefc05c9942c3c +2576145536 13 1274312dbaac80c3 +2576145536 14 7586a76c6263e9e9 +2576145536 15 05a49623d1b02f6e +2576145536 16 64d8167e6f1112c0 +2576145536 17 9f05d208190954db +2576145536 18 9d40b0bfe9c92950 +2576145536 19 993972fe73c5055a +2576145536 20 a3095566db09a8ac +2576145536 21 385da838d2ff910a +2576145536 22 3e35eefcd476a0b8 +2576145536 23 72b9e54ec61c7c53 +2576145536 24 685a510d4382725c +2576145536 25 f11da8a1da1220b7 +2576145536 26 a592082c6956d269 +2576145536 27 03605b249c5c8764 +2576145536 28 d8033c0243f55a46 +2576145536 29 d8424a6fdc48fab8 +2576145536 30 83c33f5393f309c1 +2576145536 31 1b9eefc594473072 +1011030784 0 d71347d1128df2db +1011030784 1 ad8d913445e37322 +1011030784 2 be9a3a8142d36f35 +1011030784 3 c3287accb645319e +1011030784 4 8b6e63ea520649ba +1011030784 5 71af786d71979c85 +1011030784 6 9bd07c909a51a3ff +1011030784 7 24a4f2bde1153c1f +1011030784 8 ef54019303d78b3c +1011030784 9 d3a472ab689caec6 +1011030784 10 0225a7f02d611821 +1011030784 11 5f33e3264f8c4cf2 +1011030784 12 84bb81265e902d24 +1011030784 13 713ebc318df09c8f +1011030784 14 0354ad5caf72944f +1011030784 15 90aefc4b27c6d444 +1011030784 16 54cbba0f6317a1ef +1011030784 17 85c27ec7723b2e37 +1011030784 18 17a1862006832694 +1011030784 19 d6649ca558768b2d +1011030784 20 2f186bdd398e7b37 +1011030784 21 344283814e265624 +1011030784 22 bf7fe44b6f5e8357 +1011030784 23 ed9c30590f25b994 +1011030784 24 08e83c2f34f1c105 +1011030784 25 269f6d59773cb926 +1011030784 26 65e9725b17b7554f +1011030784 27 42f5db9bb67a30b8 +1011030784 28 2e39afaba063f4a9 +1011030784 29 04eca1df8fd4f0ec +1011030784 30 41a0a16811bbb1a8 +1011030784 31 a62f26eabe1ce130 +37357152 0 d86372b0ffcc4f2d +37357152 1 ca6d675abb1df220 +37357152 2 c98c6429969d687a +37357152 3 d02a7bbbe7759119 +37357152 4 81f8ed1fcc63fd2c +37357152 5 f67670b95c78aadb +37357152 6 e513c3b53e93f8bd +37357152 7 ef9248d89eec2394 +37357152 8 1d54ab6157da55d5 +37357152 9 ae934ba8a4b03000 +37357152 10 7612f5dd8ff6855c +37357152 11 c3e935c1a9e652e1 +37357152 12 5944e242a03c55d6 +37357152 13 5bb10a07858e18f0 +37357152 14 fc20d19caa20e609 +37357152 15 5e000768d291cce3 +37357152 16 15499ee38812d5b3 +37357152 17 4cd9453e31042fb9 +37357152 18 0623b73a86e1ea18 +37357152 19 8550fa701babe054 +37357152 20 4b397c246e04e7be +37357152 21 09c3315982cec085 +37357152 22 4958763e55363288 +37357152 23 803f815801b6b6d3 +37357152 24 ce8fbcc8a6d61603 +37357152 25 6ec0a3b627e5d10d +37357152 26 ebf7c11dee56ec7b +37357152 27 d8af433b221b3344 +37357152 28 6f900988e0fd3641 +37357152 29 184590be65b3bd7d +37357152 30 c7825dcdcd690223 +37357152 31 22398507055eac62 +4139829536 0 2ccc35afa7bf4e63 +4139829536 1 ee206e5fffd53fbf +4139829536 2 eaa26fe9e08df4ef +4139829536 3 10a77f1110fe7264 +4139829536 4 0b35ad2d0aadc878 +4139829536 5 7727b718c1140551 +4139829536 6 5ab04627afa0f540 +4139829536 7 a8ba750ba8e46c25 +4139829536 8 b2e601bc4cc403bb +4139829536 9 d53fe5e0b52a471a +4139829536 10 2176de79045ef304 +4139829536 11 3d3e8bdd49a1385d +4139829536 12 463dcda579d072ae +4139829536 13 bde3eaf0ac726ab3 +4139829536 14 18603502f1e58df2 +4139829536 15 5793a3eda6fccbfc +4139829536 16 c92f7310b74a155a +4139829536 17 9d4d923a32289672 +4139829536 18 6beb8304fd257d3a +4139829536 19 959590ce936e894f +4139829536 20 46c0ec585d486bed +4139829536 21 fe744b541936919f +4139829536 22 a9f9bd233ab16a7c +4139829536 23 0c251fbfb17ecd24 +4139829536 24 384d35e2f12f7aef +4139829536 25 d5e74692f6b0894f +4139829536 26 bd5018837675bf40 +4139829536 27 fc9643bf9731795d +4139829536 28 ca8ac81e03ecd5db +4139829536 29 c9eb25f058635a02 +4139829536 30 57f7931e32be464d +4139829536 31 6972adb07a1ab7f2 +3985725632 0 58f2104a1356c497 +3985725632 1 cd6a66ad1546a29b +3985725632 2 2204f7940dc49372 +3985725632 3 74fd78519aec5a46 +3985725632 4 d4b366cba66c770a +3985725632 5 9504d736d83084f1 +3985725632 6 c90eb55a9613968a +3985725632 7 4673914a63f2fbf1 +3985725632 8 4643ebfa89aedc29 +3985725632 9 0b71d4e7a8659117 +3985725632 10 2c26b03a675e65dd +3985725632 11 0859b4e1184aa9e2 +3985725632 12 95f56a8e840ccdc6 +3985725632 13 ef258952b72ff178 +3985725632 14 964c15ef132c610b +3985725632 15 8598d923700e22b3 +3985725632 16 7f7623bea5ed8969 +3985725632 17 f0468c185411caf6 +3985725632 18 5a1fcb5187427406 +3985725632 19 65acab1b5452245a +3985725632 20 91fda9574f1c6377 +3985725632 21 c31ce95a2963e895 +3985725632 22 1dab900e251e17b8 +3985725632 23 41515d4c2f1ab220 +3985725632 24 bce14213ae77e081 +3985725632 25 b3186eda60cc963d +3985725632 26 da141051f849b1c2 +3985725632 27 63247502dbcd0906 +3985725632 28 151d074a8d4a55fe +3985725632 29 2caabd693b93be36 +3985725632 30 fb4751ac2df52ea2 +3985725632 31 91aefeb9581a1d9c +3974419104 0 ad09f91375a3b242 +3974419104 1 6ffa98d505f3f03a +3974419104 2 95878d98e1ec54c6 +3974419104 3 4d877d229c678b85 +3974419104 4 06a893575baff5ad +3974419104 5 f077d9b6e3c28d28 +3974419104 6 0a158caf57672990 +3974419104 7 4cba4dfdac27d6ec +3974419104 8 14644f54d3652544 +3974419104 9 f99cfa2411b37a3a +3974419104 10 868d716b01c92588 +3974419104 11 38c56a4bb56716e8 +3974419104 12 370aa2c17df1fe1b +3974419104 13 08cd1da69ce96160 +3974419104 14 da8832a16be9a79c +3974419104 15 577a2d1bb0c9d1a7 +3974419104 16 b3326f9b6a5e95d1 +3974419104 17 266fe554ebbf7b8c +3974419104 18 116553f0983ebd78 +3974419104 19 85e7508a825b21e4 +3974419104 20 034c3cc563acb39a +3974419104 21 dc5d2e0a898829e5 +3974419104 22 f716b0404a16bf20 +3974419104 23 a5dcddd83abaa53e +3974419104 24 b5984dc8afcf2584 +3974419104 25 b294cd7e1780c8e0 +3974419104 26 fe9e0f7324aa0e1c +3974419104 27 c360db4e88fedaa7 +3974419104 28 62852dad3c4a432e +3974419104 29 f9d3e89deaf3c57c +3974419104 30 eb364ce97233e434 +3974419104 31 c202938edbb5373c +798615936 0 e31ae98f42a858a5 +798615936 1 9ba729b788568ef7 +798615936 2 d5e68e72529cc876 +798615936 3 59e172ae23019516 +798615936 4 6aaa83fd9e56d4fc +798615936 5 5aa5808c8b0faf60 +798615936 6 0fbb29a307519872 +798615936 7 e96be2bbdd75aa85 +798615936 8 08e2c9387c198b0d +798615936 9 1e02e990b10f8c15 +798615936 10 3dce7e8d4f871205 +798615936 11 451836f66f3d8e59 +798615936 12 9976d604351d4fbd +798615936 13 77d3c726efe5da2f +798615936 14 6645c378b7bb5d60 +798615936 15 8f4b37b39b655aab +798615936 16 d1aa77a3f1012f6d +798615936 17 41bb59e7ff76b7d6 +798615936 18 cf2c28d033ba4bc6 +798615936 19 2d3f087a1a2ccfb7 +798615936 20 53c8c46e65183bcf +798615936 21 14afef94ce3e9241 +798615936 22 a975224e9911f042 +798615936 23 09c573b5ddfb3c0d +798615936 24 230427fcfbbd1198 +798615936 25 b36bd7bf420086d7 +798615936 26 a3914302f634c26d +798615936 27 2b239f3359ba3916 +798615936 28 f85d048af1745f92 +798615936 29 052a4cd3e9990d7a +798615936 30 a0cefea9632c70b0 +798615936 31 456d67b453bbad68 diff --git a/proto-newpow/mma-shadow/out/dump_32.txt b/proto-newpow/mma-shadow/out/dump_32.txt new file mode 100644 index 000000000..d06cf8153 --- /dev/null +++ b/proto-newpow/mma-shadow/out/dump_32.txt @@ -0,0 +1,1024 @@ +3588372608 0 00f320a2ceda4258 +3588372608 1 7b2e60b2d81e6d5a +3588372608 2 8615a105c1b44efa +3588372608 3 d2e4bd549339ebd2 +3588372608 4 e5ff5b0edef30957 +3588372608 5 34ae96b92f43f8d3 +3588372608 6 dae9537ad42d339b +3588372608 7 4db1b4d3cd2bc632 +3588372608 8 fcecfa5e02f3d679 +3588372608 9 1b51293eadbea99b +3588372608 10 ec3daf1c58cb061d +3588372608 11 df1a99cc832753f3 +3588372608 12 341363970cee76a8 +3588372608 13 76cb5310bc2d070a +3588372608 14 df9695256d67828c +3588372608 15 5fec3cea27794716 +3588372608 16 21055046009eed01 +3588372608 17 ad91888f20af8004 +3588372608 18 d0dace506aeba0bc +3588372608 19 8d93961d5c376c08 +3588372608 20 fd21464e0093141d +3588372608 21 54036a16aae2ccfd +3588372608 22 73b94d66c90d175f +3588372608 23 9ddb9869bbb942f5 +3588372608 24 c3ae85c9240700fc +3588372608 25 a2859c1d6eaffa8c +3588372608 26 e2d5f7494eb61ebe +3588372608 27 08f5623916a1f20e +3588372608 28 f7ce8f2bcc0e1ac0 +3588372608 29 9247d7cf45f610a3 +3588372608 30 cb4886b3497939bd +3588372608 31 b8397a337bc1bbb9 +1023626400 0 509aadb41694947f +1023626400 1 ce776e4e28f64041 +1023626400 2 ccbaad8aff290a1d +1023626400 3 244c5cd715a52478 +1023626400 4 2ac27109a8e681a8 +1023626400 5 4e4278996e173321 +1023626400 6 840d110805ed63c8 +1023626400 7 707b54b4322994f3 +1023626400 8 926d6fd617c88016 +1023626400 9 43ef723ae2f4ee74 +1023626400 10 dd44878027e459bf +1023626400 11 ab4f7682730e48cb +1023626400 12 eda8d17768500140 +1023626400 13 f027ac18410e00aa +1023626400 14 4f3f2a9f9dd65b2a +1023626400 15 117d026a71c4ea72 +1023626400 16 ae6144e0b03b682e +1023626400 17 b3a5f7902a42b25f +1023626400 18 c40459dbb2792935 +1023626400 19 db5d6e6886a8a72d +1023626400 20 85434e5c60b76c29 +1023626400 21 5f3e7a63f62ccbc7 +1023626400 22 5df55c9fbedcff4a +1023626400 23 db9605a1f942d491 +1023626400 24 72656912983fa373 +1023626400 25 a63826d5849e7a33 +1023626400 26 bc00c225d7e6e9f0 +1023626400 27 affd7442d8b3b8a7 +1023626400 28 e5b15daf4e285675 +1023626400 29 c6e4f68721a1dc69 +1023626400 30 b8786715ac80ed54 +1023626400 31 f993910e3a81adbd +3929384352 0 327e9398df67014f +3929384352 1 e77a62e0239d24f8 +3929384352 2 2417d7ef37bfc60c +3929384352 3 6d800b303cbfdc3e +3929384352 4 2dae3d451f84a2aa +3929384352 5 388b193d3141034d +3929384352 6 1d85a0cd88c1450f +3929384352 7 f89da2c057ef7dc2 +3929384352 8 82315c9db27688db +3929384352 9 cd1ff2947cf909ec +3929384352 10 20e7a85093d98a7a +3929384352 11 b8325c35cbbd66c0 +3929384352 12 8cdb71906e8dadb2 +3929384352 13 840588cbb507aeea +3929384352 14 7d8e14f5fcf9d58e +3929384352 15 e43dd17bd71d9ffa +3929384352 16 ae9d0104652d8c8b +3929384352 17 5a1e5f77eea00f4a +3929384352 18 b4654fc481999eea +3929384352 19 714ce81c1e5025a4 +3929384352 20 d8370c82a9ab522b +3929384352 21 bcee04a961a2eb0c +3929384352 22 d5c6e7eadf7e6f1b +3929384352 23 cf90aac50920ba7e +3929384352 24 1a00b92e993b171d +3929384352 25 b7f43fcc6703ba84 +3929384352 26 0201a24b0c1a332c +3929384352 27 32afe7eb2997612a +3929384352 28 d8b8c7fd303ed273 +3929384352 29 0a6a68657010387c +3929384352 30 48e95288045ebf87 +3929384352 31 fea53fc3a51318d4 +1113183520 0 471765621f37b0c2 +1113183520 1 b0b5a9cabc20f6c9 +1113183520 2 d2e29194f7f0ac65 +1113183520 3 42396571dd496439 +1113183520 4 5ecdd7ee2339b10b +1113183520 5 e2950a2466af246b +1113183520 6 fdfc9af826ad88da +1113183520 7 64ca13644c04ca68 +1113183520 8 b98f980fe51561fe +1113183520 9 794eb27ed45f7b5f +1113183520 10 c312fa543c5d8c1a +1113183520 11 e3eb5b9090cd1209 +1113183520 12 0a2aa262d2b7d221 +1113183520 13 a7a2218465502cee +1113183520 14 b6eabf86c7a52c6f +1113183520 15 3b9e7170961f6840 +1113183520 16 286b056feba49020 +1113183520 17 74a74bafd8012adf +1113183520 18 cccd18df161b071c +1113183520 19 74d57f2255694d83 +1113183520 20 3ba06f5a274f66ce +1113183520 21 7157fda939819e14 +1113183520 22 4e4e23518edff156 +1113183520 23 162f8819cb3ecf0f +1113183520 24 775358c1421ebe33 +1113183520 25 c8d8583573a409e8 +1113183520 26 888e3c912a988754 +1113183520 27 38181ce5bc0d3ed3 +1113183520 28 839135509f5859a5 +1113183520 29 eb2a71b91d788c6f +1113183520 30 258a61300c99a844 +1113183520 31 cb265d0f061c4e39 +1774593184 0 996b00fe48b0c46a +1774593184 1 6f47e36ecf6bfacc +1774593184 2 c716b412e1dd59d5 +1774593184 3 3230b1fad4191457 +1774593184 4 979a6916c1ff0b71 +1774593184 5 63af34faaaa34274 +1774593184 6 cd1c7803567af321 +1774593184 7 e036cad7808ee2ba +1774593184 8 41b94ee23db85d32 +1774593184 9 fac411e0c3b667e3 +1774593184 10 377a8e931f44ecb9 +1774593184 11 a6c9f0881e3baeee +1774593184 12 a53ab60730d26b21 +1774593184 13 7c4a57e68c9c7465 +1774593184 14 84604b35f6a6f20e +1774593184 15 5a60a87cd427a28e +1774593184 16 8cefd9675bf0c2e0 +1774593184 17 050fd92bafb7a454 +1774593184 18 3a1d93330c8bc8ae +1774593184 19 70dcb87123ad65b1 +1774593184 20 68d26bce3693e4cb +1774593184 21 6588f2cc5c6b4c61 +1774593184 22 c99319f2cb7dbf1b +1774593184 23 f30f25b4b3e95222 +1774593184 24 d812ea84fd415d04 +1774593184 25 28b092a5932c4023 +1774593184 26 2b4bcc6a2dd610b1 +1774593184 27 7baae82c608170bd +1774593184 28 f6bcdd7d69e86983 +1774593184 29 3b6695c18a2fc387 +1774593184 30 3295a572767c9d93 +1774593184 31 aff845f713866421 +637272864 0 9cc35030616ddee5 +637272864 1 f775d0d49524cb1b +637272864 2 e728089fc642c772 +637272864 3 2aa8a76c3766bce9 +637272864 4 733bd84654f098d2 +637272864 5 5ce42594902e28fa +637272864 6 c010a25b2b8a4b21 +637272864 7 3f1bf479c997ab98 +637272864 8 fc123602aac5010b +637272864 9 40f57164c5305a84 +637272864 10 140c3cd94e4495d5 +637272864 11 0dcfc0512be4688a +637272864 12 eb1aa53cf9c872ab +637272864 13 f15e6f34967a0675 +637272864 14 20fdfdb1d7f128f5 +637272864 15 be4b6b73e065f2a9 +637272864 16 8c7a390c8497233a +637272864 17 fdf0fdefb0a82ac8 +637272864 18 cc509c74f5e136e8 +637272864 19 f20923a221b5cbb4 +637272864 20 b51b5ca693cbe0da +637272864 21 f1422dc66aabf5d8 +637272864 22 d139d932ceb14e7e +637272864 23 e97c458298823df5 +637272864 24 e2e3e7ffb8582a37 +637272864 25 db1615d5e124da99 +637272864 26 b37c63aceb456c98 +637272864 27 639ffac8554067c9 +637272864 28 4bc557df302f1bad +637272864 29 9437f6b5e8a570d7 +637272864 30 0b9061576dd19bf8 +637272864 31 882972952f7a9cbc +2482166944 0 7be45a40cd30b446 +2482166944 1 fccd6f89d572eb7c +2482166944 2 a9b93b50aa48dbb4 +2482166944 3 49f894d0a68093ea +2482166944 4 b1368a6a6b8fa294 +2482166944 5 07007775fa5e4f06 +2482166944 6 1c065657f653e8a3 +2482166944 7 339cde9a009189ad +2482166944 8 947535413883d28a +2482166944 9 f0a3b549a8e79b33 +2482166944 10 889e79ca9c7f84e7 +2482166944 11 a5f927623ff46460 +2482166944 12 d1c10d0d37fb595f +2482166944 13 77a310ec21198c78 +2482166944 14 b2186d65cb279017 +2482166944 15 2c9104c2996a0c10 +2482166944 16 4883c97cc75ee2d3 +2482166944 17 22faf3feb7237e14 +2482166944 18 cfb1e96a9b759311 +2482166944 19 08a6c0bf750a6bb0 +2482166944 20 04e6f7813d1292de +2482166944 21 f5b91f87a6e23e10 +2482166944 22 65012cb8775c006e +2482166944 23 c701e6b879f57f46 +2482166944 24 f2bab414a56de4ba +2482166944 25 a98bf3d5bf125a72 +2482166944 26 45e5db666db952e5 +2482166944 27 bd648f5b158bb93f +2482166944 28 ffa6f8cf5effc5d8 +2482166944 29 08d40412ac67211c +2482166944 30 4cc198ed661f6dc2 +2482166944 31 dc0d93b04f0d3874 +1243715392 0 b958cfa99b2681c5 +1243715392 1 91de8d7272ea5536 +1243715392 2 65f430d27e41868b +1243715392 3 f1c9db412f3ec0e4 +1243715392 4 ab092818e7d3de3b +1243715392 5 5d9bc8f6751f3fc1 +1243715392 6 639c73918cd4520c +1243715392 7 75b65fc06d648a5b +1243715392 8 ac8bddaeac451e8e +1243715392 9 75a409689190795d +1243715392 10 940569c68fc011b0 +1243715392 11 ddd5004ca9fbb39a +1243715392 12 1e011a852feefe35 +1243715392 13 7685928d639c3933 +1243715392 14 15b3cc22c4b0a25a +1243715392 15 0c0d156883a6eefd +1243715392 16 1a72da3459def12f +1243715392 17 c91ac3e0d8363894 +1243715392 18 8af376d017f45e34 +1243715392 19 90be1b312bb36427 +1243715392 20 58ce210832cca93f +1243715392 21 4ef37c6371bfab07 +1243715392 22 f721ae53db6a69cc +1243715392 23 8b74f24829047762 +1243715392 24 e331c40efe7e11da +1243715392 25 90f3c122c6ed71de +1243715392 26 1b5ac372e21a5b0a +1243715392 27 f0845c5d4d02eb8a +1243715392 28 c2755bd7d18f54ff +1243715392 29 ba54855b1a3dbbf2 +1243715392 30 cd6d6769bfc94d4f +1243715392 31 0f213c8578fef9ae +209806816 0 94d6cb9a4cf6d1d3 +209806816 1 29fc4c654919dfa5 +209806816 2 e6167654bcd68748 +209806816 3 caebd50ee601f053 +209806816 4 00972c688eed31ce +209806816 5 85b99d1f9cec50ec +209806816 6 743882b772cc8963 +209806816 7 0c42de0a86ae5783 +209806816 8 20408c0c56b78c99 +209806816 9 064763c39e9b21a4 +209806816 10 6e7e3f5886849092 +209806816 11 9b97ae03a60bd27f +209806816 12 82ba260fb77262bd +209806816 13 2e854620b54f2c38 +209806816 14 395bd1c60b6b335c +209806816 15 465d7aed82e478a6 +209806816 16 a61958aa2e6242fe +209806816 17 b4fb0d3d5abfba82 +209806816 18 9b92e6bdfe1fc102 +209806816 19 29ec6437d98272c9 +209806816 20 96d83cd6c09cac53 +209806816 21 7e0daef9b6d8d57f +209806816 22 46dd76a69f194102 +209806816 23 71a26d1baf099a05 +209806816 24 9e9a32fccf70ada2 +209806816 25 434ebf080c112bd5 +209806816 26 5903cc87bcf51f93 +209806816 27 50c2f45a33df6d2f +209806816 28 cf7e741ff3d93853 +209806816 29 e0dc2c7068b0a832 +209806816 30 02a11fe3c700b9f9 +209806816 31 a38332b1a1ce0840 +3395624224 0 052c0ad524dd22fb +3395624224 1 5e5c3b32df9210f2 +3395624224 2 5e1dc6a7b9387bd7 +3395624224 3 743d0245475b3d47 +3395624224 4 8c682abbe279c184 +3395624224 5 d510aad14994de1b +3395624224 6 e2aa7d5c0998010f +3395624224 7 1a436a78a9ab0fb1 +3395624224 8 ac8a037a6a98bfe7 +3395624224 9 764c7dfae36f9b8a +3395624224 10 615116e0fe38029c +3395624224 11 8b2be68d370d5489 +3395624224 12 b365cbaec654ac42 +3395624224 13 d662ee0e1435a070 +3395624224 14 b78e6a2da0102ea7 +3395624224 15 d15a3ecaddf6ff8c +3395624224 16 638284b5a9917902 +3395624224 17 d85392afa6687c14 +3395624224 18 c469f32b9764862a +3395624224 19 e4d553507ce4dbc1 +3395624224 20 9373c144ccb4ab78 +3395624224 21 56ef18e67425db10 +3395624224 22 911bedd98e8d0d72 +3395624224 23 f998912f18c7c97f +3395624224 24 83d38f5d41bab26c +3395624224 25 c7b3f671e932bbc7 +3395624224 26 9c9c2330c417f89a +3395624224 27 d75f7f896b44bd94 +3395624224 28 9a05e99a67dc1316 +3395624224 29 5c041a240c7ba045 +3395624224 30 3f01ac5497f749a6 +3395624224 31 0848cc880697f3ac +3886889632 0 f41f7c996add0e9a +3886889632 1 130cf82312625342 +3886889632 2 243c5f0ca2aef296 +3886889632 3 72106290bee3710d +3886889632 4 1f55603575033a9c +3886889632 5 51530342856e936d +3886889632 6 a63b99c0be270acf +3886889632 7 95ec1d7f94b2eb43 +3886889632 8 b5665c586df49cb4 +3886889632 9 9c5915a5a6e051fe +3886889632 10 0b4331bd62408bf5 +3886889632 11 f21151174d99337c +3886889632 12 8d7c6e62c1e76db8 +3886889632 13 a49062bae50b5c19 +3886889632 14 c2fffc935e5447ac +3886889632 15 ba5871e73eaa9a64 +3886889632 16 570940a7c98832a0 +3886889632 17 74cf0f45c1a3074b +3886889632 18 20ac62223295d0dc +3886889632 19 805d77495df3fb9f +3886889632 20 ac462364a13e6a46 +3886889632 21 51770a8d273c1527 +3886889632 22 f6528695344e7777 +3886889632 23 56c12328f10d7935 +3886889632 24 fdbb92de2bfca05a +3886889632 25 d2e4f881d2e5136e +3886889632 26 42954ceea4e37e08 +3886889632 27 aa66d2bb762539f0 +3886889632 28 25a303c10d7a9b47 +3886889632 29 c7cbee8fe06e4e5a +3886889632 30 c9955d3a29ea291b +3886889632 31 24b78b5cd9d7e10f +2045577696 0 6c43b053d0ce12de +2045577696 1 c7ac999f1c1af81b +2045577696 2 6346904653d64e8c +2045577696 3 e1f49322a726f9a8 +2045577696 4 2ca6cbef09e67dc6 +2045577696 5 637be3258534d62b +2045577696 6 baab4365d39e5815 +2045577696 7 51080c27cef66b23 +2045577696 8 8e11957022aa0c24 +2045577696 9 8c6bea46d0a91c8f +2045577696 10 af95299342885294 +2045577696 11 41667b7c1fb83713 +2045577696 12 25c5be4e348e23bb +2045577696 13 04ba6f453c763eac +2045577696 14 cb6fe1226fa5d8bf +2045577696 15 2d131e2651f26682 +2045577696 16 48515dee8f9f6411 +2045577696 17 e895ef125b50a952 +2045577696 18 67a06283986b6337 +2045577696 19 61de984c309bca9b +2045577696 20 f573101e7eaaaa1d +2045577696 21 af127c50f63c2097 +2045577696 22 0ff69e5c503e99c6 +2045577696 23 49313ad1de9d6eaf +2045577696 24 9e6245fc804291b9 +2045577696 25 8f4219ef560634cd +2045577696 26 6538c68d9d767b01 +2045577696 27 74639ba7c4a409cd +2045577696 28 df9f532f73338cec +2045577696 29 87253666005b7eb5 +2045577696 30 60a9bda292c6917c +2045577696 31 75362a2f2ba097d1 +2073778688 0 549ccad6247cb76a +2073778688 1 b49bc14f73634ca0 +2073778688 2 a62befc8d9c87446 +2073778688 3 5835712520fccdef +2073778688 4 4f2ef8b4d9090dda +2073778688 5 c808623dc8b02ed8 +2073778688 6 e56612b3d6cb9a61 +2073778688 7 c44b6a6ff4683533 +2073778688 8 43f99e8ead21c5f4 +2073778688 9 0b77ec639511502f +2073778688 10 bc99bbd0b5f76934 +2073778688 11 c0d2c71a03ec3e3b +2073778688 12 2a4a74d120f6f75d +2073778688 13 7dd720300613404e +2073778688 14 ecf715da98f36207 +2073778688 15 2464874b18395f4f +2073778688 16 2800fc5831f1f512 +2073778688 17 43850540a9edc964 +2073778688 18 d845d5ee2c5a3063 +2073778688 19 a2ef2a037665fda4 +2073778688 20 2379343ac35fcb7d +2073778688 21 06a87f26cd80a1da +2073778688 22 fa2ed70cfba2f72e +2073778688 23 32da120dffef88fb +2073778688 24 887d19d73de4e981 +2073778688 25 e457955c7cbaffd5 +2073778688 26 4fcfc76216282522 +2073778688 27 db8e099436c2ec49 +2073778688 28 b2a8fc15615c0058 +2073778688 29 3cdbbd158ac635e8 +2073778688 30 bdc6c1d0f5351df8 +2073778688 31 847881f52262608b +10993408 0 40c19e053f055558 +10993408 1 7d44520d946e6654 +10993408 2 44746b602013379f +10993408 3 9a8136df02e691fa +10993408 4 5c2ff7f54970edfa +10993408 5 2f05a604479608f4 +10993408 6 b8d36159a3ba0297 +10993408 7 346a9d4dfa938c6e +10993408 8 541b5ef3eeb9df76 +10993408 9 3372e4c69574fcbf +10993408 10 75aa088aed178288 +10993408 11 6e78d96de11a5d48 +10993408 12 b064ff480eef6813 +10993408 13 ae1912c175da7287 +10993408 14 c892efd991203bbc +10993408 15 c4eb8f526f560d70 +10993408 16 5f13f65a3261fec9 +10993408 17 494f170478fcef1f +10993408 18 78e467f1b0e22fbd +10993408 19 cb0810beb99ace1d +10993408 20 bd2c2fd826704e86 +10993408 21 c0b724f0a3418f48 +10993408 22 efb8440e19a56a8c +10993408 23 75b6d8b4ccaf3860 +10993408 24 5a57ef394bada39b +10993408 25 d13802b6e8c4e90f +10993408 26 57b4c328dfb323f8 +10993408 27 02df98c51ab2f3e1 +10993408 28 70e809c3803884b7 +10993408 29 82e5f6f769b30506 +10993408 30 54d2decdaee34b33 +10993408 31 69c2a2f6b7e92bb2 +3490840416 0 b4eaacfc3d44ea4d +3490840416 1 87bf286e458e069b +3490840416 2 162666dc5d857d3c +3490840416 3 aead7bcb2d7b4771 +3490840416 4 67ff4d8b6f3037a2 +3490840416 5 e89692302a275950 +3490840416 6 78243667eafb4ce3 +3490840416 7 420f94ae31cabf87 +3490840416 8 ffd81daf042e1d92 +3490840416 9 afce96cf430f1afa +3490840416 10 4bd3cae959c549c6 +3490840416 11 d2d449beee719a6d +3490840416 12 d9737cd83832841e +3490840416 13 d6dd603535970d53 +3490840416 14 dd4ab812744df421 +3490840416 15 4086ca69c75cd2e3 +3490840416 16 c556ffc9e49f9c1a +3490840416 17 4543448e5e50d143 +3490840416 18 f683e7b099d0e917 +3490840416 19 47b4f1d6ed9156ba +3490840416 20 1f8f50b34478179e +3490840416 21 43df7c1b65437196 +3490840416 22 5acbf5ef1f2bd3f4 +3490840416 23 593c0c0db4bedec7 +3490840416 24 e6d95602ac20553e +3490840416 25 8485bcf875ddcdfe +3490840416 26 2f9e97065f6a9215 +3490840416 27 21d9289eb6a013fe +3490840416 28 cd85cf7e3c927fb6 +3490840416 29 c3ad98a157721acf +3490840416 30 b3e23db7592ee1dc +3490840416 31 400b5c03c0db937b +2848373920 0 7b28ac8cdca6f5a2 +2848373920 1 3d1b936f33ded4d6 +2848373920 2 5027a21526589ac5 +2848373920 3 eaa514f0c08179c0 +2848373920 4 fbb00925280b6158 +2848373920 5 fe4993db9d54fac3 +2848373920 6 7ec710419ed193f4 +2848373920 7 70d906555eb43609 +2848373920 8 6edbe7e08154e963 +2848373920 9 399d0a793e8a3f21 +2848373920 10 6edf2aacb5ed6a17 +2848373920 11 1dd298fc5ff4a5d3 +2848373920 12 32892e56fba7498c +2848373920 13 bcf19f0f790d9e68 +2848373920 14 c25e57ee9f873979 +2848373920 15 8a58a1cf88a0da68 +2848373920 16 317fa0b8d914e544 +2848373920 17 b3c9e523fe3810b3 +2848373920 18 95515f2a27dd4acf +2848373920 19 a16144391e506f58 +2848373920 20 27ea3c38ff4506ac +2848373920 21 28c32af0a3a5f28c +2848373920 22 527df236c31c27fe +2848373920 23 f12beb61fe9f0cec +2848373920 24 174bef5dd9afadc6 +2848373920 25 2962d0671a0e3250 +2848373920 26 4f0361d7c58fbfef +2848373920 27 fbac20a25a01419f +2848373920 28 8e5a093720954c33 +2848373920 29 ffd34fe4eed639ce +2848373920 30 bf27e948441c60c3 +2848373920 31 233fe976a8b9c862 +2880556800 0 68bd57ce7399ba2a +2880556800 1 ff551c8ba72ae253 +2880556800 2 d34b081f82c310da +2880556800 3 d62bba22d11eb142 +2880556800 4 c29e17053f10e1d4 +2880556800 5 168313fda928a6f3 +2880556800 6 1f0630811151d4ef +2880556800 7 8614986f823c2e4b +2880556800 8 5bc012e1e8c028e9 +2880556800 9 52039d5c4b69eb9d +2880556800 10 c456984ebb066132 +2880556800 11 0a59d008e0c6e90e +2880556800 12 8edfb57048c9bd04 +2880556800 13 2134aecc20b2c2ac +2880556800 14 ed50b3f24e1897a8 +2880556800 15 4bbf2c4fdd5ffabd +2880556800 16 674989de04f8d7cd +2880556800 17 f278b6f0ce8c2564 +2880556800 18 b3018020a92884f2 +2880556800 19 d55fa855f8b0e75a +2880556800 20 56c279dfefddb979 +2880556800 21 37f5f7795a459269 +2880556800 22 c25d56f957d483af +2880556800 23 16ae674826234131 +2880556800 24 7e811458ac772646 +2880556800 25 110613521b8aa169 +2880556800 26 d86c0cbeb31208bf +2880556800 27 d46f8e580c603412 +2880556800 28 81610e038fef35f7 +2880556800 29 dd4a1a11ddd5ac62 +2880556800 30 bc5e8204c8e772de +2880556800 31 bf81d5ce3aae2110 +3625086080 0 e314997f319be5e2 +3625086080 1 5412d0cf2ca90286 +3625086080 2 dc8711296623ddc5 +3625086080 3 ea9a368c99673599 +3625086080 4 1c82449e222f2432 +3625086080 5 fc6ac94f859dbaa8 +3625086080 6 a18c11c6a02d36c4 +3625086080 7 1360aa58d1567f56 +3625086080 8 f9afb60fa237007f +3625086080 9 5f5c1d31d4b720eb +3625086080 10 e65060cb82be3fb8 +3625086080 11 141cb5bc204aac24 +3625086080 12 89e385e6f36db54a +3625086080 13 33a99b3f58a1811a +3625086080 14 638da7a6e84e5c9f +3625086080 15 925e9792a1afd382 +3625086080 16 101414ca9517a9f4 +3625086080 17 3a485acbfcd91c81 +3625086080 18 7e17f33e3ad7b34a +3625086080 19 c1e0856074f97a89 +3625086080 20 a498b4e7e29b7b65 +3625086080 21 e3f692abe635ecf3 +3625086080 22 5f0a237c5c4e274c +3625086080 23 b1f3c1443708ecbb +3625086080 24 8f3eacc17f1b4b09 +3625086080 25 2afc6aed57aa0a41 +3625086080 26 b40d6cbdcf4bc249 +3625086080 27 7663d0efd7d8d156 +3625086080 28 1c3839500271afa2 +3625086080 29 cc670af540661f93 +3625086080 30 eb236e4c6d616da0 +3625086080 31 9138171ca9463a4f +2537065920 0 cb6b32b5d4fe4be2 +2537065920 1 a06f23f3ee6477c4 +2537065920 2 99890e61a59e72f0 +2537065920 3 084631fd773720cf +2537065920 4 6bb9a5bbc9dbb06e +2537065920 5 53ee8a8bcefeeeaf +2537065920 6 ab4cb3088fde9ebd +2537065920 7 45a7992d8ed44290 +2537065920 8 bd1045b0ca30eaa2 +2537065920 9 658e017af16ea824 +2537065920 10 737955bf3ee0483c +2537065920 11 82d8bc7b17b5b04b +2537065920 12 0ee2133974c003ae +2537065920 13 bc9bd3c3d077488d +2537065920 14 ab7bc0a21ce11c51 +2537065920 15 056c2bf704195309 +2537065920 16 0fbe2a89f0186cf7 +2537065920 17 09a753e77d98be48 +2537065920 18 7fa769c739b7d115 +2537065920 19 cf070e6e014a078f +2537065920 20 92d60439cc46bffe +2537065920 21 fc527a43c11856c5 +2537065920 22 741f1905b7c6477c +2537065920 23 de87417f6e0f2b93 +2537065920 24 48b081a1c72ed782 +2537065920 25 f27a7407b39b2d00 +2537065920 26 0aa1ed154edf690d +2537065920 27 568cb987ce4a85e7 +2537065920 28 b5e7bda90db63f49 +2537065920 29 d0a88b5a87f9e5a1 +2537065920 30 ebf85e6103bef857 +2537065920 31 a839509b299ae2d7 +1646897088 0 a1fd878782d33a70 +1646897088 1 4cb6103e0561fb7a +1646897088 2 0724db29205b3fbc +1646897088 3 cf574df5010c1ae7 +1646897088 4 147305c097de28b7 +1646897088 5 9ed803bdb8ff4d60 +1646897088 6 94952ebbe2f4f375 +1646897088 7 ec4359e69f2d63e8 +1646897088 8 8b8f1558bccf0d26 +1646897088 9 242967bd83142562 +1646897088 10 ae5d2a0ffce273d9 +1646897088 11 26d882e4abdf4990 +1646897088 12 8846105c2d78c438 +1646897088 13 987d7d6981ae801d +1646897088 14 8428688ef935cdfe +1646897088 15 d01858c2c3ac44bc +1646897088 16 9c8d5daaa2ed06e8 +1646897088 17 329e823e3fd49153 +1646897088 18 8a90d9bbe28f9306 +1646897088 19 7beb5ebae691a331 +1646897088 20 bd6673aa83db03e1 +1646897088 21 cb14d9e736712108 +1646897088 22 60c54e75a88575b3 +1646897088 23 0760be9e986c854d +1646897088 24 94090db0283b6984 +1646897088 25 4fb9a01bdd99131e +1646897088 26 1f75be7ac89c0a0a +1646897088 27 a892f04686b999f8 +1646897088 28 c086f892ddec54b6 +1646897088 29 d77b3adaa73f0ae0 +1646897088 30 606b202cd022ca17 +1646897088 31 59b0733b16fcd1ef +1124098848 0 54768bf4e51bcfb8 +1124098848 1 1d3ad1b691120270 +1124098848 2 da1d78bd9f452a85 +1124098848 3 4c841f76eaf54ebc +1124098848 4 6092e3800578c9eb +1124098848 5 fa10d319e1bebec4 +1124098848 6 767ca9ac2313a728 +1124098848 7 30366aed2105a25d +1124098848 8 2802285ab729b6c4 +1124098848 9 ed3cea4b9171b510 +1124098848 10 347b7232fc6a6132 +1124098848 11 569817bc5a39b751 +1124098848 12 8f9727c74bff25c2 +1124098848 13 ba718594e1513b1e +1124098848 14 5eccefa8b3d6bf9d +1124098848 15 0e476a610479c4b4 +1124098848 16 7d0534437138544c +1124098848 17 ff186e57a05fdc07 +1124098848 18 3c571d2c9f7d5e39 +1124098848 19 b48e57e5e5f733f1 +1124098848 20 4dd059e9af7234bb +1124098848 21 6a2fa014a0678e99 +1124098848 22 9e398725d2c8b94f +1124098848 23 d3a7a853ce4a897c +1124098848 24 adbe0c143ba54b64 +1124098848 25 22146ef454a485d5 +1124098848 26 c6ccaa25fd6fb1ae +1124098848 27 ef79c29368e6ea5a +1124098848 28 0d9977245a8484f8 +1124098848 29 396a8d122ac654c8 +1124098848 30 4c5eb8437b7f1f06 +1124098848 31 c57adbfa5b9a38c7 +387203520 0 c582803ef7bf9cb8 +387203520 1 450c39d3806758f7 +387203520 2 2182347313f077db +387203520 3 eda5c282aebec40c +387203520 4 c93a92b98e22ceca +387203520 5 0bbf681b191ab19c +387203520 6 4db8cd962ef3a61d +387203520 7 b1969bc5dc839a24 +387203520 8 77f5fd0e99b9f8af +387203520 9 0eb04b7285951b56 +387203520 10 433f1ddd1d8f200e +387203520 11 fd63d72dbf9cb9f7 +387203520 12 6dd2d9e098fc4079 +387203520 13 337357819dbfe96d +387203520 14 ff2d311a78a3b2fc +387203520 15 db9b296fbc9f0073 +387203520 16 b9088718be9e35bd +387203520 17 adef1de185f343f6 +387203520 18 e84aa7096dbd6ca0 +387203520 19 cee7319e79e63a7d +387203520 20 4d58b461ea3ab80e +387203520 21 68bf506572232735 +387203520 22 0166fa3ec67894f0 +387203520 23 b8d65b8ed26cef78 +387203520 24 44b36938bfdcf6cc +387203520 25 a605f9a1ab3f9b9f +387203520 26 54ab5c24b22fa61f +387203520 27 45a1044da77fce23 +387203520 28 3874210c8e0993b5 +387203520 29 1e5ac49029240b6f +387203520 30 d8771d63c27a25a7 +387203520 31 136f820746aebacb +3641908288 0 32d13595e7352cb7 +3641908288 1 167b4835182ddce2 +3641908288 2 0a537b1ed3ff81d8 +3641908288 3 2a795997f7c980aa +3641908288 4 5e403eb81c7e009a +3641908288 5 b60c3feb71ea3a00 +3641908288 6 db8f2ac7f6cdc1c9 +3641908288 7 13d3a27dddfd2f38 +3641908288 8 3e429f40bbd7392d +3641908288 9 2c241be6653ebfcd +3641908288 10 9bc6a99ecd312594 +3641908288 11 cb003bf14966955a +3641908288 12 8405f772bd6742b4 +3641908288 13 28c1734b78e726f2 +3641908288 14 b7147f98b855afdc +3641908288 15 faaf153195216760 +3641908288 16 dad5573d8c0e2557 +3641908288 17 ed08ee8e45eca02e +3641908288 18 39924272c766ef98 +3641908288 19 be1e3319e3bef772 +3641908288 20 530f96a8bc0f7174 +3641908288 21 a7e66d7e271ac522 +3641908288 22 4f72fe85c0780c31 +3641908288 23 80c8220821fde83c +3641908288 24 703213e66a45bcbd +3641908288 25 3b88599f0a7a7125 +3641908288 26 ae5628adf5fb2ae7 +3641908288 27 904a2672f278ed21 +3641908288 28 a21b7c3132f5ecb1 +3641908288 29 a552061d440f4c61 +3641908288 30 14884098f2bc3b0e +3641908288 31 4f210c82f8928778 +3687510528 0 f4ccc018625f6539 +3687510528 1 45ae87e23ceed3c1 +3687510528 2 b80de61874637986 +3687510528 3 0d202e52442af39e +3687510528 4 2b63f1b665d67aa1 +3687510528 5 b1ffa5a611605c36 +3687510528 6 786afee8b3864c21 +3687510528 7 e510b97fe19c8ee0 +3687510528 8 d5c17a69827b7f4f +3687510528 9 826377ff7dcbed64 +3687510528 10 c09539e6ebf740eb +3687510528 11 01d26f4d51dbbe66 +3687510528 12 0b93875a66647c4c +3687510528 13 6819f69fb3474649 +3687510528 14 d3d7a6acf263cbbe +3687510528 15 d953d496f99f8bba +3687510528 16 e0e5f897f6045de6 +3687510528 17 8796c1be72ce18a6 +3687510528 18 e7aec035ce0b8f47 +3687510528 19 2680f44fc92480d3 +3687510528 20 a97d12fa30254981 +3687510528 21 655d67bae876f3cc +3687510528 22 ff9ebdc920aac97f +3687510528 23 b16df759d90d676f +3687510528 24 920a5a95affdafba +3687510528 25 0d35f5c693c70068 +3687510528 26 cfb29e2bc288d33e +3687510528 27 888bfece2a5a9971 +3687510528 28 504e056f8a31a1ce +3687510528 29 180d1665fd7e7253 +3687510528 30 3508debae8affe46 +3687510528 31 c769045730bd97d1 +1013821568 0 35596b6da25e3427 +1013821568 1 72cd4e5302c935b3 +1013821568 2 cdce61f5d9252984 +1013821568 3 976ebfc49f6f68e6 +1013821568 4 593a4e01f2d70bb8 +1013821568 5 461ef647521d626c +1013821568 6 a964daa9b27c5dc4 +1013821568 7 eabcee93b701bcb7 +1013821568 8 f0c4ccb7e23dee8e +1013821568 9 e1cb3df52992dfef +1013821568 10 1f5d08a207e72a80 +1013821568 11 d0446cfd1f1b21c1 +1013821568 12 9895da6724e9e281 +1013821568 13 81999ddf4f0a6cb4 +1013821568 14 fa667561c4694999 +1013821568 15 a0a11189c5b9e4f7 +1013821568 16 1d5d76f63a906b3c +1013821568 17 50519a0de7ae8d99 +1013821568 18 8428a97267ea17c1 +1013821568 19 a1d99095ad277f37 +1013821568 20 81e29e24f92686c9 +1013821568 21 f27e187440f30b73 +1013821568 22 7248201fc367e8bc +1013821568 23 fd2f1ad63c694cb5 +1013821568 24 ce99e6d328e65849 +1013821568 25 9f8ec83cbb81f930 +1013821568 26 2fd68bfbbd24759a +1013821568 27 49c244a3ad44a0be +1013821568 28 68e7b5e29594a880 +1013821568 29 4d271e4b8046c9a9 +1013821568 30 972fedb1ebee73e1 +1013821568 31 02c6e088c493c82f +2576145536 0 26d45fd01fb5f82a +2576145536 1 ad09e7b5cb50b572 +2576145536 2 fdcc02503904b852 +2576145536 3 6bd9612e9d9f4a7a +2576145536 4 5af9331653027571 +2576145536 5 1bcd284a5c15d202 +2576145536 6 a7dc8833645cc330 +2576145536 7 6cb164c6634515e6 +2576145536 8 54fee5d38c9752b2 +2576145536 9 738b38d6b3c948c7 +2576145536 10 6b5233ce3db2775c +2576145536 11 fd0cecf5065da7dd +2576145536 12 aa450c7620d5267b +2576145536 13 ac4a26cd91ee72d2 +2576145536 14 e4fa7413687d7e04 +2576145536 15 786dd09bdb107efa +2576145536 16 b638d1ccd92625d1 +2576145536 17 9f4acb071d6508c2 +2576145536 18 f0ed05b1976840a0 +2576145536 19 f464bb7b3b082439 +2576145536 20 f5e706cce56372f3 +2576145536 21 0232b20652650437 +2576145536 22 8daa40224732209c +2576145536 23 4ca849855f7aeb98 +2576145536 24 67139c055ff3ef0d +2576145536 25 09b5c748d3f8dd69 +2576145536 26 d18e65201b21b54b +2576145536 27 f2a3823f14e0b1be +2576145536 28 e08e325d3095fd38 +2576145536 29 e99d5e29a0eefb1c +2576145536 30 63c95d4b49248032 +2576145536 31 dee822208c0df0d1 +1011030784 0 80c4b0aae7fafd6f +1011030784 1 fc017edf7f5e7b2c +1011030784 2 e6be96d8637ad718 +1011030784 3 ecab728f37f2af2d +1011030784 4 4313afd411543575 +1011030784 5 24a8d6a2ee22250b +1011030784 6 91c734a8d403c004 +1011030784 7 1075e4d06c2173bc +1011030784 8 64e29e9bcb461bff +1011030784 9 cd4a510c1f38cab9 +1011030784 10 292e725158652a39 +1011030784 11 c8f3d8d3ecadd0ac +1011030784 12 452300d655ffb2f0 +1011030784 13 27d355f6c2c6fcf3 +1011030784 14 d568294d92fcac0e +1011030784 15 9071b59a4bb96001 +1011030784 16 d747009afc4d4d33 +1011030784 17 16272138e2534e6d +1011030784 18 50e9d9ba8b1ed5de +1011030784 19 eabc2e6ca96a8d02 +1011030784 20 08b90f51d0bf07b1 +1011030784 21 8fcc97632eb1f7ee +1011030784 22 9f212ed03febeacb +1011030784 23 dd47ee0ab2cdc7df +1011030784 24 26fc1ae674036cb9 +1011030784 25 0a07ac05dccde4f5 +1011030784 26 ee5ec2d0f173ca56 +1011030784 27 e1738982bda2f9d8 +1011030784 28 0a7203a6fc61c517 +1011030784 29 a6a185f12f415ef6 +1011030784 30 a36f8f424ad892ef +1011030784 31 47fe617a89350089 +37357152 0 4aad1dfe9d531d73 +37357152 1 41d88e71d90c7594 +37357152 2 65d2bf127f6cf3dc +37357152 3 809f92117942b012 +37357152 4 090a26259b20635c +37357152 5 557ae6e7aa9b7053 +37357152 6 8f3e75f4dda66a3c +37357152 7 6d1ae88a0117a0ee +37357152 8 0cb29ece325779e0 +37357152 9 6728acc0b95aa234 +37357152 10 8e1bd41254f2dc59 +37357152 11 f0a959b6aebd06a8 +37357152 12 8045eb4f5e4c54ef +37357152 13 c55e4b9e7a4b0282 +37357152 14 d5896777f12fadac +37357152 15 9d120189d1265de0 +37357152 16 f1c418c97d43a8be +37357152 17 ebbdd80538ccc2a8 +37357152 18 cb7e130b94f7e566 +37357152 19 e81cc2ab35307f2e +37357152 20 ac0d01455ad77233 +37357152 21 8745b8badcd9c9ee +37357152 22 b3495ae3f3892071 +37357152 23 8a24cad9a131f632 +37357152 24 d1a8b4f0dc509303 +37357152 25 294a9b7fa83f08d2 +37357152 26 b2b457899f82ea81 +37357152 27 a3e9cb7334bd9598 +37357152 28 d21a2bb20e2de01d +37357152 29 a7d90e4349d8c872 +37357152 30 08c63a5d6413b3ac +37357152 31 e81505872353539d +4139829536 0 f4d04c15cc9fc95e +4139829536 1 dbc0e65e63e258e8 +4139829536 2 269d44d9bb3e688e +4139829536 3 490add07dc99d462 +4139829536 4 a9d2e41730267a4d +4139829536 5 5ea83b359d6c4d5e +4139829536 6 51dd389fdfd00fab +4139829536 7 adc09aa5276dec87 +4139829536 8 f3645d40522a11eb +4139829536 9 bdf496c2da4defbb +4139829536 10 e01e359e5e031dcd +4139829536 11 da0b0c8eb19b16ea +4139829536 12 4154e06af94f28d8 +4139829536 13 fb7cdec0f9006341 +4139829536 14 36d910607a894500 +4139829536 15 943ebeaf9c65417d +4139829536 16 3444d4eb4d2fd00d +4139829536 17 6442a2ac74919192 +4139829536 18 7e9fc9c77f254461 +4139829536 19 2e6607609dc8ad77 +4139829536 20 9336350b18e424cb +4139829536 21 4a46e4ea71f046af +4139829536 22 aecda73c0922d989 +4139829536 23 9e0b34eb00d6ae41 +4139829536 24 c67296cd6ba688ed +4139829536 25 e5cfbc5efd7dd058 +4139829536 26 3760a1359c0aa4d7 +4139829536 27 df897c332662c510 +4139829536 28 bab31bc55d8bb26e +4139829536 29 75e41e8cd5639ad8 +4139829536 30 3f0004914eaef8b3 +4139829536 31 2daa3810833438bd +3985725632 0 7278fb01081a871e +3985725632 1 4f6e3e36b2d23deb +3985725632 2 a0d8c1f339b0d75c +3985725632 3 d1e51855ab957431 +3985725632 4 9ac369b12fd210dc +3985725632 5 9be769b278236e97 +3985725632 6 c1e824477c7a89b3 +3985725632 7 add13999e663bcea +3985725632 8 28fac19ed05f8c7e +3985725632 9 dbcfa703b5973672 +3985725632 10 e3b8d92011f5c72c +3985725632 11 c6b5d659bd432c97 +3985725632 12 3a0222db2a329a54 +3985725632 13 c1975b86e6ffd6f8 +3985725632 14 8f6fefccf3fc5c95 +3985725632 15 73866987b484f028 +3985725632 16 be2c89fb9290667a +3985725632 17 7fd640dfe35c1f12 +3985725632 18 b9629100318c4c39 +3985725632 19 b4a2adf0d7e9274c +3985725632 20 04c3019696b75a5f +3985725632 21 0f5a403ce0f706e9 +3985725632 22 f3bb493063d795a5 +3985725632 23 2a2cd78dfebad4d5 +3985725632 24 055bf1e81aebba2f +3985725632 25 8a2faf46307a0c85 +3985725632 26 49f50ff86648f80e +3985725632 27 5a30501666b6037b +3985725632 28 0ac61a120e396a0b +3985725632 29 2b6efc15575539f0 +3985725632 30 e999fccbaeb9e0ab +3985725632 31 58dbfe82955c4da5 +3974419104 0 aa8a47272033d10e +3974419104 1 c984e4ef44c744f2 +3974419104 2 46fed1e2468d3d8a +3974419104 3 e78b64b7a3e21c2f +3974419104 4 86344451355c86e4 +3974419104 5 16beed2b9eb8cc50 +3974419104 6 9546b53a56c527cc +3974419104 7 22827273cf603b50 +3974419104 8 ad07218266e4ed9c +3974419104 9 33d1e24b120d632a +3974419104 10 2eb8abd72e7725d5 +3974419104 11 9ea6c17976d9433d +3974419104 12 2dd454df1b55041d +3974419104 13 77920ac0d34f73ae +3974419104 14 af6b48349cf4344d +3974419104 15 43987086afd84a1c +3974419104 16 42ebc7b34f6d73ce +3974419104 17 512678179c163359 +3974419104 18 6ff6f35934648e7a +3974419104 19 61795645a601d447 +3974419104 20 769e0e9cc5aa4655 +3974419104 21 191c04941f17e48d +3974419104 22 af9f20e51ee1b42a +3974419104 23 ab2aded8ae136197 +3974419104 24 73125688b4b01c12 +3974419104 25 7c5ffdb60d03e1d0 +3974419104 26 322c725a1f69426b +3974419104 27 fe5d4efe84fa0b5f +3974419104 28 f160d2e043b599f1 +3974419104 29 b755483a6a705755 +3974419104 30 cefcc715a9b79590 +3974419104 31 108aa2c672f93296 +798615936 0 ca296fd35c49b4d7 +798615936 1 d96a3f979a54a688 +798615936 2 6d524ec1c98e2156 +798615936 3 2be02022aff25f45 +798615936 4 a5efb96535e335b4 +798615936 5 21a67254f258d0d2 +798615936 6 2db6c47631566aa2 +798615936 7 da8cc2b28356e617 +798615936 8 3ecf85e92ef51954 +798615936 9 519995963eb62f5b +798615936 10 f02736ba1b409cd5 +798615936 11 e2895039ebdd1538 +798615936 12 7d79327a0c22d0bb +798615936 13 b7912d51f55f85c1 +798615936 14 ccb4a7ec97e57143 +798615936 15 eb2118358b2a55c4 +798615936 16 9e6c7c7a6834f96f +798615936 17 7be47b1816f6f314 +798615936 18 0e0142960d2bbbf8 +798615936 19 baac4140c01bda6d +798615936 20 065b70401dda9949 +798615936 21 a261ee097392c38d +798615936 22 d7dc81e0715a2d53 +798615936 23 dae10170b8aa71a9 +798615936 24 b513b59cf24dd301 +798615936 25 1c15dbc6437467bb +798615936 26 af467bc568304933 +798615936 27 ab986b06534a2e06 +798615936 28 8d30a15866c8a185 +798615936 29 f1cd2e49d82570eb +798615936 30 9dff70cef47f751f +798615936 31 0f27e9247e71c05a diff --git a/proto-newpow/mma-shadow/out/dump_512.txt b/proto-newpow/mma-shadow/out/dump_512.txt new file mode 100644 index 000000000..3cddcbc0b --- /dev/null +++ b/proto-newpow/mma-shadow/out/dump_512.txt @@ -0,0 +1,1024 @@ +3588372608 0 8fd31427fd4df901 +3588372608 1 d20d365b1bcbc2cf +3588372608 2 3cb869a70d524525 +3588372608 3 7f492cf1b5501a46 +3588372608 4 f814ba2c65191116 +3588372608 5 bb7051a2ed16977d +3588372608 6 cd975b0dde122714 +3588372608 7 ab4dbfffec6dc20c +3588372608 8 baa91ce4d1048e85 +3588372608 9 5e5fd1e9d692c65e +3588372608 10 f2ed6f3743f54659 +3588372608 11 730f0a9d46b4cd5e +3588372608 12 e6c9070568c7dc56 +3588372608 13 a3dcebc948da67eb +3588372608 14 4ed182999ac24047 +3588372608 15 60a24d2233125d3a +3588372608 16 92af3ec947493d5d +3588372608 17 161baf523f07441d +3588372608 18 31a0b1fd9d2d17e3 +3588372608 19 0eddae4cce01d9b4 +3588372608 20 e7974f9900986e7c +3588372608 21 a56cfd5f2497f4ba +3588372608 22 3faf0bfa1a8fa733 +3588372608 23 a5af9204f8d0aa4a +3588372608 24 21c8c66b9d443e5a +3588372608 25 146a1b889c701e6a +3588372608 26 6026ab86f65b27aa +3588372608 27 bead2706cfe47e35 +3588372608 28 6e1bc6fd8bca1f2c +3588372608 29 bf3fee975b6978cb +3588372608 30 b71d4660a6774fcb +3588372608 31 2cac737da19649c4 +1023626400 0 c65ff6468fca45ce +1023626400 1 106957e474af5ab1 +1023626400 2 0550037a0c539fe8 +1023626400 3 8daee1a75876ae7f +1023626400 4 d63514e3951627bb +1023626400 5 200702f58bcd0de8 +1023626400 6 3f03d0211501f3b7 +1023626400 7 4f1b130c2344c3d8 +1023626400 8 d88a85018ed894e8 +1023626400 9 f8d152142df3c41e +1023626400 10 9015e620096dd5bf +1023626400 11 0c83ca46cc5f9a5e +1023626400 12 ab2caa0c6b3c6130 +1023626400 13 74aa9e387e6a8017 +1023626400 14 1cb64e43b4d1c924 +1023626400 15 75cecc291671bbfa +1023626400 16 ccf224d0848e164b +1023626400 17 a5daced1a4be9044 +1023626400 18 6ec9b828be8c5836 +1023626400 19 c7d1a47d56150799 +1023626400 20 57164f4bb900cebe +1023626400 21 08aca8a0bdcae847 +1023626400 22 d078dec71fc60ca7 +1023626400 23 7fed4d2d48b09ffd +1023626400 24 043fe50adb48e298 +1023626400 25 d044dbb2d2e11b75 +1023626400 26 bbee94107499a481 +1023626400 27 40b8f3829a98fab1 +1023626400 28 35f287e593c819e3 +1023626400 29 3698748f9d88b7f5 +1023626400 30 ddc4fec5259df799 +1023626400 31 c87474ed05888860 +3929384352 0 e1b6ddb00b574638 +3929384352 1 cf04288a2e257f5e +3929384352 2 595f6ec3f1a5f1ad +3929384352 3 835a133a5340b531 +3929384352 4 5949a2f11153835d +3929384352 5 3f2a8ba6fc552a4b +3929384352 6 f218b441d54a7527 +3929384352 7 7700b3e15551d5e9 +3929384352 8 8d8e0c618595a18b +3929384352 9 b116860cc6275e1d +3929384352 10 7424a606ca8ca301 +3929384352 11 6dba45c03fb1333b +3929384352 12 371331222e48c153 +3929384352 13 23fcc8a324484712 +3929384352 14 79bbf64641c55183 +3929384352 15 559844245868a43e +3929384352 16 701de977d69a3a8d +3929384352 17 04c8c17ca0ee464f +3929384352 18 2c4195baaf25da40 +3929384352 19 b50be7e046fa128d +3929384352 20 c17758d4036dd1f7 +3929384352 21 df58a2235450b3f4 +3929384352 22 30ff2f33b27609e7 +3929384352 23 f679fc7a8b48ea2a +3929384352 24 1c69aa7c6129ec4b +3929384352 25 05ded51ef87cd718 +3929384352 26 894be4153d2607c2 +3929384352 27 4d1718843e58099c +3929384352 28 3d42e05bad8294ba +3929384352 29 63ca1a5c26482721 +3929384352 30 064dbf119b23da8c +3929384352 31 d580e560611fd199 +1113183520 0 b2dbf47b31e65e92 +1113183520 1 255f57cf16ac7fe9 +1113183520 2 64e7721a92a68528 +1113183520 3 c5fe51c523cff2d3 +1113183520 4 e97c04b4f46dff50 +1113183520 5 b24157e1a724558a +1113183520 6 c6496800260f0e8c +1113183520 7 3cac26055e30fd83 +1113183520 8 6843f91ae942edd3 +1113183520 9 959c130eee0eece5 +1113183520 10 76971307c993c9ea +1113183520 11 584c566130d28500 +1113183520 12 1dfd77a53294f4a4 +1113183520 13 fe85fad832cb4ae8 +1113183520 14 d761a99c0baf5fbd +1113183520 15 592fcc3b4b61eb78 +1113183520 16 41e839f6f8c47bda +1113183520 17 7be6a037472f3c5d +1113183520 18 a32cd67e3800a97a +1113183520 19 f457db50b56b579f +1113183520 20 61ceb8449a464e98 +1113183520 21 4c04bb67d6173050 +1113183520 22 8a53e89fb8987ed1 +1113183520 23 51b2ca1c2f879603 +1113183520 24 0db4854cd728c2cc +1113183520 25 66e2b8b7c76fa23f +1113183520 26 88fbbfd76554140a +1113183520 27 a061bd626c8531be +1113183520 28 80b30b548db5cfe3 +1113183520 29 ac15aeb835fb700e +1113183520 30 cded67ca090d457f +1113183520 31 3a8988515125c695 +1774593184 0 8220217588cc5c0d +1774593184 1 73e949bc3b4f2f9e +1774593184 2 9098253e54aeddeb +1774593184 3 e6ae5290a210e5d4 +1774593184 4 c4c19dcd6a02c905 +1774593184 5 68b06da3f13f87a4 +1774593184 6 cda95820174894f4 +1774593184 7 6b5e2a41b584c676 +1774593184 8 aacff3e1116442cc +1774593184 9 3fb9c5c884febe35 +1774593184 10 5d675c705ad5ddb0 +1774593184 11 2fa674ed5ceba772 +1774593184 12 94677278941387d1 +1774593184 13 131e5d97f12f8e50 +1774593184 14 9d3406ecb5a57961 +1774593184 15 0fd9b87c2e42da7c +1774593184 16 d2e7f5277ea1d8a4 +1774593184 17 d4a78305bcd41ca7 +1774593184 18 2af8d576e6ca4cd8 +1774593184 19 c27e5b3b00bcbc9e +1774593184 20 33619f3e0ff6c570 +1774593184 21 c9f48371fad94e18 +1774593184 22 eeac0122501a072c +1774593184 23 1e9e64141619f2bc +1774593184 24 f89d99b88d8e4ac9 +1774593184 25 e6183787c1d14f5f +1774593184 26 e27a6b7195dae9fe +1774593184 27 2ffd30fa5c0ead5c +1774593184 28 726a5aa193e2a2c3 +1774593184 29 6b5ee3448cd8cf84 +1774593184 30 ebbaa9e022515526 +1774593184 31 96f5a5f9f08ac3d8 +637272864 0 98deb44502c114b5 +637272864 1 d337e9113a9d4f25 +637272864 2 71b703597ff2aec6 +637272864 3 66c352b4bf7e1443 +637272864 4 6e9813f2be511c38 +637272864 5 c513c8dc534abe74 +637272864 6 07a8607f4e44c45f +637272864 7 a1b891090f538700 +637272864 8 7c7a9d9c4303bb88 +637272864 9 c27011f0862e0816 +637272864 10 1ddfb3158648e0e1 +637272864 11 0bf0214b83b00364 +637272864 12 fc18d73f48431a41 +637272864 13 2c862ea53e1ee197 +637272864 14 767e3725c4eea982 +637272864 15 9085bbd3bc435809 +637272864 16 30b1685d6184eb7c +637272864 17 7ccdb49c7446f12b +637272864 18 f364a0b0919dd989 +637272864 19 bc0110951b09e79b +637272864 20 d16b34286978641e +637272864 21 fd5352e026a722be +637272864 22 328c60d4563695e0 +637272864 23 88412babf4abc50f +637272864 24 cb02dfef0bcdab3b +637272864 25 92edd7a5a8fc8412 +637272864 26 3e808fdfda6b2b79 +637272864 27 98182e4a2534c1c0 +637272864 28 ab5b755ced70ff12 +637272864 29 3d1b5555d64c75d8 +637272864 30 486401bf3f2509f5 +637272864 31 691760880452e750 +2482166944 0 72dcd6159d0dcbdf +2482166944 1 38a3733ec57dd22e +2482166944 2 016e9f748063af2d +2482166944 3 0f24e6aa51800797 +2482166944 4 34a64d8501ee0137 +2482166944 5 2223b523e0329a29 +2482166944 6 372f292b67bb11a7 +2482166944 7 80c301d28fe390ad +2482166944 8 8b8f36d514bf7c10 +2482166944 9 98acaa96f0c1d04e +2482166944 10 504ccd851cc2b3cc +2482166944 11 dddccbefe2f1e984 +2482166944 12 db03e4dd7ccdfc6e +2482166944 13 4857b2a7b6b6216f +2482166944 14 264e2907c9dab656 +2482166944 15 856bfbfae8dc1d9b +2482166944 16 8b0b184b05fe7440 +2482166944 17 ca7906fb3c195a77 +2482166944 18 8bde7116d0a6e420 +2482166944 19 27412af1b0acc54e +2482166944 20 74c448f8a7e66bb5 +2482166944 21 c0968139bdd48dc2 +2482166944 22 1b9bfd0c6b10c90b +2482166944 23 c8f66e386557d714 +2482166944 24 9b4850100da94ef4 +2482166944 25 d93b544755362d1f +2482166944 26 7dcf4d16ce86572f +2482166944 27 4ab856f36fc15982 +2482166944 28 20774663bfeaab2e +2482166944 29 f2746ae1916c00c7 +2482166944 30 48ecc7e931cd4eb2 +2482166944 31 61db4042c29819fc +1243715392 0 96e2bedddbbc679c +1243715392 1 fcae0a0d74ac9f34 +1243715392 2 063b728a5b543792 +1243715392 3 375c68c17d8b915e +1243715392 4 578ca8faa2d7c511 +1243715392 5 85cd7dbd7555aa30 +1243715392 6 9cae5746afcbfb6e +1243715392 7 726c3a35c85f7501 +1243715392 8 9343fa9b433a97eb +1243715392 9 4ac0bd6dbee769f3 +1243715392 10 24edb9381d28074a +1243715392 11 50067c6d3fa4ce8c +1243715392 12 1b51d96731e79d57 +1243715392 13 a7e9e1f10af3319b +1243715392 14 fc714ec92e7492be +1243715392 15 82cc4c4a54d68fed +1243715392 16 16006cb218a7db87 +1243715392 17 95c87312b104d5b5 +1243715392 18 2fa8b2a329ed3c86 +1243715392 19 8ae12ff09b08f8f5 +1243715392 20 84af62c45848e9c1 +1243715392 21 ecbfa689682fa293 +1243715392 22 69eb6ada7049bce1 +1243715392 23 8c9e3a066e8a7429 +1243715392 24 3185923152265964 +1243715392 25 dfbc196701972708 +1243715392 26 7b23300e9143137e +1243715392 27 d92cfe83779ec7a2 +1243715392 28 c3d93487efc81760 +1243715392 29 515ee762f4adeafb +1243715392 30 49997c4b254fbcf5 +1243715392 31 1cb7a318e596f242 +209806816 0 292c695d47be39bc +209806816 1 c48866e874b52e78 +209806816 2 5ed59ab724765f84 +209806816 3 e09742aabff723ab +209806816 4 db249bd79b72f9e4 +209806816 5 947776152ebb751e +209806816 6 af532716ccbb6263 +209806816 7 f386f6f0fbe492bb +209806816 8 6fee678e9c7dc2fa +209806816 9 636f98c916719829 +209806816 10 4b086db68814cc10 +209806816 11 c0ca96bc71dd57b9 +209806816 12 cb05e89a9dcb086e +209806816 13 72f40b9e352b400b +209806816 14 012b8a3d91e1f327 +209806816 15 b4d6f256e83cf900 +209806816 16 8c3dc6c11a4e0dea +209806816 17 1dfe7c3b11eba11a +209806816 18 2288a6db6d24d517 +209806816 19 f3f153baf7ab21de +209806816 20 62cc99a88e1e7281 +209806816 21 922b109b95c4428a +209806816 22 3c557107cc764541 +209806816 23 4518177e2c37d27a +209806816 24 cee0b6c58aac368e +209806816 25 6a6c70ea7105bbd5 +209806816 26 601c236d5c21db43 +209806816 27 6adcd3d20bd55bcb +209806816 28 38b14b861de6fe65 +209806816 29 b7fb9941801c85fd +209806816 30 2cebf9954a01e2ca +209806816 31 1690b72a326d676d +3395624224 0 8023492c952b1b59 +3395624224 1 552bf0c851df6bb6 +3395624224 2 d7365912a43e7391 +3395624224 3 f639bc36a24b164b +3395624224 4 e6a0b05f84e45a4d +3395624224 5 c2aa7a36ba459d1c +3395624224 6 62661e9982c8a6a3 +3395624224 7 c5c4603243433b54 +3395624224 8 5f62dd4f7de8182b +3395624224 9 55fc02f2af48f366 +3395624224 10 bd27bd4996710ec9 +3395624224 11 86bfb20b19f2081f +3395624224 12 e7cf1544c88f037a +3395624224 13 b33bcd1b307e58bc +3395624224 14 7a5c122b77de130f +3395624224 15 583197832290e445 +3395624224 16 613b892e7e5d976b +3395624224 17 28858ef3e2b448ba +3395624224 18 f10bf492c11d74a2 +3395624224 19 f361228c87daabb7 +3395624224 20 b7a023053f6e6a81 +3395624224 21 25deac4e22e9ee45 +3395624224 22 61abfc581944b90e +3395624224 23 b27fabb6cf74e827 +3395624224 24 af37747f5b77bb48 +3395624224 25 b5f3ae7fef82021f +3395624224 26 ab1861fade9ae89c +3395624224 27 c0bd813f2c5e9ad2 +3395624224 28 3bf0f305146b0c00 +3395624224 29 8ca564b66c17ad63 +3395624224 30 32ebf99aa7736ac1 +3395624224 31 de618ce23534cf49 +3886889632 0 452cc89f2bba2f7b +3886889632 1 ce7a851f060974a2 +3886889632 2 c0f69a7f80a22866 +3886889632 3 57db42cb883ff8dc +3886889632 4 2fb27c1ccf04cb7a +3886889632 5 c6de946eb97cb513 +3886889632 6 207fbad3d8fdf22d +3886889632 7 2e385f336796c86d +3886889632 8 7166359d7fd0ee81 +3886889632 9 25dea6d26e83ee53 +3886889632 10 5b47c8a6b6a99f93 +3886889632 11 92d11a0c9de32aff +3886889632 12 a3b755dfcd5e26d6 +3886889632 13 789d8e72c5e0b75b +3886889632 14 11595eb1d4df6093 +3886889632 15 7f6dffb4ab40d312 +3886889632 16 b193e780b1b54a9a +3886889632 17 12acebb41379a284 +3886889632 18 9a8cbb80b3fa6fcc +3886889632 19 bfc4d49495495210 +3886889632 20 335edaca53c50910 +3886889632 21 c4f1cc7c1f057a48 +3886889632 22 4900ca6af83364d9 +3886889632 23 30c5f47c7624e2cc +3886889632 24 c9005f5754729150 +3886889632 25 c1aec51c3e800feb +3886889632 26 6657dc792aac8cde +3886889632 27 b49eff3bdaaa60a9 +3886889632 28 c1d33dd2404c6992 +3886889632 29 cb2298b903706965 +3886889632 30 117f73535f0b54c3 +3886889632 31 18b2b7e0f62ba904 +2045577696 0 6650eef6465833f5 +2045577696 1 b2729396246856ea +2045577696 2 bfa699b5c96ce672 +2045577696 3 136fda7de016cf3e +2045577696 4 96cc7bce6e73c49b +2045577696 5 cf0957859612bc1d +2045577696 6 a30e1d33b8cc8fba +2045577696 7 5b66b8eeec4da54a +2045577696 8 95e53690092c751e +2045577696 9 e6ec55e250365c4a +2045577696 10 7bdfd44c4ad9f868 +2045577696 11 22ca9f956210e4ca +2045577696 12 9a37e622a9b00bb4 +2045577696 13 50641fdbf0d79df7 +2045577696 14 6811b5f836e602e4 +2045577696 15 3d793a7b096bf9a9 +2045577696 16 45803c8015d528a8 +2045577696 17 ec3f6c7c9c8b2613 +2045577696 18 505afa2bbfad4021 +2045577696 19 c855993502a3a7ae +2045577696 20 6a545471821aa620 +2045577696 21 bd0d6609c4398e35 +2045577696 22 79e4ec9bd8fc9756 +2045577696 23 0c0c6fe2fe74154e +2045577696 24 31255444c826c6b3 +2045577696 25 f7a936f6755c6fa7 +2045577696 26 0bf383638dc4b2c9 +2045577696 27 7690e9b591d080f5 +2045577696 28 5f0e4a143f2a5635 +2045577696 29 bb409d6777ceaca3 +2045577696 30 e2e17379dfedaaf6 +2045577696 31 7db01dd3acfc622c +2073778688 0 1d6f915ea8101cdc +2073778688 1 702ac4a4eb6b628f +2073778688 2 e43fd2f239ffa24f +2073778688 3 d3c258a24aac11b5 +2073778688 4 2652405feb2d4836 +2073778688 5 7416259e8b194709 +2073778688 6 db7b1a141ab69a1d +2073778688 7 f3efe40fac55cb92 +2073778688 8 d37b1ae59709c6ff +2073778688 9 04ec287997dad63c +2073778688 10 32b9b15de4854d6e +2073778688 11 df9ca4b2f2710c4f +2073778688 12 b6af66ff0712a58c +2073778688 13 43d70ca76d2f5d21 +2073778688 14 97b5054d3fc9e533 +2073778688 15 be7b8c7170021830 +2073778688 16 ecd8f8e44c3dfeb6 +2073778688 17 dc5c5b845675c82f +2073778688 18 08873513d7bd3cd7 +2073778688 19 33f1cfeef45e18e4 +2073778688 20 8bdd0fecd6d15689 +2073778688 21 e403116f89436617 +2073778688 22 d79ba9be8f3cdd3e +2073778688 23 4bad684ac4f7841a +2073778688 24 887ae66eaf29b329 +2073778688 25 f5de3e1640ac90ac +2073778688 26 50179cbcbb77c3e4 +2073778688 27 5695c195f88d7b25 +2073778688 28 b16196d01fde6f7c +2073778688 29 d85716379555b14e +2073778688 30 9c7e0bc239f32b1d +2073778688 31 cfaa69cbfd238e3a +10993408 0 c276d4d717c6f9e2 +10993408 1 bc307550a7d9ccd3 +10993408 2 9966dd6f23127984 +10993408 3 ec1e2f9c3cd2f831 +10993408 4 9a07d21174838dcd +10993408 5 7c7df337e280f6a5 +10993408 6 765d7899f003e683 +10993408 7 e31a935ebc3f5c6a +10993408 8 041fd0bf544d2f41 +10993408 9 5eac2aa579942727 +10993408 10 55139b6a4626bd76 +10993408 11 38effeb84dabef15 +10993408 12 fd75be642c7a5e52 +10993408 13 b084b8dcb681cd34 +10993408 14 0a849e890fe0c17e +10993408 15 ca232decf3a7d2e8 +10993408 16 b3d22221630c34f9 +10993408 17 8fcd1f18f15595a0 +10993408 18 59d09920dfc4ab6a +10993408 19 50508579f212008f +10993408 20 4afcd838a6c66ea6 +10993408 21 803c27f620da9c53 +10993408 22 db5320c96ab5476c +10993408 23 ff1e3b5300bd27df +10993408 24 52cbab5963d59550 +10993408 25 d02a72e73f169e4c +10993408 26 1c058080e1c3f89e +10993408 27 db685b5e85f7c6fd +10993408 28 128f655dc16ad3ec +10993408 29 808963a002748237 +10993408 30 aa247dcad818ac96 +10993408 31 f827f2a6e23a3aa5 +3490840416 0 c8d9cc2a99761fcd +3490840416 1 c73f83cda9949a4f +3490840416 2 ca3362c47a31c851 +3490840416 3 3d17506aeeaad23f +3490840416 4 0ce8274879612576 +3490840416 5 0122ebb8e2669e23 +3490840416 6 fb295bd2a0fdad87 +3490840416 7 783d8ca9a95847fb +3490840416 8 250a6e0c08c452a9 +3490840416 9 b62cf76097156c75 +3490840416 10 4fff2ec0f0a788e8 +3490840416 11 6c23f0ae36500beb +3490840416 12 9eed2ae85128e26c +3490840416 13 73420fb5dfb1b050 +3490840416 14 aa7af87e245df923 +3490840416 15 568cbf57722fbb2d +3490840416 16 7b3389cf398f19ba +3490840416 17 abedfb9c234c77f5 +3490840416 18 a92ae691d7ce7ee2 +3490840416 19 60a8eb1fc772bb39 +3490840416 20 047583985752731b +3490840416 21 ba0f720ed654ad36 +3490840416 22 d126be775d97edaa +3490840416 23 898583603926f357 +3490840416 24 4ec8c5ada95b7305 +3490840416 25 c00198aecc06b7c6 +3490840416 26 8fa730159210118c +3490840416 27 cb58121c8762b71d +3490840416 28 cda32ab1fc061a1f +3490840416 29 75792aad95495c49 +3490840416 30 5b53a2b9b121b5a4 +3490840416 31 841f40190dd1f2e5 +2848373920 0 9a13f38a7b6769a0 +2848373920 1 b49db172c61b93a4 +2848373920 2 9c085722a62bb410 +2848373920 3 fedefb2706606378 +2848373920 4 cd77fa4d9dc57639 +2848373920 5 66cae570537d6639 +2848373920 6 2ebcc9bcf06899c5 +2848373920 7 0411c761cd4aad36 +2848373920 8 16abafe83a43e3ab +2848373920 9 865488693d11339f +2848373920 10 8aba8d37391a2dbf +2848373920 11 86aeb03395ab2659 +2848373920 12 eb8f809f6044cd48 +2848373920 13 90eee29f072c80c1 +2848373920 14 72ecdbaf9141bdf8 +2848373920 15 157f588bd2fed87e +2848373920 16 54d0d818dbff5e18 +2848373920 17 3a7d23aed121e44a +2848373920 18 39b03dda1f833b2d +2848373920 19 329f08ef938da411 +2848373920 20 7932e0fd52554a65 +2848373920 21 6b11b20a6052f77a +2848373920 22 7a0c21526f596fbc +2848373920 23 9733b036f31c85ba +2848373920 24 1c6a327b99efd6f9 +2848373920 25 a90326f4849e3f91 +2848373920 26 0b33ccd92d1e8242 +2848373920 27 78bde4150764af5b +2848373920 28 b29686769e683fe0 +2848373920 29 1197b5d0d0ee9c9b +2848373920 30 46ddcb59a347c781 +2848373920 31 84faa8c090e92d7c +2880556800 0 d3fe9e4a5052e01a +2880556800 1 bbbd8538b9612b21 +2880556800 2 2e6783b7c31ef380 +2880556800 3 b061e0df3d94e9a2 +2880556800 4 e31d9ebde64ab24e +2880556800 5 b2da8b465367dee4 +2880556800 6 f0c8d8def56e09ba +2880556800 7 201db9b9b23d3666 +2880556800 8 1bd449327dce8da2 +2880556800 9 09061e579138c9c0 +2880556800 10 f28c5f0031ae876c +2880556800 11 3f1b1303423918e8 +2880556800 12 ba6f8f6ab68f5801 +2880556800 13 58a165425a830738 +2880556800 14 b1f6bb0c76ba10f7 +2880556800 15 74a2bc3ce5616c62 +2880556800 16 5c94da23944a6daa +2880556800 17 c89d72e0d916db36 +2880556800 18 ec72b4ce60ae16c3 +2880556800 19 2cab6e3599eaf7f1 +2880556800 20 ca23b4f7a262e6f2 +2880556800 21 09bc226c00ea0c1a +2880556800 22 531648e8ea92e368 +2880556800 23 591047042dd159c6 +2880556800 24 7ca450e7725a5c0d +2880556800 25 5551b82760a295c7 +2880556800 26 a8039291f6db0de0 +2880556800 27 35b28dcd394dee92 +2880556800 28 32dbebdc67be8c72 +2880556800 29 6fd28e4cfe414264 +2880556800 30 5e72c84db3ced727 +2880556800 31 f77dca6404226273 +3625086080 0 1089c57c853559da +3625086080 1 8a6b0fcfbb0ef1f8 +3625086080 2 a6d61086bc3d060c +3625086080 3 eb8c1991a9b701c5 +3625086080 4 963c864187051a41 +3625086080 5 6f1913cffb9273d0 +3625086080 6 a2cff6100ad1a9e4 +3625086080 7 9194acb2216bcaf2 +3625086080 8 1ae22e298d5f055f +3625086080 9 a86ad0efc2233b81 +3625086080 10 d72f5ee4aa025495 +3625086080 11 8a0b0ffa205a49f7 +3625086080 12 385afc924b8739a3 +3625086080 13 57330685b164cb98 +3625086080 14 d87576b88e641ed4 +3625086080 15 f9879214f77e6927 +3625086080 16 59d73c4a5f9efdfa +3625086080 17 6ae324dca007f268 +3625086080 18 38413da7a8f19ba6 +3625086080 19 bcf8fd5e50e08025 +3625086080 20 24c69b03034345b1 +3625086080 21 26355cb4819030b4 +3625086080 22 6b4e3ec33d4abe88 +3625086080 23 c033d1ff71ac0dec +3625086080 24 2cab6cb9fcbeeba8 +3625086080 25 3a3b0b072f2855fe +3625086080 26 35f3eb4dc63c7dac +3625086080 27 2e8dacb49d14bf45 +3625086080 28 65c87fe17cea0693 +3625086080 29 30f7da78d8f83e46 +3625086080 30 a5cba56ed4d98f56 +3625086080 31 9645a04a5b16dbb6 +2537065920 0 d849023c398e38b8 +2537065920 1 156518834c89f598 +2537065920 2 326f60937c186c62 +2537065920 3 71f46316ac018095 +2537065920 4 06c8d5fde7099491 +2537065920 5 68e134d1d8b63dc4 +2537065920 6 ae3cffe051a836fa +2537065920 7 85bd95b8022bbd0f +2537065920 8 3107d8407989bf5b +2537065920 9 25cae7b7f66fa497 +2537065920 10 d548a59f071673b8 +2537065920 11 ca62d56abf6838b8 +2537065920 12 c121aecbb0121c96 +2537065920 13 8b47742cc5fda3fb +2537065920 14 4f27390b80624ffe +2537065920 15 192b6752b6058741 +2537065920 16 de2e2384a15c50c2 +2537065920 17 202f7c790ac036f5 +2537065920 18 4eb2a0e7053e7957 +2537065920 19 0bfdf98409119990 +2537065920 20 8ae191e0e891e74b +2537065920 21 ba746dbd5ed997e8 +2537065920 22 cd9457cf717bd6ea +2537065920 23 4e614a0bb74ef9bc +2537065920 24 e9ef7bbc482bd2cc +2537065920 25 943efac5b7e0a168 +2537065920 26 b720f17ed6625c5a +2537065920 27 ab3d62a229376d89 +2537065920 28 9bd916a35018d8ac +2537065920 29 867e0f9690be6fac +2537065920 30 a1e9fa428a7e5f3b +2537065920 31 b91329635bd57430 +1646897088 0 386575ff2dab1d3f +1646897088 1 e85ef0bd0ecef6fd +1646897088 2 f72341da27fd437a +1646897088 3 74d4c4c34d77dc60 +1646897088 4 810f4da537c88cb1 +1646897088 5 cd19cdd49ed8b7fa +1646897088 6 b7592026e555bf67 +1646897088 7 ce2b76c2bbe50deb +1646897088 8 1d0787c67349c17e +1646897088 9 33166c4be4823703 +1646897088 10 28ee5cd958934587 +1646897088 11 9056db43cd89b86f +1646897088 12 3e258f2b8ef75954 +1646897088 13 0b4f2911d084b225 +1646897088 14 7cbcee545216f659 +1646897088 15 c3566d4f11209ba0 +1646897088 16 3410184dc7857c56 +1646897088 17 df436630ac3cfed7 +1646897088 18 a7d4cd65f025d244 +1646897088 19 a09033a5e405d084 +1646897088 20 9e8bb8b07a60e048 +1646897088 21 25e2131e31bdc0f3 +1646897088 22 4f2387735a02d158 +1646897088 23 dd729ed6f8286829 +1646897088 24 29d709eb694d6b68 +1646897088 25 18ace95185b916f0 +1646897088 26 827a7c02b352e6a4 +1646897088 27 2709f73974fdb787 +1646897088 28 294115842a96e712 +1646897088 29 cb237abd72260eed +1646897088 30 9047721754f38c28 +1646897088 31 b04108ef89f36ef3 +1124098848 0 61ec95ffc23efd95 +1124098848 1 7707e0a5f813cb5f +1124098848 2 894b31ae37218206 +1124098848 3 376c7326afd8fe96 +1124098848 4 4c38f83dc7913cf2 +1124098848 5 29d8fdd90666ecda +1124098848 6 8f69f7019605d821 +1124098848 7 a18d29cd271902ae +1124098848 8 0dd70937bd63a7d0 +1124098848 9 f36075499da8cdf6 +1124098848 10 66423fb78f6f5e87 +1124098848 11 92699790e1ca3608 +1124098848 12 4536a742b9dc10d0 +1124098848 13 6f4f6d04c2c06719 +1124098848 14 27c758d603615c73 +1124098848 15 42e176ae205e6f25 +1124098848 16 2f5404de51f3f18e +1124098848 17 2b84627ae9c3a7e3 +1124098848 18 fa669471bbd94226 +1124098848 19 43270f8ee6649ad4 +1124098848 20 c0e7ddb1b28b6a9a +1124098848 21 28f48c53a7783020 +1124098848 22 6221bdb8a95a348d +1124098848 23 f423153ae087cb4d +1124098848 24 4c6a4545541e8848 +1124098848 25 6a1aec51afef8454 +1124098848 26 9f6cd31d536a0a22 +1124098848 27 80e24b5cd8c2eea3 +1124098848 28 dd8a56dd21ce84fd +1124098848 29 64c9a6c0964a7205 +1124098848 30 150c288d6ce48ff5 +1124098848 31 9cfc52fb85883923 +387203520 0 0adcad2a31a9d004 +387203520 1 202e88e6fcb0c99b +387203520 2 0cbb31baefe8f798 +387203520 3 450db43fd92a2906 +387203520 4 26912fb97c4a8a0d +387203520 5 82108eaf1da72616 +387203520 6 2cfc88ac1373510c +387203520 7 3252d4a3e23d5aa8 +387203520 8 5cdec313de106a85 +387203520 9 d6cd70429741e523 +387203520 10 566d841c6aa22941 +387203520 11 6af8096c5d092dd4 +387203520 12 2eea6b6d25c40635 +387203520 13 699265423a73315f +387203520 14 6075fbf6f812d412 +387203520 15 c56dd137ab4db144 +387203520 16 4162be7d288ffb03 +387203520 17 a3d9ed452c86eddc +387203520 18 f0661f39bfd0800a +387203520 19 d2acd609efd4245c +387203520 20 2b14657e0e35ade1 +387203520 21 db55af5d9659ce97 +387203520 22 f62456b956403e45 +387203520 23 b6c183145e044c3d +387203520 24 f9a819d8b986eab4 +387203520 25 3d1aa422fc439a50 +387203520 26 8a04520a4f8a0bbf +387203520 27 0b2bde3304d5d8cf +387203520 28 aee96bdffd0c2ba3 +387203520 29 980de8b380960fa8 +387203520 30 81a46ba551acfd8e +387203520 31 c7410f92a9f3062d +3641908288 0 65397a147f1952af +3641908288 1 de5e70ebf0596283 +3641908288 2 6d1edb473e134e86 +3641908288 3 b2932f104402e735 +3641908288 4 5dbede7e85db018e +3641908288 5 16c8eca405f7ba97 +3641908288 6 0d201ac25401016d +3641908288 7 8d49fdb1da6e4d59 +3641908288 8 3e6a56929fefb642 +3641908288 9 76d70a09f92fce98 +3641908288 10 0ab826500a37e4be +3641908288 11 669fde89aee284b2 +3641908288 12 fdda5a901e4f50b7 +3641908288 13 73e395ff849c1c45 +3641908288 14 66047b112d1b6f08 +3641908288 15 7a8c3489a667f13f +3641908288 16 827a925a730f3d24 +3641908288 17 31572863a4a96c06 +3641908288 18 49b8839be52a7187 +3641908288 19 d5ad7075bf931cb4 +3641908288 20 1b6473eb6b6d281f +3641908288 21 cfa1bc9cd400e28f +3641908288 22 14f5d523acad7bcf +3641908288 23 7fb817cbb0e87c98 +3641908288 24 2dbf831e76c99d96 +3641908288 25 17d6bce0b96ec098 +3641908288 26 1a16354f3ebe564b +3641908288 27 bae4c5f2b558cf3c +3641908288 28 03432ca296f3f6ca +3641908288 29 20088230805668e9 +3641908288 30 3cb4b4553b2ab21a +3641908288 31 48e39e96c22c5163 +3687510528 0 bc88368446d3a98a +3687510528 1 c8841facc08f9df2 +3687510528 2 88f9dda3a64de863 +3687510528 3 c3e49676633b07c2 +3687510528 4 90c2b6a93f8de466 +3687510528 5 450a158185318b36 +3687510528 6 8f1bb52b95de42ae +3687510528 7 fd96fec9073b4fbb +3687510528 8 061ff4b67d15ba9b +3687510528 9 d53b44e1f00f3da0 +3687510528 10 bb0e30b8a3b32c98 +3687510528 11 cf108b260c8ab3ca +3687510528 12 f66a2dce1e4f42a2 +3687510528 13 0f2177066f3def1e +3687510528 14 9d2be189f7269698 +3687510528 15 4a1df5a83e28a931 +3687510528 16 202ea2cec18a796e +3687510528 17 95f4ea2eca63f6ad +3687510528 18 93a480de224a074d +3687510528 19 3914f4d05857c43e +3687510528 20 1573683176c92e86 +3687510528 21 e9272e579cd3c695 +3687510528 22 a35c48d76316d55c +3687510528 23 4ccbb42826d8bb6d +3687510528 24 8b57358b91bd8a32 +3687510528 25 964f485a6f2becea +3687510528 26 409609f07543dbe4 +3687510528 27 bcbf73e6b7bafa89 +3687510528 28 5a60a31a42c2231b +3687510528 29 60ebc3ee1e29dd7b +3687510528 30 4db97f4cb6d9fcfc +3687510528 31 71a8544e7270f6b2 +1013821568 0 3bfd63801455ddf8 +1013821568 1 a628d3bba3466e3a +1013821568 2 58b60c81372b9e54 +1013821568 3 93485106ace771a1 +1013821568 4 2218819e1a0270e1 +1013821568 5 a00a1f1043946083 +1013821568 6 c67f1fc3979b1836 +1013821568 7 b90682364a8f2933 +1013821568 8 e67e92f4a2d48066 +1013821568 9 c8a2027260da26a3 +1013821568 10 856b05f062fe6576 +1013821568 11 39e18e1556f05481 +1013821568 12 b7f4a63e058e6c32 +1013821568 13 df1ea82a605668aa +1013821568 14 0da91c4091a58081 +1013821568 15 c0f32b96a13d1fa0 +1013821568 16 5839a84fca6d914f +1013821568 17 6a39ea79bd736705 +1013821568 18 9e25d602c7b5727c +1013821568 19 dc98e05e6bc4cf0a +1013821568 20 135e53edddb96f77 +1013821568 21 f464bd197e94ac3e +1013821568 22 b56a5612fc1fc721 +1013821568 23 25a4a56698ddded2 +1013821568 24 255affb48ac0ba0c +1013821568 25 227edc4e82d79a62 +1013821568 26 f58084ea1d6587e1 +1013821568 27 cdd53c58cf36b7ea +1013821568 28 ec2ddcb3062c8b5e +1013821568 29 d873dd9ac54e3b1f +1013821568 30 7cb074208debb234 +1013821568 31 121c01bb226eacdd +2576145536 0 4187376948fb8793 +2576145536 1 7c5e59d996052639 +2576145536 2 a2309c4b510c5669 +2576145536 3 762a0b12746f9f45 +2576145536 4 22d3e7080896a81c +2576145536 5 4245ec20fd64515f +2576145536 6 258a6b2b284fb4db +2576145536 7 4cac2d79c0576555 +2576145536 8 db9bfca97199ee67 +2576145536 9 81acece5cfb5a405 +2576145536 10 f26b3c4d5a5f1377 +2576145536 11 3c2651ac36e0ac5d +2576145536 12 78817c693ac34bb8 +2576145536 13 8753871cc95a9d4a +2576145536 14 74039ec25148a7c3 +2576145536 15 d256298364d5ef68 +2576145536 16 f3051a49ca1be6e3 +2576145536 17 96abf30a735747a6 +2576145536 18 55caa23c5f08b427 +2576145536 19 239d8a6f5bf86643 +2576145536 20 4afb83a99787326e +2576145536 21 d7d60d6e32a1b4a7 +2576145536 22 e3e841ee1b196cfe +2576145536 23 d1229fc712856904 +2576145536 24 85867a18920f4e20 +2576145536 25 fd2b3690a2605e56 +2576145536 26 15eeb94dd3c7c4f5 +2576145536 27 e655c0d6b0c09c88 +2576145536 28 c0ffec71a687170d +2576145536 29 ab3ec5ee355099ac +2576145536 30 d04c6bcaef17ea08 +2576145536 31 9cfb3c079a03521e +1011030784 0 80cea4dc88c0fde6 +1011030784 1 1491b8f026b0de31 +1011030784 2 2efb8294f8bfb38b +1011030784 3 3ac01ee59c161051 +1011030784 4 5a3891c31f159803 +1011030784 5 181cd3435f509df2 +1011030784 6 bb9b7d6821cde9a7 +1011030784 7 5e06512ca6497690 +1011030784 8 07acb24772d04b68 +1011030784 9 8cec232a0b92fd3c +1011030784 10 fd6a1298b4f2a80e +1011030784 11 b64070b33d533abe +1011030784 12 d2a22b4e9f38218a +1011030784 13 809404832aea750c +1011030784 14 c3bf0b9b5408adf7 +1011030784 15 a671ab222188eb72 +1011030784 16 6531dcdd68ff9214 +1011030784 17 de21e7d1d7fa00fd +1011030784 18 40157b3bb4327991 +1011030784 19 e40175a87d014e12 +1011030784 20 2faa27cf9128e3f6 +1011030784 21 c4209b379745ba4e +1011030784 22 6dc317b549c23795 +1011030784 23 56d190910b94044e +1011030784 24 721bb4a4026bfcb2 +1011030784 25 6307812fa0b30a27 +1011030784 26 795ac44c586bafa0 +1011030784 27 c2e547e139192f1a +1011030784 28 7fae8c4965263303 +1011030784 29 bbead4639bda3d48 +1011030784 30 2293f42d6be01d66 +1011030784 31 759d3684f5555f38 +37357152 0 219b34193d7285e4 +37357152 1 54ab6779a8af3aa5 +37357152 2 6b5a1f20ad5d846f +37357152 3 500fe47cdada8ecb +37357152 4 5b83061343efbd36 +37357152 5 75355c57d3bf1a78 +37357152 6 29aef58b3bb185a7 +37357152 7 1b6da9b80ab56c9a +37357152 8 7f5fd73ba60202f1 +37357152 9 40f9610624e9e16b +37357152 10 6626bae13afe1e22 +37357152 11 629c1043c162fe9d +37357152 12 8a6d7db4620f487c +37357152 13 8adb34b7aaaba523 +37357152 14 dc7513033d049b81 +37357152 15 e4b8e9ede5d18730 +37357152 16 72936ad6c85eb5c0 +37357152 17 09ec59ed0bcad78f +37357152 18 861d5d626845dfed +37357152 19 92f2094d54e974c3 +37357152 20 5a7678898b4f4630 +37357152 21 a1be40da0d99a95f +37357152 22 6ecd289121d67f9c +37357152 23 7463d5550f8a925a +37357152 24 b5b0d18e5bb7a9c3 +37357152 25 db29a8255e77df5c +37357152 26 71e45a755ecf3a5a +37357152 27 40525832e54653d3 +37357152 28 f4758319e826867d +37357152 29 d8b9825cd606a6bb +37357152 30 a0d32c818ac5795a +37357152 31 dbe379faec8537dd +4139829536 0 5e360faadaf5cba3 +4139829536 1 ce7621ea98dee659 +4139829536 2 7385b875642b3af8 +4139829536 3 a7f8d31a0a646f73 +4139829536 4 43218d78f012881c +4139829536 5 667f5011901178e9 +4139829536 6 f1640c2ba5ca5a45 +4139829536 7 6f67667cdf54355f +4139829536 8 21d3b20a733843e6 +4139829536 9 483784002ba6e496 +4139829536 10 67ea4fc7ee17437c +4139829536 11 d41d4aabb8bfe886 +4139829536 12 40ee0134317d4093 +4139829536 13 739db733a5596cbc +4139829536 14 b26d2acaa5cc1e4b +4139829536 15 c3b380ed241a98c8 +4139829536 16 f95a1a72730c65ac +4139829536 17 4014ff034472a82a +4139829536 18 c6f2977064f5d60e +4139829536 19 38147890548d9c84 +4139829536 20 97f97295ce3a9662 +4139829536 21 722c0d013a5e855d +4139829536 22 92384904c61a342d +4139829536 23 3cb9f034bd028f8c +4139829536 24 7630afc35c7bfe51 +4139829536 25 67ef34cba52a1f93 +4139829536 26 783452a43c5a7b11 +4139829536 27 3316308f1bed19ee +4139829536 28 314200cefdb6f166 +4139829536 29 89e9a4eef604a63e +4139829536 30 d5eb4b60913f989c +4139829536 31 8bd6c6177c0e9213 +3985725632 0 c60775b0bc34dec4 +3985725632 1 60e1e9affdc216cc +3985725632 2 fb0f5ecfc4dc8aa3 +3985725632 3 2a88ded62d8a45e5 +3985725632 4 e14d6bd39515ed7d +3985725632 5 c85a0781b428dd61 +3985725632 6 4ab5170e48cd8577 +3985725632 7 74b082999585fee6 +3985725632 8 7d14b6e2e3ad191f +3985725632 9 486141256776ab88 +3985725632 10 b9f5077991315f50 +3985725632 11 45be552d7b7e995f +3985725632 12 57f40b75dba5d38e +3985725632 13 5f7ee3e6227bca7a +3985725632 14 a68a85caa1597de9 +3985725632 15 f0d192a209700476 +3985725632 16 0f336040bc8c92aa +3985725632 17 78ebd58ebd60478b +3985725632 18 4bbe15f4f1947c16 +3985725632 19 8fe0fc4a9559c3b9 +3985725632 20 7a834fec5f6a03be +3985725632 21 09a91b6a10bc4300 +3985725632 22 06bd90ae3c562781 +3985725632 23 78dbee3796e4c195 +3985725632 24 8b381d7e066c004a +3985725632 25 42e402e1b4b916b1 +3985725632 26 53f62cda263f4148 +3985725632 27 6670894ff116db6d +3985725632 28 a8bcebe24e75b5be +3985725632 29 941df12f43258de6 +3985725632 30 4b9ad1ff290f9d4b +3985725632 31 c4df88ce4f4e0242 +3974419104 0 19706f3dfde28f5c +3974419104 1 c0bcc38917fdb9d4 +3974419104 2 6fd056a9081dcaae +3974419104 3 e3fa2a68f692fbc9 +3974419104 4 93d57d3869da43cb +3974419104 5 4803dc903759223a +3974419104 6 82c93961333cc419 +3974419104 7 b32a8bc76c513cce +3974419104 8 3736a2b533bbc7cf +3974419104 9 08e07822f97d5cf2 +3974419104 10 1fe89d92993e7abf +3974419104 11 9597b7c54a7c182a +3974419104 12 9d28a6ed028cf1bb +3974419104 13 26f2b9d4d9b161d3 +3974419104 14 b8de593564564c7f +3974419104 15 da647b55c0415d0d +3974419104 16 c594a28900c8fa03 +3974419104 17 feeb068bbac5e316 +3974419104 18 afa1e8316882677a +3974419104 19 f00be89116fc9673 +3974419104 20 577e6599cdd16919 +3974419104 21 4d48e17dd231529b +3974419104 22 772de1280a0616b9 +3974419104 23 85d7dfb5b2a82b45 +3974419104 24 8463c39c5bc0a7c8 +3974419104 25 13a1e0678f86908b +3974419104 26 dc991b3fad531d80 +3974419104 27 794811dc087052a0 +3974419104 28 585e0f6c4877df19 +3974419104 29 039a0e447e42b4a5 +3974419104 30 d44aff00686be88e +3974419104 31 4b528a97499e18bd +798615936 0 a776291cc4b76463 +798615936 1 e6639556e1959896 +798615936 2 f4cdd53508f54d0b +798615936 3 76e58fbfd0812f64 +798615936 4 67c15b8e0789c6e6 +798615936 5 3bc97173f6cc5c35 +798615936 6 432038b70d72db67 +798615936 7 9539f925590123b1 +798615936 8 fee3800c11b88574 +798615936 9 0ecd0584b7020c5e +798615936 10 f3fd7a8eca8f0461 +798615936 11 f93ba836f327ce84 +798615936 12 82b01f711517b02e +798615936 13 58d02fcd621b8e4a +798615936 14 2fc55ddc53872c10 +798615936 15 c843afe4a7a36b36 +798615936 16 02436de0d4b8b598 +798615936 17 164eb8035a17669c +798615936 18 0514ff034fb63368 +798615936 19 54f56ec4c057aa86 +798615936 20 650a5956d49e27f9 +798615936 21 60a6209ec98de562 +798615936 22 cab7f241cc80371e +798615936 23 a757ef1a8d071527 +798615936 24 8a2e1996b30d6c93 +798615936 25 2c1854b36d10f251 +798615936 26 7c3207d7d2166ade +798615936 27 321c902dd7842913 +798615936 28 b32683ac39e410f0 +798615936 29 2932d1c388230526 +798615936 30 1279176cc011c0f2 +798615936 31 3dc4aa6301380f79 diff --git a/proto-newpow/mma-shadow/out/dump_8.txt b/proto-newpow/mma-shadow/out/dump_8.txt new file mode 100644 index 000000000..554427afb --- /dev/null +++ b/proto-newpow/mma-shadow/out/dump_8.txt @@ -0,0 +1,1024 @@ +3588372608 0 004b4d3efeea5665 +3588372608 1 4dce0ae53f71b12b +3588372608 2 3e536e26b76b807e +3588372608 3 d5ce4ba2324e3a6a +3588372608 4 8e7ceed094e6d728 +3588372608 5 d7c75f1aa678f292 +3588372608 6 14c7a40d9ce4e7c0 +3588372608 7 06a819c4ab39fe8e +3588372608 8 2dfeb50477438919 +3588372608 9 3208b31d4a47ef5e +3588372608 10 4388c254f9588337 +3588372608 11 9436a99ab5f2af1b +3588372608 12 3c3d271cae7adb86 +3588372608 13 fabccaf619ffcd97 +3588372608 14 5f66184eedf432de +3588372608 15 d0cc4052ca829765 +3588372608 16 fbbfa7dc9f17d632 +3588372608 17 3ddf7651ad920287 +3588372608 18 bff58da3d5691956 +3588372608 19 2b845bf3298fc783 +3588372608 20 9fab701d21b49743 +3588372608 21 7d94d5d3cd9cc588 +3588372608 22 c1aceee8460ae616 +3588372608 23 7e6c6a20493f9e1c +3588372608 24 035f036c7d4e711f +3588372608 25 9f2943ddc4e49258 +3588372608 26 99606de56b670c38 +3588372608 27 336d28523c4da8d4 +3588372608 28 511a121d3308ff37 +3588372608 29 d2484b07ab211407 +3588372608 30 73fa24f068f46480 +3588372608 31 5b12cb0d2ccd694c +1023626400 0 4d8a7bb99ac4f661 +1023626400 1 0163ba908d64ecfe +1023626400 2 b6213d5cfcf75f1c +1023626400 3 c6bde005f3cb8735 +1023626400 4 8f88f678ef4eb2e0 +1023626400 5 6d45bf0c253ff8f4 +1023626400 6 2b9c02cea46a1f19 +1023626400 7 cd82c5df14a15a63 +1023626400 8 1487c8e849025226 +1023626400 9 0a051520829cf416 +1023626400 10 37b03061c9a9f504 +1023626400 11 47dd55b302b45de0 +1023626400 12 39b4eab8a5a5f1f1 +1023626400 13 3f352492c0477df6 +1023626400 14 d12ff21a00385e57 +1023626400 15 a10a6b1572aef85f +1023626400 16 4d8468713ee81d1b +1023626400 17 f9c3caa3221ef959 +1023626400 18 be201dcef817fcaa +1023626400 19 3e028b522da1a85c +1023626400 20 a086c19f04e90286 +1023626400 21 9d00de374e4d695e +1023626400 22 c4a9d3ce4ebb2c3b +1023626400 23 dee18705a0e6df8a +1023626400 24 29dbbaddfd96ba24 +1023626400 25 e050e73013f5dd7e +1023626400 26 a379d841b40b9c76 +1023626400 27 b313d54f4595e142 +1023626400 28 1ab5976588f0d011 +1023626400 29 04c8d38ab280606b +1023626400 30 c165808b9b051af3 +1023626400 31 9499d818425125b9 +3929384352 0 7e4fcda4a31a71a0 +3929384352 1 68a82a1da8961e30 +3929384352 2 26a592d0b3d9e1b7 +3929384352 3 01f79f643780b719 +3929384352 4 9b30744992388d09 +3929384352 5 6b76da2981778306 +3929384352 6 e6d779bdea82ea32 +3929384352 7 e36b192ac77d7999 +3929384352 8 e57c6fc7a6e34306 +3929384352 9 510b768f8d453472 +3929384352 10 85f67abb0edb27e6 +3929384352 11 8fd5328762ec50d5 +3929384352 12 4d0304ca1ec6e219 +3929384352 13 b7a209c5a4d117f3 +3929384352 14 8d28be6f7648028c +3929384352 15 4515c4da5ef55605 +3929384352 16 e1c211cffc0f7398 +3929384352 17 01045f9aa72e593b +3929384352 18 f84e0839e7fddb6c +3929384352 19 b25e6de0be96d5ae +3929384352 20 d10b263be46c6d32 +3929384352 21 c2ea9b3d230eefe8 +3929384352 22 84d6b9cb4cd1ce23 +3929384352 23 31ec5f0cafa66615 +3929384352 24 82bba69425df3214 +3929384352 25 c551113f0f87b48b +3929384352 26 9c3ef125ad998760 +3929384352 27 7397aaefaef4adf7 +3929384352 28 55c6b102c29a0cb8 +3929384352 29 005c9440996cabca +3929384352 30 47057928796957e2 +3929384352 31 7a3405fe58c4d6b9 +1113183520 0 f86f0a5728fc479a +1113183520 1 0ba6d199ae18db73 +1113183520 2 3e9e95e4cd40caa4 +1113183520 3 d0c212ac68fcb1bf +1113183520 4 4efe6dd230ff48bb +1113183520 5 e56951f4154e6652 +1113183520 6 36603f6b62ff60a2 +1113183520 7 122cdaa5c9eb0f56 +1113183520 8 91e09bb97e35ee80 +1113183520 9 81d69d05d98eddc2 +1113183520 10 a459187c62155ee9 +1113183520 11 27a8b21d4bc9767a +1113183520 12 c7bff2cc5a1ba127 +1113183520 13 05aa0d77cf62df2a +1113183520 14 b57216b6b1df3c96 +1113183520 15 9727e11f78e8aa64 +1113183520 16 e192fa140bd89592 +1113183520 17 565098061d387fec +1113183520 18 8c19403dcf09f93c +1113183520 19 6d532058cde5e390 +1113183520 20 f064e55b51266174 +1113183520 21 37629bff815b6b11 +1113183520 22 f861dff60747634f +1113183520 23 b818dc8ebdac9bd4 +1113183520 24 c15e461dd5c81afb +1113183520 25 dd5ced3b0a50f088 +1113183520 26 76cb84ac6e77f6c8 +1113183520 27 31622809f9321458 +1113183520 28 1b1d6a5cfae84566 +1113183520 29 a733cfcc768d889a +1113183520 30 ace5a5acc01ccd18 +1113183520 31 25f9ab48aac9d76c +1774593184 0 1a7743c5266023dc +1774593184 1 18de738c10eab4ff +1774593184 2 ba4b407a6d028303 +1774593184 3 53e65555cca34f9b +1774593184 4 73b21daa8ed170d4 +1774593184 5 18722ba42228b463 +1774593184 6 18d5c52f188fc9ff +1774593184 7 396e7f164ac6c8bf +1774593184 8 7cfc9e249e4cf1db +1774593184 9 0885cb20ba5b7b4d +1774593184 10 b77b66bbcbfb27e3 +1774593184 11 f6360549f716cd38 +1774593184 12 2d59b20c3e9cb00f +1774593184 13 2e7fd9fb0aebdc81 +1774593184 14 ac4c82f4449d3579 +1774593184 15 aee5e1313dfef40b +1774593184 16 461c4a60b0d1ea28 +1774593184 17 29c26e142cd2cdad +1774593184 18 9a348273493fbf3f +1774593184 19 7cf9848a8fd2fe46 +1774593184 20 a6a8bf175a2c3dea +1774593184 21 916ce1bb520a0fc7 +1774593184 22 04e960558cb69831 +1774593184 23 033376a0b285c0e5 +1774593184 24 749efc44c397d52c +1774593184 25 04827ae3c8569440 +1774593184 26 208d81ee6ce8c6b4 +1774593184 27 4b4cd914454e0c6f +1774593184 28 667611527aca86e2 +1774593184 29 5e8c82afeb49dbc1 +1774593184 30 2a8c0020b5b21529 +1774593184 31 6521dea5b4b76f11 +637272864 0 8183262b7f28d801 +637272864 1 2a00cad40c1285b9 +637272864 2 13f4fb9d3e0e602c +637272864 3 44cef788794543e0 +637272864 4 3fdb40c8bb782c84 +637272864 5 1b52e6d516e62220 +637272864 6 20c2ca40bc69efa7 +637272864 7 b5506f22e2393ba4 +637272864 8 2dfb902457788ede +637272864 9 b6047281855b9aa4 +637272864 10 c2960c8337a72972 +637272864 11 2e049cb603e86409 +637272864 12 a9fc1e8d262098e4 +637272864 13 75303b5c1e3d2536 +637272864 14 11cc896c51091f62 +637272864 15 dcc018bab1613a01 +637272864 16 ffb149abd733b11a +637272864 17 504a28cdc17d9692 +637272864 18 ee4d4930cb643780 +637272864 19 1c1b68e38905b194 +637272864 20 3f50a85641a77754 +637272864 21 f2ac1f118791cfa5 +637272864 22 59304090566d43ff +637272864 23 6e7ac859b440084d +637272864 24 5147ffcf65fb924e +637272864 25 3d0d8930bb3e8a76 +637272864 26 56225b7421da5d11 +637272864 27 aa3e808e4f0237b9 +637272864 28 b2fe05c8d9116880 +637272864 29 75d90aaacfec79e2 +637272864 30 9f3754e1883fd3f9 +637272864 31 d1f1bd378fc40bdc +2482166944 0 2bdac825cf647d73 +2482166944 1 4a5d06d579b0d27d +2482166944 2 bcb7acac028cd998 +2482166944 3 43be6fe7e2dcdeae +2482166944 4 0954c9d5ff20ab1d +2482166944 5 4edd50b5c7e30f58 +2482166944 6 5bf5fad590e85bb3 +2482166944 7 660b1bb6d352c493 +2482166944 8 480fe4c6e3860b43 +2482166944 9 995a835aeb6b1346 +2482166944 10 46c95b33d5f16b01 +2482166944 11 a243865cf80f213c +2482166944 12 ac62f51b889b3285 +2482166944 13 aa2664976936c457 +2482166944 14 48e54800ee51ab8b +2482166944 15 7abbce549fb931fc +2482166944 16 6d4863b54b5d3de5 +2482166944 17 fcd229150bb0f554 +2482166944 18 54df9fc5ea2fb4cf +2482166944 19 ac4a8981fa91d9af +2482166944 20 559cedf45fdcc533 +2482166944 21 2d5af917b052686a +2482166944 22 e487b3c23cdb46ef +2482166944 23 50860fc16ec05375 +2482166944 24 037aa34705fa2171 +2482166944 25 127034c9cfdc3286 +2482166944 26 7763b2ebedf1a91b +2482166944 27 422afe7c9d214a45 +2482166944 28 7771e1c279908542 +2482166944 29 f74ded375c3f2734 +2482166944 30 d66e60a4a6b64788 +2482166944 31 768aa885aa658242 +1243715392 0 cc572ff5b39c2881 +1243715392 1 196e137006e44d02 +1243715392 2 e9770652e8880018 +1243715392 3 9fcc8e9a95a97b13 +1243715392 4 31288473959dbc27 +1243715392 5 ce5713d8be258572 +1243715392 6 61cf346a1d87c7b8 +1243715392 7 d278dbd898af760a +1243715392 8 7f518cdbba8169b1 +1243715392 9 3d166dcefb91ff51 +1243715392 10 168ab80399d1abce +1243715392 11 9fed90714662c29f +1243715392 12 5619d323f838c81d +1243715392 13 4e59e9ad328f248f +1243715392 14 9bdfe01eb7a51e7f +1243715392 15 69932aaf300ac4fc +1243715392 16 72b5a8c14dbc65a8 +1243715392 17 27b3b2b04e9327db +1243715392 18 93b2fdd4035fd771 +1243715392 19 4e24c08b205bdeb7 +1243715392 20 88e17c83256cf31e +1243715392 21 d71897036e64207a +1243715392 22 7e1e1f5587fe6f80 +1243715392 23 7c841af84070ecb6 +1243715392 24 38e0239028f21dff +1243715392 25 cb513ea5eeec41ec +1243715392 26 b591d7028a1617b6 +1243715392 27 207d401fdb22297f +1243715392 28 3aa526e16ca1703c +1243715392 29 f13360621e79e84b +1243715392 30 85947c6865646f64 +1243715392 31 96b700884569cfa2 +209806816 0 b617f6bdbe7f2418 +209806816 1 b3bdd0bce8c4f830 +209806816 2 0e556b38ae568123 +209806816 3 0612a6ba9d6b47d0 +209806816 4 3c3ba658d61457c4 +209806816 5 0e666b5d8b7ce0f6 +209806816 6 55e7684cd33538f0 +209806816 7 1f8f5179eab81653 +209806816 8 2749c7b29fb0f703 +209806816 9 55df73ff7835b254 +209806816 10 762a1ed377b33bab +209806816 11 7b67839b837700d5 +209806816 12 f87012315b5ddea3 +209806816 13 f50b3a0e6af5da47 +209806816 14 168530faa00983c5 +209806816 15 4e437fb993f49845 +209806816 16 6edc862e80ab7b11 +209806816 17 79947723525116fe +209806816 18 8af19679402ac7ae +209806816 19 42a1aafaf1a42670 +209806816 20 855cd6efa67f0e93 +209806816 21 9f4c45b215441a58 +209806816 22 3f9bcb0182172e8b +209806816 23 185143b388b47629 +209806816 24 fd071472d7769a3a +209806816 25 809e86d9d6431fe3 +209806816 26 ef8ca8ebfe848898 +209806816 27 708015a35c25c7bd +209806816 28 397b27c2f9083602 +209806816 29 f43a5aece62f8e94 +209806816 30 3e460f118785db60 +209806816 31 36b2ce156ec6f654 +3395624224 0 0c5d97d84a558775 +3395624224 1 320a5bcf3a913320 +3395624224 2 0799c71a8d59a0cb +3395624224 3 2c7183bc11ff46ba +3395624224 4 e3a1c01a96481089 +3395624224 5 57b87c23a1899303 +3395624224 6 289659220e50f94f +3395624224 7 2341598b0a521f53 +3395624224 8 4f2b75a8da92dd13 +3395624224 9 d337ddee5f16e4ba +3395624224 10 fb3a82d5e5cad59e +3395624224 11 23958045788421b0 +3395624224 12 c6baaaef6af7db68 +3395624224 13 bb93ac228687aa7c +3395624224 14 afc9ba4b803a74b7 +3395624224 15 f86448c765cdd90d +3395624224 16 171be377e6b5130d +3395624224 17 bcffab2b39e33cda +3395624224 18 9a975becf63cea51 +3395624224 19 46a2f47516eef008 +3395624224 20 0d86981da32d7cf7 +3395624224 21 2e6ea832d07f8645 +3395624224 22 78c65b9710106321 +3395624224 23 bea125cadccd631c +3395624224 24 3f709be2d2eedb53 +3395624224 25 ef82c7fbc27370df +3395624224 26 0523981efdfdfa47 +3395624224 27 d6310b04c33ef1d8 +3395624224 28 16c5947baeb7428b +3395624224 29 a6ea6dcdc80eb2a3 +3395624224 30 bbaf0453c7e66d25 +3395624224 31 024623fcda872968 +3886889632 0 bfe1c1b35d56febd +3886889632 1 f3a713847cf85fa6 +3886889632 2 7b07ea0ba9736cad +3886889632 3 f8f6b24d51e81e14 +3886889632 4 2d84e6ac05737121 +3886889632 5 d6520c1f84369a69 +3886889632 6 32760beed05a3f17 +3886889632 7 9196819f305c213b +3886889632 8 7855f9abb37ad67c +3886889632 9 c3628e99a245ec10 +3886889632 10 4187396455db7ade +3886889632 11 217f79f9258c341a +3886889632 12 7a7397f756fdd53f +3886889632 13 b2247397f9adb37e +3886889632 14 6ba4754a01c048f5 +3886889632 15 26abe301fc002398 +3886889632 16 486aa89ff9d96b1c +3886889632 17 1c560bf770af01b3 +3886889632 18 b91167686ba19256 +3886889632 19 64fed276f93ecf54 +3886889632 20 065f7ed34746e022 +3886889632 21 e3588540437713d8 +3886889632 22 2f49ce4fa5397692 +3886889632 23 13f1099dbf951825 +3886889632 24 646faf5498c8e930 +3886889632 25 32ba2e2b27ef6bbe +3886889632 26 ef5bf03e530fbd26 +3886889632 27 05c8f98775c398e1 +3886889632 28 2b91ad7728f5bee3 +3886889632 29 e844540bb712dd70 +3886889632 30 699b21f55e08221b +3886889632 31 a1a67d0c0f4b5b33 +2045577696 0 6cf48cc58b267ee0 +2045577696 1 cecd2019965b8469 +2045577696 2 6657f46183632937 +2045577696 3 ca21441bb7278af0 +2045577696 4 33ee6217be749b41 +2045577696 5 4722d56da02677ed +2045577696 6 b6073636778b416a +2045577696 7 0fe1eb912b838c2a +2045577696 8 e7a5f77885cb8a6b +2045577696 9 eb067832d153df2a +2045577696 10 cf2fa5eb2896bf35 +2045577696 11 3ece0c744df07387 +2045577696 12 69d0b97416a51790 +2045577696 13 cb454928c9ac8e1d +2045577696 14 b6926ac0d4aa586d +2045577696 15 dd6ea766d592c728 +2045577696 16 0aefc953201796a3 +2045577696 17 517f4a07e7956d9a +2045577696 18 de6f7f5d703bc2aa +2045577696 19 1ec8de1e7a894d18 +2045577696 20 e3a6250312014a55 +2045577696 21 61ab1ef3884dadd4 +2045577696 22 db7a981a271d971c +2045577696 23 699db9d1fce124d8 +2045577696 24 a510325813378117 +2045577696 25 aeb74fd456aa9f1e +2045577696 26 c68ff02171e38065 +2045577696 27 8d1b7184cd8559b8 +2045577696 28 9881352b583418ab +2045577696 29 323f7be9cdf471c9 +2045577696 30 b08dd99e8f2070a7 +2045577696 31 70c1269f0a2eb390 +2073778688 0 364132f18d66d6d5 +2073778688 1 ea7432dac16b60b4 +2073778688 2 cf510a01bafe73e0 +2073778688 3 74939bca69ff3d2a +2073778688 4 e7abc2f7ac426e51 +2073778688 5 5972a19cf984de2b +2073778688 6 f002e8f44e42098f +2073778688 7 31b659ba9e5c0b1b +2073778688 8 22e25f848778e987 +2073778688 9 e01a00e24b3455d7 +2073778688 10 e04bf77bf9d5d1ad +2073778688 11 602b339e8c8d5061 +2073778688 12 9446f631b8efd54a +2073778688 13 c1c9bb1797b2791e +2073778688 14 58b9969a1cc81086 +2073778688 15 45ba43022d4874fc +2073778688 16 ca95ff6cce468ba9 +2073778688 17 3c980559e6432c82 +2073778688 18 32711f20635c3bf6 +2073778688 19 03204366126aec9a +2073778688 20 54b1aa595e39d3fa +2073778688 21 bcc9a005592b18a2 +2073778688 22 54d8149da8873edd +2073778688 23 38f0d2672e00ad3a +2073778688 24 dfa7732e1df95c7e +2073778688 25 1423787de540062a +2073778688 26 0ae7c1bb8b9c8316 +2073778688 27 0f9782e04f1e87a8 +2073778688 28 12959d207a96aa0a +2073778688 29 2ae68608b65beedd +2073778688 30 54b2d857b5ee53e6 +2073778688 31 a1ca9df016e1f005 +10993408 0 3318469702ebb0d1 +10993408 1 379d730bf49e40bd +10993408 2 c64f427587cf219d +10993408 3 f4e14440da448baf +10993408 4 0f1aa2ab68f12c2e +10993408 5 476283ca5c3d3b07 +10993408 6 0ce094bc0273260a +10993408 7 8632699f3106cc24 +10993408 8 205828b507e331d0 +10993408 9 b39267800bb1bc4f +10993408 10 d73546b56b75f58f +10993408 11 20bc6b349b95b0de +10993408 12 e6baead6fa557936 +10993408 13 966242a9d0176271 +10993408 14 7fc1b6d743fceb80 +10993408 15 db8a62c2fe2e784c +10993408 16 790438f483f0adc3 +10993408 17 7ac34441e20bb885 +10993408 18 fc12def9dcd37841 +10993408 19 030ed5b9245a21ee +10993408 20 9190c1edd9b1a559 +10993408 21 7be4fe0dc435b87d +10993408 22 3d807bfcd331a6fe +10993408 23 060d96d18cd531f7 +10993408 24 5af944bd384fdbfe +10993408 25 4db6094138567610 +10993408 26 098010ab731d4bb1 +10993408 27 1ced20ec4a6857e3 +10993408 28 8ad9f2a0baf8f664 +10993408 29 801f032f30511c80 +10993408 30 8f9d3a57a96728b7 +10993408 31 35846b3b80ee2bea +3490840416 0 d5e5df2185287c9c +3490840416 1 43d4abc082bf00ae +3490840416 2 c62aa1c3fb4361db +3490840416 3 dabe0fb412400d2b +3490840416 4 86f4cde6626cfd82 +3490840416 5 9d978c868e86e352 +3490840416 6 560bca502d7c9f1c +3490840416 7 7ed93fbb5c195fde +3490840416 8 940527ba37d56975 +3490840416 9 7efdc082dd675c4b +3490840416 10 bbfefcd498e7644f +3490840416 11 9043815eb6d2d2bd +3490840416 12 3e5523e4b62c01e2 +3490840416 13 6bed7fbf6d10bf6a +3490840416 14 fddaaf73b318a18d +3490840416 15 4c7c0f892677ca27 +3490840416 16 03052828a802e364 +3490840416 17 91883abb4fc0c00d +3490840416 18 5dcae7deb6465bc2 +3490840416 19 323fae79ac4beaae +3490840416 20 ac00c84b39eea0fb +3490840416 21 e4734c4ff42b5b78 +3490840416 22 0b0c8799fdbf296a +3490840416 23 c4fde2dd5aa3cb9f +3490840416 24 ac8e084909e7c619 +3490840416 25 a30069600b9ecf2f +3490840416 26 d53fe958877a6e13 +3490840416 27 ebeaff9875eec3e3 +3490840416 28 f10288b9ffadd3fd +3490840416 29 1370ff544bee7466 +3490840416 30 9896a6645bb97274 +3490840416 31 c995ad5fbafe4b74 +2848373920 0 3a6d4845cb7be9ca +2848373920 1 f8b1736b776e4dbb +2848373920 2 59d1afa8f957c595 +2848373920 3 0b34310139352a14 +2848373920 4 763e16a1a8ffcf81 +2848373920 5 17add42ff6b8c387 +2848373920 6 cdf4b37c592ebf16 +2848373920 7 7545b1e0e460ee32 +2848373920 8 4944dc0abb9b0dd0 +2848373920 9 b93ee58b63008412 +2848373920 10 a7bf104fb2f5b8fe +2848373920 11 305ea8075f2d6ac9 +2848373920 12 c9ab65c39800e70f +2848373920 13 5ba55a6930c3d4e3 +2848373920 14 3da739ef1f5411c2 +2848373920 15 63a76f626df70e17 +2848373920 16 37e2e0304b04addb +2848373920 17 fc1130bc709e57b3 +2848373920 18 4b71d3f35157ec84 +2848373920 19 c53278187b771b38 +2848373920 20 0a233101dcda1a6b +2848373920 21 da4698962a3c29b2 +2848373920 22 035474ea47c9d2ea +2848373920 23 36e9f0f97121565d +2848373920 24 639e3b422f265305 +2848373920 25 cfabc00065c23f2f +2848373920 26 9e6ab57c2a0d3ff4 +2848373920 27 62c1e57b3409dbbd +2848373920 28 755427d21c10e005 +2848373920 29 d80d02116d564b6f +2848373920 30 c48c13c17be4bb62 +2848373920 31 e5095f03b7f47a32 +2880556800 0 9f73aebb21770d1c +2880556800 1 3f11351e0122f0cc +2880556800 2 497e8550a73b955e +2880556800 3 890c407c918d5aaa +2880556800 4 ab5d2572ca592d46 +2880556800 5 55de6e034939e530 +2880556800 6 6cf1c6fa5bdbafb7 +2880556800 7 e52dafbcd13ae842 +2880556800 8 100d380c665ae6a1 +2880556800 9 246ff157cb7eebc0 +2880556800 10 cf92ead36be62c03 +2880556800 11 d688a79ec752d073 +2880556800 12 c2ea45d6819216bf +2880556800 13 5374cf03e84f3184 +2880556800 14 654799646d15bf0f +2880556800 15 9aa7d653ce1c4a76 +2880556800 16 db5873185971b736 +2880556800 17 2a4262a5e862214d +2880556800 18 50db24bc97bbbf65 +2880556800 19 f3e93d94541b4e90 +2880556800 20 3e05e9600963ada9 +2880556800 21 38462b25c9c704a3 +2880556800 22 c11ff07fa5e70837 +2880556800 23 9f519d9108a05a1a +2880556800 24 df380dabb2c48566 +2880556800 25 1407900b2a1b8478 +2880556800 26 c3653214a65c65b6 +2880556800 27 2ada501fca77872b +2880556800 28 b1f2664ec9205474 +2880556800 29 55a06ca25fb56789 +2880556800 30 919558138cc70c2b +2880556800 31 0db110abf0e2f59f +3625086080 0 66b24682323cd99f +3625086080 1 2aa8e065548314a4 +3625086080 2 5d6edb5ec188c08b +3625086080 3 c16a946e4971d582 +3625086080 4 bba62c4376f75756 +3625086080 5 c1451b1bebf137aa +3625086080 6 53104a8b9a578439 +3625086080 7 66958d3cb26905b9 +3625086080 8 5caea11dfac14227 +3625086080 9 909a000521693bfe +3625086080 10 e4754dd8aee0cd53 +3625086080 11 377d3504b64f7f61 +3625086080 12 dab29128a7385987 +3625086080 13 40f1525a01b2dd04 +3625086080 14 64a32ed4cff69187 +3625086080 15 7b40a6ee3867bb28 +3625086080 16 6cf06e24b8a0fe8b +3625086080 17 ec0694e78561ae15 +3625086080 18 e01218cec5411097 +3625086080 19 85f70bfea01469c8 +3625086080 20 b161f3d95648ae11 +3625086080 21 5d4aab598b3c121a +3625086080 22 0853881536f8b3fd +3625086080 23 c6cf3f62b1ff057f +3625086080 24 9e89ae2292c308ea +3625086080 25 898b5a660ef9b848 +3625086080 26 f03969d8d94577ae +3625086080 27 f9f6f6ea2e21b04c +3625086080 28 980d527e4b0b1517 +3625086080 29 d35ee800249a2577 +3625086080 30 af89af39770060cc +3625086080 31 3e70304fdd5e085e +2537065920 0 643e07dbfc79743d +2537065920 1 1508f05dc6ed35df +2537065920 2 bb66ceb8499cec36 +2537065920 3 2b0f112092963474 +2537065920 4 8639d8461c9e0277 +2537065920 5 40e8b3a3c4e502ee +2537065920 6 8e0016b8b1d24327 +2537065920 7 bc9126272122c4db +2537065920 8 6ad183f68c06ed5e +2537065920 9 9ea8d3c32c4869c7 +2537065920 10 012db29fd9a49903 +2537065920 11 c4767b6c2b51f310 +2537065920 12 c3493f56ddc06ab0 +2537065920 13 87f867dca178f212 +2537065920 14 bf6804772d8f5090 +2537065920 15 7df194d2c2f2c924 +2537065920 16 e0aa1cb4c7f4fa9d +2537065920 17 658afdf7c4dab42b +2537065920 18 a5447b5444cc60e7 +2537065920 19 dfe2582d7769e0c5 +2537065920 20 b073c320832ca050 +2537065920 21 58477f8be06e3790 +2537065920 22 368c6b451bc692d5 +2537065920 23 bb75106744ab5f4c +2537065920 24 d564569d929ba3e9 +2537065920 25 daee471b36743a14 +2537065920 26 86b4323e6e2a914e +2537065920 27 ee792d34d3e0b2b1 +2537065920 28 94724f5df3177b91 +2537065920 29 2f81db4eb21453bd +2537065920 30 b127a7a0f1516c91 +2537065920 31 1a8fca62bafc4c0f +1646897088 0 5f0db3c416d8a57a +1646897088 1 e899d35388e6808a +1646897088 2 af1c11411c95fafc +1646897088 3 a7d17ac0b11757f8 +1646897088 4 db166e85f1a5ca50 +1646897088 5 f4d325a61e0d0dc8 +1646897088 6 33f4670ab2010c01 +1646897088 7 0766b9a8a352f2f3 +1646897088 8 7a2db3a62702a90e +1646897088 9 a157a8954d8f5941 +1646897088 10 1ee153299cf9b7e6 +1646897088 11 057f70ea0db52eb5 +1646897088 12 902b984eef9143b0 +1646897088 13 e70fde11cf9727a6 +1646897088 14 a194d8fdd5c26f52 +1646897088 15 140bd48cc711f447 +1646897088 16 1540c2585490d78c +1646897088 17 4407715a0d3f6a8f +1646897088 18 6beb5446215978c8 +1646897088 19 5f1d1d5751d236f0 +1646897088 20 59ad5e8f9845759d +1646897088 21 cd23bd6f561e29e9 +1646897088 22 2c5a286b54ad63ae +1646897088 23 d7ea3fda20a044c4 +1646897088 24 456d2d26873f5789 +1646897088 25 48afca1d9a8f7cf1 +1646897088 26 e3c886c1f286fd0e +1646897088 27 bc93cdb67d3e0fa7 +1646897088 28 aa0b1666c60dcc81 +1646897088 29 2cf8451d1a7d8359 +1646897088 30 ee645274f88dd3c1 +1646897088 31 467bf42f7d42df1d +1124098848 0 4d56a31fcac3d846 +1124098848 1 f416d0440e7b4ecc +1124098848 2 44c63a4f4600ebf2 +1124098848 3 74d7aa0eb2699a32 +1124098848 4 4b2aaf7c48902b08 +1124098848 5 d235526dda64074e +1124098848 6 5f05f775afdfccb5 +1124098848 7 b35aa821d79ed43d +1124098848 8 0a5f434ca784b911 +1124098848 9 5db32d43975245fd +1124098848 10 b118907dd3d5abed +1124098848 11 a7b887b2866f4e69 +1124098848 12 4a3c8d3ca154ab4c +1124098848 13 e9127f8a9780ace3 +1124098848 14 5332dfdc728872af +1124098848 15 e1bcc09ca00f5501 +1124098848 16 e0f908f572365465 +1124098848 17 1d2db9870bc44f85 +1124098848 18 51c1fb76cf471ac2 +1124098848 19 d8165b20548ca954 +1124098848 20 a5691508cf3ee836 +1124098848 21 67759e231fff8db5 +1124098848 22 62cb91505d93a986 +1124098848 23 5a55a97864c96f03 +1124098848 24 58f03ebfbc722b9c +1124098848 25 b203075772f03fc4 +1124098848 26 c656d2927dfc227a +1124098848 27 fb41777abff9ad4e +1124098848 28 230a451488b41ed8 +1124098848 29 e3d0e8adfd5a57ab +1124098848 30 29f12f5653ef5426 +1124098848 31 e4d3afefee4bc163 +387203520 0 f42aba06c0b0bac9 +387203520 1 8aaa0dd8308e4854 +387203520 2 3ce7771872a92df7 +387203520 3 bd8e5126bc54ba91 +387203520 4 a935c274f7109f57 +387203520 5 72894f46ae75476c +387203520 6 12e4335e6409265a +387203520 7 06fde0bf533b44c9 +387203520 8 66b3d1acee850f01 +387203520 9 17d9b386fa5dc2fe +387203520 10 275605f48f31eb9c +387203520 11 0bb4fdf9e285b46a +387203520 12 525a50a5184d017f +387203520 13 a68663c7f737b493 +387203520 14 5adad5c57b30f058 +387203520 15 10feee42ee1f3e4a +387203520 16 b6bf163ec8b2af64 +387203520 17 e7ba43a730449ff6 +387203520 18 27b208b7aed619fa +387203520 19 2cc3bdf72793f115 +387203520 20 c08656fb8c3a2a38 +387203520 21 d16a608be7238c55 +387203520 22 fe67c7e038bd54dc +387203520 23 03e0fb006a82026c +387203520 24 af16d21011725cf5 +387203520 25 3d6557636074ab43 +387203520 26 e7308ea75602a6bd +387203520 27 b729b3176ed3fa0b +387203520 28 808b48f64cbe5d45 +387203520 29 220ff46a70dcc5bc +387203520 30 f7d0b331bda4d47d +387203520 31 f804c56fd064bc76 +3641908288 0 5c88411a020530c8 +3641908288 1 9e1cd819b54267b5 +3641908288 2 f26c0af641f69d9b +3641908288 3 88069f29a58669e5 +3641908288 4 1c7ed68ace8df11e +3641908288 5 a708926f2c96cef5 +3641908288 6 0893a1fa23cf545e +3641908288 7 044ad74339af15c4 +3641908288 8 5613aae80ae5add8 +3641908288 9 c0c1bbb565ce714b +3641908288 10 7ca28cad3a8a5078 +3641908288 11 8af1bdb5839904bf +3641908288 12 02a346a7f04c1732 +3641908288 13 b0b14845192b5d60 +3641908288 14 0d4c16523ce765cd +3641908288 15 9744f159b8b8ed88 +3641908288 16 7c0196a22b21fdb3 +3641908288 17 217f5526f1100e78 +3641908288 18 41f21f49acee2b8b +3641908288 19 2bc247f65e6da19c +3641908288 20 d118f7b6b57fc8e6 +3641908288 21 ef6639c8e720fae2 +3641908288 22 1ebed3b456292416 +3641908288 23 284109cc6277830d +3641908288 24 6685365e74a6fc9f +3641908288 25 fc0af9d2151f4005 +3641908288 26 f8d89c7b0eb2dee3 +3641908288 27 30310eb2e365049c +3641908288 28 f93c5eda0126965a +3641908288 29 0c94fadd664e8133 +3641908288 30 28ecc1c26782bcef +3641908288 31 ac28d0079e08d401 +3687510528 0 79f60de4237dcac4 +3687510528 1 817c9f7d770b02c8 +3687510528 2 32a14284b0052900 +3687510528 3 5e716b88c720cf2b +3687510528 4 4e8adb54836fd762 +3687510528 5 28800220acdcd40d +3687510528 6 9ab52e6f5e029760 +3687510528 7 9935b11ddd394573 +3687510528 8 9fe9720d51158595 +3687510528 9 eeb76342b01ca53d +3687510528 10 273baadfb572bc77 +3687510528 11 c99ae0a956a03921 +3687510528 12 82b94703990916d9 +3687510528 13 d3ee16cf572c6186 +3687510528 14 e3c4862a63d05c87 +3687510528 15 58b8ecd9e60f3474 +3687510528 16 5280b24addc1943b +3687510528 17 8e5a1c2cb7575c21 +3687510528 18 1bf57053f60265d4 +3687510528 19 ab2ee824fcfd2c8a +3687510528 20 dce07b9f66cf59a2 +3687510528 21 33609cb5f3bc1142 +3687510528 22 e7f25041f1bdd102 +3687510528 23 851c02afe8b12f50 +3687510528 24 7c1ac066a57f47d0 +3687510528 25 6e45c69181f0acad +3687510528 26 7f0c6cb1b2178329 +3687510528 27 a9dea336bb3d34b4 +3687510528 28 95da4c54f629553e +3687510528 29 9d35e7d67c22dcef +3687510528 30 93bf178015955547 +3687510528 31 60aac69d1a140645 +1013821568 0 3edc8fafa3257f73 +1013821568 1 ffefebb495df26bd +1013821568 2 179d6d0740d02a02 +1013821568 3 72f4923f1cbe1e6d +1013821568 4 1658e014681f7498 +1013821568 5 9dbb8eaf0ff97b71 +1013821568 6 0f521856d3fea6dc +1013821568 7 35ea3cade4219f99 +1013821568 8 edbca78d2497157e +1013821568 9 9558c6aac2919ce2 +1013821568 10 d085e5608e68b93a +1013821568 11 f404194c84c01653 +1013821568 12 9ffe4fdb7051acb3 +1013821568 13 3444ebc1050e861e +1013821568 14 bd60bdc4845f442a +1013821568 15 f7afb73d372b2180 +1013821568 16 02f2112ebf23bc44 +1013821568 17 c5e96d21daca162d +1013821568 18 d9e631f1aa767854 +1013821568 19 8b44e4d5424eb4eb +1013821568 20 1357b472036ce83a +1013821568 21 519140b05af5e85b +1013821568 22 324fcb280a6ed8db +1013821568 23 4d8a216e4f3876b0 +1013821568 24 8f87bd10dd698a3a +1013821568 25 ec7c5fb37e46377f +1013821568 26 1915ea5031338824 +1013821568 27 423ee3a89119ebd4 +1013821568 28 19230e8a18ece30f +1013821568 29 21a58dbf2f824819 +1013821568 30 6f5d45f6065f871f +1013821568 31 a45f970d7b3cf09f +2576145536 0 b0db9d2b2ca4892b +2576145536 1 24ced3183448922a +2576145536 2 a4c123e540352a2c +2576145536 3 b369af86846cb2dd +2576145536 4 65d2445357e11e0d +2576145536 5 df9574f4f65d9273 +2576145536 6 fa180da15f93969c +2576145536 7 8e1c7b0d83d28873 +2576145536 8 bbe6f2a8b849cec3 +2576145536 9 7a6671e8fea70c34 +2576145536 10 2572e7e6b9c854b5 +2576145536 11 5fdcb1f1aa841e2f +2576145536 12 0daf39bf53d6bc00 +2576145536 13 53cd6edb96da50b9 +2576145536 14 d2d584e2cfdcb3fb +2576145536 15 471d93925f7f8445 +2576145536 16 3b095670b5194499 +2576145536 17 862e258cc08aa6f7 +2576145536 18 acee9d3c2d3c4c34 +2576145536 19 0ce46b375f326bc7 +2576145536 20 0632f80020f2d726 +2576145536 21 3f355f86c8560a6c +2576145536 22 efd84faff2b2d2b8 +2576145536 23 5b4510431264fffd +2576145536 24 85a73cc09b5bd84a +2576145536 25 e49727c4839c3a7b +2576145536 26 bfeb2e7b3b715c86 +2576145536 27 e1948ea1614f7f76 +2576145536 28 10ec3f812902dd7f +2576145536 29 aad22b12fb538074 +2576145536 30 3bc087a7911686ab +2576145536 31 9f84f346ac19eaa1 +1011030784 0 370b550856e39f4a +1011030784 1 5aa6b4606de5354a +1011030784 2 bc34d6a657cc0572 +1011030784 3 4137a04cd71dc114 +1011030784 4 5aac9c1703c0e135 +1011030784 5 8a452a6ffe6f0575 +1011030784 6 2b41efe5768426a4 +1011030784 7 d1cf2985517cc8a1 +1011030784 8 6590c5c956f93c26 +1011030784 9 146f4292001d2c70 +1011030784 10 6cd28f71aa2e40bf +1011030784 11 890996102731ae58 +1011030784 12 3e2c7f2299c26181 +1011030784 13 822f572844814ba7 +1011030784 14 09ec465fbf22c662 +1011030784 15 7dbe8f6fe11ba16d +1011030784 16 b1750d2dd015255b +1011030784 17 9bb40389627323f0 +1011030784 18 bb9ee72ebd3b3380 +1011030784 19 b7d10ac7ebd6e6f3 +1011030784 20 5a158c37aa7dea87 +1011030784 21 dec940511f5dbaef +1011030784 22 177b4e7a88dca21e +1011030784 23 34d44305632ef58f +1011030784 24 93a47f6190e01147 +1011030784 25 39fccc3a81ee2cda +1011030784 26 435f416d0c5458b6 +1011030784 27 5efeda4ae1a55d61 +1011030784 28 c70900cf917c39dd +1011030784 29 1566effe12a292ad +1011030784 30 0caabff9d457b33e +1011030784 31 4c4e872c79bd060a +37357152 0 2abf0b59db454a6d +37357152 1 93e8ec72bb0228e0 +37357152 2 683c0da4daf25cbc +37357152 3 4389644fed04bb98 +37357152 4 8c9dbd0d35326cbe +37357152 5 de54c4fa1dec043a +37357152 6 655cfe893ccd075a +37357152 7 f2d5fca12d764f81 +37357152 8 5fe49492048abd0f +37357152 9 158d9ef17397c10a +37357152 10 0d0de92dcd18fbc5 +37357152 11 6422bd49e8fc1d17 +37357152 12 7bc21e1aedccd14f +37357152 13 b9e40a54a411d65e +37357152 14 0f36a3ce1d236a8a +37357152 15 48370a2255d8af15 +37357152 16 ccfea6fdcd7b5c97 +37357152 17 24fe80822e30338b +37357152 18 3dbc0ca32c3c3502 +37357152 19 3c3e49c21004e079 +37357152 20 35940a875c0c77ca +37357152 21 0562f6b45e50e87a +37357152 22 bfc9e770b384ba2e +37357152 23 242a248ed94abd9b +37357152 24 c66f3c8998a67001 +37357152 25 8fdfcefcf02d0012 +37357152 26 fab4a300da134b90 +37357152 27 b8e91e65b5b72ed6 +37357152 28 99dbe108f5518a49 +37357152 29 b0b16321eede08e0 +37357152 30 8e52a88e4b7c3b12 +37357152 31 a8aef84c09a9321b +4139829536 0 42bb9357a1eed169 +4139829536 1 ec10ce2ad08816b4 +4139829536 2 f652a4b33d939941 +4139829536 3 f489dd8a9776ac9c +4139829536 4 5a7fc94f124be71c +4139829536 5 8c181915ef005b59 +4139829536 6 bdbe09471fa0c0e9 +4139829536 7 e939845d66b4f0a7 +4139829536 8 f65fa2d773fbda89 +4139829536 9 1c77bb2c38840d0f +4139829536 10 bd13841ac1e065ff +4139829536 11 c999f54fd9cc9067 +4139829536 12 66cdec0036d1c317 +4139829536 13 17d9c92c7c2a28fd +4139829536 14 9e7c8de52f95692c +4139829536 15 a814785101f8dbac +4139829536 16 38df8e383d9603e8 +4139829536 17 011ba5c526826372 +4139829536 18 a5afaffef963cf7a +4139829536 19 ef0511f0d724a3a8 +4139829536 20 2bed9789788d123f +4139829536 21 b28a20b22469922c +4139829536 22 872f0c4c74bfdd6d +4139829536 23 880aa9e9999d264c +4139829536 24 50c5a4f065057735 +4139829536 25 5f63c3134aa97c8d +4139829536 26 be45d4784ccb6f0d +4139829536 27 e84d81da6b8088e7 +4139829536 28 0345ab5f16dbf545 +4139829536 29 44e893bf68c0628d +4139829536 30 6d5d3176caa3b99f +4139829536 31 1be7645799e5c4a5 +3985725632 0 f61ac2aea291ab80 +3985725632 1 ed93edab9c3bfcf0 +3985725632 2 50e811797585d09f +3985725632 3 4bc0ded6fa19e126 +3985725632 4 0f542e60211b8751 +3985725632 5 563d1bb64c3d3b36 +3985725632 6 26fe4a351bc4a11e +3985725632 7 1f330e52753fec11 +3985725632 8 38f92da397215738 +3985725632 9 bb40480999b71ba1 +3985725632 10 5365385de76cb5de +3985725632 11 088255b1b1287da2 +3985725632 12 c8b189df4c8d7c84 +3985725632 13 912b3b68195ebd10 +3985725632 14 2f2a3e2070be647c +3985725632 15 699b71804ac66274 +3985725632 16 050e6d2b3bb7001c +3985725632 17 e5f25946f1fd7175 +3985725632 18 23a6bb5e498c8351 +3985725632 19 4421006b1a79bfe9 +3985725632 20 05f7206562eac502 +3985725632 21 9a0506c076048d0a +3985725632 22 8e35cf4d74b7854e +3985725632 23 95fd19f218ae208e +3985725632 24 cd53591044b7e10e +3985725632 25 055af62f8fdbf66f +3985725632 26 cb10ca0e33362364 +3985725632 27 2dfa4ea6279028f0 +3985725632 28 90ffb9ee04eb1c3b +3985725632 29 15b84b89a0fece6b +3985725632 30 607c6f0259873b80 +3985725632 31 bfcf38106d491c72 +3974419104 0 45c8a5c8e470ed35 +3974419104 1 e0bfba8d675f82e1 +3974419104 2 40865fa56cf8425f +3974419104 3 e9a74cbdbf1274be +3974419104 4 34e72ef492b01768 +3974419104 5 cc0fb1afb9b97b61 +3974419104 6 042536d741019170 +3974419104 7 24f7bcba7393ad86 +3974419104 8 782d61732ae8934b +3974419104 9 705185cce551d680 +3974419104 10 502208b7580dc1ea +3974419104 11 147ae16d5e542a4b +3974419104 12 d275a3a2015cdf81 +3974419104 13 5227c9866dfebcbd +3974419104 14 91155c4e3b81c1fd +3974419104 15 6a921b8eb2480247 +3974419104 16 216a16d85a87ad50 +3974419104 17 447503a100db455c +3974419104 18 96fd4c417b44ee4f +3974419104 19 ea48058637ea3e87 +3974419104 20 ab46c0dc5e9c9ed2 +3974419104 21 e73b7a66aad2b582 +3974419104 22 e32b347c1e2aca14 +3974419104 23 8f0b769e213d074d +3974419104 24 b914d962e06e42d3 +3974419104 25 315479349bfaa5fd +3974419104 26 711226727c36766b +3974419104 27 e0636994fd49ce3e +3974419104 28 24254af173954a6a +3974419104 29 64489cbbf7460f14 +3974419104 30 c181727e60313327 +3974419104 31 b719792fd5d1a07a +798615936 0 5703f56e9f4dfb71 +798615936 1 0eb0084864c904d9 +798615936 2 e92647c8df15c326 +798615936 3 a2b22dd7fc88d311 +798615936 4 fb854da00c0722e6 +798615936 5 9ec7faacbcbeee53 +798615936 6 ad9b1d68a86b2684 +798615936 7 45a6981f453dae84 +798615936 8 5fec43b66e1bff39 +798615936 9 0187a52654881a04 +798615936 10 4b41422db2ac7802 +798615936 11 b346d0f6c8fa3727 +798615936 12 0930223f2d809b02 +798615936 13 3cfaa9c549e88e5d +798615936 14 fec90f594ef5439f +798615936 15 b5f95155b4b51542 +798615936 16 c2b8256c40f71208 +798615936 17 88781b38ba2df358 +798615936 18 0511f782f1e868f5 +798615936 19 fa05c47587f4e047 +798615936 20 ee77ecfe65ed900f +798615936 21 de9b05be6332962a +798615936 22 4970d0a8cf9ae5ff +798615936 23 e1a1d68c5670d01f +798615936 24 3de11fbeba435823 +798615936 25 3b81d4006aff945b +798615936 26 bd1912157784633c +798615936 27 7978b9099cb06f8c +798615936 28 d9f5f588111bd534 +798615936 29 e14d15fc3a666b66 +798615936 30 7fa41e6b16b1f441 +798615936 31 4caa7ac46eb34f11 diff --git a/proto-newpow/mma-shadow/out/power_0.csv b/proto-newpow/mma-shadow/out/power_0.csv new file mode 100644 index 000000000..23f2ed1b9 --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_0.csv @@ -0,0 +1,30 @@ +15.15 W, 210 MHz, 45, 0 %, 2026/10/06 19:42:24.816 +48.43 W, 2520 MHz, 47, 0 %, 2026/10/06 19:42:25.847 +106.67 W, 2670 MHz, 51, 0 %, 2026/10/06 19:42:26.847 +156.77 W, 2670 MHz, 52, 0 %, 2026/10/06 19:42:27.848 +200.24 W, 2670 MHz, 53, 100 %, 2026/10/06 19:42:28.848 +200.29 W, 2670 MHz, 53, 100 %, 2026/10/06 19:42:29.848 +202.82 W, 2670 MHz, 54, 100 %, 2026/10/06 19:42:30.848 +201.27 W, 2670 MHz, 54, 100 %, 2026/10/06 19:42:31.849 +201.02 W, 2670 MHz, 54, 100 %, 2026/10/06 19:42:32.849 +201.02 W, 2670 MHz, 55, 100 %, 2026/10/06 19:42:33.849 +201.04 W, 2670 MHz, 55, 100 %, 2026/10/06 19:42:34.849 +200.96 W, 2670 MHz, 55, 100 %, 2026/10/06 19:42:35.850 +200.94 W, 2670 MHz, 55, 100 %, 2026/10/06 19:42:36.850 +200.96 W, 2670 MHz, 55, 100 %, 2026/10/06 19:42:37.850 +201.00 W, 2670 MHz, 56, 100 %, 2026/10/06 19:42:38.850 +201.02 W, 2670 MHz, 56, 100 %, 2026/10/06 19:42:39.851 +201.02 W, 2670 MHz, 56, 100 %, 2026/10/06 19:42:40.851 +201.12 W, 2670 MHz, 56, 100 %, 2026/10/06 19:42:41.851 +201.07 W, 2670 MHz, 56, 100 %, 2026/10/06 19:42:42.851 +201.02 W, 2670 MHz, 57, 100 %, 2026/10/06 19:42:43.852 +201.03 W, 2670 MHz, 57, 100 %, 2026/10/06 19:42:44.852 +201.03 W, 2670 MHz, 57, 100 %, 2026/10/06 19:42:45.852 +201.21 W, 2670 MHz, 57, 100 %, 2026/10/06 19:42:46.852 +201.31 W, 2670 MHz, 57, 100 %, 2026/10/06 19:42:47.853 +201.33 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:48.853 +201.33 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:49.853 +201.52 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:50.853 +201.41 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:51.854 +201.51 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:52.854 +201.49 W, 2670 MHz, 58, 100 %, 2026/10/06 19:42:53.854 diff --git a/proto-newpow/mma-shadow/out/power_128.csv b/proto-newpow/mma-shadow/out/power_128.csv new file mode 100644 index 000000000..9b94e9d35 --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_128.csv @@ -0,0 +1,30 @@ +18.57 W, 210 MHz, 53, 0 %, 2026/10/06 19:44:46.034 +38.21 W, 2520 MHz, 54, 0 %, 2026/10/06 19:44:47.037 +108.02 W, 2670 MHz, 55, 0 %, 2026/10/06 19:44:48.037 +143.43 W, 2670 MHz, 59, 100 %, 2026/10/06 19:44:49.037 +207.98 W, 2670 MHz, 60, 100 %, 2026/10/06 19:44:50.038 +208.85 W, 2670 MHz, 60, 100 %, 2026/10/06 19:44:51.038 +209.59 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:52.038 +210.00 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:53.038 +210.08 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:54.039 +210.10 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:55.039 +209.96 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:56.039 +210.40 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:57.039 +210.88 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:58.040 +211.38 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:59.040 +211.56 W, 2670 MHz, 62, 100 %, 2026/10/06 19:45:00.040 +211.76 W, 2670 MHz, 62, 100 %, 2026/10/06 19:45:01.040 +212.68 W, 2670 MHz, 62, 100 %, 2026/10/06 19:45:02.040 +212.12 W, 2670 MHz, 62, 100 %, 2026/10/06 19:45:03.041 +211.51 W, 2670 MHz, 62, 100 %, 2026/10/06 19:45:04.041 +212.43 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:05.041 +212.79 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:06.041 +212.98 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:07.042 +212.89 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:08.042 +212.51 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:09.042 +212.93 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:10.042 +212.91 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:11.042 +213.05 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:12.043 +213.00 W, 2670 MHz, 63, 100 %, 2026/10/06 19:45:13.043 +213.23 W, 2670 MHz, 64, 100 %, 2026/10/06 19:45:14.043 +213.14 W, 2670 MHz, 64, 100 %, 2026/10/06 19:45:15.043 diff --git a/proto-newpow/mma-shadow/out/power_32.csv b/proto-newpow/mma-shadow/out/power_32.csv new file mode 100644 index 000000000..9c88a37e0 --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_32.csv @@ -0,0 +1,30 @@ +18.08 W, 210 MHz, 53, 0 %, 2026/10/06 19:43:48.466 +40.68 W, 2520 MHz, 55, 0 %, 2026/10/06 19:43:49.498 +106.86 W, 2670 MHz, 56, 52 %, 2026/10/06 19:43:50.498 +141.51 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:51.498 +203.49 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:52.499 +203.95 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:53.499 +204.46 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:54.499 +204.84 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:55.499 +204.88 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:56.500 +205.53 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:57.500 +205.87 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:58.500 +205.71 W, 2670 MHz, 62, 100 %, 2026/10/06 19:43:59.500 +206.17 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:00.500 +206.54 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:01.501 +206.21 W, 2670 MHz, 61, 100 %, 2026/10/06 19:44:02.501 +206.09 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:03.504 +206.43 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:04.504 +206.97 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:05.504 +207.32 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:06.504 +207.58 W, 2670 MHz, 62, 100 %, 2026/10/06 19:44:07.505 +207.28 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:08.505 +207.92 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:09.505 +208.31 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:10.505 +208.17 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:11.505 +207.89 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:12.506 +208.03 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:13.506 +208.60 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:14.506 +208.41 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:15.506 +208.39 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:16.508 +208.19 W, 2670 MHz, 63, 100 %, 2026/10/06 19:44:17.508 diff --git a/proto-newpow/mma-shadow/out/power_512.csv b/proto-newpow/mma-shadow/out/power_512.csv new file mode 100644 index 000000000..8a2e5c839 --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_512.csv @@ -0,0 +1,30 @@ +15.26 W, 210 MHz, 46, 0 %, 2026/10/06 19:51:22.484 +32.16 W, 2520 MHz, 48, 0 %, 2026/10/06 19:51:23.516 +84.22 W, 2670 MHz, 50, 100 %, 2026/10/06 19:51:24.517 +138.29 W, 2670 MHz, 54, 100 %, 2026/10/06 19:51:25.517 +214.64 W, 2670 MHz, 55, 100 %, 2026/10/06 19:51:26.517 +215.01 W, 2670 MHz, 55, 100 %, 2026/10/06 19:51:27.517 +215.23 W, 2670 MHz, 56, 100 %, 2026/10/06 19:51:28.517 +215.43 W, 2670 MHz, 56, 100 %, 2026/10/06 19:51:29.518 +215.27 W, 2670 MHz, 56, 100 %, 2026/10/06 19:51:30.518 +215.35 W, 2670 MHz, 57, 100 %, 2026/10/06 19:51:31.518 +215.48 W, 2670 MHz, 57, 100 %, 2026/10/06 19:51:32.518 +215.41 W, 2670 MHz, 57, 100 %, 2026/10/06 19:51:33.518 +215.39 W, 2670 MHz, 58, 100 %, 2026/10/06 19:51:34.518 +215.49 W, 2670 MHz, 58, 100 %, 2026/10/06 19:51:35.519 +215.67 W, 2670 MHz, 58, 100 %, 2026/10/06 19:51:36.519 +215.71 W, 2670 MHz, 58, 100 %, 2026/10/06 19:51:37.519 +215.68 W, 2670 MHz, 59, 100 %, 2026/10/06 19:51:38.519 +215.70 W, 2670 MHz, 59, 100 %, 2026/10/06 19:51:39.519 +215.75 W, 2670 MHz, 59, 100 %, 2026/10/06 19:51:40.519 +215.72 W, 2670 MHz, 59, 100 %, 2026/10/06 19:51:41.520 +215.80 W, 2670 MHz, 59, 100 %, 2026/10/06 19:51:42.520 +215.90 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:43.520 +215.95 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:44.520 +216.10 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:45.520 +216.21 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:46.521 +216.13 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:47.521 +216.06 W, 2670 MHz, 60, 100 %, 2026/10/06 19:51:48.521 +216.07 W, 2670 MHz, 61, 100 %, 2026/10/06 19:51:49.521 +216.16 W, 2670 MHz, 61, 100 %, 2026/10/06 19:51:50.521 +216.10 W, 2670 MHz, 61, 100 %, 2026/10/06 19:51:51.521 diff --git a/proto-newpow/mma-shadow/out/power_8.csv b/proto-newpow/mma-shadow/out/power_8.csv new file mode 100644 index 000000000..0f3701851 --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_8.csv @@ -0,0 +1,30 @@ +16.99 W, 210 MHz, 51, 0 %, 2026/10/06 19:43:06.035 +40.60 W, 2520 MHz, 52, 0 %, 2026/10/06 19:43:07.067 +106.97 W, 2670 MHz, 53, 10 %, 2026/10/06 19:43:08.067 +137.95 W, 2670 MHz, 57, 100 %, 2026/10/06 19:43:09.068 +201.17 W, 2670 MHz, 58, 100 %, 2026/10/06 19:43:10.068 +201.47 W, 2670 MHz, 58, 100 %, 2026/10/06 19:43:11.068 +201.65 W, 2670 MHz, 58, 100 %, 2026/10/06 19:43:12.068 +201.97 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:13.068 +202.25 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:14.069 +202.06 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:15.069 +202.28 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:16.069 +202.47 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:17.069 +202.62 W, 2670 MHz, 59, 100 %, 2026/10/06 19:43:18.069 +202.62 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:19.070 +203.00 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:20.070 +203.19 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:21.070 +203.83 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:22.070 +203.66 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:23.070 +203.32 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:24.070 +203.21 W, 2670 MHz, 60, 100 %, 2026/10/06 19:43:25.071 +203.42 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:26.071 +203.90 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:27.071 +203.79 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:28.071 +203.96 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:29.071 +204.32 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:30.072 +204.51 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:31.072 +204.61 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:32.072 +204.72 W, 2670 MHz, 61, 100 %, 2026/10/06 19:43:33.072 +205.39 W, 2670 MHz, 62, 100 %, 2026/10/06 19:43:34.073 +205.90 W, 2670 MHz, 62, 100 %, 2026/10/06 19:43:35.073 diff --git a/proto-newpow/mma-shadow/out/power_idle.csv b/proto-newpow/mma-shadow/out/power_idle.csv new file mode 100644 index 000000000..3b66aa52b --- /dev/null +++ b/proto-newpow/mma-shadow/out/power_idle.csv @@ -0,0 +1,5 @@ +15.34 W, 210 MHz, 45, 0 % +15.21 W, 210 MHz, 45, 0 % +15.12 W, 210 MHz, 45, 0 % +15.05 W, 210 MHz, 45, 0 % +15.02 W, 210 MHz, 45, 0 % diff --git a/proto-newpow/mma-shadow/out/ptxas_0.txt b/proto-newpow/mma-shadow/out/ptxas_0.txt new file mode 100644 index 000000000..fc796f53e --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_0.txt @@ -0,0 +1,23 @@ +ptxas info : 0 bytes gmem +kernel_mm8.cu(98): warning #550-D: variable "lane" was set but never used + uint32_t lane = threadIdx.x & 31u; + ^ + +Remark: The warnings can be suppressed with "-diag-suppress " + +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 12.262 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.536 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.384 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_0_ref.txt b/proto-newpow/mma-shadow/out/ptxas_0_ref.txt new file mode 100644 index 000000000..115a73f7f --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_0_ref.txt @@ -0,0 +1,23 @@ +ptxas info : 0 bytes gmem +kernel_mm8.cu(98): warning #550-D: variable "lane" was set but never used + uint32_t lane = threadIdx.x & 31u; + ^ + +Remark: The warnings can be suppressed with "-diag-suppress " + +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 12.413 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.749 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.256 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_128.txt b/proto-newpow/mma-shadow/out/ptxas_128.txt new file mode 100644 index 000000000..2458c3076 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_128.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 32 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 27.671 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 11.908 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.275 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_128_ref.txt b/proto-newpow/mma-shadow/out/ptxas_128_ref.txt new file mode 100644 index 000000000..ca331c7a0 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_128_ref.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 175 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 9367.163 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.495 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.300 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_32.txt b/proto-newpow/mma-shadow/out/ptxas_32.txt new file mode 100644 index 000000000..c239bedce --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_32.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 15.442 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.497 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.272 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_32_ref.txt b/proto-newpow/mma-shadow/out/ptxas_32_ref.txt new file mode 100644 index 000000000..eed4938a7 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_32_ref.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 151 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 520.236 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.442 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.444 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_512.txt b/proto-newpow/mma-shadow/out/ptxas_512.txt new file mode 100644 index 000000000..f16e193a1 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_512.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 36 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 83.096 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 11.882 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.282 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_512_ref.txt b/proto-newpow/mma-shadow/out/ptxas_512_ref.txt new file mode 100644 index 000000000..d3cc57569 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_512_ref.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 213 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 273654.000 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.613 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.467 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_8.txt b/proto-newpow/mma-shadow/out/ptxas_8.txt new file mode 100644 index 000000000..82990404f --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_8.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 30 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 13.112 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 12.461 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.257 ms diff --git a/proto-newpow/mma-shadow/out/ptxas_8_ref.txt b/proto-newpow/mma-shadow/out/ptxas_8_ref.txt new file mode 100644 index 000000000..623e36ef6 --- /dev/null +++ b/proto-newpow/mma-shadow/out/ptxas_8_ref.txt @@ -0,0 +1,17 @@ +ptxas info : 0 bytes gmem +ptxas info : 0 bytes gmem +ptxas info : Compiling entry function '_Z11igneum_hashPKjPmjj' for 'sm_89' +ptxas info : Function properties for _Z11igneum_hashPKjPmjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 77 registers, used 0 barriers, 376 bytes cmem[0] +ptxas info : Compile time = 78.215 ms +ptxas info : Compiling entry function '_Z12igneum_buildPjPKjj' for 'sm_89' +ptxas info : Function properties for _Z12igneum_buildPjPKjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 40 registers, used 0 barriers, 372 bytes cmem[0] +ptxas info : Compile time = 11.877 ms +ptxas info : Compiling entry function '_Z17igneum_cache_fillPjj' for 'sm_89' +ptxas info : Function properties for _Z17igneum_cache_fillPjj + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 43 registers, used 0 barriers, 364 bytes cmem[0] +ptxas info : Compile time = 6.236 ms diff --git a/proto-newpow/mma-shadow/out/results.md b/proto-newpow/mma-shadow/out/results.md new file mode 100644 index 000000000..3190655e5 --- /dev/null +++ b/proto-newpow/mma-shadow/out/results.md @@ -0,0 +1,7 @@ +| R | mm8/hash | MH/s (GPU) | ratio to R=0 | W mean | SM MHz | uJ/hash | max C | fingerprint | PTX == ref | CPU == GPU | verifier ms/unit (R=0, R, delta) | regs | blocks/SM | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 0 | 0 | 63.08 | 1.000 | 201.2 | 2670 | 3.19 | 58 | 7c28cfb06c5c65a9 | yes | 1024 of 1024 | 10.179, 10.076, -0.103 | 29 | 24 | +| 8 | 64 | 63.08 | 1.000 | 204.1 | 2670 | 3.24 | 62 | 06fc2593bfb94b4f | yes | 1024 of 1024 | 9.926, 9.974, 0.048 | 30 | 24 | +| 32 | 256 | 63.08 | 1.000 | 207.7 | 2670 | 3.29 | 63 | 26e83a65f519c865 | yes | 1024 of 1024 | 10.075, 10.240, 0.165 | 29 | 24 | +| 128 | 1024 | 63.08 | 1.000 | 212.7 | 2670 | 3.37 | 64 | 42223c2113188335 | yes | 1024 of 1024 | 10.183, 11.326, 1.142 | 32 | 24 | +| 512 | 4096 | 63.08 | 1.000 | 215.9 | 2670 | 3.42 | 61 | 02b7002d747f3711 | yes | 1024 of 1024 | 9.887, 14.276, 4.389 | 36 | 24 | diff --git a/proto-newpow/mma-shadow/out/run.log b/proto-newpow/mma-shadow/out/run.log new file mode 100644 index 000000000..dbe032a85 --- /dev/null +++ b/proto-newpow/mma-shadow/out/run.log @@ -0,0 +1,130 @@ +== Tue Oct 6 19:42:12 UTC 2026 host 5c32e87a3fb6 == +name, driver_version, power.draw [W], clocks.current.sm [MHz], temperature.gpu +NVIDIA GeForce RTX 4090, 570.172.08, 15.34 W, 210 MHz, 45 +idle baseline (5 samples): +15.34 W, 210 MHz, 45, 0 % +15.21 W, 210 MHz, 45, 0 % +15.12 W, 210 MHz, 45, 0 % +15.05 W, 210 MHz, 45, 0 % +15.02 W, 210 MHz, 45, 0 % +== build verify_ref (gcc -O2) +== R=0: build bench_0 (PTX path) and bench_0_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +== R=0: timed run with power sampling +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +verify warp base 0 (pack vector, standalone): PASS +verify warp base 4096 (pack vector, standalone): PASS +verify warp base 1000000 (pack vector, standalone): PASS +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +verify warp base 0 (pack vector, in batch): PASS +verify warp base 4096 (pack vector, in batch): PASS +verify warp base 1000000 (pack vector, in batch): PASS +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.74 ms -> 63.078 MH/s +sustain end epoch 1791315774.658: 94 batches in 25.00 s -> 63.075 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_0.txt +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.075 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS +== R=0: reference path fingerprint +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS +FPCHECK R=0 PTX == ref: yes (7c28cfb06c5c65a9) +== R=0: CPU reference on the 32-warp dump (taskset -c 2) +self-test R=0 vector base 0: PASS (0 lanes differ) +self-test R=0 vector base 4096: PASS (0 lanes differ) +self-test R=0 vector base 1000000: PASS (0 lanes differ) +1024 of 1024 lanes equal (PASS) [10.152 ms per unit during the check] +verifier: 10.179 ms per unit at R=0, 10.076 ms per unit at R=0, mm8 block delta -0.103 ms per unit (0.00 us per mm8 step), averaged over 32 units, one core +VERIFY R=0 equal=1024 of=1024 ms_r0=10.179 ms_r=10.076 delta=-0.103 +== R=8: build bench_8 (PTX path) and bench_8_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 30 registers, used 0 barriers, 376 bytes cmem[0] +== R=8: timed run with power sampling +igneum_hash_info: 30 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.75 ms -> 63.078 MH/s +sustain end epoch 1791315815.870: 94 batches in 25.00 s -> 63.074 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_8.txt +SUMMARY R=8 regs=30 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.074 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=8: reference path fingerprint +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=8 regs=77 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=8 PTX == ref: yes (06fc2593bfb94b4f) +== R=8: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [10.106 ms per unit during the check] +verifier: 9.926 ms per unit at R=0, 9.974 ms per unit at R=8, mm8 block delta 0.048 ms per unit (0.74 us per mm8 step), averaged over 32 units, one core +VERIFY R=8 equal=1024 of=1024 ms_r0=9.926 ms_r=9.974 delta=0.048 +== R=32: build bench_32 (PTX path) and bench_32_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +== R=32: timed run with power sampling +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.75 ms -> 63.078 MH/s (GPU time), wall 2659.77 ms -> 63.078 MH/s +sustain end epoch 1791315858.296: 94 batches in 25.00 s -> 63.072 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_32.txt +SUMMARY R=32 regs=29 blocksPerSM=24 mhs=63.078 mhs_wall=63.078 mhs_sustain=63.072 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=32: reference path fingerprint +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=32 regs=151 blocksPerSM=12 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=32 PTX == ref: yes (26e83a65f519c865) +== R=32: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [10.432 ms per unit during the check] +verifier: 10.075 ms per unit at R=0, 10.240 ms per unit at R=32, mm8 block delta 0.165 ms per unit (0.64 us per mm8 step), averaged over 32 units, one core +VERIFY R=32 equal=1024 of=1024 ms_r0=10.075 ms_r=10.240 delta=0.165 +== R=128: build bench_128 (PTX path) and bench_128_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 32 registers, used 0 barriers, 376 bytes cmem[0] +== R=128: timed run with power sampling +igneum_hash_info: 32 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.82 ms -> 63.077 MH/s (GPU time), wall 2659.83 ms -> 63.076 MH/s +sustain end epoch 1791315915.893: 94 batches in 25.02 s -> 63.034 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_128.txt +SUMMARY R=128 regs=32 blocksPerSM=24 mhs=63.077 mhs_wall=63.076 mhs_sustain=63.034 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=128: reference path fingerprint +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=128 regs=175 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=128 PTX == ref: yes (42223c2113188335) +== R=128: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [11.349 ms per unit during the check] +verifier: 10.183 ms per unit at R=0, 11.326 ms per unit at R=128, mm8 block delta 1.142 ms per unit (1.12 us per mm8 step), averaged over 32 units, one core +VERIFY R=128 equal=1024 of=1024 ms_r0=10.183 ms_r=11.326 delta=1.142 +== R=512: build bench_512 (PTX path) and bench_512_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 36 registers, used 0 barriers, 376 bytes cmem[0] +== R=512: timed run with power sampling +igneum_hash_info: 36 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.85 ms -> 63.076 MH/s (GPU time), wall 2659.86 ms -> 63.075 MH/s +sustain end epoch 1791316312.340: 94 batches in 25.00 s -> 63.073 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_512.txt +SUMMARY R=512 regs=36 blocksPerSM=24 mhs=63.076 mhs_wall=63.075 mhs_sustain=63.073 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=512: reference path fingerprint +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=512 regs=213 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=512 PTX == ref: yes (02b7002d747f3711) +== R=512: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [14.440 ms per unit during the check] +verifier: 9.887 ms per unit at R=0, 14.276 ms per unit at R=512, mm8 block delta 4.389 ms per unit (1.07 us per mm8 step), averaged over 32 units, one core +VERIFY R=512 equal=1024 of=1024 ms_r0=9.887 ms_r=14.276 delta=4.389 +== Tue Oct 6 19:51:57 UTC 2026 done diff --git a/proto-newpow/mma-shadow/out/run_stdout.log b/proto-newpow/mma-shadow/out/run_stdout.log new file mode 100644 index 000000000..99da962f8 --- /dev/null +++ b/proto-newpow/mma-shadow/out/run_stdout.log @@ -0,0 +1,137 @@ +== Tue Oct 6 19:42:12 UTC 2026 host 5c32e87a3fb6 == +name, driver_version, power.draw [W], clocks.current.sm [MHz], temperature.gpu +NVIDIA GeForce RTX 4090, 570.172.08, 15.34 W, 210 MHz, 45 +idle baseline (5 samples): +15.34 W, 210 MHz, 45, 0 % +15.21 W, 210 MHz, 45, 0 % +15.12 W, 210 MHz, 45, 0 % +15.05 W, 210 MHz, 45, 0 % +15.02 W, 210 MHz, 45, 0 % +== build verify_ref (gcc -O2) +== R=0: build bench_0 (PTX path) and bench_0_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +== R=0: timed run with power sampling +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +verify warp base 0 (pack vector, standalone): PASS +verify warp base 4096 (pack vector, standalone): PASS +verify warp base 1000000 (pack vector, standalone): PASS +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +verify warp base 0 (pack vector, in batch): PASS +verify warp base 4096 (pack vector, in batch): PASS +verify warp base 1000000 (pack vector, in batch): PASS +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.74 ms -> 63.078 MH/s +sustain end epoch 1791315774.658: 94 batches in 25.00 s -> 63.075 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_0.txt +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.075 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS +== R=0: reference path fingerprint +fingerprint: 7c28cfb06c5c65a9 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) == 7c28cfb06c5c65a9 PASS +SUMMARY R=0 regs=29 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=7c28cfb06c5c65a9 cache=PASS dataset=PASS vectors=PASS +OVERALL: PASS +FPCHECK R=0 PTX == ref: yes (7c28cfb06c5c65a9) +== R=0: CPU reference on the 32-warp dump (taskset -c 2) +self-test R=0 vector base 0: PASS (0 lanes differ) +self-test R=0 vector base 4096: PASS (0 lanes differ) +self-test R=0 vector base 1000000: PASS (0 lanes differ) +1024 of 1024 lanes equal (PASS) [10.152 ms per unit during the check] +verifier: 10.179 ms per unit at R=0, 10.076 ms per unit at R=0, mm8 block delta -0.103 ms per unit (0.00 us per mm8 step), averaged over 32 units, one core +VERIFY R=0 equal=1024 of=1024 ms_r0=10.179 ms_r=10.076 delta=-0.103 +== R=8: build bench_8 (PTX path) and bench_8_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 30 registers, used 0 barriers, 376 bytes cmem[0] +== R=8: timed run with power sampling +igneum_hash_info: 30 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.73 ms -> 63.079 MH/s (GPU time), wall 2659.75 ms -> 63.078 MH/s +sustain end epoch 1791315815.870: 94 batches in 25.00 s -> 63.074 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_8.txt +SUMMARY R=8 regs=30 blocksPerSM=24 mhs=63.079 mhs_wall=63.078 mhs_sustain=63.074 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=8: reference path fingerprint +fingerprint: 06fc2593bfb94b4f (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=8 regs=77 blocksPerSM=24 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=06fc2593bfb94b4f cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=8 PTX == ref: yes (06fc2593bfb94b4f) +== R=8: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [10.106 ms per unit during the check] +verifier: 9.926 ms per unit at R=0, 9.974 ms per unit at R=8, mm8 block delta 0.048 ms per unit (0.74 us per mm8 step), averaged over 32 units, one core +VERIFY R=8 equal=1024 of=1024 ms_r0=9.926 ms_r=9.974 delta=0.048 +== R=32: build bench_32 (PTX path) and bench_32_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 29 registers, used 0 barriers, 376 bytes cmem[0] +== R=32: timed run with power sampling +igneum_hash_info: 29 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.75 ms -> 63.078 MH/s (GPU time), wall 2659.77 ms -> 63.078 MH/s +sustain end epoch 1791315858.296: 94 batches in 25.00 s -> 63.072 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_32.txt +SUMMARY R=32 regs=29 blocksPerSM=24 mhs=63.078 mhs_wall=63.078 mhs_sustain=63.072 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=32: reference path fingerprint +fingerprint: 26e83a65f519c865 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=32 regs=151 blocksPerSM=12 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=26e83a65f519c865 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=32 PTX == ref: yes (26e83a65f519c865) +== R=32: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [10.432 ms per unit during the check] +verifier: 10.075 ms per unit at R=0, 10.240 ms per unit at R=32, mm8 block delta 0.165 ms per unit (0.64 us per mm8 step), averaged over 32 units, one core +VERIFY R=32 equal=1024 of=1024 ms_r0=10.075 ms_r=10.240 delta=0.165 +== R=128: build bench_128 (PTX path) and bench_128_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 32 registers, used 0 barriers, 376 bytes cmem[0] +== R=128: timed run with power sampling +igneum_hash_info: 32 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.82 ms -> 63.077 MH/s (GPU time), wall 2659.83 ms -> 63.076 MH/s +sustain end epoch 1791315915.893: 94 batches in 25.02 s -> 63.034 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_128.txt +SUMMARY R=128 regs=32 blocksPerSM=24 mhs=63.077 mhs_wall=63.076 mhs_sustain=63.034 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=128: reference path fingerprint +fingerprint: 42223c2113188335 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=128 regs=175 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=42223c2113188335 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=128 PTX == ref: yes (42223c2113188335) +== R=128: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [11.349 ms per unit during the check] +verifier: 10.183 ms per unit at R=0, 11.326 ms per unit at R=128, mm8 block delta 1.142 ms per unit (1.12 us per mm8 step), averaged over 32 units, one core +VERIFY R=128 equal=1024 of=1024 ms_r0=10.183 ms_r=11.326 delta=1.142 +== R=512: build bench_512 (PTX path) and bench_512_ref + 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads +ptxas info : Used 36 registers, used 0 barriers, 376 bytes cmem[0] +== R=512: timed run with power sampling +igneum_hash_info: 36 registers/thread, 24 resident blocks/SM at 1 warp(s)/block = 24 resident warps/SM (50.0% of 48) +cache check: PASS (device FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS, head PASS, last line PASS) +dataset self-test: PASS (head 16 PASS, [MASK] PASS, 64 random points vs host derivation PASS, 64 Mac samples PASS) +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +timed: 10 batches x 16777216 hashes: GPU 2659.85 ms -> 63.076 MH/s (GPU time), wall 2659.86 ms -> 63.075 MH/s +sustain end epoch 1791316312.340: 94 batches in 25.00 s -> 63.073 MH/s (wall, incl. sync) +dump: 32 warps (1024 lanes) written to out/dump_512.txt +SUMMARY R=512 regs=36 blocksPerSM=24 mhs=63.076 mhs_wall=63.075 mhs_sustain=63.073 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +== R=512: reference path fingerprint +fingerprint: 02b7002d747f3711 (FNV-1a 64 over the 2^24 outputs at base nonce 0, little-endian u64 bytes) +SUMMARY R=512 regs=213 blocksPerSM=8 mhs=0.000 mhs_wall=0.000 mhs_sustain=0.000 fingerprint=02b7002d747f3711 cache=PASS dataset=PASS vectors=n/a +OVERALL: PASS +FPCHECK R=512 PTX == ref: yes (02b7002d747f3711) +== R=512: CPU reference on the 32-warp dump (taskset -c 2) +1024 of 1024 lanes equal (PASS) [14.440 ms per unit during the check] +verifier: 9.887 ms per unit at R=0, 14.276 ms per unit at R=512, mm8 block delta 4.389 ms per unit (1.07 us per mm8 step), averaged over 32 units, one core +VERIFY R=512 equal=1024 of=1024 ms_r0=9.887 ms_r=14.276 delta=4.389 +== Tue Oct 6 19:51:57 UTC 2026 done +| R | mm8/hash | MH/s (GPU) | ratio to R=0 | W mean | SM MHz | uJ/hash | max C | fingerprint | PTX == ref | CPU == GPU | verifier ms/unit (R=0, R, delta) | regs | blocks/SM | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 0 | 0 | 63.08 | 1.000 | 201.2 | 2670 | 3.19 | 58 | 7c28cfb06c5c65a9 | yes | 1024 of 1024 | 10.179, 10.076, -0.103 | 29 | 24 | +| 8 | 64 | 63.08 | 1.000 | 204.1 | 2670 | 3.24 | 62 | 06fc2593bfb94b4f | yes | 1024 of 1024 | 9.926, 9.974, 0.048 | 30 | 24 | +| 32 | 256 | 63.08 | 1.000 | 207.7 | 2670 | 3.29 | 63 | 26e83a65f519c865 | yes | 1024 of 1024 | 10.075, 10.240, 0.165 | 29 | 24 | +| 128 | 1024 | 63.08 | 1.000 | 212.7 | 2670 | 3.37 | 64 | 42223c2113188335 | yes | 1024 of 1024 | 10.183, 11.326, 1.142 | 32 | 24 | +| 512 | 4096 | 63.08 | 1.000 | 215.9 | 2670 | 3.42 | 61 | 02b7002d747f3711 | yes | 1024 of 1024 | 9.887, 14.276, 4.389 | 36 | 24 | diff --git a/proto-newpow/mma-shadow/out/verify_0.log b/proto-newpow/mma-shadow/out/verify_0.log new file mode 100644 index 000000000..b029cb014 --- /dev/null +++ b/proto-newpow/mma-shadow/out/verify_0.log @@ -0,0 +1,8 @@ +cache: host fill 528.5 ms, FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +self-test R=0 vector base 0: PASS (0 lanes differ) +self-test R=0 vector base 4096: PASS (0 lanes differ) +self-test R=0 vector base 1000000: PASS (0 lanes differ) +dump: 1024 lines, 32 units, R = 0 (0 mm8 per hash) +1024 of 1024 lanes equal (PASS) [10.152 ms per unit during the check] +verifier: 10.179 ms per unit at R=0, 10.076 ms per unit at R=0, mm8 block delta -0.103 ms per unit (0.00 us per mm8 step), averaged over 32 units, one core +VERIFY R=0 equal=1024 of=1024 ms_r0=10.179 ms_r=10.076 delta=-0.103 diff --git a/proto-newpow/mma-shadow/out/verify_128.log b/proto-newpow/mma-shadow/out/verify_128.log new file mode 100644 index 000000000..162eb6a14 --- /dev/null +++ b/proto-newpow/mma-shadow/out/verify_128.log @@ -0,0 +1,5 @@ +cache: host fill 533.2 ms, FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +dump: 1024 lines, 32 units, R = 128 (1024 mm8 per hash) +1024 of 1024 lanes equal (PASS) [11.349 ms per unit during the check] +verifier: 10.183 ms per unit at R=0, 11.326 ms per unit at R=128, mm8 block delta 1.142 ms per unit (1.12 us per mm8 step), averaged over 32 units, one core +VERIFY R=128 equal=1024 of=1024 ms_r0=10.183 ms_r=11.326 delta=1.142 diff --git a/proto-newpow/mma-shadow/out/verify_32.log b/proto-newpow/mma-shadow/out/verify_32.log new file mode 100644 index 000000000..cf2278236 --- /dev/null +++ b/proto-newpow/mma-shadow/out/verify_32.log @@ -0,0 +1,5 @@ +cache: host fill 535.4 ms, FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +dump: 1024 lines, 32 units, R = 32 (256 mm8 per hash) +1024 of 1024 lanes equal (PASS) [10.432 ms per unit during the check] +verifier: 10.075 ms per unit at R=0, 10.240 ms per unit at R=32, mm8 block delta 0.165 ms per unit (0.64 us per mm8 step), averaged over 32 units, one core +VERIFY R=32 equal=1024 of=1024 ms_r0=10.075 ms_r=10.240 delta=0.165 diff --git a/proto-newpow/mma-shadow/out/verify_512.log b/proto-newpow/mma-shadow/out/verify_512.log new file mode 100644 index 000000000..e48004725 --- /dev/null +++ b/proto-newpow/mma-shadow/out/verify_512.log @@ -0,0 +1,5 @@ +cache: host fill 530.6 ms, FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +dump: 1024 lines, 32 units, R = 512 (4096 mm8 per hash) +1024 of 1024 lanes equal (PASS) [14.440 ms per unit during the check] +verifier: 9.887 ms per unit at R=0, 14.276 ms per unit at R=512, mm8 block delta 4.389 ms per unit (1.07 us per mm8 step), averaged over 32 units, one core +VERIFY R=512 equal=1024 of=1024 ms_r0=9.887 ms_r=14.276 delta=4.389 diff --git a/proto-newpow/mma-shadow/out/verify_8.log b/proto-newpow/mma-shadow/out/verify_8.log new file mode 100644 index 000000000..cbc910d75 --- /dev/null +++ b/proto-newpow/mma-shadow/out/verify_8.log @@ -0,0 +1,5 @@ +cache: host fill 558.2 ms, FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +dump: 1024 lines, 32 units, R = 8 (64 mm8 per hash) +1024 of 1024 lanes equal (PASS) [10.106 ms per unit during the check] +verifier: 9.926 ms per unit at R=0, 9.974 ms per unit at R=8, mm8 block delta 0.048 ms per unit (0.74 us per mm8 step), averaged over 32 units, one core +VERIFY R=8 equal=1024 of=1024 ms_r0=9.926 ms_r=9.974 delta=0.048 diff --git a/proto-newpow/mma-shadow/program.h b/proto-newpow/mma-shadow/program.h new file mode 100644 index 000000000..22647af89 --- /dev/null +++ b/proto-newpow/mma-shadow/program.h @@ -0,0 +1,66 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Program metadata for host.cu plus the launch wrappers defined in kernel.cu. +// Also included by proto-opencl/host.c (C99), which defines IGNEUM_NO_CUDA first and reads only the macros. +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif +#ifndef IGNEUM_NO_CUDA +#include +#endif + +#define IGNEUM_SEED_STRING "igneum-genesis" +#define IGNEUM_SEED_BYTES_HEX "69676e65756d2d67656e65736973" +#define IGNEUM_GENERATOR 3 +#define IGNEUM_PROGRAM_ATTEMPT 0 +#define IGNEUM_PROGRAM_ID 0xe323b9dcaf283a6full +#define IGNEUM_DAY_STRING "2026-10-03" +#define IGNEUM_DAY_BYTES_HEX "6461792f323032362d31302d3033" +#define IGNEUM_DAY0 0x3067619fu +#define IGNEUM_DAY1 0x3c269176u +#define IGNEUM_DATASET_LOG2 28 +#define IGNEUM_MASK 0x0fffffffu +#define IGNEUM_LANES 32 +#define IGNEUM_ITERATIONS 8 +#define IGNEUM_INSTR_COUNT 64 +#define IGNEUM_LOADS_PER_HASH 128 +#define IGNEUM_WIDE_LOADS_PER_HASH 0 +#define IGNEUM_OP_MIX "load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1" +// Program class v3 (Counter ASIC 2.0, docs/plans/counter-asic-2-rollout.md): generator version 3; a worker that +// runs another class refuses this pack, and a job line names the class it wants (class=v3 era=). +#define IGNEUM_PROGRAM_CLASS "v3" +// Class v3 construction (Counter ASIC 2.0, 5 October 2026, docs/plans/mixer-x4.md): version 2 loads; the dataset item +// derivation applies the mixer IGNEUM_MIXER_MULT times per round (memhard.h), and the cache follows the growth rule. +#define IGNEUM_LOAD_CLASS "mx8" +#define IGNEUM_CLASS_MIXER_MULT 8 +#define IGNEUM_CACHE_GROWTH 1 // 1: cache words = 2^(26 + doublings(day)), doublings = floor(log2(1 + day / 1460)) +#define IGNEUM_LOAD_SLOTS 16 +#define IGNEUM_LOAD_MIX { 100, 0, 0 } +#define IGNEUM_LOAD_WIDTH_COUNTS { 16, 0, 0 } // loads of 4, 16, 64 bytes per program +#define IGNEUM_BYTES_PER_HASH 512 +#define IGNEUM_FOLD_ROT 11 +#define IGNEUM_FOLD_MUL 0x9e3779b1u +// 0 = closed-form dataset (ds_elem), 1 = memory-hard cache construction (MEMHARD.md, memhard.h) +#define IGNEUM_DATASET_MODE 1 + +#define IGNEUM_SEEDW_INIT { 0x67a9a7beu, 0x1a155b25u, 0xfddfb732u, 0x4b5af2e8u, 0xc55caf33u, 0xa27c13b7u, 0x06628a48u, 0x03852469u } +#define IGNEUM_KEY_INIT { 0x3067619fu, 0x3c269176u, 0x84a03b03u, 0xf8c63294u, 0xff977c5bu, 0xe60def3eu, 0x63630141u, 0xb8fbcb58u } +#define IGNEUM_CACHE_LOG2_WORDS 26 +#define IGNEUM_CACHE_SEGMENT_LOG2_LINES 6 +#define IGNEUM_CACHE_SEGMENTS 65536u +#define IGNEUM_ITEM_ROUNDS 8 +#define IGNEUM_MIXER_MULT 8 // mixer applications per round and after the last read (class v3, docs/plans/mixer-x4.md) +#define IGNEUM_MIX_ROT_INIT { 20u, 20u, 19u, 4u, 26u, 3u, 3u, 27u } +#define IGNEUM_MIX_MUL_INIT { 0x42146205u, 0x52cbe0fbu, 0x7ecf4a03u, 0x6728907fu, 0xd81d9751u, 0x132952c3u, 0xf60de277u, 0x05358035u, 0xbaf6499du, 0xe4db9667u, 0x3e98f45du, 0xd0004eddu, 0x2691630du, 0x9beb3bcfu, 0xab310379u, 0x99cfb423u } +#define IGNEUM_MIX_RC_INIT { 0xbab68293u, 0xcc162340u, 0x6ce151ccu, 0xe62b8997u, 0xc9c80297u, 0xf74a1654u, 0x3d704af5u, 0x3cf522b7u, 0x2b9cac04u, 0xa880ac10u, 0x13e5dd1du, 0x6fc3e233u, 0x2d83eeacu, 0x9006e8bfu, 0x2c4b5362u, 0x31b49ee2u } + +#ifndef IGNEUM_NO_CUDA +// Defined in kernel.cu. All launch on the default stream and return cudaGetLastError(). +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments); +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems); +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps); +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps); +#endif diff --git a/proto-newpow/mma-shadow/ref_program.inc b/proto-newpow/mma-shadow/ref_program.inc new file mode 100644 index 000000000..c110a34cb --- /dev/null +++ b/proto-newpow/mma-shadow/ref_program.inc @@ -0,0 +1,74 @@ +// Generated by gen_ref_program.py from the pack's kernel.cu. Do not edit by hand. +// Expects: uint32_t R[8][32], T[32], SEL[32]; const uint32_t* cache; uint32_t mask; macro L = for (int l = 0; l < 32; ++l). + L { R[2][l] = R[3][l] * R[4][l] + R[2][l]; } // 0 mad + L { R[2][l] = R[1][l] * R[1][l] + R[2][l]; } // 1 mad + L { R[2][l] = R[3][l] * R[2][l] + R[2][l]; } // 2 mad + L { R[3][l] = R[3][l] ^ R[5][l]; } // 3 xor + L { R[7][l] = R[7][l] ^ mh_word(cache, R[2][l] & mask); } // 4 load + L { R[5][l] = R[5][l] ^ mh_word(cache, R[7][l] & mask); } // 5 load + memcpy(T, R[4], sizeof T); + L { R[1][l] = R[1][l] ^ T[l ^ 8]; } // 6 shfl + memcpy(T, R[3], sizeof T); + L { R[7][l] = R[7][l] ^ T[l ^ 8]; } // 7 shfl + L { R[1][l] = umulhi(R[1][l], R[5][l]); } // 8 mulhi + L { R[6][l] = rotr_var(R[6][l], R[3][l]); } // 9 rotr + L { R[3][l] = R[3][l] | R[4][l]; } // 10 or + L { R[4][l] = R[4][l] ^ mh_word(cache, R[3][l] & mask); } // 11 load + L { R[0][l] = umulhi(R[0][l], R[4][l]); } // 12 mulhi + L { R[5][l] = R[5][l] + R[1][l] + ((((SEL[l] >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); } // 13 add + L { R[0][l] = R[0][l] ^ mh_word(cache, R[4][l] & mask); } // 14 load + L { R[2][l] = R[2][l] - R[4][l]; } // 15 sub + L { R[2][l] = R[2][l] ^ mh_word(cache, R[0][l] & mask); } // 16 load + L { R[7][l] = R[7][l] ^ mh_word(cache, R[2][l] & mask); } // 17 load + memcpy(T, R[3], sizeof T); + L { R[7][l] = R[7][l] ^ T[l ^ 4]; } // 18 shfl + L { R[5][l] = R[5][l] * R[0][l]; } // 19 mul + memcpy(T, R[4], sizeof T); + L { R[3][l] = R[3][l] ^ T[l ^ 2]; } // 20 shfl + memcpy(T, R[4], sizeof T); + L { R[2][l] = R[2][l] ^ T[l ^ 16]; } // 21 shfl + L { R[6][l] = umulhi(R[6][l], R[2][l]); } // 22 mulhi + L { R[6][l] = R[6][l] ^ mh_word(cache, R[1][l] & mask); } // 23 load + L { R[5][l] = R[5][l] * R[0][l]; } // 24 mul + L { R[5][l] = rotl_imm(R[5][l], 19u); } // 25 rotl + memcpy(T, R[6], sizeof T); + L { R[7][l] = R[7][l] ^ T[l ^ 2]; } // 26 shfl + L { R[0][l] = R[0][l] ^ R[5][l]; } // 27 xor + L { R[0][l] = R[0][l] ^ R[4][l]; } // 28 xor + L { R[3][l] = R[3][l] - R[0][l]; } // 29 sub + L { R[5][l] = R[5][l] * R[1][l]; } // 30 mul + L { R[7][l] = R[7][l] ^ mh_word(cache, R[2][l] & mask); } // 31 load + L { R[1][l] = R[1][l] ^ mh_word(cache, R[0][l] & mask); } // 32 load + L { R[5][l] = R[5][l] ^ R[6][l]; } // 33 xor + L { R[5][l] = R[5][l] ^ mh_word(cache, R[1][l] & mask); } // 34 load + L { R[0][l] = umulhi(R[0][l], R[5][l]); } // 35 mulhi + memcpy(T, R[2], sizeof T); + L { R[5][l] = R[5][l] ^ T[l ^ 4]; } // 36 shfl + L { R[7][l] = R[7][l] ^ mh_word(cache, R[0][l] & mask); } // 37 load + L { R[3][l] = R[3][l] + R[1][l] + ((((SEL[l] >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); } // 38 add + memcpy(T, R[5], sizeof T); + L { R[1][l] = R[1][l] ^ T[l ^ 4]; } // 39 shfl + L { R[2][l] = R[2][l] ^ R[5][l]; } // 40 xor + L { R[3][l] = R[6][l] * R[3][l] + R[3][l]; } // 41 mad + L { R[6][l] = R[6][l] - R[7][l]; } // 42 sub + L { R[7][l] = R[7][l] ^ R[0][l]; } // 43 xor + L { R[1][l] = R[1][l] ^ mh_word(cache, R[7][l] & mask); } // 44 load + L { R[2][l] = R[2][l] * R[3][l]; } // 45 mul + L { R[1][l] = umulhi(R[1][l], R[5][l]); } // 46 mulhi + L { R[4][l] = R[4][l] - R[3][l]; } // 47 sub + L { R[2][l] = rotr_var(R[2][l], R[6][l]); } // 48 rotr + L { R[3][l] = R[3][l] ^ mh_word(cache, R[5][l] & mask); } // 49 load + L { R[1][l] = R[1][l] + R[5][l] + ((((SEL[l] >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); } // 50 add + L { R[0][l] = R[0][l] * R[2][l]; } // 51 mul + L { R[0][l] = R[0][l] + R[2][l] + ((((SEL[l] >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); } // 52 add + L { R[1][l] = R[1][l] + R[0][l] + ((((SEL[l] >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); } // 53 add + L { R[7][l] = rotl_imm(R[7][l], 14u); } // 54 rotl + L { R[3][l] = R[3][l] + R[7][l] + ((((SEL[l] >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); } // 55 add + L { R[6][l] = R[6][l] ^ mh_word(cache, R[7][l] & mask); } // 56 load + L { R[1][l] = rotr_var(R[1][l], R[5][l]); } // 57 rotr + L { R[5][l] = R[5][l] ^ mh_word(cache, R[4][l] & mask); } // 58 load + L { R[6][l] = R[6][l] ^ mh_word(cache, R[2][l] & mask); } // 59 load + L { R[3][l] = R[5][l] * R[0][l] + R[3][l]; } // 60 mad + L { R[5][l] = R[5][l] + R[7][l] + ((((SEL[l] >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); } // 61 add + L { R[4][l] = R[4][l] + R[6][l] + ((((SEL[l] >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); } // 62 add + L { R[5][l] = rotl_imm(R[5][l], 19u); } // 63 rotl diff --git a/proto-newpow/mma-shadow/run.sh b/proto-newpow/mma-shadow/run.sh new file mode 100755 index 000000000..ac6170210 --- /dev/null +++ b/proto-newpow/mma-shadow/run.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# run.sh (proto-newpow/mma-shadow): build and measure the ladder R in {0, 8, 32, 128, 512} on the GPU box. +# Runs under /root/horizon-newpow/mma-shadow. Every artefact lands in ./out/. +set -u +export PATH=/usr/local/cuda/bin:$PATH +cd "$(dirname "$0")" +LADDER="${LADDER:-0 8 32 128 512}" +SUSTAIN="${SUSTAIN:-25}" # seconds of sustained hashing for the power meter (mean taken after the first 10 s) +mkdir -p out +echo "== $(date -u) host $(hostname) ==" | tee out/run.log +nvidia-smi --query-gpu=name,driver_version,power.draw,clocks.sm,temperature.gpu --format=csv | tee -a out/run.log +echo "idle baseline (5 samples):" | tee -a out/run.log +nvidia-smi --query-gpu=power.draw,clocks.sm,temperature.gpu,utilization.gpu --format=csv,noheader -l 1 > out/power_idle.csv & P=$!; sleep 5; kill $P 2>/dev/null; wait $P 2>/dev/null; cat out/power_idle.csv | tee -a out/run.log + +echo "== build verify_ref (gcc -O2)" | tee -a out/run.log +gcc -O2 -o verify_ref verify_ref.c 2>&1 | tee -a out/run.log + +for R in $LADDER; do + echo "== R=$R: build bench_$R (PTX path) and bench_${R}_ref" | tee -a out/run.log + nvcc -O3 -std=c++17 -arch=sm_89 -DIGNEUM_MM8_R=$R -Xptxas -v -o bench_$R bench.cu kernel_mm8.cu 2> out/ptxas_$R.txt || { echo "BUILD FAILED bench_$R"; cat out/ptxas_$R.txt; continue; } + grep -A2 "igneum_hash" out/ptxas_$R.txt | grep -i "registers\|spill" | tee -a out/run.log + nvcc -O3 -std=c++17 -arch=sm_89 -DIGNEUM_MM8_R=$R -DIGNEUM_MM8_REF -Xptxas -v -o bench_${R}_ref bench.cu kernel_mm8.cu 2> out/ptxas_${R}_ref.txt || { echo "BUILD FAILED bench_${R}_ref"; cat out/ptxas_${R}_ref.txt; } + + echo "== R=$R: timed run with power sampling" | tee -a out/run.log + nvidia-smi --query-gpu=power.draw,clocks.sm,temperature.gpu,utilization.gpu,timestamp --format=csv,noheader -l 1 > out/power_$R.csv & + SMI=$! + ./bench_$R --batches 10 --sustain $SUSTAIN --dump out/dump_$R.txt 32 > out/bench_$R.log 2>&1 + kill $SMI 2>/dev/null; wait $SMI 2>/dev/null + grep -E "igneum_hash_info|cache check|dataset self-test|verify warp|fingerprint|timed:|sustain end|SUMMARY|OVERALL|dump:" out/bench_$R.log | tee -a out/run.log + + echo "== R=$R: reference path fingerprint" | tee -a out/run.log + ./bench_${R}_ref --fingerprint-only --no-host-cache > out/bench_${R}_ref.log 2>&1 + grep -E "fingerprint|OVERALL" out/bench_${R}_ref.log | tee -a out/run.log + FP=$(grep -oE "fingerprint: [0-9a-f]{16}" out/bench_$R.log | cut -d' ' -f2) + FPR=$(grep -oE "fingerprint: [0-9a-f]{16}" out/bench_${R}_ref.log | cut -d' ' -f2) + if [ -n "$FP" ] && [ "$FP" = "$FPR" ]; then echo "FPCHECK R=$R PTX == ref: yes ($FP)" | tee -a out/run.log; else echo "FPCHECK R=$R PTX == ref: NO (ptx $FP ref $FPR)" | tee -a out/run.log; fi + + echo "== R=$R: CPU reference on the 32-warp dump (taskset -c 2)" | tee -a out/run.log + taskset -c 2 ./verify_ref out/dump_$R.txt $R --time $( [ "$R" = "0" ] && echo --self-test ) > out/verify_$R.log 2>&1 + grep -E "self-test|lanes equal|first mismatch|verifier:|VERIFY" out/verify_$R.log | tee -a out/run.log +done +echo "== $(date -u) done" | tee -a out/run.log +python3 summarise.py | tee out/results.md diff --git a/proto-newpow/mma-shadow/summarise.py b/proto-newpow/mma-shadow/summarise.py new file mode 100644 index 000000000..7043a3230 --- /dev/null +++ b/proto-newpow/mma-shadow/summarise.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# summarise.py: builds the RESULTS table from out/*.log and out/power_*.csv (run by run.sh on the box). +import re, glob, os +from datetime import datetime +rows = [] +def grab(pat, text, default=None): + m = re.search(pat, text); return m.group(1) if m else default +def power_mean(R, log): + try: + s0 = float(grab(r"sustain start epoch ([0-9.]+)", log)); s1 = float(grab(r"sustain end epoch ([0-9.]+)", log)) + except Exception: + return None, None, None + pw, clk, tmp = [], [], [] + for line in open("out/power_%s.csv" % R): + parts = [p.strip() for p in line.split(",")] + if len(parts) < 5: continue + try: + ts = datetime.strptime(parts[4], "%Y/%m/%d %H:%M:%S.%f").timestamp() + except Exception: + continue + if ts >= s0 + 10 and ts <= s1: + pw.append(float(parts[0].split()[0])); clk.append(float(parts[1].split()[0])); tmp.append(float(parts[2].split()[0])) + if not pw: return None, None, None + return sum(pw) / len(pw), sum(clk) / len(clk), max(tmp) +base_mhs = None +out = ["| R | mm8/hash | MH/s (GPU) | ratio to R=0 | W mean | SM MHz | uJ/hash | max C | fingerprint | PTX == ref | CPU == GPU | verifier ms/unit (R=0, R, delta) | regs | blocks/SM |", "|---|---|---|---|---|---|---|---|---|---|---|---|---|---|"] +for Rs in sorted([int(os.path.basename(p)[6:-4]) for p in glob.glob("out/bench_*.log") if "_ref" not in p]): + log = open("out/bench_%d.log" % Rs).read() + summ = grab(r"(SUMMARY.*)", log, "") + mhs = float(grab(r"mhs=([0-9.]+)", summ, "0")); regs = grab(r"regs=(\d+)", summ, "?"); bps = grab(r"blocksPerSM=(\d+)", summ, "?") + fp = grab(r"fingerprint=([0-9a-f]{16})", summ, "?") + if Rs == 0: base_mhs = mhs + ratio = ("%.3f" % (mhs / base_mhs)) if base_mhs else "?" + runlog = open("out/run.log").read() + fpc = grab(r"FPCHECK R=%d PTX == ref: (\S+)" % Rs, runlog, "?") + ver = open("out/verify_%d.log" % Rs).read() if os.path.exists("out/verify_%d.log" % Rs) else "" + vs = grab(r"(VERIFY.*)", ver, "") + eq = grab(r"equal=(\d+)", vs, "?"); of = grab(r"of=(\d+)", vs, "?") + ms0 = grab(r"ms_r0=([0-9.]+)", vs, "?"); msr = grab(r"ms_r=([0-9.]+)", vs, "?"); dl = grab(r"delta=([0-9.-]+)", vs, "?") + w, clk, tmx = power_mean(Rs, log) + uj = ("%.2f" % (w / (mhs * 1e6) * 1e6)) if (w and mhs) else "?" + out.append("| %d | %d | %.2f | %s | %s | %s | %s | %s | %s | %s | %s of %s | %s, %s, %s | %s | %s |" % ( + Rs, 8 * Rs, mhs, ratio, ("%.1f" % w) if w else "?", ("%.0f" % clk) if clk else "?", uj, ("%.0f" % tmx) if tmx else "?", + fp, fpc, eq, of, ms0, msr, dl, regs, bps)) +print("\n".join(out)) diff --git a/proto-newpow/mma-shadow/vectors.h b/proto-newpow/mma-shadow/vectors.h new file mode 100644 index 000000000..caadb5e25 --- /dev/null +++ b/proto-newpow/mma-shadow/vectors.h @@ -0,0 +1,57 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Expected outputs: igneum-pow (Rust) CPU interpreter, generator v3, memory-hard dataset +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif + +#define IGNEUM_VEC_WARPS 3 +static const uint32_t IGNEUM_VEC_BASE[IGNEUM_VEC_WARPS] = { 0u, 4096u, 1000000u }; +static const uint64_t IGNEUM_VEC_OUT[IGNEUM_VEC_WARPS][32] = { + { // base nonce 0 + 0x19b56348bc85304dull, 0xb08a9cfb44aa720full, 0xe1f8f627f780eff7ull, 0x2ff3e86ff1696161ull, 0xb65e0578c257e8acull, 0xf37b5705c2bebaaeull, 0xb19fef670982389eull, 0x2374331b28827a11ull, + 0xf492cdd05dda7f88ull, 0x37700f1385e19885ull, 0xa27524f3010b3e87ull, 0x6c8a24de8b938c43ull, 0x3dc017c8820cfd16ull, 0x5c80d37146657b68ull, 0x214082cac03f734aull, 0x1d67c665145d72f3ull, + 0x9fb0ae736eb87ff5ull, 0xcd7d416ae3a6be61ull, 0x0069cda85c6de58full, 0x0b7d82e717224baaull, 0x600960f6d7be30f0ull, 0xeb29032663b0c4d2ull, 0xf29583a5766408f1ull, 0x6c9532a99ad7314dull, + 0x9a949fd0959cc80full, 0xa20258520e7f6c25ull, 0xf2ab11f9bb032e38ull, 0xcc967bcd0c8d07c1ull, 0x37745267bb3231f2ull, 0x35a046048c2b69b3ull, 0xaa51834cd3f364f3ull, 0x359192708e4f754aull + }, + { // base nonce 4096 + 0x62fb132a9943127aull, 0x0b703e577e7f4ecaull, 0xf9f24f5522ce7593ull, 0x3cf5c516abc4332aull, 0xd25523f5f6d7a127ull, 0xd2081a002f983682ull, 0xbf46c54e9b3c4254ull, 0xca362e291e5e5f4dull, + 0x6039712f10f457a3ull, 0x8a34b7cabf97c23bull, 0xa473c6a2e0bf59bcull, 0x6cf3926513a4b069ull, 0x297ec2998376a40dull, 0x8efd7f601a8f28dbull, 0x8e72532dfdc1e544ull, 0x917c2b2ebe2a7e00ull, + 0x923fbb2d2f635c25ull, 0xce864ea5c0dedad9ull, 0x4b8ec7e874e446efull, 0x1b69b69465449196ull, 0x5ef3a8a6edb369cfull, 0x06c263ef9ce63fc4ull, 0x9c2048fd9d9e2639ull, 0x457fdd96ca4a138eull, + 0xd1904018b8d7b6e3ull, 0x8682312fb2e96ab8ull, 0xdc3257e0d0f979a5ull, 0xa51b0a8519d87db5ull, 0x334f08ec056e618bull, 0x3464ce71dc65119dull, 0x6a4d6df066332e04ull, 0x7d7866cb9cfca8ffull + }, + { // base nonce 1000000 + 0x86b6cb0e13d89b03ull, 0x96299a3f19d7ef15ull, 0x67d2c55100d2f876ull, 0x0a4dfe97d671b728ull, 0x41e4489014d42595ull, 0xf11cb1958c0c0e82ull, 0xf8b70b0c0a03175full, 0x632299df87d5063eull, + 0xe198417776130492ull, 0x8ffc5449290d7be2ull, 0x5f2e264eb1311f1bull, 0x988376463ac88586ull, 0x83969eadda489c26ull, 0xbed0a2c3f255d306ull, 0x1a949d271961a819ull, 0x5bce06eb6984725cull, + 0x94d5d6a1b0ffd4e9ull, 0xf3c78bae6c2182b4ull, 0xb97e9fe1bbfcdd55ull, 0x70262d1d4c0eccb2ull, 0x1fc93b427dba28d9ull, 0x02b2e3c4317f2a2dull, 0x54d3d42a588edcb9ull, 0x79998677846e7cceull, + 0x486522a5425f821aull, 0x95fa88e933360e52ull, 0xc8bae2da2b883f6cull, 0xbe3eb610ad33614full, 0x20efb3c4de82907full, 0xd6b650cfedfb26b7ull, 0x8c24447a646dba26ull, 0x9c004678515e44ecull + } +}; + +// Dataset self-test: dataset[0..15] and dataset[IGNEUM_MASK] (268435455). +static const uint32_t IGNEUM_DS_HEAD[16] = { + 0xfdad4319u, 0x1a7b68e1u, 0xde6db608u, 0x13d73892u, 0xd17f447au, 0xb2221ccfu, 0x9db004bdu, 0x57d7d367u, + 0xdbc4cf34u, 0x697c009au, 0xc43af1d4u, 0x97f12b2eu, 0x74c37cd0u, 0xc651ea15u, 0x665a6d29u, 0x22330a2du +}; +static const uint32_t IGNEUM_DS_LAST_INDEX = 268435455u; +static const uint32_t IGNEUM_DS_LAST = 0xa83e7aa6u; +// 64 sampled dataset words (index, value) computed on the Mac. +#define IGNEUM_DS_SAMPLES 64 +static const uint32_t IGNEUM_DS_SAMPLE_INDEX[IGNEUM_DS_SAMPLES] = { + 59471966u, 217795994u, 208353206u, 42483309u, 172547758u, 148076330u, 183853158u, 214389424u, 267488061u, 169781097u, 184093494u, 153880993u, 84977930u, 46426879u, 3093825u, 225364072u, 44593546u, 260713159u, 168250303u, 52384140u, 223401610u, 45554030u, 95410555u, 175039924u, 79171087u, 267580473u, 24168642u, 37981670u, 171551130u, 195559979u, 204611762u, 140997658u, 138925853u, 86637313u, 20736778u, 219665210u, 160430336u, 264654675u, 8013395u, 228945585u, 213884386u, 104419827u, 44185464u, 142737231u, 99284897u, 132475900u, 61861762u, 132056166u, 262388043u, 91878046u, 117353561u, 124768597u, 71352993u, 190698941u, 46055428u, 55281366u, 165145231u, 106810753u, 171985651u, 232085256u, 159510492u, 40072060u, 209107596u, 39023794u +}; +static const uint32_t IGNEUM_DS_SAMPLE_VALUE[IGNEUM_DS_SAMPLES] = { + 0x3230bc7bu, 0x7fbfe2c9u, 0xb2690991u, 0x1745c7c5u, 0x0ab0ccafu, 0x1bf87d6bu, 0x160139fdu, 0x719817acu, 0x0155df4bu, 0xbe1e86c3u, 0x680bcd6cu, 0x79c3dc6cu, 0x181e7e5fu, 0x0713a109u, 0xc705dd9fu, 0x3933b7a8u, 0xdd1c0431u, 0x50522b30u, 0xa0020b38u, 0xbff39e96u, 0x21b67e18u, 0x740f8db3u, 0x2baba568u, 0x2c9bef83u, 0x0ad9b671u, 0xc4327869u, 0x7b4fd7d0u, 0x2c29965fu, 0xec56f15fu, 0x61111746u, 0x303a1d6eu, 0xbddcfd1au, 0xf829a355u, 0x6d5df2a9u, 0x01ab8e44u, 0x06d13507u, 0xda8dcfc6u, 0x01a703e1u, 0xafe7d2c1u, 0xc091c3a2u, 0xac1814feu, 0x6e6ff62au, 0x8fdf01bau, 0xdd3f7159u, 0xdfa0d75cu, 0x26684c35u, 0x7f441e63u, 0x88df2570u, 0x8aa4d5ebu, 0xcc816c05u, 0x434df890u, 0xcd392ad6u, 0x1ab4cb63u, 0x595926fau, 0x7cd76b41u, 0x20cb95c4u, 0x13cf823fu, 0xf9daf901u, 0xff9af40au, 0x2c7dfa51u, 0x871206dbu, 0x938c116cu, 0xb64bf199u, 0x5751f874u +}; +// Cache self-test (memory-hard mode): cache[0..15], the last 16 words, and FNV-1a 64 over all 2^26 words. +static const uint32_t IGNEUM_CACHE_HEAD[16] = { + 0x355a86d2u, 0x7957db1cu, 0xd21772afu, 0x6fc1e09bu, 0xd55ce61du, 0x6e6a278bu, 0xd3f543ceu, 0x223d8e82u, + 0x143ab337u, 0x2e9f05bdu, 0x2eb389bfu, 0x0c6e449eu, 0x5cfa4222u, 0xba6560feu, 0x8e3e1aa4u, 0xdbcc1d53u +}; +static const uint32_t IGNEUM_CACHE_LAST[16] = { + 0x41190d91u, 0xbd277957u, 0x22ddbb49u, 0x6986f207u, 0xdf69a4d6u, 0x26401a3au, 0x818230fbu, 0xc417122du, + 0x3597b211u, 0xb553ce55u, 0xcf39cc0du, 0x3b7fc43au, 0x3fd43b00u, 0x67e1c80eu, 0xffa7ea7du, 0xca2960abu +}; +static const uint64_t IGNEUM_CACHE_FNV64 = 0x48c4f5bf24166b2eull; diff --git a/proto-newpow/mma-shadow/verify_ref.c b/proto-newpow/mma-shadow/verify_ref.c new file mode 100644 index 000000000..9c67fdc83 --- /dev/null +++ b/proto-newpow/mma-shadow/verify_ref.c @@ -0,0 +1,152 @@ +// verify_ref.c (proto-newpow/mma-shadow): plain C CPU reference for the mx8+mm8xR prototype. +// Reads a bench --dump file (lines: base lane value_hex, 32 lanes per warp), recomputes every warp with a +// register-major 32-lane interpreter of the pack's program (ref_program.inc, generated from kernel.cu), lazy +// dataset words through memhard.h's mh_word over a host-filled 256 MiB cache, the mm8 block in the spec layout, +// then the fold. Prints "N of 1024 lanes equal" and the first mismatch, then times the verifier per 32-lane unit. +// Build: gcc -O2 -o verify_ref verify_ref.c Run: taskset -c 2 ./verify_ref dump.txt [--time] +#include +#include +#include +#include +#include +#define IGNEUM_NO_CUDA +#include "program.h" +#include "vectors.h" +#include "memhard.h" +#include "mm8_block.h" + +static const uint16_t MM8_TABLE[IGNEUM_MM8_R_MAX] = IGNEUM_MM8_TABLE_INIT; + +static uint32_t splitmix32(uint32_t x) { x ^= x >> 16; x *= 0x7feb352du; x ^= x >> 15; x *= 0x846ca68bu; x ^= x >> 16; return x; } +static uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +static uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +static uint32_t umulhi(uint32_t a, uint32_t b) { return (uint32_t)(((uint64_t)a * (uint64_t)b) >> 32); } +static double nowMs(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1e3 + ts.tv_nsec / 1e6; } + +#define L for (int l = 0; l < 32; ++l) + +// One mm8 step on the 32-lane register file (spec layout, identical to family-probe.cu's mm8 warp_ref): +// r[c] += C[l >> 2][2 * (l & 3)] (d0), r[c2] += C[l >> 2][2 * (l & 3) + 1] (d1). +static void mm8_step(uint32_t R[8][32], int a, int b, int c, int c2) { + uint32_t A[32], B[32]; + memcpy(A, R[a], sizeof A); + memcpy(B, R[b], sizeof B); + L { + int row = l >> 2, col0 = 2 * (l & 3); + uint32_t acc0 = 0u, acc1 = 0u; + for (int k = 0; k < 16; ++k) { + uint32_t av = (A[row * 4 + k / 4] >> (8 * (k % 4))) & 0xffu; + acc0 += av * ((B[col0 * 4 + k / 4] >> (8 * (k % 4))) & 0xffu); + acc1 += av * ((B[(col0 + 1) * 4 + k / 4] >> (8 * (k % 4))) & 0xffu); + } + R[c][l] += acc0; + R[c2][l] += acc1; + } +} + +static void hash_unit(const uint32_t* cache, uint32_t base, int Rsteps, uint64_t out[32]) { + static const uint32_t SEEDW[8] = IGNEUM_SEEDW_INIT; + uint32_t R[8][32], T[32], SEL[32]; + const uint32_t mask = IGNEUM_MASK; + L { + uint32_t nonce = base + (uint32_t)l; + for (int i = 0; i < 8; ++i) { + uint32_t x = nonce ^ SEEDW[i]; x += 0x9e3779b9u * (uint32_t)(i + 1); x = splitmix32(x); + R[i][l] = x ^ SEEDW[(i + 1) & 7]; + } + } + for (int it = 0; it < 8; ++it) { + L { SEL[l] = R[0][l]; } +#include "ref_program.inc" + for (int k = 0; k < Rsteps; ++k) { + uint16_t v = MM8_TABLE[k]; + mm8_step(R, v & 7, (v >> 3) & 7, (v >> 6) & 7, (v >> 9) & 7); + } + } + L { + uint32_t lo = R[0][l] ^ rotl_imm(R[1][l], 7u) ^ rotl_imm(R[2][l], 14u) ^ rotl_imm(R[3][l], 21u); + uint32_t hi = R[4][l] ^ rotl_imm(R[5][l], 9u) ^ rotl_imm(R[6][l], 18u) ^ rotl_imm(R[7][l], 27u); + out[l] = ((uint64_t)hi << 32) | (uint64_t)lo; + } +} + +static uint64_t fnv1a64(const void* p, size_t n) { + const uint8_t* b = (const uint8_t*)p; uint64_t h = 0xcbf29ce484222325ull; + for (size_t i = 0; i < n; ++i) { h ^= b[i]; h *= 0x100000001b3ull; } + return h; +} + +int main(int argc, char** argv) { + if (argc < 3) { printf("usage: verify_ref [--time] [--self-test]\n"); return 2; } + const char* path = argv[1]; + int Rsteps = atoi(argv[2]); + int doTime = 0, selfTest = 0; + for (int i = 3; i < argc; ++i) { if (!strcmp(argv[i], "--time")) doTime = 1; if (!strcmp(argv[i], "--self-test")) selfTest = 1; } + if (Rsteps < 0 || Rsteps > IGNEUM_MM8_R_MAX) { printf("R out of range\n"); return 2; } + + size_t words = (size_t)1u << IGNEUM_CACHE_LOG2_WORDS; + uint32_t* cache = (uint32_t*)malloc(words * 4u); + if (!cache) { printf("no memory for the cache\n"); return 2; } + double c0 = nowMs(); + for (uint32_t seg = 0; seg < IGNEUM_CACHE_SEGMENTS; ++seg) mh_cache_segment(cache, seg); + double c1 = nowMs(); + uint64_t fnv = fnv1a64(cache, words * 4u); + printf("cache: host fill %.1f ms, FNV-1a 64 %016llx vs Mac %016llx %s\n", c1 - c0, (unsigned long long)fnv, + (unsigned long long)IGNEUM_CACHE_FNV64, fnv == IGNEUM_CACHE_FNV64 ? "PASS" : "FAIL"); + if (fnv != IGNEUM_CACHE_FNV64) return 1; + + if (selfTest) { // R = 0 interpreter against the pack's vectors + int ok = 1; + for (int w = 0; w < IGNEUM_VEC_WARPS; ++w) { + uint64_t out[32]; hash_unit(cache, IGNEUM_VEC_BASE[w], 0, out); + int bad = 0; L { if (out[l] != IGNEUM_VEC_OUT[w][l]) ++bad; } + printf("self-test R=0 vector base %u: %s (%d lanes differ)\n", IGNEUM_VEC_BASE[w], bad ? "FAIL" : "PASS", bad); + ok = ok && !bad; + } + if (!ok) return 1; + } + + // Read the dump: 32 consecutive lines per warp, same base + FILE* f = fopen(path, "r"); + if (!f) { printf("cannot open %s\n", path); return 2; } + uint32_t* bases = NULL; uint64_t* vals = NULL; size_t n = 0, cap = 0; + unsigned base; int lane; unsigned long long v; + while (fscanf(f, "%u %d %llx", &base, &lane, &v) == 3) { + if (n == cap) { cap = cap ? cap * 2 : 1024; bases = realloc(bases, cap * 4); vals = realloc(vals, cap * 8); } + bases[n] = base; vals[n] = v; ++n; + } + fclose(f); + if (n % 32 != 0) { printf("dump has %zu lines, not a multiple of 32\n", n); return 2; } + size_t units = n / 32; + printf("dump: %zu lines, %zu units, R = %d (%d mm8 per hash)\n", n, units, Rsteps, 8 * Rsteps); + + size_t equal = 0; int firstPrinted = 0; + double v0 = nowMs(); + for (size_t u = 0; u < units; ++u) { + uint64_t out[32]; hash_unit(cache, bases[u * 32], Rsteps, out); + L { + if (out[l] == vals[u * 32 + l]) ++equal; + else if (!firstPrinted) { firstPrinted = 1; printf("first mismatch: base %u lane %d: cpu %016llx gpu %016llx\n", bases[u * 32], l, (unsigned long long)out[l], (unsigned long long)vals[u * 32 + l]); } + } + } + double v1 = nowMs(); + printf("%zu of %zu lanes equal (%s) [%.3f ms per unit during the check]\n", equal, n, equal == n ? "PASS" : "FAIL", (v1 - v0) / units); + + if (doTime) { + int Rs[2] = { 0, Rsteps }; double ms[2] = { 0, 0 }; + for (int t = 0; t < 2; ++t) { + uint64_t out[32]; volatile uint64_t sink = 0; + hash_unit(cache, bases[0], Rs[t], out); // warm + double t0 = nowMs(); + for (size_t u = 0; u < units; ++u) { hash_unit(cache, bases[u * 32], Rs[t], out); sink ^= out[0]; } + double t1 = nowMs(); + ms[t] = (t1 - t0) / units; + (void)sink; + } + printf("verifier: %.3f ms per unit at R=0, %.3f ms per unit at R=%d, mm8 block delta %.3f ms per unit (%.2f us per mm8 step), averaged over %zu units, one core\n", + ms[0], ms[1], Rsteps, ms[1] - ms[0], Rsteps ? (ms[1] - ms[0]) * 1000.0 / (8.0 * Rsteps) : 0.0, units); + printf("VERIFY R=%d equal=%zu of=%zu ms_r0=%.3f ms_r=%.3f delta=%.3f\n", Rsteps, equal, n, ms[0], ms[1], ms[1] - ms[0]); + } + free(cache); free(bases); free(vals); + return equal == n ? 0 : 1; +} diff --git a/proto-newpow/state-dataset/README.md b/proto-newpow/state-dataset/README.md new file mode 100644 index 000000000..164ef9cfb --- /dev/null +++ b/proto-newpow/state-dataset/README.md @@ -0,0 +1,219 @@ +# state-dataset: the dataset commits to chain state (class "sd1") + +Horizon lane 8, new proof of work. Prototype and measurements, 6 October 2026, 19:34 to 19:50 UTC. +Everything here is a TEST HARNESS: no pool, no network, no wallet, nothing touches the devnet. + +## The scheme in one paragraph + +The hash kernel is unchanged. What changes is the daily dataset build. Today item t of the 1 GiB dataset is +`mh_item(cache, t)`: the 16-word state starts as `s[0..7] = K` (day key) and `s[8..15] = t * MUL[i] + RC[i]`, then +8 rounds of (8 mixers + one dependent 64-byte cache read XORed in), then 8 final mixers. Under sd1 a 64-byte STATE +LEAF for item t is XORed into those 16 initial words before the first mixer: `s[i] ^= leaf(t)[i]`. In the real design +leaf(t) is the t-th 64-byte leaf of a canonical serialisation of the chain's execution state at a certified checkpoint +20 minutes before the day boundary, zero padded where the state is shorter than the dataset. A miner therefore cannot +build the day's dataset without the state, and a verifier that holds no dataset needs leaf(t) for every item it +derives. The prototype measures what that costs (build time, device memory, verifier time) and buys (which leaves a +hash touches, and what a light client would have to be shown). + +### Leaf stand-in (synthetic, prototype only) + +`leaf(t) = mh_chacha_block(x)` (the pack's own ChaCha12 block from memhard.h) with +`x = (0x61707865, 0x3320646e, 0x79622d32, 0x6b206574, S[0..7], t, 0, 0x49676e65, 0x53746174)` and +`S[i] = K[i] ^ 0x5a5a5a5a` (stand-in state root). For the pack's day key +`S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102`. The leaf array is 2^24 items x 64 B = 1 GiB +for the pack's 1 GiB dataset (2^28 words = 2^24 items). Definition in `sd.h`. + +## Files + +| file | what | +|---|---| +| `kernel.cu`, `memhard.h`, `program.h`, `vectors.h` | the mx8-genesis pack, copied unmodified from `proto-cuda/packs-ca2-mixer/mx8-genesis/` | +| `sd.h` | `mh_leaf`, `mh_item_sd`, `mh_word_sd` (host and device, plain C compatible) | +| `kernel_sd.cu` | the pack's kernel.cu plus `igneum_leaves`, `igneum_build_sd` and their launch wrappers appended; `igneum_hash` byte for byte the pack's (checked with diff) | +| `bench.cu` | the harness: `--mode control|sd1`, `--dump `, `--items-out `, `--chunk-mib M`, `--power-seconds S` | +| `verify_sd.c` | plain C: host cache fill, item bit-exact check from the GPU's items file, 32-lane register-major interpreter of the program against the GPU's dump, lane-0 load trace, per-unit rows | +| `cpu_rows.c` | plain C: the igneum-build-1 rows B.1 and B.2 (OpenMP for the 32-thread row) | +| `run_gpu.sh`, `run_cpu.sh` | the exact commands, as run | +| `results/gpu/`, `results/cpu/` | every log, the dumps and the items files, copied back from the boxes | + +## Boxes + +- GPU box 2: NVIDIA GeForce RTX 4090, 24 GB (24083 MiB reported), 128 SMs, driver 595.91.07 (CUDA driver 13.2), nvcc 12.8.93, + `-arch=sm_89`, power limit 450 W, Ubuntu 24.04.1. Host CPU AMD EPYC 7352 (48 threads). A CPU-only pool daemon shares the + host (ports 4463/4480); the plain C rows there were pinned to core 2. Working directory `/root/horizon-newpow/state-dataset`. +- CPU box igneum-build-1: AMD EPYC 9454P (48 cores, 96 threads), 128 GB, gcc 13.3.0, L3 256 MiB. Shared with other agents' + builds: load average 19 to 32 during the readings (printed in each log). Rows pinned to core 4 under `nice -n 19`; the + 32-thread row on cores 4 to 35. Working directory `/srv/builds/horizon-newpow/state-dataset`. + +## Commands + +From the Mac (zsh; the GPU box has no rsync, tar over ssh instead): + +``` +cd /Users/joshm/Projects/igneum-wt-horizon/proto-newpow/state-dataset +COPYFILE_DISABLE=1 tar czf - --no-xattrs *.cu *.h *.c *.sh | ssh -i ~/.ssh/igneum-fleet -p root@ 'cd /root/horizon-newpow/state-dataset && tar xzf - && touch * && bash run_gpu.sh > run_gpu.log 2>&1' +COPYFILE_DISABLE=1 tar czf - --no-xattrs *.c *.h *.sh | ssh -i ~/.ssh/igneum_ed25519 build@188.40.146.49 'cd /srv/builds/horizon-newpow/state-dataset && tar xzf - && touch * && bash run_cpu.sh > run_cpu.log 2>&1' +``` + +On GPU box 2 (`run_gpu.sh`): + +``` +export PATH=/usr/local/cuda/bin:$PATH +nvcc -O3 -std=c++17 -arch=sm_89 -Xcompiler -pthread -o bench bench.cu kernel_sd.cu +gcc -O2 -std=c11 -o verify_sd verify_sd.c +./bench --mode control --batches 10 --items-out items_control.txt --dump dump_control.txt 4 --power-seconds 20 +./bench --mode sd1 --batches 10 --items-out items_sd1.txt --dump dump_sd1.txt 4 --power-seconds 20 +./bench --mode sd1 --batches 10 --power-seconds 0 --chunk-mib 64 +./bench --mode sd1 --batches 10 --power-seconds 0 --chunk-mib 256 +./bench --mode control --batches 10 --power-seconds 20 # second pass +./bench --mode sd1 --batches 10 --power-seconds 20 # second pass +taskset -c 2 ./verify_sd --mode control --items items_control.txt --dump dump_control.txt +taskset -c 2 ./verify_sd --mode sd1 --items items_sd1.txt --dump dump_sd1.txt +``` + +On igneum-build-1 (`run_cpu.sh`): + +``` +gcc -O2 -std=c11 -fopenmp -o cpu_rows cpu_rows.c +gcc -O2 -std=c11 -o verify_sd verify_sd.c +taskset -c 4 nice -n 19 ./cpu_rows --rows # B.1 (i)(ii)(iii) and the one-core B.2 rows, twice +taskset -c 4-35 nice -n 19 ./cpu_rows --leaves 32 # B.2 leaf array on 32 threads, twice +taskset -c 4 nice -n 19 ./verify_sd --mode sd1 # the per-unit rows of verify_sd.c on this CPU +``` + +Timing method: cache fill, leaf array and dataset build are CUDA-event times of the second of two launches (as +host.cu does). MH/s is CUDA-event time over 10 batches of 2^24 after a warm-up batch at base 0. Watts and SM MHz are +the mean of `nvidia-smi -l 1` samples taken after the first 10 s of a 20 s window in which the hash kernel runs back +to back (10 samples used of 22). Fingerprint = FNV-1a 64 over the 2^24 little-endian u64 outputs at base nonce 0, +the project's definition. + +## RESULTS + +### A. GPU, RTX 4090 (control vs sd1, two passes each) + +| row | control | sd1 | note | +|---|---|---|---| +| cache fill, GPU, second pass (ms) | 1.81, 1.85 | 1.85, 1.85 | 256 MiB, unchanged kernel | +| leaf array, GPU, second pass (ms) | none | 5.49, 5.49 | 2^24 ChaCha12 blocks, 1 GiB written at 195 GB/s | +| dataset build, second pass (ms) | 30.55, 30.55 | 31.98, 31.98 | +1.43 ms (+4.7%): one coalesced 64 B read per item | +| build + leaves (ms) | 30.55 | 37.47 | synthetic leaves; a real snapshot arrives from the node instead (see chunked rows) | +| the 3 Mac vectors, standalone and in batch | PASS, PASS | n/a (new values) | sd1 base 0 lane 0 = b600edbed969becc, base 4096 = a533e89c78bb6b74, base 1000000 = beb4cb0c6bab8163 | +| dataset head, word [MASK], 64 Mac samples | PASS | n/a (new values) | sd1 dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf | +| 64 random words vs host derivation | PASS (mh_word) | PASS (mh_word_sd) | | +| 2^24 fingerprint at base 0 | 7c28cfb06c5c65a9 (= the pack's, both passes) | d5b0c16390cad0e8 (new, four runs) | | +| hash rate, 10 batches of 2^24 (MH/s) | 63.083, 63.083 | 63.088, 63.087 | equal within 0.01%; the hash kernel is the same binary over a dataset of the same shape | +| hash rate in the 20 s power window (MH/s) | 63.078, 63.079 | 63.083, 63.083 | | +| watts, mean after 10 s | 207.6, 205.2 | 207.9, 206.5 | run to run noise 2 W | +| SM MHz, mem MHz | 2745, 10251 | 2745, 10251 | | +| MH/s per W | 0.304, 0.307 | 0.303, 0.305 | | +| hash kernel registers | 29 | 29 | 24 resident blocks/SM at 1 warp/block | + +Bit-exactness of the build (A.3): 1,024 random item indices (SplitMix64 seeded 0x5d1, `t = z & (2^24 - 1)`), the 16 GPU +words of each item against the host derivation in plain C on the box's CPU with the host-filled cache (65536 +`mh_cache_segment` calls, 380 ms in the bench, 573 to 587 ms pinned to core 2 in verify_sd): + +| check | control | sd1 | +|---|---|---| +| items equal, in-process (bench.cu, host mh_item / mh_item_sd) | 1024 of 1024 | 1024 of 1024 | +| items equal, plain C (verify_sd.c from the items file) | 1024 of 1024 | 1024 of 1024 | +| items equal after the chunked rebuild (64 MiB chunks; 256 MiB chunks) | n/a | 1024 of 1024; 1024 of 1024 | +| 64 device leaves vs host mh_leaf (incl. t = 0 and 2^24 - 1) | n/a | PASS | +| host cache FNV-1a 64 | 48c4f5bf24166b2e = Mac | 48c4f5bf24166b2e = Mac | + +GPU hash outputs vs the C interpreter (4 warps dumped, bases 0, 32, 64, 96; loads through mh_word / mh_word_sd): + +| | control | sd1 | +|---|---|---| +| lanes equal | 128 of 128 | 128 of 128 | +| interpreter vs the Mac vector at base 0 | 32 of 32 | n/a | +| interpreting time (4,096 item derivations per warp) | 37 ms | 42 ms | + +Device memory (A.4), cudaMemGetInfo, MiB used (context 395 included): + +| phase | control | sd1 resident leaves | sd1 chunked 64 MiB | sd1 chunked 256 MiB | +|---|---|---|---|---| +| during the build | 1675 | 2699 | 1741 | 1933 | +| while hashing (leaves freed) | 1803 | 1803 | 1803 | 1803 | +| chunked rebuild total, copies + builds, one stream (ms) | | | 75.80 | 75.47 | + +Whole-array host to device copy of the 1 GiB leaf array from pinned memory: 62 ms = 17.2 GB/s (this box's PCIe link +under load; device to host 55 ms). So the chunked build is PCIe-bound: 62 ms of copy plus the 32 ms build, partly +serialised on one stream, gives 76 ms. Two chunk buffers on two streams would hide most of the build under the copy +(not done; the kernel already takes an item range `[t0, t0 + n)` with the chunk's leaves at `leaves - 16 t0`, so +chunking needed no kernel change at all, only the loop in bench.cu). + +### B. CPU, igneum-build-1 (EPYC 9454P, one core pinned, nice 19), ms per unit of 4,096 items, 100 units + +Two readings, because the box is shared: reading 1 at load 19, reading 2 at load 31. + +| row | reading 1 | reading 2 | per item | +|---|---|---|---| +| (i) 4,096 random 64 B reads from a 2 GiB resident leaf array | 0.108 ms (min 0.092, max 0.172) | 0.163 ms | 26 to 40 ns | +| (i) the same from an 8 GiB array (the year-12 size) | 0.139 ms (min 0.127, max 0.183) | 0.209 ms | 34 to 51 ns | +| (ii) 4,096 leaves derived on the fly (one ChaCha12 block each, no array) | 0.284 ms | 0.285 ms | 69 ns | +| (iii) 4,096 x mh_item on the host cache, naive, no interleaving | 9.01 ms (min 8.91, max 9.60) | 11.24 ms (min 9.38, max 13.51) | 2.2 to 2.7 us | +| 4,096 x (leaf + mh_item_sd), naive | 9.31 ms | 11.64 ms | | + +The same rows on GPU box 2's EPYC 7352, core 2 (verify_sd.c): (ii) 0.369 to 0.374 ms, (iii) 10.14 to 10.21 ms, leaf + +mh_item_sd 10.56 to 10.58 ms. + +The project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent +cache misses across items; the naive (iii) figure here is an upper bound. The sd1 increment is the row that matters: +0.11 to 0.21 ms per unit when the verifier holds the 2 to 8 GiB state in RAM, or 0.28 ms when it derives the stand-in +leaf (in the real design it cannot derive a state leaf, it must hold the state or be shown it). Against the 2.06 ms +interleaved verifier that is +5% to +14%; against the naive 9 to 11 ms it is +1% to +3%. + +B.2, the daily snapshot build on CPU (igneum-build-1): + +| row | time | +|---|---| +| 1 GiB leaf array, 2^24 ChaCha12 blocks, one core | 1.670 s, 1.677 s (100 ns per leaf) | +| the same on 32 threads (OpenMP), second pass (first pass 0.172 s with page faults) | 0.073 s, 0.083 s | +| host cache fill, 256 MiB, one core | 0.447 s, 0.452 s (0.380 s on the 4090 box's host, unpinned; 0.57 s pinned beside the pool daemon) | + +B.3, the state sample a light client would check (lane 0 of warp base 0, from the instrumented interpreter): + +| | control | sd1 | +|---|---|---| +| distinct words touched by the 128 loads | 128 | 128 | +| distinct items touched | 128 of 2^24 | 128 of 2^24 | +| first 8 load words | 8528400 43034175 255822847 136709537 ... | 8528400 85793927 255822847 180392080 ... | + +Loads 1 and 3 share their address in both modes because their addresses are fixed by the nonce before any load's +value feeds back; from load 2 on the sd1 trail diverges. Merkle arithmetic for a 2 GiB state (2^25 leaves of 64 B, +depth 25, 32-byte hashes): 128 openings x 25 x 32 B = 102,400 B of siblings + 128 x 64 B = 8,192 B of leaves = +110,592 B (108 KiB) per lane, uncompressed; a 32-lane unit is 32 x 108 KiB = 3.4 MiB, before deduplicating shared +upper levels (128 random paths in a depth-25 tree share only their top seven levels, so dedup saves about 20% per lane, +approximate; across the 32 lanes of a unit the same seven levels are shared again). Every one of the 128 loads is a distinct item, so there is no saving from repeated items. + +## What the numbers mean, per tier (the consequences rule) + +- Hash rate, watts, MH/s per W: unchanged for every tier on every vendor, because the hash kernel is the pack's and the + dataset has the same shape. Nothing to do. +- Daily build: +1.4 ms on the 4090 (30.6 to 32.0 ms) when the leaves are resident, 76 ms when streamed from the host + over PCIe in chunks. At the designed 2 GiB dataset the leaf array is 2 GiB and the streamed build is about 150 ms + (approximate, scaling the 17 GB/s copy); on a PCIe 3 x8 slot in a rig, about 4x that (approximate). All far inside the + daily window on every tier. +- Device memory: with resident leaves the build peak at 2 GiB is 2 GiB + 256 MiB + 2 GiB + context, about 4.6 GiB + (approximate), which fits an 8 GB card but not beside a prover. Streamed in 64 MiB chunks the peak is dataset + cache + + 64 MiB + context, measured 1741 MiB at 1 GiB here, about 2.7 GiB at 2 GiB (approximate): no tier loses memory it has + today. Recommendation: ship chunked only; never hold the leaf array on the device. +- The real cost is delivery: every miner needs the 1 to 2 GiB state serialisation once a day. A miner + beside its own node reads it from disk or loopback (seconds). A pool user without a node must get it from the pool + (2 GiB per day per miner, or a shared download), and a light verifier either holds the state (0.11 to 0.21 ms per unit + extra, measured) or is shown 3.4 MiB of Merkle openings per unit (arithmetic above), which is not a light client any + more. The design decision this prototype leaves open is which of those two the protocol asks of a header verifier. +- CPU snapshot build: 1.7 s on one core, 0.07 s on 32, for the synthetic leaves; the real serialisation is bounded by the + node's state read, not by this. + +## What failed, what was cut + +- Nothing on the list was cut. verify_sd.c's lane-0 trace printed nothing on the first run (the trace counter was reset + on every warp, so it read 0 after warp 3); fixed, the verifiers re-run, the fix is in the file. +- The GPU box has no rsync; the sources went over with tar through ssh (`COPYFILE_DISABLE=1 --no-xattrs`, the Mac's + tar otherwise writes Apple xattr headers that GNU tar warns about). +- `-std=c11` hides `clock_gettime`; both C files define `_POSIX_C_SOURCE 200809L`. +- igneum-build-1 was under other agents' load (19 to 32) for every reading; both readings are given. The 4090 box's + CPU rows ran beside the pool daemon, pinned to core 2. The GPU itself was idle apart from this bench. +- Not measured: a two-stream chunked build (copy and build overlapped), AMD and Apple builds, the 2 GiB dataset + itself (the pack is 1 GiB; the 2 GiB figures above are labelled approximate). diff --git a/proto-newpow/state-dataset/bench.cu b/proto-newpow/state-dataset/bench.cu new file mode 100644 index 000000000..2343db46f --- /dev/null +++ b/proto-newpow/state-dataset/bench.cu @@ -0,0 +1,464 @@ +// state-dataset prototype bench (Horizon lane 8, class sd1). TEST HARNESS ONLY: no pool, no network, no wallet. +// +// Shape follows proto-cuda/host.cu: cache fill (GPU, twice, CUDA events), host cache fill and check, dataset build +// (twice, second pass reported), dataset self-test, the 3 Mac vectors, a warm-up batch of 2^24 at base nonce 0 +// (fingerprinted: FNV-1a 64 over the 2^24 little-endian u64 outputs), N timed batches (CUDA events), then a power +// window where nvidia-smi samples at 1 Hz while the hash kernel runs back to back. +// +// --mode control the unmodified pack (igneum_build) +// --mode sd1 leaf array (igneum_leaves) + igneum_build_sd; the hash kernel is the pack's +// --dump write the outputs of the first n warps of the base-0 batch (for verify_sd.c) +// --items-out write the 16 words of 1,024 random items (SplitMix64 seeded 0x5d1) read back from the GPU +// --batches N timed batches after the warm-up (default 10) +// --batch-log2 B nonces per batch (default 24) +// --power-seconds S length of the nvidia-smi window (default 20; 0 skips it) +// --chunk-mib M sd1 only: after the resident build, rebuild with the leaf array streamed from pinned host +// memory in M MiB chunks (the shape a miner uses when the leaves do not fit beside the dataset) +// --device D +// +// Build: nvcc -O3 -std=c++17 -arch=sm_89 -Xcompiler -pthread -o bench bench.cu kernel_sd.cu + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "program.h" +#include "vectors.h" +#include "memhard.h" +#include "sd.h" + +cudaError_t igneum_launch_leaves(uint32_t* leaves, uint32_t nItems); +cudaError_t igneum_launch_build_sd(uint32_t* ds, const uint32_t* cache, const uint32_t* leaves, uint32_t t0, uint32_t nItems); + +#define CUDA_CHECK(call) do { cudaError_t err_ = (call); if (err_ != cudaSuccess) { \ + std::fprintf(stderr, "CUDA error: %s (%d)\n at %s:%d\n in %s\n", cudaGetErrorString(err_), (int)err_, __FILE__, __LINE__, #call); \ + std::exit(2); } } while (0) + +static double wallMs() { + using namespace std::chrono; + return duration(steady_clock::now().time_since_epoch()).count(); +} +static uint64_t fnv1a64(const void* p, size_t n) { + const uint8_t* b = (const uint8_t*)p; + uint64_t h = 0xcbf29ce484222325ull; + for (size_t i = 0; i < n; ++i) { h ^= b[i]; h *= 0x100000001b3ull; } + return h; +} +static uint64_t splitmix64(uint64_t& s) { + s += 0x9E3779B97F4A7C15ull; + uint64_t z = s; + z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ull; + z = (z ^ (z >> 27)) * 0x94D049BB133111EBull; + return z ^ (z >> 31); +} +static float eventMs(cudaEvent_t a, cudaEvent_t b) { float ms = 0.f; CUDA_CHECK(cudaEventElapsedTime(&ms, a, b)); return ms; } + +struct Opts { + bool sd1 = false; + int batches = 10, batchLog2 = 24, device = 0, powerSeconds = 20, dumpWarps = 0, chunkMib = 0; + std::string dump, itemsOut; +}; + +static void usage() { + std::printf("bench --mode control|sd1 [--dump ] [--items-out ] [--batches 10] [--batch-log2 24] [--power-seconds 20] [--chunk-mib M] [--device 0]\n"); +} + +static Opts parse(int argc, char** argv) { + Opts o; + for (int i = 1; i < argc; ++i) { + std::string a = argv[i]; + auto need = [&](int k) { if (i + k >= argc) { usage(); std::exit(2); } }; + if (a == "--mode") { need(1); std::string m = argv[++i]; if (m == "sd1") o.sd1 = true; else if (m == "control") o.sd1 = false; else { usage(); std::exit(2); } } + else if (a == "--dump") { need(2); o.dump = argv[++i]; o.dumpWarps = std::atoi(argv[++i]); } + else if (a == "--items-out") { need(1); o.itemsOut = argv[++i]; } + else if (a == "--batches") { need(1); o.batches = std::atoi(argv[++i]); } + else if (a == "--batch-log2") { need(1); o.batchLog2 = std::atoi(argv[++i]); } + else if (a == "--power-seconds") { need(1); o.powerSeconds = std::atoi(argv[++i]); } + else if (a == "--device") { need(1); o.device = std::atoi(argv[++i]); } + else if (a == "--chunk-mib") { need(1); o.chunkMib = std::atoi(argv[++i]); } + else if (a == "-h" || a == "--help") { usage(); std::exit(0); } + else { std::printf("unknown argument %s\n", argv[i]); usage(); std::exit(2); } + } + if (o.batchLog2 < 10 || o.batchLog2 > 28 || o.batches < 1) { usage(); std::exit(2); } + return o; +} + +// nvidia-smi sampler: one line per second, read on its own thread until `timeout` ends the process. +struct Sample { double t; double watts; double smMHz; double memMHz; }; +struct Sampler { + std::vector samples; + std::mutex mu; + std::thread th; + double t0 = 0; + void start(int device, int seconds) { + t0 = wallMs(); + char cmd[512]; + std::snprintf(cmd, sizeof(cmd), "timeout %d nvidia-smi -i %d --query-gpu=power.draw,clocks.sm,clocks.mem --format=csv,noheader,nounits -l 1 2>/dev/null", seconds + 2, device); + std::string c = cmd; + th = std::thread([this, c]() { + FILE* f = popen(c.c_str(), "r"); + if (!f) return; + char line[256]; + while (std::fgets(line, sizeof(line), f)) { + double w = 0, sm = 0, mem = 0; + if (std::sscanf(line, "%lf , %lf , %lf", &w, &sm, &mem) == 3) { + std::lock_guard g(mu); + samples.push_back({ wallMs() - t0, w, sm, mem }); + } + } + pclose(f); + }); + } + void join() { if (th.joinable()) th.join(); } +}; + +static const uint32_t KEYW[8] = IGNEUM_KEY_INIT; + +int main(int argc, char** argv) { + Opts o = parse(argc, argv); + const char* modeName = o.sd1 ? "sd1" : "control"; + std::printf("state-dataset bench mode %s pack \"%s\" (test harness: no pool, no network, no wallet)\n", modeName, IGNEUM_SEED_STRING); + + int count = 0; + CUDA_CHECK(cudaGetDeviceCount(&count)); + if (count == 0) { std::printf("FAIL: no CUDA device\n"); return 2; } + CUDA_CHECK(cudaSetDevice(o.device)); + cudaDeviceProp prop; + std::memset(&prop, 0, sizeof(prop)); + CUDA_CHECK(cudaGetDeviceProperties(&prop, o.device)); + int drv = 0, rt = 0; + CUDA_CHECK(cudaDriverGetVersion(&drv)); + CUDA_CHECK(cudaRuntimeGetVersion(&rt)); + std::printf("GPU: %s (%d SMs, cc %d.%d, %.0f MiB), CUDA driver %d.%d runtime %d.%d\n", prop.name, prop.multiProcessorCount, prop.major, prop.minor, + (double)prop.totalGlobalMem / 1048576.0, drv / 1000, (drv % 100) / 10, rt / 1000, (rt % 100) / 10); + int regs = 0, bps = 0; + CUDA_CHECK(igneum_hash_info(®s, &bps, 1u)); + std::printf("hash kernel: %d registers/thread, %d resident blocks/SM at 1 warp/block\n", regs, bps); + if (o.sd1) { + std::printf("sd1 leaf stand-in: S[i] = K[i] ^ 0x%08x -> S =", SD_STATE_ROOT_XOR); + for (int i = 0; i < 8; ++i) std::printf(" %08x", KEYW[i] ^ SD_STATE_ROOT_XOR); + std::printf("; leaf(t) = ChaCha12 block of (sigma, S, t, 0, %08x, %08x)\n", SD_TAG0, SD_TAG1); + } + + size_t free0 = 0, total = 0; + CUDA_CHECK(cudaMemGetInfo(&free0, &total)); + std::printf("device memory at start: %.0f MiB used of %.0f MiB (context)\n", (double)(total - free0) / 1048576.0, (double)total / 1048576.0); + + cudaEvent_t e0, e1; + CUDA_CHECK(cudaEventCreate(&e0)); + CUDA_CHECK(cudaEventCreate(&e1)); + + // ---- cache: GPU fill twice, host fill, check + const uint32_t cacheWords = 1u << IGNEUM_CACHE_LOG2_WORDS; + const size_t cacheBytes = (size_t)cacheWords * 4u; + uint32_t* dCache = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dCache, cacheBytes)); + double cacheFill[2] = { 0, 0 }; + for (int pass = 0; pass < 2; ++pass) { + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(igneum_launch_cache_fill(dCache, IGNEUM_CACHE_SEGMENTS)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + cacheFill[pass] = eventMs(e0, e1); + } + std::printf("cache fill (GPU): %.2f ms first, %.2f ms second (%u segments x 64 ChaCha12 blocks, %u MiB)\n", cacheFill[0], cacheFill[1], (unsigned)IGNEUM_CACHE_SEGMENTS, (unsigned)(cacheBytes >> 20)); + std::vector hCache(cacheWords); + double h0 = wallMs(); + for (uint32_t seg = 0; seg < IGNEUM_CACHE_SEGMENTS; ++seg) mh_cache_segment(hCache.data(), seg); + double hostCacheMs = wallMs() - h0; + bool cachePass = false; + { + std::vector dev(cacheWords); + CUDA_CHECK(cudaMemcpy(dev.data(), dCache, cacheBytes, cudaMemcpyDeviceToHost)); + bool same = std::memcmp(dev.data(), hCache.data(), cacheBytes) == 0; + uint64_t fnv = fnv1a64(hCache.data(), cacheBytes); + cachePass = same && fnv == IGNEUM_CACHE_FNV64; + std::printf("cache fill (host, one thread): %.1f ms; cache check: %s (GPU == host %s, host FNV-1a 64 %016llx vs Mac %016llx)\n", + hostCacheMs, cachePass ? "PASS" : "FAIL", same ? "PASS" : "FAIL", (unsigned long long)fnv, (unsigned long long)IGNEUM_CACHE_FNV64); + } + + // ---- sd1: leaf array + const uint32_t words = 1u << IGNEUM_DATASET_LOG2; + const uint32_t mask = words - 1u; + const uint32_t nItems = words / 16u; + uint32_t* dLeaves = nullptr; + double leavesMs[2] = { 0, 0 }; + bool leafPass = true; + if (o.sd1) { + CUDA_CHECK(cudaMalloc((void**)&dLeaves, (size_t)nItems * 64u)); + for (int pass = 0; pass < 2; ++pass) { + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(igneum_launch_leaves(dLeaves, nItems)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + leavesMs[pass] = eventMs(e0, e1); + } + std::printf("leaf array (GPU, %u x 64 B = %u MiB): %.2f ms first, %.2f ms second -> %.1f GB/s written\n", nItems, (unsigned)(((size_t)nItems * 64u) >> 20), + leavesMs[0], leavesMs[1], (double)nItems * 64.0 / 1e9 / (leavesMs[1] / 1000.0)); + // 64 leaves against the host derivation + uint64_t s = 0x1ea7ull; + int bad = 0; + for (int k = 0; k < 64; ++k) { + uint32_t t = (k == 0) ? 0u : (k == 1) ? nItems - 1u : (uint32_t)splitmix64(s) & (nItems - 1u); + uint32_t got[16], want[16]; + CUDA_CHECK(cudaMemcpy(got, dLeaves + (size_t)t * 16u, 64, cudaMemcpyDeviceToHost)); + mh_leaf(t, want); + if (std::memcmp(got, want, 64) != 0) { if (bad == 0) std::printf(" leaf[%u] differs: gpu %08x host %08x\n", t, got[0], want[0]); ++bad; } + } + leafPass = (bad == 0); + std::printf("leaf check: %s (64 leaves incl. 0 and %u vs host mh_leaf)\n", leafPass ? "PASS" : "FAIL", nItems - 1u); + } + + // ---- dataset build, twice + uint32_t* dDs = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dDs, (size_t)words * 4u)); + double buildMs[2] = { 0, 0 }; + for (int pass = 0; pass < 2; ++pass) { + CUDA_CHECK(cudaEventRecord(e0)); + if (o.sd1) CUDA_CHECK(igneum_launch_build_sd(dDs, dCache, dLeaves, 0u, nItems)); + else CUDA_CHECK(igneum_launch_build(dDs, dCache, nItems)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + buildMs[pass] = eventMs(e0, e1); + } + std::printf("dataset build (%s): %.2f ms first, %.2f ms second -> %.1f M items/s\n", o.sd1 ? "igneum_build_sd, leaf XOR before the first mixer" : "igneum_build, the pack's", + buildMs[0], buildMs[1], (double)nItems / 1e6 / (buildMs[1] / 1000.0)); + size_t freeB = 0; + CUDA_CHECK(cudaMemGetInfo(&freeB, &total)); + double usedBuildMiB = (double)(total - freeB) / 1048576.0; + std::printf("device memory after the build: %.0f MiB used (context %.0f + cache %u + %sdataset %u MiB)\n", usedBuildMiB, (double)(total - free0) / 1048576.0, + (unsigned)(cacheBytes >> 20), o.sd1 ? "leaves 1024 + " : "", (unsigned)(((size_t)words * 4u) >> 20)); + + // ---- dataset self-test + bool dsPass = true; + { + uint32_t head[16]; + CUDA_CHECK(cudaMemcpy(head, dDs, sizeof(head), cudaMemcpyDeviceToHost)); + std::printf("dataset[0..3] = %08x %08x %08x %08x", head[0], head[1], head[2], head[3]); + if (!o.sd1) { + bool headOk = std::memcmp(head, IGNEUM_DS_HEAD, 64) == 0; + uint32_t last = 0; + CUDA_CHECK(cudaMemcpy(&last, dDs + IGNEUM_DS_LAST_INDEX, 4, cudaMemcpyDeviceToHost)); + bool lastOk = (last == IGNEUM_DS_LAST); + int badSample = 0; + for (int k = 0; k < IGNEUM_DS_SAMPLES; ++k) { + uint32_t v = 0; + CUDA_CHECK(cudaMemcpy(&v, dDs + IGNEUM_DS_SAMPLE_INDEX[k], 4, cudaMemcpyDeviceToHost)); + if (v != IGNEUM_DS_SAMPLE_VALUE[k]) ++badSample; + } + dsPass = headOk && lastOk && badSample == 0; + std::printf(" head 16 vs Mac %s, word [MASK] vs Mac %s, 64 Mac samples %s\n", headOk ? "PASS" : "FAIL", lastOk ? "PASS" : "FAIL", badSample == 0 ? "PASS" : "FAIL"); + } else { + std::printf(" (sd1: new values, no Mac expectation)\n"); + } + // 64 random words vs the host derivation (host.cu's points) + int badRnd = 0; + uint64_t s = 0x9E3779B97F4A7C15ull ^ (uint64_t)words; + for (int k = 0; k < 64; ++k) { + uint32_t idx = (uint32_t)splitmix64(s) & mask; + uint32_t v = 0; + CUDA_CHECK(cudaMemcpy(&v, dDs + idx, 4, cudaMemcpyDeviceToHost)); + uint32_t want = o.sd1 ? mh_word_sd(hCache.data(), idx) : mh_word(hCache.data(), idx); + if (v != want) ++badRnd; + } + dsPass = dsPass && badRnd == 0; + std::printf("dataset self-test: %s (64 random words vs host %s: %s)\n", dsPass ? "PASS" : "FAIL", o.sd1 ? "mh_word_sd" : "mh_word", badRnd == 0 ? "PASS" : "FAIL"); + } + + // ---- 1,024 random items (SplitMix64 seeded 0x5d1) read back and compared with the host item derivation + int itemsEqual = 0; + { + FILE* f = o.itemsOut.empty() ? nullptr : std::fopen(o.itemsOut.c_str(), "w"); + if (f) std::fprintf(f, "mode %s\nnitems 1024\n", modeName); + uint64_t s = 0x5d1ull; + for (int k = 0; k < 1024; ++k) { + uint32_t t = (uint32_t)splitmix64(s) & (nItems - 1u); + uint32_t got[16], want[16]; + CUDA_CHECK(cudaMemcpy(got, dDs + (size_t)t * 16u, 64, cudaMemcpyDeviceToHost)); + if (o.sd1) { uint32_t leaf[16]; mh_leaf(t, leaf); mh_item_sd(hCache.data(), leaf, t, want); } + else mh_item(hCache.data(), t, want); + if (std::memcmp(got, want, 64) == 0) ++itemsEqual; + else if (itemsEqual == k) std::printf(" item %u differs: gpu %08x host %08x (first difference)\n", t, got[0], want[0]); + if (f) { std::fprintf(f, "%u", t); for (int i = 0; i < 16; ++i) std::fprintf(f, " %08x", got[i]); std::fprintf(f, "\n"); } + } + if (f) std::fclose(f); + std::printf("item bit-exactness (in-process, host %s on the host cache): %d of 1024 items equal\n", o.sd1 ? "mh_item_sd with host mh_leaf" : "mh_item", itemsEqual); + } + + // ---- sd1, chunked: the leaf array lives in pinned host memory (as a real snapshot would, delivered by the node) + // and is streamed to the device in chunks; the dataset is rebuilt chunk by chunk and re-checked. Peak device memory + // is then cache + dataset + one chunk. One stream, so copy and build serialise; two chunk buffers on two streams + // would overlap them (not done here). + double chunkedMs = 0, h2dMs = 0, usedChunkMiB = 0; + int chunkedEqual = -1; + if (o.sd1 && o.chunkMib > 0) { + const size_t leafBytes = (size_t)nItems * 64u; + const size_t chunkBytes = (size_t)o.chunkMib << 20; + const uint32_t chunkItems = (uint32_t)(chunkBytes / 64u); + if (chunkBytes > leafBytes || (leafBytes % chunkBytes) != 0) { std::printf("FAIL: --chunk-mib must divide 1024\n"); return 2; } + uint32_t* hLeaves = nullptr; + CUDA_CHECK(cudaMallocHost((void**)&hLeaves, leafBytes)); + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(cudaMemcpy(hLeaves, dLeaves, leafBytes, cudaMemcpyDeviceToHost)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + double d2h = eventMs(e0, e1); + CUDA_CHECK(cudaFree(dLeaves)); dLeaves = nullptr; + // one-shot H2D of the whole array into the dataset buffer (overwritten by the rebuild anyway): the PCIe rate + CUDA_CHECK(cudaEventRecord(e0)); + CUDA_CHECK(cudaMemcpy(dDs, hLeaves, leafBytes, cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + h2dMs = eventMs(e0, e1); + uint32_t* dChunk = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dChunk, chunkBytes)); + CUDA_CHECK(cudaMemGetInfo(&freeB, &total)); + usedChunkMiB = (double)(total - freeB) / 1048576.0; + CUDA_CHECK(cudaEventRecord(e0)); + for (uint32_t t0 = 0; t0 < nItems; t0 += chunkItems) { + CUDA_CHECK(cudaMemcpyAsync(dChunk, hLeaves + (size_t)t0 * 16u, chunkBytes, cudaMemcpyHostToDevice, 0)); + CUDA_CHECK(igneum_launch_build_sd(dDs, dCache, dChunk, t0, chunkItems)); + } + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + chunkedMs = eventMs(e0, e1); + // re-check the same 1,024 items + uint64_t s = 0x5d1ull; chunkedEqual = 0; + for (int k = 0; k < 1024; ++k) { + uint32_t t = (uint32_t)splitmix64(s) & (nItems - 1u); + uint32_t got[16], want[16], leaf[16]; + CUDA_CHECK(cudaMemcpy(got, dDs + (size_t)t * 16u, 64, cudaMemcpyDeviceToHost)); + mh_leaf(t, leaf); mh_item_sd(hCache.data(), leaf, t, want); + if (std::memcmp(got, want, 64) == 0) ++chunkedEqual; + } + std::printf("chunked build (leaves from pinned host memory in %d MiB chunks, %u chunks, one stream): %.2f ms total (copies + builds); whole-array H2D alone %.2f ms = %.1f GB/s, D2H %.2f ms\n", + o.chunkMib, nItems / chunkItems, chunkedMs, h2dMs, (double)leafBytes / 1e9 / (h2dMs / 1000.0), d2h); + std::printf("device memory during the chunked build: %.0f MiB used (context + cache 256 + dataset 1024 + chunk %d MiB); items after the chunked rebuild: %d of 1024 equal\n", usedChunkMiB, o.chunkMib, chunkedEqual); + CUDA_CHECK(cudaFree(dChunk)); + CUDA_CHECK(cudaFreeHost(hLeaves)); + } + + // The leaf array is only needed for the build; a miner frees it before hashing. + if (dLeaves) { CUDA_CHECK(cudaFree(dLeaves)); dLeaves = nullptr; } + + // ---- vectors (control: against the Mac; sd1: printed) + const uint32_t nonces = 1u << o.batchLog2; + uint64_t* dOut = nullptr; + CUDA_CHECK(cudaMalloc((void**)&dOut, (size_t)nonces * 8u)); + bool vecPass = true; + { + uint64_t got[32]; + for (int w = 0; w < IGNEUM_VEC_WARPS; ++w) { + CUDA_CHECK(igneum_launch_hash(dDs, dOut, IGNEUM_VEC_BASE[w], mask, 32u, 1u)); + CUDA_CHECK(cudaDeviceSynchronize()); + CUDA_CHECK(cudaMemcpy(got, dOut, sizeof(got), cudaMemcpyDeviceToHost)); + if (!o.sd1) { + int bad = 0; + for (int l = 0; l < 32; ++l) if (got[l] != IGNEUM_VEC_OUT[w][l]) ++bad; + vecPass = vecPass && bad == 0; + std::printf("vector warp base %u: %s (%d of 32 lanes differ)\n", IGNEUM_VEC_BASE[w], bad == 0 ? "PASS" : "FAIL", bad); + } else { + std::printf("sd1 warp base %u lane 0: %016llx (new value; checked by verify_sd.c through the dump)\n", IGNEUM_VEC_BASE[w], (unsigned long long)got[0]); + } + } + } + + // ---- warm-up batch at base 0: fingerprint, in-batch vectors, dump + double w0 = wallMs(); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, 0u, mask, nonces, 1u)); + CUDA_CHECK(cudaDeviceSynchronize()); + double warmMs = wallMs() - w0; + std::vector hOut(nonces); + CUDA_CHECK(cudaMemcpy(hOut.data(), dOut, (size_t)nonces * 8u, cudaMemcpyDeviceToHost)); + uint64_t fp = fnv1a64(hOut.data(), (size_t)nonces * 8u); + std::printf("warm-up batch: 2^%d hashes in %.2f ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): %016llx%s\n", o.batchLog2, warmMs, + (unsigned long long)fp, o.sd1 ? " (sd1, new value)" : (fp == 0x7c28cfb06c5c65a9ull ? " = 7c28cfb06c5c65a9 (the pack's)" : " DIFFERS from 7c28cfb06c5c65a9")); + bool fpPass = o.sd1 || fp == 0x7c28cfb06c5c65a9ull; + if (!o.sd1) { + for (int w = 0; w < IGNEUM_VEC_WARPS; ++w) { + if ((uint64_t)IGNEUM_VEC_BASE[w] + 32ull > nonces) continue; + int bad = 0; + for (int l = 0; l < 32; ++l) if (hOut[IGNEUM_VEC_BASE[w] + l] != IGNEUM_VEC_OUT[w][l]) ++bad; + vecPass = vecPass && bad == 0; + std::printf("vector warp base %u in batch: %s\n", IGNEUM_VEC_BASE[w], bad == 0 ? "PASS" : "FAIL"); + } + } + if (!o.dump.empty() && o.dumpWarps > 0) { + FILE* f = std::fopen(o.dump.c_str(), "w"); + if (!f) { std::printf("FAIL: cannot write %s\n", o.dump.c_str()); return 2; } + std::fprintf(f, "mode %s\nwarps %d\n", modeName, o.dumpWarps); + for (int w = 0; w < o.dumpWarps; ++w) { + std::fprintf(f, "base %u\n", 32u * (uint32_t)w); + for (int l = 0; l < 32; ++l) std::fprintf(f, "%016llx\n", (unsigned long long)hOut[32u * (uint32_t)w + l]); + } + std::fclose(f); + std::printf("dump: %d warps (bases 0, 32, ...) written to %s\n", o.dumpWarps, o.dump.c_str()); + } + + // ---- timed batches + CUDA_CHECK(cudaEventRecord(e0)); + for (int b = 1; b <= o.batches; ++b) { + uint32_t base = (uint32_t)((uint64_t)b * (uint64_t)nonces); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, base, mask, nonces, 1u)); + } + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + double gpuMs = eventMs(e0, e1); + double mhs = (double)nonces * (double)o.batches / (gpuMs / 1000.0) / 1e6; + std::printf("timed: %d batches x 2^%d hashes, GPU %.2f ms -> %.3f MH/s (%.2f GB/s useful, loads x 4 B)\n", o.batches, o.batchLog2, gpuMs, mhs, mhs * 1e6 * IGNEUM_LOADS_PER_HASH * 4.0 / 1e9); + + // ---- power window: hash back to back for powerSeconds while nvidia-smi samples at 1 Hz + double powerW = 0, smMHz = 0, memMHz = 0, mhsWindow = 0; + int nSamples = 0, nUsed = 0; + if (o.powerSeconds > 0) { + Sampler smp; + smp.start(o.device, o.powerSeconds); + double start = wallMs(); + int b = o.batches + 1; + int done = 0; + CUDA_CHECK(cudaEventRecord(e0)); + while (wallMs() - start < o.powerSeconds * 1000.0) { + uint32_t base = (uint32_t)((uint64_t)b++ * (uint64_t)nonces); + CUDA_CHECK(igneum_launch_hash(dDs, dOut, base, mask, nonces, 1u)); + CUDA_CHECK(cudaDeviceSynchronize()); + ++done; + } + CUDA_CHECK(cudaEventRecord(e1)); + CUDA_CHECK(cudaEventSynchronize(e1)); + double wms = eventMs(e0, e1); + mhsWindow = (double)nonces * (double)done / (wms / 1000.0) / 1e6; + smp.join(); + std::lock_guard g(smp.mu); + nSamples = (int)smp.samples.size(); + for (const Sample& s : smp.samples) { + if (s.t < 10000.0 || s.t > (double)o.powerSeconds * 1000.0) continue; // mean after 10 s, inside the load window + powerW += s.watts; smMHz += s.smMHz; memMHz += s.memMHz; ++nUsed; + } + if (nUsed) { powerW /= nUsed; smMHz /= nUsed; memMHz /= nUsed; } + std::printf("power window: %d batches in %.1f s -> %.3f MH/s (events, incl. sync gaps); nvidia-smi %d samples, %d after 10 s: mean %.1f W, SM %.0f MHz, mem %.0f MHz\n", + done, wms / 1000.0, mhsWindow, nSamples, nUsed, powerW, smMHz, memMHz); + if (nUsed) std::printf(" -> %.3f MH/s per W (window rate / mean W)\n", mhsWindow / powerW); + else std::printf(" WARNING: no nvidia-smi samples inside the window (is nvidia-smi on PATH?)\n"); + } + + size_t freeH = 0; + CUDA_CHECK(cudaMemGetInfo(&freeH, &total)); + std::printf("device memory while hashing: %.0f MiB used (leaves freed)\n", (double)(total - freeH) / 1048576.0); + + bool overall = cachePass && leafPass && dsPass && vecPass && fpPass && itemsEqual == 1024 && (chunkedEqual < 0 || chunkedEqual == 1024); + std::printf("RESULT mode=%s gpu=%s cache_fill_ms=%.2f host_cache_ms=%.1f leaves_ms=%.2f build_ms=%.2f mem_build_mib=%.0f chunk_mib=%d chunked_ms=%.2f mem_chunked_mib=%.0f chunked_equal=%d items_equal=%d/1024 fingerprint=%016llx mhs=%.3f mhs_window=%.3f watts=%.1f sm_mhz=%.0f mem_mhz=%.0f cache=%s dataset=%s vectors=%s overall=%s\n", + modeName, prop.name, cacheFill[1], hostCacheMs, leavesMs[1], buildMs[1], usedBuildMiB, o.chunkMib, chunkedMs, usedChunkMiB, chunkedEqual, itemsEqual, (unsigned long long)fp, mhs, mhsWindow, powerW, smMHz, memMHz, + cachePass ? "PASS" : "FAIL", dsPass ? "PASS" : "FAIL", o.sd1 ? "n/a" : (vecPass ? "PASS" : "FAIL"), overall ? "PASS" : "FAIL"); + + CUDA_CHECK(cudaFree(dOut)); + CUDA_CHECK(cudaFree(dDs)); + CUDA_CHECK(cudaFree(dCache)); + return overall ? 0 : 1; +} diff --git a/proto-newpow/state-dataset/cpu_rows.c b/proto-newpow/state-dataset/cpu_rows.c new file mode 100644 index 000000000..1c50bdbbf --- /dev/null +++ b/proto-newpow/state-dataset/cpu_rows.c @@ -0,0 +1,139 @@ +/* state-dataset prototype: CPU rows for igneum-build-1 (Horizon lane 8, class sd1). Plain C, -O2. + * + * B.1 the verifier's extra cost per 32-lane unit (4,096 items per unit), ms per unit over 100 units, one core: + * (i) 4,096 random 64-byte reads from a host-resident leaf array of 2 GiB and of 8 GiB (random t, independent, + * the array written once so every page is resident) + * (ii) 4,096 leaves derived on the fly from the state root (one ChaCha12 block each, no array) + * (iii) 4,096 x mh_item on the host cache, naive (no interleaving); plus leaf + mh_item_sd + * B.2 the daily snapshot build on CPU: the 1 GiB leaf array (2^24 ChaCha12 blocks) on one core and on N threads + * (OpenMP), and the host cache fill on one core. + * + * Build: gcc -O2 -std=c11 -fopenmp -o cpu_rows cpu_rows.c + * Run: taskset -c 4 nice -n 19 ./cpu_rows --rows (B.1 and the one-core B.2 rows) + * taskset -c 4-35 nice -n 19 ./cpu_rows --leaves 32 (the N-thread leaf build) + */ +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#include +#define IGNEUM_NO_CUDA +#include "program.h" +#include "memhard.h" +#include "sd.h" + +static double nowMs(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1e3 + ts.tv_nsec / 1e6; } +static uint64_t splitmix64(uint64_t* s) { + *s += 0x9E3779B97F4A7C15ull; uint64_t z = *s; + z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ull; z = (z ^ (z >> 27)) * 0x94D049BB133111EBull; + return z ^ (z >> 31); +} + +static volatile uint32_t sink; + +/* (i): random 64-byte reads from an array of gib GiB */ +static void row_reads(int gib, int units) { + size_t items = ((size_t)gib << 30) / 64u; + uint32_t* arr = (uint32_t*)malloc((size_t)gib << 30); + if (!arr) { printf(" (i) %d GiB: malloc failed\n", gib); return; } + double t0 = nowMs(); + /* write every 64-byte line once (resident pages); the content is a cheap pattern, the read cost does not depend on it */ + for (size_t i = 0; i < items; ++i) { uint32_t* l = arr + i * 16u; l[0] = (uint32_t)i; l[15] = (uint32_t)(i >> 32) ^ 0x5d1u; } + double fillMs = nowMs() - t0; + uint64_t s = 0x5d1ull; uint32_t acc[16] = { 0 }; + double sum = 0, mn = 1e9, mx = 0; + uint32_t* ts = (uint32_t*)malloc(4096 * 4); + for (int u = 0; u < units; ++u) { + for (int k = 0; k < 4096; ++k) ts[k] = (uint32_t)(splitmix64(&s) % items); + double a = nowMs(); + for (int k = 0; k < 4096; ++k) { const uint32_t* l = arr + (size_t)ts[k] * 16u; for (int i = 0; i < 16; ++i) acc[i] ^= l[i]; } + double b = nowMs(); + sum += b - a; if (b - a < mn) mn = b - a; if (b - a > mx) mx = b - a; + } + for (int i = 0; i < 16; ++i) sink ^= acc[i]; + printf(" (i) 4,096 random 64-byte reads from a %d GiB resident array: %.3f ms per unit (min %.3f, max %.3f; %.0f ns per read; array write pass %.0f ms)\n", + gib, sum / units, mn, mx, sum / units * 1e6 / 4096.0, fillMs); + free(ts); free(arr); +} + +int main(int argc, char** argv) { + int rows = 0, leavesThreads = 0, units = 100; + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--rows")) rows = 1; + else if (!strcmp(argv[i], "--leaves") && i + 1 < argc) leavesThreads = atoi(argv[++i]); + else if (!strcmp(argv[i], "--units") && i + 1 < argc) units = atoi(argv[++i]); + else { printf("usage: cpu_rows [--rows] [--leaves N] [--units 100]\n"); return 2; } + } + const uint32_t words = 1u << IGNEUM_DATASET_LOG2, nItems = words / 16u; + const uint32_t cacheWords = 1u << IGNEUM_CACHE_LOG2_WORDS; + + if (rows) { + printf("B.1 per-unit rows (4,096 per unit, %d units, one thread, ms per unit)\n", units); + row_reads(2, units); + row_reads(8, units); + /* (ii) */ + { + uint64_t s = 0x5d1ull; double sum = 0; + uint32_t* ts = (uint32_t*)malloc(4096 * 4); + for (int u = 0; u < units; ++u) { + for (int k = 0; k < 4096; ++k) ts[k] = (uint32_t)splitmix64(&s) & (nItems - 1u); + double a = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t leaf[16]; mh_leaf(ts[k], leaf); sink ^= leaf[0] ^ leaf[15]; } + sum += nowMs() - a; + } + printf(" (ii) 4,096 leaves derived on the fly (one ChaCha12 block each, no array): %.3f ms per unit (%.0f ns per leaf)\n", sum / units, sum / units * 1e6 / 4096.0); + free(ts); + } + /* B.2 host cache fill, one core; then (iii) */ + uint32_t* cache = (uint32_t*)malloc((size_t)cacheWords * 4u); + double c0 = nowMs(); + for (uint32_t seg = 0; seg < IGNEUM_CACHE_SEGMENTS; ++seg) mh_cache_segment(cache, seg); + double cacheMs = nowMs() - c0; + printf("B.2 host cache fill (256 MiB, 65536 segments x 64 ChaCha12 blocks), one core: %.3f s\n", cacheMs / 1000.0); + { + uint64_t s = 0x5d1ull; double sumItem = 0, sumSd = 0, mn = 1e9, mx = 0; + uint32_t* ts = (uint32_t*)malloc(4096 * 4); + for (int u = 0; u < units; ++u) { + for (int k = 0; k < 4096; ++k) ts[k] = (uint32_t)splitmix64(&s) & (nItems - 1u); + double a = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t it[16]; mh_item(cache, ts[k], it); sink ^= it[0]; } + double b = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t leaf[16], it[16]; mh_leaf(ts[k], leaf); mh_item_sd(cache, leaf, ts[k], it); sink ^= it[0]; } + double c = nowMs(); + sumItem += b - a; sumSd += c - b; if (b - a < mn) mn = b - a; if (b - a > mx) mx = b - a; + } + printf(" (iii) 4,096 x mh_item on the host cache, naive (no interleaving): %.2f ms per unit (min %.2f, max %.2f)\n", sumItem / units, mn, mx); + printf(" 4,096 x (leaf + mh_item_sd), naive: %.2f ms per unit\n", sumSd / units); + printf(" reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound.\n"); + free(ts); + } + free(cache); + /* B.2 leaf array on one core */ + { + uint32_t* leaves = (uint32_t*)malloc((size_t)nItems * 64u); + double a = nowMs(); + for (uint32_t t = 0; t < nItems; ++t) mh_leaf(t, leaves + (size_t)t * 16u); + double ms = nowMs() - a; + sink ^= leaves[0] ^ leaves[(size_t)nItems * 16u - 1u]; + printf("B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), one core: %.3f s (%.0f ns per leaf)\n", ms / 1000.0, ms * 1e6 / nItems); + free(leaves); + } + } + if (leavesThreads > 0) { + omp_set_num_threads(leavesThreads); + uint32_t* leaves = (uint32_t*)malloc((size_t)nItems * 64u); + /* first touch in parallel too, then time a second full build so page faults are not in the number */ + for (int pass = 0; pass < 2; ++pass) { + double a = nowMs(); + #pragma omp parallel for schedule(static) + for (int64_t t = 0; t < (int64_t)nItems; ++t) mh_leaf((uint32_t)t, leaves + (size_t)t * 16u); + double ms = nowMs() - a; + printf("B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), %d threads (OpenMP, %d actual): %.3f s%s\n", leavesThreads, omp_get_max_threads(), ms / 1000.0, pass == 0 ? " (first pass, includes page faults)" : ""); + } + sink ^= leaves[0]; + free(leaves); + } + return 0; +} diff --git a/proto-newpow/state-dataset/kernel.cu b/proto-newpow/state-dataset/kernel.cu new file mode 100644 index 000000000..e22472314 --- /dev/null +++ b/proto-newpow/state-dataset/kernel.cu @@ -0,0 +1,164 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Bit-exact twin of the Metal kernel for the same seed (see proto-cuda/CHECKLIST.md and program.metal). +// Compiled ahead of time by nvcc together with proto-cuda/host.cu. No NVRTC. +#include +#include +#include "program.h" +#include "memhard.h" + +__device__ __forceinline__ uint32_t splitmix32(uint32_t x) { + x ^= x >> 16; x *= 0x7feb352du; + x ^= x >> 15; x *= 0x846ca68bu; + x ^= x >> 16; + return x; +} +// n is a literal in 1..31 at every call site, so both shift amounts are in 1..31. +__device__ __forceinline__ uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +// n is masked to 0..31; the second shift amount is masked too, so n == 0 gives x. +__device__ __forceinline__ uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +__device__ __forceinline__ uint32_t ds_elem(uint32_t i, uint32_t d0, uint32_t d1) { + uint32_t x = i ^ d0; + x *= 0x9E3779B1u; x ^= x >> 15; + x += d1; + x *= 0x85EBCA77u; x ^= x >> 13; + x *= 0xC2B2AE3Du; x ^= x >> 16; + return x; +} + +// Memory-hard dataset (MEMHARD.md). One thread per cache segment; one thread per 64-byte dataset item. +// The core functions (mh_cache_segment, mh_item) are in memhard.h and are also compiled for the host. +__global__ void igneum_cache_fill(uint32_t* cache, uint32_t nSegments) { + uint32_t seg = blockIdx.x * blockDim.x + threadIdx.x; + if (seg < nSegments) mh_cache_segment(cache, seg); +} +__global__ void igneum_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + uint32_t t = blockIdx.x * blockDim.x + threadIdx.x; + if (t < nItems) { + uint32_t s[16]; + mh_item(cache, t, s); + uint32_t* d = ds + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i]; + } +} + +// One hash per thread. blockDim.x is a multiple of 32; lane = threadIdx.x & 31 and every +// __shfl_xor_sync stays inside the lane's own warp, exactly like simd_shuffle_xor inside a +// 32-wide Metal SIMD group. Control flow is uniform, so the full 0xffffffff member mask is valid. +__global__ void igneum_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask) { + uint32_t gid = blockIdx.x * blockDim.x + threadIdx.x; + uint32_t nonce = baseNonce + gid; + uint32_t r0, r1, r2, r3, r4, r5, r6, r7; + { uint32_t x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r0 = x ^ 0x1a155b25u; } // SEEDW[0], 0x9e3779b9u * 1u, SEEDW[1] + { uint32_t x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r1 = x ^ 0xfddfb732u; } // SEEDW[1], 0x9e3779b9u * 2u, SEEDW[2] + { uint32_t x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r2 = x ^ 0x4b5af2e8u; } // SEEDW[2], 0x9e3779b9u * 3u, SEEDW[3] + { uint32_t x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r3 = x ^ 0xc55caf33u; } // SEEDW[3], 0x9e3779b9u * 4u, SEEDW[4] + { uint32_t x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r4 = x ^ 0xa27c13b7u; } // SEEDW[4], 0x9e3779b9u * 5u, SEEDW[5] + { uint32_t x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r5 = x ^ 0x06628a48u; } // SEEDW[5], 0x9e3779b9u * 6u, SEEDW[6] + { uint32_t x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r6 = x ^ 0x03852469u; } // SEEDW[6], 0x9e3779b9u * 7u, SEEDW[7] + { uint32_t x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r7 = x ^ 0x67a9a7beu; } // SEEDW[7], 0x9e3779b9u * 8u, SEEDW[0] + + for (uint32_t it = 0u; it < 8u; ++it) { + uint32_t sel = r0; + r2 = r3 * r4 + r2; // 0 mad + r2 = r1 * r1 + r2; // 1 mad + r2 = r3 * r2 + r2; // 2 mad + r3 = r3 ^ r5; // 3 xor + r7 = r7 ^ ds[r2 & mask]; // 4 load + r5 = r5 ^ ds[r7 & mask]; // 5 load + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r4, 8); // 6 shfl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // 7 shfl + r1 = __umulhi(r1, r5); // 8 mulhi + r6 = rotr_var(r6, r3); // 9 rotr + r3 = r3 | r4; // 10 or + r4 = r4 ^ ds[r3 & mask]; // 11 load + r0 = __umulhi(r0, r4); // 12 mulhi + r5 = r5 + r1 + ((((sel >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); // 13 add + r0 = r0 ^ ds[r4 & mask]; // 14 load + r2 = r2 - r4; // 15 sub + r2 = r2 ^ ds[r0 & mask]; // 16 load + r7 = r7 ^ ds[r2 & mask]; // 17 load + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // 18 shfl + r5 = r5 * r0; // 19 mul + r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // 20 shfl + r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // 21 shfl + r6 = __umulhi(r6, r2); // 22 mulhi + r6 = r6 ^ ds[r1 & mask]; // 23 load + r5 = r5 * r0; // 24 mul + r5 = rotl_imm(r5, 19u); // 25 rotl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r6, 2); // 26 shfl + r0 = r0 ^ r5; // 27 xor + r0 = r0 ^ r4; // 28 xor + r3 = r3 - r0; // 29 sub + r5 = r5 * r1; // 30 mul + r7 = r7 ^ ds[r2 & mask]; // 31 load + r1 = r1 ^ ds[r0 & mask]; // 32 load + r5 = r5 ^ r6; // 33 xor + r5 = r5 ^ ds[r1 & mask]; // 34 load + r0 = __umulhi(r0, r5); // 35 mulhi + r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // 36 shfl + r7 = r7 ^ ds[r0 & mask]; // 37 load + r3 = r3 + r1 + ((((sel >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); // 38 add + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // 39 shfl + r2 = r2 ^ r5; // 40 xor + r3 = r6 * r3 + r3; // 41 mad + r6 = r6 - r7; // 42 sub + r7 = r7 ^ r0; // 43 xor + r1 = r1 ^ ds[r7 & mask]; // 44 load + r2 = r2 * r3; // 45 mul + r1 = __umulhi(r1, r5); // 46 mulhi + r4 = r4 - r3; // 47 sub + r2 = rotr_var(r2, r6); // 48 rotr + r3 = r3 ^ ds[r5 & mask]; // 49 load + r1 = r1 + r5 + ((((sel >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); // 50 add + r0 = r0 * r2; // 51 mul + r0 = r0 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); // 52 add + r1 = r1 + r0 + ((((sel >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); // 53 add + r7 = rotl_imm(r7, 14u); // 54 rotl + r3 = r3 + r7 + ((((sel >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); // 55 add + r6 = r6 ^ ds[r7 & mask]; // 56 load + r1 = rotr_var(r1, r5); // 57 rotr + r5 = r5 ^ ds[r4 & mask]; // 58 load + r6 = r6 ^ ds[r2 & mask]; // 59 load + r3 = r5 * r0 + r3; // 60 mad + r5 = r5 + r7 + ((((sel >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); // 61 add + r4 = r4 + r6 + ((((sel >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); // 62 add + r5 = rotl_imm(r5, 19u); // 63 rotl + } + uint32_t lo = r0 ^ rotl_imm(r1, 7u) ^ rotl_imm(r2, 14u) ^ rotl_imm(r3, 21u); + uint32_t hi = r4 ^ rotl_imm(r5, 9u) ^ rotl_imm(r6, 18u) ^ rotl_imm(r7, 27u); + out[gid] = ((uint64_t)hi << 32) | (uint64_t)lo; +} + +// Host-side launch wrappers. Declared in program.h, called from host.cu. +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments) { + if (nSegments == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nSegments + block - 1u) / block; + igneum_cache_fill<<>>(cache, nSegments); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_build<<>>(ds, cache, nItems); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps) { + if (blockWarps == 0u || blockWarps > 32u) return cudaErrorInvalidValue; + uint32_t block = 32u * blockWarps; + if (nonces == 0u || (nonces % block) != 0u) return cudaErrorInvalidValue; + igneum_hash<<>>(ds, out, baseNonce, mask); + return cudaGetLastError(); +} + +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps) { + cudaFuncAttributes attr; + cudaError_t e = cudaFuncGetAttributes(&attr, igneum_hash); + if (e != cudaSuccess) return e; + *numRegs = attr.numRegs; + return cudaOccupancyMaxActiveBlocksPerMultiprocessor(blocksPerSM, igneum_hash, (int)(32u * blockWarps), 0); +} diff --git a/proto-newpow/state-dataset/kernel_sd.cu b/proto-newpow/state-dataset/kernel_sd.cu new file mode 100644 index 000000000..70f0905ab --- /dev/null +++ b/proto-newpow/state-dataset/kernel_sd.cu @@ -0,0 +1,213 @@ +// state-dataset prototype: the mx8-genesis pack kernel plus igneum_leaves and igneum_build_sd (appended at the end). +// The hash kernel igneum_hash and every other line of the pack are byte for byte the pack's kernel.cu. +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Bit-exact twin of the Metal kernel for the same seed (see proto-cuda/CHECKLIST.md and program.metal). +// Compiled ahead of time by nvcc together with proto-cuda/host.cu. No NVRTC. +#include +#include +#include "program.h" +#include "memhard.h" +#include "sd.h" // state-dataset prototype: mh_leaf, mh_item_sd (lane 8, class sd1) + +__device__ __forceinline__ uint32_t splitmix32(uint32_t x) { + x ^= x >> 16; x *= 0x7feb352du; + x ^= x >> 15; x *= 0x846ca68bu; + x ^= x >> 16; + return x; +} +// n is a literal in 1..31 at every call site, so both shift amounts are in 1..31. +__device__ __forceinline__ uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +// n is masked to 0..31; the second shift amount is masked too, so n == 0 gives x. +__device__ __forceinline__ uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +__device__ __forceinline__ uint32_t ds_elem(uint32_t i, uint32_t d0, uint32_t d1) { + uint32_t x = i ^ d0; + x *= 0x9E3779B1u; x ^= x >> 15; + x += d1; + x *= 0x85EBCA77u; x ^= x >> 13; + x *= 0xC2B2AE3Du; x ^= x >> 16; + return x; +} + +// Memory-hard dataset (MEMHARD.md). One thread per cache segment; one thread per 64-byte dataset item. +// The core functions (mh_cache_segment, mh_item) are in memhard.h and are also compiled for the host. +__global__ void igneum_cache_fill(uint32_t* cache, uint32_t nSegments) { + uint32_t seg = blockIdx.x * blockDim.x + threadIdx.x; + if (seg < nSegments) mh_cache_segment(cache, seg); +} +__global__ void igneum_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + uint32_t t = blockIdx.x * blockDim.x + threadIdx.x; + if (t < nItems) { + uint32_t s[16]; + mh_item(cache, t, s); + uint32_t* d = ds + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i]; + } +} + +// One hash per thread. blockDim.x is a multiple of 32; lane = threadIdx.x & 31 and every +// __shfl_xor_sync stays inside the lane's own warp, exactly like simd_shuffle_xor inside a +// 32-wide Metal SIMD group. Control flow is uniform, so the full 0xffffffff member mask is valid. +__global__ void igneum_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask) { + uint32_t gid = blockIdx.x * blockDim.x + threadIdx.x; + uint32_t nonce = baseNonce + gid; + uint32_t r0, r1, r2, r3, r4, r5, r6, r7; + { uint32_t x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r0 = x ^ 0x1a155b25u; } // SEEDW[0], 0x9e3779b9u * 1u, SEEDW[1] + { uint32_t x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r1 = x ^ 0xfddfb732u; } // SEEDW[1], 0x9e3779b9u * 2u, SEEDW[2] + { uint32_t x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r2 = x ^ 0x4b5af2e8u; } // SEEDW[2], 0x9e3779b9u * 3u, SEEDW[3] + { uint32_t x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r3 = x ^ 0xc55caf33u; } // SEEDW[3], 0x9e3779b9u * 4u, SEEDW[4] + { uint32_t x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r4 = x ^ 0xa27c13b7u; } // SEEDW[4], 0x9e3779b9u * 5u, SEEDW[5] + { uint32_t x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r5 = x ^ 0x06628a48u; } // SEEDW[5], 0x9e3779b9u * 6u, SEEDW[6] + { uint32_t x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r6 = x ^ 0x03852469u; } // SEEDW[6], 0x9e3779b9u * 7u, SEEDW[7] + { uint32_t x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r7 = x ^ 0x67a9a7beu; } // SEEDW[7], 0x9e3779b9u * 8u, SEEDW[0] + + for (uint32_t it = 0u; it < 8u; ++it) { + uint32_t sel = r0; + r2 = r3 * r4 + r2; // 0 mad + r2 = r1 * r1 + r2; // 1 mad + r2 = r3 * r2 + r2; // 2 mad + r3 = r3 ^ r5; // 3 xor + r7 = r7 ^ ds[r2 & mask]; // 4 load + r5 = r5 ^ ds[r7 & mask]; // 5 load + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r4, 8); // 6 shfl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // 7 shfl + r1 = __umulhi(r1, r5); // 8 mulhi + r6 = rotr_var(r6, r3); // 9 rotr + r3 = r3 | r4; // 10 or + r4 = r4 ^ ds[r3 & mask]; // 11 load + r0 = __umulhi(r0, r4); // 12 mulhi + r5 = r5 + r1 + ((((sel >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); // 13 add + r0 = r0 ^ ds[r4 & mask]; // 14 load + r2 = r2 - r4; // 15 sub + r2 = r2 ^ ds[r0 & mask]; // 16 load + r7 = r7 ^ ds[r2 & mask]; // 17 load + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // 18 shfl + r5 = r5 * r0; // 19 mul + r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // 20 shfl + r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // 21 shfl + r6 = __umulhi(r6, r2); // 22 mulhi + r6 = r6 ^ ds[r1 & mask]; // 23 load + r5 = r5 * r0; // 24 mul + r5 = rotl_imm(r5, 19u); // 25 rotl + r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r6, 2); // 26 shfl + r0 = r0 ^ r5; // 27 xor + r0 = r0 ^ r4; // 28 xor + r3 = r3 - r0; // 29 sub + r5 = r5 * r1; // 30 mul + r7 = r7 ^ ds[r2 & mask]; // 31 load + r1 = r1 ^ ds[r0 & mask]; // 32 load + r5 = r5 ^ r6; // 33 xor + r5 = r5 ^ ds[r1 & mask]; // 34 load + r0 = __umulhi(r0, r5); // 35 mulhi + r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // 36 shfl + r7 = r7 ^ ds[r0 & mask]; // 37 load + r3 = r3 + r1 + ((((sel >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); // 38 add + r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // 39 shfl + r2 = r2 ^ r5; // 40 xor + r3 = r6 * r3 + r3; // 41 mad + r6 = r6 - r7; // 42 sub + r7 = r7 ^ r0; // 43 xor + r1 = r1 ^ ds[r7 & mask]; // 44 load + r2 = r2 * r3; // 45 mul + r1 = __umulhi(r1, r5); // 46 mulhi + r4 = r4 - r3; // 47 sub + r2 = rotr_var(r2, r6); // 48 rotr + r3 = r3 ^ ds[r5 & mask]; // 49 load + r1 = r1 + r5 + ((((sel >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); // 50 add + r0 = r0 * r2; // 51 mul + r0 = r0 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); // 52 add + r1 = r1 + r0 + ((((sel >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); // 53 add + r7 = rotl_imm(r7, 14u); // 54 rotl + r3 = r3 + r7 + ((((sel >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); // 55 add + r6 = r6 ^ ds[r7 & mask]; // 56 load + r1 = rotr_var(r1, r5); // 57 rotr + r5 = r5 ^ ds[r4 & mask]; // 58 load + r6 = r6 ^ ds[r2 & mask]; // 59 load + r3 = r5 * r0 + r3; // 60 mad + r5 = r5 + r7 + ((((sel >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); // 61 add + r4 = r4 + r6 + ((((sel >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); // 62 add + r5 = rotl_imm(r5, 19u); // 63 rotl + } + uint32_t lo = r0 ^ rotl_imm(r1, 7u) ^ rotl_imm(r2, 14u) ^ rotl_imm(r3, 21u); + uint32_t hi = r4 ^ rotl_imm(r5, 9u) ^ rotl_imm(r6, 18u) ^ rotl_imm(r7, 27u); + out[gid] = ((uint64_t)hi << 32) | (uint64_t)lo; +} + +// Host-side launch wrappers. Declared in program.h, called from host.cu. +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments) { + if (nSegments == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nSegments + block - 1u) / block; + igneum_cache_fill<<>>(cache, nSegments); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_build<<>>(ds, cache, nItems); + return cudaGetLastError(); +} + +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps) { + if (blockWarps == 0u || blockWarps > 32u) return cudaErrorInvalidValue; + uint32_t block = 32u * blockWarps; + if (nonces == 0u || (nonces % block) != 0u) return cudaErrorInvalidValue; + igneum_hash<<>>(ds, out, baseNonce, mask); + return cudaGetLastError(); +} + +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps) { + cudaFuncAttributes attr; + cudaError_t e = cudaFuncGetAttributes(&attr, igneum_hash); + if (e != cudaSuccess) return e; + *numRegs = attr.numRegs; + return cudaOccupancyMaxActiveBlocksPerMultiprocessor(blocksPerSM, igneum_hash, (int)(32u * blockWarps), 0); +} + +// --------------------------------------------------------------------------------------------- +// state-dataset prototype (class sd1). One thread per item. +// igneum_leaves: leaves[t * 16 .. t * 16 + 15] = mh_leaf(t) (the synthetic 64-byte state leaf, sd.h). +// igneum_build_sd: item t = mh_item_sd(cache, leaves + 16 t, t). The leaf read is one coalesced 64-byte read per +// thread (consecutive threads read consecutive leaves), so streaming the leaf array in chunks is a matter of +// launching over an item range [t0, t0 + n) with the chunk's leaves at leaves - 16 t0: nothing in the kernel +// depends on the whole array being resident. +__global__ void igneum_leaves(uint32_t* leaves, uint32_t nItems) { + uint32_t t = blockIdx.x * blockDim.x + threadIdx.x; + if (t < nItems) { + uint32_t leaf[16]; + mh_leaf(t, leaf); + uint32_t* d = leaves + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = leaf[i]; + } +} +__global__ void igneum_build_sd(uint32_t* ds, const uint32_t* cache, const uint32_t* leaves, uint32_t t0, uint32_t nItems) { + uint32_t t = t0 + blockIdx.x * blockDim.x + threadIdx.x; + if (t < t0 + nItems) { + uint32_t leaf[16]; + const uint32_t* l = leaves + (size_t)(t - t0) * 16u; + for (uint32_t i = 0u; i < 16u; ++i) leaf[i] = l[i]; + uint32_t s[16]; + mh_item_sd(cache, leaf, t, s); + uint32_t* d = ds + (size_t)t * 16u; + for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i]; + } +} + +cudaError_t igneum_launch_leaves(uint32_t* leaves, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_leaves<<>>(leaves, nItems); + return cudaGetLastError(); +} + +// Builds items [t0, t0 + nItems) from the leaves of that range (leaves points at leaf t0). +cudaError_t igneum_launch_build_sd(uint32_t* ds, const uint32_t* cache, const uint32_t* leaves, uint32_t t0, uint32_t nItems) { + if (nItems == 0u) return cudaErrorInvalidValue; + uint32_t block = 256u; + uint32_t grid = (nItems + block - 1u) / block; + igneum_build_sd<<>>(ds, cache, leaves, t0, nItems); + return cudaGetLastError(); +} diff --git a/proto-newpow/state-dataset/memhard.h b/proto-newpow/state-dataset/memhard.h new file mode 100644 index 000000000..f7f34c732 --- /dev/null +++ b/proto-newpow/state-dataset/memhard.h @@ -0,0 +1,109 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Memory-hard dataset core, the same text that the Mac's Metal kernels and CPU verifier were checked against. +// Included by kernel.cu (device), host.cu (host reference) and proto-opencl/host.c (C99 host reference). +// See proto-metal/MEMHARD.md for the construction. kernel.cl carries the same text in OpenCL C. +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif +#if defined(__CUDACC__) +#define IGNEUM_HD __host__ __device__ __forceinline__ +#elif defined(_MSC_VER) && !defined(__cplusplus) +#define IGNEUM_HD static __inline +#else +#define IGNEUM_HD static inline +#endif +// Memory-hard dataset core (MEMHARD.md). Cache: 2^26 words in 2^16 segments of 64 chained ChaCha12 lines. +// Item: 8 rounds of 8 x seed-parameterised mixer + one 64-byte cache read, then 8 x final mixer (class v3, mixer multiplier 8, +// docs/plans/mixer-x4.md: the round key of application j of round r is 0x9E3779B9 * (r * m + j + 1)). All parameters are literals. +#define MH_CACHE_LINE_MASK 0x003fffffu +#define MH_SEGMENT_LINES 64u +#define MH_QR(a, b, c, d, r1, r2, r3, r4) { a += b; d ^= a; d = mh_rotl(d, r1); c += d; b ^= c; b = mh_rotl(b, r2); a += b; d ^= a; d = mh_rotl(d, r3); c += d; b ^= c; b = mh_rotl(b, r4); } +IGNEUM_HD uint32_t mh_rotl(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } // n in 1..31 at every call site + +// y = ChaCha12 core(x) + x +IGNEUM_HD void mh_chacha_block(const uint32_t* x, uint32_t* y) { + for (uint32_t i = 0u; i < 16u; ++i) y[i] = x[i]; + for (uint32_t r = 0u; r < 6u; ++r) { + MH_QR(y[0], y[4], y[8], y[12], 16u, 12u, 8u, 7u) MH_QR(y[1], y[5], y[9], y[13], 16u, 12u, 8u, 7u) + MH_QR(y[2], y[6], y[10], y[14], 16u, 12u, 8u, 7u) MH_QR(y[3], y[7], y[11], y[15], 16u, 12u, 8u, 7u) + MH_QR(y[0], y[5], y[10], y[15], 16u, 12u, 8u, 7u) MH_QR(y[1], y[6], y[11], y[12], 16u, 12u, 8u, 7u) + MH_QR(y[2], y[7], y[8], y[13], 16u, 12u, 8u, 7u) MH_QR(y[3], y[4], y[9], y[14], 16u, 12u, 8u, 7u) + } + for (uint32_t i = 0u; i < 16u; ++i) y[i] += x[i]; +} + +// One cache segment: 64 chained lines written at cache[seg * 1024]. in_j = prev ^ (sigma || K || seg || j || tag), prev_0 = 0. +IGNEUM_HD void mh_cache_segment(uint32_t* cache, uint32_t seg) { + uint32_t prev[16]; uint32_t x[16]; uint32_t y[16]; + for (uint32_t i = 0u; i < 16u; ++i) prev[i] = 0u; + for (uint32_t j = 0u; j < MH_SEGMENT_LINES; ++j) { + x[0] = 0x61707865u ^ prev[0]; x[1] = 0x3320646eu ^ prev[1]; x[2] = 0x79622d32u ^ prev[2]; x[3] = 0x6b206574u ^ prev[3]; + x[4] = 0x3067619fu ^ prev[4]; + x[5] = 0x3c269176u ^ prev[5]; + x[6] = 0x84a03b03u ^ prev[6]; + x[7] = 0xf8c63294u ^ prev[7]; + x[8] = 0xff977c5bu ^ prev[8]; + x[9] = 0xe60def3eu ^ prev[9]; + x[10] = 0x63630141u ^ prev[10]; + x[11] = 0xb8fbcb58u ^ prev[11]; + x[12] = seg ^ prev[12]; x[13] = j ^ prev[13]; x[14] = 0x49676e65u ^ prev[14]; x[15] = 0x756d4d48u ^ prev[15]; + mh_chacha_block(x, y); + uint32_t* line = cache + ((seg * MH_SEGMENT_LINES + j) * 16u); + for (uint32_t i = 0u; i < 16u; ++i) { line[i] = y[i]; prev[i] = y[i]; } + } +} + +// M_r: per word (s ^ (RC + rk)) * MUL, then a column round and a diagonal round with the seed-drawn rotations. +IGNEUM_HD void mh_mixer(uint32_t* s, uint32_t rk) { + s[0] = (s[0] ^ (0xbab68293u + rk)) * 0x42146205u; + s[1] = (s[1] ^ (0xcc162340u + rk)) * 0x52cbe0fbu; + s[2] = (s[2] ^ (0x6ce151ccu + rk)) * 0x7ecf4a03u; + s[3] = (s[3] ^ (0xe62b8997u + rk)) * 0x6728907fu; + s[4] = (s[4] ^ (0xc9c80297u + rk)) * 0xd81d9751u; + s[5] = (s[5] ^ (0xf74a1654u + rk)) * 0x132952c3u; + s[6] = (s[6] ^ (0x3d704af5u + rk)) * 0xf60de277u; + s[7] = (s[7] ^ (0x3cf522b7u + rk)) * 0x05358035u; + s[8] = (s[8] ^ (0x2b9cac04u + rk)) * 0xbaf6499du; + s[9] = (s[9] ^ (0xa880ac10u + rk)) * 0xe4db9667u; + s[10] = (s[10] ^ (0x13e5dd1du + rk)) * 0x3e98f45du; + s[11] = (s[11] ^ (0x6fc3e233u + rk)) * 0xd0004eddu; + s[12] = (s[12] ^ (0x2d83eeacu + rk)) * 0x2691630du; + s[13] = (s[13] ^ (0x9006e8bfu + rk)) * 0x9beb3bcfu; + s[14] = (s[14] ^ (0x2c4b5362u + rk)) * 0xab310379u; + s[15] = (s[15] ^ (0x31b49ee2u + rk)) * 0x99cfb423u; + MH_QR(s[0], s[4], s[8], s[12], 20u, 20u, 19u, 4u) MH_QR(s[1], s[5], s[9], s[13], 20u, 20u, 19u, 4u) + MH_QR(s[2], s[6], s[10], s[14], 20u, 20u, 19u, 4u) MH_QR(s[3], s[7], s[11], s[15], 20u, 20u, 19u, 4u) + MH_QR(s[0], s[5], s[10], s[15], 26u, 3u, 3u, 27u) MH_QR(s[1], s[6], s[11], s[12], 26u, 3u, 3u, 27u) + MH_QR(s[2], s[7], s[8], s[13], 26u, 3u, 3u, 27u) MH_QR(s[3], s[4], s[9], s[14], 26u, 3u, 3u, 27u) +} + +// Item t: 16 words. s = (K, t * MUL[i] + RC[i]); 8 rounds of 8 x mixer + cache line s[0] & mask; 8 x final mixer. +IGNEUM_HD void mh_item(const uint32_t* cache, uint32_t t, uint32_t* s) { + s[0] = 0x3067619fu; + s[1] = 0x3c269176u; + s[2] = 0x84a03b03u; + s[3] = 0xf8c63294u; + s[4] = 0xff977c5bu; + s[5] = 0xe60def3eu; + s[6] = 0x63630141u; + s[7] = 0xb8fbcb58u; + s[8] = t * 0x42146205u + 0xbab68293u; + s[9] = t * 0x52cbe0fbu + 0xcc162340u; + s[10] = t * 0x7ecf4a03u + 0x6ce151ccu; + s[11] = t * 0x6728907fu + 0xe62b8997u; + s[12] = t * 0xd81d9751u + 0xc9c80297u; + s[13] = t * 0x132952c3u + 0xf74a1654u; + s[14] = t * 0xf60de277u + 0x3d704af5u; + s[15] = t * 0x05358035u + 0x3cf522b7u; + for (uint32_t r = 0u; r < 8u; ++r) { + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (r * 8u + j + 1u)); + const uint32_t* line = cache + ((s[0] & MH_CACHE_LINE_MASK) * 16u); + for (uint32_t i = 0u; i < 16u; ++i) s[i] ^= line[i]; + } + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (64u + j + 1u)); +} +// dataset[w] without the dataset: derive item w >> 4 and take word w & 15. +IGNEUM_HD uint32_t mh_word(const uint32_t* cache, uint32_t w) { uint32_t s[16]; mh_item(cache, w >> 4u, s); return s[w & 15u]; } diff --git a/proto-newpow/state-dataset/program.h b/proto-newpow/state-dataset/program.h new file mode 100644 index 000000000..22647af89 --- /dev/null +++ b/proto-newpow/state-dataset/program.h @@ -0,0 +1,66 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Program metadata for host.cu plus the launch wrappers defined in kernel.cu. +// Also included by proto-opencl/host.c (C99), which defines IGNEUM_NO_CUDA first and reads only the macros. +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif +#ifndef IGNEUM_NO_CUDA +#include +#endif + +#define IGNEUM_SEED_STRING "igneum-genesis" +#define IGNEUM_SEED_BYTES_HEX "69676e65756d2d67656e65736973" +#define IGNEUM_GENERATOR 3 +#define IGNEUM_PROGRAM_ATTEMPT 0 +#define IGNEUM_PROGRAM_ID 0xe323b9dcaf283a6full +#define IGNEUM_DAY_STRING "2026-10-03" +#define IGNEUM_DAY_BYTES_HEX "6461792f323032362d31302d3033" +#define IGNEUM_DAY0 0x3067619fu +#define IGNEUM_DAY1 0x3c269176u +#define IGNEUM_DATASET_LOG2 28 +#define IGNEUM_MASK 0x0fffffffu +#define IGNEUM_LANES 32 +#define IGNEUM_ITERATIONS 8 +#define IGNEUM_INSTR_COUNT 64 +#define IGNEUM_LOADS_PER_HASH 128 +#define IGNEUM_WIDE_LOADS_PER_HASH 0 +#define IGNEUM_OP_MIX "load=16 add=8 shfl=8 xor=6 mad=5 mul=5 mulhi=5 sub=4 rotl=3 rotr=3 or=1" +// Program class v3 (Counter ASIC 2.0, docs/plans/counter-asic-2-rollout.md): generator version 3; a worker that +// runs another class refuses this pack, and a job line names the class it wants (class=v3 era=). +#define IGNEUM_PROGRAM_CLASS "v3" +// Class v3 construction (Counter ASIC 2.0, 5 October 2026, docs/plans/mixer-x4.md): version 2 loads; the dataset item +// derivation applies the mixer IGNEUM_MIXER_MULT times per round (memhard.h), and the cache follows the growth rule. +#define IGNEUM_LOAD_CLASS "mx8" +#define IGNEUM_CLASS_MIXER_MULT 8 +#define IGNEUM_CACHE_GROWTH 1 // 1: cache words = 2^(26 + doublings(day)), doublings = floor(log2(1 + day / 1460)) +#define IGNEUM_LOAD_SLOTS 16 +#define IGNEUM_LOAD_MIX { 100, 0, 0 } +#define IGNEUM_LOAD_WIDTH_COUNTS { 16, 0, 0 } // loads of 4, 16, 64 bytes per program +#define IGNEUM_BYTES_PER_HASH 512 +#define IGNEUM_FOLD_ROT 11 +#define IGNEUM_FOLD_MUL 0x9e3779b1u +// 0 = closed-form dataset (ds_elem), 1 = memory-hard cache construction (MEMHARD.md, memhard.h) +#define IGNEUM_DATASET_MODE 1 + +#define IGNEUM_SEEDW_INIT { 0x67a9a7beu, 0x1a155b25u, 0xfddfb732u, 0x4b5af2e8u, 0xc55caf33u, 0xa27c13b7u, 0x06628a48u, 0x03852469u } +#define IGNEUM_KEY_INIT { 0x3067619fu, 0x3c269176u, 0x84a03b03u, 0xf8c63294u, 0xff977c5bu, 0xe60def3eu, 0x63630141u, 0xb8fbcb58u } +#define IGNEUM_CACHE_LOG2_WORDS 26 +#define IGNEUM_CACHE_SEGMENT_LOG2_LINES 6 +#define IGNEUM_CACHE_SEGMENTS 65536u +#define IGNEUM_ITEM_ROUNDS 8 +#define IGNEUM_MIXER_MULT 8 // mixer applications per round and after the last read (class v3, docs/plans/mixer-x4.md) +#define IGNEUM_MIX_ROT_INIT { 20u, 20u, 19u, 4u, 26u, 3u, 3u, 27u } +#define IGNEUM_MIX_MUL_INIT { 0x42146205u, 0x52cbe0fbu, 0x7ecf4a03u, 0x6728907fu, 0xd81d9751u, 0x132952c3u, 0xf60de277u, 0x05358035u, 0xbaf6499du, 0xe4db9667u, 0x3e98f45du, 0xd0004eddu, 0x2691630du, 0x9beb3bcfu, 0xab310379u, 0x99cfb423u } +#define IGNEUM_MIX_RC_INIT { 0xbab68293u, 0xcc162340u, 0x6ce151ccu, 0xe62b8997u, 0xc9c80297u, 0xf74a1654u, 0x3d704af5u, 0x3cf522b7u, 0x2b9cac04u, 0xa880ac10u, 0x13e5dd1du, 0x6fc3e233u, 0x2d83eeacu, 0x9006e8bfu, 0x2c4b5362u, 0x31b49ee2u } + +#ifndef IGNEUM_NO_CUDA +// Defined in kernel.cu. All launch on the default stream and return cudaGetLastError(). +cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments); +cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems); +cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask, + uint32_t nonces, uint32_t blockWarps); +cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps); +#endif diff --git a/proto-newpow/state-dataset/results/cpu/leaves32-2.log b/proto-newpow/state-dataset/results/cpu/leaves32-2.log new file mode 100644 index 000000000..eec4d96e0 --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/leaves32-2.log @@ -0,0 +1,2 @@ +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.179 s (first pass, includes page faults) +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.083 s diff --git a/proto-newpow/state-dataset/results/cpu/leaves32.log b/proto-newpow/state-dataset/results/cpu/leaves32.log new file mode 100644 index 000000000..30fb91afe --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/leaves32.log @@ -0,0 +1,2 @@ +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.172 s (first pass, includes page faults) +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.073 s diff --git a/proto-newpow/state-dataset/results/cpu/rows.log b/proto-newpow/state-dataset/results/cpu/rows.log new file mode 100644 index 000000000..73fa95833 --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/rows.log @@ -0,0 +1,9 @@ +B.1 per-unit rows (4,096 per unit, 100 units, one thread, ms per unit) + (i) 4,096 random 64-byte reads from a 2 GiB resident array: 0.108 ms per unit (min 0.092, max 0.172; 26 ns per read; array write pass 1022 ms) + (i) 4,096 random 64-byte reads from a 8 GiB resident array: 0.139 ms per unit (min 0.127, max 0.183; 34 ns per read; array write pass 3783 ms) + (ii) 4,096 leaves derived on the fly (one ChaCha12 block each, no array): 0.284 ms per unit (69 ns per leaf) +B.2 host cache fill (256 MiB, 65536 segments x 64 ChaCha12 blocks), one core: 0.447 s + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 9.01 ms per unit (min 8.91, max 9.60) + 4,096 x (leaf + mh_item_sd), naive: 9.31 ms per unit + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), one core: 1.670 s (100 ns per leaf) diff --git a/proto-newpow/state-dataset/results/cpu/rows2.log b/proto-newpow/state-dataset/results/cpu/rows2.log new file mode 100644 index 000000000..c7831c594 --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/rows2.log @@ -0,0 +1,9 @@ +B.1 per-unit rows (4,096 per unit, 100 units, one thread, ms per unit) + (i) 4,096 random 64-byte reads from a 2 GiB resident array: 0.163 ms per unit (min 0.144, max 0.201; 40 ns per read; array write pass 1252 ms) + (i) 4,096 random 64-byte reads from a 8 GiB resident array: 0.209 ms per unit (min 0.203, max 0.229; 51 ns per read; array write pass 4325 ms) + (ii) 4,096 leaves derived on the fly (one ChaCha12 block each, no array): 0.285 ms per unit (70 ns per leaf) +B.2 host cache fill (256 MiB, 65536 segments x 64 ChaCha12 blocks), one core: 0.452 s + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 11.24 ms per unit (min 9.38, max 13.51) + 4,096 x (leaf + mh_item_sd), naive: 11.64 ms per unit + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), one core: 1.677 s (100 ns per leaf) diff --git a/proto-newpow/state-dataset/results/cpu/run_cpu.log b/proto-newpow/state-dataset/results/cpu/run_cpu.log new file mode 100644 index 000000000..03a0b7c81 --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/run_cpu.log @@ -0,0 +1,27 @@ +== Tue Oct 6 07:44:26 PM UTC 2026 on igneum-build-1, load 18.98 28.50 18.66 +Model name: AMD EPYC 9454P 48-Core Processor +gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 +== build +== B.1 and one-core B.2 rows, core 4, nice 19 +B.1 per-unit rows (4,096 per unit, 100 units, one thread, ms per unit) + (i) 4,096 random 64-byte reads from a 2 GiB resident array: 0.108 ms per unit (min 0.092, max 0.172; 26 ns per read; array write pass 1022 ms) + (i) 4,096 random 64-byte reads from a 8 GiB resident array: 0.139 ms per unit (min 0.127, max 0.183; 34 ns per read; array write pass 3783 ms) + (ii) 4,096 leaves derived on the fly (one ChaCha12 block each, no array): 0.284 ms per unit (69 ns per leaf) +B.2 host cache fill (256 MiB, 65536 segments x 64 ChaCha12 blocks), one core: 0.447 s + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 9.01 ms per unit (min 8.91, max 9.60) + 4,096 x (leaf + mh_item_sd), naive: 9.31 ms per unit + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), one core: 1.670 s (100 ns per leaf) +== B.2 leaf array on 32 threads (cores 4-35), nice 19 +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.172 s (first pass, includes page faults) +B.2 leaf array (1 GiB, 2^24 ChaCha12 blocks), 32 threads (OpenMP, 32 actual): 0.073 s +== verify_sd per-unit rows on this CPU (core 4), for comparison +verify_sd mode sd1 +host cache fill: 480.4 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +per-unit rows on this CPU (4,096 per unit, 100 units, one thread, ms per unit): + (ii) 4,096 leaf derivations (ChaCha12 block each, no array): 0.285 ms + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 9.01 ms (min 8.92, max 9.44) + 4,096 x (leaf + mh_item_sd), naive: 9.27 ms + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +RESULT verify mode=sd1 host_cache_ms=480.4 items_equal=-1 lanes_equal=-1/0 +== done Tue Oct 6 07:44:39 PM UTC 2026, load 16.75 27.55 18.50 diff --git a/proto-newpow/state-dataset/results/cpu/verify_rows.log b/proto-newpow/state-dataset/results/cpu/verify_rows.log new file mode 100644 index 000000000..6ec027408 --- /dev/null +++ b/proto-newpow/state-dataset/results/cpu/verify_rows.log @@ -0,0 +1,8 @@ +verify_sd mode sd1 +host cache fill: 480.4 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +per-unit rows on this CPU (4,096 per unit, 100 units, one thread, ms per unit): + (ii) 4,096 leaf derivations (ChaCha12 block each, no array): 0.285 ms + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 9.01 ms (min 8.92, max 9.44) + 4,096 x (leaf + mh_item_sd), naive: 9.27 ms + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +RESULT verify mode=sd1 host_cache_ms=480.4 items_equal=-1 lanes_equal=-1/0 diff --git a/proto-newpow/state-dataset/results/gpu/control.log b/proto-newpow/state-dataset/results/gpu/control.log new file mode 100644 index 000000000..622275ffe --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/control.log @@ -0,0 +1,24 @@ +state-dataset bench mode control pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.86 ms first, 1.81 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 380.5 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +dataset build (igneum_build, the pack's): 30.62 ms first, 30.55 ms second -> 549.1 M items/s +device memory after the build: 1675 MiB used (context 395 + cache 256 + dataset 1024 MiB) +dataset[0..3] = fdad4319 1a7b68e1 de6db608 13d73892 head 16 vs Mac PASS, word [MASK] vs Mac PASS, 64 Mac samples PASS +dataset self-test: PASS (64 random words vs host mh_word: PASS) +item bit-exactness (in-process, host mh_item on the host cache): 1024 of 1024 items equal +vector warp base 0: PASS (0 of 32 lanes differ) +vector warp base 4096: PASS (0 of 32 lanes differ) +vector warp base 1000000: PASS (0 of 32 lanes differ) +warm-up batch: 2^24 hashes in 266.02 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): 7c28cfb06c5c65a9 = 7c28cfb06c5c65a9 (the pack's) +vector warp base 0 in batch: PASS +vector warp base 4096 in batch: PASS +vector warp base 1000000 in batch: PASS +dump: 4 warps (bases 0, 32, ...) written to dump_control.txt +timed: 10 batches x 2^24 hashes, GPU 2659.56 ms -> 63.083 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.078 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 207.6 W, SM 2745 MHz, mem 10251 MHz + -> 0.304 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=control gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.81 host_cache_ms=380.5 leaves_ms=0.00 build_ms=30.55 mem_build_mib=1675 items_equal=1024/1024 fingerprint=7c28cfb06c5c65a9 mhs=63.083 mhs_window=63.078 watts=207.6 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=PASS overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/control2.log b/proto-newpow/state-dataset/results/gpu/control2.log new file mode 100644 index 000000000..984d88dc3 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/control2.log @@ -0,0 +1,23 @@ +state-dataset bench mode control pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.86 ms first, 1.85 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 380.0 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +dataset build (igneum_build, the pack's): 30.62 ms first, 30.55 ms second -> 549.2 M items/s +device memory after the build: 1675 MiB used (context 395 + cache 256 + dataset 1024 MiB) +dataset[0..3] = fdad4319 1a7b68e1 de6db608 13d73892 head 16 vs Mac PASS, word [MASK] vs Mac PASS, 64 Mac samples PASS +dataset self-test: PASS (64 random words vs host mh_word: PASS) +item bit-exactness (in-process, host mh_item on the host cache): 1024 of 1024 items equal +vector warp base 0: PASS (0 of 32 lanes differ) +vector warp base 4096: PASS (0 of 32 lanes differ) +vector warp base 1000000: PASS (0 of 32 lanes differ) +warm-up batch: 2^24 hashes in 265.99 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): 7c28cfb06c5c65a9 = 7c28cfb06c5c65a9 (the pack's) +vector warp base 0 in batch: PASS +vector warp base 4096 in batch: PASS +vector warp base 1000000 in batch: PASS +timed: 10 batches x 2^24 hashes, GPU 2659.55 ms -> 63.083 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.079 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 205.2 W, SM 2745 MHz, mem 10251 MHz + -> 0.307 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=control gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.85 host_cache_ms=380.0 leaves_ms=0.00 build_ms=30.55 mem_build_mib=1675 items_equal=1024/1024 fingerprint=7c28cfb06c5c65a9 mhs=63.083 mhs_window=63.079 watts=205.2 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=PASS overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/dump_control.txt b/proto-newpow/state-dataset/results/gpu/dump_control.txt new file mode 100644 index 000000000..5bd5b0a0f --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/dump_control.txt @@ -0,0 +1,134 @@ +mode control +warps 4 +base 0 +19b56348bc85304d +b08a9cfb44aa720f +e1f8f627f780eff7 +2ff3e86ff1696161 +b65e0578c257e8ac +f37b5705c2bebaae +b19fef670982389e +2374331b28827a11 +f492cdd05dda7f88 +37700f1385e19885 +a27524f3010b3e87 +6c8a24de8b938c43 +3dc017c8820cfd16 +5c80d37146657b68 +214082cac03f734a +1d67c665145d72f3 +9fb0ae736eb87ff5 +cd7d416ae3a6be61 +0069cda85c6de58f +0b7d82e717224baa +600960f6d7be30f0 +eb29032663b0c4d2 +f29583a5766408f1 +6c9532a99ad7314d +9a949fd0959cc80f +a20258520e7f6c25 +f2ab11f9bb032e38 +cc967bcd0c8d07c1 +37745267bb3231f2 +35a046048c2b69b3 +aa51834cd3f364f3 +359192708e4f754a +base 32 +bbea9a410fe7d5b7 +11bf76519a1414d4 +59c52e47a752a4fa +3964f1251e8b90e8 +75230c9369b790af +8dec6e557dc03a87 +0b819148666b3f13 +7707a6b8d499e40f +445de8aa5b9699d5 +6becbf9e66d7e9de +7a46928b6ed6861f +0cbfca3b2c769872 +04e97a5b926b55d5 +2a7ba12634ae81bd +96cb4eaf4e25600a +2826bd0a4355a91d +d7ba781350c80652 +e87c0820f6136930 +e8864f498a00a8e5 +c1b445f3b5748847 +72def57f2e515d11 +f4708f2d80c98b8d +da99416aa6245b67 +90f6e6d21f11fc66 +a9e3c5f36c715c31 +e5e2a586d61e4869 +98e1ce97884663da +36e8af738edddc85 +8530526bbf3d85bb +22128f72173887c6 +30b7aa6ab94449e2 +2ea3ca54249bd934 +base 64 +68b73c212b47e6f2 +55acf1fa7bbac2dd +45001afaa68359f7 +3271315def7632fb +8af0fe0f8b16148b +2e0c7f7bac0276e1 +fe178e4364b66e31 +f39df092fabe08ad +e6d7ad0a5d97a7eb +0013aa74d3b41bba +f57f5241a626b717 +747067ae7e06c706 +50325d1d39c18b09 +1fb5aa02196bd962 +78eaa19e7dd002f4 +8fe0600a8ff1c365 +021d685d64796246 +281446f54c93f2a5 +ba2cc4bef235b006 +bfb4bc312bd962a4 +cecc08bdb679ca9c +1f079cb2d03b55a1 +a8cc9f0647e103a0 +2615618b9cb4877f +853f0dd6f03607f2 +bf54084008cd8ca3 +21986116f4e97e6c +42dbca5da95d1b1c +d7669ed19dea6986 +17e407aa53422e43 +8c7d4f5bfde2f58e +13adadad05f4540a +base 96 +3a0fd3ada6b5a797 +aa5a637cb9caa3b7 +728b73955e0ad47d +5092aa36c478581c +a463e4220676d004 +ce92dfc65d3af26e +2943fd8967c7f215 +71acd3ccc8054eaa +2b93c6cd8c22c051 +00f10e1b004bab4d +02e2733b82de9bce +1c9d5cd0ed5350ce +dcd13404e4ab0b21 +d4afc0e3a2814f63 +f2b37d4b0322ff2f +0212964cea5688de +546351f9a3ec9957 +d1fe39207bff2a50 +a9a38d54a9f85090 +e039372a0cc1aa9e +008a4289a796e05e +a9a1dca5b9de1fbc +751a1769f1203a6d +5b66d9c952febc43 +47ac39abda0dd053 +c7b86597a7ef8d83 +d87824ea2fd452c4 +82a39552b84b113c +562aa1cb671a8056 +4dc55d7e9e0829dd +bb0cf26fbb506ddc +353c62d9a3b6aaed diff --git a/proto-newpow/state-dataset/results/gpu/dump_sd1.txt b/proto-newpow/state-dataset/results/gpu/dump_sd1.txt new file mode 100644 index 000000000..942c1d135 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/dump_sd1.txt @@ -0,0 +1,134 @@ +mode sd1 +warps 4 +base 0 +b600edbed969becc +2d988317678e9099 +29609900b3a81764 +2506a510ec612b1c +cdc516143acae7eb +dd2901cc2335449d +41614b8fbf48a689 +317f5df1eb7c0cbe +2da7edd46d732703 +b89b6f78568676a9 +e93e96d589f70d8b +197bd4558fe42bf7 +911c2ed1bca014bc +448984ee31e0f576 +6a9af9585e6ce6ba +446ba1d41100da43 +d206864c5393aef9 +46b93bf7a7b89196 +85ce18e332a13c31 +34f1d32a0f153659 +d2b8703f431f1237 +3bda4edaa92faa6f +d8e5b9f18abf75fd +234a323a6d619bfd +9558b3c4e42cd2f7 +016372acc63f6372 +7ebac0c7e5fc87f7 +81f40d3ef4b5508b +aa6ec7854aacde98 +692a050230de2fe8 +18b7df938406f9a1 +2412df7ada5a3202 +base 32 +e451566071a2a0ba +d63578a9312e5b32 +6bdaecc6d5f7158b +694c691e7dc1de0a +d98a0709679797b3 +17a7c68f4ff5e95f +58222d4156171349 +af4bcd67686aad89 +fdad4d96931b9f2a +5e16c79bd1f2c688 +7437b2913e288981 +7b4485a218901ccf +540694fa54e15619 +e42600d66ac6e0f5 +3b2b6322a93124d2 +b474e79e977515ae +85c356e1a7f560fe +47961522447a02fc +5cf31818bea49c4a +a517ba58dbed530c +d1b37bf54bd68236 +27905e28697a6ef7 +42a743ba99c22bf9 +5ec48e4245545d4a +38ecfefd174944d8 +3dd1891a53a9b415 +44120379678fcd2a +e2b43434e9e5b97f +db448577e2229d66 +41eb61946c60e9a7 +53db71d828b8d7e6 +ea19aabc66d1b11a +base 64 +34548f5056f27d78 +e7fea9a49cf2556e +ebdaf245ef41ec6d +3c77731e46a78bd3 +e985324128b13372 +c13540b76c4dfc4a +9050d43f68bf20e9 +4aa7762e9a08d90a +d106b0610790817b +5c9c91398c9b5e7c +56b71969e73c466e +2d61dea47bf479bb +2ddb7cc8f81fd24c +f422f7adbb7a230e +794858ac6a6bada1 +c7a37f1c3cebeea4 +241f6632d74d699e +f8e536083c72f300 +3234e942615b9891 +573677792f6bfe53 +6838b021f005dee5 +7e1042640bdf5609 +4a0399c7b6ca97fd +37ad996ce5fb721a +f633ed2dc43bc76d +e569e4a049054982 +a9c5fa29d0ab9603 +ca0dcf5025e589f4 +17687fa3872dd204 +965e7bea52b291a7 +d3aec969f424c835 +44453d33abd93ef6 +base 96 +c13d6ea3e05c5e46 +1c291747d4676990 +349040c82d1e4ad8 +f05a14026be82f03 +5ee5f52611690c2b +60c99fb5c988e677 +3d0899be8af84174 +74dad192f88cca2c +005480c1f5e84d6f +a38fa3da9db77186 +9495da0d026c51fc +54f4ed7062e92211 +6f910c4ad2774774 +55752a05b9fa5b71 +883b5367142927bf +96449de7c472e375 +f8722d3292d2948b +21d0485f77308767 +010a6d05ede7793e +56cbfe0810728799 +e136e570c4ed04a9 +848c020abe56db44 +71aa3cddb1bc9408 +58757e0f19ddb3ef +f2e4273de46c5968 +8664ce7ab76eceac +881db7223c9a750b +788a1553b16895ea +c84a69728aab9555 +9019c8d87a1da486 +4ab485aa2deb7ca5 +b2795a944cca750d diff --git a/proto-newpow/state-dataset/results/gpu/items_control.txt b/proto-newpow/state-dataset/results/gpu/items_control.txt new file mode 100644 index 000000000..2b6bb5c26 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/items_control.txt @@ -0,0 +1,1026 @@ +mode control +nitems 1024 +1308209 0069e7ca 8f7c0ccc 26d7cb2b 23f0c269 df3a7b85 aabbe8e5 d343b47b 9cc20f38 a2164b7e 87cefa09 7453f80c 79db1fd2 5a553d34 9ae2c3be c64ddcd7 172cc83f +4552145 6bf48634 2d644e45 181a21e5 e6898aa4 8b467c87 19d9b24b 46c9167c ab6ce572 895133a2 978cd843 c5eaa1a1 7736f326 689c0969 48b8df2d ea715b19 754d8930 +12987338 d232a521 00c9afc6 94319a7a 179db688 e710ad7c a1119220 ab69ead4 057ee227 7ece0088 37536596 7fda9271 ff88276b 48b24dbb abce0e1f ac492258 9ebea93d +9027470 e4d1a14e 5f6b35cf 9ef9ebd5 7b2b0fad f24aaf54 191322c2 8d05c6ac 8f9ebf64 bc57ca37 e8d5c74a eb1772ee d41bc818 d89dc511 98f8178a 0b607549 3385f210 +14001729 03e768fb fe9ecce5 228e64ad b13ac54e 0576c5bb d5e8376b b8da0875 84c7acb0 45e17547 ee1441f2 4ab8303a 476ce57c efe1d759 8604c6a3 ccb2ccac f0f4bd5f +5094079 411250f3 5d7710f2 7270b851 f2b623f9 3f785d62 8c881a5c a4fbbf9d 746d8c4a dc54e9cb 5781b5ee ed5088ca bad0d1ac a42e2b1c 478e9f52 99ccdb98 226ff503 +11481792 f94e749e 9b3b6cae 4c64c547 51c6140a 27019fc3 419f44fa 49067e2b 7b62b97b 0cb3188f d1d8ada8 fd4ffc5b 9dff4b5a 13318096 b1cc52c9 26a090ba f768cad3 +9883186 feb1dc40 f36ae81c 3fc24553 97472824 bac38f92 f870689d 4eee9576 21afdae4 ffb2fec9 f37c5ecb 64c8c77e f097d122 ddc17102 a01815c8 dd7872a9 e355c4b9 +5522740 14d71ecd de63f5b4 2c4ffbef 7dbe5d72 1f1811dd ff3a9b7c aac11449 02d8c635 647766f5 c4bbd3d2 bfc7ad32 951c93e3 543aedb1 5b763a91 07536895 5c43386a +16734959 71d3f0b4 2055fa6e dfa9c810 9db5c4cd 15078e2c 6d24ecb0 4ec25f39 c70f9951 8d0340d8 51d1af58 45d56abe 82886ff2 2b4ad805 af253dea 2a0e5d81 0e18be7f +8919515 7a642dd7 498545cc 3b807747 c2f4236b 29fc5547 0e4c5aeb 57c2af6a ffa059ff a924a8a4 83887aa0 5a16637f afed6aa0 2aed579a d3dc8975 987a5ca7 cde6afb7 +10635154 05d61a9f 1cf0071d 418f442d 13391511 9c1750cf 95680dd6 daaa717b cc2793a8 2fff4f20 d2096816 52de5068 a5b5c0c8 b038b04c a5d7c678 e3396819 b6451afc +16144246 63c69bdf 3a1a6ab8 31e8f03d 9d32fb73 40a161d6 7e15ccc8 27e753c4 0a1f8838 d62d7890 238aabbe c0de4b30 3c577812 047254e6 beb4d515 b2dcc77f 58411fc1 +8950859 263e6f39 2eabe21c cac5df3b 09075781 6463a687 886005d9 db5f7aeb f1bb4461 268f3ee2 655b1133 d7f7d552 6af56071 749746da fe8c70e7 d92c6a1b ab5c21f2 +4502286 d49b35e5 dfa13af1 04b8ac7c 91121ed1 c9847be3 1df295b8 a19a2f31 b4413693 3290bb47 9ce65510 041627ba 11fdfe2e 22f51327 abd3b63a 620594eb 3971dd28 +9575818 458cf11b 8526390c 828b2d09 1b5169f0 cd397ba8 ba1b2078 245c74de ef043efd 819b3c76 0bc4d586 bca9426b 7e908139 413847da ed62705b 96594555 de3d0d83 +1850167 49c6a527 ffb0ec4c c464669b 388c2911 91bbd23e 6b2428d3 b30b2ca4 d442f8ac b9d08704 21962587 000a6a5d 13b15a12 80bc6d7f 93182199 550c01ee 0cf86f12 +3986562 e5b0dfed e7ab6946 b983dea3 b9a5407e bb8eb8a9 cfd59b36 e6295f8d b176eaa8 06710579 324ee3a5 d367d728 8cae41d1 635cdc0f fdfe146d 3006bd3e 50717029 +4059249 8de5ab5e fa5d17aa 7a595114 91ba5d0f ea403323 e0a4b46f 20c4945e 34ab6b72 cc137fd2 df8ab614 8984b088 067d9516 f97a66d4 9de0a29e 2abbcae2 61f3af31 +13040904 1268b6ae 531f79ab 18a7a53e 4734de32 5cae6edc ff4c3ded 5a77dd42 57f692bb 8c322d9a 3ea24275 188aeafe 11bcd022 f2d4bdae 9669c177 e64b84f4 eba483db +3094921 1e27ee9b c38f4cb9 fd43f0a6 847c4e53 4a230add 73bb639a ccce3c0a ccd0572c f098fe05 d3a5c8ab a23e11ed bb243535 a9adcf4c 331f8954 f3613dca eb4a482c +7898561 56f491f9 33acde25 e9f4d333 beccebd5 928161bd 2c153acc 4924a056 a9b139d6 f6e34b6b 98bdbc44 9319d1de 39814d50 ecb74529 21406ea3 eee85c16 70f49fb0 +11737453 ee2e73e1 1f520f05 f17936bb 782c5aeb 06c39431 589a69d1 af26873d 3c109046 6149bc8f 86468414 7ef831f7 97fc2c9d 9a260d74 0c74500a e6063764 387208d2 +9189220 b15b2daf 2759d1c1 0c93bb28 25410829 4e89956d 50c27144 620725df c48e9cdb e9dd10e2 efd2a13c bce385c3 96662c59 09aa0b89 5175fc9e b8d8973e f444d97b +9117437 4576888e d007456d 37340d8c c9c2e0e0 d8f9c713 7be336cc 1820880e 6086d684 503d4dbd 84081a81 aa383134 503d225a 52d98c72 c3e67860 36c57801 00a11918 +13500785 4c7cf4a4 58fea762 e45b4485 bbfa7435 fcddcd38 736d4f6a 0d6ab0d3 6896151a c7677ed1 4e3192f3 50103552 cd6f157f e2482986 b0b6b3c1 a8000d77 aa70a33b +12742882 4f10e030 9a1b4108 866e3255 e606e76c 5ffc336b 5f8cfc2a 31139e71 c8038d26 4c6cdedf 706641f9 8d9d9b21 babd13e8 41004745 c2f52989 4252a1b2 0f812526 +4903252 84528471 80aef089 e3fe97e9 51efa5a5 196108db cf325bdd a203669d 637fcee9 75ad72c2 8dc7861c 37fe9bb9 e6814caf b5f1c810 7cc3be07 0385e65e 1ce20350 +7287670 1502141a 93d5c513 decccd47 f49ffc71 1d537ec5 580324cd 4554710b 91697cd8 0efe2eac 5cb79af0 7a9b2cf6 73176fab 753d8d47 8003a8f2 b9fd9479 c03c54af +9352291 4931a7be 367b8e35 72fe1b44 794bb59d d3fea7a6 8ec08ff5 b91c7a90 0f5fde5c a08b21c0 f068cac1 5f1a7f6b 4c4b6616 58d5f4d3 339abde9 80363fb5 8187a0ce +2831278 b3be7d7e 322f906b 8c711eed f678e981 220867b2 b8efe838 1c9cd96e 830e00cc 28f491c8 d9d0caad 19342aad 6bdb2cfb e663e7c4 fe3fe197 774a6608 c3f384e4 +12584602 09b9c95d 4581c316 18071c62 12c7b735 3e5ec1c2 e3bf7b7f 730bcfae d3d8a024 8ace5217 9fc24287 7a9607f0 ce14b35b 986d83ad 38472f13 cf8b61df 90021f12 +6669777 3429b0df f31b0e87 5b63a296 56c71fbe cb90e9a3 09d6ae75 b3ced572 16d8151a 4f00956a 8f628d49 3087453c f554e576 5af83c7f a90709b0 4e0b43fa a043c087 +10054797 960da22e 7abf76ff 02e272cf 75a21e5d 6773b28c 8b6ff1c8 d7cef2af 54c245fa 0537f777 a26a6028 7ca47674 e174f8a5 69364997 b51c819c c3238382 43db8984 +6649998 7345344e e3a17d30 ccfab8f6 06f347b8 b5a38b98 344b6876 d18251d5 dd4d3985 fdafb2d7 add5401c 422aef17 954577bd 60a7debe 89a0c80a 03da6200 635abe5c +15220717 c36b02da 42f8aeed 26db355d 71e6d316 070548cc c7d30b6f cbcee13e 0ba649d2 4853bb06 0e09ab27 cc2acd04 60e3ee8b c738aa2e b2a19bbf bfbac010 a4fe7f1c +3381179 231ad3ef 6a8d9cc5 4eeef438 5fb9e790 05521645 b4311900 59455b37 287153ae 4df8eac9 a51a94b0 2f41150f 4fae2e81 78cb76e8 855ae847 ea2a8bb1 a36969b1 +11560265 044eb439 ac0a9cc2 9b345d26 e5720569 b8548a83 d127bf11 c7be4560 09f32a03 47b9df1b dd8d1348 e85dfd45 b6e2a793 da93184f 1d5d6b31 4d754880 6840a5a7 +1548514 54547cb7 76bfe824 9cdddb01 3399cd0c 97fd3706 ad2e56e8 94ac1362 4e768b03 8c8aa261 94554eb4 4c02fffb ff867db3 db20a58a 9904af20 2cf28dee 7373a907 +771316 dfc5d593 d408d4df 298ceb12 cc10dbde 2952b1bd 46d79c27 7ae4aea6 f54af593 efecc0eb 09e37fe7 4e6424fa 556293b4 21fa8298 c62f1472 83addd7d 75ed4593 +5195814 b47d1c44 b5748c2e a8b2e93a 3dbca023 b5b82213 af0ca4f1 7125894d ae130cbe c53a9954 fa280630 9d00a7de fbc86d2d a3f3c90c 63cf224a 6a1ec57f ce46602d +7374727 fd977771 a8724297 d8920d83 06e03d49 e3af256d 41b9f1bd 8e938f0b b9cd5ac9 f554ca97 a7b4d104 75138fd7 18d6cb09 d0f9d879 04ca921c a8aaf615 e6e7186f +6028178 08bf8638 cb9d8c87 1f4f883e 9b7f023f 9995a34d b6b303a5 1938ce8b afb4dbe8 8b70a82e 3a927d54 7d4545cd e3406839 80ca2a58 09f446f5 9be42ae2 cc1a26a0 +8357875 1c242fc0 9bae4c5f 9caf264d bafc77a1 93c9310f 73155cef b29ef94d c219a581 966fc7b9 7c7875e7 7c96a199 df6226d3 18ef3235 cda526c8 fb7e27cc 8f46da6c +12310424 51c759f6 c46dc575 929a47a7 07acfea5 0996cea2 79de642c faf20c4e 81c2f663 f3890b88 1823e88f e99b7082 2af86ea5 f6299510 18975203 aeea8b5e f3da7208 +13253444 d48f9fad 3e979f3e cc8519f0 0dc294b0 454c9656 31114824 e022572b 6eac8a5d 01ee84a5 01b3950f ab50fe6d db8b8707 f04a8b9b 949bd6c0 bfde7a0b 7720dc04 +16208941 ed152eb2 6ccee904 b845585d 7c1d844b 770d4e44 85feec3e 67aa8749 698d2f12 ff1213b0 1a13daac 571444cf bd52abad 1149ff17 d25fdc65 d0726992 456a3ce4 +16044714 7e33b3f7 19c4a6b6 9b8bb0e8 6eb29b04 d4b22b86 42620ce8 34869c43 7ce7188f 9b5078ee b444b4f0 820119f4 14da641c fabba92d c8936074 e051100f b7af2b48 +11193701 28109f93 7baaa48f b917bd00 27825c31 b4434137 9d317c39 aea4b98c a704cd36 7b4f8f57 ef2df34a 46535f25 e6534b09 ac4e7d6a 89846ee5 93c2b9ae 73c2a42f +13945543 54d9caac 7f25f333 ad042084 ba47dbbe 08be9322 7492943c dc26272b 586ac11b da77cfac ec1bd283 18ff1f92 8f4686de 36fa47a6 74ad711c 11dbe71c ef99a21f +906631 e653508c f4ed6ca4 4e0545ab 202e9378 bb14bc0c 2b86a49f be135441 dad0e055 ffae0539 1942d0f8 b5e5c32e 6591a269 69be97f0 14c323da 3888e92e fbb7e263 +11769370 8e46ce55 697592db ceb14a2b d5c5e7e6 65d02bb2 aabd55a2 36664a94 ab92c92d 03c830c7 afbeb64d 05c97245 516a2a1e 88a19515 4c6c0779 4fe7a166 0b7558e9 +15061385 00855e90 e5109320 bb888940 beb6505b 1d3b6b1d 36ac86cd 4c2c3e83 9ad59422 91b38681 dee2ee60 1536b8ff e0fee8e4 f05131c6 54795e9a 73fae026 9f311b85 +6018395 8941cbaf a816df59 f77986f2 c987a79d 9f07ff11 61b375b7 a2a308e1 349d6774 233a9fa2 46f74017 08750af9 677fcc5a 19e7e27b 67d55738 f05db3ed a9d31627 +15776046 dd2b5c19 06ba2613 b9887f6b f628d557 8e5d903a 26ba2d0a 10c184e9 497ce13e e298c87c 731a77b8 959d1aa1 ebda82d8 c7d461e0 22345529 2fafaafe 06bc5e47 +4189668 d004b676 d286935b 709abf4a 21c2332e fc426dff d0acd4a8 bc9ea5e9 a699baca 43f8121f ccf9a44c 50624dfe 0e22b905 868c6229 2be9bd5e d405d081 a30d0a96 +11798046 bfd20507 e7c986e8 46a2198b 3671f7ea 1662197b b822899c 43835421 271e762c 5c7f4ea3 72a99047 89c6079c c6daf690 02aa33ca bb226137 7a381b91 345853b4 +11328552 c3b33307 c906e5d3 ebe1d847 860e2362 eb8af80b ceffd470 f971cb8c 8f5e96e8 308ba47e df0942e8 c41f8600 0f540c0c be0bf90e 0a9030f5 fcb14821 6e509260 +11248753 8991ac70 af7b0ced c944be5d b6ea0489 089f0fec 98556cad 99eddf03 51a0d710 34bb2a0e b8249493 89c7e5e0 c5a5b89e aeb4b5a3 fce9305c 7c6e03ea 08514f93 +9580634 015f41f1 54712dab d2a1ca5d 65866e75 ddd7c130 af1f6c5c 6881eac6 edc3cfb2 9cf8df9c 8a034155 0497c0e5 f222dbb3 2afb8f0c 0509008e 0df5cae8 d80cc0a0 +11167137 078fa684 401d6865 1aa9d29d 249a8e2f 0b7d4dee 4710d9b2 4c103ba8 16a26ec8 15403ffc 6e5d4840 ede0f2a3 4013b64d 903d1533 b447fa11 34f861d5 70ef07a7 +6369126 6c25f984 18149139 759c6e4b 05e79539 860b4b1e f86d01a4 4b42c886 dd29cd6f 1213f8ca 83130a0d 461c0a6d 0f1c8e14 26591175 c9f2844f c8aa4720 5bf7c0f5 +10640826 ce954bd7 6335fe7c 60bed2bd e6a61442 968eefea 9d1fe52e 36ce21e5 32fe651d 95247c0c 79d1ca19 8259e6f0 4acdb45f c644bc46 f8673260 08e48f46 a8a0e193 +2731241 0678e774 003386a7 50572ae2 085115ad 284ca3fe ed2d49c6 cc1ca442 acf4eb7f 32b617bb eae8d2be 16b0470b bdd21a44 a9bca9b0 ed2a8e39 c0e8c84e a2635cee +10154349 2173052b 5204d971 2187654d 55c06cf2 d86940d1 3b32c949 8981a859 58fece74 eb247718 fb9668a6 8acaaa54 77386972 fda9ab58 a96e4a32 60b50773 e7424a86 +11547318 761be51e 14fab2ee a7291d6e 7fa647b1 eec6bddf c6e2917d 9dc1d8bd 9df5be14 2bd5e8a8 9f587dfa dd46716f 60d112b3 6161be08 9879a2df 38c3acf7 64d001d2 +13476419 054c9d68 891400e4 7b20f85c 3fc4ebba 64a2d5dd 427686bb ae91a39b 207f1b23 7dd01107 7469d4bb fbe7373a 5a1532c3 b3570fb5 041eb0ce 19bfccf4 0b2f0857 +9855703 044bdcd7 032efb95 b45b81af 1fdd2e3c 075dc059 ffda2899 0e67ea0c db640c1e bcf79245 b0cb878c da3757e9 2edd4207 4eee7bdc 801a8ba9 bd63dd6c 014db661 +5862071 cf115d31 c4a19d0a b319195d b073b2b2 40fd1ac5 08391741 f4808aad 3fdabbf6 b37dc7f5 92b52575 744bd384 2417c9b5 e2e5e2dd 7fd4f1d9 53d28b44 91839e6b +8582110 c12df2d0 d39ff94b 3afa964f 4c2e03a5 ea632f1d 9a254ff4 e9c81b58 9ccdf90a a8f70440 9ddc4d3a ca3da423 4581b5e2 2a285988 660845d5 4ad976fc 06202e06 +8928101 63fe480f 67ad84ca fe881163 959ead80 68d17db1 7a59da62 9b622f7b f0f2f18a 6da195d6 c908f30b bbb05b85 cdfbe507 97a2468a 451992ec 9b59f76e 03e875e6 +5691371 53fc2d81 939f0c11 df31ac48 7cab6654 c3baee36 3955ddc2 cd4d36de 5c371825 3ce1a790 80a922a6 e18e5460 221073aa 61ecdaed db9c4f51 6ded918e 59879ab5 +7311879 0df80d23 61fdf4b5 44994585 8a914bb8 ba7dca6e 3f6470d1 a5b49efc 5713f2aa 1fe68b06 136f37ef 16348fd5 fe260d48 78c6e9c0 ec61c00e dd2e4d39 12f90b30 +15930901 05bc98c4 da9daf33 b7459fa9 0d0c0e81 fc7f7406 5cb34de5 48f57c10 83b04cde 0bf0b6f8 54aa85c6 d43e6cf1 e9541c61 d9f40a6c 69342c6b ed715a9d 71447ce5 +1622608 aefc197c 0473b1c9 fdd8ce13 48ecd0a2 ac16d9bb 830ef341 9d6f1890 80af6cd0 a45cf7d8 ec393d2b 38a33f98 95302712 c435a683 b5eb4535 26b1b413 e024eaf4 +6354746 e349c20d 2effb77b a49a5276 c8c1ba1c 9235cd05 d50e7f3e 63c005c3 e9cf71ea 07fee0d6 4b7524b2 d36cc9df d07bb249 f3591048 9ba76a95 21060940 bb30e820 +15786418 95235486 0c2069d7 e9b7688f 90c02c94 8d09e75a 9c180d32 653b5812 70434b09 a6a2c424 4763b413 2b76f06d 20b867cb c5400c02 dd401d65 2f22a206 01b39eb7 +3468307 ee0602af e918aa22 ad9025c5 1dcd5ef3 92eb9d43 4cbcd09b 139fb8f8 ba7b5a58 41888019 2e5cff43 bf0d3594 d00d5a6e 1ec1236a fb52014a 7148ed0a e795957a +9751198 69ac40f9 cfe9bbe8 f1c052af b4b1b0de 6fa85b23 a6c86166 8020beb9 1f69dd31 2b8de0b8 b59dd2d2 bcd179b3 30a562eb 1e73b982 5e6d4c82 fc7c121b 18b254fc +2870173 debb4b02 8425ccc1 9e54da69 e8d651c7 ce36cf69 8d3b0afd d9361ef1 fddb0df4 85ca90dd 6d8912e7 6a593976 acd18465 b25b2adc b8c635d4 5f189d10 44e6d2b8 +9999666 782e3e8b 7415c41c 2761930e 0cb6b000 a90d5ef5 10382b09 9378a6fc 9b83af16 d5b3b490 24accab5 9b576757 84b51eeb 9d56ff54 e6790e18 1044f7ed 4a26733e +15686028 2687e960 06446da8 35b54231 fe67021d 51552329 c0ee4893 d51635cf 51b0f0fd 93d0e1a4 8f9ecf8f cc0b4bcb 992cc6cf eb7258fc 5253182d 2713b970 e71640c3 +16265866 926bd0a8 0f23e4b4 2f7a24d8 33e2257e 7bd0ae8f fb975045 c9407e53 6266277d e8001f59 bd518acb 7298e502 e85d4fac 8785b244 57fea2b4 7728783d 83afcbf5 +430445 6b094b5b 6a35b57c 75e3a8e1 c1deb6df a12c227f 4db87fc6 f843f916 330e20a9 f4d37e3d f275f7ea 579ccbf5 5f86b75c e3e19ba6 86eea82a 58554041 7032ea47 +8747923 5f4254f1 85adcd63 21c47f06 05b04bd2 57c0bfa5 73cee8b4 aa0579dc ae48bfd1 4c0088b0 f70bd043 9d195e99 f8210c9f 69c383d4 596dc4e8 fcb31441 35847a8f +12687767 ac2410e9 df69f047 3fac631d 31e9fd35 228a12aa 8bdbc44c d4e57517 1e444303 14dbb8bd 8b4ca4af 123800c9 bce46a4e 966697ae 628d5f96 cc23b85b 337c0949 +9168764 11ef8124 ab46b410 e256296f c8464e0d a916747e fd209db7 ed9c42ec 285a2541 a21a3fe0 163920e0 5fb7e792 0a1f8d1e fbedf1eb d07991b1 90c2abba 479952fa +1356642 4fd3218e 5cce13a6 f40cce6f 4b2bc1a9 e9040492 22290e02 7ddb34c1 91845e38 1f6bc5eb 55b459a5 9c974f3f 3c7da275 d54bc2a4 b8e70463 446b031f 269598fe +8058699 6685db51 af426c45 d71bc68f c8a18e65 0eae5e04 4163c17f d4a56779 6005d4f4 4775eedd 2f543dd2 96e42439 1e5e0273 246e0caa e26061b8 a010bed2 7e0e604d +4301349 2e84b6f3 c9b97304 8c17a2cb baa99f51 353a854e 04254118 fd90c9c0 aca8f56c a8f03150 1f5e1bf3 aed2c6ab 3c44b8a2 a65d99f5 d23ee19b ef84bc25 12e4e8f0 +16417225 0fab0e79 d393a56c 64ad998a e09564bd dfecc2e9 a435df7d 7323f120 b1fe3782 6a1d6f16 05f9d3c1 e15637b8 d7a61017 8a6510cb 1a95c1f4 e1aeb84b c753ef56 +6451905 b7bab5f5 5ef965f4 afe27322 974c190a 4aa3d409 7bbab181 86ab9401 0f0a9b02 72cfed55 6f236b5f 13277423 66c36023 4b20c4c7 fda6b1ed 38dd7996 b621e41f +178470 f46c5999 e0de1e6b d29f5826 4047657f aa03a6f4 e554f8a2 359c7299 7f4ab415 6eb4f7b4 c9d40297 91315557 d285ffe6 2f15bb63 1cad3ea0 7212b70c d8de08b2 +4936549 647c9fdc afdc373b 73db87ae cda12395 d9611656 bce2e7c3 0cb6c7af 0ffb7117 2be860da c345a9b3 6e45941e 688d2cfb a8c5c0d5 1e74d0ea 712553a0 487d100c +666916 f306d90f 2a8aa3f2 27974156 c9b9d9f5 7a3fe18c a00d36fb 0ace0975 6c076f37 5411823f 806e92cb f78118c7 258eb3b4 e9ff1899 86195554 6ed830f7 e724cbd7 +9429138 2933c493 5776c156 9a84aec2 4dbe904c e56ba9c7 6f45ebeb b8cc1af5 8e443504 c3b6d511 e62528c1 0722a1ee 280f5c5a c9eb7bbf 78c3cbe9 9fa134f9 0a140ab0 +11506731 bfce9b57 b5b683a4 7dcf2281 3609a200 f2240564 2ee96660 256337a3 4168d583 d6b8aa85 c0927a16 d326293f 4476a316 9326a522 91ebe1cf 7ab876db 7e3942db +3585634 810f8f79 0c8bc974 c9649d5d a4c1c8eb 7b6fa2c7 288a7fc3 b895d635 837c1b12 5d01c717 2a69eaff e7fc9a80 2224cc5f c4af1560 d52f8425 03afb744 fa44673c +12689776 032f4479 07f3f04f ee87ce9a 92b4f93a 165fc953 bcfb060b 3d9df897 ed9c2e1a 80fddf7d 6bfb82f3 0616d11f 9f51e65d dbcd47ba 483ad073 809d06d2 3262a780 +3054452 82f99a05 a201cbfc e14890a0 0219e4e5 df6fbeef aca308a2 8630c557 fd5452c3 fb5c779d 387e963b f937c27e dd8bbef4 4444bd3d b06f4c1d 117b9900 b7a7575e +1372763 1639e106 212b8e4c e4dd705e ae85a7a4 e2300a42 46e581e7 f3d1bc8f 801f92fb 5fc71058 f627825e df468728 8628a224 d6eb9aab 2b95f407 da7f376c f117469b +147279 d8669c4a d27d2783 3b2eafad 9b473609 df808852 fc4950c9 44794932 68b43ae4 04959688 ce28cb46 8227c60d 87609aef 3a34ff9f 77b97dbd 7017f9da 2fe97ced +14769918 f2e68b25 ddc850c7 e9f51139 b877b156 d48e3777 7813475e 818082e3 396a5eb9 4f0ef116 9f85b98d b9588aad a1d14caa d5555551 eee92a5e fcba2f24 d80244b8 +9132541 e81db778 274d2379 7600f0bb 287e43f6 3f9b08d0 5edcb48d e8c44bfd 52649c59 7028ab4e 8048ab32 68225fab 00047b7c 85b9844b 6a979cf7 860f35e8 fb795a81 +14519784 35c40252 8e5ba260 d1bb4d8c 002b0026 5df0df3e 7588dcb6 f08b941b 69863892 85c94883 b41fd4b1 ea29fb90 24459f99 7d6baf7d 8096671c a37496d1 f922bb66 +2009212 9ff60228 39aad2eb 666a2b94 c3b6e932 cdedbd9a 3c651231 07fe824a 04eba7a6 aec12c95 b8290a46 2df2aefa d37d3cbf 826327ca daacbe9a 8153f464 db8da0ae +16057623 0eb9dafa e5d51735 2a1b887f 7f7c19c5 c12ed8ab 5bf652a0 083bd445 9d1f9277 c25501f4 34268a7c 663d848d 51517b83 54d8ffa3 121b8c96 2f555686 fcc7f37f +704641 34fe1cab cb29cf10 ad934c76 4618c782 33b3a5da d58ad466 9e00a0a1 5aff4b7f 63aaa519 4674296b 09883b9e 751a24be 056faa62 33467ece eb0b7490 7ea3b9ae +2678960 b11d6f02 82db31e6 46afaed8 504f78da 4376671a d35f9eb8 46665853 b3dcb219 3ebe452f a31589c3 0a941938 a10fec24 9d10cfe3 a3877bcc 22344ebd 82653e58 +13288546 27f4fbf5 830c91f4 fa022368 87511559 d39432cb 8c857e5d 3649a403 e84b9480 38c231c2 ceec8220 4962d58f 4d708a8e 26475a07 ffdee268 9414fce2 6d80c75b +11403523 07d4a78e e939f932 9d34d448 d646804f fb354a18 3d2108ba b88f5d08 eceb0b53 2ad921d9 83e58c12 6a2cc468 3363fb06 17290ca9 798ad121 26b57253 b832845e +4059049 8a818f1f 98e19b5f 85882cab 089bb147 7abc4856 8d0aea39 8687e812 28df3d95 f0f8b6ec 066fd5cf fb74da41 ae56e040 2503d06f e5a2fbbb f66b5ce3 53ee4da3 +6260446 313cfe2c 1f3f0715 e3f4d6c5 11f478d5 2ba41374 db812d56 c32b6e07 b9e3cd2f 31c9ed8a b97a7fab 979a6468 e75d16de b3782544 3bcd8d7b 855dae8e 73538872 +178756 2eca9327 aaf0722a f21a3633 f98449b0 c472e6aa f861b40f bdc74aee 9830b0e0 f9b3dfae a2b064f0 254e82ce b1d7ed4b 1c7786e7 0bfed0ed dd787a7b 183f3e08 +16431780 1b32e31a bcf54dbc 5536eea6 31e925aa d10f74bc a1b234b2 3d937e94 2ef4fc37 5e03499e e6128c34 1488d845 d983b70b cef69d4c 66edd665 d6b8178e b5276723 +8846999 d86db346 698f4d50 6a547f1d c81b63f2 f829fb3c 7abcf0f2 7a70a7dc ee76cb8f d1169c20 7fed6509 91db0abe dab6280b 315fad7c 4ef03ba8 44c85f10 a51410b9 +12562281 0ec5d426 10f7db0a 6d9d2275 e9a0506b d85926ef 6c20ae74 401cf76b f4319811 2bc9b5a4 2a1d6ad1 0f3e04f3 c84f0499 114f8ed2 88ef05fd 7c97b609 066c63c6 +4034815 12cd10ea 2233ea17 2ea5e527 27688555 b287cc2f 8269fa59 ad97b92e 77822639 0d64addd 61f69eb9 d5df3f2f fdb5ad21 29fc78c1 2d063c7a d46bf988 f534e993 +13760919 e5942c90 283c0db9 5ba91b86 35942da0 e08f5391 72f890f5 f918c3bb 5e390eb4 a7c38821 19c74633 fc31139b 2f344072 2e063e3e 1188c323 c97f506f b72e5c95 +529086 6765d7a4 20ef1c02 19ec28aa c6bb2316 b8de4b8a 43adebe3 b63bf7d0 32e8f447 b06249c7 f097109d 90f140cc d16c1fcd ff5eb0b4 460067b4 36146b7c ed0267b7 +9588295 2adff74d 2b59dbc8 dc2b8f3d a2f317a5 8c5a1c95 0be52b75 20a5cf5a aca58972 6bb9205c 34a84387 b54ea8b7 f318df9b 06940895 9601ea53 8f860eb5 4f08ad46 +2776244 3c185973 bfb4a483 fc0a8548 5eb03d82 8c0dcebe b26d985c 949653f2 c34cf955 c89d1fb0 efdb0212 ce5908dc e498e430 9506d8f7 ea2ae917 5a8ac386 60453151 +4789500 d5739da6 3fbabe49 b49314c2 aebface0 17286dd6 685f54b2 e0ed1bcd 0e895679 acc435d7 82a1235e 8c803692 60f90e92 f6184227 6aeaccb8 4a58189f 1bf5514c +13709697 daa96c1d 56cb2aad 00078b8c d05024cf 98eb2775 197ebbd1 3e21c584 27789b8f 3cf12b5b bf49768c adc757f5 715ebc5e f7788d85 f0f380d4 9f52c0a9 95315a06 +10668459 8a1dec9c f7f5b975 f9200ca4 83480c73 68962296 01413cae bca268ae 218ea63c fd21f5a6 e3940798 1a5ff4fa 3f8c174e 9e07e401 39605fe3 d507485c 3bd740ae +13150965 45d7b896 25d9ee66 37608f42 30476b02 ef45bbcf b2bbae3a b3eb0558 64b72fc2 eb03a118 25ebe85d 1318bfe5 25b16bfa 4fd105a2 0402d998 1c9e5dba 9ca7fbdd +8027780 371a4fd8 0080944a b8f1b92d 15379fe6 bc3278be 405e67a7 0511057a 0b57b1bb 9cdbd49b 3fe0ec67 03eafe15 3fac9316 46151d6c 129b7887 9964d561 8e621624 +16484416 e1c5a099 aefb1003 4b7dbfd0 c5204cf4 a095a841 211050eb fc4e153c 61ddc92c 0a590dba 5c2ac65b 0be04047 87cc880e 795d8128 a214482d 15cf2558 1db6f4fb +2172727 fb72a26c b1ec7396 6fd6d5e8 4a8eba27 71fdadb6 f66ea7f7 111c4f9b f7bf9c6c 88c3eb48 378bef1e eb62ceea 11fcfa6a 47e16229 35f03987 9731562b 1672e3d8 +10761320 e6218eb9 bff98d96 420dc24e 1b4484d8 805f029d afd0d514 06a24a69 9454153a af0146ae b17213ba 0821ec9b f7089274 41ff4b58 9fe30945 63f6295b e6c64f56 +3504607 0124e172 d9807586 0c3341dd 30d78a81 a5d90f7f 0b86da2d 5fbe8b90 b926a6e5 c55b16f3 fd74dc2e e6479f34 584d21cd 58d16962 ff54efbc ba2dcbd9 51302a2a +6323880 850b16c6 22853712 b2102871 d3be1b07 dd74316b ec6ab17b 57544415 5cf5dd60 ee00704d 641f1e30 f2162f6a b038654a 0d8b1882 5fbaf012 0dde2e53 04c329b2 +6062352 308fbcbe 4f6a0b7b bdcf719e 0fca1ecd 267ecf25 e5c8432c 58c02cab d93a5325 fed7d5a6 4558c634 d61d4e32 0473ea5c e3e5b7b8 4f176592 1031bb46 92e7a8ad +9770426 c92b5ff5 72b7e936 15aeea13 1af59683 649c5fcb 30b0d80e 24eb754e ca2a9e9f 877c02fd 85ab081a 16b4b17c 5d1eced6 c06d0232 9254f72b c37764a0 2468a5c0 +5516775 2f937d39 b52df885 37205274 186a39ef 6d0da9fa 2bb2125c e6ba3670 1e6182ad 224ff003 50a4d1d6 1d4ea608 862a1fdf ede97e7e 4c5e2ec8 4c22ba06 a5de5dd8 +14944095 a0d491c6 feebc6a9 0e6f663f 32036108 003046b9 d0a7b122 840a1464 ecff4ce6 4442c274 cd072608 51a1f079 cd156400 84130b01 200e1043 3b707305 cfa8059e +6194481 847ab1bc 29a67a8d 09196c39 ca622dea d98d9ccd 2dad6d06 bb62a530 41241e2f df2e144c 4bc81f4c 4d54ade0 802105f9 d8528066 acd36556 f3db2dad a498d2dd +11762627 2d216f6c d4ed5046 94a1f0f9 bb71f17c 1d6aea2b 342e3a68 a384b7b2 2e8ca79b 31d97910 3010ce18 ed04f285 3c8c0129 1cc23ad8 4c9e5ce7 e17727a5 c3715fe8 +2361319 287bf181 3da7b245 c1567ca6 f0b79a0f e03413d2 ca2cb95f 54e52795 79b618f1 b64ea98b e9c7d3d5 dc89fcd3 635dddd6 06228a20 73051a11 c9dec48a becbf5c5 +13735604 33829160 a3b47f63 2539335e 929380f2 5e2d7a7e 9a1b70af e1491352 6480d80b 5923ed3e 8cb1aa33 2537f624 63d7f208 f637af9e 674acb16 3a9f610b 7a196706 +6131961 26ac036e 1b7abb61 e71e36ff 85433b8a bc7c39b4 996b2f7c 54f0c8a8 f36c1123 bddb65fc 9b82f514 e580f570 9761b2f9 4bd596c8 7e331be5 227296fa bb009f15 +14838309 767f5d84 676d3993 d8145e84 dd05acaf 3105b558 67bef3ff a1e42b26 cc1a9822 431dddb7 4f66dcf6 660e4bde 753be2c8 ae09e543 de8a0ae7 8c9288be f119a151 +6220319 a4705daa e6f5df95 cc1c0072 ecf18654 d533a469 5020ed87 f3d66336 686f243b 1f5d9ff7 9ca04e29 1289d58f 9f3869cf 16b5e09b 0a5d428a cddf008b f29a2eaa +4861263 f1a89cf3 a18f134b 41d494fa 4d127727 a1180eff 53ac0546 5bde5587 3329c921 a1a409fd bcc73470 aa5a562c 209a0548 f27443a3 0a6bec58 856d3672 055e0b17 +9960080 4725f4aa 5055adbd cb5d62f3 3cdeee3a ac577a2d 6e901009 8b9345a3 84f324b6 c292f2e9 56c3559f a9cf768a 280d88ad 8c737b55 79b525d3 79d793e9 f39e53ce +5686162 305b59e9 ebdd91f3 083a19ab 91431c80 510a9433 f9e5f9b5 d65ed500 978406b7 8dffda47 6d2b0573 bed97ea6 88a506a9 d94cc831 7d18e8d6 fb3165a0 365551f2 +9233113 7ac90d34 1fe0b521 69de37f8 bc1061a1 f92084ef 4ac7ce25 bb146e35 67ebc08e 36dec44d b1260965 d4ad5cae 115caa62 69f6a9b5 649c58db eb77d844 70df206c +216401 dbff3b71 7075f2dd a07e3515 bd571eb4 337fe66d ebdb0e30 39fdd83f 59a858cf da8cea2f 49c79de5 ef4cc73b e380d5fb 283ac8c2 ce60c263 5a9e7cf5 017a1bfb +240510 ebf719eb 3557e151 e939106d 04e51363 e0350b0f 918edea6 0e39888f 948e59a7 d53855dc 5ac30bc5 2be79925 c23334a8 f6778fbd 0ab232f9 53311efd 3580b3a2 +13306429 18d16dc4 a25ae7f9 36e4d900 00222d12 3e041181 99cbbad1 75232de4 cf845e07 ac35eda2 e2bb7fe7 9f7efb4b 8dd5e918 8d64150e d3c2b743 68307c68 d3e126d0 +16486885 855241d5 41aafc56 7563a388 dcc624cf 976be02d 11e3cafa 5fb5c9e6 c3b51158 53e547f6 4e2149e3 ef9c7de9 d6a19609 e3b9bb91 32c83628 0b1c23f7 74163314 +7146183 2965d6a5 e8505ec7 a6a61792 7fcbb6cf f5fbe5d3 d43d730c 1463231a 73b4dbe5 1e7fa765 4f24044a 70e72c67 7dab7b5d 6c995e29 2ef8b34a 02326baf 38939697 +4329617 ca2770be 0bfe7b30 17b6fc73 1d6cd0ad 06d83a17 4093ca55 bd7434ad 14f7a042 5459c84c 676c6a4b 0e452478 000764c0 cd6fab98 20e182ac 89ef9534 fe1d6729 +3616895 c9479379 29334815 26ca7222 d6192cd9 6a3e82e8 8822c857 56383db8 418603f5 de7ac3c4 966d5939 a86d10bf 01a4afdb dfa4bf3b f7d6ed6d aabe66f4 dddad492 +10924039 d80db68f 22899470 e89a7bd7 6134475a cc7beb1e 58654d44 f8a6d7a6 6348743e ecb4e77b 6f1a2e70 6c5e5293 9b552c78 a19d3679 dd9bd59c ee8ff5cd 14e2cd4e +978456 ba522a87 06aae9d4 0bb0615c 247794f7 3b3bbdcb a7e153d2 de5f19a8 119e3f16 e0a99050 193bed1c 9d9ebd69 f978e59e 1522c330 bcba6712 efd3beed 110af095 +5605098 6e6bd8a8 7c424505 9d347b14 9d366829 f6e3b7a5 9a22b4b5 c2b3ed73 429d3a39 d7c22b14 62d05430 f02faddd 7b0ddbfd 259c0cfc bda6705c e08d20d0 4263e351 +3312910 dcf466b1 b11b1570 1aa4acbf 027f9b70 48151ced 7fe2a25a 5ebd8ba9 37bc7a3b 58eaff6a 499bd90c 233cb716 9dc8932d 74d52678 0a2966e0 de6741f5 91d54498 +1580204 f7f496e6 09b58b57 329c7194 bad4e233 02d5f327 5111c8a4 1f0e1616 4c1e918b cadc6d21 f6d63bce d8d6dad2 7d756078 a08a9fe6 bf647058 a6628600 deec63e4 +1761392 34c7bcb7 190be8b6 40a4f2f8 a3426577 5f7e975d b1f44c68 b391bf48 f08a47ae c3baca9b f19ad4cd 5e8bbcce 6fb53fda d60e4f42 1e1d94a9 6d16487d 33acae5e +11542620 10899a68 45f466c5 cc330794 439b8851 6d1c3490 d50a0b03 e5178d79 e3e996f2 bcd23d83 90602ac1 fe7de712 8443469a 18311610 fa881bef 63f84969 7391cbb8 +10173491 437058ad 550ebfdd 642e812c 50975079 b95e4d15 94ca26d0 fc875e05 0a46ab06 d54d62e8 736273cd 6d61d4fd f87b0a4a d733ea91 4ebf04f9 ea286393 fcc8dfa4 +10083286 72f89f7c 38841844 a42dce23 a9f23920 84827451 3b41e811 b7f86af8 28c8aa2b 6b1ea1ab 5d00e518 ad26dfc0 a720a4c0 44305e6f ef2b31c2 bc3ce27d a1739cdb +983157 297e86e1 b0bba3d8 3a37d590 3d509b29 41b8a302 b118cf09 6728f621 4702b7da 13353f7f 14c9222c 17010413 fd0e6241 03a0faed e909c922 1a336e3a 408468fd +10782698 76998efd a5f7803e b48bf9f7 80177401 ec5d24fa c8f2258e 9c296918 ac38d413 bbe4f0a5 9d9f2d7b c137d853 369287fc 22e13fe1 4ff4cbdd 7333fc8d 8400a2c1 +203014 562a70a5 f28bd06a 016be717 f329eb9c 1d115ef3 e9dfd0cc c7dba699 e971bf8f 3ec55b00 6836f0ec 9c6faad8 ec68e979 4ad70ebe be63c707 7dd5a935 fe402f9d +10722837 cd3d9494 a41c51a0 ef918a36 61f5bb2b dcc4dca9 af64d8cc 39fc9408 6367815c 747502cb 05a49821 9455784a bde19049 2558183b a8bab298 a16b1b26 c3a7cb5a +1285902 f723b058 308afac1 89045d8c 27770870 5782d310 a4daff7b 4eb7a2d0 7109d3a2 1feef8c0 c75c9acc 87b2e865 34f31a03 2c387279 47e8d4ae c142177d ebd19d61 +13046315 22c682a8 51e23efc a20ec95c 327a514d 6e1647d5 25a9c7c2 2b69df8b 5c73c107 eb6636d8 0da99a8a a6adc263 b863bf3b 39b8b7ed a542beb2 34166fa2 9d0fbb06 +11080294 e6ba0360 8356044e fba285f5 c5e6d6bd 9f21adcf 306cc674 9a7af731 1edc5df7 c7eeef96 7d2d9148 b2d66137 5a9e91e9 7d6004e5 00481941 bb143a9e 098be493 +9514006 bdafeb8f 4a99b781 e4ae921f a3f3f994 ecbe2d33 621649c4 ad43636a 3055eb50 336810e5 3d84dcc6 dbf0fd67 120f303e 61dcfd3c 792f5ffb 58fcf0b1 aa838566 +5309452 e0963813 ea5ca5ee 3274b426 04e386fd 89c66551 427e3248 16ce65c0 32ffc9a1 19e59fde 8cd18631 3e419285 b61164c3 a835367e fe58e567 06531318 de85a163 +15952018 7a92bb24 28afae96 fcb80d4d 23910e03 c33d4d8d 960e5dfa cef5637e dac4fef3 d32c4104 acb0985d 70d6824c 7710e431 d8c86317 c36d2830 2455ae01 17c6ba6d +3859348 b961270a 0cdd739f 46961822 6d194469 d83d4570 f7a25187 aae28afb f6ab4647 8cc6e8b9 e9869a1b d9a364f2 80e696da 5196b1ef 7818cefa dd50c5fc e46b4e72 +8348984 823bb3ab d17ae6ba 330da199 ae5726b9 8831cc9f a057e695 4a145758 0ebaba50 3ab4616e 8906ab79 dc678ac3 8a51d0dc 9ff48d57 7e93cf06 ac674b2b fd3924bb +13069025 0aff92df 8ecf8720 57dc6a4c 106b0a51 403ddcbd e91abfa1 dbaa795f f86e6b56 8eb6e85b 30f07c7e 4de4f28d 4dc945eb 99991f78 608848d6 71645105 9de0950c +12973596 ee494195 7851aade 4f632aa0 75560026 a164f38c 9649a9e1 623e36d9 d09c4b49 947a034f 666dd2c6 aada50f1 63a5a4d4 7ca2a891 4d057616 901ccee7 3e576cdc +14118948 565a2b4f 8991c193 85fbd8e9 d87b1f5e a2eaacef 4cc37096 cc934333 237574f5 2549d5a1 3cf02f1d 136b6c08 f6133e4f 583c6f7f a6f60fb3 71a8609f b1783cab +4324245 6e1ae0c0 b0628eff 8147d832 0e4156d9 6c1db53b 624dd6ac 6f519a2e 9965021d 7673bb90 d18e7f59 76e434b8 2defc015 a2d028cd 907d8e6b 366c9555 6ec876c5 +10101128 7591762b da8d7983 2efccd42 a692c5e4 9aa2d974 c7056efc a133498f c0871e4e 33386c79 b951b04a a83f3aa0 5c6fb6d5 e3244c0b ae9e090c 4845bcc3 947063be +11063084 3083dbd9 a6fc4aeb 9a60a305 f437ccf3 7b6e6b6d 8a8536a7 2b2732e3 b006bd26 a1108e0a c54af779 23bf300e dada137d acd1b403 91ed8b18 5ba6dcae d62d1497 +970408 d6d5e7eb 883d7885 c29909a5 3f2cb60c 9e3a8832 7e3b5a4c 1d0536db 35aa2d58 dad79351 40a2edb6 a6fd00cf 486d47a1 0f4197dc aa632c34 7f5d6daf 25ef6357 +8172511 e72dc263 e2a18f1d 3954cffd 391b89bc b336117b d7f9b5ae 27d74c89 7d29e585 4c2c5e34 50f05d04 65ad52d1 1a41ea03 2b2cec6f 73b1f289 cdad7ddd 9bc2027b +9051556 28bae4cf d80e7233 360514a9 7b21cbbd 85bada09 d56d286c e60d2a6b aff34726 e660202c d488894e 1ef6f2cf f6571ad7 67f43840 b690b2a7 985ac79c 053c499e +539800 1e6f77c0 41a3fbeb 6dbec054 a74bc0d8 bcfd9c47 79fbfa62 d75c5303 dbd75ddb c03d7899 e531beb5 6d2ea8de 2552cfc8 038a13fe 26507753 d767aa9a 763ac238 +6201145 29edf25f 499726a9 ca816753 d3a0e97e 96f66a42 206ae51d a97c05a4 e52650fd 216f357b 6f253838 cff5a6eb 5ea5cdec 796b61ed 0f748929 a2182f5a 79c8258e +4021106 651847c5 6c4e0440 8f14f37e bd7a03ad 539b10b5 fc67d81d c28f8a4f 1c8168c8 d384aad4 b40d940b 908242ad e65734d5 23e210e8 5e6aa1c8 12903183 07863368 +16599534 4c18b411 b7fdeaf7 60bed9e1 db03b0bb 42ff9786 a38fba55 37fb999f 46d2038b 74a0c3bd e5bfcfa7 d7160a00 7f6f1e92 57242300 2dbedaa2 e2d2dde7 391afae4 +11050425 bef734fd fb29a8d7 6fbce5d3 5146abb4 dba83c92 ae71f835 c42ccec3 93e6a835 a8af89f9 00d7825a c7e2f81b fa2abde1 45eb45cc 144f8451 cb035e80 ce1e6033 +804826 7f0b3c89 b0ed104d fa0512c0 c0a51b1e 60ad3cac 1cb149cd 953a2e25 343b6018 6c45087d 51f16b7e 96ddec92 55cef2d5 91d38309 f1aed067 a249f6b9 b9ebd5ed +1229938 b1e9dd46 706c338a 5a189388 99f7d574 18c43a3e 38223118 ff42b98c 43178567 b7ecc99c c9324421 9d28185b ef4a5f20 3df21c2c c810407e f92a5367 5c820650 +7096888 621b6e03 32662a43 9af9d9a4 e1103c0a 24a7371d ff17daea ffc245a4 df5a3eec c683f669 6372688d d44c6a6a 4edf2a15 b0b42a82 431b398f 5f56e0ca 0dfd1ae5 +14183534 c7c1770f 46e13642 0270a5d8 40183e40 9f4e2ec6 8e43913f 5b3197a2 f5899ebb 437fdaf0 3f2aa257 67ab5585 8d3214b6 4d47ee78 a0f8ea8b 5756cdf4 82bd5e5c +12619286 cf9c4b11 bbddcfea c27bc67a 65c16b59 962b02fd 9dec8d39 26c4dbfe 8d8d86ca 7bc42e64 c587c007 94e68aae 20a2e79d eed912be 092eb7e6 b3a82e95 6d011abe +6189031 33ede1a2 9667696f 3fedba39 348aef8e 6204bb90 a00f1cc1 7f4367a8 e4623561 8bb08e4d cc63bc47 8952f190 73ee0735 d7f70d72 e4295ef6 0d9391b0 1713f360 +9681018 4336cf51 563018d4 d41db460 171733bd eda99d86 53e54a26 4e4dfb5a bd7a5fd9 3afb2e90 0079bc03 fc0989b6 0ff3174b 396cb550 f8129148 166894dd 4443121e +5753716 15f2f298 4a9f25be dbcbb297 aa410cc2 38aaf878 7853c13e 72b945ce c0707326 4dc3f14e 8c83a855 58bd477b 824ebe5f 2580b113 d53d1ceb f993bcf0 b7e371e4 +8814986 8ce47c63 29b29e24 4267c2dc e150b0be b270a2db d2708e39 ac1e04b4 433f636c 8084c3b6 0cbaf477 d2195d6c 72537609 b3802eec 0e895d2f 44d4e137 1476434e +13521766 5d37bc6d b029f998 70943aaf 2bfad46f 50f1a86f 4757f9d7 3cc709b1 9f9b9bef ccb7443f cf9bb2e8 81240aef 9b76d3f8 adb7acff 55ebe86d 16d63fea 6e574031 +14655893 ddd3ed52 0c515967 5b2438b7 503cfed4 1541f135 2de05c12 4929bec8 ed6c1544 7b6bd933 a7e876ab d3906e37 3dad900d 272af36a 89d034d6 7787a99e 5ccb598a +3429801 d04859a9 f37de04b 3a462a37 da0c42fc 320eb00a 8b57a0d4 ac37549a 8907b041 51dec40e 650b88b9 f9047c45 bccf4c83 4f8dedc1 ea935368 e8c762cd 30aee74b +1216412 89fd3649 4baff34e f43ce6c7 356e5719 7e9dddd8 e0b52e0d 56d3f498 e83c91d8 886ab5dc 0be0348d a46419ac 27fbd2e3 a72c1d33 416ad921 1b219699 3dd9d4bd +6347290 2723ba17 6581ddab b70cceae b05a6c31 0957fc74 ca34f82a 94abab34 8d3bd635 ef58d0c1 23bcac6e abe06ad1 9fb26fa9 83985b61 f30ea93d 142e6955 bb0d9905 +5698023 5eca955f 31e09ffb 451f8739 e1fe56ba 9e2b833a e910bd0e 924a34c8 9dfb2590 83f61965 53710325 987959cd a53cc7ae 5a0545fe 4f610d23 b8a358ba 007a2243 +11965365 fafd60b2 248c1e09 805a9126 63b59f59 7982cad7 81b084ad d0670dcd 03a03397 e9131e94 6a0c47e6 d2eaf0cc 41f2480c c67f83e9 e680d898 688cf57b baf509ff +4755005 0922075d a13c8eea 4c6213bc 746fbbbd e30af0b9 ace7675c 5f6c6bed 7f859054 30d65198 58265075 c7596667 13682126 8330d855 f200a532 6613970a fe1cc97a +2537684 1d264b26 b170f253 f62ff42c 984b7cc3 33412280 1ba024b7 b52301a8 3d91dfee 36a44d66 750d0b9b 11a4ced5 ec281a9f 66390950 a84feda5 a6fc3144 9b9686fc +1560363 6842cde8 f1532098 d03d00cd f7d63bf5 2646ada3 654d5be3 7356e4f3 a4b5d6a3 c7b6532e 53b93c42 5a96161d d53262e3 037735d2 07439ab6 d5631c45 56ceaa10 +3427621 ac270639 b334653e 7a7b0c10 5e4a83a7 204a8b1b 68709225 21186c27 0c6210ce 92b131e1 57e87535 04581505 213d47c3 6fd3f06e 5b9971d3 deaa2af1 f0cd1dc0 +13789436 5618258e fd8afcd4 e3499d99 f89e5d5f 74bb371d 1fe26137 067cbb11 fecd70e0 35d7a078 9c8cdc33 a65b267d 51f4d216 62181f30 84c652ef 0d433730 1668ec24 +9144070 64cbf108 293b4be8 47896f80 0dda87a1 b31d9953 1cac0dc8 b4298fea e5b1a049 9771abea afa61a2d fdccc7de ec2b7c91 81f684e4 c42d535e 4302f413 ca4648f9 +13463596 76712bb3 ab68f610 44f7d9c5 0a92be97 ccba9a58 ec1d6aa5 c4cbcdfa 4eb29073 2b29adc6 05ac47ab 7eae012b 96faa247 17343f52 2bb54143 325ca7da 11feab71 +8715830 d6346a03 54c7cd4e 6b344656 ce2d83da b05ed847 86518656 72889e86 4731a95b e4d0d11a 384e60c2 1aa1d949 eae0df9b 2da7bda0 8d41368e c96f1d48 f6849660 +1039813 7fa80d73 efe8bef6 34384ab0 690f0e89 febb64ad 33fe6feb 2e8fda80 6c49a93e 6ca8515e d5fd2edb 80a70ca2 47b96f4b 510fcdb5 e5cada27 0b3855c1 d5a52f47 +16071214 a149feac 5e8f3d5e fa616112 13ea0b24 eb583271 05a7ab7c b5d271bb 36e38156 78208423 1b1ad6d7 ac401adb 127e608a 155c4928 e5c7682d ee3c8c9f 245af5cf +8903358 f7f1ab4b 57a894f4 8ccc2b02 687a9cad 0d6b0d7e a57ab258 3febe662 72cbacf7 9195e0ee 1a897ee2 96228968 234e1f6d c6a405ec 04d40fd4 a9d4ad4c fb3bec86 +4780114 e88f4de2 34ad2c8a 737441a6 146e5964 8b77a4b4 90d3fadb 39601363 3e15d242 623019cd 419f69dc 0cdd4ce1 1ec96233 38f670ca db7940bb 9b08c531 f7d2f37f +9749873 d97a14c9 d7d5f30c 16fe3365 b7ed84b6 8933ef9f ce526213 63d42381 de088fb1 3fa20e13 90c6d0b5 4c09a49f 843999f1 de0e33e0 9f2fd0c0 283176eb a9d374d4 +15428188 8485f6f5 33677abd b98574a9 ac9efa21 412b69be a29b0dc5 98c3b778 c73779c8 bc9f4a2a 484ce3d3 8e203826 f5ffc26c 7263af55 85399d39 3050accc a883773b +3588881 09d4b1c4 4b31827b e596c59c 55e35f2a 1279e55b f230fbc0 33b19c00 8aff92f0 7bba75a4 530fe7ae e7815a3e 527bd26d c989cf35 44a20ef6 7e6ec9d5 59d48be8 +2768576 b23c3ccd a3c20774 cdd255f1 135a8fd7 2000204c f1fe88f3 a7914df6 e4287dc3 c7f2e7a2 208112d7 dd1b7180 12a4c7ad ace35d17 7407c6a3 304205ee b210a552 +2477280 44d94324 db001981 71fa148d f35ad694 859d48cf a3c96086 a1ec7850 e7d28fa0 a4ae3e88 5def47b3 a5757d74 e515ee2a f490167e f92b1edc 0d53f975 584fac42 +8541569 25f97d1a 6d35dda8 81b9149f b8bb0e77 21d23cf4 a0519422 eaeec3b3 0bf910e5 f203f276 7cf17b37 9606e72e e035c4b5 a6a06175 ed2ed171 2c388f7b b9c87775 +12574100 3e2ea907 9287bc05 8c58b5c8 f904a16f bb222a0e 7e5e9522 76d8efe5 6d3af61c b4ebff99 70f3c301 32514e88 076bb5c8 ff197f7c 7e6ba482 faaf5f2c 4e5641c3 +5081429 eb9daa5f 31950204 34d5ebcc 92aa768f 606d84e7 3e2a34fb 7837bb69 77d459e9 889b2858 f01d6312 926e6371 65bfdfa8 69592142 b56da217 08a963b5 dba2dc1a +9021418 578d6dbd 55ca7a25 2127b77a 1be15db9 3014b582 f3283d87 1b48cc01 d245fefd 480dacb5 927028f0 59558e58 6c4cb7ca 1042964d f4f51462 a7ebf0aa 3cdf66f9 +7297921 96d87074 ea84892a 72ceb8ea 50d6f79c 02637d0d d7144044 b598da94 082a9588 488dea9b 9afc40d3 538fa2c5 9d3ad4f0 d7d796e4 37e13259 28214dc7 1081e78a +6190706 9af1a86b 567b1fc0 18104aed 6fbe3775 ccd1eb81 4fd260b2 20db2840 18dd5585 d84b6fe1 7cb7be1b d5e0a305 9189de57 10e08250 446c6e48 da369dbb c37a7f2e +14344054 4ede6987 1566e522 9fa7f090 84fc3667 dcacef21 3884a281 18ec8188 0235d85b 59b045e2 e4d3e89c 8c80df56 cf48ba0f b4f8571e 0a2b0630 82f9d904 4c80942a +16022595 80c8e525 7446563f 8770c3ed 4090fe8b e738c87d 7f5ac422 c23895b0 0000d9e0 cb3c2ff8 c79aedd8 f4bc6a3b 3b8adbd3 7b567ad1 a6aba7f1 39c748e3 edc5410f +2904773 de324f7a 0f120a01 3e071515 86240a8f 81e76f78 041c2db2 9cf155ad 5aa064dd 91cd6648 50d6082d e625d5e5 19ebbd66 abab636a 48e8d503 fcb4577c 8e020452 +14841446 838bfaab 3e59bb96 49d3cace 8cc65968 00dc21ac 733db1ec a8a82986 c01d221d 9d11c722 9100d28c bcd1e23b 0a4eaf5e 4613daa9 97aee5d9 e33cd625 3f1928f1 +10133293 c8970d2b 95193939 71dcf1b4 3ff5dacd f46c47ca cc2169ab 7faee9d4 c52e5c39 0e7aa318 62366af3 955862b3 7f00aef0 dd8f0e50 edc9e166 ba47cf80 723e5d7b +1168079 54a87f52 7c606f79 bdfbbf47 2bd4c330 31308f83 24d92902 1c808c5f 3f4b0135 4f8e1723 d5ba19a2 536a9bc4 e8dd12ea 1fd8d685 07a33a53 6579f504 4dbdb8a1 +7415941 36c8de56 caefd453 445d9872 abb285bc 2046dc46 e366c55f f52740ef b075623f fd8a2524 bed56cbf 30a5ae47 8d629b07 f6f5705a 44310ade 8558a920 66e3fdd8 +15742830 1c9c9f5b 0bbdaaa6 5a4ff2b2 31bb646d 40ec5df3 beb2538b 83869b71 b68e957a ef1b672a 42fba7e7 4bdb1384 ff72f7ba 0fc4109e e11db332 4a300c10 d6e8a010 +12302906 3b6246de 6c052f6e a22f3ef1 d6b93b69 8b6e522e 25bcc08d 088e6746 35d6a54e d4c6da4e d785a23d a1751a5f e6bdbb18 87bf9428 37695032 bf214fa7 f00f3b1f +14347401 bc36e996 7b5f7888 a96c5af0 da879cda b87f3c8c 2748651d 081b6d32 db8259b7 e4bd3994 79daf6cd df75e24e 2dd28005 dd098909 875207a5 7b90fcf7 74319c3d +9639032 34f7c27e 9dee10af 420a506b d61909f0 fdda9466 d4949c75 054f1f52 dc28db3e ccf55211 79687e29 44f24b58 b5289236 e83540c7 7ea8f931 4e3548a9 509be75c +8054497 e4ed787c 89c0a665 903b8e6a 1a252d9d 2c4a6eaa e03ca305 d6b4b5a3 0fbd384a 816d7866 769d55e1 6e4e7d9b 8bdb55e5 e2919bc7 c143201d cc4a4d37 9d266710 +9062522 e3357159 e960bd60 2fadae5d 467df2ce fafbb4a8 02aef542 cb0b1735 95f969a7 fce0b4d4 8ccf9d1f 81b00ff8 77b199a1 120cf4f7 c33edb03 42f1d217 55a0172d +6723882 8a6ea8ef bda742ac 17ca045e 845c71d6 216b17ae f22ad289 00d79efe 92acb04b 36b1ea80 068635ed 3fff155d 1d386474 d87b292b d1a830a5 793bd98f 3cde7cb8 +7242089 431abe24 a8ea74dd ac6e98ea 433233a0 461aa15a d56256eb 4bb34aee e3a08b72 66bf50ea 2268d46c d2e24873 0784ad1f 4d08f5ca 9adfd3b9 86a4181b 7fb5cdb7 +9056816 b70c82eb 7a978766 1f792bca d4fd229f 69c15324 bf63505b 89284c06 e9ce3006 e416db13 98e644e5 379e4ed3 938d7e43 f8b25ab0 50cbc263 446006b2 0843798a +10128475 e6e0eeb4 ffddd960 275ef085 759abb81 489dfd9d ea7c36c0 e7cd4937 4c5993eb 1a2cfae7 c5b3c9cb 67259cdb 8e510ae4 6a2897b0 1c9324c6 e904f874 ed92604a +8618308 9b20d0e3 181a2b05 ec824a7d 26488d6f faffdac7 366503f7 045bde70 73856e8a 8def98aa 0aabd2fc e590dd77 408ab759 43f44837 f046b35f b4e72490 31ac1779 +7319501 822b1ba7 3004d5f6 972e95c4 a91859c9 275e2f9a 632827b8 b6a8c276 a897955c 854976f6 1e9ea4a5 172367eb 4b3e402a 5528e830 23c9e37c 03d576e2 0ae3517d +9564267 9ec734bb ce8bd023 0e97775a 6303b611 26adf8ca 13b7359d 6aa199db e144a283 ce8eff62 f576064b 9e4ecf06 b066d198 f9efacf6 c9523e02 224cd2ff c430e53b +6547341 420b99ef 0570a030 a825fe96 8c2bd4b9 ec2401a8 1c9ac6f2 2aba9dbb 8a2137cb 21d38b8f 3c3c0add 17208667 09c8b9f7 1fdce09c 395c15cb 1931b7aa fed65886 +3640765 563d1b1a 532791bd 976d2c3b e616f05b 332087e6 964b6628 46a75daf 5574f420 4a9c7768 d68229cd 872a9ba6 cc6d406c 6f375f4c 426415c6 aebcb15b 8d411b66 +3301543 9094d165 7ce48032 b3f3f11a bc6ba213 7ad0dbb0 4fd4574a be5ef0e6 522d9576 e2cfea17 ebd7564b 364c3aef 5749f827 d55a7b39 f5bbed09 421b2beb 07aa4e9d +3693748 680bb1c6 fb9671db f562c4b8 195493eb 3f8cfe32 13fd0575 e8a81fca 6033b80e aec2025f 192a6d55 a1625778 a4450b17 014ed1f0 284f408d e705a8c1 8c61255b +12982800 2f8265f8 368d5576 231ef6bb d6ce1f09 3f8fe996 a8c7d416 68c308c5 b54bf747 5c3a6bf3 9c88fe8b 2c16e311 33cbd321 a9232e00 d8d33488 4690beeb 1a6c5509 +3911187 9ca79d90 00268519 198a3465 7b6f53b4 7ac0bd44 1dff6e39 b4fac6ba dfd2606f 5dbb0803 9a890cae d0f2a8ae f480a31f ca00c6a4 e92f3158 b9e63c68 4a659dbf +3874704 0475d3c9 a29c7a04 0a1745ea 39ff2dac e663a259 5361f36e b2dbeea6 eeccba0c 29257af5 4a8aa674 c28aabd1 8202eaf7 59d583ec 1875e6c2 86990109 d4630e65 +997545 fafd3819 589b4aac d052d0f6 6d67cf69 7343b597 f8a81a5f 044757d0 59c90683 7e39729a d0407b32 b1eb10f4 522110ab 34f1b706 524749b7 f327c876 2c39abde +2083784 9478514a 908d37a3 aa188535 dc155708 e2c5e995 b540e10f 54c3e4fc e565ce13 d7b1380d 38bf1de0 a9a49906 8cea1cc3 116d0f4f 43bf6564 c41feb2f 763f3ffe +4963528 12100a2e ef8079b0 3bd05bd7 6321d51e cdf38815 b218bdbb a8bea4b8 fcb8f5c1 90375cd3 c3201388 35c13f5f 4d1b1293 dc1f986f 261d1c48 34f404ce dd3db19a +11093201 b3e56421 cb5831d1 80d0e71f 96a403be 02fca6ff 55ae0234 4d8fdd13 d75b93fb ef6413f6 8f413b59 28b9ca0b d73ddb03 6db85a54 b01fcf75 e8cfb718 cce4bea0 +7253112 1ab5c344 3255becf 2f308ebd 80e722d5 38cbc04b 2447bc61 e72f5ded 41f97eaf 4963c22d 61a40fff 0a54c531 3a2c1627 1221fe94 001a0ce8 f65f0cd5 933cdcc8 +9202055 15d8ab5f 352e2d5d 322fa593 2b122cc2 710ad65b 23b25f6d 8bbe52b2 45736c20 df294d9a 43f59356 ab4fa99a 9e48e79c 6a57766f 25f150d5 8f93ef1b a7551283 +11988351 1bfda1d2 4074c6d9 59c4f77a 0d1a9aa1 a2b4497a 5a25dce3 8ca38772 5c4ba703 d490cc5c 4363f09b e3bc28df 1024d4b9 352b7c23 af62254f 5d4df854 356b6479 +9915626 a8b47ffd ca7e49d9 113b180c b6b00789 dfab9958 8f037f4d 37563d25 1d48d39f c7c6ec7d d2ab8425 d23f4053 37eaed56 d3f1aa9f 56384a4b fbe178bc 30076dd5 +14920871 b65ee42b d62144fa 16ad29c7 e5d8b834 5fe33c93 7e390f76 b1595cef 5ee35554 58dbd385 98f937a6 08bb91ed 997811cc ee023d80 451135cb 61ddd270 abda1a84 +13771456 a96bcad6 63ede0c9 2b23ee32 8dd9f131 31d71411 6a427fec 6a3903e4 73993dbd 75200307 49e2ab2b 8a52304c 4fc7fdff f32a10da c37234cd 87f4e4f3 0eb79b91 +6231807 09bdf88e 14e53421 e75c0a3b 778c2a66 c6325ee2 207855c6 21d5a007 541fed9b 1a6eccdd f6d068b3 d13c8631 23b115c9 b33e6000 130fc56a 69c5b8ed 23828bf6 +654758 6e680c2b 9d86e84b a3fea2f2 00760d38 6ec53d18 c62452db 21f867e7 b6c8203a f47fe95c cc8c2776 bf774539 9cf9b35b 6581dbe6 efef7de7 96224449 035b6183 +16308010 0fe32fd6 13cef8a2 4f9f75e2 f1383a3d 5ac59989 2a25674e 41b2ae02 e703476e 2c3ec3ca 3102f1a7 705f1d5d 22b51f49 1218b38b e50389d7 b7226ffd 4756dd23 +3812304 40dffa2b 1f9a61e6 92f09b58 39caa5fb 5bfc9076 75a1eb84 7d33d221 49084826 84de0b24 9ea06562 335defef 5994abf9 0bcbf4d6 b4c84e42 462d461e 4420c859 +10466358 b21c8391 655f8e1c 9aa1a587 c65ff409 30e91b42 7855f482 279bbba3 c4bdb1e6 8d92e9ff 8630e03a c85f1ef6 b3dbd181 8139c918 06bd7c24 10a5b106 6d27110e +4052696 d8faa2c4 c8cd5396 cb473b25 47f9e1af 32598d6e 581792d9 c48e77ee a8f2eca3 90128d31 b1a54135 6024b04c 3c3220a2 a62c7bfd 22803a24 a4f5caae b963086d +4891459 f53af1f7 1e2731ab 54b7c4c5 b54f3735 0109a56a 399e8279 8e8dc375 4d69654b 777d35b5 d8b1a753 ccafda83 e708d9e7 39651255 8158c5f8 3db41836 307b1ac0 +14553560 88f86e59 903b25a5 6802108b e881cdfc fc72a0a0 176a1a88 9884d96e 7b5926f3 6b2ddd69 9c27a214 fa067a54 c476c917 e943e75a 67251b18 12e65a8c dd9de8b2 +7989774 05537664 cdaa20b6 25fab4a2 e993e063 28f66c95 a7562b6f 9b21b330 5202008f e8dbf05f 729a8d0f 4fb9d13f ccc064ce 0fcf95d3 4874bef5 06631137 11433aed +12281839 d9b36ec3 3c097730 4bd8db61 72c4be57 6cd0369a 95e12f38 b5dcbfc3 5c754984 c3c17245 2aee98f7 18e7b7b9 a99f34c5 6b4a12ca 5dd377d8 ca706c07 047c1530 +13957457 6613f47b 5128345f 70ec6754 0c45e78e 53d9b648 5e04fcbb 6464ae58 eafc5469 9f76dbe5 a1ab6c17 5ed8c65d 13e01ca1 117a7691 f3ef9adb 139f8bb8 7401fec0 +14863515 c362637e ade68af0 531228e0 89d9b90f 23aeca13 a5af2a1c a0c35324 2c5cd670 1b1d25bc ed80abc0 d829e33b 463b7c96 462d9643 45ec8c00 bee5a560 6aa16750 +13684758 ea4ff8de 9e861019 cb1ae80d 2cd2d14b 6e57f964 fd10d9e2 be7b01c2 34266bef d2ea20c3 7cfe84ad 7bdb3b27 240ab639 b2926a2a 7881bed9 6ae48607 062ad41f +3807115 1e100d55 781fbcb9 6ffc7f42 83b5540b 7fe77fa5 32009680 2b59382a 10efcb97 a34901bd 821d487e 1a196ede f35de406 6039b7f2 c6e84bca a10657ee a37a2d30 +13644148 2d3ae018 f89bb3a0 3d0ca8a2 3436e55e c649d68e c3db7ef9 589c9f42 00089af0 ea525043 4cc5e636 d06a819f 86f2672f fb4ad88b d1d4240d 0ac4af29 04765ebb +14734054 72e6875f edb2090d 2247e352 929893e9 8fff7946 77c191f7 ec2b01df 3af0c8da 31349a0f 1b62ae37 4bbc321f 5afbde45 74133f21 52c2124c 575f9b9c fe2cf434 +2875689 686c9039 f8ac525c 21db65f9 0b728c20 e3f86bf0 030235e7 2ed84e09 81b0e56d 4c107660 b0cb799f 32e85e00 745a8e6a bdd7b8a4 e6df56f2 055cf5af dbfb71c1 +3018955 9aba766f 40696820 f3ddbe2e 8343b704 3b091661 48d1b37e 73bb415b ecad1c0c 023b9bed 4e6eb794 b4f4806a fbe1b263 56c88d6c 6c3a9355 e8b92481 f539e823 +10312615 a7658c76 940ad806 e14e2b83 4061096c a47f7528 50cfed0f dbfe5fd0 6514e127 65f848fc 2e946019 d0870865 2ad0171b 7db5e824 050d5d5a a302f396 3458dff5 +14410720 29dfdccf 7257c317 c3721ead e2e824ce ef1ca17b ce4dd5a2 9f6cc77f 6b8c0c9a 825f11fe 07f4ae19 53122e09 5731e95e cda3e3c8 a2661a75 e8e3afa6 c26c7879 +14196134 e8be9d1a 785ff4e2 3987f857 3baf5676 52ebb6b6 9535e5b9 e3a90d8f b4b1bf51 916b2d66 8dd2de8d 7bb5dfc9 e2fe97dd 3d8f63be e076d7eb 03214c67 54cc2be2 +11594630 51e1968f b0b1d53e 2c2c9ea6 d5737b30 3c6a5bad 1f5169ea ca73b3d7 1f740429 218ec144 204c8e3b c32f1711 254de7e3 d28d50f8 816a757d 8d3ece17 dfd33892 +5051533 d7484d0a 66b9819c ed510e5a 6b8c0987 2609a4bf 2e5d9009 9635b095 586f90e6 78f8a376 b28321a5 f25f140f a3b49ebe 005893a6 6f98f298 7ada41be efc249ed +11351026 d2a34edd 23005fb4 e06eb748 f60baad4 0054d48b ab548a24 ff42ada8 e1a96ea6 4dd5d80b 9936534e 22232c97 0db9b831 8c5390e1 1d110230 9325aab7 d4cf1a7b +15855206 126bbfec 5eac5169 efc67da0 37efeb18 45481ee6 e13c3149 d91dcbae 925eeace 7bd10863 41e040b2 a9b611d1 dbc5f821 4517877f 5e8db828 b14add54 9227b6a3 +7423764 922a6d13 d50b6a53 d1fa6d06 fa608b6f 081d2569 082dea30 0a71f992 369afe78 09b26469 f97f8f3d 5b95be56 76995c70 4b514408 97e85ad4 2480ca11 13a6a849 +2323703 b8a683c1 8129cadc e022189b 23a5265e dde50158 86f68abe 7f1100ba 64eb5089 1768a01f a423d8ad 688a917b 6c3a1d98 ea6c986f 3620b948 32cbd62e db7cb55a +5217399 496d29ac a5ac3e47 0554f4a0 af632aa3 35ea043e 386cdaff 22ed9dfd 68e485a1 94e1e3d5 7d559aef c6beda18 d72cba08 30220bb5 86a7c08a 15f1fbb0 9a4b4529 +1844656 d21d2b06 731c20cc 6e51e937 0a0866bd 24b28bdc bc322cad 808ca13a b5ab962b f982fc7a 5a3ae6f3 89f4775b a6f98ba3 7a2a7d53 e83acce1 08009975 c00a66c3 +3221150 aec561d1 d7b483c8 192ba707 4d35301e 2202b5d9 e2105397 78488768 f9590120 998f819b 8eac6907 3f900f68 8d58a522 6d28675a 5dd58c81 0c81d8b4 8798bf6f +13073294 d638de79 1bdcb8fe e1b8e2c8 48f92749 23ff034e a0a55eb9 d831c03f b0ad94f9 31c91bd1 41377897 77148224 49f553c9 5ea27846 786a7fdf b7836aa7 69bf7e86 +6318159 d677ac04 be88c587 348b410f e242860b 388c2fe5 ca1e49af b71d4285 e68aeb9f 562fa0d8 80a8dc0f 3864717f 7d5a079b 27f7e360 c23b4f6b af40f84f 6a01415f +14080060 d8ecc056 98a7805a 65470200 ac17aaed f3e51a6f 2856fbf2 dfd45e79 b5391e9f af4ccc8f 95ed7a9e 4a991781 cf50f887 6c852de8 aa2edbb4 3769b1fd 2adecd20 +8995134 28aa0054 86092bd3 a48c93f2 9793981b a2dd114e cf1f074b 190eccd6 370bc329 b62061f8 2586d2f7 957ac272 2a26c38c a985af9a 19abef20 78c65b55 8b87310d +13055214 9a5a18b2 22fb944e 2c4ea034 68a52e7e 66629824 b8eadb66 b99beded 93f1e911 7af364e0 a3751ccd e8e60d8b d8626375 58ae8b01 f016f55a 00efc600 403c67b3 +4809469 a488f283 d9c187f9 cbe21c8e fbd01eb8 6c661300 1c25225f 18f2a916 2fb2590a 67008f43 52a94677 594e596e 7a90e457 39bc1293 798ccfc7 6661cb09 ec81a18d +8256055 8c58840c 24ab3cda 63136c1c d7da96e6 6b960b5b be98e49e 9495a351 9f624c18 2c9a910f d3fe1948 11bd0a3b cf30e7b4 eb2e92af 430620d7 a89dddd7 0127eda9 +8088074 97a0d62f d0521d27 61d1eca9 0b30de39 01aae833 84589301 c6498d32 853f8313 fcc051d5 4155729c 3791688e ca4c5c11 ec63b166 8f6b2fe8 fa45396f 9c28155b +12574923 4bf86b5b c6e9a916 ad558dc8 31d95a9e 5d496b6c 8afb95db 1830a489 7ddf43aa 3b2f7de0 a948206b 390f4aca 46de90fe 18f4965f a3722c7f 3db18b5a 8d6015e1 +9941520 0b245e84 66080ac3 7ca8af52 895770ad f1faf3b2 5dfcead7 48988214 fa51785b 57ed1213 471255e1 85b0cf9a 608895db 31a0deaa 3dd34bf7 800a60fd c7314c37 +12182817 3fd06103 5f57e247 b1683fb9 4d06ad6f 4c6e0514 d0f71cfd 7fee4f99 dc8b6cb4 ded4ce88 a91f2ffe dce67eae 9eeb8d33 5a993f8b 0c9e704d 8d83140d 6d6713ca +2883782 1f6dd1dd 768f1f68 aacf4fa3 80f708d5 2ebbfc7b cf758e91 dcd0bdbc 54a60e33 e1f16647 9764372d b867236f db561740 81de4343 18237f9b 63cca289 55525885 +2251532 7025ab93 c52eb9e1 a6e0c5d0 8089a8dd 9b597d0b e2120b8d 1fe51b47 cfe394e2 540ca018 20c7ee7d c56c84b8 d17e4d9e 29197fb2 71e1a044 ef45fa83 fd06f59f +5545599 1ab8da1e 91413a28 b302a6f7 d1a48f37 1227c8c3 e8a17993 f6238ea8 8ecb43db 1a8a807c b96d13d7 c29ddbe9 2a8e9e80 fa906376 813f634b 43bb774c 30ef43ca +15243672 5c2b06b2 6195c2f4 dcae7e08 f61f1ee7 b21f2847 9b83b519 5f31d868 0c1bbec9 f4677caa a501d201 7b4af8d8 36d13730 bbde6e47 52d86c46 b26d8807 6026c0ae +5144522 6fa8e688 8e75bbce 23d5006c f0f030f2 d681c3b0 928ddd62 9149db70 eea6fea0 3b8a8838 61b4d686 d3b97ceb 2ecbfd37 72dc5637 d4565c45 293d21b2 3e71aa31 +9957183 86f68e1e 86f04e1b 5166d1e8 1c9674ed 7436c2c7 7bcee72f b3238957 e4e2c2bb e6f8a60f de95ad45 6cd52458 d9449f33 8271e6f3 c19c57d3 5f7eb73d 80c9be0f +3427878 8a6c3010 51d06f41 e007b760 bece9f2a 96275295 e279f6bf aeb72111 fe1ae19d 0aa5849d 939607b3 bda08853 447bcf7b a8f40ed1 ac3a5261 e5460ae7 f0b315f5 +16334012 1fbd2bef e429f847 c36e18c1 db77332a 7c0bf1d4 b6454066 0a9f70ba 4244a7da 111de117 275a672d f0775f73 f1daff8f c5763ec5 aa734593 614e6637 1c04b159 +9340254 629892e8 fb40d72d 7072df8d 75ce1080 44617c47 0e882aa6 15293c97 03818c44 ba7f6809 55d5b6fe 1e7aca50 05c28eea ff310f43 b3f4f563 f2be9e10 c662b90f +12174634 0c1b16b5 b57c980b 160e5a88 34341b53 b54a5f90 5b76afb3 0afa2990 99215f01 8d227647 4fa804e8 ffbc2b15 4878e5eb 8bdd337e 8a1961bb 00d45c1b 0832182c +8177022 b4311083 574bb2eb 6e4c4017 dd43ccb7 f2a0bfd9 bf36745d d4b2d3fd df94c441 e7ea37d4 af36b818 35095089 63ef2442 084fd1aa 9564414a 4892404c 8d18be1d +425706 b6a1fd91 ed65be13 7c08a1d9 899d7468 34c00ef4 bcc42525 23514d01 821f990d edd922c7 dccb6c98 189bcb24 99964bf1 3c4ec6c0 36cf9fb0 7af32c4f 0394b34c +15185510 9ffeba50 7127d966 6429db12 66830341 67949ef0 6b846b46 61d3dd07 99fbe98c 18895278 48b820d7 1c8da5cb b5d39b16 9bb2142f bc27348b eed2d355 444ff944 +3975978 1e428639 e645a766 f834a1bb a38a9742 ba676fae 34169146 0f1c7da4 7a5fd0a6 70ae15a9 c5f73ac8 06b8eb4e 97e6ed01 b255c9a4 5d9cf8ed c185939b bd8b708b +8079297 9e4953df d6c9ac0d b97dfce7 42cd1d9d 9b9d6dce 9e06cb6e 1ab4b141 069d8cf3 5a874a7a b1df82f4 cdab011b 7892765f 9933b3e4 c3b35455 e0e03a59 62507c76 +12473509 1d79106a 54f9f865 3c2cd002 1915477e f46a354b 91c2c350 76eb15a9 29614bf6 1b29a6eb d2a15c63 403e834c 76d4c5d6 60053ba4 abfdaee9 cadb9865 ce549d72 +11468849 41c41a6e 4f19098f be6a9c72 abc6cd6d 5d433a3e 58bbe60d b4d94ec7 bb969676 93d1cf4f 2b02fc36 817c4e42 6b3a981d 406e328a 6cb4bab9 6e3c3b8a 4ca73caf +659024 ac010dfa 4968764b 2e4a9c32 93d90927 2727886a c88df986 20edf34a 58fa0b55 68b0e958 846fa332 2fc03c48 6be1c4bf ce8db346 92fe1d89 79fcdb28 52b078d9 +1351288 ff42a156 603b45aa 3e0a7884 f1441963 2b8add5f 180d7491 3d4a4d55 1dcdba8c 59547d96 3fc9a5aa ab152c45 065f71cd 010cf451 2ab9eb1b f0a1623d 20c88c25 +14237093 5ba476a9 19f5ca87 3fe1ce00 2fc883b0 9ab7c251 0444e606 418140b7 0624f489 4aeb4f0b c4ec9b47 9c817eb4 8de00036 63881820 70ba7e50 9a243e1c 34b7e45b +5520244 0bd33bf4 9f7860b7 2aecfa4b 74759a69 fb663f95 edcf65a7 54f90be9 7fc7a4ac fa71d9bd 893239b8 0f8171cb 846a85ce bc976fbe 2c563327 8a4a1501 f649f97e +10057615 5ce66af1 e785f87c 32d5ebcd 2908310f c5bebcc6 4fabc0e9 b9fc24e6 3e6105d4 89a18c7a fb648cc3 e24f58bf 35519f55 6d852ced 6835c13b c751b566 d3e82efa +11655462 7b419049 d6197178 356e60c7 218b631a 9777659a 00f9863b 1d4158e9 ccdfb3d4 ed1ff005 99c5f16d bbdabb82 0a5a08b7 0f175cfb 6eda5847 5bf2c027 165e06e7 +14523516 1c2e0468 4dee9ba0 134b6cda 1580b2b3 aab8e3d4 e9171ea3 17c09589 87c70212 ffeb50a0 386a31e9 a076cf2c ffc5bace 41c395fe 9f78352a 85901a87 b1863596 +11761208 04759046 208eaa4f 209c4fae a6882d89 be391a02 eb70b6b7 8b439ebc 9983cd3b 97667305 5b496605 790a8526 a952aecc 83431f33 5a32feb5 d7d1f9a4 872a5ca8 +11295236 82891f41 1fdb1085 8c463c77 f13de985 144f3429 80c9597a 9dd6f5a1 6dfd95fb 1629436a 2bde941d d3963c5a fdf886b3 881dd3a9 7052df08 9803e606 efae2889 +6258934 ec15b7cf ab8b5538 d30f5896 1f97ec75 79bfdbd5 699b79f8 8f66d9b9 3a1b5020 f3ed6b15 22d8eab9 cf4e1be2 da1d2ef0 b488c251 5decebde b0120eac 94fad166 +7700280 7c8138e7 0392afbd 538e084b f1c62057 903f6b73 4417eb42 053cb8ca 25a727dd 086f4758 9aa2381a 3b7136d2 e3f4a365 1b8b7f6c 9a1c842b fe06e51d 8cf4f68e +6852945 2f68d330 4916bb42 41d04b6f 86230485 7e9c1f02 1757bfd3 b505135f a498be33 198ddc3b 5cc3d35c 8261c5fc 547f338e b5195858 a850458b e4beab3f 1bd85a48 +14734101 c869e6b9 9d2baf68 40256a3f 95517217 40dcfabc 179e40af 74d4c6f7 2e1a33c1 6b5e8121 e85df8b9 9b253474 b00b3f74 d441c696 43d30104 0d0cc64e 03cffc53 +9134580 59cee44f 3b2a8fc9 5a6b5942 46b458a7 f82450a1 c58c5ac8 cb04d72c 445bc8f7 e8074094 ce7f1750 6307314c e45f8388 0a1b6005 f1790e89 e0c558a0 4b17e18f +11405165 3876c01f 10ac595d e465b1fe bc1acac4 edf66abf b3453a1b ae913d21 1209f2fc 66f053d0 0662693d 78ad5a6d 609c3aed 1576660a 7464110b 5fbde20d 423c0892 +16452739 928ce00e 0603c273 383bfdb2 6cc80e9e b30f3aba e4c928cd c99f557e 35104c81 8d1fe032 ddc52e45 0ac8d0c7 c0973892 d74daf6e 4440d574 a1c4b572 bd4dcbe4 +3475078 d4a5baea 428880d8 006b2237 1863f1b4 17f02ba6 dcd3c52e b96fdc85 6071f13a 9e32d1fb 86508ccb 6114809c 0b69325d 608a35ee 812d24f7 36a5a346 79464b75 +6755765 c5148a93 0f586330 91c51b92 65848ede 484b4935 a7dcef69 81725070 faa8a0be c3997575 f0abe26a 3307da73 6382ba26 1a336d17 d0c3c1cf 4612c69c 73a44e3c +3271798 2d55aec0 cc167f2c 8e8aeff9 27ec3f9a f6f92492 7738c465 a017f92c 01ed74c7 f5ff03bd 9d170df1 cd343ce1 bebc43b2 30762b37 c42a84e0 5668312d fb341e4c +10863380 13e13ca1 1954c7f4 4fd523ca 8ac3f5a7 250a47b1 72aee029 6f274f1b d5da6fe6 f4dfbc09 9d52f557 1a2003e1 a1232e6b 7f0696a0 7c0f6ef7 00f75c3d 0826a337 +15719367 45bcb685 7d25edcf 266c1eb0 def09e93 c1d4f2bf 94d2e113 8018d624 64da1485 72fef2bc 5835c06c a8b565d0 38368737 6c2d9d1a d1430250 29aedef9 3d73b3e9 +10859382 8eec5e58 5c7229ce 4af025a2 20f066f6 02b63181 a962ac48 ba8c0b32 aebadecb 51376c8e 11a8c1e1 0a154f2f 4381621e 3e24dbb7 b2019aac 9190471e 6639976d +14278126 1d5efb82 e1e22165 eeebe5ea ceb212da e163cac4 5faedc2f 6cd45678 2b6ad45f d31ff170 31ba02ce debd5823 2e43594a 16738290 26dbf01f a9c50e98 e7e5a3ff +5782431 3597bb56 ff97c4fb 8f990031 07a2c539 2db78897 6835a0a6 2e3f1326 bd7088c9 13ddad88 0b0310f3 ce9b4955 4d8adaf4 1fd37b4c 5b5fe0db be4f8b60 360ea3c1 +9008154 a8266618 c584e2b1 05c24311 8ba5a062 af402fd0 daeabc8a f90628c3 5d748582 9f41f03e 8000daad 38fef4bd c7ffe212 0c5f2cad 9c8463e8 2b5e839e be31738b +6838114 a1f988ce 22f24541 b8ee19f8 83364b14 1a33a0af cbc92dc2 24d40ccb db408fe3 40a57c44 eef1cca2 6b1ff45b 594da2f7 dbe8fcbc 0876e2dd 8c48f7f1 5216d1a6 +2369112 85917050 e6e6fe13 a8c3191d dcca0bbe 8e5c5624 45e7ea2e c4b9bb29 0ce2920f ce175fb8 3937ab35 7aec101d 65775f93 e60d45b0 d865a928 f911fd3a 2ad91f0d +9137684 1422a21f aacecd22 3f0bcf5c 99044a6f 7bde49f6 c3d9b889 60ae92d2 b015859e 19e0b8c6 e4e6290f 08adab3d de1355b7 043faf50 e41b252b ea030fda 76dbd677 +7375044 c1d04994 6658bb36 6b96ffde 77221eaa 8e695b4a 79c55abe 50f84af4 fa96f8d5 20d94d9f b7ae3bb4 1b9907d4 188c5683 d2b3132c 98cddb81 ad2ce4a1 285adb24 +15367423 436e3f23 8b24086b 2ff46a60 ab449096 0e5179eb 2b4271f9 4eefffe2 7a9edc7e b288bd33 b90b6290 99ecdc8e 245bc29a a0387f10 255741e2 69abee02 0c355326 +6931869 df8bff46 fba47c7b b9c056c6 2940bd75 da18f178 4d008835 086983ca 558210af 1e92417f 47508214 5728bb0f d05f6c44 bc0b9a7a f2230671 59420f6a 4ca357c7 +11695094 ae41af05 e9fb8157 71dbc0a7 d175315d 6cf93f29 f8a3a3ad 833763aa bf814531 a7026bbe 042120a9 810ed07d 90b0adde ece4b89e 4fdb8896 293b63bc 1fe6917e +11407834 d7ee81a2 2e14ebb3 e8fe50ef 5865c90e 9e9426e3 c783bc45 dd45637a 32eccce6 91f7384e 157908f2 95946c04 bd81b873 facdcf33 4274eb35 2da7db68 7b5c50cc +6526135 bfe4a623 749014b5 98076c48 cc6cbf19 a9b81efb e51e8b9a 55208550 54c3fa15 54468c19 c31c1dd8 d22744e8 c5441e43 ac809b18 37bc02da 12cc7af4 442cbe53 +16704408 8fce12b6 6bc8a263 222340f8 cbbac171 9eb7bcc3 5e942cba 1dc6b2da 99544e95 0ad35118 94b1eabe b4c9ab95 efc410f7 c48b3098 68c62ad7 daae18d4 a66fc501 +14703891 5685533c 1748ae90 1d225a03 57f17eb1 5b545f03 5c5ba01c 81da774e 6fbb8511 b27895eb 3c1a2873 93c01ba2 d4fa1e27 b73cf799 9d7a9d2d 7ad5a27f fbf33ca1 +15967384 9ed29565 b8ffa5c8 35862719 7311eeda 9c49a835 8a1db4a2 d5d597b9 cb4aad13 5ca1108a 2c0be525 fa3328cc 7ab794ae fbe7f466 c6424621 26fdad28 8050e775 +1858973 1e3e8816 cd1ca13f 08968a59 67d7fe80 381b5584 0fc222b9 16073601 1c7702bf 84769fae 4cf9910a 6d58166b e2a68ba5 197a7930 55f4692c 7b81f76f 810aa5c7 +1061733 1aacc8f0 6f581118 6ccebf3d 47fb94e7 40ff7210 4702b290 aacca840 cad01321 c32a784a 2e981f6e 79cc0a60 6f4b09e3 c7b1826c 60d50ecd 2529ceb5 3e65a91b +13306699 edcd9670 30500db1 10e59166 a147ff9d 01750843 a091681b cd1ec90f 55007b98 1b5c17c2 01e08232 e8883193 c66a50b0 f5c3eaaf dc7ebae8 5fb6a996 463bb747 +6850646 2f453b5f f698da6a 93183e87 a5316a5b 6a5d8529 49b3625c d0773a82 15f4228e a1ff4d42 906894c6 9241856b fa62eca3 f0dce15f 9e97316d e22f4c4b a5956425 +1338209 67aaa8df 9f6ddcdd 2771d0e6 5b2cf4ab 12ee8165 2108a08e be6706eb 6eb5be65 0e77e6fe 01dcd0b3 a0ef95af b1d64de7 4c2e64dd 64dcab2b bd95c50f bef28933 +2046191 8ba37558 b83f763a fbb08b0f ccb98007 1f9de7a9 83c69f65 4bf1714b 74508127 c2fa23d3 44b1be73 7de47dd6 1b3ee6f7 07913b4d 8c8aa440 bc19071a 50f94568 +16482813 10367654 ddb521cd 82119c2d 445977c8 91deab74 b12a5f64 94ffad82 bc6e9b12 fccdf251 63600c26 6657f3e8 10e8a2f9 b1949495 0d09dad3 16a11c27 b3277e49 +516630 a18f2883 a2b31d54 41d976c3 ae40da7d bb313b54 6321b867 820ea2ba 5524f492 22b01dfe e06cca3c 56fb2335 4924241a 3a164c44 639929f5 2029d6a2 0e0589c9 +14397870 b5775d8b b6405271 1526ec0c 99b155aa 4373e8eb fe3e4101 02588fcc 01b69a25 3479a994 01c1e027 71660a75 83eb3d4d e9dffb66 1af8ac64 1703c770 287d62da +10803128 1264fd3d ee9dda38 1376145e 30f7df5e d29b386b 9a01b759 e1a6cbf7 9091fcd3 b18eed3f 6cecdd6b 896af901 8879992f fc11192d 80a3d4f7 276245ed 589bd66f +5752286 1148d889 69d29a24 57ce8f4f a61e7dca 9ae2b85b 1d974e18 34d773bd ff0d2ca6 41f25bbe e126dd8f 28e26d6f 6e2ce620 7b2b35a1 f687c892 2b8c8b14 f024dec0 +4456614 f33fcc09 7890dd3c 141128fa 7c3592c2 fd09a573 e558cf00 12848dcb 3ea33fd4 3045d6aa 084131a6 dbfda535 a86ba6f5 ff87ad9d 00986598 0da923eb 6aae595d +10498131 27d2984c 2cd1e00c 57ac5a2c 31fe35e9 234c2355 df705880 12a202b6 2d683cba e1d85671 209d0c08 b8e713fc 6695e084 8ef2bb9c 0cbff867 4a49bb17 8a9638b2 +14035870 c90db354 071f243b c5aa114b faa084a1 74143159 5b5ed4df 492feb78 de65d4b5 cd3b0509 b88a41a6 4b4cbc0b 5a5d05f7 383a3386 f2190823 2e014f5b 1db976ba +4966786 32a12e75 5ba2075a 7cfe7e43 285ebe8e b8a3c53e 6bd710fe 95df3da1 38112385 2293c303 b7cbecf1 18d9ecb1 00e52320 55520e5b 3a1a6633 4527a34c 609da841 +711921 a45b772d 494592f3 3e5cde9a e70677af d30df387 5d80dd63 e6874cf8 07752f71 fc027f4f 7e4bed78 b7a0bbe3 2c14b5b9 0c13fbee ba580774 7d9def24 ece81daf +2268189 ab6dc621 37a74a1c 9161efd8 720a8342 d21fe171 66b3b2d6 2c5bfd0a ab32c79b 43a36636 a3bc887f 12bc4937 f60150f2 765e94b1 34444800 2d4af417 10983ff6 +3834696 54262ace cd89dd64 2f1b95c9 7616e6d2 50d62268 3d1dae6a 000b0aec 7204de08 2948649e 48c60e01 41bb9156 2ac39576 625cd224 b05a12a1 adf280cf 48759b01 +8530569 25016fea 45c51afd 7a842ad5 514a7331 545b8c34 c147b231 5fe3da1a 20beb800 9d7dd329 c390bdbc 1cb5afab 41a3c6b5 3f08b8e3 b65e88e5 1a88151f 258523d7 +14955368 b8d3577d 61b44d64 f20c1584 3f7c6e8e 1fdf4608 5649a492 719c1538 47c4fac4 0c0cede8 3000fe25 9a69f6c0 ac03087c 94883cc8 2d71e23f 62792079 e074348e +6104018 9cf82b99 0db5cd52 c4f31ed0 c5743a60 cfe24ed9 d92979fe dff6b310 bc587024 347c0cb8 bda11cd3 d7354f01 bbf7db05 55e33653 f944b417 fb9b5c89 f5af8342 +14578279 77304a3c be360324 e53f5c6d 8cbb4fe7 eafe7d88 37a43f6b cdc474ac ec9203f8 a96a7d7a 2dea0dda e5eecd5e 24bb2110 fcc86f31 9a8e11e1 810f8c6f fbda736b +7521739 b8740fc0 ec6889e2 4a6316eb 120a5721 a81a3f15 8231989d 651c7a51 06b039d2 3abff17e 8b4764bf 51fd0a0d 65ddfeca 9f5bca91 ff860c39 15853185 d3e88cca +12567191 3aa37caf 8afec6cb 484dfed8 1402dc62 9ec7f6a9 bc55b26e dcfdc9f3 76f60669 69f2c5c0 a909689b b052de28 434edfbf 8e4898b3 fe9ff7d1 ab5d914c c3aab669 +2536887 7403d706 f61bbc76 22d3d981 4251515e e3c2f138 d0a0a382 451ca205 b642591f 101e559a 153df484 65fe391c 3d4f8432 f51ba711 8b9ed1ee 07ac1475 bb74cec7 +2626911 e73a19ff 3ed259fb cc3de21a 6156d68f 7a1cc50d 49a4b7eb 39378cfb cdbff7c1 2507989c 8b6f045c ef21bd51 b255057e 3b3e3443 0d948217 cdf2eb8e d45bc614 +123872 e8a2a1d2 6eeaca6f 7c474975 8c388efb 9b4ffbf5 e22768e3 caa441d2 ccf1a386 da6f0818 e56002ef 6c23cc5b 1507cead 224b6af5 c0d06fc9 a787fa88 041bf45d +16073444 14baa231 592b4255 e508c19e 852d06a0 4a981c7a dc405cd3 9d65c2a2 6b0d5531 e5e5fbba 0fafc1f7 47560f96 7545e4f5 c1c6717b 98afd0e9 d3410160 f380e1da +480277 2d71ac57 9dc5e717 931b0ba8 9f2f314d 5c7efdb2 66a63b14 3b52fc40 92d623a5 ecf9f9e7 7331d034 3056cb4e 346ec551 31bf5174 a3373a56 1d7e0f21 92f4062d +4517552 b1d515c5 0aeb3226 d5c4474a 50038c4a b3700f0b 85aaeb47 13ef6b31 a9a06085 a024fe24 7dcf46d1 95347113 39859479 88ecf7bf a46eaa4f a5dac7bf 8f462356 +14526347 bd2c0da0 a2eb2bd4 0a31465f 5954cb32 3b8f4fc2 30c09ef1 1d3783e6 db1bc83c f591eb00 576a74b6 957acd6e 760c79cd 5a4c1204 744c4a8d cfec3fd3 f48d727e +4021706 553dc77a 358d5104 81013b7e 5303782d 145b9a81 b181b6f1 492bf395 928acd9f 76cc3d42 52bcaef4 67919638 f3a7d445 8dbef693 05f69a50 5070c459 9c1f090e +16601051 eed471a6 2d616eee 0970ab55 18adf2a8 2abb1fcb dc6b03df 4c6e4c3d a090cefb 4f13324f 7b07a9d8 fda542fb 9c80b685 5061e946 af62de6a 4d3ff7f1 da635ebc +10374784 aec14ec9 fa80916a 496967ee 8dc80cc2 d1e7ad0f 4583ca06 226398a0 c24a9516 f7cdad01 41de528d f240acf4 831be991 cdc20f62 9f12cb4d 95313355 3c51556f +8642630 ad108640 583c3335 365d6988 7f9df6a3 522b98a3 630ce8ef 70f07f39 fcf52738 d30ca8d5 e9a03123 0a205c56 9d934a4d 55faf8f7 35a2d33e 5706f6ac 591e28cf +15764601 cf6c2e02 07c1d273 55a91292 afb1e19b 5f9e3aa5 65bd7ce8 ac7e0fd0 d433e5a0 6a959ca9 5620a9bf fdb7bd68 7e7756d2 8d712bf2 5472b2c1 b1d345c7 012ddc8d +16380575 5e6c0434 78b5a0b3 e5fca8fb 149116e8 a0ee600d f560e128 2acaea68 03b32aee 07ac7e24 b2b80423 e3b6b62f 0ac4afc3 c918de5b f360e0bb 939b5451 66c5c9bb +3839490 228adbbb 3fab4a70 8608eafc a927fc41 b317ec23 aee220d4 6ee30ca7 c005dcaa 24020fef 8edc95aa ac0f64fc b235b841 99d77553 498b3485 b4f7d061 7a4a27d2 +3160156 978927f0 2e4d91ee e66c3361 79ccf92e 47ba4c1e 9ad285a0 31606789 e3edb30d 5d2d7ef7 b2ac8939 fe12bcde f84e0e22 59639a52 3f13ecfd c49f70cd b6a5db0e +1480648 1e7741e0 de283259 cfa709de 4b936e51 76c5902d f3bba81c 5852df5b 31bb69a6 3678b373 6d7899c0 e6e3316f 6e44653d aa1ebeb9 0415ccf9 adedb05a f8029e94 +12449094 578e5498 339c8717 e73dfe88 7a8658a6 d584e053 d80a9cb1 226a642e 8a8ec691 bacb4a98 ab40cdd8 7a6547f3 426609b3 869ddb1c 3b589189 0e61bf14 2b17ad02 +9079695 cafea7dd e1789c94 1c554669 161e4ed4 641cfd9f 8e92a613 07554a6a 928e842a 21ed2194 69edb4b9 4c9b2700 86751745 e9d2503a e16a659a 3aef0812 60f7f8bb +11457730 b044de29 2bb7b259 d2ce983e 96bc5314 60828433 b1d0ec0c 4c33c4d4 32a89f76 54e36ab1 148e334e 5cf250c6 05881a3b 5f1d49da 764ad7c3 3b6eec6a 437f4bdc +14907601 0056526b a45c065d 9db492de 74947630 6d6279df a8abc277 3832c46d f1b938d0 7338e9af 8ef142b6 23897028 5430dbe1 b7110e4a 934b54e2 46d92e90 02458bc6 +2668950 a1912d26 47fb2a57 28214ffb a970b78d 1a780094 c853bc99 47717ec7 bda85a10 81f0a07d 3fc5cbc3 68c0f064 7bcc5079 f089be49 14c5f3ec fb9ce250 c851f80b +14409766 2266ab7e 09193414 f8ce388c fb247f56 8d77f477 260aec99 86f3d821 b176b67e b57d90ea fb86d50e b69e47ca 5a59300c b5eeb46b c2f122e6 7a65cb4c ca548ecb +9457656 069dac29 e47330c7 a28f10c8 83ea1ef1 b9018eea f94fe2ed a754c2c0 6897c2f2 bd61f4ce e5ce8cb9 a284d3f4 ebe0642f 688ecf2a f63c373a bd790846 76c9ffc0 +16591878 ea3c8fb1 b3fa51c0 69e22f17 17221802 587f4ea4 986fd96b 4732d90c 2697ff3f e7159f0f 7032de98 8f60b455 3b31da4a 8bcdd1ff b97bc799 297d5fa2 c0c1685b +1142225 afcecff9 ecfcc429 27b367b5 1f705702 19fa576b 2c8fc1ec 4dbbd9cc 5687e53b 3085d69e 6176c2f6 530a07db 0f2022aa c56fa98c e13a6dff 3c93eac0 d35ea19a +11423725 45581217 3d522152 5f14f543 7ccb4875 87efe1f9 64ffbdfd 3d332cf1 f0603a98 c513302a e663bb8b 296e0f6c d014c87a 2b4aa32a 7ed968be 179a4e09 68bd0dec +3845007 7279e60c 2897d2fa fcd69c37 e3787a14 5be89856 d721b727 83a03ec0 b8ef07fa ed3e4cd2 335825d9 af4edd06 53110e01 04bc5cc8 84f7711b 7dd004b7 7e80f978 +5608933 644975bd c8272bf3 28d25f35 f3d85ab2 25cf3288 41a6bd88 446da96b c709c614 651fd083 4ad6ff4a 0eee5295 62a0b29d 0ac28e76 1c537966 210804c5 aa8618ab +6677161 4e99bdad ef2b90cf f66710b7 31b8a3fa d5506964 63922a8b d18907da a85bcc69 bcb8fa1a 266bb1de 8d96ee57 8a510c78 422caf3d dad44e0a b87cd4b5 43d4a7e7 +793444 b120e7cf 028d1f3d bf228c5e bc1341a8 d8a6710a e8bb405b 0da02729 43fcd77b 66741266 e3a219b5 a2088448 0da0494e 363adf73 0d3667b3 8109bc12 8f1ec9b8 +10494858 23244a93 e0bf06d1 da01ef07 bb27a737 77708f47 657a913f 0c1344e9 3faa0a74 d77b0f36 dbf7d44a 584bc229 c41976fe 676e5ebf 000c0d74 1bf6891c 3dc988ea +1568203 9057e371 430b0022 a32bd379 69c0feda 7d9431da e4c53213 8598d569 6c50e5c0 0be12ce3 0cdf4f65 7d379fb9 ec7d1614 cd892b10 b018b953 981240da 5228daee +9350855 07dd1a9b 11d56de7 2a04f7a4 7a8f9fbc a2fa8e77 0ca2f34e ce14ee9d ddc5e052 8fc622c9 773bd337 325d58ee 6e7df282 195fa1c3 9bbfa54f 4fd01d7c b554c43c +12397627 dd8fe2aa 95ad6d34 6b35477c 3f051137 61510145 e1c1477b 64b7db4f 92159d84 f3ebc519 443167c2 d6d65873 72ff1294 40a21355 e3eecaf9 bb9cdecd e077ab6f +7035764 6391a1af 33d5c5ab b56b2317 581d847d 214e7d3e d96272d1 46f32651 3ff4858d 79d92a63 3dd68dd2 df939e44 2af3e38f 4c811fa1 1480e074 351b971e 679f973b +2247133 1a88f936 80d71ca2 698b87f3 f792bb9e 42eccde0 c07de2c2 226b724a 1c5a7bea 71e07fe7 f6c48cc3 c0a7db94 dcd05857 adae62d1 eeb03970 8aaffd35 b009b993 +6267066 67f509b3 3bd5d0c7 b6bd6f02 f4a422cb 510c6b96 32958811 db3806f3 76e4f1d8 203fba9b 2ce4c2b7 e3f44b39 d1e46a9b ba971882 0326f3f0 7311ae4a d3e55ba7 +2076720 fec2293d 29b4d408 688226fd fa3b26eb 1c41518d c91a0baf 9dde54da 2bc71ef2 d4f1d972 1a6332a9 a7083927 a3ba1293 c80c1100 8f013645 020c6c82 2a962b91 +13705292 d85f9902 50d13d9b c581ce13 c7748c66 ed3ec442 63cef4ea aa7ca0e1 007629a9 2db00e9a 93402aa8 55e914d1 bbd4d8cd b7d94464 4797af1a 46faab90 d20d28c4 +7669424 1cda8441 7807a38c abb3503f 6f0aecbf ecca303e 3e2e7023 4a1d6c30 44ae3f8f 4577cf8e e80d2b25 28243382 ae4de1ea 518c839e 8cb33627 cfb55503 b33d1daf +15299604 6f39f772 2e2fac31 95fb611e 74bb5635 6008929b 7a3be70d 8eec1494 297cf4e2 6a367c81 8da792bf b2eaf704 cd3b7c62 bfb45771 da90265d 3e43d49a 2dfececa +5382481 57945ee2 b5e92c12 5a150355 61bea8ae bde160c7 38e52a59 09770a93 86eaea7f c05fec63 76ff9e96 a0f81d80 ac1d74e7 529a5471 0c953802 3d6cc8b9 cbaead79 +14436159 27e221bc 3b9743e5 bce0776c a344fbde 1ac48f8a 9c440b2e 43d3e992 3829bfc4 65659005 9e84eda1 335f95dd c2014516 534b7017 d62c11d7 308d293f ad06a4e3 +15962258 190a84b6 d42be835 dbd1b9d4 bfc4b153 32ebd7f7 2dc7e39f 1b00cefe fb87d063 a5cd12aa a9771b36 bb068b6e 3e54f81a f92b90a5 3b309423 d7e6bd73 c18c138a +12895706 ee053cfa 5f019a48 3ce70210 02c8a7ec 281a4b5e 60f5cb7d f2d039f7 db1c5a98 93a5f614 18b4c447 72d46c67 db722e2c 7304bad9 14a637e1 fcc4f538 1ef8b905 +7786037 eb31d9e0 5e30f489 f1e3de58 387008a7 6c6d9fa4 e5f5c315 73caf9dd 6b0159d0 8d346d6c ae74508a 59914083 b3c21c29 804f52cd 82dcef2a 19768b1d fb2d7d1a +9584804 4f952194 50b1b749 fee61a3b 917a687a c715437e d607218b 812ae541 2f6a2cf1 28ceaf74 66eb5d5a 34874e5a 563d614f 2276b7ff 0101082c f33f6ce7 17199d41 +1569994 015dc29f 40d9014f d5cf591d abf81aa3 5df979c5 a12dc129 a4554529 242f4b53 49822af2 44e95f91 e32833fc 01bd975e a47755dc 1d58b9fa ca6f5027 fb5ab452 +16404318 4e939b13 57b6896f 19078b73 19fe1b45 d8e11fba c11b1b6f c86d8e30 a0a29e1a 8ea34317 798a6d4a 9f22d647 9c0cd97d 2b537c3c 7eeb2f23 d6c60d36 17d7a372 +10787217 03e23889 e10daabd 5d8db678 cbb971c1 5e811f8c cbe86e90 018627d3 b2a6a60f 49a876f2 648119b5 27af558a 87c85266 91251643 e73cfc0b f1aec1c6 2f8b798b +8551420 24fd6731 cc714c25 89c51e55 790f4a50 e2f0bef8 509cf7dc 08c9139c 687d61b0 7540d0a5 ceb13252 4e571e44 a1109f7c 0c6d2743 00906224 34794632 15244266 +2716521 7018571e f12d1fb0 4c6d124c 98cd6453 5cd8da15 af5fea72 4dbfdb41 6931e41a 3b2a2b93 2f85a266 5a494225 392ad433 e4bd14ce 6c968160 a48943ce 7c16540d +14470175 7e8b8d08 fb8e2172 564a2658 27db6f4e 2e73c54a ab3f2bef 5a1d8a1f fac1c31c 6822c672 e1a71039 05086017 6f745b86 2b827317 ffcf37d1 f5af7560 8dad0136 +2981554 20a6f04a 97da725f ee980bb7 54cc6136 2fa1f123 fa3d8f87 1d2789ea 8e54b917 392a6ab9 f7557388 541695fd 12b04af4 072ca13f 30e1c3c7 71f89b12 cd2c87c2 +9851754 6fee6a88 3bfd4d0c 235aefb2 11da7450 5cfbfe59 90022beb e52b4bdd 380ac19c dc64a78a 0c409eb0 79c47180 4d9f251c 750fa66c 632a06cf af6afeec 2dc22528 +10194152 b55fb302 11e27906 e57c833f 98361daa 113115bd 6e6d5043 8b784296 2a0b32ba 6986e800 ca52ecc4 c2401b2d 023a2648 ee0d4af1 2acd6a1b 456c2d18 3b07cb52 +14866007 d4119ae4 dd91fd46 41408bf9 2f1eeb5a addaf98e 72f3cd1d 6b90a954 977be49a 1d6580df 8cce5ceb aa008924 42c3116a 4204e629 3f37bb5a 94ad4c05 40b551e5 +13681122 0688dec7 9736f3b1 33379dc8 22d0c0c7 9551269b d2df5fa3 ac6e98d7 c20775a7 24b0c7b2 294d60ed 67ab0488 e1088a91 b6aa7b74 5e9f348b 03817502 12356ea7 +2187327 e31158ba 1092c6ce c6e102a1 b343f336 d8ea1ee5 7c26fe72 047b4fd7 1c87749b 5cb3385a 40b50b1c 7e51a2ab 42fe3a50 21bf8ada 982445fc 07a71781 ea24547b +10893970 287e8378 4f3ba87e cc130ce0 f459dcee f49a586a e14a2682 a8eaaa37 1b652586 cc080e0b b5d5e7db 38822b11 aae73d08 e277e2a6 7a97af40 6e2a0a64 d8d2909a +3192992 9866d52c 60b24ff5 a6044086 ea090a5b 6fa7d1e2 c109b3fe 8f3baabb ef16d611 cf725294 3c17cccb ca451676 3c7cac4a a45eb3e4 2979268f ed53a42a 69c1165f +13199771 7bcb0a7d e1f1918b 3cc5b028 d24a66b3 9b71da24 18f6d070 24a949c6 ce6eca6f a9425a96 b10af3e6 12714ca5 f69455d4 465ca2bd 322bb065 4fdd6f37 11015cda +16628670 9599dba2 c9236b49 732ec73c 9a11e083 878b4f8d cdf366fe a84f57f2 df8e81bc db33e99a 8e7398d0 37dcaee2 27faae23 010d0971 63d5b3d1 4a78e11d e6e3f283 +7344670 436d6532 c07bc485 55422c73 24f227f1 3f4aff39 0f52ae81 206c2977 4fd15fde 5ed6ba21 4d0e8d75 9c5f4010 3c7966e3 f33aeccb 4bbda09d 5983dae5 0aa86a92 +12173434 6335d553 cbd6b644 66602ca9 98bf992b 6ee1d977 d31da27d d84ea6d4 a63bb055 07cb524f dfd9e044 b48b54e2 a711d0e5 1c62c369 0a860b1f 3e33ebfb ff5c6a16 +10344179 2eff5e00 d87b76b6 0938dc92 0d35ce60 164f73e2 03bbd1e0 b185c01a 364bce0d af6dc11d cb1ae9f4 7681b3b1 32161811 f12cd17c 6a9d7b4b c295ea82 c9b0dae6 +11954261 b8c9e277 6f3ca5aa 4c35afe5 76381e8f e3bc0a2a 27e55649 3cee54bf ab1eb914 c091f571 261161eb 851c51ed e4bba9aa 3c3b8479 0950df26 814972a1 be787390 +16451274 ce0c5094 888f2b1b abbac1df 1cb1c216 6815df1b 02e9dc19 70c1e53e f3b676bb c6535262 f92a717b e3bbc2b0 fc6e60e9 7b527503 2ccfda7b c22939e9 65db5180 +12593411 3a9646b9 62bdad71 461f5581 580c5b82 f04d8c55 f390b0c2 784632c8 41a32324 60bb09e4 6bd09838 8dc78d89 b8a232be fdd62275 bf23a83e e9d9868a 973cbab3 +4459518 2e73f85b 72768ab7 aa702a93 3110bfd7 a5e8b2c4 cc659fa8 86ea6dd1 c67d3459 e4b0ec18 4aaba0aa aa85805c 7d00630d 4f6a40aa 2423b1db 55175f94 7a65208a +10722955 998940e5 778eb654 2f18a4b8 0f795695 b1008426 d4a2a96e 72915379 201d22c9 2aa77cd4 ac3d2f51 dd2169e7 5ec3d784 66dc8041 af00dcb6 d26a8f74 5c0e7dbc +9135483 503f1874 f9b6c57f 9450a03a 4ecbe939 1285da3a 1b6ba66a 43a3a9a4 0634c72a 7ca122c5 2cd119cd 14d54e47 cd40d7e7 0f6cfce8 bf1b9b70 a90a3a58 f1237731 +15056881 446efa15 b2b92ac4 4cd8d730 0ba94bbc efeb73a2 07a56188 b6a3be70 d0cbb4fc 9cdc1544 534d68fb c8611408 476f460d 3b97a1ba e2b85925 ad36e1ad 57656527 +10704828 74a27dfe 03748902 1ba7e035 5c2df20a fd247504 6f9f1683 5213b80f 4038c187 2c7a5ac8 c4d91a65 4ce7e811 2041f3db 8791ae20 8658eb64 64c40398 3c787e66 +6625724 2476c6df 588b972b 0bf3a6b2 77aacd10 03d82332 e9c5402f 5a50952c 28ecf91e 97d5afb3 f381dbc7 c2e7073c 12ad980b 2b3a7406 07ff880f 5cab1081 e30b8684 +10702995 e5a31ebb e08c7896 56b621ea 49d95df7 e0270fb5 1f2c9236 6b601936 fd619da1 6ff8cb8f 6c33146c 48d2e9ae 97f59d44 c41566f6 b85b85c5 d3b05127 b653a311 +4790450 e19a7742 94cf5141 7900733b 657ef35e e0afb88e af9474ad 9c7138e4 1b5baa30 95e769a5 f77aa137 c55f1d4d e6025714 2677f0a1 a3953cea 40130e1f 6555f59d +5444287 f853c79b 60c0641d 7e6c81bc b5e8aeb0 20907946 04bb7818 1df637b5 adfee9ca 8e90bd07 335c3f0d 3b8071d2 f0c95397 9eb7cb58 36966116 6d804c80 9ebb132b +440064 6d0cfcd6 39e9f7fa a7ed36b5 97683fd5 e395fab9 997467fb dce38748 f198dae6 af0a4d0c ee596920 3bcbc015 6f91d7d4 38bc6146 e4395522 624b1b6b 59c222a1 +16400858 461de5b0 7f13999d d8f4f853 958936fb 967225cb ce29447a b1aed1ce 38a2c1f1 9de8da32 81c0b6de 2f0bf09d 44a45179 ca12b6b7 4728a11c 95186d8a 51252eaa +1663252 54740e98 014f2740 eaefcebe ea6ec203 3aa3872e 837a3691 fd581df2 e30fb053 6b57ef7a d6b1195a 3fcfd7cf 3e16c41e 970a0123 10265db9 d6b8bc83 d7a09b15 +1463876 e24af23b dde45dec 6383a35b 647e5ffb 2beadadf cc83bd9e 6bbb112a 16a6dcc4 0c63b547 1368ae53 312e2e2d 651da3db 976f932a ada350f0 566fa2af e5fcd57e +2567245 432309cd 76a90570 ebcd430d 464f129e b419e556 b395149f ade44e92 56e7687e 08e96486 6ca3078a bd058860 b1b3c296 d243758c c888034b c3a07713 6106f6b5 +5528388 3681f504 db96f214 92b1e740 72a3b963 b37ccb81 30d26bc5 efe1fd52 e46e5f2c d134d7fe 9b9a62c8 0ba09899 90175b32 263924df 414d0d48 d213de00 f91d1673 +4163488 b5497494 a72651b2 6c8a8b6d 1df96c22 60450780 bd6102de e253f4de f1dcab91 0b2847b9 d5c33a60 cb9fff99 259c2e09 32040da0 60434a88 e469e04a f7f5fe22 +7837784 e5c97bd7 deacc7c4 3c4cf967 978f1cd0 e7bdcee1 7094a64a 923c7bdb 262d8198 2fd4a31a 4ee357ed 591c021d cc744911 dedce4e6 054e00ba a948adcb f7003e4d +2331863 cf80f67c 56700988 31671557 8fff445a 3c26cbca e970ff97 0586b125 ded6011b 2c476e0c 5772bb7f ee1bfa3f 8291eadd e15f4b7d 5fb95130 7d60c8d0 94dc7968 +11328675 f2e73ad5 7f115762 05efc7b1 aab11f95 9daac492 d2d6527f 1992f522 f1313d6c 8608cdd6 e076bc81 5e4a471b 2612fe40 c241d3bc 1c3fdd70 649ab071 5ac7405b +6595903 35d73463 664684c3 a7ac6c1f de46d651 4ffc5813 2ec7c3cb c75e2982 118a79e1 dbfd8fcd fb81d6a3 0712c315 7a6be64f 5746e4b9 dfee7749 1759dd31 66814f9d +2152081 c0c6e9d1 63d20270 461c18ca 5897700d 77442706 0d6a49a1 26a48964 248d8f00 0ff8a6cd 51195a20 7fd41c5e 1362a36b 5b957838 e04adb5d 95c794e9 e266634e +13933465 892e9c0e 8431bc54 3aea0ed4 458c6282 8f7c1369 e66a1819 34f37357 c4106fcc 0bdd3e75 90aa9f7a d91c6a0c eb99739d 6a86999f ba509861 503e9313 bc4e153c +12329799 917985e8 335b23e2 2ab57260 eba9cb5d 18ded169 ac2defc2 c17b36b9 8c66de15 9ce14e35 4a9e896b 3be89e0b 4ad58fa5 acc14399 469eea5b bba6c632 d7808ae0 +6828097 03e6c635 8039c621 c35b8fc1 c179be11 c7c60a85 089afbe8 e478f9f4 3453912c 9122c69c f38d56a3 8f523c2b 4b43976c 8a638efa 24f2e19e a7551b1a 33c2ea29 +16142759 a53e3a6a 9a1f70fc adc4fcfd 78d2fb91 722482f5 b36f378c 4f7a9bd1 8e79434c 45d4e44d 00e4cddd 2e8efa15 ab559ea2 1c86d792 b1859340 10bbba30 53a7bdb4 +5866474 1bbd5ed6 9da00733 73a365ac 7f4733c0 7d176a1d 9eac24c0 49a18af2 2cfad1ba 4de7cca6 0a150864 e912a0b4 f419c423 57710430 b99a5790 09902320 f901f661 +9832999 585dcf51 298d020e cfa3909d 13811e17 0a40d819 0445b02d 68ee4da8 cd0aa7aa 6f9a2d29 650ea677 af587fa6 93ec35e9 684454b6 64e03c73 f27ffac1 6bf9dadf +3466735 58ef119e 3c4c2d26 eabd312c 6a719a92 67e250cd 2b09a522 b11b04a4 42f5beaa 202431ca f0a7c14d 2f1c3602 96ff4ebc 8e61fcaf a60cc5c0 3b4d267f 7227150e +12855500 9312f98d 2d3b899d a7e04ad9 b7152292 3ff44b28 b6e9a0a4 3adc9da2 2c6ac999 696e557e 1a1c5b38 5547e725 b5ac2cf2 40a923f6 815fc5f4 5b97f33a cbf5e03e +14156420 bd931e86 87cbc3ed 04cb985a e653e916 9cad9e60 1d8f4dc3 365a7e52 95f33da5 76c81be3 e47a1c5c 9ff293f6 c855e59f 46295804 d6aaf633 2262c20a 7fede3ae +16214546 fa0b208a a736e3a7 7444836f ba0dadb8 3c1eb897 e236842d 923cd572 e8c09e82 3a4e68c9 c2b2a017 b8f12b11 08b55424 5cd41e04 f303fd29 8876e3e1 521b90de +12623412 8471b340 2eb2ebfa e6d7658a 317f788a 535646b6 c27ee63c 2c4c0e56 6cad9da4 6d6e81f1 5dd267c7 aed5d76d 83473d82 3bf52b2b 1f75d79c ba456468 a9a554b2 +5029986 44c5c933 6dc27ecf 506058e3 7f56bd29 a6d9bf75 ae9cb574 d2df29c4 c9ab1a25 92deb463 d8aa76f9 93b2f71b 7bf403e6 cc3628a2 b077e6d3 c8e5b373 35829bf3 +13818207 cafe38af 0f905e4b 428b9a1a 173e8ee5 b4c99ffc d089bad0 ecc9c9f9 0010f7e3 4532e345 ff76060d decd4547 5045f851 425e70a0 215a95b5 ce4ea385 3adb1c76 +16113553 cbf5b39f 97abf0c3 49ade4d4 d7caaee5 0e0103c0 c78cda47 68c5ccfc e6d1212a 70815f67 1062456a ddde278a a6d34bdd b65adc0b b1a7d0e0 fb8fb56b 921c3923 +16300554 fef285b1 0f227351 7eeacc03 26109b13 d0f3b86e cbafeead 47cfdba8 22b13681 051ccdc3 9952b022 f03ab76e 4593af42 cc4f06f8 a941f6e6 b9ee3e16 3ff52ab5 +536598 0ff5f201 2d94948a 2c5816ad 3c18e2f4 03d456a5 8d618438 1b327ad4 4fe4c687 b9be2f6d 6f7ff763 15420690 53150fda d0fc585a f2693da0 cff778dc 86c19518 +1536475 781d08ee 423a8e34 e3be8d96 2f95c159 5fc0b773 90336128 7acde2ad c5a3ae22 32b72d41 57ed346c f1f2c459 3199630a 45a219cf 3ec3c415 1dc95ca6 0d53458c +5784286 3c743834 f8de1056 5dc06bea 2138b91d 1a2f8ff2 d005afd3 34bd0dfd 33b9fa3e 9f27bac0 2c29824c d1edde21 b645b163 cd75b2b1 4d80bc8a e91833b9 115ce053 +424568 b2ea031d 3733bb04 e33425cb 513b4470 eb1cf4c5 e88d1175 1afe071d d7c28830 cdf831b4 59b3df2b 0bca30fa 7e12fc58 688672c5 01d63454 85f036b8 af39db9b +9029533 a57ed6f5 773bf536 5c2127e1 774bfe2a 91ba1657 bb94e814 d9f08d57 658c7e5c 4d3a2324 d82b8498 d3116b92 6a63d837 4461ed9e b1aa2ddf 938d930a 546a024f +16604374 8e460e9c 14e65b9a f9a55711 7df32273 87a8eadc f18afd42 3595092b c6cd4f44 e710ccec d81bdff2 65f1700b 61df3bbd cf97bc8c 568a66e5 9d2dcd8a c22056c9 +172143 83a11648 0c1c2cc9 c172faca 46d7948f 011ca407 0fe5cc05 4ac0bd2a a7cf1421 2961ea0b c30d4d13 fad3f10c 9afefdbc cc0cec51 69864ef6 e1e78215 156a5b8d +4326323 95ddb93a 9b92b856 b2a772bb c0ab81b6 5964223b 5c41aa93 a6b2890d 50d7ff18 0e7af0d7 5b955436 034f90a3 3cb51b27 fc5b3145 9ab2606f f1a11dc5 260c2e25 +3361761 903100fe 20aad192 86ba464e ad4847db 30b265a5 ed21f553 9c19a1b3 950d6017 75c555ad 2c91667d 24fa6201 1b6a42a2 572d4810 13ca31b3 1909e6f7 4ac7d54e +11998798 e1374c90 5cbfd7e0 b7893cd7 cd34ef5e 98d3e4f7 da45a965 0d2972af f8b39024 0c6077f1 ba298fc4 77e3dbb0 a863b19c d09c5314 c1184db1 251be809 3504b1bd +8754328 08965fa2 86064452 593e1585 c4ccafb1 40f3a31e 2b4ebbea 683b6ea6 7c246975 ef895fc6 327da541 568f991a 39bb05ad e91726b1 b7e1c2c3 77a8bc31 cdbf9893 +11375191 b3cbaf7d f9b54213 d8fef813 aa13f604 346980f4 f523976d af52234c 40d66af0 2379fe8f 54687f97 53b48974 cffc6d85 2f4ceb8b bbe33557 7fcdeac7 3274e6ec +5237736 a33c1520 59aba835 8a183647 a8c1ae77 63050666 5f697377 18a6c395 65fd9dbf b04598c6 618ffe2f fa5a07e8 4de6b370 00645a9c b2dd6f1b bbd21c4c e266a35e +15987441 30f39281 2699fff7 f5f322cd 37765f74 6f3ab4c7 4b589dec c8787c9d 216f7e25 1d8bf284 780d3513 0c60a3d0 8ec3ed3c 0be1b8db 0255ffc0 376ed521 2482c7dc +3470415 43e40a58 f174141f eea36c5f 34d0249d e96c2bb2 e5d1f030 22ee101d 3dd61ae1 6bb5d8db c777ed15 f9e348aa 13ad8056 657345da f9d57364 ab5d3b5b cce9b58a +1290500 004ab70b 38f88883 5164bc29 08e379ba 8eef6585 d2d877fe c3c0e7a9 fecbeb06 26690b57 a1048440 5521e83d 1977ed8a 1b9dac14 b589decd 0dc67281 51ea473a +4266383 00ea6847 9cc75f2f a5f4ec92 e7ab66ae a4e01a02 4a8d8710 12bbf780 ebe625bd 4347d6c5 c164d3ab 6b6c57c6 2ceedba7 d2a15402 e417d141 ceda6164 d7b61e6c +8851440 a1540f5a 39407816 04fcbc1e 2504182f b9f188d9 6a8d5ba1 59c44f3f 0ff54882 2d0ac35a e6c9206b e0b42b35 3d68e6ba dd942b41 c3fbf72f 91ee4607 0381a560 +5856796 e44d9443 41d068d0 58fb5cf7 79de3fba 148c278c 00117670 385cf56e 393600a2 32c63ef5 520b02e0 b105b0e5 c7b4b7b3 aa7e1ef5 027fe173 4f4f3d13 c97f41ca +12232222 1e8566aa 3a47b465 75f93de2 0d1926e4 5be4fe9e 34856b54 c5ada156 fee33ad9 03adb1b1 a5e017de 1e10ff92 a588a83e 5cbce3a3 b4897067 00f3502c 87fce403 +2369614 4fed643f 8171483a faa4dfaa 5e9d666d 4e9d53f6 d88dd331 50bd9198 5a228038 2472a2f5 472aba34 3261cbe7 d1f996e4 4e696b71 5cb83314 63efc764 1ea84d73 +9073786 9a559012 68a09529 3e5c9093 10690a68 53c1a9ca 25b70963 f599ca16 f8b113b2 55a673ec a35c15f0 1bd8ecd9 36260f05 1b926515 2c7a7006 bdafa1e2 3f08c0d8 +7503406 bb6e8bf5 7de324d2 5f65ad33 63212b16 d7181044 1f66a07a c7cd4c60 a02e56ef e2a0f5d2 a1ec9eab 82700b52 338b30ed fe9ee7c1 08578a33 1af61380 77d7a701 +7191446 578d02ce a84898ef aa351eec 19a7e51f 545ad6be 5d3e05e6 30e93653 a9e8a806 e95ac793 5f5eb705 e6fd1cc9 ae080b35 01a7b1bc 6196eae4 1ef712c7 956ec9c2 +634202 38d906cc e2cfe576 45a8fb52 05789534 bf504690 6b638b00 8bad077d 217410e4 6f728684 d1b5c1d7 2bc7d638 38b5935d 6b453594 42d82685 ddf39f99 f3c28759 +9414617 ad3d9d55 6fc22499 5faa6b34 beb61dab 240f7fd4 010f02fd f3ea8620 3077546d 661e5818 ea85e650 fd33d553 88f3a634 6451c6ff f5c5317c 37bde852 d964306f +2932959 3a60a5de 5e5d4042 7eaba7f3 06ca78c3 afed270a 38433aa5 803fa933 76ae56d9 db2db7b3 82306d52 31d066ba 02206b17 57d22696 8291f2f4 84e5054a 131d8b48 +5050315 19521a69 96be11c8 4215c877 132328cf deae6bcd 3002378c f06a6636 3dcccd13 1e54fbbc 469792bf 179a9a53 47548cde 38b187c5 f025cb02 4adc4ae3 f553cb45 +3542165 bd8093c8 fabdfd6f 93abf74e 7537d92f 2c54d474 07bf2c75 87927213 f965d3cf e73e7ff2 0f988689 fa48f963 908177d4 bd267499 10357e5c 38656878 5af569e2 +3609414 e0bd3688 7b554db6 3a91fd93 77416898 07f6ea4d f2e8e469 751c7568 402d9c01 4821041b 370bcbd1 f2d4e3a3 83b15471 ac370702 ccde79e7 7a733581 cfaf1235 +15002687 41c560d8 afca8f4f 52ea2d89 250b5afa 40153edf 35d61bf4 c11a37f1 be2be97d e5fb8f0d 50929853 a53a1100 616359ad eeb04842 2b148c94 e97c260a cbd98308 +2567292 4e8b8b42 3fb7d3bc 64f93969 de261391 07910b3d 1ada927e c92e8749 a7f809f2 4bcb6f5c b649d9ab 253b3f90 90631577 faa4f625 65135372 80a047bf a2617b90 +16470549 56b76daf f5652e45 afabbb70 1535fab2 97b84c28 0eff027e ab50dc3d 84c471c6 3a813815 a676abb0 2878a7a5 4a0fcc93 79ad77c4 41922f43 437ee6f0 4a10c16e +11547560 63b182f0 bbf4b135 18f74974 560b7105 b7daf046 e55006b0 0679bead 26543714 471f6d0c 6ddc43af 96a2dfbf 766f79f6 4f4745bc 319e0736 0ce5e3d6 2d022a1d +16428731 3e9ae9be 58443a73 0134dee4 64bebf17 fd38500f eab0179b 3ee0402c 4c0cf877 c136406b 331902a5 1ebc4baa e26e3461 0d5d3252 8bd7c390 2734165e eef403c3 +714940 615ebb99 2cbf6516 a1a6f6c2 6d422da1 166f91d0 33562359 9f2ea1cf 0b009251 5837c63d 6c4931d6 844de428 33988a0f d9ccd71b 8c0eed70 79817f94 2e54b482 +7429802 5ada4d99 c266b020 a84a1bc6 d9fb2bd2 424d1402 05fb0fac 52b316ca 01857ad6 b79d05a0 b84774ad 84ffe568 786fe79b 856af7df 18873168 a0b709df 4c65a039 +9969911 6f1191c9 bdb273eb ac92a25d 0f9445f3 5961e4ac f5bf5086 fed9e147 0108e12c 5349fe9e 574a7b76 0c7a7cfc 4568f7d5 4aae6875 4a8a7001 4194b090 08704c1c +2919323 3cc819ac 8bcf8394 7623e238 db5b2c61 39826388 98db4137 595fd2cf 357a5727 df2a198a 735bde18 2b544146 fb377fbf cb0633ba eb2eb73e fb464d74 4414bdf4 +10840561 1edbc574 4d3a7d86 3b2c6425 ddb1f1f6 b603fff8 cc677b9f 466d4be6 1f7b7e7c 162ab7ad 5b2e5bbe a05e6015 372c77ed 01acae35 8852c790 1ca52d50 8184b675 +10874433 92ccacdd 3b451fc2 a3f4508e 90ace56c 1cf6a4fc d755a244 1d0c4ad1 ab8885dd 3302ff45 5dbd2e4f 139ccc73 b3581ab4 828d69c4 444eccb3 1644501b 867023df +2382428 d0fc12e1 4d1a8b36 1a8ea09e f710be90 31a30f9e 240bacaf cfee1389 8babea13 2dde7019 ec6af4c0 bb98d87f e40b5ca0 7cf8cb70 2f7494b4 804f4023 b4aaf0ae +14290310 dc52a0fe 3c495745 fd37797b 15351508 fc8d2a7a 3b507194 47f60c13 be6ad449 c4014648 cf264c2d f7d72cdc 333b14fb aa0906bd 3083c83d 2460ad2a b3af5b64 +15013168 dd68d5a9 ed93dc07 0c9df20d 0570e19d 8fe8ffa9 68bf4252 9a167327 7855eded 00f02364 a743a983 cba026ce af0ed3e3 5b2627f5 376e3d4e 33fdc2ad abc59e94 +9832396 73d303fd e0533261 3dd2a439 bcddac13 848a1647 ed862572 dd313edf b6fa93e0 dfd2115f 40944e70 c0f2dd25 b7e63d99 681b9432 b71559b0 51fef3e6 3da367eb +3832049 bc69d8e6 925faf8f 870520c1 463fe2df 12c0472b 18bf7b42 ec83ae9f 84d2d125 ac31f615 955ae1ef 0425dcf8 fad5438c d0b1b982 795632e5 c5456ade 5fe844b6 +11902303 fc3d1803 75ef701a 2e906ca1 142fc7a6 2d36f14c 1994518b 46662c99 b82bf3fc 2a7b0092 9041f044 ee448fd0 adfa0e7c 77d8aa45 059159f5 013dbbca a145c8cf +2725121 a9cbc2d5 f5a12b51 e7356c75 15708288 636122dd abc8f13a 1739363f 10e3b018 fbf409b7 e8b8c94f ca4a3544 f5be23f6 5c11661b a1d564f6 1f88d930 85578459 +15295566 78aaa35c 23cb5ceb 8c026ef7 b4a7d5f3 aae768f6 3e73aca1 5fa86aae 8bc5e30c 270ed2c9 ca67375d ba6e3d42 bcdeb818 663b5990 6c51c730 8208523a 9cc3bafb +3523714 9e2da293 818694a2 1a341149 f744d619 5e3a7381 f6f3bc05 098bdb33 8fdc6fdb dbca25e7 2f8118f7 2ed61e5a 42862537 3ad5ba23 80cc9302 68eabbd3 3c9a5973 +6767024 af70230a 2c08f36e 6de4421e 27e340c0 21a57308 e83778bb 4629da8d c89dcc3d 82a49326 5696e2ed dd1bbce7 d2395301 af877d50 17032b90 0c6dc9ff 9b8b4a4e +5105255 f043d962 9a0cacfa f2095344 4f7131b7 25ce185e 88be2aeb 06963294 61754401 f1af1ee5 b472dee7 d72e9794 ba7d245b 39d273ba 9382b83a 37d539ae 287747d5 +13754079 81311d09 8ab5060f 07008d23 c019bcdf b4a9f2b7 c33032c2 83cd29b5 cac4558c 9dfc4d09 b3cef0f6 3791d729 936b71f9 96f32fac 6ca33a71 2657bf70 607647ce +16487195 b38593d4 cf5ab349 2eee8571 0b9c5af1 ead1932a ef619743 1f3fff56 01672f2e 963f6f5f 1722d910 c1cea96a 5e04f8cb fcdfede7 e3958a4a 8a1eba24 28000d06 +7427811 5db8a170 b683f212 a22460fb 6e1c1279 fcc3d7f0 03d985b6 4c915608 714f106c 53ddbef7 5695c353 033cf382 171fde88 1477c9b1 49524d13 90c740ff 2cbae21a +6134578 7ac89b0a 84823157 aa97b1e3 01295a00 a6f8eb63 598b4128 ba103268 d4047c76 5c09e28a d37af6e4 12c6b793 eaeb43a7 35d9dfec 7035a096 a5dbceed 61e7ab8d +9279661 b07a5835 7304d5cc f7b10bde 327d61a1 fd2f28d9 c6daa300 57d03094 6d625a62 6fbe5857 39797ff1 f2518f07 5847d97b 96616396 adf45b8e ad3c6ad4 4595f5b3 +14708150 677b47da f4b96987 31b611f4 db2ca530 bf2d36b4 9cff0327 40c72a24 0c23726b d5837293 97141527 40c21def fa05e683 756e554a 0399fc5f c084629e 70c5eb50 +8185489 2b3a914d dd24fee3 ffa676fc 08f37fc3 ef0bfa3f 11b27392 fa0f56fa 07226b5c f0fbcc89 df9d9582 51ca56d2 9ed555b6 dfa2c1f2 da112461 e2e128ac 2bbfa83b +3457768 cbf58534 5268e911 68197c15 ee5f33c3 26a76cd0 25f9be99 91d151eb b6fa4eee 073a9c21 b67686aa b78f2850 2ca0138b 3aed7001 adb3e681 a3a086c6 86b32bfc +16129124 878d5293 292a7e29 9b3cb858 14bd5607 ed06f527 794599db 3a20f59f 8ef3f12d 7f8ebecf 52293de0 a142f169 3cbce2d1 ec88c004 b469205e 3fbdf557 8016c747 +9337089 d246e52f 319f21f1 6d48ef16 8f10c36f e969e08d 67c96b5b 8b6dad1f aa8772c3 29d0275f 90c0dbc4 b74dfb2d 6d75d255 509f4f97 8f50f82c bdb4a9ac 6380d06a +3562664 5ceb0c9a a54e09ec 914d92ce e0cd49df 28038fee 27dea47e 0e2517cf 6d8d66b8 fb9a5111 983f8a0b a16d4803 be8f841b 5ca65b34 3e0230a5 600772df 8ee428ec +14698207 882f1d22 29bb14ff 3dcf4870 3aed9649 4fa183f9 d521b48c 872c68e3 babb06a4 52bbfc05 ac6ca654 d9960ef9 b8c52140 8435db9d 57da7dff e4fff3dc 7d31126e +4877822 a06dd9e4 0748edac 7a032c04 5726bc00 be27e983 6f618ac9 b61f99a7 c595822d 1c528f5c 1fca4c5e 6af1ed44 77e48ca9 f5c4e928 da1e6a3d 7e2bd799 ebe0c421 +11072027 177cb03d e22dad76 49971f11 d3ac61c6 a1a3af03 7f5d93d9 410ac0a1 db0f92be c0d9bc77 82807ef4 f8731605 1d761bba fdb4de51 bb8a0238 382a0e58 d103c41b +15942817 58fcb5d4 506f8c23 a6c73a1f e8be5730 38f7cbd3 c91ef4fc cc53d028 1b8e12f3 2a57f532 bfff32aa 06152a66 f84ccd19 c03bc48d c38212d7 25a3cb27 2b91ff71 +12019170 010c9149 a45c4091 03563e98 f48000e4 ade9f861 e60ad7b1 9fcee88d 68048318 ca9c84a3 f893486d 8b80a0b1 111d974d 1ee035ca 57aed073 ab7c6725 f90b91b8 +4801607 451fa609 e473fba7 59187168 f8656161 5b2aa1f0 e92a1262 48eaa544 d0a524f6 52f8c92e 7cbe966e 7ff7599a 3d29faaf c185198a 2caf94b4 e6ea683a 0b3eae96 +16416104 b9d71452 90e3d03a 8d6ef2f2 8345a09c c8299c48 d1d36e72 f5d61aca 6cf98af4 ed57a33b 41813666 0f9506a5 8876da0c c9b59a69 fba39ca5 f0fdd9ce 55be4815 +16417201 db19c19e 3c5f0785 6c42e0c4 19e7e53c 1e4428f9 c2087c48 9b7a5f6e 0133f2cb 36bf732f 32db9ff0 1733be88 7068a45b 9815f5e3 3a0df4f4 b54ebd9d 4c52c450 +12946414 d3f8730e 0771fdec 7857ba70 b7e594ad 3e255a0b f36036a1 f3cc8835 4ac4561a f9291925 88b2c2ea 3395d4ed 26777648 65dccaed 90739024 5bafb3d5 66bd7864 +10710776 b004052f a58ec725 cf2ffea3 9b5b3318 4acc9aab 7169ad69 27ff252d 264d33ca 3ffaaee6 af5b18bd cec27945 0e042a5e 89e2a493 f0870cfa beffc663 0039490d +7646964 f4b85efb da3b06f5 e56602f2 cfdffbe2 4007efb8 fbb7a9c9 24f41c9e f884c2f2 fc55c3be a1c4d66f 327c6bb9 98c9068a e5b3d942 8b1ae7e3 9bd78308 99216018 +14479845 419dd2f8 c1a4b915 4cd073be cca91c2d d6b92f00 c22667b6 89b8e777 d06f352e 51155513 088ca0a6 31cdfe4d 961de90f 42f9416e c9c637d0 302d9cfc 89d3fa9b +4154449 22ede96e c42e64a0 2fbd2de1 56d34e65 b8e12f1d 97422f5d ca4d3708 2422a9cf f99ade55 03d7ae1f 0ed61a89 b92c5783 338f8c76 1bc04de5 3a131203 b614d252 +11456772 cb7b21ec fdc680f2 d3799085 6d3aa8dc 5195e02e 037a40de 33c1440d 1ff9eaa0 0fffb02f d5eae8ea b5cff9b8 28e2779f 6128ad3f 3bf04085 47de7ef4 2607cb6a +923472 32310600 18dd6e18 7cd64895 2f06d4fc 544a74e5 c87e148a a556b6c8 d73badb3 3f53c32c 12ca65d7 a592d3af b32a2699 4f6a7e8c f8a9f084 48f9e788 9cc43c92 +11607828 ffbc1124 61c5bd45 b3098e88 4b01601c 7fd9c80d 38826f3e 2e9a5563 67818856 a7d90c0e e8da9c6b 8c77f6b7 d86dd94c 17d2e3e7 2af8db29 eada6e1b cedb9b77 +9238261 1b43c253 b3bda36d e06b6675 27f71e2b bf93d94a af2e39ae b7e7202c 76eaf435 8d772c65 7d0af547 fc58a061 9fdf4043 87cec21a bf4c3761 27931f16 c4880062 +1775535 f3025e69 8747c8e8 4dfcc6f8 c252fd15 f27477d2 a2a04efa 9e87566b a8bef496 e4c919aa 65e4328a d63241b7 a15d539d 124852ed 2893bee5 c3f660e9 3902406e +15293313 c635282b 5ec4f091 1350798e aa89fab0 b2a5381a f8c3de41 b70e7e31 566f3ba5 445ffa64 99e21657 5dd0401c ba508224 30a3cdf1 e4df6e91 fe3d2c07 3797823f +5205487 8df9d667 1f5e6c19 2094e056 829ca31a 39af9ae0 79ca1c2e 8f64f762 8f6a44b1 821b54d0 00f06527 804c1ce2 f946d123 cbda7cec bbc2dd3c 967de3cf 57b8c3db +1236251 25e5ab7c dde93ccf 9f3758e8 606e9529 5349c067 3fe41923 f9f09e8b 398122c0 e63428cc 70acc6d7 f8149da2 7109b634 b8b4e9a6 134d529e 529dafcb f167e7cf +2845337 446c2235 77b74edb f7ce8546 837a3b69 07544cd5 dd495beb ede7e5b5 a119b14b 85a7ebef add15bc3 f92275c1 07367dc8 32ce46a4 a40a08b4 69e479c6 b715fa8c +2777829 655de6db 8a0ff9f4 2eaa6425 0fbb72d6 bc469dce 61c56b6b 10088f5d d6502d4b a4348493 c9f7aed3 74c9d24a 07101a6a dfae2f00 4d3da710 43eea3fd a8849d1d +184932 f4eb47f0 57b02b67 f31d8281 499192a1 31485ce5 42ba836b e699c9b2 f0be16dd e32f36af 21f01e9a 0eb26b15 cadd9360 b59cdd96 19ada610 2dd36cdc c571ef0d +5894961 e0d3eeb6 0155bed5 a7ba8542 a7c0330e bfe05acd 86ee75c4 159be809 582bbf6f d64dece1 d84086c9 e8a662e1 66d38559 947d84f9 f5d0f350 f1e78e3f 7e082808 +3913003 b40515dc aac39b4b 2372af3d 27e0cf06 801a9e6f 80dd25a0 9dd61fcb 94de0586 68553094 03178ef2 5c785ea6 bb2566b8 a1594a1a b42dbd48 909b03b2 94d17de4 +4508248 222feafc 13074d21 e8ab9eb5 97b80147 8201fb33 fbbe47dc 9a2ed85e 553b9baa 09c50f3c 9649e0d8 e11badb1 73a8568b 739859c3 2a4f1332 8c4da9ef 949ea75c +15036466 8386ef1a e9c8f370 095620bc c0de1651 b5160bee d8a0e42b f731bd11 a005dc61 545a3577 df0c1942 117b87b1 159c6c34 b806d52c 66db52b9 7f1ab096 13a9a7d3 +12284596 87513b3e f16f5ea8 6f9ed4da e615b945 0797550e 483a025b 97d2d90b 4ae032c1 654749eb 7a1ae7bb e08684ce 7697952d 956fcc84 660ce5cb a11b6e74 a27e921f +10704897 4d8a4303 9180bdf8 50035b44 ccca7287 f871e032 2d9f5e3a fe5cbd01 1f1485d3 972336b6 13dcd8f0 ff802633 ab01c33b 15a201be 12054d8f 02beed41 76c7bb2d +12360656 166be0e4 0116a5b9 cc1bc991 87dccfff c790bce2 f380c2df d2850468 76945108 80105d21 9c932a2b ebe9ae16 2ce50f24 c228229c c0933238 0f5fbb2a 848d2c2e +5105935 735489fb c606d4f4 c5bbe31d c7814c1c 97923956 8f4a7c7e 9b88019c 5c26016e aa642006 a6b9dddc 4bdccb86 cac0c3ad d60cc35d f86d9926 15671f89 50532b24 +7221898 05794795 f3e65e0e 82f95175 36448c0b 5e419fec 74c9bc72 a4045caf b0d02742 8dac65fd 652c5342 1604a862 27651299 70763e60 382df31e e4eb4e96 d0180d72 +14959049 f2ac93b4 c979664a 560ebf64 634c6be8 a61497fe 98ba0215 184c4e34 141b5910 a2956aa1 40fdaa88 b4175f20 e1236dc5 88ef3179 b02d526a 01e46282 550fa457 +6254171 ef97e8a8 97258e3d 4734b483 617d89c7 b2e58e4d 39879851 2e1baacf 74b8392c d75ae135 21c5a8a4 7038109c a2a1dee1 42240598 70bbdba3 b0228d94 5685e0fa +13039472 4ff499d6 33447c8b 1f02d75e 572100ad fd3e8840 92ac1a08 5624a758 8f98c6f1 ae4a651c 1006a031 8bea01f8 0a31a162 a0adae72 524c4f7a 864973c1 83d999ff +1373804 d95e3f5f 5515bcb5 210ce0af faf8ae81 ef439465 a04cabf8 fb986714 5fd88c78 ddc635a5 efac125d 7f1b890f 5feb0e27 654935a3 dda611e8 b1f9efcd dd9f18b2 +10916653 db165732 c9c2436d 1258f07e 72bac51f 0f24604c 21f71c6b 173a88e8 ad954197 0548199a 97c9e3c1 b2deda18 84d71655 026f47d1 4123a402 f5a4a71a 66b0c6c0 +13314470 4ec3c310 b75af821 a826ee19 9e41100b b94706e9 4e6ea0d7 4fe66653 7d00043b c968a21f f072dc9f 0e1dff6c f724f79c 7fde2612 5bd7079a 7f3a654a 3e5482d4 +16206499 499b3835 3abf9473 dc3cc380 39a5a14a abfc186b c95c7678 fd6bab3a 1651293b ab7dd269 f124c6a4 43264f3b 696b9f3e f88f6fbd 26bcb44a ab9c3ce5 befcff86 +4121381 8ff94a05 374c8817 98ca94d0 9a0a22aa ac8aeca8 a693e922 0d859ac6 e15ed046 3b89f865 c3bc8c69 346d125d 5148302c feb48aa5 afca65b0 39fbcd48 909aeed5 +16690489 e4708b7e 2351798f 50d3806e eb6a179a fa1b88e6 e1c0e547 3c26b2cb bf39f39b d7469650 1696b52b dced9a50 b018584b a0c2055b 4a110eba cd74d001 cbfcff04 +7031331 5833a3c9 3f7a3521 a0505664 b929f415 6b46f512 b789c5ec dce92f0a cafbe553 0b232057 f59c5bae 42eead5b 4b38b826 7fa5d962 439c6bc0 f5fa205d 660c9bc7 +4232133 08c4ebe9 7bc68715 442abaee 0e584718 fb129a42 642e04c1 3e037f63 211b783e d56f4271 f5f080bf a1f681e6 0060e306 8e9d3132 b3550b56 045c0236 fa9903f1 +9286903 ab93a8d5 a8cb3fe0 ae4ffb2d bbd7c294 6e983168 b679264e fa5e6043 98c888d3 bd246840 9ff44eea c13aa316 ff42186e 0f624c43 916acc60 575d8ad8 79d0e4f8 +4468907 380beb0b 9c87feaf 9e360580 df94cf2e 77aac62a 29f26b49 5cad8b0b cb20161e 30e86f34 091d64ef b0f811ac e2051a29 1fb036f6 962937d8 d5f1d1ba 0b805e31 +15519511 161b2744 3ebd4143 ae8315c3 9be8d596 c9add909 c119e366 3ecc077e 43a4067a 683b4e0d 8f99270c f871b9d5 d0954a5a 53c738b8 7a76bebf 4f5339b9 b4815ff6 +14896463 f55def3b 229b5e46 a2cf2473 be6bf4ae 2dd92c0b c83146c3 ad25edf8 e9e173af dc8fa6e6 980c1a5e 25a08c47 c7a4ebac c0e78c8d fbd25080 bd4b6c44 6aed76e9 +8652639 950c5900 8ddcbdfe cb836652 191953c3 46cc9594 6fb1af96 bd6b2efb 8e96573c c1d90d64 7b7bd8af 4b8c9c2e 8f4c5ea4 dd6f6a0a 0305f2cc 52fa18b0 9713b656 +3004198 d98eff8b 9e5b6cb7 5e23d050 d5e5e05c 8f31c6dd 1bd020bb bdc60121 beeb3673 1cf3e05d 53112e9a 734ba676 b7e07146 bd877c76 782f919f 2f9987e9 afcd5826 +14292338 f6c47c49 da1e60e4 3bb89419 e8ac8a89 ee6742b1 2294ad9d 182103ff fb757531 6f66a8f8 051a0ce8 bae89e8f 994a2d3b 724d11b0 3db2d624 7963eca0 4d35cc65 +7751039 3f3a5cea 1d57fb77 100bdfb0 608c8a72 8aeb001b 2d39c22c 4e45cba7 2bca77b1 a6f840e8 694cc354 aca9b724 094ef3bb a9c37068 6e5ecc85 4aeaf7d2 d7f3b6ab +14116880 ac1ac1a5 cad2d7d6 1d656820 f602de71 21774650 2c71ae16 01312ff6 b5946b58 48183907 7ca73734 44fa11ba 30521b94 dc550d99 afaf83df 15ab3f0e 9a7809a4 +247466 c47d2eb7 5864d9a6 9acc748e 0fba8ad4 adc457ea 691c06c9 ef7363d0 ea466ec2 fba52f6a dd8c5006 17eafac3 2abd38dc 6cdeba54 a8470d61 c651fea9 ecfd88ad +11762064 9372c2ef 61936f7d 1c736fdc c84186cb 71741c4b 6113d092 ed7da1c6 6d11ee59 93a83110 92639456 c8d60804 ec0734ad d79191e5 0ad7b872 b134867a 3c8c88e8 +1196747 c631653d 368be31b bd83aa1b 6a940de3 ddef9ea6 caac9aa9 ee6db97a 0fda9b8a 067bc9de 31f9d81e 9aa00399 54df2d43 a2c7b245 3d3f835e 2a971d4e 957d21b1 +6674720 51215b6c 442f72a3 80a24845 4c1f84b6 99851707 9915a4ce 2d940a4f 9b74fcd2 97d00c55 50230d0e b555eb17 e3e0198f c08e366a 47b45e03 65e6d580 55323e2a +14331361 9ed4ec44 3b3d8791 0d80b732 2da7753f 16bfd85e fe5f539e d9aa65c7 de7ac199 6bacb3de 7b54a827 aa86d4fb 8694ae23 bbcc0281 b02b6a81 0da22772 57adbd34 +3486910 3f76fbae 1d3bd4ac 30935937 e7404db0 2c098a84 894721ae 5c75ca1e c83e89ef 2993238a 0bf4821c e282f5ff 3b981206 f1eaba26 c7526822 5824d61a 8ff4904e +11612259 f87be12a f3553865 e6cb3d11 b49f1dd4 d002e560 8d9550f0 9acb11c9 eecf9615 1308a7ed 2e71045f 64329d0a 1bee2ace d4014238 0b76b4f5 4aaa625b 08de937e +3566399 fdbf40c2 5a117434 9c832bef 60fb5dc6 ec99d2b5 3c37ab4a a39f5a74 996fb234 07c44c54 00dec8d8 c68a9913 7f6abebf 5dce9b91 f717fed1 b4a5bd16 5df2cec3 +443442 200c4e4e ffdfd9d7 6d9b23c7 e33076c1 42082f75 ca5368bb e60232d1 06cef5a9 954a664e e11fca71 d4a47741 27f0c6d1 d993e391 95fdfdb9 f97de123 0537d206 +16176192 f9d264ec 79beb57a 7ded630e 89975059 af7918fe 6c51fc17 ab570135 2031b613 16c8bcf8 ab8d2488 b96159db 0c36ab38 f31e8757 aa0965a4 fc08b2ce 6b6ec90d +12860997 0b5a3dc6 40e01ebe 4c02e642 5588359c acbad733 d54de51a 7d23cdc4 8806a086 252c369c a60ec7e9 27bd95de 2e9888ed 39f9b23a d96fad18 6a77fbb7 98023d98 +7774053 32e4c411 258c18e4 3de1a692 b7544d98 ba42378e 41d2faf7 341da332 189473e5 b98f8224 9925a5e7 13a319d1 45cd951a 5027afce 376cb6eb d68e2bab 429dd868 +13460779 a3994951 6636d3e9 7e8fbbd1 107a9930 986645da d67f4e19 2b567c4f f822a4a0 33c79dff 0b57d38e 1e1f6be4 64e1d495 c8fbf168 25416cca 99d35732 ed7ed05e +6271759 b257fe5c 3665206e 529cddb6 01a0cbd0 1ee3f1c1 0a50aff3 8daef623 2627982c 536c5012 a7a6d07d 1a41be41 e93250f2 bc19c7be 69ce5b97 091081dd 5fda0350 +1601511 2f0b6b6c bc763bc8 e2c58729 fa3b64f1 261570ae fe96f67f 36f76e95 1ba90fbe 9054c4b6 b8430a0e 281e3e25 cf72d57b 943fd708 3aec0c67 f239ce91 973224c8 +9800314 7017515b ea60fabc 39f2e30c 6a384f37 73d92553 a5a14a2d 927946b4 88b5141e 60bcd315 94d86549 da78d047 4d412450 8660af8f cd724ee3 73a30470 599f3a89 +13382041 a3de918f 7d34c9e8 fa71b0ea fa52e021 bdd1012d 8d304cd5 9f0fa15a 765f25c1 e5febf3e 52bea829 c83225fe a2027b33 80d90bdd ae3137a9 fb0321ad 82d7944b +12877454 11cc07d4 a808db88 7189837e b9e33aa8 56c54e75 f8f38d60 eacdb597 a2fca2ff 67258587 bab589fe 1448e21b 746709fc 989f3177 bc8d8bfb a5092a21 40a0a78d +14061637 d7e05f13 b18392bd 0b89f20b d23a8b3b 8a4d2385 466d6989 b0159e0a ce7a40a4 3fc30c54 c286b91a 11c43c29 7920e562 f7ed301a 44660044 f6cd52bd 6344127e +6876225 522b73cc 93f97bb7 70b8bcd2 73eabd6d f7a4f594 e38ad124 d51bb7bf 770944a2 3c6cdc26 70548d5e 265d018b 3be2cb6c 3b80eb67 ebccd687 7048347a 8e46ae2f +16252991 6c72ae80 b6d1b1da b1323571 dc81a167 6720050c d8a7296b 05e19cf5 458acb99 0bd93efe 58642750 cba0eaec 45fece91 25da58a6 2a2ce5c2 784d003c b9329b3b +6195866 d5bff0c8 01b439f7 b93a5ea3 67d92df5 f3000655 2cc009f9 7e517fe2 93374255 6aa33ee5 1b34b122 9312e0c6 c42014fe 5fdfefe1 1db2ebff f243af31 90a04b2c +3588391 cd2de21e c73c13ba 1036f5c6 55499f85 0f39e42d 2138bf10 7ca7381b 698dcce5 8b5dbe38 7948d873 f45d73d1 8cb5a5b3 3914b8f6 4b9bfc02 5967ade5 0ecba2f7 +123344 954e0adb f5c01575 2de4f038 d48a7cf5 9383fc1e 525b6042 a384cbc0 b6e935fe 398e0bc5 609aeba3 3db5c1d0 f72ce5bf 56025848 a6f29372 46b77b1b 9c7b8b88 +15709796 c5a41813 fa8daa0f bf8608dd 508f591a a38282ed f224bf55 a425cb16 efb97690 593f94dd 21f01250 78fe4223 520edecd 6ee3464f b5806c89 91422b0d 8385a639 +16401962 2fc79270 b201c2af d46fdfab 5ce397e5 712ae574 6cdc6ea2 36a3089b 5b6bbad6 121281f2 f790bc2c 3b07daa1 bb9dc42c 4e255e21 97c2a012 6505b696 dd9053fd +2580920 73ffac48 6a60ea34 8367c47a 297f8af1 3deafafb 4f5ec7e2 f282d77f 3192f294 9f5bd730 d806861d c6bf2431 63bdef49 14124e96 76870d3a b9bee659 cf840e18 +9887706 c9bf2ed4 f08999b7 8b26c650 9a815bac cda756ff 4f236bca d06bf7f3 3229e64d 0d70ccd7 554e9941 ac7910e9 94afff87 d04a834d 614e5441 d7875ed3 116f8231 +4616752 87cbd3ac a40f4346 1406a7dd 2ce9e39b 7df27b38 3264e0b8 baee8f69 5743c73b a28f3a28 0e8b0886 cfbd8be5 ad52ef22 a40aea93 9f4a915e 9d5ac67f 70c52722 +8574463 69d46f76 e7d96ec6 90bb01d9 72c69558 181926b2 15f82a55 b7805009 2a1fc16a f452d963 053427b1 5deefbf0 c8947417 875c72de 1839e652 9d62bf51 78d08c23 +15263200 eb883ae6 7fa94302 6ed959d3 1b0b230c 9b456c86 7dbe514b 307bbb35 8fbbce74 e5281495 e964d99f 61c592ef 648402c9 7ff1a723 83fd5632 17f95af9 69ddb8c0 +11198632 d3bfaef9 1341bef1 a781b805 5a5b8d88 66f3b0cf 160cc2c3 70932aca d9c5bf9e aebd0f9e 8ac1fd27 1a0215b6 2331b7e6 5f145642 34689c24 aa397620 503540e2 +11436097 6315fa51 a8e4cad0 0b0ef964 f54fbaab a8dca5de 685e47b1 155027d0 0731a98c bb4190d5 821c2ec6 b6d98836 b7a7ce09 4b570ee5 24736397 98a687cc 86d9d53b +4918961 840576e7 21e58c13 cd19ad08 813f2e1f 401e31d5 380cf60a 2fa534c0 badae422 5ebf73f4 f3e30b3e 4c49c843 c05bc5cb 1a9d70ae 056f4e3b 1621f1da 3d25230a +1410824 ce23a484 0097cde1 3bd3b930 d209488a f40aaca9 234736c1 a2222143 4c5b8fda dcba1a54 f17b5970 e1601c34 e72b5460 da35c754 ab49878c dbf1e4e8 9aff1a64 +7264232 794cf29c d082da6d 7b69bb88 8a27597d 4483a654 c6d6130c 387b000d 5fa98faf e8720137 0b9c16ab e67dd0fa 7e29ddad ed25505e f3866011 52795de6 085237a0 +6190108 1f59fe4c 8fecc72f a8fc0f3e 09946133 5844d730 943c05c4 415bbb1b 97cba231 983fee3b 0dd2d07b d33c9f93 5260e061 67419364 8a2f60de 1f980ae2 0ce6930e +14367135 afe57630 4cbda569 1adfd54d fc8f9578 c3f833e0 35242876 3f874ee7 3a4eab18 29c0aa64 945b1a3f 9284009c dbae4679 cde3c5b0 b1f9ba65 3f2d6fd3 c6fd2eff +2808402 6730b738 60a45bd8 9d4929ba d7535b6b bb6a2a66 fbf5b36d 11fe09c7 55b68c51 5f0b6af8 f098c73f ac1562e8 b9bc8b21 774174fc 9d6454ab 1bcabc2f 4b007b17 +13378867 774fe5a2 ef4dd2ce 7d5444fa d7a5f583 271d8063 a9f91188 b75f87a8 1a83bad5 a4b4f20e 80efe835 4468b63e 0df80c56 000ac05b 57785be1 a97c6ada 885e7762 +7476202 b728489e 32921e56 7f04c6f7 f7f5cf73 d50ec33f 4154805b c74db110 f5eed547 f9548f77 fb5eabd1 6cb5f5ea 48b3b8e8 73aae197 7ebe14d6 05db8d5f 383485f4 +13419078 c772769a f1d3d657 98e3a4aa 07d1cb15 1e7a3e52 b16517e3 70c6b09f 8a51a1ff 1538f8e4 ed3879b5 ab108b3d 7b483eb2 d70c9e6f ba3a2728 88c88a28 c7a63217 +10493023 7dfd0225 296bb028 dee722f1 7485849b bbd2c183 e41b63fb 1958a7aa ebdb860a b0fa00e1 b8d33e25 f8c1bd14 84731330 918fc9fa 8089a91a c1e4d74e 6edfef1c +4156972 ba132d29 5ca8a013 a5df5f43 758bd661 05ba9861 75d3bef4 fb7809d3 a0f27870 f6f7ce4b 6ddb65e9 7f9c6665 3550749c f708f4c3 2a11f2ec 6eb7efcb d777f788 +8804122 c47b81d9 f3e0c068 3c020d15 f184241d fd8f2dd3 ad53b94c 7139fb1b caa2d439 cd7c3c4b c9289e73 ac41cdde a6c15af2 03d953b1 100b9527 6937b92f e49364e0 +288295 e450d5d0 df75afa8 ece7a77c 38c5eeb1 618c64c6 b754fa1e 584e2845 d1b84d17 e0ee70f3 3cf786e5 3ed6200b 8e41244b fd935852 81c7e18c 8ab88d2c 9a85db07 +2133316 9ca294d4 552fe607 bed7da20 2201a92e 93487965 f0e37b96 4a6e6737 5ef89203 69928e45 588b3656 3ea51ee3 b578b14c 3c5328e8 378c40f8 18b2f6b7 cb06fb78 +7760637 14439ec2 609f2071 b73466d5 6da082f5 2f48c1cf 68c22a12 f69f09a0 a000e30c 0dda9cf3 df79f9b8 8c7f5b00 2390f79a 34d362eb 1e15b407 e14ae2f2 7a310501 +11352956 87e3de21 f979adea 9bff4eb8 b91c3145 6d665148 5d235a79 16afff2b 7ac2d816 64972012 88e6be64 d3576b4b 63ad75c8 02c38671 2a54bf80 fc3ec662 0222f957 +12399947 7610eaac cecf191d 78ce1e20 76035117 8d39ba0a 6f39247f 24cf0b50 f6faf949 2aedd2a0 613046c7 aaead87c 72d5e442 08a1bd70 90e8c685 fc95dcc6 2cb1f052 +3895543 10fa5ff5 1b535efe 7630216a e7b287f1 54982b97 47641197 e8dd2da7 a4851d5d 90f79df3 c1423d68 9df03929 1c9c8e9b 5a05629e a1058ec3 ef14f348 31d652f9 +12642888 eae9f788 8bd78d2a d0d20056 266643a2 414d3e16 300cfe10 e6f024c4 2fb91d7f fde94492 15cdb306 d1a0d676 65165b9c bc3d89db 808d5ad5 3a2475b7 b253349a +3365498 bef6e881 81dd8919 62f16177 f17fc1ea db10947b 0fccbdd4 bb2786c0 0211dc12 75fe3d50 e7cbcd65 bd3eb4e4 76255949 c8680d88 34346b34 3c6f22f6 02f487bd +7113693 0c40e625 1131b9d2 f56ee9f4 889dc34b a52308d9 3771ec52 53751bbc d7f30783 8e3c146e 89031339 30cc18b9 4bbcaf28 18cfa5a2 2d6866b8 2471b753 b6056bc6 +644476 0b9ce14e 206d24dd 7630311a 142b42a0 9b2f3bb4 7c063f9b b56df9e9 9ee5b033 a1b6a979 19ebcf33 83f55036 3b7a8feb 8d3875a6 087965b2 0b2e40a2 2cf3d653 +9740770 85dd713c 51dc347e 1be0194b 1664e0aa a0c3db4d 32941363 1cd704dd ad437e60 96bf05f5 63c5a217 c63e9ccb 5a5273f3 0870ae13 aadc56f4 42e16e84 97be39bd +11091375 d4b042d2 83ba556e f931e779 fbb58282 0ccf81de d41d3ae6 4fa793e0 7532ec03 a9abbddc dd1d4dd7 aaf3b8fa 07bf6398 e52e87e7 15dc95b1 54bdd9c7 65420d2d +6751798 664eea7c efbab526 55bb7627 51188be6 46360e30 9b959d0a ab907d4f f16c64b9 5dfb5ecd 57f1c529 93c00473 992156cc a148d1b1 dda6012c 205361ed 7561f834 +14034600 fb2785e1 d8a9d94f ea90a91a 36bc7827 4f917a2f a67c180c f4cafe51 a95b69c8 6ff9d8a7 807cca03 4132ce54 22a8bcc0 f4484a63 4a22a82a 5626e59f 10d8bed9 +589780 10c705e8 91d0fdaa 9189e540 0bf8c96f e1988f9e 287b4c18 45639265 8cd876f5 dba2caaf 7a03d44a e2ab9485 c7d4d7f6 95d16aff 80139cb2 1e1d7288 b0079c93 +4333372 6bd03581 df1e280d 5797c912 d44084f4 07854621 f96d6614 d9c66116 57ea4259 8edbe5b3 8856e2f6 ade553d7 f04e5819 3e25afbd ed938c3a 0a2d0038 8663092f +901248 e3f603fc fe08f6bb a431f8e2 88eb4a01 ec7f0385 07e1bf4b 5c039ba4 7e44cac1 50573af6 a27f1c43 d962f808 755e9e05 f464da96 7c6a84fe 55fab42c 44e19850 +16630887 131af9c1 6f409f34 5d03cb85 f42d3c5e 5c088bea 298c822f d2a6c692 292019ee 61967c04 6f608427 f9cf685a 53549035 37ee2419 a304f589 d2f4fda0 4d0f6ceb +9111565 b089e6ac 690e115a abe7ae5e c4df5243 46e062fe 355019fb 266918a5 ecfb1db0 2369cfdb 33e4f983 cb332f72 8a07080e 74bd7ab8 81e2e4bd 7e3788ea 10734b1e +3483951 33278b1c 5b7ac8e2 60467991 424f0044 54ade720 27a96407 b97718eb dc220439 f56ada9b f4a6842d 71ff3c9e 5842afdd 82197536 738ce0b6 8fb7c9b4 35f08c7d +4213766 6b251c55 445ad3b3 5d5f8482 05fbc202 656d2e7c 3f8e3ef3 dc128b25 2fea3c88 be304aff ca4a4cbf 3c3d228a 60462bc6 140dc0a1 d311c892 eeb60ef1 9b99d40a +11963039 dc38ad28 cb719496 63c9571e bb60d8b9 6042a8ef e67e8436 f053d6d0 7ccc3717 6d608afc bb28c465 b678983c 2abcc670 d04fc32e c8ab774c 99231d97 2f3c0396 +15924612 207ae2e8 c4d63d83 fb88b754 500b77ac c59cf850 b1b25642 aec9461d 7688d1c7 ed30367e b2845996 96ebf7ca e0e6a8ce 8df1436d 317079dd 547b636c e7dfdc8b +9759991 943cfd99 ce197612 2f533fc7 9fa72e12 d1cc6940 329881be 23a96111 9c3676ab 4c1eebe1 e51b8d9b 23272eb4 5cf251d3 2669f9e3 fc51f82f 4f8363ed beadbe71 +10901080 d207f774 46d65b01 d70e2a42 bc6eadc0 717dd82d 5c75082f 3fb62c43 58abd1f7 ba7ed494 16a32214 b01c7124 9d069301 2f265411 4e06d97b 0d468ba7 f34b10cf +14643244 ff8da1ad 4dac6d9c 0b659d78 0cb55c45 2be20f26 71c59be9 8a82d82e 271d0aea a4c0a7c8 f76d0561 71377871 9e8364ae 486a644e c1cad701 bb786909 9d0b46ab +3370296 0a251f0e 2930b6ab c173a061 e2252693 1622c8d1 d772046a 14199a46 3cf68851 a6493d10 57642203 ba695594 13f0b8e3 6500e6e1 3cd2f097 faa4f663 065b1f8a +7086353 1960850d 75ad4547 b4e9c96c 0b815f33 9c792848 083eadd1 8cc4b5b1 3fead8f4 b4738222 8cd9933a ba668ee1 ab479e53 e264037b 8a44802c 3bc0d676 0ba3b111 +3290071 599c15b2 2f40621d 29bfa11c f64e5c59 6b202f75 b99b2871 22ab751b 2a6cb7b6 cb4d9453 8c6a7f2c fc953f01 478328bd e019ad89 b53b20cd 13167671 aa5ea2c7 +12570461 dff9b795 da32c040 a381b322 158f3e8a b185c191 dea0a2cc a008fd6d ffadfa62 63bac28d e4f0bc0c bed5bfbf f161f117 bb79a5ca b87d151a c14f792e ee67d0e8 +6457277 9b7f4e67 cba007fd 2c5819cf 9c23691b ddb17994 e208d52b 2f0a909a 3822fe68 0d71c7db 54b31943 e853a26e 15be03c3 ee84a9f0 e689743e 66abc22a 58f73c30 +16031799 5a8cb024 5cd8a78b 4ca64f77 bc0a0aff 9f4c0320 8cae8889 5af1be99 0b8eb0b7 1a000c93 d66579e8 caa452ba bb1bdebb f0a52525 6b8a0944 07e4b82d 97c3a655 +401204 6406cbcb aaa84510 04600c0f e60ff557 a31f3203 3b2d9f30 a1e5ed34 071eafba d1d68759 105f6985 25debf44 5aa7da87 4569e2b1 39a09173 3d3ae6f8 8fa18b0f +4468781 27d49f5e 5b2a4bcc a71e80f2 131ec807 e3ceb161 4c0ba010 0bdc2ffe f66435e4 6748c552 791da997 9680ee53 975bc72f 8980cd40 2c3ee575 5ee01f7b fffc7838 +5991605 1255d94e 71b772e6 ac5ebeb1 3d7bcc43 6caa7f63 3ecbde2e 30ac14d6 80dc8c19 dbde0e15 149e0f68 f81ce37c 5fd70fb5 1c1c067e 5b693e37 3840ae07 71f3fce3 +13287837 3d4e9674 86c30b02 3df2c24c 7a2a80a0 e3106d61 244e112a dd657e30 785f0d0d 8595c935 44c0d29b 44156b88 3d9f9457 692485d0 6146960e 8c5b66bc d74d5fe4 +10915744 fdacf785 7d818b81 b9becdce 1734e4ac a9ae3830 07a84f1e b46321e7 5519b19e 2c3fe5d0 5ccb89f3 42cb87a1 f7001c89 144295b1 2650f5ed cc97cac4 442e043e +12699016 6b98ef84 fdc7f201 e82330c4 80654b10 377fa3c3 a2bfc6ef dd4f107a 3fea0d69 2aa1029c 55cbb2b0 4915c18b abb2019f 20e0fcaf e7f9258a b3b00f3b bbca299a +1848617 a756f415 39d3d958 5b42ef13 707b70b7 16af6895 45bca3c5 3af08247 40c6aba7 46865e36 0ff2eec3 d8f6b3e5 a6d03f3f 79697233 a3e81911 eba42831 fc9e6cbf +4487660 43ad18d0 a030fd08 16734f6e d227556c e678e4e3 abeefe0a 1e1c5757 35e52263 8e19def9 07897deb 4bdb17d6 85f83763 45233c8b 4d8d2de0 8776d655 3b99fbbc +6845113 1249e7a5 c1ef525b fac1b108 51361048 9591de5b 62c9818f c331cb9d a5d8978c ed921b2e 587e4f09 f19fbe74 99fc7143 50b03cb2 243631a9 19d3ee55 68ad6c66 +524528 fcf09a7c 8d042f11 c75467d7 a0e7abe8 b019fa77 4f6dee02 5cd4a721 03995264 2358b7bb 09f2bc23 578b765e 65852ae6 1157b3b9 5aa3a2f2 93fd552c cb0a2e6c +5092097 35ad609e 59bc00d0 dd649273 5b9f43ef b2ede2be 84318cf8 f1af8db9 398ca84d 0a91539a 36527e0c 5b72319c ba3b5964 07868c1b a272948a a819207a 51f4537e +7905868 c93059f8 87aa9db6 46933c32 15a39ca7 ca0227ac 4683d31c 74cde425 500292b7 578ca14e 50ba4db5 b593dfda f345fe23 d6485a4d b91dc7a2 48d99b53 5265ae95 +11189515 25a057c7 80a56f79 bf42898f de8f5f38 636ab053 c9d3720c d42dc5fb eeb5e673 29871b3a 497925d3 5bbe6db9 60304af7 31ed6884 cad3ba09 bc9c3547 63b10065 +3376361 015b9f9c 0e11ad96 824114d5 48f8b115 84e76a7a b2a63afa aa7e501b 44af87c2 8f1b02d3 a4db58b0 6d162be1 2cc8a53b 3f2064b8 b18d357c 5e5d948c 6ca96b18 +7699258 10a0e752 a85e0e36 528c98c6 9446747e b1c3399b af2f366d 7e9597ea f9e82299 84f6b844 e579b8a7 31f57921 d6f9cbe3 c60a3e41 3559b2a6 25eb3245 c52da004 +7439838 8935e15f 391f83eb ee40c92a 01167a31 1593c973 b6b5f8be 2be7c4bf d764533c f356a0d5 5d0ac70b ebe9daba bf22ddbd 0bb89271 2ddda0bd b71b5563 b55c465b +4042983 4144ba3f 0d361e4e d5647489 ff260eb5 283b9853 5338b749 35510c5c fcffa414 64ff305f 27623969 5928ae5a 6d615d74 9200e525 fd6611cb 6dc5a7f3 f31f09ee +11563478 e2966e9f c1065d3a 334ea303 9de4d7ee 6e5206c2 ef84aec8 b3898759 19dda709 1ce83299 f1bf8e84 11dedd4b d5de17e5 3e90630f aa8ffefe e9263481 033062f0 +4657482 89725d5e 6b1236bf 2e9b60a6 10944067 5cfbcb1e 46726c8c 33110945 13b1f160 20531c1b 6dff3830 33e9dfc7 a262436d bef70f9d 44313d87 e3b5ba36 3990cc8e +5921486 3c2d7b0c 75bcb5c8 fd365e18 26e8e1d4 71edc4a5 16558f6e 264f5224 bbaaccbd 23d8568c 27f88aa8 c9cd4f1b b8bc1893 9bc449bc f5993243 c24cb3f3 a1261831 +2750859 88ad7411 251ee468 52873f18 5dbf201b 593ed6ea 8a8a71fc c8ed2905 309fc274 0d979438 df46cc90 363517d6 640542a9 17c4871a 4cd31574 5a848d45 a31aadb4 +6282336 a8dc363f 0cda67f5 2250c804 a4bd5cda 60ed9b99 0e2d4aa5 f5b51e91 0c641742 2416ae02 bbcd2103 255db9f6 f3618e97 1d7323c0 c697d575 c8c0dd91 b93aa84f +11528854 16db35eb 87eb514e 22d20601 7bc4b61f 89387253 de057372 e355358b 95409c5c d4deb780 974b9cf3 f5ecb245 b974b2a1 d8af8679 1de248ac eb620f40 b4f59c0d +8644055 db0b5a5d 8df636a1 c1b5b89f 57065a9f f4031795 e849bb3c eb332a2f 8034463f 62a35c49 a704678d c16a8c07 c57ce6e5 1602cf31 d90eff2d b01ca210 81cbda88 +9285174 5de06665 ba497375 d5687aa8 39fe54d6 96d3cc2b dca4c932 aa77a0ae fe55ba8e f34df448 c1ba136e 13369a70 c9eda19d c5794043 fc9e606f ae88971f 300c588c +1027595 47c9c809 714bdcc6 8f502d2d c3101228 abb58fcb c04693bd cb5901a0 27f69a31 204a3422 b36fc5cf eac64d28 aa4e6ebc 55fbe386 c4779d52 68f82577 6927a22a +4081227 4d3f5c90 7ffdc769 28f86c81 856eed7c 35497060 35855041 1740f9cc 539afa79 1cde51c9 bc100855 41749547 b660abd7 6924f01b 56d732c9 7967a78f 7512a1f0 +10672231 8397e956 c4de1d68 eb9a0cbb 2dca3030 61399568 9e636ac8 ad3c402e f418983d 12223cd0 a8291870 94cf7067 55a87f98 63b42339 6924bdc0 2d4acd8c 0bfda851 +8236068 c15ccac3 2ec25e62 51ff6201 af3d5574 eacccbfa 04282151 392226c0 6fcc9f2d f55b5cc9 79a9d4ad ad835b2e bbe68779 0254d9d0 97a25305 5f43d418 332d86bc +15704092 518c696e e4735277 7833efc8 cfe86319 e3768f7d 56f5d690 203a07b1 cd8cab98 fde26d56 acadb83e 23eae55a ecc588b3 e30122a8 43a6feaa 73de9f28 0b7f7e5b +11107591 9838a32f 462de640 43c8938a cfa93446 49dc52c4 17952d6f a7d12f60 846eecca 1a6d37f8 5333f14d cb3125f9 5cac2be1 0bcdf131 3400e4d8 39097a60 7bbcf4f7 +6348112 b9f070c4 787d9907 1dcd849f cee7d465 6ecd6b22 39935991 11dd788f 2a5936c9 4d4cc67d ad6f2f38 f25a4ddb 154c8b14 c63a03d1 c464e3d3 27c17697 2bc4bdf3 +12047757 5d6756e8 548fb858 71d3e2f6 a453fdf5 2246f0b2 3b612496 422d9eac 6f6d2f37 55bff461 6b5e678a 9cf331af 60046621 233e72a8 fe146cba 80708d16 46b57e6a +14358636 4f8326cf b28250d2 9ced1819 46349492 e8fe107e 498d7926 9b67c573 8b8639b7 d89eadf2 76789eaa f163161c aad7b85a 76283b7d 8a76754b bcd80c95 379521cf +15949874 9e2d8a54 06c8437c 61a0d714 c290d070 bdc3cb01 6a8cffa7 b69c6fd4 10552a97 e2814291 79818470 cf822a23 ce917dc5 dbb8522b 666f57ed 6ca44549 0eb2d076 +15670008 261b44c1 a850abe6 a14108e3 ee343d6f bf0fee1a 9e497488 fcd4f62a 786d213c d6b871df d1e13cdf 4076189b a3c1351e d814941e 8dfc692f f4816dee 802f8833 +6134048 b883a3ab b1d40666 5d5fe7ec 9a615eb7 f8e10a8d a59577e9 89dd16bb 4cd73822 f1211e84 680b019a b42a868a c0e4971f 127b6850 4e80fb10 98e6d089 6d337ed5 +10349191 1f89b9ee b4f23a30 e4639c5c 9ae141c8 b26a7807 73048374 d7df1d83 95d7cd08 5cfd3b91 182ba4c5 c624cd24 4434f7ff dd7f5725 ccc6ac62 33bd89c6 68c66a3e +363274 ec6d2d5b b119b4a7 d178201c ec2735da c8683473 f0a8fc59 455f7f93 9839e2bb 6113c801 ba6f5aaf b6492850 9467c5cc 40b5652e db8a2e2d e9a34033 0e45e834 +12564434 07737a7e b7227f78 3af9fdce 7ea42110 49e7c330 af61e9a9 c054915a 0cc2f9c4 df122991 793746c7 77a34180 012917a5 c9b6558e ad0b05da 2319cd78 498d4706 +11028309 fe587f4a ef62614d c2d9e9f2 9d429da2 e1f68016 51ca08c4 10f9e7a9 34c5d1f2 d900d9fe 3f63ad44 1cda95fd 3caa92b7 de937dc8 fc9cdd93 2700f695 9e799fa9 +3062257 2a05ca7e d03493b9 71d2ad99 d957075b c5a060ea 259007d4 aabd1f42 8835afc6 bd833d7d 7d601b03 ad60d43c b4d7f586 9beabbcd 904573c9 04452e50 e74f2bb4 +4382958 429e1ec3 daec5ad3 37122bd1 303ef89d db21375f 513634b1 04cf812b 4f42a053 d2f88fce ad505b30 a1697ed9 d1f4ae20 63949625 e03707b5 e4b11e82 4a8b080b +12988490 954fb775 e51f74db b2c086b4 8c59b613 b1ede79a 04012ef1 39b95bf5 7ba17efb 3e30e2e8 4c26916a 44dcd307 8e05486e 46c7d977 da43fca3 66cdb6a6 1ec9aa43 +16561780 0620a880 e939fbeb e3d6989f c99de193 69194d6b c5532b0f 6e619bb7 3859f60c ac6b44d3 5e556821 c40aa528 fcefe823 4583edf2 2dd7e5ed d44fc097 ac140d1a +14014626 b4993830 c0b65dfb 4b9c1d17 a4b14165 235a8a49 829137a2 f3e0931d 9d6776f5 817de165 94bab8df fb31fdaf 7360c11c d73bfb4e 4bed7ed9 2a4b2707 9dafa582 +16401702 f77a27f5 a38943c6 53bc6934 feac7684 faf07895 d94ae2be 6510af51 7f26d5ba 88e8ddaa 9f515585 afac9ff7 1262733b 0bc3b345 97183681 fac37c63 64f01adc +1910345 32091743 c6adec2a 5620dd0b 6c308170 5b39b173 1dc14985 892d92d7 09618bfa 18dce74d 3c451731 c1f68da1 750871e6 f29f2517 a92a6156 681a4742 1d3a1d42 +16319733 b26f5c7c e2fff5a0 6f436c9b a1c8884e 7518e7de a7214726 a523100d 1ab38a3b 889728e9 9c1b255f e0ab30af 3f850eb3 b3bda98e 2a1faf50 b81f8d01 66b9cde6 +9796734 680ab8a6 2a0651d2 9bea1dc1 997f70e5 4d876bc5 55d13caf 214829b4 83932ee9 f3659ba7 b3ffc70e b68227f4 743db79c 4fc550a4 2f171ba3 4d29833a 414ca518 +14571851 7898cc84 40541d5d 9a5280c4 23b0a39f 5e6ac009 93655fbc 93d824ac 6203a3df dc625400 973868c7 6aaf7797 d8e035df 0a32fd07 2e7b8358 0ffdc9c1 012292e1 +14989620 01c19a56 80488ef4 1e9086a2 0a0e3a6b 4688b3b8 fef74dbc 75b9149a 376f13ed 748c5bec 230aeb7c 1a92adab b67b10ff ebc9e182 1d6055e3 85f56b85 ed5470af +11404726 e543a18c 10499596 8a22002d 25519aaa 74ced990 e07ac112 0e4a57cb 785a2807 48d97c86 495e7496 428bec03 f14dcb2e 2748362d c087bdcf 7036e29d a82a722b +3526394 1ebf5b4b 26791830 1c1015f5 3773fdfb e096c558 8903c239 0a28866c a25de74f 0d34e4d2 9a31777f 2dbd131e d17b74c3 0184896d edaa0156 16323a5f f7c35898 +8212372 3e8eafd3 d0f86b05 0e8e9bf5 d6ce2841 9a124b2d 3451b190 63745498 3f84bea7 15f4bc60 d802baab 3f4148c1 eec8245a c695b72d 536bbc54 fd0ddcb1 e8e9f65e +11727863 79b4ed11 710e0913 aeb0b834 d504d1ce e70037f3 b5a9f8a9 860e04f2 4f899659 e03713db 70e34183 fb7e43fe 5eb94c96 30b51cf5 16567449 41c61c60 2f23ee57 +11203127 a4d01e0d d3fc0206 29ed9883 d0d2e701 e422bb59 39b80099 e480003c 81c33c49 766aa09c 0d45e52d 375ff2d0 a6b18a76 23785c50 5522ac5a 0f61ea6c 046e1886 +4390066 341fbe49 5307548c 52dfe9ba 479a09e5 e98673ba 8ede119a 262fbfd1 693e73eb 7d33278a d80d2c2a ed77397a b5c2ba32 263ce572 c4109ba2 1bc10396 a394abdc +8613822 a45d3b09 95be633a 1898197d 5c4d7527 6808e841 1e9d5067 d00e2f2d f85fd711 8ead1ecc be0ba8c2 2f38ba3a f4b19423 d96d6627 6201d269 57b69d15 e5e4bc69 +9846529 feac73b9 ce05f540 56a9460d b56e1651 3d1f1e25 c9ffd590 34ea0c1e ad3e2ad4 56763c88 e6457ab5 e0636888 527773b1 79a38ea5 021f1e5c 234a6cb1 931f3739 +1566696 f6cd9b38 e0930163 b324cc4f ee7c0905 7a4bd7a9 42f88675 2e0573f5 57217b59 64de2d1d bf105bd1 eba70b28 653e84be 66b4771c eef4725b d4ee0d82 e1c0d9fc +5140701 ad5e096e 142c6c15 422de0e9 c18b2bc1 21efc6ce 4b504b3b eb7462db fdce489b 00d83a6e 9c287152 24e05e47 4ab74578 a96f6315 f1c92e0c c762d2a2 10a197b0 +8710672 9dfbdb3f 24ce8900 1fdd9c70 9b760ab5 84ca23c4 5664b58f d36d6ae6 51cf950d bf817de3 9afc58ef fe78de32 7f2ae9f1 244fe8d1 79b3a535 f19de765 5e94985e +13865429 3745250d 2db10165 56e8a8d6 b0c6a4c7 dc7d3ef5 a0a24599 e17c7d12 073898c3 fc70a2a6 e9592a4a 242c1d90 bd41c046 5729ecfd 9d49c4db 0635026f f84bd4c8 +10244504 5431a7ae 74648138 ad60fbee 6826f951 051a14db 76cda331 33bf2b22 0ea268f0 a90a2481 993d394b e3026d1b 3f6782ba 28d7ff64 b56d4de8 2e7b112f 57ad1542 +3130740 c66e37af 39435947 05e47a46 0872ed9a 885dee9b b11bbff6 09efd691 8f5c3254 9f93813a a7f76971 278b425e c155bf9b 90436b7c c3a66b88 e5cff6d7 604deece +8157412 0c00b9f5 840c06c7 0140cdc3 a834e14f db042d0b 8a705bdb 9e2dacec a4f3b3b4 0c1ffe8a 54e87422 29487a1d b19f81f6 b7a254dd bf635db5 fbb57f45 d41a03af +2539713 29741c8e 668ae8d3 2bb9b00a 99d0ea3a e3f65f1d a0878061 04c53e47 853e1f7c 9794f85a 4b164b22 a164e702 aed39545 0ed2e435 fdbc68ed d2800fa7 5ddd7bab +3647784 8c3d3453 9303d6c5 5245216d c2842e64 55ecc873 897028cc 5e364414 1ab12480 63d77064 f59ef033 16583b1d 08b09694 1ab1f4f3 b1c3927d 6bd2f436 1f3cc627 +13801529 cd5c6d08 c6e94608 1c3ff20a 2d8c223a e8d2f262 d45be839 f844aef3 b47b6f6e 7fb7422d 5fbcb5af 1201cfaa 9c01a846 797704e2 ff840b53 3d9017f7 4af07cb9 +16488878 99b554bb 1f5bffb1 b2876a90 537f3c83 d32c228b 283fb1aa 600ee1d7 4aa41ea6 11e64b08 fc619afd 7f369cb6 7b82ed7e 7df32323 90d7b1a1 79d96e5f dae68c0b +3336308 e88476cc 0917200a a0abc9f2 64e81344 48d3ca8e 00639aae a68fd3bb 13060a50 df6cad11 79488dbd f87c154b 9094d7da c26b020c e4d5763b 63e0997e 97702c86 +4827384 c54defc1 b2393f19 2ce7fcb7 8bde1b68 5ad5dba0 bbac39b1 ef561d70 f08714b1 d247f6a8 355b4134 44069ce6 20827fff 9f398b87 ca65d751 d1da25a3 92bd49de +701736 5ce6eee4 e5b400ec 6240707c ffde5458 45295836 37e2d681 32296fbe 49450eee 89b02e89 6324f761 684b6cab effda2de 531a3653 c06976c6 404d5f2e 4e06f3b7 +16712566 c0c6ac2b 411d9e82 84473602 c963c46c 96e571c7 e8688f95 09162d31 b18d70ce 04089ed0 8927bbcc 28077660 daf0c7ad 072125d8 4ea21303 2d6b479f 85bbf801 +16580119 e837101a 6694d23c a122a3a2 57913057 86f34e82 59428267 bf896e8e 1bb92e4a 5dff7687 0f778379 33afba4c dc43e1bc 690faa74 a6bc9ca9 f1aae3ac ce5c48b2 +14694171 176792b2 3498e812 a6fe630f 02e43177 f4374d9f 59627fc4 65c173ef f35cdffd fd2d72bd 4c652fdd 0af2683c 51d6ebb1 0d154338 031ee630 8bf2e987 93ee0ae3 +11121147 cbd1adbc 9dc4ef7f 9464640e ac4d6360 8ed534e0 e2c790f3 b0af786f aa7c2d5d 050b0410 65c49f5f 925ca3db 86f7e1f8 a92b7e56 442a93a9 64bd027a 9625df22 +7227089 d4e51976 e1a02d6e b1146f30 db367579 41fbd250 ffba6702 8e599386 3fafab8e 11279f1a b67d936a ab961d12 12d96342 6160ef06 2545bf3b 8245deca 69a53a64 +3064476 5fd43a48 055e5f4e 2f7b4f4f 97e1b083 6cf0b8e5 bf90241d 14e863f8 b338cce7 06ee619f 49ef77cb 31acf0e7 77df750a 3f516eab 3fc37176 154c23e1 e3d8f51d +8564747 22a3dac4 9c0b0004 776d146e 4efb2063 9c5a001c 3537b2fa 29097052 77d2c3e0 75252a36 0cb0ffbb 9daf0dd1 7f462c45 e358e620 912fbb3a 4becd5e0 3d79a69d +4101966 b4939a3b cca0f10b 31577630 5366890f c5b13999 f2db1e82 63ed1be3 5e17217a cfc087d1 2df08a70 5378e4e3 b11ce5ea aafe910f 5be1d7af a50c168d 737a46ec +6685644 3fe4c229 8f4e7674 89ed0f24 4a738ac3 b70c944c 2e91fb7d 1e0d7523 cf45aacc 12a67145 d085a40f 8e232b92 d82c8ae6 61efb8d1 cba0b144 61066016 b848efc2 +2538969 3855dc4c 34984cf6 b20f1506 fe271818 2a01822b 5e948752 8a81124a fe836e82 32654809 dcf05818 5bba1a99 fda3a452 00fa3508 483dfdb7 dbee7fbf 4fc534fd +9596693 7fb39fd8 cfd2528a ae9a9c7f f7620e4b 7dca45bc d526c0b5 0bc4d05e 50782380 f5ba87ab fe2571bf 237f3d3b 19ec20d5 05e189b0 70650b36 3b4badcb 7594607f +4384043 acb59a9e dec25eb3 5e579507 bcfd314f 8c18dd9f a5e5733b 6b5104fa 4d8919a9 a6adc6f3 468f7d15 d64da6ab 52f3f691 c8a86fb0 011cd1b8 f0ede932 02eb1548 +6304175 5773aec3 63804ba5 06711c69 d87fb823 ac45f283 b0d552f4 028dc45a 71e40f6f 29c2aaf4 9f697353 9648780d 306b3720 219b3182 33a32f4f cbf9fe28 bad5de2e +11503965 be280924 16d6dd42 d29e0717 f7d28f51 4961719b 8ffbb263 cf365197 1d7d75a0 ad976081 5a57b8c8 a4f974b2 27a280a3 9baf48df 45a66bd6 e3065f9d 2abec9a1 +10357817 06a84094 486901b9 644ae409 fd49e48b 6e468a7e a94a738b f1965799 a18bfa1a 5e6d4c3a 66388285 0afab69a ca89593b fe91200f 61420534 3d507b2f 45ada59b +14992696 e483f065 08f32b2a 33913bc7 8594dc9d d08b5606 dd352c70 97994801 8c588484 028e7ccf e87781f5 10325267 8b1463fc ce485d0b fa9a9c64 f005507d 008584d9 +4018092 b094ceeb 2ea85259 910fa0a8 7e402c8a 9335dc8c 663328a3 f0299777 c7022ad5 cbd588e3 d8a620d0 efc5af49 1adcdc25 47fe424e 84f4da9e 500fa88d b468fd6b +10532034 312c2478 c72e07ee 6058ec26 775dce64 c4d03473 403d0131 9f141000 bf08cd23 cdd94959 2bf0b39e c3eb729b 974d5162 2323f4b4 8bcdb2f5 13db9341 1c2eef2f +4725933 3c440727 5c23daf3 91388116 76e7bb59 6bac2f2f 144f868c ad3c17c4 a0e132cf a1c85af5 6a6904b7 b142f564 d9e8c6fc dc9ff1dd 043cc8ba c878b91c df7810fe +9641546 36df9406 9744e431 67b3326a 705f9116 e1039757 cf730231 c2f6479b 9b228a7d 038a18f9 76a31958 bc3700b7 37f2f225 93e9bc3b 43bd341e b6b40f5a b48bde6d +6813685 9b3a1959 ac29e847 0a06c8d4 45beeb7e 6ca0b434 c3f147a8 5ace6418 07cd4371 503669ec 6ebd7057 203cada3 f4a6ab64 931ada2e cdf66065 8030803d 27e83739 +13600545 4f1a455d ff793977 47450f6f c680f01d 857d69f3 35c6a002 26678153 2d1215c3 a6d64c61 afa5f646 a5255592 b8d04f46 1f3cdeb2 02f48e49 798cc1dc 97cd2657 +15748384 fe753e7a 3be96e6a 8b5474c0 c5cbf2d9 7abbd363 201affb9 595766f7 760cb633 cfae8f30 5a9bb972 dbae9962 5529dd62 85cb4d4e 13eda3fc a83722a9 351b1205 +8992484 e0a7f181 e9efa246 fd212a2d 3b2c8a33 6d2207b1 13c51144 d5907c20 79b1e0c8 15ab4688 93545cbd b9c1d92a 4970b289 3a69e967 9444ad20 2554805c a620bb91 +13181783 2ea0dbf7 aa87d33a 746067d2 abdd9918 b08e6176 fd44213a b72d7939 d41fb442 c962da9c f9f04d01 1e08c3fc ad52148d 2dd8496c 04250b2e dc1e74bd 8afa3dc5 +12710942 bcfe0723 1d7bfe00 cb337275 9457add5 783bfd68 c1c93677 5ce5debe 0ac79d46 82e92c5d 33e1a616 de6d03bc ac33fce2 8bfc5fec f3435929 cf979618 92dd78ca +413143 6831878f c91e3029 38015a17 1ea550b1 7317d2f7 cec19029 72065e0a aa7dd4c3 e2629566 e620fd17 1cc41bc2 10c75c51 a9825ea8 544103e2 23fa9c0b 6d29db77 +13520988 33325f27 ec2b9d8e d77690e5 369ff186 123cfe93 104d7e43 ad4026fc e63b0856 44f1c147 829a1ce8 26d94f73 576ed02a 8a3eafd4 0c162ed1 4fd9216c 5824f840 +6231054 f61e8d04 7d0dc48b 24734176 ee60ffa4 287fd329 85e2965f c3749655 bbc236e2 4d8b8f2f d2a44cd8 7850713b 46d104ec 653a817a 54051fa0 0f2d26c3 d0ddc4df +7633353 aed57b6a bc081000 70076083 0931966a 62c392e9 698acf01 cb246d64 e87873de ed2f1b17 b1aec0f9 78c3a84f e9b398b6 b671f706 30f5a22c 0d1aabc1 3881120a +8344915 a0e462ab ea062c44 786b5488 6e041f9c 5d71c778 c3634ecb 05d41b99 2275c327 f1b40573 ed9eb705 b2dd4b89 ba340684 af224fc0 5640ea89 f51799b0 49904123 +11131240 36a45a05 779fdc40 55c0f9d3 bd1028f4 5fff150e 9241fccb 861500f8 5f2e9475 35832ab2 321e46a0 415bd201 b589068f 8f1424c9 7e3c64af 85f87f12 2f83dd69 +3973696 0cda8f50 de62e883 52ad0982 242ff01b 8f24d2ec 339254de eafaceeb c9240f8d ff1d0202 6a3bc248 5f24a38b 57ac3a01 93223547 6573a39d e5db92ed d41a7c9b +8053610 0b78a318 d83c6bb2 bc72fad3 186c8283 f0cc668f 46ee3d62 aba69ce2 b541e402 a4a9b884 0e044f9e 520a6264 bd8f18ef b4c5ae96 0cdc1996 da861dbd b11840ab +6971908 76c80936 b80416d6 19509b4d 0394439d ab3b80c2 5e26f38f ca9581df 7b9aa1c5 9f60d8e4 b32aa1db 94001399 0aec8148 e175cfe0 7732b6b8 ab02ad70 9d451678 +680482 51b685ec f3bd3384 87b43347 ec8076f8 75e4a2d8 0496ee89 f8a5380b 391bd08a 8894b24e e4cbacde 514dc65d 7f8061aa c060c9d0 0e476bc8 61f2f9dc 5973199f +6542534 554e8efc 7643155c de840011 38d115cc ea63ccff 0d87bcb0 29a6a534 89e4ba3c f4752790 4d7aef62 68070a1b ae0390b4 2e5c5390 afc5074b 78761b3c 366089f8 +2735336 8012c0ba a743e6fa 69d1753c 2882bc34 0d06d1cf 8de43e91 e6a66661 2b5cc321 28e85fcc 67d82dcd 34c5544c fd54134f 83391281 f2a3b20c 616c1b4e 78b5980e +10290567 dca3ebe5 9ee8d114 53ab1006 90d9f7fc 21322ada a8746514 ef8b4489 2777003c 7061710f 25e9ec27 ca43e721 ea0d2e2d c565a0f4 2fac5076 fd30cd6d ebf7a485 +16055457 883af885 39c94f16 5346ac20 d9f84949 c6e4252d 1eea9a32 8417c2fd a3fdb6e2 f3f31790 130de9cd c4b27aec dbc218ce 9fad6d3c a5983c22 16269e3f bdd52574 +1412081 5797e2ae a8ab36a3 81f66f49 e7994107 2f7e748d 15a938df 021588d3 4caf2d04 a90d1492 3b9d490d 3c6fa103 bf9d5d30 54ed17c6 1331db90 834ee7d3 82de7512 +16547912 30c4f5f0 907ae12e f37fe165 ce2cdd95 22b02b7b 9a20faef 66e46ae0 a0674f8b bae2fe7d 5004a7f9 5071d251 96017e10 62f99af9 b0f968ac 73779eb1 f62b7abe +5389790 84b2d72e d7bc08f4 a1dcba47 2706e207 2d34759b 548d9687 5878dddc c480d783 ca662abd 228bffb1 99df698a 78a6362d 9c36a711 8a1a61db c7f1243c 78d399aa +11091002 83f4e4ec 2de95203 476e57b3 7f758f47 9839d40d 77276a04 1b1686f7 18546c99 b30b4151 774f0af7 2e869ef0 8643c99d 464f2247 b2830bb0 b46a89cb b88ea24c +6012306 d0a02400 e7681992 2d34cc8f 6cee1ddd d31d0605 6409dd1c 54f71209 5d1af524 42d45a5d a88163c9 370083de 4c86bb68 a606759b 8915a1fc a52f50b1 8a8e2d43 +11382668 27bfada2 f9a05f4d 2509bbe3 f045048b d33a4b5e 3e9fd122 9cba5caf 304769cf 8498ec1a 6d5d78f2 392a4b7a 696bbda6 4395fa89 513b81c5 c465f291 440802a6 +6401135 4282aa89 1c43b397 f7650d8d 74586bb8 a9822a2f 995be302 c121390b 0d307791 0844cf65 dd80179f 7d4e6508 a454b358 d1e65c99 61666a04 88e32293 3c5874b6 +6726206 a35709a8 dd9d3a45 5b37ac87 dd41b009 5ee77a87 c87dcd63 e1980304 186f75c3 8b5b8a16 b8bfc7ec 8b150bfb 721d2970 71b0002b b7b1eba2 66532556 bac541e0 +6448381 cc26824e 8c96231b f06fcbe8 4bd30312 74736e1d 4efac3d3 c83b70c5 5e6b9ec2 2f8e7874 20138018 2b09c6ba f6a45c65 bcf1be3c 69dfad5b 7e8c2bc3 f9782d36 +11702286 2dec2410 11b83b95 49cd3f8f a03b0fe8 3598c5c6 9cd732bc 1e178931 798bd6ac 7c36b0c6 03edff89 e846efb3 ca6a3777 cad3201a a4ac85c1 0a4814d4 df5dd420 +4350642 d3472828 f00e62a9 9b0e6b3d 247520f4 2cf90caf c10fc6b6 5acbe4b6 df188d81 1cf6b09d 1f6bdb58 83f84129 35a65df3 a028d203 00ba747a 7572672c 8e08d465 +16532513 53fe911a a8bad7eb a727fa97 fc691be1 4fb7b757 f30c117c 4324afe7 949cfef3 ae01d692 d48d8de3 3fdce729 1ff47c4c 3909362b 02cba358 7b4888f3 139161e1 +4620412 0ff966bc cea65b1a ba5a5cd4 340435e5 c48824ea 3334f9df 74e4b3e8 7da69a6c 168d6f32 006ea5cf 5429f476 7a97eb59 5d5a1ec2 82577b18 44df1a80 810baba4 +11923875 f5d6218b 6756eb84 08e5389b ae53e560 51f1c88e be235727 d7f45453 ff88bf68 3b444ea7 5a1b7ba8 096213ec f06326aa 0692da2d 636e7d91 d29c53f5 d9f4ef62 +16453235 760696c8 7b9b8457 34800e8e 08c26793 f7219154 2221cc0f ccfa19b5 c421723f ddda235c c0e54bdd e973f40f 7d273f78 1b23dc9e 897b459e bdfed23a 631fb748 +7305159 a086685e ffe6b54d 9df46b01 bb0f999a df3e4e3e 68a067be 7494bfa9 fc75eb75 07fdbc64 479c2f7c d47ca36f b48d84da 815e8a81 f4c3fec6 81437636 bdae032e +4335176 346b6f77 ce3c8851 1e0015ed 4f72be11 776ef0b2 6004ed32 cda1bcba c4863e78 732d7c1d ba694b63 020b0183 e0728922 360d230f f5221358 bc96c8a8 2344bd76 +6373264 51cf2c3f 0221458b 6ac9ff54 b5f561d3 7e2ec14b e5e74873 f65c0f69 44cffc21 aaeec091 ace50073 380b0689 8c7843c0 53119621 e392a90a fc898a5f a05d5651 +96640 20236027 30995452 ee901750 1e9872fe bfeb8c25 20f2e1d3 d0a1aee9 e0240b31 c04b6a19 3f8dea04 fe85bea2 2f1f141e 42a8cb36 9ea7959b 30db7a7b fdf52ef0 +14618274 b6c280fc bfe84896 d4c0c3a6 9e40c68c 97b45a72 6cc84939 6046203e 0439b04a e50bba4d 9fb5e67f 8a5db603 be9f6cfa 80865192 edddf21d 36313b56 93f0eb1e +8628050 13cced87 dee6669d e37d96f1 63ec2b93 009a4879 ba269d33 6d3dfd2b 08bafdc7 9f1f1ab2 02a27944 3c518209 0bb2ee37 f8064b1f f47ed1a4 d6446f4b ed0a5c61 +14621844 5b322d54 2c1bd39a a23fe944 6d57a2a5 972a8c3c 2b1247e3 c7f9280d 9433c6b9 2dae6284 51b7110f 63832037 ed77739f d687d2c0 9eaab66c b086fee5 52f6ace2 +13350764 2d80bff0 01243742 51a3c699 3e75b569 fc17c632 e8ff202f be98582b 6d2dd82a 7d955c9c ffd99969 cbedcf65 3a60bb35 d082d4c1 6a3df15c 8b4bce78 e6b3d46d +7191104 23285c51 33e09bf0 ad917603 6ad294e2 728b9ee4 b146dbf6 872ba867 041d0569 04562d04 1d9eec16 606d346c b4463dd8 e4b36941 071119b6 324ecbe8 7dfa6f2d +15391410 bd1c7b53 d24492b1 9d7f7d87 0e718f74 66fa3edd 93928f0a 0b5f90ba c62d451f 0a5f8b7c 8af7ed91 a65b1616 2ca5886e 8f9e49ff 379383db e73532db 7033f49d +11340739 6ba10c74 222e387e f87822dc e48519c6 2eda0213 40d5e61e 9fddaa36 06b7c254 0bdda6c4 42c91a70 84643091 a9163484 bc7ce44e 5ede322f 12d7f74b d5e2f452 +13435960 379dcd4a a0e35389 91d9b214 5887b657 ad6d8950 b94ae1b6 98908513 639490c2 9e101892 cb342982 dc7360ed 376966a6 d7faa46b 902852c3 1989cf20 0ff7cd99 +12737038 0cba8490 82fdc9f6 69997268 ef48f56a eaaf9582 42de07b0 5e09c399 87458599 9b261cb7 e2e37bbd 14e8c1e8 189b0341 99629969 7a6e3779 645b339d 0c8c0b2a +1927641 5bdc94bf 9e3b882e 57bec616 2a325566 535557a8 b39fc2be e85dd215 3bb457ce d1adcbcb 2ee094a3 9e34d487 40dc0046 3b2a72d5 3f9f063c c8e66eef 6b84549a +2511062 e117ccb6 f69543b4 2b9f4af8 9054fe99 ebea74b5 9d595fd3 ceebefab 14038ef2 975d450c f54c7abb 36450d34 c785b4fa 5fb1c505 b8c2a9e9 e5f64a93 291d1cce +16750208 27024ad8 ca2905ed b3091e24 9105c29b 39924b94 2d265135 5fb61163 db933d7d e93d91f2 13b5ba23 0196f37b 2dbb8fd9 d7c7ac99 5a0f686c af8beb57 cbcde5df +12521598 33471c54 7f4e7c32 d177fdd9 a49b518f 5e0226b9 4720fe34 b4e5e289 c88c4c35 afd596ef 65d99eb9 7cda98d3 bf614b92 88a36f73 525bb086 7c950a75 996080ad +6291161 f3f2d9e4 b1b3fff3 5e03b3d7 cdd0ce16 0c502f6f 21d02b86 f397a139 08e57cca 03aae57e 04de0cc3 c034cc52 5adcc750 b54fdb89 7fe192e6 b3044c83 27911f65 +16384296 5162a794 81ad6b95 4b6ab5fb 7ca421ac 58a6cc44 fcb2194f 4c72a6f7 eafa5582 20c2a901 67dda9f1 193dfdd8 35d3495e a0749ca6 458563e4 a7c292b9 ce891cbf +12402152 82bd3dfd d6f362c8 731213ba 59ce7931 b51d545d d45eea18 ebe4a029 c337ac21 d135b7f4 badc6951 25c55276 43aabb9d c6d3f6c9 bcc44b6f eb5816f1 23421e8f +9377179 be753e1e 89e6abd0 e62a4f89 922ae76f 12c6be3f f15f2f5d bc0eb2eb 25f5f75c 8fbe186e 13bd0cc8 840cb616 27c8c22b d70d547a be57d504 08f007dd 488d42b4 +3800234 fdd32507 805b5d89 51c51894 29daeb76 78a42afc ff9b934a bed082c3 24fc4292 ab4a4d68 9025940a bb78e0e0 ee57ea72 ce6f5620 c2e41e8d 75e32af7 d2ef607e +4671056 31a22bcf 3338963d ea2e6080 52ecf8d0 7e4149f6 cbf8e82e 873872d9 58ef328b 046ee6e7 88de3009 6000c2a0 14306e8f 97e183d9 b0440d6a 9d8143eb 28a943c6 +15335043 2bcd75e9 82d2cb1c bd3aa738 c6227ceb d4f96c24 422f3ac0 36ec0bb4 f7cb36ce 28be0391 89eed290 3be4321d a07208ea b73a465a af34537d 5b65015d 720a5499 +5624872 ab79f240 f78224c3 a410e680 dcf6d810 0163f50c 44787c30 9e047deb 677d821e 016d9ef6 1bcb7af3 31b6e428 98127ea8 112cce4c 4e230abc b39f0865 823955d6 +9885184 919d756f 334c9216 f0560ce7 b9f3072c 9c884c66 8580e5f4 0c5bec82 359788cd 2a7fc1c2 9289556f 3b20b5af e37812f4 e7731f95 a61dbc4b cb4b6091 0eda2447 +6186695 f2731f7d 5fb2a588 29077bfc 837e16b8 10fd6f53 4e8dce96 bd72e63a 78fa6e3b 83c835aa 97593747 319d6944 a2817c89 f174d084 a40b020e 78618316 9fa6ccee +13651746 ec7ebc6f 325eab4d f5f90e05 801eb3a8 b2062665 3fcbea96 9321d630 a83111d8 14b87f99 5f83ef8a ffa2570c 7cd5d212 076827e6 51b15c6a 84dded71 b0b7ae25 +3026204 5d624386 18ecb61b 59ed822c 0a5430d9 351ab8fa 0428a3da fb454fa8 12b76f6b adfde0db 121fce81 0f13f478 873dc881 2399111f 4121d9e2 27313217 bbb669e0 +7062552 f700a7e7 380d7f1c f7df6a4e bd05d7d0 f469a265 f81f19b4 4e852e70 beae85c1 c25963a0 a0ae5c1f 6855749b fef48038 12e201fc 15bc052d dbdbb9c2 66c1d93d +9824313 5cc3f197 5d756d28 e456100d 437c2940 60e2b3a5 4364dd3b 1572efcb 69a8eb1c 29926ce4 74d6b6e7 e1b16d80 fca87070 18231aac a69dc38e af1e674e cb78cfbc +4757641 dd3e7cb4 350d9bb9 8d582f11 f98e21c8 88e1c53f 1527ef9d 33aab2ea 1c4e6262 072415b9 a1b9f6eb 63c0103b 62a2d948 4db5acd3 86b7f889 c5f06866 c795ed57 +9983360 78d4c135 acebbd15 da39f00c 5d0275e1 14fc8e1b acc78a05 9a46b913 2cbf2f12 53a3086e 514109ba 819c972b 9274bb32 9bd5b48a 90344bc1 be3cccb7 fdb7448e +9030049 7cec70c4 358d6b83 52557ae7 d78451a3 b708dcdd 14cf218b b947ebc0 658e81ef c32e070c 67b1548c e70c93b4 2301db88 2f4d905e e3aee590 9f3f9c58 b1753ac9 +2254202 76c301e9 8d00e0df 83969a5b 84a3e69e 0a69c5ef a5e56ce1 9dfa0220 f86d8283 59b4ab63 6d8edac2 d54f3354 7785f005 01dee4a1 f76d83f9 a7d7faf3 35847f17 +11768819 0ab5cf54 13ba9928 a7200503 04b32e4b 420d304d f09ccd95 b86bb29f a40c1819 6f4ca419 43789a1e 9fe045b4 4a44beb8 c20bf596 d59c8409 57af11cb 5ea1a142 +7679947 fb92c840 e7a68b58 20a37409 c8df7e4c d235eb69 4a5b75e6 9a7a1fc3 ad0edc36 89046287 07a3a141 21108f49 67f5e6a3 08185c6d cea968d9 5a8e0e14 b73dd088 +3054774 07ef564b 6395736c c2b4b7d1 d1860f79 7d4074bb d195b718 fdf49601 4c4d8732 4faea9bb 88c99293 bbda0ae8 8ace6734 df222b7d 6e6f6c75 42b2cabb 98363e8e +11639365 1d38ffca 34770cf2 9ad57230 d00f553d 31a38ad3 370da526 cb34e12e 6929c72e e55a90f3 7f264fce d9ff6d52 f274d41f 34c8a626 81416a4f b2faea38 cf240db4 +851389 388b232c fcc1fd75 6cb074dd ec673e09 e6ba9d84 a9ac2ca0 ec01ffea f16ca12d f080349f 162f2666 95603940 ef37f2d5 2bf680d4 f96a4318 d95c6477 6eeb72ea +14619361 9557b1bf b463ddab 9cf40b90 2fdaaded 9d8c8359 597cc59f eb143abe 2ff24bbc f0e93b08 b78482bf 4a7d7800 ba35269f c9e93073 35d8a63e a6e9f46a 5951f3a7 +14718017 43804d24 22c08e18 2b1b9667 066562d9 d326fe36 9acdb870 27161914 61f8a220 f88ec246 10eb7f23 68f4af73 0c22b185 8b588505 dcb460c3 1724431d 9957e41a +3505400 3719e421 5cf12219 3fc6e6ca 0c11186f f0d7f48f a1a2b20c dc592324 ddce6a73 9b1255d3 4031886d d1cd5f6f 19ebb0ef 77dc2b53 94e257af 592934d5 97b2e3e5 +12364390 9faca7ac b7d533e7 707b3164 ea1abeda eedac168 8db0492a ae666415 73c8d7dd 94fb24f9 e5ce6c48 c2dbd6cb dc6f08f6 80854d08 a4462da4 92529aae e986a1fe +14721160 04335a6d e00d7cb3 27ff930b 3f5d93ea 088ec3d6 3000b4e1 249838e0 3f87110e 100f62c0 34b428c6 91c10607 e6a63733 5a12aaba 1bdeca39 a3a684d0 9a9ce8a5 +10683252 7886fbf5 74d2a614 8b2f11f2 f2f9f39d b03bf344 40fa8a82 ff36a05a 06c950b4 fe35a0ec 9586ea4c d94d8eea fbbda6c0 cbd87c87 4f33b081 928ab8c0 6f5357eb +9215032 4d1de2ca 09e6f006 0682da25 e761fe81 6a631e44 64ab15e5 5cd0fe65 a76c76ee ab540850 8d93c6dd ed688716 a2d94a8e 962cf964 4e420655 7cabaffc 614b3408 +1141984 b682d0b3 74a62258 500634e9 364b506d 946f2396 3dc81d2d 3ab0e8c4 9823c697 1e50fb2a 59cb385c 6fd1a10d 245928ff 8d284fa2 9bf1ae10 b2ebe022 8cf3e4cb +11376768 e5e637bb 00cd66b8 c47c1363 b544bcb4 663d4293 8e3e4b82 b1e4a7e4 a213a239 18f2a46d 22b02229 d3b470c5 a8e84ffd e23ec9de cff90119 a5d9ee69 0ddf9753 +16258714 7c37b671 c45488a1 342df057 cde10d50 8122b057 d5614586 0a560375 b05be187 b28b63c4 81731ba6 49558565 973abcf4 4fdd0557 788b70b6 59e9e55f c81f6b9f +4598980 f95ae8b2 22c9dcab 690474c3 3572a880 bfb9a189 3a658468 854c35d6 e23ee649 a1a77b32 6ba25698 677dd181 3f6de3f9 d27f4946 7b3af077 ff602320 b67641bd +10253338 165dbc3d 4442055e b973ac6f d993344c 85236771 e8632827 fca5f873 86dfffbc 33ef791b 274e3fc9 f849f65b 94e6807e 4a159179 e9ff9883 7727ba8b dc993551 +2193772 af5aaf98 e4e09c03 3b5143a8 17b7d48a fcdc5f1b 263d8178 08aa5777 e065bdd6 9a655d63 b0244f10 1c18e82c f44d5617 78b035e3 7908be93 10d983f9 cd07a857 +2682626 08301e56 86264d16 64a4baa9 2c1849fd 288e67cd 27ae1ab9 a953160e 3db8a73c e66e38ec 5ded3698 fed5bef9 e9143f4f a5ea42f0 a018b6c4 3d7d61fd 168ffc32 +14141872 79232628 d47c10f2 3e933569 cfbb33f0 a4396201 98b8258a ec64ffe9 6a99b757 a405d6b6 b5b142ea 72110878 9ab4c0d1 300304a6 f73eb9d4 13a52c42 965be4b5 +9233526 8a5f8ae8 2fc255b3 9fd9f91d 7623eda4 f0191e02 dc7adc1c 567d21ee 673818c3 a893d1c3 05e0e53b 23de06bc 49751785 c06cd3c8 dafee0d5 1415ac39 fb2513d3 +5890033 07daefd6 18e40221 0cceecfb 03191611 f622047f cba94c07 da300314 bc67f0c1 d5920a11 fb1bf874 907571cf 576b28c4 e359bdfa 503dbe7b 95c8a3f7 65c37274 +505880 f5ed3ab6 e4bf23c4 072e6852 494001ca 2f59bed3 410b2b5f 96231ae3 22715286 2b6ab623 1ca8873f 0c8b4637 f5179e7e 6bd8455b 171a703b 0978755b 2f21981a +6243683 6be4da33 52190264 2b0a4f64 8cad985b ef6ae413 9d3c0c53 6727bdba 3afd9cc2 ef813b74 5ded8b0c 6ae48193 774f4d8c 16a72f39 07802b9c b1516eb0 e8fdced8 +6743592 da88bf47 62ebc84a 50871c61 529268a5 20bf28b2 d5f70bdd 06e03e87 8eb3faa0 a12d42f6 bfd87e62 c2b6c9f8 f84c9dd0 41ec1864 ecf19ff9 7b984222 43678c38 +9354827 d7786bac 9f76f0d2 942da21c 3a6cd88d 04b94c44 27697496 9525d083 f4fe13b5 1ed2595e 3ae7c48e 2bb778e4 fa040ea8 2dc98867 6fed6ec2 ebf8a962 80338ba8 +8539769 c0bba6c3 c5131864 ddf6ff91 ea13da9d 3235b364 2d6d60b4 468fe36d 244ec4a7 8d0d7544 466ee963 217c5fd9 3b754d08 e8af4b75 8d71fde5 dea58f48 25c2d6de +7433402 7eed92a5 842f97b1 b638c56b c08770ce e089b605 b3883b60 0e27372c 12da5e71 8a580017 a892f6da 95ee97dc b6cf88e4 d8838fc5 53184870 8f0f61c3 f470963e +3255337 30d3a11b d4052780 76e7622a df84c1bb e683a8b2 62c67f04 4bce611a 31a7c9b6 b593a4db e0a33cb1 360ff428 e7491206 6ae5d722 526f4a41 6abfceaf 0e379a27 +11142910 71b91ef6 20678138 0b82401b d767c3ff 73a239a1 6449b3c0 48ef1faf 97ad22de 3f4fd5e7 dfad9f80 159250af 0f6624c1 156646fe 7ac49ce0 f88e910f 38ec3768 +15663101 2431b3aa 213edae9 b8dba5e4 1106753f ed3865b9 c1ed0cff c142df5c 17a32e3e 737731be 96644856 0ada4387 eb47362d 71e60939 6fee2b8b bb7f5e04 4b748c5f +10487873 673159ac 8773f664 fff8dea2 591ae127 0b59dfaf dca4c807 b69d2322 a9d78a29 1a6cc048 62b2d05d b5e73809 1bf53848 f421a031 d9771fe8 cb97fddb 82faef9d +7330210 14ff0514 6e1131cc 57af0843 1cd46d25 253a4637 33b88425 f653b232 4d974e11 e23bd2d9 f6a69321 e619adc3 077621fb 1f23215b 45b14daf 26a8a161 4059e1e0 +1127629 d2003406 39ac1d24 10e1e5e8 c0ae6717 39c2e1e3 17e3d9a8 61c2e3ee 1871fb7a 0c31c903 026d6116 25077235 00f945c8 8f91fd12 8afacdb8 e5450b0e 6db0798b +11494763 2418b27b f0bbd550 888ffa7d 0b254037 2efed4a0 20bdf2ec a11228cf 9351532e 8d0b37c9 cfdae446 3c2f1522 8da1c5fa 19302203 5b48fb41 345812b7 413a63b1 +382499 e8d6b244 2b9dba7a 32799a62 b1b6e444 12aa62a5 62e6e43b 37bd0cf1 9da339f8 36d71971 c390dd5d 74be7e0c 7df77e9f bd49d05c f554aaa5 a82b7e54 abc6bbc3 +5506408 e8245c70 715bbb50 43bccc5c c6e60184 ab42cb93 bbb7dca0 75b0cc56 55f8554e d6884a2e 6891139d 3104e0b3 5df97300 2f21b0a1 840273a3 dd4f31c6 ec864946 +6768128 e9dea97c 49339994 47a81c02 dc8020c8 b72bfb86 5be19453 60d2dd5c 03c75048 d386a109 e681b74c 33323b1c a6ef712b b64a77a3 6ec67886 87f9c696 b71713ab +15499693 36641b0a a2a830f3 9765c2b7 4532cd12 4ea24356 3ba45d68 9e806851 5a0c1ffa 5c7fb12a f8473e7b a50c5493 274709db 35064192 18f9de18 9d8b21ce e3f1d4fa +9706363 1d613381 6a55fdeb 8a49d2df de728174 ae4fa5e9 d0330747 57e1a638 d6c75baf 3835621c 0a3118b5 2b388d90 285a0f85 0f631eba fae51aeb ce7f03fd c378e7c1 +1749349 93e6e97b b425f2ae 0cfbcaed 9f9e18c7 07ce867b 9b3f4f11 81fd6b0a 421920bb 7f1bc255 4e36c0dc 36bcaffa 7f1e7033 6eeace31 817adf61 d1c18316 c0b8fe13 +7068181 2bfc9951 aaaf10e0 3f4f6202 be850326 14621257 ddf169d9 e180872d 2de24a24 fa287c17 b29e3f3b e3005eac 43e440b6 a989018b a009915c b4feaf22 84d6c6c3 +12986998 00977548 4787bf76 a7a5a723 d68e8cd0 6c8d79e0 73b5b0b6 0ea0c046 c007d122 c45f905f 1f575791 bb769014 f0a59edf 3764636b 40052da0 e98515c4 7eb3e378 +2206453 7f1b4df0 25e79bdc 0b72b58b 92fcd8e2 79de3411 58cb9d33 739e9d13 93deebdc 5abd7777 1f227256 26b82a91 d0193c17 d15e74bb 02aa25fb 1a4bf73a bb287ba2 +5868879 56388635 985c8e62 26079169 0765b262 466dfcd8 3bad0890 b97695f2 62310683 4a220b84 b3675765 f1c138e9 ef09e11e 73d73b12 cf93a9bb 875c43cc 0226eed0 +2610168 611f9f5d 939b2539 ac30460b c70e0431 c1dd60c3 adfe3b99 bc927191 4fc4f0d0 3368f4af 1f6dd2ff 19e75500 767f446f f35415d4 20385503 080a3dc1 e14a3936 +1332819 a01e4638 27fa2050 7ab54619 f4063452 f5433917 6ebb6dba d97368e9 385f4b6c 2b6a8722 381eecb6 69bf0591 9605c845 2205de3f ef485378 82534a36 b86b119b +12719600 43a6dad6 0630b9ab 32a1b685 9effa96e 6550d87b 1d8be3e5 7e15bd58 94019045 99e3f123 6ea12ae1 dece9f0a 2a35433a 93241da6 8ab7a09d fd2d2132 96d9a069 +14600824 d23d1855 01dc5dca 40bba39e 8984fff9 4eab9196 ae2db25e 0ac3160e 71f6a505 76bf3e87 2990f5eb 77d89d3e 927546da 03040df6 a5ca6253 154fba03 dd1c3b9f +564836 e6ff0b2c c7ba620d 67cd7495 303901ab 4b50fc32 9b1af6f9 18505f3f 1388b211 0f6d72f0 2942df61 6e8a3d00 1ab4c8d9 63b04454 55dc4f2b 942231ae b98a85b5 +16655166 42edb596 dd208fdf 21e818b8 649bb67e a0bd1334 d989ec7e 6f7996bb dd22da6d ffd5ac92 a94291e5 88feb781 768e1dda b97a80cf 3f6f7e2b 1281c62f cfe2fca0 +12505224 610b5f1c 4363afa7 ab54ece3 0f29bb6d a7948226 7786ccc9 925c2c99 d5eb8ada d306ad13 73bc780c f16de65f aac6aca1 bb888f37 3d014b7e f9309b3f d6908310 +14309480 9a13b1c5 ba9a8b61 60f5f9f7 fc086660 dab0956e 163a9114 3fb5b4c3 e6adda8c 8ff08814 4c8a7be1 95dce3da 8eefb972 ab05ecdb f42df033 329d499e 62041a3c +12379588 8d881dd2 767b44c9 6af83789 45c59966 6ee146fc f14b8aa4 e4a026c1 5efb8fd2 4fe3f91b b14479c9 884886b3 47f12cb2 4488725a b176d995 9eba54d1 26d1bc7c +6075578 e67822d4 1234b04b 1b9abcdf c35c9051 f7c44383 dfdab3e2 aab0a6ca 993427e3 6cf8311c d0e34199 6278ea29 7ddfb948 029fb313 1c74b4c6 90cf733b df40f29f +8657725 0396d794 7a9b34a5 51b71fc3 6e85951d fda68ce9 8c432d4e e5852cab 4e4b89c1 4287b150 bf2d3633 088c0d5d 0a78538d c4c86a9e 77e42cc7 96afa131 7de22bce +2440495 c0fc7b3b c43b45dd 99e26824 36847100 aa26b48a f63f5e5b 1cb3c457 98940691 6bd92f26 bebaa801 5b72d0b0 ef5dae8b 1d714f53 58ef9727 602f59c7 1a92b8fc +11361864 6ebddb19 111cf8e0 2ee760b0 8a4ee9c7 c46a18cc 1c00576b 8f51ccc1 de99a999 fb280719 2f3a4b1e e8a590c5 c1629672 583f7e67 c0cbf368 99912838 42503ebf +4765581 12b9e478 47a7d17e 1e02ed70 0774cd65 511a76d4 2348590f f9f769db 037b2376 310c8d4d 606107f2 67a48e1e b7c3ffc5 52cfb68b 4c3c878a ccc427db 9a467541 +14438519 546167c7 08196f70 c6f848ff 9039abb2 a6a8aea1 b2e5a542 07d367b3 a7788b83 47a9a56f 7d26a1ed 0c8009fd 9a03a615 86ee3c01 8c9d6bd1 42167fd2 a24f33d8 +10955127 680f4936 b9c0b0cd c302d7b6 f6807109 3a6882d0 c2c554e6 19c64948 d0e94f18 16c64fca f791040d 10c71575 24306f14 68bdd482 75b05197 417aa57e 1a746468 +5097821 518942f9 eb857647 3468ff6a 4a817a26 9db7c95c 4a6282ed bfb35d05 44ce2477 1f5e8e6a fdcdc2cd a3334d38 b565f78e 90db50e8 67ebccec d2c11191 aa7495dc +316301 d8186124 966ab3ec 6d0a53ed 04b78baf 6d8429c5 93d2d5f0 44d64b6f f459c48a 366933bc f865b0b6 c5c51864 2bb473aa 12cba684 cc51fb47 0b632a99 53ba6ed0 +3771108 9afd889e c51d81a8 917b2460 dcfe8f26 27e762e5 3e693b72 fb64f49d 85de4578 fc20e32b 81d16d3b 087dd363 06b49457 82e7d291 4b784b06 5f5d29d0 ea53ff13 +15305567 fdb30178 bcd393e8 cecc22a9 13f4470f 83c75b2c 7dcb66ea 03d8fd5e d6859795 0d7c30f4 b4663fc4 1c0672d7 e94f9308 57787d3b 200fbc41 32bccedd ba9c1977 +855629 88fe1a8e 0129ab55 637489f9 9d67248b 4bad98c0 6389cde6 38f34e84 6df2ce3b 4701845f 82136a23 9f275c70 26170e86 885b58fe de667295 e7a1817e e588b541 +14826301 1f834975 3ade3d97 6630abed 612fe7fd 34004661 9477d064 d9d22e6b da5001a4 6dee1104 63991850 03ea1ddb b439650b f61a6d60 26cc01c7 203a1594 7d9bb5d0 +4890297 05a4122e 194abdab 99d48f64 15478fdf 7faafa63 dfc2ef90 b2051e3c ef01d0b7 b5a3d22e 28743725 88c87c96 fadb76ca 8af3625d 9e3c0fe9 b534daf5 949291ba +2692737 aabb99c7 213751c5 c29c9bd6 950e36a4 231a10b7 7724c485 f925b8a9 efdc627d f169dc62 e0dd3b1c 655cdc68 7cb268eb b657747c cadc1a1b 9b3e4b01 a46cc1c1 +1798558 85bf6bd9 835a08a4 8af7e5a2 9d620552 9e97afbe 75b9cf08 bf954733 12c8196e a58c5ca3 d2564943 0588463d e65246d6 d3ffa9a8 dc090f02 703aaa6b 166fa394 +5701596 503d17a5 78e4bbf4 77fd3833 7b3e8da8 219cd988 f7f7b09f b3e3634f ba1f68af 07b019c2 06fbe10c 45fe267d d7b9e294 20e7a9b9 dc442e8e d7b46d5a 58314dcd +195917 167b5c64 c2adf7ee d11803b0 60222b88 dcf7670e d02b636a 4aa1da3c a89ed64a e80eb593 358110f8 5f21655f 0a1601e8 b0d66c4e 05e7f695 aa1f1b96 c2bd023b +5741310 7b76a52b 26188901 89ceaece 34e413fc fb91e17b 50abffe9 7cb4706b b4ee09fe b4752efd 6047041b cca1f908 2eac580c 4d24a79f d47598bd 5eb81afa 8ee6648a +12433807 e58906c4 2411c2b0 53db91cc e14909e5 7b6d6774 9eec7d90 ceb8194c cea3a2df 2432ba6f 82736018 e28f0c77 51d418a3 c5824075 8435d101 e8e9f739 1b7e8460 +5398105 9ab2f3ad a1773b03 7544da20 a2074218 5e852db8 b17b2faa 898adf29 47d40990 a15596d8 13343e58 8925a161 aaea37bd a67884bc aa4d6840 a37cd994 9aac6d1c +14965737 551793a1 00e20d30 e8227060 d7a06b7a 103e6940 a4a75861 28a5e9fe 20e30649 1e73c85e aae8c7b6 eef7a594 f6d29878 b187726d 5a1926d0 ab650e77 46eb9852 +254708 f5b90135 25a6aa59 ec1eb876 70b55f97 2077bc14 7fb18bc3 aed235b9 2921e7d4 28b14ea2 13edcc80 7a03bdb3 f8fa2f8e da054e34 a0dfb1e2 7cf6d44b ead1f295 +7830465 98d4da8f f1ba2a4e 61fae2fc e411cad1 12a8c6b4 2548c937 39988d2b 7d3d56b0 2e7c539a b4e16303 9742a286 18307617 440e7a6f cddaba21 48438fc4 67d1edfd +4649558 efed1caa f3d0eb3f 44a5bf15 86a601b6 94ff5725 af8f4b89 71a90bd8 54d5d7b7 5a7f9161 46061126 5af1b7df 00291187 5d0a8af3 b2bfcf85 f6da3fea 3c929098 +12541530 0cc25608 0c8bfb29 8db2e128 4659d3d9 613b65ff d91ccbb8 d563e5de 734d2b8a bbe796ac fd6c1d4a 7a929754 c3cf3968 54d9770d 75c9d1cc 553714bf 984c3443 +2515586 1fef0814 8be2686e 48b1c3bd 84ac51e2 1fb316a9 1d8d3812 67ef4085 4d43138d 6bb1f5da f152d9da 18de5446 d1929418 f8b0b0b9 be227c48 abdf61ed 9f9d5691 +15020722 decfa613 2bb81063 5584e9a5 72b75e38 44639f98 adfbb833 45f2a453 18e8dab9 9af3a95a cbf57858 9e97d95a b1fa253d a07b80d7 84724749 9c0cfca1 9ab4e4a5 +10124103 88ca9fb3 8c9ee778 6c78dfec 72b8f1a6 9fc7b852 1c0e52b7 bbbc9635 88adf110 69301a9f e009ce17 c132ef47 b6bd6d9e ecb72178 6d2ad5fd d34302d0 4da999d9 +10141458 5a0085b1 94ae08e9 c1cc2c1f e903f93c ce65db98 23601890 39ce6f98 ad3e77d7 1ca9c2b4 f5ecc3bc 5f1c466b 32e72dd1 a62e3739 1d04ce5d 9025e1b0 b054b759 +14121522 5e489dfe 5487fe2c 395384c0 9fe9c8d5 17367a4a 594bd4f2 5ee07c15 c03d22a6 2fd80f62 fd254e89 3120af7c c7f76023 f36eedcd d6148635 4bf01996 e4dc3463 +13194678 432ee7cb 468a3eb6 f31660de 6f3140c4 cdd3314a 96608d9b 96a0446f d9164056 bf9507d9 952dcbda d19be518 5b63f543 a648a81a e9e61352 e84a5d29 8669dc73 +9684724 ccb40188 b4e1790a 2e1e0a9f bdd297a1 a206ae43 b7327906 e6bf2a0a d6452a0a dd6a45e2 c158abd6 7339af9f d9bfc995 c47e34d8 8ba051b7 a7f9eb81 be6e0e20 +8866490 c6c4f48c 04f1e345 a8c79aa6 172a5e4a 4610a3c2 60a807ad 1563e194 7dbb400e eeeca823 a1574d8a 03cf622c 7751ed5d d033501c 1ae3c99d bd628d61 a3e4dd67 +4795645 04ad6f91 271ff93f 6638932e e654004a cf608e0b 79ba62ab 0342c030 7f6ccb2e 7a8b62ea 3ff84bbf 5f5acedd dfb7b3fa 168ecbd3 89c08fc9 baa079ba 8801cf11 +10651593 1211a983 27c29057 227b4f6f 2be3fe68 b0a358b9 771301b6 a5291650 ffa9eb31 28120120 977c9b42 432c90e8 ee9f3e04 972fd5c7 64945a5b bd2f1bd7 5666b251 +548227 7c4454c9 b80e528b 697d6b99 9f720151 5bfda8c5 a91fac34 acc91a89 428ee8ce 36c8bad5 597b4166 dc9fb66f c7b9fce4 21cc5940 ade1857d 7e55c304 ac4dc04c +12195209 fc167c86 d32425ed 71553101 df204cd8 3a4c2ba9 0ce981ee 246628c1 59d9312b f23a4782 16e4439d 4906b511 62d837eb b78aca47 4936870a 004c15fd 1ca326cf +10822464 93d1fe02 407c4ba0 6ac448dc 64deb937 6d6706b8 b589993a 777c35b3 f004ff33 74436316 6e78d5d6 c169dddb 57b92f95 26706590 30cd5d9b 0bd98926 09f9d1c6 +1848990 5b022ee5 b60f204b 87368b11 506c5a3e 74d18861 2770f12c 6d937a82 983d49a4 9d52fe99 4dc94fbb 1be1cf50 b78eba9c 4732071c a5d8d19b 11fa556b 04577283 +1049686 90a4ec03 0013840f ec7e7634 0972fea9 cf546382 fc0fd4b1 6d5a4ec0 2f71326d a23995f7 742dc4b4 aeff75ef d32b9742 e059425b 3a8e895a 2c54567b ea27deb4 +9378946 a3ddedbf 9cba7edf 2589f1ce 63f1d2f2 6d5d020b 981f6abb bba42d57 1ec5f84a 94505102 9d7e0edb dd64a185 97c62b32 4ef43c83 d047c68e 187180b7 074df713 +7085600 aca7dd13 a387c5b1 137e50c1 45017d75 38248802 9677b5b6 efc69152 d59e73c5 f04bc892 836e3a05 34c50c8d 6f5a5a73 c60e8e21 090207e4 74108c3f dda0118e +6333815 a6719dfc 50d73889 0a8d4044 039bdab4 2b8b4aba 1f164efe 3b7f3c88 ad1bbf30 2088f48a 6298add9 c51539bb aaba5056 b539dbaf 2cf87655 0b4cd38a e5136234 +9903814 b75c275d f3b4c9d5 f42749ee 5261030a da3d6046 8e3fc719 8dfc193b bc419abd 4a8d7a08 b9db69d4 a803d022 b5e184c4 a0592dad 42949ccc ff4aa8d6 6ef51384 +11922125 1056abd7 965255a0 5f2ebf7f e27f3004 332335fa 13e93ab8 9096ef2e 830109fd 5bdb8185 e70d3142 ad950a54 376f07dd 7e8c0a6b c6e00e36 a91fce20 e53b1f66 +16714063 00d574e4 8c48d0a2 84fd1f13 c80849ee 1523164c d6c7a7d2 dc6d421d dc67e51d 4fcc15bc 188864b0 bef38bae 4382cc97 032ca114 5b0c1f9b 64a24c32 be4c01af +13673925 4666ec76 b207ca0a 09e96491 53b9f306 68989b24 b9f13ab0 4df0f015 e1c16277 156716ca a33e5e8e b353be91 64bbedd3 b9fc4452 f748d836 b609515b 1cb77225 +12265649 4e8af95f f433e72e f2216e40 dd291fc6 9b88839e 3aebf0c6 11ac53a3 915da14c 93b4160d d7428a85 0b7b6fc8 ed843329 f72849a9 d98a0f1a f12a7cda 0219687c +6756941 d831c8dd 5d14e185 ee482b44 837d8c08 e615e4ae 6a33f405 4d6b1776 ca26fe5e 58d19ef6 63e3a60a 6fb77cbb 226d97f4 96a20213 176db92f 08e555bd ac17dd50 +3784059 0d851401 0e50da78 76c1b0f9 8e275ed6 6bf01413 050c688f 21f04fb0 25e02e20 bada9e3e bd79bb68 af3c2789 9d7eb00b 5c7e575b 9c508b46 2bb94d26 e634cd49 +6171623 116713f2 a911b48c b5d54848 72ba8327 0b1c8c0a 2f64e704 0e4c93ff 0911420f f9b7d428 60110436 cab87f75 60c75df2 f9af07fe 2c5aad0e af2e0609 0bfa8e0e +5239478 89756ef8 4b9dfe0d dd8d5b15 2323d224 9b6b7822 70136b61 59dfd4fe 3cbdf705 0d0cf52d 40da10e2 2e780aad 50fa2a5a 5d94c7f2 8acdfda5 67bf5fbd 45184ac7 +1054018 7b8ea1c5 b63d2ac9 50e56759 19ad9f80 c311f35a a2f546ee 7991563c cd4c92bc 99114984 54ab385e d40df799 9feff29c ce7f6544 3613f7e2 ec10e03d 7ae7cc73 +8274779 095da28c 41a51de7 aaba959c 03ab264c c81cca19 7492adf1 14dd66b5 8179be17 f5eba842 ab034ab9 a1ddb5c9 296e7728 c1e6d999 490cf550 2426ebbc 41897032 +13103440 2ad51cae f286c474 08d67ca3 18231b23 dc075be6 ccf45377 caf4cfcd 157ac1c7 47d05398 b299b011 6dfdd136 9468f592 ed662ee7 d42ffe2c 29f7e0b6 281789c7 +6021997 8ab9885d 58bf7fd6 beec27d0 98e2dd34 6d31117f fabd9d6b 0db0aec8 ef88e5f5 0de3e980 51643b30 75c50360 fa0f24dd ea9c56eb 1dda4116 b736ea8c c956b147 +5919435 bbf169cf 237b1e13 6df6ec16 709445b5 31d34d69 5a775995 ca87b8af 46955178 b19f7900 c6fd2b61 139866af 16e1f506 19276458 21cd8f0a 0006fb25 2a76a303 +1412344 2c29294d 149eb8f9 3ef7f9bf 09bd5bbc 34eda106 0cd65240 ce02637f 6e427fdf a3a85457 0229eeb9 65cf8f31 9f255c4a b44587da 5fbdbef9 93277163 59898c34 +7709861 854b0122 db8e8eaa ce6ca641 5a051481 786d536c 8570a339 eaf6ae24 3eb8f566 2f5bbf54 fcae2bf3 45427ad6 50b6988a 63403891 377250dd 56eb4fd6 e513fd22 +9825011 afa3a735 27c5bade ddae4be2 02d0b786 06cfb881 20f17c80 a4a3dbaa fad9205a a042d660 0971ff76 ce92a3df 493de25d ce1250d4 30041ab1 e1d3125d 60f24a61 +8661608 9192c6ca a19aca76 c44e2ebe 04874ee9 21b46bc9 0dabdd86 02882806 91b75cac 80148c05 359669ea e672a127 7897ef6e bc82f985 dd0ce6f2 e14f2e1c 8d7d42fc +12934782 e77dee86 11dd3cee 3e2cd5c5 a355f554 8938d862 f2472577 9464afa6 170331cc b0e98774 81b8d025 2d95eca2 f2d4ee2e c70a863d cf5f9ba6 16f2a257 f3ce0a39 +118248 baaef122 7ab607c6 24a125d1 238379cd 28306e71 97182409 e8c0df0d c85387b2 7ecee867 43873f6e 3ffd6799 1152546c 996a0d4c 5e143584 0151ef43 0db66aed +6375792 d36fa197 a73b7ca9 a25c8ebf 95bc03b6 b4071b44 99bd6c31 679d38a8 40ddcd43 b0f6b265 a307bc75 4206595d cc086749 d026cb73 02fd4a61 5d80a496 8c511fc1 +5353209 bfc7a795 f0a080c9 0c311d95 7f736364 5c810b05 721cbf90 eddf4b00 fe924ded 425a1266 20e940cc 83de9144 88dfca7a 9033b83e 01eb30ab e2814610 635938c4 +1245134 b5cbe7f7 90eb80c0 fa563ce2 d908ae5a 42ff511a 2960f015 fed56aab c539bd1a 9c3a2983 aca15dae f70cb1f0 84836fd1 b6a67d5d a4e68e29 afb352de ceb7e8d0 +13637186 e2dedb70 ca746767 ad0915fd 46049461 0ca6e5de 97aba023 bd61184a 680249dd 17e6b67d 5cfe6f6a 29240992 bcefdf63 f198b064 1b74553c 9d70af73 c8937067 +693169 7e1c5dc9 3737b36c 3f8cc8a7 3c7f342d 1478f2b8 d180abbe 1ec5d3f0 c137d6d5 f2003f82 2f01a9a0 697816fe 61e457c4 68106b02 945fdba5 c9d07f6e 8e81a0a2 +5462189 d129beab ec52e29b 2e6dfd3a 14354388 df314a96 c8670892 2aeb63df 6ac9965a eb441ad0 26ae8970 6652abde a3bcb1aa 76d8b051 d72872cd e9071d88 0e6f2bf7 +190621 2e12b46a 5ba2e5cf 6ca813dc 4767d713 c1f2f81d a8fc4455 bfddf7dd 747540e6 ac93a667 8b94debe 33203cbc 62ccab1a 10af57f8 26d88cbc 75bb320b f57fd3fc +4282949 19b0d986 b0ba9ef2 73278a77 f37785cd 25bc164f 76886443 f820f86a 69a87087 2de6dfe5 e14fdb53 d7bb251e dc264852 4b551c31 233f6692 83cd3b65 067a7335 +1969232 bda5965b 705af33a 933b944e da9d5b65 abb86ab1 47797eb7 d12ce2ab 46587be8 67149f52 3f67cf8a dfb42357 0ef36b79 9d5f7584 cb8fbfb9 eb53b9e1 58d2b53e +5262116 3f37f464 d8b5f2cf 4d6f14b4 d44d640b b668054f 7f24eb29 c95f1a60 97bc631c 5c64d702 db3bbd87 28aed7dc 31ac0197 26273b18 9b3eb92e ed0f13ef a44060c1 +7210930 49a287bb 8a9c5279 365068c6 03dd4af0 f319fb81 e638d42e df3fdd97 6b250299 942dcfc7 3eddd09a ed40046b 3deccb13 f8fbd661 ce215290 bb9db2cd ef8d1d5a +12044263 41034f8b 7621fb23 888b8e6b 100541b8 7463c405 fdfdb6e4 3d7e9121 ea75d8a4 4436256d 42edc66b 5915eb4c dc94df40 eade7a6c 6fc91e58 01eb5dde 67469ee2 +10288886 d1dbc3dd 9a844ea7 ef1bdb8c 9a7b86c5 8171f64e 582ca589 10129846 baa51190 03c12e36 9673a12f 1a47c173 e444e017 fc776bda f21bb6db a93070de 3377d937 +2134711 7662a9f0 0c61e9fd 730ee10e e0df8227 bb356b1f 8f7d20a8 bdacb0e2 76f717c9 87b24b95 d1660bb0 9d30fa8d 17b42d1e 9efb6bfb 1d56858d b322f133 b1bdf9fe +1308373 3465d908 24b05b9d 41fd9d41 33842749 c4f0ccc0 94492a10 e811475a deb23b07 6fa015ab f27ba9df 4091e749 c8a171bc 7fa31b63 7d1e1e0f faa19dd4 151e42e9 +10065335 558481d8 09365b12 64999075 0bbb7536 07415a46 7d09f893 d4cf6d4a c1dab0d6 e1ad86d1 417ae191 7419b50e cd838d18 eef010d7 0839fe9e c6bd7f8d b11ac01d +1655927 4260fe5b 0ee6a6e3 bc52e9e8 57f5827e 2583459e 0e915ab0 f511b51e 3730e081 9f4b21fd 2ca86e59 ce5babde 05c6e8db 22b1cddd b254fdb3 66fb5709 3d9c8e9c +8949506 6002d1e9 42d1bf7b 495c7267 d69c5f70 ef58f0bf 43ef9f11 ca29d085 b456abab 7b4884df c78165bc 0bf28e95 c1ebf0b4 ca6d4d54 3c86d88e 103de883 3e5d09b3 +1560254 1031fe3d 32d6b04b 4083fb00 8411fca2 c59a38c8 68cba62d 0bef7ef2 f6166a0a 1589cdac ac255131 b3114dad 000292d3 2bbf7bf5 f5511261 8a9653f6 058bb5d4 +1683681 d951cd7f 93f46d70 5f9b4edc 987cdeb1 ee1adc9c 70e451bf 6a2fa5b3 86c57cc7 8ec612a4 47902c49 c8e3b84b 668e5f3f 3afbb9a8 3994b976 1eb93fb6 b9d49596 +10700127 f5ee5014 edf95357 8455b0c6 dcb139b4 6f74fb5a fe6f7cda e069124d 798f5694 f008da68 3c2dac43 40ace42f e7f99296 1be363a0 4a8aacd2 7e23db66 d4e33bc4 +15641594 a647d04e 1d48cb01 397f3d1b 89e1a44b ce846064 d972dfb9 f3b7a788 c90bd2db 42a8ec19 82cb190b 783f4a76 d0765571 5c554744 052fb86e a774c915 c2af1184 +7978752 3fb5742a 80962df2 69736978 5bc8e6cb d21220d0 8ae37efb b2631a88 a9d3bd07 7147bb72 610d9c51 51ef2fee 893dd03e eb02d0bd f3cdaab4 2ab296cb 85e04058 +11834484 d9ea95b6 ffd92776 92ee18db 31630185 c913267a 217252f2 57442f5e 9eea4c9a cdd5659a 1a97121a dd741430 586f4158 2fba5763 58940944 a96618b4 8b735208 +9530780 a19f42fd 8c96c329 83ac44ce 5f480516 628c4e3a be41aee1 325ac357 7e8b63da 6c3b96ad f17d6275 5d1a1d7a 664518aa eb96ad63 90cd6386 e98bdfb9 246748a9 +6747324 d8e0ecc7 28b71b2a 08a18e7d 9a7da4cc 101b7401 62299b6a 9b1deed8 40a87eb1 61b4ec74 8c0ed804 fe6baa6e ae50f077 f31a295d 02d2488b 9443055d b4083143 +14559499 63cf0afb a09f6fe1 3bdcdf1e e52239ae 7a011e35 2f4634a2 f3be0639 2d82b2b7 072b349a ccd5891e 2770a630 5e5ee4db d60788d1 b1f96fc1 321720ff 204231d0 +15010220 a537e6e8 244e7f9f 4a010fa2 49383e5e 43e60549 de2b8980 900c460e 4a07ce8e f54b7162 49de7acf 4a92d5e5 b0a40c18 f37d6531 33bbf02e 3b772740 e4d491ed +1598693 0f9e4005 0041dbd4 b59c2d34 6a040f1e 58f1fbe9 56d6e0c8 8d98df1f 982818ff e4c38fd9 d598ccc5 d1d37a56 f9072184 080be4f9 c0ccd951 6998edd7 5cda88e2 +412506 b24467cb d4a5331b c5500522 1e3acf78 5d8b6b0e d5e05195 e679a9a2 f97aa2df ae0b4203 36e7ffa8 ddbf99ba ce1d3d7d c8ccf8f0 e50e2dcb ea4560ed c78813e8 +15247877 7f97bf98 75782b28 ea1a3e4b 6501e35f fbc4c309 1322806e 62958a22 11d040a5 115e5d02 6f0c6f38 911bb03b 35fef76a a93f1dec 8e1650d6 17d1c769 0502f9c6 +16333525 c3dcc096 ab38e8a6 9abe81b0 68a5a42a 7a66f62a 8926d330 f2d4b4d8 8201925a 8debb6b4 160c7a41 cc875afa f2461f44 e40cb5da 539895bf 2a359283 6f1b0c32 +15259644 e97cd114 d9136c5e 57e1af00 dd61f594 417f93d4 8ee380ff bc022ecc eef21de6 3d3f39be 913a147e c73a2413 af77326f 393c4e6d e4ceca52 fe3715a6 0359a9b8 +2814052 c11ea0de b74dcaea 6d0bfdf0 5ae0f3bf 9627cb89 26225f36 8e36f085 04ab4977 b79e6f4e 5c31b2f3 a290c78f 9724087b e658e022 1fdd2098 025eded7 c908b0df +4166140 e6405334 4b18f50e d47fc65f 857f5447 e726c384 d5b39cf9 792240b0 807a3fce 080439c2 3937fa85 947c5c62 70cec5ef 7b41ce4f 8e7e680c 7731fc46 6d2c4e41 +15678561 fb2ea74b 488fa991 f611e95a 7ee4c798 24013e53 ff3759f2 39bc2697 75dde190 992a0453 61d57dc4 5d52aa9e 0ef33c0f c6cc972b 514872bb 7e280a4c 3adc7fb2 +15228992 097a3086 5e6b56ba 2e9586da 7f2a6c5d 461dddb9 aae7df0f d13a026c 89e06684 92a21398 66ca1014 5a8d718f 2e54347e 6f13c53d 4e2e726d 65b589fb 7d37dcf0 +6840839 d5b462b4 4a0762cb 09e081a7 870b740f b44b8526 36335394 901990e6 fa856eab fb5ed8ec 362840cd f265e7b5 883cc13b a115091a da742620 2335b0b0 5171c715 +1116275 70d0fdfe 8990b815 e41bb7bc 071221c5 50bce589 3a75e3a0 03e62cdd e84bdc75 722f34a9 7be2aec9 488fbffc d7ab1fd8 34690195 f9ef7baa 4766eb2a 8d2334f2 +8206710 6b15e549 ccba575a 41e54932 f773fee4 bf4f9f56 dc15182a 34097540 4de0c0f5 cb7d07e8 3caa3a6e 16691ed1 17665572 fcb35765 69e2fcd8 fab6c376 898b6f7a +8794176 9d4bd124 cf74e493 d48f32f2 8166622e c3a08cd3 057d9661 92be8201 0102b6eb 218c2255 59922b9d c52166dc a2a49f4d d85cb1d1 a50aa5b2 5264cc51 9c7029d4 +7861486 cee3de87 84dbbbab 88b98520 ad6616ef 90aee60d b4a30040 873c9d63 080e747c d3f0969f 3da31239 afb3658b 2fc864a6 a399a1b8 a5fe86ab 5b428c8a 71e0da8c +7461881 7c8bff73 e5a8c264 e7f43392 8c4d529c 91edcff1 48864b44 8a5e68e0 98cf0d33 4c86be3d e7bb0ce5 cdae7c34 d2161a07 974c3e77 effff818 e4389c1f 025d1a6e +11523915 2fcd42b9 70ba369a 471554ea 1216f233 99f14190 d34c8d7e b14dd8a6 153cc02e 402043c7 6679682d 5b577acb 91fe9998 f4b4d29c a63c32b0 14356441 cdb2a77d +2186272 208ce012 95d8546e d6e9b726 65327ee9 a61d6f8f c1fc387d c09b51cc 7d0282ca 6b683759 14cead31 e2d30379 4d840334 7a6151c8 b1bd41ee b6514009 8ebcd2a3 +346695 775a0b05 22eff000 cdc348a8 f38f75ad d0b7779d 5e118442 5502da12 bcf69b28 7579c5fe 4ff0e0d1 164e5d21 38f00d02 c69deeb4 40d7b424 8c1aedcc e9b36515 +8405098 6f200647 189f6e4b 8a1b78d5 a3e3ebbc 868099dc 041a7382 64b3f706 7db63f83 82a1d558 3d239b82 354770b9 8859c8ef dd1c4f90 674102bb 4836dab2 32aa7e84 +2526652 ac6694bf 00d0d9af 36803ea1 f8fde0e9 94e90c15 43d93cda 0badd1b5 436d1a93 a692c7f9 033e756e f4adcced 2cb5a920 5d9a8e58 934c4075 939f61ab 9700a665 +6495027 975420cf 49241730 82dd82a6 00a80095 53298898 945a2a1b 0d4f4587 b8c008be 0bc97d7d 141f72db 4e946fc8 dc91d56b ae24ddda 1656714c df6cd1b3 03ed225d +11204020 aed8fe6b 838d9c38 648086e9 6d6f8b1a 968abea0 a920cebf 4d3f7dfc 1ff2ddc7 7d8e0c8f fac0dd7a c5845fe0 aa4b8648 93b455a7 ffd26667 06065ddd b79dd5ef +12687401 9f4100b8 0dbd097f 5bbedff8 85c5298e 6821c3a0 4be5aee9 f78b774b 5aad49d5 4dd1a388 95e7e832 6c9a5d78 ac79bc32 0106c9db 5fc3ae10 fce7adab 8926da37 +12751593 26d44192 4b7a6848 ddd03025 eda078fe 6ba0ad5e e5207f86 2bb7721c 0fab811d a04d37c8 89319bf3 d5e87e43 35b48830 e8d068d0 e9659cca db937620 c011bc32 +900214 35c3aa25 a94b3980 91b8dec3 c649130a 2048f8a7 e6b80253 d859250b 24e27f8d 53f29a17 48fe1e97 82d59790 dd69d8b9 8ba2f901 a624fdf0 3b53e655 13ae0db0 +8256952 a905e881 67b23bef bd3d1fa6 50473c54 55e8ea10 7f3f08b4 55b9371f 66c03b05 c36dbddc fa3e9576 0a121b3c d488342e ba39d7b6 117ab9e5 667872da a4be6e69 +12111134 208f92bf 333b0c3c d86195b8 f06d9024 22d8a503 afc244ab 5e04f7d3 70ddc7e2 a7ef3363 2659e23d 49915a03 bc18cf97 e75aa922 77e5e904 653393e8 89d1c91c +5115617 bfbe93ca 59a6f65e b7f3a752 bd3e9134 f1196f88 79154b3e f123f9a0 459f8ee7 888fcae4 6e99ae64 4eb9de78 ec94841a 8c478b99 f07bf29a 96a60e1c 7411f262 +1910849 5dbe3f67 b5078e2d 99a6f9a5 4e9d4ae5 2271195e 6f3e7dba 4b7f2e9f d4796830 56c6c31c 78ed58e2 6038f355 568caccd 44fb2d8a 7d368dd7 2cf17716 993c65bb +9041805 efe597a7 fcc6a412 d3dea15f b4383383 f3a4bd40 3bd288de a155ee68 a156db6f d0767c9d ca4ed6e1 87ff0fab 37f0f6f3 5fa15698 9fbed33c a6ed718c f54d0e58 +14386226 b1a17601 da22fc3f 80e3c32f 44b6a480 179a273d 8956d84b 931b85e1 fab24b46 6255ff81 7e607780 8d87aec8 ff6ff029 92205382 b15fc689 f7a67f9b 951bde78 +1897854 925ae89b b9ef963a 1284f1f1 dbfc3809 e93768a1 f114f791 685cbb86 45c013c9 d1fe2eed f3cfa786 97978f8a ad386614 90b16ebd e0b444bc 1aad403a 33a8c3f9 diff --git a/proto-newpow/state-dataset/results/gpu/items_sd1.txt b/proto-newpow/state-dataset/results/gpu/items_sd1.txt new file mode 100644 index 000000000..a2c338510 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/items_sd1.txt @@ -0,0 +1,1026 @@ +mode sd1 +nitems 1024 +1308209 fdfd4c1f 3c1a3a2f 162277ca f4603bc2 4fab6d99 0464213c 4f60557f 2acf799e 1594f73e 6d9ea981 854415c9 a7d2c370 cbb1d1f3 060e02a3 417531bf 5e018c92 +4552145 d38bd5bf 884078c8 b63bf083 f744ab71 8062d4a5 d1219d60 b02d350f abb34be7 4c298354 0c6bbef6 4b4131fc e4971a07 49d22438 749c6996 522d52c6 cd6f746d +12987338 37819e66 ec0ab006 8c61213a 67252207 5b8cca74 b22b5187 50c2e37c a1a9a6af c6106be6 1df0b8c1 138b09c8 f1245004 28a677ef 88048032 bb5b0aef 13b2a020 +9027470 8dbc8403 cc319af8 b5cb28f1 2341efe4 0c2ded63 59925b88 162019f9 7d3bcd3e eec111c8 75f72981 d420ddbc 48cb39c1 35ad3890 e92a1552 bf885225 ad9ddee1 +14001729 7ba9b315 5387dad3 cd5d60d5 e1347887 e2700ff1 32aa3594 7dbf8d89 b1d73496 23661a3a e5803e75 b16333d7 e570cb4a f1cb0c06 cd530654 e6c5d555 0cad3e06 +5094079 24c5af22 c628d82f 8f45df71 c155b2a2 e7e693ca a2a79ce4 19810300 5d05830d c40285c8 89413b6a 1f944531 d68ed300 c8a8c32b 441a33d2 1f80c5d5 0488cc6b +11481792 6cfb36fd d931b5ec 376c54ce ba6b86a9 dae64147 be794104 a09940a7 a0a5f759 ce7b8a42 142c28d9 d3d12113 8ffebb52 30a0296e 65b8605a b16ceb8f 5a6ecb7b +9883186 a6b24be9 ff66b75b 382496a9 59edaf71 da4d8a7c cf923d94 dd39c162 8cca7198 65a13d5f ccd97b60 385c01ef 9319bc57 2eb9ae87 b4705c48 9824e855 ccaed3f3 +5522740 25523e47 f6a4d3d0 706297fd bfdfb116 a0a61c75 a29617ec b9da1eef 8ca9e32e dcfd32fd f757532e 4d3d0329 09abdb34 9f3e9b13 c64da9e0 0d27b13f fa60327b +16734959 fbf5cf9f b92f9355 0154e8c4 d5466958 925712d8 5d925bfe 14fd3b59 1696bbaf cf75753d d396bec7 56588d83 7a14bc12 bb240984 5de16109 463d410d c9a39a53 +8919515 986df5b8 90cfb1a6 33be827c 95a4624e fd4de02f 9715f87e a71846a7 5100539b 56404748 2e3ec78f 621b9c3d 3a74db97 b936ecc9 be128884 396e9e65 1df7d21e +10635154 1c252baa 3e325a0f 938a9d01 82cb7264 fc5a494a cce973f7 4cd7158a 240280f0 deeb332a b540b28b bb4321d0 e6118e12 de3e2ac7 8cd4a77f 1dfe5378 536877df +16144246 339dcf34 3b3e0553 95f244e3 1cad4f76 8035957c 02b3e910 d06a81b2 824e32b1 6c7f198d 2b306cba 00ea80c0 3a26ea6b 1b0e5a66 131b4529 2ca3ad37 6249fc81 +8950859 832d20d6 1569d48d fbcfdf4e 337ca7a8 6e8d6013 dcca6276 12e77f6f b8474a7a 5e9429ad 137f5a88 06626d18 894501c7 26699912 9c0c26d2 b8379def a0875377 +4502286 cda31185 4e68dc45 8c84a1e6 390b7fe1 f9dd4c43 ba730a99 33e4ddbc d14fec9a 65c27636 0987b8ff a88f6989 a1242005 4ba9eb05 ba9be0ad ca0b4042 fb55531a +9575818 eb943dbc 583983e2 6f955406 9439bef5 575852d9 e40f6303 f46b61b2 b9738bca 4034d242 63b25de8 6898ef43 5e092be5 ea2d3d72 0289f72e dbd8e603 68a2cdd1 +1850167 ffdc6a08 f38b3049 bb4f16ce e44eae7f e6deb6f8 81041149 640ec505 cd8415d1 7182d807 fe9f473d 607edeb0 29da3820 a56d1ca3 319b04de b8fa1b71 119e8d04 +3986562 ae83cef6 f608d803 f0e775f5 65390cf6 7890a9c8 9470cac3 0195268a 0a9b067b 5c5e6119 21b0d512 c5f4b53e 156cb320 32617b72 842e00e2 df02f97a ab7ac94d +4059249 bafab24f 8608c297 779280af fe74cc42 726e00fa a930b661 8cac216a 7516c24c 922624a9 6cbf281b 67214cde 3dd9b431 41e56a72 f0c4368a bbef52fa bdb9aff8 +13040904 a0e90dbd 583b645e 005b25b6 05c2d12e f8df175a 77c6fc26 ba595f53 f5428690 bd77afc6 a4c9ef6d fd2833a2 8fc5a743 6866bd39 f20b896b d81da166 556fd7c2 +3094921 25639813 8f399aed 806b623e ab976184 0efe3adc 39438c34 69a48733 ca047a14 7e592c1f aff93db6 ccaf4d9b e8a660be c17bbace 9ad85e52 01c61798 ca36b3db +7898561 93d2f864 ae5ecd0a c5ff6ce7 7c408b6b ff149f75 0b03ea4e 250436b7 caff1c2c 9da46520 ebb037fb 247bc81a a835bc40 a7ec1a2e 67056eac 72fcf591 55ee838d +11737453 f04c47f6 8306263e b2d928e8 88dc97e8 7b2009e8 78e05e79 dd64a12f c2274a88 32b38e7c c7ae84c9 86b2122f 12cf8185 1d1c1298 7014882c 32c8de3c c171af8b +9189220 eee99b8f cd2e9e60 6b502912 ab89eaa3 d6e94636 98740658 2fa2819b 5a601875 03200a28 4fccec6b 7b8bffa2 d0d28bff df6558fe 2559b02e 08bf48be 780f68af +9117437 7feb204e 52b44a8c c1c51320 5e901770 84bf40ae fb255f21 265ca60c 0c2cde88 7e233a47 b254c0e4 49ce035b dd775653 aa9410b2 55c33384 9f9d1f20 d01ff3c5 +13500785 49f6ed05 9fef1298 2a5d8e71 061a69e9 e8112a0d 91093dff 90ac4017 198b5915 cae73025 190f96cf 3f9ae680 d8aa8c50 5fe86da0 5d26dbf9 ace67c8c 12b12344 +12742882 be93b640 a83e8b8e 83f07ec0 eb134a99 cff37e2b e725aef2 810d9dcc 070f5509 78bea24a 856b19e2 dfda566f d8b796ba 9b9395a8 8ac43999 9eebcccd e025b879 +4903252 4e33bbbe 1d8cfb49 c1314166 9bc12a4f 0470fac9 b9e94865 91b5c1c1 3c848188 9a2cc8e5 d3935cbf caadf018 d2b32963 2caa2d6b 79a1d056 9a0d8f2e 62ea4553 +7287670 75b3a31b 85602205 2e74e8c9 1d4fee1f 954c338c 206b678c 605adc03 2fdb2e7d 33ced6d4 4c8a760b bb1b691c 15abea45 cab6a6be f0423c9b 4656a07d 5b17ec10 +9352291 6bb1495d 07be4a23 76e28ceb 25964f52 4cb55c86 c0f983cc cc002784 625dc8ba 2802fc56 35d6fbe1 c835d3c1 081b7986 86bde055 903e7b62 a9175680 2b43648e +2831278 34b27996 73f5527b 46e90fb9 2f2e238b 32d3d6cd bb151bd9 214a9530 412fd2a4 cb1575d7 fd41cc8d f607f66b b58f85cc ea75f93b c18744ce af17523d 0d235d99 +12584602 fcd56d5e 841b5b33 deb05fc0 aaae11a3 f2e60014 13ad9ce2 52d2e8d1 b34e7363 9ead76b4 2dc98ac8 a2659617 4fda1ea1 ebdd3d2b 295e2074 92e7ac79 8f48e430 +6669777 0b925f58 4e5c42ea 64827bce 59cc51a8 68848abc 6b2a927c cdc16469 5d495e6b b60466cf 700af34f 3c705dd3 a9ef28ce 31373f0a f5efc093 78eeddc4 58d601c0 +10054797 855ee604 d5aa01df b149de8f f916e5fc 8eec9be9 92a166fa 92ae415e d01fc538 5816bc77 968738c6 5b1a8b58 ef570041 dd3f5e43 8e310364 a8065f3d 07cb5e52 +6649998 2551ab4d fc9eec97 14bdc830 ed3df991 eae4f72e 7a0abc48 e151f266 661d0142 7871c4b5 27174c30 58b9e8f2 cd8d5965 6b1b35eb 36546bae ab29584a 28563d6f +15220717 adcd9e6a 741c4ea6 bbf13d3b 9d9f911f 3d94bcf1 1a38b66d b267a0af 730cf972 f93ca13f b7038b20 0d0fa0b7 d2e1e52e 05cb4238 b1c8830b e9fe357a 0ce0f07e +3381179 ed9ab0cf de8b79bc 9a2094ac 7a167b4e e9449975 993d444d b464edd9 3cf15986 adf74aa3 8323c02c f9b9480c 5034a4ba b41bcd20 1f62bc05 e35b0e8a d3a24415 +11560265 bbbb0348 f7d29739 12f6df71 ecc96c9e 3238e203 759fa64b d869d10c affd0d3b 08aab13e ad4e23b7 8eb4393d 57afcd76 8790b06f 618b3edd 441b4bd0 9a0b3e50 +1548514 eddeaa62 0fc88c81 20b81922 563967e1 2dd92285 e34b88bf e7296ab9 dcc8db14 de2d142f 7d73e8e9 e14e34e1 df29e54c 24e70265 817cba8b df25edb6 add238cc +771316 4ac8a0a6 62543979 74620313 38805f17 cec23803 6649c2e0 c9b2ef0b 0709ad0e a29b11f5 c629d0f3 ef925df1 1b8767dd d038d659 e26ede77 d861bcea 2d6eb7ca +5195814 22373dc2 9ef192a6 f00b9804 8aff52f3 d1deeca9 aa6c99a2 b4a42708 e367f423 27f83c8b 0a49854f 87d38b78 ce91d307 a1e42c94 f5ea79a0 26109f87 4b35fc18 +7374727 94fcaa6c aad1a82d a05ce119 a5370991 11aeb5a0 80187fc7 8cd4e50a ad44d709 aa1c32cf 3ca7cc16 a265bfa5 dd0d6113 5ba0bbfb 519fc121 afe48ff3 2a7a6dba +6028178 563b42da 771a3110 775b134f c1862e43 0a3fe6a5 021db8b5 f7251cae 86a29fb1 67c94930 de4aed3c d927ae1c 953546f7 73590016 a1169031 ded70085 294331de +8357875 dfad58b7 bd56ad97 780b69e6 940e9cbd e94a6760 5d57b3ab ce869eb4 43d0f7ed ab4ed549 304950bd eae4d2e8 728f971f 7a6a466f e3480aca 7e249acd 8cb26ac6 +12310424 b3512bee cceba886 dc8ac53d 3ddb434d 5138f715 caf1b57f 2ebdc592 a79f8630 5a6b16c6 129eee13 59c9d9cb 7efb2f07 69558b00 b4a1426b 5821f2f2 501c0eff +13253444 59858941 624b5b50 d8afa4e8 22285a6c 22a66dbc 95179ca8 524db19f c06f316e 621a7e06 67b67064 44670bff cbbe22da 88c7af00 4468e771 a4db3675 9a9eeae7 +16208941 7b462209 b03c915c ac0ed866 565291c0 fbe01a97 19e013ff cb5296b4 8b169e53 e1693ea8 8986d3b7 caa51c3a c28a03b7 f3c657d5 7bea6ad5 0a37b7f9 51a67d6c +16044714 21a67ade 60cda058 f494ef8f e28f828c 88ffe5e3 cbe2a27e 5cf3ccc0 b0bc083f b21f83e8 546c2d82 93701ff1 c69f0cad a13ba490 021e75a6 eb7fce7f 3950932e +11193701 7ee17a65 e3344acd dacd7447 402f31dc aae2f6e0 72194c47 4edcfbdf c676b17d 38fdbc82 bc84b5f8 3db13f9d 3312d5b5 bc836348 7cf063bf 21c492ee c70c74a8 +13945543 13c49a3e ef3e2e0f fb275c44 2c67a004 aaf94a59 3928c7e6 76a6325c 7ac33b5a 2c326521 aba0fb13 f3bacdf9 9d12847e 73f8f228 924e1d4c 03370350 d7423bc5 +906631 3fcb3883 2d70f76d ad7839b8 a11363d7 b712ba9f 4aeb2eb8 1eddba6e 894435ec 9a897e77 e57018ba a55c380a 0ed47db2 87a0124e c7eac496 ffa1205c 629972db +11769370 ed26c0e8 c6252799 75224fd7 0d9e09c5 3aef71a6 d09290a1 7dc64bf1 deeb9ea8 9a8d787a f0ad6fb1 bba78ca8 c8342dbb 5f7d92e6 a9630809 55c34b51 4ab27e9a +15061385 327d9986 5f3f296f 11d65fca d483d8c4 0cc079e3 ea5c4b4e c5e3a2a9 a80b8576 7666858e 1d5786d2 323ca453 afe242b1 1b658c6e a3542fa0 6adaacff e3bcff54 +6018395 95e30508 11cbef3a 7b4f84d8 9d16027e ae857fbd fd6cd243 1578e464 f5e65b0d 4a0a2225 bf9db101 209e7555 f9d757db 56623ef9 68e1bb6d 6e842e6d 3f4dfc21 +15776046 9fd6a37d c1fe206a 93628ef5 58706fa6 7a51d3a7 ffe52f73 07f1a816 e82943d5 30aeeaca 56b691cc 1a988790 ad520dd5 c8c74f2f bb4bd16b 977bae4e dd11de0c +4189668 516b35bd 4418ea6c bb03a587 186b7b1e 13a4b0e8 87966756 27f0927b a41d616d a0f66fcc f3b1be12 b2e3284a afa9a4f9 d53847e6 4d839b97 e06a09de fa9d4cce +11798046 05465e34 92049ddf c78ee846 2fff4b47 6cfdca86 71ca5133 c19587a5 c2878f44 923ab030 79453f6e b7a30959 9c52ea94 cd416e16 ef60491e 1119d3d4 6331f015 +11328552 7bc7d816 e0891cd2 3e56e053 dbe391e1 23a10afe 4b22540b cffcfd01 1191e024 3b5baaeb 3eea6408 b53a0163 be5de57a b1e4b1e6 3c6b1d0c 711d4458 3492b845 +11248753 38f9c576 b7e495cd 3adeef31 4a075f64 1a414ade 29ef3642 e0650a38 b74e9e1f a3f2f467 5ade1503 32630992 fa0839d8 868c7cdb a5eced7c 0bcb3f75 02b1f372 +9580634 0a1bbbda 1bc36f78 8ff37fb9 fc6a2c90 fb71ec1a 49118f60 702c2221 9b451b7e f37308e9 dd3ee450 99215d9b 61f9b7c2 9d763919 88dd266b eb58b295 8401b060 +11167137 b2779b0c 6ec71efb 4c5bcd04 35d3e451 71ee3c5b 9d2a47da 92623ead 2223ad11 78604a94 e9b6e191 d448caa6 128fc26e b088ec08 b2cc1b3e a4c74110 7c9571c5 +6369126 39ddbdda fdd5a282 2dddb25c 91496b55 b72e09d5 41a966ca 0905a166 51c25575 f542d69c fb7a230e 47e468aa c0048c8d 8f1a13cf f4514430 cb4f5962 00f4c0fa +10640826 e88894a0 f4663bbd be7eb462 f61740d2 137c199e 883f914c 111d6381 d4bce29d 029fd965 373068cc cbdf29b1 c7a0ac3d 8c540fef b786d6a1 2ffc9f31 40cf36d9 +2731241 b101b3ac a0748168 0787400b 9b621cf8 21cb1181 beb76119 e914219a cce2442b 18da331f e32bf398 7805e36a bdbda11c 1e47db1d feb9c430 06466e78 4ddc2a32 +10154349 2df9f4e2 5eaef4f5 33a99f73 66740e59 f09d0c1b a862fffc d9723747 f9a48e67 74f01a9a b7df267f ee80510e 1488a957 7d9c0a85 a8aefd14 c4ea8d4d 78e4281a +11547318 507ee898 2d6c9aac 1b8b11f2 b3729bf2 5218f882 7b044b78 5c935878 b03767e4 47920c18 2b58af8f f61e01ad b28ea360 e0ec48a7 dbd8fd5a 942f2286 94d8d4d7 +13476419 b71a8d05 6811a90c 2255a288 c9ea9a14 39af34a2 68fc6b1d c1cf9a8e 38592796 37369efe 1cde3d8d dc239ce6 fea6f65a 0904e127 bae09d35 5380cf18 892c41ac +9855703 f653ba7f 4dd9c3a1 736cbd61 fa1685f8 e878a36d e4ffe45d e3a9265b be5bd713 4b7fb31f 2479c2de 5335c50f fac876e8 b37cff9b d50bbee7 b079380e a41548da +5862071 ed11446b 22a6d773 f12aaf67 a0b3aa69 71e32e69 dc19447a 2b3c170e b1b7e388 06bf91ef 948e62d6 6b60660c ee70717d 8d454774 6cd6f115 e16479c3 f450b497 +8582110 bc506eeb 33deaea2 9c7f5319 013da2f6 fdf76850 b021edbe 26337200 5452ec53 b47129ea 9ad2c520 b1e28fc8 9d0a4fa1 2fa928f3 1e4e2be1 25cd9e02 48fd8796 +8928101 ef294a01 a8d11a37 c5790575 08ad8abf c609e40a 46734f64 8a44b534 b07b6cf2 266f8dd5 e3001072 68b6caf5 09a318af 76efd6c0 4841ff65 1099c09c 15a2f4a8 +5691371 a55614c4 7a9d213c e2b9502f d3a4b67f 2ac23a00 975a8659 0a07125f c93f5ee9 f0561739 784db0ee 3d5ce6ea 8561a718 21fdac94 a6eb1f92 ad19dcaf 57d54142 +7311879 5b164017 37c94428 4c7b4173 502ebb34 a0829a33 e5227f8b 5ba5a698 5ef7eb8f e3a50826 6c4feb62 b5a81081 5e145f82 01148c7f 507ac844 4f37063d 5611af40 +15930901 a8700615 92fecec3 660ccfea e6b5fd78 baaa96cb 707bbc4f 6c967bff 375a50aa db03de64 4f66c748 4983070a 9c23a785 23df65be bef373c7 fdb5c1d5 eebc57c6 +1622608 5787ddbc ef7be35f de998f2a 1f5225c3 6483f70b eca172cd e9571a9c 72c4aa52 e1537a5a 7ad7537b b96b9131 53c96090 d0cab2f3 fedf4856 4e125c3b ea0aacf0 +6354746 f9f6c0f9 2441acfa 9999f442 fe22466e b81f9e5a cc1dda80 b1051fbc a1a99922 c93f24ba c9e7aa8f 1326503b df9f44d6 8f88c5d5 5df9cf45 570c0e1c cdb34fb8 +15786418 7a4c979f d9995d45 421a1011 b5779142 74734303 d2d6af2f 87811e6f 6ea1a378 5a4dd741 9e933d20 f5f7e205 dee64aa1 aa763a6f 621dfb20 29c0387c 5191523e +3468307 84eab946 4f115a1a 1e252b8b 81575a56 a23a43b0 3aa6f916 f8e83576 a5946820 b0517d17 79868066 0e6a0956 3a7a81a8 203b9639 a447f1ae 5fff1dea a357fbe4 +9751198 fe33bb99 3fb9b9ee 848091fc 91677025 e21a2e25 64d418ac bb8388db ad79f8df 2dfb81ff 279872fa c67f6926 0184e1d3 cd039405 d4816df3 c766afcb 0df6bfce +2870173 8cd6b6bc d3142f3d b4502b48 99301d96 4219738b 9b4e56ca 167e9315 d6a183ea f838e336 001ceff9 0382bc9d 8d9498ee 018607e9 c565a009 47c1175c 0aa431ec +9999666 f934142e 6ce4d1e7 351a8cc0 e4527346 bbf8321c a0644061 f77ca553 4e592e87 ebb7732c 2d511265 257c7ce7 5abf9bb1 b3e30815 16dbacbb eca4a0e6 da0c2807 +15686028 8c7390b8 8ce39ee4 fd3fab9c 7c168f11 02721789 fe331e6c 11a3a40c 9beef231 8a2353bb c5e46724 1b1ef69e 2c3d54b6 e4a0eb9f f69eff81 39596e48 a39abe57 +16265866 5196fc7b 6624c332 74a1ee3c 251c95b8 318ea5a7 749649a3 275e8419 c5f921fa 19098423 f892c69c fcc32ba1 478f4b6b 13e819ad 89a4a682 80ddc267 5f556761 +430445 8746f736 61a4bd61 9d1f138f 4ba0024f a19a0036 3e8618c5 3a3ff832 5eca35fe 2f7b8669 acfacfb0 1ac1fbdc 14b9461b 1506e8c1 6f72d9e4 0f4497bc 1945e160 +8747923 1eafcd2c 7f41b82a 41dbb135 47d381a0 b05236ee 58d1e4b7 6891344a b0e1359e 17b6c793 f106c33d 386df073 8fde84f6 5fe87684 dfad2dc1 156b2c9c 54f9ef98 +12687767 d1b524ce 930f3dbc 67fce0df 6e8a6557 6fe83fbb e0887446 1d4d8d49 ccfc9dbf fd7e58b5 67d48e6d a0697d0e 3554b223 9fa72304 39e587c9 65dbecc1 e8e6d600 +9168764 46dcfce7 02299bf8 6a409912 3c0152f3 3d381fad bbd935a2 3bc09c8d 499bcf22 b8aeee26 b34d4f3b 46a54a32 1afeee3f 753f078e 173e73ed 599598a3 f1ac868f +1356642 e7896f84 4721c8f8 4fca8096 83a0f9bd fea976bf caf54504 4eb3c1e5 0de75645 0b6d63ba 7069f075 3d2f73df 2953d1c1 14aac01a d646ee86 937c0b83 acaa231d +8058699 a4aa5fb0 0ed8c582 7fa3e9bd 82d87c29 284dcd7b 09a7f36d 7bf741a6 0c8f299a 734781ae 2f6075c1 49729e83 4fdaeaeb c0f63125 85a32e79 ab7f65bf d2a4f59a +4301349 424c8b6f 1e2e7ba0 f8508f77 3677ba73 fc3db2dd 2772eff3 73bddcad 2478b400 0c2344f7 8594331d 811df075 11b525e8 69e567d8 2c7c1f78 824a9b51 5d94e4bf +16417225 61664d56 347a0c7d f0e37467 969b6f4f 5df7091a 8414dc29 cfedd7d0 2710ce31 05bd21e4 c1064d59 84c15ed9 c9c06439 4344c9f5 d109ca17 7e55d750 52df5a8f +6451905 fe9f5231 57254b5b 948c9d6e 253fdbe3 53355783 08c00915 91f5013c f82b96ba 8190da0c 1a1f0d9a c15be6fb 5de5b2b9 6a55e821 602b4194 f58bf660 531f1f3d +178470 b77cdf49 cf8841dc 82b71651 94e3bb2e b0fb8720 7b589bf7 075029d0 adc210c1 8847bb1c 2704cd1b cf722186 1f54fe68 e246a80a 3d2322cc b5ab9254 53fc41e9 +4936549 73ca63f3 fc0b253c 2e887386 297e35d9 f201c1e8 bbb3ca72 cee15df6 e062f73f 8897d749 29f5d050 7fc3ed1b 516d6f17 306edf19 27ccb670 142f1a71 4ec9a4b2 +666916 a152b352 3ca791d4 792970f0 dfdee64e 198130d2 8f75f596 e64ac238 ecc65c37 101f7cee ec8821af 8a190c38 61d18f88 95a6e6de 0a630733 ec9c2acc 1fadc78d +9429138 e7e261bb dbdaff64 a650dc76 69ed8aa7 b0bdaab5 743d17b4 1c87e917 e8d1fbc1 62a373aa 1f971e98 f8d9c11d 548b48a0 b117cc58 5d631681 5f6621c2 b6411861 +11506731 26dd2e9a 3d5cd61e 0fe6c27a 7667e039 73d9eec2 f425300d 6093fe12 bb15bc51 59ddeb56 32fa3637 61f48a78 7ec158bd 90cc34b2 553632ee d94b9591 64bb8922 +3585634 9ef68fdc be783043 0bc3418c 6ab318fe be9ca577 f5c3b0d1 3f6d99c8 bac9712e f111ae9b 934e4f81 20fd1e2c ead19e87 05dfc55f ace18c2b e6a56a9c ad4a2996 +12689776 cb13680f 583e0813 04acc63a a42f25d4 8f7022a1 593bb40f 39c89e6a d26799ee b5907d76 8bbb8767 8b8ef926 05ea592c fed17724 8353b31e 5d43d4b9 fd56b4a3 +3054452 8b6663a0 1c5c6ae8 aed93483 088e0ec6 7361727e 9fd8b953 50cc9747 2ad8951f 646efac7 81117f4c b92b044b 4f3a08f2 2baf2191 e424e522 77c04070 76844a48 +1372763 9fd0da08 2349ac7e 39cc58f3 9465f2a4 abef6226 2542dbe8 5a1776b1 492d909f ee2bcb29 1bf549fb 3f61f011 1dbb801b 43082783 b732162d 811e698b adfe2f10 +147279 450105ed aaab418a 06de0ab2 f4c36106 e3913faf ea1d8789 282cedbc 18b85321 d768757b fe52ca10 800d511d 9608ee7e fd3ef07c 55733bd8 7fe16d44 72299723 +14769918 e8c79e3a 71ca9004 c810f0f9 1dc25864 cfbf1d5d 81bf37b4 a89b5880 41c9b963 251c0e45 00c4f431 cd45d477 28ed18fb 0a05f190 bd08b192 ed5d5db0 af071da1 +9132541 4ff87a9e 493bc3a2 d1993421 1ca24630 f1eea989 52a2b99a bbe89ed1 6ade7361 c58b216b 1831fb10 8afe6c29 d40f6eaf a2669431 d9df8b73 ed63460f 17b54242 +14519784 e7d2fa5e ba397b23 ff641164 baff0b18 8fda9b5a 73e13c83 b59ae6cd 7878d08f 9063951a afb46349 6bb44dda 2cd14c34 175f58ed f003c7b5 a6201bcb 310455d1 +2009212 012a383b bf726307 2c0352db 2854224e 3264c41c cde1f7dd 9502067b c98f1009 f4568d9c 30337fe2 9da6e577 8188ba35 44d57cb2 c08e09a5 8a32310f ba19c1cd +16057623 6a4e441b 5e748e1e 58e8ceb8 d2ddb969 b4dc3eff a7c6382e 987536be 3e3dfd84 f0c622a7 c19a5e9c b65a0e20 818189ad 0afe605d 6a7b81a6 e3652e06 04867f8a +704641 d25dc844 ea3f73a1 a490b1a6 b7766314 2bbf5106 3fca4cda 44cfe000 9eb33389 44e4ac55 6690a742 d07bd21a 29ef8e47 51c20a2e daef9ae1 000ab35d e09739e0 +2678960 1fcb0d30 90170569 88b3bf06 99ad8912 95da202f f5a40f1e e951d459 8f9176da 310502b0 8ef2ea17 8b343ce2 6f2fc1bc 60e15ee5 fa73f5b6 50f6378e 877fe856 +13288546 6ea99439 b8ecf617 5fcad40e 92876335 936fed05 fb137853 762b9d0b 188e56ed bddff3cf 19399c5a d79af6a5 e67789a6 2a228fe1 fca3b1ac 4cbbf3b6 b1b43d64 +11403523 7a8b75bd c6343bcc 6b204f37 f3b2a005 01544cd8 a43a34f5 19d4f19b c6ffd4b9 0397150c 365a9b3b 6e43b652 e6f4c0eb 91dfc2e5 dd001b0c df3d9eac 8ae8ec28 +4059049 da5d612d 2dd1a2ad 1d0bf736 50af05ce 3c87ca1d f700f5ab 1628dc60 54b36806 abdbca44 3145c4b3 ad2ca884 2761846a f3207178 a9e44f55 68e5c9ca 2dbb4806 +6260446 a73a1b90 22f425fe 3c6987a7 2950206c abed4003 0a74fd8b f786a398 f58c51ee efc73d22 fa5ae015 797a0442 dea15b6a db106fa0 2a41d41b 50ff1dd8 7d1331f2 +178756 797b89f9 fee2b576 ed1ce020 b653e5d3 d3b2eb6c fa9fa651 1a155698 01e0685c 15065e8c d51a20a1 53b7d840 5b6f577f b0b1066b f892bb37 6bc23c8e 9c4adc93 +16431780 8f01e504 17f2fb4a 040ac306 77f24624 6df0835c cb84e4b5 e844a51e 32e06969 b5404bd6 e934dd95 7ba9d5bc 77b8b194 82db8c9c 5555ac02 48852ece 0ee15b71 +8846999 f378b49c 36a53a3f ad1f8133 48471489 7fad8b7d a5f9c434 c633ea57 3c63468b 26db66f0 72bb4e74 656fc73f 99e66524 36c2fa10 bd3885e1 59f4d861 209a19cc +12562281 af92b765 8b74c884 f5a18a82 70b6e3a9 09817b0b aebe9048 1da4488e 7473ae9c d59be520 348ece49 cfb40bcf 2a994f30 dbb71c6e 3bfd5814 45280ff1 eb919a54 +4034815 611589c6 fbf86a44 b20d171d 791410e0 84d99976 4c86fb6d 2161df27 488775e2 f64618bb a81d489c 2e242bbd e406391d 8a576fd6 28e44a03 a2929662 46129bc5 +13760919 b4259a74 04a92aa1 fa540838 46cd6352 ba9207e9 1ca0d6b5 12f16ed7 bf01db78 1d6d741c 06dbdb8a 8a9fda08 3eba8aaf b4572635 35c11907 aa7da7da a5853067 +529086 7108df1a 142b19ed e9957cda c9bb8d56 b2b4f808 df39c69c 72949e66 34d84215 4621aa75 f618631e 099788c1 0c9e0fa2 f4edb836 3e257707 0b9b8a5e 05c87f52 +9588295 93039c73 d07d24f4 41879769 af2d6cfd 5561b5a7 b9984596 43c7f217 38c8a3ad 26872b58 509a9707 ded41323 0e454894 f0ac559f 92d1e3ee 97ac7f88 6e373312 +2776244 87f25c1d ece2b87a 8418fcae 896a8315 100a7fa2 b32870c8 eb4a013e 69692634 11fb2d9e 51eee3e5 057f07f4 66098521 688a5953 63bc30a8 26219937 b5618fa1 +4789500 2ff066ac d0f6191c 4d00e539 73e57f29 12e9daca 4c2f5c74 b28cd5b2 0aa9738e 2dd5214d 74977f6d 76bfce8e a38bb0d8 e7025eca cc8491fc dd8700b3 53485f79 +13709697 93e861fd 83274247 d1d884da fd445800 7721c8de 9b9712d3 5476883b 429c9f82 ef1c6ce7 72ce0f44 c823a467 7162a65e a800abed 035f525f 70c113b3 68f4684a +10668459 e3ec0691 2b2cc5c6 5ea744ce f137a3dc a8354bc4 ca099728 ac936b40 8a8ac155 6c5e46f8 101c7c13 089cce05 9b204da1 f7675792 d0a186dc 8e69bf5c 8a3fc11f +13150965 baca749e d289f057 8848f13b 26010bb2 1c310a44 7ec2c47b e60032e5 de9f4942 fce63ae9 cc89f5bf d041f879 1f3affaf 64668d3c 4a042e9e ccd1ca7c 2575173c +8027780 e1872371 9da2b9b8 70a3eeff 4e47554e 6b0377b2 5911ea7d 9c09288d 53097fbd 0f9c19e1 b315e5ba 85274586 58e10e07 6bf20bdd b8acba54 5d701696 2bf1b25e +16484416 9e1a874e 58e4a8ce c0c937f1 84c3bacc 2e7d5b14 403c41fb 9b15366b 4cdc2c11 5c4f2a1c 07431f0e 3a101fc8 efc8e9de 7ca7add2 b465e02f 2d1b5144 0eaed2c3 +2172727 f3281bd4 4c933887 2329e8bb d8a971f5 111a3c61 de04b79e 6d2f3d75 feb8add7 0355cb62 c0556cec 131c3d3d 29735279 97b0a709 65a4fd8d b710e4bf 1d1610fa +10761320 2b627b37 c82b1a35 47783aff e6427c92 da5fa3a2 75d2c04a fc787ebb ae68f062 d782946c 9e34ccf4 7c2574e7 14930d2f 360313f6 f51f8988 0088497b 91c413ce +3504607 ea67e862 57806677 f6a4adc8 8fc0137f 92eb7487 cfd69ee4 c026fce7 c885146e de936bd1 8edfc733 7ff51849 3683b665 0d0511c0 240b5fe4 5ba3d4e8 d7304f3e +6323880 50b7d686 5e6b6752 bef2f658 f4f0accb 95c665cd 639c89cc bcfb7c92 2a89fc5c 588ce96b c10611a9 626c933e 97b020d7 90bd6376 840019e4 a6d87be9 4de9d2c5 +6062352 4f0b63fc 663f2087 65869048 de714d4a b7ec45c2 6a237805 753cdaf4 135442a7 537bc26c 50d557f0 b391f2f9 46d76e98 38a4bfd1 699c45cb e68f93ea 66404997 +9770426 a5b264e5 8b6675f9 13b607ac 831a4f00 0fd56da2 92a6a13e 641ee8fd 8636dd76 0a7ebd7c b1528454 4e1c5e38 8fd7b176 025a78bd a507ff40 620bbdf6 128303b7 +5516775 2d2cab98 64b605a2 846ffb7b c7f4e923 293bb818 4ded679c cd56d3a1 24c0660e 6584ae2d 6874e4e7 d5496cb1 503acca0 c469cbe1 aad3834e 8dc10f7a f1111fd5 +14944095 785a20ba 416f3f63 76c6c177 22cba217 2794016f 7d183ed6 69c6c307 6540bdc7 3b84b591 6c5b71bd b138d37c 93ac29c3 30214a15 0a1bbf63 b80dfa29 3c385111 +6194481 e7ca4459 1274bbc9 8063bd53 8d761874 734f5753 845b11de 9586b0d7 ba62e725 56ff36ee b3d759f6 4f295720 1dcc9007 d1e1102f 6e69c2b7 daade525 559125ee +11762627 698051f4 b1d8a0d7 abddf500 c2c8b784 6a4be590 65d5cd7b 5ddfabd1 5e8585fe db1cf475 be6c0e19 8b4cb79f 760d8717 650eed26 7097d56c b8e30ab7 cadb60ad +2361319 65ccf661 f2a62e4c cb665c02 d06e6399 2f940f72 3098ba73 0fff6382 fad2d2e3 b4e85919 2a9bade3 b620d9cb abcaa679 4f955960 cd1cf487 f05055fd 55db6b59 +13735604 2a66ee97 3ea1b7f7 4e722b9f b56228e2 65dd1aaf 64be35cc 0aacf190 6600fe15 748a1851 237d9cc9 c37ddad9 5ec3801b e36a27c4 e321cc7a 0b2a44ea 6405fcda +6131961 031ac80a e5d45e5d 72447b5e 4833c82c 5a79021b 441c26a7 66f38a3f 12abd3ce 7ef82ef3 abfdd34d 9c7751f6 6b0ca290 f9a7e7c5 55ce5633 aa85cecd 7d407f9e +14838309 36c8e6fd b8ba7e4d 9c12e273 b06b33e4 595bd51d efea750c 937c6bdb 1e91db7e e64ccc1e 941d3423 056f4a3b 8e95f6a5 7b3bfd4b 65dc8b83 e7af41c8 abf502d2 +6220319 058a0a31 5f32985d 08dc4956 cf362ca7 cf9ba37d ee421b3a 6880edc7 38bf2c9a 320a1389 1c8d4752 c677354a 953d2fc4 e10196be 8788bed2 c7ba647a 721e2940 +4861263 a9cdf49c 58f9848f c5c00a3d f229ad7d 82f4fbc2 f3e63ae3 87a02fb3 86bfd79e ed7ba2ff f9d64ee5 f34fba53 38217733 9c75ecab 7aebb67e 338bfb6f 246e799e +9960080 6df329b0 719ab29c c454cacc 33405157 28d20614 532d9634 4f8a8d49 8c3d3370 96c32236 efba320b e0d081ea 5f5be987 726fb7dd 62e0b00b f3ffe565 6f54e5ce +5686162 24ea0a82 c9032bfb db267026 a140b2aa c20aaa8f e0cd73d0 ea669883 790a8a39 de1a199d fd30c9fe f49d7fb6 4f7ec050 4dd34c0d 049370ae 799d4ab8 faff2229 +9233113 af16c54a bbe20fa3 5361e83c 584367e6 9a5371ae b95ca2c1 b1ce1892 9eaac8b5 530f404d 1b5e5f89 8e5fd79a 3558e3ba d6dc9329 4a23e97b 064695e4 20a0fcf2 +216401 aa72cc82 f246236c adee8eea 7636eeec 5897d4bf d10a9344 aa8e10d8 2aa98127 ccf70b7f 6f3272e6 9bc919cc 79d44ee7 5541b3e5 781f65a0 70966d45 d66f5778 +240510 2d9345cc ebeb50af 54287f48 eaa6b74e 19af6bca 501c690c e4d7996f 00199b45 48a5cb63 3cfd1830 54ff2cfd c492c19c 18d717d3 647c6c80 60386be6 9b838c50 +13306429 deacffd1 198c94ce eb446b02 143fcbd8 17311e3d f94520e0 573c00ae 836d0163 6f8c607b 3b4ba985 cf259ba8 0c1f972a 27129e5c 175e940a 822eb4fa e1cc428f +16486885 b2d8623c 8465a043 c54c3666 e0273327 6b651abc 2fc4b685 d9cd87e7 14b69f57 71ce2452 e885adc1 234e6f18 18fdd3d4 98d6387a be0208ef 7e70069e 67fd8040 +7146183 0e3bf610 a80f250c ac5467b3 f6a966dc 66313e54 6b3bca88 f15123d5 a5202333 f95d32e8 b6cf6579 55add751 967631f4 92d56de9 26453c90 9102a4cd ec64c17e +4329617 a5a9141f 99b2e978 65f9eabe 1f04caf6 67b3d529 40ac3609 6b1a8280 6fca056c 307b4677 1c93a345 cb2a8561 858b910b 6bb23e8a c657fce2 b87aa1c0 52aed38e +3616895 5afbf877 430c2afa 5e3eb7f5 7267ca3b ada52bfd 78e08815 5f6977f9 9e7f13a6 4f986fba 25903bc3 83a58b07 d9d883e7 8c6447a4 5ba7d094 02a7864f ee91b71f +10924039 af7f9ee0 872ce580 4ef92fd6 fb118ebb fd8a5914 5afe1048 7e18b3f1 45e07e0e caa105cf 559233d2 7a5a38b2 3e26ad68 2d226eb9 1c730a15 1f15e603 3a1f59fa +978456 ff2487b6 862d5b46 653b77d7 fa51a138 55323dca fecd1a80 55763b15 9220b7d7 05479e1a 5ec7cfc8 bbafa7e6 8c052590 e1b10943 e4b9d266 b7310ce6 80bc1a6a +5605098 37531529 f678b8a4 c2c86968 d200833d 62e645c1 1b3a7aa8 334025d0 b0e34316 86a0ca95 df05098d 523c2a98 3cad14db ec6e2e93 f9e7e592 440ecab5 2286c213 +3312910 f2f837ba da8984d6 e84f59ef ef42c5bf 35379df5 6968d820 4dc0969c fe5a4d97 b7762ffc 006121d9 03d5ee87 147b22e4 4a8f5061 dea77c76 8927ba30 ef7b9285 +1580204 74ad88d1 1fd335e0 0da32e3f 2f0bce73 d9c66c35 e184f191 4f92bbca 9da8454d f7e1f1bf 8d4b6350 5c90be04 3aecc196 43629c43 78a33b79 894b6986 342147c1 +1761392 9172dfd4 0c743809 13d01b91 84ba2f59 8a5e83f3 15d2e048 b0336051 a3afea83 4720d6a6 2f634c46 7a00b2be e40907c9 411b36df 15609711 a51da3f7 086ba930 +11542620 0e5c0e1a 0be4cd2d c06e3b66 8fdbd0c3 ce670364 594b1333 928cf73c 98f78b6b 5cda2538 443979f1 e263d549 c0aedd53 a1489cd9 1ce7fa53 83f0060d 36f02e05 +10173491 7127f251 b11c02f7 64b4cc2f 72bbca1c e1cc316c cdf56ddf ee0ea5b4 39c0f8d4 f0cf133c ad5d5d64 03d9b581 d238afe4 8bb285e6 512924a9 acc0db45 aba448cd +10083286 4944f7ef 95b1e749 53110cb8 a0dd99f4 488145c2 653cc11f 0556f283 e4604edd 81ea2152 68aee485 9e3f3d17 6f666aa8 33178c70 d49474ae 6d3e9cf7 7ff75653 +983157 2aa16b7e c35bf414 c02ac437 65bac3a4 00fdadf2 3ee25970 e0f5523b 8fb1b840 5ee8a50f da33e492 7492bf13 8fbe2df1 a0bf7df9 b00f7bdc 85590cd7 a3b3d41f +10782698 7974bfe5 1d77a183 f13693d1 32e7ad90 2958c3c1 b82d7684 5a8b4fd3 2af0a735 8bb1a270 580d9380 931c050f e6cfe88b 5f5fe9d8 63712ef4 ae50dc16 b0384918 +203014 bbd83f07 67de8dd3 6b3f6307 fb593a0b eaf6fa69 00b91e08 a7411f48 41b037c7 701f9f0b ea463ddc 1c279a75 b694c844 0da68e0b 031883eb bc4ef493 f0914f88 +10722837 8b44d0a4 9b0e66f5 12235c83 795ba325 0fe13348 02341e53 4aaa9ce0 ac86630d 4712e631 d638ad1f 9dd2bf9e 3ad548e5 0fc4dcb6 9d140e9f 18f9efc6 9fa041ff +1285902 70104d6b b086b7d1 d9f0ad6c 9f85eb92 0cf5ca27 fff5249b 42ee4a1a e5b104a1 63f8c913 a29a69d4 65616a9a e784d0f9 5b0abe27 c806421f e86a9f22 5c5a6f73 +13046315 356fd297 3253dfac b5a4f5f7 6cf9868b f44b27cc d220253a 587a2004 e2a9e19b 84fdc987 c6ba9f25 0ac07672 d622181a 0f68ea0b a88937a8 f44884af 048b687e +11080294 55b926ee 10f0ee8d dea1d21e 6b8e07e4 906416eb 7b4c5346 bd811e3e 047cda92 e903201c ae1946bc e4570652 031a8568 ccfe66c5 c24b9b38 97a176e3 c8ab99b2 +9514006 3295a6ce 016a3846 48b4bdf8 fe397cd1 e268b01d 663adf98 eeae59a0 1effea7c 13460713 634ac161 e9941620 314bd0ae ad4d4f35 61211847 722896c7 607baef0 +5309452 49d876c0 3ca82db5 63dee82b 128499bd 9c9e3514 02be100e a9fc3fec bc0a4f86 c844bf2d b7370d30 1a7995fa c922b240 9b3a125d bd970c01 f7fa85c6 3625ed08 +15952018 e5f92a91 ee3becbd 1ed71225 8907003d 755eb1ba 3bdcc1fd d2780554 85202139 95aa2bf2 4dc356c4 5ba537c8 15383690 e097f93c cf264fcb d4f99afb dff201cc +3859348 ccf5a6f7 a5e434ee 5c26b676 2a1aea92 bbb22122 1ae38cd4 86c020e5 f7c34c66 b6f62314 92267a32 4ca4939f 9b701fb4 bdad0e45 2fb9c487 09de200f 81fbfa27 +8348984 e1b26ffa f232b121 378ea802 4bc048e1 c3d3a34a 60a9166f 9ba05e1a b372e2de 16cd61f5 a030f5fa 21dab3c0 02d79b8d 47cdac16 676b2d40 76b85aca 51d32c72 +13069025 21b9ce6b 592d3ce9 af0fbb35 9d46cd00 70d9ab71 025b1cb8 0b3fe02a 1864ea16 6ad49256 eb60faf2 1ccd0f1a 80aac08c a4b63f04 265dfd25 4fe88ae1 ca764d3a +12973596 3f0602a7 d443dbd6 b8e48d00 85dd8f04 46f772a3 f574054d 5fe225e7 ad16d8e3 17e1aca8 fe640f7a f38f14da 157940e6 a1fd2f57 223e7469 e3602c39 d31d55de +14118948 c1a499d3 e1b07b99 786fe950 e21f55a4 45ea595f 114d1b7d b3be5a50 3ffd8f9c 221c1270 7fd131d4 1e06c7b2 3e1e9062 b3a65909 3ea7a447 617239cb d77db603 +4324245 f387b5f4 18c12605 fd764d0f 3a351da8 24aef732 5ccbeffe 961b8cdc 838464a6 f98e3cb7 f42ede73 4bdd92ac 324c4c99 4e9b36a9 d250f6b8 9d7ed86f 80fbefec +10101128 9c429653 b3bbc56b b1084ae9 456b29fa e81fea11 e99da765 b81f6c01 748c411f a5e5beb6 ebe370a2 8ed13fe8 48bd88c8 b442bce9 2aae042c 7a5f0473 71790ac1 +11063084 09aacc76 0adb0697 fb8a4bed 04260b14 52a67a0a 3d1c9a92 d23fb4cb 79851a91 136a9073 686c9e58 c7d20364 3689fe70 f7ee4330 732a7c55 b67a5c7b a4bc5d5a +970408 407800ae 23cc5fa1 13d138df e27d0665 0e1c9240 eb4e8c2c c3f63060 a41fa78c ee6dc105 ca75f481 25ac5d83 48a132d1 c7ff9c86 60cc2283 7d530b55 dfc9dccb +8172511 80c70c66 0b92905d 55a83516 2130e56d f095e66e fde45fe3 5aa4150c 6d36d386 d54135b6 be1852f6 d292808f 7c57307f 34d7584d 1fa49cc0 6c890ed9 68975eea +9051556 50025ec1 8910f3f0 556029fb 93e6bfaa 7112e891 4765a7b9 ddf8d092 3c75b449 7fda1362 54fa9dc2 f67aea72 8e8d6638 6055d13a 652c952e 305c62c9 9325f277 +539800 b0a06563 3e3f9e88 20c371e0 00e839ff 3edd0732 9d339cc1 2d980ec2 7ae294fd 26c83f59 4573214a b01a05d8 e27e04f3 37c896b8 f28ee5a8 8b97915e 1375d197 +6201145 22703da2 cb0219c9 91db9e3f 19ad68f2 dee0e97e 8b024730 2a3003b2 33f88b90 547c2c37 a65ed8cd 5a77d174 cf1898bf 606a4e0c bfe9d053 943fd66b 00641902 +4021106 0d3db05d 41452769 de6f7cb5 6e40d033 b626e716 434d9331 306ab203 e169d6db 11df6274 3955927c 573c0580 a147f6be b5c47280 f7b8c020 4b4465b2 1ed7bb1a +16599534 6b28ad4f f8311cb9 bcb10604 c2aa68b3 ed8bc398 9241cec2 3e9e4fc4 0af6559b 4206dbd6 e6bf845c 1358d06c 71f6c417 0d1423d7 5df4fc2b bec70cbf d900fa6a +11050425 a5eb16da 5396757e 37cf6c42 aa83f7bb d02a5695 d30e2ccc 646d4c34 c2811ae2 ebd16d76 2b64109d 771eb700 26a46aaf beccb892 fb11e045 6d263a94 a7617fae +804826 3895b775 68821c88 7876b2bd c0754143 f4d695f3 92f9e9f3 9c7c043b 9bd7fe2d dfc8ebb9 e0d58caf 921c75cf 9e8c6897 cf50543f 114a38e6 6fcfc130 110f5749 +1229938 f0960a9f 69c262aa 955dc626 ee28f238 ddb7008a 2fb6bf56 0a0ba1cb 76cbc5ec 430c8dd8 41f48b60 0f6febc0 1f563fe6 03c87844 059aed68 5ce3fc1d 44939185 +7096888 47c0a52d d7836b08 d2bf5d57 22be9016 092f1fef 83e83360 016c30f2 d87ee0b9 d5c46adc 04081d7d 86a8cb11 b1751f35 28e3d14e bd3912df 1a794133 a15c6052 +14183534 b5dcc251 32f85a76 3f084eaa c9f5212e cf3fd2fb f424320b 515a1334 583e744a 12efe994 21cd72c2 712c300c 0951d520 bd582c72 f9c2ba98 438d24bc c3960da2 +12619286 81fd041b 0028d564 36cb67d7 c278d8ec 1851a3f5 41a3b74a 33d285bc 072d5903 65f12852 719c9b38 957a2371 36a2f97a f1e31d46 9a54037a be6429cc 03a3c5c0 +6189031 71ebc8d4 b9a4a4d4 c2b56738 0faf9dfc f556e031 045d63c7 d191e50d f68bbe81 0119b73f bdbf9353 325aa7f5 efc9ceff 25d1de43 e4f8133f b85000a3 22574a20 +9681018 c38115ff 6827ddaa 7cc13daf 5bf92def 0e5bd9ec b5c5a0e5 a5becb02 6ce9e0ae d559e442 54d96614 eaabdd29 4979036c ae8e6ccb 891a907b f0671443 86c8c3e1 +5753716 b4ee34e9 55ef0ea4 43da8522 f58b47d0 43a7e0d2 6df285ba 7bd63d21 bb76130e 64d5557e 7414d9ce ea6bdf92 1148baa4 87e7b9aa 7923396f ac7e4d6b 07543c20 +8814986 b1cbba67 58932457 36c67220 76a06e0b 97f4176d e15b6d53 95f24b79 30f5fb17 1a948129 0e815731 5510697b 22412d4d 555bee55 a5ea7b9a 42f1e76a a6601ca4 +13521766 cc672c0e 64a4730c 69f221d5 777941a9 c3ec6258 cd45c844 bf3891fd 26249424 e801f8a1 b4bbb7f0 517bf685 0639d48e af40f3e1 5d79a467 ad201a30 c8f13f47 +14655893 43ac9354 0f02a369 94f8a499 3117ab12 60377c4a 9b2456ec 908e713c c54baadc 6886c072 fa9ccc94 fbaedb88 add55b09 77c989a8 3f1aad5a fa13c874 e9417f6f +3429801 ada22f24 9def6225 49894913 57a59b97 9d239e3c dab95902 6af1ab18 bfb6ec29 fc8ec31d 700f9b72 5a67377e 5ae28c76 bdae785c 2c796ad9 5a082b52 5cf46fea +1216412 0327d579 c90beeb1 596f06e3 c4b1bad0 26e9d37d 5223f562 e16b5140 5dca8f0d e6b30155 3d248f97 1592bdb9 0d2b3797 2c7e8310 e12de7c9 e8b7e207 5d718a1b +6347290 a91bf2dd 6891e8cd 2f68f4bf 2967f4d2 6da4ddf5 6a4763d3 f14f5a18 fad5407d 88b99ec7 023bf3fa 3e8f7f41 c0d4c169 94eeb22b 68c6f6bd ab493b78 147c4904 +5698023 39b98656 5f0841cd 237f3fa2 5863ce57 a6edfa59 5ae1c6e3 02660a05 c27761b7 52aff54d e664e140 4daf14da d65ec595 28999a5b d820ce4e ac0f2877 d7f60a81 +11965365 8d9ee9e6 26517965 9af98bfe f50ae05e 46c1ac13 347036e5 0748e741 d8cd0e88 c003e0bb b41294ba ceb5e84a 4bdb695e 3d4f8d88 435e1fd4 4d45e37e d2b7b04c +4755005 b34fa064 eb6b2507 18e739fb 0cee1337 d57f43c9 9eb09c3a 1679f277 b3ad7843 c9dc203e 467fc8d0 b122440f 8f161c84 b727ba12 1464a555 70f10cff d0e36f77 +2537684 b140b967 774c855c d2ca128a e32b3890 11227cf3 c1526061 b5807a2c 051d8df7 83390e26 2f8f6c3c 05e9d643 b0b29408 3dbb9e1c 7b31493a a1b42dd7 47895ec9 +1560363 00f98bc8 3950123c 394b10c9 8ce7cf23 95688163 a8059baa ea24cf5d 2f462377 cb3801d5 22bc58a0 a24891a1 f2bffbd0 7bbba65e 9ed8751b 03f2a47d 10708fa3 +3427621 f3d867f0 f54f60a0 3ba1e28e 970ab574 792fc28a f09bf8ec 7bca4008 d4f50aec f51f5b00 9f47348f 67f3be6e 50a3493f 4d949db2 9ab18596 3a661a23 587a82f7 +13789436 e3aafc06 dab3d22b d1914bfc 5c030c73 2645e353 c6fdade1 d3ed2e2e 6ccbb155 f6ed5df9 47a26d43 1e6bfcc2 a28a1d87 8fb0c9df f6c4e2a0 e659b0e3 fbff40e3 +9144070 7e69aba6 99c918a6 1ddf826c 91ce5d78 37ec3ed7 83254ee1 b13cb3da 090c74eb be08d0cf b4d7dc2a 0843cf10 9508715a 6cee245f a5816067 ea5fe9da 11cacc94 +13463596 6c64472c 5497f77e 701a8c73 1f7e2378 5cf8feea 63426cf0 d22e2846 18227af5 50010551 fb33fcae 71661cf9 a1d48679 85e88917 d09098ae c905f519 5e412ae2 +8715830 5ed77eff 7ef27c44 6eb2f52f 063441c2 b3365b84 58e016b6 d615ffe1 cb24daff b708d026 d3e7ad1d acc5136c a7bae1da 7bff8d11 060d86aa 435b2b85 daa601b9 +1039813 50b1d64f 0e9c3f8e 7964d155 94d28880 f65b4846 a847f18f 0d19dbb1 b2594620 d73b61e9 be33e478 4b9a5c90 68141c36 e191d703 b76cc7ed 99b85354 698f404d +16071214 9f61c748 5399af13 08658716 37e7deb2 ae7c4cc9 a7e41d1d f6ef6495 5d1e81db d7642c10 bb6ae8f1 c2fe4e5d af0fc9b6 4048b277 63db95c2 b6e16b8b 3bebca01 +8903358 1dc32509 4f92ac31 0868e953 c735e3b4 05344455 79b68c0e 453c7aee 4e9ebdf1 4ed8864d e22744ae c068358c a96c031a 40d630a3 a31c3b1a d12349de 5f9f6fdc +4780114 d79b9d8c e5162adf c0ffe9c8 62421a6e 3b0641e0 4c926e7e b5cf77d9 73339f18 dadb20d1 639e166f ef63bbb5 2ac2b2be 7e6ada4d 6c716bf3 67d8b220 d511238c +9749873 8bd9ed5c 2a5a888e 2ad833e7 eec4d4aa e6c7e66e 3d8919df 5a89dd3e 061b9106 ac7a1fd0 5d161fb0 34a69b6d f24afaf9 102a8b2f 525370a7 30ff5ca8 bc179ff0 +15428188 d1225f4d 0c4da859 6e8a2786 081b44b9 9a862bfb cd2e20de 2a30d65b ecee93c6 2cbadba8 8ed8ebb6 7d27f976 02fa081f 22b43e49 bb5fb7d6 44d60cd2 a3861260 +3588881 2b865eb1 acd865d0 7d83d8e1 32ff6516 a86a946c 7c60b9f0 7d4d2121 73e27243 9ad34815 7db2e80e 3478c967 9ca81146 f99c6548 7eac2ee2 e56e1660 bdd81137 +2768576 968e7363 58107cf3 ec90d8ec ddb4e492 badde118 4604555b 5ea960ec 0a2e5f81 c6554801 7a8598b2 4312c3c7 33fb071e e20ec94d af1cc208 3d4b9811 9badeeed +2477280 7e14e393 fe7e2f79 aac4298d be65b7ce 683f06ae 12295c76 dd3e8109 82375539 525f94f0 65610140 5f7940eb 8fd51819 8638cae4 39fd5e27 97ea9119 cc034db3 +8541569 f3a7ab1e 4bb8e922 7bdb1fcc 1cd03201 ced553c8 bf76bcdc 2f1cd9e6 cfd330bb 58e2ff73 795289ea 235122f2 d5ab8aaf b354c576 494ebd9b 17699cdd 5c54bc5c +12574100 93e6359e 4d18643a eac7db55 8f6b67c0 4f9ffa8e 01e10bc1 f255702c 836a1dd7 842e2425 1576a44f cefcb36b 96de362f 57cedf88 78c9e2ef f90eccaf 8127e2d2 +5081429 0e7a9891 0648f8b5 5674e127 2a0fe70f 779b8b02 a3751bd8 f8487d29 a04070e7 324d45f7 76386a8f 731fcade 82d30bd1 dad549e6 26ec4037 24f7ce81 8046e6fd +9021418 3b93d2b6 53c2be01 cc0369f4 c8121323 4f470531 1530c01e 93d458ba 4ed5a1fd b97e10f6 fd3b2f2e d6a1849c c02d8c1e 3136fdee fb434815 5ab4d8e2 b6ace17f +7297921 61ee23bc b524aafb 09db1b97 5be6e682 84730ffe 7d71b157 50e28c75 80054d61 8ab005e6 257a86c6 dab5caf4 1c4751c5 5616ed27 fb399b2f 70582732 5bca9ae2 +6190706 48f35806 1cfe21b1 ac6ce483 cd081ab8 8e55a578 bf86b9ae 500a8a93 937a7f79 c93d50a6 2c874279 0af4d429 2996c1d4 b6498be9 ea989a83 94dfad1b 00d36da7 +14344054 464b4bfd 14d89e08 966b2f1f 2f922e41 bf08ba09 9f2a46c5 5bdf5553 a034e329 91dcad74 1f626c26 b2a62a15 7b6dad8b 787d5820 c8620ef8 7a8ccfbf 74c5c330 +16022595 f33c7d85 c7de7a18 71244a65 86086552 f082309f 300c0a78 7ca1e87f a2e2810b d4ba8533 aa18119c 80f3386f 16bd9472 1d206de9 92b37907 7fddcc65 81b5cf16 +2904773 5075e7e8 060cde99 133a1216 be12cff3 01cb3e74 0f9ce509 327e0787 265d44f4 a91989f8 11157084 3ed7a87e 6b84041c c65cfcd8 71a4bccd 71e7c6c4 65379449 +14841446 0e3af787 980888d3 b8d171d5 54bea435 48fb98dd 6d6f2b63 353a0ee7 6bc84132 bd5e5447 62c6ca6b bd003ed4 d1394fe6 2f66a483 f5972199 5e633d17 5a17c0b0 +10133293 50bef6ee a5299e60 652e24e5 b03a79af c4e47922 1f4e310d d72c2009 117ecf3d 92524822 266cc89e 5ef6434c baf225ba d2af7553 e1a7f2ce 176ecee5 8c88b0cd +1168079 6aebd02d 4f33493f dbb34f4e 1741f35a a640d7da 7ecdf616 5659f400 7f73750e 8b788836 f8556ea4 a8c0f085 64788717 de51b57c 1ba96e12 b9184f4f b1811d88 +7415941 3c6157c1 8e69e916 e34c04c1 03bc36d9 21922e05 073520fb 90db77c3 42667e35 ef6e42e0 fa5d99a2 bfe92922 ed509765 fbf2f963 60505545 3f2ae482 4f0b0bfa +15742830 95caf596 b9ebdb2a b6a04400 d1c6ea6e 96a1496e 996052da 93e18077 804d2532 0fae95d8 22f8794a 9ceb8b1b b5c219e9 7732b8c3 abc335b9 d4e9d76c 973be82a +12302906 3ffb64c7 9873ff99 7e0de477 8159aa31 84c1bd34 33d3a047 87731204 2e300acd 964c9fe4 62a98e39 b55ceb34 c8860b6a b14780e5 2002f9f9 eddbe491 4c50c7b7 +14347401 ce533fa0 0e15df37 a643b084 dbd068ed 14b1a849 3bfc34e6 21ad35d2 68c84e1c 9ac9ee60 93a98b3f 0b2509c6 5a3669d3 79d20d6b 88f0423c c89355ec 11f33ad3 +9639032 228dbd69 163a07a2 fbbbb817 d4bba965 28c6126e 3ea45c2b dd5d9f60 2e7969f5 4f16f7e0 636228db 37112dc0 4d8337e5 1e8a8e0f c95ca452 9042e406 6f909b82 +8054497 c0b7263c 048ac173 eb95df89 7fc1c731 1d0ea2e2 b9537683 a1360b2e 1334aa2d 7daff122 f7889401 a1e298cc 814234da d197dccd f24649af 60ab351f 255816e5 +9062522 3d29aa48 8a5d3c0a 70613125 6ef1da1a 2727ec50 05994ec8 812ee4b8 1affaa8f 5545ee7f f0fc7b05 63b476a5 c8ed778a 15be0650 875ae165 d3c2c123 8c096e6c +6723882 a6fc5473 9e29d63c 077f6cef 7cf8a00b b50f39d7 0eb1b0de dce9e41d d2a18fbe d91a2571 06ae3e8a 2b86f027 50160fe1 7a15876a 405c3ee6 6dfb83b0 78751c99 +7242089 3d6517d8 69b344ac fc195614 d5c9c816 32e27a01 464f6631 723b9ff4 d0bce295 1d024ad6 9187a28e f7d598c5 4f56eaaa fba3193c ec7b0132 ef3e93b0 011763cf +9056816 654eea16 5807dbe1 c4968662 55fb57ce 26eb1233 1f310dc3 35ac2860 0b55cea0 cb7287d9 78b61827 7ad13e9d 30b5eefb 54e2d169 ed7c2cc7 2956dd27 a712ca08 +10128475 2fd0a59b 179c42f6 128bd7c3 deb4255c 0cc06510 81a57b9b 390c06a4 2e4d6b3c 5e3d9064 e24aa2cf 389a5c7a 2c17dd2f 3c488d3e 3c630881 17eaa6f7 ed6ccbcb +8618308 fa150552 959d8db0 39078175 a4f75d91 09a62144 c1f4a615 70868abe 42509c96 3c8567db 92caef4f d211917b abf03673 28c6cc1a a4235ffe dbe6ecc1 c4cd015a +7319501 ac14fb16 21216fef 8e0ed74b 434b8413 824e6892 783c8ce3 e1d156d4 67b2d006 37fe215b 47935f51 8d063652 13378b2f 9061af25 4939a8e6 2a964873 45370bde +9564267 db14f932 dc8c4654 ecbc365c 37a7377e 56b3fe0f eda7b0ae f1457142 862d0cf8 dc585087 889a2556 3346f941 a87222ca 1a40a484 76563bb8 8174cb9b e682da58 +6547341 0cd87084 8825459a 85a87410 fd68276f b80b66af 019f12cc 70db0b37 6e73428c 7b4d37f0 f7fcb28b 46e5079a 147d6923 dade118c 10fa730d d52e85bf 7f8cfa9f +3640765 b165c2d8 0e7a4b50 4163220f f05e92e5 0f5d4d71 cdea7c77 0a6ea277 010266d0 4a6ebbba 7ecbc2b3 0adb6e32 a76b7d13 ea8ea4b0 a299d580 e53fdbe8 502f19c7 +3301543 21867bd1 b299fcd1 9dbf743b f11fa47a 68c9ec17 c7810843 f62c48f5 3bf1cd29 a4284bde 4202bc91 dc08ae50 a7b68e00 9ed2047c a627c707 00357df0 387d6fff +3693748 475d95a6 aab40f1f f110c3c1 96c02945 f8bad3b5 643c3b90 7b1d0d8c a4175c0e 344b484e 408d4e70 a64ebd0f a4614c8f 6908a6f9 d76a3cae 69de2a03 9f04ccc9 +12982800 3962dbaa 44390a9a 84b897c0 1ad68133 8c0fc2dc 6974bd5c 272c5e23 de0990ef ad81c0f4 6603acef cf69ed33 812f05ee ca7c9d60 028c797e eaad5e25 633abf2c +3911187 f6c728b1 0766ef1f 0a1f1886 7dcd3a2c f36be04a 383435a9 eb968df3 8aa4bc53 815c9cc7 a824ef98 3d5af7c3 df2e71e3 0220bfdd bda801c7 157f770e 54260888 +3874704 a8b6f4d3 0232b29e 89113793 101fd37f 0e5a1941 a74efc8e 726a7eee ca2ab894 92f43ac3 563c205d 2a09f3b6 92c3b711 1de2c2db 0c4f5fc2 1a7541d8 f4f54af0 +997545 f3160448 c97e21ac 626a1f8a 49cfaa59 597d5b28 0b4a7430 6380defe 0647917b f8de786c 9f1b1f5c a7571848 74033fae e934f009 d7fe2ed0 0b2a157b 891e1e4e +2083784 95880bf7 1a461c15 b49e35f7 f25566db 31e2a88b c18f4476 0bfe4461 d59d746f a2fa9adb b076a641 ad3155d6 5a889864 b3265282 84ee663d 610e9b6b 5818c86e +4963528 24e8657f 2eb22aed 8caac72f 705802dc 3239774f 7c2a5f1a 41430661 68ea319c f627d970 5c8cd985 616c8579 5869a080 f674479b c84ad40b 3d125b34 0d34e59f +11093201 6e9375fe 291cd607 10187dcf 9bccf352 ed092a63 ab006e86 e9014699 c6519c63 89d32da5 1a148d32 21445b60 1551f6ce 860a729e ea9a6cec 1da3430f bae411a1 +7253112 fa9028e2 70a4f180 86f7fc3b 1509c168 1bdfbbac 4eb30444 2a6d2f28 b9d038d0 adf3fe52 dbf1f67c 587b7c2a 593409a1 36170862 63ec708d 82d7e84d 59ef6e5b +9202055 abadbed6 6e255f9d 08c8f794 80b7a973 7afa9bf9 b4fe010c d87213f1 188c75d9 4ef0165b 2b367df3 88fa7b82 f9c21a64 e040c6cd 2572c1ff 05da2b75 e380ee81 +11988351 a99c39b6 5146e9b8 c00d4ad4 82a92bd7 c5f66c31 595d2e3d 8412df6f 7ab97d5a df16905c ceb191b2 db2ad16d c16db230 3384a774 54021e9c cbbeb274 dc461544 +9915626 2660da8f e7f85558 033a9509 a552fd29 00be8abc 728f3d07 08fa3dfa 17d5bf6a b995b02f 31a737d9 09beff22 89617a7a b70c8043 8e39b520 a94dfe3a 555601a0 +14920871 e339d980 04e064dc 8a698b81 a6cd71cc 627b878c 09f75f40 82072c54 51309804 90791a20 da9fc61b 06d6ad7a e31d366e 44035fbd 7e2ff74f 7837d87a 60be71e0 +13771456 d5ea68c5 27ec571b 1567b827 427c24c6 e4fcd22d b088ecd9 ba8969d6 996a77f6 23d63d41 8bb2ac37 b50c46a1 bd8db707 802576e3 c27fe59a da7eb856 1e460e7f +6231807 1cda98c6 e27e3b5a 34a07e7b 8c365b86 07635164 660bef57 7acba381 6a7bafd1 06791b03 0ced370f 14b13e6f bf1534fc 9cbc3c32 17788083 8726ecb9 47cc1a40 +654758 8f1f6467 986cf5cb ce276b9c 6470e02a ba5b1c6d 62160199 335b6c86 a1bd92c4 ae2c8745 33046248 6d43db59 9875b2f6 91401faa c17cdbb8 0bd77e86 e768141a +16308010 6870b4fd ed227ae1 dbbf8089 15524bee 10dd89a6 037b4fe0 d8213a6c 0e3918af 01049c6a 90477991 31841892 30766c8a e127fb2b 186a8a68 8a3babae 7912341b +3812304 ceb9fa3f 6460026d ad6d714a 10f6d0cc 917b6cec 8978c97b 55b76d3d 483b5daf e73edab0 5d89f478 f60fb810 da69df22 93aba2a8 0690bda5 a744c83c fa068e66 +10466358 8fd87de2 bd7675bf fe978ec3 d32d3d81 992edf25 6afe75e8 b14e9fb5 253ffc60 7c9afc92 134474cc 19ec1c40 5ee83994 d425adad 1931f614 fbfaa25f aed8921e +4052696 46a3f879 95353563 0fd277f8 3b1a1881 3cbf453a 3cb5f397 5fe5ad2c 57371630 ed2222af 56b589a5 4cc7a26c 64f2de57 ce677f9c 4c388bf0 0ae1a514 2f128649 +4891459 def9fc2d 70be14cf 87128d87 ee25eda6 cfd9bcf5 3b3876ef 829d784e 7c492423 f4090faa 53c2984c f8c2f8cf 4f6d33b5 dcec56b8 cde1a26d 20949e38 236e20d3 +14553560 00bfb54a 71d9459c 26e85b31 5e90682a 807f3cae d35c3ac6 efc52570 8dcf1d32 972576f4 ad888854 c3516e5f 6528d104 3640d879 68141b67 ac9029eb dab084a0 +7989774 c4cd4c6b 2ffbb2c5 1d60e07d a2085a33 eaaca41e 22d43ce6 9340f1d6 1cde0be0 bbd6324a 3f798a4b 57cbfa25 cf018adb 3251dd75 b76a3dc8 038aaac4 113b691f +12281839 c8316125 4f16e001 c4d448db 50dee4bf 75bf58c5 e928ca66 934d611a 39b4603e 33017847 d7bb18ad 37d20137 cd8f5f51 01dcd4d8 eeb7695a 29af82b7 436a821b +13957457 7544e145 3e1eea4f dcc4c5d4 841dc990 6578de41 3fdc66a7 e38f5ba0 0a0658a0 94d0ee64 c6c5bfdd d059cd6d 3a4f7c51 d6b7754f 02cd0bdb aba28b54 264fe8fb +14863515 58ab94a9 77f73d11 42b39d40 644265eb b4e332b3 ac20c341 594ed446 b0174bc4 31e264a3 3a0daa7d 086b58b7 a677942c 54adb383 f286a426 d1e00080 226bf5e2 +13684758 ac2456a3 c9e7010b 4c86bca6 00ab4bbf 6df6ae14 827092c2 399558af 49e66ca1 0eace9e3 624697fd 2d8ffbee b49b28d2 50db0813 1e40391d 4053f27c 5eeafa2c +3807115 124d38dc 1a41119a 55dd80d0 faa5a48b f1382717 db78ed80 6d2e3425 bb25328c 02740bc6 280781ca 97fd9255 5d55ee3b c1e458b2 16deed29 c5e48211 fb0f007f +13644148 de02df28 959b592b 9ece9fb0 71014dae a4e19239 677c9add 47ff46d3 074dc18d 8cd6bcd0 4f14f5b1 8cb7ee21 d0f21b6c ea8d01e1 f367c62c 6f14647e 4e2be690 +14734054 c7798a20 1b09730f e4494b4a a70cef28 e5ef333f db6d463a 8dff3dc7 c3408b7e 0657dc99 82693abd f6a6f496 3624188e 976aa843 7b3088ae 9edef668 ca29f4f8 +2875689 8bdee766 e77b1a7e de67c8db 9fcb1beb 970f76dc 13408a90 e1cb13f8 8b28cd98 82bfd32a 631ea40b 9441d98d fae3e385 cc892d63 0311313c 313f2918 1677effb +3018955 87823b0e bef65903 925502d2 054ed92a a98bfc90 e34a83aa ea047792 631b4d77 eba39873 d8adb325 833c5785 d4a20a01 be9d2951 7b8cf4b3 6d89837b 1adef8e8 +10312615 54e17a4d 8f4372ae af71a5c2 c809a4b1 53e88d2b 18b6376f 4fb7f072 bebbeea8 b55532da 078212ff 272857c8 ddffe7ee 4aab5aca f1b57c73 ea5f61bf c4d75104 +14410720 95604f16 46177d5c 4a37938e c873dbfc 3ab289f2 ed4020d6 1739f78e 156d6ebd 53cc806a 5f8825c7 01a6d05e 41716387 fe34350c 3017ac2d b843f429 dc633940 +14196134 2a1e495e 3be5e2da 4f7cebcc 0e2afcc8 26933d36 daab2475 b56519f9 900b2c28 b9afbbed efacf3b8 5435012d 4ff5f68a 72bbb5f3 d881ebbf aefad017 efef9b3b +11594630 0abe4ce7 ee519a20 a47e2f5a 0d3acf8e 30f8c6d5 65baa72c 576278fd b49e3b95 b21609b7 790c28d0 6c35872b bf3b7169 45d51ae0 dbcd5ae8 e43fc1c4 3238cb45 +5051533 f73cdffb fdf9cc06 e4d7d60d ea74e79f bc2b7153 0b5b8a45 e37b48d9 871a6976 6ee55499 c2cb29b7 0300d14b 90acfbcc c5d3303d b25ffd9a f1b2fde8 41c502e8 +11351026 669b41bb d2c67e0b 7c7aea49 1585c27d 8d08ef75 ed6d0138 eade3abb e6ebfaef c7cc0c3a ea7b67b6 31363e71 1215b995 dc03df11 8c0d39ec ad468a1b 28de7f16 +15855206 45c7b06a f5415c29 58fddddf 38d99756 2adf53e0 89456891 13f278f8 6b8a9ca8 d4cc8257 1ccdb68f dba384ab 838678b7 59b60cca 3669b6ef af6b9ddc ff5da243 +7423764 fff7dd1d 8228cf74 98f69ccf 50a9ea35 c605ca23 f91979de 5b3b4363 46a96321 bb5ebf55 7322a205 99c07898 cdac80d3 8ce99681 3fa4f7d8 a79ba4ef af299938 +2323703 9f5962df 30159c76 a0b42f28 c81c1552 43d32ae5 8899854b f3b8f6c2 1ec082eb 9931437e 6a57a7ba fc2fa44c cd78249b 97856344 248fe40a 6056b491 b17174fb +5217399 8d0d2872 e556585e 05eb3995 29851386 c4f89f5a ffdeb31a 3cdcd297 96ec0e93 132b87ae 49d0b5dc 0e781095 354012ac 120d12f7 4351d33f f9ce7ebf 562876d6 +1844656 d6048c6e c92e82f3 0929a58a 184145f0 d54b8b26 a3d5db58 e82b719c 3ad1bcda 346c1e17 797dbf12 ee7175b9 7a27bd14 dce8ed76 ae9d313e df25661e f2775626 +3221150 fc5017d3 07e155e2 e06c2b84 08793506 2c831d43 9132c658 395cd56e 8f46cbcf 499d1c87 2e5d8c2b 9687791a 1a33ab31 19ddf586 22202139 1b9c5ad7 954d4cc3 +13073294 6528a3ea 4e1ebc23 58f86dce f3ef8086 f2180fa5 31b0361a 0388e62c 6ddb71f9 ee6553b6 8879ac18 b55d7e40 613f2088 2a0d8a7b a43ab719 02c6e0cf a0d44446 +6318159 2a44713e 27813fbd 1cd32661 2b2d8b5c 82ccb081 95830a39 a30fa736 fca4331b 736bd5b2 52d74a56 d17dceb9 33b39cf1 e41a926a 966ffbbe 7bce0c3c 2e6abc50 +14080060 336095de 7203f53b cbd8b873 64f4f879 f17fd32c 92a58202 66f98f94 56c3ed6f fedf6ad8 1a2cb447 49b3227f afaf0762 dfb217ef 8b5ab5ea 888704a4 7beeab5c +8995134 742dc2c4 41ba6e8a fa4652d2 4f00e618 71663523 6f30b0be 1c4e3ff8 af5499bd 34513c3d 6be5fb95 f65f7ec7 4d91d6d7 8844c116 efbcd657 351d6aae 974ba374 +13055214 68537a9f 38c6e131 41ec7e2d f8214c6e 49dc6f98 6e1225e9 a5e8c37c cbd80671 ea96450b d0ee74db aa8f4b3e 4444305f 54d8dfd1 e6f10b77 191e8e3a cf24d8fe +4809469 dea3e7a6 9913a59a 091a78ed 3120abcb a72e9f70 16e91bdc 2aa346b1 88edbc5e 3d28aa62 1c29fa59 3644aff6 f0966e38 e78e0ab0 08583469 0b41986a fe4ddc0d +8256055 d5dd5341 bf52a7c2 ffc319a9 01601580 b868c003 d10d87d2 4232e25d f4dac1c2 6aca0e5c df962cb1 c8d26a76 572f906c 5b470499 2e1f4602 0db41cad fb68ad93 +8088074 773b5d03 30ea8c20 f9ef9698 ec8ded5e 9d6b1b17 bf58a74d bff65b93 d9af72f0 3333cd60 ba2d1f8e 874f1308 35ab65f2 c236cc8a 562ff9d3 e2e01a9c 85e159d7 +12574923 fe835479 809030b5 936da959 105263e6 d838c817 ab22b40f 6fd7aaed 51cd4b5e 5a2f3a95 14de4573 38279056 8756959d a514e536 f341361b a4438667 55fb24fd +9941520 ee266b95 32e395c1 c3078203 e490e76f 34082d54 a7abee12 541a3c55 76756f48 c006841f 9c721e1c d95483d8 cadd6af3 bbc55cfe e7a222fd 67325ee4 2e8c412f +12182817 c02c2eef fe4f4de5 45bfa783 167b712a f6a4a550 adc5feae dcc44c0a f3bd67d3 f35c7f6d 4c4237fc 5dd9930c d9cb0c4b 484e4e5f 369f3abd 3d72487d 9ab60518 +2883782 3b21b9e9 1e6ae57b 7aa36563 ef6defd1 e1373f3d 391c4e8e b2de100b 37581dd9 0a21ea2b 607a1ab1 3aac3dff 72e556ad 100b31ae 233190bb 8ef221af 595be99d +2251532 eb251c6b fc670c3f c16ea0b1 0aaaf708 c2b104ff 2a7db88f e52b9720 b7b50d0d d0c52076 b120f253 fdd45d77 904fb894 30507cec 14aba6e6 13830598 58030a57 +5545599 b911d9d5 c3fce8ee 61966d1a aa02060b 4ca4d31e b61fa962 833d733f 74164100 4370d87e 64895b0c 3c4b811e 33df3727 3b7feaf9 310a00f9 dfc3b40c 565ec962 +15243672 15cf0e31 fe844578 4461c6ed 27c745b7 5659074f 82ace121 5b18a197 b697fe8a 81bb6727 fea82e64 ad61a0b3 51782e7a d035a37f e06b6925 e9f58590 d442417e +5144522 b9e3ed20 b332d054 b40d7e5f 32f8df8b 20f516b8 6cdbd532 be024edf 94a83fa0 5f8eecf0 3f33a0e0 136b6cf6 4bcd66bd 2b94176a ac34c098 ad8735fc c29992e4 +9957183 3a20c140 fa9196b0 f08134d4 6b9cc0e0 e08702ab d2f34cc7 b0cfb047 e6610f3a 86c40a98 110946ca 10f2d0a8 96579fa0 1bab4aa7 b6297454 554ac116 423c1375 +3427878 e400d78a 1e8eb60e 823d660c 09117791 c66b3522 cc9615c9 5951681d ecb63151 ff12e9dd 2d3a76bc 49b4f9c0 25754654 e1c6394e a932c8b5 3ac77480 741d86e7 +16334012 23d05be6 4c8ddbc8 2f753a86 06ba90f5 14027575 30323b80 e2debbf4 0e09d7ca c20bf04f 92aecf87 aa89951c 37bbe1f0 9d90e85e 7f3f9d32 038ac688 db8d0cf3 +9340254 f0629755 481c03c9 faa74bd2 259e8255 755e5135 eed31f62 f7b55f9d 28e45022 603eda5c 5e9f0aa2 4c1e9046 8c4b2c18 326845e3 f5d8c0d3 6d584875 30a84eb5 +12174634 92c4523e c54904ec 42ad8ec9 54535217 d55fb7d3 04664f4f 32231ba0 674c9e69 667239ed 97d4642b ed5996ad 639170b7 14afef5e d9254e7e 3532d7e2 bab4985c +8177022 b5485d52 c8818696 3172fab1 39b66a41 9f0a766e cfa5deb6 c3addfde acb25469 f8c63dbe 3ae891a4 b7bf46b4 97f12848 fa478116 11766b95 2ebe66cb cc86ac25 +425706 9384f3bd dbda3849 60092942 365f12fd 1f1c4d47 cae0da68 efcfca0b 30a957e7 6daa566c 68726689 742aedea a4ba8853 19329f5d cbe02181 c4e4a38d fa7ec1cf +15185510 0892e03b 3464d598 8e38e671 55c22389 841fa3ce 97d7f3f1 4be0d4a8 a07bf721 67d43813 19f5b577 1c452f1a e8444b90 707732f1 43fdc8de 9ac76a1a 2045522e +3975978 2b81457c 26039a05 6d3938e6 01b7f14f 379ad094 afa55d2e e1f0b331 d7c68370 594d72ad d9dd60ea c6646c2e 516a27ab 432526c9 1d8133b6 fa1acfb9 a1bde97c +8079297 fc54fccf 9b0d90d4 d1e6df12 08b42c4b 8382359e 6efd3454 f6b7ae9c 884a0871 19ca91af 621c73ca 8faa9732 6c0436c9 b9e2528e cef921cb ba50108b 6b7cb098 +12473509 bbda8d82 3913284b c2fbf262 fbce778e ca23b2e2 17604206 0dfa0cf1 3c62fb39 9ac1fb59 550523bf 08a714d0 c59dcb10 6e1474ae 98b2feed 38205864 36602d84 +11468849 9315b33a 259baced 96841e14 e4a1543a 1b4cc113 99295bc4 e6b01951 1d9cbe83 cb03ca3d 60aced6f 0de104e5 b73e1eac 841c0c6c 9a48bd2b e3fca7da b06f8b13 +659024 68a9a496 7db88367 5613bc18 e6ef7d96 7e360f2e 0810fb8b b9676efe 7087813b f7328a7b f098c63b b45b41ff 735469d8 649acce7 d14db9c5 70d2f1cb 197f1600 +1351288 e0e1bb3a 87b085eb 95559a98 a20d5c38 df86f7d4 77c7342a 770fc175 719170cd e240d16a c5caeef8 3e425e46 dcec5a3c 32129f16 cf364498 83f3270c 86075290 +14237093 93b26f95 d461cb09 67f39f0b e2a6b254 744fcefa d85ba5d2 43dcc7ff 737a676e 1a0c80b5 51dcf201 0affa162 41341e04 f70f8732 0577714c 52b0427b 220f3e2a +5520244 057961aa a76a9209 285464bb d5c26ab5 1dc68d4c fde3aaa7 c1b0dd48 b5719182 6afe462c a74e0f0c eac60257 d56e1a52 b150f795 7804f3c7 ecc103f1 9c359555 +10057615 e3a55049 cdfe46cf 28dee3ba 74e8d96e 701694d5 ecba37b4 769634b7 39fe8909 d6cf591b ca2d35d4 799280ef 755fcccf b2a827c8 5dca5805 f0bf91d8 4edb4b0c +11655462 8a2fd61b 81e28b93 a7e4df4b 47a2c0e7 f783d2db 5a32289b 22df3d91 696cd492 fa9ccf6b ecdc0e65 2a618d48 35c1c527 4ed96230 dffed1cd d78722af bf74cee9 +14523516 763479b2 0e217d13 df2ec646 8ac3c9ee b2822527 8f04aa73 3fb06e65 32c0aa18 5dc8e1bb 5478c35b 6da82e6d 52e84c93 d8de4c1d 0c710e2f 66ad7b59 5081b834 +11761208 73497847 99f3076a 3d29dbe9 66fd8e1c 62b5ed54 5515c66f 50b61f82 f5df61f6 64483266 a2622e17 6acd6726 80a2b3d5 a34a21bc 68b705e3 f1e42b2e f198df45 +11295236 5eca76bf 4c9a9460 617ac150 2280f0f5 fbf5c0fa efce34a2 0c5bd5ac a74afa8c cd7e9bf2 1d7d7ec0 41324b50 c8075648 db4bac3a f23fd8f8 3d4fdca7 4815617b +6258934 5f12657f a4b69246 daa61cd6 18dd1507 c3b22aa9 402e5144 86146ac7 649f4a0b 66542fb9 a50236b3 aa5ef847 3871140b 39d8fddc 736c5dcc b3f8c16e 2c9e4699 +7700280 9520d175 2ec4683d 5f06b870 a017537b ebf00d9a 143fc9b4 5b8732f9 f7c6154c 6c885212 9ac9f373 6f045b31 27b029f1 5b684cc0 1ee15c53 c66260df 5a174fb1 +6852945 474fa572 4056cfe0 a3f6f978 45e3959b 7f8cdb13 82e6ebed 293c2c2c d5ac36a6 869cefbb ff0d1267 02e0c0a8 933d730d 9c97b603 0dda68d3 60feec9c e84716b6 +14734101 698e2e43 b66ecb19 2556e120 3469280a 6e973918 fcfb33ab e7e4188c c2290e78 1d94ea83 c3433b45 1792777e 63a7fd1d f0a49f80 a88fc882 263fea58 7e1e7f53 +9134580 af6a4ded 4b8a506d cdcb9b95 af28be7b bfbb6210 bc3498ea 1878fab1 88c7f9a0 7b5e0cb6 abf75588 a33ed7c9 f74f469f 3a27c7e5 5599021c 9783298a 29f888c3 +11405165 ceb0397c 22c26097 9ea2053d f40569a3 6b2235de 29b696f6 c3c73170 312400f8 e29929aa 18fb0c5b 53e594f5 1eabca87 3acf6ea6 76228f45 75154acc 3d1a5bff +16452739 4aeb3ff3 29c6c2a8 1d49cec3 75c3478a 467e72a8 d0e784a7 f402fc52 7bb1b898 108dd4de aa70b192 f7c390c0 1e272ab2 6d720412 38d0eb5f a916d067 247ddc7d +3475078 ec6b4604 69dade28 458937cc 896f6e89 f715a858 b5fa5bb8 d6f40065 f29228e3 951c09ee 054f1cc9 597a8ea0 d5f37f85 ff91a689 6b5711c7 7636b22d c19587d0 +6755765 6e771524 b140d68f 70d4ebcc 9c3f92cb 97f0968f d0fdddbd 65817d65 c54a8313 3a9db791 173159a2 83964553 de27b503 eedf8382 bfe34dcb 3102dd78 9fd869de +3271798 6c440f28 8d39d9b5 4e3a54cd c0baab93 16ea6cb7 8be6cabd 5b8bda77 ea518aa8 56107784 28a13876 84bac760 f7aad66e f9bcd921 789f362e 85aea914 6ef17b68 +10863380 0f292981 2ac1a3e0 1f0f956f f5e844ae af959a68 7377e9bc f0562f26 5b092cfd 0b99a772 7db5f717 987e4668 11835872 434f8477 5b16118d bdfc473c a622d62b +15719367 1fb7a543 925b2ac2 8c2633bf dd71b6cd a3a39833 77159513 9c68e6a3 b1dfdd6d 32377121 546e3cd0 40afd494 49cb4924 d7a478d3 32ae401f 4b1c5440 05b7aa4d +10859382 fca0e35a 82877d13 6b6f5df2 365dcd88 e1b8a55a a0972c0a 734106a0 df39b2e6 39bc95c6 27fded5f 7fc6b520 2e48e584 57ef1597 43183015 5765f6ac c3558cf4 +14278126 f8a85776 820cfcd2 24d07a93 e13027b2 8355efb6 0d8c5095 4f4312a3 54c2c959 388241ea 39f0a117 2854c345 7e78e20c 2b414a50 476b3fee 2661d0af 54b9caa6 +5782431 89989e79 aab426a7 cc4be29c 8d48a53a 51c19197 58ffc1ab 11cf8b89 05c59ed8 4c276efd 07ffbc31 ff2d27b7 0054bab7 8163bad4 d4a760f7 c09e3439 57f89faf +9008154 3ae58aed a7d33d6d 25e4325f 2c019bd8 7e49d835 079e0e53 a6810539 1ef447a6 e8bcf508 db10446c 0141befb 44493c9c 872ebf40 c9681c57 ad753439 b2cf9f8f +6838114 c95f9a53 b083ffd4 cfc9ada4 8b6e5fa9 3a294750 0cfc200f 3b42ddaf 335c57bb 3d3a14bf 40c2123d 355bf35c afe99a66 492f3094 e50dad9e 646283c7 1a978d04 +2369112 9366e935 cffeff71 b64cd6ef 7180f1ff 4d1b3366 a8e078c6 9b8175ce 20a432bc 9d9a7c77 a4cfe5e2 4f90c69c 6d8a2e2c 53620017 74dbc6b1 1f6c00da 2298051f +9137684 05ebce06 b303ea7f 5d520862 bae0028b 6c8e7c28 3c737a0d 0718ff99 a8c02f0e 246df01f 29cbffbd dfe27c39 e835ca3e 280a76c5 0eec3c3e 74c87350 19ab0ecb +7375044 2f141fef 9cad6692 62d77485 44e563bf cfbf2cdf c8556ddf a5ee1502 5e60b445 f1d032e5 72a8d3d5 569d2f44 6f231207 ce5d0ebf 7af2d341 fc21ed41 c8ca3d3e +15367423 61ee5228 2a76eb68 cf2e79da dd54805b abd1584d 0510a151 b8499058 3a01c47a 860a93c3 5a2d31a2 24b33303 9c13a846 710ba642 5d8d5c98 3e133445 9b3e580c +6931869 c48a7d0f 9422543d 377dedb5 b8552982 b7390cd9 513bcd8b d1810cbf e1489e21 b5c3de90 b7e6f84a bc34e7c3 a1a86ba9 60304661 ac99eb3c 26ff6b88 631ddd82 +11695094 a5e3e605 f48b3b66 851bc78f 2baca9d7 35766b74 896f5a4d a95067fd 5240fde8 c2131697 189ed624 cd6958ac eec9cc61 737a8945 c6359ea7 3dea3b96 0dd39735 +11407834 de092d5d d3a48478 9cde52e8 68659ce3 23d753a0 94f193eb 35a787bc d36c62bc 3d38661b ae2eccbd 0f7020bb 9046690d c602c665 8ae74916 e7e37fee 49fe6021 +6526135 5784891d 7f3e4695 a349d71f b57d0552 d32d8eb3 9ae2fe75 658f5dc0 4e8cdc6f ec372303 74bf6fb7 b70c0292 c7857e45 c807efc1 288a67fc ffad187b c8ac5870 +16704408 83c11f99 cd20c654 124d0e61 ad559d1e 31a0c2a9 3993ea01 1e89042e 2ba31fab c3bce70d cb2d74e7 8eb0173c edde5a88 d5f6f2d3 71391471 3eb63fea 7970ba75 +14703891 f44586a2 e9abf3ba 63890ee1 5f9097da 352cf380 46963b09 45b462f3 616ec568 27a580ee 86455eaf 908ebf59 a3109315 16294ae5 c26948e6 85a4ed9e f987b371 +15967384 a63974e0 6a1ca207 827667f5 3ffd2282 34c999bb 30c64cef 1aa5a6e1 61ccdd3e 67d24ddd 83558fbd 12ef0252 aae7f7bf a73f6b41 f75a3cb0 63ec2535 712f41e8 +1858973 b3c9ad53 95f57f3b 689e080f a69c0137 e290d836 7708922e 08723328 486982e5 1dcac837 2c0d89b2 313e59bf 59687ae2 696e0eb1 e6675d93 9b95fb60 c0869682 +1061733 015e976c 41f43be7 f819c040 6242c737 743c52a1 9777e763 6e8356cf 1cb9714d 66731ba3 3f17d419 53b2f3d3 547e4f1f 438308c3 2dac5492 b0f396b8 1a41cec4 +13306699 bc32b949 4ac0707f 7ce0a194 c2d44bec 2ba6ae99 17c95bff 6dd83031 21f40b89 1f1e46f2 d5055c3d 6f6fd2aa 36cf0afc 27a62872 adc9b7b7 958589be 31cf4fbb +6850646 0d27ecc1 36ea2a4f b8730d8e 92816813 a3effbfe 9ed13763 b08470ec 4644d3d2 a56dc416 3338d1ff 130f696f dce84ca0 0ba1dec6 e0c0efb7 c4f6e528 24f2383f +1338209 3e87b3c3 cf91407d f94427f3 e9aa5d98 76bc3e77 c2dd6ccf 1e85c300 64c29f15 d8f2ebb2 cb34b788 433fbba1 fbd6683a ce8107bf 348b7595 3d197dac ec953faf +2046191 44448e2c 16ac0e64 d8585280 2b02ddb2 07f62b49 85e8b5d7 c1a561d0 61d75442 d3c1ee74 1ee96e46 f761b894 d257529f 452155f5 e06afaaf 9d6fc19b 7817ee98 +16482813 b3ae76e6 e43f656e a152882f df3ac803 aa36581f f71377c7 785e2c1e e66b04a7 ce8e77ed 7da011cb 9ada7085 147e859c 2e1082b0 c014ba7b 1057a533 55fc9f42 +516630 7ba5043b 638e51cb 26b7bf34 1076a5bc 432e0b77 2377229b 169a6d4d fbbdacad a56ff14a 5fba7781 a7fcef75 6379d897 0d9e36a4 e5179be5 d29588a7 54d48e10 +14397870 685b9e8e 479eeaf2 24432230 03f10c04 4ae502a7 d5574686 0ae0e3b8 96892be7 88d0a1b5 08a4705f 66de9429 27750197 9b7efe0c 7f071cfb 01485300 2d319d36 +10803128 c93ed21c 91333536 bf9ae1be d4d4cd52 4eddd543 b1ab47d3 1949d52e 5f8abad2 b974aec8 0a982325 755b64be 750eebe6 faba4f52 f892b6de 8e25a566 063500c4 +5752286 373e22a8 c84d593b b11e470e 7101f4e2 c305320c ac5f4ea4 9c40af6c b7bc1a65 8d5d76e0 174fd6a7 347257b6 82c1ead9 9f088273 239a382c cbf35ef8 e827f2fb +4456614 50bebbc2 3b895a79 560bb99c afa9d6fb b19c76e9 830c741e bd6464b0 36e4423e 5385005d 6d0c16fd 73d4f40f 7c9bdef2 d43b2a01 9c8c45d5 f91783ef b5c880b5 +10498131 da71efb1 8050af29 37f79f8f 1c9e93f5 9324b97e 5a050d22 9c2245c6 651fe132 c88d3ff5 88681cf4 7110a735 acdf65bf 36f5c502 c300f629 3a5f6691 d475f61a +14035870 64547c38 9bc39d82 4e8255d4 b84f5363 924e109a 8cbb0052 430c714e 52a0dac7 2c50f67d fc49cd57 194f42cc bb61ebc5 30606139 8c3e6683 572037d7 563ba51b +4966786 3da5bc46 f0f73697 4cfa11a0 2611eaa8 468e752a 86b8a415 91425c48 9ba884a3 4ed06e1e 6cfddcbd 758775aa 5a661b5b 90041fe2 581b3df8 537e8a85 d2c95c02 +711921 52afb6a5 b5105c4d 296c54e1 d086dc9e 9f580126 cd9a8587 6785293c dc2652b7 81093a91 414098dc 04763522 28554897 9c865ce9 8ae51fe4 7cdc0281 e2b2ed3c +2268189 54ee2700 4ad57c49 171a17aa 69f0465b 4e4bf576 78c64200 49306dbd ada27c54 a1ff4228 2d93598b 36b7c94c 65619de9 bae368f3 0ba503b6 cfd89f80 eead58bb +3834696 53a71575 a4fecb2d 2df51099 0ea76ca0 442cd61d 15af62c9 2d55718a 01408d3f 241848f8 36321513 b7c36296 c08e8a71 7d3c5730 491ad06a d1325217 a7c5bf92 +8530569 d0fcad65 76f665cf 243fe321 c190406a a33c384e 03edcb52 418fd3d7 21f629d4 93ff1ed7 2fda5ff1 be71ba30 e73ff46d dde46400 f272d4eb fcf748a7 3aeb07b9 +14955368 aaa707d1 06ffeebd 50c956d8 47c747fe 62a5adfe 2fb34946 1413eee7 3cf4d967 084c8fa4 cfd091a0 f1ca08dd 1f8a62e2 b5006df6 29d00047 09d6ca00 28d028eb +6104018 1c1ce839 1dcbc61c 9182e24d c49b2f00 94ff4897 806cc5a2 8dc54c1a c13fcc9e 98b16914 5e995aa6 29974520 be7987fa 378d0966 7ba42d17 0cb1a0fa d0b8eccf +14578279 79553267 cb209a76 85298d17 1632d6ac 489c31f2 4cb1fbe9 708e8997 57024131 2e764780 5e22b911 914f9919 3d6dd75c 47f25f37 bbed02aa 467e69dc 79377a2d +7521739 da35f639 002ed3ad 03a63f9c 891f30ff 1e84af11 a009cb0c 4f47e522 1548addc 5c7c68f6 354cac39 b1ddfa5f 343ca47b 831749b3 6b2de1f5 dc75b4f4 77f721e8 +12567191 dfb6b1eb 510086d6 886d33ce 46b0a1f6 171e60cd 5bbc009e 5fd6249b ab7385f8 d826bbcf 4382eb5d ae29def3 68486a25 b7864d78 a6125d1e a3c2511d 3d64551b +2536887 732237f3 32d9e607 f95f5df1 f9912172 52c77d11 54d4ed3a 3ec633b6 35c8d176 7d7a0734 a0b855b6 40e12cf7 1d7f9335 25b7d826 37ec21ab 70d9caf3 608f07f9 +2626911 635d634d e1106516 2aa3198e daabb20e 81f7dc5e 98c66d80 91b4291b f3492057 d35f3637 6f735b5c 77d6ab56 5a796065 35b0eb83 391f8ec6 e4e6de41 25266ea8 +123872 d34ee0c4 a7c3404b 3cb724f5 7a5ace61 b4434b6f 7346b063 7fde8830 784fac0f e2813cf6 d9608a93 4a9e93c8 60b7d631 e1fed675 592552e9 822e299d 110ce874 +16073444 639e6607 59a0fa2a 8b8315d8 ad54e8b1 fed39242 9a9311f4 0d27fc3b 2cf64d55 0b40954c fcb70a05 d9d3fe76 32b8ebf9 b8ce7532 e4c7d06f a2ca4968 baaf1cf5 +480277 93796c86 fc2caefc bd8dd059 67c87cc3 16c7c399 d08811bf bd45e17c 107e8035 60d87cc2 668c1a9f b5ee74bd 856f1225 570de86a 8e82e2ac f1667a56 b507b1a2 +4517552 14b62bbb 9f3d227e cb3c3cb7 481e480b a90d8f30 ffa1d8ad 3425df06 7f43d95f 350dc5c1 f2533714 b3b7884d 13fbd066 c578e12d 6c5e2ab5 89077fed a5b78964 +14526347 fa8357bc c68f298a 82778baa 13f18ed4 6599e9ab dff9d8cf a7813c09 92ce0b60 8cc17de7 2bbe9da2 b633c079 50cd6619 a6658ecd 80ed3bdb cacb7a7b b51bc57a +4021706 0e1af935 23c7fecb c70a28e3 be01965d 29047681 f82f5d42 291aa191 61f9b9de 45421ff0 dfddb153 e194ad46 c753a368 08c017f4 2c16dfc3 9e7d62c5 0865529c +16601051 40dedcf7 b15b5459 cdb5648b 59be8c1a 2da6fe2c d1d030c8 f7b54cf0 aa2c325b 8f1f50d1 c2ce8550 fbb87e95 36e4adb4 7319ad7a 59e22852 f9a28041 4ff511dc +10374784 03e73538 cc7d0433 7e59b9d4 d39da5ac 863bc99d 4f128c50 3f20e5a0 5c1e75ba f785e6f0 789bde32 ae200009 60dcb021 74e902bb 87b583f4 c0e1ecee b50f3f40 +8642630 383e126e f011d14c 10963007 33a9d183 1ae1b914 68e9adc1 f41c5fdc c81ca140 a952ad1e 32ffa19e a05a3e89 01e3810c e8e41cfa 1baf9bf2 0c5143f0 6060eb3d +15764601 00154e0e ac663c25 e03025de 12e4192c 8c2a935a 5a47e541 84f2b24a 9910e504 9001d663 0b958a0c bd6555ba fd5b574a 07a580be 6a268372 85071165 e26e80a6 +16380575 bba0d303 fe2ba926 fe0ea055 c1b1daaf b1a78319 adf0e4ac c287dce3 c811180e ec1472ed d93ac7d9 e3158d67 e0300b70 cbbdf64a 22a3fee1 b055c695 a9fa2bbd +3839490 d66057b2 37151646 254ebe9c 35216f96 39e6833d 37132859 cd11b6a0 3c63bc1a a21b44eb 6f4a4eb1 0262b870 fe9ddbff 80799d41 f8d002e8 7f53e660 e2a4900c +3160156 f397ae03 3fda116e 7e009f30 b8de4bb6 4689dbbd 8de64df6 e7907e64 eda1e0f7 50d1d147 9fb813ab afe0672d d83e00b6 bb4c19b8 6a716cf3 b5d2b143 3b0b4e2e +1480648 f0fbb623 d7795cd6 e913a708 3a5c13eb fe36a6c5 8be1c044 e80080ae 65ddcc71 7ad4c288 522afb7b 7fdee571 35e57901 a303f190 08eeb550 06a1f59e 42ae831f +12449094 5a7f7ae2 7dc4a47f 02935204 09a44bf2 4e2e0c3c 4c3693aa e468e34f 1fe974cf 1ec9ec5b 165f13df a828c54c 587bc4b0 400ac288 2d1c8668 e39a1de2 981af193 +9079695 ed908ce6 c75c910e 57bb80bd 40a08e76 bbe17961 ded71f52 4ce71fc0 f656772e 7f2b1962 f95667cd 64c69354 f193938b 7f42847a 2ca34c79 b52b329f 9c901239 +11457730 0c4114a4 606b9700 03eb0ec5 1b32e39b d5b87554 16075e94 b41a5b76 6f9e8900 78679100 bfd394da d7db9862 000cecfa 49d11373 9ecf7a97 e657762f 87937ba8 +14907601 414c04a1 558c6ef3 eceebb3d 97ac327d 0183feef eac8bc21 99572d88 52fb5a5f 35ccdd3f 99eb2067 69d7c06a 09367440 b58fd361 7c34dc6d 24cd4014 670652d6 +2668950 f753e0ab 95e1b3be 9a33851b 385145f4 84808d4c 9c9d46ea 3805302e 32fe9816 00e7f749 7b3ce5e2 7f7cf7e5 b15bdb0c cc9cd01f fb31418a ff88bd91 1944a1f4 +14409766 418538d6 2368acd6 0dfcaa1b d1aa1e42 7a007665 dac6361f 94c94e07 86a17451 3e5796a3 1bda9ee8 12c53ffa 367bde66 19036faf 2c0834a8 40c57ade 16beca5f +9457656 20d4f728 0aab79f3 d1c426f2 4f564c29 3f9788ef 860620b7 76ed1ad1 bcb26df5 680c57a8 ce5571ae 4dea4239 8cc14ab8 f080497f a87c9dc0 d5ab0e7c 45155ab8 +16591878 a926a166 02a2162a 977e851b 944c7ede e6f4fac9 b8352f44 0530ac67 f1ea448f e3dc7723 2bcc5151 db123b50 77c39c8a a4b9490c 01988c27 feeb7406 1f115bdc +1142225 50eb1692 be559e3c d73e9243 ecf8e676 bd50fab2 98c65719 d1d7ade2 70a144a6 f79357a5 2903a1e5 1e70e5a9 c9fafd26 b84b3cd6 f07ba7cd 1aa4e9d5 ff3dd759 +11423725 589a732c 3ac027d8 fe88ce1c b2224bd2 13b896bf 01de3b77 b93ecd7d c0883a55 b99e6d31 16773001 14f96b9b 58978ddb f5f38641 2fefd819 a5de9f2b beec5d40 +3845007 47cbed35 140501b5 413e00f5 318c4f20 1efedc0e d1d59d04 54a7957d a6cd124b 57c4168d 91ac4a33 e85901ae 8046e2cb f42c7275 eac2ccc6 a119ca44 68bca778 +5608933 60ee97e7 f41847e2 513d9c23 94048007 15f30a4e 63cd710b f52f4037 4883f40c cc57c905 35c59e99 8234eac6 7e672267 e569a0e1 3cff8882 299a0e13 3e84d173 +6677161 3db591ff f18ccdcb f494f87f c06a2262 876e7ba1 5f4bfa25 12720276 dd027f29 9bf43c34 f4d8d029 3d050cad 435c9524 caef1e00 6d5ba148 09e466af 87e9ce19 +793444 595c5b78 ec347cd0 f8fab2ec e1d940fd 4b41c101 a12a7781 82777a7e b6955d76 05c84dd6 5a558b19 efae4d67 f3fff844 2cfab264 63e3ba49 221a170b 4de11909 +10494858 fd20ee11 086833a8 465ced66 10dbead4 8d23e5f9 5eeb533c 7e1d6196 730755a7 b8f57d65 0e5a7f35 2acf0b6a 3390671a 353284d1 fd60a7e5 f84886a3 dc3ef751 +1568203 a8c66cd8 ce2c6346 c7b670e6 f76fb1b2 037a6130 2281e471 d511cf46 e65a9ac6 9555ae0d a85ff530 98cc0bad 66d1f7d4 4fdbfaab 02038b51 74b289ca d796bee3 +9350855 156f5695 6735c49d b0025eef 829ee0e8 6ff50745 bd73a584 59e1d97a 7e877789 57b2dab5 44c65152 d59f5a4c 0b7c9a40 ae7b76ae d7a9784b 12056b97 fdfae6b2 +12397627 c5cde9ae 1ad64400 bb8f22db 3cd46e85 d011a167 1136ef22 fa633338 d1364db3 3a7d88c5 aea1ee6b acad8069 986e0bc5 b2d23671 aabaad84 fbefc03b 8d738c22 +7035764 0d14b06c 48d37c2f e9881e63 6937b6ce 4c39804a cd719632 895bf73c 9b3214d1 5d8ba0e4 40c8a16f 5acb9da2 335b6356 272f6f92 ecf96012 b13335e6 9aba82a0 +2247133 204d2474 b45fa958 dffcc9a5 93b8e675 2a62eb48 dc99d8f5 9b4813bc 2c02b1c2 95f7832c 9055f0ad 173a0e7b b0e29316 f4f514ca d1fe1a1d 5477eb6c 494501b8 +6267066 3d79f3a2 9bfec9b3 c20610da 81326040 fb94b47e 8e01f128 80fa281c 551667aa 81d290d7 4f8c0456 4d0e9b85 c9d215a5 48abde35 8c22d736 1d7c00d3 be7984cd +2076720 0294ec69 5254eed2 2b42eff7 0fee301b 8422d627 b22cb84f 32e3d682 486455ab 5f2e7314 142ee71e 2f154067 303f5f8a 328f5ca8 5151e83f 040cb109 fbd2c0ad +13705292 d2bea6e3 a18375d4 8976eaa3 480f55aa 90048c37 72f22108 d4265c9b d3f70b02 ecbaced0 13951e33 d093d0bc b00e5548 a6cdd988 e84d2072 3756229f 397bc210 +7669424 faac9f21 646b9365 97c715b8 f54bec06 3e8777fd bfbd7a68 03a77706 96cf3159 009cddf0 27ace1be 845ea8b0 258f82f4 3d395258 bab02137 ba8351e1 fa03a69b +15299604 ab4e199a ff92a41b f7360049 ccf8ad2a b982fbc7 c1adae0d f4c15284 095c0538 0b123148 0fff71d3 3d39d23d dd13a0e9 6e44a324 035d352c 782897e3 a1e92ca6 +5382481 b481b1d8 d52ae750 4fd39f29 c18fbf38 9424192b 68107ea6 06ed3dac 391015fe 9167e84c becd17e2 b7ea0e41 87207041 dba07e89 b84494bb b1f235fe 10f288a6 +14436159 9dea9479 0551163e 161b680d 882dfbde 5e094123 7a4e4a3f 100e3818 5af8e010 62bd812f 2f7d04fc ad8ba4cb 1aa54380 24bf6cab 58734641 2d7d44ce 1cdc91bc +15962258 13f7ab5e c6db628b 3473ceb3 a819a283 00ed3c51 7113c64a a8b8fae1 4b976b6f 356a2542 8c66d00c 10ed3138 8e2b462a 4ec649b4 ece0febf 855b9b7a 40f68749 +12895706 f1d08807 92363a71 1b32b9a9 e51d24d5 6f006777 36782296 800cf193 7010812f cd288a8b e4cc5e2c 7e0ae889 f02bdfdc 2d04f7db 5c4fba66 b3c32a6c 5c01d43f +7786037 de4287bc 4b5e2da9 054b0ebc 2cb557db aa22fb4d 9766b6a6 bf6d3e69 b644c26b bb66582f b704aa53 78283bce 809428c1 596918a9 8d910dec 2840ac19 d83eebb1 +9584804 f2a68e55 889aa70d c13ad232 6f1bc333 243b71c6 0f4dbf8d c881920b 761b28b1 a903424b 0eee7475 717d71a1 28a70fd9 33b922e2 bfe015f8 30c44763 af2c12d4 +1569994 f588723c f53d237a 9303f9e6 ad3eb29d 8a758298 8f6c4fbb a8a2ef45 d38711b3 10bbd222 c614a156 2f59ce79 2d6832a1 a970efca b8bf8718 6ae9910e d687ec62 +16404318 afbb422a 10f832ac 5497bae3 26093c47 9a325548 ecd967fe affdaa71 8708671f c3456052 880433a2 b47d2588 e844648d 8197fb64 3f1cf5fe c9f26f6a 38b222ab +10787217 9eb67e72 6342c2fe e3be241e 5a0d1aba f42faf2e faa290cd 67ef78b3 e7a90964 ab47c62e 3933798e 08462834 94676e7e ba1c65df d59667c2 aa65fc81 890465be +8551420 344f990c bd81c5c8 64598dfc e87a8bba 52a4c1e1 420643e1 c84a73da 78cf0183 fc949053 12774f69 5ea758fe 3ddf92ab 234b933e 64768008 c18b5b14 a90fc4f8 +2716521 9ee3c173 22beb95b 6a490ccc 6d2159e9 6909181f 2821a306 32ebe6a5 5e983217 5149a4ae eadad52e 91214137 ff5fc8ea 0ff67b54 e33e354f 9a66ecb1 1496cb01 +14470175 eb99edcc 618ceb95 f4a06099 92a9cb44 b350b8b1 066c106a f092285d 2ec6d749 2d67a129 d759b92a d817cd1a ea150c01 f45f9912 6967f652 0904deaa ddee8c42 +2981554 dc348590 2a4d8be6 6aab772a f85e04c9 876acca9 08be67f7 6eba4d74 fc6c3897 09c9ae2a 77f9e5a0 5ad99be7 ec566199 3c6a303f db11d0d2 7ab2223e 0c96a1e2 +9851754 d92b4301 f35dbd4d 40c07b67 e6bc8af0 af4ab890 b31e6000 f412c9e4 ab0a5feb 510045f4 cdf47e0a 45198c38 6ebbe8dc 9ef74d37 b3cd42d9 c93dc314 7a48ef08 +10194152 ef8c6781 57be3e72 c6e7d9f1 9f36c148 6854af0e 6c600545 311e7c36 546421ba 0baac73b aa0d617b 9501f154 d5a18ddd 2432bd3a 980d6fae 3c8108e9 929ef4b8 +14866007 89291f7e 3aacf91c d913220e 843d6cb0 b46b2060 1df991fc 40b5de88 e8316327 e83ba16f 8afda754 12a071e0 97f0b3bc f4070594 ab1d3096 8398c988 288d6b3b +13681122 791fb4a6 fa728916 17a55c1a 02ee90d1 c74f5476 40f7f517 7f46308b 47608fd2 07951ace a40ea3f0 f77ab688 da6f97a6 5634d752 736e917a 3276b07d 6b74728a +2187327 41c7b2bb 8ca7f2ab b8468033 11cc5f0a a0c45e55 55f4dfb8 d0cf5efb 288becca 4253a3e2 d9134710 b2faff17 fb7415eb 75da0deb 17132cf4 8bcd5b94 9c48bc58 +10893970 84bb2724 38be50dd 9ac29d22 3900de64 a61e709a 26ae4be0 6bc4569b 337c827b 1e3f2527 f73df4e5 d2356ca8 5ee2d5b3 d27e2fea 3e2ec717 74e29fb6 f19422e2 +3192992 2278ce28 7ef7b26a c4c4032d 745e1eed 94a1df94 e91eb258 682727fc 0b8eefbf c76620f4 34d754ad 6117a789 93966c7f ec39eb02 40ba12b5 9410f4dd b3ee0388 +13199771 ae9c3cdc 01bc0e8c eafac58d ae3aff88 0893dbc9 09be013b 1ffdf285 53dfd9f7 d7dbe6c8 43f0ae83 3c255c38 573c0e29 8fb46d23 8aef952d 37746592 a4674d52 +16628670 d5aeed14 641a3b10 9fc41438 3d57ca9f 0739e59d 95cba57f ad205478 9217cd01 367ae6c6 cbd66785 ad5304e5 fc53ece4 905c3722 bb998a7f da47b2f7 12990aa0 +7344670 1450065f efc1c3a9 194913ec 19c5b978 7e623afe 2bd974ab 4ec94837 15cb6ebc d66db12d 95696379 ad750db6 0caaa18b d0c38a8c e87bb635 9492a5ad d49923bd +12173434 91260e03 598ec7a5 3b8dd3e8 e795e5a5 a613acce 75b3e322 3f26604c 32239546 864ea54e 767d6110 37972ab4 c322a07b 6d13f378 dcddb3ad b8cd25ea 620d3173 +10344179 15b4a547 2ab2e5d2 b8469b90 40bc8892 45129594 80c15eee 9628b76f 3a6ca2dc 4c54dfed 81be6780 d86d80b7 1a919603 d422747e c278f5cd 08ae3ec0 23e821d9 +11954261 027dddbe fc27fd17 c11c10f2 2935cf39 0e9cfedc bcc0bd3f 41ea23d0 07e80ce8 d84ea73f c7741262 723372b0 412bf5fa 0cbdb607 eedb3545 42fc434b 91e5f571 +16451274 3fc55029 9ffc8db4 20a6c740 9a03f655 4c436f20 17c41714 cddf0f12 380b6263 777c665f f62e55b4 c8ec9d26 19f214f4 3a669ede f8d82dfb 515d6b7d f9cea0d5 +12593411 f950381d a90677fb 254a9605 069767eb fde759af 79045dd1 dad747b9 478a120b 9ee272d6 813cc543 b3a604cf 24b82d12 44723f41 2af429c2 66527568 d555f9fa +4459518 452b20a4 c0dd1ad1 76726fc3 7c996504 bbd3fdd4 bc53dc34 0e621758 3d2a739f 9c7981a3 73e2257d e7e89e7a 4a963918 83bc0cbb 98485729 5f721e0c 7b08b895 +10722955 81522e96 27a8926b 0ed482ea 8bf2b81e 921d5561 ac4e4a92 f58f6722 22c4ae51 db07c37e 3e285ebb 6ddbd754 cecf2d3b 1289c973 15c73c92 74cf30b5 ca68908c +9135483 bb7e7928 61b8b1a6 9ed5cdfe 2778488c ed66535c ceae4e59 6ef41c7a 7a49833d ebf64cb9 df5bf221 22600c80 3e28dcc0 b4e84c26 8145c941 c4d8d620 b8de1404 +15056881 cee412a2 f27a4c5c 75259ec2 527145f7 8d9c4818 6ad0eb20 d8c234b8 887305e5 c9e31f6d 6a7452db fb7285f1 71e518be d664eb24 b4b408ad 83596161 8efdad1a +10704828 07d92d86 dbf766d3 167820be 3e0301a3 56cec611 57f1ace6 54f97995 0c3be139 0f04207e cc5a2bd0 f69ce4da b0c6e5f1 2086ad46 f433414a cf0e7ce6 ad1ef1cb +6625724 6e33660e 0e41aac7 f4dbb23d 32002381 0721f63e 892a33ce 5c0b6f15 cb2e979c 832337e7 97ceee95 9f2b6a87 5904bdd4 6ee1a3eb 44efd295 d7cb43e8 e7cd02fe +10702995 527aa2ff fe31a02f f34246f5 6c556327 f5d5bf79 2f9dd34c 036f3217 b443d9c8 99e5f9ce 79ce0d4b 5c0ced67 5517a263 ce2eeca8 7eae8599 ee25936e fcc1e644 +4790450 3ee043b6 4d35de55 d2eb7a84 4e1fe8a2 347213e5 4571976f d5e87dc9 4f23b674 b2f6ff56 061a5ea7 f9bbd2d5 60a486eb ef046b07 813ec7ac 2a20356f 09c15b3b +5444287 0b686b24 13817be6 1e1f16df 1d78ad8e 42f1a57d 45e4a964 297dad73 f0b7785a 7e5a9c93 941d198e a855c38e ea46431d f3bbda6a d5950196 973eebb0 fc127ce2 +440064 ec24ffd0 2d49b2db 28ae309d 6b65424a e76338ba cd72abc9 c48f518d ff749fba 8f2cd697 6147515e f1376488 b68b5c08 f29e2b3f 5f377f2e d4649551 a08dc748 +16400858 02462cba c30565f1 49675920 dea130c0 a504b1c0 9385b6c4 55d35821 2beb99ab c86cf8f2 78200009 f2f4152d 47fd4cd6 08fd2b62 de9d232e fbcb0401 74824f85 +1663252 83ac1408 466deeb7 8b73399f 0da5f36a 3501ad50 6b23bb92 b55968d8 586ff9cd 8000cc5b 5ad39163 1f441029 fc152633 7f3dd666 05a79ed4 ecaddd21 21deee4f +1463876 c4360113 db2f6605 78545e1a 573881bd ab1c81d4 1f27968e 9148a385 a6ac8f52 7b95fc7e a9c68ff6 09477529 b3b1f991 8dd00761 22247a9c 52e1addf dd6bf252 +2567245 a0a5910d 8381ef43 edc59ac9 db40dea1 d22877f3 08446307 f5855c34 b1444522 e91f78e3 591a4655 f92e3d57 35f23912 af98365f 313cb517 2bba7d7c 59aeefe2 +5528388 ff65c078 99dde8ae 1a489c2e 335080ff be96a2fb c575205e e431425b d75e87a8 6eb1b703 4f6b456b a6995019 812c7890 ff6c02f0 7958dd92 9f457d5b c2f703c0 +4163488 9e54c9c7 2975eeea 196cb865 a61a8183 2f27f4cf 727df470 c42c34a5 ddde2597 a9bf5c3f 5e868beb 124d5c43 c0732a48 53627df9 caa49501 922225a5 b19e51d2 +7837784 32436a36 7854bdb9 238749e7 736e82fa e606c2ef 8991135b cdd34bd8 cb2dc895 0bf009dd caea9ac6 c66880f3 1b57a815 2d38a4c3 b8176635 d478b6fb 3842a7a0 +2331863 5745bb8b 828676d2 0ecfaf43 6bd736e7 925721d2 2383c7c8 49047b7e 0439f4de cd326ba1 bbd7c99f ddb3f18f d377ad5b 920547e8 6536abc0 5065aebf 8b98ea98 +11328675 d2b3a7de 49a0f8fc e73f4286 980fe3cf 5111b76d c4839a92 4f8800e7 b82d94fa e5e12c1a 195359ca 30f6ff86 3537f994 2740d890 829906c1 afc13bf4 0eb985ea +6595903 245aaf03 9864e2cf de114730 d7e81d0b 9214bd2d ea26aaa1 da0dab51 cd982504 6cca6236 85e487ff 78eccae5 9e135dd3 00c16ccc 5d063a2a 3e1c4cba a5390d80 +2152081 1be14f64 8749ec94 e70c5a57 ce7b7b14 0809529d e3503deb 6c4a3723 3ca5c5b1 d0b707b1 c1ff1f35 dfa59683 d405b738 ba8c4bdb fcb7bba5 82106e05 fc3ad5cd +13933465 92fd311f 2823268e 852c9479 9cd00817 0bb51b17 bc237bd2 34beee27 fe781820 a0bbee2e cb1989cb 0c2ab4e5 2d05cdc5 b2b13348 592521ed d3ab183d 9fe51a2f +12329799 cdc778d5 dc9d1ce5 037b9ff1 53f22d70 f7b27e49 163df11a 171cc469 40b39365 828c5ed7 25bb8bfd c52c2c75 92f713b1 0d997fae 35ac6819 311c809b 2e11a96d +6828097 696d8f44 c5686ff1 5bbf11e0 18af46cb 6024a948 b3cbea2d 41f1de2d 89cb3f57 b7166a10 1428fcf6 7a3651a0 e0a7cfed 5b90855e 62c74f31 9046cbd3 694b6ac9 +16142759 f00d3a58 2c3c4c66 dfa9f552 6e979a8c 7d6cdac9 f3d487d9 62b107c7 0a9dcbc6 4e251d55 8f890ca2 043b6b40 c6029f09 6add76b0 3c53caa6 b9b5649a 2ca7cc3b +5866474 0bf19e6e 6272c46d 33309f49 0179807f 708c89a9 c2d89b44 d0a59140 c01fd184 65aa2533 b3f042b3 ab5f8eb1 64b7ae3a bdc293cd 14546e3c 3c177dca 231a651d +9832999 14720eaf ac3bc867 d9425a33 273eefc4 499d00f1 e99df20d dd6b3c77 a3865083 99dffc1b fde5669a d3f1a2fc 14b21fc9 0e34bc5d c4695395 99c84976 c2946498 +3466735 4eedb63b 527e255c af8d2595 f49714ce 192a5163 a6899bc3 ef799f80 0905132b ab7933fb eda69a64 0be09493 f2814d46 6f69f180 29fde41e b8df27c4 4d73ea86 +12855500 f7d8f6ba a026f7d6 5518ff34 9271d2e3 172b9304 3898bc3a a3296257 d2b382ef 4002076f 8bf896bb bed33a38 04e5ec32 9f549ab8 c6456971 450480de 719fd2fe +14156420 f5f1cf8b d178e51f 26b0cd9d 41456802 673d95b0 c5d0b4d3 80f6fbb4 a08a61dc 38e212d0 ef7955c4 dc031d43 4ee57a4a ad5d09cc 8aca85db 576d21b0 d6818b36 +16214546 7a2f6c24 722e496e d4c5d111 dee12421 53da814b f797e2f4 ea1ad3cd b6d85054 3591f1be dbfede70 50369806 0dd3f771 e8773bbe 97a4a609 a1a48204 02cb2e6e +12623412 b2e4fd88 b558de6a 67693c21 6dc59d51 c7dd2b9a 8ecd0cb9 f747d395 209d2a36 5d41c28e 8865daad 0a10df95 3b2b9827 c2b7143f 8de54094 d888fcce d9e7e3da +5029986 3e8c5d66 3f70bded e48fcbc9 e4a4782a 1c63e6df a094d597 ebccaf20 ce52b5d8 500769d2 2ec251bd 5345482c 3080dbc9 8d22a24f 4c7c5fe2 462eedfc 7515d27f +13818207 e6c5738b ffad97c0 a435f8be f303bea3 d1053cdd 313d3bc6 fc2e9d1c f7a1d2d9 fb76abbd b852c81f 6f3c5d27 a2f0ff42 0928746e acef910c e4f28569 516e1397 +16113553 dfe3ce13 43171cdd d38c1522 10d28c62 3970298f 08709179 bdb7d8ea 1ddba739 5f21e3d5 e473f622 aa55b80e 39d07239 3b3fc748 7ec20621 068fb9be be29c722 +16300554 dc051d0e 92f5a669 79e89dac 28954b27 6f2991db 39d5964a a3d4a792 adba7fe5 4efb0dbf 422b464d 28e2b710 84a94f4e 8f5fe751 40574983 fa57ddbc bc624fa3 +536598 27e0f96c 02438fe0 afb7c374 a8e68f5e 86d7b6a6 e59ecec2 38da08fd aa3518da 8fc7bbbc f1b2c3e7 4afe42cf 9696b3d7 f8df6545 93c24190 44105acc 95c506ce +1536475 479c1768 f864f683 73c407a3 19ca7291 b2da9cb1 fd350543 c60bdbe2 d8d612d2 fe8a4847 6a287753 04fcd08c 9908550c ddd65b22 93b96876 3a7c2f3e 98af6b94 +5784286 7906f479 99bd96e8 9464043b 90254da5 b9b0cc4b 7282c484 5cfffa2c 264015ed 3dc84315 ef518bda abaa5f92 b73d3fdb 8f6656c2 9f482aff a7eee752 6381f4e1 +424568 6e2b974f b069cd83 711cc613 002a569c 9065a198 e2ca8ac9 7e3c7c98 d6da8d1e cc31480e 97021ab4 32449b1a 70a8605c a32798e5 f5e5e749 a1aa3457 2955bff3 +9029533 e0a7cd91 fdf8ddf5 ebc2c89e ac7d5fa8 21ea07e3 565a70d8 0d5f867f 7a5149cc 31ea3d18 f008f3ee 5c83ac46 cd07093c 42b6f1ed e70b5faf caac01ad e5100e72 +16604374 8dcc182b 7304b63b d88a9e87 e5292426 16927487 097d1bab daefadc0 f4271082 e97a9407 83536405 7781a1e0 81133468 1a9f791e 0105e617 2edbf6ee 8724250c +172143 a42f695a c666002f 6a44314e bb133fb3 cff35bfe 26c576a4 a4be8666 4f66792b eccc2421 27e1ff9b 3288ab55 6349bcfe a5a68d6c 39f3972f 4322fc62 fb04990c +4326323 e838fff3 cd87500d afd65b8b bc6e380b c736a504 1b951364 4a38c0f5 4a11e1f6 af1073c2 6ef743cf c16c80b6 0d29eca1 2e27f071 0dfcba16 e9abc462 116c2736 +3361761 210a9cd6 4a04b545 577621e2 2e49b608 dc0b9d77 86b8c0fb e400fd21 0d2807c9 711dca77 5ff81acf f85809a4 f2bf25f9 84a525d2 4e980cc2 918cf42c 9a260fc9 +11998798 70877ea5 9e0fbc9b 6e432c0a 5a029dab 88a359a6 961a7eda 2852fd36 46bd465a 0f97d33f c481638e b0ef4735 34703285 8322e714 4151298f 95c84938 714cf9a3 +8754328 40b66a8c e9deeb0b 7c290d21 9ee7b487 d49295bc 7d8863b5 a064fbdf 1231dab9 212c72a2 1d7922ac 350fec43 d147d21d 4c6c3f91 66929f5c 2a875b24 6d286799 +11375191 74298d13 80f0437c 2053ca92 c0e707aa 56fd138b 2f60a786 904840d6 d9f5a122 2069d013 f75f7e15 3032f299 53249b6c 6af113ec 346c287a 4d044a80 472e64a8 +5237736 e3ff0779 7e673726 ae10f082 a9a81f79 78b54ddd 6d044143 519f258f b7de55e5 9294cdad b892629c 7fb22e66 e6213ef5 d9c00c71 d22ce81d 878c6af5 62d275b3 +15987441 dd5d50d5 3ceef960 19182faf 3dc49fe3 32191932 c33d498f 4a36692c bf65789c 2a430e69 93f7e6d2 d024b492 484066a9 ddd4845e abd416cd a652984c 7d8e0b50 +3470415 8b71a90b 854a18c5 cdabee29 1ef23d07 c91d3011 ed36dfce 659c31de 4109b9a8 53a3cf8e ea09bbc2 bda35289 fb356108 d0554ef1 58e3e745 2262e5d9 e41ec108 +1290500 23a2e8bc 3af0abb5 2177195c 42d6905e 820298a3 edeefbe2 6a1d63e8 bc44c280 6c1b6390 c9a121b3 248262d3 d7ec4ca1 bdab2893 1316004a 4d2cbcbe fc3e0f16 +4266383 8b3f6708 17b7bad0 7339da62 c18d5612 2832cc3f e30e7027 8facfd6a 3f22d8ff f2b91fb7 4130a12e 40676433 6345d427 5582941d f241ffb9 d9b7014f 9a3ec05e +8851440 098a1b42 37514cae ad5f462b 8686302e a5c8eb4d a4952fdf 2f3044bd 97a2338f e1cc7844 bccc8466 17829ad4 d011baa0 685930ff 046f95ef 84781ff7 293963ed +5856796 ff6b8881 fd8f965c 840159cf 82087764 315127bd d0e22224 8f9d95a6 f766e77b ad5ee12d acc08086 4cb8b6ad 97b7f40d 5f577f56 f57b5fe7 942cd053 265f8045 +12232222 5822ab7b b822e2d1 006be380 f60d5ff1 69173702 518639e7 71600cfe a7e0a27f 2c0cf5fa eb7ab553 1f56135a dbce0ff2 5909c99d 8c767c2d c7597893 f63d2c38 +2369614 eaefe03b 812506d7 978c2ad6 5e34b34c 370636e3 4b5c8d72 02822e6e 019ac011 095b9ef6 ea6e23de f68a949c 28a4303c 82260617 7dd65128 380f38b1 e3cc0f3d +9073786 2a0c2e8e 44079369 1a6802c6 dc604024 9a9d4de4 dd024466 41f4a746 ed78094e c4ac0942 3cdc10c1 7818ed70 c3e12607 0caceda3 e52607bf 690fff85 90e81283 +7503406 dbe09af9 07583980 6f6d78bd 3f013030 75723249 2ca9eeca 6a1d4a4b 255c736f 027e6354 7e721d8b 49413cc7 2a87e272 6a587358 acfbec21 5a81a409 4c0fb186 +7191446 40ab996f 7da808e0 7aa6645e ecda18d7 74898dd0 07c43fa4 6dd7e91f 141172e4 8819d300 f685c3d0 c2755432 e2ea48dc 3f589762 3a61d41b 94a51287 9745c9da +634202 348199c2 ce0cd79b 1bbf6324 a28ca826 bbeda909 9a5f8f67 65922b97 da39fe60 d22c8747 63475020 26f31740 62ad3df6 23f0d0a1 119d6e3a 2301c54d 859ea6c7 +9414617 d380e067 598f9054 82db870e f2aa1ab8 6d7313e6 1a8c648d ae6c207b 03d18b2b 41480d31 4c77d971 0d65d1f1 c30e2b6b 7e465ef6 e0179cca e01f323a ae503f41 +2932959 d05ef418 202328b0 bac20560 a0447747 0a08aecd cf21f9a1 19081a07 46c8cf49 a8542c00 0f7532d2 a1487e5c 917388ac 7271e12a 0eb128a5 fac62ab3 30350f15 +5050315 75846a3f 42dcab51 cf984f9e fd693e0d 9fb8ac88 11f737fa 62dc40c8 c36fe3c3 d62e5916 e50913ca fb75a6fa a93a1831 4ec85649 29f65e1b d76dea88 0e023746 +3542165 483c631f 108dbc87 05cd02a7 4ef9dc28 038b229c 9c004102 c9a61035 7a206572 44ebfc0d f004e751 8f5af02e 0fbf7582 d7e1cd2d 5fbda13c 6cc835d5 0f6b7f16 +3609414 b9d660ad 54606538 237a162d 69b7a5de 3a401d5b a83f83ff 86cd2c09 b7e2d3b6 658ca4f2 9ac5df52 bcbb4759 7ec09279 ed5f354f 2237ce7f d09e7630 c88c56de +15002687 2ee651ca c2128771 96d8ea32 6ba5ac52 086a30b2 4fa97f40 6269be27 0344c589 021624bb ba7228e4 303bda75 b3075606 06bd0d1f ced36cc9 dedf9372 117cbe8e +2567292 675e8556 386899dd e1dd0960 7997502b 85fbac86 f9a59772 7f0bd4cb b41d4b45 2ac6ac99 05efd4e9 dead228e d978efeb b3e82be4 4bcf1ea4 6d1958af f70edd40 +16470549 66a35da5 d34d6315 36a2ff3d ae3d5fdb b114f704 505d99b6 223a0d2d afbea9e1 daa98bb3 ccbeeb27 05ea96f0 d4c043fc ba475ccc 1239fc60 68ae38a4 09541b98 +11547560 d1648437 a5df3c8b 39272c93 d7594272 c219267a c27006e8 005f1ddb 71c7ff1b bc503d06 1af0d26d 96551a0d b74aa36f 75ee483b 1dc313de 962c5d73 6ca5f6f4 +16428731 c9303f17 24c832c9 68668449 237b4664 dbb1ace3 5f1fca84 5c011318 072c1eb0 d3b6e50f 107dfdf6 6ef4390f 23d408f6 e9a62440 0d222751 b129aebf edac6ef7 +714940 8103d483 8af0621b 16fdc2a5 e2719b9c 55aeff89 1277154e 79cbc819 e9392e92 9284f9bf 35a86ea0 408ccafb aa04cac8 870bcb1d 96f09eb4 7903c574 c7379e14 +7429802 103b6312 43da0385 63a09066 690c72fa fd06d307 8c577d76 ab8d323f a7f6bf94 d6b90881 1609b0a0 0a29fd23 f697746b b2cb5dc1 e28b744b 7f1efb55 1f1e0ef8 +9969911 4bd2dd7f 86492032 14375eb5 6121d703 4822b7f1 dbde3b43 8e8700f3 5cac6202 5a886a7d 6a48865d 90a0bedd 047f7c88 32ff3f96 5b4d553a 501b59b0 79a6f045 +2919323 e8a99b74 07a2ae55 8f4d0845 f7d02909 6bb2bc62 858d79f0 7593c998 bb7c767b 39c57d8a 91e78409 64d3329d ad12c281 7d2c5325 d5fcc80c fc05c601 6e54d115 +10840561 6d0bf160 0823500c c7595602 7effec45 1fc63dc1 9491f39f 6a94a4ca fada10da 4b54cbf2 a59fb807 febe958f 56df9fdc 164ad1ea 1eb9d3d0 20dbf26b e6591b27 +10874433 57e74219 69955a09 4af1f9cc 5a603dac f4775376 2adbf44b f3aa70eb 10e63b8a 0278b954 bd3c6bed 67aae7ca a21bfc07 03ebad2f acd23a2e 781f6f0f 7fbdf7b1 +2382428 b1950ccb ce6726e6 d7dabd05 cfd58309 eb8988cb 65e8f810 52f5332f dc494999 c4a0220b cb6e61e0 f0737519 11d42fb1 33838e1b 9ec708b2 0ab3f6be a8a174b1 +14290310 7118bf99 16cc7c1f 057ba816 3ec3e60b 7d863d66 52af1cdd 6657cab4 01b31f8b 14a87225 efb90f6a a97664b8 7bb8cc69 c871b879 24469417 823634fc 83f99b0d +15013168 e86aefb5 c43f25e6 5252fd66 4e7dddf1 ad2012aa 35426204 063c6799 58b5e4d5 10893340 6babe4d4 66092d61 732bd56f 8ee88295 a70683c6 2b615be7 7bed769d +9832396 de04e875 50ac0440 a2f179ae 7a5301b0 adb6f322 1590d38c c5112b0d bc31cb7d fc11fc6b 779df350 aa138ef8 58329fb2 b494cf17 5ef8a73a fdeeaef8 19394140 +3832049 989b8d44 044a6504 91316e67 9fe9596a be97d469 f9e0004d a3ce1eb8 1b20cdb3 d043e4fa 4dd105b5 ef399e69 2dcd1b45 3f1e5e98 c43228d5 466a29e8 c994dbfa +11902303 048d0623 bc3828bd 3d57bfe2 7869f6be 46bbd4f1 3d50a115 515149d5 bb785c8e 133230f0 e3457e39 772841d6 51541063 5b882334 9295e7a8 6246034f 298185e5 +2725121 045cdc34 33b4eae0 a5dd560c fba64629 bb4136c8 545169bc dfdea336 d7b844ee 5e05c3cb eb32bbca c65ed16a 21732410 00a6471b 233b06ad a92dd0b7 667cdaa7 +15295566 fb3a2e2f d4d63089 427cbb0b c4113750 adc62d44 1ce26259 8b71c389 6518417b 2869a0f2 c66886de b9f6763f 90e6036f 9bbe9e45 477a376b 3fd457d3 f70b21d3 +3523714 c4485af6 dc095c37 a3af20c0 4add9eec b709ac1c 7f5db5b2 2aff05e3 1367df8d f62953dd 142993fc 60c08526 6e08a48b a0e0885e 8c73ed0f c2c08729 61f6bcc3 +6767024 4c222e00 7b415bad 1086f51b 5a8f1914 4439eb9a 45d50a28 d918f401 2ca62494 e93b140a 74bccaa9 a60ec9d2 5a94bfc1 65cfbb2e 2ffdfb75 40d6566d 95c3e196 +5105255 dda58627 866a175b 841e2b27 b4d06dad cac1e68e 00ab2d0c f236ccc7 145b9c0b c79ecf18 3d17954f 8eea80c2 0bbf2044 757d4ea4 6984c544 92ddada2 edf73ab9 +13754079 2779cf98 3dab9605 e0271883 a9c854ed fa7d0b4a 36e40b28 1d2ada38 b6b1c375 21c02235 7db6e9e5 99ff19bd 0cba4b9e 7ceb41b1 f1b1cb33 68b85881 56cebbd8 +16487195 fe988f93 73a246e5 1d114275 dec166cc 29616353 e44d6d58 3d8fbbac 7eafb2b0 7455c1f4 ba2d05d6 3e1f6cc3 2a6ca6ab 231e91c1 05edd974 67c4ebac affa6c57 +7427811 a9c59c8c 2f4085bf 73810f81 a9acced6 06f924fd 10aee4bb 1cc3cc00 e4e063ef 6058fc7f 21b3231b 6044c2b0 39799973 e52f7fa9 e1c6265c 8f765976 c8960019 +6134578 2415edfe ba59b8f7 752cef32 ae539095 2a7c429a 26192dc3 d06bcae0 bf65a1af d1e81ce7 bb131951 8a62bdad 701d4083 5151da08 6d42a2a1 c5a778b1 da05b454 +9279661 ba824f58 a400fa39 8ff6954e 08ac916e 18570916 d779d788 8c181d7f 851cddc7 a219262e a73949d8 860bd240 0b5f4db7 79727ea9 0c93c054 9cc54156 fe5057cd +14708150 8d40dd5e 2d6c0c87 f3ebf1a6 5d17d282 bfc32835 00a8244f 20ef7cc0 a71965fb be1c412f ee404318 e9731009 adb45424 0b9194b8 24b04c43 ce7faa17 e0be9930 +8185489 89302dbf 67772e01 7b8be221 41de170f 31560f3a 9502a1e1 d2ca076b 26cce2ba 959b9874 acdd4cc9 bdb55f2a 0b9562db aa118551 83b8de0b c0446f73 52768f00 +3457768 edc6e19b 2452a8c3 3b320799 442d1918 54b99e14 20015d23 e1769be3 474ae1da 3ec6b481 e441a1ff 39640d20 8fe5b249 d0a92833 6a57b47b a7fc7a07 dc884516 +16129124 df45d63f 3d30b7e2 9b8553bd 06a23778 05de767c a85c9ed3 09b4d70c 40c781b4 1bbd5a90 80d4fab5 5e8bba9e 5b93f09c 1a27d855 ff8f992a 7b97409b d376a076 +9337089 3d2e44a3 8fd71496 14f6fe32 416b174e 92d93fd9 0d4a62f2 e7a37e69 bfd1a26f c7541b01 40cfbe9e 269670d6 b0ce92cc 6c82a02b 5d4f92ff 19ed3a41 4f907867 +3562664 c53c5293 be06ab93 b2ea47c7 fe053640 257c2120 9b499487 b90b49e7 032bfae0 737b67eb 37de1ea1 de6bfd0e b49dbb49 ca1494de 2f36eae7 e92a4602 cff2687d +14698207 b9c1dc23 fb7ad3f1 31e9ec88 af0629a2 5ae740c3 a3561ff7 021bae40 527417aa 5d9aa606 96e2d55d e3adb4e9 4960ec69 cdb883b5 6b127639 a8bb51b1 0f31c27a +4877822 044f4277 403c35d8 3978c0ea 7fddb698 5bad3b30 7ea25bc7 a76e2da3 9e03b990 eb58b876 da6b972d ba4f4d6a f60da999 d9339969 105e0461 fc89461f a302f422 +11072027 aa130de0 82c8df0d e3c3422f 78f9874c 7e1b3a6a 80bb8571 191c198e 1555edba 13daf3ac b9ba5857 fd0fb2a3 fd0d0746 f81036c7 5846d621 5658438b 1ded02de +15942817 14f5f66e 1bca5378 5145b347 6caa23e3 6e00107a 63d6818f 851812e7 e3cd4053 db7fda3c 7bc3a017 3ee651c7 da67064e e554c9bd df11b8f1 faa1363f 44c77bf5 +12019170 ebfa91dc c58aaf9a 4c7ed414 a6348271 f22286a4 b8707081 588d2389 6b35533e e848310f 4f485491 20111ab9 ccab0b44 e9671406 e8fd1b47 c1cf5653 88b8ba6d +4801607 a3ae9ff0 1b00b4e7 0af7e8d2 704feab8 5589ec05 c076f6f7 194658fd 958f19e5 d8b89729 c374c554 d100d278 eef2474d 7364f515 eb6e7ab1 ce159750 7b85327f +16416104 68bb5ebe adeebf0c 26ff8205 43027650 89a597ff b3b3320d 255a7f11 a7b274d7 490cb8fc e02d0c7a bdabf0a6 18405ff9 9b8dda8a c836b3ee 106af5b9 82e41848 +16417201 46a9e34f 17e3c5b4 7c9bf718 6bda4690 38c3fdd7 78f61564 b189bbbd db0df5e5 7302993b 18679b5c 9f8b9c29 cb75724b 836bdb05 d037c9cf 06d1d528 9ed07853 +12946414 7c872b28 24ff3a5c 98f5438a 9a4ba120 befedac3 f1c24e6c aea605ef e5b1e636 a32d580a 75b99478 3a6ae8aa 5f0d041d d6fa2187 a074dd79 a8ace02d ac5a5c6f +10710776 03b773b8 ae50e323 3e7bde6c 224a03f9 95b52c9b f5ed17d0 454bc13e 17b57f54 32f69a01 885561cc 1f6d8fda 348f956c bc7c2308 f918d561 a1b33d7a a2ac31a7 +7646964 20bf77c9 d8c025f3 9e03294b 4bcddf8a f50662bd 48ccccc8 6363d978 98f8d201 3abf528b 3adc21fa cb40aa71 2091b678 dd7b911d 0c5811f2 65b81286 3c85b991 +14479845 7a18765a 0a9e8b6c 6c4b0b93 dc52c3e9 0155affa 631276f3 8dbcaa60 79d0abcd e2f8a6b7 3553562c b3122eae c39e17bc 15cd0b9d ca1fb8ab ec0807bf eb92c7b6 +4154449 36aa526e 69df03a7 abde54cb e9e88474 1b166f85 a70983dc 12f2ee48 28d849c7 9cf6379f 4b631ad9 5ae66fbb 00a090a2 ccd6125c c367594c 6346c195 13368b00 +11456772 801d64b7 6480e7ec c5017fab 0fc85e9a 71c709ae 2ca22c06 833ca18b d679b5d5 75c09a73 5c35a4f7 7c3a3170 728ef014 e54470de 39a2351f 23c02437 00182cc6 +923472 50be0467 171a7090 58a3fcba 1c4d5364 50674435 c0010b40 6f87a6f8 877d933d 61b57960 31d8a458 c12bf7e9 ec45bed8 b130875e 7c431fd5 2da695e7 08ce28f3 +11607828 c75dcb70 649d41df efeb571d 4c04c96d bbfbe11c e3d448dd d39c89e3 fc75aa0d 1b3acce9 6ae8853c cfaf6414 24748c37 4ac8b657 cec1bd73 32ee5b76 b12d1a2e +9238261 a577ce9c 5ff76304 937bfcb3 8623dabd 0d577e5c d959b5ad d6b0f699 fc9481a1 c4822836 0390ac17 ed1ff987 a8737b90 8388b9bc e755b89f 90da9e4e c201d43f +1775535 0696082c 70691056 c64cbb9f 9655a2c5 7e31ecb5 16d6f4ac 6e609c6e d35dc0c4 7294d2f4 24d99295 66812c2f e1661a80 1d7fc309 30d99d56 05aff4e6 e12c4360 +15293313 3d9ed2f1 9cc519d2 c4daf13e 7010bb38 1eae6bb1 263323df d1c0f0ee 5fa1c9a6 cc67afc9 558fb359 25b18887 c99e9264 d4a9e7b8 375a34cd cab76fe3 cf842a84 +5205487 ebace167 26d03fe8 a1354f23 e7602076 4b7eba73 194c3ed5 4680528a f63030fe 99dfb787 0c576e82 6bc688c0 c640a71e 8048f929 3e0a7016 159bb432 74551622 +1236251 5ed70790 268a5c79 efc77663 b9dbb6a5 8c8cc45c f7083ca7 857d7d1f 99371bb8 77decfd8 78e048ef c6f4e18f 4243a2a5 b59a7598 c8b85610 a8a86c86 e060e7f3 +2845337 8daa6615 39a1b52e b3e18e63 d9b81c2f f87296d8 7f3b59ca 833df0b1 8d2a0523 967da58f 5ecba8db 25192b1d ffeeaf25 2dcbfbe2 d32cf723 0e0ee0b1 467657f3 +2777829 c2a89a85 9f92a190 551df37f f4bb5597 699ea558 c1e83572 dd83c8d6 0013d098 82d9cce7 249c8fbe 8c5e94fb c7f4d6f2 36c13cbd 99ddaf19 eb88bad7 e309f555 +184932 835c4701 d78e1453 a2b4c4d1 4450fef2 944670a9 c82032a8 7330c5fe af57eb05 c2dd4341 413886f6 32118295 d5b85314 c33a8f63 b9c6c4a0 4568649d fdb08291 +5894961 a2535b5d 25179acf afb36b59 ef2b059f 9f8bb052 d905dd37 b75c9a2e 5e1814e1 8a4b2cbf 32b49f7a 3bcbdb9f 4834cf3a 5f11069d 54a475ef a37539b2 5dc72205 +3913003 eae4da5b e202b1cd ed43ccf7 6c1e44c6 3d958911 3cd423e9 71eac5c4 9c247ba1 f6628dc5 87ac7643 a3187e82 8aa6954e 4cbc9eda cbd8339e 7f55b442 e448d246 +4508248 d81b03e6 f243ecff 770e6362 7335aafb e3ce0472 010d50e3 b8f3f5d5 a60e05f1 6ecde88d 058cad3a 464a8607 a4f1ad67 61ddcb83 ea0928ee aa74e5a1 ce2b8d9c +15036466 2238c23c a698f9b2 15e1c7d3 5cc1db64 8e225209 cce47818 b4514d50 6249df3d ad24cf06 9e851ccd 1967971f 0d32438d bd6c5955 6ce83731 50d5ce4d 17577cae +12284596 76eca6bb 938b6859 7d966f99 c12e3206 dbea3f43 9586f37b 03ca658c 13038657 e82756dc 89edab63 6f4dae97 477f582b e9408c6a e4e51ecc 49ca8318 5c1bca24 +10704897 4580d0ec bea49b0a 944a0788 afed72e8 ad75797c 0c674ea1 2bbc5082 18c3ce7d 5ea85868 148cd6f8 d7078cbb 6f848fc9 7fe95089 04e7abf8 aeb9c201 a000a5fc +12360656 e911bfa0 fa2c9ef7 37f32b64 cbbe76b4 f21f2732 94e7626a c125e0f3 f1cddebc 8cd3b2f9 3a787641 ad0aed68 6be487ce b3c0577d f558cfee 9dc192be 039f1018 +5105935 1d4113b1 68b506dc 17eee362 7f4fabf6 b3604156 5b7a57ce f2354f85 f6020127 5e93dad6 b7118b3d 2bfd0be6 e33446db 421be19d a65fccc7 d8e7781e 48b91c4b +7221898 85f4da52 d2e99bcc bc8010d7 064d813c 9de5c7c7 326ca8c7 a8d7e5b1 b73aaa3d f6c556e0 56b865e5 bf9b3131 1cb53a65 9b18dbe9 2387b9b2 29208aea ab3bcf5e +14959049 db1e9031 716eaac9 187befcc 58790c5a a4457b70 da3765d8 5db28407 1a22b483 dd1cd654 49ce6221 a54e9d86 224cb56d 6c5601e2 94f59c69 fc29df4c 216ab55c +6254171 63f05eda 6e1fadfe a47e7323 60be3ae7 3ae11d35 99ea9cc4 612abf7f 76288b5c be7e0087 c777612a da55d24e 549ff483 297a793d 7d82fabc 3eb71c07 a5344790 +13039472 db431b6a c1902d5f 55c8a1fb b8fd379e 0adf6a09 09441936 896caeb4 9ec6a537 4cd61507 c164f633 a58becbc 31aaa04f 89af4666 fd34fcc9 d73e1ed0 f9408be7 +1373804 45469afd 3bd6b3d5 0db04f11 1ee5e2ea 0257fa09 ca66295b 1cd45cbb 81b3803b 970a460f cd22117e 3d5e4393 c4e59d9f 5572cb26 04318282 bcd598ab 243eec8a +10916653 a156f8b7 0d257aae 8d19f7f0 a1cbeadb d4414c0c 97d8ea43 5db84af0 c51d8723 00951da9 6c7a7860 910d78da db0fef15 f54dbf7d 1cfc3794 9761e0f6 5f702cf7 +13314470 dd183706 e2f4b536 613baadc 4e038387 f62c2041 fc7fbfc4 2a0f7057 05433400 d096dd99 d6e9e572 37c1e3ec 5042cd73 0c2c3c3e 0a9398ce c0957e3b 8bf7e3c7 +16206499 5fab4ed8 392c4646 e7303c4c 19082b7b fc2ffb3a cdc16bd5 9dfe1928 6383d512 239b64c5 0b080a98 b9c22c0b a656cace ea5622a5 43fd264e ed3cb19d e736cf6f +4121381 e0b18359 cd680032 7f9d1ccd f09861a0 52a573a2 31ab2d3b 1b83282d 28e5666e 6da62dff 05124866 b5c0a839 e84495f7 82399601 6affd997 309ae253 f3fd6002 +16690489 ebf6a820 24b375c1 d1973fc8 d93ed1ae c83c3e01 ebfc0c36 c732b284 3ed82493 582b442b a60ff4c1 39e4d711 b9d0131c ca8a8942 ef3ec856 56ac73ed 1e3836ad +7031331 4f0a3ede 75ef8093 b54e8c57 8dbcbd93 942e6a46 953e0274 637c15b2 c4f6a448 e0851cab 1a7d0797 0f5b53f7 87b5d4f9 351a5853 cd4adf89 759c9cfe d6e024d1 +4232133 4fecced5 5ad1a809 c0361b5a 651644eb 8b31f5b4 eac98d63 75ab4118 dae08abf 658cc544 090181d7 be58083c ae8c66b4 73e65302 49cf391e 5e3c7db0 572a2686 +9286903 0479155d 23289238 ec1e7dc1 8d06be21 fb92a230 e8c3f62d f9d918d2 6d71025f bc2e4229 3c87f8b0 bb7a1707 63397c5b 76cb3a8b 6b8ad08f 620a3374 4a12c93c +4468907 16cd6108 c400b157 d059b0eb edc277c8 890fc1f2 d64d19a9 7cd4259c 6e756bb2 226fd149 47041b13 a6ce7fe2 a4b308f3 10a04a2c 951cbd8c 75589bb1 05382278 +15519511 0c525259 81077fef 8a1e2f05 1d7cd05d aec5b05a 51e8ce48 59031a7b d715ae69 e1c33d2f 86edc9bb 88275d11 30be01d3 ba7bbba9 8b0c9adb d99f5d18 f13977e4 +14896463 92cc5215 a6ab895f 3723e551 865d1c45 e9425b3d a78d3aeb 71e06d96 47e6c090 0a9b4a54 64fc2bd9 6c9271b6 80d38508 c1ffdf5a 75d16c1c d40d1bc4 98e74ce8 +8652639 ea471cc5 101464d7 821bbb50 63e878da 6581777e 2d09707c ba096873 9780e786 517993b7 4cee9c90 e89f3be3 0d5b1b6f 08bc1aa0 c499fbdd f31e7432 1752e5ce +3004198 a195325b 1b80091f 37b1e7e8 45bb2119 dad33b36 800c8dfc 8b72074d a952c8d3 7daf5403 4a81b3d0 e5237dab 38b4c232 1e4a310b 8c9a1e99 6ec61a0e c5c64590 +14292338 b94025a5 8f92ef37 20a0a6b6 643903e8 128c53d5 8dc0b438 443140ed 560d656b 611fb384 20e0e363 06db28b5 aa22703a f4061746 356ffa5b 9f8b39ad dab33976 +7751039 d7759e18 3847d3a1 c6540630 c77fa4e8 eb872edb 88c221d0 f1113e43 5ad77f1c e06599cb 9d54ab68 85e36668 0e88e4ad bcd95a99 f8312e2a ed48ca43 4e886d0c +14116880 e44a7f69 964733ce e7c2b3a8 897f5d64 57a6d44c 4905e265 2f9292ca f5773e42 1eabdc66 d1e97ff3 2589baca e7a43a31 c2830b61 986a6e59 b5c573d5 4248d923 +247466 5d47ed0b 0ea0c1ed 51a51cee ed40c1bc 43e209be 0bdfafd5 3d5d5a78 9c16648b 79edfdef 3df23976 8b360165 6ac166ea 03e50e9f 834d6b0d d526b0be 72397b90 +11762064 355202a7 7257e041 f973d8fd e6b870fd d74917cb bc6ae6fd 5c173621 57c7a146 bb96ee95 d8058ca6 b4be0d2b 5ec83b50 097908e6 14b37ec3 9dd90926 addd13d2 +1196747 cd835810 76cb21ec fbdc7eea dc479253 4da4bf53 c3b3f4fd f5c94b02 5aee99ad bbf81099 1a038e64 741b16e2 1992ef84 0fa13169 a1b4f2e4 ded440ed 0e1e594f +6674720 008e296e 82145a7f 55851911 1fb7803a 9e0acdbb 4c365420 52153d9d bffbc8d5 a03dd1d1 5f59e5d5 ef63144f a58cc830 6ef8d362 0c47b83c 3eef76f7 1e1e484c +14331361 b4788a4f 6eff05b3 8a8fe4b1 f9c659c1 a91e06dd e1c070ab bc97cc2a b74864d1 d0096217 ceb1ec08 5d8e8b7c fda7e645 7460c845 7a0254f4 072181f8 8ce51529 +3486910 ec9b108c fa3a3125 be5e66e6 e211dfb8 cc29f497 ac2826be 19fa5a62 42337a37 b5b40946 5c4ef4dd c235d57d b1c248db d5c4e044 6b8d31ea 1b3b22dc 0dcd2bca +11612259 1a1ebe66 d07ee27c 3970fffb 364aff0b e65e1305 434a7935 96edb638 bbc77b17 e2a3f12a 8d99442e 5b413ef7 0d4c2a27 2d5e8d7b 15bc312f 60ce50f9 c9633ee4 +3566399 dfc14691 84026f55 c404eb25 d833cb3f 1a1f2006 e596109a 5d5d4270 f5cc2e6a a9ca6c75 40677e63 71cb4157 65fd86fc 0e1475f5 f3c08a0d 2d413d67 b49bba9a +443442 62a16f7c 03b4c2fd db9465d9 5494a656 1e59748b 0d63f72f 3618af49 2fda91fd 3276e52a f2b05b23 ea73b1cd bf908ac6 7d2bef6a 31d4f7bd ec5ead3e dff12b3e +16176192 5762afd5 2cb7b8cd ec815c7d 5c6058f8 bee9c0bd 5222fa8c 8a708616 6ae2cdb7 f460df54 1e89b436 e0da52ad 618fe7ad f79d41ff 4c8e43ce bd9b5323 c7770852 +12860997 c12fd610 de9af73c 95a8fd60 01315c09 d1fe9508 4ad7f945 459a6ebe 95ba2727 fbbc576a 31b77501 72fc0f85 81c80aec 72428ef3 4520dc19 f96a47dd 12706574 +7774053 5c2217b0 23824c8d 6fa04fb7 64c0167d b1cb7c8f b97441c8 af27220d a35f99a9 caaacf4f 65d3c897 ee3d30f4 6980b443 01fbd4b1 4e5c95c5 d897ead7 d67aa720 +13460779 96552c80 6987f954 4fd30f46 f5f32a8c 4a43ac74 bc24757e 2b280fae 9e289161 15aa2900 3fe27c9d 5da3fc6b da1f1d0f 995854dd a3b59b6d e17e44b8 eca8639d +6271759 e3d34137 7df87d00 8fdd433b 933193c0 730bbd9b 4639471c 368e7095 8616f5ef a2834304 0dc8a18d 6d625eb7 b087c5c3 54cee0a8 122aa0f1 8db5f411 02e0b942 +1601511 63cbe152 a2049fbf 93c012be 6f137eb9 078e6dcc f1acfc1f 21a9525d eb33357a f6843b87 401338dd 90e1457c 41a4ec59 73918817 8f53c12f 27d1f118 87409d55 +9800314 08aa008b 1f224671 cd65be60 7b2b5ce0 89845517 c384df69 1c6d5736 925c86c0 406ac7c2 fa36411a 13de48af 945f85a7 12cd4c66 98da04e4 916826d3 d9c045a0 +13382041 423d5f9e 72e8a8a7 732a577c eebdb82c 265dc849 bd6c9583 f01783de 4b8f2782 9b3a465e e356de9a 4c46421f 0e961dec d2262a34 9b204ab0 d507e766 7ad55cb9 +12877454 af2b92ed 5cf02782 d4b35ee6 8de63c60 e1cb0039 21c0e74a f9a85687 063edd35 8f0334e4 56f8a97b d11769e5 540a0c09 6f2210d2 ee01070a e543b72f 1333f2dc +14061637 b6420015 463a10e3 ae4c57fc 2ac51733 948433ca a75ed52c 3c7bbdf5 af6ef08e 6b757c1a 28758971 8f555632 c959bbc6 3e192206 fa193533 4090e43e 8dcbf3f9 +6876225 ffac8ff9 92c20363 e04f8081 3ee27bb4 b6dba19e 8e037c3d 7c14ad1e 85da0ee2 f2ea5229 130d7a11 6e5a5ce1 5b566303 eb6d7e4f aed13467 02711224 2587f597 +16252991 498e5db3 4c76235c a73a28c1 b7c17828 2abf4f9b 841e96f3 affc835b eda5ae03 a6f7a41e 53685b79 c7a56d81 802cedd0 96d824b1 1cf34db6 17d55feb 5ad89421 +6195866 21baa59e 0ccfc46c fb80afff c8464070 b7758c03 703625ea c0f437bd 2487b8c3 f9a68ef2 b2362cdf 5c2aaa1d 5a446c8e f54497e5 e69514b4 620a5718 2007c558 +3588391 cd354514 80c3477d 588909d3 32b8cb29 00308f91 094fd475 94c51759 a11010ee 60666ccc a9c71760 3fe2a79b 6dcdc419 de4d487f beb70643 2bbf3b43 77c9b001 +123344 d785c42e f3dfc9fc 7c1aa9a5 99ccf58d 1ff61303 d1ade351 5bcd32c7 3e4de52c 35ed61c1 b7bb1ca1 6d7074c6 e8e73a87 3aeb5201 7d58e762 bb2f155f cf62f87a +15709796 d0dee1e5 965fbab2 59dd16d4 d63e32a4 863838f1 b0e8793d 383a14bf 688a491d 515dbfa3 8b8c2b43 f2ec5290 b4305fe8 3f755894 54d44301 71414030 a8e9efc1 +16401962 1c999df6 6bf23b33 67c5e3bb 4acef50a 95cb8973 83de852a 5dd0557a 94afbf17 7fab5137 09227156 e044dfc4 1fdad4af 7177aa78 b2772715 cc45da42 1a984160 +2580920 a4074922 27a3176e 823066b4 2eff1dac b2f7db21 2c19e5b5 3acc12ad 262660cf 1899079f 824b3936 c167abc2 7fc642df eba2b815 403af024 d5e8eac2 ff97da83 +9887706 d14a7e4e 77e2bbc5 6889b15c 94da8b7f 42197e93 39b2054b 553553e0 175e0ae6 efccadd4 7bfc89fe dc563e1f d52551e4 a2c689d7 17cbae35 f4577390 28fffbb7 +4616752 40d9b8d9 a19abd09 5b7a255a 0b9d5842 8b6f7737 175726d8 65d0367a 54fbc862 381245ee adc2ea3b ea7ad6e8 9f77d7ae a159a89c 6a891bf8 3ec0e4a0 5467858d +8574463 831896bb bcb81b4c 1282fd9c 2f4df9f0 f0f67034 a32d6978 4b8d46a9 49fe0aed 1ea30406 15100626 7b6b288f 12ad2994 c5d6ee49 2cf9f138 073a70e3 1c27d0a5 +15263200 96de7bb7 204f9327 d71c69dd 9d1792b6 a30053ed 9d1c6d90 db978621 e0d76f27 25c30d9e 67f190d5 8af07992 39326030 e35f2afa 7fa17451 20db7082 8d05fc1b +11198632 3c1bf24a 3e14b724 c3401cad 0c3fdd14 78c300ff a6fbe6c8 debf5ae3 4fb2158f f08115ba eb91e464 3f362ef0 25169187 2181fff4 200f20dd 9910e27d 278143c5 +11436097 7922f50b c38126d0 1833f9d8 16694e14 edc4d1d8 b48bddb6 f9a6c26e 8bdc263c ac108cf6 e7b6630d 9b1a6ef5 b89d1db5 79f56377 78036286 d066fdfa e96f38cf +4918961 24fe2fea 179428e5 61fc519b 38e79754 ed063f63 ad771837 e2363fc0 e942cce8 5f01dd1e 643b40d0 3d6db1e6 cc3ed5c8 dc6a8658 cab3ad47 b336fba4 ab237392 +1410824 da29060f 5b3dff1d 8ca45452 5ec5a682 1002113e f7780dcc e4f4cc16 93bee07d 8a180385 0184d170 c9013b84 82b130bc a466cef0 a1baa181 1c6c7f40 edb56245 +7264232 243f761a 0dc2c38e f7af3e70 58b83053 cc83d00b 27384707 e69c5894 98572fe2 9e236e39 ed71eb57 a438d261 4c1c22ff d305d2a6 2acc9d56 e7e8bda5 4a0e0785 +6190108 2cf86f04 7f1d28c6 1cbe3a49 1dc644c0 6358428a ec0bf552 04480c18 fe083779 8c4103ce 3e0ff818 7b8f37fd 34ad812c 53223bc6 9b60e030 47e7a346 7c0e5f64 +14367135 322e2d93 712b71c6 f9c0da64 ef9699de a6c654d4 5013eca7 539c5617 c86f1f39 78b66a9f 69c4a7d2 81adc296 ad59da4e ff704173 73c69880 a58ce56e a258ccb7 +2808402 466970a7 f1304fac 7a8f7e36 13c33ed6 c72ff230 a740d600 a4a16b4b 21f4ccef 06580263 d7b49ad0 98dbc6b3 24c651e3 99671ab5 d26f7328 ee7c798e c838c104 +13378867 7cd17da9 ea56ec2b 8b96d03d 1e7253ca 1c1ea3ad 08e763ef 71059b34 0c003919 daf255f2 3aa1517b f27e0a7d 83223a35 2bdea53f 213958a5 1d9136d9 a5731d23 +7476202 6a646660 b45ca217 fedfb2c9 afdd9bab 66f99b4c e4987b2a 8c642c60 1382ab55 1b21dff9 1ff5d687 f0f9e5cd 6df43567 c279c3e8 ced3c6df cb9cb6db 066c67e1 +13419078 ba5ce6f7 146a3f49 e3133f4f 52ea10ed b43e5142 12a55e08 d672cc87 f243afc4 c14be7b3 4addc69d f75dfab9 e6e670e9 a897d062 ae6b3631 041888bc 84f035aa +10493023 108dcba0 1eec9ff5 9f1cb2de cebae347 b9328a96 07001f6f fe1926e9 92efc11f d2907cb8 75864029 0ce90f1d ff4b2564 0c4dbe15 f837ea19 df9d6dd0 691ef1c9 +4156972 1cf5b24a 9c6080bf 2062b83c 09143fa5 e515cd16 cb907851 e3a65069 6c530eb2 1a58df0e a48b913b 824da55e 6f7c5b3b 6bae9351 8beb44ab 3f426df5 74c32fee +8804122 b4b399ee f598a838 6bd56da6 2f9c7e9b b664d821 c2d4f5e8 a13a0362 59b11e4c 8175174f 88787a33 eb253fef da0eded6 33b72d2d 445ef8b0 26f55aae d5e9327d +288295 aacc3351 6a0e3162 aa269c1a fd77f38c 4010834c 63310880 299fd6ec 50e80c2a db548fe6 e03e4a48 53c541da 2dc03324 369549d4 9aca1fcb 1f790137 6f6e87f9 +2133316 74a2fabc 5ab5fd0c 325a17d2 66bcf3d1 21652bed 158066cd f3cfa35e d4e0c76d 9be6258b f18b81cc c722a3cb 16f70f09 5d6b5be9 0e25b49a 47c49a92 f9535d98 +7760637 b90df413 26a1c90f ee444354 eb2863a4 c9e484b4 adc31218 605aca4a 5e5a1c78 76d9d530 5c1422c0 0bd61920 35f0901e 20982672 6316afd1 721d8eb8 b197bce9 +11352956 ef39d39b c1fdff78 8b51ecbb 2fddb94b 1f56d4fe eedb5357 377e584d 6c375007 efed2ddf 3b8d34ae 2dcb18ea bcead97b d6cff5ce e3cfd5fd 60d14d05 db6e673a +12399947 43ab197c 9638c927 6a490b55 9b0526fc d13cd45d c5518396 76742a3d b8678932 3554d7da a4c03b8b 86ec74ea 4451a8f0 c192e05c 29f4bf7b 77c1a229 395c99d6 +3895543 96eb57be c0385d95 7fbbc112 03c7ce6d 113a6663 90f3aae1 3bc76fb5 8f040b0c 3c9cf7ed 9bc20e0f c9ed722a 58be4b7a 98207c95 92229634 349d86da eacbb1d2 +12642888 a1cfc070 e4b75f4e a7b0e727 441685a5 94020329 0c8fd6f4 bc4b8d95 2f57a6d5 b3915b9a fd6b6eb2 21033fc4 0f130391 ba2fa058 35b3c770 90dc4417 d9d1a277 +3365498 7eac1230 701a1b9c 75bcc4a3 929597a1 8f33c7ed 3b48e1ab 3eae9197 c4e3e807 0526fc9b 54aa664a c893032a 5696da96 0d6eb3ed ccd16ae6 d3f6549b e3d84f76 +7113693 55574598 5b094ea9 fd81b1ab 8258dbc6 dc36c414 2cfadc17 ce5fc7da 1de36af0 52be5223 ffd00b9b e2ce5783 af4e77c2 22a43178 a16a5d0e 8f6e3e0a 8d238ca1 +644476 86955910 12d0ccae b50670bb 01333407 d7537000 0505b48a ea420b4b 244428e6 5095ed4a ff5d08f1 9ffabbb0 cc9a6cb9 5ce1eeff b60de14a f86315ea 5364e574 +9740770 c26bfe12 b4f26927 cf52b4aa 0eda3179 71f3d266 e32511d6 b7d5a550 5daca3ab f544d98f fbfefad4 b38cc355 b2940f6b c3812bfc c735b7be e5928423 0758206f +11091375 3d83316d e47176e1 343f3286 0c284b60 e8fd0f77 1fa01b5a f7f41c8f 5a32f948 f06c597b a487955d cdb47563 5e6ea693 60a35c32 5aa27035 06ef8776 796dd79f +6751798 18128ce8 cd17ea35 694c4211 580fde55 ed4866ad b609c957 ccac2680 71fb61e6 d3daeb4c 89abf74d 4f3d78ca 67c01e63 224592b6 323ac9ff 184f3f5c 50461a88 +14034600 d9473ec6 8d5029fb 43d9a94b cf9af77e c052b7fd d9eeb346 f96b82f4 9befe6be 4e825729 02b37f8a 043eb17a d31ab08f 77eca866 a717438d c039cefc 369101ff +589780 6fa31752 b83e0d46 3ae24551 6439c2b6 7f54bb94 050431cf 940dd159 8fd04f9e a37393c4 8fbe4531 154e71d2 e17f2f3a 34c003a1 b3429086 5dbd6bad 7930a9ab +4333372 2e841708 32664b70 70af976a 5b999596 7af83688 6f4b02e2 e6d4b596 7bbf7472 1452d114 587b6da1 ff83a6f4 bb3de168 871f0c04 9c08542f 25f5f46e a5f97322 +901248 1f3243e0 84e65ae7 287c701b 870bf294 f8902e98 b14b6b64 3b6eadff ad876fee cd97142d 95246928 4f84db19 6ad3f6f7 1c9610aa 227b346f f93c31f9 b9102dd6 +16630887 5eabfa4d c43cd3b0 c2ab42a1 26441b13 2014e4ac e5c8f4d7 167228fd 419356a8 a3c20e88 cb3ddb77 47bf4e86 e0be8b43 6132cb32 9a8b719d cda87c0c 68b71e86 +9111565 7ca7d3e4 519c1168 71254c24 909bb636 fe8863f5 0c4bdd69 a2b95624 b5473d2c f291cc68 14766143 eee74f83 c6365bfc d1ad2cae 6cf040b6 d8ec2003 0c6cce78 +3483951 5151cad3 b421f72e cce1c02f 020e1242 4ffcd57a 13d5ecf1 35a7f5ea 5d513bb7 64ec97e6 9f0ab912 341fb2f7 25529426 fb2c905f 6208071a 17f41e1a 143a9d80 +4213766 012a52b7 edc925eb e6ecf05c 64fe4cf5 8db0d7fe 2a746dc9 045029c3 f416b1d2 ee335b6f fa6537b7 ad061ca8 7f2e21ee fed88e5f d291c09a af3751ea 5a6dfe92 +11963039 77adac20 5a2058d1 45ab2642 49d6afb7 80a15236 7639e4af 01dab051 1c247350 d2c58d33 c3109489 321d50d9 349f0988 86ec136f e2ebe9a2 7fab986b 46a44143 +15924612 6a03f642 bde4dc39 70cabbec ddc3a48e 27242b6b 39c5a805 fe2b043f 14c76026 08d0e209 8860d2c6 44020312 ae634f70 a797d9cf 28e5427d f45e0838 0a865a61 +9759991 484e0201 a7bc404b 9df09da8 ce9787ee 7535b9fa 9ddda7b5 7cb3e7e6 a0e75380 bb5b63e1 a62a277d 81d1af56 ddd812ba 980a6d06 27b18362 e47329b3 f905c25b +10901080 b44c80c8 272fabaf 09386b9b c6e54a98 ca38ffae 21f70b46 6ea3531e 85d8c42a 5fc60d7c 3ba8cdc9 2eace3ac cad328f9 024764ef 76d44e9e e2e07e37 427459e0 +14643244 7e48c446 8eef08ac 841826b1 3198a69d 6df35335 725680b3 ee643b91 97c78a36 5e6190c3 b09950cc 2a179d6f 2cdc4a19 6de1461a 94205162 5d65539c fa4481ce +3370296 d6404d65 a7dd0768 2c7370f5 2311fa60 929ca930 1d2119a8 36807931 cfc300ec 242e1c84 a889ba4e 05fe5577 3a9378e5 3edd8355 70f46a71 a29b091d 6993e87e +7086353 f6acef51 584c42e0 b0b1ec60 aa4d391a a1f6c3cb 764867a6 07a572f6 539662bb ff5ccd98 1a862af2 212a32ff 8b103004 8fa08613 de8f82cb c9173eea 7b37f3c0 +3290071 5a63c25c fcbdcefe 27ca810c 80416a7e 6a10f834 311419f4 3895eefb c863488d c53ab2ec 5d1c863f 8d970247 9e8d0132 6d1a0a21 0e2a7843 482bc186 cdf5c3be +12570461 b5233828 85af1561 234e7fb2 dbda5cec e39268b7 ea639f66 a8cb2160 95882fc2 43270928 2dce4be3 639cd1e4 75079428 1b268f20 94709b23 5b55a897 dd53f0cd +6457277 0a2526af 8446036f 587e0a2b ba4344ee addc137f d8f0bdbc 704abec1 6090c374 41fb8e46 e1621d71 b68defbc ac946254 26696a56 0da68896 e9c75fa9 0aa9a7c7 +16031799 18694ee2 ea0f065b 2bcd998a 59f79858 e1e68296 1c94b7f1 b00920a1 798ccfd3 2ce59402 d3d2a200 2cea60f7 df9deb24 c7b37111 3e34666a ef2f17c5 41fe73e5 +401204 0483a4e6 f56812cb 8bfecdd2 11139b9c 46aec2f3 251b7534 3c6c5aae 4cf8681d 739e6c0b 9066a582 ea924f94 1bfcdb0a 6a281c3a a5b50452 85c0fcbe 2564f45a +4468781 fb48480b 169f3c9f 55bf81d3 3829cb0f 1bf0d3d7 8b220287 0cb77302 3e882120 e5928a53 52b0800a 9d907d19 5b159e71 8f98c895 56269301 1f0de6eb ec3d421e +5991605 f0d603ba 3d434cf8 6fd8aebf 896094ce 94cb55ca a5cc0727 f8c07b42 e6cdc9d0 a13899f4 054f8e50 2b91b444 1a41b4dd d2a4c02c 2dff9680 c884c6dd 4e91c8a0 +13287837 e3c57a4f c8e39bfd 66fda00f 9b54392d ebb6c23f 20d8d5aa 856747fc 8f02dc89 8cec3a26 8b6893b8 ff501786 2b2c5c6e b59139eb c7b69a37 89d4d1a7 a956e3ea +10915744 31f13c65 25eba17f 499aa516 7cf9963b 301f11eb 35d86ea7 155e7f33 ce311354 be11b078 21cfc5f0 a3be5e53 b54e9630 4c02b26a dcd9ed55 0bfc2c86 da293d92 +12699016 e57ae28d 809e29ae c9770ede 17a42c18 c64d3d28 ac97933b 35035e77 b2df28e1 5c0fbe35 85d02522 5b877bdd f67a08c5 e34e7127 e2e7d541 2723b501 1f3e8583 +1848617 cbff3bed ba569f69 5d73c011 d27f0520 789b4059 9830267d 3a647233 13372a45 e807472e 3b20ed7c 41cc5835 68b16f4f 780b3deb 7a9e77fd d3a2d8d0 44ef264a +4487660 538032b9 c81eb6a4 6b329f6c 2c00dcfb 3c888968 5f630959 05f8db1a be0fe5f6 6238b409 b1750f85 4188f8e1 0a2e98d6 16385c46 53e6cf07 e2a29f55 60e404ff +6845113 c927710a 7aaaa5c8 4c7e91eb e22767a0 8b4418da 76bea16f 0bbac759 29ea8415 1964b04f 6ade73ff 7fe81bbc b1ed854e ae1587c3 fead62cb 4a05d840 5a1b5239 +524528 61315050 feb0cd4a 4e75e76e 3cdb7007 a318b5d6 db11fb6d b22c1631 8d04cc56 35f2fd3f ffe07557 3ec9907a 4e2ceab8 64ea9f92 79d42917 62685923 125217c5 +5092097 55c49208 2ff38e61 560af5df 7d462b55 29ae8558 fe9d1964 ccb1185a 2aa298b9 7e8e0d1b 3a13c3c4 09f96f54 93e5714f 477da245 e5146e1a c7c210e5 91ba3a69 +7905868 2ac59ddb 2677ac56 57febba9 a19dcef0 d21def4c e57b8aa1 fec85c2d 0c39dad6 06860d71 0732dd79 ce8aa512 e0a0aa43 b7f4c11d 54c81c3e d56e77f5 e20bbc29 +11189515 878dcae2 b53022f8 55476c2a d6c0c07e b0ed5774 b4c0e465 c40c7cc1 69c00fde db514ee7 ecc37055 a114c696 cbdced28 b8ace5ef ccbc8812 a3aec704 4c57b80d +3376361 384a8e8a 0e4c8326 e21b2088 d027bacf 7416a93f 20cf4c20 7035ab6b 5e41d3c4 7f4b56b2 8e9bca76 b8076ed7 28c79a06 93db7265 53ed202b fd78ad5c f2987e17 +7699258 c1c93f27 1c605248 e3a48d7b 0f68fef5 dcf1918c 8c8b0159 48d9f63f e67bddee 58978239 cd473eb7 e6f8b07e 40d9b413 4342ef97 f67a5db1 9934f9a5 61101c8c +7439838 608b1b58 d24d2aad b9cdd571 56fa246d eed67810 d061ff0c 1a4e18bb 5a799bc1 e67d0d93 adc0c1cb a084b74b 3508716a ad339c72 b497aee8 0cfd51f9 6f3a208b +4042983 809e1312 f9917fa6 085df730 c5d312a2 8174016f 97610e62 c1c1d34a adb27ae2 7d9b99c3 0e4f6779 cde91735 bb5a9ee1 5f0f4365 b96dab22 e7b13db8 61b81822 +11563478 1f45b5db c6c1da5f b4d394f4 9cac12e9 11412025 1873aaa6 b621d9cc 59f33230 2e5daa41 d4461826 9fd9f9d5 50bbe68a 3ec5c0f0 5b99ed4d 54213e52 3119aabf +4657482 1b11ac7f 8437bdd0 3bb11970 0c115d54 0afa1ba0 93ec484c 78cb8c20 fe94b47f 97a70679 c145af45 ef9798a7 ee827064 dd90ba95 6046cdcd acb0344a e63c6fc1 +5921486 1c141bea ac5a1872 b23244f6 7600a9e7 7df5dd04 e28fc5bf 85fcf87b 78d8da87 95620076 aba0145c dbd01d26 febc857b 92971742 8fba82f4 481b8bd9 f77733ab +2750859 ca574f15 0a884e62 374c8ec8 adc56708 e0b872ef dfed5fbc 942b61e3 2b8c1cda 3c52ca84 0b17327a b76d4863 5ded7c65 8467e8ee 0488d09c 587cbc25 82dc6d0c +6282336 abdafc66 fc28d12f 4a6b3f2d 0b39b0c8 4fde2d77 56f55c8f 9d639961 6e356b72 b444b667 03109863 4f1de7d2 65bb0e27 1ab65b70 ba160e70 52a89aa6 f2cd70fd +11528854 438d42bd 06bd104f 721a0fd6 6630dc35 a5678b7a 1ac80245 186925df 978299a4 d608f7cb 653e6b00 593304d3 8df38a76 c50aef7c 81d23608 90e856e0 20ccc071 +8644055 354e6b44 21d87dbc 6016002f aa8817f8 76eab159 22a49ef2 d2f75d03 10ddfd69 7e1d756f 13fa7c2a 0a2a798c 90a19f5d b611e128 b59921bc 2a6dd72b 238caa96 +9285174 40043f2f 4f2f8b2d 261bf5a7 de037e1d 97fba40e 1f43ac1f d851fb86 276e45f5 7a57713c e828fe55 95e3541b 31a59644 d2f3505f afc5bfb1 6eefe8a5 1220daf3 +1027595 4301ec27 7dfd870d 9e501575 21528452 4c06160b 37f9bd41 36b025f6 dae213dc fd4b0085 ec716bfb 2cff26e6 0a64c92e 6a0edc20 b7ef46dd 7272197c d3a63a26 +4081227 863c0e16 a2a6b9b3 9366bb1f 173ea84d 36a7c411 5fd59b00 d4aa8c25 b7353629 56109b51 6f35eb3b 89c1092f 8f4bdcf8 280d2168 94f7edff 4818472f 78814976 +10672231 e1f9ac4c c9fc9ac3 ad49347d 8e7ef90f 64518500 73067b0a ec523bc9 fd04f814 233d9e9d 245b17e1 3cbd9bf6 ad938c53 7efe375e 7909e614 f06186ac 0c8ce42a +8236068 6fef0420 3fa2883f ab13a19f 42cd048a 724c4116 44bbb00f 8f4173c4 4da4626f 1a6b528f 27a8e281 796e7e0b 3ae5a39a 25356e3e 7a2a91e7 b51e55a6 0eed9e22 +15704092 3e06fb25 2e5cdffc 41659085 e396240c 0dd72904 a2c618fb e79cb50e 1e9659c1 497dbe95 ad39364f 9b43ecbe 8d74e586 5c5c188a fcf4796f 137c52f5 df58a221 +11107591 5e68a66b 4762e446 4927bd9e b17b84b4 5f969554 709d30df 350dd8a9 41b0bfa0 3a9a4346 a1f6da68 83066dca b6650d31 3ad4e997 822ec89d 863e28ea 327462b5 +6348112 cb8563fb 287697ce 76d32178 cf6585a4 770f3e5c 172bb8e9 b60b4320 4b338f06 ca5504d6 f51abc51 ffcde72c 3619afc6 ae513b2b d7e3848a 8bd259b8 f237624b +12047757 5ac635cd 74ace93b f0d57fbc 90bf91f6 2446529b 09760c2d 9d222bb0 de088f2d 73557835 757ab941 4997d8a1 37d4ed81 f456bc6f ea2c51bc de8277bb 63bbb6b4 +14358636 1bc32557 3f854dc4 31218e44 985ac994 b698df06 7205752a 2e6c73db 408d250c 397bf946 a549d118 b7219907 86428246 e5f4d750 054e18e0 d3df796b 593d96e5 +15949874 445afd7b 26326a3d 287815b5 1508193b d446f27d a90e5be0 174408db 6b799dba cc54ebc8 d4a98bd6 8a7dc24f 0e2261d2 32d10d0f 5be65d9f 12e532d3 01a79be7 +15670008 4c4aa5f6 449dfb3d 7c88ec64 c0d2c8ba 37d881bf 55af172d f2cd58d9 3b688adc 1b4038a1 e9774a29 3b5104e1 e58beb86 9ab92cca 382a7b8d c9dea33f 2fe41801 +6134048 fb954e90 f548e789 fc0f04b4 a5baf272 985dea6e d5f385ad 84996d3f 8a85dad2 f34d2141 c0feaf2b fac6eaf7 09f1b014 fce876cb 021e75b8 70df6717 f0898b1d +10349191 7c2c6f9f a7075163 9ccd06bc b3d339a3 bd11b774 137b37c7 a1f8b8d6 049973ab 92e55991 b398cbb2 c3e0f023 57d36a01 d8dc6df4 16f5d120 ab615e6d 332e4c62 +363274 da3cfd79 da82f0b1 a10591d1 b68f4886 497ecf50 5956490e f0a6173e d6f86bf0 c784d1cc f003e664 56bdc0f2 1eee3ade 0b0d5bab faaf28d0 c7610255 48e5d8dc +12564434 d405999b c5fbe173 93bbb749 af197cf6 17cc7172 bf6e07cf 61f4e656 4687e5fe 1ad1fecb b00f83fc a75d5c09 4a5f9031 d039734d 8040b475 a39fb486 030c078e +11028309 f5e0e618 4dd561f9 5d64e42a bb0bda3e 48bbe7db 55834b70 2992e312 1f24e546 ba9cd729 97c0c606 73af8597 2812b067 d948419c 7ab02ebe 9b09c435 9954d8c4 +3062257 5a5aea9d 1d63dc51 3e0a46d0 e329aeae b69d2b12 66e709c9 5081e0c0 ed4f40c3 1917b518 345d130d 35869954 d1ec4a2d 2f5d7ea9 86547d97 fc047c2b c5274824 +4382958 6c7dc25d 3e903078 1a193a4d 9ea31947 f52efb7b b935b28a a6667aa3 9c018edf fdd386e8 ab9dbb29 155bed05 db5d6c2f 81683cad 5175ba19 567fed5a c7b5d0c6 +12988490 ae1504ae 1e8c8338 d1c9cdbb 210f6c44 59ef5777 b4ef2441 3faaae5e 95f221d7 8a8c4153 da950157 c7f2c452 e2579301 722d41cb 91878b90 378e556a 285392e1 +16561780 7aef05a0 4729c287 9a8b7c99 76fc5d32 c821031c 7f95dd7a 801f8eb5 11776107 c3193419 eb98ce73 9464370c c8781e78 18b25ed6 e39f8386 f61303d1 d3476835 +14014626 c9a0022d bae00643 f4b51f5c c3e02b35 37930be2 cc3796f2 6bc37b9a e24a7889 f0f67598 a294bac9 5b60e14e 0fff97fb 4f0345bd 18f423e4 88d2bb67 6d1c59f5 +16401702 2e493f9a b90c5876 6cccbbb8 86caa606 59fb2af5 483afc03 64b72dbf 22170a04 464cd75a d2342532 4ed53ae8 ce014925 94814c23 ca1a8eb5 5a9c5cb6 81f33ec4 +1910345 30473ff0 a0fc0179 c3ac7b8c 31f83380 94f3eb4c 0494face 643c3e3d 2ecdf394 63df2258 3cb341a5 3beb0463 4f85f263 d329e811 d32589be faa989ac 035f7211 +16319733 d1d21c66 acc6a811 0bd6a159 5b57e3aa 8d582e0a 8be3412d 66bd73e8 7e39c048 c0f2d7ae 7ed01bdd b2feba3f 86172f18 c7e12d83 3ea8611b 5edffbf5 91fa7ac5 +9796734 275b6a49 7f395f53 0b74522d 847ee3eb 7b1fd531 c67a3b3b 6e1abf58 210c0ee3 abfdcef2 805e3923 12603493 d98404b9 03e299bf 0cd2023f ba2ef06b 1b26dd76 +14571851 4372c4e8 f898951d ed77d708 ca1be05c 4b6993ef 6314e416 df6780d3 ba2b8395 5b9dd9ed 6fc291df 383951f6 3e517c94 036e6ade b5d096a1 3a9a7dd9 bbbb9056 +14989620 bcec645b c93eb661 ac3e3a32 c44e9f2d 8f9080b4 6d54bdff fcb0a89a 68d13678 260c919f d630575d 107d3f94 34d4d310 26e6a093 8e76af6c e0b2f99d 26024823 +11404726 1d0b0642 fc84e0a6 f0142a4f b1466ac9 eb7f14b2 ee193568 fc2adc4b 587b692d 53e832b9 9a97b908 88f94853 84e2fb5f 99ab40ba 18bde1d7 0fbaee7f 400a0fd8 +3526394 7b550ea3 3bfef0b6 409e2cda 692ca177 2a91611b 5d6213f1 7d02a138 f8fa9eb2 09677b99 b61e189c 22a5c050 129d029c 58180c6f 04612ecf 01b8051a 3d59880c +8212372 5918674a 9ab3a7cb 134adc32 72b4813e 0b1a9b9c c1c4d106 49e117a0 11f16345 8fe2b2ec ad205f09 0ad0a124 1de31d84 1c7897a1 e1dc4793 65923155 0a3398e2 +11727863 813700e0 5f8b0370 80361c67 5898876f 02214cf0 2b373d97 0b7d3602 c19154d5 09d3c919 7bef8d8c d07b609f bc767813 58d867e1 4735a5ff cab66fa1 ca987fc9 +11203127 9155759c 10d2b962 4afb8896 a78896b2 48f73eaa d732908a 4c605daa 2ddb90b0 646a82be 6fa07f45 04fc9a8a a82d5390 1c34aeaa 35dfec22 7ffa4456 eec38008 +4390066 3c45011e 6db18009 3448f2b5 c7eb9eeb e525a789 9a23feee b20e1dc1 45fd72f9 09f93a2c 7bd84c4a 82fa768e ac61b10b b1e27531 09ecc513 251bf50e 0a308762 +8613822 54fd7c5b 50a5532e 44aac021 d732a9f1 fcec5694 57109e9c 69dc25d1 8dd28464 e2e03dba 6eb5356d b28c7ca7 61b6aee6 afb6eaec 2ee96198 4703f0f9 572bd653 +9846529 7a8a2fe2 76d81d68 afe9c86d 6844f0ec 3c2ec8bd 2ed89ffb e2faa59c 5dd9dcad 71f6f022 7cd73737 d7842005 0f98c949 df5b2b4c 3f7b402e 70ec8adf 5b60ba25 +1566696 c21c9d97 c509dc05 2c11aea9 e2dc8fd3 43d1726b adde671c 3355373e 6f3eeeff b47edd72 f4d7ef6b 7cefd8fa c1ccf63f 977c270e 9686b979 2f3cbae9 748a98b0 +5140701 db0c0b18 927f3a4b 8274bc30 05a876ea db9459f6 da094e67 9fe0f72e 2d512dd9 26f35e78 40c81c09 9549ac66 e7fd8599 0d416fa0 5416b317 0aaa380c 8cc6f57e +8710672 58a4109d 4e41894c 6db956fd a40670b3 55b192be 33f44781 40c297d7 4061d891 fcd8f04b dc72f43b 680a722d 328aa21c cfe6de14 22de6484 b7cbe430 5e8aa5cd +13865429 1f68d66d 155d2c3a c7a10a8c 51b60e3e b4221266 98da55cd 559ec592 89431561 0113bfd9 e433a278 e74df0b4 4633b115 35257b95 9ff4e8c3 ca8de57b f747d9b5 +10244504 ad6e2429 5622ed6c ee3aa129 f93995b8 740aa58b c5644e2e f252a624 34a0a0b0 004e8989 d6a36ce9 174eb9ef 23c6a6a7 377162d8 40cfb650 2cc61440 607a21d6 +3130740 56817ce6 f35b532f 3b47613a 0e830878 9e055358 d3ad9e7b e9045438 b6358249 39036a35 d1a558bd 01da17a9 d325fc27 0ebbf70c 6dd37fe8 1d06fdcb dd9ba6d7 +8157412 598de579 b975427c 794ce80f 76f27035 8c15519c d7806d9e 11ad6bc0 fec372f3 ca24f004 4df11bdc 9c8ce25e 98e49d50 60deb783 a2d769c2 779a3911 63c996ca +2539713 e8e71392 30fb1925 d64b7c4f 80101dcd 2ca95d93 46e2111d 9481ccb4 2928bdbe 371a123f ec5d6533 e8708847 d04e0a0a 25859046 57a95c2a 29cc56a1 59f73898 +3647784 b36b5f53 7f5ffd00 63f0277f 01b09502 d5739fbb a59184d6 d65d205c 0ce34d9a 709214aa 94688db5 ed6ef826 13308efc 81268913 78ac7b7d 6d07443e a4486e8a +13801529 6b01e019 45d3a942 2b0bf35f 4e68c532 e733ad14 fc273630 d813c7f8 e7af57de 14c1d9a4 1d444390 b083fd59 b4feef66 2b7eaab8 05a86b83 8a77ca41 244a7ff1 +16488878 5287e7dd 34c6e236 3d427e04 3f1f0861 3d345222 e184e2ad 6fcabacb b1747d7d f4cf4252 68cba13e 4b6125c6 ce9c51dc fe563494 1404d8c0 eaaa8f76 0f812372 +3336308 4698a9f9 c4a93610 963f9136 b434d88a 2ebb0e21 ef206d08 fe7d9e27 8167804a 2bba96b0 51b7e069 90c835a6 d8bb9096 620ed4dd 0eb46898 08f279eb 63ed8c3c +4827384 0a8535f2 9490f0c2 4821d23c 5c7ce898 1fb55845 c50a3692 19b462a1 67d25779 b1afa24e 7ff03606 87963d49 a07cd230 38b12bec 4746a0d4 e827f8ac 789563d4 +701736 9553ee55 a5270cd7 92b44bac 2c553fe7 afba62ac 90941041 5a01e61c 8d3b58f4 537d63df b4bbceb3 9aa2639a 288a2703 6b3d4e86 be93b67d 21df28d0 a24f2c4e +16712566 8326a010 8a5b2f82 b410f3ef c198573c c44d363f 7ab50881 514b6176 f0f9d02c 57149557 bdeb845e 59749770 b87449c1 c1810aec 469ddb09 0c52f2bb a7359f07 +16580119 6538c268 d8fce8c0 9e46d0f6 c974debd 3f629581 b55982b1 e1e3dff8 09c0d393 e470f231 cd761fcc e0a2675c 57d38ed2 cd37b103 0c532850 a825b0c4 4cd224e0 +14694171 95695252 0ceb5f2b ff2df426 0e2fa708 5f5059bf 179f2647 0004b54b 954942bb 89d14018 26611b28 c7e9c6c1 ee4e86f7 2006205a fa186c75 400c5181 f489046e +11121147 338be346 dd69beb7 92c88044 eab07cca 6f1a2930 46db0877 04e411ec 519f957a 893c1cfd 5a559dcf bef9e63c 06641820 9427dc38 ed0a47a9 b88c8e0d 298938a7 +7227089 c32894f7 b8b84f39 4dd20889 373db02a 69e0fec8 47e494ac 2e34e7f9 0460df17 2ded4ca7 5cc5105d 3c7be376 e2464097 225716bb c10b8145 30ca6833 3f9f3dc4 +3064476 d715523b cb2715f4 828b345a a5d01a7b 05e67546 3f81dc3b 14909b6b 24bf6574 88c1e2b2 4754f6f4 59078509 a58cde5f b21b992f 166c0574 056bd0d9 f581711f +8564747 1715349e 370d65a2 3cc1184c 82a8b71e 1e0c1655 6350b148 82510552 1fd8c8a6 1970d8a6 4b7dbf9c 5c777cf8 e68d8cf8 2b8d1611 d39022e8 93e2b2dc d635dbf5 +4101966 ce958741 8dad76fe a0a8b941 06e4bb04 6eeb5e7e 8730087f f0e823cf 5b56f4a3 da3bfc14 91bccff9 bcf7d5c1 5b6e66bc 58364d9d 276dccfd 5d7a6787 2dae7c71 +6685644 84a8e796 14557965 3f6ca942 7cde8268 3e8972df a94eb1a3 93a4f297 09ea5f39 bb2c42fc 1d371dcb acd45040 3af4b5aa 71d54e4d 86997031 a56324b0 9d580bc3 +2538969 9e9402ec e082241e 1423ba0d 6ceceac5 e57ede56 ece9d89e c275b775 c2d642ef ff9cd6a5 590cef05 a3c64567 09f44718 eeb439b7 8ce62436 fc9e5be5 5b907225 +9596693 a1b8315c fda6d7b6 73268428 0a0274de 1d9bff75 6e54466c 508a1f0f d922643c 2e255191 6a13dd7c 7f566a50 1d886240 4b4d380d 16af458e 787e206b adf361c2 +4384043 83a44dd4 fa3a44bd 4d46ab39 80a54dce a3b46576 2a9967c0 caf34d5d 2d6df7bf 958fe26f 42162d31 15e2b3bd f41be627 69a72527 13860d8a 1f2672e3 d658339a +6304175 8f5eea1a d8d4106d a0a7240f bbf6c87e ee17fbb1 d2e3e737 4569514b f5aab422 8ddc102b 491e3683 fc163969 00a05ed8 3b1b8093 bdc6f31f 59ddb166 0ad13239 +11503965 e16e93f8 8289c6f2 849949ab acb2e502 9e81a415 50ed26b6 83ea3440 da36e492 74fc609c bdd0e8b7 0f22402b e3b73526 f1efd5a9 77aec16d 3b7675e2 866b93ed +10357817 62ccbdca cb29ae86 74dbf5c6 ed48fb32 97e161e9 7feecd65 47dc7929 b8d9195e b2995fea 161dbc0a 23eede36 20504a03 bb60896c e13d0aa0 4f21f272 678a4ceb +14992696 c81352e6 468de296 20e3ba6d efc04ca9 f82bae88 819c7be3 51623c52 0209ec0b 51ba8fd7 0e351014 f710fd8a f7884fe8 81ffac0b 768bcdf2 b764c43a d1efa75c +4018092 1cc3be59 e37f3ba5 469d093a 3f0b8e25 2ce2a026 cfab6a4a 80d54fb6 4ad09e50 85c6b788 9b55026b 77a0c476 b7508de4 b31b1754 b5056a3c 8f0ea08c 9aec197a +10532034 5950a704 45ed182b d8b10024 71010054 75336962 3609b596 fdaea9a8 72d85d77 3ddc11ab 65ba52c6 d3f81af1 1b94c297 cd73f0a9 00a75de6 4a8404c7 5b993bdd +4725933 7e774734 659ae9dd 214d5a1c 5ba96a0f 63a7cc38 6992eee9 32a9eb54 7fbc508b 0eebaa68 1f1c0c20 6d3c3bd3 4a76a894 244be1c7 92c00577 a962564a 02efd89f +9641546 68dfeb1c f69f3781 158c74eb 3daf08e4 ac087db4 37e40c62 a0303181 70ec5ecf 7ef6df11 cd2dc1a1 9599a0ea cd4f0c8c c14867b2 b989f1f4 78dd02de 5bdea507 +6813685 7f832c93 ca8476bb 14b26595 1876e176 94f6ec88 ac79f347 3d27e7ad fbf14942 a4bede62 fdf36984 2fe9405c 97fc8238 d43327f3 0bea87c8 3641fd48 05cc5a36 +13600545 da9728ca ecebfdcc 18799409 9b3764be cfd940c3 1f4e9e2c 084d87b0 87cb96fa fad259ad 196011eb 1903fa3b ab4d8a93 bc50f163 dd6d14da 305d4cdf 9a8d5b40 +15748384 c3c0b030 2502b6fa 6dcaa995 b2839aeb 7112513d 67edbd4a 6289e76b 1eab075d 3ffc4fbd 2885179f d6f58ab1 855645d9 35186d6c 8c96d8c5 8db10949 d591fb6d +8992484 73404b4a c238ea8a 45920ee4 4ac20f26 daf29a63 d8439092 63f7e147 fcdda576 8788de5f 391132f1 7b514a96 5b159255 c7b158e3 29abb1be b6a8f517 dd0a526c +13181783 118390a3 01ce3a5a 86819ff4 7793dd1a 74ec7265 0d985efd 344d7fdf 14741dd0 d4f3a898 d206fd1b 8a586b4c 18e14412 14850053 4c98ef7c 23765dfb b35abf4c +12710942 85925f5b 041b85f4 78ce7e58 50d1c54b b21bcf83 d0f33d27 464e51e9 16261a13 192db9ab 6b745ea5 7bc52b3c 01ed95fa 49fb534e e3b320df a7ae685a 51eefb43 +413143 743167b5 a8d8a50b 316c0e6d 59280db7 c7ca151f 5c2bc923 2d8cf510 cf2a2557 f6d454d2 03dacf8c 9a2983c4 3df4ce22 979e9d47 4d593113 13e4df51 54c3bd10 +13520988 0153571d 5aa2d2ee 3d1e8b7a 0d2bf24f cef47d27 34accb62 4a9be8d8 05643364 b8cf3391 73157b38 823fcb3c 04c8b8bd cd9d09f3 8c57e80b 64c9591d fd0c2602 +6231054 500456d4 f6650b0a 10dd6c00 76542d62 995a8585 0f3c74ef c2809ba9 b111a8ba 710dba94 b0dcc273 dd32e59f 137be3db cd207877 f774f806 548274a9 58c08366 +7633353 e2c9711b e9edab69 c4c51360 ae2ca544 614adfd4 9163afbb 2388c8a9 79724e31 b2311ad9 22164c40 74198cc1 36a14767 5889d30e be4465b7 8ea58c59 cb39cab8 +8344915 26d4bd4e 95e850ba 03f20a21 0b1126e6 fed58e40 f1754a2c b10aeeb6 3bc674b4 daaa40f9 78d402ce 2c151852 0ab92ed4 34a13040 9c756540 242ca6ef f51a2b48 +11131240 7845f20f 216267be 9d4e9d86 a3fe4b0a bc1dc400 5745fc44 a472d6fd 96745b6b 494ce61f 4b4d746c 3e36dc3e 12e5752c f6b0b286 100548c9 c847964c 8fb3cf73 +3973696 24d569b9 fc5b44fa 12adf60e c82215b7 0adbf2cd 3fb84f53 15a6415b b840a301 ec1eca4b 0da3c5a0 a8b6aadc 1e7a40ed 6c18cf44 9307b332 199e8a1d 3b3bee46 +8053610 6403e9b7 9c04c446 89ea3338 0c7b66d6 2d149afb df32e947 29d9eb6f 0292b610 3ee5e9e2 2b3ae6b1 b062b609 54e0f4ba 1cefb053 b2e73a45 0ff29f13 58a33f48 +6971908 603dab77 53bed7f0 a3d0cc02 bf009a8a 1a73aa81 1b55b291 f4edbbda 1bcc4cb9 20124e5f 73ebc8dc 58bf35ea bdab4cef 654235ee 6b0a966b 5a4f36a3 2bcee23d +680482 ca804f34 887f615a 189dc0ac 55d01a55 2d26f239 13ade5af 722b623c f641543c c122e433 1d9e0cee 0a5e3b4d 8bcba69e aedd44d5 2833a09c 8d315db4 64346507 +6542534 6b36a913 a3b6e062 29bd8e4e 186748f1 f94ed704 23bb1363 8c57db6e 53578b7c 81093cbd ea58060e f80dcfec dfff7a9d 087a1380 973327bc 586bf03b 893485f0 +2735336 9a4c52d9 ee86ab22 7f12066d 94549c34 c9c1ebf9 f959d8ce 7c033a02 d4e073c4 48582a95 d3011339 fc0c7496 3bf4160d 568064a5 2769b9cb 6f7c9649 e77f55eb +10290567 b3d44e14 6032b8e4 56fde44f 995a546f d55b53b3 175cb3dd f4711228 e9b94a46 e808ddfd 4832194b a9956781 761a7ed2 26cb1a03 661e3dde 2b4aa8bf d6dc2d5f +16055457 927f2078 da9edda9 da015542 1d81df2b 9533aced 81c51294 dee79330 33fbd18f 90d76455 ea11044a 3a9fcc5b 6061338a a8d6853a 7c639a09 dee81a4b 64f94338 +1412081 793a79a0 c3567d39 a03fd54e 807d407c a2f4b886 4a82012d a9a806b3 52db126c 835d23e0 c0e40c3a a193567e a121d785 033334c7 50e0b399 d090617b 7843689c +16547912 3ad6a0c5 1273d938 a7dac59a 4da7849c 90f57eaf 7d210203 7886dde0 a3f0f160 4f4c56c2 b5e0a86f 69d6e22c fe5da6cf 44fe0271 c568ab50 4a09b324 3409c96f +5389790 51b6578b 9ee68f4d 8550a1fa f393da52 7b9a4f3e 53ce7d56 c13d6fb3 eae388da 869b0d75 1f076a8a 91b208fb ca1ad06c fa4aad85 625a3a60 b99e819b 13edfbc0 +11091002 7f8d4dc7 a6239f1a 5cdbab94 52a2cad4 efa5eabb 463a4420 701213e5 7d2ac832 ae1ab0e5 abdbf0fd 1809f95c c0066b23 0b8e467d 0a134e53 45e34ece aa38fb0f +6012306 b463601c 28a7dd17 23140dab d5131735 002ea990 72984f33 9b72c187 79f91a68 81ceaaac 6240c6e3 0b6f48c0 13331c6d 932f9ca1 3041d92c 090e0b28 c248510b +11382668 c94531fb 2f781496 2b2be0eb 2bb272e7 a4110824 b990e139 6bd29302 fc080b00 2b6cdf8c ddf8288a 6de1958a 034e9acb 8ad93652 77836f50 10edca51 8ec84d15 +6401135 98f1a90c eded928a f1a28ca6 91bea40a 2d612a23 bc88ee74 8045918d 8e77cd0c b6c59858 eea98ee7 e09b1e21 23da0d5c 31b399a0 509e508c 4efd56be a16e3e06 +6726206 a1a73c3a 98afa8af 30f34cb6 2d1c9fe3 b51268e7 990bd6cf 2e405f04 6670e05e c7aee370 c75e0316 90ec23c2 8b896cc2 fc1f8ec6 0efda16a dafcdefd e2c9838a +6448381 43965382 b8014915 66f30bb3 5d8e722a c39f7a55 a82d29d7 40f35dfb 4af0d1a6 0eca3ebf 220a2459 8e4fe383 faefe8ef f4612568 0f00fd20 204afffb dfeb0376 +11702286 163a9e4f 5bdda31a a5ce6e4e 4dfbd6d3 5711e651 caa54b27 77844c70 cea2b113 2d3bb307 19b843cc b11ed107 79e5fa3b 2cf98dca 3834449f e15869f2 d408b45b +4350642 ed955ca4 025b6b31 e048c96a 109d7253 c121ed55 11e6c72c c396efb3 8acd5f64 8746a9bc 388f0877 0f2fe7f1 9a927587 208b1865 f0836473 98a212cd ba047ce8 +16532513 7b0d7143 b596fe5c ee33dbf9 098d8c45 4de27784 60b17e21 0a7e6785 fd83b124 e2c715f6 63de8ccd 1acd69fb 4d8e9867 d36001e6 909b3e4c fd264336 7e84f415 +4620412 f860fb7b 7a4391fd aea00d9e 19902a3c 4d551f21 50734982 0799b8ec 31c44910 73af4345 269230f9 fa7ec84b 1ff86416 367782c8 c195f319 db1a6754 33e2aade +11923875 55189673 ae761cef 5eff735b a771e077 73d427fa caaec07c fbde3c0d 4cbd8e0e f8216aa7 af4ddf4a 34f6acad b67e6ec8 77809efb 4480d06c 7f11c985 09509362 +16453235 cdc295c7 7e816cf8 569ad591 011bffc7 983812a4 b3def036 6e47a428 3fca72fa 3a0a022c 973bd19a 819df13f dbd2c863 3a73a496 9671a8a4 f2a7ce9a 5844f788 +7305159 52982610 e94b3a04 5cfa41c2 46f46262 6cc8cd5a e828eae8 108952b5 0ecc05ef 56b6023a 0c022838 1c144311 0f813cd5 e0eb6d2b 7b8db709 6d96c41d 319ea77a +4335176 f25e994d 7ce7ae2c a8a9cca3 80a2c85a db93beb5 32c2e087 a28f52cb 49fd917c a3d21ddf 0e0c7af7 d35dd46d b7616b1f 14b070e3 d2cb5f5b 09f382a7 d572fbf9 +6373264 b30974ce 288b71cf 797364de 11cee48d 83d6d169 91a7ebb6 9928a3da d3bf8871 a7b3cc05 e62a902a 25bd9d63 e947ee34 ff83c47f ae69d654 43ff99d4 24449c0d +96640 46fa3c2d e5026069 425125fa 96961015 1c46dca3 349e115e 8d104f73 68928608 ab4653c9 a60b55d8 99d793d5 9b83f39d a5e55776 c364a0cc 455cf744 3fcfab4a +14618274 4e6bd6f1 7f1c638a 554cb3ea cff5072f ec964dd5 ea93d7f7 bae29a17 5f5a79f9 989dd366 b41f10cc 6f660e81 790996d4 d2c8e91e 1734268c 51cf779e ac36186e +8628050 287ab7d0 07fdee10 856a2b1d bc8e3521 10d65cb1 9cd378ea 18158e6e 59c47127 44c43fe1 69f4bb3a be93d4b4 9e5dffe9 c00a2c71 c5334e55 0f185d7d 9427cb56 +14621844 35f703ce 3e447df5 c53bc2e7 a0a9774b 950e00bb bf5e928b fffb248f 95fe516f f93c011e a324ff52 1196e96f 1ac949e9 c7baa207 7ab484e7 551e3ea6 c9b9b53b +13350764 9b8149a6 77cd6274 78ce6f16 926a3fe1 9563c1f6 e14a2502 7d107460 25b43956 0cb54252 1be0d469 226a1fe5 1e277f56 2621ebaf bdabd361 cad33ee3 40e6b1cc +7191104 9c89c0ab 1f0c62cc fb270a59 52c183b7 1856423b 23112221 5ff3dc5f 036fd026 93205f2b 14161411 827aaed7 3752689f a03dab12 4cd89496 a923faa1 62a33bfa +15391410 3665920a e0fa40a5 ab78534e fc0e7d07 a6a6d80b 106e8651 e2326398 daae3494 8219b981 d7ebd962 1635fbf0 e806498a 6374a25e 1145726d 97cbac0f 2279d33f +11340739 dd01c244 a76d2bf8 4b55d436 3163fa5d 5e4aa696 48790c97 6d3ac354 1e354cbf fede1e41 416ff39a 954f55c6 edb95eff 3e6c76c6 f390234f c8db0ac8 c75bfeb3 +13435960 2c469d43 7180b339 040b6f71 f3c24bcd 8d7c9c11 81eda6cd cb5fda0f 316ea709 26031033 deb8bedb 00164ec5 2ea8c3c5 8c205105 dd6c8676 592e3fdb 869787c2 +12737038 91a78815 dfe75513 7ff0f9a5 3b8e71b5 6ee9ebdd 7086efaf 1e94ffba df2d7dcd 62c8e9ac dd1dc8c5 6974b5e7 247f450d 34541758 592325de 8b31922c 5968ff7a +1927641 d3ed97e8 090c0ea8 7adf3f52 972be3a8 2b1659b7 d424e4b2 b4f0b2c2 41c39d7b cbc76722 12e50683 83350975 17138ac5 f06da44d 7da6fe91 5665d162 935312a8 +2511062 45a86405 3e285133 49a89fca 11f8d8da a539b39f c26bfd40 716d494c 4ac68ab3 b0893d27 8142ff9b ca41bd5b c17c81b3 0cf7496c 91442df6 3e6522b0 5ce09651 +16750208 c9288a18 35621384 fc18a9f7 99d1ac19 23685069 2c47f823 cdffe662 a3b81e0c 22e27f2d e811e82d 60cc3755 6785d31c 9fde0b85 a7ce1724 878b7d71 03ddd7d0 +12521598 88828d1a 359a48dd 08d58fe7 90b609a5 92c02096 d5d9be9f c87e9d03 4fbf7872 58eba559 453709f6 020b06d7 762e1b3d 70a2eca7 f80674e4 efe2a1e8 4ae6dcbb +6291161 04df5a11 04858991 5f921264 03f61a10 962ab6d2 0c3c4f7e 48a55708 43490860 9544354e b610c64d e30bc7cc b570e837 c0779ea2 f8142efe 18fdff09 b6f778ed +16384296 e39c2584 aa7d9ee1 c4022809 0c1ecbb0 f6d3c1ba df96cf47 e8f47897 827f7de3 d33e8c5f 190fb978 b70bd00d 54c621e2 6b914e10 eec7595a 96b6af66 d00d669c +12402152 0e7d6a4e 3acb920a be45a544 0244cf82 8c03c9bb f9d1323a b53a3eb5 5b1cfc55 bfc2caf4 79a20897 b8337293 c04b69ea 939308ae 95ebf6ba 58060c32 a2ae2a06 +9377179 d7747297 dca2713f e453196b 004af362 b5980893 281df838 e8d099f8 909f82b5 3db42b8d 2e41f8db cda609eb 44213edd 9707236c dc145014 9ab141b6 da76540a +3800234 a681577c d1b9cb66 110642bd 895f554a b6d8342e af5b8844 8517300a 97275db6 ac1379a2 23276700 0d90e2f9 19d2089d cc1c1312 d8513169 c3e239e7 ff32e344 +4671056 5abacc05 f240a302 d47d7731 f24113bf dfbe73ad 53f688aa c773241e d1d01a67 b750cd3d 0d2cce0a 6f802897 d64087d5 1b460db1 7de23411 025cec23 07d87c05 +15335043 37c76010 e912f375 3201916f ee50fce3 562b1b8b fea27c72 e59b12d8 955c9607 0a0af106 c1fe90df 7c87837c 542f8976 455e6807 b1d190ae d5240e48 e279a766 +5624872 5615fc35 25717dde e28a4c60 9e353ca6 34046005 33ee3427 c17cec5a b12f362b 3e41a544 4be18157 618f2340 3737c18b 2dde0647 cbb038dd e0993211 91f187f4 +9885184 2f664969 b2546d02 7458b149 86cb34a1 5f1fe70d 8b1d14ad 8aa5c3e4 9ed90870 0bf21b7d 5fd22f0b 947aa849 0b423f87 abe0ff73 c59f9461 f5b38255 d30b78e9 +6186695 8bc39143 46ab4aac 7fbd1430 9d4e21c6 f2b19117 162f91ce 924d1e79 ff42a3b7 02250fd0 ad164301 b8eddbbd a907e514 8abb214b 0f548266 048de114 5876e405 +13651746 cc64da7b 57035265 611f5609 2e20832c 97c8aa3f eef81885 b01d52ff 3cc1429a ddb856d2 cab7268a 57cc7f1e 7a8626bf 2ae7984a 84b49f03 71ed1d89 100a17df +3026204 f05fd7d6 a7a3f15e 6a5dd33b ea23fff5 10053b74 cc423941 99908288 86216cb6 d3f0250f dee6a04f 7255a4c7 038d4a30 1991908e 0bab92b8 970540d5 f2df3e87 +7062552 fb781362 4876e165 acf14ee1 f8e8fb5a 23891d4c 553bd662 1a443c1b c3d9d0f3 f76d6310 1c87547f 43479e8f 20715a19 9045e63e 544fb2db d8004ef0 1b20a1e5 +9824313 5a9c06e8 05de1dca 2f68a90f bf36e626 6d5e732b eccf748b 13574dc4 7065a194 3e2f7a36 15d9df0b b0af9119 9444796b a676b1b1 607c16f8 c4977b11 1dac34d9 +4757641 ee4fc1d1 3798dbcd 04f9da9e 46af3113 ef438314 e058b413 b2b01231 d1504431 eb317bf1 579fe0e1 5d55b10c d1107c1f 9e46a8a4 d12a46a6 fa9aebc3 85a20be5 +9983360 af729f27 d0e83a81 dcd923b5 a45ebef8 e3d06879 0e7f03aa 1a0e462c 2cbaee61 92fba47c aecc039d a5308da5 2a3ffdad 5b601935 5d402bb5 8f42c45c f7c849ac +9030049 2709ebf7 251085d3 2e1a1050 be14b284 619fd3ca ec2994bf bb501c1b 0c15643a 03580840 e589da36 c8287b6b 84dab6d8 21c52f12 701fea3e 827708ef 17d14056 +2254202 ef4c7185 f2515799 6c150aa6 5bdb26b3 f7967496 98e58c5a 253cff5b baebac43 c3440bf7 df4abc4a 049b3dda f730501f 772982d8 6dba39c0 b5c4bc2d 391edd54 +11768819 4c8150ca 3a32f5a4 e1cec8f9 a84079fd 929989c8 0fa43715 808b63ed f037302d 8e3a0254 7481be58 9808f8fb b874fe8b 4bd99c58 4cf6046b e7bd8e12 bd787520 +7679947 2538eb3d d433a298 84ba83d7 5f819aeb 9a7a87b8 637c8b1e 5ed18cc6 2f3bdebf 1cd9de99 71828191 8a5c1e84 18e74e3a 6b86dcac 51cd777e b1e9fc1a f1efe112 +3054774 40869024 672812e4 f5a0eab4 2fab2d72 05b6c31a 7ecb881e ab1a933e d16a9c64 4fc17418 6fe9deb3 062029a4 f7e1453f e19309bc 44fd5dbe 5d8dcaf2 126fd678 +11639365 10b1ad3e 69af4ec6 e2a64a2b 376991b9 d3eb0198 fcf0a072 687aac71 d8dda73b 9de93990 2ad393ba 9111a306 b9c507b6 5503c5e4 3bda26eb 0c66c703 5394de22 +851389 7a7ce9cc f9d4c202 33280f7e 96815786 4416c97f 025634a4 2737ccd7 8e8fcf1f bf15e07b 2de6dd80 153eedf5 beb956f9 1ebfe19f edb38d39 a2983a3c 49a96065 +14619361 a14f9fba 2c9bb288 9d1fce38 b44f6506 aaa844b1 537a1007 066f95c8 713b37f4 5d2ec727 28ad41ee e3131e43 5b0ba98f 6839a058 edbfa25d 9d109a44 37cbf716 +14718017 963a6340 c669f9b6 85992a69 c7fa31e5 3d24e902 e69610ab 8b43bdc2 65a8e610 befe5e01 d8b178bc 5125427c 83a32f18 f3dfdf12 f042bacb 2c5a658a e05f708a +3505400 4ec0b3ad e2bfcacb f20a7144 3c0f5e8a ba4d47bf c3b8651c ccb0e54d 27e2fded 8be0d52b a02364ed 2be596f6 62c78462 ecc8ee70 ecb02003 03dfa103 dce2b52b +12364390 aa8f82a8 3d7b3cda b6688e40 0cd3a578 deeeda6d 691309ee 624f0734 b929309d f8dd9afd ad4ffb9a 93588ae7 cd742c89 0bf019ae d1f52b8d aeeee328 ced8e1e4 +14721160 4c08c304 1ac0cc10 4e0609e7 9241431f a55b4aa5 cdb0f1e0 8ded2ac6 e365defe 62a6c617 218a157b 38e996e3 92d355d9 a51d4526 b7a049bc 227ac442 9e89d334 +10683252 6f2e5472 04bcb1f2 64fc3248 6f6c1482 28aaa1f8 14e73ec1 5a920a2d dba4257a 36f46427 9007a45a b3a99f23 449d351c abeff9fd 99764c6a f6ce6dca bf7b831f +9215032 b2645f9a d92fdb11 fa235918 5bb27dd5 966a93b5 a7f9ad3d 7f2bbe35 3e573174 168813c9 cb45e8e2 5af8f503 69dbcd24 c039fb65 32f8299a b7040cef 99315cb8 +1141984 c9d1f8f3 8ba21b4a dd0c2869 f7cf637a cd739f8f d39a7548 fb3af2d1 4651746f b15dd3ee 3b426fcb 89ecfb5d 4e5fabcd c31cb3cc d35610d5 545eeeae 8bb84ff3 +11376768 6ee0c112 04b54c90 fd2d2068 758ceea2 76bad7ca 089d15fe 7d43037f e47ca96f 00ef6c3b 56304443 aff3a78f 892250ca 2ba39ec1 3d6b3b67 4c4a6580 39b501a1 +16258714 0a8f1ab0 6ca56d36 22e079b5 03472158 5194398b 28aa7d09 e70bd801 b3625028 f28f0a63 db58088d b9c96bd4 87afb01c 6847fc5a b7f16d62 2c829ed7 6147fb2c +4598980 bac07411 fb14ce72 3fb45a60 aa3babb7 4f6437d0 94473258 f91a8d65 e4e8ef41 1178ab2f e93b73ac 3dc48f67 b7e740d2 833817f3 9e8fe955 44107f3c 8f613721 +10253338 fb331170 9b7067b5 cdd41cb8 82e735f6 3800533a 97ccda7a cfdcee59 1943bc88 643005fe b8503b3c 129aeef8 27de5f89 9693dd75 c08f6b91 1117e181 b47642f2 +2193772 9a7cc727 c3525424 a2c7f216 7936fbe0 ec193c08 e87f62cb 27498f26 403830a3 18fd2710 043b47a6 adf97a8a 42006b55 30a1cb16 ac45c2a1 8a5f05a5 78cba2bb +2682626 cc94b141 78d9ad08 bb5a0a37 a00f9e05 46e13095 0f27e565 b6ea740b 9d4208af a6de7e49 bbaaf652 30214dd1 058f147d 09735adc dd6e0bce 178249f2 4b96a312 +14141872 33a84999 905de9e3 84925800 cad97fd8 44b04826 2ed898cb ef0948f8 e438c1fb 7fda62e5 47b11a3e d43e6dcd 82608b68 f4b80e52 5414db0f 28dec366 1d9c8b95 +9233526 38588be0 f98c9668 ab2300b6 25a43026 1bbabbee bc4d5db2 ca22a544 05f845d3 525d8594 56617f51 b539e307 0206ee0c 4d1578de 9f67a42d 0e209c1e f2f2fd4f +5890033 5caea73b 955fc450 48468579 9296f6d8 d0beccbf 35fe956e aa4ce3ad 447cce71 9cdc7bd6 85d768a2 ec5bfa26 8f3c4703 0721f8b7 bd9db226 4e3faedc abdd3a54 +505880 93cb2bc3 e89f4fbb 9ff90808 b4e91b10 ab52c015 3b610299 495629a5 13442a5d e1e883c1 b547f834 e698c79f 7baf839d 9fb23a60 7cc470e6 e269c4ae 3d3e48b0 +6243683 e429bed7 8c20bd00 3f67beb1 235c6dae 996eca95 ae09795b cac26be8 3fe5e232 3fed0b65 3a917cfb acbe2976 6a8622a9 fa17ecfd 08f61520 a8336cee f898eac0 +6743592 561e8aab b3cb570c ff611c14 5b831f55 037da04d 3efa7f61 7e43f087 e3bdbe40 a63fa5a2 6bfbb579 06392b15 a427a33b 50cc33db 70f5ad8c ad41921c 0b4418a7 +9354827 03d69692 742e5203 72f7408e 0ecc8cf3 e767a0e9 56aea2bb e5fc6e38 083fccff d2e1954d 1610d71a 20f7b03a 26723937 9f057225 be7db057 28cbd008 2f8a5642 +8539769 557b610e 2a047f62 6b5aba96 183fcf9d 33a197a3 269a9f7a 665eeb13 3d8b2c77 549453cb 370ad088 1f666266 35275de9 4c110184 04e89bce 96f604e7 a2669d69 +7433402 8b87a5de 163ec3f1 32c7c823 e30f8282 c19f8d21 59f94e9a af307deb dc74c6d4 a56fdcb3 54c20b93 2e6f05cd 63b93514 1bc64f54 1684de9e d7c34178 72b4da2e +3255337 0309946b b1188381 1d491896 051c70f6 fa622cde 082b7902 8177e63c 2fd86faa 70abde20 ab39eade 01ada148 b1ee2f6c 1686fb9c a23ac91b f990d121 8f40b834 +11142910 be84f9af be172ed5 3ae7e62a 6e203e88 5d888bf6 f9979cd1 71482fc8 31328ae5 850dafb8 17ce16be 2b0822ab 67e1137d 8281d1f7 0f44cac2 e8edc01c 8fbee760 +15663101 1e07368f c05bdfa8 f8caac82 8b4727ed 91fafe66 4b62376a 53524bb4 ba70f2c8 f62a71d3 6bae474d f3415c51 00d1f593 e454ebe2 1477418d 1a2eec95 9cf005d2 +10487873 d9e9aa4a 0602593b b257bda9 a22eb3c9 f93b218d 382d610d 42e9aacd 20eeb0b3 981a0c70 36a99689 d3bd89cd 99e333b1 b2c3b480 e1b03e8d ff5b7b56 e4e568dc +7330210 b105f18b 7ac8af7d f73b0af1 b6d7bf3e 500f7df0 5802a248 4967b7a9 6b7a7a04 7a9c954f b236829f a7fce862 1ecf8534 03fa0ef3 66cb7e85 033aad07 3ddc12af +1127629 59d257e0 6733d72b d4dc8a44 c679d69e b680c7c6 3fbaca4c 5aad1b8f 6386cdeb 7d70864a 47e31ce2 de2f37b3 844eb6e3 487c66ba 3ab64e69 b2e8d353 77d8d5f4 +11494763 6b489dc9 d2a927a5 43ded536 f71817c0 d20cecde 7c0bd547 35086b8b 775c5804 cddfd1fc 9275acc8 0c47cf87 abd09eae 417f701a 01673449 eeba8ce2 476d0421 +382499 b16abf0a d55f0e61 f706d1bc 523a8d15 07521c0f 9e6f7caa 928bdccf e6c32ecc 8c9d6f13 a978cdba 36876f26 2f0356be 2717ab2f 1d8d404b b3870a7e d2dc7da7 +5506408 e881f3a9 b276c940 3dae598b ea7b7b66 ff78ad94 20698204 1df05eb7 90ff1854 24604390 4640ecf8 9aef5405 0e9cb3c2 bae6d8d2 458acee8 be1b2fb6 4339633f +6768128 1fb28b7a 9ff930a9 0898bb61 b36b05df 91726f92 6411b759 75811adf 0911246a 323033d7 ce73dc8b 8862d719 c1b089de d2d28d50 46f21f65 998bc451 8c2adfa8 +15499693 8b245aea 968a1364 52ab7f83 ed0e5f6e ad07c582 774183ff f6bce8f4 5c83b258 af0f396b 09102b6e 19962f24 2d6e7111 e42385fe 8b5288c4 38f507c8 41b098da +9706363 041a9935 55cd24a8 0457a9ba 70ba4fea 82f9a6de fc4b772a 5ad16c53 49df1e0a e82deb73 e09d5eaa b77a4a30 e48b9319 17f63653 21aa3487 e8b0d28e e4a5bc2e +1749349 6f4b3e1d 15401507 55e67832 7591ade2 715e11ac 686908bb 5347d270 38da8823 425666c7 87ed313f 244dcd55 152d6817 3f4e7ef6 8804beab c5ccf7cd 00c6d81e +7068181 d1a43a8a fb863fd2 06d9002d de699c09 d2f85dcb 4eb3d805 4ff1122e ca0e5248 01439f05 45166c2c 9c018ab1 961867cf 161ff27c 5e161246 8464aaae 0de5afff +12986998 6047237f cd006b4d 43678aae bb0a5bf2 f380db11 4f1256aa 17e3b19b f2f04ce3 4bde61da c64c4b76 0e26803d 506a76f3 b4a29413 b8f65b98 c3fc6eea d0b3fea2 +2206453 8ba7ac46 f9d99dd4 5b3c3f39 269a17db 8323ae15 6aa704a0 f2508df3 cc754899 409a89b5 1e567664 591740d0 d1f2e31b 7449085f 6f7f43b2 2216a430 ac0f3800 +5868879 d8fa8167 2b34e464 9ad89779 a976b819 4bf41a07 21782f26 0c3a11a0 0147e5e0 2edf1645 898e0143 72c5be5c aabeb70c 5ad5f796 bdf6a0fe a11ccd46 84537fe4 +2610168 8d3d35b2 3a165555 fd530705 de8c7a55 002774ab d5b2eeab 958b16c8 d6760f16 72b6ce3f 4f6b9ccc 237dcacf 90549f76 36bcb71f bd64df45 d3802198 8e4c4815 +1332819 2966641d 51b2bf33 a24baa95 4ce1bff1 f689271e e6043dc7 e990694a 6ad79e69 5b66230e a090b6a8 4d51ee74 ea8987d2 507c97c4 f4fb044c 0f375feb d1c7255e +12719600 383e4abf 655e1704 834e36c1 80901266 4339b6c9 cdc80ab6 9f5ccb18 8bc8dc78 89cec4cc f7fc25b6 794b6b80 67721a69 79ee220d 046b786e 9d9ff41e 2b534dc7 +14600824 2ca98f39 7367beca a980cd87 88beb88e b01347ac d0814bef 269aaede e6f9eb88 627e2eba 4317422b 5537bfe3 ae75b95f 59865b4a 376f5e34 4c5b5e1c 665345b8 +564836 118ca2f7 116c1862 68f275e7 9e3f302f 9b767025 7b64f60a 377773b6 e71199c7 1765e57b 504fd8a1 318d155c eb1c553e 6aefc5c3 9d5190eb 4abb3ac5 dbaf4650 +16655166 b7428e0a fad5f952 0296e511 7a15e117 4857b73c 66c05c98 b3d6ac06 2c5d3896 f3fc186f 471737aa 02dbde95 376264bb 8bae93e1 c74cfdc9 45a3b5d7 98baff8b +12505224 0d95df5e 3499abc6 485d09f7 803d56c5 100d0ca5 60475828 e73de35f 408aa151 1ec6a38a 862088b7 7c41cdf7 eae105a5 fe2abf9a 807c63e7 225bfc14 2da40329 +14309480 eb6ac47c 78a7b7e9 601328b4 a3920ad2 8a170e90 f33cabbf dcba7a39 ab385192 be47fca3 c5f95143 d824dd35 87791f1b 26807619 4ab00c63 e47b2edb 40d0fa60 +12379588 5dad47a2 fdce9a71 b0c6c646 70e889ee 854d9385 6f9f94ee d79549a7 5c12bc37 03de38c7 b11e9777 4062212a 3a4cdfab c593122f 2eb9762c f9fe5d8e 225dd225 +6075578 69ff61b4 837dc6f6 746132a5 404b8bf6 68f98b9f 08c3c03e 03366d9d 393ed532 c2b29388 5749a9dc 9634d9d6 dc237349 da63f0ec dc228af8 b90f410f 5a0d0544 +8657725 ce20c8eb 895acab2 2bb2cae7 7f60e5bc 5b2af2fd de8d2330 2e7807e3 7657688b 170c4260 eec63a81 7c3075e9 f9bd5a7f 1601fbbb cc8516c1 6f7003a4 bf01956c +2440495 7aae8726 65fefeec f95560ae 609a80f5 e2c26092 f23ff8bb 1cc0e88f 77c3ab0c 0b93b8f1 685f976a 5004439b ebbf3488 7d3c291a 8e807a9c 6745f395 866fccbd +11361864 f6dd23a6 024a33e8 192c30b9 3f6fa1f3 8de07141 86fc9dce 2096b64f fc83e310 dc6009bb dc99f611 d186a3df ee9bafd5 dff97a1d 0993992f 00c98908 75ce6e9e +4765581 850a94b4 573fb441 dd29c568 8697568a b45ffe52 98c4ee3b fe6adfaf f08329a9 1a598c04 1dd74a5a 7bd9a793 0cfd0a80 0d71f95e c8df0ee7 a9796281 1719b4ed +14438519 15021dd5 17d49a5e 0b0ff8a5 edebfe8d 7075e68c d95e53ce 613f64bc da5986c4 1eb0963c 61d79485 32dea109 26767496 f11527bf cb77fba2 f9712988 07c4bce0 +10955127 d7fc71b4 a6434eba 271a12dc 4785abc1 2156376c c3256796 8d06bb86 7437d588 4805dbec b9d17060 c0f5542d d5362dc6 5129f318 bab65771 c014b282 7d89310e +5097821 54dfb05b 70317e6b a0e4bb1f 28ea2e2c 97249aa7 4f2c9416 c6a3ec36 3dd10f3d e0b3fe95 6fc70f7e 37dfc19d 577999ad b8dd3f02 05d1908f 11beec27 a23cf8ac +316301 78cf2363 a298651e dd13c165 33baeaa9 1d96feff 07fc3d70 2d02b80a fd52c256 eac7889b 6e391508 16a305f0 b3d986cf ad0836c9 f9c440cb cfce4beb 69395d20 +3771108 4a92beaf 3f4e03ab b8f24b4e acf62eb1 2fe92664 c85c7956 39eb1eec 04b21cab e9713465 57e2673c 3b4f00d8 b014f6e3 2c340e60 a0b16aa0 b7a38eee 327a434d +15305567 f11696fd 8735ab4a 60b5d2be 5f3ae70b b8967be4 9d5a52a1 a746b165 ae00ad44 aecafc93 52d2a238 fac6d2c8 3b38893f 13adc4d8 55890dba fb4fc857 ed9b57e8 +855629 99a06d5c 294dcbfe 5c9cd145 85764195 720f38bb 7ea54072 5826b1a5 b8ba37cf a17d76e7 ef31d643 e29cdb2a 51a34f92 05d9f705 f4db99c9 c95054b8 b38cf558 +14826301 eabb5a43 f9272ccf 618e6a22 55d13683 ee8c9b5b 65863a28 7e6dbeb1 71b405ee f7275c89 51dc53cc eefaaad6 589f25ee 97b9a6f4 6637f107 17577a80 6baff1f8 +4890297 5729fb8f fe9c8bfd ef6ca092 7b0380c2 4be87531 58621387 ddc6d350 8d09eda8 324ec739 7ccb3610 a5aa99e5 155880cc bd983202 1cb94a2a 1b8c86e2 ab89c977 +2692737 2023ac4d b92473d1 1cc477d2 5c065ccc c91a3c69 0a8a4e2d b06e17d2 00d5d8e5 0d6c4678 b0e50261 b5cd4e9b b127a110 569e69da 63fb500f 3571ef9c aaf6942a +1798558 494376dd f8607f50 a05a5550 bcb2a127 74393a09 0aa47086 aac4b6a2 cf9eb473 4f817f18 44182eaa 57b25e02 43afa7c3 b8d69c77 479b6c19 867cf327 003ff0b6 +5701596 116b510b ad1b1f92 91c0515c 8ca02151 95ab00a5 56510b5d e8a11789 8de48d5b d203a0f8 727653f5 81681f7d 9a12463e a56fceb4 2a3dd4cf 6b0dfdab 0258405d +195917 3dfbd274 b3ecd92c 1ed126b1 89f098d4 0b5fba16 3ccce72d 34b8276f 7c6926ad b58b0c8d 4912aa7b 65e3efe6 6ba4f6c2 704df16c b42c011b 412bfac2 cc4482a4 +5741310 5e811452 77a30674 70e0ed9f f182a1c7 304d1029 7c7a6356 3521484d cddf5a01 cccd08a3 8348083a c4cab364 d4fd928e a99e0a5e 86551de1 7a8630e5 578e8fa3 +12433807 d9cae80f 46c88714 bb48e205 5f7e74a3 0657d9a5 3b688dfc 3529e560 533cc0d3 54adef7f 661fb939 05551510 1eed6996 334a02d9 fec2e4d8 fe6c2708 eb3533e5 +5398105 bbf6794c ed6866df f10cad43 7bb39323 907078de a1bac74e fdd9863c 1c9ad373 463a8613 aa1b04cf 8787fc86 ef01c1f9 66ee9581 5e6fc110 c12e3c77 908492b1 +14965737 76086d11 79ebb4ac e39c0867 70b3753e e9ac7511 1a9819c8 af0a6ae6 8ae32a2c 969b997c 845d5705 52ab862d 74f5aad5 1c1d9e94 c5e6541b cdb90f4d bb7c2200 +254708 c18b08bc d98e77a0 c9091fc7 b9828ee2 44f3570e ecd53827 83e143e3 03c01f98 45ca535b 14c31286 9b2aa4fe 47bf3dd9 4db19fe4 5dcb4b2e 17be1a7b 45378dcf +7830465 1609494d 55a5b6cc 2ee21aba 64555795 5c032ee2 7944bccf e16b38b4 a87a0c84 03587ebc 048cf412 8f00cb48 a06de91a d2b7bc3c 988526cd 2cca1878 cb0c801d +4649558 9d8dbc72 253ab093 00ceb62a 60e74f6b fa40e9f9 3fe4b9ff a08835b2 1fd200fe fca8108e f904ff46 426d688c f8785c84 d58eaede 1a5887b6 ec631c72 fdab4dd7 +12541530 a2937927 b2f82aee 035a4664 fcb24b5c ca577379 d18e73b8 bbade987 5d48b302 6ea17efa 6e2b500b a436ca81 77f5cf5d 45544938 f1d702ff a7f0419e e8a070ca +2515586 0cbe9cc0 7c60adaa aa4a2079 c625d3d0 dbf66483 5abb7dfe 50a5414d f7b9e9b2 b21759e2 246a2f70 8fadb52f f6a62ec1 f17157aa 28fe4dd9 3270cc4d 71d22683 +15020722 02b2dd92 2d6c50b0 a163724b 38c4f425 4a67a4c9 7a37c793 581dc831 c4a57e46 c2948423 73011dc9 ea9143c3 e9ce3971 11d22d8b 249d296e 6ce50606 f0ae3466 +10124103 e744490c 278574f8 f470d04d 78734e0c 05ab42ac c07b2dc0 a08d6846 1a02e980 b526c882 9a9ca25d 81911194 cba1ec08 40933c8c ced4d5f5 e9db2cc1 51087519 +10141458 c3af8d8e 99ec2fe4 17ea6300 21fd1b24 05f3e791 300bf3e3 7aab590f 93270fdc 62f57195 f6b81e4c 7a443cc3 46a8a8ef 27e96f5f 1af9fddb 7dcad580 666c2f9a +14121522 afa90497 c9976e89 43ed0054 deed39aa d4fcc9b1 84a0da9c 8fb1f322 1728efc4 5daa8114 673d251f 35f4b981 801da118 cc811933 226ee51b a7bca1ec d2241683 +13194678 d98c62fd 7081e2da 3994120f 25f5db63 b3961709 221c55db 0b45e16f 91b97295 ae48a2ed 6225ea1d 84c4f26d 3210fdb1 7d87ab10 bafdb5f5 72cbc8c9 9377784d +9684724 bb4a665b 3766d654 f184c2d6 9f044549 db494e5e 5a5e6189 e8b6344a 8dbf9d67 140a1c76 df28d36e c5bebe74 1857b2f2 6256c4dd e967c3dc 78d2cc7a c8079c60 +8866490 e2e34812 7524d78a d2d218c4 60ff7e6d eed8a77c d3c71130 c1ed1bc1 15791034 fe662954 3ceba080 a0e773f3 af553dc4 af00ef43 5ee2d84c 2d0ed686 0d5c6884 +4795645 eabd6e1a f4a5bc58 dbc448ad 5f1393b5 744981ac bd00db9b 27e60c91 25b9e92e 775dd962 305a6ee0 cf490927 dff19813 9729e18d 8971bb1d 24e98ab8 ab160462 +10651593 5f8c01f1 f7942428 11da34cc 24b508d4 298ead22 59f83f06 11849c0b 854452eb 953dae19 6a5077aa 81147370 8724a18f 5fb81983 36312591 87ebdf72 ea37eee9 +548227 0732a624 3328b0f3 6819ea43 d7238766 fe110e32 1a07afbb fc83438e fb41aee9 5b336208 2747b121 ad1b8624 0ae0ed6e fc56a267 1929e504 3de2534a 94d8afb2 +12195209 d5ec721c a4c95688 078e47f9 53e39d51 1d2d497b 923b1313 f02cbd45 e242802e 16c5c137 8415a0ac 89c19cb5 3465bce6 271fcf1c cbd5588d a094c0e8 43d803d2 +10822464 330eb7d1 01f5e5e1 45007cc3 8c269627 d6b79243 fa714600 3ccbb339 67236483 47abd6d5 4321e7ab fbbb0f2b 0c4b360c 06bfd5e7 f4ac7352 790896c6 97a0fd9e +1848990 7fb1ee2e 4b9714ff 3615443b 873bd955 cefd7778 2b94f8cf 365af052 b581da20 c8e8569b 443eac65 61a03850 174716a9 052e9402 a8406970 93a2b5da d5420b87 +1049686 ec6324cb cc6c0233 9799f7e6 62adffac 9e051c2c df0fd269 dcdb3ebc 45186e66 da1f5c7c b4a38fc9 fad0fa6f 0b682ec9 ffd09376 1ddc5f0a a90cd422 f1bc4913 +9378946 5616345b f3da6f8e fe43db12 8181c4dc 5d0a5288 6e822232 f22dc0e6 71bc6b15 ef55e039 8d542168 2ea0e9ac c9598f19 faa51d65 9fc3fda6 ceaf2a0d d6b63949 +7085600 27e55e1a 60beb16e e93a0954 1100fd9d e91f1b61 f8d03f1a 1af9488f d560838f 15682bc3 aa58f221 d990a9be 7ccf36bb 9fb17fb7 e8f30f01 dbf40f52 2137a5ef +6333815 b8a75d6a 2d21e392 8a4272cf 702b3ac9 9a04bc1a 293b1d8e 20ba9c86 a7c88aab 13b88882 b6f43898 b895f013 fccba5c0 d8507a36 2c6a7ec5 1abacae1 41fcb9d7 +9903814 64c84e4d 5aa4c07d 512a8e49 73f5c2b0 15984558 0c11ff7d 66bb37f4 f4f11dc5 04a9fb37 4f6c6863 1697d226 ba6ac116 46ee356e f3b7e8ed 374e4a0d 61f24726 +11922125 8cdfdf8b 3f002657 7cc951a9 bea050bb fef895ed eff497f8 eee49977 c2236723 a9056cda b415ea83 353aa125 fabdb3e4 dee66a77 5e62d849 c122f9d1 3e7d74d2 +16714063 fc6923b9 d71d351d f90d99c8 aa6fbae3 991f3a8b e55e80cb d9fd3f6d ff57e2bf e451527a db63c52a 5a0a17c8 668dfcc9 ed457ffd ab9b3f3f 6e147ca0 7cd4b37a +13673925 fa1a7d6a 693233a3 2096c247 406bfb2b a99b9590 b0bab98b f4ca6931 d65adfc1 563951cf fc05ecbb dbfa571e 09103846 ff1fb644 d5cfe717 51fb2a02 0eace23c +12265649 794ee2d4 91c648bb 3a254f18 b505348c e7ce042e a1d254b4 08719c41 53b54230 c26643a9 ee32fa00 310eab57 247f52e1 0f0d0034 9c6a9486 5fff4e0f dc9d45cb +6756941 b660e292 e2fd6f83 fc962fd0 1e6d31e2 4d37730b bce307d1 7ee9d92e 4107f5a5 ca409614 77c200d6 45924fab 8adc27ef 5033dbe4 5fc85d4c c71e9790 f56f6e45 +3784059 5ff55b02 e1a98511 6bdc1828 a2c1265c 1ec82267 3fe7347a 1b5971b9 d7165ff7 fad95e3c 7a4d3cc5 d956dad1 2773f487 d07a7027 038ef33b 68789051 7af2a02a +6171623 42cca0d1 fee276c7 c27f5b29 4548b6a8 105029dd f48e20e5 2b8bcbb9 d3783042 776059b8 df15b0ef 54aef4e2 629f2529 d8252609 9d0dbe31 c5be713a ccb5fd9f +5239478 5e627f6c 0779b396 73a85a69 0a58b250 57438b27 44bc6dac 13399182 a2e2ca01 3decd939 32e02db5 c4d46dd9 ae0a03f2 28826c70 4bf96e51 9e12634b d95401b7 +1054018 ae907752 eba96dec 20cd4f7e 5b6b64c9 8106882d 354f1b0e 74f397b6 61f6efe3 0c0bb5fd 216909bb 28023ed5 07136baf 1a18a2c8 3037cf92 59701b39 70ac8b7e +8274779 4cf389ea 4177d974 7cd89761 ceaff039 ff0f3cb2 caa900d0 6bcf1d9e eb019114 44a518be 88517032 423736bd b7033c4d 4f2e7311 641a179c a4a0bc52 b9d4fe91 +13103440 8638df08 5420e7d1 3e24be11 6ff67818 9f996aad 229402cf 99003d6e bf9136c4 c1d08d95 2a173f37 987830e4 fbb53015 8d8076b1 b90bec53 75b57d49 416852f2 +6021997 7e4360cd acc44ff0 eafc7861 849c12a3 e5a9e848 f2d2ac52 dd128960 e3d6c9d3 b0ba8976 38ab8dfc 8c2b6b3d 1e025000 a4914ef0 cbc848c3 a76188b8 2efe1cbf +5919435 8784cf39 d3810ed2 860f7c01 268878e1 f18b46b1 e73cd388 ffa4a925 f4b40c0e 9c4ef1ff 14c010f9 5a9dd85c 718e8f72 fc42fd27 a7cb2cca dac82c06 fbb335a9 +1412344 463cfffd 4fd89448 2e9cfbf2 01fdac2b f1511c0b f5000504 397ab6b3 466b03eb 07e259b8 c31f6511 1915b396 98d30d22 3d7aeefd 74ad94f4 8a2197ca 695139be +7709861 784b8429 645f0bcd 796ff2e9 1670eb2c cb52661f 105a12cc a02980fd 047ae6f9 93611cf4 fc49dc67 da660ed8 28f340b5 b83a2ab3 9cbe91a8 096b261d fd78f8d0 +9825011 f2a33200 9ea00717 64b4e233 5a4b2d7b 569171b4 d3fc203e fb8a5840 848f76da 6525020c 8a9f6d76 708f963f e913c90a 7d71a14d 56d993c0 653143cf da295380 +8661608 a072d7ba b947087d 8eeac829 7b93f160 f81c6d1e e2a286a7 a597e96d acb5978d fd1da862 87a2915a 205dc214 630af8de 74431baf 6bb1675b 956a66c6 079c78fe +12934782 f7a5d58d 8d7be2e8 20c3a965 479f3787 62a51fd5 1ca937a7 8c7a772e f3799c26 471ea78b 2d108948 02e8abb1 1add0785 861bd64b cf2e666d bf306285 f3dfc79a +118248 8ce14c12 85baf2d1 609ab038 58ef9fd2 d1285fb6 0644e2ec 015bc572 500f1426 88bedf87 b474b4c0 8c1bb54a b3b54d28 04c0df07 cc93346f f68b5aaf a5b15743 +6375792 b7f06237 567a6016 936fd787 4ac49060 2eb65d03 e2769931 bfce4d2d 3e93a445 ac0ea2f6 4dabe288 8806cb5c e05f06ec dc5ec8ad 67785d49 e9fa951c 7cafab74 +5353209 3e706f87 427f7a24 b409e1c9 843cae19 f1937aaf 68ff33cd 878d474a bc57acc5 c7e3d5a4 fb880bfe 92ecc11d 0af4377f 25e2a414 c0231ae6 5ceb5240 88eddc05 +1245134 0a4086ed 86cb4ad3 060f720d 251413c0 f4cee845 fc354de7 55dee3bc 574ca98f 960fec14 43e1b3ba b4512240 3d874fc8 0e370e13 f0bf1701 f3cdfb97 58a1d777 +13637186 e1f66284 23c09ba8 a1c8919a 4ada4ab8 b04a6991 3283da1e 691e731f 640b8841 c611c390 4f0f881a 5a719eeb d775d1f4 7098d3cc b8730c0c 2e912dd1 a1dcbfba +693169 bd6d0a30 2c1ee18b 67380333 6d916bbb 442546e8 b209ef9b deb62080 5f95f2c1 687b4ebc 43342b85 bd885970 9d4ec029 99c335f3 7d99c03a 215c1b39 8e436b1e +5462189 2ba930bd 40d736c7 12e016d1 dcd6c552 4155d484 4ddf9f86 bb5ea1c3 046d302f 021a5516 75f516a5 de9dff12 8d6e5c5d 52bc00fe b18495a3 cef162f4 df899375 +190621 1efb712a 32ea3ae9 484d3582 c1bc2951 d3f698b7 295bcd2a 48de859e 5018ea63 e26d68a3 d3c2f6da 70b364d6 f46853da d362d116 4d664b77 06a4f659 9d5bd820 +4282949 5b4c0801 7884a6a2 cee10c94 ee86cfe3 1bbdf217 87c2de9a 17810ece fe4381ef 5a2e76e0 54e41303 cd6b68ea ad974ee6 a6ea546e fb4c1c1e 03b8b916 d79656b2 +1969232 d9b06b80 c2c0d4b0 56e061f8 7202ee9d 48762086 d2238eea ed12b757 dee8cc05 331271e2 0df70234 2d0c2267 24bd2a30 bc5bfbf4 2e5c3e62 9149facd 7ff8b84c +5262116 00063a53 1f5c0ebe ee0dd4e6 d9bf0266 905b105e 530808ba 2b63e5f6 ed5c0905 f03939e8 8da75088 f3251eb0 cfd8d86a c2c55cc6 83325db2 104287e9 0eec70f7 +7210930 7e60e898 2484f7a2 15fcc28c 6dcc7be3 148777c2 0277506c 58f64054 29063c00 5726f101 5a8f1897 9f145923 7bd145ac 003c2850 21ddde55 576b5700 15c305fc +12044263 3160411f 1683b362 095423be 458110a7 e2309a53 b6da3bb2 d7e6e9be 3565d568 bad200cc eef222d2 f94d548d 6e07a378 97b9229d 4a826c30 d5ef2c97 75eeb22d +10288886 6eec65d4 7cff4a00 f08289da 0efc78c3 f9a1af93 95bf4942 2d657a9e 1f79e943 b8103885 4869cb45 dbfb0676 7ea2af83 c97eb1e0 f1f7d0db e40721fb e8374087 +2134711 518b84bf ed13c536 68440798 c219b191 0cbb8de0 fcc3ebc7 60456d86 586a21ad caedb50c 8fc1ba54 8b061525 3c9549ee 2161690b f456429f 068963ab 4c2e0c00 +1308373 6a9419b2 2acd4a24 8406dea8 9a0fefd4 76549d38 00be1998 5f28fa5c 2ea75355 5c0c14e3 ddd65213 15475622 b7ba616f 4d7eff0b 77083bd0 297f0220 63850a35 +10065335 6b57b053 753f58d1 609d44ad d19c7cd4 2cbe39c3 ea2af8b8 3d33bad6 2b3d3de8 2a79b009 170593a8 f04f6506 d8577d98 f7479709 859236e9 b4d41b59 ac671e5e +1655927 1762ab11 41fe39ed 3d3f30b3 1578e3ee f180323a 0c7e7be1 98883b4d 3ab62d63 9f5e749b 0a2003a2 96a36247 525a8451 50038822 4fc1f608 ef4fc90a 8554b8e5 +8949506 4ebcb9ed 7d851fde 101186e3 b85d9de4 5c7511c2 d15993b2 5bf7fc05 f19c0f1b b097f2f7 ab23bb47 02ab5e51 4e2de97b cd10c7ed 1a8b97b2 dbec1515 cd3d3a3c +1560254 76c10ffa c27694bf adb6bffe 7296fc8f c5cfcb91 d86d1f05 2a1e1553 682f7693 f0ba2d7c d00978da 442e48a6 2ee95c55 2dba4bc9 cb3ceaeb 10ce9c3f 1494248b +1683681 780f1180 9a79fce9 a699be93 b0670d82 d07756e2 876bc06c 05f3e96b a2ace045 cbd205e7 3ce2115a 7ef85281 4444ec90 228f5e80 883a9499 363a2cff d10a04fe +10700127 19039ca8 182994bf 97a0962b df4267bc 0e2fdba1 a2933034 8d9f5434 a1f3dd2c db0f567b 22746425 6f1e44f8 f43f3ec9 704bc3be 3aa4a6d4 faa1b2a5 3e2144c6 +15641594 06dbd4c1 1efca585 3d6af4b1 bede47a1 4cb8da2a fd7e7589 fdd30b89 17920c2f cb4e34f8 480d0fd3 23a5253d f7872b17 17993cd7 389878f9 309988df 8a99c238 +7978752 5d02a44e bec1806c 820f2eb9 3531c8cc a6d5a769 12bef359 f32f6eb0 15570a44 bc558979 d51f4450 de72d31a 256d2edd 55a2e239 c1b31ce3 671ca3e7 95b84992 +11834484 7a92d499 b3212e53 53f054e2 e7c4e824 b929901b e286f337 9ccbddd7 7b3b8e8a f9526f12 dd9cdd55 b18c917e 3d1b9cb9 db22dbab 70422af7 850c64b1 be21d6b9 +9530780 e059f263 9697a0de 930f8995 f0a4739c 65109a1c 0a7c5dd6 6fd3f7eb b6fcaba3 401b6670 d82ea89b eab96151 acf4fc2d 2f8b0b13 65a20853 973b0a74 f8812d74 +6747324 89e0c2da a84ddc8e 0a73bdde 69298725 934096aa de2caf50 e7448aac 928d2e62 b7c89bda 0624c7a2 4b60cf51 087c6ee0 ec262171 ee06f7c2 d7f45d59 ab70a983 +14559499 a876d18f 16c7db0a 9faf02d8 bb1e9af2 833d0c33 c8f0043d 4ea39921 3dc1c3d0 795060d8 1cf855e4 7b7a98d7 a8fa469e 31d322d8 dcf19601 c6aaedbf 178c1435 +15010220 3837a5e5 11878bd5 4c678b73 8b5a960f cb9100aa 39365444 83f1199c a1c0ee43 78071a9d 530c5082 8bb48b0f e55a60fa 5083f6cc e3dc60ab 0c98d060 74f619a0 +1598693 ee489ff4 363825df 8bf83247 55057645 26adf318 9942715c e2faf609 5bb1c34a 3e22e0cf 761ab1c4 795265e7 3cb20891 1d210659 a4382f55 4f313bb9 fdb6122f +412506 82afeb98 79a54627 6fb7a700 c0f8292c 1d689d48 67f748ff 0a46d809 10aa1f7a 6b262997 6b3cfd4e 14531e41 aa7cedb1 f2c81ca6 32fb4e73 be5fda55 be6e37d0 +15247877 4fd77a72 8a244b32 467fae3c c86bc18b 7525b44b f5785ec9 4deb90d5 75b59f26 a71cf1a1 305b49d2 c31c5255 723c4b50 1b0f2f21 93ea3d66 d9626215 c2c2e87e +16333525 0871a316 328c3be5 20bcfb56 cede73d0 56f7e7dc 5857b491 c5f21763 f48d167c e4f55eb5 58b1478a 0af1f5ac 66f372cb f708c466 e71b973e 5a02a3dd 7cc09439 +15259644 a53c0dba f6d5e504 760dd276 713ea9c3 c6b48a3d 39823fc7 ffc857d8 aa679f94 77736ac1 a8edd72f 8b5bad49 8fb13cc7 e5558ac4 25d19813 f38f7951 4ea852ed +2814052 f33b9f85 402a40d3 7792a04a 9b71bcef 1e97da02 58aa2c0b 1d19979a d56d332f 7a3390ad 6f7cab30 b8998c4a 11490dbf cec4d2c8 0e63a310 6e1c1c9d 475e25ce +4166140 676253fe c6e04c41 3d84bef9 dd8fbb76 8bc90619 ed2a848e 4c1d17c4 b1cd1480 48b91afd 3f5a9649 0c85cea3 2c7f6c85 791a6ba1 bfee4cdf 19e09f8a c6a573b8 +15678561 22bf5db7 3f439169 21849fa7 4c1e58c7 8289194f 7da50819 4540f553 d60de139 d8b74a06 9bceaa65 c4d3c4b2 2e7d75df 53821749 9e3d04c1 749d2a7a 773283fa +15228992 3696232b 3a434efd 75af76a8 65e40321 14455862 54fbbc6e 04130f3b d52972ec e2ffbc41 7a78af00 fcc4a05a 8792aea2 0898054f 68da0857 f3b3b015 897272f8 +6840839 1cf44905 b772820b 923bec80 80c4c19b 53173027 536f189f 73e8667b 28cf86db 818df051 8f6e9e89 086a5949 1a9a1809 7119a5b9 2d6865c7 d9610d5d b4093367 +1116275 4cd74998 95648af3 4a6612d6 7b9c6066 c33e16c9 a21ba6cb 5e9f9ee0 0e390764 2d842b2f ff52ee36 7caa7060 09f30700 7f3480b8 9a5e9616 e3cf9e38 3727d729 +8206710 0e6c2f19 1be23ffc b089ed32 a042de08 0c2cc481 9667b388 51cb75e6 322e0c04 33a2c645 0bb9b50b a5e65a5d 912503f3 326e0137 eaff38f2 f96f86c9 85dd1aa0 +8794176 aa8778b5 1e115d24 cf470405 ea3e73a6 3f2d19c3 72da60f2 abfc6254 17e80dfa f3762bed 1aa146e2 7147185a aaa46588 24527027 55f2ddbc 7a5f6a5a 2d459ba2 +7861486 db85967e d61810ec c48a9d03 4de96ca7 58a71a2a 1978996a 07383d21 bdd32add 48369892 3d9a374c 32171773 128db270 f328b97a 2d83322d 6ce02a06 da292d19 +7461881 0d22df01 7815a5a2 d497d3d1 fdcd1f24 1ae5a5d3 c516006d 52647c22 7496c6cd 7ca7b48f 9a44d246 03456ef0 b3090b31 d0bfb3ac c9dc854b 07a3752e b2d13009 +11523915 6fa511ef ef4fb84e 47f41f74 fe146562 a03972e5 2f59a88d 9f348e19 27fb67b8 ef4c7738 61518d2c cfb3a85c 6a67c584 66989c3b 3c62a93c dd7445f6 11361bfe +2186272 c2932c62 4ec3f5b2 aa23596b 42b90475 4c73ecea a357e76f eb0e1bda dcf31d71 1d62c20f da09787f de0b25f3 042adf65 631cef54 2bd10fb9 bb204fd5 f645d1e8 +346695 7f79ea88 eeaaa13a c0bb071d 583e58f9 8beb21ed e69de6e0 4cec4074 affbc5b1 d2abac37 7b8c028a 29fa0f54 de5ad303 4ec7e912 fe4b6823 e6fbadc8 97886a2e +8405098 db33ec7e 780ee9d2 384acbfa 51168346 5208ca9c dc08e5f8 c0afa5dd 6ecf367a a6cdaa8e ebc65144 f6a9fbfb 57f2eba6 718e08a0 4f3c8bad 8e9f6e99 b7742ef2 +2526652 31eff9bd 7aa14b62 e23cb395 15504c04 819b52d5 4a18a17a 21241512 1bae7971 214aeee9 d93b640c 5c6d5ca3 fe961835 e814130a f835c2d0 8b91999e c3e2566a +6495027 781d07a7 9e8f68a4 2e3fe930 f99e00a8 eea00c36 ecd8cd7c 7b4347fa 2e27db44 8e3fe155 2cb38eef c4ae17de 729f8064 12cc25a4 2ed7c9ee 19b7c7dd 3c2c8866 +11204020 c348ba2f 84560967 fc684d8f 147e2b38 d82dca25 af127a78 b96a19ca 16af7b13 bd3803dc ca9b5277 d95f5b71 8302cc65 ecacd8a0 66437c1e a5728942 0331e622 +12687401 f41c4d35 fdc659ce 1f60619c 4ff038b9 f750b105 0b1ed9a8 54dad3fb afbfba8a 4960f1cb 50033fa8 3aca865d 772baca0 33f1eeb7 498d36e1 2c8c868e 197cb879 +12751593 c61507fd dda26beb e9954411 1af145b2 6bbefeb5 e9677628 646709ac b830313f 924127a4 b8176d95 622c8f81 d57d3d2d e6abda7b 610b7746 25afbbb4 0ff9d71f +900214 c5251e52 d7ff9e22 de87a029 e9b94ccc 2d24245e ad923e8c f2435721 bb688ca7 327af86b 5e81580d 791175c6 5aacbca4 7b9d02d9 a3c179a9 fab3546c e11e5f00 +8256952 36432368 2437a0b3 c43e20b2 843b15d5 a0585aa5 16a3514a 6eec4f8b 2ac5eeaa 28fc931f 2d4e0c4c cb254406 5f880f0d a19530eb b97f19ae be4148c6 4ff6fb85 +12111134 7b53dd99 903dc160 0660e47a 611b5fec 6313ff1c 8866775e 7b5e92b1 3a4a1e2b ca824aca 40fad705 b01381a6 66bd7fba 3fa99942 7e9914d0 a87cea08 0a65669b +5115617 80b60e9f 71c7a619 f0feb0b1 5a2c70e0 3bc14ec6 21786bfd c3d323ed 495e0ef8 df88ce1b c0a492b9 fa83e0bc bb91f2e9 9fc34bf0 90b63d2c 1d238563 b86646c1 +1910849 af12a8df e7637334 de6a5ae0 71ae2753 2b45d009 93f8ebf0 56ce7a88 3395cc8d 262d9c01 6c897f6b f298ba8f d20c1427 d01e9059 d94bb037 d1d46eea 146a92fd +9041805 062e6b18 3f43d81f 81e8fe10 91b30d5e dea945c2 c4c90156 c8aeefb7 67cd4e83 6fd6094b c81d1bf4 3b710a20 849a3565 88f99103 56096c92 8c5d1ac3 4f84743f +14386226 ff39cee4 e45e335c 8a91fd58 66c660e9 ae5fc5f0 75089d3e f511dc70 520070ce e9d23ad7 cd52dd42 00fdde14 f6e0557b 6d800cb1 c8433a8e 86f09c56 16bced6f +1897854 f933b550 08a391c8 56db2e25 8ee31b04 8a7ebeca 7ad8352e 38c13bfc f0349c9c a67e1b83 c5b9c0f0 7fb43456 6cee6ed0 fcf7a25f 84141bbd 3e024d0e cd26e3d2 diff --git a/proto-newpow/state-dataset/results/gpu/run_gpu.log b/proto-newpow/state-dataset/results/gpu/run_gpu.log new file mode 100644 index 000000000..657b1e325 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/run_gpu.log @@ -0,0 +1,85 @@ +== Tue Oct 6 19:43:12 UTC 2026 on a4cac49bb840 +NVIDIA GeForce RTX 4090, 595.91.07, 3135 MHz, 24564 MiB +Build cuda_12.8.r12.8/compiler.35583870_0 +== build +== control +state-dataset bench mode control pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.86 ms first, 1.81 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 380.5 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +dataset build (igneum_build, the pack's): 30.62 ms first, 30.55 ms second -> 549.1 M items/s +device memory after the build: 1675 MiB used (context 395 + cache 256 + dataset 1024 MiB) +dataset[0..3] = fdad4319 1a7b68e1 de6db608 13d73892 head 16 vs Mac PASS, word [MASK] vs Mac PASS, 64 Mac samples PASS +dataset self-test: PASS (64 random words vs host mh_word: PASS) +item bit-exactness (in-process, host mh_item on the host cache): 1024 of 1024 items equal +vector warp base 0: PASS (0 of 32 lanes differ) +vector warp base 4096: PASS (0 of 32 lanes differ) +vector warp base 1000000: PASS (0 of 32 lanes differ) +warm-up batch: 2^24 hashes in 266.02 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): 7c28cfb06c5c65a9 = 7c28cfb06c5c65a9 (the pack's) +vector warp base 0 in batch: PASS +vector warp base 4096 in batch: PASS +vector warp base 1000000 in batch: PASS +dump: 4 warps (bases 0, 32, ...) written to dump_control.txt +timed: 10 batches x 2^24 hashes, GPU 2659.56 ms -> 63.083 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.078 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 207.6 W, SM 2745 MHz, mem 10251 MHz + -> 0.304 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=control gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.81 host_cache_ms=380.5 leaves_ms=0.00 build_ms=30.55 mem_build_mib=1675 items_equal=1024/1024 fingerprint=7c28cfb06c5c65a9 mhs=63.083 mhs_window=63.078 watts=207.6 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=PASS overall=PASS +== sd1 +state-dataset bench mode sd1 pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +sd1 leaf stand-in: S[i] = K[i] ^ 0x5a5a5a5a -> S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102; leaf(t) = ChaCha12 block of (sigma, S, t, 0, 49676e65, 53746174) +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.87 ms first, 1.85 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 383.9 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +leaf array (GPU, 16777216 x 64 B = 1024 MiB): 5.56 ms first, 5.49 ms second -> 195.4 GB/s written +leaf check: PASS (64 leaves incl. 0 and 16777215 vs host mh_leaf) +dataset build (igneum_build_sd, leaf XOR before the first mixer): 32.05 ms first, 31.98 ms second -> 524.7 M items/s +device memory after the build: 2699 MiB used (context 395 + cache 256 + leaves 1024 + dataset 1024 MiB) +dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf (sd1: new values, no Mac expectation) +dataset self-test: PASS (64 random words vs host mh_word_sd: PASS) +item bit-exactness (in-process, host mh_item_sd with host mh_leaf on the host cache): 1024 of 1024 items equal +sd1 warp base 0 lane 0: b600edbed969becc (new value; checked by verify_sd.c through the dump) +sd1 warp base 4096 lane 0: a533e89c78bb6b74 (new value; checked by verify_sd.c through the dump) +sd1 warp base 1000000 lane 0: beb4cb0c6bab8163 (new value; checked by verify_sd.c through the dump) +warm-up batch: 2^24 hashes in 267.38 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): d5b0c16390cad0e8 (sd1, new value) +dump: 4 warps (bases 0, 32, ...) written to dump_sd1.txt +timed: 10 batches x 2^24 hashes, GPU 2659.35 ms -> 63.088 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.083 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 207.9 W, SM 2745 MHz, mem 10251 MHz + -> 0.303 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=sd1 gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.85 host_cache_ms=383.9 leaves_ms=5.49 build_ms=31.98 mem_build_mib=2699 items_equal=1024/1024 fingerprint=d5b0c16390cad0e8 mhs=63.088 mhs_window=63.083 watts=207.9 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=n/a overall=PASS +== verify (plain C, CPU core 2) +verify_sd mode control +host cache fill: 587.4 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +interpreter vs Mac vector base 0: 32 of 32 lanes equal PASS +item bit-exactness (plain C, mh_item on the host cache): 1024 of 1024 items equal PASS +warp base 0: 32 of 32 lanes equal (lane 0 gpu 19b56348bc85304d interp 19b56348bc85304d) +warp base 32: 32 of 32 lanes equal (lane 0 gpu bbea9a410fe7d5b7 interp bbea9a410fe7d5b7) +warp base 64: 32 of 32 lanes equal (lane 0 gpu 68b73c212b47e6f2 interp 68b73c212b47e6f2) +warp base 96: 32 of 32 lanes equal (lane 0 gpu 3a0fd3ada6b5a797 interp 3a0fd3ada6b5a797) +GPU hash outputs vs interpreter: 128 of 128 lanes equal PASS (37 ms interpreting, 4096 derivations per warp) +per-unit rows on this CPU (4,096 per unit, 100 units, one thread, ms per unit): + (ii) 4,096 leaf derivations (ChaCha12 block each, no array): 0.369 ms + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 10.14 ms (min 9.98, max 10.31) + 4,096 x (leaf + mh_item_sd), naive: 10.56 ms + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +RESULT verify mode=control host_cache_ms=587.4 items_equal=1024 lanes_equal=128/128 +verify_sd mode sd1 +host cache fill: 572.9 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +item bit-exactness (plain C, mh_item_sd with mh_leaf on the host cache): 1024 of 1024 items equal PASS +warp base 0: 32 of 32 lanes equal (lane 0 gpu b600edbed969becc interp b600edbed969becc) +warp base 32: 32 of 32 lanes equal (lane 0 gpu e451566071a2a0ba interp e451566071a2a0ba) +warp base 64: 32 of 32 lanes equal (lane 0 gpu 34548f5056f27d78 interp 34548f5056f27d78) +warp base 96: 32 of 32 lanes equal (lane 0 gpu c13d6ea3e05c5e46 interp c13d6ea3e05c5e46) +GPU hash outputs vs interpreter: 128 of 128 lanes equal PASS (42 ms interpreting, 4096 derivations per warp) +per-unit rows on this CPU (4,096 per unit, 100 units, one thread, ms per unit): + (ii) 4,096 leaf derivations (ChaCha12 block each, no array): 0.374 ms + (iii) 4,096 x mh_item on the host cache, naive (no interleaving): 10.21 ms (min 10.09, max 12.24) + 4,096 x (leaf + mh_item_sd), naive: 10.58 ms + reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound. +RESULT verify mode=sd1 host_cache_ms=572.9 items_equal=1024 lanes_equal=128/128 +== done Tue Oct 6 19:44:17 UTC 2026 diff --git a/proto-newpow/state-dataset/results/gpu/sd1-chunk256.log b/proto-newpow/state-dataset/results/gpu/sd1-chunk256.log new file mode 100644 index 000000000..cf7f8aa32 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/sd1-chunk256.log @@ -0,0 +1,23 @@ +state-dataset bench mode sd1 pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +sd1 leaf stand-in: S[i] = K[i] ^ 0x5a5a5a5a -> S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102; leaf(t) = ChaCha12 block of (sigma, S, t, 0, 49676e65, 53746174) +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.73 ms first, 1.70 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 380.7 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +leaf array (GPU, 16777216 x 64 B = 1024 MiB): 5.16 ms first, 5.10 ms second -> 210.7 GB/s written +leaf check: PASS (64 leaves incl. 0 and 16777215 vs host mh_leaf) +dataset build (igneum_build_sd, leaf XOR before the first mixer): 32.00 ms first, 31.92 ms second -> 525.6 M items/s +device memory after the build: 2699 MiB used (context 395 + cache 256 + leaves 1024 + dataset 1024 MiB) +dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf (sd1: new values, no Mac expectation) +dataset self-test: PASS (64 random words vs host mh_word_sd: PASS) +item bit-exactness (in-process, host mh_item_sd with host mh_leaf on the host cache): 1024 of 1024 items equal +chunked build (leaves from pinned host memory in 256 MiB chunks, 4 chunks, one stream): 75.47 ms total (copies + builds); whole-array H2D alone 61.92 ms = 17.3 GB/s, D2H 54.61 ms +device memory during the chunked build: 1933 MiB used (context + cache 256 + dataset 1024 + chunk 256 MiB); items after the chunked rebuild: 1024 of 1024 equal +sd1 warp base 0 lane 0: b600edbed969becc (new value; checked by verify_sd.c through the dump) +sd1 warp base 4096 lane 0: a533e89c78bb6b74 (new value; checked by verify_sd.c through the dump) +sd1 warp base 1000000 lane 0: beb4cb0c6bab8163 (new value; checked by verify_sd.c through the dump) +warm-up batch: 2^24 hashes in 265.97 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): d5b0c16390cad0e8 (sd1, new value) +timed: 10 batches x 2^24 hashes, GPU 2659.40 ms -> 63.086 MH/s (32.30 GB/s useful, loads x 4 B) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=sd1 gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.70 host_cache_ms=380.7 leaves_ms=5.10 build_ms=31.92 mem_build_mib=2699 chunk_mib=256 chunked_ms=75.47 mem_chunked_mib=1933 chunked_equal=1024 items_equal=1024/1024 fingerprint=d5b0c16390cad0e8 mhs=63.086 mhs_window=0.000 watts=0.0 sm_mhz=0 mem_mhz=0 cache=PASS dataset=PASS vectors=n/a overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/sd1-chunk64.log b/proto-newpow/state-dataset/results/gpu/sd1-chunk64.log new file mode 100644 index 000000000..69cdd7045 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/sd1-chunk64.log @@ -0,0 +1,23 @@ +state-dataset bench mode sd1 pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +sd1 leaf stand-in: S[i] = K[i] ^ 0x5a5a5a5a -> S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102; leaf(t) = ChaCha12 block of (sigma, S, t, 0, 49676e65, 53746174) +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.85 ms first, 1.82 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 382.9 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +leaf array (GPU, 16777216 x 64 B = 1024 MiB): 5.53 ms first, 5.46 ms second -> 196.5 GB/s written +leaf check: PASS (64 leaves incl. 0 and 16777215 vs host mh_leaf) +dataset build (igneum_build_sd, leaf XOR before the first mixer): 32.05 ms first, 31.98 ms second -> 524.7 M items/s +device memory after the build: 2699 MiB used (context 395 + cache 256 + leaves 1024 + dataset 1024 MiB) +dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf (sd1: new values, no Mac expectation) +dataset self-test: PASS (64 random words vs host mh_word_sd: PASS) +item bit-exactness (in-process, host mh_item_sd with host mh_leaf on the host cache): 1024 of 1024 items equal +chunked build (leaves from pinned host memory in 64 MiB chunks, 16 chunks, one stream): 75.80 ms total (copies + builds); whole-array H2D alone 62.41 ms = 17.2 GB/s, D2H 54.85 ms +device memory during the chunked build: 1741 MiB used (context + cache 256 + dataset 1024 + chunk 64 MiB); items after the chunked rebuild: 1024 of 1024 equal +sd1 warp base 0 lane 0: b600edbed969becc (new value; checked by verify_sd.c through the dump) +sd1 warp base 4096 lane 0: a533e89c78bb6b74 (new value; checked by verify_sd.c through the dump) +sd1 warp base 1000000 lane 0: beb4cb0c6bab8163 (new value; checked by verify_sd.c through the dump) +warm-up batch: 2^24 hashes in 265.98 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): d5b0c16390cad0e8 (sd1, new value) +timed: 10 batches x 2^24 hashes, GPU 2659.43 ms -> 63.086 MH/s (32.30 GB/s useful, loads x 4 B) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=sd1 gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.82 host_cache_ms=382.9 leaves_ms=5.46 build_ms=31.98 mem_build_mib=2699 chunk_mib=64 chunked_ms=75.80 mem_chunked_mib=1741 chunked_equal=1024 items_equal=1024/1024 fingerprint=d5b0c16390cad0e8 mhs=63.086 mhs_window=0.000 watts=0.0 sm_mhz=0 mem_mhz=0 cache=PASS dataset=PASS vectors=n/a overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/sd1.log b/proto-newpow/state-dataset/results/gpu/sd1.log new file mode 100644 index 000000000..bf4bea092 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/sd1.log @@ -0,0 +1,24 @@ +state-dataset bench mode sd1 pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +sd1 leaf stand-in: S[i] = K[i] ^ 0x5a5a5a5a -> S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102; leaf(t) = ChaCha12 block of (sigma, S, t, 0, 49676e65, 53746174) +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.87 ms first, 1.85 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 383.9 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +leaf array (GPU, 16777216 x 64 B = 1024 MiB): 5.56 ms first, 5.49 ms second -> 195.4 GB/s written +leaf check: PASS (64 leaves incl. 0 and 16777215 vs host mh_leaf) +dataset build (igneum_build_sd, leaf XOR before the first mixer): 32.05 ms first, 31.98 ms second -> 524.7 M items/s +device memory after the build: 2699 MiB used (context 395 + cache 256 + leaves 1024 + dataset 1024 MiB) +dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf (sd1: new values, no Mac expectation) +dataset self-test: PASS (64 random words vs host mh_word_sd: PASS) +item bit-exactness (in-process, host mh_item_sd with host mh_leaf on the host cache): 1024 of 1024 items equal +sd1 warp base 0 lane 0: b600edbed969becc (new value; checked by verify_sd.c through the dump) +sd1 warp base 4096 lane 0: a533e89c78bb6b74 (new value; checked by verify_sd.c through the dump) +sd1 warp base 1000000 lane 0: beb4cb0c6bab8163 (new value; checked by verify_sd.c through the dump) +warm-up batch: 2^24 hashes in 267.38 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): d5b0c16390cad0e8 (sd1, new value) +dump: 4 warps (bases 0, 32, ...) written to dump_sd1.txt +timed: 10 batches x 2^24 hashes, GPU 2659.35 ms -> 63.088 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.083 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 207.9 W, SM 2745 MHz, mem 10251 MHz + -> 0.303 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=sd1 gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.85 host_cache_ms=383.9 leaves_ms=5.49 build_ms=31.98 mem_build_mib=2699 items_equal=1024/1024 fingerprint=d5b0c16390cad0e8 mhs=63.088 mhs_window=63.083 watts=207.9 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=n/a overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/sd12.log b/proto-newpow/state-dataset/results/gpu/sd12.log new file mode 100644 index 000000000..b32729bf7 --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/sd12.log @@ -0,0 +1,23 @@ +state-dataset bench mode sd1 pack "igneum-genesis" (test harness: no pool, no network, no wallet) +GPU: NVIDIA GeForce RTX 4090 (128 SMs, cc 8.9, 24083 MiB), CUDA driver 13.2 runtime 12.8 +hash kernel: 29 registers/thread, 24 resident blocks/SM at 1 warp/block +sd1 leaf stand-in: S[i] = K[i] ^ 0x5a5a5a5a -> S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102; leaf(t) = ChaCha12 block of (sigma, S, t, 0, 49676e65, 53746174) +device memory at start: 395 MiB used of 24083 MiB (context) +cache fill (GPU): 1.87 ms first, 1.85 ms second (65536 segments x 64 ChaCha12 blocks, 256 MiB) +cache fill (host, one thread): 382.6 ms; cache check: PASS (GPU == host PASS, host FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e) +leaf array (GPU, 16777216 x 64 B = 1024 MiB): 5.55 ms first, 5.49 ms second -> 195.4 GB/s written +leaf check: PASS (64 leaves incl. 0 and 16777215 vs host mh_leaf) +dataset build (igneum_build_sd, leaf XOR before the first mixer): 32.07 ms first, 31.98 ms second -> 524.6 M items/s +device memory after the build: 2699 MiB used (context 395 + cache 256 + leaves 1024 + dataset 1024 MiB) +dataset[0..3] = 29d7b07a edc07cd7 fd248836 d1e4d9cf (sd1: new values, no Mac expectation) +dataset self-test: PASS (64 random words vs host mh_word_sd: PASS) +item bit-exactness (in-process, host mh_item_sd with host mh_leaf on the host cache): 1024 of 1024 items equal +sd1 warp base 0 lane 0: b600edbed969becc (new value; checked by verify_sd.c through the dump) +sd1 warp base 4096 lane 0: a533e89c78bb6b74 (new value; checked by verify_sd.c through the dump) +sd1 warp base 1000000 lane 0: beb4cb0c6bab8163 (new value; checked by verify_sd.c through the dump) +warm-up batch: 2^24 hashes in 267.38 ms wall; fingerprint (FNV-1a 64 over the outputs at base 0): d5b0c16390cad0e8 (sd1, new value) +timed: 10 batches x 2^24 hashes, GPU 2659.36 ms -> 63.087 MH/s (32.30 GB/s useful, loads x 4 B) +power window: 76 batches in 20.2 s -> 63.083 MH/s (events, incl. sync gaps); nvidia-smi 22 samples, 10 after 10 s: mean 206.5 W, SM 2745 MHz, mem 10251 MHz + -> 0.305 MH/s per W (window rate / mean W) +device memory while hashing: 1803 MiB used (leaves freed) +RESULT mode=sd1 gpu=NVIDIA GeForce RTX 4090 cache_fill_ms=1.85 host_cache_ms=382.6 leaves_ms=5.49 build_ms=31.98 mem_build_mib=2699 items_equal=1024/1024 fingerprint=d5b0c16390cad0e8 mhs=63.087 mhs_window=63.083 watts=206.5 sm_mhz=2745 mem_mhz=10251 cache=PASS dataset=PASS vectors=n/a overall=PASS diff --git a/proto-newpow/state-dataset/results/gpu/verify_control.log b/proto-newpow/state-dataset/results/gpu/verify_control.log new file mode 100644 index 000000000..93da06a2b --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/verify_control.log @@ -0,0 +1,13 @@ +verify_sd mode control +host cache fill: 574.3 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +interpreter vs Mac vector base 0: 32 of 32 lanes equal PASS +item bit-exactness (plain C, mh_item on the host cache): 1024 of 1024 items equal PASS +warp base 0: 32 of 32 lanes equal (lane 0 gpu 19b56348bc85304d interp 19b56348bc85304d) +warp base 32: 32 of 32 lanes equal (lane 0 gpu bbea9a410fe7d5b7 interp bbea9a410fe7d5b7) +warp base 64: 32 of 32 lanes equal (lane 0 gpu 68b73c212b47e6f2 interp 68b73c212b47e6f2) +warp base 96: 32 of 32 lanes equal (lane 0 gpu 3a0fd3ada6b5a797 interp 3a0fd3ada6b5a797) +GPU hash outputs vs interpreter: 128 of 128 lanes equal PASS (37 ms interpreting, 4096 derivations per warp) +lane 0 of warp base 0: 128 loads touch 128 distinct words in 128 distinct items (of 2^24 items) + first 8 load words: 8528400 43034175 255822847 136709537 36562395 83203117 165232476 263214792 + Merkle openings for a 2 GiB state (2^25 leaves of 64 B, depth 25, 32-byte hashes): 128 openings x 25 x 32 = 102400 bytes of siblings + 128 x 64 = 8192 bytes of leaves = 110592 bytes (108.0 KiB) per lane, uncompressed; 128 distinct items need only 128 openings = 110592 bytes +RESULT verify mode=control host_cache_ms=574.3 items_equal=1024 lanes_equal=128/128 diff --git a/proto-newpow/state-dataset/results/gpu/verify_sd1.log b/proto-newpow/state-dataset/results/gpu/verify_sd1.log new file mode 100644 index 000000000..ee528e71c --- /dev/null +++ b/proto-newpow/state-dataset/results/gpu/verify_sd1.log @@ -0,0 +1,12 @@ +verify_sd mode sd1 +host cache fill: 565.8 ms one thread; FNV-1a 64 48c4f5bf24166b2e vs Mac 48c4f5bf24166b2e PASS +item bit-exactness (plain C, mh_item_sd with mh_leaf on the host cache): 1024 of 1024 items equal PASS +warp base 0: 32 of 32 lanes equal (lane 0 gpu b600edbed969becc interp b600edbed969becc) +warp base 32: 32 of 32 lanes equal (lane 0 gpu e451566071a2a0ba interp e451566071a2a0ba) +warp base 64: 32 of 32 lanes equal (lane 0 gpu 34548f5056f27d78 interp 34548f5056f27d78) +warp base 96: 32 of 32 lanes equal (lane 0 gpu c13d6ea3e05c5e46 interp c13d6ea3e05c5e46) +GPU hash outputs vs interpreter: 128 of 128 lanes equal PASS (42 ms interpreting, 4096 derivations per warp) +lane 0 of warp base 0: 128 loads touch 128 distinct words in 128 distinct items (of 2^24 items) + first 8 load words: 8528400 85793927 255822847 180392080 172515305 211564358 34853938 259149705 + Merkle openings for a 2 GiB state (2^25 leaves of 64 B, depth 25, 32-byte hashes): 128 openings x 25 x 32 = 102400 bytes of siblings + 128 x 64 = 8192 bytes of leaves = 110592 bytes (108.0 KiB) per lane, uncompressed; 128 distinct items need only 128 openings = 110592 bytes +RESULT verify mode=sd1 host_cache_ms=565.8 items_equal=1024 lanes_equal=128/128 diff --git a/proto-newpow/state-dataset/run_cpu.sh b/proto-newpow/state-dataset/run_cpu.sh new file mode 100755 index 000000000..7df4b3237 --- /dev/null +++ b/proto-newpow/state-dataset/run_cpu.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# state-dataset prototype: CPU rows on igneum-build-1 (EPYC 9454P). Runs inside /srv/builds/horizon-newpow/state-dataset. +# From the Mac: +# rsync -az -e "ssh -i ~/.ssh/igneum_ed25519" proto-newpow/state-dataset/ build@188.40.146.49:/srv/builds/horizon-newpow/state-dataset/ +# ssh -i ~/.ssh/igneum_ed25519 build@188.40.146.49 'cd /srv/builds/horizon-newpow/state-dataset && touch * && bash run_cpu.sh' +set -euo pipefail +cd "$(dirname "$0")" +touch *.c *.h +echo "== $(date -u) on $(hostname), load $(cut -d' ' -f1-3 /proc/loadavg)" +lscpu | grep "Model name"; gcc --version | head -1 +echo "== build" +gcc -O2 -std=c11 -fopenmp -o cpu_rows cpu_rows.c +gcc -O2 -std=c11 -o verify_sd verify_sd.c +echo "== B.1 and one-core B.2 rows, core 4, nice 19" +taskset -c 4 nice -n 19 ./cpu_rows --rows | tee rows.log +echo "== B.2 leaf array on 32 threads (cores 4-35), nice 19" +taskset -c 4-35 nice -n 19 ./cpu_rows --leaves 32 | tee leaves32.log +echo "== second reading of the B.1 rows (the box is shared; the load average is printed with each reading)" +taskset -c 4 nice -n 19 ./cpu_rows --rows | tee rows2.log +taskset -c 4-35 nice -n 19 ./cpu_rows --leaves 32 | tee leaves32-2.log +echo "== verify_sd per-unit rows on this CPU (core 4), for comparison" +taskset -c 4 nice -n 19 ./verify_sd --mode sd1 | tee verify_rows.log +echo "== done $(date -u), load $(cut -d' ' -f1-3 /proc/loadavg)" diff --git a/proto-newpow/state-dataset/run_gpu.sh b/proto-newpow/state-dataset/run_gpu.sh new file mode 100755 index 000000000..a3e04681b --- /dev/null +++ b/proto-newpow/state-dataset/run_gpu.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# state-dataset prototype: GPU box 2 (RTX 4090). Runs inside /root/horizon-newpow/state-dataset after the rsync. +# From the Mac: +# rsync -az -e "ssh -i ~/.ssh/igneum-fleet -p " proto-newpow/state-dataset/ root@:/root/horizon-newpow/state-dataset/ +# ssh -i ~/.ssh/igneum-fleet -p root@ 'cd /root/horizon-newpow/state-dataset && touch * && bash run_gpu.sh' +set -euo pipefail +export PATH=/usr/local/cuda/bin:$PATH +cd "$(dirname "$0")" +touch *.cu *.h *.c +echo "== $(date -u) on $(hostname)" +nvidia-smi --query-gpu=name,driver_version,clocks.max.sm,memory.total --format=csv,noheader +nvcc --version | tail -1 +echo "== build" +nvcc -O3 -std=c++17 -arch=sm_89 -Xcompiler -pthread -o bench bench.cu kernel_sd.cu +gcc -O2 -std=c11 -o verify_sd verify_sd.c +echo "== control" +./bench --mode control --batches 10 --items-out items_control.txt --dump dump_control.txt 4 --power-seconds 20 | tee control.log +echo "== sd1" +./bench --mode sd1 --batches 10 --items-out items_sd1.txt --dump dump_sd1.txt 4 --power-seconds 20 | tee sd1.log +echo "== sd1 chunked (leaves streamed from pinned host memory in 64 and 256 MiB chunks)" +./bench --mode sd1 --batches 10 --power-seconds 0 --chunk-mib 64 | tee sd1-chunk64.log +./bench --mode sd1 --batches 10 --power-seconds 0 --chunk-mib 256 | tee sd1-chunk256.log +echo "== second pass of the timed rows (repeatability)" +./bench --mode control --batches 10 --power-seconds 20 | tee control2.log +./bench --mode sd1 --batches 10 --power-seconds 20 | tee sd12.log +echo "== verify (plain C, CPU core 2)" +taskset -c 2 ./verify_sd --mode control --items items_control.txt --dump dump_control.txt | tee verify_control.log +taskset -c 2 ./verify_sd --mode sd1 --items items_sd1.txt --dump dump_sd1.txt | tee verify_sd1.log +echo "== logs to collect: run_gpu.log control*.log sd1*.log verify_*.log dump_*.txt items_*.txt" +echo "== done $(date -u)" diff --git a/proto-newpow/state-dataset/sd.h b/proto-newpow/state-dataset/sd.h new file mode 100644 index 000000000..6c21a7d7e --- /dev/null +++ b/proto-newpow/state-dataset/sd.h @@ -0,0 +1,73 @@ +// state-dataset prototype (class "sd1", Horizon lane 8): the dataset commits to chain state. +// Shared by kernel_sd.cu (device), bench.cu (host reference), verify_sd.c and cpu_rows.c (plain C). +// +// Scheme: item t is derived exactly as mh_item in memhard.h, except that a 64-byte STATE LEAF for item t is +// XORed into the 16 initial state words before the first mixer: +// s[0..7] = K, s[8..15] = t * MUL + RC (as today) +// s[i] ^= leaf(t)[i] for i in 0..15 (new) +// 8 rounds of (8 mixers + one dependent cache line), 8 final mixers (as today) +// The hash kernel is unchanged. +// +// Leaf stand-in (SYNTHETIC, for the prototype only). In the real design leaf(t) is the t-th 64-byte leaf of the +// canonical serialisation of the chain's execution state at the certified checkpoint 20 minutes before the day +// boundary, zero padded. Here: +// leaf(t) = mh_chacha_block(x) with +// x = (0x61707865, 0x3320646e, 0x79622d32, 0x6b206574, S[0..7], t, 0, 0x49676e65, 0x53746174) +// S[i] = K[i] ^ 0x5a5a5a5a (stand-in state root; K = the pack's day key words IGNEUM_KEY_INIT) +// For the pack's day key this gives S = 6a3d3bc5 667ccb2c defa6159 a29c68ce a5cd2601 bc57b564 39395b1b e2a19102. +#pragma once +#include "memhard.h" + +#define SD_STATE_ROOT_XOR 0x5a5a5a5au +#define SD_TAG0 0x49676e65u /* "Igne" */ +#define SD_TAG1 0x53746174u /* "Stat" */ + +IGNEUM_HD void mh_leaf(uint32_t t, uint32_t* leaf) { + uint32_t x[16]; + x[0] = 0x61707865u; x[1] = 0x3320646eu; x[2] = 0x79622d32u; x[3] = 0x6b206574u; + x[4] = 0x3067619fu ^ SD_STATE_ROOT_XOR; + x[5] = 0x3c269176u ^ SD_STATE_ROOT_XOR; + x[6] = 0x84a03b03u ^ SD_STATE_ROOT_XOR; + x[7] = 0xf8c63294u ^ SD_STATE_ROOT_XOR; + x[8] = 0xff977c5bu ^ SD_STATE_ROOT_XOR; + x[9] = 0xe60def3eu ^ SD_STATE_ROOT_XOR; + x[10] = 0x63630141u ^ SD_STATE_ROOT_XOR; + x[11] = 0xb8fbcb58u ^ SD_STATE_ROOT_XOR; + x[12] = t; x[13] = 0u; x[14] = SD_TAG0; x[15] = SD_TAG1; + mh_chacha_block(x, leaf); +} + +// Item t under sd1, given its leaf (16 words). Same text as mh_item plus the one XOR line. +IGNEUM_HD void mh_item_sd(const uint32_t* cache, const uint32_t* leaf, uint32_t t, uint32_t* s) { + s[0] = 0x3067619fu; + s[1] = 0x3c269176u; + s[2] = 0x84a03b03u; + s[3] = 0xf8c63294u; + s[4] = 0xff977c5bu; + s[5] = 0xe60def3eu; + s[6] = 0x63630141u; + s[7] = 0xb8fbcb58u; + s[8] = t * 0x42146205u + 0xbab68293u; + s[9] = t * 0x52cbe0fbu + 0xcc162340u; + s[10] = t * 0x7ecf4a03u + 0x6ce151ccu; + s[11] = t * 0x6728907fu + 0xe62b8997u; + s[12] = t * 0xd81d9751u + 0xc9c80297u; + s[13] = t * 0x132952c3u + 0xf74a1654u; + s[14] = t * 0xf60de277u + 0x3d704af5u; + s[15] = t * 0x05358035u + 0x3cf522b7u; + for (uint32_t i = 0u; i < 16u; ++i) s[i] ^= leaf[i]; + for (uint32_t r = 0u; r < 8u; ++r) { + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (r * 8u + j + 1u)); + const uint32_t* line = cache + ((s[0] & MH_CACHE_LINE_MASK) * 16u); + for (uint32_t i = 0u; i < 16u; ++i) s[i] ^= line[i]; + } + for (uint32_t j = 0u; j < 8u; ++j) mh_mixer(s, 0x9E3779B9u * (64u + j + 1u)); +} + +// dataset[w] under sd1 without the dataset or the leaf array: derive the leaf and the item, take word w & 15. +IGNEUM_HD uint32_t mh_word_sd(const uint32_t* cache, uint32_t w) { + uint32_t leaf[16]; uint32_t s[16]; + mh_leaf(w >> 4u, leaf); + mh_item_sd(cache, leaf, w >> 4u, s); + return s[w & 15u]; +} diff --git a/proto-newpow/state-dataset/vectors.h b/proto-newpow/state-dataset/vectors.h new file mode 100644 index 000000000..caadb5e25 --- /dev/null +++ b/proto-newpow/state-dataset/vectors.h @@ -0,0 +1,57 @@ +// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand. +// Expected outputs: igneum-pow (Rust) CPU interpreter, generator v3, memory-hard dataset +#pragma once +#ifdef __cplusplus +#include +#else +#include +#endif + +#define IGNEUM_VEC_WARPS 3 +static const uint32_t IGNEUM_VEC_BASE[IGNEUM_VEC_WARPS] = { 0u, 4096u, 1000000u }; +static const uint64_t IGNEUM_VEC_OUT[IGNEUM_VEC_WARPS][32] = { + { // base nonce 0 + 0x19b56348bc85304dull, 0xb08a9cfb44aa720full, 0xe1f8f627f780eff7ull, 0x2ff3e86ff1696161ull, 0xb65e0578c257e8acull, 0xf37b5705c2bebaaeull, 0xb19fef670982389eull, 0x2374331b28827a11ull, + 0xf492cdd05dda7f88ull, 0x37700f1385e19885ull, 0xa27524f3010b3e87ull, 0x6c8a24de8b938c43ull, 0x3dc017c8820cfd16ull, 0x5c80d37146657b68ull, 0x214082cac03f734aull, 0x1d67c665145d72f3ull, + 0x9fb0ae736eb87ff5ull, 0xcd7d416ae3a6be61ull, 0x0069cda85c6de58full, 0x0b7d82e717224baaull, 0x600960f6d7be30f0ull, 0xeb29032663b0c4d2ull, 0xf29583a5766408f1ull, 0x6c9532a99ad7314dull, + 0x9a949fd0959cc80full, 0xa20258520e7f6c25ull, 0xf2ab11f9bb032e38ull, 0xcc967bcd0c8d07c1ull, 0x37745267bb3231f2ull, 0x35a046048c2b69b3ull, 0xaa51834cd3f364f3ull, 0x359192708e4f754aull + }, + { // base nonce 4096 + 0x62fb132a9943127aull, 0x0b703e577e7f4ecaull, 0xf9f24f5522ce7593ull, 0x3cf5c516abc4332aull, 0xd25523f5f6d7a127ull, 0xd2081a002f983682ull, 0xbf46c54e9b3c4254ull, 0xca362e291e5e5f4dull, + 0x6039712f10f457a3ull, 0x8a34b7cabf97c23bull, 0xa473c6a2e0bf59bcull, 0x6cf3926513a4b069ull, 0x297ec2998376a40dull, 0x8efd7f601a8f28dbull, 0x8e72532dfdc1e544ull, 0x917c2b2ebe2a7e00ull, + 0x923fbb2d2f635c25ull, 0xce864ea5c0dedad9ull, 0x4b8ec7e874e446efull, 0x1b69b69465449196ull, 0x5ef3a8a6edb369cfull, 0x06c263ef9ce63fc4ull, 0x9c2048fd9d9e2639ull, 0x457fdd96ca4a138eull, + 0xd1904018b8d7b6e3ull, 0x8682312fb2e96ab8ull, 0xdc3257e0d0f979a5ull, 0xa51b0a8519d87db5ull, 0x334f08ec056e618bull, 0x3464ce71dc65119dull, 0x6a4d6df066332e04ull, 0x7d7866cb9cfca8ffull + }, + { // base nonce 1000000 + 0x86b6cb0e13d89b03ull, 0x96299a3f19d7ef15ull, 0x67d2c55100d2f876ull, 0x0a4dfe97d671b728ull, 0x41e4489014d42595ull, 0xf11cb1958c0c0e82ull, 0xf8b70b0c0a03175full, 0x632299df87d5063eull, + 0xe198417776130492ull, 0x8ffc5449290d7be2ull, 0x5f2e264eb1311f1bull, 0x988376463ac88586ull, 0x83969eadda489c26ull, 0xbed0a2c3f255d306ull, 0x1a949d271961a819ull, 0x5bce06eb6984725cull, + 0x94d5d6a1b0ffd4e9ull, 0xf3c78bae6c2182b4ull, 0xb97e9fe1bbfcdd55ull, 0x70262d1d4c0eccb2ull, 0x1fc93b427dba28d9ull, 0x02b2e3c4317f2a2dull, 0x54d3d42a588edcb9ull, 0x79998677846e7cceull, + 0x486522a5425f821aull, 0x95fa88e933360e52ull, 0xc8bae2da2b883f6cull, 0xbe3eb610ad33614full, 0x20efb3c4de82907full, 0xd6b650cfedfb26b7ull, 0x8c24447a646dba26ull, 0x9c004678515e44ecull + } +}; + +// Dataset self-test: dataset[0..15] and dataset[IGNEUM_MASK] (268435455). +static const uint32_t IGNEUM_DS_HEAD[16] = { + 0xfdad4319u, 0x1a7b68e1u, 0xde6db608u, 0x13d73892u, 0xd17f447au, 0xb2221ccfu, 0x9db004bdu, 0x57d7d367u, + 0xdbc4cf34u, 0x697c009au, 0xc43af1d4u, 0x97f12b2eu, 0x74c37cd0u, 0xc651ea15u, 0x665a6d29u, 0x22330a2du +}; +static const uint32_t IGNEUM_DS_LAST_INDEX = 268435455u; +static const uint32_t IGNEUM_DS_LAST = 0xa83e7aa6u; +// 64 sampled dataset words (index, value) computed on the Mac. +#define IGNEUM_DS_SAMPLES 64 +static const uint32_t IGNEUM_DS_SAMPLE_INDEX[IGNEUM_DS_SAMPLES] = { + 59471966u, 217795994u, 208353206u, 42483309u, 172547758u, 148076330u, 183853158u, 214389424u, 267488061u, 169781097u, 184093494u, 153880993u, 84977930u, 46426879u, 3093825u, 225364072u, 44593546u, 260713159u, 168250303u, 52384140u, 223401610u, 45554030u, 95410555u, 175039924u, 79171087u, 267580473u, 24168642u, 37981670u, 171551130u, 195559979u, 204611762u, 140997658u, 138925853u, 86637313u, 20736778u, 219665210u, 160430336u, 264654675u, 8013395u, 228945585u, 213884386u, 104419827u, 44185464u, 142737231u, 99284897u, 132475900u, 61861762u, 132056166u, 262388043u, 91878046u, 117353561u, 124768597u, 71352993u, 190698941u, 46055428u, 55281366u, 165145231u, 106810753u, 171985651u, 232085256u, 159510492u, 40072060u, 209107596u, 39023794u +}; +static const uint32_t IGNEUM_DS_SAMPLE_VALUE[IGNEUM_DS_SAMPLES] = { + 0x3230bc7bu, 0x7fbfe2c9u, 0xb2690991u, 0x1745c7c5u, 0x0ab0ccafu, 0x1bf87d6bu, 0x160139fdu, 0x719817acu, 0x0155df4bu, 0xbe1e86c3u, 0x680bcd6cu, 0x79c3dc6cu, 0x181e7e5fu, 0x0713a109u, 0xc705dd9fu, 0x3933b7a8u, 0xdd1c0431u, 0x50522b30u, 0xa0020b38u, 0xbff39e96u, 0x21b67e18u, 0x740f8db3u, 0x2baba568u, 0x2c9bef83u, 0x0ad9b671u, 0xc4327869u, 0x7b4fd7d0u, 0x2c29965fu, 0xec56f15fu, 0x61111746u, 0x303a1d6eu, 0xbddcfd1au, 0xf829a355u, 0x6d5df2a9u, 0x01ab8e44u, 0x06d13507u, 0xda8dcfc6u, 0x01a703e1u, 0xafe7d2c1u, 0xc091c3a2u, 0xac1814feu, 0x6e6ff62au, 0x8fdf01bau, 0xdd3f7159u, 0xdfa0d75cu, 0x26684c35u, 0x7f441e63u, 0x88df2570u, 0x8aa4d5ebu, 0xcc816c05u, 0x434df890u, 0xcd392ad6u, 0x1ab4cb63u, 0x595926fau, 0x7cd76b41u, 0x20cb95c4u, 0x13cf823fu, 0xf9daf901u, 0xff9af40au, 0x2c7dfa51u, 0x871206dbu, 0x938c116cu, 0xb64bf199u, 0x5751f874u +}; +// Cache self-test (memory-hard mode): cache[0..15], the last 16 words, and FNV-1a 64 over all 2^26 words. +static const uint32_t IGNEUM_CACHE_HEAD[16] = { + 0x355a86d2u, 0x7957db1cu, 0xd21772afu, 0x6fc1e09bu, 0xd55ce61du, 0x6e6a278bu, 0xd3f543ceu, 0x223d8e82u, + 0x143ab337u, 0x2e9f05bdu, 0x2eb389bfu, 0x0c6e449eu, 0x5cfa4222u, 0xba6560feu, 0x8e3e1aa4u, 0xdbcc1d53u +}; +static const uint32_t IGNEUM_CACHE_LAST[16] = { + 0x41190d91u, 0xbd277957u, 0x22ddbb49u, 0x6986f207u, 0xdf69a4d6u, 0x26401a3au, 0x818230fbu, 0xc417122du, + 0x3597b211u, 0xb553ce55u, 0xcf39cc0du, 0x3b7fc43au, 0x3fd43b00u, 0x67e1c80eu, 0xffa7ea7du, 0xca2960abu +}; +static const uint64_t IGNEUM_CACHE_FNV64 = 0x48c4f5bf24166b2eull; diff --git a/proto-newpow/state-dataset/verify_sd.c b/proto-newpow/state-dataset/verify_sd.c new file mode 100644 index 000000000..5540312fa --- /dev/null +++ b/proto-newpow/state-dataset/verify_sd.c @@ -0,0 +1,270 @@ +/* state-dataset prototype: plain C verifier (Horizon lane 8, class sd1). + * + * 1. Fills the 256 MiB cache on the host (mh_cache_segment over all 65536 segments), times it, checks the FNV. + * 2. --items : the 16 words of 1,024 random items the bench read back from the GPU, against + * mh_item (control) or mh_item_sd(hostCache, hostLeaf(t), t) (sd1). Reports "n of 1024 items equal". + * 3. --dump : a 32-lane register-major interpreter of the pack's 64-instruction program, loads through + * mh_word (control) or mh_word_sd (sd1) on the host cache, against the GPU's warps. Reports "n of N lanes equal". + * Lane 0 of the first warp is instrumented: its 128 load addresses, distinct items, and the Merkle arithmetic. + * 4. Per-unit rows on this CPU (ms per unit, 100 units): (ii) 4,096 leaf derivations, (iii) 4,096 x mh_item + * naive, and 4,096 x (leaf + mh_item_sd). The full B.1 rows with the 2 GiB and 8 GiB leaf arrays are cpu_rows.c. + * + * Build: gcc -O2 -std=c11 -o verify_sd verify_sd.c + * Run: taskset -c 2 ./verify_sd --mode sd1 --items items_sd1.txt --dump dump_sd1.txt + */ +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#define IGNEUM_NO_CUDA +#include "program.h" +#include "vectors.h" +#include "memhard.h" +#include "sd.h" + +static double nowMs(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1e3 + ts.tv_nsec / 1e6; } +static uint64_t fnv1a64(const void* p, size_t n) { + const uint8_t* b = (const uint8_t*)p; uint64_t h = 0xcbf29ce484222325ull; + for (size_t i = 0; i < n; ++i) { h ^= b[i]; h *= 0x100000001b3ull; } + return h; +} +static uint64_t splitmix64(uint64_t* s) { + *s += 0x9E3779B97F4A7C15ull; uint64_t z = *s; + z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ull; z = (z ^ (z >> 27)) * 0x94D049BB133111EBull; + return z ^ (z >> 31); +} + +static uint32_t* hCache; +static int gSd1 = 0; + +/* ---- the program, ported from kernel.cu (igneum_hash), register-major over 32 lanes ---- */ +static uint32_t splitmix32(uint32_t x) { x ^= x >> 16; x *= 0x7feb352du; x ^= x >> 15; x *= 0x846ca68bu; x ^= x >> 16; return x; } +static uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); } +static uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); } +static uint32_t umulhi(uint32_t a, uint32_t b) { return (uint32_t)(((uint64_t)a * (uint64_t)b) >> 32); } + +/* load instrumentation for one lane */ +static uint32_t gTraceLane = 0xffffffffu; +static uint32_t gTrace[128]; +static int gTraceN = 0; + +static uint32_t LOAD(uint32_t lane, uint32_t r, uint32_t mask) { + uint32_t w = r & mask; + if (lane == gTraceLane && gTraceN < 128) gTrace[gTraceN++] = w; + return gSd1 ? mh_word_sd(hCache, w) : mh_word(hCache, w); +} + +/* rX[l] ^= rY[l ^ m] for all lanes, through a copy of rY */ +#define SHFL_XOR_INTO(rX, rY, m) do { uint32_t tmp_[32]; for (int l_ = 0; l_ < 32; ++l_) tmp_[l_] = rY[l_ ^ (m)]; for (int l_ = 0; l_ < 32; ++l_) rX[l_] ^= tmp_[l_]; } while (0) + +static void interpret_warp(uint32_t base, uint32_t mask, uint64_t out[32]) { + uint32_t r0[32], r1[32], r2[32], r3[32], r4[32], r5[32], r6[32], r7[32], sel[32]; + for (int l = 0; l < 32; ++l) { + uint32_t nonce = base + (uint32_t)l; uint32_t x; + x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r0[l] = x ^ 0x1a155b25u; + x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r1[l] = x ^ 0xfddfb732u; + x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r2[l] = x ^ 0x4b5af2e8u; + x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r3[l] = x ^ 0xc55caf33u; + x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r4[l] = x ^ 0xa27c13b7u; + x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r5[l] = x ^ 0x06628a48u; + x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r6[l] = x ^ 0x03852469u; + x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r7[l] = x ^ 0x67a9a7beu; + } +#define L for (int l = 0; l < 32; ++l) + for (uint32_t it = 0u; it < 8u; ++it) { + L sel[l] = r0[l]; + L r2[l] = r3[l] * r4[l] + r2[l]; /* 0 mad */ + L r2[l] = r1[l] * r1[l] + r2[l]; /* 1 mad */ + L r2[l] = r3[l] * r2[l] + r2[l]; /* 2 mad */ + L r3[l] = r3[l] ^ r5[l]; /* 3 xor */ + L r7[l] = r7[l] ^ LOAD(l, r2[l], mask); /* 4 load */ + L r5[l] = r5[l] ^ LOAD(l, r7[l], mask); /* 5 load */ + SHFL_XOR_INTO(r1, r4, 8); /* 6 shfl */ + SHFL_XOR_INTO(r7, r3, 8); /* 7 shfl */ + L r1[l] = umulhi(r1[l], r5[l]); /* 8 mulhi */ + L r6[l] = rotr_var(r6[l], r3[l]); /* 9 rotr */ + L r3[l] = r3[l] | r4[l]; /* 10 or */ + L r4[l] = r4[l] ^ LOAD(l, r3[l], mask); /* 11 load */ + L r0[l] = umulhi(r0[l], r4[l]); /* 12 mulhi */ + L r5[l] = r5[l] + r1[l] + ((((sel[l] >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); /* 13 add */ + L r0[l] = r0[l] ^ LOAD(l, r4[l], mask); /* 14 load */ + L r2[l] = r2[l] - r4[l]; /* 15 sub */ + L r2[l] = r2[l] ^ LOAD(l, r0[l], mask); /* 16 load */ + L r7[l] = r7[l] ^ LOAD(l, r2[l], mask); /* 17 load */ + SHFL_XOR_INTO(r7, r3, 4); /* 18 shfl */ + L r5[l] = r5[l] * r0[l]; /* 19 mul */ + SHFL_XOR_INTO(r3, r4, 2); /* 20 shfl */ + SHFL_XOR_INTO(r2, r4, 16); /* 21 shfl */ + L r6[l] = umulhi(r6[l], r2[l]); /* 22 mulhi */ + L r6[l] = r6[l] ^ LOAD(l, r1[l], mask); /* 23 load */ + L r5[l] = r5[l] * r0[l]; /* 24 mul */ + L r5[l] = rotl_imm(r5[l], 19u); /* 25 rotl */ + SHFL_XOR_INTO(r7, r6, 2); /* 26 shfl */ + L r0[l] = r0[l] ^ r5[l]; /* 27 xor */ + L r0[l] = r0[l] ^ r4[l]; /* 28 xor */ + L r3[l] = r3[l] - r0[l]; /* 29 sub */ + L r5[l] = r5[l] * r1[l]; /* 30 mul */ + L r7[l] = r7[l] ^ LOAD(l, r2[l], mask); /* 31 load */ + L r1[l] = r1[l] ^ LOAD(l, r0[l], mask); /* 32 load */ + L r5[l] = r5[l] ^ r6[l]; /* 33 xor */ + L r5[l] = r5[l] ^ LOAD(l, r1[l], mask); /* 34 load */ + L r0[l] = umulhi(r0[l], r5[l]); /* 35 mulhi */ + SHFL_XOR_INTO(r5, r2, 4); /* 36 shfl */ + L r7[l] = r7[l] ^ LOAD(l, r0[l], mask); /* 37 load */ + L r3[l] = r3[l] + r1[l] + ((((sel[l] >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); /* 38 add */ + SHFL_XOR_INTO(r1, r5, 4); /* 39 shfl */ + L r2[l] = r2[l] ^ r5[l]; /* 40 xor */ + L r3[l] = r6[l] * r3[l] + r3[l]; /* 41 mad */ + L r6[l] = r6[l] - r7[l]; /* 42 sub */ + L r7[l] = r7[l] ^ r0[l]; /* 43 xor */ + L r1[l] = r1[l] ^ LOAD(l, r7[l], mask); /* 44 load */ + L r2[l] = r2[l] * r3[l]; /* 45 mul */ + L r1[l] = umulhi(r1[l], r5[l]); /* 46 mulhi */ + L r4[l] = r4[l] - r3[l]; /* 47 sub */ + L r2[l] = rotr_var(r2[l], r6[l]); /* 48 rotr */ + L r3[l] = r3[l] ^ LOAD(l, r5[l], mask); /* 49 load */ + L r1[l] = r1[l] + r5[l] + ((((sel[l] >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); /* 50 add */ + L r0[l] = r0[l] * r2[l]; /* 51 mul */ + L r0[l] = r0[l] + r2[l] + ((((sel[l] >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); /* 52 add */ + L r1[l] = r1[l] + r0[l] + ((((sel[l] >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); /* 53 add */ + L r7[l] = rotl_imm(r7[l], 14u); /* 54 rotl */ + L r3[l] = r3[l] + r7[l] + ((((sel[l] >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); /* 55 add */ + L r6[l] = r6[l] ^ LOAD(l, r7[l], mask); /* 56 load */ + L r1[l] = rotr_var(r1[l], r5[l]); /* 57 rotr */ + L r5[l] = r5[l] ^ LOAD(l, r4[l], mask); /* 58 load */ + L r6[l] = r6[l] ^ LOAD(l, r2[l], mask); /* 59 load */ + L r3[l] = r5[l] * r0[l] + r3[l]; /* 60 mad */ + L r5[l] = r5[l] + r7[l] + ((((sel[l] >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); /* 61 add */ + L r4[l] = r4[l] + r6[l] + ((((sel[l] >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); /* 62 add */ + L r5[l] = rotl_imm(r5[l], 19u); /* 63 rotl */ + } + L { + uint32_t lo = r0[l] ^ rotl_imm(r1[l], 7u) ^ rotl_imm(r2[l], 14u) ^ rotl_imm(r3[l], 21u); + uint32_t hi = r4[l] ^ rotl_imm(r5[l], 9u) ^ rotl_imm(r6[l], 18u) ^ rotl_imm(r7[l], 27u); + out[l] = ((uint64_t)hi << 32) | (uint64_t)lo; + } +#undef L +} + +static int cmp_u32(const void* a, const void* b) { uint32_t x = *(const uint32_t*)a, y = *(const uint32_t*)b; return x < y ? -1 : x > y; } + +int main(int argc, char** argv) { + const char* itemsFile = NULL; const char* dumpFile = NULL; int units = 100; int rows = 1; + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--mode") && i + 1 < argc) { ++i; gSd1 = !strcmp(argv[i], "sd1"); } + else if (!strcmp(argv[i], "--items") && i + 1 < argc) itemsFile = argv[++i]; + else if (!strcmp(argv[i], "--dump") && i + 1 < argc) dumpFile = argv[++i]; + else if (!strcmp(argv[i], "--units") && i + 1 < argc) units = atoi(argv[++i]); + else if (!strcmp(argv[i], "--no-rows")) rows = 0; + else { printf("usage: verify_sd --mode control|sd1 [--items f] [--dump f] [--units 100] [--no-rows]\n"); return 2; } + } + const uint32_t words = 1u << IGNEUM_DATASET_LOG2, mask = words - 1u, nItems = words / 16u; + const uint32_t cacheWords = 1u << IGNEUM_CACHE_LOG2_WORDS; + printf("verify_sd mode %s\n", gSd1 ? "sd1" : "control"); + + hCache = (uint32_t*)malloc((size_t)cacheWords * 4u); + double t0 = nowMs(); + for (uint32_t seg = 0; seg < IGNEUM_CACHE_SEGMENTS; ++seg) mh_cache_segment(hCache, seg); + double cacheMs = nowMs() - t0; + uint64_t fnv = fnv1a64(hCache, (size_t)cacheWords * 4u); + printf("host cache fill: %.1f ms one thread; FNV-1a 64 %016llx vs Mac %016llx %s\n", cacheMs, (unsigned long long)fnv, (unsigned long long)IGNEUM_CACHE_FNV64, fnv == IGNEUM_CACHE_FNV64 ? "PASS" : "FAIL"); + + /* control sanity: the first Mac vector through the interpreter */ + if (!gSd1) { + uint64_t out[32]; interpret_warp(0u, mask, out); + int bad = 0; for (int l = 0; l < 32; ++l) if (out[l] != IGNEUM_VEC_OUT[0][l]) ++bad; + printf("interpreter vs Mac vector base 0: %d of 32 lanes equal %s\n", 32 - bad, bad == 0 ? "PASS" : "FAIL"); + } + + int itemsEqual = -1; + if (itemsFile) { + FILE* f = fopen(itemsFile, "r"); + if (!f) { printf("FAIL: cannot open %s\n", itemsFile); return 2; } + char mode[16]; int n = 0; + if (fscanf(f, "mode %15s\nnitems %d\n", mode, &n) != 2) { printf("FAIL: bad items file header\n"); return 2; } + if (strcmp(mode, gSd1 ? "sd1" : "control") != 0) printf("WARNING: items file mode %s, verifier mode %s\n", mode, gSd1 ? "sd1" : "control"); + itemsEqual = 0; int read = 0; + for (int k = 0; k < n; ++k) { + uint32_t t, got[16], want[16]; + if (fscanf(f, "%u", &t) != 1) break; + for (int i = 0; i < 16; ++i) if (fscanf(f, " %x", &got[i]) != 1) break; + ++read; + if (t >= nItems) continue; + if (gSd1) { uint32_t leaf[16]; mh_leaf(t, leaf); mh_item_sd(hCache, leaf, t, want); } else mh_item(hCache, t, want); + if (memcmp(got, want, 64) == 0) ++itemsEqual; + else if (itemsEqual == k) printf(" item %u: gpu %08x host %08x (first difference)\n", t, got[0], want[0]); + } + fclose(f); + printf("item bit-exactness (plain C, %s on the host cache): %d of %d items equal %s\n", gSd1 ? "mh_item_sd with mh_leaf" : "mh_item", itemsEqual, read, itemsEqual == read && read > 0 ? "PASS" : "FAIL"); + } + + int lanesEqual = -1, lanesTotal = 0; + if (dumpFile) { + FILE* f = fopen(dumpFile, "r"); + if (!f) { printf("FAIL: cannot open %s\n", dumpFile); return 2; } + char mode[16]; int nw = 0; + if (fscanf(f, "mode %15s\nwarps %d\n", mode, &nw) != 2) { printf("FAIL: bad dump header\n"); return 2; } + if (strcmp(mode, gSd1 ? "sd1" : "control") != 0) printf("WARNING: dump mode %s, verifier mode %s\n", mode, gSd1 ? "sd1" : "control"); + lanesEqual = 0; + double tI = nowMs(); + for (int w = 0; w < nw; ++w) { + uint32_t base; uint64_t got[32], out[32]; + if (fscanf(f, "base %u\n", &base) != 1) break; + for (int l = 0; l < 32; ++l) { unsigned long long v; if (fscanf(f, "%llx\n", &v) != 1) break; got[l] = v; } + if (w == 0) { gTraceLane = 0u; gTraceN = 0; } else gTraceLane = 0xffffffffu; /* trace lane 0 of the first warp only */ + interpret_warp(base, mask, out); + int eq = 0; for (int l = 0; l < 32; ++l) if (out[l] == got[l]) ++eq; + lanesEqual += eq; lanesTotal += 32; + printf("warp base %u: %d of 32 lanes equal (lane 0 gpu %016llx interp %016llx)\n", base, eq, (unsigned long long)got[0], (unsigned long long)out[0]); + } + fclose(f); + printf("GPU hash outputs vs interpreter: %d of %d lanes equal %s (%.0f ms interpreting, %d derivations per warp)\n", lanesEqual, lanesTotal, lanesEqual == lanesTotal && lanesTotal > 0 ? "PASS" : "FAIL", nowMs() - tI, 32 * IGNEUM_LOADS_PER_HASH); + + /* B.3: the state sample of lane 0 of the first warp */ + if (gTraceN == 128) { + uint32_t items[128]; for (int i = 0; i < 128; ++i) items[i] = gTrace[i] >> 4; + qsort(items, 128, sizeof(uint32_t), cmp_u32); + int distinctItems = 1; for (int i = 1; i < 128; ++i) if (items[i] != items[i - 1]) ++distinctItems; + uint32_t ws[128]; memcpy(ws, gTrace, sizeof(ws)); qsort(ws, 128, sizeof(uint32_t), cmp_u32); + int distinctWords = 1; for (int i = 1; i < 128; ++i) if (ws[i] != ws[i - 1]) ++distinctWords; + printf("lane 0 of warp base 0: 128 loads touch %d distinct words in %d distinct items (of 2^%d items)\n", distinctWords, distinctItems, IGNEUM_DATASET_LOG2 - 4); + printf(" first 8 load words: %u %u %u %u %u %u %u %u\n", gTrace[0], gTrace[1], gTrace[2], gTrace[3], gTrace[4], gTrace[5], gTrace[6], gTrace[7]); + long openings = 128, depth = 25, hash = 32; + printf(" Merkle openings for a 2 GiB state (2^25 leaves of 64 B, depth %ld, %ld-byte hashes): %ld openings x %ld x %ld = %ld bytes of siblings + %ld x 64 = %ld bytes of leaves = %ld bytes (%.1f KiB) per lane, uncompressed; %d distinct items need only %d openings = %ld bytes\n", + depth, hash, openings, depth, hash, openings * depth * hash, openings, openings * 64, openings * depth * hash + openings * 64, (openings * depth * hash + openings * 64) / 1024.0, + distinctItems, distinctItems, (long)distinctItems * (depth * hash + 64)); + } + } + + if (rows) { + /* (ii) 4,096 leaf derivations per unit; (iii) 4,096 x mh_item naive; and leaf + mh_item_sd */ + uint64_t s = 0x5d1ull; volatile uint32_t sink = 0; + double sumLeaf = 0, sumItem = 0, sumSd = 0, minItem = 1e9, maxItem = 0; + uint32_t* ts = (uint32_t*)malloc(4096 * 4); + for (int u = 0; u < units; ++u) { + for (int k = 0; k < 4096; ++k) ts[k] = (uint32_t)splitmix64(&s) & (nItems - 1u); + double a = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t leaf[16]; mh_leaf(ts[k], leaf); sink ^= leaf[0]; } + double b = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t it[16]; mh_item(hCache, ts[k], it); sink ^= it[0]; } + double c = nowMs(); + for (int k = 0; k < 4096; ++k) { uint32_t leaf[16], it[16]; mh_leaf(ts[k], leaf); mh_item_sd(hCache, leaf, ts[k], it); sink ^= it[0]; } + double d = nowMs(); + sumLeaf += b - a; sumItem += c - b; sumSd += d - c; + if (c - b < minItem) minItem = c - b; + if (c - b > maxItem) maxItem = c - b; + } + free(ts); + printf("per-unit rows on this CPU (4,096 per unit, %d units, one thread, ms per unit):\n", units); + printf(" (ii) 4,096 leaf derivations (ChaCha12 block each, no array): %.3f ms\n", sumLeaf / units); + printf(" (iii) 4,096 x mh_item on the host cache, naive (no interleaving): %.2f ms (min %.2f, max %.2f)\n", sumItem / units, minItem, maxItem); + printf(" 4,096 x (leaf + mh_item_sd), naive: %.2f ms\n", sumSd / units); + printf(" reference: the project's Rust verifier does 4,096 derivations in 2.06 ms on an M5 Max core by interleaving the eight dependent cache misses across items; the naive figure here is an upper bound.\n"); + } + + printf("RESULT verify mode=%s host_cache_ms=%.1f items_equal=%d lanes_equal=%d/%d\n", gSd1 ? "sd1" : "control", cacheMs, itemsEqual, lanesEqual, lanesTotal); + free(hCache); + return 0; +} diff --git a/sim/horizon/new-pow/README.md b/sim/horizon/new-pow/README.md new file mode 100644 index 000000000..2d12b505c --- /dev/null +++ b/sim/horizon/new-pow/README.md @@ -0,0 +1,3 @@ +# sim/horizon/new-pow + +`chip_rows.py`: the scheme B chip rows (f = 1 chip plus a tensor array at k times the card's block energy) from the measured card figures. Run: `python3 chip_rows.py --card-uj 2.56 --card-uj-r 3.0 --r 128`. Inputs and outputs are explained in `docs/analysis/horizon/new-pow.md` section 5.3. diff --git a/sim/horizon/new-pow/chip_rows.py b/sim/horizon/new-pow/chip_rows.py new file mode 100644 index 000000000..ec4a3504a --- /dev/null +++ b/sim/horizon/new-pow/chip_rows.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +"""Chip rows for the Horizon new-pow lane (scheme B, the tensor-shaped shadow), by the chip-model-v3 section 5 method. + +Usage: + python3 chip_rows.py --card-uj \ + --card-uj-r --r \ + [--mem-uj 0.466] [--k 1.0 0.5 0.3] + +Model (docs/analysis/chip-model-v3.md 5.4 and docs/analysis/latency-shadow-2026-10-06.md 6): + chip energy per hash = memory system energy (f = 1 chip: 0.466 uJ GDDR7, 0.321 uJ one HBM3 stack) + + block energy on the chip = (card block energy) x k + card block energy = card_uj_r - card_uj (the measured marginal of the block on the honest card) + gain per joule = card_uj_r / chip_uj +Every chip figure is arithmetic on cited figures and approximate; the card figures are measured and named in the lane file. +""" +import argparse + +p = argparse.ArgumentParser() +p.add_argument("--card-uj", type=float, required=True, help="honest card microjoules per hash at R = 0 (measured)") +p.add_argument("--card-uj-r", type=float, required=True, help="honest card microjoules per hash at the measured R") +p.add_argument("--r", type=int, required=True, help="mm8 steps per iteration (8 R per hash)") +p.add_argument("--mem-uj", type=float, nargs="+", default=[0.466, 0.321], help="f = 1 chip memory energy per hash, uJ (GDDR7, HBM3 one stack)") +p.add_argument("--k", type=float, nargs="+", default=[1.0, 0.5, 0.3], help="chip block energy per op over the card's") +a = p.parse_args() + +block = a.card_uj_r - a.card_uj +macs = 8 * a.r * 1024 +print(f"R = {a.r}: {8*a.r} mm8 per hash, {macs} multiply-adds per hash") +print(f"card: {a.card_uj:.3f} uJ at R = 0, {a.card_uj_r:.3f} uJ at R = {a.r}; block {block:.3f} uJ = {block*1e6/macs if macs else 0:.3f} pJ per multiply-add") +print("| memory | k | chip uJ per hash | gain per joule (card over chip) | gain at R = 0 for comparison |") +print("|---|---|---|---|---|") +names = ["GDDR7 (16 devices)", "HBM3 (one stack)", "HBM3 (eight stacks)"] +for i, m in enumerate(a.mem_uj): + for k in a.k: + chip = m + block * k + print(f"| {names[i] if i < len(names) else m} | {k} | {chip:.3f} | {a.card_uj_r/chip:.2f}x | {a.card_uj/m:.2f}x |")