From b23300fc211ff09057d8752d2fb1f6ad3a1e5581 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sun, 6 Sep 2026 18:46:52 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-33):=20A2=20reporting=20instruments?= =?UTF-8?q?=20=E2=80=94=20make=20sig-main=20rewritten=20(tools/main=5Fseed?= =?UTF-8?q?=5Fends.py:=20main's=20game-code=20boundaries=20DERIVED=20from?= =?UTF-8?q?=20the=20link=20map=20+=20objects,=20tiling=20asserted;=20809?= =?UTF-8?q?=20fns=20/=2045,150=20ins),=20progress.py=20weighs=20main=20by?= =?UTF-8?q?=20the=20build-derived=20sig=20and=20EXITS=20with=20no=20sig=20?= =?UTF-8?q?(R32),=20the=20digest's=20oracle=20clause=20derived=20live=20(0?= =?UTF-8?q?=20phantom=20/=200=20truncated=20/=200=20pad-tail),=20backlog.l?= =?UTF-8?q?inked=5Fclosed=20retires=20the=20LINKED-range=20legacy=20row=20?= =?UTF-8?q?(0=20open),=20dup=5Freport=20on=20the=20derived=20sig;=20CORREC?= =?UTF-8?q?TED=20main=20denominator=2045,150=20(Ghidra's=20flow=20boundari?= =?UTF-8?q?es=20left=203,628=20words=20of=20game=20code=20unowned)=20?= =?UTF-8?q?=E2=80=94=20fleet=20instr=2013,492,113=20/=20distinct=205,820,2?= =?UTF-8?q?05,=20all=20100%;=20make=20report=20BINARY=3Dmain=20EXIT=3D0,?= =?UTF-8?q?=20audit-digest=20OK;=20SETUP=20=C2=A76.8=20+=20P33=20A2=20rows?= =?UTF-8?q?=20(R21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/backlog.jsonl | 1 - Makefile | 26 +- docs/SETUP.md | 33 ++- docs/backlog.md | 3 +- docs/duplicates.cross.md | 476 ++++++++++++++++++------------------ docs/duplicates.md | 131 ++++------ docs/progress.fleet.md | 6 +- phase-ends/CURRENT_PHASE.md | 64 +++-- tools/backlog.py | 26 +- tools/dup_report.py | 2 +- tools/main_seed_ends.py | 147 +++++++++++ tools/progress.py | 72 ++++-- 12 files changed, 614 insertions(+), 373 deletions(-) create mode 100644 tools/main_seed_ends.py diff --git a/.run/backlog.jsonl b/.run/backlog.jsonl index 0214624b94..e69de29bb2 100644 --- a/.run/backlog.jsonl +++ b/.run/backlog.jsonl @@ -1 +0,0 @@ -{"ts": "2026-09-01 20:34:37", "addr": "0x80062144", "name": "func_80062144", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": null, "binary": "main", "source": "S70-332b", "residual": null, "passes_tried": null} diff --git a/Makefile b/Makefile index 41baa9d778..5db845ce2b 100644 --- a/Makefile +++ b/Makefile @@ -261,6 +261,9 @@ tools-health: # in the wave. Without this line sig_is_independent("main") silently reverts to False on a # fresh clone and main's boundary blind spot comes back with the audit still green. $(MAKE) --no-print-directory sig-main-oracle + # P33 A2: main's build-derived game-code sig — the one the fleet digest weighs main by. Regenerated + # here for the R51 reason: progress.py prefers it, so a stale copy would be a stale denominator. + $(MAKE) --no-print-directory sig-main $(MAKE) --no-print-directory audit-corpus $(MAKE) --no-print-directory audit-cdecl $(MAKE) --no-print-directory audit-binaries @@ -295,6 +298,9 @@ report: # only fires for the default binary — avoids `make report BINARY=resident` rewriting the # identical file. --cross ignores --binary and scans every sig in BINARIES. ifeq ($(BINARY),main) + # P33 A2: refresh main's build-derived sig before anything weighs main by it (a no-op message when + # main is not built; progress.py then falls back to the legacy Ghidra sig or fails loudly — R32). + $(MAKE) --no-print-directory sig-main $(VENV_PY) tools/dup_report.py --cross # Fleet roll-up (Phase 15): deterministic per-binary table + fleet totals -> docs/progress.fleet.md. $(VENV_PY) tools/progress.py --fleet @@ -394,10 +400,24 @@ atlas: # beyond each function's own slice. This sig is deliberately splat-SEEDED (the atlas needs the # boundaries a match must hit); it is NOT main's independent second oracle # (docs/second-oracle.md — sig_is_independent stays False for main). +# P33 A2 — REWRITTEN: main's GAME-CODE sig at BUILD-TRUE lengths, Ghidra-free and splat-free. The stub +# seeding above became a sig of nothing at 100% (0 stubs), and the whole-EXE alternative was the +# 2026-08-05 Ghidra sig (.run/sig.SLUS_007.26.jsonl), which a public clone cannot regenerate and whose +# flow-derived boundary on FUN_80023bf0 was 22 ins short (P31 S79). Seeds now come from the linked +# objects themselves — tools/main_seed_ends.py reads each game-code object's .text section from the +# link map and slices it at its own nm symbols (the data islands and the LINKED blocks sit BETWEEN +# objects, so every slice is exact); sig_image then hashes the ORIGINAL EXE bytes at those boundaries. +# This is the sig progress.py weighs main by. Needs a built main (map + objects): without one it +# leaves any existing .run/sig.main.jsonl alone and says so — never a heuristic sig under the same +# name (R51). sig-main: - $(VENV_PY) tools/corpus.py main --seed-ends > .run/seeds.main.txt - $(VENV_PY) tools/sig_image.py --image $(main_EXE) --vram-base $(main_VRAM_BASE) --seeds .run/seeds.main.txt --name main - echo "sig-main: signed $$(wc -l < .run/seeds.main.txt) main stubs (splat-true lengths) -> .run/sig.main.jsonl" + if [ -f "$(main_MAPFILE)" ]; then + $(VENV_PY) tools/main_seed_ends.py --map $(main_MAPFILE) --out .run/seeds.main.txt + $(VENV_PY) tools/sig_image.py --image $(main_EXE) --vram-base $(main_VRAM_BASE) --seeds .run/seeds.main.txt --name main + echo "sig-main: signed $$(wc -l < .run/seeds.main.txt) main game-code fns (build-true lengths, from the link map + objects) -> .run/sig.main.jsonl" + else + echo "sig-main: no main build ($(main_MAPFILE) absent) — run 'make check BINARY=main' first; .run/sig.main.jsonl left as is" + fi # sig-main-oracle (P31 S77) — MAIN'S INDEPENDENT SECOND ORACLE (roadmap contract §1.3). # Distinct from `sig-main` above, which is splat-SEEDED on purpose. This one signs the ORIGINAL EXE diff --git a/docs/SETUP.md b/docs/SETUP.md index 77aa0f4787..2ba510ad83 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -455,7 +455,23 @@ Modern cpp preprocesses → **vintage cc1** compiles to asm → **maspsx** emula - **`make tools-health`** (new) = regenerate the byte-derived sigs (`sig-overlays` + `sig-resident`) then run `audit-corpus` + `audit-cdecl` + `audit-binaries` + `report` + `audit-digest`, fail-closed — the deliberate pre-matching ritual the roadmap's standing invariant names. Deliberately NOT a prerequisite of `report`/`build` (audit-cdecl cross-compiles every C declaration through real gcc, ~minutes). `audit-cdecl` ≈ several minutes; `audit-corpus` ≈ 7 s. - **`make sig-resident`** (Phase-27 T10; **P31 T0 ELF-seeded** — bootstrap's linear partition fused the +0 data word with the first fn and dropped the last, 144→the true 145; S45 nm-seed pattern, bootstrap fresh-clone fallback) signs the resident flat blob with `sig_image` (byte-derived) so `make audit-corpus`'s second boundary oracle (R34) covers the **resident** — probed clean (0 phantom/truncated). `sig-overlays` derives its payload list from `config/overlays.mk` (not a `0.4.dec` glob, which dropped the 4 SC07 index-1 overlays). `progress.py --fleet` reports a separate **MAIN game-code weighted** line (provisional) — the metrics-contract "main in the denominators", honestly un-folded. - **`make atlas`** (P31 T5) — the Frontier Atlas regen chain: `family_hseq` → `family_cousins` (+both card emitters) → `tools/atlas_features.py` (per-fn feature layer: 363k rows / 93k distinct bodies in ~21 s; §172b tell detectors live here as importable functions — `li_norm_toks`/`extpair_count`/`dupselect_count`/`sign_mix`/`magic_div_count`, one implementation R33) → `tools/atlas.py` (the survey: cousin units + T1.5 h_seqn merges + calibrated warm tier + seed sweep vs the matched-skeleton pool + kNN graph + evidence joins + lever labels → `.run/atlas.json` + committed `docs/frontier-atlas.md`, partition-asserted). `tools/atlas.py --calibrate` freezes THRESH_WARM/KNN_FLOOR from measured recall/false-accept (seeded RNG, regenerable); `--targets N [--lever L] [--cat C]` emits crack slates. Main joins at the ATLAS layer only (family maps stay non-main by design — four enumerated silent-skip hazards in their consumers). -- **`make sig-main`** (P31 T3) signs main's 2,002 game-code stubs at **splat-true lengths**: `corpus.py main --seed-ends` emits `0xADDR NINS` per stub (`corpus.s_ins_count`, the same counter audit() uses) and `sig_image --seeds` treats a seeded nins as authoritative (`[addr, addr+4·nins)`, no `func_end` heuristic — which mis-sliced 3/40 main samples). Verified by a full word cross-check (2,002/2,002 EXE slices == `.s` words; note the `.s` word field is byte-order hex, not the LE value). **Deliberately splat-SEEDED** — the atlas needs the boundaries a match must hit; main's *independent* second oracle stays scoped + deferred in `docs/second-oracle.md` (`sig_is_independent("main")` remains False). `family_remap.vram_of/img_path` special-case `"main"` (derived from `splat.us.exe.yaml`: file0-vram = code-seg `vram − start` = 0x8000F800; target_path), so `stream_words("main", …)` works fleet-wide (verified 25/25 vs `.s`). +- **`make sig-main` — REWRITTEN P33 A2 (S86, 2026-09-06):** signs ALL of main's game-code functions at **build-true + lengths**, Ghidra-free and splat-free: `tools/main_seed_ends.py --map build/us/SLUS_007.26.map` reads each game-code + object's `.text` input section from the link map and slices it at the object's own `nm` function symbols (the rodata + islands and the LINKED PsyQ blocks sit BETWEEN objects, so every slice is exact — tiling asserted), emits `0xVRAM NINS` + seeds, and `sig_image --seeds` hashes the ORIGINAL EXE bytes at those boundaries → `.run/sig.main.jsonl` (809 fns / + 45,150 ins). Needs a built main; without the map it leaves the file alone and says so (R51). `progress.py` weighs main + by this sig (falling back to the legacy Ghidra sig, and EXITING non-zero when neither exists — it used to print + "217 binaries" and MAIN 0/0 silently, R32); `dup_report.py` reads it for main; `tools-health` and `make report + BINARY=main` regenerate it first. **Corrected denominator:** the Ghidra sig's flow-derived boundaries left **3,628 + words of real game code owned by no function** (switch tails after unresolved jump tables, 2–4-ins thunks, and + `SaveLoadRoutine` = the `case 0:` body inside `func_8002b0b4`), so MAIN game-code weighted is **45,150 / 45,150**, not + 41,534 (P31 S79 had caught one instance, +22). Proof (S86): the derived sig tiles the 15 game-code objects' `.text` + exactly (45,150 words, no overlaps), is never shorter than Ghidra's for any shared function, and Ghidra covers 41,522 + words all inside that text. The fleet totals moved accordingly (instr 13,488,497 → 13,492,113; distinct 5,816,589 → + 5,820,205); the digest's oracle clause is now DERIVED at render time (`progress.main_oracle_line`, was a literal). + *(Historical P31 T3 text follows.)* +- **`make sig-main`** (P31 T3 — SUPERSEDED above) signed main's 2,002 game-code stubs at **splat-true lengths**: `corpus.py main --seed-ends` emits `0xADDR NINS` per stub (`corpus.s_ins_count`, the same counter audit() uses) and `sig_image --seeds` treats a seeded nins as authoritative (`[addr, addr+4·nins)`, no `func_end` heuristic — which mis-sliced 3/40 main samples). Verified by a full word cross-check (2,002/2,002 EXE slices == `.s` words; note the `.s` word field is byte-order hex, not the LE value). **Deliberately splat-SEEDED** — the atlas needs the boundaries a match must hit; main's *independent* second oracle stays scoped + deferred in `docs/second-oracle.md` (`sig_is_independent("main")` remains False). `family_remap.vram_of/img_path` special-case `"main"` (derived from `splat.us.exe.yaml`: file0-vram = code-seg `vram − start` = 0x8000F800; target_path), so `stream_words("main", …)` works fleet-wide (verified 25/25 vs `.s`). ### §6.4 asm-differ + baseline discipline @@ -999,7 +1015,7 @@ fills fast). Nothing is leaking — but the host does not get the memory back on | `tools/gate_main_parallel.py` **(NEW)** | runs the REAL `gate_main` inside N git worktrees to discover which drafts pass, then hands the union to ONE authoritative `gate_main` in the real tree. Workers discover; only the final serial pass banks | a main slate large enough that serial bisection hurts. **Measured: one gate cycle is 16 s**, so MAX_STEPS=24 is ~6.4 min serial and ~90 s across four workers. Run `--negative-control` once per environment first | | `tools/permuter_sweep.py` **(NEW)** | selects a wave's NEARs the permuter can actually search (small residual + SCHEDULE/DELAY-SLOT/REGALLOC class) and runs `permuter_ils` on them; journals are scoped to the wave so an older run's row cannot win on a bare fn name (R48) | after every wave gate — agents are briefed to STOP at permuter-class residuals, so these arrive unattempted and cost no tokens. Measured yield ~3 in 8; there is NO validated predictor of which 3 | | `tools/psyq_bss_probe.py` **(NEW)** | derives a PsyQ object's `.bss` bases FROM THE BYTES (base = resolved − addend over each HI16/LO16 pair) and reports whether the section can be cut into single-base pieces | before accepting any "scattered .bss, unlinkable" exclusion. Measured S76: SYS.o splits at 0x148 (2 bases), 2D_BG0.o/VM_NO1.o have no `.bss` at all. **S78 #4 correction:** its "GS_001.o: 5 interleaved bases, NOT splittable" grouped by BASE; grouped by RUN in offset order GS_001 is six pieces, every cut on a symbol start — it now reports over `psyq_bss_split.analyze` (one implementation, R33). Locates the object itself by masked search, so a wrong `--vram` cannot fake a clean answer (cookbook §484/§489) | -| `make sig-main-oracle` **(NEW)** | main's INDEPENDENT second boundary oracle (roadmap contract §1.3): signs the ORIGINAL EXE bytes over 28 game-code ranges derived from the splat yaml's SEGMENT TYPES, never its function boundaries | run by `tools-health`; needed before any 100% claim on main. Distinct from `make sig-main`, which is splat-SEEDED on purpose — `corpus.ORACLE_SIG` keeps the audit off that one. Result: 986 fns, 0 phantom / 0 truncated / 1 pad-tail (docs/second-oracle.md) | +| `make sig-main-oracle` **(NEW)** | main's INDEPENDENT second boundary oracle (roadmap contract §1.3): signs the ORIGINAL EXE bytes over 28 game-code ranges derived from the splat yaml's SEGMENT TYPES, never its function boundaries | run by `tools-health`; needed before any 100% claim on main. Distinct from `make sig-main`, which is splat-SEEDED on purpose — `corpus.ORACLE_SIG` keeps the audit off that one. Result: 986 fns, 0 phantom / 0 truncated / 1 pad-tail (docs/second-oracle.md); 0 pad-tail since S85 — the digest derives the clause live (P33 A2) | | `tools/recover_route.py` **(NEW)** | reads a gate's DROP ledger and names the tool that actually applies — SELF / CALLEE / DATA, each with its ordered ladder; refuses a verbatim draft up front. Wired into `gate_main`'s dropped report | after any gate that drops a draft. Replaces the single hardcoded chain gate_main used to print for every drop, which was the SELF chain and measured RED on a callee (S69) and inert on data. Negative-controlled against all 7 S77 drops whose winning tool was already known | | `tools/sync_tu_decls.py` **(NEW)** | banks a draft the gate refuses by copying the TU's OWN `extern` line for whatever symbol the gate names, re-gating, and repeating | a draft that is byte-correct but rejected on a declaration conflict. Refuses `self_decl_tu` (use `cast_self_callers --sync-decls`) and refuses a NEAR up front, since syncing declarations makes a body COMPILE, never MATCH | @@ -1053,6 +1069,19 @@ fills fast). Nothing is leaking — but the host does not get the memory back on * `gate_main` **REFUSES a draft containing its own `INCLUDE_ASM`** (substituting it restores the stub, so the build passes for free and the function counts as banked), and counts banks from the SOURCE. +### P33 A2 (S86, 2026-09-06) — reporting instruments made regenerable and honest +- `tools/main_seed_ends.py [--map build/us/SLUS_007.26.map] [--out .run/seeds.main.txt]` — main's game-code function + boundaries DERIVED from the build (link-map `.text` sections × each object's `nm` symbols; LINKED subsegs and + `build/psyq/` skipped; tiling + 4-alignment + first-symbol-at-0 asserted, R32; totals printed with denominators). + Feeds the rewritten `make sig-main` (§6.8 above). +- `tools/progress.py`: main's sig = `.run/sig.main.jsonl` (build-derived) → legacy `.run/sig.SLUS_007.26.jsonl` → + **SystemExit** (no silent `mt=0`); the digest's oracle clause comes from `progress.main_oracle_line()` (live + `corpus.audit('main')`), the provenance + date of the sig used are printed on the MAIN line. +- `tools/backlog.py`: `linked_closed(binary, addr)` — a main address inside a LINKED PsyQ range is retired by `prune` + (byte-identical by link, not work); controls: `0x80062144` True, `0x80018730` False, non-main False. The legacy S70 + row `func_80062144` is gone; `docs/backlog.md` reads 0 open. +- `tools/dup_report.py`: main's sig path → `.run/sig.main.jsonl`. + ### P32 T4c (S85, 2026-09-06) — real-TU dump instruments - `tools/cc1_dumps_tu.sh ` — dumps every gcc-2.7.2 pass (-dr -ds -dj -dl -dg -df -dc -dS -dL) of the SPLICED REAL TU that `rtu_match --work` left behind (`//t.c`); the standalone `tools/cc1_dumps.sh` compile is not diff --git a/docs/backlog.md b/docs/backlog.md index 7d0c9dc075..94f8d490d3 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -2,8 +2,7 @@ > Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there. -**Open near-misses:** 1 · by status {'failed': 1} · by class {None: 1} +**Open near-misses:** 0 · by status {} · by class {} | # | addr | reach | class | nins | status | closeness | where it stuck | best draft | |--:|------|------:|-------|-----:|--------|----------:|----------------|------------| -| 1 | func_80062144 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | | diff --git a/docs/duplicates.cross.md b/docs/duplicates.cross.md index 60ccdd9a34..e710c20c8f 100644 --- a/docs/duplicates.cross.md +++ b/docs/duplicates.cross.md @@ -1,6 +1,6 @@ # Cross-binary duplicate function groups (generated by tools/dup_report.py --cross) # sources: -# main .run/sig.SLUS_007.26.jsonl sha1=46c735b8d1f514a95f8a2ba061cccf291f45a631 +# main .run/sig.main.jsonl sha1=8bcb8eb2f6e3dc4562b39a6be9a0721bf0215fb3 # resident .run/sig.resident.jsonl sha1=76556f34476524f1c8160139f5993ad6d66d5f52 # md_MAIN_013 .run/sig.md_MAIN_013.jsonl sha1=7ef0aab887b13304929d00a324e50f883c30a903 # md_MAIN_014 .run/sig.md_MAIN_014.jsonl sha1=d67de8a37cbdb814e14360689965c68c8888ff97 @@ -290,7 +290,7 @@ | ex198 | 33040 | 59 | 141 | 141 | ov_MAIN_012:0x801777bc; ov_SC01_000:0x801777bc; ov_SC01_001:0x801777bc; ov_SC01_004:0x801777bc; …+137 | | ex199 | 32480 | 58 | 141 | 141 | ov_MAIN_012:0x8012b77c; ov_SC01_000:0x8012b77c; ov_SC01_001:0x8012b77c; ov_SC01_004:0x8012b77c; …+137 | -### intra-binary — 187 groups, 29072 collapsible bytes +### intra-binary — 181 groups, 28800 collapsible bytes | gid | bytes | nins | count | #bin | sample members (binary:addr) | |---|---|---|---|---|---| | ei0 | 304 | 38 | 3 | 1 | ov_SC07_007:0x8017d8e0; ov_SC07_007:0x8017d978; ov_SC07_007:0x8017da10 | @@ -441,49 +441,43 @@ | ei145 | 112 | 14 | 3 | 1 | ov_SC07_011:0x8017d5dc; ov_SC07_011:0x8017d6ac; ov_SC07_011:0x8017d77c | | ei146 | 104 | 13 | 3 | 1 | ov_SC07_002:0x80181cbc; ov_SC07_002:0x80182038; ov_SC07_002:0x80182648 | | ei147 | 104 | 13 | 3 | 1 | ov_SC07_011:0x8017d5a8; ov_SC07_011:0x8017d678; ov_SC07_011:0x8017d748 | -| ei148 | 88 | 11 | 3 | 1 | main:0x80043948; main:0x80060904; main:0x80060bc0 | -| ei149 | 88 | 22 | 2 | 1 | ov_SC05_018:0x8017efe0; ov_SC05_018:0x8017f2bc | -| ei150 | 84 | 21 | 2 | 1 | ov_SC01_009:0x80182438; ov_SC01_009:0x801827fc | -| ei151 | 84 | 21 | 2 | 1 | ov_SC03_095:0x8017d704; ov_SC03_095:0x8017d7b0 | -| ei152 | 84 | 21 | 2 | 1 | ov_SC05_008:0x80180e30; ov_SC05_008:0x80181380 | -| ei153 | 84 | 21 | 2 | 1 | ov_SC05_008:0x801810d8; ov_SC05_008:0x80181628 | -| ei154 | 84 | 21 | 2 | 1 | ov_SC05_008:0x801818d4; ov_SC05_008:0x80181b30 | -| ei155 | 80 | 20 | 2 | 1 | ov_SC03_124:0x801807d8; ov_SC03_124:0x80180868 | -| ei156 | 76 | 19 | 2 | 1 | ov_SC02_028:0x8017e778; ov_SC02_028:0x8017e7c4 | -| ei157 | 68 | 17 | 2 | 1 | ov_SC03_024:0x801854b0; ov_SC03_024:0x80185638 | -| ei158 | 64 | 16 | 2 | 1 | ov_SC02_031:0x8017db98; ov_SC02_031:0x8017f3c0 | -| ei159 | 60 | 15 | 2 | 1 | ov_SC01_008:0x8017f250; ov_SC01_008:0x8017f66c | -| ei160 | 60 | 15 | 2 | 1 | ov_SC02_017:0x801805d4; ov_SC02_017:0x8018096c | -| ei161 | 60 | 15 | 2 | 1 | ov_SC03_124:0x8017fe3c; ov_SC03_124:0x8017fe78 | -| ei162 | 56 | 14 | 2 | 1 | main:0x80014cf8; main:0x80014dec | -| ei163 | 56 | 14 | 2 | 1 | ov_SC01_077:0x8017e6bc; ov_SC01_077:0x8017e830 | -| ei164 | 56 | 14 | 2 | 1 | ov_SC06_006:0x80180534; ov_SC06_006:0x801805ec | -| ei165 | 56 | 14 | 2 | 1 | resident:0x800d065c; resident:0x800d0694 | -| ei166 | 48 | 12 | 2 | 1 | ov_SC03_024:0x80180800; ov_SC03_024:0x801808e4 | -| ei167 | 44 | 11 | 2 | 1 | main:0x80013f3c; main:0x80017d98 | -| ei168 | 44 | 11 | 2 | 1 | main:0x80014c28; main:0x80014dc0 | -| ei169 | 44 | 11 | 2 | 1 | ov_SC02_005:0x80187a0c; ov_SC02_005:0x8018893c | -| ei170 | 40 | 10 | 2 | 1 | main:0x800432d8; main:0x80045918 | -| ei171 | 40 | 10 | 2 | 1 | main:0x800433c0; main:0x800433e8 | -| ei172 | 40 | 10 | 2 | 1 | ov_SC01_009:0x8017f9cc; ov_SC01_009:0x80181918 | -| ei173 | 40 | 10 | 2 | 1 | ov_SC02_011:0x80182614; ov_SC02_011:0x801847f0 | -| ei174 | 40 | 10 | 2 | 1 | ov_SC03_006:0x80188080; ov_SC03_006:0x80188710 | -| ei175 | 40 | 10 | 2 | 1 | ov_SC03_029:0x801866a4; ov_SC03_029:0x80186d34 | -| ei176 | 36 | 9 | 2 | 1 | main:0x80014070; main:0x80015a2c | -| ei177 | 36 | 9 | 2 | 1 | main:0x80014094; main:0x80015a50 | -| ei178 | 36 | 9 | 2 | 1 | main:0x8001599c; main:0x800159c0 | -| ei179 | 36 | 9 | 2 | 1 | main:0x80037004; main:0x80037334 | -| ei180 | 36 | 9 | 2 | 1 | main:0x80042290; main:0x800459c4 | -| ei181 | 36 | 9 | 2 | 1 | main:0x8004561c; main:0x8005b660 | -| ei182 | 36 | 9 | 2 | 1 | ov_SC05_017:0x80182ce8; ov_SC05_017:0x80183ed4 | -| ei183 | 32 | 8 | 2 | 1 | main:0x80042134; main:0x8005ba70 | -| ei184 | 32 | 8 | 2 | 1 | ov_SC06_029:0x80180ee8; ov_SC06_029:0x801870b4 | -| ei185 | 32 | 8 | 2 | 1 | ov_SC07_007:0x8017f370; ov_SC07_007:0x80180b38 | -| ei186 | 32 | 8 | 2 | 1 | resident:0x800cefb0; resident:0x800cf398 | +| ei148 | 88 | 22 | 2 | 1 | ov_SC05_018:0x8017efe0; ov_SC05_018:0x8017f2bc | +| ei149 | 84 | 21 | 2 | 1 | ov_SC01_009:0x80182438; ov_SC01_009:0x801827fc | +| ei150 | 84 | 21 | 2 | 1 | ov_SC03_095:0x8017d704; ov_SC03_095:0x8017d7b0 | +| ei151 | 84 | 21 | 2 | 1 | ov_SC05_008:0x80180e30; ov_SC05_008:0x80181380 | +| ei152 | 84 | 21 | 2 | 1 | ov_SC05_008:0x801810d8; ov_SC05_008:0x80181628 | +| ei153 | 84 | 21 | 2 | 1 | ov_SC05_008:0x801818d4; ov_SC05_008:0x80181b30 | +| ei154 | 80 | 20 | 2 | 1 | ov_SC03_124:0x801807d8; ov_SC03_124:0x80180868 | +| ei155 | 76 | 19 | 2 | 1 | ov_SC02_028:0x8017e778; ov_SC02_028:0x8017e7c4 | +| ei156 | 68 | 17 | 2 | 1 | ov_SC03_024:0x801854b0; ov_SC03_024:0x80185638 | +| ei157 | 64 | 16 | 2 | 1 | ov_SC02_031:0x8017db98; ov_SC02_031:0x8017f3c0 | +| ei158 | 60 | 15 | 2 | 1 | ov_SC01_008:0x8017f250; ov_SC01_008:0x8017f66c | +| ei159 | 60 | 15 | 2 | 1 | ov_SC02_017:0x801805d4; ov_SC02_017:0x8018096c | +| ei160 | 60 | 15 | 2 | 1 | ov_SC03_124:0x8017fe3c; ov_SC03_124:0x8017fe78 | +| ei161 | 56 | 14 | 2 | 1 | main:0x80014cf8; main:0x80014dec | +| ei162 | 56 | 14 | 2 | 1 | ov_SC01_077:0x8017e6bc; ov_SC01_077:0x8017e830 | +| ei163 | 56 | 14 | 2 | 1 | ov_SC06_006:0x80180534; ov_SC06_006:0x801805ec | +| ei164 | 56 | 14 | 2 | 1 | resident:0x800d065c; resident:0x800d0694 | +| ei165 | 48 | 12 | 2 | 1 | ov_SC03_024:0x80180800; ov_SC03_024:0x801808e4 | +| ei166 | 44 | 11 | 2 | 1 | main:0x80013f3c; main:0x80017d98 | +| ei167 | 44 | 11 | 2 | 1 | main:0x80014c28; main:0x80014dc0 | +| ei168 | 44 | 11 | 2 | 1 | ov_SC02_005:0x80187a0c; ov_SC02_005:0x8018893c | +| ei169 | 40 | 10 | 2 | 1 | ov_SC01_009:0x8017f9cc; ov_SC01_009:0x80181918 | +| ei170 | 40 | 10 | 2 | 1 | ov_SC02_011:0x80182614; ov_SC02_011:0x801847f0 | +| ei171 | 40 | 10 | 2 | 1 | ov_SC03_006:0x80188080; ov_SC03_006:0x80188710 | +| ei172 | 40 | 10 | 2 | 1 | ov_SC03_029:0x801866a4; ov_SC03_029:0x80186d34 | +| ei173 | 36 | 9 | 2 | 1 | main:0x80014070; main:0x80015a2c | +| ei174 | 36 | 9 | 2 | 1 | main:0x80014094; main:0x80015a50 | +| ei175 | 36 | 9 | 2 | 1 | main:0x8001599c; main:0x800159c0 | +| ei176 | 36 | 9 | 2 | 1 | main:0x80037004; main:0x80037334 | +| ei177 | 36 | 9 | 2 | 1 | ov_SC05_017:0x80182ce8; ov_SC05_017:0x80183ed4 | +| ei178 | 32 | 8 | 2 | 1 | ov_SC06_029:0x80180ee8; ov_SC06_029:0x801870b4 | +| ei179 | 32 | 8 | 2 | 1 | ov_SC07_007:0x8017f370; ov_SC07_007:0x80180b38 | +| ei180 | 32 | 8 | 2 | 1 | resident:0x800cefb0; resident:0x800cf398 | ## h_norm (structural) -### cross-binary (binaries > 1) — 9337 groups, 40285260 collapsible bytes (top 200 of 9337 shown) +### cross-binary (binaries > 1) — 9341 groups, 40286720 collapsible bytes (top 200 of 9341 shown) | gid | bytes | nins | count | #bin | sample members (binary:addr) | |---|---|---|---|---|---| | nx0 | 431200 | 770 | 141 | 141 | ov_MAIN_012:0x80144b9c; ov_SC01_000:0x80144b9c; ov_SC01_001:0x80144b9c; ov_SC01_004:0x80144b9c; …+137 | @@ -492,7 +486,7 @@ | nx3 | 223440 | 399 | 141 | 141 | ov_MAIN_012:0x80133cd4; ov_SC01_000:0x80133cd4; ov_SC01_001:0x80133cd4; ov_SC01_004:0x80133cd4; …+137 | | nx4 | 211584 | 12 | 4409 | 145 | md_MAIN_027:0x800cb7fc; md_MAIN_034:0x800cc260; md_MAIN_035:0x800cafbc; md_MAIN_046:0x800cdba4; …+4405 | | nx5 | 206640 | 369 | 141 | 141 | ov_MAIN_012:0x80166994; ov_SC01_000:0x80166994; ov_SC01_001:0x80166994; ov_SC01_004:0x80166994; …+137 | -| nx6 | 202208 | 8 | 6320 | 197 | md_MAIN_003:0x800d2c88; md_MAIN_007:0x800cf390; md_MAIN_015:0x800cb474; md_MAIN_019:0x800cb4a8; …+6316 | +| nx6 | 202560 | 8 | 6331 | 198 | main:0x80014128; main:0x80014148; main:0x80016a5c; main:0x80017274; …+6327 | | nx7 | 186032 | 22 | 2115 | 141 | ov_MAIN_012:0x8014ccb4; ov_MAIN_012:0x8014d04c; ov_MAIN_012:0x8014d3e0; ov_MAIN_012:0x8014d738; …+2111 | | nx8 | 184828 | 41 | 1128 | 141 | ov_MAIN_012:0x80151fb4; ov_MAIN_012:0x801522cc; ov_MAIN_012:0x801525f4; ov_MAIN_012:0x80152ac8; …+1124 | | nx9 | 184240 | 329 | 141 | 141 | ov_MAIN_012:0x8013c414; ov_SC01_000:0x8013c414; ov_SC01_001:0x8013c414; ov_SC01_004:0x8013c414; …+137 | @@ -687,207 +681,207 @@ | nx198 | 43680 | 78 | 141 | 141 | ov_MAIN_012:0x8015e714; ov_SC01_000:0x8015e714; ov_SC01_001:0x8015e714; ov_SC01_004:0x8015e714; …+137 | | nx199 | 43680 | 78 | 141 | 141 | ov_MAIN_012:0x8016163c; ov_SC01_000:0x8016163c; ov_SC01_001:0x8016163c; ov_SC01_004:0x8016163c; …+137 | -### intra-binary — 431 groups, 77268 collapsible bytes (top 200 of 431 shown) +### intra-binary — 403 groups, 75116 collapsible bytes (top 200 of 403 shown) | gid | bytes | nins | count | #bin | sample members (binary:addr) | |---|---|---|---|---|---| | ni0 | 2232 | 186 | 4 | 1 | ov_SC07_006:0x801802ec; ov_SC07_006:0x8018163c; ov_SC07_006:0x801823f8; ov_SC07_006:0x801828a4 | | ni1 | 1268 | 317 | 2 | 1 | ov_SC07_006:0x8017fdf8; ov_SC07_006:0x80181148 | | ni2 | 1100 | 275 | 2 | 1 | ov_SC07_006:0x8017f9ac; ov_SC07_006:0x80180cfc | -| ni3 | 1000 | 125 | 3 | 1 | main:0x80054544; main:0x80054808; main:0x80054ae4 | -| ni4 | 984 | 246 | 2 | 1 | ov_SC07_006:0x8017f5d4; ov_SC07_006:0x80180924 | -| ni5 | 960 | 48 | 6 | 1 | ov_SC07_002:0x8017ff84; ov_SC07_002:0x8018094c; ov_SC07_002:0x80180a2c; ov_SC07_002:0x80180b0c; …+2 | -| ni6 | 848 | 212 | 2 | 1 | ov_SC07_006:0x801805d4; ov_SC07_006:0x80181924 | -| ni7 | 756 | 63 | 4 | 1 | ov_SC03_028:0x8018966c; ov_SC03_028:0x80189af4; ov_SC03_028:0x80189f7c; ov_SC03_028:0x8018a404 | -| ni8 | 640 | 10 | 17 | 1 | ov_SC03_007:0x8017d4c4; ov_SC03_007:0x8017d4ec; ov_SC03_007:0x8017d514; ov_SC03_007:0x8017d53c; …+13 | -| ni9 | 624 | 39 | 5 | 1 | ov_SC01_001:0x8017f28c; ov_SC01_001:0x8017f8b4; ov_SC01_001:0x8017fe44; ov_SC01_001:0x80180478; …+1 | -| ni10 | 600 | 50 | 4 | 1 | ov_SC03_031:0x801802e4; ov_SC03_031:0x801805b8; ov_SC03_031:0x80180878; ov_SC03_031:0x80180b38 | -| ni11 | 588 | 49 | 4 | 1 | ov_SC04_015:0x8017e16c; ov_SC04_015:0x8017f9b4; ov_SC04_015:0x8017fc7c; ov_SC04_015:0x8017ff50 | -| ni12 | 576 | 18 | 9 | 1 | ov_SC05_008:0x8017f65c; ov_SC05_008:0x8017f82c; ov_SC05_008:0x8017f9fc; ov_SC05_008:0x8017fbcc; …+5 | -| ni13 | 540 | 45 | 4 | 1 | ov_SC03_028:0x80189518; ov_SC03_028:0x801899a0; ov_SC03_028:0x80189e28; ov_SC03_028:0x8018a2b0 | -| ni14 | 400 | 50 | 3 | 1 | ov_SC04_015:0x8017fa78; ov_SC04_015:0x8017fd40; ov_SC04_015:0x80180014 | -| ni15 | 336 | 21 | 5 | 1 | ov_SC05_008:0x801800d8; ov_SC05_008:0x80180484; ov_SC05_008:0x80180830; ov_SC05_008:0x80180988; …+1 | -| ni16 | 308 | 77 | 2 | 1 | main:0x800604c4; main:0x800606d4 | -| ni17 | 304 | 38 | 3 | 1 | ov_SC07_007:0x8017d8e0; ov_SC07_007:0x8017d978; ov_SC07_007:0x8017da10 | -| ni18 | 288 | 8 | 10 | 1 | main:0x80014128; main:0x80014148; main:0x80016a5c; main:0x80017274; …+6 | -| ni19 | 280 | 70 | 2 | 1 | ov_SC04_011:0x801845a8; ov_SC04_011:0x80184728 | -| ni20 | 248 | 62 | 2 | 1 | ov_SC03_007:0x80186310; ov_SC03_007:0x80186584 | -| ni21 | 240 | 15 | 5 | 1 | ov_SC01_001:0x8017f7f4; ov_SC01_001:0x8017fd70; ov_SC01_001:0x801803a4; ov_SC01_001:0x80180854; …+1 | -| ni22 | 240 | 15 | 5 | 1 | ov_SC03_001:0x80185d14; ov_SC03_001:0x80185d50; ov_SC03_001:0x80185d8c; ov_SC03_001:0x80185fb4; …+1 | -| ni23 | 240 | 20 | 4 | 1 | ov_SC03_007:0x8017dc04; ov_SC03_007:0x8017dc54; ov_SC03_007:0x8017dca4; ov_SC03_007:0x8017dcf4 | -| ni24 | 232 | 58 | 2 | 1 | main:0x8001382c; main:0x800139c8 | -| ni25 | 228 | 57 | 2 | 1 | main:0x800134fc; main:0x80013694 | -| ni26 | 228 | 57 | 2 | 1 | main:0x80013b64; main:0x80013cfc | -| ni27 | 228 | 19 | 4 | 1 | main:0x8002a1b4; main:0x8002a400; main:0x8002a670; main:0x8002a8e0 | -| ni28 | 228 | 19 | 4 | 1 | ov_SC07_009:0x8017d508; ov_SC07_009:0x8017d634; ov_SC07_009:0x8017d760; ov_SC07_009:0x8017d88c | -| ni29 | 228 | 19 | 4 | 1 | ov_SC07_009:0x8017d554; ov_SC07_009:0x8017d680; ov_SC07_009:0x8017d7ac; ov_SC07_009:0x8017d8d8 | -| ni30 | 224 | 8 | 8 | 1 | main:0x80027bf0; main:0x8002eeb8; main:0x8002fdc8; main:0x80046610; …+4 | -| ni31 | 220 | 55 | 2 | 1 | ov_SC01_009:0x80182030; ov_SC01_009:0x8018210c | -| ni32 | 208 | 52 | 2 | 1 | ov_SC03_007:0x80186408; ov_SC03_007:0x8018669c | -| ni33 | 204 | 51 | 2 | 1 | ov_SC03_012:0x8017d6b4; ov_SC03_012:0x8017d780 | -| ni34 | 204 | 51 | 2 | 1 | ov_SC05_008:0x801802ec; ov_SC05_008:0x80180698 | -| ni35 | 204 | 17 | 4 | 1 | ov_SC07_002:0x8017f004; ov_SC07_002:0x8017f184; ov_SC07_002:0x8017f2d8; ov_SC07_002:0x8017f418 | -| ni36 | 200 | 25 | 3 | 1 | ov_SC03_124:0x8017dfe4; ov_SC03_124:0x8017ebec; ov_SC03_124:0x8017ff64 | -| ni37 | 200 | 50 | 2 | 1 | ov_SC06_000:0x801816ac; ov_SC06_000:0x80181774 | -| ni38 | 196 | 49 | 2 | 1 | main:0x800167f0; main:0x80016978 | -| ni39 | 188 | 47 | 2 | 1 | ov_MAIN_012:0x8015dcb8; ov_MAIN_012:0x8015e018 | -| ni40 | 188 | 47 | 2 | 1 | ov_SC01_000:0x8015dcb8; ov_SC01_000:0x8015e018 | -| ni41 | 188 | 47 | 2 | 1 | ov_SC01_001:0x8015dcb8; ov_SC01_001:0x8015e018 | -| ni42 | 188 | 47 | 2 | 1 | ov_SC01_004:0x8015dcb8; ov_SC01_004:0x8015e018 | -| ni43 | 188 | 47 | 2 | 1 | ov_SC01_008:0x8015dcb8; ov_SC01_008:0x8015e018 | -| ni44 | 188 | 47 | 2 | 1 | ov_SC01_009:0x8015dcb8; ov_SC01_009:0x8015e018 | -| ni45 | 188 | 47 | 2 | 1 | ov_SC01_074:0x8015dcb8; ov_SC01_074:0x8015e018 | -| ni46 | 188 | 47 | 2 | 1 | ov_SC01_077:0x8015dcb8; ov_SC01_077:0x8015e018 | -| ni47 | 188 | 47 | 2 | 1 | ov_SC01_080:0x8015dcb8; ov_SC01_080:0x8015e018 | -| ni48 | 188 | 47 | 2 | 1 | ov_SC01_084:0x8015dcb8; ov_SC01_084:0x8015e018 | -| ni49 | 188 | 47 | 2 | 1 | ov_SC02_004:0x8015dcb8; ov_SC02_004:0x8015e018 | -| ni50 | 188 | 47 | 2 | 1 | ov_SC02_005:0x8015dcb8; ov_SC02_005:0x8015e018 | -| ni51 | 188 | 47 | 2 | 1 | ov_SC02_011:0x8015dcb8; ov_SC02_011:0x8015e018 | -| ni52 | 188 | 47 | 2 | 1 | ov_SC02_015:0x8015dcb8; ov_SC02_015:0x8015e018 | -| ni53 | 188 | 47 | 2 | 1 | ov_SC02_016:0x8015dcb8; ov_SC02_016:0x8015e018 | -| ni54 | 188 | 47 | 2 | 1 | ov_SC02_017:0x8015dcb8; ov_SC02_017:0x8015e018 | -| ni55 | 188 | 47 | 2 | 1 | ov_SC02_021:0x8015dcb8; ov_SC02_021:0x8015e018 | -| ni56 | 188 | 47 | 2 | 1 | ov_SC02_026:0x8015dcb8; ov_SC02_026:0x8015e018 | -| ni57 | 188 | 47 | 2 | 1 | ov_SC02_027:0x8015dcb8; ov_SC02_027:0x8015e018 | -| ni58 | 188 | 47 | 2 | 1 | ov_SC02_028:0x8015dcb8; ov_SC02_028:0x8015e018 | -| ni59 | 188 | 47 | 2 | 1 | ov_SC02_031:0x8015dcb8; ov_SC02_031:0x8015e018 | -| ni60 | 188 | 47 | 2 | 1 | ov_SC02_035:0x8015dcb8; ov_SC02_035:0x8015e018 | -| ni61 | 188 | 47 | 2 | 1 | ov_SC02_037:0x8015dcb8; ov_SC02_037:0x8015e018 | -| ni62 | 188 | 47 | 2 | 1 | ov_SC02_039:0x8015dcb8; ov_SC02_039:0x8015e018 | -| ni63 | 188 | 47 | 2 | 1 | ov_SC02_041:0x8015dcb8; ov_SC02_041:0x8015e018 | -| ni64 | 188 | 47 | 2 | 1 | ov_SC03_001:0x8015dcb8; ov_SC03_001:0x8015e018 | -| ni65 | 188 | 47 | 2 | 1 | ov_SC03_002:0x8015dcb8; ov_SC03_002:0x8015e018 | -| ni66 | 188 | 47 | 2 | 1 | ov_SC03_003:0x8015dcb8; ov_SC03_003:0x8015e018 | -| ni67 | 188 | 47 | 2 | 1 | ov_SC03_006:0x8015dcb8; ov_SC03_006:0x8015e018 | -| ni68 | 188 | 47 | 2 | 1 | ov_SC03_007:0x8015dcb8; ov_SC03_007:0x8015e018 | -| ni69 | 188 | 47 | 2 | 1 | ov_SC03_010:0x8015dcb8; ov_SC03_010:0x8015e018 | -| ni70 | 188 | 47 | 2 | 1 | ov_SC03_011:0x8015dcb8; ov_SC03_011:0x8015e018 | -| ni71 | 188 | 47 | 2 | 1 | ov_SC03_012:0x8015dcb8; ov_SC03_012:0x8015e018 | -| ni72 | 188 | 47 | 2 | 1 | ov_SC03_013:0x8015dcb8; ov_SC03_013:0x8015e018 | -| ni73 | 188 | 47 | 2 | 1 | ov_SC03_023:0x8015dcb8; ov_SC03_023:0x8015e018 | -| ni74 | 188 | 47 | 2 | 1 | ov_SC03_024:0x8015dcb8; ov_SC03_024:0x8015e018 | -| ni75 | 188 | 47 | 2 | 1 | ov_SC03_028:0x8015dcb8; ov_SC03_028:0x8015e018 | -| ni76 | 188 | 47 | 2 | 1 | ov_SC03_029:0x8015dcb8; ov_SC03_029:0x8015e018 | -| ni77 | 188 | 47 | 2 | 1 | ov_SC03_030:0x8015dcb8; ov_SC03_030:0x8015e018 | -| ni78 | 188 | 47 | 2 | 1 | ov_SC03_031:0x8015dcb8; ov_SC03_031:0x8015e018 | -| ni79 | 188 | 47 | 2 | 1 | ov_SC03_089:0x8015dcb8; ov_SC03_089:0x8015e018 | -| ni80 | 188 | 47 | 2 | 1 | ov_SC03_090:0x8015dcb8; ov_SC03_090:0x8015e018 | -| ni81 | 188 | 47 | 2 | 1 | ov_SC03_091:0x8015dcb8; ov_SC03_091:0x8015e018 | -| ni82 | 188 | 47 | 2 | 1 | ov_SC03_092:0x8015dcb8; ov_SC03_092:0x8015e018 | -| ni83 | 188 | 47 | 2 | 1 | ov_SC03_093:0x8015dcb8; ov_SC03_093:0x8015e018 | -| ni84 | 188 | 47 | 2 | 1 | ov_SC03_094:0x8015dcb8; ov_SC03_094:0x8015e018 | -| ni85 | 188 | 47 | 2 | 1 | ov_SC03_095:0x8015dcb8; ov_SC03_095:0x8015e018 | -| ni86 | 188 | 47 | 2 | 1 | ov_SC03_096:0x8015dcb8; ov_SC03_096:0x8015e018 | -| ni87 | 188 | 47 | 2 | 1 | ov_SC03_097:0x8015dcb8; ov_SC03_097:0x8015e018 | -| ni88 | 188 | 47 | 2 | 1 | ov_SC03_098:0x8015dcb8; ov_SC03_098:0x8015e018 | -| ni89 | 188 | 47 | 2 | 1 | ov_SC03_099:0x8015dcb8; ov_SC03_099:0x8015e018 | -| ni90 | 188 | 47 | 2 | 1 | ov_SC03_100:0x8015dcb8; ov_SC03_100:0x8015e018 | -| ni91 | 188 | 47 | 2 | 1 | ov_SC03_101:0x8015dcb8; ov_SC03_101:0x8015e018 | -| ni92 | 188 | 47 | 2 | 1 | ov_SC03_102:0x8015dcb8; ov_SC03_102:0x8015e018 | -| ni93 | 188 | 47 | 2 | 1 | ov_SC03_103:0x8015dcb8; ov_SC03_103:0x8015e018 | -| ni94 | 188 | 47 | 2 | 1 | ov_SC03_104:0x8015dcb8; ov_SC03_104:0x8015e018 | -| ni95 | 188 | 47 | 2 | 1 | ov_SC03_105:0x8015dcb8; ov_SC03_105:0x8015e018 | -| ni96 | 188 | 47 | 2 | 1 | ov_SC03_107:0x8015dcb8; ov_SC03_107:0x8015e018 | -| ni97 | 188 | 47 | 2 | 1 | ov_SC03_108:0x8015dcb8; ov_SC03_108:0x8015e018 | -| ni98 | 188 | 47 | 2 | 1 | ov_SC03_109:0x8015dcb8; ov_SC03_109:0x8015e018 | -| ni99 | 188 | 47 | 2 | 1 | ov_SC03_110:0x8015dcb8; ov_SC03_110:0x8015e018 | -| ni100 | 188 | 47 | 2 | 1 | ov_SC03_111:0x8015dcb8; ov_SC03_111:0x8015e018 | -| ni101 | 188 | 47 | 2 | 1 | ov_SC03_112:0x8015dcb8; ov_SC03_112:0x8015e018 | -| ni102 | 188 | 47 | 2 | 1 | ov_SC03_113:0x8015dcb8; ov_SC03_113:0x8015e018 | -| ni103 | 188 | 47 | 2 | 1 | ov_SC03_114:0x8015dcb8; ov_SC03_114:0x8015e018 | -| ni104 | 188 | 47 | 2 | 1 | ov_SC03_115:0x8015dcb8; ov_SC03_115:0x8015e018 | -| ni105 | 188 | 47 | 2 | 1 | ov_SC03_116:0x8015dcb8; ov_SC03_116:0x8015e018 | -| ni106 | 188 | 47 | 2 | 1 | ov_SC03_117:0x8015dcb8; ov_SC03_117:0x8015e018 | -| ni107 | 188 | 47 | 2 | 1 | ov_SC03_121:0x8015dcb8; ov_SC03_121:0x8015e018 | -| ni108 | 188 | 47 | 2 | 1 | ov_SC03_124:0x8015dcb8; ov_SC03_124:0x8015e018 | -| ni109 | 188 | 47 | 2 | 1 | ov_SC03_125:0x8015dcb8; ov_SC03_125:0x8015e018 | -| ni110 | 188 | 47 | 2 | 1 | ov_SC04_000:0x8015dcb8; ov_SC04_000:0x8015e018 | -| ni111 | 188 | 47 | 2 | 1 | ov_SC04_002:0x8015dcb8; ov_SC04_002:0x8015e018 | -| ni112 | 188 | 47 | 2 | 1 | ov_SC04_003:0x8015dcb8; ov_SC04_003:0x8015e018 | -| ni113 | 188 | 47 | 2 | 1 | ov_SC04_004:0x8015dcb8; ov_SC04_004:0x8015e018 | -| ni114 | 188 | 47 | 2 | 1 | ov_SC04_005:0x8015dcb8; ov_SC04_005:0x8015e018 | -| ni115 | 188 | 47 | 2 | 1 | ov_SC04_006:0x8015dcb8; ov_SC04_006:0x8015e018 | -| ni116 | 188 | 47 | 2 | 1 | ov_SC04_007:0x8015dcb8; ov_SC04_007:0x8015e018 | -| ni117 | 188 | 47 | 2 | 1 | ov_SC04_009:0x8015dcb8; ov_SC04_009:0x8015e018 | -| ni118 | 188 | 47 | 2 | 1 | ov_SC04_010:0x8015dcb8; ov_SC04_010:0x8015e018 | -| ni119 | 188 | 47 | 2 | 1 | ov_SC04_011:0x8015dcb8; ov_SC04_011:0x8015e018 | -| ni120 | 188 | 47 | 2 | 1 | ov_SC04_012:0x8015dcb8; ov_SC04_012:0x8015e018 | -| ni121 | 188 | 47 | 2 | 1 | ov_SC04_015:0x8015dcb8; ov_SC04_015:0x8015e018 | -| ni122 | 188 | 47 | 2 | 1 | ov_SC04_016:0x8015dcb8; ov_SC04_016:0x8015e018 | -| ni123 | 188 | 47 | 2 | 1 | ov_SC04_020:0x8015dcb8; ov_SC04_020:0x8015e018 | -| ni124 | 188 | 47 | 2 | 1 | ov_SC05_000:0x8015dcb8; ov_SC05_000:0x8015e018 | -| ni125 | 188 | 47 | 2 | 1 | ov_SC05_001:0x8015dcb8; ov_SC05_001:0x8015e018 | -| ni126 | 188 | 47 | 2 | 1 | ov_SC05_002:0x8015dcb8; ov_SC05_002:0x8015e018 | -| ni127 | 188 | 47 | 2 | 1 | ov_SC05_003:0x8015dcb8; ov_SC05_003:0x8015e018 | -| ni128 | 188 | 47 | 2 | 1 | ov_SC05_004:0x8015dcb8; ov_SC05_004:0x8015e018 | -| ni129 | 188 | 47 | 2 | 1 | ov_SC05_005:0x8015dcb8; ov_SC05_005:0x8015e018 | -| ni130 | 188 | 47 | 2 | 1 | ov_SC05_006:0x8015dcb8; ov_SC05_006:0x8015e018 | -| ni131 | 188 | 47 | 2 | 1 | ov_SC05_007:0x8015dcb8; ov_SC05_007:0x8015e018 | -| ni132 | 188 | 47 | 2 | 1 | ov_SC05_008:0x8015dcb8; ov_SC05_008:0x8015e018 | -| ni133 | 188 | 47 | 2 | 1 | ov_SC05_008:0x80180230; ov_SC05_008:0x801805dc | -| ni134 | 188 | 47 | 2 | 1 | ov_SC05_010:0x8015dcb8; ov_SC05_010:0x8015e018 | -| ni135 | 188 | 47 | 2 | 1 | ov_SC05_011:0x8015dcb8; ov_SC05_011:0x8015e018 | -| ni136 | 188 | 47 | 2 | 1 | ov_SC05_017:0x8015dcb8; ov_SC05_017:0x8015e018 | -| ni137 | 188 | 47 | 2 | 1 | ov_SC05_018:0x8015dcb8; ov_SC05_018:0x8015e018 | -| ni138 | 188 | 47 | 2 | 1 | ov_SC06_000:0x8015dcb8; ov_SC06_000:0x8015e018 | -| ni139 | 188 | 47 | 2 | 1 | ov_SC06_006:0x8015dcb8; ov_SC06_006:0x8015e018 | -| ni140 | 188 | 47 | 2 | 1 | ov_SC06_008:0x8015dcb8; ov_SC06_008:0x8015e018 | -| ni141 | 188 | 47 | 2 | 1 | ov_SC06_010:0x8015dcb8; ov_SC06_010:0x8015e018 | -| ni142 | 188 | 47 | 2 | 1 | ov_SC06_011:0x8015dcb8; ov_SC06_011:0x8015e018 | -| ni143 | 188 | 47 | 2 | 1 | ov_SC06_013:0x8015dcb8; ov_SC06_013:0x8015e018 | -| ni144 | 188 | 47 | 2 | 1 | ov_SC06_014:0x8015dcb8; ov_SC06_014:0x8015e018 | -| ni145 | 188 | 47 | 2 | 1 | ov_SC06_015:0x8015dcb8; ov_SC06_015:0x8015e018 | -| ni146 | 188 | 47 | 2 | 1 | ov_SC06_016:0x8015dcb8; ov_SC06_016:0x8015e018 | -| ni147 | 188 | 47 | 2 | 1 | ov_SC06_018:0x8015dcb8; ov_SC06_018:0x8015e018 | -| ni148 | 188 | 47 | 2 | 1 | ov_SC06_020:0x8015dcb8; ov_SC06_020:0x8015e018 | -| ni149 | 188 | 47 | 2 | 1 | ov_SC06_022:0x8015dcb8; ov_SC06_022:0x8015e018 | -| ni150 | 188 | 47 | 2 | 1 | ov_SC06_024:0x8015dcb8; ov_SC06_024:0x8015e018 | -| ni151 | 188 | 47 | 2 | 1 | ov_SC06_025:0x8015dcb8; ov_SC06_025:0x8015e018 | -| ni152 | 188 | 47 | 2 | 1 | ov_SC06_027:0x8015dcb8; ov_SC06_027:0x8015e018 | -| ni153 | 188 | 47 | 2 | 1 | ov_SC06_029:0x8015dcb8; ov_SC06_029:0x8015e018 | -| ni154 | 188 | 47 | 2 | 1 | ov_SC06_030:0x8015dcb8; ov_SC06_030:0x8015e018 | -| ni155 | 188 | 47 | 2 | 1 | ov_SC06_032:0x8015dcb8; ov_SC06_032:0x8015e018 | -| ni156 | 188 | 47 | 2 | 1 | ov_SC06_033:0x8015dcb8; ov_SC06_033:0x8015e018 | -| ni157 | 188 | 47 | 2 | 1 | ov_SC07_000:0x8015dcb8; ov_SC07_000:0x8015e018 | -| ni158 | 188 | 47 | 2 | 1 | ov_SC07_001:0x8015dcb8; ov_SC07_001:0x8015e018 | -| ni159 | 188 | 47 | 2 | 1 | ov_SC07_002:0x8015dcb8; ov_SC07_002:0x8015e018 | -| ni160 | 188 | 47 | 2 | 1 | ov_SC07_006:0x8015dcb8; ov_SC07_006:0x8015e018 | -| ni161 | 188 | 47 | 2 | 1 | ov_SC07_007:0x8015dcb8; ov_SC07_007:0x8015e018 | -| ni162 | 188 | 47 | 2 | 1 | ov_SC07_008:0x8015dcb8; ov_SC07_008:0x8015e018 | -| ni163 | 188 | 47 | 2 | 1 | ov_SC07_009:0x8015dcb8; ov_SC07_009:0x8015e018 | -| ni164 | 188 | 47 | 2 | 1 | ov_SC07_010:0x8015dcb8; ov_SC07_010:0x8015e018 | -| ni165 | 188 | 47 | 2 | 1 | ov_SC07_011:0x8015dcb8; ov_SC07_011:0x8015e018 | -| ni166 | 184 | 23 | 3 | 1 | ov_SC01_001:0x8017fdac; ov_SC01_001:0x801803e0; ov_SC01_001:0x80180e90 | -| ni167 | 176 | 44 | 2 | 1 | ov_MAIN_012:0x8015dbd4; ov_MAIN_012:0x8015df34 | -| ni168 | 176 | 44 | 2 | 1 | ov_SC01_000:0x8015dbd4; ov_SC01_000:0x8015df34 | -| ni169 | 176 | 44 | 2 | 1 | ov_SC01_001:0x8015dbd4; ov_SC01_001:0x8015df34 | -| ni170 | 176 | 44 | 2 | 1 | ov_SC01_004:0x8015dbd4; ov_SC01_004:0x8015df34 | -| ni171 | 176 | 44 | 2 | 1 | ov_SC01_008:0x8015dbd4; ov_SC01_008:0x8015df34 | -| ni172 | 176 | 44 | 2 | 1 | ov_SC01_009:0x8015dbd4; ov_SC01_009:0x8015df34 | -| ni173 | 176 | 44 | 2 | 1 | ov_SC01_074:0x8015dbd4; ov_SC01_074:0x8015df34 | -| ni174 | 176 | 44 | 2 | 1 | ov_SC01_077:0x8015dbd4; ov_SC01_077:0x8015df34 | -| ni175 | 176 | 44 | 2 | 1 | ov_SC01_080:0x8015dbd4; ov_SC01_080:0x8015df34 | -| ni176 | 176 | 44 | 2 | 1 | ov_SC01_084:0x8015dbd4; ov_SC01_084:0x8015df34 | -| ni177 | 176 | 44 | 2 | 1 | ov_SC02_004:0x8015dbd4; ov_SC02_004:0x8015df34 | -| ni178 | 176 | 44 | 2 | 1 | ov_SC02_005:0x8015dbd4; ov_SC02_005:0x8015df34 | -| ni179 | 176 | 44 | 2 | 1 | ov_SC02_011:0x8015dbd4; ov_SC02_011:0x8015df34 | -| ni180 | 176 | 44 | 2 | 1 | ov_SC02_015:0x8015dbd4; ov_SC02_015:0x8015df34 | -| ni181 | 176 | 44 | 2 | 1 | ov_SC02_016:0x8015dbd4; ov_SC02_016:0x8015df34 | -| ni182 | 176 | 44 | 2 | 1 | ov_SC02_017:0x8015dbd4; ov_SC02_017:0x8015df34 | -| ni183 | 176 | 44 | 2 | 1 | ov_SC02_021:0x8015dbd4; ov_SC02_021:0x8015df34 | -| ni184 | 176 | 44 | 2 | 1 | ov_SC02_026:0x8015dbd4; ov_SC02_026:0x8015df34 | -| ni185 | 176 | 44 | 2 | 1 | ov_SC02_027:0x8015dbd4; ov_SC02_027:0x8015df34 | -| ni186 | 176 | 44 | 2 | 1 | ov_SC02_028:0x8015dbd4; ov_SC02_028:0x8015df34 | -| ni187 | 176 | 44 | 2 | 1 | ov_SC02_031:0x8015dbd4; ov_SC02_031:0x8015df34 | -| ni188 | 176 | 44 | 2 | 1 | ov_SC02_035:0x8015dbd4; ov_SC02_035:0x8015df34 | -| ni189 | 176 | 44 | 2 | 1 | ov_SC02_037:0x8015dbd4; ov_SC02_037:0x8015df34 | -| ni190 | 176 | 44 | 2 | 1 | ov_SC02_039:0x8015dbd4; ov_SC02_039:0x8015df34 | -| ni191 | 176 | 44 | 2 | 1 | ov_SC02_041:0x8015dbd4; ov_SC02_041:0x8015df34 | -| ni192 | 176 | 44 | 2 | 1 | ov_SC03_001:0x8015dbd4; ov_SC03_001:0x8015df34 | -| ni193 | 176 | 44 | 2 | 1 | ov_SC03_002:0x8015dbd4; ov_SC03_002:0x8015df34 | -| ni194 | 176 | 44 | 2 | 1 | ov_SC03_003:0x8015dbd4; ov_SC03_003:0x8015df34 | -| ni195 | 176 | 44 | 2 | 1 | ov_SC03_006:0x8015dbd4; ov_SC03_006:0x8015df34 | -| ni196 | 176 | 44 | 2 | 1 | ov_SC03_007:0x8015dbd4; ov_SC03_007:0x8015df34 | -| ni197 | 176 | 44 | 2 | 1 | ov_SC03_010:0x8015dbd4; ov_SC03_010:0x8015df34 | -| ni198 | 176 | 44 | 2 | 1 | ov_SC03_011:0x8015dbd4; ov_SC03_011:0x8015df34 | -| ni199 | 176 | 44 | 2 | 1 | ov_SC03_012:0x8015dbd4; ov_SC03_012:0x8015df34 | +| ni3 | 984 | 246 | 2 | 1 | ov_SC07_006:0x8017f5d4; ov_SC07_006:0x80180924 | +| ni4 | 960 | 48 | 6 | 1 | ov_SC07_002:0x8017ff84; ov_SC07_002:0x8018094c; ov_SC07_002:0x80180a2c; ov_SC07_002:0x80180b0c; …+2 | +| ni5 | 848 | 212 | 2 | 1 | ov_SC07_006:0x801805d4; ov_SC07_006:0x80181924 | +| ni6 | 756 | 63 | 4 | 1 | ov_SC03_028:0x8018966c; ov_SC03_028:0x80189af4; ov_SC03_028:0x80189f7c; ov_SC03_028:0x8018a404 | +| ni7 | 640 | 10 | 17 | 1 | ov_SC03_007:0x8017d4c4; ov_SC03_007:0x8017d4ec; ov_SC03_007:0x8017d514; ov_SC03_007:0x8017d53c; …+13 | +| ni8 | 624 | 39 | 5 | 1 | ov_SC01_001:0x8017f28c; ov_SC01_001:0x8017f8b4; ov_SC01_001:0x8017fe44; ov_SC01_001:0x80180478; …+1 | +| ni9 | 600 | 50 | 4 | 1 | ov_SC03_031:0x801802e4; ov_SC03_031:0x801805b8; ov_SC03_031:0x80180878; ov_SC03_031:0x80180b38 | +| ni10 | 588 | 49 | 4 | 1 | ov_SC04_015:0x8017e16c; ov_SC04_015:0x8017f9b4; ov_SC04_015:0x8017fc7c; ov_SC04_015:0x8017ff50 | +| ni11 | 576 | 18 | 9 | 1 | ov_SC05_008:0x8017f65c; ov_SC05_008:0x8017f82c; ov_SC05_008:0x8017f9fc; ov_SC05_008:0x8017fbcc; …+5 | +| ni12 | 540 | 45 | 4 | 1 | ov_SC03_028:0x80189518; ov_SC03_028:0x801899a0; ov_SC03_028:0x80189e28; ov_SC03_028:0x8018a2b0 | +| ni13 | 516 | 43 | 4 | 1 | main:0x8002a108; main:0x8002a354; main:0x8002a5c4; main:0x8002a834 | +| ni14 | 412 | 103 | 2 | 1 | main:0x8001382c; main:0x800139c8 | +| ni15 | 408 | 102 | 2 | 1 | main:0x800134fc; main:0x80013694 | +| ni16 | 408 | 102 | 2 | 1 | main:0x80013b64; main:0x80013cfc | +| ni17 | 400 | 50 | 3 | 1 | ov_SC04_015:0x8017fa78; ov_SC04_015:0x8017fd40; ov_SC04_015:0x80180014 | +| ni18 | 336 | 21 | 5 | 1 | ov_SC05_008:0x801800d8; ov_SC05_008:0x80180484; ov_SC05_008:0x80180830; ov_SC05_008:0x80180988; …+1 | +| ni19 | 304 | 38 | 3 | 1 | ov_SC07_007:0x8017d8e0; ov_SC07_007:0x8017d978; ov_SC07_007:0x8017da10 | +| ni20 | 280 | 70 | 2 | 1 | ov_SC04_011:0x801845a8; ov_SC04_011:0x80184728 | +| ni21 | 248 | 62 | 2 | 1 | ov_SC03_007:0x80186310; ov_SC03_007:0x80186584 | +| ni22 | 240 | 15 | 5 | 1 | ov_SC01_001:0x8017f7f4; ov_SC01_001:0x8017fd70; ov_SC01_001:0x801803a4; ov_SC01_001:0x80180854; …+1 | +| ni23 | 240 | 15 | 5 | 1 | ov_SC03_001:0x80185d14; ov_SC03_001:0x80185d50; ov_SC03_001:0x80185d8c; ov_SC03_001:0x80185fb4; …+1 | +| ni24 | 240 | 20 | 4 | 1 | ov_SC03_007:0x8017dc04; ov_SC03_007:0x8017dc54; ov_SC03_007:0x8017dca4; ov_SC03_007:0x8017dcf4 | +| ni25 | 228 | 19 | 4 | 1 | main:0x8002a1b4; main:0x8002a400; main:0x8002a670; main:0x8002a8e0 | +| ni26 | 228 | 19 | 4 | 1 | ov_SC07_009:0x8017d508; ov_SC07_009:0x8017d634; ov_SC07_009:0x8017d760; ov_SC07_009:0x8017d88c | +| ni27 | 228 | 19 | 4 | 1 | ov_SC07_009:0x8017d554; ov_SC07_009:0x8017d680; ov_SC07_009:0x8017d7ac; ov_SC07_009:0x8017d8d8 | +| ni28 | 220 | 55 | 2 | 1 | ov_SC01_009:0x80182030; ov_SC01_009:0x8018210c | +| ni29 | 208 | 52 | 2 | 1 | ov_SC03_007:0x80186408; ov_SC03_007:0x8018669c | +| ni30 | 204 | 51 | 2 | 1 | ov_SC03_012:0x8017d6b4; ov_SC03_012:0x8017d780 | +| ni31 | 204 | 51 | 2 | 1 | ov_SC05_008:0x801802ec; ov_SC05_008:0x80180698 | +| ni32 | 204 | 17 | 4 | 1 | ov_SC07_002:0x8017f004; ov_SC07_002:0x8017f184; ov_SC07_002:0x8017f2d8; ov_SC07_002:0x8017f418 | +| ni33 | 200 | 25 | 3 | 1 | ov_SC03_124:0x8017dfe4; ov_SC03_124:0x8017ebec; ov_SC03_124:0x8017ff64 | +| ni34 | 200 | 50 | 2 | 1 | ov_SC06_000:0x801816ac; ov_SC06_000:0x80181774 | +| ni35 | 196 | 49 | 2 | 1 | main:0x800145ec; main:0x800146b0 | +| ni36 | 196 | 49 | 2 | 1 | main:0x800167f0; main:0x80016978 | +| ni37 | 188 | 47 | 2 | 1 | ov_MAIN_012:0x8015dcb8; ov_MAIN_012:0x8015e018 | +| ni38 | 188 | 47 | 2 | 1 | ov_SC01_000:0x8015dcb8; ov_SC01_000:0x8015e018 | +| ni39 | 188 | 47 | 2 | 1 | ov_SC01_001:0x8015dcb8; ov_SC01_001:0x8015e018 | +| ni40 | 188 | 47 | 2 | 1 | ov_SC01_004:0x8015dcb8; ov_SC01_004:0x8015e018 | +| ni41 | 188 | 47 | 2 | 1 | ov_SC01_008:0x8015dcb8; ov_SC01_008:0x8015e018 | +| ni42 | 188 | 47 | 2 | 1 | ov_SC01_009:0x8015dcb8; ov_SC01_009:0x8015e018 | +| ni43 | 188 | 47 | 2 | 1 | ov_SC01_074:0x8015dcb8; ov_SC01_074:0x8015e018 | +| ni44 | 188 | 47 | 2 | 1 | ov_SC01_077:0x8015dcb8; ov_SC01_077:0x8015e018 | +| ni45 | 188 | 47 | 2 | 1 | ov_SC01_080:0x8015dcb8; ov_SC01_080:0x8015e018 | +| ni46 | 188 | 47 | 2 | 1 | ov_SC01_084:0x8015dcb8; ov_SC01_084:0x8015e018 | +| ni47 | 188 | 47 | 2 | 1 | ov_SC02_004:0x8015dcb8; ov_SC02_004:0x8015e018 | +| ni48 | 188 | 47 | 2 | 1 | ov_SC02_005:0x8015dcb8; ov_SC02_005:0x8015e018 | +| ni49 | 188 | 47 | 2 | 1 | ov_SC02_011:0x8015dcb8; ov_SC02_011:0x8015e018 | +| ni50 | 188 | 47 | 2 | 1 | ov_SC02_015:0x8015dcb8; ov_SC02_015:0x8015e018 | +| ni51 | 188 | 47 | 2 | 1 | ov_SC02_016:0x8015dcb8; ov_SC02_016:0x8015e018 | +| ni52 | 188 | 47 | 2 | 1 | ov_SC02_017:0x8015dcb8; ov_SC02_017:0x8015e018 | +| ni53 | 188 | 47 | 2 | 1 | ov_SC02_021:0x8015dcb8; ov_SC02_021:0x8015e018 | +| ni54 | 188 | 47 | 2 | 1 | ov_SC02_026:0x8015dcb8; ov_SC02_026:0x8015e018 | +| ni55 | 188 | 47 | 2 | 1 | ov_SC02_027:0x8015dcb8; ov_SC02_027:0x8015e018 | +| ni56 | 188 | 47 | 2 | 1 | ov_SC02_028:0x8015dcb8; ov_SC02_028:0x8015e018 | +| ni57 | 188 | 47 | 2 | 1 | ov_SC02_031:0x8015dcb8; ov_SC02_031:0x8015e018 | +| ni58 | 188 | 47 | 2 | 1 | ov_SC02_035:0x8015dcb8; ov_SC02_035:0x8015e018 | +| ni59 | 188 | 47 | 2 | 1 | ov_SC02_037:0x8015dcb8; ov_SC02_037:0x8015e018 | +| ni60 | 188 | 47 | 2 | 1 | ov_SC02_039:0x8015dcb8; ov_SC02_039:0x8015e018 | +| ni61 | 188 | 47 | 2 | 1 | ov_SC02_041:0x8015dcb8; ov_SC02_041:0x8015e018 | +| ni62 | 188 | 47 | 2 | 1 | ov_SC03_001:0x8015dcb8; ov_SC03_001:0x8015e018 | +| ni63 | 188 | 47 | 2 | 1 | ov_SC03_002:0x8015dcb8; ov_SC03_002:0x8015e018 | +| ni64 | 188 | 47 | 2 | 1 | ov_SC03_003:0x8015dcb8; ov_SC03_003:0x8015e018 | +| ni65 | 188 | 47 | 2 | 1 | ov_SC03_006:0x8015dcb8; ov_SC03_006:0x8015e018 | +| ni66 | 188 | 47 | 2 | 1 | ov_SC03_007:0x8015dcb8; ov_SC03_007:0x8015e018 | +| ni67 | 188 | 47 | 2 | 1 | ov_SC03_010:0x8015dcb8; ov_SC03_010:0x8015e018 | +| ni68 | 188 | 47 | 2 | 1 | ov_SC03_011:0x8015dcb8; ov_SC03_011:0x8015e018 | +| ni69 | 188 | 47 | 2 | 1 | ov_SC03_012:0x8015dcb8; ov_SC03_012:0x8015e018 | +| ni70 | 188 | 47 | 2 | 1 | ov_SC03_013:0x8015dcb8; ov_SC03_013:0x8015e018 | +| ni71 | 188 | 47 | 2 | 1 | ov_SC03_023:0x8015dcb8; ov_SC03_023:0x8015e018 | +| ni72 | 188 | 47 | 2 | 1 | ov_SC03_024:0x8015dcb8; ov_SC03_024:0x8015e018 | +| ni73 | 188 | 47 | 2 | 1 | ov_SC03_028:0x8015dcb8; ov_SC03_028:0x8015e018 | +| ni74 | 188 | 47 | 2 | 1 | ov_SC03_029:0x8015dcb8; ov_SC03_029:0x8015e018 | +| ni75 | 188 | 47 | 2 | 1 | ov_SC03_030:0x8015dcb8; ov_SC03_030:0x8015e018 | +| ni76 | 188 | 47 | 2 | 1 | ov_SC03_031:0x8015dcb8; ov_SC03_031:0x8015e018 | +| ni77 | 188 | 47 | 2 | 1 | ov_SC03_089:0x8015dcb8; ov_SC03_089:0x8015e018 | +| ni78 | 188 | 47 | 2 | 1 | ov_SC03_090:0x8015dcb8; ov_SC03_090:0x8015e018 | +| ni79 | 188 | 47 | 2 | 1 | ov_SC03_091:0x8015dcb8; ov_SC03_091:0x8015e018 | +| ni80 | 188 | 47 | 2 | 1 | ov_SC03_092:0x8015dcb8; ov_SC03_092:0x8015e018 | +| ni81 | 188 | 47 | 2 | 1 | ov_SC03_093:0x8015dcb8; ov_SC03_093:0x8015e018 | +| ni82 | 188 | 47 | 2 | 1 | ov_SC03_094:0x8015dcb8; ov_SC03_094:0x8015e018 | +| ni83 | 188 | 47 | 2 | 1 | ov_SC03_095:0x8015dcb8; ov_SC03_095:0x8015e018 | +| ni84 | 188 | 47 | 2 | 1 | ov_SC03_096:0x8015dcb8; ov_SC03_096:0x8015e018 | +| ni85 | 188 | 47 | 2 | 1 | ov_SC03_097:0x8015dcb8; ov_SC03_097:0x8015e018 | +| ni86 | 188 | 47 | 2 | 1 | ov_SC03_098:0x8015dcb8; ov_SC03_098:0x8015e018 | +| ni87 | 188 | 47 | 2 | 1 | ov_SC03_099:0x8015dcb8; ov_SC03_099:0x8015e018 | +| ni88 | 188 | 47 | 2 | 1 | ov_SC03_100:0x8015dcb8; ov_SC03_100:0x8015e018 | +| ni89 | 188 | 47 | 2 | 1 | ov_SC03_101:0x8015dcb8; ov_SC03_101:0x8015e018 | +| ni90 | 188 | 47 | 2 | 1 | ov_SC03_102:0x8015dcb8; ov_SC03_102:0x8015e018 | +| ni91 | 188 | 47 | 2 | 1 | ov_SC03_103:0x8015dcb8; ov_SC03_103:0x8015e018 | +| ni92 | 188 | 47 | 2 | 1 | ov_SC03_104:0x8015dcb8; ov_SC03_104:0x8015e018 | +| ni93 | 188 | 47 | 2 | 1 | ov_SC03_105:0x8015dcb8; ov_SC03_105:0x8015e018 | +| ni94 | 188 | 47 | 2 | 1 | ov_SC03_107:0x8015dcb8; ov_SC03_107:0x8015e018 | +| ni95 | 188 | 47 | 2 | 1 | ov_SC03_108:0x8015dcb8; ov_SC03_108:0x8015e018 | +| ni96 | 188 | 47 | 2 | 1 | ov_SC03_109:0x8015dcb8; ov_SC03_109:0x8015e018 | +| ni97 | 188 | 47 | 2 | 1 | ov_SC03_110:0x8015dcb8; ov_SC03_110:0x8015e018 | +| ni98 | 188 | 47 | 2 | 1 | ov_SC03_111:0x8015dcb8; ov_SC03_111:0x8015e018 | +| ni99 | 188 | 47 | 2 | 1 | ov_SC03_112:0x8015dcb8; ov_SC03_112:0x8015e018 | +| ni100 | 188 | 47 | 2 | 1 | ov_SC03_113:0x8015dcb8; ov_SC03_113:0x8015e018 | +| ni101 | 188 | 47 | 2 | 1 | ov_SC03_114:0x8015dcb8; ov_SC03_114:0x8015e018 | +| ni102 | 188 | 47 | 2 | 1 | ov_SC03_115:0x8015dcb8; ov_SC03_115:0x8015e018 | +| ni103 | 188 | 47 | 2 | 1 | ov_SC03_116:0x8015dcb8; ov_SC03_116:0x8015e018 | +| ni104 | 188 | 47 | 2 | 1 | ov_SC03_117:0x8015dcb8; ov_SC03_117:0x8015e018 | +| ni105 | 188 | 47 | 2 | 1 | ov_SC03_121:0x8015dcb8; ov_SC03_121:0x8015e018 | +| ni106 | 188 | 47 | 2 | 1 | ov_SC03_124:0x8015dcb8; ov_SC03_124:0x8015e018 | +| ni107 | 188 | 47 | 2 | 1 | ov_SC03_125:0x8015dcb8; ov_SC03_125:0x8015e018 | +| ni108 | 188 | 47 | 2 | 1 | ov_SC04_000:0x8015dcb8; ov_SC04_000:0x8015e018 | +| ni109 | 188 | 47 | 2 | 1 | ov_SC04_002:0x8015dcb8; ov_SC04_002:0x8015e018 | +| ni110 | 188 | 47 | 2 | 1 | ov_SC04_003:0x8015dcb8; ov_SC04_003:0x8015e018 | +| ni111 | 188 | 47 | 2 | 1 | ov_SC04_004:0x8015dcb8; ov_SC04_004:0x8015e018 | +| ni112 | 188 | 47 | 2 | 1 | ov_SC04_005:0x8015dcb8; ov_SC04_005:0x8015e018 | +| ni113 | 188 | 47 | 2 | 1 | ov_SC04_006:0x8015dcb8; ov_SC04_006:0x8015e018 | +| ni114 | 188 | 47 | 2 | 1 | ov_SC04_007:0x8015dcb8; ov_SC04_007:0x8015e018 | +| ni115 | 188 | 47 | 2 | 1 | ov_SC04_009:0x8015dcb8; ov_SC04_009:0x8015e018 | +| ni116 | 188 | 47 | 2 | 1 | ov_SC04_010:0x8015dcb8; ov_SC04_010:0x8015e018 | +| ni117 | 188 | 47 | 2 | 1 | ov_SC04_011:0x8015dcb8; ov_SC04_011:0x8015e018 | +| ni118 | 188 | 47 | 2 | 1 | ov_SC04_012:0x8015dcb8; ov_SC04_012:0x8015e018 | +| ni119 | 188 | 47 | 2 | 1 | ov_SC04_015:0x8015dcb8; ov_SC04_015:0x8015e018 | +| ni120 | 188 | 47 | 2 | 1 | ov_SC04_016:0x8015dcb8; ov_SC04_016:0x8015e018 | +| ni121 | 188 | 47 | 2 | 1 | ov_SC04_020:0x8015dcb8; ov_SC04_020:0x8015e018 | +| ni122 | 188 | 47 | 2 | 1 | ov_SC05_000:0x8015dcb8; ov_SC05_000:0x8015e018 | +| ni123 | 188 | 47 | 2 | 1 | ov_SC05_001:0x8015dcb8; ov_SC05_001:0x8015e018 | +| ni124 | 188 | 47 | 2 | 1 | ov_SC05_002:0x8015dcb8; ov_SC05_002:0x8015e018 | +| ni125 | 188 | 47 | 2 | 1 | ov_SC05_003:0x8015dcb8; ov_SC05_003:0x8015e018 | +| ni126 | 188 | 47 | 2 | 1 | ov_SC05_004:0x8015dcb8; ov_SC05_004:0x8015e018 | +| ni127 | 188 | 47 | 2 | 1 | ov_SC05_005:0x8015dcb8; ov_SC05_005:0x8015e018 | +| ni128 | 188 | 47 | 2 | 1 | ov_SC05_006:0x8015dcb8; ov_SC05_006:0x8015e018 | +| ni129 | 188 | 47 | 2 | 1 | ov_SC05_007:0x8015dcb8; ov_SC05_007:0x8015e018 | +| ni130 | 188 | 47 | 2 | 1 | ov_SC05_008:0x8015dcb8; ov_SC05_008:0x8015e018 | +| ni131 | 188 | 47 | 2 | 1 | ov_SC05_008:0x80180230; ov_SC05_008:0x801805dc | +| ni132 | 188 | 47 | 2 | 1 | ov_SC05_010:0x8015dcb8; ov_SC05_010:0x8015e018 | +| ni133 | 188 | 47 | 2 | 1 | ov_SC05_011:0x8015dcb8; ov_SC05_011:0x8015e018 | +| ni134 | 188 | 47 | 2 | 1 | ov_SC05_017:0x8015dcb8; ov_SC05_017:0x8015e018 | +| ni135 | 188 | 47 | 2 | 1 | ov_SC05_018:0x8015dcb8; ov_SC05_018:0x8015e018 | +| ni136 | 188 | 47 | 2 | 1 | ov_SC06_000:0x8015dcb8; ov_SC06_000:0x8015e018 | +| ni137 | 188 | 47 | 2 | 1 | ov_SC06_006:0x8015dcb8; ov_SC06_006:0x8015e018 | +| ni138 | 188 | 47 | 2 | 1 | ov_SC06_008:0x8015dcb8; ov_SC06_008:0x8015e018 | +| ni139 | 188 | 47 | 2 | 1 | ov_SC06_010:0x8015dcb8; ov_SC06_010:0x8015e018 | +| ni140 | 188 | 47 | 2 | 1 | ov_SC06_011:0x8015dcb8; ov_SC06_011:0x8015e018 | +| ni141 | 188 | 47 | 2 | 1 | ov_SC06_013:0x8015dcb8; ov_SC06_013:0x8015e018 | +| ni142 | 188 | 47 | 2 | 1 | ov_SC06_014:0x8015dcb8; ov_SC06_014:0x8015e018 | +| ni143 | 188 | 47 | 2 | 1 | ov_SC06_015:0x8015dcb8; ov_SC06_015:0x8015e018 | +| ni144 | 188 | 47 | 2 | 1 | ov_SC06_016:0x8015dcb8; ov_SC06_016:0x8015e018 | +| ni145 | 188 | 47 | 2 | 1 | ov_SC06_018:0x8015dcb8; ov_SC06_018:0x8015e018 | +| ni146 | 188 | 47 | 2 | 1 | ov_SC06_020:0x8015dcb8; ov_SC06_020:0x8015e018 | +| ni147 | 188 | 47 | 2 | 1 | ov_SC06_022:0x8015dcb8; ov_SC06_022:0x8015e018 | +| ni148 | 188 | 47 | 2 | 1 | ov_SC06_024:0x8015dcb8; ov_SC06_024:0x8015e018 | +| ni149 | 188 | 47 | 2 | 1 | ov_SC06_025:0x8015dcb8; ov_SC06_025:0x8015e018 | +| ni150 | 188 | 47 | 2 | 1 | ov_SC06_027:0x8015dcb8; ov_SC06_027:0x8015e018 | +| ni151 | 188 | 47 | 2 | 1 | ov_SC06_029:0x8015dcb8; ov_SC06_029:0x8015e018 | +| ni152 | 188 | 47 | 2 | 1 | ov_SC06_030:0x8015dcb8; ov_SC06_030:0x8015e018 | +| ni153 | 188 | 47 | 2 | 1 | ov_SC06_032:0x8015dcb8; ov_SC06_032:0x8015e018 | +| ni154 | 188 | 47 | 2 | 1 | ov_SC06_033:0x8015dcb8; ov_SC06_033:0x8015e018 | +| ni155 | 188 | 47 | 2 | 1 | ov_SC07_000:0x8015dcb8; ov_SC07_000:0x8015e018 | +| ni156 | 188 | 47 | 2 | 1 | ov_SC07_001:0x8015dcb8; ov_SC07_001:0x8015e018 | +| ni157 | 188 | 47 | 2 | 1 | ov_SC07_002:0x8015dcb8; ov_SC07_002:0x8015e018 | +| ni158 | 188 | 47 | 2 | 1 | ov_SC07_006:0x8015dcb8; ov_SC07_006:0x8015e018 | +| ni159 | 188 | 47 | 2 | 1 | ov_SC07_007:0x8015dcb8; ov_SC07_007:0x8015e018 | +| ni160 | 188 | 47 | 2 | 1 | ov_SC07_008:0x8015dcb8; ov_SC07_008:0x8015e018 | +| ni161 | 188 | 47 | 2 | 1 | ov_SC07_009:0x8015dcb8; ov_SC07_009:0x8015e018 | +| ni162 | 188 | 47 | 2 | 1 | ov_SC07_010:0x8015dcb8; ov_SC07_010:0x8015e018 | +| ni163 | 188 | 47 | 2 | 1 | ov_SC07_011:0x8015dcb8; ov_SC07_011:0x8015e018 | +| ni164 | 184 | 23 | 3 | 1 | ov_SC01_001:0x8017fdac; ov_SC01_001:0x801803e0; ov_SC01_001:0x80180e90 | +| ni165 | 176 | 44 | 2 | 1 | ov_MAIN_012:0x8015dbd4; ov_MAIN_012:0x8015df34 | +| ni166 | 176 | 44 | 2 | 1 | ov_SC01_000:0x8015dbd4; ov_SC01_000:0x8015df34 | +| ni167 | 176 | 44 | 2 | 1 | ov_SC01_001:0x8015dbd4; ov_SC01_001:0x8015df34 | +| ni168 | 176 | 44 | 2 | 1 | ov_SC01_004:0x8015dbd4; ov_SC01_004:0x8015df34 | +| ni169 | 176 | 44 | 2 | 1 | ov_SC01_008:0x8015dbd4; ov_SC01_008:0x8015df34 | +| ni170 | 176 | 44 | 2 | 1 | ov_SC01_009:0x8015dbd4; ov_SC01_009:0x8015df34 | +| ni171 | 176 | 44 | 2 | 1 | ov_SC01_074:0x8015dbd4; ov_SC01_074:0x8015df34 | +| ni172 | 176 | 44 | 2 | 1 | ov_SC01_077:0x8015dbd4; ov_SC01_077:0x8015df34 | +| ni173 | 176 | 44 | 2 | 1 | ov_SC01_080:0x8015dbd4; ov_SC01_080:0x8015df34 | +| ni174 | 176 | 44 | 2 | 1 | ov_SC01_084:0x8015dbd4; ov_SC01_084:0x8015df34 | +| ni175 | 176 | 44 | 2 | 1 | ov_SC02_004:0x8015dbd4; ov_SC02_004:0x8015df34 | +| ni176 | 176 | 44 | 2 | 1 | ov_SC02_005:0x8015dbd4; ov_SC02_005:0x8015df34 | +| ni177 | 176 | 44 | 2 | 1 | ov_SC02_011:0x8015dbd4; ov_SC02_011:0x8015df34 | +| ni178 | 176 | 44 | 2 | 1 | ov_SC02_015:0x8015dbd4; ov_SC02_015:0x8015df34 | +| ni179 | 176 | 44 | 2 | 1 | ov_SC02_016:0x8015dbd4; ov_SC02_016:0x8015df34 | +| ni180 | 176 | 44 | 2 | 1 | ov_SC02_017:0x8015dbd4; ov_SC02_017:0x8015df34 | +| ni181 | 176 | 44 | 2 | 1 | ov_SC02_021:0x8015dbd4; ov_SC02_021:0x8015df34 | +| ni182 | 176 | 44 | 2 | 1 | ov_SC02_026:0x8015dbd4; ov_SC02_026:0x8015df34 | +| ni183 | 176 | 44 | 2 | 1 | ov_SC02_027:0x8015dbd4; ov_SC02_027:0x8015df34 | +| ni184 | 176 | 44 | 2 | 1 | ov_SC02_028:0x8015dbd4; ov_SC02_028:0x8015df34 | +| ni185 | 176 | 44 | 2 | 1 | ov_SC02_031:0x8015dbd4; ov_SC02_031:0x8015df34 | +| ni186 | 176 | 44 | 2 | 1 | ov_SC02_035:0x8015dbd4; ov_SC02_035:0x8015df34 | +| ni187 | 176 | 44 | 2 | 1 | ov_SC02_037:0x8015dbd4; ov_SC02_037:0x8015df34 | +| ni188 | 176 | 44 | 2 | 1 | ov_SC02_039:0x8015dbd4; ov_SC02_039:0x8015df34 | +| ni189 | 176 | 44 | 2 | 1 | ov_SC02_041:0x8015dbd4; ov_SC02_041:0x8015df34 | +| ni190 | 176 | 44 | 2 | 1 | ov_SC03_001:0x8015dbd4; ov_SC03_001:0x8015df34 | +| ni191 | 176 | 44 | 2 | 1 | ov_SC03_002:0x8015dbd4; ov_SC03_002:0x8015df34 | +| ni192 | 176 | 44 | 2 | 1 | ov_SC03_003:0x8015dbd4; ov_SC03_003:0x8015df34 | +| ni193 | 176 | 44 | 2 | 1 | ov_SC03_006:0x8015dbd4; ov_SC03_006:0x8015df34 | +| ni194 | 176 | 44 | 2 | 1 | ov_SC03_007:0x8015dbd4; ov_SC03_007:0x8015df34 | +| ni195 | 176 | 44 | 2 | 1 | ov_SC03_010:0x8015dbd4; ov_SC03_010:0x8015df34 | +| ni196 | 176 | 44 | 2 | 1 | ov_SC03_011:0x8015dbd4; ov_SC03_011:0x8015df34 | +| ni197 | 176 | 44 | 2 | 1 | ov_SC03_012:0x8015dbd4; ov_SC03_012:0x8015df34 | +| ni198 | 176 | 44 | 2 | 1 | ov_SC03_013:0x8015dbd4; ov_SC03_013:0x8015df34 | +| ni199 | 176 | 44 | 2 | 1 | ov_SC03_023:0x8015dbd4; ov_SC03_023:0x8015df34 | diff --git a/docs/duplicates.md b/docs/duplicates.md index 6867cae8b7..b71df0dd66 100644 --- a/docs/duplicates.md +++ b/docs/duplicates.md @@ -1,88 +1,63 @@ # EXE-wide duplicate function groups (generated by tools/dup_report.py) -# sig: .run/sig.SLUS_007.26.jsonl sha1=46c735b8d1f514a95f8a2ba061cccf291f45a631 (2205 funcs, 1393 with nins>=8) +# sig: .run/sig.main.jsonl sha1=8bcb8eb2f6e3dc4562b39a6be9a0721bf0215fb3 (809 funcs, 718 with nins>=8) # Match the representative once -> share the body to the duplicates (h_exact = guaranteed # byte-match; h_norm = same source, re-point any single address constant). -## h_exact (byte-identical) — nins>=8: 14 groups, 15 redundant (collapsible) +## h_exact (byte-identical) — nins>=8: 8 groups, 8 redundant (collapsible) | score | nins | count | representative | duplicates | |---|---|---|---|---| -| 66 | 33 | 2 | FUN_8001c044 (0x8001c044) | 0x8001c0c8 | -| 33 | 11 | 3 | SYS_OBJ_538 (0x80043948) | 0x80060904 0x80060bc0 | -| 28 | 14 | 2 | FUN_80014cf8 (0x80014cf8) | 0x80014dec | -| 22 | 11 | 2 | FUN_80013f3c (0x80013f3c) | 0x80017d98 | -| 22 | 11 | 2 | FUN_80014c28 (0x80014c28) | 0x80014dc0 | -| 20 | 10 | 2 | TOC_OBJ_220 (0x800432d8) | 0x80045918 | -| 20 | 10 | 2 | def_cbready (0x800433c0) | 0x800433e8 | -| 18 | 9 | 2 | FUN_80014070 (0x80014070) | 0x80015a2c | -| 18 | 9 | 2 | FUN_80014094 (0x80014094) | 0x80015a50 | -| 18 | 9 | 2 | FUN_8001599c (0x8001599c) | 0x800159c0 | -| 18 | 9 | 2 | FUN_80037004 (0x80037004) | 0x80037334 | -| 18 | 9 | 2 | VS_VTBP_OBJ_13C (0x80042290) | 0x800459c4 | -| 18 | 9 | 2 | ISO9660_OBJ_2A8 (0x8004561c) | 0x8005b660 | -| 16 | 8 | 2 | S_M_M_OBJ_2A8 (0x80042134) | 0x8005ba70 | +| 66 | 33 | 2 | func_8001c044 (0x8001c044) | 0x8001c0c8 | +| 28 | 14 | 2 | func_80014cf8 (0x80014cf8) | 0x80014dec | +| 22 | 11 | 2 | func_80013f3c (0x80013f3c) | 0x80017d98 | +| 22 | 11 | 2 | func_80014c28 (0x80014c28) | 0x80014dc0 | +| 18 | 9 | 2 | func_80014070 (0x80014070) | 0x80015a2c | +| 18 | 9 | 2 | func_80014094 (0x80014094) | 0x80015a50 | +| 18 | 9 | 2 | func_8001599c (0x8001599c) | 0x800159c0 | +| 18 | 9 | 2 | func_80037004 (0x80037004) | 0x80037334 | -## h_norm (structural) — nins>=8: 61 groups, 91 redundant (collapsible) +## h_norm (structural) — nins>=8: 42 groups, 68 redundant (collapsible) | score | nins | count | representative | duplicates | |---|---|---|---|---| -| 375 | 125 | 3 | GS_133_OBJ_30 (0x80054544) | 0x80054808 0x80054ae4 | -| 154 | 77 | 2 | _card_read_data (0x800604c4) | 0x800606d4 | -| 116 | 58 | 2 | FUN_8001382c (0x8001382c) | 0x800139c8 | -| 114 | 57 | 2 | FUN_800134fc (0x800134fc) | 0x80013694 | -| 114 | 57 | 2 | FUN_80013b64 (0x80013b64) | 0x80013cfc | -| 98 | 49 | 2 | FUN_800167f0 (0x800167f0) | 0x80016978 | -| 80 | 8 | 10 | FUN_80014128 (0x80014128) | 0x80014148 0x80016a5c 0x80017274 0x800173bc 0x800174fc 0x8001a9d8 0x8003d630 0x8005d0d8 0x8005d118 | -| 76 | 19 | 4 | FUN_8002a1b4 (0x8002a1b4) | 0x8002a400 0x8002a670 0x8002a8e0 | -| 74 | 37 | 2 | FUN_80011818 (0x80011818) | 0x80011b7c | -| 72 | 36 | 2 | FUN_800623a4 (0x800623a4) | 0x80062434 | -| 70 | 35 | 2 | LIBMCRD_OBJ_DD0 (0x80060a38) | 0x80060cf4 | -| 64 | 8 | 8 | FUN_80027bf0 (0x80027bf0) | 0x8002eeb8 0x8002fdc8 0x80046610 0x80053308 0x8005d0f8 0x8005fc98 0x80061a80 | -| 64 | 32 | 2 | FUN_80031e94 (0x80031e94) | 0x80031fc8 | -| 62 | 31 | 2 | FUN_80029b4c (0x80029b4c) | 0x80029bc8 | -| 56 | 28 | 2 | VM_NOWON_OBJ_1C0 (0x80040af8) | 0x80040b68 | -| 54 | 27 | 2 | FUN_8002eff8 (0x8002eff8) | 0x8002f064 | -| 52 | 13 | 4 | FUN_8002a200 (0x8002a200) | 0x8002a44c 0x8002a6bc 0x8002a92c | -| 50 | 10 | 5 | FUN_80013200 (0x80013200) | 0x80013294 0x80013328 0x800133bc 0x80013450 | -| 50 | 25 | 2 | RotMatrixX (0x80049f3c) | 0x8004a27c | -| 48 | 24 | 2 | FUN_80012e0c (0x80012e0c) | 0x80012fc8 | -| 44 | 22 | 2 | FUN_8001534c (0x8001534c) | 0x800153cc | -| 42 | 21 | 2 | FUN_80012b04 (0x80012b04) | 0x80012cb8 | -| 40 | 20 | 2 | OBJT2_OBJ_69C (0x80057730) | 0x800577d4 | -| 38 | 19 | 2 | FUN_80012c6c (0x80012c6c) | 0x800130d0 | -| 38 | 19 | 2 | S_M_UTIL_OBJ_2C (0x8003b37c) | 0x8003b408 | -| 36 | 18 | 2 | PRESET2_OBJ_550 (0x80056290) | 0x80056324 | -| 33 | 11 | 3 | SYS_OBJ_538 (0x80043948) | 0x80060904 0x80060bc0 | -| 32 | 8 | 4 | FUN_80016a3c (0x80016a3c) | 0x80017254 0x8001739c 0x800174dc | -| 32 | 16 | 2 | SYS_OBJ_1964 (0x8005ab98) | 0x8005ac64 | -| 32 | 16 | 2 | _card_read_file (0x80060930) | 0x80060bec | -| 32 | 16 | 2 | LIBMCRD_OBJ_D2C (0x80060994) | 0x80060c50 | -| 30 | 10 | 3 | FUN_8002ee90 (0x8002ee90) | 0x8002efd0 0x80062360 | -| 28 | 14 | 2 | FUN_80014cf8 (0x80014cf8) | 0x80014dec | -| 28 | 14 | 2 | FUN_800167b8 (0x800167b8) | 0x80016940 | -| 28 | 14 | 2 | FUN_80017df8 (0x80017df8) | 0x80017e30 | -| 28 | 14 | 2 | PRESET2_OBJ_AF0 (0x80056830) | 0x800568a8 | -| 28 | 14 | 2 | SYS_OBJ_1FF4 (0x8005b228) | 0x8005b460 | -| 27 | 9 | 3 | FUN_80016eb0 (0x80016eb0) | 0x800176f0 0x800178c8 | -| 27 | 9 | 3 | FUN_80016ed4 (0x80016ed4) | 0x80017714 0x800178ec | -| 26 | 13 | 2 | SYS_OBJ_19A4 (0x8005abd8) | 0x8005aca4 | -| 26 | 13 | 2 | LIBMCRD_OBJ_D9C (0x80060a04) | 0x80060cc0 | -| 24 | 12 | 2 | FUN_8001096c (0x8001096c) | 0x80011320 | -| 24 | 8 | 3 | FUN_80016ef8 (0x80016ef8) | 0x80017758 0x80017910 | -| 24 | 8 | 3 | SsUtReverbOff (0x800285ac) | 0x8003a424 0x8003d96c | -| 24 | 12 | 2 | LIBMCRD_OBJ_D6C (0x800609d4) | 0x80060c90 | -| 22 | 11 | 2 | FUN_80013f3c (0x80013f3c) | 0x80017d98 | -| 22 | 11 | 2 | PRESET2_OBJ_4FC (0x8005623c) | 0x8005636c | -| 22 | 11 | 2 | PRESET2_OBJ_AA8 (0x800567e8) | 0x800568e0 | -| 22 | 11 | 2 | OBJT2_OBJ_640 (0x800576d4) | 0x80057824 | -| 20 | 10 | 2 | VM_NO1_OBJ_264 (0x80040608) | 0x80040bd8 | -| 20 | 10 | 2 | TOC_OBJ_220 (0x800432d8) | 0x80045918 | -| 20 | 10 | 2 | def_cbready (0x800433c0) | 0x800433e8 | -| 18 | 9 | 2 | FUN_80014070 (0x80014070) | 0x80015a2c | -| 18 | 9 | 2 | FUN_80014094 (0x80014094) | 0x80015a50 | -| 18 | 9 | 2 | FUN_8001599c (0x8001599c) | 0x800159c0 | -| 18 | 9 | 2 | FUN_8001cfb8 (0x8001cfb8) | 0x8001d050 | -| 18 | 9 | 2 | FUN_80037004 (0x80037004) | 0x80037334 | -| 18 | 9 | 2 | VS_VTBP_OBJ_13C (0x80042290) | 0x800459c4 | -| 18 | 9 | 2 | ISO9660_OBJ_2A8 (0x8004561c) | 0x8005b660 | -| 18 | 9 | 2 | LIBMCRD_OBJ_D08 (0x80060970) | 0x80060c2c | -| 16 | 8 | 2 | S_M_M_OBJ_2A8 (0x80042134) | 0x8005ba70 | +| 206 | 103 | 2 | func_8001382c (0x8001382c) | 0x800139c8 | +| 204 | 102 | 2 | func_800134fc (0x800134fc) | 0x80013694 | +| 204 | 102 | 2 | func_80013b64 (0x80013b64) | 0x80013cfc | +| 172 | 43 | 4 | func_8002a108 (0x8002a108) | 0x8002a354 0x8002a5c4 0x8002a834 | +| 98 | 49 | 2 | func_800145ec (0x800145ec) | 0x800146b0 | +| 98 | 49 | 2 | func_800167f0 (0x800167f0) | 0x80016978 | +| 88 | 8 | 11 | func_80014128 (0x80014128) | 0x80014148 0x80016a5c 0x80017274 0x800173bc 0x800174fc 0x8001a9d8 0x80027bf0 0x8002eeb8 0x8002fdc8 0x8003d630 | +| 76 | 19 | 4 | func_8002a1b4 (0x8002a1b4) | 0x8002a400 0x8002a670 0x8002a8e0 | +| 66 | 33 | 2 | func_8001c044 (0x8001c044) | 0x8001c0c8 | +| 64 | 32 | 2 | func_80031e94 (0x80031e94) | 0x80031fc8 | +| 62 | 31 | 2 | func_80029b4c (0x80029b4c) | 0x80029bc8 | +| 60 | 30 | 2 | func_800110cc (0x800110cc) | 0x80011144 | +| 56 | 14 | 4 | func_8002a234 (0x8002a234) | 0x8002a480 0x8002a6f0 0x8002a960 | +| 54 | 27 | 2 | func_8002eff8 (0x8002eff8) | 0x8002f064 | +| 52 | 13 | 4 | func_8002a200 (0x8002a200) | 0x8002a44c 0x8002a6bc 0x8002a92c | +| 50 | 10 | 5 | func_80013200 (0x80013200) | 0x80013294 0x80013328 0x800133bc 0x80013450 | +| 48 | 24 | 2 | func_80012e0c (0x80012e0c) | 0x80012fc8 | +| 44 | 22 | 2 | func_8001534c (0x8001534c) | 0x800153cc | +| 42 | 21 | 2 | func_80012b04 (0x80012b04) | 0x80012cb8 | +| 38 | 19 | 2 | func_80012c6c (0x80012c6c) | 0x800130d0 | +| 36 | 12 | 3 | func_80010b10 (0x80010b10) | 0x80011350 0x80011df4 | +| 32 | 8 | 4 | func_80016a3c (0x80016a3c) | 0x80017254 0x8001739c 0x800174dc | +| 28 | 14 | 2 | func_80014cf8 (0x80014cf8) | 0x80014dec | +| 28 | 14 | 2 | func_800167b8 (0x800167b8) | 0x80016940 | +| 28 | 14 | 2 | func_80017df8 (0x80017df8) | 0x80017e30 | +| 27 | 9 | 3 | func_80016eb0 (0x80016eb0) | 0x800176f0 0x800178c8 | +| 27 | 9 | 3 | func_80016ed4 (0x80016ed4) | 0x80017714 0x800178ec | +| 24 | 12 | 2 | func_8001096c (0x8001096c) | 0x80011320 | +| 24 | 12 | 2 | func_80010ae0 (0x80010ae0) | 0x80011e84 | +| 24 | 8 | 3 | func_80016ef8 (0x80016ef8) | 0x80017758 0x80017910 | +| 24 | 12 | 2 | func_8001b23c (0x8001b23c) | 0x8001b394 | +| 22 | 11 | 2 | func_80013f3c (0x80013f3c) | 0x80017d98 | +| 22 | 11 | 2 | func_80014c28 (0x80014c28) | 0x80014dc0 | +| 20 | 10 | 2 | func_8002ee90 (0x8002ee90) | 0x8002efd0 | +| 20 | 10 | 2 | func_8002f620 (0x8002f620) | 0x8002fae0 | +| 18 | 9 | 2 | func_80014070 (0x80014070) | 0x80015a2c | +| 18 | 9 | 2 | func_80014094 (0x80014094) | 0x80015a50 | +| 18 | 9 | 2 | func_8001599c (0x8001599c) | 0x800159c0 | +| 18 | 9 | 2 | func_8001cfb8 (0x8001cfb8) | 0x8001d050 | +| 18 | 9 | 2 | func_80037004 (0x80037004) | 0x80037334 | +| 16 | 8 | 2 | func_8001bfb0 (0x8001bfb0) | 0x8002955c | +| 16 | 8 | 2 | func_800285ac (0x800285ac) | 0x8003a424 | diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index 81124acaf0..d95544cd8e 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -5,9 +5,9 @@ # THREE progress metrics (all matter — see the labels): FLEET fn-count byte-ident: 363214 / 363214 = 100.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) -FLEET instr-weighted : 13488497 / 13488497 = 100.0% (shipped .text across main + resident + 216 overlays; the decomp.dev-DISPLAY number) -FLEET distinct-code(uniq): 5816589 / 5816589 = 100.0% (90984/90984 unique fns; the DISTINCT-RE number) -MAIN game-code weighted : 41534 / 41534 = 100.0% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 1 explained pad-tail) +FLEET instr-weighted : 13492113 / 13492113 = 100.0% (shipped .text across main + resident + 216 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 5820205 / 5820205 = 100.0% (90984/90984 unique fns; the DISTINCT-RE number) +MAIN game-code weighted : 45150 / 45150 = 100.0% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; build-derived sig (make sig-main) dated 2026-09-06; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 0 pad-tail) (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13446963 / 13446963 = 100.0%) FLEET REAL substantive : 360737 (of which dedup-shared 255632 via 2220 groups / 255708 instances) diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 2cd9ef9667..86df7ead17 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -44,9 +44,9 @@ R20's new home = the Ghidra text export (`config/ghidra/*.jsonl`) + `ghidra_rebu one-time snapshot, `CLAUDE.md` gains "never `git clean -x`" (R20 amendment proposed at the PhaseEnd). ## Tasks (strict order; one commit per task after this file is updated; harness task list = the same 41 items, R28) -- [ ] **A1** Governance commit (R65–R73 in DIGEST §3; this file; the harness list) — xHigh -- [ ] **A2** Reporting-instrument fixes (pad-tail literal → derived; backlog LINKED-aware prune; `sig-main` ELF-seeded + - `progress.py` loud-fail) — xHigh, R39 controls +- [x] **A1** Governance commit (R65–R73 in DIGEST §3; this file; the harness list) — xHigh — `commit:4012` +- [x] **A2** Reporting-instrument fixes (pad-tail literal → derived; backlog LINKED-aware prune; `sig-main` build-derived + + `progress.py` loud-fail) — xHigh, R39 controls — see Log 2026-09-06 A2 - [ ] **A3** `NO_SDK` knob + `make sdk-dual` (+ tools-health wiring, `[skip]` without SDK dirs) — Max - [ ] **A4** `tools/family_hseq.py` regen — Low - [ ] **B1** `make disc-extract` (extract.py `--expect-manifest` / `--allow-missing-audio`; check-env; `.gitignore` @@ -96,20 +96,38 @@ Mid-phase rules check after every 4 completed tasks (P6). Commit banked artifact (every blob on every ref; the Ghidra DB proven to embed the EXE bytes under the page XOR mask; 28/28 RAM dumps carry the EXE's code; no secrets in tree, history diffs or the 1.27 GB transcript archive); Drew's decisions 1–11 (above); three read-only exploration agents + three design agents; the plan approved via plan mode. No repo change before A1. +- **2026-09-06 (S86) — A1** `commit:4012`: R65–R73 appended to DIGEST §3; this file opened with the plan verbatim; 41 harness tasks. +- **2026-09-06 (S86) — A2 (reporting instruments).** `make sig-main` REWRITTEN: `tools/main_seed_ends.py` derives main's + game-code function boundaries from the build (link-map `.text` sections × each object's `nm` symbols; tiling asserted) and + `sig_image` hashes the original EXE bytes at them → `.run/sig.main.jsonl` (809 fns / 45,150 ins); wired into `tools-health` + and `report BINARY=main`; `progress.py` prefers it, falls back to the legacy Ghidra sig, and EXITS 1 with no sig (control: + both hidden → rc=1 + the message); the digest's oracle clause is derived live (`main_oracle_line`: "0 phantom, 0 truncated, + 0 pad-tail"); `backlog.linked_closed` retires main addresses inside LINKED ranges (controls 4/4; `backlog prune: 1 rows -> + 0`; `docs/backlog.md` 0 open); `dup_report` main sig → `.run/sig.main.jsonl`. **Measured correction (R14/R41):** the derived + sig tiles the 15 game-code objects' text EXACTLY (45,150 words, no overlaps, never shorter than Ghidra's), while the Ghidra + sig covered 41,522 words and left **3,628 words of real game code owned by no function** (switch tails after unresolved + jump tables, 52 two-to-four-ins thunks, and `SaveLoadRoutine` = the `case 0:` body inside `func_8002b0b4`) — so **MAIN + game-code weighted is 45,150 / 45,150**, not 41,534 (P31 S79's +22 was one instance of this class); fleet instr + 13,488,497 → **13,492,113**, distinct 5,816,589 → **5,820,205**, all still 100%. `make report BINARY=main` EXIT=0 + (`.run/P33/a2_report.log`: lint OK, dedup-check 2220/0); `make audit-digest` OK; `docs/duplicates*.md` regenerated + (main's table now game-code-only). SETUP §6.8 + a P33 A2 section (R21). -## 🛑 SESSION CHECKPOINT — PHASE 33 OPEN, GATE 1 APPROVED; NEXT = A1 commit, then A2 (2026-09-06, written by session bd19e14a "S86" at gate 1; SUPERSEDES nothing — first block of the phase) +## 🛑 SESSION CHECKPOINT — A1 ✓ A2 ✓; NEXT = A3 (the `NO_SDK` knob + `make sdk-dual`, Max) (2026-09-06, written by session bd19e14a "S86"; SUPERSEDES the gate-1 block) ### 0. How to use this block You are a FRESH SESSION that has read `PROJECT_CONTEXT.md`, `phase-ends/DIGEST.md`, `PhaseEnd_Phase30/31/32.md` and this file, and nothing else (R64). Replay this block verbatim, state phase / done / NEXT / effort, list the rules from the digest -(R1–R73), then WAIT for Drew. **NEXT = task A1 if its commit is not yet at HEAD (`git log -1 --format=%s` should read -`docs(phase-33): A1 …`); otherwise A2.** Effort for A1/A2: xHigh-class (Max, the session default, is fine). +(R1–R73), then WAIT for Drew. **NEXT = A3** (`NO_SDK` knob + `make sdk-dual`; Max — it touches main's link recipe, a wrong +knob is a false green). If `git log -1 --format=%s` does not start with `feat(phase-33): A2`, A2's commit did not land: re-run +its controls from the Log entry before committing. ### 1. Where we are **Phase 33 — 100% verification + the public flip + Gen2 exit.** Gate 1 approved 2026-09-06 (plan mode, Max). R65–R73 ratified at -gate 1 (DIGEST §3). Tasks done: NONE yet (A1 is the first commit of the phase). The approved plan is VERBATIM at the end of this -file — read its Blocks A–G for every task's files, commands and verification; the "Execution order and why" section is the -sequence; the "Honest scale" table is the budget (≈17–21 sessions; the flip precedes the writing so later items can be cut). +gate 1 (DIGEST §3). **Done: A1 (`commit:4012`), A2 (see the Log — the corrected main denominator 45,150 is now the published +number; `.run/sig.main.jsonl` is the sig main is weighed by; `tools/main_seed_ends.py` is new).** The approved plan is VERBATIM +at the end of this file — read its Blocks A–G for every task's files, commands and verification; the "Execution order and +why" section is the sequence; the "Honest scale" table is the budget (≈17–21 sessions; the flip precedes the writing so later +items can be cut). Harness tasks: #1 A1 done, #2 A2 done, #3 A3 next … #41 G2. ### 2. Facts measured this session that every task depends on (do not re-derive; verify if in doubt, R14) - **History:** `main` = 4,011 commits (HEAD `commit:4011`); `git rev-list --all` = 4,282 because the `S76-pre-scrub-backup` tag @@ -167,16 +185,28 @@ sequence; the "Honest scale" table is the budget (≈17–21 sessions; the flip `ign_branch_targets, objdump_command` after our pin and its MIPS symbol wildcard is `"." in field` (`scorer.py:66-67`). ### 3. NEXT — in order -0. **Preflight:** `git status --short | grep -v ghidra/` (empty) · `git log -1 --format='%h %s'` · `df -h ~` (13 GB free) · - `.venv/bin/python -c 'import splat'`. -1. **A1** (if not committed): `git add phase-ends/DIGEST.md phase-ends/CURRENT_PHASE.md && git commit -m "docs(phase-33): A1 - governance — R65–R73 ratified at gate 1 (DIGEST §3), CURRENT_PHASE.md opened with the approved plan + checkpoint"`. -2. **A2** per the plan's Block A (each fix with its known-true control; commit "feat(phase-33): A2 …"). -3. Then A3 → A4 → B1 … in the task order above. After every task: tick the box, add a Log line, refresh this checkpoint - block (the 🛑 block is the ONLY in-phase context the next session inherits), commit. +0. **Preflight:** `git status --short | grep -v ghidra/` (empty) · `git log -1 --format='%h %s'` · `df -h ~` (≈13 GB free) · + `.venv/bin/python -c 'import splat'` · `ls build/us/SLUS_007.26.map` (main is built; `make check BINARY=main` if not). +1. **A3** per the plan's Block A: `NO_SDK ?=` knob in the Makefile; the 11 `psyq_integrate` calls and the `-T` externals + fragments skipped when set; `sdk-dual` target (refuses without every SDK ELF dir — they exist on this machine: + `.run/obj40/{libcd,libetc,libgpu,libmcrd,libc2,libgte,libgs_used,snd_used}`, `.run/obj42/{apicard_used,libapi42,libpad421}` + — check with `ls`); runs `extract BINARY=main` between legs; asserts the WITH map contains `build/psyq/libcd/` and the NO-SDK + map contains `build/src/libcd1.o` and no `build/psyq/`; both legs == `config/check.us.sha`; add to `tools-health` after + `sig-main` with a `[skip]` when no SDK dirs exist. Gotcha: psyq_integrate rewrites `build/us/SLUS_007.26.ld` in place, and + `make extract BINARY=main` regenerates it and deletes main's objects (Makefile:706-712) — that is why the legs are separated + by an extract. After the NO-SDK leg, run `make check BINARY=main` once more WITHOUT `NO_SDK` so the tree's main build is + the WITH-SDK one again (the map is what `sig-main` reads; either leg gives the same game-code seeds). Commit + "feat(phase-33): A3 …" with a Log line + this block refreshed. +2. **A4** `.venv/bin/python tools/family_hseq.py` (clears the audit-binaries `[warn]`), commit. Then **B1** (Max). +3. After every task: tick the box, add a Log line, refresh this checkpoint block (the 🛑 block is the ONLY in-phase context + the next session inherits), commit. Mid-phase rules check after A4 (4 tasks done). ### 4. Files this session touched -`phase-ends/DIGEST.md` (R65–R73 appended to §3), `phase-ends/CURRENT_PHASE.md` (this file), `.run/public_audit/` (scratch). +A1: `phase-ends/DIGEST.md`, `phase-ends/CURRENT_PHASE.md`. A2: `tools/main_seed_ends.py` (new), `Makefile` (`sig-main` +rewritten; `tools-health` + `report` wiring), `tools/progress.py` (sig selection + SystemExit + `main_oracle_line` + the MAIN +header line), `tools/backlog.py` (`linked_closed`), `tools/dup_report.py` (main sig path), `docs/SETUP.md` (§6.8 + P33 A2 +section), regenerated `docs/progress.fleet.md`, `docs/duplicates.md`, `docs/duplicates.cross.md`, `docs/backlog.md`, +`.run/backlog.jsonl`. Scratch: `.run/public_audit/` (the history inventory), `.run/P33/a2_report.log`. The plan file: `~/.claude/plans/max-effort-set-plan-twinkling-moonbeam.md` (copied below). --- diff --git a/tools/backlog.py b/tools/backlog.py index 4e2039636c..2f99dcd58f 100644 --- a/tools/backlog.py +++ b/tools/backlog.py @@ -156,11 +156,33 @@ def _open_anywhere(nm): return key in _ANYWHERE_CACHE +_LINKED_RANGES = None + + +def linked_closed(binary, addr): + """True iff `addr` lies inside one of main's LINKED PsyQ subsegs (P33 A2, R33 — derived from the + Makefile's psyq_integrate stub lists + the splat yaml, exactly as progress.py weighs main). + + Such a function is byte-identical by LINK (a Sony object, or its INCLUDE_ASM fallback tile on a + machine without the SDK) — it is not decomp work, and corpus.stubs('main') still lists its + INCLUDE_ASM stub, so the "no longer an open stub" test alone can never retire it. That is how + the legacy row func_80062144 (inside apicard5, S70) survived every prune to the P32 close as the + tree's only "open near-miss" at 100%.""" + global _LINKED_RANGES + if binary != "main" or addr is None: + return False + if _LINKED_RANGES is None: + import progress + _LINKED_RANGES = progress._main_linked_ranges() + return any(lo <= addr < hi for lo, hi in _LINKED_RANGES) + + def load_best(): """Best (lowest closeness, latest ts) record per addr, restricted to fns still OPEN in their OWN binary (rec['binary']; legacy records default ov_SC01_077). Fleet-aware so a 077-matched-but- stuck-local fn surfaces via its overlay record — the grinder must SEE it to grind it (P9 honesty: - a fn banked in its own binary since logged is dropped).""" + a fn banked in its own binary since logged is dropped; a fn inside a LINKED PsyQ subseg is not + work at all and is dropped too — linked_closed, P33 A2).""" if not os.path.exists(JSONL): return [] _STUB_CACHE.clear() @@ -172,6 +194,8 @@ def load_best(): r = json.loads(line) nm = r.get("name") binary = r.get("binary") or _binary_of(r) or "ov_SC01_077" + if linked_closed(binary, addr_of(r)): + continue # a Sony object — byte-identical by link, not work # banked in ITS binary since logged -> drop (P9). Hex-case-canonical on BOTH sides (T0d): # corpus-derived names are upper-hex; a lower-hex record name must not silently drop (R32). if nm and nm.upper().replace("FUNC_", "func_") not in _open_stubs(binary): diff --git a/tools/dup_report.py b/tools/dup_report.py index 251ced6fa1..6595009c8f 100644 --- a/tools/dup_report.py +++ b/tools/dup_report.py @@ -24,7 +24,7 @@ ROOT = pathlib.Path(__file__).resolve().parent.parent # here, so a new overlay binary (Phase 13) joins the cross report automatically. The dict # insertion order is the report's deterministic source order (committable digests). BINARIES = { - "main": dict(sig=".run/sig.SLUS_007.26.jsonl", md="docs/duplicates.md"), + "main": dict(sig=".run/sig.main.jsonl", md="docs/duplicates.md"), # P33 A2: build-derived (make sig-main), was the Ghidra sig "resident": dict(sig=".run/sig.resident.jsonl", md="docs/duplicates.resident.md"), "ov_SC01_077": dict(sig=".run/sig.ov_SC01_077.jsonl", md="docs/duplicates.ov_SC01_077.md"), "ov_SC01_005": dict(sig=".run/sig.ov_SC01_005.jsonl", md="docs/duplicates.ov_SC01_005.md"), diff --git a/tools/main_seed_ends.py b/tools/main_seed_ends.py new file mode 100644 index 0000000000..e0c9a934c5 --- /dev/null +++ b/tools/main_seed_ends.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +"""main_seed_ends.py — the EXE's game-code function boundaries, DERIVED from the build (P33 A2, R33). + +Emits `0xVRAM NINS` per function (the two-column `--seeds` form tools/sig_image.py accepts, where a +seeded nins is authoritative) for every function in main's GAME-CODE objects: + + * the `.text` input sections of the link map (build/us/SLUS_007.26.map) give each object's vram + and size — the same map the byte-identical link wrote, so the numbers are the build's own; + * objects that are LINKED PsyQ subsegs (progress._main_linked_segs_from_makefile — the Makefile's + psyq_integrate stub lists, R33) or that live under build/psyq/ are skipped: Sony's objects are + outside the game-code denominator whether the machine linked the real SDK objects or the + INCLUDE_ASM fallback tiles; + * inside one object `.text` is contiguous code — the interleaved rodata islands and the linked + library blocks sit BETWEEN objects — so slicing at the object's own `nm` function symbols, with + the last function ending at the section size, is exact. No func_end heuristic, no Ghidra. + +Why this exists: main's only whole-EXE sig was Ghidra's (.run/sig.SLUS_007.26.jsonl, 2026-08-05), +which a public clone cannot regenerate and whose flow-derived boundary on FUN_80023bf0 is 22 ins +short (P31 S79: the corrected game-code denominator is 41,556, the digest printed 41,534). The old +`make sig-main` seeded from `corpus.py main --seed-ends` = the open STUB list, which is empty at +100% — a sig of nothing. + +Coverage assertions (R32 — a silent skip is a defect): every game-code `.text` section is +non-empty and 4-aligned, starts with a function symbol at offset 0, and its functions tile it +exactly; every object the map lists is either counted, LINKED-skipped, or psyq-skipped, and all +three counts are printed with the instruction totals (R41). Any object counted from outside +build/src/ is named, so an unexpected code source cannot slip in unnoticed (R14). +""" +import argparse +import pathlib +import re +import subprocess +import sys + +ROOT = pathlib.Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / "tools")) + +NM = "mipsel-linux-gnu-nm" +# gas emits these two at .text+0 for every gcc-2.7.2 TU; they are markers, not functions. +NOT_FUNCS = {"__gnu_compiled_c", "gcc2_compiled."} +MAP_TEXT = re.compile(r"^\s*\.text\s+(0x[0-9a-fA-F]+)\s+(0x[0-9a-fA-F]+)\s+(\S+\.o)\s*$") +MAP_TEXT_WRAPPED = re.compile(r"^\s*\.text\s*$") +MAP_CONT = re.compile(r"^\s+(0x[0-9a-fA-F]+)\s+(0x[0-9a-fA-F]+)\s+(\S+\.o)\s*$") + + +def text_sections(map_path): + """[(vram, size, obj_path)] for every `.text` input section in a GNU ld map. A long object + name makes ld wrap the record onto the next line; both forms are read.""" + out, lines = [], map_path.read_text(errors="replace").splitlines() + i = 0 + while i < len(lines): + m = MAP_TEXT.match(lines[i]) + if m: + out.append((int(m.group(1), 16), int(m.group(2), 16), m.group(3))) + elif MAP_TEXT_WRAPPED.match(lines[i]) and i + 1 < len(lines): + m2 = MAP_CONT.match(lines[i + 1]) + if m2: + out.append((int(m2.group(1), 16), int(m2.group(2), 16), m2.group(3))) + i += 1 + i += 1 + return out + + +def object_functions(obj_path): + """[(offset, name)] of the function symbols in an object's .text, sorted, one per offset.""" + res = subprocess.run([NM, "-n", "--defined-only", str(obj_path)], capture_output=True, text=True) + if res.returncode != 0: + sys.exit(f"main_seed_ends: {NM} failed on {obj_path}: {res.stderr.strip()}") + seen, funcs = set(), [] + for ln in res.stdout.splitlines(): + parts = ln.split() + if len(parts) != 3 or parts[1] not in ("T", "t"): + continue + off, name = int(parts[0], 16), parts[2] + if name in NOT_FUNCS or name.startswith((".L", "$L")): + continue + if off in seen: # an alias for the same entry — one function + continue + seen.add(off) + funcs.append((off, name)) + funcs.sort() + return funcs + + +def derive(map_path, repo): + import progress + linked = progress._main_linked_segs_from_makefile() + rows, n_linked, n_psyq, n_code, foreign = [], 0, 0, 0, [] + for vram, size, obj in text_sections(map_path): + if size == 0: + continue + stem = pathlib.Path(obj).stem + if obj.startswith("build/psyq/"): + n_psyq += 1 + continue + if stem in linked: + n_linked += 1 + continue + if size % 4: + sys.exit(f"main_seed_ends: {obj} .text size {size:#x} is not 4-aligned") + p = repo / obj + if not p.exists(): + sys.exit(f"main_seed_ends: {obj} listed in the map but absent on disk — rebuild main") + funcs = object_functions(p) + if not funcs or funcs[0][0] != 0: + sys.exit(f"main_seed_ends: {obj} .text does not start with a function symbol " + f"(first symbol at {funcs[0][0] if funcs else 'none'}) — bytes owned by no function") + if not obj.startswith("build/src/"): + foreign.append(obj) + n_code += 1 + for i, (off, name) in enumerate(funcs): + end = funcs[i + 1][0] if i + 1 < len(funcs) else size + if end <= off or (end - off) % 4: + sys.exit(f"main_seed_ends: {obj}:{name} bad extent {off:#x}..{end:#x}") + rows.append((vram + off, (end - off) // 4, name)) + rows.sort() + addrs = [a for a, _, _ in rows] + if len(set(addrs)) != len(addrs): + sys.exit("main_seed_ends: duplicate vram across objects — the map and the objects disagree") + return rows, n_code, n_linked, n_psyq, foreign + + +def main(): + ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) + ap.add_argument("--map", default="build/us/SLUS_007.26.map", help="the main link map") + ap.add_argument("--out", default=None, help="write `0xVRAM NINS` lines here (default: stdout)") + a = ap.parse_args() + map_path = pathlib.Path(a.map) + if not map_path.is_absolute(): + map_path = ROOT / map_path + if not map_path.exists(): + sys.exit(f"main_seed_ends: no link map at {map_path} — run `make check BINARY=main` first") + rows, n_code, n_linked, n_psyq, foreign = derive(map_path, ROOT) + text = "".join(f"0x{a:08X} {n}\n" for a, n, _ in rows) + if a.out: + pathlib.Path(a.out).write_text(text) + else: + sys.stdout.write(text) + tot = sum(n for _, n, _ in rows) + print(f"main_seed_ends: {len(rows)} functions / {tot} ins from {n_code} game-code objects " + f"(skipped {n_linked} LINKED subseg objects + {n_psyq} build/psyq objects)" + + (f"; NOTE code counted from outside build/src/: {', '.join(foreign)}" if foreign else ""), + file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/tools/progress.py b/tools/progress.py index 71456ef479..b4478eaef9 100644 --- a/tools/progress.py +++ b/tools/progress.py @@ -938,29 +938,40 @@ def weighted_metrics(): ut = sum(cls_nins.values()) um = sum(n for hx, n in cls_nins.items() if hx in matched_cls) - # main — separate, game-code-only, from its (stale, LINKED-excluding) Ghidra sig. See docstring. + # main — game-code only. P33 A2: the sig is the BUILD-DERIVED one (`make sig-main` → + # .run/sig.main.jsonl: every game-code object's functions at build-true lengths, from the link map + # + the objects' own symbols; Ghidra-free, splat-free, regenerable on a public clone). The + # 2026-08-05 Ghidra sig (.run/sig.SLUS_007.26.jsonl) is the legacy fallback. NO sig at all is an + # ERROR (R32): this block used to set mt=0 and carry on, which made the digest read "217 binaries" + # and MAIN 0/0 on any machine without the Ghidra file — a public clone would have published a + # headline that quietly omitted the EXE. mm = mt = 0 - main_date = None - mp = ROOT / ".run/sig.SLUS_007.26.jsonl" - if mp.exists(): - import datetime - main_date = datetime.date.fromtimestamp(mp.stat().st_mtime).isoformat() - mst = stub_addrs("main") - # P31 S78: exclude LINKED subsegs LIVE (R33 — derive from the Makefile stub lists + the yaml - # ranges), not by trusting the sig's generation-time exclusion. When 13 "game code" subsegs - # became libgte23..30/libgs7/snd10/snd11 the 2026-08-05 sig still carried their 2,907 ins, - # which then read as unmatched game code (59.8% -> 56.1% with no game-code change). - lr = _main_linked_ranges() - for line in open(mp): - r = json.loads(line) - a, n = int(r["addr"], 16), r["nins"] - if n == 0: - continue # GTE thunks / no-body - if any(lo <= a < hi for lo, hi in lr): - continue # LINKED PsyQ object — not game code - mt += n - if a not in mst: - mm += n + mp = ROOT / ".run/sig.main.jsonl" + main_prov = "build-derived sig (make sig-main)" + if not mp.exists(): + mp = ROOT / ".run/sig.SLUS_007.26.jsonl" + main_prov = "LEGACY Ghidra sig" + if not mp.exists(): + raise SystemExit("progress: no main sig — run `make check BINARY=main && make sig-main` " + "(.run/sig.main.jsonl); the fleet digest is not written without the EXE (R32)") + import datetime + main_date = datetime.date.fromtimestamp(mp.stat().st_mtime).isoformat() + mst = stub_addrs("main") + # P31 S78: exclude LINKED subsegs LIVE (R33 — derive from the Makefile stub lists + the yaml + # ranges), not by trusting the sig's generation-time exclusion. When 13 "game code" subsegs + # became libgte23..30/libgs7/snd10/snd11 the 2026-08-05 sig still carried their 2,907 ins, + # which then read as unmatched game code (59.8% -> 56.1% with no game-code change). + lr = _main_linked_ranges() + for line in open(mp): + r = json.loads(line) + a, n = int(r["addr"], 16), r["nins"] + if n == 0: + continue # GTE thunks / no-body + if any(lo <= a < hi for lo, hi in lr): + continue # LINKED PsyQ object — not game code + mt += n + if a not in mst: + mm += n # MAIN IS NOW IN THE WEIGHTED DENOMINATORS (roadmap §1 metrics contract, 2026-07-22). # The contract requires all three headline metrics to include the main EXE; it had been reported @@ -991,7 +1002,20 @@ def weighted_metrics(): dedup_fns=len(matched_cls), dedup_total_fns=len(cls_nins), fleet_m_exmain=fm, fleet_t_exmain=ft, fleet_pct_exmain=(100 * fm / ft if ft else 0.0), - main_m=mm, main_t=mt, main_pct=(100 * mm / mt if mt else 0.0), main_sig_date=main_date) + main_m=mm, main_t=mt, main_pct=(100 * mm / mt if mt else 0.0), main_sig_date=main_date, + main_sig_prov=main_prov) + + +def main_oracle_line(): + """main's independent-oracle verdict, DERIVED at render time (P33 A2). The fleet digest used to + carry the literal "0 phantom, 0 truncated, 1 explained pad-tail", which went stale the moment the + last pad-tail function was banked (S85) — a published number nobody was computing (R51).""" + sys.path.insert(0, str(ROOT / "tools")) + import corpus + if not corpus.sig_is_independent("main"): + return "oracle sig absent — run `make sig-main-oracle`" + r = corpus.audit("main") + return f"{len(r['phantom'])} phantom, {len(r['truncated'])} truncated, {len(r['pad_tail'])} pad-tail" def fleet(): @@ -1029,7 +1053,7 @@ def fleet(): f"FLEET distinct-code(uniq): {wm['dedup_m']:7d} / {wm['dedup_t']} = {wm['dedup_pct']:.1f}% ({wm['dedup_fns']}/{wm['dedup_total_fns']} unique fns; the DISTINCT-RE number)"] if wm.get('main_t'): head += [ - f"MAIN game-code weighted : {wm['main_m']:7d} / {wm['main_t']} = {wm['main_pct']:.1f}% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated {wm['main_sig_date']}; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 1 explained pad-tail)", + f"MAIN game-code weighted : {wm['main_m']:7d} / {wm['main_t']} = {wm['main_pct']:.1f}% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; {wm['main_sig_prov']} dated {wm['main_sig_date']}; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: {main_oracle_line()})", f" (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: {wm['fleet_m_exmain']} / {wm['fleet_t_exmain']} = {wm['fleet_pct_exmain']:.1f}%)"] else: head += ["# (instr-weighted + distinct-code metrics need .run/sig.*.jsonl — run `make sig-overlays`)"]