"""DIMENSION 1 Q1: enumerate the userInfo.feature restriction vocabulary IN FULL.

Hypothesis: FUN_18013ec10 (userInfo deser) handles atom 0x11c (feature) by entering a
nested object-parse loop that dispatches sub-keys (trade=0x330 known) each writing a byte
into the userInfo record. Enumerate EVERY sub-key and the offset each writes.

CONTROL: the known trade atom 0x330 MUST appear and map to +0x17c. If it does not, the
dispatch form assumed is wrong and the enumeration below is unreliable.

Method: print full decompile length + full text of FUN_18013ec10, then scan for the
feature atom 0x11c and identify the nested parser (a callee entered at that case), then
decompile that callee in full too.
"""
import re, traceback

UI_DESER = 0x18013ec10

try:
    f = func(UI_DESER)
    src = dec(UI_DESER, 300)
    print("=== FUN_%08x  body=%d insns  decompile=%d chars ===" %
          (UI_DESER, f.getBody().getNumAddresses() if f else -1, len(src)))
    print(src)

    print("\n=== callees of FUN_%08x ===" % UI_DESER)
    for a, n in callees(UI_DESER):
        print("  %#x %s" % (a, n))

    # where does 0x11c (feature) / 0x330 (trade) appear textually?
    print("\n=== atom mentions in the decompile ===")
    for atom, name in ((0x11c, "feature"), (0x330, "trade"), (0x17c, "off+0x17c"),
                       (0x50, "off+0x50")):
        for ln in src.splitlines():
            if ("0x%x" % atom) in ln.replace("0X", "0x"):
                print("  [%-10s] %s" % (name, ln.strip()))
except Exception:
    traceback.print_exc()
