{"version":3,"file":"index.mjs","sources":["../src/adb.ts","../src/salsa20.ts","../src/blte.ts","../src/store.ts","../src/fetcher.ts","../src/jenkins96.ts","../src/parsers/archiveIndex.ts","../src/parsers/config.ts","../src/parsers/encodingFile.ts","../src/parsers/installFile.ts","../src/parsers/productConfig.ts","../src/parsers/rootFile.ts","../src/utils.ts","../src/wdc.ts","../src/client.ts","../src/dbd.ts"],"sourcesContent":["import assert from 'node:assert';\n\nconst ADB_MAGIC = 0x58465448;\n\nexport interface HotfixEntry {\n    regionID: number,\n    pushID: number,\n    uniqueID: number,\n    tableHash: number,\n    recordID: number,\n    dataSize: number,\n    recordState: number,\n    data: Buffer,\n}\n\nexport default class ADBReader {\n    public build: number;\n\n    public entries: HotfixEntry[] = [];\n\n    public tableEntries = new Map<number, HotfixEntry[]>();\n\n    constructor(buffer: Buffer) {\n        const magic = buffer.readUInt32BE(0);\n        assert(magic === ADB_MAGIC, `[ADB]: Invalid magic: ${magic.toString(16).padStart(8, '0')}`);\n\n        const version = buffer.readUInt32LE(4);\n        assert(version === 9, `[ADB]: Invalid version: ${version.toString()}`);\n\n        const build = buffer.readUInt32LE(8);\n        this.build = build;\n\n        let pointer = 44;\n        while (pointer < buffer.byteLength) {\n            const offset = pointer;\n\n            const entryMagic = buffer.readUInt32BE(offset);\n            assert(entryMagic === ADB_MAGIC, `[ADB]: Invalid entry magic: ${magic.toString(16).padStart(8, '0')}`);\n\n            const regionID = buffer.readInt32LE(offset + 4);\n            const pushID = buffer.readInt32LE(offset + 8);\n            const uniqueID = buffer.readUInt32LE(offset + 12);\n            const tableHash = buffer.readUInt32LE(offset + 16);\n            const recordID = buffer.readUInt32LE(offset + 20);\n            const dataSize = buffer.readUInt32LE(offset + 24);\n            const recordState = buffer.readUInt32LE(offset + 28);\n\n            const data = buffer.subarray(offset + 32, offset + 32 + dataSize);\n\n            const entry: HotfixEntry = {\n                regionID,\n                pushID,\n                uniqueID,\n                tableHash,\n                recordID,\n                dataSize,\n                recordState,\n                data,\n            };\n            this.entries.push(entry);\n\n            if (!this.tableEntries.has(tableHash)) {\n                this.tableEntries.set(tableHash, []);\n            }\n            this.tableEntries.get(tableHash)?.push(entry);\n\n            pointer += 32 + dataSize;\n        }\n    }\n}\n","/* eslint-disable no-bitwise */\n\nimport assert from 'node:assert';\n\nexport default class Salsa20 {\n    private readonly fixed: Uint32Array;\n\n    private readonly key: Uint32Array;\n\n    private readonly nonce: Uint32Array;\n\n    private counter = new Uint32Array([0, 0]);\n\n    private state = new Uint32Array(16);\n\n    private block = new Uint8Array(64);\n\n    private position = 0;\n\n    constructor(key: Uint8Array, nonce: Uint8Array) {\n        assert(key.length === 32 || key.length === 16, 'Salsa20 requires 128-bit or 256-bit key');\n        assert(nonce.length === 8, 'Salsa20 requires 64-bit nonce');\n\n        this.key = new Uint32Array(8);\n        const keyView = new DataView(key.buffer);\n        if (key.length === 32) {\n            for (let i = 0; i < 8; i += 1) {\n                this.key[i] = keyView.getUint32(i * 4, true);\n            }\n            this.fixed = new Uint32Array([\n                0x61707865,\n                0x3320646e,\n                0x79622d32,\n                0x6b206574,\n            ]);\n        } else {\n            for (let i = 0; i < 4; i += 1) {\n                const word = keyView.getUint32(i * 4, true);\n                this.key[i] = word;\n                this.key[i + 4] = word;\n            }\n            this.fixed = new Uint32Array([\n                0x61707865,\n                0x3120646e,\n                0x79622d36,\n                0x6b206574,\n            ]);\n        }\n\n        this.nonce = new Uint32Array(2);\n        const nonceView = new DataView(nonce.buffer);\n        for (let i = 0; i < 2; i += 1) {\n            this.nonce[i] = nonceView.getUint32(i * 4, true);\n        }\n\n        this.generateBlock();\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    private QR(a: number, b: number, c: number, d: number) {\n        let t: number;\n\n        t = (this.state[a] + this.state[d]) & 0xffffffff;\n        this.state[b] ^= (t << 7) | (t >>> 25);\n\n        t = (this.state[b] + this.state[a]) & 0xffffffff;\n        this.state[c] ^= (t << 9) | (t >>> 23);\n\n        t = (this.state[c] + this.state[b]) & 0xffffffff;\n        this.state[d] ^= (t << 13) | (t >>> 19);\n\n        t = (this.state[d] + this.state[c]) & 0xffffffff;\n        this.state[a] ^= (t << 18) | (t >>> 14);\n    }\n\n    private generateBlock() {\n        const init = new Uint32Array([\n            this.fixed[0],\n            this.key[0],\n            this.key[1],\n            this.key[2],\n\n            this.key[3],\n            this.fixed[1],\n            this.nonce[0],\n            this.nonce[1],\n\n            this.counter[0],\n            this.counter[1],\n            this.fixed[2],\n            this.key[4],\n\n            this.key[5],\n            this.key[6],\n            this.key[7],\n            this.fixed[3],\n        ]);\n        this.state = new Uint32Array(init);\n\n        for (let i = 0; i < 20; i += 2) {\n            // Odd round\n            this.QR(0, 4, 8, 12);\n            this.QR(5, 9, 13, 1);\n            this.QR(10, 14, 2, 6);\n            this.QR(15, 3, 7, 11);\n            // Even round\n            this.QR(0, 1, 2, 3);\n            this.QR(5, 6, 7, 4);\n            this.QR(10, 11, 8, 9);\n            this.QR(15, 12, 13, 14);\n        }\n\n        for (let i = 0; i < 16; i += 1) {\n            const word = (this.state[i] + init[i]) & 0xffffffff;\n            this.block[i * 4] = word & 0xff;\n            this.block[i * 4 + 1] = (word >>> 8) & 0xff;\n            this.block[i * 4 + 2] = (word >>> 16) & 0xff;\n            this.block[i * 4 + 3] = (word >>> 24) & 0xff;\n        }\n\n        this.counter[0] = (this.counter[0] + 1) & 0xffffffff;\n        if (this.counter[0] === 0) {\n            this.counter[1] = (this.counter[1] + 1) & 0xffffffff;\n        }\n    }\n\n    process(input: Uint8Array): Uint8Array {\n        const { length } = input;\n        const result = new Uint8Array(length);\n\n        for (let i = 0; i < length; i += 1) {\n            if (this.position === 64) {\n                this.generateBlock();\n                this.position = 0;\n            }\n\n            result[i] = input[i] ^ this.block[this.position];\n            this.position += 1;\n        }\n\n        return result;\n    }\n}\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\nimport zlib from 'node:zlib';\n\nimport Salsa20 from './salsa20.ts';\n\ninterface Block {\n    compressedSize: number,\n    decompressedSize: number,\n    hash: string,\n}\n\ninterface MissingKeyBlock {\n    offset: number,\n    size: number,\n    blockIndex: number,\n    keyName: string,\n}\n\nconst BLTE_MAGIC = 0x424c5445;\nconst ENC_TYPE_SALSA20 = 0x53;\nconst EMPTY_HASH = '00000000000000000000000000000000';\n\nexport default class BLTEReader {\n    public buffer: Buffer;\n\n    public readonly blte: Buffer;\n\n    public readonly blocks: Block[] = [];\n\n    public readonly keys: Map<string, Uint8Array>;\n\n    private processedBlock = 0;\n\n    private processedOffset = 0;\n\n    constructor(buffer: Buffer, eKey: string, keys = new Map<string, Uint8Array>()) {\n        this.blte = buffer;\n        this.buffer = Buffer.alloc(0);\n        this.keys = keys;\n\n        const size = buffer.byteLength;\n        assert(size >= 8, `[BLTE]: Invalid size: ${size.toString()} < 8`);\n\n        const magic = buffer.readUInt32BE(0);\n        assert(magic === BLTE_MAGIC, `[BLTE]: Invalid magic: ${magic.toString(16).padStart(8, '0')}`);\n\n        const headerSize = buffer.readUInt32BE(4);\n        if (headerSize === 0) {\n            const blteHash = crypto.createHash('md5').update(buffer).digest('hex');\n            assert(blteHash === eKey, `[BLTE]: Invalid hash: expected ${eKey}, got ${blteHash}`);\n\n            this.blocks.push({\n                compressedSize: size - 8,\n                decompressedSize: size - 9,\n                hash: EMPTY_HASH,\n            });\n            this.processedOffset = 8;\n\n            return;\n        }\n\n        const blteHash = crypto.createHash('md5').update(buffer.subarray(0, headerSize)).digest('hex');\n        assert(blteHash === eKey, `[BLTE]: Invalid hash: expected ${eKey}, got ${blteHash}`);\n\n        assert(size >= 12, `[BLTE]: Invalid size: ${size.toString()} < 12`);\n\n        const flag = buffer.readUInt8(8);\n        const numBlocks = buffer.readIntBE(9, 3);\n\n        assert(numBlocks > 0, `[BLTE]: Invalid number of blocks: ${numBlocks.toString()}`);\n        assert(flag === 0x0f, `[BLTE]: Invalid flag: ${flag.toString(16).padStart(2, '0')}`);\n\n        const blockHeaderSize = numBlocks * 24;\n        assert(headerSize === blockHeaderSize + 12, `[BLTE]: Invalid header size: header size ${headerSize.toString()} != block header size ${blockHeaderSize.toString()} + 12`);\n\n        assert(size >= headerSize, `[BLTE]: Invalid size: ${size.toString()} < ${headerSize.toString()}`);\n\n        for (let i = 0; i < numBlocks; i += 1) {\n            const offset = 12 + i * 24;\n            const compressedSize = buffer.readUInt32BE(offset);\n            const decompressedSize = buffer.readUInt32BE(offset + 4);\n            const hash = buffer.toString('hex', offset + 8, offset + 24);\n\n            this.blocks.push({\n                compressedSize,\n                decompressedSize,\n                hash,\n            });\n        }\n\n        this.processedOffset = headerSize;\n    }\n\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: false): Buffer;\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: true): Buffer | string;\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: boolean): Buffer | string {\n        const flag = buffer.readUInt8(0);\n        switch (flag) {\n            case 0x45: { // Encrypted\n                let offset = 1;\n\n                const keyNameLength = buffer.readUInt8(offset);\n                offset += 1;\n\n                const keyNameBE = buffer.toString('hex', offset, offset + keyNameLength);\n                offset += keyNameLength;\n\n                const ivLength = buffer.readUInt8(offset);\n                offset += 1;\n\n                const ivBuffer = buffer.subarray(offset, offset + ivLength);\n                offset += ivLength;\n\n                const encryptType = buffer.readUInt8(offset);\n                offset += 1;\n\n                assert(encryptType === ENC_TYPE_SALSA20, `[BLTE]: Invalid encrypt type: ${encryptType.toString(16).padStart(2, '0')} at block ${index.toString()}`);\n\n                const keyName = [...keyNameBE.matchAll(/.{2}/g)].map((v) => v[0]).reverse().join('').toLowerCase();\n                const key = this.keys.get(keyName);\n                if (!key) {\n                    if (allowMissingKey) {\n                        return keyName;\n                    }\n                    throw new Error(`[BLTE]: Missing key: ${keyName} at block ${index.toString()}`);\n                }\n\n                const iv = new Uint8Array(8);\n                for (let i = 0; i < 8; i += 1) {\n                    if (i < ivLength) {\n                        // eslint-disable-next-line no-bitwise\n                        iv[i] = ivBuffer.readUInt8(i) ^ ((index >>> (8 * i)) & 0xff);\n                    } else {\n                        iv[i] = 0x00;\n                    }\n                }\n\n                const handler = new Salsa20(key, iv);\n                const decrypted = handler.process(buffer.subarray(offset));\n\n                if (allowMissingKey) {\n                    return this.processBlock(Buffer.from(decrypted.buffer), index, true);\n                }\n                return this.processBlock(Buffer.from(decrypted.buffer), index, false);\n            }\n            case 0x46: // Frame (Recursive)\n                throw new Error(`[BLTE]: Frame (Recursive) block not supported at block ${index.toString()}`);\n            case 0x4e: // Frame (Normal)\n                return buffer.subarray(1);\n            case 0x5a: // Compressed\n                return zlib.inflateSync(buffer.subarray(1));\n            default:\n                throw new Error(`[BLTE]: Invalid block flag: ${flag.toString(16).padStart(2, '0')} at block ${index.toString()}`);\n        }\n    }\n\n    processBytes(allowMissingKey?: false, size?: number): undefined;\n    processBytes(allowMissingKey: true, size?: number): MissingKeyBlock[];\n    processBytes(allowMissingKey = false, size = Infinity): MissingKeyBlock[] | undefined {\n        const missingKeyBlocks: MissingKeyBlock[] = [];\n\n        while (\n            this.processedBlock < this.blocks.length\n            && size > this.buffer.byteLength\n        ) {\n            const blockIndex = this.processedBlock;\n            const block = this.blocks[blockIndex];\n\n            const blockBuffer = this.blte.subarray(\n                this.processedOffset,\n                this.processedOffset + block.compressedSize,\n            );\n            if (block.hash !== EMPTY_HASH) {\n                const blockHash = crypto.createHash('md5').update(blockBuffer).digest('hex');\n                assert(blockHash === block.hash, `[BLTE]: Invalid block hash: expected ${block.hash}, got ${blockHash}`);\n            }\n\n            if (allowMissingKey) {\n                const buffer = this.processBlock(blockBuffer, blockIndex, allowMissingKey);\n                if (typeof buffer === 'string') {\n                    missingKeyBlocks.push({\n                        offset: this.buffer.byteLength,\n                        size: block.decompressedSize,\n                        blockIndex,\n                        keyName: buffer,\n                    });\n\n                    this.buffer = Buffer.concat([\n                        this.buffer,\n                        Buffer.alloc(block.decompressedSize),\n                    ]);\n                } else {\n                    assert(\n                        buffer.byteLength === block.decompressedSize,\n                        `[BLTE]: Invalid decompressed size: expected ${block.decompressedSize.toString()}, got ${buffer.byteLength.toString()}`,\n                    );\n\n                    this.buffer = Buffer.concat([this.buffer, buffer]);\n                }\n            } else {\n                const buffer = this.processBlock(blockBuffer, blockIndex, allowMissingKey);\n\n                assert(\n                    buffer.byteLength === block.decompressedSize,\n                    `[BLTE]: Invalid decompressed size: expected ${block.decompressedSize.toString()}, got ${buffer.byteLength.toString()}`,\n                );\n\n                this.buffer = Buffer.concat([this.buffer, buffer]);\n            }\n\n            this.processedBlock += 1;\n            this.processedOffset += block.compressedSize;\n        }\n\n        return allowMissingKey ? missingKeyBlocks : undefined;\n    }\n}\n\nexport type { MissingKeyBlock };\n","import fs from 'node:fs/promises';\n\nexport default class Store<K extends string | number | symbol, V> {\n    private data: Record<K, V | undefined>;\n\n    private dataFile: string;\n\n    private promise: Promise<void>;\n\n    constructor(dataFile: string) {\n        this.dataFile = dataFile;\n        this.data = {} as Record<K, V | undefined>;\n\n        this.promise = new Promise((resolve) => {\n            fs\n                .readFile(dataFile, 'utf-8')\n                .then((file) => {\n                    this.data = JSON.parse(file) as Record<K, V | undefined>;\n                    resolve();\n                })\n                .catch(() => {\n                    resolve();\n                });\n        });\n    }\n\n    public async get(key: K): Promise<V | undefined> {\n        await this.promise;\n        return this.data[key];\n    }\n\n    public async set(key: K, value: V): Promise<void> {\n        await this.promise;\n        this.data[key] = value;\n        await fs.writeFile(this.dataFile, JSON.stringify(this.data), 'utf-8');\n    }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport http from 'node:http';\nimport path from 'node:path';\n\nimport cliProgress from 'cli-progress';\n\nimport Store from './store.ts';\n\nconst USER_AGENT = 'node-wow-casc-dbc';\n\nconst CACHE_ROOT = path.resolve('cache');\nconst CACHE_DIRS = {\n    build: 'builds',\n    indexes: 'indices',\n    data: 'data',\n    dbd: 'dbd',\n};\n\nconst CACHE_INTEGRITY_FILE = path.resolve(CACHE_ROOT, 'integrity.json');\n\nconst cacheIntegrity = new Store<string, string>(CACHE_INTEGRITY_FILE);\n\nconst formatCDNKey = (key: string): string => `${key.substring(0, 2)}/${key.substring(2, 4)}/${key}`;\n\nconst requestData = async (\n    url: string,\n    {\n        partialOffset,\n        partialLength,\n        showProgress,\n    }: {\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n    } = {},\n): Promise<Buffer> => new Promise((resolve, reject) => {\n    const options = {\n        headers: {\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            'User-Agent': USER_AGENT,\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            Range: partialOffset !== undefined && partialLength !== undefined\n                ? `bytes=${partialOffset.toString()}-${(partialOffset + partialLength - 1).toString()}`\n                : 'bytes=0-',\n        },\n    };\n\n    http.get(url, options, (res) => {\n        if (res.statusCode === 301 || res.statusCode === 302) {\n            if (res.headers.location !== undefined) {\n                requestData(res.headers.location, { partialOffset, partialLength, showProgress })\n                    .then(resolve)\n                    .catch((err: unknown) => {\n                        throw err;\n                    });\n            } else {\n                reject(new Error(`Failed to request ${url}, Status Code: ${res.statusCode.toString()}`));\n            }\n            return;\n        }\n\n        if (res.statusCode === undefined || res.statusCode < 200 || res.statusCode > 302) {\n            reject(new Error(`Failed to request ${url}, Status Code: ${res.statusCode?.toString() ?? 'undefined'}`));\n            return;\n        }\n\n        const lengthText = res.headers['content-length'];\n        const length = lengthText !== undefined ? parseInt(lengthText, 10) : 0;\n        const bar = showProgress === true && !Number.isNaN(length) && length >= 10485760\n            ? new cliProgress.SingleBar({ etaBuffer: 10240 }, cliProgress.Presets.shades_classic)\n            : undefined;\n        bar?.start(length, 0);\n\n        const chunks: Buffer[] = [];\n        res.on('data', (chunk: Buffer) => {\n            bar?.increment(chunk.length);\n            chunks.push(chunk);\n        });\n        res.on('end', () => {\n            bar?.stop();\n            resolve(Buffer.concat(chunks));\n        });\n        res.on('error', (err) => {\n            bar?.stop();\n            reject(err);\n        });\n    })\n        .on('error', reject)\n        .end();\n});\n\nconst downloadFile = (\n    prefixes: string[],\n    type: 'data' | 'config',\n    key: string,\n    {\n        partialOffset,\n        partialLength,\n        showProgress,\n        showAttemptFail,\n    }: {\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n        showAttemptFail?: boolean,\n    } = {},\n): Promise<Buffer> => {\n    const urls = prefixes.map((prefix) => `${prefix}/${type}/${formatCDNKey(key)}`);\n\n    return urls\n        .reduce(\n            (prev, url, index) => prev\n                .catch((err: unknown) => {\n                    if (showAttemptFail === true && index > 0 && err instanceof Error) {\n                        console.warn(`${new Date().toISOString()} [WARN]:`, err.message);\n                    }\n                    return requestData(url, { partialOffset, partialLength, showProgress });\n                }),\n            Promise.reject<Buffer>(new Error('')),\n        );\n};\n\nconst getFileCache = async (file: string): Promise<Buffer | undefined> => {\n    const integrity = await cacheIntegrity.get(file);\n    if (integrity !== undefined) {\n        try {\n            const buffer = await fs.readFile(path.resolve(CACHE_ROOT, file));\n            const hash = crypto.createHash('sha256').update(buffer).digest('hex');\n            if (hash === integrity) {\n                return buffer;\n            }\n        } catch {\n            // ignore\n        }\n    }\n    return undefined;\n};\n\nexport const getDataFile = async (\n    prefixes: string[],\n    key: string,\n    type: keyof typeof CACHE_DIRS,\n    buildCKey: string,\n    {\n        name,\n        partialOffset,\n        partialLength,\n        showProgress,\n        showAttemptFail,\n    }: {\n        name?: string,\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n        showAttemptFail?: boolean,\n    } = {},\n): Promise<Buffer> => {\n    const dir = type === 'build'\n        ? path.join(CACHE_DIRS[type], buildCKey)\n        : CACHE_DIRS[type];\n    const file = name !== undefined ? path.join(dir, name) : path.join(dir, key);\n    const cacheBuffer = await getFileCache(file);\n\n    if (cacheBuffer) {\n        if (name === undefined && partialOffset !== undefined && partialLength !== undefined) {\n            return cacheBuffer.subarray(partialOffset, partialOffset + partialLength);\n        }\n        return cacheBuffer;\n    }\n\n    const downloadBuffer = await downloadFile(prefixes, 'data', key, {\n        partialOffset, partialLength, showProgress, showAttemptFail,\n    });\n    if ((partialOffset === undefined && partialLength === undefined) || name !== undefined) {\n        await fs.mkdir(path.resolve(CACHE_ROOT, dir), { recursive: true });\n        await fs.writeFile(path.resolve(CACHE_ROOT, file), downloadBuffer);\n\n        const hash = crypto.createHash('sha256').update(downloadBuffer).digest('hex');\n        await cacheIntegrity.set(file, hash);\n    }\n\n    return downloadBuffer;\n};\n\nexport const getConfigFile = async (\n    prefixes: string[],\n    key: string,\n    {\n        showProgress, showAttemptFail,\n    }: {\n        showProgress?: boolean, showAttemptFail?: boolean,\n    } = {},\n): Promise<string> => {\n    const downloadBuffer = await downloadFile(prefixes, 'config', key, { showProgress, showAttemptFail });\n    return downloadBuffer.toString('utf-8');\n};\n\nexport const getProductVersions = async (\n    region: string,\n    product: string,\n): Promise<string> => {\n    const url = `http://${region}.patch.battle.net:1119/${product}/versions`;\n    const headers = new Headers();\n    headers.set('User-Agent', USER_AGENT);\n\n    const res = await fetch(url, { headers });\n\n    return res.text();\n};\n\nexport const getProductCDNs = async (\n    region: string,\n    product: string,\n): Promise<string> => {\n    const url = `http://${region}.patch.battle.net:1119/${product}/cdns`;\n    const headers = new Headers();\n    headers.set('User-Agent', USER_AGENT);\n\n    const res = await fetch(url, { headers });\n\n    return res.text();\n};\n","/* eslint-disable no-bitwise */\n\nconst hashlittle2 = (key: string, pc = 0, pb = 0): [number, number] => {\n    const { length } = key;\n    let offset = 0;\n\n    let a = 0xdeadbeef + length + pc | 0;\n    let b = 0xdeadbeef + length + pc | 0;\n    let c = 0xdeadbeef + length + pc + pb | 0;\n\n    while (length - offset > 12) {\n        a += key.charCodeAt(offset + 0);\n        a += key.charCodeAt(offset + 1) << 8;\n        a += key.charCodeAt(offset + 2) << 16;\n        a += key.charCodeAt(offset + 3) << 24;\n\n        b += key.charCodeAt(offset + 4);\n        b += key.charCodeAt(offset + 5) << 8;\n        b += key.charCodeAt(offset + 6) << 16;\n        b += key.charCodeAt(offset + 7) << 24;\n\n        c += key.charCodeAt(offset + 8);\n        c += key.charCodeAt(offset + 9) << 8;\n        c += key.charCodeAt(offset + 10) << 16;\n        c += key.charCodeAt(offset + 11) << 24;\n\n        // mix(a, b, c);\n        a -= c; a ^= (c << 4) | (c >>> 28); c = c + b | 0;\n        b -= a; b ^= (a << 6) | (a >>> 26); a = a + c | 0;\n        c -= b; c ^= (b << 8) | (b >>> 24); b = b + a | 0;\n        a -= c; a ^= (c << 16) | (c >>> 16); c = c + b | 0;\n        b -= a; b ^= (a << 19) | (a >>> 13); a = a + c | 0;\n        c -= b; c ^= (b << 4) | (b >>> 28); b = b + a | 0;\n\n        offset += 12;\n    }\n\n    if (length - offset > 0) {\n        // zero length strings require no mixing\n        // eslint-disable-next-line default-case\n        switch (length - offset) {\n            case 12: c += key.charCodeAt(offset + 11) << 24; // falls through\n            case 11: c += key.charCodeAt(offset + 10) << 16; // falls through\n            case 10: c += key.charCodeAt(offset + 9) << 8; // falls through\n            case 9: c += key.charCodeAt(offset + 8); // falls through\n            case 8: b += key.charCodeAt(offset + 7) << 24; // falls through\n            case 7: b += key.charCodeAt(offset + 6) << 16; // falls through\n            case 6: b += key.charCodeAt(offset + 5) << 8; // falls through\n            case 5: b += key.charCodeAt(offset + 4); // falls through\n            case 4: a += key.charCodeAt(offset + 3) << 24; // falls through\n            case 3: a += key.charCodeAt(offset + 2) << 16; // falls through\n            case 2: a += key.charCodeAt(offset + 1) << 8; // falls through\n            case 1: a += key.charCodeAt(offset + 0);\n        }\n\n        // final(a, b, c);\n        c ^= b; c -= (b << 14) | (b >>> 18);\n        a ^= c; a -= (c << 11) | (c >>> 21);\n        b ^= a; b -= (a << 25) | (a >>> 7);\n        c ^= b; c -= (b << 16) | (b >>> 16);\n        a ^= c; a -= (c << 4) | (c >>> 28);\n        b ^= a; b -= (a << 14) | (a >>> 18);\n        c ^= b; c -= (b << 24) | (b >>> 8);\n    }\n\n    return [c >>> 0, b >>> 0];\n};\n\nconst getNameHash = (name: string): string => {\n    const normalized = name.replace(/\\//g, '\\\\').toUpperCase();\n    const [pc, pb] = hashlittle2(normalized);\n    return `${pc.toString(16).padStart(8, '0')}${pb.toString(16).padStart(8, '0')}`;\n};\n\nexport default getNameHash;\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nconst VERSION_SUB_OFFSET = -12;\nconst CHECKSUM_SIZE_SUB_OFFSET = -5;\n\nconst BLOCK_SIZE_OFFSET = 3;\nconst OFFSET_BYTES_OFFSET = 4;\nconst SIZE_BYTES_OFFSET = 5;\nconst KEY_SIZE_OFFSET = 6;\n// const CHECKSUM_SIZE_OFFSET = 7;\nconst NUM_ELEMENTS_OFFSET = 8;\nconst CHECKSUM_OFFSET = 12;\n\nconst CHECKSUM_TRIES = [\n    10,\n    9,\n    8,\n    7,\n    6,\n    5,\n    4,\n    3,\n    2,\n    1,\n    0,\n];\n\ninterface ArchiveIndex {\n    key: string,\n    size: number,\n    offset: number,\n}\n\nconst tryArchiveIndexChecksumSize = (buffer: Buffer, cKey: string): number => {\n    const res = CHECKSUM_TRIES.filter(\n        (index) => (\n            buffer.readUInt8(buffer.byteLength - index + CHECKSUM_SIZE_SUB_OFFSET) === index\n            && buffer.readUInt8(buffer.byteLength - index + VERSION_SUB_OFFSET) === 1\n        ),\n    );\n\n    if (res.length === 1) {\n        return res[0];\n    }\n\n    throw new Error(`Invalid checksum size: ${res.join(', ')} in ${cKey}`);\n};\n\nconst parseArchiveIndex = (buffer: Buffer, cKey: string): Map<string, ArchiveIndex> => {\n    const checksumSize = tryArchiveIndexChecksumSize(buffer, cKey);\n\n    const versionOffset = buffer.byteLength - checksumSize + VERSION_SUB_OFFSET;\n    const footerOffset = versionOffset - checksumSize;\n\n    const tocChecksum = buffer.toString('hex', footerOffset, versionOffset);\n    const version = buffer.readUInt8(versionOffset);\n    const blockSizeKB = buffer.readUInt8(versionOffset + BLOCK_SIZE_OFFSET);\n    const offsetBytes = buffer.readUInt8(versionOffset + OFFSET_BYTES_OFFSET);\n    const sizeBytes = buffer.readUInt8(versionOffset + SIZE_BYTES_OFFSET);\n    const keySize = buffer.readUInt8(versionOffset + KEY_SIZE_OFFSET);\n    const numElements = buffer.readUInt32LE(versionOffset + NUM_ELEMENTS_OFFSET);\n    const footerChecksum = buffer.toString('hex', versionOffset + CHECKSUM_OFFSET);\n\n    assert(version === 1, `Invalid archive index version: ${version.toString()} in ${cKey}`);\n\n    const entrySize = keySize + offsetBytes + sizeBytes;\n    const blockSize = blockSizeKB * 1024;\n    const numBlocks = footerOffset / (blockSize + keySize + checksumSize);\n    const tocSize = (keySize + checksumSize) * numBlocks;\n    const toc = buffer.subarray(footerOffset - tocSize, footerOffset);\n    const footer = buffer.subarray(footerOffset);\n    const footerCheckBuffer = Buffer.concat([\n        buffer.subarray(versionOffset, buffer.byteLength - checksumSize),\n        Buffer.alloc(checksumSize),\n    ]);\n\n    const hash = crypto.createHash('md5').update(footer).digest('hex');\n    assert(hash === cKey, `Invalid footer hash in ${cKey}: expected ${cKey}, got ${hash}`);\n\n    const footerHash = crypto.createHash('md5').update(footerCheckBuffer).digest('hex').slice(0, checksumSize * 2);\n    assert(footerHash === footerChecksum, `Invalid footer checksum in ${cKey}: expected ${footerChecksum}, got ${footerHash}`);\n\n    const tocHash = crypto.createHash('md5').update(toc).digest('hex').slice(0, checksumSize * 2);\n    assert(tocHash === tocChecksum, `Invalid toc checksum in ${cKey}: expected ${tocChecksum}, got ${tocHash}`);\n\n    const result = new Map<string, ArchiveIndex>();\n    for (let i = 0; i < numBlocks; i += 1) {\n        const lastEkey = toc.toString('hex', i * keySize, (i + 1) * keySize);\n        const blockChecksum = toc.toString('hex', numBlocks * keySize + i * checksumSize, numBlocks * keySize + (i + 1) * checksumSize);\n        const blockOffset = i * blockSize;\n\n        const blockHash = crypto.createHash('md5').update(buffer.subarray(i * blockSize, (i + 1) * blockSize)).digest('hex').slice(0, checksumSize * 2);\n        assert(blockChecksum === blockHash, `Invalid block hash in ${cKey} at ${i.toString()}: expected ${blockChecksum}, got ${blockHash}`);\n\n        let length = 0;\n        while (length < blockSize) {\n            const entryOffset = blockOffset + length * entrySize;\n            const eKey = buffer.toString('hex', entryOffset, entryOffset + keySize);\n            const size = buffer.readUIntBE(entryOffset + keySize, sizeBytes);\n            const offset = buffer.readUIntBE(entryOffset + keySize + sizeBytes, offsetBytes);\n\n            result.set(eKey, { key: cKey, size, offset });\n            length += 1;\n\n            if (eKey === lastEkey) {\n                break;\n            }\n        }\n    }\n\n    assert(result.size === numElements, `Invalid number of elements: ${result.size.toString()} != ${numElements.toString()} in ${cKey}`);\n\n    return result;\n};\n\nexport default parseArchiveIndex;\n\nexport type { ArchiveIndex };\n","import assert from 'node:assert';\n\nconst normalizeKey = (key: string): string => key\n    .split('-')\n    .map((part, index) => (\n        index === 0\n            ? part\n            : `${part.charAt(0).toUpperCase()}${part.slice(1)}`\n    ))\n    .join('');\n\nconst parseConfig = (text: string): Record<string, string> => {\n    const entries: Record<string, string> = {};\n\n    text\n        .split(/\\r?\\n/)\n        .filter((line) => line.trim().length !== 0 && !line.startsWith('#'))\n        .forEach((line) => {\n            const match = /([^\\s]+)\\s?=\\s?(.*)/.exec(line);\n            assert(match !== null, 'Invalid token encountered parsing CDN config');\n\n            const [key, value] = match.slice(1);\n            entries[normalizeKey(key)] = value;\n        });\n\n    return entries;\n};\n\ninterface CDNConfig {\n    archives: string,\n    archivesIndexSize: string,\n    archiveGroup: string,\n    patchArchives: string,\n    patchArchivesIndexSize: string,\n    patchArchiveGroup: string,\n    fileIndex: string,\n    fileIndexSize: string,\n    patchFileIndex: string,\n    patchFileIndexSize: string,\n}\n\nconst parseCDNConfig = (\n    text: string,\n): CDNConfig => parseConfig(text) as unknown as CDNConfig;\n\ninterface BuildConfig {\n    root: string,\n    install: string,\n    installSize: string,\n    download: string,\n    downloadSize: string,\n    size: string,\n    sizeSize: string,\n    encoding: string,\n    encodingSize: string,\n    patchIndex: string,\n    patchIndexSize: string,\n    patch: string,\n    patchSize: string,\n    patchConfig: string,\n    buildName: string,\n    buildUid: string,\n    buildProduct: string,\n    buildPlaybuildInstaller: string,\n    buildPartialPriority: string,\n    vfsRoot: string,\n    vfsRootSize: string,\n    [key: `vfs${number}` | `vfs${number}Size`]: string,\n}\n\nconst parseBuildConfig = (\n    text: string,\n): BuildConfig => parseConfig(text) as unknown as BuildConfig;\n\nexport { parseCDNConfig, parseBuildConfig };\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst ENC_MAGIC = 0x454e;\n\nconst MAGIC_OFFSET = 0;\nconst VERSION_OFFSET = 2;\nconst HASH_SIZE_CKEY_OFFSET = 3;\nconst HASH_SIZE_EKEY_OFFSET = 4;\nconst CKEY_PAGE_SIZE_OFFSET = 5;\nconst EKEY_PAGE_SIZE_OFFSET = 7;\nconst CKEY_PAGE_COUNT_OFFSET = 9;\nconst EKEY_PAGE_COUNT_OFFSET = 13;\n// const UNK11_OFFSET = 17;\nconst SPEC_BLOCK_SIZE_OFFSET = 18;\nconst SPEC_BLOCK_OFFSET = 22;\n\ninterface EncodingData {\n    eSpec: string[],\n    cKey2FileSize: Map<string, number>,\n    cKey2EKey: Map<string, string | string[]>,\n    eKey2ESpecIndex: Map<string, number>,\n    eKey2FileSize: Map<string, number>,\n}\n\nconst parseEncodingFile = (inputBuffer: Buffer, eKey: string, cKey: string): EncodingData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const encodingHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(encodingHash === cKey, `Invalid encoding hash: expected ${cKey}, got ${encodingHash}`);\n\n    const magic = buffer.readUInt16BE(MAGIC_OFFSET);\n    assert(magic === ENC_MAGIC, `Invalid encoding magic: ${magic.toString(16).padStart(4, '0')}`);\n\n    const version = buffer.readUInt8(VERSION_OFFSET);\n    const hashSizeCKey = buffer.readUInt8(HASH_SIZE_CKEY_OFFSET);\n    const hashSizeEKey = buffer.readUInt8(HASH_SIZE_EKEY_OFFSET);\n    const cKeyPageSizeKB = buffer.readUInt16BE(CKEY_PAGE_SIZE_OFFSET);\n    const eKeyPageSizeKB = buffer.readUInt16BE(EKEY_PAGE_SIZE_OFFSET);\n    const cKeyPageCount = buffer.readUInt32BE(CKEY_PAGE_COUNT_OFFSET);\n    const eKeyPageCount = buffer.readUInt32BE(EKEY_PAGE_COUNT_OFFSET);\n    const specBlockSize = buffer.readUInt32BE(SPEC_BLOCK_SIZE_OFFSET);\n\n    assert(version === 1, `Invalid encoding version: ${version.toString()}`);\n\n    const eSpec: string[] = [];\n    let eSpecStringStart = SPEC_BLOCK_OFFSET;\n    for (\n        let i = SPEC_BLOCK_OFFSET;\n        i < SPEC_BLOCK_OFFSET + specBlockSize;\n        i += 1\n    ) {\n        if (buffer[i] === 0x00) {\n            eSpec.push(buffer.toString('ascii', eSpecStringStart, i));\n            eSpecStringStart = i + 1;\n        }\n    }\n\n    const cKey2FileSize = new Map<string, number>();\n    const cKey2EKey = new Map<string, string | string[]>();\n    const cKeyPageIndexOffset = SPEC_BLOCK_OFFSET + specBlockSize;\n    const cKeyPageIndexEntrySize = hashSizeCKey + 0x10;\n    const cKeyPageOffset = cKeyPageIndexOffset + cKeyPageIndexEntrySize * cKeyPageCount;\n    const cKeyPageSize = cKeyPageSizeKB * 1024;\n    for (let i = 0; i < cKeyPageCount; i += 1) {\n        const indexOffset = cKeyPageIndexOffset + i * cKeyPageIndexEntrySize;\n        const pageOffset = cKeyPageOffset + i * cKeyPageSize;\n\n        const firstCKey = buffer.toString('hex', indexOffset, indexOffset + hashSizeCKey);\n        const pageChecksum = buffer.toString('hex', indexOffset + hashSizeCKey, indexOffset + hashSizeCKey + 0x10);\n\n        const pageBuffer = buffer.subarray(pageOffset, pageOffset + cKeyPageSize);\n        const pageHash = crypto.createHash('md5').update(pageBuffer).digest('hex');\n        assert(pageHash === pageChecksum, `Invalid ckey page ${i.toString()} checksum: expected ${pageChecksum}, got ${pageHash}`);\n\n        const pageFirstCKey = pageBuffer.toString('hex', 6, 6 + hashSizeCKey);\n        assert(pageFirstCKey === firstCKey, `Invalid ckey page ${i.toString()} first ckey: expected ${firstCKey}, got ${pageFirstCKey}`);\n\n        let pagePointer = 0;\n        while (pagePointer < cKeyPageSize) {\n            const keyCount = pageBuffer.readUInt8(pagePointer);\n            pagePointer += 1;\n            if (keyCount === 0x00) {\n                break;\n            }\n\n            const fileSize = pageBuffer.readUIntBE(pagePointer, 5);\n            pagePointer += 5;\n\n            const fileCKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeCKey);\n            pagePointer += hashSizeCKey;\n\n            cKey2FileSize.set(fileCKey, fileSize);\n\n            if (keyCount === 1) {\n                const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n                cKey2EKey.set(fileCKey, fileEKey);\n                pagePointer += hashSizeEKey;\n            } else {\n                const fileEKeys: string[] = [];\n                for (let j = 0; j < keyCount; j += 1) {\n                    const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n                    fileEKeys.push(fileEKey);\n                    pagePointer += hashSizeEKey;\n                }\n                cKey2EKey.set(fileCKey, fileEKeys);\n            }\n        }\n    }\n\n    const eKey2ESpecIndex = new Map<string, number>();\n    const eKey2FileSize = new Map<string, number>();\n    const eKeyPageIndexOffset = cKeyPageOffset + cKeyPageSize * cKeyPageCount;\n    const eKeyPageIndexEntrySize = hashSizeEKey + 0x10;\n    const eKeyPageOffset = eKeyPageIndexOffset + eKeyPageIndexEntrySize * eKeyPageCount;\n    const eKeyPageSize = eKeyPageSizeKB * 1024;\n    const eKeyPageEntrySize = hashSizeEKey + 0x04 + 0x05;\n    for (let i = 0; i < eKeyPageCount; i += 1) {\n        const indexOffset = eKeyPageIndexOffset + i * eKeyPageIndexEntrySize;\n        const pageOffset = eKeyPageOffset + i * eKeyPageSize;\n\n        const firstEKey = buffer.toString('hex', indexOffset, indexOffset + hashSizeEKey);\n        const pageChecksum = buffer.toString('hex', indexOffset + hashSizeEKey, indexOffset + hashSizeEKey + 0x10);\n\n        const pageBuffer = buffer.subarray(pageOffset, pageOffset + eKeyPageSize);\n        const pageHash = crypto.createHash('md5').update(pageBuffer).digest('hex');\n        assert(pageHash === pageChecksum, `Invalid ekey page ${i.toString()} checksum: expected ${pageChecksum}, got ${pageHash}`);\n\n        const pageFirstEKey = pageBuffer.toString('hex', 0, hashSizeEKey);\n        assert(pageFirstEKey === firstEKey, `Invalid ekey page ${i.toString()} first ekey: expected ${firstEKey}, got ${pageFirstEKey}`);\n\n        let pagePointer = 0;\n        while (pagePointer + eKeyPageEntrySize <= eKeyPageSize) {\n            const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n            pagePointer += hashSizeEKey;\n\n            const eSpecIndex = pageBuffer.readUInt32BE(pagePointer);\n            pagePointer += 4;\n            eKey2ESpecIndex.set(fileEKey, eSpecIndex);\n\n            const fileSize = pageBuffer.readUIntBE(pagePointer, 5);\n            pagePointer += 5;\n            eKey2FileSize.set(fileEKey, fileSize);\n        }\n    }\n\n    return {\n        eSpec, cKey2FileSize, cKey2EKey, eKey2ESpecIndex, eKey2FileSize,\n    };\n};\n\nexport default parseEncodingFile;\n\nexport type { EncodingData };\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst INSTALL_MAGIC = 0x494e;\n\nconst MAGIC_OFFSET = 0;\nconst VERSION_OFFSET = 2;\nconst HASH_SIZE_OFFSET = 3;\nconst NUM_TAGS_OFFSET = 4;\nconst NUM_ENTRIES_OFFSET = 6;\nconst TAGS_OFFSET = 10;\n\ninterface InstallTag {\n    name: string,\n    type: number,\n    files: boolean[],\n}\n\ninterface InstallFile {\n    name: string,\n    hash: string,\n    size: number,\n    tags: InstallTag[],\n}\n\ninterface InstallData {\n    tags: InstallTag[],\n    files: InstallFile[],\n}\n\nconst parseInstallFile = (inputBuffer: Buffer, eKey: string, cKey: string): InstallData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const installHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(installHash === cKey, `Invalid root hash: expected ${cKey}, got ${installHash}`);\n\n    const magic = buffer.readUInt16BE(MAGIC_OFFSET);\n    assert(magic === INSTALL_MAGIC, `Invalid install magic: ${magic.toString(16).padStart(4, '0')}`);\n\n    const version = buffer.readUInt8(VERSION_OFFSET);\n    const hashSize = buffer.readUInt8(HASH_SIZE_OFFSET);\n    const numTags = buffer.readUInt16BE(NUM_TAGS_OFFSET);\n    const numEntries = buffer.readUInt32BE(NUM_ENTRIES_OFFSET);\n\n    assert(version === 1, `Invalid install version: ${version.toString()}`);\n\n    let pointer = TAGS_OFFSET;\n\n    const tags: InstallTag[] = [];\n    for (let i = 0; i < numTags; i += 1) {\n        const startOffset = pointer;\n        while (buffer[pointer] !== 0x00) {\n            pointer += 1;\n        }\n\n        const name = buffer.toString('utf-8', startOffset, pointer);\n        pointer += 1;\n\n        const type = buffer.readUInt16BE(pointer);\n        pointer += 2;\n\n        const files = [];\n        const finalOffset = pointer + Math.ceil(numEntries / 8);\n        while (pointer < finalOffset) {\n            const byte = buffer.readUInt8(pointer);\n            pointer += 1;\n\n            for (let j = 7; j >= 0; j -= 1) {\n                // eslint-disable-next-line no-bitwise\n                files.push((byte & (1 << j)) > 0);\n            }\n        }\n\n        tags.push({ name, type, files });\n    }\n\n    const files: InstallFile[] = [];\n    for (let i = 0; i < numEntries; i += 1) {\n        const startOffset = pointer;\n        while (buffer[pointer] !== 0x00) {\n            pointer += 1;\n        }\n\n        const name = buffer.toString('utf-8', startOffset, pointer);\n        pointer += 1;\n\n        const hash = buffer.toString('hex', pointer, pointer + hashSize);\n        pointer += hashSize;\n\n        const size = buffer.readUInt32BE(pointer);\n        pointer += 4;\n\n        const fileTags = tags.filter((tag) => tag.files[i]);\n\n        files.push({\n            name,\n            hash,\n            size,\n            tags: fileTags,\n        });\n    }\n\n    return { tags, files };\n};\n\nexport default parseInstallFile;\n\nexport type { InstallFile, InstallData };\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nconst parseProductConfig = (text: string): Record<string, string>[] => {\n    const lines = text.split(/\\r?\\n/);\n\n    // First line contains field definitions.\n    // Example: Name!STRING:0|Path!STRING:0|Hosts!STRING:0|Servers!STRING:0|ConfigPath!STRING:0\n    // Whitespace is replaced so that a field like 'Install Key' becomes 'InstallKey'.\n    // This just improves coding readability when accessing the fields later on.\n    const headers = lines[0]\n        .split('|')\n        .map((header) => header.split('!')[0].replace(' ', ''));\n\n    const entries = lines\n        .filter((line, index) => index > 0 && line.trim().length !== 0 && !line.startsWith('#'))\n        .map((line) => {\n            const node: Record<string, string> = {};\n            const entryFields = line.split('|');\n            for (let i = 0, n = entryFields.length; i < n; i += 1) {\n                node[headers[i]] = entryFields[i];\n            }\n\n            return node;\n        });\n\n    return entries;\n};\n\ninterface Version {\n    Region: string,\n    BuildConfig: string,\n    CDNConfig: string,\n    KeyRing: string,\n    BuildId: string,\n    VersionsName: string,\n    ProductConfig: string,\n}\n\nconst parseProductVersions = (\n    text: string,\n): Version[] => parseProductConfig(text) as unknown as Version[];\n\ninterface CDN {\n    Name: string,\n    Path: string,\n    Hosts: string,\n    Servers: string,\n    ConfigPath: string,\n}\n\nconst parseProductCDNs = (\n    text: string,\n): CDN[] => parseProductConfig(text) as unknown as CDN[];\n\nexport { parseProductVersions, parseProductCDNs };\n\nexport type { Version };\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst MFST_MAGIC = 0x4d465354;\n\nconst ContentFlags = {\n    Install: 0x4,\n    LoadOnWindows: 0x8,\n    LoadOnMacOS: 0x10,\n    x86_32: 0x20,\n    x86_64: 0x40,\n    LowViolence: 0x80,\n    DoNotLoad: 0x100,\n    UpdatePlugin: 0x800,\n    ARM64: 0x8000,\n    Encrypted: 0x8000000,\n    NoNameHash: 0x10000000,\n    UncommonResolution: 0x20000000,\n    Bundle: 0x40000000,\n    NoCompression: 0x80000000,\n} as const;\n\nconst LocaleFlags = {\n    enUS: 0x2,\n    koKR: 0x4,\n    frFR: 0x10,\n    deDE: 0x20,\n    zhCN: 0x40,\n    esES: 0x80,\n    zhTW: 0x100,\n    enGB: 0x200,\n    // enCN: 0x400,\n    // enTW: 0x800,\n    esMX: 0x1000,\n    ruRU: 0x2000,\n    ptBR: 0x4000,\n    itIT: 0x8000,\n    ptPT: 0x10000,\n} as const;\n\ninterface FileInfo {\n    cKey: string,\n    contentFlags: number,\n    localeFlags: number,\n}\n\ninterface RootData {\n    fileDataID2CKey: Map<number, FileInfo[]>,\n    nameHash2FileDataID: Map<string, number>,\n}\n\nconst parseRootFile = (inputBuffer: Buffer, eKey: string, cKey: string): RootData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const rootHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(rootHash === cKey, `Invalid root hash: expected ${cKey}, got ${rootHash}`);\n\n    const fileDataID2CKey = new Map<number, FileInfo[]>();\n    const nameHash2FileDataID = new Map<string, number>();\n\n    const magic = buffer.readUInt32LE(0);\n    if (magic === MFST_MAGIC) {\n        // post 8.2.0\n        const firstEntry = buffer.readUInt32LE(4);\n        const newFormat = firstEntry < 100; // post 10.1.7\n\n        const headerSize = newFormat ? firstEntry : 12;\n        const version = newFormat ? buffer.readUInt32LE(8) : 0;\n        const totalFileCount = newFormat ? buffer.readUInt32LE(12) : firstEntry;\n        const namedFileCount = newFormat ? buffer.readUInt32LE(16) : buffer.readUInt32LE(8);\n\n        assert(version >= 0 && version <= 2, `Invalid root version: ${version.toString()}`);\n\n        const allowNonNamedFiles = totalFileCount !== namedFileCount;\n\n        let pointer = headerSize;\n        while (pointer < buffer.byteLength) {\n            const numRecords = buffer.readUInt32LE(pointer);\n\n            let contentFlags = 0;\n            let localeFlags = 0;\n            if (version >= 2) {\n                localeFlags = buffer.readUInt32LE(pointer + 4);\n\n                const contentFlags1 = buffer.readUInt32LE(pointer + 8);\n                const contentFlags2 = buffer.readUInt32LE(pointer + 12);\n                const contentFlags3 = buffer.readUInt8(pointer + 16);\n                // eslint-disable-next-line no-bitwise\n                contentFlags = (contentFlags1 | contentFlags2 | (contentFlags3 << 17));\n\n                pointer += 17;\n            } else {\n                contentFlags = buffer.readUInt32LE(pointer + 4);\n                localeFlags = buffer.readUInt32LE(pointer + 8);\n                pointer += 12;\n            }\n\n            const fileDataIDs = [];\n            let currFileDataID = -1;\n            for (let i = 0; i < numRecords; i += 1) {\n                currFileDataID += buffer.readUInt32LE(pointer) + 1;\n                fileDataIDs.push(currFileDataID);\n                pointer += 4;\n            }\n\n            for (let i = 0; i < numRecords; i += 1) {\n                const fileDataID = fileDataIDs[i];\n                const fileCKey = buffer.toString('hex', pointer, pointer + 16);\n                pointer += 16;\n\n                if (fileDataID2CKey.has(fileDataID)) {\n                    fileDataID2CKey.get(fileDataID)?.push({\n                        cKey: fileCKey,\n                        contentFlags,\n                        localeFlags,\n                    });\n                } else {\n                    fileDataID2CKey.set(fileDataID, [\n                        { cKey: fileCKey, contentFlags, localeFlags },\n                    ]);\n                }\n            }\n\n            // eslint-disable-next-line no-bitwise\n            if (!(allowNonNamedFiles && (contentFlags & ContentFlags.NoNameHash))) {\n                for (let i = 0; i < numRecords; i += 1) {\n                    const fileDataID = fileDataIDs[i];\n                    const nameHash = buffer.readBigUInt64LE(pointer).toString(16).padStart(16, '0');\n                    pointer += 8;\n\n                    nameHash2FileDataID.set(nameHash, fileDataID);\n                }\n            }\n        }\n    } else {\n        // pre 8.2.0\n        let pointer = 0;\n        while (pointer < buffer.byteLength) {\n            const numRecords = buffer.readUInt32LE(pointer);\n            const contentFlags = buffer.readUInt32LE(pointer + 4);\n            const localeFlags = buffer.readUInt32LE(pointer + 8);\n            pointer += 12;\n\n            const fileDataIDs = [];\n            let currFileDataID = -1;\n            for (let i = 0; i < numRecords; i += 1) {\n                currFileDataID += buffer.readUInt32LE(pointer) + 1;\n                fileDataIDs.push(currFileDataID);\n                pointer += 4;\n            }\n\n            for (let i = 0; i < numRecords; i += 1) {\n                const fileDataID = fileDataIDs[i];\n                const fileCKey = buffer.toString('hex', pointer, pointer + 16);\n                const nameHash = buffer.toString('hex', pointer + 16, pointer + 24);\n                pointer += 24;\n\n                if (fileDataID2CKey.has(fileDataID)) {\n                    fileDataID2CKey.get(fileDataID)?.push({\n                        cKey: fileCKey,\n                        contentFlags,\n                        localeFlags,\n                    });\n                } else {\n                    fileDataID2CKey.set(fileDataID, [\n                        { cKey: fileCKey, contentFlags, localeFlags },\n                    ]);\n                }\n\n                nameHash2FileDataID.set(nameHash, fileDataID);\n            }\n        }\n    }\n\n    return { fileDataID2CKey, nameHash2FileDataID };\n};\n\nexport default parseRootFile;\n\nexport { ContentFlags, LocaleFlags };\n\nexport type { FileInfo, RootData };\n","const JEDEC = [\n    'B',\n    'KB',\n    'MB',\n    'GB',\n    'TB',\n    'PB',\n    'EB',\n    'ZB',\n    'YB',\n];\n// Simplified version of https://github.com/avoidwork/filesize.js\nexport const formatFileSize = (input: number) => {\n    if (Number.isNaN(input)) return '';\n\n    let size = Number(input);\n    const isNegative = size < 0;\n    const result = [];\n\n    // Flipping a negative number to determine the size.\n    if (isNegative) size = -size;\n\n    // Determining the exponent.\n    let exponent = Math.floor(Math.log(size) / Math.log(1024));\n    if (exponent < 0) exponent = 0;\n\n    // Exceeding supported length, time to reduce & multiply.\n    if (exponent > 8) exponent = 8;\n\n    // Zero is now a special case because bytes divide by 1.\n    if (size === 0) {\n        result[0] = 0;\n        result[1] = JEDEC[exponent];\n    } else {\n        const val = size / (2 ** (exponent * 10));\n\n        result[0] = Number(val.toFixed(exponent > 0 ? 2 : 0));\n\n        if (result[0] === 1024 && exponent < 8) {\n            result[0] = 1;\n            exponent += 1;\n        }\n\n        result[1] = JEDEC[exponent];\n    }\n\n    // Decorating a 'diff'.\n    if (isNegative) result[0] = -result[0];\n\n    return result.join(' ');\n};\n\nexport const resolveCDNHost = async (\n    hosts: string[],\n    path: string,\n): Promise<string[]> => {\n    const latencies = await Promise.allSettled(\n        hosts.map(async (host) => {\n            const start = Date.now();\n            await fetch(`http://${host}/`);\n            const end = Date.now();\n            return {\n                host,\n                latency: end - start,\n            };\n        }),\n    );\n\n    const resolved = latencies\n        .filter((result): result is PromiseFulfilledResult<{\n            host: string, latency: number,\n        }> => result.status === 'fulfilled')\n        .map((result) => result.value)\n        .sort((a, b) => a.latency - b.latency);\n\n    return resolved.map((result) => `http://${result.host}/${path}`);\n};\n","import assert from 'node:assert';\n\nimport type ADBReader from './adb.ts';\nimport type { MissingKeyBlock } from './blte.ts';\n\nconst WDC5_MAGIC = 0x57444335;\n\ninterface SectionHeader {\n    tactKeyHash: bigint,\n    fileOffset: number,\n    recordCount: number,\n    stringTableSize: number,\n    offsetRecordsEnd: number,\n    idListSize: number,\n    relationshipDataSize: number,\n    offsetMapIDCount: number,\n    copyTableCount: number,\n}\n\ninterface FieldStructure {\n    size: number,\n    position: number,\n}\n\ninterface FieldStorageInfoCompressionNone {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'none',\n}\n\ninterface FieldStorageInfoCompressionBitpacked {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpacked',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    flags: number,\n}\n\ninterface FieldStorageInfoCompressionCommonData {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'commonData',\n    defaultValue: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedIndexed {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedIndexed',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedIndexedArray {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedIndexedArray',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    arrayCount: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedSigned {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedSigned',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    flags: number,\n}\n\ntype FieldStorageInfo = FieldStorageInfoCompressionNone\n    | FieldStorageInfoCompressionBitpacked\n    | FieldStorageInfoCompressionCommonData\n    | FieldStorageInfoCompressionBitpackedIndexed\n    | FieldStorageInfoCompressionBitpackedIndexedArray\n    | FieldStorageInfoCompressionBitpackedSigned;\n\ninterface OffsetMapEntry {\n    offset: number,\n    size: number,\n    data: Buffer,\n}\n\ninterface ParsedFieldNone {\n    type: 'none',\n    data: number | bigint,\n    string?: string,\n}\n\ninterface ParsedFieldCommonData {\n    type: 'commonData',\n    data: number,\n}\n\ninterface ParsedFieldBitpacked {\n    type: 'bitpacked',\n    data: number,\n}\n\ninterface ParsedFieldBitpackedArray {\n    type: 'bitpackedArray',\n    data: number[],\n}\n\ntype ParsedField = ParsedFieldNone\n    | ParsedFieldCommonData\n    | ParsedFieldBitpacked\n    | ParsedFieldBitpackedArray;\n\ninterface SparseRow {\n    type: 'sparse',\n    data: Buffer,\n}\n\ninterface Section {\n    header: SectionHeader,\n    isZeroed: boolean,\n    recordDataSize: number,\n    records: Buffer[],\n    idList: number[],\n    offsetMap: OffsetMapEntry[],\n    relationshipMap: Map<number, number>,\n}\n\ninterface HotfixModify {\n    type: 'modify',\n    data: Buffer,\n}\n\ninterface HotfixDelete {\n    type: 'delete',\n}\n\ntype Hotfix = HotfixModify | HotfixDelete;\n\n/* eslint-disable no-bitwise */\nconst readBitpackedValue = (\n    buffer: Buffer,\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    signed = false,\n) => {\n    const offsetBytes = fieldOffsetBits >>> 3;\n    const bitOffset = fieldOffsetBits & 0x7;\n    const sizeBytes = Math.ceil((fieldSizeBits + bitOffset) / 8);\n\n    if (sizeBytes <= 6) {\n        // safe to be number\n        const rawValue = buffer.readUIntLE(offsetBytes, sizeBytes);\n        return Number(\n            signed\n                ? BigInt.asIntN(fieldSizeBits, BigInt(rawValue >>> bitOffset))\n                : BigInt.asUintN(fieldSizeBits, BigInt(rawValue >>> bitOffset)),\n        );\n    }\n\n    // need to be bigint\n    let value = 0n;\n\n    for (let i = sizeBytes - 1; i >= 0; i -= 1) {\n        const byte = buffer.readUInt8(offsetBytes + i);\n        value = (value << 8n) | BigInt(byte);\n    }\n\n    return signed\n        ? BigInt.asIntN(fieldSizeBits, value >> BigInt(bitOffset))\n        : BigInt.asUintN(fieldSizeBits, value >> BigInt(bitOffset));\n};\n/* eslint-enable no-bitwise */\n\nexport default class WDCReader {\n    public readonly tableHash: number;\n\n    public readonly layoutHash: number;\n\n    public readonly locale: number;\n\n    public readonly isNormal: boolean;\n\n    public readonly hasRelationshipData: boolean;\n\n    public readonly fields: FieldStructure[];\n\n    public readonly fieldsInfo: FieldStorageInfo[];\n\n    public readonly rows = new Map<number, ParsedField[] | SparseRow>();\n\n    public readonly relationships = new Map<number, number>();\n\n    public readonly copyTable = new Map<number, number>();\n\n    public readonly hotfixes = new Map<number, Hotfix>();\n\n    constructor(buffer: Buffer, blocks: MissingKeyBlock[] = [], adb?: ADBReader) {\n        const magic = buffer.readUInt32BE(0);\n        const version = buffer.readUInt32LE(4);\n        // const schema = buffer.toString('ascii', 8, 136);\n        // const recordCount = buffer.readUInt32LE(136);\n        const fieldCount = buffer.readUInt32LE(140);\n        const recordSize = buffer.readUInt32LE(144);\n        // const stringTableSize = buffer.readUInt32LE(148);\n        const tableHash = buffer.readUInt32LE(152);\n        const layoutHash = buffer.readUInt32LE(156);\n        // const minID = buffer.readUInt32LE(160);\n        // const maxID = buffer.readUInt32LE(164);\n        const locale = buffer.readUInt32LE(168);\n        const flags = buffer.readUInt16LE(172);\n        const idIndex = buffer.readUInt16LE(174);\n        // const totalFieldCount = buffer.readUInt32LE(176);\n        // const bitpackedDataOffset = buffer.readUInt32LE(180);\n        // const lookupColumnCount = buffer.readUInt32LE(184);\n        const fieldStorageInfoSize = buffer.readUInt32LE(188);\n        const commonDataSize = buffer.readUInt32LE(192);\n        const palletDataSize = buffer.readUInt32LE(196);\n        const sectionCount = buffer.readUInt32LE(200);\n\n        assert(magic === WDC5_MAGIC, `Invalid WDC5 magic: ${magic.toString(16).padStart(8, '0')}`);\n        assert(version === 5, `Invalid WDC5 version: ${version.toString()}`);\n\n        this.tableHash = tableHash;\n        this.layoutHash = layoutHash;\n        this.locale = locale;\n\n        // eslint-disable-next-line no-bitwise\n        const isNormal = !(flags & 0x1);\n        // eslint-disable-next-line no-bitwise\n        const hasRelationshipData = !!(flags & 0x2);\n\n        this.isNormal = isNormal;\n        this.hasRelationshipData = hasRelationshipData;\n\n        const sectionHeaders: SectionHeader[] = [];\n        const sectionHeadersOffset = 204;\n        for (let i = 0; i < sectionCount; i += 1) {\n            const sectionHeaderOffset = sectionHeadersOffset + i * 40;\n\n            sectionHeaders.push({\n                tactKeyHash: buffer.readBigUInt64LE(sectionHeaderOffset),\n                fileOffset: buffer.readUInt32LE(sectionHeaderOffset + 8),\n                recordCount: buffer.readUInt32LE(sectionHeaderOffset + 12),\n                stringTableSize: buffer.readUInt32LE(sectionHeaderOffset + 16),\n                offsetRecordsEnd: buffer.readUInt32LE(sectionHeaderOffset + 20),\n                idListSize: buffer.readUInt32LE(sectionHeaderOffset + 24),\n                relationshipDataSize: buffer.readUInt32LE(sectionHeaderOffset + 28),\n                offsetMapIDCount: buffer.readUInt32LE(sectionHeaderOffset + 32),\n                copyTableCount: buffer.readUInt32LE(sectionHeaderOffset + 36),\n            });\n        }\n\n        const fields: FieldStructure[] = [];\n        const fieldsOffset = 204 + sectionCount * 40;\n        for (let i = 0; i < fieldCount; i += 1) {\n            const fieldOffset = fieldsOffset + i * 4;\n            fields.push({\n                size: buffer.readInt16LE(fieldOffset),\n                position: buffer.readUInt16LE(fieldOffset + 2),\n            });\n        }\n        this.fields = fields;\n\n        const fieldsInfo: FieldStorageInfo[] = [];\n        const fieldsInfoOffset = fieldsOffset + fieldCount * 4;\n        for (let i = 0; i < fieldStorageInfoSize / 24; i += 1) {\n            const fieldInfoOffset = fieldsInfoOffset + i * 24;\n\n            const fieldOffsetBits = buffer.readUInt16LE(fieldInfoOffset);\n            const fieldSizeBits = buffer.readUInt16LE(fieldInfoOffset + 2);\n            const additionalDataSize = buffer.readUInt32LE(fieldInfoOffset + 4);\n            const storageType = buffer.readUInt32LE(fieldInfoOffset + 8);\n            const arg1 = buffer.readUInt32LE(fieldInfoOffset + 12);\n            const arg2 = buffer.readUInt32LE(fieldInfoOffset + 16);\n            const arg3 = buffer.readUInt32LE(fieldInfoOffset + 20);\n\n            switch (storageType) {\n                case 0:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'none',\n                    });\n                    break;\n                case 1:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpacked',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        flags: arg3,\n                    });\n                    break;\n                case 2:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'commonData',\n                        defaultValue: arg1,\n                    });\n                    break;\n                case 3:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedIndexed',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                    });\n                    break;\n                case 4:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedIndexedArray',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        arrayCount: arg3,\n                    });\n                    break;\n                case 5:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedSigned',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        flags: arg3,\n                    });\n                    break;\n                default:\n                    throw new Error(`Unknown storage type: ${storageType.toString(16).padStart(8, '0')}`);\n            }\n        }\n        this.fieldsInfo = fieldsInfo;\n\n        const palletData = new Map<number, number[]>();\n        const palletDataOffset = fieldsInfoOffset + fieldStorageInfoSize;\n        let palletDataPointer = palletDataOffset;\n        for (let i = 0; i < fieldsInfo.length; i += 1) {\n            const fieldInfo = fieldsInfo[i];\n            if (fieldInfo.storageType === 'bitpackedIndexed' || fieldInfo.storageType === 'bitpackedIndexedArray') {\n                const data: number[] = [];\n                for (let j = 0; j < fieldInfo.additionalDataSize / 4; j += 1) {\n                    data.push(buffer.readUInt32LE(palletDataPointer));\n                    palletDataPointer += 4;\n                }\n                palletData.set(i, data);\n            }\n        }\n\n        assert(\n            palletDataPointer === palletDataOffset + palletDataSize,\n            `Invalid pallet data size: ${(palletDataPointer - palletDataOffset).toString()} != ${palletDataSize.toString()}`,\n        );\n\n        const commonData = new Map<number, Map<number, number>>();\n        const commonDataOffset = palletDataPointer;\n        let commonDataPointer = commonDataOffset;\n        for (let i = 0; i < fieldsInfo.length; i += 1) {\n            const fieldInfo = fieldsInfo[i];\n            if (fieldInfo.storageType === 'commonData') {\n                const map = new Map<number, number>();\n                for (let j = 0; j < fieldInfo.additionalDataSize / 8; j += 1) {\n                    map.set(\n                        buffer.readUInt32LE(commonDataPointer),\n                        buffer.readUInt32LE(commonDataPointer + 4),\n                    );\n                    commonDataPointer += 8;\n                }\n                commonData.set(i, map);\n            }\n        }\n\n        assert(\n            commonDataPointer === commonDataOffset + commonDataSize,\n            `Invalid common data size: ${(commonDataPointer - commonDataOffset).toString()} != ${commonDataSize.toString()}`,\n        );\n\n        const encryptedIDs = new Map<number, number[]>();\n        const encryptedRecordsOffset = commonDataPointer;\n        let encryptedRecordsPointer = encryptedRecordsOffset;\n        for (let i = 0; i < sectionHeaders.length; i += 1) {\n            const sectionHeader = sectionHeaders[i];\n            if (sectionHeader.tactKeyHash !== 0n) {\n                const count = buffer.readUInt32LE(encryptedRecordsPointer);\n                encryptedRecordsPointer += 4;\n\n                const data: number[] = [];\n                for (let j = 0; j < count; j += 1) {\n                    data.push(buffer.readUInt32LE(encryptedRecordsPointer));\n                    encryptedRecordsPointer += 4;\n                }\n                encryptedIDs.set(i, data);\n            }\n        }\n\n        const stringTable = new Map<number, string>();\n        let stringTableDelta = 0;\n\n        const sectionsOffset = encryptedRecordsPointer;\n        let sectionPointer = sectionsOffset;\n        const sections = sectionHeaders.map((sectionHeader): Section => {\n            assert(\n                sectionPointer === sectionHeader.fileOffset,\n                `Invalid section offset: ${sectionPointer.toString()} != ${sectionHeader.fileOffset.toString()}`,\n            );\n\n            const sectionRecordSize = isNormal\n                ? (sectionHeader.recordCount * recordSize + sectionHeader.stringTableSize)\n                : (sectionHeader.offsetRecordsEnd - sectionPointer);\n\n            const sectionSize = sectionRecordSize\n                + sectionHeader.idListSize\n                + sectionHeader.copyTableCount * 8\n                + sectionHeader.offsetMapIDCount * 10\n                + sectionHeader.relationshipDataSize;\n\n            const recordDataSize = isNormal\n                ? recordSize * sectionHeader.recordCount\n                : sectionHeader.offsetRecordsEnd - sectionHeader.fileOffset;\n\n            const isZeroed = blocks.some((block) => {\n                const sectionStart = sectionHeader.fileOffset;\n                const sectionEnd = sectionStart + sectionSize;\n                const blockStart = block.offset;\n                const blockEnd = blockStart + block.size;\n\n                return sectionStart >= blockStart && sectionEnd <= blockEnd;\n            });\n\n            if (isZeroed) {\n                sectionPointer += sectionSize;\n                if (isNormal) {\n                    stringTableDelta += sectionHeader.stringTableSize;\n                }\n                return {\n                    header: sectionHeader,\n                    isZeroed,\n                    recordDataSize,\n                    records: [],\n                    idList: [],\n                    offsetMap: [],\n                    relationshipMap: new Map(),\n                };\n            }\n\n            const records: Buffer[] = [];\n            if (isNormal) {\n                for (let j = 0; j < sectionHeader.recordCount; j += 1) {\n                    records.push(buffer.subarray(sectionPointer, sectionPointer + recordSize));\n                    sectionPointer += recordSize;\n                }\n\n                const stringTableOffset = sectionPointer;\n                let stringStartPointer = stringTableOffset;\n                while (sectionPointer < stringTableOffset + sectionHeader.stringTableSize) {\n                    if (buffer[sectionPointer] === 0x00) {\n                        if (sectionPointer - stringStartPointer > 0) {\n                            const string = buffer.toString('utf-8', stringStartPointer, sectionPointer);\n                            stringTable.set(\n                                stringStartPointer - stringTableOffset + stringTableDelta,\n                                string,\n                            );\n                        }\n\n                        stringStartPointer = sectionPointer + 1;\n                    }\n                    sectionPointer += 1;\n                }\n                stringTableDelta += sectionHeader.stringTableSize;\n            } else {\n                sectionPointer = sectionHeader.offsetRecordsEnd;\n            }\n\n            const idList: number[] = [];\n            for (let j = 0; j < sectionHeader.idListSize / 4; j += 1) {\n                idList.push(buffer.readUInt32LE(sectionPointer));\n                sectionPointer += 4;\n            }\n\n            for (let j = 0; j < sectionHeader.copyTableCount; j += 1) {\n                const dst = buffer.readUInt32LE(sectionPointer);\n                const src = buffer.readUInt32LE(sectionPointer + 4);\n                this.copyTable.set(dst, src);\n\n                sectionPointer += 8;\n            }\n\n            const offsetMap: OffsetMapEntry[] = [];\n            for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                const offset = buffer.readUInt32LE(sectionPointer);\n                const size = buffer.readUInt16LE(sectionPointer + 4);\n                const data = buffer.subarray(offset, offset + size);\n\n                sectionPointer += 6;\n\n                offsetMap.push({\n                    offset,\n                    size,\n                    data,\n                });\n            }\n\n            const offsetMapIDList: number[] = [];\n\n            if (hasRelationshipData) {\n                // Note, if flag 0x02 is set,\n                // offset_map_id_list will appear before relationship_map instead\n                for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                    offsetMapIDList.push(buffer.readUInt32LE(sectionPointer));\n                    sectionPointer += 4;\n                }\n            }\n\n            const relationshipMap = new Map<number, number>();\n            if (sectionHeader.relationshipDataSize > 0) {\n                const numEntries = buffer.readUInt32LE(sectionPointer);\n                // const relationshipMinID = buffer.readUInt32LE(sectionPointer + 4);\n                // const relationshipMaxID = buffer.readUInt32LE(sectionPointer + 8);\n\n                sectionPointer += 12;\n\n                for (let j = 0; j < numEntries; j += 1) {\n                    const foreignID = buffer.readUInt32LE(sectionPointer);\n                    const recordIndex = buffer.readUInt32LE(sectionPointer + 4);\n                    sectionPointer += 8;\n\n                    relationshipMap.set(recordIndex, foreignID);\n                }\n            }\n\n            if (!hasRelationshipData) {\n                // see if (hasRelationshipData)\n                for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                    offsetMapIDList.push(buffer.readUInt32LE(sectionPointer));\n                    sectionPointer += 4;\n                }\n            }\n\n            return {\n                header: sectionHeader,\n                isZeroed,\n                recordDataSize,\n                records,\n                idList,\n                offsetMap,\n                relationshipMap,\n            };\n        });\n\n        const totalRecordDataSize = sections\n            .reduce((acc, section) => acc + section.recordDataSize, 0);\n        sections.forEach((section) => {\n            const {\n                header, isZeroed, records, idList, offsetMap, relationshipMap,\n            } = section;\n\n            const prevRecordDataSize = sections\n                .filter((s) => s.header.fileOffset < header.fileOffset)\n                .reduce((acc, s) => acc + s.recordDataSize, 0);\n\n            if (isZeroed) {\n                return;\n            }\n\n            for (let recordIndex = 0; recordIndex < header.recordCount; recordIndex += 1) {\n                let recordID = idList.length > 0 ? idList[recordIndex] : undefined;\n                const recordBuffer = isNormal\n                    ? records[recordIndex]\n                    : offsetMap[recordIndex].data;\n\n                if (isNormal) {\n                    const recordData = fieldsInfo.map((fieldInfo, fieldIndex): ParsedField => {\n                        switch (fieldInfo.storageType) {\n                            case 'none': {\n                                const value = readBitpackedValue(\n                                    recordBuffer,\n                                    fieldInfo.fieldOffsetBits,\n                                    fieldInfo.fieldSizeBits,\n                                );\n\n                                if (typeof value === 'bigint') {\n                                    return {\n                                        type: 'none',\n                                        data: value,\n                                    };\n                                }\n\n                                if (recordID === undefined && fieldIndex === idIndex) {\n                                    recordID = value;\n                                }\n\n                                // eslint-disable-next-line no-bitwise\n                                const fieldOffset = fieldInfo.fieldOffsetBits >>> 3;\n                                const offset = prevRecordDataSize - totalRecordDataSize\n                                    + (recordSize * recordIndex) + fieldOffset + value;\n\n                                return {\n                                    type: 'none',\n                                    data: value,\n                                    string: stringTable.get(offset),\n                                };\n                            }\n                            case 'commonData': {\n                                const value = recordID !== undefined\n                                    ? commonData.get(fieldIndex)?.get(recordID)\n                                    : undefined;\n\n                                return {\n                                    type: 'commonData',\n                                    data: value ?? fieldInfo.defaultValue,\n                                };\n                            }\n                            case 'bitpacked':\n                            case 'bitpackedSigned':\n                            case 'bitpackedIndexed':\n                            case 'bitpackedIndexedArray': {\n                                let value = readBitpackedValue(\n                                    recordBuffer,\n                                    fieldInfo.fieldOffsetBits,\n                                    fieldInfo.fieldSizeBits,\n                                    fieldInfo.storageType === 'bitpackedSigned',\n                                );\n\n                                assert(typeof value === 'number', 'Bitpacked value must be a number');\n\n                                if (fieldInfo.storageType === 'bitpackedIndexedArray') {\n                                    const fieldPalletData = palletData.get(fieldIndex);\n\n                                    assert(fieldPalletData, `No pallet data for field ${fieldIndex.toString()}`);\n\n                                    const data: number[] = [];\n                                    const palletStart = value * fieldInfo.arrayCount;\n\n                                    for (let j = 0; j < fieldInfo.arrayCount; j += 1) {\n                                        data.push(fieldPalletData[palletStart + j]);\n                                    }\n\n                                    return {\n                                        type: 'bitpackedArray',\n                                        data,\n                                    };\n                                }\n\n                                if (fieldInfo.storageType === 'bitpackedIndexed') {\n                                    const fieldPalletData = palletData.get(fieldIndex);\n\n                                    assert(fieldPalletData, `No pallet data for field ${fieldIndex.toString()}`);\n\n                                    value = fieldPalletData[value];\n                                }\n\n                                if (recordID === undefined && fieldIndex === idIndex) {\n                                    recordID = value;\n                                }\n\n                                return {\n                                    type: 'bitpacked',\n                                    data: value,\n                                };\n                            }\n                            default:\n                                fieldInfo satisfies never;\n                                throw new Error('Unreachable');\n                        }\n                    });\n\n                    assert(recordID !== undefined, 'No record ID found');\n\n                    this.rows.set(recordID, recordData);\n\n                    const foreignID = relationshipMap.get(recordIndex);\n                    if (foreignID !== undefined) {\n                        this.relationships.set(recordID, foreignID);\n                    }\n                } else {\n                    const recordData = {\n                        type: 'sparse',\n                        data: recordBuffer,\n                    } satisfies SparseRow;\n\n                    // for now (10.2.5), every sparse table has idList\n                    // so we can safely assume recordID is not undefined\n                    assert(recordID !== undefined, 'No record ID found');\n\n                    this.rows.set(recordID, recordData);\n\n                    const foreignID = relationshipMap.get(recordIndex);\n                    if (foreignID !== undefined) {\n                        this.relationships.set(recordID, foreignID);\n                    }\n                }\n            }\n        });\n\n        const entries = adb?.tableEntries.get(tableHash);\n        entries\n            ?.filter((entry) => entry.pushID !== -1)\n            .sort((a, b) => a.pushID - b.pushID)\n            .forEach((entry) => {\n                switch (entry.recordState) {\n                    case 1: // Valid\n                        this.hotfixes.set(entry.recordID, { type: 'modify', data: entry.data });\n                        break;\n                    case 2: // Delete\n                        this.hotfixes.set(entry.recordID, { type: 'delete' });\n                        break;\n                    case 3: // Invalid\n                        this.hotfixes.delete(entry.recordID);\n                        break;\n                    case 4: // NotPublic\n                        break;\n                    default:\n                        throw new Error(`Unknown record state: ${entry.recordState.toString()}`);\n                }\n            });\n    }\n\n    getAllIDs(): number[] {\n        return [...this.rows.keys(), ...this.copyTable.keys()];\n    }\n\n    getRowData(id: number): ParsedField[] | SparseRow | undefined {\n        const hotfix = this.hotfixes.get(id);\n        if (hotfix) {\n            switch (hotfix.type) {\n                case 'modify':\n                    return {\n                        type: 'sparse',\n                        data: hotfix.data,\n                    };\n                case 'delete':\n                    return undefined;\n                default:\n                    hotfix satisfies never;\n                    throw new Error('Unreachable');\n            }\n        }\n\n        const dst = this.copyTable.get(id);\n        if (dst !== undefined) {\n            return this.rows.get(dst);\n        }\n        return this.rows.get(id);\n    }\n\n    getRowRelationship(id: number): number | undefined {\n        const dst = this.copyTable.get(id);\n        if (dst !== undefined) {\n            return this.relationships.get(dst);\n        }\n        return this.relationships.get(id);\n    }\n}\n\nexport type {\n    FieldStructure,\n    FieldStorageInfo,\n    FieldStorageInfoCompressionNone,\n    FieldStorageInfoCompressionBitpacked,\n    FieldStorageInfoCompressionCommonData,\n    FieldStorageInfoCompressionBitpackedIndexed,\n    FieldStorageInfoCompressionBitpackedIndexedArray,\n    FieldStorageInfoCompressionBitpackedSigned,\n    ParsedField,\n    ParsedFieldNone,\n    ParsedFieldCommonData,\n    ParsedFieldBitpacked,\n    ParsedFieldBitpackedArray,\n    SparseRow,\n    Hotfix,\n    HotfixModify,\n    HotfixDelete,\n};\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport { mapLimit, retry } from 'async';\nimport cliProgress from 'cli-progress';\n\nimport BLTEReader from './blte.ts';\nimport {\n    getProductVersions,\n    getProductCDNs,\n    getConfigFile,\n    getDataFile,\n} from './fetcher.ts';\nimport getNameHash from './jenkins96.ts';\nimport parseArchiveIndex from './parsers/archiveIndex.ts';\nimport { parseCDNConfig, parseBuildConfig } from './parsers/config.ts';\nimport parseEncodingFile from './parsers/encodingFile.ts';\nimport parseInstallFile from './parsers/installFile.ts';\nimport { parseProductVersions, parseProductCDNs } from './parsers/productConfig.ts';\nimport parseRootFile, { LocaleFlags, ContentFlags } from './parsers/rootFile.ts';\nimport { resolveCDNHost, formatFileSize } from './utils.ts';\nimport WDCReader from './wdc.ts';\n\nimport type ADBReader from './adb.ts';\nimport type { MissingKeyBlock } from './blte.ts';\nimport type { ArchiveIndex } from './parsers/archiveIndex.ts';\nimport type { EncodingData } from './parsers/encodingFile.ts';\nimport type { InstallFile, InstallData } from './parsers/installFile.ts';\nimport type { Version } from './parsers/productConfig.ts';\nimport type { FileInfo, RootData } from './parsers/rootFile.ts';\n\ninterface ClientPreloadData {\n    prefixes: string[],\n    archives: Map<string, ArchiveIndex>,\n    encoding: EncodingData,\n    rootFile: RootData,\n    install: InstallData,\n}\n\ninterface FileFetchResultFull {\n    type: 'full',\n    buffer: Buffer,\n    blocks: undefined,\n}\n\ninterface FileFetchResultPartial {\n    type: 'partial',\n    buffer: Buffer,\n    blocks: MissingKeyBlock[],\n}\n\ntype FileFetchResult = FileFetchResultFull | FileFetchResultPartial;\n\nenum LogLevel {\n    error = 0,\n    warn = 1,\n    info = 2,\n    debug = 3,\n}\n\nconst textLogLevel = [\n    'ERROR',\n    'WARN',\n    'INFO',\n    'DEBUG',\n] as const;\n\nexport default class CASCClient {\n    public readonly region: string;\n\n    public readonly product: string;\n\n    public readonly version: Version;\n\n    public readonly name2FileDataID = new Map<string, number>();\n\n    public readonly keys = new Map<string, Uint8Array>();\n\n    public preload?: ClientPreloadData;\n\n    static async getProductVersion(region: string, product: string): Promise<Version | undefined> {\n        const versionsText = await getProductVersions(region, product);\n        const versions = parseProductVersions(versionsText);\n        return versions.find((version) => version.Region === region);\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static LocaleFlags = LocaleFlags;\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static ContentFlags = ContentFlags;\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static LogLevel = LogLevel;\n\n    public logLevel: LogLevel;\n\n    constructor(region: string, product: string, version: Version, logLevel = LogLevel.info) {\n        this.region = region;\n        this.product = product;\n        this.version = version;\n        this.logLevel = logLevel;\n    }\n\n    private log(level: LogLevel, message: unknown): void {\n        if (level <= this.logLevel) {\n            if (level <= LogLevel.error) {\n                console.error(`${new Date().toISOString()} [${textLogLevel[level]}]:`, message);\n            } else {\n                console.info(`${new Date().toISOString()} [${textLogLevel[level]}]:`, message);\n            }\n        }\n    }\n\n    async init(): Promise<void> {\n        this.log(LogLevel.info, 'Preloading remote CASC build:');\n        this.log(LogLevel.info, this.version);\n\n        this.log(LogLevel.info, 'Fetching CDN configuration...');\n        const serverConfigText = await getProductCDNs(this.region, this.product);\n        const serverConfig = parseProductCDNs(serverConfigText).find(\n            (config) => config.Name === this.region,\n        );\n        assert(serverConfig, 'No server config found');\n\n        this.log(LogLevel.info, 'Locating fastest CDN server...');\n        const prefixes = await resolveCDNHost(\n            serverConfig.Hosts.split(' '),\n            serverConfig.Path,\n        );\n        this.log(LogLevel.info, 'Resolved CDN servers:');\n        prefixes.forEach((prefix) => {\n            this.log(LogLevel.info, prefix);\n        });\n\n        this.log(LogLevel.info, 'Fetching build configurations...');\n        const cdnConfigText = await getConfigFile(prefixes, this.version.CDNConfig, {\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        const cdnConfig = parseCDNConfig(cdnConfigText);\n        const buildConfigText = await getConfigFile(prefixes, this.version.BuildConfig, {\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        const buildConfig = parseBuildConfig(buildConfigText);\n\n        this.log(LogLevel.info, 'Loading archives...');\n        const archiveKeys = cdnConfig.archives.split(' ');\n        const archiveCount = archiveKeys.length;\n        const archiveTotalSize = cdnConfig.archivesIndexSize\n            .split(' ')\n            .reduce((a, b) => a + parseInt(b, 10), 0);\n        const archiveBar = this.logLevel >= LogLevel.info\n            ? new cliProgress.SingleBar({ etaBuffer: 100 }, cliProgress.Presets.shades_classic)\n            : undefined;\n        archiveBar?.start(archiveCount, 0);\n        const archivesMapArray = await mapLimit(\n            archiveKeys,\n            50,\n            async (key: string) => {\n                const fileName = `${key}.index`;\n                const buffer = await retry({\n                    times: 5,\n                    interval: 3000,\n                }, async () => getDataFile(prefixes, fileName, 'indexes', this.version.BuildConfig, {\n                    showProgress: this.logLevel >= LogLevel.info,\n                    showAttemptFail: this.logLevel >= LogLevel.warn,\n                }));\n                const map = parseArchiveIndex(buffer, key);\n\n                archiveBar?.increment();\n\n                return map;\n            },\n        )\n            .then((result) => {\n                archiveBar?.stop();\n                return result.flatMap((e) => [...e]);\n            })\n            .catch((error: unknown) => {\n                archiveBar?.stop();\n                throw error;\n            });\n        const archives = new Map(archivesMapArray);\n        this.log(\n            LogLevel.info,\n            `Loaded ${archiveCount.toString()} archives (${archives.size.toString()} entries, ${formatFileSize(archiveTotalSize)})`,\n        );\n\n        this.log(LogLevel.info, 'Loading encoding table...');\n        const [encodingCKey, encodingEKey] = buildConfig.encoding.split(' ');\n        const encodingBuffer = await getDataFile(prefixes, encodingEKey, 'build', this.version.BuildConfig, {\n            name: 'encoding',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded encoding table (${formatFileSize(encodingBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing encoding table...');\n        const encoding = parseEncodingFile(encodingBuffer, encodingEKey, encodingCKey);\n        this.log(LogLevel.info, `Parsed encoding table (${encoding.cKey2EKey.size.toString()} entries)`);\n\n        const getBuildConfigKeys = (configText: string): [string, string] => {\n            if (configText.includes(' ')) {\n                const [cKey, eKey] = configText.split(' ');\n                return [cKey, eKey];\n            }\n\n            const cKey = configText;\n            const eKeys = encoding.cKey2EKey.get(cKey);\n            assert(eKeys !== undefined, `Failing to find encoding key for ${cKey}`);\n\n            const eKey = typeof eKeys === 'string' ? eKeys : eKeys[0];\n\n            return [cKey, eKey];\n        };\n\n        this.log(LogLevel.info, 'Loading root table...');\n        const [rootCKey, rootEKey] = getBuildConfigKeys(buildConfig.root);\n        const rootBuffer = await getDataFile(prefixes, rootEKey, 'build', this.version.BuildConfig, {\n            name: 'root',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded root table (${formatFileSize(rootBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing root file...');\n        const rootFile = parseRootFile(rootBuffer, rootEKey, rootCKey);\n        this.log(LogLevel.info, `Parsed root file (${rootFile.fileDataID2CKey.size.toString()} entries, ${rootFile.nameHash2FileDataID.size.toString()} hashes)`);\n\n        this.log(LogLevel.info, 'Loading install manifest...');\n        const [installCKey, installEKey] = getBuildConfigKeys(buildConfig.install);\n        const installBuffer = await getDataFile(prefixes, installEKey, 'build', this.version.BuildConfig, {\n            name: 'install',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded install manifest (${formatFileSize(installBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing install manifest...');\n        const install = parseInstallFile(installBuffer, installEKey, installCKey);\n        this.log(LogLevel.info, `Parsed install manifest (${install.tags.length.toString()} tags, ${install.files.length.toString()} files)`);\n\n        this.preload = {\n            prefixes,\n            archives,\n            encoding,\n            rootFile,\n            install,\n        };\n    }\n\n    async loadRemoteListFile(): Promise<void> {\n        const url = 'https://github.com/wowdev/wow-listfile/releases/latest/download/community-listfile.csv';\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((line) => line.trim()).filter((line) => line.length > 0);\n\n        lines.forEach((line) => {\n            const [fileDataID, name] = line.split(';');\n            this.name2FileDataID.set(name.trim(), parseInt(fileDataID.trim(), 10));\n        });\n    }\n\n    async loadRemoteTACTKeys(): Promise<void> {\n        const url = 'https://raw.githubusercontent.com/wowdev/TACTKeys/master/WoW.txt';\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((line) => line.trim()).filter((line) => line.length > 0);\n\n        lines.forEach((line) => {\n            const [keyName, keyHex] = line.split(' ');\n\n            assert(keyName.length === 16, `Invalid keyName length: ${keyName.length.toString()}`);\n            assert(keyHex.length === 32, `Invalid key length: ${keyHex.length.toString()}`);\n\n            const key = Uint8Array.from(Buffer.from(keyHex, 'hex'));\n\n            this.keys.set(keyName.toLowerCase(), key);\n        });\n    }\n\n    async loadTACTKeys(): Promise<void> {\n        const keysCKeys = this.getContentKeysByFileDataID(1302850);\n        const lookupCKeys = this.getContentKeysByFileDataID(1302851);\n\n        assert(keysCKeys?.[0], 'Failing to find dbfilesclient/tactkey.db2');\n        assert(lookupCKeys?.[0], 'Failing to find dbfilesclient/tactkeylookup.db2');\n\n        const [keysResult, lookupResult] = await Promise.all([\n            this.getFileByContentKey(keysCKeys[0].cKey),\n            this.getFileByContentKey(lookupCKeys[0].cKey),\n        ]);\n\n        const keysReader = new WDCReader(keysResult.buffer);\n        const lookupReader = new WDCReader(lookupResult.buffer);\n\n        lookupReader.getAllIDs().forEach((keyID) => {\n            const lookupRow = lookupReader.rows.get(keyID);\n            const keyRow = keysReader.rows.get(keyID);\n\n            if (keyRow) {\n                assert(Array.isArray(lookupRow) && lookupRow.length > 0, `Invalid TACTKeyLookup table row at id ${keyID.toString()}`);\n                assert(Array.isArray(keyRow) && keyRow.length > 0, `Invalid TACTKey table row at id ${keyID.toString()}`);\n\n                const keyName = lookupRow[0].data.toString(16).padStart(16, '0');\n                const keyHexLE = keyRow[0].data.toString(16).padStart(32, '0');\n\n                assert(keyName.length === 16, `Invalid keyName length: ${keyName.length.toString()}`);\n                assert(keyHexLE.length === 32, `Invalid key length: ${keyHexLE.length.toString()}`);\n\n                const keyHex = [...keyHexLE.matchAll(/.{2}/g)].map((v) => v[0]).reverse().join('');\n                const key = Uint8Array.from(Buffer.from(keyHex, 'hex'));\n\n                this.keys.set(keyName.toLowerCase(), key);\n            }\n        });\n    }\n\n    loadBroadcastTACTKeys(adb: ADBReader): void {\n        adb.tableEntries\n            .get(0x021826BB) // BroadcastText\n            ?.forEach(({ data }) => {\n                if (data.byteLength > 0) {\n                    let pointer = 0;\n\n                    // Text_lang\n                    while (data[pointer] !== 0) {\n                        pointer += 1;\n                    }\n                    pointer += 1;\n\n                    // Text1_lang\n                    while (data[pointer] !== 0) {\n                        pointer += 1;\n                    }\n                    pointer += 1 + 43;\n\n                    if (pointer < data.byteLength) {\n                        const extraTableHash = data.readUInt32LE(pointer);\n                        if (extraTableHash === 0xDF2F53CF) { // TactKey\n                            const keyName = data.readBigUInt64LE(pointer + 4).toString(16).padStart(16, '0');\n                            const key = Uint8Array.from(data.subarray(pointer + 12));\n\n                            if (!this.keys.has(keyName)) {\n                                this.keys.set(keyName, key);\n                            }\n                        }\n                    }\n                }\n            });\n    }\n\n    getFileDataIDByName(name: string): number | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { rootFile } = this.preload;\n        const { nameHash2FileDataID } = rootFile;\n\n        const nameHash = getNameHash(name);\n        return nameHash2FileDataID.get(nameHash) ?? this.name2FileDataID.get(name.toLowerCase());\n    }\n\n    getContentKeysByFileDataID(fileDataID: number): FileInfo[] | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { rootFile } = this.preload;\n\n        return rootFile.fileDataID2CKey.get(fileDataID);\n    }\n\n    getContentKeysFromInstall(name: string): InstallFile[] | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { install } = this.preload;\n\n        return install.files.filter((file) => file.name === name);\n    }\n\n    async getFileByContentKey(cKey: string, allowMissingKey?: false): Promise<FileFetchResultFull>;\n    async getFileByContentKey(cKey: string, allowMissingKey: true): Promise<FileFetchResult>;\n    async getFileByContentKey(cKey: string, allowMissingKey = false): Promise<FileFetchResult> {\n        assert(this.preload, 'Client not initialized');\n\n        const { prefixes, encoding, archives } = this.preload;\n        const eKeys = encoding.cKey2EKey.get(cKey);\n        assert(eKeys !== undefined, `Failing to find encoding key for ${cKey}`);\n\n        const eKey = typeof eKeys === 'string' ? eKeys : eKeys[0];\n\n        const archive = archives.get(eKey);\n        const blte = archive\n            ? await getDataFile(prefixes, archive.key, 'data', this.version.BuildConfig, {\n                name: eKey,\n                partialOffset: archive.offset,\n                partialLength: archive.size,\n                showProgress: this.logLevel >= LogLevel.info,\n                showAttemptFail: this.logLevel >= LogLevel.warn,\n            })\n            : await getDataFile(prefixes, eKey, 'data', this.version.BuildConfig, {\n                showProgress: this.logLevel >= LogLevel.info,\n                showAttemptFail: this.logLevel >= LogLevel.warn,\n            });\n\n        const reader = new BLTEReader(blte, eKey, this.keys);\n        if (!allowMissingKey) {\n            reader.processBytes(allowMissingKey);\n\n            const hash = crypto.createHash('md5').update(reader.buffer).digest('hex');\n            assert(hash === cKey, `Invalid hash: expected ${cKey}, got ${hash}`);\n\n            return {\n                type: 'full',\n                buffer: reader.buffer,\n                blocks: undefined,\n            };\n        }\n\n        const blocks = reader.processBytes(allowMissingKey);\n\n        if (blocks.length === 0) {\n            const hash = crypto.createHash('md5').update(reader.buffer).digest('hex');\n            assert(hash === cKey, `Invalid hash: expected ${cKey}, got ${hash}`);\n\n            return {\n                type: 'full',\n                buffer: reader.buffer,\n                blocks: undefined,\n            };\n        }\n\n        return {\n            type: 'partial',\n            buffer: reader.buffer,\n            blocks,\n        };\n    }\n}\n\nexport type {\n    Version,\n    ClientPreloadData,\n    ArchiveIndex,\n    EncodingData,\n    InstallFile,\n    InstallData,\n    RootData,\n    FileInfo,\n    FileFetchResultFull,\n    FileFetchResultPartial,\n    FileFetchResult,\n    MissingKeyBlock,\n};\n","import assert from 'node:assert';\n\nimport type WDCReader from './wdc.ts';\n\ninterface Manifest {\n    tableHash: string,\n    tableName?: string,\n    db2FileDataID?: number,\n    dbcFileDataID?: number,\n}\n\ninterface Column {\n    name: string,\n    type: string,\n    isID: boolean,\n    isInline: boolean,\n    isRelation: boolean,\n    isSigned: boolean,\n    size?: number,\n    arraySize?: number,\n}\n\ntype BasicColumnData = number | bigint | string | undefined;\n\ntype ColumnData = BasicColumnData | BasicColumnData[];\n\nconst PATTERN_COLUMN = /^(int|float|locstring|string)(<[^:]+::[^>]+>)?\\s([^\\s]+)/;\nconst PATTERN_LAYOUT = /^LAYOUT\\s(.*)/;\nconst PATTERN_FIELD = /^(\\$([^$]+)\\$)?([^<[]+)(<(u|)(\\d+)>)?(\\[(\\d+)\\])?$/;\n\nconst castIntegerBySize = (\n    value: number,\n    src: number,\n    srcSigned: boolean,\n    dst: number,\n    dstSigned: boolean,\n): number => {\n    const castBuffer = Buffer.alloc(6);\n\n    if (srcSigned) {\n        castBuffer.writeIntLE(value, 0, src);\n    } else {\n        castBuffer.writeUIntLE(value, 0, src);\n    }\n\n    return dstSigned ? castBuffer.readIntLE(0, dst) : castBuffer.readUIntLE(0, dst);\n};\n\nconst castFloat = (value: number, src: number, srcSigned: boolean): number => {\n    const castBuffer = Buffer.alloc(4);\n\n    if (srcSigned) {\n        castBuffer.writeIntLE(value, 0, src);\n    } else {\n        castBuffer.writeUIntLE(value, 0, src);\n    }\n\n    const result = castBuffer.readFloatLE(0);\n    return Math.round(result * 100) / 100;\n};\n\nconst castBigInt64 = (value: bigint, srcSigned: boolean, dstSigned: boolean): bigint => {\n    const castBuffer = Buffer.alloc(8);\n\n    if (srcSigned) {\n        castBuffer.writeBigInt64LE(value, 0);\n    } else {\n        castBuffer.writeBigUInt64LE(value, 0);\n    }\n\n    return dstSigned ? castBuffer.readBigInt64LE(0) : castBuffer.readBigUInt64LE(0);\n};\n\nconst getCastBuffer = (value: bigint, srcSize: number, dstSize: number): Buffer => {\n    const castBuffer = Buffer.alloc(dstSize);\n    let remain = value;\n\n    // eslint-disable-next-line no-bitwise\n    for (let i = 0; i < srcSize && remain > 0n; i += 1, remain >>= 8n) {\n        const byte = Number(BigInt.asUintN(8, remain));\n        castBuffer.writeUInt8(byte, i);\n    }\n\n    return castBuffer;\n};\n\nexport default class DBDParser {\n    public readonly wdc: WDCReader;\n\n    public readonly definitions = new Map<string, string>();\n\n    public columns: Column[] = [];\n\n    private cache = new Map<number, Record<string, ColumnData>>();\n\n    private constructor(wdc: WDCReader) {\n        this.wdc = wdc;\n    }\n\n    private async init(): Promise<void> {\n        const manifestsURL = 'https://raw.githubusercontent.com/wowdev/WoWDBDefs/master/manifest.json';\n        const manifests = await (await fetch(manifestsURL)).json() as Manifest[];\n\n        const tableHashHex = this.wdc.tableHash.toString(16).padStart(8, '0').toLowerCase();\n        const manifest = manifests.find((v) => v.tableHash.toLowerCase() === tableHashHex);\n\n        assert(manifest?.tableName !== undefined, `No manifest found for table hash ${tableHashHex}`);\n\n        const url = `https://raw.githubusercontent.com/wowdev/WoWDBDefs/master/definitions/${manifest.tableName}.dbd`;\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((v) => v.trim());\n\n        const chunks = lines.reduce<string[][]>((acc, line) => {\n            if (line.length > 0) {\n                acc[acc.length - 1].push(line);\n            } else {\n                acc.push([]);\n            }\n            return acc;\n        }, [[]]).filter((chunk) => chunk.length > 0);\n\n        const columnsChunk = chunks.shift();\n        assert(columnsChunk?.[0] === 'COLUMNS', 'No column definitions found');\n\n        columnsChunk.shift();\n        columnsChunk.forEach((line) => {\n            const match = PATTERN_COLUMN.exec(line);\n            if (match) {\n                const [, type, , name] = match;\n                this.definitions.set(name.replace('?', ''), type);\n            }\n        });\n\n        const layoutHashHex = this.wdc.layoutHash.toString(16).padStart(8, '0').toLowerCase();\n        const versionChunk = chunks.find((chunk) => chunk.find((line) => {\n            const layoutsMatch = PATTERN_LAYOUT.exec(line);\n            const layouts = layoutsMatch?.[1].split(',').map((v) => v.trim().toLowerCase());\n            return layouts?.includes(layoutHashHex) === true;\n        }) !== undefined);\n\n        assert(versionChunk, `No version definition found for layout hash ${layoutHashHex}`);\n\n        versionChunk.forEach((line) => {\n            if (line.startsWith('LAYOUT') || line.startsWith('BUILD') || line.startsWith('COMMENT')) {\n                return;\n            }\n\n            const match = PATTERN_FIELD.exec(line);\n            if (match) {\n                const [\n                    , ,\n                    annotationsText,\n                    name, ,\n                    unsigned,\n                    sizeText, ,\n                    arraySizeText,\n                ] = match;\n                const type = this.definitions.get(name);\n\n                assert(type !== undefined, `No type found for column ${name}`);\n\n                const annotations = annotationsText ? annotationsText.split(',').map((v) => v.trim()) : [];\n                const size = sizeText ? parseInt(sizeText, 10) : undefined;\n                const arraySize = arraySizeText ? parseInt(arraySizeText, 10) : undefined;\n\n                const isID = !!annotations.includes('id');\n                const isInline = !annotations.includes('noninline');\n                const isRelation = !!annotations.includes('relation');\n                const isSigned = !unsigned;\n\n                this.columns.push({\n                    name,\n                    type,\n                    isID,\n                    isInline,\n                    isRelation,\n                    isSigned,\n                    size,\n                    arraySize,\n                });\n            }\n        });\n    }\n\n    static async parse(wdc: WDCReader): Promise<DBDParser> {\n        const parser = new DBDParser(wdc);\n\n        await parser.init();\n\n        return parser;\n    }\n\n    getAllIDs(): number[] {\n        return this.wdc.getAllIDs();\n    }\n\n    getRowData(id: number): Record<string, ColumnData> | undefined {\n        if (this.cache.has(id)) {\n            return structuredClone(this.cache.get(id));\n        }\n\n        const row = this.wdc.getRowData(id);\n        if (!row) {\n            return undefined;\n        }\n\n        const data: Record<string, ColumnData> = {};\n        if (Array.isArray(row)) {\n            let fieldIndex = 0;\n            this.columns.forEach((column) => {\n                if (column.isID) {\n                    data[column.name] = id;\n\n                    if (column.isInline) {\n                        fieldIndex += 1;\n                    }\n                } else if (column.isInline) {\n                    assert(row.length > fieldIndex, `No value found for column ${column.name}`);\n\n                    const cell = row[fieldIndex];\n                    const fieldInfo = this.wdc.fieldsInfo[fieldIndex];\n                    const srcSigned = fieldInfo.storageType === 'bitpackedSigned';\n                    const srcSize = (\n                        fieldInfo.storageType === 'none'\n                        || fieldInfo.storageType === 'bitpacked'\n                        || fieldInfo.storageType === 'bitpackedSigned'\n                    )\n                        ? Math.ceil(fieldInfo.fieldSizeBits / 8)\n                        : 4;\n                    const dstSize = column.size !== undefined\n                        ? Math.ceil(column.size / 8)\n                        : undefined;\n\n                    if (cell.type === 'bitpackedArray') {\n                        data[column.name] = cell.data.map((v) => {\n                            if (column.type === 'float') {\n                                return castFloat(v, srcSize, srcSigned);\n                            }\n                            if (dstSize !== undefined) {\n                                return castIntegerBySize(\n                                    v,\n                                    srcSize,\n                                    srcSigned,\n                                    dstSize,\n                                    column.isSigned,\n                                );\n                            }\n                            return v;\n                        });\n                    } else if (column.type === 'string' || column.type === 'locstring') {\n                        if (cell.data > 0) {\n                            assert(cell.type === 'none', `Invalid data type for string column ${column.name}`);\n                            assert(typeof cell.string === 'string', `Missing string for string column ${column.name}`);\n\n                            data[column.name] = cell.string;\n                        }\n                    } else if (column.type === 'float') {\n                        if (column.arraySize !== undefined) {\n                            const castBuffer = getCastBuffer(\n                                typeof cell.data === 'number' ? BigInt(cell.data) : cell.data,\n                                srcSize,\n                                4 * column.arraySize,\n                            );\n\n                            const values: number[] = [];\n                            for (let i = 0; i < column.arraySize; i += 1) {\n                                const value = castBuffer.readFloatLE(i * 4);\n                                values.push(Math.round(value * 100) / 100);\n                            }\n\n                            data[column.name] = values;\n                        } else {\n                            assert(typeof cell.data === 'number', `Invalid data type for float column ${column.name}`);\n\n                            data[column.name] = castFloat(cell.data, srcSize, srcSigned);\n                        }\n                    } else if (column.type === 'int') {\n                        if (column.arraySize !== undefined) {\n                            assert(dstSize !== undefined, `Missing size for int array column ${column.name}`);\n\n                            const castBuffer = getCastBuffer(\n                                typeof cell.data === 'number' ? BigInt(cell.data) : cell.data,\n                                srcSize,\n                                dstSize * column.arraySize,\n                            );\n\n                            if (dstSize > 6) {\n                                assert(dstSize === 8, `Unexpected size ${dstSize.toString()} for column ${column.name}`);\n\n                                const values: bigint[] = [];\n                                if (column.isSigned) {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readBigInt64LE(i * dstSize);\n                                        values.push(value);\n                                    }\n                                } else {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readBigUInt64LE(i * dstSize);\n                                        values.push(value);\n                                    }\n                                }\n\n                                data[column.name] = values;\n                            } else {\n                                const values: number[] = [];\n                                if (column.isSigned) {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readIntLE(i * dstSize, dstSize);\n                                        values.push(value);\n                                    }\n                                } else {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readUIntLE(i * dstSize, dstSize);\n                                        values.push(value);\n                                    }\n                                }\n\n                                data[column.name] = values;\n                            }\n                        } else if (typeof cell.data === 'number') {\n                            data[column.name] = castIntegerBySize(\n                                cell.data,\n                                srcSize,\n                                srcSigned,\n                                dstSize ?? srcSize,\n                                column.isSigned,\n                            );\n                        } else {\n                            assert(column.size === undefined || column.size === 64, `Unexpected size ${column.size?.toString() ?? ''} for column ${column.name}`);\n\n                            if (srcSigned !== column.isSigned) {\n                                data[column.name] = castBigInt64(\n                                    cell.data,\n                                    srcSigned,\n                                    column.isSigned,\n                                );\n                            } else {\n                                data[column.name] = cell.data;\n                            }\n                        }\n                    } else {\n                        throw new Error(`Unsupported column type ${column.type} for column ${column.name}`);\n                    }\n\n                    fieldIndex += 1;\n                } else if (column.isRelation) {\n                    const relation = this.wdc.getRowRelationship(id);\n                    data[column.name] = relation ?? 0;\n                }\n            });\n        } else {\n            const buffer = row.data;\n            let offset = 0;\n            let fieldIndex = 0;\n            this.columns.forEach((column) => {\n                if (column.isID) {\n                    data[column.name] = id;\n\n                    if (column.isInline) {\n                        const currField = this.wdc.fields[fieldIndex];\n                        const size = Math.ceil((column.size ?? (32 - currField.size)) / 8);\n                        offset += size;\n\n                        fieldIndex += 1;\n                    }\n                } else if (column.isInline) {\n                    const values = [];\n\n                    if (column.type === 'string' || column.type === 'locstring') {\n                        const count = column.arraySize ?? 1;\n\n                        for (let i = 0; i < count; i += 1) {\n                            const startOffset = offset;\n                            while (buffer[offset] !== 0x00) {\n                                offset += 1;\n                            }\n\n                            values.push(buffer.toString('utf-8', startOffset, offset));\n                            offset += 1;\n                        }\n\n                        data[column.name] = count > 1 ? values : values[0];\n                    } else {\n                        // note: layout hash won't change when array size changes\n                        // so we try to determine array size based on field structure\n                        const currField = this.wdc.fields[fieldIndex];\n                        const nextField = this.wdc.fields[fieldIndex + 1];\n                        const size = Math.ceil((column.size ?? (32 - currField.size)) / 8);\n\n                        let count;\n                        if (fieldIndex + 1 < this.wdc.fields.length) {\n                            // reading hotfix for normal db2 may have fields with same position\n                            count = Math.max((nextField.position - currField.position) / size, 1);\n                        } else {\n                            // nextPos = byteLength - offset + currPos\n                            count = column.arraySize !== undefined\n                                ? ((buffer.byteLength - offset) / size)\n                                : 1;\n                        }\n\n                        for (let i = 0; i < count; i += 1) {\n                            if (column.type === 'float') {\n                                const value = buffer.readFloatLE(offset);\n                                values.push(Math.round(value * 100) / 100);\n                                offset += 4;\n                            } else if (size > 6) {\n                                assert(size === 8, `Unexpected size ${size.toString()} for column ${column.name}`);\n\n                                const value = column.isSigned\n                                    ? buffer.readBigInt64LE(offset)\n                                    : buffer.readBigUInt64LE(offset);\n\n                                values.push(value);\n                                offset += size;\n                            } else {\n                                const value = column.isSigned\n                                    ? buffer.readIntLE(offset, size)\n                                    : buffer.readUIntLE(offset, size);\n\n                                values.push(value);\n                                offset += size;\n                            }\n                        }\n\n                        data[column.name] = count > 1 ? values : values[0];\n                    }\n\n                    fieldIndex += 1;\n                } else if (column.isRelation) {\n                    const relation = this.wdc.getRowRelationship(id);\n                    data[column.name] = relation ?? 0;\n                }\n            });\n        }\n\n        this.cache.set(id, data);\n\n        return structuredClone(data);\n    }\n}\n\nexport type {\n    Column,\n    ColumnData,\n    BasicColumnData,\n};\n"],"names":["blteHash","MAGIC_OFFSET","VERSION_OFFSET","files","LogLevel","cKey","eKey"],"mappings":"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"}