import struct,sys,os
def read(p):
    f=open(p,'rb');m,o,l=struct.unpack('<4sii',f.read(12));f.seek(o)
    ents=[]
    for i in range(l//64):
        n,po,pl=struct.unpack('<56sii',f.read(64));ents.append((n.split(b'\0')[0].decode(),po,pl))
    return f,ents
def write(path,files):
    data=b'';dirs=[]
    off=12
    for n,b in files:
        dirs.append((n,off,len(b)));data+=b;off+=len(b)
    with open(path,'wb') as f:
        f.write(struct.pack('<4sii',b'PACK',12+len(data),len(dirs)*64));f.write(data)
        for n,o,l in dirs:f.write(struct.pack('<56sii',n.encode(),o,l))
if __name__=='__main__':
    for p in sys.argv[1:]:
        f,e=read(p);print(p,len(e))
        for n,o,l in e:
            if n.startswith('maps/') or n.endswith('.dat'):print(' ',n,l)
