interface BrtMdtinfo { flags: number; version: number; name: string;}function parse_BrtMdtinfo(data: ReadableData, length: number): BrtMdtinfo { return { flags: data.read_shift(4), version: data.read_shift(4), name: parse_XLWideString(data, length - 8) };}function write_BrtMdtinfo(data: BrtMdtinfo): RawData { var o = new_buf(12 + 2 * data.name.length); o.write_shift(4, data.flags); o.write_shift(4, data.version); write_XLWideString(data.name, o); return o.slice(0, o.l);}
type Mdir = [number, number]; type BrtMdb = Mdir[];function write_BrtMdb(mdb: BrtMdb): RawData { var o = new_buf(4 + 8 * mdb.length); o.write_shift(4, mdb.length); for(var i = 0; i < mdb.length; ++i) { o.write_shift(4, mdb[i][0]); o.write_shift(4, mdb[i][1]); } return o;}
function write_BrtBeginEsfmd(cnt: number, name: string): RawData { var o = new_buf(8 + 2 * name.length); o.write_shift(4, cnt); write_XLWideString(name, o); return o.slice(0, o.l);}
function write_BrtBeginEsmdb(cnt: number, cm: boolean): RawData { var o = new_buf(8); o.write_shift(4, cnt); o.write_shift(4, cm ? 1 : 0); return o;}
function parse_xlmeta_bin(data, name: string, _opts?: ParseXLMetaOptions): XLMeta { var out: XLMeta = { Types: [] }; var opts = _opts || {}; var state: string[] = []; var pass = false;
recordhopper(data, (val, R_n, RT) => { switch(RT) {
case 0x014F: out.Types.push({name: (val as BrtMdtinfo).name}); break; case 0x0033: break;
case 0x0023: state.push(R_n); pass = true; break; case 0x0024: state.pop(); pass = false; break; default: if((R_n||"").indexOf("Begin") > 0){} else if((R_n||"").indexOf("End") > 0){} else if(!pass || (opts.WTF && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n); } }); return out;}function write_xlmeta_bin() { var ba = buf_array(); write_record(ba, "BrtBeginMetadata"); write_record(ba, "BrtBeginEsmdtinfo", write_UInt32LE(1)); write_record(ba, "BrtMdtinfo", write_BrtMdtinfo({ name: "XLDAPR", version: 120000, flags: 0xD06AC0B0 })); write_record(ba, "BrtEndEsmdtinfo"); write_record(ba, "BrtBeginEsfmd", write_BrtBeginEsfmd(1, "XLDAPR")); write_record(ba, "BrtBeginFmd"); write_record(ba, "BrtFRTBegin", write_UInt32LE(0x0202)); write_record(ba, "BrtBeginDynamicArrayPr", write_UInt32LE(0)); write_record(ba, "BrtEndDynamicArrayPr", writeuint16(1)); write_record(ba, "BrtFRTEnd"); write_record(ba, "BrtEndFmd"); write_record(ba, "BrtEndEsfmd"); write_record(ba, "BrtBeginEsmdb", write_BrtBeginEsmdb(1, true)); write_record(ba, "BrtMdb", write_BrtMdb([[1, 0]])); write_record(ba, "BrtEndEsmdb"); write_record(ba, "BrtEndMetadata"); return ba.end();}