import frida, time, subprocess
ADB="/opt/android-sdk/platform-tools/adb"
JS=r"""
function ins(){var m=Process.findModuleByName("libil2cpp.so");if(!m)return false;var b=m.base;
 function T(f){try{f();}catch(e){send({warn:""+e});}}
 T(function(){Interceptor.attach(b.add(0x244e42),{onLeave:function(rv){rv.replace(ptr(2));}});});
 T(function(){Interceptor.replace(b.add(0xe9ea40),new NativeCallback(function(s){},"void",["pointer"]));});
 T(function(){Interceptor.attach(b.add(0xfc9bb9),{onEnter:function(a){ try{ a[0].add(0x72).writeU8(0);}catch(e){} }});});
 var seen={};
 [[0xfcc12a,"ChangeState"],[0xfca136,"InitiateMatchmaking"],[0xd31a4f,"Matchmaking.Initiate"],[0xd30e76,"Matchmaking.OnInitiate"],[0xd3053c,"Matchmaking.Update"],[0xd85fc5,"PIERole.CreateMatch"],[0xd34da2,"CreateBotMatch"],[0x1003e66,"CreateRoom"],[0xd3c97a,"OnJoinedRoom"],[0xd3cb37,"LoadLevel"],[0xe484bd,"GameController.Start"],[0xe4bd6a,"SpawnPlayers"]].forEach(function(x){T(function(){Interceptor.attach(b.add(x[0]),{onEnter:function(){if(!seen[x[1]]){seen[x[1]]=1;send({info:"CHAIN "+x[1]});}}});});});
 T(function(){var ab=Process.findModuleByName("libc.so").findExportByName("abort");Interceptor.attach(ab,{onEnter:function(){var bt=Thread.backtrace(this.context,Backtracer.ACCURATE).slice(0,10).map(function(a){var mm=Process.findModuleByAddress(a);return mm?mm.name+"+0x"+a.sub(mm.base).toString(16):""+a;}).join(",");send({info:"*** ABORT "+bt});}});});
 send({info:"__ready"});return true;}
if(!ins()){var iv=setInterval(function(){if(ins())clearInterval(iv);},120);}
"""
dev=frida.get_usb_device(timeout=10)
pid=int(subprocess.run([ADB,"shell","pidof","se.foglo.svt"],capture_output=True,text=True).stdout.split()[0])
s=dev.attach(pid); sc=s.create_script(JS); t0=time.time()
sc.on("message",lambda m,d: print("[%5.1f] %s"%(time.time()-t0,m.get("payload",m)),flush=True))
sc.load(); time.sleep(1.5)
print("=== tap GO ===",flush=True)
subprocess.run([ADB,"shell","input","tap","1350","960"]); time.sleep(25)
