"""Recompute the obfuscated 32-byte target X used by check() (blocks B_mq..B_em),
reading the runtime-dependent bytes from a sandboxed instance's memory."""
import struct


def target_x(g):
    q = lambda a: struct.unpack('<Q', g.rd(a, 8))[0]
    buf = bytearray(g.rd(289271, 32))
    d64 = q(2141088)
    e = g.rd(2141096, 1)[0]
    F = g.rd(q(q(2141104) + 14 * 8) + 39, 1)[0]
    gg = (d64 >> 56) & 0xFF
    d = (d64 >> 24) & 0xFF
    buf[28] ^= 0x8A
    buf[6] ^= F
    buf[26] = (buf[26] - gg) & 0xFF
    f0 = buf[7]
    buf[7] = (f0 + 15) & 0xFF
    buf[14] = (buf[14] - e) & 0xFF
    buf[4] = (buf[4] + 15) & 0xFF
    buf[5] ^= d
    buf[7] = (f0 + e + 15) & 0xFF
    T = g.rd(323488, 32)
    for i in range(0, 32, 2):
        a, b = T[i], T[i + 1]
        s = (i + (a ^ b)) & 0xFF
        h = (buf[a] - s) & 0xFF
        buf[a] = (buf[b] - s - 85) & 0xFF
        buf[b] = (h - 85) & 0xFF
    return bytes(buf)
