import struct,bisect
exec(open('/tmp/claude-0/-root-ants/f0a0d69c-fbe4-4887-8c0d-a5302a0da398/scratchpad/x86bridge.py').read().split("print('\\n--- registration")[0])
import capstone
sm=open(SYM,'rb').read(); n,=struct.unpack_from('<I',sm,0)
starts=[]; size={}
for i in range(n):
    a,s=struct.unpack_from('<QI',sm,4+i*12); starts.append(a); size[a]=s
starts.sort()
CODEREG=0x1d3728c; mpCount=u32(CODEREG); mpPtr=u32(CODEREG+4)
MP=struct.unpack_from('<%dI'%mpCount,B,va2off(mpPtr))
A2N={}
for ti,t in enumerate(TYPES):
    ns,nm=S(t[1]),S(t[0]); cls=(ns+'.' if ns else '')+nm
    for k in range(t[20]):
        m=METHODS[t[13]+k]; a=MP[m[6]] if m[6]<mpCount else 0
        if a: A2N.setdefault(a,'%s::%s'%(cls,S(m[0])))
def owner(va):
    i=bisect.bisect_right(starts,va)-1; return starts[i]
def name(tgt): return A2N.get(tgt) or A2N.get(owner(tgt)) or ('sub_%x'%tgt)
md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32); md.detail=True
def dis(mname,addr,limit=60):
    sz=size.get(addr,0); o=va2off(addr)
    print('\n### %s @0x%x size=%d'%(mname,addr,sz))
    for ins in list(md.disasm(B[o:o+sz],addr))[:limit]:
        ann=''
        if ins.mnemonic=='call' and ins.op_str.startswith('0x'):
            ann='   ; '+name(int(ins.op_str,16))
        print('0x%08x  %-8s %s%s'%(ins.address,ins.mnemonic,ins.op_str,ann))
import sys
addrs=__import__('json').load(open('/root/ants/x86addrs.json'))
for k in ('PlayerProfile::get_instance/0','PlayerProfile::Awake/0'):
    if k in addrs: dis(k,addrs[k],70)
