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
ST=14187438; sz=size.get(ST,0); o=va2off(ST)
print('PlayerProfile::Start @0x%x size=%d -- CALL targets:'%(ST,sz))
for ins in md.disasm(B[o:o+sz],ST):
    if ins.mnemonic=='call' and ins.op_str.startswith('0x'):
        print('  call %s'%name(int(ins.op_str,16)))
