clear-excel 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +53 -22
- package/dist/index.js.map +1 -1
- package/package.json +13 -7
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file. The project
|
|
4
|
+
follows [Semantic Versioning](https://semver.org/).
|
|
5
|
+
|
|
6
|
+
## [1.0.0] - 2026-08-19
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- Rebuilt the package as a strict TypeScript, ESM-only library with bundled
|
|
11
|
+
declarations.
|
|
12
|
+
- Documented the CommonJS-to-ESM migration while keeping the public sanitizer
|
|
13
|
+
APIs, options, error codes, and behavior compatible with 0.1.
|
|
14
|
+
- Added package-content verification and CI coverage for supported Node.js
|
|
15
|
+
versions.
|
|
16
|
+
|
|
17
|
+
## [0.1.0] - 2026-08-17
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Initial release with buffer and file APIs for sanitizing `.xls`, `.xlsx`,
|
|
22
|
+
and `.xlsm` workbooks.
|
|
23
|
+
|
|
24
|
+
[1.0.0]: https://www.npmjs.com/package/clear-excel/v/1.0.0
|
|
25
|
+
[0.1.0]: https://www.npmjs.com/package/clear-excel/v/0.1.0
|
package/README.md
CHANGED
|
@@ -1,9 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<h1>clear-excel</h1>
|
|
4
|
+
|
|
5
|
+
<p><strong>Remove drawings, comments, and embedded objects from Excel workbooks
|
|
6
|
+
without rebuilding their data model.</strong></p>
|
|
7
|
+
|
|
8
|
+
<p>
|
|
9
|
+
<a href="https://www.npmjs.com/package/clear-excel"><img alt="npm version" src="https://img.shields.io/npm/v/clear-excel?style=flat-square&logo=npm"></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/clear-excel"><img alt="npm downloads" src="https://img.shields.io/npm/dm/clear-excel?style=flat-square&logo=npm"></a>
|
|
11
|
+
<a href="https://github.com/Vlad1slav1vanov/clear-excel/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/Vlad1slav1vanov/clear-excel/ci.yml?branch=main&style=flat-square&logo=github&label=CI"></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/clear-excel"><img alt="Node.js" src="https://img.shields.io/node/v/clear-excel?style=flat-square&logo=nodedotjs"></a>
|
|
13
|
+
<a href="./LICENSE"><img alt="License" src="https://img.shields.io/npm/l/clear-excel?style=flat-square"></a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p>
|
|
17
|
+
<a href="https://www.npmjs.com/package/clear-excel">npm</a> ·
|
|
18
|
+
<a href="https://github.com/Vlad1slav1vanov/clear-excel/releases">Releases</a> ·
|
|
19
|
+
<a href="./CHANGELOG.md">Changelog</a> ·
|
|
20
|
+
<a href="./CONTRIBUTING.md">Contributing</a> ·
|
|
21
|
+
<a href="./SECURITY.md">Security</a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
`clear-excel` is an ESM-only Node.js library for sanitizing legacy `.xls` and
|
|
4
27
|
OOXML `.xlsx`/`.xlsm` workbooks while preserving worksheet data and structure.
|
|
5
|
-
It
|
|
6
|
-
requirement.
|
|
28
|
+
It has no framework or consumer-side build requirement.
|
|
7
29
|
|
|
8
30
|
## What it removes
|
|
9
31
|
|
|
@@ -28,9 +50,13 @@ Encrypted `.xls` workbooks are not supported.
|
|
|
28
50
|
## Installation
|
|
29
51
|
|
|
30
52
|
```sh
|
|
31
|
-
|
|
53
|
+
pnpm add clear-excel
|
|
32
54
|
```
|
|
33
55
|
|
|
56
|
+
The package is published on
|
|
57
|
+
[npm](https://www.npmjs.com/package/clear-excel) and includes TypeScript
|
|
58
|
+
declarations.
|
|
59
|
+
|
|
34
60
|
## Buffer API
|
|
35
61
|
|
|
36
62
|
```js
|
|
@@ -164,34 +190,39 @@ memory. Plan for memory usage above the input size, especially when increasing
|
|
|
164
190
|
the defaults. The sanitizer does not evaluate formulas, execute embedded
|
|
165
191
|
content, or execute VBA projects.
|
|
166
192
|
|
|
167
|
-
##
|
|
193
|
+
## Development
|
|
168
194
|
|
|
169
|
-
|
|
195
|
+
Install dependencies and run the complete verification suite:
|
|
170
196
|
|
|
171
197
|
```sh
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
npm login
|
|
175
|
-
npm publish
|
|
198
|
+
pnpm install --frozen-lockfile
|
|
199
|
+
pnpm run check
|
|
176
200
|
```
|
|
177
201
|
|
|
178
|
-
`
|
|
202
|
+
`pnpm run check` verifies Oxfmt formatting, runs type-aware Oxlint and strict
|
|
179
203
|
TypeScript checks, executes the tests, builds the ESM bundle and declarations,
|
|
180
|
-
inspects `
|
|
181
|
-
both runtime imports and a TypeScript consumer.
|
|
182
|
-
`prepublishOnly` runs the complete check automatically. npm credentials and
|
|
183
|
-
publishing automation are deliberately not stored in this repository.
|
|
204
|
+
inspects `pnpm pack --dry-run`, and installs a temporary tarball to smoke-test
|
|
205
|
+
both runtime imports and a TypeScript consumer.
|
|
184
206
|
|
|
185
207
|
Useful development commands:
|
|
186
208
|
|
|
187
209
|
```sh
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
210
|
+
pnpm run format
|
|
211
|
+
pnpm run lint
|
|
212
|
+
pnpm run check:types
|
|
213
|
+
pnpm test
|
|
214
|
+
pnpm run build
|
|
193
215
|
```
|
|
194
216
|
|
|
217
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for the contribution and release
|
|
218
|
+
process.
|
|
219
|
+
|
|
220
|
+
## Security
|
|
221
|
+
|
|
222
|
+
Please report vulnerabilities privately by following
|
|
223
|
+
[SECURITY.md](./SECURITY.md). Do not open a public issue for a suspected
|
|
224
|
+
security vulnerability.
|
|
225
|
+
|
|
195
226
|
## License
|
|
196
227
|
|
|
197
|
-
MIT
|
|
228
|
+
[MIT](./LICENSE) © Vladislav Ivanov
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["exports"],"sources":["../__vite-browser-external","../node_modules/cfb/cfb.js","../src/errors.ts","../src/biff/workbook.ts","../src/zip/central-directory.ts","../src/ooxml/constants.ts","../src/ooxml/cleanup.ts","../src/ooxml/parts.ts","../src/ooxml/xml.ts","../src/ooxml/relationships.ts","../src/ooxml/styles.ts","../src/ooxml/workbook.ts","../src/constants.ts","../src/options.ts","../src/api/sanitize-excel.ts","../src/formats.ts","../src/api/sanitize-excel-file.ts"],"sourcesContent":["module.exports = {}","/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n/*exported CFB */\n/*global module, require:false, process:false, Buffer:false, Uint8Array:false, Uint16Array:false */\n\nvar Base64_map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nfunction Base64_encode(input) {\n\tvar o = \"\";\n\tvar c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n\tfor (var i = 0; i < input.length; ) {\n\t\tc1 = input.charCodeAt(i++);\n\t\te1 = (c1 >> 2);\n\t\tc2 = input.charCodeAt(i++);\n\t\te2 = ((c1 & 3) << 4) | (c2 >> 4);\n\t\tc3 = input.charCodeAt(i++);\n\t\te3 = ((c2 & 15) << 2) | (c3 >> 6);\n\t\te4 = (c3 & 63);\n\t\tif (isNaN(c2)) e3 = e4 = 64;\n\t\telse if (isNaN(c3)) e4 = 64;\n\t\to += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);\n\t}\n\treturn o;\n}\nfunction Base64_decode(input) {\n\tvar o = \"\";\n\tvar c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n\tinput = input.replace(/[^\\w\\+\\/\\=]/g, \"\");\n\tfor (var i = 0; i < input.length;) {\n\t\te1 = Base64_map.indexOf(input.charAt(i++));\n\t\te2 = Base64_map.indexOf(input.charAt(i++));\n\t\tc1 = (e1 << 2) | (e2 >> 4);\n\t\to += String.fromCharCode(c1);\n\t\te3 = Base64_map.indexOf(input.charAt(i++));\n\t\tc2 = ((e2 & 15) << 4) | (e3 >> 2);\n\t\tif (e3 !== 64) o += String.fromCharCode(c2);\n\t\te4 = Base64_map.indexOf(input.charAt(i++));\n\t\tc3 = ((e3 & 3) << 6) | e4;\n\t\tif (e4 !== 64) o += String.fromCharCode(c3);\n\t}\n\treturn o;\n}\nvar has_buf = (function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();\n\nvar Buffer_from = (function() {\n\tif(typeof Buffer !== 'undefined') {\n\t\tvar nbfs = !Buffer.from;\n\t\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\t\treturn nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t}\n\treturn function() {};\n})();\n\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\tif(has_buf) {\n\t\tif(Buffer.alloc) return Buffer.alloc(len);\n\t\tvar b = new Buffer(len); b.fill(0); return b;\n\t}\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nfunction new_unsafe_buf(len) {\n\t/* jshint -W056 */\n\tif(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nvar s2a = function s2a(s) {\n\tif(has_buf) return Buffer_from(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n};\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/g;\nvar __toBuffer = function(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };\nvar ___toBuffer = __toBuffer;\nvar __utf16le = function(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(\"\").replace(chr0,''); };\nvar ___utf16le = __utf16le;\nvar __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push((\"0\" + b[i].toString(16)).slice(-2)); return ss.join(\"\"); };\nvar ___hexlify = __hexlify;\nvar __bconcat = function(bufs) {\n\tif(Array.isArray(bufs[0])) return [].concat.apply([], bufs);\n\tvar maxlen = 0, i = 0;\n\tfor(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;\n\tvar o = new Uint8Array(maxlen);\n\tfor(i = 0, maxlen = 0; i < bufs.length; maxlen += bufs[i].length, ++i) o.set(bufs[i], maxlen);\n\treturn o;\n};\nvar bconcat = __bconcat;\n\n\nif(has_buf) {\n\t__utf16le = function(b,s,e) {\n\t\tif(!Buffer.isBuffer(b)) return ___utf16le(b,s,e);\n\t\treturn b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/;\n\t};\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat((bufs[0])) : ___toBuffer(bufs);};\n\ts2a = function(s) { return Buffer_from(s, \"binary\"); };\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : __bconcat(bufs); };\n}\n\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\n\nfunction ReadShift(size, t) {\n\tvar oI, oS, type = 0;\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); break;\n\t\tcase 2: oI = (t !== 'i' ? __readUInt16LE : __readInt16LE)(this, this.l); break;\n\t\tcase 4: oI = __readInt32LE(this, this.l); break;\n\t\tcase 16: type = 2; oS = __hexlify(this, this.l, size);\n\t}\n\tthis.l += size; if(type === 0) return oI; return oS;\n}\n\nvar __writeUInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };\nvar __writeInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };\n\nfunction WriteShift(t, val, f) {\n\tvar size = 0, i = 0;\n\tswitch(f) {\n\t\tcase \"hex\": for(; i < t; ++i) {\nthis[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0;\n\t\t} return this;\n\t\tcase \"utf16le\":\nvar end = this.l + t;\n\t\t\tfor(i = 0; i < Math.min(val.length, t); ++i) {\n\t\t\t\tvar cc = val.charCodeAt(i);\n\t\t\t\tthis[this.l++] = cc & 0xff;\n\t\t\t\tthis[this.l++] = cc >> 8;\n\t\t\t}\n\t\t\twhile(this.l < end) this[this.l++] = 0;\n\t\t\treturn this;\n\t}\nswitch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&0xFF; break;\n\t\tcase 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;\n\t\tcase 4: size = 4; __writeUInt32LE(this, val, this.l); break;\n\t\tcase -4: size = 4; __writeInt32LE(this, val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction new_buf(sz) {\n\tvar o = (new_raw_buf(sz));\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32 = (function() {\nvar CRC32 = {};\nCRC32.version = '1.2.1';\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T0 = signed_crc_table();\nfunction slice_by_16_tables(T) {\n\tvar c = 0, v = 0, n = 0, table = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;\n\n\tfor(n = 0; n != 256; ++n) table[n] = T[n];\n\tfor(n = 0; n != 256; ++n) {\n\t\tv = T[n];\n\t\tfor(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];\n\t}\n\tvar out = [];\n\tfor(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);\n\treturn out;\n}\nvar TT = slice_by_16_tables(T0);\nvar T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];\nvar T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];\nvar Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_buf(B, seed) {\n\tvar C = seed ^ -1, L = B.length - 15, i = 0;\n\tfor(; i < L;) C =\n\t\tTf[B[i++] ^ (C & 255)] ^\n\t\tTe[B[i++] ^ ((C >> 8) & 255)] ^\n\t\tTd[B[i++] ^ ((C >> 16) & 255)] ^\n\t\tTc[B[i++] ^ (C >>> 24)] ^\n\t\tTb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^\n\t\tT7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^\n\t\tT3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];\n\tL += 15;\n\twhile(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = str.length, c = 0, d = 0; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T0[(C^c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn ~C;\n}\nCRC32.table = T0;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\nreturn CRC32;\n})();\n/* [MS-CFB] v20171201 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '1.2.2';\n/* [MS-CFB] 2.6.4 */\nfunction namecmp(l, r) {\n\tvar L = l.split(\"/\"), R = r.split(\"/\");\n\tfor(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {\n\t\tif((c = L[i].length - R[i].length)) return c;\n\t\tif(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;\n\t}\n\treturn L.length - R.length;\n}\nfunction dirname(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return (p.slice(0,-1).indexOf(\"/\") === -1) ? p : dirname(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(0, c+1);\n}\n\nfunction filename(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return filename(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(c+1);\n}\n/* -------------------------------------------------------------------------- */\n/* DOS Date format:\n high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low\n add 1980 to stored year\n stored second should be doubled\n*/\n\n/* write JS date to buf as a DOS date */\nfunction write_dos_date(buf, date) {\n\tif(typeof date === \"string\") date = new Date(date);\n\tvar hms = date.getHours();\n\thms = hms << 6 | date.getMinutes();\n\thms = hms << 5 | (date.getSeconds()>>>1);\n\tbuf.write_shift(2, hms);\n\tvar ymd = (date.getFullYear() - 1980);\n\tymd = ymd << 4 | (date.getMonth()+1);\n\tymd = ymd << 5 | date.getDate();\n\tbuf.write_shift(2, ymd);\n}\n\n/* read four bytes from buf and interpret as a DOS date */\nfunction parse_dos_date(buf) {\n\tvar hms = buf.read_shift(2) & 0xFFFF;\n\tvar ymd = buf.read_shift(2) & 0xFFFF;\n\tvar val = new Date();\n\tvar d = ymd & 0x1F; ymd >>>= 5;\n\tvar m = ymd & 0x0F; ymd >>>= 4;\n\tval.setMilliseconds(0);\n\tval.setFullYear(ymd + 1980);\n\tval.setMonth(m-1);\n\tval.setDate(d);\n\tvar S = hms & 0x1F; hms >>>= 5;\n\tvar M = hms & 0x3F; hms >>>= 6;\n\tval.setHours(hms);\n\tval.setMinutes(M);\n\tval.setSeconds(S<<1);\n\treturn val;\n}\nfunction parse_extra_field(blob) {\n\tprep_blob(blob, 0);\n\tvar o = {};\n\tvar flags = 0;\n\twhile(blob.l <= blob.length - 4) {\n\t\tvar type = blob.read_shift(2);\n\t\tvar sz = blob.read_shift(2), tgt = blob.l + sz;\n\t\tvar p = {};\n\t\tswitch(type) {\n\t\t\t/* UNIX-style Timestamps */\n\t\t\tcase 0x5455: {\n\t\t\t\tflags = blob.read_shift(1);\n\t\t\t\tif(flags & 1) p.mtime = blob.read_shift(4);\n\t\t\t\t/* for some reason, CD flag corresponds to LFH */\n\t\t\t\tif(sz > 5) {\n\t\t\t\t\tif(flags & 2) p.atime = blob.read_shift(4);\n\t\t\t\t\tif(flags & 4) p.ctime = blob.read_shift(4);\n\t\t\t\t}\n\t\t\t\tif(p.mtime) p.mt = new Date(p.mtime*1000);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tblob.l = tgt;\n\t\to[type] = p;\n\t}\n\treturn o;\n}\nvar fs;\nfunction get_fs() { return fs || (fs = require('fs')); }\nfunction parse(file, options) {\nif(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);\nif((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);\nif(file.length < 512) throw new Error(\"CFB file size \" + file.length + \" < 512\");\nvar mver = 3;\nvar ssz = 512;\nvar nmfs = 0; // number of mini FAT sectors\nvar difat_sec_cnt = 0;\nvar dir_start = 0;\nvar minifat_start = 0;\nvar difat_start = 0;\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tcase 0: if(mv[1] == 0) return parse_zip(file, options);\n\t/* falls through */\n\tdefault: throw new Error(\"Major Version: Expected 3 or 4 saw \" + mver);\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar dir_cnt = blob.read_shift(4, 'i');\nif(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);\n\n// Number of FAT Sectors\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\ndifat_sec_cnt = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [];\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);\n\nbuild_full_paths(FileIndex, FullPaths, Paths);\nPaths.shift();\n\nvar o = {\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths\n};\n\n// $FlowIgnore\nif(options && options.raw) o.raw = {header: header, sectors: sectors};\nreturn o;\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\tif(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\t//blob.chk(HEADER_CLSID, 'CLSID: ');\n\tblob.l += 16;\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\t//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff\n\tblob.l += 2;\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;\n\t\tcase 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;\n\t\tdefault: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = [];\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = [], q = [];\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }\n\t\tif(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }\n\t}\n\tfor(i=1; i < pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = i;\n\t\tif(j != dad[j]) do {\n\t\t\tj = dad[j];\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t} while (j !== 0 && -1 !== dad[j] && j != dad[j]);\n\t\tdad[i] = -1;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t}\n}\n\nfunction get_mfat_entry(entry, payload, mini) {\n\tvar start = entry.start, size = entry.size;\n\t//return (payload.slice(start*MSSZ, start*MSSZ + size));\n\tvar o = [];\n\tvar idx = start;\n\twhile(mini && size > 0 && idx >= 0) {\n\t\to.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));\n\t\tsize -= MSSZ;\n\t\tidx = __readInt32LE(mini, idx * 4);\n\t}\n\tif(o.length === 0) return (new_buf(0));\n\treturn (bconcat(o).slice(0, entry.size));\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bits */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q = ENDOFCHAIN;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw new Error(\"DIFAT chain shorter than expected\");\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tif(!sector) return;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tif(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar buf = [], buf_chain = [];\n\tif(!chkd) chkd = [];\n\tvar modulus = ssz - 1, j = 0, jj = 0;\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\tif(!sectors[addr]) break;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = ([]);\n\tvar chkd = [], buf = [], buf_chain = [];\n\tvar modulus = ssz - 1, i=0, j=0, k=0, jj=0;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = ([]);\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k]) continue;\n\t\tbuf_chain = [];\n\t\tvar seen = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tseen[j] = true;\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\t\tif(!sectors[addr]) break;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t\tif(seen[j]) break;\n\t\t}\n\t\tsector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name;\n\tfor(; i < sector.length; i+= 128) {\n\t\tvar blob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\tvar o = ({\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i'),\n\t\t\tstart: 0,\n\t\t\tsize: 0\n\t\t});\n\t\tvar ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) o.ct = read_date(blob, blob.l-8);\n\t\tvar mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) o.mt = read_date(blob, blob.l-8);\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = \"\"; }\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = (sector_list[o.start].data.slice(0,o.size));\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(o.size < 0) o.size = 0;\n\t\t\telse if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {\n\t\t\t\to.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);\n\t\t\t}\n\t\t}\n\t\tif(o.content) prep_blob(o.content, 0);\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nfunction read_file(filename, options) {\n\tget_fs();\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction read(blob, options) {\n\tvar type = options && options.type;\n\tif(!type) {\n\t\tif(has_buf && Buffer.isBuffer(blob)) type = \"buffer\";\n\t}\n\tswitch(type || \"base64\") {\n\t\tcase \"file\": return read_file(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64_decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob, options);\n}\n\nfunction init_cfb(cfb, opts) {\n\tvar o = opts || {}, root = o.root || \"Root Entry\";\n\tif(!cfb.FullPaths) cfb.FullPaths = [];\n\tif(!cfb.FileIndex) cfb.FileIndex = [];\n\tif(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error(\"inconsistent CFB structure\");\n\tif(cfb.FullPaths.length === 0) {\n\t\tcfb.FullPaths[0] = root + \"/\";\n\t\tcfb.FileIndex[0] = ({ name: root, type: 5 });\n\t}\n\tif(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;\n\tseed_cfb(cfb);\n}\nfunction seed_cfb(cfb) {\n\tvar nm = \"\\u0001Sh33tJ5\";\n\tif(CFB.find(cfb, \"/\" + nm)) return;\n\tvar p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;\n\tcfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));\n\tcfb.FullPaths.push(cfb.FullPaths[0] + nm);\n\trebuild_cfb(cfb);\n}\nfunction rebuild_cfb(cfb, f) {\n\tinit_cfb(cfb);\n\tvar gc = false, s = false;\n\tfor(var i = cfb.FullPaths.length - 1; i >= 0; --i) {\n\t\tvar _file = cfb.FileIndex[i];\n\t\tswitch(_file.type) {\n\t\t\tcase 0:\n\t\t\t\tif(s) gc = true;\n\t\t\t\telse { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }\n\t\t\t\tbreak;\n\t\t\tcase 1: case 2: case 5:\n\t\t\t\ts = true;\n\t\t\t\tif(isNaN(_file.R * _file.L * _file.C)) gc = true;\n\t\t\t\tif(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;\n\t\t\t\tbreak;\n\t\t\tdefault: gc = true; break;\n\t\t}\n\t}\n\tif(!gc && !f) return;\n\n\tvar now = new Date(1987, 1, 19), j = 0;\n\t// Track which names exist\n\tvar fullPaths = Object.create ? Object.create(null) : {};\n\tvar data = [];\n\tfor(i = 0; i < cfb.FullPaths.length; ++i) {\n\t\tfullPaths[cfb.FullPaths[i]] = true;\n\t\tif(cfb.FileIndex[i].type === 0) continue;\n\t\tdata.push([cfb.FullPaths[i], cfb.FileIndex[i]]);\n\t}\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar dad = dirname(data[i][0]);\n\t\ts = fullPaths[dad];\n\t\twhile(!s) {\n\t\t\twhile(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);\n\n\t\t\tdata.push([dad, ({\n\t\t\t\tname: filename(dad).replace(\"/\",\"\"),\n\t\t\t\ttype: 1,\n\t\t\t\tclsid: HEADER_CLSID,\n\t\t\t\tct: now, mt: now,\n\t\t\t\tcontent: null\n\t\t\t})]);\n\n\t\t\t// Add name to set\n\t\t\tfullPaths[dad] = true;\n\n\t\t\tdad = dirname(data[i][0]);\n\t\t\ts = fullPaths[dad];\n\t\t}\n\t}\n\n\tdata.sort(function(x,y) { return namecmp(x[0], y[0]); });\n\tcfb.FullPaths = []; cfb.FileIndex = [];\n\tfor(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar elt = cfb.FileIndex[i];\n\t\tvar nm = cfb.FullPaths[i];\n\n\t\telt.name = filename(nm).replace(\"/\",\"\");\n\t\telt.L = elt.R = elt.C = -(elt.color = 1);\n\t\telt.size = elt.content ? elt.content.length : 0;\n\t\telt.start = 0;\n\t\telt.clsid = (elt.clsid || HEADER_CLSID);\n\t\tif(i === 0) {\n\t\t\telt.C = data.length > 1 ? 1 : -1;\n\t\t\telt.size = 0;\n\t\t\telt.type = 5;\n\t\t} else if(nm.slice(-1) == \"/\") {\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;\n\t\t\telt.C = j >= data.length ? -1 : j;\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;\n\t\t\telt.R = j >= data.length ? -1 : j;\n\t\t\telt.type = 1;\n\t\t} else {\n\t\t\tif(dirname(cfb.FullPaths[i+1]||\"\") == dirname(nm)) elt.R = i + 1;\n\t\t\telt.type = 2;\n\t\t}\n\t}\n\n}\n\nfunction _write(cfb, options) {\n\tvar _opts = options || {};\n\t/* MAD is order-sensitive, skip rebuild and sort */\n\tif(_opts.fileType == 'mad') return write_mad(cfb, _opts);\n\trebuild_cfb(cfb);\n\tswitch(_opts.fileType) {\n\t\tcase 'zip': return write_zip(cfb, _opts);\n\t\t//case 'mad': return write_mad(cfb, _opts);\n\t}\n\tvar L = (function(cfb){\n\t\tvar mini_size = 0, fat_size = 0;\n\t\tfor(var i = 0; i < cfb.FileIndex.length; ++i) {\n\t\t\tvar file = cfb.FileIndex[i];\n\t\t\tif(!file.content) continue;\n\t\t\tvar flen = file.content.length;\n\t\t\tif(flen > 0){\n\t\t\t\tif(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;\n\t\t\t\telse fat_size += (flen + 0x01FF) >> 9;\n\t\t\t}\n\t\t}\n\t\tvar dir_cnt = (cfb.FullPaths.length +3) >> 2;\n\t\tvar mini_cnt = (mini_size + 7) >> 3;\n\t\tvar mfat_cnt = (mini_size + 0x7F) >> 7;\n\t\tvar fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;\n\t\tvar fat_cnt = (fat_base + 0x7F) >> 7;\n\t\tvar difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\twhile(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\tvar L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];\n\t\tcfb.FileIndex[0].size = mini_size << 6;\n\t\tL[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);\n\t\treturn L;\n\t})(cfb);\n\tvar o = new_buf(L[7] << 9);\n\tvar i = 0, T = 0;\n\t{\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(2, 0);\n\t\to.write_shift(2, 0x003E);\n\t\to.write_shift(2, 0x0003);\n\t\to.write_shift(2, 0xFFFE);\n\t\to.write_shift(2, 0x0009);\n\t\to.write_shift(2, 0x0006);\n\t\tfor(i = 0; i < 3; ++i) o.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, L[2]);\n\t\to.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, 1<<12);\n\t\to.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[3]);\n\t\to.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[1]);\n\t\tfor(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t}\n\tif(L[1]) {\n\t\tfor(T = 0; T < L[1]; ++T) {\n\t\t\tfor(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t\t\to.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);\n\t\t}\n\t}\n\tvar chainit = function(w) {\n\t\tfor(T += w; i<T-1; ++i) o.write_shift(-4, i+1);\n\t\tif(w) { ++i; o.write_shift(-4, ENDOFCHAIN); }\n\t};\n\tT = i = 0;\n\tfor(T+=L[1]; i<T; ++i) o.write_shift(-4, consts.DIFSECT);\n\tfor(T+=L[2]; i<T; ++i) o.write_shift(-4, consts.FATSECT);\n\tchainit(L[3]);\n\tchainit(L[4]);\n\tvar j = 0, flen = 0;\n\tvar file = cfb.FileIndex[0];\n\tfor(; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(flen < 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x01FF) >> 9);\n\t}\n\tchainit((L[6] + 7) >> 3);\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tT = i = 0;\n\tfor(j = 0; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(!flen || flen >= 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x3F) >> 6);\n\t}\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tfor(i = 0; i < L[4]<<2; ++i) {\n\t\tvar nm = cfb.FullPaths[i];\n\t\tif(!nm || nm.length === 0) {\n\t\t\tfor(j = 0; j < 17; ++j) o.write_shift(4, 0);\n\t\t\tfor(j = 0; j < 3; ++j) o.write_shift(4, -1);\n\t\t\tfor(j = 0; j < 12; ++j) o.write_shift(4, 0);\n\t\t\tcontinue;\n\t\t}\n\t\tfile = cfb.FileIndex[i];\n\t\tif(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;\n\t\tvar _nm = (i === 0 && _opts.root) || file.name;\n\t\tif(_nm.length > 32) {\n\t\t\tconsole.error(\"Name \" + _nm + \" will be truncated to \" + _nm.slice(0,32));\n\t\t\t_nm = _nm.slice(0, 32);\n\t\t}\n\t\tflen = 2*(_nm.length+1);\n\t\to.write_shift(64, _nm, \"utf16le\");\n\t\to.write_shift(2, flen);\n\t\to.write_shift(1, file.type);\n\t\to.write_shift(1, file.color);\n\t\to.write_shift(-4, file.L);\n\t\to.write_shift(-4, file.R);\n\t\to.write_shift(-4, file.C);\n\t\tif(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);\n\t\telse o.write_shift(16, file.clsid, \"hex\");\n\t\to.write_shift(4, file.state || 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, file.start);\n\t\to.write_shift(4, file.size); o.write_shift(4, 0);\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size >= 0x1000) {\n\t\t\to.l = (file.start+1) << 9;\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 511) & -512;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x1FF; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size > 0 && file.size < 0x1000) {\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 63) & -64;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x3F; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tif (has_buf) {\n\t\to.l = o.length;\n\t} else {\n\t\t// When using Buffer, already 0-filled\n\t\twhile(o.l < o.length) o.write_shift(1, 0);\n\t}\n\treturn o;\n}\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nfunction find(cfb, path) {\n\tvar UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });\n\tvar UCPaths = UCFullPaths.map(function(x) { var y = x.split(\"/\"); return y[y.length - (x.slice(-1) == \"/\" ? 2 : 1)]; });\n\tvar k = false;\n\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }\n\telse k = path.indexOf(\"/\") !== -1;\n\tvar UCPath = path.toUpperCase();\n\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\tif(w !== -1) return cfb.FileIndex[w];\n\n\tvar m = !UCPath.match(chr1);\n\tUCPath = UCPath.replace(chr0,'');\n\tif(m) UCPath = UCPath.replace(chr1,'!');\n\tfor(w = 0; w < UCFullPaths.length; ++w) {\n\t\tif((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t\tif((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t}\n\treturn null;\n}\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nfunction write_file(cfb, filename, options) {\n\tget_fs();\n\tvar o = _write(cfb, options);\nfs.writeFileSync(filename, o);\n}\n\nfunction a2s(o) {\n\tvar out = new Array(o.length);\n\tfor(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);\n\treturn out.join(\"\");\n}\n\nfunction write(cfb, options) {\n\tvar o = _write(cfb, options);\n\tswitch(options && options.type || \"buffer\") {\n\t\tcase \"file\": get_fs(); fs.writeFileSync(options.filename, (o)); return o;\n\t\tcase \"binary\": return typeof o == \"string\" ? o : a2s(o);\n\t\tcase \"base64\": return Base64_encode(typeof o == \"string\" ? o : a2s(o));\n\t\tcase \"buffer\": if(has_buf) return Buffer.isBuffer(o) ? o : Buffer_from(o);\n\t\t\t/* falls through */\n\t\tcase \"array\": return typeof o == \"string\" ? s2a(o) : o;\n\t}\n\treturn o;\n}\n/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */\nvar _zlib;\nfunction use_zlib(zlib) { try {\n\tvar InflateRaw = zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tInflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);\n\tif(InflRaw.bytesRead) _zlib = zlib;\n\telse throw new Error(\"zlib does not expose bytesRead\");\n} catch(e) {console.error(\"cannot use native zlib: \" + (e.message || e)); } }\n\nfunction _inflateRawSync(payload, usz) {\n\tif(!_zlib) return _inflate(payload, usz);\n\tvar InflateRaw = _zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tvar out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);\n\tpayload.l += InflRaw.bytesRead;\n\treturn out;\n}\n\nfunction _deflateRawSync(payload) {\n\treturn _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);\n}\nvar CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */\nvar LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];\n\n/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */\nvar DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];\n\nfunction bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }\n\nvar use_typed_arrays = typeof Uint8Array !== 'undefined';\n\nvar bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];\nfor(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);\n\nfunction bit_swap_n(n, b) {\n\tvar rev = bitswap8[n & 0xFF];\n\tif(b <= 8) return rev >>> (8-b);\n\trev = (rev << 8) | bitswap8[(n>>8)&0xFF];\n\tif(b <= 16) return rev >>> (16-b);\n\trev = (rev << 8) | bitswap8[(n>>16)&0xFF];\n\treturn rev >>> (24-b);\n}\n\n/* helpers for unaligned bit reads */\nfunction read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }\nfunction read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }\nfunction read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }\nfunction read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }\nfunction read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }\n\n/* works up to n = 3 * 8 + 1 = 25 */\nfunction read_bits_n(buf, bl, n) {\n\tvar w = (bl&7), h = (bl>>>3), f = ((1<<n)-1);\n\tvar v = buf[h] >>> w;\n\tif(n < 8 - w) return v & f;\n\tv |= buf[h+1]<<(8-w);\n\tif(n < 16 - w) return v & f;\n\tv |= buf[h+2]<<(16-w);\n\tif(n < 24 - w) return v & f;\n\tv |= buf[h+3]<<(24-w);\n\treturn v & f;\n}\n\n/* helpers for unaligned bit writes */\nfunction write_bits_3(buf, bl, v) { var w = bl & 7, h = bl >>> 3;\n\tif(w <= 5) buf[h] |= (v & 7) << w;\n\telse {\n\t\tbuf[h] |= (v << w) & 0xFF;\n\t\tbuf[h+1] = (v&7) >> (8-w);\n\t}\n\treturn bl + 3;\n}\n\nfunction write_bits_1(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv = (v&1) << w;\n\tbuf[h] |= v;\n\treturn bl + 1;\n}\nfunction write_bits_8(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v;\n\treturn bl + 8;\n}\nfunction write_bits_16(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v & 0xFF;\n\tbuf[h+2] = v >>> 8;\n\treturn bl + 16;\n}\n\n/* until ArrayBuffer#realloc is a thing, fake a realloc */\nfunction realloc(b, sz) {\n\tvar L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;\n\tif(L >= sz) return b;\n\tif(has_buf) {\n\t\tvar o = new_unsafe_buf(M);\n\t\t// $FlowIgnore\n\t\tif(b.copy) b.copy(o);\n\t\telse for(; i < b.length; ++i) o[i] = b[i];\n\t\treturn o;\n\t} else if(use_typed_arrays) {\n\t\tvar a = new Uint8Array(M);\n\t\tif(a.set) a.set(b);\n\t\telse for(; i < L; ++i) a[i] = b[i];\n\t\treturn a;\n\t}\n\tb.length = M;\n\treturn b;\n}\n\n/* zero-filled arrays for older browsers */\nfunction zero_fill_array(n) {\n\tvar o = new Array(n);\n\tfor(var i = 0; i < n; ++i) o[i] = 0;\n\treturn o;\n}\n\n/* build tree (used for literals and lengths) */\nfunction build_tree(clens, cmap, MAX) {\n\tvar maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;\n\n\tvar bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\n\tfor(i = 0; i < 32; ++i) bl_count[i] = 0;\n\n\tfor(i = L; i < MAX; ++i) clens[i] = 0;\n\tL = clens.length;\n\n\tvar ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []\n\n\t/* build code tree */\n\tfor(i = 0; i < L; ++i) {\n\t\tbl_count[(w = clens[i])]++;\n\t\tif(maxlen < w) maxlen = w;\n\t\tctree[i] = 0;\n\t}\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);\n\tfor(i = 0; i < L; ++i) {\n\t\tccode = clens[i];\n\t\tif(ccode != 0) ctree[i] = bl_count[ccode+16]++;\n\t}\n\n\t/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);\n\t\t\tfor(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)\n\t\t\t\tcmap[ccode|(j<<cleni)] = (cleni&15) | (i<<4);\n\t\t}\n\t}\n\treturn maxlen;\n}\n\n/* Fixed Huffman */\nvar fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);\nvar fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\nif(!use_typed_arrays) {\n\tfor(var i = 0; i < 512; ++i) fix_lmap[i] = 0;\n\tfor(i = 0; i < 32; ++i) fix_dmap[i] = 0;\n}\n(function() {\n\tvar dlens = [];\n\tvar i = 0;\n\tfor(;i<32; i++) dlens.push(5);\n\tbuild_tree(dlens, fix_dmap, 32);\n\n\tvar clens = [];\n\ti = 0;\n\tfor(; i<=143; i++) clens.push(8);\n\tfor(; i<=255; i++) clens.push(9);\n\tfor(; i<=279; i++) clens.push(7);\n\tfor(; i<=287; i++) clens.push(8);\n\tbuild_tree(clens, fix_lmap, 288);\n})();var _deflateRaw = (function _deflateRawIIFE() {\n\tvar DST_LN_RE = use_typed_arrays ? new Uint8Array(0x8000) : [];\n\tvar j = 0, k = 0;\n\tfor(; j < DST_LN.length - 1; ++j) {\n\t\tfor(; k < DST_LN[j+1]; ++k) DST_LN_RE[k] = j;\n\t}\n\tfor(;k < 32768; ++k) DST_LN_RE[k] = 29;\n\n\tvar LEN_LN_RE = use_typed_arrays ? new Uint8Array(0x103) : [];\n\tfor(j = 0, k = 0; j < LEN_LN.length - 1; ++j) {\n\t\tfor(; k < LEN_LN[j+1]; ++k) LEN_LN_RE[k] = j;\n\t}\n\n\tfunction write_stored(data, out) {\n\t\tvar boff = 0;\n\t\twhile(boff < data.length) {\n\t\t\tvar L = Math.min(0xFFFF, data.length - boff);\n\t\t\tvar h = boff + L == data.length;\n\t\t\tout.write_shift(1, +h);\n\t\t\tout.write_shift(2, L);\n\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t}\n\t\treturn out.l;\n\t}\n\n\t/* Fixed Huffman */\n\tfunction write_huff_fixed(data, out) {\n\t\tvar bl = 0;\n\t\tvar boff = 0;\n\t\tvar addrs = use_typed_arrays ? new Uint16Array(0x8000) : [];\n\t\twhile(boff < data.length) {\n\t\t\tvar L = /* data.length - boff; */ Math.min(0xFFFF, data.length - boff);\n\n\t\t\t/* write a stored block for short data */\n\t\t\tif(L < 10) {\n\t\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length)); // jshint ignore:line\n\t\t\t\tif(bl & 7) bl += 8 - (bl & 7);\n\t\t\t\tout.l = (bl / 8) | 0;\n\t\t\t\tout.write_shift(2, L);\n\t\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t\t\tbl = out.l * 8;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length) + 2); // jshint ignore:line\n\t\t\tvar hash = 0;\n\t\t\twhile(L-- > 0) {\n\t\t\t\tvar d = data[boff];\n\t\t\t\thash = ((hash << 5) ^ d) & 0x7FFF;\n\n\t\t\t\tvar match = -1, mlen = 0;\n\n\t\t\t\tif((match = addrs[hash])) {\n\t\t\t\t\tmatch |= boff & ~0x7FFF;\n\t\t\t\t\tif(match > boff) match -= 0x8000;\n\t\t\t\t\tif(match < boff) while(data[match + mlen] == data[boff + mlen] && mlen < 250) ++mlen;\n\t\t\t\t}\n\n\t\t\t\tif(mlen > 2) {\n\t\t\t\t\t/* Copy Token */\n\t\t\t\t\td = LEN_LN_RE[mlen];\n\t\t\t\t\tif(d <= 22) bl = write_bits_8(out, bl, bitswap8[d+1]>>1) - 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\twrite_bits_8(out, bl, 3);\n\t\t\t\t\t\tbl += 5;\n\t\t\t\t\t\twrite_bits_8(out, bl, bitswap8[d-23]>>5);\n\t\t\t\t\t\tbl += 3;\n\t\t\t\t\t}\n\t\t\t\t\tvar len_eb = (d < 8) ? 0 : ((d - 4)>>2);\n\t\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, mlen - LEN_LN[d]);\n\t\t\t\t\t\tbl += len_eb;\n\t\t\t\t\t}\n\n\t\t\t\t\td = DST_LN_RE[boff - match];\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]>>3);\n\t\t\t\t\tbl -= 3;\n\n\t\t\t\t\tvar dst_eb = d < 4 ? 0 : (d-2)>>1;\n\t\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, boff - match - DST_LN[d]);\n\t\t\t\t\t\tbl += dst_eb;\n\t\t\t\t\t}\n\t\t\t\t\tfor(var q = 0; q < mlen; ++q) {\n\t\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t\thash = ((hash << 5) ^ data[boff]) & 0x7FFF;\n\t\t\t\t\t\t++boff;\n\t\t\t\t\t}\n\t\t\t\t\tL-= mlen - 1;\n\t\t\t\t} else {\n\t\t\t\t\t/* Literal Token */\n\t\t\t\t\tif(d <= 143) d = d + 48;\n\t\t\t\t\telse bl = write_bits_1(out, bl, 1);\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]);\n\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t++boff;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbl = write_bits_8(out, bl, 0) - 1;\n\t\t}\n\t\tout.l = ((bl + 7)/8)|0;\n\t\treturn out.l;\n\t}\n\treturn function _deflateRaw(data, out) {\n\t\tif(data.length < 8) return write_stored(data, out);\n\t\treturn write_huff_fixed(data, out);\n\t};\n})();\n\nfunction _deflate(data) {\n\tvar buf = new_buf(50+Math.floor(data.length*1.1));\n\tvar off = _deflateRaw(data, buf);\n\treturn buf.slice(0, off);\n}\n/* modified inflate function also moves original read head */\n\nvar dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);\nvar dyn_len_1 = 1, dyn_len_2 = 1;\n\n/* 5.5.3 Expanding Huffman Codes */\nfunction dyn(data, boff) {\n\t/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */\n\tvar _HLIT = read_bits_5(data, boff) + 257; boff += 5;\n\tvar _HDIST = read_bits_5(data, boff) + 1; boff += 5;\n\tvar _HCLEN = read_bits_4(data, boff) + 4; boff += 4;\n\tvar w = 0;\n\n\t/* grab and store code lengths */\n\tvar clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);\n\tvar ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n\tvar maxlen = 1;\n\tvar bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar L = clens.length; /* 19 */\n\tfor(var i = 0; i < _HCLEN; ++i) {\n\t\tclens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);\n\t\tif(maxlen < w) maxlen = w;\n\t\tbl_count[w]++;\n\t\tboff += 3;\n\t}\n\n\t/* build code tree */\n\tvar ccode = 0;\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1;\n\tfor(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;\n\t/* cmap[7 bits from stream] = (off&7) + (lit<<3) */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bitswap8[ctree[i]]>>(8-cleni);\n\t\t\tfor(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<<cleni)] = (cleni&7) | (i<<3);\n\t\t}\n\t}\n\n\t/* read literal and dist codes at once */\n\tvar hcodes = [];\n\tmaxlen = 1;\n\tfor(; hcodes.length < _HLIT + _HDIST;) {\n\t\tccode = dyn_cmap[read_bits_7(data, boff)];\n\t\tboff += ccode & 7;\n\t\tswitch((ccode >>>= 3)) {\n\t\t\tcase 16:\n\t\t\t\tw = 3 + read_bits_2(data, boff); boff += 2;\n\t\t\t\tccode = hcodes[hcodes.length - 1];\n\t\t\t\twhile(w-- > 0) hcodes.push(ccode);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\tw = 3 + read_bits_3(data, boff); boff += 3;\n\t\t\t\twhile(w-- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\tw = 11 + read_bits_7(data, boff); boff += 7;\n\t\t\t\twhile(w -- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thcodes.push(ccode);\n\t\t\t\tif(maxlen < ccode) maxlen = ccode;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* build literal / length trees */\n\tvar h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);\n\tfor(i = _HLIT; i < 286; ++i) h1[i] = 0;\n\tfor(i = _HDIST; i < 30; ++i) h2[i] = 0;\n\tdyn_len_1 = build_tree(h1, dyn_lmap, 286);\n\tdyn_len_2 = build_tree(h2, dyn_dmap, 30);\n\treturn boff;\n}\n\n/* return [ data, bytesRead ] */\nfunction inflate(data, usz) {\n\t/* shortcircuit for empty buffer [0x03, 0x00] */\n\tif(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }\n\n\t/* bit offset */\n\tvar boff = 0;\n\n\t/* header includes final bit and type bits */\n\tvar header = 0;\n\n\tvar outbuf = new_unsafe_buf(usz ? usz : (1<<18));\n\tvar woff = 0;\n\tvar OL = outbuf.length>>>0;\n\tvar max_len_1 = 0, max_len_2 = 0;\n\n\twhile((header&1) == 0) {\n\t\theader = read_bits_3(data, boff); boff += 3;\n\t\tif((header >>> 1) == 0) {\n\t\t\t/* Stored block */\n\t\t\tif(boff & 7) boff += 8 - (boff&7);\n\t\t\t/* 2 bytes sz, 2 bytes bit inverse */\n\t\t\tvar sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;\n\t\t\tboff += 32;\n\t\t\t/* push sz bytes */\n\t\t\tif(sz > 0) {\n\t\t\t\tif(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }\n\t\t\t\twhile(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t} else if((header >> 1) == 1) {\n\t\t\t/* Fixed Huffman */\n\t\t\tmax_len_1 = 9; max_len_2 = 5;\n\t\t} else {\n\t\t\t/* Dynamic Huffman */\n\t\t\tboff = dyn(data, boff);\n\t\t\tmax_len_1 = dyn_len_1; max_len_2 = dyn_len_2;\n\t\t}\n\t\tfor(;;) { // while(true) is apparently out of vogue in modern JS circles\n\t\t\tif(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }\n\t\t\t/* ingest code and move read head */\n\t\t\tvar bits = read_bits_n(data, boff, max_len_1);\n\t\t\tvar code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];\n\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */\n\t\t\tif(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;\n\t\t\telse if(code == 256) break;\n\t\t\telse {\n\t\t\t\tcode -= 257;\n\t\t\t\tvar len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;\n\t\t\t\tvar tgt = woff + LEN_LN[code];\n\t\t\t\t/* length extra bits */\n\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\ttgt += read_bits_n(data, boff, len_eb);\n\t\t\t\t\tboff += len_eb;\n\t\t\t\t}\n\n\t\t\t\t/* dist code */\n\t\t\t\tbits = read_bits_n(data, boff, max_len_2);\n\t\t\t\tcode = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];\n\t\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t\tvar dst_eb = (code < 4 ? 0 : (code-2)>>1);\n\t\t\t\tvar dst = DST_LN[code];\n\t\t\t\t/* dist extra bits */\n\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\tdst += read_bits_n(data, boff, dst_eb);\n\t\t\t\t\tboff += dst_eb;\n\t\t\t\t}\n\n\t\t\t\t/* in the common case, manual byte copy is faster than TA set / Buffer copy */\n\t\t\t\tif(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt + 100); OL = outbuf.length; }\n\t\t\t\twhile(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }\n\t\t\t}\n\t\t}\n\t}\n\tif(usz) return [outbuf, (boff+7)>>>3];\n\treturn [outbuf.slice(0, woff), (boff+7)>>>3];\n}\n\nfunction _inflate(payload, usz) {\n\tvar data = payload.slice(payload.l||0);\n\tvar out = inflate(data, usz);\n\tpayload.l += out[1];\n\treturn out[0];\n}\n\nfunction warn_or_throw(wrn, msg) {\n\tif(wrn) { if(typeof console !== 'undefined') console.error(msg); }\n\telse throw new Error(msg);\n}\n\nfunction parse_zip(file, options) {\n\tvar blob = file;\n\tprep_blob(blob, 0);\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o, { root: options.root });\n\n\t/* find end of central directory, start just after signature */\n\tvar i = blob.length - 4;\n\twhile((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;\n\tblob.l = i + 4;\n\n\t/* parse end of central directory */\n\tblob.l += 4;\n\tvar fcnt = blob.read_shift(2);\n\tblob.l += 6;\n\tvar start_cd = blob.read_shift(4);\n\n\t/* parse central directory */\n\tblob.l = start_cd;\n\n\tfor(i = 0; i < fcnt; ++i) {\n\t\t/* trust local file header instead of CD entry */\n\t\tblob.l += 20;\n\t\tvar csz = blob.read_shift(4);\n\t\tvar usz = blob.read_shift(4);\n\t\tvar namelen = blob.read_shift(2);\n\t\tvar efsz = blob.read_shift(2);\n\t\tvar fcsz = blob.read_shift(2);\n\t\tblob.l += 8;\n\t\tvar offset = blob.read_shift(4);\n\t\tvar EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));\n\t\tblob.l += namelen + efsz + fcsz;\n\n\t\tvar L = blob.l;\n\t\tblob.l = offset + 4;\n\t\tparse_local_file(blob, csz, usz, o, EF);\n\t\tblob.l = L;\n\t}\n\n\treturn o;\n}\n\n\n/* head starts just after local file header signature */\nfunction parse_local_file(blob, csz, usz, o, EF) {\n\t/* [local file header] */\n\tblob.l += 2;\n\tvar flags = blob.read_shift(2);\n\tvar meth = blob.read_shift(2);\n\tvar date = parse_dos_date(blob);\n\n\tif(flags & 0x2041) throw new Error(\"Unsupported ZIP encryption\");\n\tvar crc32 = blob.read_shift(4);\n\tvar _csz = blob.read_shift(4);\n\tvar _usz = blob.read_shift(4);\n\n\tvar namelen = blob.read_shift(2);\n\tvar efsz = blob.read_shift(2);\n\n\t// TODO: flags & (1<<11) // UTF8\n\tvar name = \"\"; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);\n\tif(efsz) {\n\t\tvar ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));\n\t\tif((ef[0x5455]||{}).mt) date = ef[0x5455].mt;\n\t\tif(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;\n\t}\n\tblob.l += efsz;\n\n\t/* [encryption header] */\n\n\t/* [file data] */\n\tvar data = blob.slice(blob.l, blob.l + _csz);\n\tswitch(meth) {\n\t\tcase 8: data = _inflateRawSync(blob, _usz); break;\n\t\tcase 0: break; // TODO: scan for magic number\n\t\tdefault: throw new Error(\"Unsupported ZIP Compression method \" + meth);\n\t}\n\n\t/* [data descriptor] */\n\tvar wrn = false;\n\tif(flags & 8) {\n\t\tcrc32 = blob.read_shift(4);\n\t\tif(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }\n\t\t_csz = blob.read_shift(4);\n\t\t_usz = blob.read_shift(4);\n\t}\n\n\tif(_csz != csz) warn_or_throw(wrn, \"Bad compressed size: \" + csz + \" != \" + _csz);\n\tif(_usz != usz) warn_or_throw(wrn, \"Bad uncompressed size: \" + usz + \" != \" + _usz);\n\tvar _crc32 = CRC32.buf(data, 0);\n\tif((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, \"Bad CRC32 checksum: \" + crc32 + \" != \" + _crc32);\n\tcfb_add(o, name, data, {unsafe: true, mt: date});\n}\nfunction write_zip(cfb, options) {\n\tvar _opts = options || {};\n\tvar out = [], cdirs = [];\n\tvar o = new_buf(1);\n\tvar method = (_opts.compression ? 8 : 0), flags = 0;\n\tvar desc = false;\n\tif(desc) flags |= 8;\n\tvar i = 0, j = 0;\n\n\tvar start_cd = 0, fcnt = 0;\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tvar crcs = [];\n\tvar sz_cd = 0;\n\n\tfor(i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\t\tvar start = start_cd;\n\n\t\t/* TODO: CP437 filename */\n\t\tvar namebuf = new_buf(fp.length);\n\t\tfor(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);\n\t\tnamebuf = namebuf.slice(0, namebuf.l);\n\t\tcrcs[fcnt] = CRC32.buf(fi.content, 0);\n\n\t\tvar outbuf = fi.content;\n\t\tif(method == 8) outbuf = _deflateRawSync(outbuf);\n\n\t\t/* local file header */\n\t\to = new_buf(30);\n\t\to.write_shift(4, 0x04034b50);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\t/* TODO: last mod file time/date */\n\t\tif(fi.mt) write_dos_date(o, fi.mt);\n\t\telse o.write_shift(4, 0);\n\t\to.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);\n\t\to.write_shift(4, (flags & 8) ? 0 : outbuf.length);\n\t\to.write_shift(4, (flags & 8) ? 0 : fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\n\t\tstart_cd += o.length;\n\t\tout.push(o);\n\t\tstart_cd += namebuf.length;\n\t\tout.push(namebuf);\n\n\t\t/* TODO: extra fields? */\n\n\t\t/* TODO: encryption header ? */\n\n\t\tstart_cd += outbuf.length;\n\t\tout.push(outbuf);\n\n\t\t/* data descriptor */\n\t\tif(flags & 8) {\n\t\t\to = new_buf(12);\n\t\t\to.write_shift(-4, crcs[fcnt]);\n\t\t\to.write_shift(4, outbuf.length);\n\t\t\to.write_shift(4, fi.content.length);\n\t\t\tstart_cd += o.l;\n\t\t\tout.push(o);\n\t\t}\n\n\t\t/* central directory */\n\t\to = new_buf(46);\n\t\to.write_shift(4, 0x02014b50);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\to.write_shift(4, 0); /* TODO: last mod file time/date */\n\t\to.write_shift(-4, crcs[fcnt]);\n\n\t\to.write_shift(4, outbuf.length);\n\t\to.write_shift(4, fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, start);\n\n\t\tsz_cd += o.l;\n\t\tcdirs.push(o);\n\t\tsz_cd += namebuf.length;\n\t\tcdirs.push(namebuf);\n\t\t++fcnt;\n\t}\n\n\t/* end of central directory */\n\to = new_buf(22);\n\to.write_shift(4, 0x06054b50);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, fcnt);\n\to.write_shift(2, fcnt);\n\to.write_shift(4, sz_cd);\n\to.write_shift(4, start_cd);\n\to.write_shift(2, 0);\n\n\treturn bconcat(([bconcat((out)), bconcat(cdirs), o]));\n}\nvar ContentTypeMap = ({\n\t\"htm\": \"text/html\",\n\t\"xml\": \"text/xml\",\n\n\t\"gif\": \"image/gif\",\n\t\"jpg\": \"image/jpeg\",\n\t\"png\": \"image/png\",\n\n\t\"mso\": \"application/x-mso\",\n\t\"thmx\": \"application/vnd.ms-officetheme\",\n\t\"sh33tj5\": \"application/octet-stream\"\n});\n\nfunction get_content_type(fi, fp) {\n\tif(fi.ctype) return fi.ctype;\n\n\tvar ext = fi.name || \"\", m = ext.match(/\\.([^\\.]+)$/);\n\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\n\tif(fp) {\n\t\tm = (ext = fp).match(/[\\.\\\\]([^\\.\\\\])+$/);\n\t\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\t}\n\n\treturn \"application/octet-stream\";\n}\n\n/* 76 character chunks TODO: intertwine encoding */\nfunction write_base64_76(bstr) {\n\tvar data = Base64_encode(bstr);\n\tvar o = [];\n\tfor(var i = 0; i < data.length; i+= 76) o.push(data.slice(i, i+76));\n\treturn o.join(\"\\r\\n\") + \"\\r\\n\";\n}\n\n/*\nRules for QP:\n\t- escape =## applies for all non-display characters and literal \"=\"\n\t- space or tab at end of line must be encoded\n\t- \\r\\n newlines can be preserved, but bare \\r and \\n must be escaped\n\t- lines must not exceed 76 characters, use soft breaks =\\r\\n\n\nTODO: Some files from word appear to write line extensions with bare equals:\n\n```\n<table class=3DMsoTableGrid border=3D1 cellspacing=3D0 cellpadding=3D0 width=\n=\"70%\"\n```\n*/\nfunction write_quoted_printable(text) {\n\tvar encoded = text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7E-\\xFF=]/g, function(c) {\n\t\tvar w = c.charCodeAt(0).toString(16).toUpperCase();\n\t\treturn \"=\" + (w.length == 1 ? \"0\" + w : w);\n\t});\n\n\tencoded = encoded.replace(/ $/mg, \"=20\").replace(/\\t$/mg, \"=09\");\n\n\tif(encoded.charAt(0) == \"\\n\") encoded = \"=0D\" + encoded.slice(1);\n\tencoded = encoded.replace(/\\r(?!\\n)/mg, \"=0D\").replace(/\\n\\n/mg, \"\\n=0A\").replace(/([^\\r\\n])\\n/mg, \"$1=0A\");\n\n\tvar o = [], split = encoded.split(\"\\r\\n\");\n\tfor(var si = 0; si < split.length; ++si) {\n\t\tvar str = split[si];\n\t\tif(str.length == 0) { o.push(\"\"); continue; }\n\t\tfor(var i = 0; i < str.length;) {\n\t\t\tvar end = 76;\n\t\t\tvar tmp = str.slice(i, i + end);\n\t\t\tif(tmp.charAt(end - 1) == \"=\") end --;\n\t\t\telse if(tmp.charAt(end - 2) == \"=\") end -= 2;\n\t\t\telse if(tmp.charAt(end - 3) == \"=\") end -= 3;\n\t\t\ttmp = str.slice(i, i + end);\n\t\t\ti += end;\n\t\t\tif(i < str.length) tmp += \"=\";\n\t\t\to.push(tmp);\n\t\t}\n\t}\n\n\treturn o.join(\"\\r\\n\");\n}\nfunction parse_quoted_printable(data) {\n\tvar o = [];\n\n\t/* unify long lines */\n\tfor(var di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\twhile(di <= data.length && line.charAt(line.length - 1) == \"=\") line = line.slice(0, line.length - 1) + data[++di];\n\t\to.push(line);\n\t}\n\n\t/* decode */\n\tfor(var oi = 0; oi < o.length; ++oi) o[oi] = o[oi].replace(/[=][0-9A-Fa-f]{2}/g, function($$) { return String.fromCharCode(parseInt($$.slice(1), 16)); });\n\treturn s2a(o.join(\"\\r\\n\"));\n}\n\n\nfunction parse_mime(cfb, data, root) {\n\tvar fname = \"\", cte = \"\", ctype = \"\", fdata;\n\tvar di = 0;\n\tfor(;di < 10; ++di) {\n\t\tvar line = data[di];\n\t\tif(!line || line.match(/^\\s*$/)) break;\n\t\tvar m = line.match(/^(.*?):\\s*([^\\s].*)$/);\n\t\tif(m) switch(m[1].toLowerCase()) {\n\t\t\tcase \"content-location\": fname = m[2].trim(); break;\n\t\t\tcase \"content-type\": ctype = m[2].trim(); break;\n\t\t\tcase \"content-transfer-encoding\": cte = m[2].trim(); break;\n\t\t}\n\t}\n\t++di;\n\tswitch(cte.toLowerCase()) {\n\t\tcase 'base64': fdata = s2a(Base64_decode(data.slice(di).join(\"\"))); break;\n\t\tcase 'quoted-printable': fdata = parse_quoted_printable(data.slice(di)); break;\n\t\tdefault: throw new Error(\"Unsupported Content-Transfer-Encoding \" + cte);\n\t}\n\tvar file = cfb_add(cfb, fname.slice(root.length), fdata, {unsafe: true});\n\tif(ctype) file.ctype = ctype;\n}\n\nfunction parse_mad(file, options) {\n\tif(a2s(file.slice(0,13)).toLowerCase() != \"mime-version:\") throw new Error(\"Unsupported MAD header\");\n\tvar root = (options && options.root || \"\");\n\t// $FlowIgnore\n\tvar data = (has_buf && Buffer.isBuffer(file) ? file.toString(\"binary\") : a2s(file)).split(\"\\r\\n\");\n\tvar di = 0, row = \"\";\n\n\t/* if root is not specified, scan for the common prefix */\n\tfor(di = 0; di < data.length; ++di) {\n\t\trow = data[di];\n\t\tif(!/^Content-Location:/i.test(row)) continue;\n\t\trow = row.slice(row.indexOf(\"file\"));\n\t\tif(!root) root = row.slice(0, row.lastIndexOf(\"/\") + 1);\n\t\tif(row.slice(0, root.length) == root) continue;\n\t\twhile(root.length > 0) {\n\t\t\troot = root.slice(0, root.length - 1);\n\t\t\troot = root.slice(0, root.lastIndexOf(\"/\") + 1);\n\t\t\tif(row.slice(0,root.length) == root) break;\n\t\t}\n\t}\n\n\tvar mboundary = (data[1] || \"\").match(/boundary=\"(.*?)\"/);\n\tif(!mboundary) throw new Error(\"MAD cannot find boundary\");\n\tvar boundary = \"--\" + (mboundary[1] || \"\");\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o);\n\tvar start_di, fcnt = 0;\n\tfor(di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\tif(line !== boundary && line !== boundary + \"--\") continue;\n\t\tif(fcnt++) parse_mime(o, data.slice(start_di, di), root);\n\t\tstart_di = di;\n\t}\n\treturn o;\n}\n\nfunction write_mad(cfb, options) {\n\tvar opts = options || {};\n\tvar boundary = opts.boundary || \"SheetJS\";\n\tboundary = '------=' + boundary;\n\n\tvar out = [\n\t\t'MIME-Version: 1.0',\n\t\t'Content-Type: multipart/related; boundary=\"' + boundary.slice(2) + '\"',\n\t\t'',\n\t\t'',\n\t\t''\n\t];\n\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tfor(var i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length);\n\t\tfi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\n\t\t/* Normalize filename */\n\t\tfp = fp.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7E-\\xFF]/g, function(c) {\n\t\t\treturn \"_x\" + c.charCodeAt(0).toString(16) + \"_\";\n\t\t}).replace(/[\\u0080-\\uFFFF]/g, function(u) {\n\t\t\treturn \"_u\" + u.charCodeAt(0).toString(16) + \"_\";\n\t\t});\n\n\t\t/* Extract content as binary string */\n\t\tvar ca = fi.content;\n\t\t// $FlowIgnore\n\t\tvar cstr = has_buf && Buffer.isBuffer(ca) ? ca.toString(\"binary\") : a2s(ca);\n\n\t\t/* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */\n\t\tvar dispcnt = 0, L = Math.min(1024, cstr.length), cc = 0;\n\t\tfor(var csl = 0; csl <= L; ++csl) if((cc=cstr.charCodeAt(csl)) >= 0x20 && cc < 0x80) ++dispcnt;\n\t\tvar qp = dispcnt >= L * 4 / 5;\n\n\t\tout.push(boundary);\n\t\tout.push('Content-Location: ' + (opts.root || 'file:///C:/SheetJS/') + fp);\n\t\tout.push('Content-Transfer-Encoding: ' + (qp ? 'quoted-printable' : 'base64'));\n\t\tout.push('Content-Type: ' + get_content_type(fi, fp));\n\t\tout.push('');\n\n\t\tout.push(qp ? write_quoted_printable(cstr) : write_base64_76(cstr));\n\t}\n\tout.push(boundary + '--\\r\\n');\n\treturn out.join(\"\\r\\n\");\n}\nfunction cfb_new(opts) {\n\tvar o = ({});\n\tinit_cfb(o, opts);\n\treturn o;\n}\n\nfunction cfb_add(cfb, name, content, opts) {\n\tvar unsafe = opts && opts.unsafe;\n\tif(!unsafe) init_cfb(cfb);\n\tvar file = !unsafe && CFB.find(cfb, name);\n\tif(!file) {\n\t\tvar fpath = cfb.FullPaths[0];\n\t\tif(name.slice(0, fpath.length) == fpath) fpath = name;\n\t\telse {\n\t\t\tif(fpath.slice(-1) != \"/\") fpath += \"/\";\n\t\t\tfpath = (fpath + name).replace(\"//\",\"/\");\n\t\t}\n\t\tfile = ({name: filename(name), type: 2});\n\t\tcfb.FileIndex.push(file);\n\t\tcfb.FullPaths.push(fpath);\n\t\tif(!unsafe) CFB.utils.cfb_gc(cfb);\n\t}\nfile.content = (content);\n\tfile.size = content ? content.length : 0;\n\tif(opts) {\n\t\tif(opts.CLSID) file.clsid = opts.CLSID;\n\t\tif(opts.mt) file.mt = opts.mt;\n\t\tif(opts.ct) file.ct = opts.ct;\n\t}\n\treturn file;\n}\n\nfunction cfb_del(cfb, name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex.splice(j, 1);\n\t\tcfb.FullPaths.splice(j, 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_mov(cfb, old_name, new_name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, old_name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex[j].name = filename(new_name);\n\t\tcfb.FullPaths[j] = new_name;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_gc(cfb) { rebuild_cfb(cfb, true); }\n\nexports.find = find;\nexports.read = read;\nexports.parse = parse;\nexports.write = write;\nexports.writeFile = write_file;\nexports.utils = {\n\tcfb_new: cfb_new,\n\tcfb_add: cfb_add,\n\tcfb_del: cfb_del,\n\tcfb_mov: cfb_mov,\n\tcfb_gc: cfb_gc,\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tuse_zlib: use_zlib,\n\t_deflateRaw: _deflate,\n\t_inflateRaw: _inflate,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\n","import type { ExcelSanitizationLimits } from \"./types.js\";\n\nexport type ExcelSanitizationErrorCode =\n | \"ERR_INVALID_ARGUMENT\"\n | \"ERR_UNSUPPORTED_EXTENSION\"\n | \"ERR_INVALID_XLS\"\n | \"ERR_INVALID_XLSX\"\n | \"ERR_LIMIT_EXCEEDED\"\n | \"ERR_WORKSHEET_COUNT\"\n | \"ERR_SAME_PATH\"\n | \"ERR_OUTPUT_EXISTS\"\n | \"ERR_FILE_READ\"\n | \"ERR_FILE_WRITE\";\n\nexport interface ExcelSanitizationErrorOptions {\n cause?: unknown;\n details?: Readonly<Record<string, unknown>>;\n}\n\ninterface CreateErrorOptions extends ExcelSanitizationErrorOptions {\n message?: string;\n}\n\nexport type SafetyLimitName = keyof ExcelSanitizationLimits | \"partBytes\";\n\nconst ERROR_MESSAGES: Readonly<Record<ExcelSanitizationErrorCode, string>> = Object.freeze({\n ERR_INVALID_ARGUMENT: \"Invalid argument\",\n ERR_UNSUPPORTED_EXTENSION:\n \"Supported extensions are .xls, .xlsx, and .xlsm; input and output formats must match\",\n ERR_INVALID_XLS: \"Invalid or unsupported XLS workbook\",\n ERR_INVALID_XLSX: \"Invalid or unsupported OOXML workbook\",\n ERR_LIMIT_EXCEEDED: \"Excel workbook exceeds a configured safety limit\",\n ERR_WORKSHEET_COUNT: \"The workbook must contain exactly one worksheet\",\n ERR_SAME_PATH: \"Input and output paths must be different\",\n ERR_OUTPUT_EXISTS: \"The output file already exists\",\n ERR_FILE_READ: \"Unable to read the input Excel file\",\n ERR_FILE_WRITE: \"Unable to write the sanitized Excel file\",\n});\n\nexport class ExcelSanitizationError extends Error {\n override readonly name = \"ExcelSanitizationError\";\n readonly code: ExcelSanitizationErrorCode;\n readonly details?: Readonly<Record<string, unknown>>;\n\n constructor(\n code: ExcelSanitizationErrorCode,\n message: string,\n options: ExcelSanitizationErrorOptions = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.code = code;\n if (options.details !== undefined) {\n this.details = Object.freeze({ ...options.details });\n }\n }\n}\n\nexport function createError(\n code: ExcelSanitizationErrorCode,\n options: CreateErrorOptions = {},\n): ExcelSanitizationError {\n return new ExcelSanitizationError(code, options.message ?? ERROR_MESSAGES[code], options);\n}\n\nexport function limitExceeded(\n limit: SafetyLimitName,\n configured: number,\n actual: number,\n partName?: string,\n): ExcelSanitizationError {\n return createError(\"ERR_LIMIT_EXCEEDED\", {\n details: {\n limit,\n configured,\n actual,\n ...(partName === undefined ? {} : { partName }),\n },\n });\n}\n","import * as CFB from \"cfb\";\n\nimport { createError, limitExceeded } from \"../errors.js\";\nimport type { NormalizedSanitizeOptions } from \"../types.js\";\n\nconst COMPOUND_FILE_SIGNATURE = Buffer.from([0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1]);\nconst RECORD_HEADER_BYTES = 4;\nconst CFB_STORAGE_ENTRY = 1;\nconst CFB_STREAM_ENTRY = 2;\nconst RECORD_CONTINUE = 0x003c;\nconst RECORD_BOUNDSHEET = 0x0085;\nconst RECORD_BOF_IDS = new Set([0x0009, 0x0209, 0x0409, 0x0809]);\n\n// INDEX, DBCELL, and ExtSST cache absolute stream offsets. They are optional\n// acceleration records and must be discarded after other records move.\nconst OFFSET_CACHE_RECORD_IDS = new Set([0x00d7, 0x00ff, 0x020b]);\n\n// Drawing-layer records cover OfficeArt drawings, images, notes/comments,\n// controls, embedded OLE objects, and header/footer or background pictures.\nconst DRAWING_RECORD_IDS = new Set([\n 0x001c, // Note\n 0x005d, // Obj\n 0x007f, // ImData\n 0x00e9, // BkHim\n 0x00eb, // MsoDrawingGroup\n 0x00ec, // MsoDrawing\n 0x00ed, // MsoDrawingSelection\n 0x01b6, // TxO\n 0x0866, // HFPicture\n]);\n\ninterface BiffRecord {\n id: number;\n originalOffset: number;\n payload: Buffer;\n remove: boolean;\n}\n\nexport function hasCompoundFileSignature(buffer: Buffer): boolean {\n return (\n buffer.length >= COMPOUND_FILE_SIGNATURE.length &&\n buffer.subarray(0, COMPOUND_FILE_SIGNATURE.length).equals(COMPOUND_FILE_SIGNATURE)\n );\n}\n\nexport async function sanitizeBiffWorkbook(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<Buffer> {\n enforceInputSize(buffer, options);\n const cfb = CFB.read(buffer, { type: \"buffer\" });\n enforceContainerLimits(cfb, options);\n\n const workbookEntry = CFB.find(cfb, \"Workbook\") ?? CFB.find(cfb, \"Book\");\n if (!workbookEntry || workbookEntry.type !== CFB_STREAM_ENTRY) {\n throw new Error(\"Compound file has no BIFF Workbook stream\");\n }\n\n const workbookStream = Buffer.from(workbookEntry.content);\n const records = parseBiffRecords(workbookStream);\n rejectEncryptedWorkbook(records);\n enforceWorksheetCount(records, options.requireSingleWorksheet);\n\n const sanitizedStream = rebuildWorkbookStream(records);\n workbookEntry.content = sanitizedStream;\n workbookEntry.size = sanitizedStream.length;\n removeEmbeddedObjectEntries(cfb);\n\n return Buffer.from(CFB.write(cfb, { type: \"buffer\", fileType: \"cfb\" }));\n}\n\nfunction enforceInputSize(buffer: Buffer, options: NormalizedSanitizeOptions): void {\n const configured = options.limits.maxUncompressedBytes;\n if (buffer.length > configured) {\n throw limitExceeded(\"maxUncompressedBytes\", configured, buffer.length);\n }\n}\n\nfunction enforceContainerLimits(cfb: CFB.CFB$Container, options: NormalizedSanitizeOptions): void {\n const entries = cfb.FileIndex.filter(\n (entry) => entry.type === CFB_STORAGE_ENTRY || entry.type === CFB_STREAM_ENTRY,\n );\n if (entries.length > options.limits.maxEntryCount) {\n throw limitExceeded(\"maxEntryCount\", options.limits.maxEntryCount, entries.length);\n }\n\n const totalBytes = entries.reduce(\n (total, entry) => (entry.type === CFB_STREAM_ENTRY ? total + entry.content.length : total),\n 0,\n );\n if (totalBytes > options.limits.maxUncompressedBytes) {\n throw limitExceeded(\"maxUncompressedBytes\", options.limits.maxUncompressedBytes, totalBytes);\n }\n}\n\nfunction parseBiffRecords(stream: Buffer): BiffRecord[] {\n const records: BiffRecord[] = [];\n let offset = 0;\n let removeContinuation = false;\n\n while (offset < stream.length) {\n if (offset + RECORD_HEADER_BYTES > stream.length) {\n throw new Error(\"Truncated BIFF record header\");\n }\n\n const id = stream.readUInt16LE(offset);\n const length = stream.readUInt16LE(offset + 2);\n const nextOffset = offset + RECORD_HEADER_BYTES + length;\n if (nextOffset > stream.length) {\n throw new Error(\"Truncated BIFF record payload\");\n }\n\n const remove: boolean =\n id === RECORD_CONTINUE\n ? removeContinuation\n : DRAWING_RECORD_IDS.has(id) || OFFSET_CACHE_RECORD_IDS.has(id);\n records.push({\n id,\n originalOffset: offset,\n payload: stream.subarray(offset + RECORD_HEADER_BYTES, nextOffset),\n remove,\n });\n if (id !== RECORD_CONTINUE) {\n removeContinuation = remove;\n }\n offset = nextOffset;\n }\n\n if (records.length === 0 || !RECORD_BOF_IDS.has(records[0]?.id ?? -1)) {\n throw new Error(\"Workbook stream does not start with a BIFF BOF record\");\n }\n return records;\n}\n\nfunction rejectEncryptedWorkbook(records: readonly BiffRecord[]): void {\n if (records.some((record) => record.id === 0x002f)) {\n throw createError(\"ERR_INVALID_XLS\", {\n message: \"Encrypted XLS workbooks are not supported\",\n });\n }\n}\n\nfunction enforceWorksheetCount(records: readonly BiffRecord[], required: boolean): void {\n const count = records.filter((record) => record.id === RECORD_BOUNDSHEET).length;\n if (count === 0) {\n throw new Error(\"Workbook contains no sheets\");\n }\n if (required && count !== 1) {\n throw createError(\"ERR_WORKSHEET_COUNT\", {\n details: { expected: 1, actual: count },\n });\n }\n}\n\nfunction rebuildWorkbookStream(records: readonly BiffRecord[]): Buffer {\n const newOffsets = new Map<number, number>();\n let outputLength = 0;\n for (const record of records) {\n if (record.remove) {\n continue;\n }\n newOffsets.set(record.originalOffset, outputLength);\n outputLength += RECORD_HEADER_BYTES + record.payload.length;\n }\n\n const output = Buffer.allocUnsafe(outputLength);\n let outputOffset = 0;\n for (const record of records) {\n if (record.remove) {\n continue;\n }\n\n const payload = patchBoundSheetOffset(record, newOffsets);\n output.writeUInt16LE(record.id, outputOffset);\n output.writeUInt16LE(payload.length, outputOffset + 2);\n payload.copy(output, outputOffset + RECORD_HEADER_BYTES);\n outputOffset += RECORD_HEADER_BYTES + payload.length;\n }\n return output;\n}\n\nfunction patchBoundSheetOffset(\n record: BiffRecord,\n newOffsets: ReadonlyMap<number, number>,\n): Buffer {\n if (record.id !== RECORD_BOUNDSHEET) {\n return record.payload;\n }\n if (record.payload.length < 4) {\n throw new Error(\"Invalid BoundSheet record\");\n }\n\n const originalSheetOffset = record.payload.readUInt32LE(0);\n const newSheetOffset = newOffsets.get(originalSheetOffset);\n if (newSheetOffset === undefined) {\n throw new Error(\"BoundSheet record points outside the Workbook stream\");\n }\n\n const payload = Buffer.from(record.payload);\n payload.writeUInt32LE(newSheetOffset, 0);\n return payload;\n}\n\nfunction removeEmbeddedObjectEntries(cfb: CFB.CFB$Container): void {\n const paths = cfb.FullPaths.filter((path) =>\n path\n .split(\"/\")\n .filter(Boolean)\n .some(\n (segment) =>\n segment.toLowerCase() === \"objectpool\" ||\n segment.toLowerCase() === \"ctls\" ||\n /^mbd[0-9a-f]{8}$/i.test(segment),\n ),\n );\n\n for (let index = paths.length - 1; index >= 0; index -= 1) {\n CFB.utils.cfb_del(cfb, paths[index] ?? \"\");\n }\n if (paths.length > 0) {\n CFB.utils.cfb_gc(cfb);\n }\n}\n","import { limitExceeded } from \"../errors.js\";\nimport type { ExcelSanitizationLimits } from \"../types.js\";\n\nconst END_RECORD_MINIMUM_SIZE = 22;\nconst CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE = 46;\nconst MAX_ZIP_COMMENT_SIZE = 65_535;\nconst END_RECORD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_ENTRY_SIGNATURE = 0x02014b50;\nconst ZIP64_END_LOCATOR_SIGNATURE = 0x07064b50;\n\ninterface EndRecord {\n offset: number;\n totalEntries: number;\n centralDirectoryOffset: number;\n centralDirectorySize: number;\n}\n\ninterface CentralDirectoryEntry {\n nextOffset: number;\n uncompressedSize: number;\n}\n\nexport function hasZipSignature(buffer: Buffer): boolean {\n return buffer.length >= 2 && buffer[0] === 0x50 && buffer[1] === 0x4b;\n}\n\nexport function validateZipCentralDirectory(\n buffer: Buffer,\n limits: Readonly<ExcelSanitizationLimits>,\n): void {\n const endRecord = readEndRecord(buffer, limits);\n const centralDirectoryEnd = endRecord.centralDirectoryOffset + endRecord.centralDirectorySize;\n\n if (\n endRecord.centralDirectoryOffset > endRecord.offset ||\n centralDirectoryEnd > endRecord.offset ||\n centralDirectoryEnd > buffer.length\n ) {\n throw new Error(\"Invalid ZIP central-directory bounds\");\n }\n\n let entryOffset = endRecord.centralDirectoryOffset;\n let totalUncompressedSize = 0;\n for (let index = 0; index < endRecord.totalEntries; index += 1) {\n const entry = readCentralDirectoryEntry(\n buffer,\n entryOffset,\n centralDirectoryEnd,\n endRecord.centralDirectoryOffset,\n );\n totalUncompressedSize += entry.uncompressedSize;\n if (totalUncompressedSize > limits.maxUncompressedBytes) {\n throw limitExceeded(\n \"maxUncompressedBytes\",\n limits.maxUncompressedBytes,\n totalUncompressedSize,\n );\n }\n entryOffset = entry.nextOffset;\n }\n\n if (entryOffset !== centralDirectoryEnd) {\n throw new Error(\"ZIP central-directory entry count is inconsistent\");\n }\n}\n\nfunction readEndRecord(buffer: Buffer, limits: Readonly<ExcelSanitizationLimits>): EndRecord {\n const offset = findEndOfCentralDirectory(buffer);\n if (offset === undefined || offset + END_RECORD_MINIMUM_SIZE > buffer.length) {\n throw new Error(\"ZIP end-of-central-directory record is missing\");\n }\n\n const diskNumber = buffer.readUInt16LE(offset + 4);\n const centralDirectoryDisk = buffer.readUInt16LE(offset + 6);\n const entriesOnDisk = buffer.readUInt16LE(offset + 8);\n const totalEntries = buffer.readUInt16LE(offset + 10);\n const centralDirectorySize = buffer.readUInt32LE(offset + 12);\n const centralDirectoryOffset = buffer.readUInt32LE(offset + 16);\n const commentLength = buffer.readUInt16LE(offset + 20);\n\n if (offset + END_RECORD_MINIMUM_SIZE + commentLength > buffer.length) {\n throw new Error(\"Truncated ZIP comment\");\n }\n if (diskNumber !== 0 || centralDirectoryDisk !== 0 || entriesOnDisk !== totalEntries) {\n throw new Error(\"Multi-disk ZIP files are not supported\");\n }\n if (\n totalEntries === 0xffff ||\n centralDirectorySize === 0xffffffff ||\n centralDirectoryOffset === 0xffffffff ||\n (offset >= 20 && buffer.readUInt32LE(offset - 20) === ZIP64_END_LOCATOR_SIGNATURE)\n ) {\n throw new Error(\"ZIP64 files are not supported\");\n }\n if (totalEntries > limits.maxEntryCount) {\n throw limitExceeded(\"maxEntryCount\", limits.maxEntryCount, totalEntries);\n }\n\n return { offset, totalEntries, centralDirectoryOffset, centralDirectorySize };\n}\n\nfunction readCentralDirectoryEntry(\n buffer: Buffer,\n entryOffset: number,\n centralDirectoryEnd: number,\n centralDirectoryOffset: number,\n): CentralDirectoryEntry {\n if (\n entryOffset + CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE > centralDirectoryEnd ||\n buffer.readUInt32LE(entryOffset) !== CENTRAL_DIRECTORY_ENTRY_SIGNATURE\n ) {\n throw new Error(\"Malformed ZIP central-directory entry\");\n }\n\n const compressedSize = buffer.readUInt32LE(entryOffset + 20);\n const uncompressedSize = buffer.readUInt32LE(entryOffset + 24);\n const fileNameLength = buffer.readUInt16LE(entryOffset + 28);\n const extraLength = buffer.readUInt16LE(entryOffset + 30);\n const fileCommentLength = buffer.readUInt16LE(entryOffset + 32);\n const entryDisk = buffer.readUInt16LE(entryOffset + 34);\n const localHeaderOffset = buffer.readUInt32LE(entryOffset + 42);\n\n if (\n compressedSize === 0xffffffff ||\n uncompressedSize === 0xffffffff ||\n localHeaderOffset === 0xffffffff ||\n entryDisk !== 0\n ) {\n throw new Error(\"ZIP64 or multi-disk entries are not supported\");\n }\n\n const fileNameOffset = entryOffset + CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE;\n const extraOffset = fileNameOffset + fileNameLength;\n const nextOffset = extraOffset + extraLength + fileCommentLength;\n if (nextOffset > centralDirectoryEnd) {\n throw new Error(\"Truncated ZIP central-directory entry\");\n }\n\n validatePackageEntryName(buffer.subarray(fileNameOffset, extraOffset).toString(\"utf8\"));\n rejectZip64ExtraFields(buffer, extraOffset, extraLength);\n if (localHeaderOffset >= centralDirectoryOffset) {\n throw new Error(\"Invalid ZIP local-header offset\");\n }\n\n return { nextOffset, uncompressedSize };\n}\n\nexport function validatePackageEntryName(name: string): void {\n const normalized = name.replaceAll(\"\\\\\", \"/\");\n if (\n normalized.includes(\"\\0\") ||\n normalized.startsWith(\"/\") ||\n /^[A-Za-z]:\\//.test(normalized) ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n throw new Error(`Unsafe ZIP entry name: ${name}`);\n }\n}\n\nexport function findEndOfCentralDirectory(buffer: Buffer): number | undefined {\n const minimumOffset = Math.max(0, buffer.length - MAX_ZIP_COMMENT_SIZE - END_RECORD_MINIMUM_SIZE);\n for (let offset = buffer.length - END_RECORD_MINIMUM_SIZE; offset >= minimumOffset; offset -= 1) {\n if (\n buffer.readUInt32LE(offset) === END_RECORD_SIGNATURE &&\n offset + END_RECORD_MINIMUM_SIZE + buffer.readUInt16LE(offset + 20) === buffer.length\n ) {\n return offset;\n }\n }\n return undefined;\n}\n\nexport function rejectZip64ExtraFields(\n buffer: Buffer,\n extraOffset: number,\n extraLength: number,\n): void {\n const extraEnd = extraOffset + extraLength;\n let offset = extraOffset;\n while (offset < extraEnd) {\n if (offset + 4 > extraEnd) {\n throw new Error(\"Malformed ZIP extra field\");\n }\n const headerId = buffer.readUInt16LE(offset);\n const fieldLength = buffer.readUInt16LE(offset + 2);\n offset += 4;\n if (offset + fieldLength > extraEnd) {\n throw new Error(\"Truncated ZIP extra field\");\n }\n if (headerId === 0x0001) {\n throw new Error(\"ZIP64 files are not supported\");\n }\n offset += fieldLength;\n }\n}\n","export const DRAWING_RELATIONSHIP_SUFFIXES: readonly string[] = [\n \"/comments\",\n \"/control\",\n \"/drawing\",\n \"/image\",\n \"/oleObject\",\n \"/threadedComment\",\n \"/vmlDrawing\",\n];\n\nexport const PERSON_RELATIONSHIP_SUFFIXES: readonly string[] = [\"/person\"];\n\nexport const DRAWING_ELEMENTS: readonly string[] = [\n \"controls\",\n \"drawing\",\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"oleObjects\",\n \"picture\",\n];\n","import { DRAWING_ELEMENTS } from \"./constants.js\";\n\nexport function removeWorksheetDrawingMarkup(xml: string): string {\n return DRAWING_ELEMENTS.reduce((result, name) => {\n const element = new RegExp(\n `<(?:\\\\w+:)?${name}\\\\b[^>]*(?:\\\\/\\\\s*>|>[\\\\s\\\\S]*?<\\\\/(?:\\\\w+:)?${name}\\\\s*>)`,\n \"gi\",\n );\n return result.replace(element, \"\");\n }, xml);\n}\n\nexport function removeThreadedCommentExtensions(xml: string): string {\n return xml.replace(/<(?:\\w+:)?ext\\b[^>]*>[\\s\\S]*?<\\/(?:\\w+:)?ext\\s*>/gi, (extension) =>\n /<(?:\\w+:)?threadedComments?\\b/i.test(extension) ? \"\" : extension,\n );\n}\n","import type JSZip from \"jszip\";\n\nimport { limitExceeded } from \"../errors.js\";\nimport type { ReadBudget } from \"../types.js\";\n\ninterface StreamHelper {\n on(event: \"data\", listener: (chunk: Buffer) => void): StreamHelper;\n on(event: \"error\", listener: (error: unknown) => void): StreamHelper;\n on(event: \"end\", listener: () => void): StreamHelper;\n pause(): StreamHelper;\n resume(): StreamHelper;\n}\n\ninterface StreamableZipObject {\n internalStream(type: \"nodebuffer\"): StreamHelper;\n}\n\nfunction getNodeBufferStream(file: JSZip.JSZipObject): StreamHelper {\n // JSZip's declarations omit its public internalStream helper, while the\n // runtime API is required to enforce byte budgets before full inflation.\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n return (file as unknown as StreamableZipObject).internalStream(\"nodebuffer\");\n}\n\nexport async function requireXml(\n zip: JSZip,\n partName: string,\n budget: ReadBudget,\n partLimitBytes: number,\n): Promise<string> {\n const file = zip.file(partName);\n if (!file) {\n throw new Error(`Required workbook part is missing: ${partName}`);\n }\n return readXmlPart(file, partName, budget, partLimitBytes);\n}\n\nexport function readXmlPart(\n file: JSZip.JSZipObject,\n partName: string,\n budget: ReadBudget,\n partLimitBytes: number,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n const stream = getNodeBufferStream(file);\n let partBytes = 0;\n let settled = false;\n\n const fail = (error: unknown): void => {\n if (settled) {\n return;\n }\n settled = true;\n stream.pause();\n reject(error);\n };\n\n stream\n .on(\"data\", (chunk) => {\n if (settled) {\n return;\n }\n partBytes += chunk.length;\n budget.consumedBytes += chunk.length;\n if (partBytes > partLimitBytes) {\n fail(limitExceeded(\"partBytes\", partLimitBytes, partBytes, partName));\n return;\n }\n if (budget.consumedBytes > budget.limitBytes) {\n fail(limitExceeded(\"maxXmlBytes\", budget.limitBytes, budget.consumedBytes, partName));\n return;\n }\n chunks.push(Buffer.from(chunk));\n })\n .on(\"error\", (error) => fail(error))\n .on(\"end\", () => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(Buffer.concat(chunks, partBytes).toString(\"utf8\"));\n })\n .resume();\n });\n}\n","interface XmlCollection {\n body: string;\n full: string;\n opening: string;\n}\n\nexport function getAttribute(xml: string, name: string): string | undefined {\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = xml.match(new RegExp(`(?:^|\\\\s)${escaped}\\\\s*=\\\\s*([\"'])(.*?)\\\\1`, \"i\"));\n const value = match?.[2];\n return value === undefined ? undefined : decodeXml(value);\n}\n\nexport function decodeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nexport function findCollection(xml: string, name: string): XmlCollection | undefined {\n const match = xml.match(\n new RegExp(`<(?:\\\\w+:)?${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/(?:\\\\w+:)?${name}\\\\s*>`, \"i\"),\n );\n if (!match) {\n return undefined;\n }\n const full = match[0];\n if (full === undefined) {\n return undefined;\n }\n return {\n body: match[1] ?? \"\",\n full,\n opening: full.slice(0, full.indexOf(\">\") + 1),\n };\n}\n\nexport function replaceCollection(xml: string, name: string, body: string, count: number): string {\n const collection = findCollection(xml, name);\n if (!collection) {\n return xml;\n }\n const opening = /\\bcount\\s*=/.test(collection.opening)\n ? collection.opening.replace(/(\\bcount\\s*=\\s*)([\"'])\\d+\\2/i, `$1\"${count}\"`)\n : collection.opening.replace(/>$/, ` count=\"${count}\">`);\n const prefix = collection.opening.match(/^<(\\w+:)/)?.[1] ?? \"\";\n return xml.replace(collection.full, `${opening}${body}</${prefix}${name}>`);\n}\n\nexport function matchElements(xml: string, name: string): string[] {\n return (\n xml.match(\n new RegExp(\n `<(?:\\\\w+:)?${name}\\\\b[^>]*\\\\/\\\\s*>|<(?:\\\\w+:)?${name}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/(?:\\\\w+:)?${name}\\\\s*>`,\n \"gi\",\n ),\n ) ?? []\n );\n}\n","import { posix as packagePath } from \"node:path\";\n\nimport type JSZip from \"jszip\";\n\nimport type { ExcelSanitizationLimits, ReadBudget } from \"../types.js\";\nimport { readXmlPart, requireXml } from \"./parts.js\";\nimport { getAttribute } from \"./xml.js\";\n\nexport interface Relationship {\n id: string;\n target: string;\n targetMode: string | undefined;\n type: string;\n}\n\nexport type RelationshipGraph = Map<string, Relationship[]>;\n\nexport interface RemovedRelationships {\n xml: string;\n targets: Set<string>;\n}\n\nexport function removeRelationships(\n xml: string,\n source: string,\n relationshipSuffixes: readonly string[],\n): RemovedRelationships {\n const targets = new Set<string>();\n const cleaned = xml.replace(\n /<(?:\\w+:)?Relationship\\b[^>]*?(?:\\/\\s*>|>\\s*<\\/(?:\\w+:)?Relationship\\s*>)/gi,\n (tag) => {\n const type = getAttribute(tag, \"Type\") ?? \"\";\n const target = getAttribute(tag, \"Target\");\n const targetMode = getAttribute(tag, \"TargetMode\");\n if (\n !target ||\n targetMode?.toLowerCase() === \"external\" ||\n !relationshipSuffixes.some((suffix) => type.endsWith(suffix))\n ) {\n return tag;\n }\n targets.add(resolveTarget(source, target));\n return \"\";\n },\n );\n return { xml: cleaned, targets };\n}\n\nexport function parseRelationships(xml: string, source: string): Relationship[] {\n return Array.from(\n xml.matchAll(/<(?:\\w+:)?Relationship\\b([^>]*?)(?:\\/\\s*>|>\\s*<\\/(?:\\w+:)?Relationship\\s*>)/gi),\n ).flatMap((match) => {\n const attributes = match[1] ?? \"\";\n const id = getAttribute(attributes, \"Id\");\n const target = getAttribute(attributes, \"Target\");\n const type = getAttribute(attributes, \"Type\");\n if (!id || !target || !type) {\n return [];\n }\n const targetMode = getAttribute(attributes, \"TargetMode\");\n return [\n {\n id,\n target: targetMode?.toLowerCase() === \"external\" ? target : resolveTarget(source, target),\n targetMode,\n type,\n },\n ];\n });\n}\n\nexport function resolveTarget(source: string, target: string): string {\n const resolved = target.startsWith(\"/\")\n ? packagePath.normalize(target.slice(1))\n : packagePath.normalize(packagePath.join(packagePath.dirname(source), target));\n if (resolved === \"..\" || resolved.startsWith(\"../\")) {\n throw new Error(`Relationship target escapes package: ${target}`);\n }\n return resolved;\n}\n\nexport function relationshipFileForPart(partName: string): string {\n return packagePath.join(\n packagePath.dirname(partName),\n \"_rels\",\n `${packagePath.basename(partName)}.rels`,\n );\n}\n\nexport function sourcePartForRelationshipFile(fileName: string): string | undefined {\n if (fileName === \"_rels/.rels\") {\n return \"\";\n }\n const match = fileName.match(/^(.*\\/)_rels\\/([^/]+)\\.rels$/);\n return match ? `${match[1]}${match[2]}` : undefined;\n}\n\nexport async function removeUnreachableParts(\n zip: JSZip,\n detachedRoots: Set<string>,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<void> {\n if (detachedRoots.size === 0) {\n return;\n }\n\n const graph = await buildRelationshipGraph(zip, readBudget, limits);\n const candidates = collectReachableParts(detachedRoots, graph);\n const packageReachable = collectReachableParts(new Set([\"\"]), graph);\n packageReachable.delete(\"\");\n const deletedParts = new Set(\n [...candidates].filter((partName) => !packageReachable.has(partName)),\n );\n for (const partName of deletedParts) {\n zip.remove(partName);\n zip.remove(relationshipFileForPart(partName));\n }\n\n const contentTypes = await requireXml(\n zip,\n \"[Content_Types].xml\",\n readBudget,\n limits.maxMetadataXmlBytes,\n );\n zip.file(\n \"[Content_Types].xml\",\n contentTypes.replace(/<(?:\\w+:)?Override\\b[^>]*\\/>/gi, (tag) => {\n const partName = getAttribute(tag, \"PartName\")?.replace(/^\\//, \"\");\n return partName && deletedParts.has(partName) ? \"\" : tag;\n }),\n );\n}\n\nasync function buildRelationshipGraph(\n zip: JSZip,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<RelationshipGraph> {\n const graph: RelationshipGraph = new Map();\n for (const fileName of Object.keys(zip.files)) {\n if (!fileName.endsWith(\".rels\")) {\n continue;\n }\n const source = sourcePartForRelationshipFile(fileName);\n const file = zip.file(fileName);\n if (source !== undefined && file) {\n graph.set(\n source,\n parseRelationships(\n // Reads intentionally stay sequential because they share a mutable byte budget.\n // oxlint-disable-next-line no-await-in-loop\n await readXmlPart(file, fileName, readBudget, limits.maxRelationshipsXmlBytes),\n source,\n ),\n );\n }\n }\n return graph;\n}\n\nexport function collectReachableParts(\n initial: ReadonlySet<string>,\n graph: ReadonlyMap<string, readonly Relationship[]>,\n): Set<string> {\n const reachable = new Set(initial);\n const pending = [...initial];\n while (pending.length > 0) {\n const source = pending.pop();\n if (source === undefined) {\n continue;\n }\n for (const relationship of graph.get(source) ?? []) {\n if (\n relationship.targetMode?.toLowerCase() !== \"external\" &&\n !reachable.has(relationship.target)\n ) {\n reachable.add(relationship.target);\n pending.push(relationship.target);\n }\n }\n }\n return reachable;\n}\n","import type JSZip from \"jszip\";\n\nimport type { ExcelSanitizationLimits, ReadBudget } from \"../types.js\";\nimport { readXmlPart } from \"./parts.js\";\nimport { findCollection, getAttribute, matchElements, replaceCollection } from \"./xml.js\";\n\nexport async function removeUnusedCellStyles(\n zip: JSZip,\n worksheets: ReadonlyMap<string, string>,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<void> {\n const stylesFile = zip.file(\"xl/styles.xml\");\n if (!stylesFile) {\n return;\n }\n\n const usedStyles = new Set([0]);\n for (const xml of worksheets.values()) {\n collectStyleReferences(xml, usedStyles);\n }\n\n const stylesXml = await readXmlPart(\n stylesFile,\n \"xl/styles.xml\",\n readBudget,\n limits.maxStylesXmlBytes,\n );\n const cellXfs = findCollection(stylesXml, \"cellXfs\");\n if (!cellXfs) {\n return;\n }\n\n const xfs = matchElements(cellXfs.body, \"xf\");\n // The spread already creates a fresh array, so this sort cannot mutate the source set.\n // oxlint-disable-next-line unicorn/no-array-sort\n const retainedIndexes = [...usedStyles].sort((left, right) => left - right);\n validateStyleIndexes(retainedIndexes, xfs.length);\n const indexMap = new Map(retainedIndexes.map((oldIndex, newIndex) => [oldIndex, newIndex]));\n const retainedStyles = retainedIndexes.map((index) => {\n const style = xfs[index];\n if (style === undefined) {\n throw new Error(`Worksheet references an invalid style index: ${index}`);\n }\n return style;\n });\n\n zip.file(\n \"xl/styles.xml\",\n replaceCollection(stylesXml, \"cellXfs\", retainedStyles.join(\"\"), retainedIndexes.length),\n );\n for (const [worksheetPath, xml] of worksheets) {\n zip.file(worksheetPath, remapWorksheetStyles(xml, indexMap));\n }\n}\n\nfunction validateStyleIndexes(indexes: readonly number[], styleCount: number): void {\n if (indexes.some((index) => !Number.isInteger(index) || index < 0 || index >= styleCount)) {\n throw new Error(\n `Worksheet references an invalid style index (${indexes.join(\",\")} of ${styleCount})`,\n );\n }\n}\n\nexport function collectStyleReferences(xml: string, references: Set<number>): void {\n for (const tag of xml.match(/<(?:\\w+:)?(?:c|row)\\b[^>]*>/gi) ?? []) {\n const value = getAttribute(tag, \"s\");\n if (value !== undefined) {\n references.add(Number(value));\n }\n }\n for (const tag of xml.match(/<(?:\\w+:)?col\\b[^>]*>/gi) ?? []) {\n const value = getAttribute(tag, \"style\");\n if (value !== undefined) {\n references.add(Number(value));\n }\n }\n}\n\nexport function remapWorksheetStyles(xml: string, indexMap: ReadonlyMap<number, number>): string {\n return xml\n .replace(/<(?:\\w+:)?(?:c|row)\\b[^>]*>/gi, (tag) => remapNumericAttribute(tag, \"s\", indexMap))\n .replace(/<(?:\\w+:)?col\\b[^>]*>/gi, (tag) => remapNumericAttribute(tag, \"style\", indexMap));\n}\n\nexport function remapNumericAttribute(\n tag: string,\n attributeName: string,\n indexMap: ReadonlyMap<number, number>,\n): string {\n const expression = new RegExp(`(\\\\s${attributeName}\\\\s*=\\\\s*)([\"'])(\\\\d+)\\\\2`, \"i\");\n return tag.replace(expression, (match: string, prefix: string, quote: string, value: string) => {\n const remapped = indexMap.get(Number(value));\n return remapped === undefined ? match : `${prefix}${quote}${remapped}${quote}`;\n });\n}\n","import JSZip from \"jszip\";\n\nimport { createError } from \"../errors.js\";\nimport type { NormalizedSanitizeOptions, ReadBudget } from \"../types.js\";\nimport { hasZipSignature, validateZipCentralDirectory } from \"../zip/central-directory.js\";\nimport { removeThreadedCommentExtensions, removeWorksheetDrawingMarkup } from \"./cleanup.js\";\nimport { DRAWING_RELATIONSHIP_SUFFIXES, PERSON_RELATIONSHIP_SUFFIXES } from \"./constants.js\";\nimport { readXmlPart, requireXml } from \"./parts.js\";\nimport {\n parseRelationships,\n relationshipFileForPart,\n removeRelationships,\n removeUnreachableParts,\n type Relationship,\n} from \"./relationships.js\";\nimport { removeUnusedCellStyles } from \"./styles.js\";\nimport { getAttribute } from \"./xml.js\";\n\nconst WORKBOOK_PATH = \"xl/workbook.xml\";\nconst WORKBOOK_RELATIONSHIPS_PATH = \"xl/_rels/workbook.xml.rels\";\nconst CONTENT_TYPES_PATH = \"[Content_Types].xml\";\n\ninterface WorkbookContext {\n zip: JSZip;\n readBudget: ReadBudget;\n workbookXml: string;\n workbookRelationshipsXml: string;\n workbookRelationships: Relationship[];\n}\n\nexport async function sanitizeOoxmlWorkbook(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<Buffer> {\n if (!hasZipSignature(buffer)) {\n throw new Error(\"Invalid OOXML ZIP container\");\n }\n validateZipCentralDirectory(buffer, options.limits);\n\n const context = await loadWorkbookContext(buffer, options);\n const worksheetPaths = findWorksheetPaths(\n context.workbookXml,\n context.workbookRelationships,\n options.requireSingleWorksheet,\n );\n const detachedRoots = cleanWorkbookRelationships(context);\n const worksheetXmlByPath = await cleanWorksheets(context, worksheetPaths, detachedRoots, options);\n\n await removeUnreachableParts(context.zip, detachedRoots, context.readBudget, options.limits);\n await removeUnusedCellStyles(context.zip, worksheetXmlByPath, context.readBudget, options.limits);\n return context.zip.generateAsync({\n type: \"nodebuffer\",\n compression: \"DEFLATE\",\n compressionOptions: { level: 6 },\n });\n}\n\nasync function loadWorkbookContext(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<WorkbookContext> {\n const readBudget: ReadBudget = {\n consumedBytes: 0,\n limitBytes: options.limits.maxXmlBytes,\n };\n\n // CRC verification eagerly inflates every archive entry. Required XML parts\n // are instead inflated lazily below and constrained by per-part budgets.\n const zip = await JSZip.loadAsync(buffer);\n const workbookXml = await requireXml(\n zip,\n WORKBOOK_PATH,\n readBudget,\n options.limits.maxMetadataXmlBytes,\n );\n const workbookRelationshipsXml = await requireXml(\n zip,\n WORKBOOK_RELATIONSHIPS_PATH,\n readBudget,\n options.limits.maxRelationshipsXmlBytes,\n );\n await requireXml(zip, CONTENT_TYPES_PATH, readBudget, options.limits.maxMetadataXmlBytes);\n\n return {\n zip,\n readBudget,\n workbookXml,\n workbookRelationshipsXml,\n workbookRelationships: parseRelationships(workbookRelationshipsXml, WORKBOOK_PATH),\n };\n}\n\nfunction findWorksheetPaths(\n workbookXml: string,\n workbookRelationships: readonly Relationship[],\n requireSingleWorksheet: boolean,\n): string[] {\n const sheetTags = workbookXml.match(/<(?:\\w+:)?sheet\\b[^>]*\\/?>/gi) ?? [];\n enforceWorksheetCount(sheetTags.length, requireSingleWorksheet);\n if (sheetTags.length === 0) {\n throw new Error(\"Workbook contains no sheets\");\n }\n\n const relationshipsById = new Map(\n workbookRelationships.map((relationship) => [relationship.id, relationship]),\n );\n return sheetTags.flatMap((sheetTag) => {\n const id = getAttribute(sheetTag, \"r:id\");\n const relationship = id ? relationshipsById.get(id) : undefined;\n return relationship?.type.endsWith(\"/worksheet\") ? [relationship.target] : [];\n });\n}\n\nfunction cleanWorkbookRelationships(context: WorkbookContext): Set<string> {\n const cleaned = removeRelationships(\n context.workbookRelationshipsXml,\n WORKBOOK_PATH,\n PERSON_RELATIONSHIP_SUFFIXES,\n );\n context.zip.file(WORKBOOK_RELATIONSHIPS_PATH, cleaned.xml);\n return cleaned.targets;\n}\n\nasync function cleanWorksheets(\n context: WorkbookContext,\n worksheetPaths: readonly string[],\n detachedRoots: Set<string>,\n options: NormalizedSanitizeOptions,\n): Promise<Map<string, string>> {\n const worksheetXmlByPath = new Map<string, string>();\n for (const worksheetPath of worksheetPaths) {\n // Reads intentionally stay sequential because they share a mutable byte budget.\n // oxlint-disable-next-line no-await-in-loop\n const worksheetXml = await requireXml(\n context.zip,\n worksheetPath,\n context.readBudget,\n options.limits.maxWorksheetXmlBytes,\n );\n const cleanedWorksheetXml = removeThreadedCommentExtensions(\n removeWorksheetDrawingMarkup(worksheetXml),\n );\n worksheetXmlByPath.set(worksheetPath, cleanedWorksheetXml);\n context.zip.file(worksheetPath, cleanedWorksheetXml);\n\n // Relationship reads consume the same shared byte budget as worksheet reads.\n // oxlint-disable-next-line no-await-in-loop\n await cleanWorksheetRelationships(context, worksheetPath, detachedRoots, options);\n }\n return worksheetXmlByPath;\n}\n\nasync function cleanWorksheetRelationships(\n context: WorkbookContext,\n worksheetPath: string,\n detachedRoots: Set<string>,\n options: NormalizedSanitizeOptions,\n): Promise<void> {\n const relationshipsPath = relationshipFileForPart(worksheetPath);\n const relationshipsFile = context.zip.file(relationshipsPath);\n if (!relationshipsFile) {\n return;\n }\n\n const cleaned = removeRelationships(\n await readXmlPart(\n relationshipsFile,\n relationshipsPath,\n context.readBudget,\n options.limits.maxRelationshipsXmlBytes,\n ),\n worksheetPath,\n DRAWING_RELATIONSHIP_SUFFIXES,\n );\n context.zip.file(relationshipsPath, cleaned.xml);\n for (const target of cleaned.targets) {\n detachedRoots.add(target);\n }\n}\n\nfunction enforceWorksheetCount(count: number, required: boolean): void {\n if (required && count !== 1) {\n throw createError(\"ERR_WORKSHEET_COUNT\", {\n details: { expected: 1, actual: count },\n });\n }\n}\n","import type { ExcelSanitizationLimits } from \"./types.js\";\n\nexport const DEFAULT_LIMITS: Readonly<ExcelSanitizationLimits> = Object.freeze({\n maxEntryCount: 10_000,\n maxUncompressedBytes: 512 * 1024 * 1024,\n maxXmlBytes: 512 * 1024 * 1024,\n maxWorksheetXmlBytes: 256 * 1024 * 1024,\n maxStylesXmlBytes: 64 * 1024 * 1024,\n maxMetadataXmlBytes: 16 * 1024 * 1024,\n maxRelationshipsXmlBytes: 8 * 1024 * 1024,\n});\n\nexport const SANITIZE_OPTION_NAMES: ReadonlySet<string> = new Set([\n \"requireSingleWorksheet\",\n \"limits\",\n]);\n\nexport const FILE_OPTION_NAMES: ReadonlySet<string> = new Set([\n \"requireSingleWorksheet\",\n \"limits\",\n \"overwrite\",\n]);\n\nexport const LIMIT_NAMES: ReadonlySet<string> = new Set([\n \"maxEntryCount\",\n \"maxUncompressedBytes\",\n \"maxXmlBytes\",\n \"maxWorksheetXmlBytes\",\n \"maxStylesXmlBytes\",\n \"maxMetadataXmlBytes\",\n \"maxRelationshipsXmlBytes\",\n]);\n","import {\n DEFAULT_LIMITS,\n FILE_OPTION_NAMES,\n LIMIT_NAMES,\n SANITIZE_OPTION_NAMES,\n} from \"./constants.js\";\nimport { createError } from \"./errors.js\";\nimport type {\n ExcelSanitizationLimits,\n NormalizedFileOptions,\n NormalizedSanitizeOptions,\n} from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateKnownKeys(\n value: Readonly<Record<string, unknown>>,\n knownKeys: ReadonlySet<string>,\n label: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!knownKeys.has(key)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `Unknown ${label}: ${key}`,\n details: { key },\n });\n }\n }\n}\n\nfunction isLimitName(name: string): name is keyof ExcelSanitizationLimits {\n return LIMIT_NAMES.has(name);\n}\n\nexport function normalizeLimits(overrides: unknown): Readonly<ExcelSanitizationLimits> {\n if (overrides === undefined) {\n return DEFAULT_LIMITS;\n }\n if (!isRecord(overrides)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.limits must be an object\",\n });\n }\n\n validateKnownKeys(overrides, LIMIT_NAMES, \"limit\");\n const limits: ExcelSanitizationLimits = { ...DEFAULT_LIMITS };\n for (const [name, value] of Object.entries(overrides)) {\n if (!isLimitName(name)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `Unknown limit: ${name}`,\n details: { key: name },\n });\n }\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `options.limits.${name} must be a positive safe integer`,\n details: { limit: name, value },\n });\n }\n limits[name] = value;\n }\n return Object.freeze(limits);\n}\n\nexport function normalizeOptions(options: unknown, fileOptions: true): NormalizedFileOptions;\nexport function normalizeOptions(options?: unknown, fileOptions?: false): NormalizedSanitizeOptions;\nexport function normalizeOptions(\n options?: unknown,\n fileOptions = false,\n): NormalizedSanitizeOptions | NormalizedFileOptions {\n if (options !== undefined && !isRecord(options)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options must be an object\",\n });\n }\n\n const rawOptions = options ?? {};\n validateKnownKeys(rawOptions, fileOptions ? FILE_OPTION_NAMES : SANITIZE_OPTION_NAMES, \"option\");\n if (\n rawOptions.requireSingleWorksheet !== undefined &&\n typeof rawOptions.requireSingleWorksheet !== \"boolean\"\n ) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.requireSingleWorksheet must be a boolean\",\n });\n }\n\n let normalizedOverwrite = false;\n if (fileOptions) {\n const overwrite = rawOptions.overwrite;\n if (overwrite !== undefined && typeof overwrite !== \"boolean\") {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.overwrite must be a boolean\",\n });\n }\n normalizedOverwrite = overwrite ?? false;\n }\n\n const normalized: NormalizedSanitizeOptions = {\n requireSingleWorksheet: rawOptions.requireSingleWorksheet ?? false,\n limits: normalizeLimits(rawOptions.limits),\n };\n if (!fileOptions) {\n return normalized;\n }\n return { ...normalized, overwrite: normalizedOverwrite };\n}\n","import { hasCompoundFileSignature, sanitizeBiffWorkbook } from \"../biff/workbook.js\";\nimport { ExcelSanitizationError, createError } from \"../errors.js\";\nimport { sanitizeOoxmlWorkbook } from \"../ooxml/workbook.js\";\nimport { normalizeOptions } from \"../options.js\";\nimport type { SanitizeExcelOptions } from \"../types.js\";\n\nexport async function sanitizeExcel(\n buffer: Buffer,\n options?: SanitizeExcelOptions,\n): Promise<Buffer> {\n if (!Buffer.isBuffer(buffer)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"buffer must be a Node.js Buffer\",\n });\n }\n\n const normalized = normalizeOptions(options);\n const isBiff = hasCompoundFileSignature(buffer);\n try {\n return isBiff\n ? await sanitizeBiffWorkbook(buffer, normalized)\n : await sanitizeOoxmlWorkbook(buffer, normalized);\n } catch (error) {\n if (error instanceof ExcelSanitizationError) {\n throw error;\n }\n throw createError(isBiff ? \"ERR_INVALID_XLS\" : \"ERR_INVALID_XLSX\", { cause: error });\n }\n}\n","export type ExcelFileFormat = \"xls\" | \"xlsx\" | \"xlsm\";\n\nexport function excelFileFormat(name: unknown): ExcelFileFormat | undefined {\n if (typeof name !== \"string\") {\n return undefined;\n }\n const extension = /\\.(xls|xlsx|xlsm)$/i.exec(name)?.[1]?.toLowerCase();\n return extension === \"xls\" || extension === \"xlsx\" || extension === \"xlsm\"\n ? extension\n : undefined;\n}\n\nexport function isExcelFilename(name: unknown): name is string {\n return excelFileFormat(name) !== undefined;\n}\n\nexport function isXlsxFilename(name: unknown): name is string {\n return excelFileFormat(name) === \"xlsx\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { hasCompoundFileSignature } from \"../biff/workbook.js\";\nimport { createError } from \"../errors.js\";\nimport { excelFileFormat, isExcelFilename, isXlsxFilename } from \"../formats.js\";\nimport type { ExcelFileFormat } from \"../formats.js\";\nimport { normalizeOptions } from \"../options.js\";\nimport type { SanitizeExcelFileOptions } from \"../types.js\";\nimport { sanitizeExcel } from \"./sanitize-excel.js\";\n\nexport { isExcelFilename, isXlsxFilename };\n\nexport async function sanitizeExcelFile(\n inputPath: string,\n outputPath: string,\n options?: SanitizeExcelFileOptions,\n): Promise<void> {\n const format = validateFilePaths(inputPath, outputPath);\n const normalized = normalizeOptions(options, true);\n const absoluteInputPath = resolve(inputPath);\n const absoluteOutputPath = resolve(outputPath);\n if (absoluteInputPath === absoluteOutputPath) {\n throw createError(\"ERR_SAME_PATH\", {\n details: { inputPath: absoluteInputPath, outputPath: absoluteOutputPath },\n });\n }\n\n const input = await readInputFile(absoluteInputPath);\n validateInputFormat(input, format);\n const sanitized = await sanitizeExcel(input, {\n requireSingleWorksheet: normalized.requireSingleWorksheet,\n limits: normalized.limits,\n });\n\n if (normalized.overwrite) {\n await replaceFileAtomically(absoluteOutputPath, sanitized);\n } else {\n await writeNewFile(absoluteOutputPath, sanitized);\n }\n}\n\nfunction validateFilePaths(inputPath: string, outputPath: string): ExcelFileFormat {\n if (\n typeof inputPath !== \"string\" ||\n inputPath.length === 0 ||\n typeof outputPath !== \"string\" ||\n outputPath.length === 0\n ) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"inputPath and outputPath must be non-empty strings\",\n });\n }\n const inputFormat = excelFileFormat(inputPath);\n const outputFormat = excelFileFormat(outputPath);\n if (!inputFormat || !outputFormat || inputFormat !== outputFormat) {\n throw createError(\"ERR_UNSUPPORTED_EXTENSION\", {\n details: { inputPath, outputPath, inputFormat, outputFormat },\n });\n }\n return inputFormat;\n}\n\nfunction validateInputFormat(input: Buffer, format: ExcelFileFormat): void {\n const isXls = hasCompoundFileSignature(input);\n if ((format === \"xls\") !== isXls) {\n throw createError(format === \"xls\" ? \"ERR_INVALID_XLS\" : \"ERR_INVALID_XLSX\", {\n details: { format },\n });\n }\n}\n\nasync function readInputFile(inputPath: string): Promise<Buffer> {\n try {\n return await readFile(inputPath);\n } catch (error) {\n throw createError(\"ERR_FILE_READ\", {\n cause: error,\n details: { inputPath },\n });\n }\n}\n\nasync function writeNewFile(outputPath: string, contents: Buffer): Promise<void> {\n try {\n await writeFile(outputPath, contents, { flag: \"wx\" });\n } catch (error) {\n if (hasErrorCode(error, \"EEXIST\")) {\n throw createError(\"ERR_OUTPUT_EXISTS\", {\n cause: error,\n details: { outputPath },\n });\n }\n await removeIfPresent(outputPath);\n throw createError(\"ERR_FILE_WRITE\", {\n cause: error,\n details: { outputPath },\n });\n }\n}\n\nasync function replaceFileAtomically(outputPath: string, contents: Buffer): Promise<void> {\n const temporaryPath = `${outputPath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, contents, { flag: \"wx\" });\n await rename(temporaryPath, outputPath);\n } catch (error) {\n await removeIfPresent(temporaryPath);\n throw createError(\"ERR_FILE_WRITE\", {\n cause: error,\n details: { outputPath },\n });\n }\n}\n\nfunction hasErrorCode(error: unknown, expectedCode: string): boolean {\n return (\n typeof error === \"object\" && error !== null && \"code\" in error && error.code === expectedCode\n );\n}\n\nasync function removeIfPresent(path: string): Promise<void> {\n await unlink(path).catch(() => undefined);\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["exports"],"sources":["../__vite-browser-external","../node_modules/.pnpm/cfb@1.2.2/node_modules/cfb/cfb.js","../src/errors.ts","../src/biff/workbook.ts","../src/zip/central-directory.ts","../src/ooxml/constants.ts","../src/ooxml/cleanup.ts","../src/ooxml/parts.ts","../src/ooxml/xml.ts","../src/ooxml/relationships.ts","../src/ooxml/styles.ts","../src/ooxml/workbook.ts","../src/constants.ts","../src/options.ts","../src/api/sanitize-excel.ts","../src/formats.ts","../src/api/sanitize-excel-file.ts"],"sourcesContent":["module.exports = {}","/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n/*exported CFB */\n/*global module, require:false, process:false, Buffer:false, Uint8Array:false, Uint16Array:false */\n\nvar Base64_map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nfunction Base64_encode(input) {\n\tvar o = \"\";\n\tvar c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n\tfor (var i = 0; i < input.length; ) {\n\t\tc1 = input.charCodeAt(i++);\n\t\te1 = (c1 >> 2);\n\t\tc2 = input.charCodeAt(i++);\n\t\te2 = ((c1 & 3) << 4) | (c2 >> 4);\n\t\tc3 = input.charCodeAt(i++);\n\t\te3 = ((c2 & 15) << 2) | (c3 >> 6);\n\t\te4 = (c3 & 63);\n\t\tif (isNaN(c2)) e3 = e4 = 64;\n\t\telse if (isNaN(c3)) e4 = 64;\n\t\to += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);\n\t}\n\treturn o;\n}\nfunction Base64_decode(input) {\n\tvar o = \"\";\n\tvar c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n\tinput = input.replace(/[^\\w\\+\\/\\=]/g, \"\");\n\tfor (var i = 0; i < input.length;) {\n\t\te1 = Base64_map.indexOf(input.charAt(i++));\n\t\te2 = Base64_map.indexOf(input.charAt(i++));\n\t\tc1 = (e1 << 2) | (e2 >> 4);\n\t\to += String.fromCharCode(c1);\n\t\te3 = Base64_map.indexOf(input.charAt(i++));\n\t\tc2 = ((e2 & 15) << 4) | (e3 >> 2);\n\t\tif (e3 !== 64) o += String.fromCharCode(c2);\n\t\te4 = Base64_map.indexOf(input.charAt(i++));\n\t\tc3 = ((e3 & 3) << 6) | e4;\n\t\tif (e4 !== 64) o += String.fromCharCode(c3);\n\t}\n\treturn o;\n}\nvar has_buf = (function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();\n\nvar Buffer_from = (function() {\n\tif(typeof Buffer !== 'undefined') {\n\t\tvar nbfs = !Buffer.from;\n\t\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\t\treturn nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t}\n\treturn function() {};\n})();\n\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\tif(has_buf) {\n\t\tif(Buffer.alloc) return Buffer.alloc(len);\n\t\tvar b = new Buffer(len); b.fill(0); return b;\n\t}\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nfunction new_unsafe_buf(len) {\n\t/* jshint -W056 */\n\tif(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nvar s2a = function s2a(s) {\n\tif(has_buf) return Buffer_from(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n};\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/g;\nvar __toBuffer = function(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };\nvar ___toBuffer = __toBuffer;\nvar __utf16le = function(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(\"\").replace(chr0,''); };\nvar ___utf16le = __utf16le;\nvar __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push((\"0\" + b[i].toString(16)).slice(-2)); return ss.join(\"\"); };\nvar ___hexlify = __hexlify;\nvar __bconcat = function(bufs) {\n\tif(Array.isArray(bufs[0])) return [].concat.apply([], bufs);\n\tvar maxlen = 0, i = 0;\n\tfor(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;\n\tvar o = new Uint8Array(maxlen);\n\tfor(i = 0, maxlen = 0; i < bufs.length; maxlen += bufs[i].length, ++i) o.set(bufs[i], maxlen);\n\treturn o;\n};\nvar bconcat = __bconcat;\n\n\nif(has_buf) {\n\t__utf16le = function(b,s,e) {\n\t\tif(!Buffer.isBuffer(b)) return ___utf16le(b,s,e);\n\t\treturn b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/;\n\t};\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat((bufs[0])) : ___toBuffer(bufs);};\n\ts2a = function(s) { return Buffer_from(s, \"binary\"); };\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : __bconcat(bufs); };\n}\n\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\n\nfunction ReadShift(size, t) {\n\tvar oI, oS, type = 0;\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); break;\n\t\tcase 2: oI = (t !== 'i' ? __readUInt16LE : __readInt16LE)(this, this.l); break;\n\t\tcase 4: oI = __readInt32LE(this, this.l); break;\n\t\tcase 16: type = 2; oS = __hexlify(this, this.l, size);\n\t}\n\tthis.l += size; if(type === 0) return oI; return oS;\n}\n\nvar __writeUInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };\nvar __writeInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };\n\nfunction WriteShift(t, val, f) {\n\tvar size = 0, i = 0;\n\tswitch(f) {\n\t\tcase \"hex\": for(; i < t; ++i) {\nthis[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0;\n\t\t} return this;\n\t\tcase \"utf16le\":\nvar end = this.l + t;\n\t\t\tfor(i = 0; i < Math.min(val.length, t); ++i) {\n\t\t\t\tvar cc = val.charCodeAt(i);\n\t\t\t\tthis[this.l++] = cc & 0xff;\n\t\t\t\tthis[this.l++] = cc >> 8;\n\t\t\t}\n\t\t\twhile(this.l < end) this[this.l++] = 0;\n\t\t\treturn this;\n\t}\nswitch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&0xFF; break;\n\t\tcase 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;\n\t\tcase 4: size = 4; __writeUInt32LE(this, val, this.l); break;\n\t\tcase -4: size = 4; __writeInt32LE(this, val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction new_buf(sz) {\n\tvar o = (new_raw_buf(sz));\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32 = (function() {\nvar CRC32 = {};\nCRC32.version = '1.2.1';\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T0 = signed_crc_table();\nfunction slice_by_16_tables(T) {\n\tvar c = 0, v = 0, n = 0, table = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;\n\n\tfor(n = 0; n != 256; ++n) table[n] = T[n];\n\tfor(n = 0; n != 256; ++n) {\n\t\tv = T[n];\n\t\tfor(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];\n\t}\n\tvar out = [];\n\tfor(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);\n\treturn out;\n}\nvar TT = slice_by_16_tables(T0);\nvar T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];\nvar T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];\nvar Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_buf(B, seed) {\n\tvar C = seed ^ -1, L = B.length - 15, i = 0;\n\tfor(; i < L;) C =\n\t\tTf[B[i++] ^ (C & 255)] ^\n\t\tTe[B[i++] ^ ((C >> 8) & 255)] ^\n\t\tTd[B[i++] ^ ((C >> 16) & 255)] ^\n\t\tTc[B[i++] ^ (C >>> 24)] ^\n\t\tTb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^\n\t\tT7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^\n\t\tT3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];\n\tL += 15;\n\twhile(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = str.length, c = 0, d = 0; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T0[(C^c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn ~C;\n}\nCRC32.table = T0;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\nreturn CRC32;\n})();\n/* [MS-CFB] v20171201 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '1.2.2';\n/* [MS-CFB] 2.6.4 */\nfunction namecmp(l, r) {\n\tvar L = l.split(\"/\"), R = r.split(\"/\");\n\tfor(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {\n\t\tif((c = L[i].length - R[i].length)) return c;\n\t\tif(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;\n\t}\n\treturn L.length - R.length;\n}\nfunction dirname(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return (p.slice(0,-1).indexOf(\"/\") === -1) ? p : dirname(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(0, c+1);\n}\n\nfunction filename(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return filename(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(c+1);\n}\n/* -------------------------------------------------------------------------- */\n/* DOS Date format:\n high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low\n add 1980 to stored year\n stored second should be doubled\n*/\n\n/* write JS date to buf as a DOS date */\nfunction write_dos_date(buf, date) {\n\tif(typeof date === \"string\") date = new Date(date);\n\tvar hms = date.getHours();\n\thms = hms << 6 | date.getMinutes();\n\thms = hms << 5 | (date.getSeconds()>>>1);\n\tbuf.write_shift(2, hms);\n\tvar ymd = (date.getFullYear() - 1980);\n\tymd = ymd << 4 | (date.getMonth()+1);\n\tymd = ymd << 5 | date.getDate();\n\tbuf.write_shift(2, ymd);\n}\n\n/* read four bytes from buf and interpret as a DOS date */\nfunction parse_dos_date(buf) {\n\tvar hms = buf.read_shift(2) & 0xFFFF;\n\tvar ymd = buf.read_shift(2) & 0xFFFF;\n\tvar val = new Date();\n\tvar d = ymd & 0x1F; ymd >>>= 5;\n\tvar m = ymd & 0x0F; ymd >>>= 4;\n\tval.setMilliseconds(0);\n\tval.setFullYear(ymd + 1980);\n\tval.setMonth(m-1);\n\tval.setDate(d);\n\tvar S = hms & 0x1F; hms >>>= 5;\n\tvar M = hms & 0x3F; hms >>>= 6;\n\tval.setHours(hms);\n\tval.setMinutes(M);\n\tval.setSeconds(S<<1);\n\treturn val;\n}\nfunction parse_extra_field(blob) {\n\tprep_blob(blob, 0);\n\tvar o = {};\n\tvar flags = 0;\n\twhile(blob.l <= blob.length - 4) {\n\t\tvar type = blob.read_shift(2);\n\t\tvar sz = blob.read_shift(2), tgt = blob.l + sz;\n\t\tvar p = {};\n\t\tswitch(type) {\n\t\t\t/* UNIX-style Timestamps */\n\t\t\tcase 0x5455: {\n\t\t\t\tflags = blob.read_shift(1);\n\t\t\t\tif(flags & 1) p.mtime = blob.read_shift(4);\n\t\t\t\t/* for some reason, CD flag corresponds to LFH */\n\t\t\t\tif(sz > 5) {\n\t\t\t\t\tif(flags & 2) p.atime = blob.read_shift(4);\n\t\t\t\t\tif(flags & 4) p.ctime = blob.read_shift(4);\n\t\t\t\t}\n\t\t\t\tif(p.mtime) p.mt = new Date(p.mtime*1000);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tblob.l = tgt;\n\t\to[type] = p;\n\t}\n\treturn o;\n}\nvar fs;\nfunction get_fs() { return fs || (fs = require('fs')); }\nfunction parse(file, options) {\nif(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);\nif((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);\nif(file.length < 512) throw new Error(\"CFB file size \" + file.length + \" < 512\");\nvar mver = 3;\nvar ssz = 512;\nvar nmfs = 0; // number of mini FAT sectors\nvar difat_sec_cnt = 0;\nvar dir_start = 0;\nvar minifat_start = 0;\nvar difat_start = 0;\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tcase 0: if(mv[1] == 0) return parse_zip(file, options);\n\t/* falls through */\n\tdefault: throw new Error(\"Major Version: Expected 3 or 4 saw \" + mver);\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar dir_cnt = blob.read_shift(4, 'i');\nif(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);\n\n// Number of FAT Sectors\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\ndifat_sec_cnt = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [];\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);\n\nbuild_full_paths(FileIndex, FullPaths, Paths);\nPaths.shift();\n\nvar o = {\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths\n};\n\n// $FlowIgnore\nif(options && options.raw) o.raw = {header: header, sectors: sectors};\nreturn o;\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\tif(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\t//blob.chk(HEADER_CLSID, 'CLSID: ');\n\tblob.l += 16;\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\t//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff\n\tblob.l += 2;\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;\n\t\tcase 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;\n\t\tdefault: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = [];\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = [], q = [];\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }\n\t\tif(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }\n\t}\n\tfor(i=1; i < pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = i;\n\t\tif(j != dad[j]) do {\n\t\t\tj = dad[j];\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t} while (j !== 0 && -1 !== dad[j] && j != dad[j]);\n\t\tdad[i] = -1;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t}\n}\n\nfunction get_mfat_entry(entry, payload, mini) {\n\tvar start = entry.start, size = entry.size;\n\t//return (payload.slice(start*MSSZ, start*MSSZ + size));\n\tvar o = [];\n\tvar idx = start;\n\twhile(mini && size > 0 && idx >= 0) {\n\t\to.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));\n\t\tsize -= MSSZ;\n\t\tidx = __readInt32LE(mini, idx * 4);\n\t}\n\tif(o.length === 0) return (new_buf(0));\n\treturn (bconcat(o).slice(0, entry.size));\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bits */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q = ENDOFCHAIN;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw new Error(\"DIFAT chain shorter than expected\");\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tif(!sector) return;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tif(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar buf = [], buf_chain = [];\n\tif(!chkd) chkd = [];\n\tvar modulus = ssz - 1, j = 0, jj = 0;\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\tif(!sectors[addr]) break;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = ([]);\n\tvar chkd = [], buf = [], buf_chain = [];\n\tvar modulus = ssz - 1, i=0, j=0, k=0, jj=0;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = ([]);\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k]) continue;\n\t\tbuf_chain = [];\n\t\tvar seen = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tseen[j] = true;\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\t\tif(!sectors[addr]) break;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t\tif(seen[j]) break;\n\t\t}\n\t\tsector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name;\n\tfor(; i < sector.length; i+= 128) {\n\t\tvar blob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\tvar o = ({\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i'),\n\t\t\tstart: 0,\n\t\t\tsize: 0\n\t\t});\n\t\tvar ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) o.ct = read_date(blob, blob.l-8);\n\t\tvar mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) o.mt = read_date(blob, blob.l-8);\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = \"\"; }\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = (sector_list[o.start].data.slice(0,o.size));\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(o.size < 0) o.size = 0;\n\t\t\telse if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {\n\t\t\t\to.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);\n\t\t\t}\n\t\t}\n\t\tif(o.content) prep_blob(o.content, 0);\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nfunction read_file(filename, options) {\n\tget_fs();\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction read(blob, options) {\n\tvar type = options && options.type;\n\tif(!type) {\n\t\tif(has_buf && Buffer.isBuffer(blob)) type = \"buffer\";\n\t}\n\tswitch(type || \"base64\") {\n\t\tcase \"file\": return read_file(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64_decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob, options);\n}\n\nfunction init_cfb(cfb, opts) {\n\tvar o = opts || {}, root = o.root || \"Root Entry\";\n\tif(!cfb.FullPaths) cfb.FullPaths = [];\n\tif(!cfb.FileIndex) cfb.FileIndex = [];\n\tif(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error(\"inconsistent CFB structure\");\n\tif(cfb.FullPaths.length === 0) {\n\t\tcfb.FullPaths[0] = root + \"/\";\n\t\tcfb.FileIndex[0] = ({ name: root, type: 5 });\n\t}\n\tif(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;\n\tseed_cfb(cfb);\n}\nfunction seed_cfb(cfb) {\n\tvar nm = \"\\u0001Sh33tJ5\";\n\tif(CFB.find(cfb, \"/\" + nm)) return;\n\tvar p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;\n\tcfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));\n\tcfb.FullPaths.push(cfb.FullPaths[0] + nm);\n\trebuild_cfb(cfb);\n}\nfunction rebuild_cfb(cfb, f) {\n\tinit_cfb(cfb);\n\tvar gc = false, s = false;\n\tfor(var i = cfb.FullPaths.length - 1; i >= 0; --i) {\n\t\tvar _file = cfb.FileIndex[i];\n\t\tswitch(_file.type) {\n\t\t\tcase 0:\n\t\t\t\tif(s) gc = true;\n\t\t\t\telse { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }\n\t\t\t\tbreak;\n\t\t\tcase 1: case 2: case 5:\n\t\t\t\ts = true;\n\t\t\t\tif(isNaN(_file.R * _file.L * _file.C)) gc = true;\n\t\t\t\tif(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;\n\t\t\t\tbreak;\n\t\t\tdefault: gc = true; break;\n\t\t}\n\t}\n\tif(!gc && !f) return;\n\n\tvar now = new Date(1987, 1, 19), j = 0;\n\t// Track which names exist\n\tvar fullPaths = Object.create ? Object.create(null) : {};\n\tvar data = [];\n\tfor(i = 0; i < cfb.FullPaths.length; ++i) {\n\t\tfullPaths[cfb.FullPaths[i]] = true;\n\t\tif(cfb.FileIndex[i].type === 0) continue;\n\t\tdata.push([cfb.FullPaths[i], cfb.FileIndex[i]]);\n\t}\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar dad = dirname(data[i][0]);\n\t\ts = fullPaths[dad];\n\t\twhile(!s) {\n\t\t\twhile(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);\n\n\t\t\tdata.push([dad, ({\n\t\t\t\tname: filename(dad).replace(\"/\",\"\"),\n\t\t\t\ttype: 1,\n\t\t\t\tclsid: HEADER_CLSID,\n\t\t\t\tct: now, mt: now,\n\t\t\t\tcontent: null\n\t\t\t})]);\n\n\t\t\t// Add name to set\n\t\t\tfullPaths[dad] = true;\n\n\t\t\tdad = dirname(data[i][0]);\n\t\t\ts = fullPaths[dad];\n\t\t}\n\t}\n\n\tdata.sort(function(x,y) { return namecmp(x[0], y[0]); });\n\tcfb.FullPaths = []; cfb.FileIndex = [];\n\tfor(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar elt = cfb.FileIndex[i];\n\t\tvar nm = cfb.FullPaths[i];\n\n\t\telt.name = filename(nm).replace(\"/\",\"\");\n\t\telt.L = elt.R = elt.C = -(elt.color = 1);\n\t\telt.size = elt.content ? elt.content.length : 0;\n\t\telt.start = 0;\n\t\telt.clsid = (elt.clsid || HEADER_CLSID);\n\t\tif(i === 0) {\n\t\t\telt.C = data.length > 1 ? 1 : -1;\n\t\t\telt.size = 0;\n\t\t\telt.type = 5;\n\t\t} else if(nm.slice(-1) == \"/\") {\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;\n\t\t\telt.C = j >= data.length ? -1 : j;\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;\n\t\t\telt.R = j >= data.length ? -1 : j;\n\t\t\telt.type = 1;\n\t\t} else {\n\t\t\tif(dirname(cfb.FullPaths[i+1]||\"\") == dirname(nm)) elt.R = i + 1;\n\t\t\telt.type = 2;\n\t\t}\n\t}\n\n}\n\nfunction _write(cfb, options) {\n\tvar _opts = options || {};\n\t/* MAD is order-sensitive, skip rebuild and sort */\n\tif(_opts.fileType == 'mad') return write_mad(cfb, _opts);\n\trebuild_cfb(cfb);\n\tswitch(_opts.fileType) {\n\t\tcase 'zip': return write_zip(cfb, _opts);\n\t\t//case 'mad': return write_mad(cfb, _opts);\n\t}\n\tvar L = (function(cfb){\n\t\tvar mini_size = 0, fat_size = 0;\n\t\tfor(var i = 0; i < cfb.FileIndex.length; ++i) {\n\t\t\tvar file = cfb.FileIndex[i];\n\t\t\tif(!file.content) continue;\n\t\t\tvar flen = file.content.length;\n\t\t\tif(flen > 0){\n\t\t\t\tif(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;\n\t\t\t\telse fat_size += (flen + 0x01FF) >> 9;\n\t\t\t}\n\t\t}\n\t\tvar dir_cnt = (cfb.FullPaths.length +3) >> 2;\n\t\tvar mini_cnt = (mini_size + 7) >> 3;\n\t\tvar mfat_cnt = (mini_size + 0x7F) >> 7;\n\t\tvar fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;\n\t\tvar fat_cnt = (fat_base + 0x7F) >> 7;\n\t\tvar difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\twhile(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\tvar L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];\n\t\tcfb.FileIndex[0].size = mini_size << 6;\n\t\tL[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);\n\t\treturn L;\n\t})(cfb);\n\tvar o = new_buf(L[7] << 9);\n\tvar i = 0, T = 0;\n\t{\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(2, 0);\n\t\to.write_shift(2, 0x003E);\n\t\to.write_shift(2, 0x0003);\n\t\to.write_shift(2, 0xFFFE);\n\t\to.write_shift(2, 0x0009);\n\t\to.write_shift(2, 0x0006);\n\t\tfor(i = 0; i < 3; ++i) o.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, L[2]);\n\t\to.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, 1<<12);\n\t\to.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[3]);\n\t\to.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[1]);\n\t\tfor(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t}\n\tif(L[1]) {\n\t\tfor(T = 0; T < L[1]; ++T) {\n\t\t\tfor(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t\t\to.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);\n\t\t}\n\t}\n\tvar chainit = function(w) {\n\t\tfor(T += w; i<T-1; ++i) o.write_shift(-4, i+1);\n\t\tif(w) { ++i; o.write_shift(-4, ENDOFCHAIN); }\n\t};\n\tT = i = 0;\n\tfor(T+=L[1]; i<T; ++i) o.write_shift(-4, consts.DIFSECT);\n\tfor(T+=L[2]; i<T; ++i) o.write_shift(-4, consts.FATSECT);\n\tchainit(L[3]);\n\tchainit(L[4]);\n\tvar j = 0, flen = 0;\n\tvar file = cfb.FileIndex[0];\n\tfor(; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(flen < 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x01FF) >> 9);\n\t}\n\tchainit((L[6] + 7) >> 3);\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tT = i = 0;\n\tfor(j = 0; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(!flen || flen >= 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x3F) >> 6);\n\t}\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tfor(i = 0; i < L[4]<<2; ++i) {\n\t\tvar nm = cfb.FullPaths[i];\n\t\tif(!nm || nm.length === 0) {\n\t\t\tfor(j = 0; j < 17; ++j) o.write_shift(4, 0);\n\t\t\tfor(j = 0; j < 3; ++j) o.write_shift(4, -1);\n\t\t\tfor(j = 0; j < 12; ++j) o.write_shift(4, 0);\n\t\t\tcontinue;\n\t\t}\n\t\tfile = cfb.FileIndex[i];\n\t\tif(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;\n\t\tvar _nm = (i === 0 && _opts.root) || file.name;\n\t\tif(_nm.length > 32) {\n\t\t\tconsole.error(\"Name \" + _nm + \" will be truncated to \" + _nm.slice(0,32));\n\t\t\t_nm = _nm.slice(0, 32);\n\t\t}\n\t\tflen = 2*(_nm.length+1);\n\t\to.write_shift(64, _nm, \"utf16le\");\n\t\to.write_shift(2, flen);\n\t\to.write_shift(1, file.type);\n\t\to.write_shift(1, file.color);\n\t\to.write_shift(-4, file.L);\n\t\to.write_shift(-4, file.R);\n\t\to.write_shift(-4, file.C);\n\t\tif(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);\n\t\telse o.write_shift(16, file.clsid, \"hex\");\n\t\to.write_shift(4, file.state || 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, file.start);\n\t\to.write_shift(4, file.size); o.write_shift(4, 0);\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size >= 0x1000) {\n\t\t\to.l = (file.start+1) << 9;\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 511) & -512;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x1FF; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size > 0 && file.size < 0x1000) {\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 63) & -64;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x3F; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tif (has_buf) {\n\t\to.l = o.length;\n\t} else {\n\t\t// When using Buffer, already 0-filled\n\t\twhile(o.l < o.length) o.write_shift(1, 0);\n\t}\n\treturn o;\n}\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nfunction find(cfb, path) {\n\tvar UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });\n\tvar UCPaths = UCFullPaths.map(function(x) { var y = x.split(\"/\"); return y[y.length - (x.slice(-1) == \"/\" ? 2 : 1)]; });\n\tvar k = false;\n\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }\n\telse k = path.indexOf(\"/\") !== -1;\n\tvar UCPath = path.toUpperCase();\n\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\tif(w !== -1) return cfb.FileIndex[w];\n\n\tvar m = !UCPath.match(chr1);\n\tUCPath = UCPath.replace(chr0,'');\n\tif(m) UCPath = UCPath.replace(chr1,'!');\n\tfor(w = 0; w < UCFullPaths.length; ++w) {\n\t\tif((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t\tif((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t}\n\treturn null;\n}\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nfunction write_file(cfb, filename, options) {\n\tget_fs();\n\tvar o = _write(cfb, options);\nfs.writeFileSync(filename, o);\n}\n\nfunction a2s(o) {\n\tvar out = new Array(o.length);\n\tfor(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);\n\treturn out.join(\"\");\n}\n\nfunction write(cfb, options) {\n\tvar o = _write(cfb, options);\n\tswitch(options && options.type || \"buffer\") {\n\t\tcase \"file\": get_fs(); fs.writeFileSync(options.filename, (o)); return o;\n\t\tcase \"binary\": return typeof o == \"string\" ? o : a2s(o);\n\t\tcase \"base64\": return Base64_encode(typeof o == \"string\" ? o : a2s(o));\n\t\tcase \"buffer\": if(has_buf) return Buffer.isBuffer(o) ? o : Buffer_from(o);\n\t\t\t/* falls through */\n\t\tcase \"array\": return typeof o == \"string\" ? s2a(o) : o;\n\t}\n\treturn o;\n}\n/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */\nvar _zlib;\nfunction use_zlib(zlib) { try {\n\tvar InflateRaw = zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tInflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);\n\tif(InflRaw.bytesRead) _zlib = zlib;\n\telse throw new Error(\"zlib does not expose bytesRead\");\n} catch(e) {console.error(\"cannot use native zlib: \" + (e.message || e)); } }\n\nfunction _inflateRawSync(payload, usz) {\n\tif(!_zlib) return _inflate(payload, usz);\n\tvar InflateRaw = _zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tvar out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);\n\tpayload.l += InflRaw.bytesRead;\n\treturn out;\n}\n\nfunction _deflateRawSync(payload) {\n\treturn _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);\n}\nvar CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */\nvar LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];\n\n/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */\nvar DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];\n\nfunction bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }\n\nvar use_typed_arrays = typeof Uint8Array !== 'undefined';\n\nvar bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];\nfor(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);\n\nfunction bit_swap_n(n, b) {\n\tvar rev = bitswap8[n & 0xFF];\n\tif(b <= 8) return rev >>> (8-b);\n\trev = (rev << 8) | bitswap8[(n>>8)&0xFF];\n\tif(b <= 16) return rev >>> (16-b);\n\trev = (rev << 8) | bitswap8[(n>>16)&0xFF];\n\treturn rev >>> (24-b);\n}\n\n/* helpers for unaligned bit reads */\nfunction read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }\nfunction read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }\nfunction read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }\nfunction read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }\nfunction read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }\n\n/* works up to n = 3 * 8 + 1 = 25 */\nfunction read_bits_n(buf, bl, n) {\n\tvar w = (bl&7), h = (bl>>>3), f = ((1<<n)-1);\n\tvar v = buf[h] >>> w;\n\tif(n < 8 - w) return v & f;\n\tv |= buf[h+1]<<(8-w);\n\tif(n < 16 - w) return v & f;\n\tv |= buf[h+2]<<(16-w);\n\tif(n < 24 - w) return v & f;\n\tv |= buf[h+3]<<(24-w);\n\treturn v & f;\n}\n\n/* helpers for unaligned bit writes */\nfunction write_bits_3(buf, bl, v) { var w = bl & 7, h = bl >>> 3;\n\tif(w <= 5) buf[h] |= (v & 7) << w;\n\telse {\n\t\tbuf[h] |= (v << w) & 0xFF;\n\t\tbuf[h+1] = (v&7) >> (8-w);\n\t}\n\treturn bl + 3;\n}\n\nfunction write_bits_1(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv = (v&1) << w;\n\tbuf[h] |= v;\n\treturn bl + 1;\n}\nfunction write_bits_8(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v;\n\treturn bl + 8;\n}\nfunction write_bits_16(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v & 0xFF;\n\tbuf[h+2] = v >>> 8;\n\treturn bl + 16;\n}\n\n/* until ArrayBuffer#realloc is a thing, fake a realloc */\nfunction realloc(b, sz) {\n\tvar L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;\n\tif(L >= sz) return b;\n\tif(has_buf) {\n\t\tvar o = new_unsafe_buf(M);\n\t\t// $FlowIgnore\n\t\tif(b.copy) b.copy(o);\n\t\telse for(; i < b.length; ++i) o[i] = b[i];\n\t\treturn o;\n\t} else if(use_typed_arrays) {\n\t\tvar a = new Uint8Array(M);\n\t\tif(a.set) a.set(b);\n\t\telse for(; i < L; ++i) a[i] = b[i];\n\t\treturn a;\n\t}\n\tb.length = M;\n\treturn b;\n}\n\n/* zero-filled arrays for older browsers */\nfunction zero_fill_array(n) {\n\tvar o = new Array(n);\n\tfor(var i = 0; i < n; ++i) o[i] = 0;\n\treturn o;\n}\n\n/* build tree (used for literals and lengths) */\nfunction build_tree(clens, cmap, MAX) {\n\tvar maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;\n\n\tvar bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\n\tfor(i = 0; i < 32; ++i) bl_count[i] = 0;\n\n\tfor(i = L; i < MAX; ++i) clens[i] = 0;\n\tL = clens.length;\n\n\tvar ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []\n\n\t/* build code tree */\n\tfor(i = 0; i < L; ++i) {\n\t\tbl_count[(w = clens[i])]++;\n\t\tif(maxlen < w) maxlen = w;\n\t\tctree[i] = 0;\n\t}\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);\n\tfor(i = 0; i < L; ++i) {\n\t\tccode = clens[i];\n\t\tif(ccode != 0) ctree[i] = bl_count[ccode+16]++;\n\t}\n\n\t/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);\n\t\t\tfor(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)\n\t\t\t\tcmap[ccode|(j<<cleni)] = (cleni&15) | (i<<4);\n\t\t}\n\t}\n\treturn maxlen;\n}\n\n/* Fixed Huffman */\nvar fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);\nvar fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\nif(!use_typed_arrays) {\n\tfor(var i = 0; i < 512; ++i) fix_lmap[i] = 0;\n\tfor(i = 0; i < 32; ++i) fix_dmap[i] = 0;\n}\n(function() {\n\tvar dlens = [];\n\tvar i = 0;\n\tfor(;i<32; i++) dlens.push(5);\n\tbuild_tree(dlens, fix_dmap, 32);\n\n\tvar clens = [];\n\ti = 0;\n\tfor(; i<=143; i++) clens.push(8);\n\tfor(; i<=255; i++) clens.push(9);\n\tfor(; i<=279; i++) clens.push(7);\n\tfor(; i<=287; i++) clens.push(8);\n\tbuild_tree(clens, fix_lmap, 288);\n})();var _deflateRaw = (function _deflateRawIIFE() {\n\tvar DST_LN_RE = use_typed_arrays ? new Uint8Array(0x8000) : [];\n\tvar j = 0, k = 0;\n\tfor(; j < DST_LN.length - 1; ++j) {\n\t\tfor(; k < DST_LN[j+1]; ++k) DST_LN_RE[k] = j;\n\t}\n\tfor(;k < 32768; ++k) DST_LN_RE[k] = 29;\n\n\tvar LEN_LN_RE = use_typed_arrays ? new Uint8Array(0x103) : [];\n\tfor(j = 0, k = 0; j < LEN_LN.length - 1; ++j) {\n\t\tfor(; k < LEN_LN[j+1]; ++k) LEN_LN_RE[k] = j;\n\t}\n\n\tfunction write_stored(data, out) {\n\t\tvar boff = 0;\n\t\twhile(boff < data.length) {\n\t\t\tvar L = Math.min(0xFFFF, data.length - boff);\n\t\t\tvar h = boff + L == data.length;\n\t\t\tout.write_shift(1, +h);\n\t\t\tout.write_shift(2, L);\n\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t}\n\t\treturn out.l;\n\t}\n\n\t/* Fixed Huffman */\n\tfunction write_huff_fixed(data, out) {\n\t\tvar bl = 0;\n\t\tvar boff = 0;\n\t\tvar addrs = use_typed_arrays ? new Uint16Array(0x8000) : [];\n\t\twhile(boff < data.length) {\n\t\t\tvar L = /* data.length - boff; */ Math.min(0xFFFF, data.length - boff);\n\n\t\t\t/* write a stored block for short data */\n\t\t\tif(L < 10) {\n\t\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length)); // jshint ignore:line\n\t\t\t\tif(bl & 7) bl += 8 - (bl & 7);\n\t\t\t\tout.l = (bl / 8) | 0;\n\t\t\t\tout.write_shift(2, L);\n\t\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t\t\tbl = out.l * 8;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length) + 2); // jshint ignore:line\n\t\t\tvar hash = 0;\n\t\t\twhile(L-- > 0) {\n\t\t\t\tvar d = data[boff];\n\t\t\t\thash = ((hash << 5) ^ d) & 0x7FFF;\n\n\t\t\t\tvar match = -1, mlen = 0;\n\n\t\t\t\tif((match = addrs[hash])) {\n\t\t\t\t\tmatch |= boff & ~0x7FFF;\n\t\t\t\t\tif(match > boff) match -= 0x8000;\n\t\t\t\t\tif(match < boff) while(data[match + mlen] == data[boff + mlen] && mlen < 250) ++mlen;\n\t\t\t\t}\n\n\t\t\t\tif(mlen > 2) {\n\t\t\t\t\t/* Copy Token */\n\t\t\t\t\td = LEN_LN_RE[mlen];\n\t\t\t\t\tif(d <= 22) bl = write_bits_8(out, bl, bitswap8[d+1]>>1) - 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\twrite_bits_8(out, bl, 3);\n\t\t\t\t\t\tbl += 5;\n\t\t\t\t\t\twrite_bits_8(out, bl, bitswap8[d-23]>>5);\n\t\t\t\t\t\tbl += 3;\n\t\t\t\t\t}\n\t\t\t\t\tvar len_eb = (d < 8) ? 0 : ((d - 4)>>2);\n\t\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, mlen - LEN_LN[d]);\n\t\t\t\t\t\tbl += len_eb;\n\t\t\t\t\t}\n\n\t\t\t\t\td = DST_LN_RE[boff - match];\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]>>3);\n\t\t\t\t\tbl -= 3;\n\n\t\t\t\t\tvar dst_eb = d < 4 ? 0 : (d-2)>>1;\n\t\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, boff - match - DST_LN[d]);\n\t\t\t\t\t\tbl += dst_eb;\n\t\t\t\t\t}\n\t\t\t\t\tfor(var q = 0; q < mlen; ++q) {\n\t\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t\thash = ((hash << 5) ^ data[boff]) & 0x7FFF;\n\t\t\t\t\t\t++boff;\n\t\t\t\t\t}\n\t\t\t\t\tL-= mlen - 1;\n\t\t\t\t} else {\n\t\t\t\t\t/* Literal Token */\n\t\t\t\t\tif(d <= 143) d = d + 48;\n\t\t\t\t\telse bl = write_bits_1(out, bl, 1);\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]);\n\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t++boff;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbl = write_bits_8(out, bl, 0) - 1;\n\t\t}\n\t\tout.l = ((bl + 7)/8)|0;\n\t\treturn out.l;\n\t}\n\treturn function _deflateRaw(data, out) {\n\t\tif(data.length < 8) return write_stored(data, out);\n\t\treturn write_huff_fixed(data, out);\n\t};\n})();\n\nfunction _deflate(data) {\n\tvar buf = new_buf(50+Math.floor(data.length*1.1));\n\tvar off = _deflateRaw(data, buf);\n\treturn buf.slice(0, off);\n}\n/* modified inflate function also moves original read head */\n\nvar dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);\nvar dyn_len_1 = 1, dyn_len_2 = 1;\n\n/* 5.5.3 Expanding Huffman Codes */\nfunction dyn(data, boff) {\n\t/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */\n\tvar _HLIT = read_bits_5(data, boff) + 257; boff += 5;\n\tvar _HDIST = read_bits_5(data, boff) + 1; boff += 5;\n\tvar _HCLEN = read_bits_4(data, boff) + 4; boff += 4;\n\tvar w = 0;\n\n\t/* grab and store code lengths */\n\tvar clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);\n\tvar ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n\tvar maxlen = 1;\n\tvar bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar L = clens.length; /* 19 */\n\tfor(var i = 0; i < _HCLEN; ++i) {\n\t\tclens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);\n\t\tif(maxlen < w) maxlen = w;\n\t\tbl_count[w]++;\n\t\tboff += 3;\n\t}\n\n\t/* build code tree */\n\tvar ccode = 0;\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1;\n\tfor(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;\n\t/* cmap[7 bits from stream] = (off&7) + (lit<<3) */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bitswap8[ctree[i]]>>(8-cleni);\n\t\t\tfor(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<<cleni)] = (cleni&7) | (i<<3);\n\t\t}\n\t}\n\n\t/* read literal and dist codes at once */\n\tvar hcodes = [];\n\tmaxlen = 1;\n\tfor(; hcodes.length < _HLIT + _HDIST;) {\n\t\tccode = dyn_cmap[read_bits_7(data, boff)];\n\t\tboff += ccode & 7;\n\t\tswitch((ccode >>>= 3)) {\n\t\t\tcase 16:\n\t\t\t\tw = 3 + read_bits_2(data, boff); boff += 2;\n\t\t\t\tccode = hcodes[hcodes.length - 1];\n\t\t\t\twhile(w-- > 0) hcodes.push(ccode);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\tw = 3 + read_bits_3(data, boff); boff += 3;\n\t\t\t\twhile(w-- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\tw = 11 + read_bits_7(data, boff); boff += 7;\n\t\t\t\twhile(w -- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thcodes.push(ccode);\n\t\t\t\tif(maxlen < ccode) maxlen = ccode;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* build literal / length trees */\n\tvar h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);\n\tfor(i = _HLIT; i < 286; ++i) h1[i] = 0;\n\tfor(i = _HDIST; i < 30; ++i) h2[i] = 0;\n\tdyn_len_1 = build_tree(h1, dyn_lmap, 286);\n\tdyn_len_2 = build_tree(h2, dyn_dmap, 30);\n\treturn boff;\n}\n\n/* return [ data, bytesRead ] */\nfunction inflate(data, usz) {\n\t/* shortcircuit for empty buffer [0x03, 0x00] */\n\tif(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }\n\n\t/* bit offset */\n\tvar boff = 0;\n\n\t/* header includes final bit and type bits */\n\tvar header = 0;\n\n\tvar outbuf = new_unsafe_buf(usz ? usz : (1<<18));\n\tvar woff = 0;\n\tvar OL = outbuf.length>>>0;\n\tvar max_len_1 = 0, max_len_2 = 0;\n\n\twhile((header&1) == 0) {\n\t\theader = read_bits_3(data, boff); boff += 3;\n\t\tif((header >>> 1) == 0) {\n\t\t\t/* Stored block */\n\t\t\tif(boff & 7) boff += 8 - (boff&7);\n\t\t\t/* 2 bytes sz, 2 bytes bit inverse */\n\t\t\tvar sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;\n\t\t\tboff += 32;\n\t\t\t/* push sz bytes */\n\t\t\tif(sz > 0) {\n\t\t\t\tif(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }\n\t\t\t\twhile(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t} else if((header >> 1) == 1) {\n\t\t\t/* Fixed Huffman */\n\t\t\tmax_len_1 = 9; max_len_2 = 5;\n\t\t} else {\n\t\t\t/* Dynamic Huffman */\n\t\t\tboff = dyn(data, boff);\n\t\t\tmax_len_1 = dyn_len_1; max_len_2 = dyn_len_2;\n\t\t}\n\t\tfor(;;) { // while(true) is apparently out of vogue in modern JS circles\n\t\t\tif(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }\n\t\t\t/* ingest code and move read head */\n\t\t\tvar bits = read_bits_n(data, boff, max_len_1);\n\t\t\tvar code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];\n\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */\n\t\t\tif(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;\n\t\t\telse if(code == 256) break;\n\t\t\telse {\n\t\t\t\tcode -= 257;\n\t\t\t\tvar len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;\n\t\t\t\tvar tgt = woff + LEN_LN[code];\n\t\t\t\t/* length extra bits */\n\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\ttgt += read_bits_n(data, boff, len_eb);\n\t\t\t\t\tboff += len_eb;\n\t\t\t\t}\n\n\t\t\t\t/* dist code */\n\t\t\t\tbits = read_bits_n(data, boff, max_len_2);\n\t\t\t\tcode = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];\n\t\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t\tvar dst_eb = (code < 4 ? 0 : (code-2)>>1);\n\t\t\t\tvar dst = DST_LN[code];\n\t\t\t\t/* dist extra bits */\n\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\tdst += read_bits_n(data, boff, dst_eb);\n\t\t\t\t\tboff += dst_eb;\n\t\t\t\t}\n\n\t\t\t\t/* in the common case, manual byte copy is faster than TA set / Buffer copy */\n\t\t\t\tif(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt + 100); OL = outbuf.length; }\n\t\t\t\twhile(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }\n\t\t\t}\n\t\t}\n\t}\n\tif(usz) return [outbuf, (boff+7)>>>3];\n\treturn [outbuf.slice(0, woff), (boff+7)>>>3];\n}\n\nfunction _inflate(payload, usz) {\n\tvar data = payload.slice(payload.l||0);\n\tvar out = inflate(data, usz);\n\tpayload.l += out[1];\n\treturn out[0];\n}\n\nfunction warn_or_throw(wrn, msg) {\n\tif(wrn) { if(typeof console !== 'undefined') console.error(msg); }\n\telse throw new Error(msg);\n}\n\nfunction parse_zip(file, options) {\n\tvar blob = file;\n\tprep_blob(blob, 0);\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o, { root: options.root });\n\n\t/* find end of central directory, start just after signature */\n\tvar i = blob.length - 4;\n\twhile((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;\n\tblob.l = i + 4;\n\n\t/* parse end of central directory */\n\tblob.l += 4;\n\tvar fcnt = blob.read_shift(2);\n\tblob.l += 6;\n\tvar start_cd = blob.read_shift(4);\n\n\t/* parse central directory */\n\tblob.l = start_cd;\n\n\tfor(i = 0; i < fcnt; ++i) {\n\t\t/* trust local file header instead of CD entry */\n\t\tblob.l += 20;\n\t\tvar csz = blob.read_shift(4);\n\t\tvar usz = blob.read_shift(4);\n\t\tvar namelen = blob.read_shift(2);\n\t\tvar efsz = blob.read_shift(2);\n\t\tvar fcsz = blob.read_shift(2);\n\t\tblob.l += 8;\n\t\tvar offset = blob.read_shift(4);\n\t\tvar EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));\n\t\tblob.l += namelen + efsz + fcsz;\n\n\t\tvar L = blob.l;\n\t\tblob.l = offset + 4;\n\t\tparse_local_file(blob, csz, usz, o, EF);\n\t\tblob.l = L;\n\t}\n\n\treturn o;\n}\n\n\n/* head starts just after local file header signature */\nfunction parse_local_file(blob, csz, usz, o, EF) {\n\t/* [local file header] */\n\tblob.l += 2;\n\tvar flags = blob.read_shift(2);\n\tvar meth = blob.read_shift(2);\n\tvar date = parse_dos_date(blob);\n\n\tif(flags & 0x2041) throw new Error(\"Unsupported ZIP encryption\");\n\tvar crc32 = blob.read_shift(4);\n\tvar _csz = blob.read_shift(4);\n\tvar _usz = blob.read_shift(4);\n\n\tvar namelen = blob.read_shift(2);\n\tvar efsz = blob.read_shift(2);\n\n\t// TODO: flags & (1<<11) // UTF8\n\tvar name = \"\"; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);\n\tif(efsz) {\n\t\tvar ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));\n\t\tif((ef[0x5455]||{}).mt) date = ef[0x5455].mt;\n\t\tif(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;\n\t}\n\tblob.l += efsz;\n\n\t/* [encryption header] */\n\n\t/* [file data] */\n\tvar data = blob.slice(blob.l, blob.l + _csz);\n\tswitch(meth) {\n\t\tcase 8: data = _inflateRawSync(blob, _usz); break;\n\t\tcase 0: break; // TODO: scan for magic number\n\t\tdefault: throw new Error(\"Unsupported ZIP Compression method \" + meth);\n\t}\n\n\t/* [data descriptor] */\n\tvar wrn = false;\n\tif(flags & 8) {\n\t\tcrc32 = blob.read_shift(4);\n\t\tif(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }\n\t\t_csz = blob.read_shift(4);\n\t\t_usz = blob.read_shift(4);\n\t}\n\n\tif(_csz != csz) warn_or_throw(wrn, \"Bad compressed size: \" + csz + \" != \" + _csz);\n\tif(_usz != usz) warn_or_throw(wrn, \"Bad uncompressed size: \" + usz + \" != \" + _usz);\n\tvar _crc32 = CRC32.buf(data, 0);\n\tif((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, \"Bad CRC32 checksum: \" + crc32 + \" != \" + _crc32);\n\tcfb_add(o, name, data, {unsafe: true, mt: date});\n}\nfunction write_zip(cfb, options) {\n\tvar _opts = options || {};\n\tvar out = [], cdirs = [];\n\tvar o = new_buf(1);\n\tvar method = (_opts.compression ? 8 : 0), flags = 0;\n\tvar desc = false;\n\tif(desc) flags |= 8;\n\tvar i = 0, j = 0;\n\n\tvar start_cd = 0, fcnt = 0;\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tvar crcs = [];\n\tvar sz_cd = 0;\n\n\tfor(i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\t\tvar start = start_cd;\n\n\t\t/* TODO: CP437 filename */\n\t\tvar namebuf = new_buf(fp.length);\n\t\tfor(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);\n\t\tnamebuf = namebuf.slice(0, namebuf.l);\n\t\tcrcs[fcnt] = CRC32.buf(fi.content, 0);\n\n\t\tvar outbuf = fi.content;\n\t\tif(method == 8) outbuf = _deflateRawSync(outbuf);\n\n\t\t/* local file header */\n\t\to = new_buf(30);\n\t\to.write_shift(4, 0x04034b50);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\t/* TODO: last mod file time/date */\n\t\tif(fi.mt) write_dos_date(o, fi.mt);\n\t\telse o.write_shift(4, 0);\n\t\to.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);\n\t\to.write_shift(4, (flags & 8) ? 0 : outbuf.length);\n\t\to.write_shift(4, (flags & 8) ? 0 : fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\n\t\tstart_cd += o.length;\n\t\tout.push(o);\n\t\tstart_cd += namebuf.length;\n\t\tout.push(namebuf);\n\n\t\t/* TODO: extra fields? */\n\n\t\t/* TODO: encryption header ? */\n\n\t\tstart_cd += outbuf.length;\n\t\tout.push(outbuf);\n\n\t\t/* data descriptor */\n\t\tif(flags & 8) {\n\t\t\to = new_buf(12);\n\t\t\to.write_shift(-4, crcs[fcnt]);\n\t\t\to.write_shift(4, outbuf.length);\n\t\t\to.write_shift(4, fi.content.length);\n\t\t\tstart_cd += o.l;\n\t\t\tout.push(o);\n\t\t}\n\n\t\t/* central directory */\n\t\to = new_buf(46);\n\t\to.write_shift(4, 0x02014b50);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\to.write_shift(4, 0); /* TODO: last mod file time/date */\n\t\to.write_shift(-4, crcs[fcnt]);\n\n\t\to.write_shift(4, outbuf.length);\n\t\to.write_shift(4, fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, start);\n\n\t\tsz_cd += o.l;\n\t\tcdirs.push(o);\n\t\tsz_cd += namebuf.length;\n\t\tcdirs.push(namebuf);\n\t\t++fcnt;\n\t}\n\n\t/* end of central directory */\n\to = new_buf(22);\n\to.write_shift(4, 0x06054b50);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, fcnt);\n\to.write_shift(2, fcnt);\n\to.write_shift(4, sz_cd);\n\to.write_shift(4, start_cd);\n\to.write_shift(2, 0);\n\n\treturn bconcat(([bconcat((out)), bconcat(cdirs), o]));\n}\nvar ContentTypeMap = ({\n\t\"htm\": \"text/html\",\n\t\"xml\": \"text/xml\",\n\n\t\"gif\": \"image/gif\",\n\t\"jpg\": \"image/jpeg\",\n\t\"png\": \"image/png\",\n\n\t\"mso\": \"application/x-mso\",\n\t\"thmx\": \"application/vnd.ms-officetheme\",\n\t\"sh33tj5\": \"application/octet-stream\"\n});\n\nfunction get_content_type(fi, fp) {\n\tif(fi.ctype) return fi.ctype;\n\n\tvar ext = fi.name || \"\", m = ext.match(/\\.([^\\.]+)$/);\n\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\n\tif(fp) {\n\t\tm = (ext = fp).match(/[\\.\\\\]([^\\.\\\\])+$/);\n\t\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\t}\n\n\treturn \"application/octet-stream\";\n}\n\n/* 76 character chunks TODO: intertwine encoding */\nfunction write_base64_76(bstr) {\n\tvar data = Base64_encode(bstr);\n\tvar o = [];\n\tfor(var i = 0; i < data.length; i+= 76) o.push(data.slice(i, i+76));\n\treturn o.join(\"\\r\\n\") + \"\\r\\n\";\n}\n\n/*\nRules for QP:\n\t- escape =## applies for all non-display characters and literal \"=\"\n\t- space or tab at end of line must be encoded\n\t- \\r\\n newlines can be preserved, but bare \\r and \\n must be escaped\n\t- lines must not exceed 76 characters, use soft breaks =\\r\\n\n\nTODO: Some files from word appear to write line extensions with bare equals:\n\n```\n<table class=3DMsoTableGrid border=3D1 cellspacing=3D0 cellpadding=3D0 width=\n=\"70%\"\n```\n*/\nfunction write_quoted_printable(text) {\n\tvar encoded = text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7E-\\xFF=]/g, function(c) {\n\t\tvar w = c.charCodeAt(0).toString(16).toUpperCase();\n\t\treturn \"=\" + (w.length == 1 ? \"0\" + w : w);\n\t});\n\n\tencoded = encoded.replace(/ $/mg, \"=20\").replace(/\\t$/mg, \"=09\");\n\n\tif(encoded.charAt(0) == \"\\n\") encoded = \"=0D\" + encoded.slice(1);\n\tencoded = encoded.replace(/\\r(?!\\n)/mg, \"=0D\").replace(/\\n\\n/mg, \"\\n=0A\").replace(/([^\\r\\n])\\n/mg, \"$1=0A\");\n\n\tvar o = [], split = encoded.split(\"\\r\\n\");\n\tfor(var si = 0; si < split.length; ++si) {\n\t\tvar str = split[si];\n\t\tif(str.length == 0) { o.push(\"\"); continue; }\n\t\tfor(var i = 0; i < str.length;) {\n\t\t\tvar end = 76;\n\t\t\tvar tmp = str.slice(i, i + end);\n\t\t\tif(tmp.charAt(end - 1) == \"=\") end --;\n\t\t\telse if(tmp.charAt(end - 2) == \"=\") end -= 2;\n\t\t\telse if(tmp.charAt(end - 3) == \"=\") end -= 3;\n\t\t\ttmp = str.slice(i, i + end);\n\t\t\ti += end;\n\t\t\tif(i < str.length) tmp += \"=\";\n\t\t\to.push(tmp);\n\t\t}\n\t}\n\n\treturn o.join(\"\\r\\n\");\n}\nfunction parse_quoted_printable(data) {\n\tvar o = [];\n\n\t/* unify long lines */\n\tfor(var di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\twhile(di <= data.length && line.charAt(line.length - 1) == \"=\") line = line.slice(0, line.length - 1) + data[++di];\n\t\to.push(line);\n\t}\n\n\t/* decode */\n\tfor(var oi = 0; oi < o.length; ++oi) o[oi] = o[oi].replace(/[=][0-9A-Fa-f]{2}/g, function($$) { return String.fromCharCode(parseInt($$.slice(1), 16)); });\n\treturn s2a(o.join(\"\\r\\n\"));\n}\n\n\nfunction parse_mime(cfb, data, root) {\n\tvar fname = \"\", cte = \"\", ctype = \"\", fdata;\n\tvar di = 0;\n\tfor(;di < 10; ++di) {\n\t\tvar line = data[di];\n\t\tif(!line || line.match(/^\\s*$/)) break;\n\t\tvar m = line.match(/^(.*?):\\s*([^\\s].*)$/);\n\t\tif(m) switch(m[1].toLowerCase()) {\n\t\t\tcase \"content-location\": fname = m[2].trim(); break;\n\t\t\tcase \"content-type\": ctype = m[2].trim(); break;\n\t\t\tcase \"content-transfer-encoding\": cte = m[2].trim(); break;\n\t\t}\n\t}\n\t++di;\n\tswitch(cte.toLowerCase()) {\n\t\tcase 'base64': fdata = s2a(Base64_decode(data.slice(di).join(\"\"))); break;\n\t\tcase 'quoted-printable': fdata = parse_quoted_printable(data.slice(di)); break;\n\t\tdefault: throw new Error(\"Unsupported Content-Transfer-Encoding \" + cte);\n\t}\n\tvar file = cfb_add(cfb, fname.slice(root.length), fdata, {unsafe: true});\n\tif(ctype) file.ctype = ctype;\n}\n\nfunction parse_mad(file, options) {\n\tif(a2s(file.slice(0,13)).toLowerCase() != \"mime-version:\") throw new Error(\"Unsupported MAD header\");\n\tvar root = (options && options.root || \"\");\n\t// $FlowIgnore\n\tvar data = (has_buf && Buffer.isBuffer(file) ? file.toString(\"binary\") : a2s(file)).split(\"\\r\\n\");\n\tvar di = 0, row = \"\";\n\n\t/* if root is not specified, scan for the common prefix */\n\tfor(di = 0; di < data.length; ++di) {\n\t\trow = data[di];\n\t\tif(!/^Content-Location:/i.test(row)) continue;\n\t\trow = row.slice(row.indexOf(\"file\"));\n\t\tif(!root) root = row.slice(0, row.lastIndexOf(\"/\") + 1);\n\t\tif(row.slice(0, root.length) == root) continue;\n\t\twhile(root.length > 0) {\n\t\t\troot = root.slice(0, root.length - 1);\n\t\t\troot = root.slice(0, root.lastIndexOf(\"/\") + 1);\n\t\t\tif(row.slice(0,root.length) == root) break;\n\t\t}\n\t}\n\n\tvar mboundary = (data[1] || \"\").match(/boundary=\"(.*?)\"/);\n\tif(!mboundary) throw new Error(\"MAD cannot find boundary\");\n\tvar boundary = \"--\" + (mboundary[1] || \"\");\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o);\n\tvar start_di, fcnt = 0;\n\tfor(di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\tif(line !== boundary && line !== boundary + \"--\") continue;\n\t\tif(fcnt++) parse_mime(o, data.slice(start_di, di), root);\n\t\tstart_di = di;\n\t}\n\treturn o;\n}\n\nfunction write_mad(cfb, options) {\n\tvar opts = options || {};\n\tvar boundary = opts.boundary || \"SheetJS\";\n\tboundary = '------=' + boundary;\n\n\tvar out = [\n\t\t'MIME-Version: 1.0',\n\t\t'Content-Type: multipart/related; boundary=\"' + boundary.slice(2) + '\"',\n\t\t'',\n\t\t'',\n\t\t''\n\t];\n\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tfor(var i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length);\n\t\tfi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\n\t\t/* Normalize filename */\n\t\tfp = fp.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7E-\\xFF]/g, function(c) {\n\t\t\treturn \"_x\" + c.charCodeAt(0).toString(16) + \"_\";\n\t\t}).replace(/[\\u0080-\\uFFFF]/g, function(u) {\n\t\t\treturn \"_u\" + u.charCodeAt(0).toString(16) + \"_\";\n\t\t});\n\n\t\t/* Extract content as binary string */\n\t\tvar ca = fi.content;\n\t\t// $FlowIgnore\n\t\tvar cstr = has_buf && Buffer.isBuffer(ca) ? ca.toString(\"binary\") : a2s(ca);\n\n\t\t/* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */\n\t\tvar dispcnt = 0, L = Math.min(1024, cstr.length), cc = 0;\n\t\tfor(var csl = 0; csl <= L; ++csl) if((cc=cstr.charCodeAt(csl)) >= 0x20 && cc < 0x80) ++dispcnt;\n\t\tvar qp = dispcnt >= L * 4 / 5;\n\n\t\tout.push(boundary);\n\t\tout.push('Content-Location: ' + (opts.root || 'file:///C:/SheetJS/') + fp);\n\t\tout.push('Content-Transfer-Encoding: ' + (qp ? 'quoted-printable' : 'base64'));\n\t\tout.push('Content-Type: ' + get_content_type(fi, fp));\n\t\tout.push('');\n\n\t\tout.push(qp ? write_quoted_printable(cstr) : write_base64_76(cstr));\n\t}\n\tout.push(boundary + '--\\r\\n');\n\treturn out.join(\"\\r\\n\");\n}\nfunction cfb_new(opts) {\n\tvar o = ({});\n\tinit_cfb(o, opts);\n\treturn o;\n}\n\nfunction cfb_add(cfb, name, content, opts) {\n\tvar unsafe = opts && opts.unsafe;\n\tif(!unsafe) init_cfb(cfb);\n\tvar file = !unsafe && CFB.find(cfb, name);\n\tif(!file) {\n\t\tvar fpath = cfb.FullPaths[0];\n\t\tif(name.slice(0, fpath.length) == fpath) fpath = name;\n\t\telse {\n\t\t\tif(fpath.slice(-1) != \"/\") fpath += \"/\";\n\t\t\tfpath = (fpath + name).replace(\"//\",\"/\");\n\t\t}\n\t\tfile = ({name: filename(name), type: 2});\n\t\tcfb.FileIndex.push(file);\n\t\tcfb.FullPaths.push(fpath);\n\t\tif(!unsafe) CFB.utils.cfb_gc(cfb);\n\t}\nfile.content = (content);\n\tfile.size = content ? content.length : 0;\n\tif(opts) {\n\t\tif(opts.CLSID) file.clsid = opts.CLSID;\n\t\tif(opts.mt) file.mt = opts.mt;\n\t\tif(opts.ct) file.ct = opts.ct;\n\t}\n\treturn file;\n}\n\nfunction cfb_del(cfb, name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex.splice(j, 1);\n\t\tcfb.FullPaths.splice(j, 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_mov(cfb, old_name, new_name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, old_name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex[j].name = filename(new_name);\n\t\tcfb.FullPaths[j] = new_name;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_gc(cfb) { rebuild_cfb(cfb, true); }\n\nexports.find = find;\nexports.read = read;\nexports.parse = parse;\nexports.write = write;\nexports.writeFile = write_file;\nexports.utils = {\n\tcfb_new: cfb_new,\n\tcfb_add: cfb_add,\n\tcfb_del: cfb_del,\n\tcfb_mov: cfb_mov,\n\tcfb_gc: cfb_gc,\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tuse_zlib: use_zlib,\n\t_deflateRaw: _deflate,\n\t_inflateRaw: _inflate,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\n","import type { ExcelSanitizationLimits } from \"./types.js\";\n\nexport type ExcelSanitizationErrorCode =\n | \"ERR_INVALID_ARGUMENT\"\n | \"ERR_UNSUPPORTED_EXTENSION\"\n | \"ERR_INVALID_XLS\"\n | \"ERR_INVALID_XLSX\"\n | \"ERR_LIMIT_EXCEEDED\"\n | \"ERR_WORKSHEET_COUNT\"\n | \"ERR_SAME_PATH\"\n | \"ERR_OUTPUT_EXISTS\"\n | \"ERR_FILE_READ\"\n | \"ERR_FILE_WRITE\";\n\nexport interface ExcelSanitizationErrorOptions {\n cause?: unknown;\n details?: Readonly<Record<string, unknown>>;\n}\n\ninterface CreateErrorOptions extends ExcelSanitizationErrorOptions {\n message?: string;\n}\n\nexport type SafetyLimitName = keyof ExcelSanitizationLimits | \"partBytes\";\n\nconst ERROR_MESSAGES: Readonly<Record<ExcelSanitizationErrorCode, string>> = Object.freeze({\n ERR_INVALID_ARGUMENT: \"Invalid argument\",\n ERR_UNSUPPORTED_EXTENSION:\n \"Supported extensions are .xls, .xlsx, and .xlsm; input and output formats must match\",\n ERR_INVALID_XLS: \"Invalid or unsupported XLS workbook\",\n ERR_INVALID_XLSX: \"Invalid or unsupported OOXML workbook\",\n ERR_LIMIT_EXCEEDED: \"Excel workbook exceeds a configured safety limit\",\n ERR_WORKSHEET_COUNT: \"The workbook must contain exactly one worksheet\",\n ERR_SAME_PATH: \"Input and output paths must be different\",\n ERR_OUTPUT_EXISTS: \"The output file already exists\",\n ERR_FILE_READ: \"Unable to read the input Excel file\",\n ERR_FILE_WRITE: \"Unable to write the sanitized Excel file\",\n});\n\nexport class ExcelSanitizationError extends Error {\n override readonly name = \"ExcelSanitizationError\";\n readonly code: ExcelSanitizationErrorCode;\n readonly details?: Readonly<Record<string, unknown>>;\n\n constructor(\n code: ExcelSanitizationErrorCode,\n message: string,\n options: ExcelSanitizationErrorOptions = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.code = code;\n if (options.details !== undefined) {\n this.details = Object.freeze({ ...options.details });\n }\n }\n}\n\nexport function createError(\n code: ExcelSanitizationErrorCode,\n options: CreateErrorOptions = {},\n): ExcelSanitizationError {\n return new ExcelSanitizationError(code, options.message ?? ERROR_MESSAGES[code], options);\n}\n\nexport function limitExceeded(\n limit: SafetyLimitName,\n configured: number,\n actual: number,\n partName?: string,\n): ExcelSanitizationError {\n return createError(\"ERR_LIMIT_EXCEEDED\", {\n details: {\n limit,\n configured,\n actual,\n ...(partName === undefined ? {} : { partName }),\n },\n });\n}\n","import * as CFB from \"cfb\";\n\nimport { createError, limitExceeded } from \"../errors.js\";\nimport type { NormalizedSanitizeOptions } from \"../types.js\";\n\nconst COMPOUND_FILE_SIGNATURE = Buffer.from([0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1]);\nconst RECORD_HEADER_BYTES = 4;\nconst CFB_STORAGE_ENTRY = 1;\nconst CFB_STREAM_ENTRY = 2;\nconst RECORD_CONTINUE = 0x003c;\nconst RECORD_BOUNDSHEET = 0x0085;\nconst RECORD_BOF_IDS = new Set([0x0009, 0x0209, 0x0409, 0x0809]);\n\n// INDEX, DBCELL, and ExtSST cache absolute stream offsets. They are optional\n// acceleration records and must be discarded after other records move.\nconst OFFSET_CACHE_RECORD_IDS = new Set([0x00d7, 0x00ff, 0x020b]);\n\n// Drawing-layer records cover OfficeArt drawings, images, notes/comments,\n// controls, embedded OLE objects, and header/footer or background pictures.\nconst DRAWING_RECORD_IDS = new Set([\n 0x001c, // Note\n 0x005d, // Obj\n 0x007f, // ImData\n 0x00e9, // BkHim\n 0x00eb, // MsoDrawingGroup\n 0x00ec, // MsoDrawing\n 0x00ed, // MsoDrawingSelection\n 0x01b6, // TxO\n 0x0866, // HFPicture\n]);\n\ninterface BiffRecord {\n id: number;\n originalOffset: number;\n payload: Buffer;\n remove: boolean;\n}\n\nexport function hasCompoundFileSignature(buffer: Buffer): boolean {\n return (\n buffer.length >= COMPOUND_FILE_SIGNATURE.length &&\n buffer.subarray(0, COMPOUND_FILE_SIGNATURE.length).equals(COMPOUND_FILE_SIGNATURE)\n );\n}\n\nexport async function sanitizeBiffWorkbook(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<Buffer> {\n enforceInputSize(buffer, options);\n const cfb = CFB.read(buffer, { type: \"buffer\" });\n enforceContainerLimits(cfb, options);\n\n const workbookEntry = CFB.find(cfb, \"Workbook\") ?? CFB.find(cfb, \"Book\");\n if (!workbookEntry || workbookEntry.type !== CFB_STREAM_ENTRY) {\n throw new Error(\"Compound file has no BIFF Workbook stream\");\n }\n\n const workbookStream = Buffer.from(workbookEntry.content);\n const records = parseBiffRecords(workbookStream);\n rejectEncryptedWorkbook(records);\n enforceWorksheetCount(records, options.requireSingleWorksheet);\n\n const sanitizedStream = rebuildWorkbookStream(records);\n workbookEntry.content = sanitizedStream;\n workbookEntry.size = sanitizedStream.length;\n removeEmbeddedObjectEntries(cfb);\n\n return Buffer.from(CFB.write(cfb, { type: \"buffer\", fileType: \"cfb\" }));\n}\n\nfunction enforceInputSize(buffer: Buffer, options: NormalizedSanitizeOptions): void {\n const configured = options.limits.maxUncompressedBytes;\n if (buffer.length > configured) {\n throw limitExceeded(\"maxUncompressedBytes\", configured, buffer.length);\n }\n}\n\nfunction enforceContainerLimits(cfb: CFB.CFB$Container, options: NormalizedSanitizeOptions): void {\n const entries = cfb.FileIndex.filter(\n (entry) => entry.type === CFB_STORAGE_ENTRY || entry.type === CFB_STREAM_ENTRY,\n );\n if (entries.length > options.limits.maxEntryCount) {\n throw limitExceeded(\"maxEntryCount\", options.limits.maxEntryCount, entries.length);\n }\n\n const totalBytes = entries.reduce(\n (total, entry) => (entry.type === CFB_STREAM_ENTRY ? total + entry.content.length : total),\n 0,\n );\n if (totalBytes > options.limits.maxUncompressedBytes) {\n throw limitExceeded(\"maxUncompressedBytes\", options.limits.maxUncompressedBytes, totalBytes);\n }\n}\n\nfunction parseBiffRecords(stream: Buffer): BiffRecord[] {\n const records: BiffRecord[] = [];\n let offset = 0;\n let removeContinuation = false;\n\n while (offset < stream.length) {\n if (offset + RECORD_HEADER_BYTES > stream.length) {\n throw new Error(\"Truncated BIFF record header\");\n }\n\n const id = stream.readUInt16LE(offset);\n const length = stream.readUInt16LE(offset + 2);\n const nextOffset = offset + RECORD_HEADER_BYTES + length;\n if (nextOffset > stream.length) {\n throw new Error(\"Truncated BIFF record payload\");\n }\n\n const remove: boolean =\n id === RECORD_CONTINUE\n ? removeContinuation\n : DRAWING_RECORD_IDS.has(id) || OFFSET_CACHE_RECORD_IDS.has(id);\n records.push({\n id,\n originalOffset: offset,\n payload: stream.subarray(offset + RECORD_HEADER_BYTES, nextOffset),\n remove,\n });\n if (id !== RECORD_CONTINUE) {\n removeContinuation = remove;\n }\n offset = nextOffset;\n }\n\n if (records.length === 0 || !RECORD_BOF_IDS.has(records[0]?.id ?? -1)) {\n throw new Error(\"Workbook stream does not start with a BIFF BOF record\");\n }\n return records;\n}\n\nfunction rejectEncryptedWorkbook(records: readonly BiffRecord[]): void {\n if (records.some((record) => record.id === 0x002f)) {\n throw createError(\"ERR_INVALID_XLS\", {\n message: \"Encrypted XLS workbooks are not supported\",\n });\n }\n}\n\nfunction enforceWorksheetCount(records: readonly BiffRecord[], required: boolean): void {\n const count = records.filter((record) => record.id === RECORD_BOUNDSHEET).length;\n if (count === 0) {\n throw new Error(\"Workbook contains no sheets\");\n }\n if (required && count !== 1) {\n throw createError(\"ERR_WORKSHEET_COUNT\", {\n details: { expected: 1, actual: count },\n });\n }\n}\n\nfunction rebuildWorkbookStream(records: readonly BiffRecord[]): Buffer {\n const newOffsets = new Map<number, number>();\n let outputLength = 0;\n for (const record of records) {\n if (record.remove) {\n continue;\n }\n newOffsets.set(record.originalOffset, outputLength);\n outputLength += RECORD_HEADER_BYTES + record.payload.length;\n }\n\n const output = Buffer.allocUnsafe(outputLength);\n let outputOffset = 0;\n for (const record of records) {\n if (record.remove) {\n continue;\n }\n\n const payload = patchBoundSheetOffset(record, newOffsets);\n output.writeUInt16LE(record.id, outputOffset);\n output.writeUInt16LE(payload.length, outputOffset + 2);\n payload.copy(output, outputOffset + RECORD_HEADER_BYTES);\n outputOffset += RECORD_HEADER_BYTES + payload.length;\n }\n return output;\n}\n\nfunction patchBoundSheetOffset(\n record: BiffRecord,\n newOffsets: ReadonlyMap<number, number>,\n): Buffer {\n if (record.id !== RECORD_BOUNDSHEET) {\n return record.payload;\n }\n if (record.payload.length < 4) {\n throw new Error(\"Invalid BoundSheet record\");\n }\n\n const originalSheetOffset = record.payload.readUInt32LE(0);\n const newSheetOffset = newOffsets.get(originalSheetOffset);\n if (newSheetOffset === undefined) {\n throw new Error(\"BoundSheet record points outside the Workbook stream\");\n }\n\n const payload = Buffer.from(record.payload);\n payload.writeUInt32LE(newSheetOffset, 0);\n return payload;\n}\n\nfunction removeEmbeddedObjectEntries(cfb: CFB.CFB$Container): void {\n const paths = cfb.FullPaths.filter((path) =>\n path\n .split(\"/\")\n .filter(Boolean)\n .some(\n (segment) =>\n segment.toLowerCase() === \"objectpool\" ||\n segment.toLowerCase() === \"ctls\" ||\n /^mbd[0-9a-f]{8}$/i.test(segment),\n ),\n );\n\n for (let index = paths.length - 1; index >= 0; index -= 1) {\n CFB.utils.cfb_del(cfb, paths[index] ?? \"\");\n }\n if (paths.length > 0) {\n CFB.utils.cfb_gc(cfb);\n }\n}\n","import { limitExceeded } from \"../errors.js\";\nimport type { ExcelSanitizationLimits } from \"../types.js\";\n\nconst END_RECORD_MINIMUM_SIZE = 22;\nconst CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE = 46;\nconst MAX_ZIP_COMMENT_SIZE = 65_535;\nconst END_RECORD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_ENTRY_SIGNATURE = 0x02014b50;\nconst ZIP64_END_LOCATOR_SIGNATURE = 0x07064b50;\n\ninterface EndRecord {\n offset: number;\n totalEntries: number;\n centralDirectoryOffset: number;\n centralDirectorySize: number;\n}\n\ninterface CentralDirectoryEntry {\n nextOffset: number;\n uncompressedSize: number;\n}\n\nexport function hasZipSignature(buffer: Buffer): boolean {\n return buffer.length >= 2 && buffer[0] === 0x50 && buffer[1] === 0x4b;\n}\n\nexport function validateZipCentralDirectory(\n buffer: Buffer,\n limits: Readonly<ExcelSanitizationLimits>,\n): void {\n const endRecord = readEndRecord(buffer, limits);\n const centralDirectoryEnd = endRecord.centralDirectoryOffset + endRecord.centralDirectorySize;\n\n if (\n endRecord.centralDirectoryOffset > endRecord.offset ||\n centralDirectoryEnd > endRecord.offset ||\n centralDirectoryEnd > buffer.length\n ) {\n throw new Error(\"Invalid ZIP central-directory bounds\");\n }\n\n let entryOffset = endRecord.centralDirectoryOffset;\n let totalUncompressedSize = 0;\n for (let index = 0; index < endRecord.totalEntries; index += 1) {\n const entry = readCentralDirectoryEntry(\n buffer,\n entryOffset,\n centralDirectoryEnd,\n endRecord.centralDirectoryOffset,\n );\n totalUncompressedSize += entry.uncompressedSize;\n if (totalUncompressedSize > limits.maxUncompressedBytes) {\n throw limitExceeded(\n \"maxUncompressedBytes\",\n limits.maxUncompressedBytes,\n totalUncompressedSize,\n );\n }\n entryOffset = entry.nextOffset;\n }\n\n if (entryOffset !== centralDirectoryEnd) {\n throw new Error(\"ZIP central-directory entry count is inconsistent\");\n }\n}\n\nfunction readEndRecord(buffer: Buffer, limits: Readonly<ExcelSanitizationLimits>): EndRecord {\n const offset = findEndOfCentralDirectory(buffer);\n if (offset === undefined || offset + END_RECORD_MINIMUM_SIZE > buffer.length) {\n throw new Error(\"ZIP end-of-central-directory record is missing\");\n }\n\n const diskNumber = buffer.readUInt16LE(offset + 4);\n const centralDirectoryDisk = buffer.readUInt16LE(offset + 6);\n const entriesOnDisk = buffer.readUInt16LE(offset + 8);\n const totalEntries = buffer.readUInt16LE(offset + 10);\n const centralDirectorySize = buffer.readUInt32LE(offset + 12);\n const centralDirectoryOffset = buffer.readUInt32LE(offset + 16);\n const commentLength = buffer.readUInt16LE(offset + 20);\n\n if (offset + END_RECORD_MINIMUM_SIZE + commentLength > buffer.length) {\n throw new Error(\"Truncated ZIP comment\");\n }\n if (diskNumber !== 0 || centralDirectoryDisk !== 0 || entriesOnDisk !== totalEntries) {\n throw new Error(\"Multi-disk ZIP files are not supported\");\n }\n if (\n totalEntries === 0xffff ||\n centralDirectorySize === 0xffffffff ||\n centralDirectoryOffset === 0xffffffff ||\n (offset >= 20 && buffer.readUInt32LE(offset - 20) === ZIP64_END_LOCATOR_SIGNATURE)\n ) {\n throw new Error(\"ZIP64 files are not supported\");\n }\n if (totalEntries > limits.maxEntryCount) {\n throw limitExceeded(\"maxEntryCount\", limits.maxEntryCount, totalEntries);\n }\n\n return { offset, totalEntries, centralDirectoryOffset, centralDirectorySize };\n}\n\nfunction readCentralDirectoryEntry(\n buffer: Buffer,\n entryOffset: number,\n centralDirectoryEnd: number,\n centralDirectoryOffset: number,\n): CentralDirectoryEntry {\n if (\n entryOffset + CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE > centralDirectoryEnd ||\n buffer.readUInt32LE(entryOffset) !== CENTRAL_DIRECTORY_ENTRY_SIGNATURE\n ) {\n throw new Error(\"Malformed ZIP central-directory entry\");\n }\n\n const compressedSize = buffer.readUInt32LE(entryOffset + 20);\n const uncompressedSize = buffer.readUInt32LE(entryOffset + 24);\n const fileNameLength = buffer.readUInt16LE(entryOffset + 28);\n const extraLength = buffer.readUInt16LE(entryOffset + 30);\n const fileCommentLength = buffer.readUInt16LE(entryOffset + 32);\n const entryDisk = buffer.readUInt16LE(entryOffset + 34);\n const localHeaderOffset = buffer.readUInt32LE(entryOffset + 42);\n\n if (\n compressedSize === 0xffffffff ||\n uncompressedSize === 0xffffffff ||\n localHeaderOffset === 0xffffffff ||\n entryDisk !== 0\n ) {\n throw new Error(\"ZIP64 or multi-disk entries are not supported\");\n }\n\n const fileNameOffset = entryOffset + CENTRAL_DIRECTORY_ENTRY_MINIMUM_SIZE;\n const extraOffset = fileNameOffset + fileNameLength;\n const nextOffset = extraOffset + extraLength + fileCommentLength;\n if (nextOffset > centralDirectoryEnd) {\n throw new Error(\"Truncated ZIP central-directory entry\");\n }\n\n validatePackageEntryName(buffer.subarray(fileNameOffset, extraOffset).toString(\"utf8\"));\n rejectZip64ExtraFields(buffer, extraOffset, extraLength);\n if (localHeaderOffset >= centralDirectoryOffset) {\n throw new Error(\"Invalid ZIP local-header offset\");\n }\n\n return { nextOffset, uncompressedSize };\n}\n\nexport function validatePackageEntryName(name: string): void {\n const normalized = name.replaceAll(\"\\\\\", \"/\");\n if (\n normalized.includes(\"\\0\") ||\n normalized.startsWith(\"/\") ||\n /^[A-Za-z]:\\//.test(normalized) ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n throw new Error(`Unsafe ZIP entry name: ${name}`);\n }\n}\n\nexport function findEndOfCentralDirectory(buffer: Buffer): number | undefined {\n const minimumOffset = Math.max(0, buffer.length - MAX_ZIP_COMMENT_SIZE - END_RECORD_MINIMUM_SIZE);\n for (let offset = buffer.length - END_RECORD_MINIMUM_SIZE; offset >= minimumOffset; offset -= 1) {\n if (\n buffer.readUInt32LE(offset) === END_RECORD_SIGNATURE &&\n offset + END_RECORD_MINIMUM_SIZE + buffer.readUInt16LE(offset + 20) === buffer.length\n ) {\n return offset;\n }\n }\n return undefined;\n}\n\nexport function rejectZip64ExtraFields(\n buffer: Buffer,\n extraOffset: number,\n extraLength: number,\n): void {\n const extraEnd = extraOffset + extraLength;\n let offset = extraOffset;\n while (offset < extraEnd) {\n if (offset + 4 > extraEnd) {\n throw new Error(\"Malformed ZIP extra field\");\n }\n const headerId = buffer.readUInt16LE(offset);\n const fieldLength = buffer.readUInt16LE(offset + 2);\n offset += 4;\n if (offset + fieldLength > extraEnd) {\n throw new Error(\"Truncated ZIP extra field\");\n }\n if (headerId === 0x0001) {\n throw new Error(\"ZIP64 files are not supported\");\n }\n offset += fieldLength;\n }\n}\n","export const DRAWING_RELATIONSHIP_SUFFIXES: readonly string[] = [\n \"/comments\",\n \"/control\",\n \"/drawing\",\n \"/image\",\n \"/oleObject\",\n \"/threadedComment\",\n \"/vmlDrawing\",\n];\n\nexport const PERSON_RELATIONSHIP_SUFFIXES: readonly string[] = [\"/person\"];\n\nexport const DRAWING_ELEMENTS: readonly string[] = [\n \"controls\",\n \"drawing\",\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"oleObjects\",\n \"picture\",\n];\n","import { DRAWING_ELEMENTS } from \"./constants.js\";\n\nexport function removeWorksheetDrawingMarkup(xml: string): string {\n return DRAWING_ELEMENTS.reduce((result, name) => {\n const element = new RegExp(\n `<(?:\\\\w+:)?${name}\\\\b[^>]*(?:\\\\/\\\\s*>|>[\\\\s\\\\S]*?<\\\\/(?:\\\\w+:)?${name}\\\\s*>)`,\n \"gi\",\n );\n return result.replace(element, \"\");\n }, xml);\n}\n\nexport function removeThreadedCommentExtensions(xml: string): string {\n return xml.replace(/<(?:\\w+:)?ext\\b[^>]*>[\\s\\S]*?<\\/(?:\\w+:)?ext\\s*>/gi, (extension) =>\n /<(?:\\w+:)?threadedComments?\\b/i.test(extension) ? \"\" : extension,\n );\n}\n","import type JSZip from \"jszip\";\n\nimport { limitExceeded } from \"../errors.js\";\nimport type { ReadBudget } from \"../types.js\";\n\ninterface StreamHelper {\n on(event: \"data\", listener: (chunk: Buffer) => void): StreamHelper;\n on(event: \"error\", listener: (error: unknown) => void): StreamHelper;\n on(event: \"end\", listener: () => void): StreamHelper;\n pause(): StreamHelper;\n resume(): StreamHelper;\n}\n\ninterface StreamableZipObject {\n internalStream(type: \"nodebuffer\"): StreamHelper;\n}\n\nfunction getNodeBufferStream(file: JSZip.JSZipObject): StreamHelper {\n // JSZip's declarations omit its public internalStream helper, while the\n // runtime API is required to enforce byte budgets before full inflation.\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n return (file as unknown as StreamableZipObject).internalStream(\"nodebuffer\");\n}\n\nexport async function requireXml(\n zip: JSZip,\n partName: string,\n budget: ReadBudget,\n partLimitBytes: number,\n): Promise<string> {\n const file = zip.file(partName);\n if (!file) {\n throw new Error(`Required workbook part is missing: ${partName}`);\n }\n return readXmlPart(file, partName, budget, partLimitBytes);\n}\n\nexport function readXmlPart(\n file: JSZip.JSZipObject,\n partName: string,\n budget: ReadBudget,\n partLimitBytes: number,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n const stream = getNodeBufferStream(file);\n let partBytes = 0;\n let settled = false;\n\n const fail = (error: unknown): void => {\n if (settled) {\n return;\n }\n settled = true;\n stream.pause();\n reject(error);\n };\n\n stream\n .on(\"data\", (chunk) => {\n if (settled) {\n return;\n }\n partBytes += chunk.length;\n budget.consumedBytes += chunk.length;\n if (partBytes > partLimitBytes) {\n fail(limitExceeded(\"partBytes\", partLimitBytes, partBytes, partName));\n return;\n }\n if (budget.consumedBytes > budget.limitBytes) {\n fail(limitExceeded(\"maxXmlBytes\", budget.limitBytes, budget.consumedBytes, partName));\n return;\n }\n chunks.push(Buffer.from(chunk));\n })\n .on(\"error\", (error) => fail(error))\n .on(\"end\", () => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(Buffer.concat(chunks, partBytes).toString(\"utf8\"));\n })\n .resume();\n });\n}\n","interface XmlCollection {\n body: string;\n full: string;\n opening: string;\n}\n\nexport function getAttribute(xml: string, name: string): string | undefined {\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = xml.match(new RegExp(`(?:^|\\\\s)${escaped}\\\\s*=\\\\s*([\"'])(.*?)\\\\1`, \"i\"));\n const value = match?.[2];\n return value === undefined ? undefined : decodeXml(value);\n}\n\nexport function decodeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\""\", '\"')\n .replaceAll(\"'\", \"'\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nexport function findCollection(xml: string, name: string): XmlCollection | undefined {\n const match = xml.match(\n new RegExp(`<(?:\\\\w+:)?${name}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/(?:\\\\w+:)?${name}\\\\s*>`, \"i\"),\n );\n if (!match) {\n return undefined;\n }\n const full = match[0];\n if (full === undefined) {\n return undefined;\n }\n return {\n body: match[1] ?? \"\",\n full,\n opening: full.slice(0, full.indexOf(\">\") + 1),\n };\n}\n\nexport function replaceCollection(xml: string, name: string, body: string, count: number): string {\n const collection = findCollection(xml, name);\n if (!collection) {\n return xml;\n }\n const opening = /\\bcount\\s*=/.test(collection.opening)\n ? collection.opening.replace(/(\\bcount\\s*=\\s*)([\"'])\\d+\\2/i, `$1\"${count}\"`)\n : collection.opening.replace(/>$/, ` count=\"${count}\">`);\n const prefix = collection.opening.match(/^<(\\w+:)/)?.[1] ?? \"\";\n return xml.replace(collection.full, `${opening}${body}</${prefix}${name}>`);\n}\n\nexport function matchElements(xml: string, name: string): string[] {\n return (\n xml.match(\n new RegExp(\n `<(?:\\\\w+:)?${name}\\\\b[^>]*\\\\/\\\\s*>|<(?:\\\\w+:)?${name}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/(?:\\\\w+:)?${name}\\\\s*>`,\n \"gi\",\n ),\n ) ?? []\n );\n}\n","import { posix as packagePath } from \"node:path\";\n\nimport type JSZip from \"jszip\";\n\nimport type { ExcelSanitizationLimits, ReadBudget } from \"../types.js\";\nimport { readXmlPart, requireXml } from \"./parts.js\";\nimport { getAttribute } from \"./xml.js\";\n\nexport interface Relationship {\n id: string;\n target: string;\n targetMode: string | undefined;\n type: string;\n}\n\nexport type RelationshipGraph = Map<string, Relationship[]>;\n\nexport interface RemovedRelationships {\n xml: string;\n targets: Set<string>;\n}\n\nexport function removeRelationships(\n xml: string,\n source: string,\n relationshipSuffixes: readonly string[],\n): RemovedRelationships {\n const targets = new Set<string>();\n const cleaned = xml.replace(\n /<(?:\\w+:)?Relationship\\b[^>]*?(?:\\/\\s*>|>\\s*<\\/(?:\\w+:)?Relationship\\s*>)/gi,\n (tag) => {\n const type = getAttribute(tag, \"Type\") ?? \"\";\n const target = getAttribute(tag, \"Target\");\n const targetMode = getAttribute(tag, \"TargetMode\");\n if (\n !target ||\n targetMode?.toLowerCase() === \"external\" ||\n !relationshipSuffixes.some((suffix) => type.endsWith(suffix))\n ) {\n return tag;\n }\n targets.add(resolveTarget(source, target));\n return \"\";\n },\n );\n return { xml: cleaned, targets };\n}\n\nexport function parseRelationships(xml: string, source: string): Relationship[] {\n return Array.from(\n xml.matchAll(/<(?:\\w+:)?Relationship\\b([^>]*?)(?:\\/\\s*>|>\\s*<\\/(?:\\w+:)?Relationship\\s*>)/gi),\n ).flatMap((match) => {\n const attributes = match[1] ?? \"\";\n const id = getAttribute(attributes, \"Id\");\n const target = getAttribute(attributes, \"Target\");\n const type = getAttribute(attributes, \"Type\");\n if (!id || !target || !type) {\n return [];\n }\n const targetMode = getAttribute(attributes, \"TargetMode\");\n return [\n {\n id,\n target: targetMode?.toLowerCase() === \"external\" ? target : resolveTarget(source, target),\n targetMode,\n type,\n },\n ];\n });\n}\n\nexport function resolveTarget(source: string, target: string): string {\n const resolved = target.startsWith(\"/\")\n ? packagePath.normalize(target.slice(1))\n : packagePath.normalize(packagePath.join(packagePath.dirname(source), target));\n if (resolved === \"..\" || resolved.startsWith(\"../\")) {\n throw new Error(`Relationship target escapes package: ${target}`);\n }\n return resolved;\n}\n\nexport function relationshipFileForPart(partName: string): string {\n return packagePath.join(\n packagePath.dirname(partName),\n \"_rels\",\n `${packagePath.basename(partName)}.rels`,\n );\n}\n\nexport function sourcePartForRelationshipFile(fileName: string): string | undefined {\n if (fileName === \"_rels/.rels\") {\n return \"\";\n }\n const match = fileName.match(/^(.*\\/)_rels\\/([^/]+)\\.rels$/);\n return match ? `${match[1]}${match[2]}` : undefined;\n}\n\nexport async function removeUnreachableParts(\n zip: JSZip,\n detachedRoots: Set<string>,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<void> {\n if (detachedRoots.size === 0) {\n return;\n }\n\n const graph = await buildRelationshipGraph(zip, readBudget, limits);\n const candidates = collectReachableParts(detachedRoots, graph);\n const packageReachable = collectReachableParts(new Set([\"\"]), graph);\n packageReachable.delete(\"\");\n const deletedParts = new Set(\n [...candidates].filter((partName) => !packageReachable.has(partName)),\n );\n for (const partName of deletedParts) {\n zip.remove(partName);\n zip.remove(relationshipFileForPart(partName));\n }\n\n const contentTypes = await requireXml(\n zip,\n \"[Content_Types].xml\",\n readBudget,\n limits.maxMetadataXmlBytes,\n );\n zip.file(\n \"[Content_Types].xml\",\n contentTypes.replace(/<(?:\\w+:)?Override\\b[^>]*\\/>/gi, (tag) => {\n const partName = getAttribute(tag, \"PartName\")?.replace(/^\\//, \"\");\n return partName && deletedParts.has(partName) ? \"\" : tag;\n }),\n );\n}\n\nasync function buildRelationshipGraph(\n zip: JSZip,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<RelationshipGraph> {\n const graph: RelationshipGraph = new Map();\n for (const fileName of Object.keys(zip.files)) {\n if (!fileName.endsWith(\".rels\")) {\n continue;\n }\n const source = sourcePartForRelationshipFile(fileName);\n const file = zip.file(fileName);\n if (source !== undefined && file) {\n graph.set(\n source,\n parseRelationships(\n // Reads intentionally stay sequential because they share a mutable byte budget.\n // oxlint-disable-next-line no-await-in-loop\n await readXmlPart(file, fileName, readBudget, limits.maxRelationshipsXmlBytes),\n source,\n ),\n );\n }\n }\n return graph;\n}\n\nexport function collectReachableParts(\n initial: ReadonlySet<string>,\n graph: ReadonlyMap<string, readonly Relationship[]>,\n): Set<string> {\n const reachable = new Set(initial);\n const pending = [...initial];\n while (pending.length > 0) {\n const source = pending.pop();\n if (source === undefined) {\n continue;\n }\n for (const relationship of graph.get(source) ?? []) {\n if (\n relationship.targetMode?.toLowerCase() !== \"external\" &&\n !reachable.has(relationship.target)\n ) {\n reachable.add(relationship.target);\n pending.push(relationship.target);\n }\n }\n }\n return reachable;\n}\n","import type JSZip from \"jszip\";\n\nimport type { ExcelSanitizationLimits, ReadBudget } from \"../types.js\";\nimport { readXmlPart } from \"./parts.js\";\nimport { findCollection, getAttribute, matchElements, replaceCollection } from \"./xml.js\";\n\nexport async function removeUnusedCellStyles(\n zip: JSZip,\n worksheets: ReadonlyMap<string, string>,\n readBudget: ReadBudget,\n limits: Readonly<ExcelSanitizationLimits>,\n): Promise<void> {\n const stylesFile = zip.file(\"xl/styles.xml\");\n if (!stylesFile) {\n return;\n }\n\n const usedStyles = new Set([0]);\n for (const xml of worksheets.values()) {\n collectStyleReferences(xml, usedStyles);\n }\n\n const stylesXml = await readXmlPart(\n stylesFile,\n \"xl/styles.xml\",\n readBudget,\n limits.maxStylesXmlBytes,\n );\n const cellXfs = findCollection(stylesXml, \"cellXfs\");\n if (!cellXfs) {\n return;\n }\n\n const xfs = matchElements(cellXfs.body, \"xf\");\n // The spread already creates a fresh array, so this sort cannot mutate the source set.\n // oxlint-disable-next-line unicorn/no-array-sort\n const retainedIndexes = [...usedStyles].sort((left, right) => left - right);\n validateStyleIndexes(retainedIndexes, xfs.length);\n const indexMap = new Map(retainedIndexes.map((oldIndex, newIndex) => [oldIndex, newIndex]));\n const retainedStyles = retainedIndexes.map((index) => {\n const style = xfs[index];\n if (style === undefined) {\n throw new Error(`Worksheet references an invalid style index: ${index}`);\n }\n return style;\n });\n\n zip.file(\n \"xl/styles.xml\",\n replaceCollection(stylesXml, \"cellXfs\", retainedStyles.join(\"\"), retainedIndexes.length),\n );\n for (const [worksheetPath, xml] of worksheets) {\n zip.file(worksheetPath, remapWorksheetStyles(xml, indexMap));\n }\n}\n\nfunction validateStyleIndexes(indexes: readonly number[], styleCount: number): void {\n if (indexes.some((index) => !Number.isInteger(index) || index < 0 || index >= styleCount)) {\n throw new Error(\n `Worksheet references an invalid style index (${indexes.join(\",\")} of ${styleCount})`,\n );\n }\n}\n\nexport function collectStyleReferences(xml: string, references: Set<number>): void {\n for (const tag of xml.match(/<(?:\\w+:)?(?:c|row)\\b[^>]*>/gi) ?? []) {\n const value = getAttribute(tag, \"s\");\n if (value !== undefined) {\n references.add(Number(value));\n }\n }\n for (const tag of xml.match(/<(?:\\w+:)?col\\b[^>]*>/gi) ?? []) {\n const value = getAttribute(tag, \"style\");\n if (value !== undefined) {\n references.add(Number(value));\n }\n }\n}\n\nexport function remapWorksheetStyles(xml: string, indexMap: ReadonlyMap<number, number>): string {\n return xml\n .replace(/<(?:\\w+:)?(?:c|row)\\b[^>]*>/gi, (tag) => remapNumericAttribute(tag, \"s\", indexMap))\n .replace(/<(?:\\w+:)?col\\b[^>]*>/gi, (tag) => remapNumericAttribute(tag, \"style\", indexMap));\n}\n\nexport function remapNumericAttribute(\n tag: string,\n attributeName: string,\n indexMap: ReadonlyMap<number, number>,\n): string {\n const expression = new RegExp(`(\\\\s${attributeName}\\\\s*=\\\\s*)([\"'])(\\\\d+)\\\\2`, \"i\");\n return tag.replace(expression, (match: string, prefix: string, quote: string, value: string) => {\n const remapped = indexMap.get(Number(value));\n return remapped === undefined ? match : `${prefix}${quote}${remapped}${quote}`;\n });\n}\n","import JSZip from \"jszip\";\n\nimport { createError } from \"../errors.js\";\nimport type { NormalizedSanitizeOptions, ReadBudget } from \"../types.js\";\nimport { hasZipSignature, validateZipCentralDirectory } from \"../zip/central-directory.js\";\nimport { removeThreadedCommentExtensions, removeWorksheetDrawingMarkup } from \"./cleanup.js\";\nimport { DRAWING_RELATIONSHIP_SUFFIXES, PERSON_RELATIONSHIP_SUFFIXES } from \"./constants.js\";\nimport { readXmlPart, requireXml } from \"./parts.js\";\nimport {\n parseRelationships,\n relationshipFileForPart,\n removeRelationships,\n removeUnreachableParts,\n type Relationship,\n} from \"./relationships.js\";\nimport { removeUnusedCellStyles } from \"./styles.js\";\nimport { getAttribute } from \"./xml.js\";\n\nconst WORKBOOK_PATH = \"xl/workbook.xml\";\nconst WORKBOOK_RELATIONSHIPS_PATH = \"xl/_rels/workbook.xml.rels\";\nconst CONTENT_TYPES_PATH = \"[Content_Types].xml\";\n\ninterface WorkbookContext {\n zip: JSZip;\n readBudget: ReadBudget;\n workbookXml: string;\n workbookRelationshipsXml: string;\n workbookRelationships: Relationship[];\n}\n\nexport async function sanitizeOoxmlWorkbook(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<Buffer> {\n if (!hasZipSignature(buffer)) {\n throw new Error(\"Invalid OOXML ZIP container\");\n }\n validateZipCentralDirectory(buffer, options.limits);\n\n const context = await loadWorkbookContext(buffer, options);\n const worksheetPaths = findWorksheetPaths(\n context.workbookXml,\n context.workbookRelationships,\n options.requireSingleWorksheet,\n );\n const detachedRoots = cleanWorkbookRelationships(context);\n const worksheetXmlByPath = await cleanWorksheets(context, worksheetPaths, detachedRoots, options);\n\n await removeUnreachableParts(context.zip, detachedRoots, context.readBudget, options.limits);\n await removeUnusedCellStyles(context.zip, worksheetXmlByPath, context.readBudget, options.limits);\n return context.zip.generateAsync({\n type: \"nodebuffer\",\n compression: \"DEFLATE\",\n compressionOptions: { level: 6 },\n });\n}\n\nasync function loadWorkbookContext(\n buffer: Buffer,\n options: NormalizedSanitizeOptions,\n): Promise<WorkbookContext> {\n const readBudget: ReadBudget = {\n consumedBytes: 0,\n limitBytes: options.limits.maxXmlBytes,\n };\n\n // CRC verification eagerly inflates every archive entry. Required XML parts\n // are instead inflated lazily below and constrained by per-part budgets.\n const zip = await JSZip.loadAsync(buffer);\n const workbookXml = await requireXml(\n zip,\n WORKBOOK_PATH,\n readBudget,\n options.limits.maxMetadataXmlBytes,\n );\n const workbookRelationshipsXml = await requireXml(\n zip,\n WORKBOOK_RELATIONSHIPS_PATH,\n readBudget,\n options.limits.maxRelationshipsXmlBytes,\n );\n await requireXml(zip, CONTENT_TYPES_PATH, readBudget, options.limits.maxMetadataXmlBytes);\n\n return {\n zip,\n readBudget,\n workbookXml,\n workbookRelationshipsXml,\n workbookRelationships: parseRelationships(workbookRelationshipsXml, WORKBOOK_PATH),\n };\n}\n\nfunction findWorksheetPaths(\n workbookXml: string,\n workbookRelationships: readonly Relationship[],\n requireSingleWorksheet: boolean,\n): string[] {\n const sheetTags = workbookXml.match(/<(?:\\w+:)?sheet\\b[^>]*\\/?>/gi) ?? [];\n enforceWorksheetCount(sheetTags.length, requireSingleWorksheet);\n if (sheetTags.length === 0) {\n throw new Error(\"Workbook contains no sheets\");\n }\n\n const relationshipsById = new Map(\n workbookRelationships.map((relationship) => [relationship.id, relationship]),\n );\n return sheetTags.flatMap((sheetTag) => {\n const id = getAttribute(sheetTag, \"r:id\");\n const relationship = id ? relationshipsById.get(id) : undefined;\n return relationship?.type.endsWith(\"/worksheet\") ? [relationship.target] : [];\n });\n}\n\nfunction cleanWorkbookRelationships(context: WorkbookContext): Set<string> {\n const cleaned = removeRelationships(\n context.workbookRelationshipsXml,\n WORKBOOK_PATH,\n PERSON_RELATIONSHIP_SUFFIXES,\n );\n context.zip.file(WORKBOOK_RELATIONSHIPS_PATH, cleaned.xml);\n return cleaned.targets;\n}\n\nasync function cleanWorksheets(\n context: WorkbookContext,\n worksheetPaths: readonly string[],\n detachedRoots: Set<string>,\n options: NormalizedSanitizeOptions,\n): Promise<Map<string, string>> {\n const worksheetXmlByPath = new Map<string, string>();\n for (const worksheetPath of worksheetPaths) {\n // Reads intentionally stay sequential because they share a mutable byte budget.\n // oxlint-disable-next-line no-await-in-loop\n const worksheetXml = await requireXml(\n context.zip,\n worksheetPath,\n context.readBudget,\n options.limits.maxWorksheetXmlBytes,\n );\n const cleanedWorksheetXml = removeThreadedCommentExtensions(\n removeWorksheetDrawingMarkup(worksheetXml),\n );\n worksheetXmlByPath.set(worksheetPath, cleanedWorksheetXml);\n context.zip.file(worksheetPath, cleanedWorksheetXml);\n\n // Relationship reads consume the same shared byte budget as worksheet reads.\n // oxlint-disable-next-line no-await-in-loop\n await cleanWorksheetRelationships(context, worksheetPath, detachedRoots, options);\n }\n return worksheetXmlByPath;\n}\n\nasync function cleanWorksheetRelationships(\n context: WorkbookContext,\n worksheetPath: string,\n detachedRoots: Set<string>,\n options: NormalizedSanitizeOptions,\n): Promise<void> {\n const relationshipsPath = relationshipFileForPart(worksheetPath);\n const relationshipsFile = context.zip.file(relationshipsPath);\n if (!relationshipsFile) {\n return;\n }\n\n const cleaned = removeRelationships(\n await readXmlPart(\n relationshipsFile,\n relationshipsPath,\n context.readBudget,\n options.limits.maxRelationshipsXmlBytes,\n ),\n worksheetPath,\n DRAWING_RELATIONSHIP_SUFFIXES,\n );\n context.zip.file(relationshipsPath, cleaned.xml);\n for (const target of cleaned.targets) {\n detachedRoots.add(target);\n }\n}\n\nfunction enforceWorksheetCount(count: number, required: boolean): void {\n if (required && count !== 1) {\n throw createError(\"ERR_WORKSHEET_COUNT\", {\n details: { expected: 1, actual: count },\n });\n }\n}\n","import type { ExcelSanitizationLimits } from \"./types.js\";\n\nexport const DEFAULT_LIMITS: Readonly<ExcelSanitizationLimits> = Object.freeze({\n maxEntryCount: 10_000,\n maxUncompressedBytes: 512 * 1024 * 1024,\n maxXmlBytes: 512 * 1024 * 1024,\n maxWorksheetXmlBytes: 256 * 1024 * 1024,\n maxStylesXmlBytes: 64 * 1024 * 1024,\n maxMetadataXmlBytes: 16 * 1024 * 1024,\n maxRelationshipsXmlBytes: 8 * 1024 * 1024,\n});\n\nexport const SANITIZE_OPTION_NAMES: ReadonlySet<string> = new Set([\n \"requireSingleWorksheet\",\n \"limits\",\n]);\n\nexport const FILE_OPTION_NAMES: ReadonlySet<string> = new Set([\n \"requireSingleWorksheet\",\n \"limits\",\n \"overwrite\",\n]);\n\nexport const LIMIT_NAMES: ReadonlySet<string> = new Set([\n \"maxEntryCount\",\n \"maxUncompressedBytes\",\n \"maxXmlBytes\",\n \"maxWorksheetXmlBytes\",\n \"maxStylesXmlBytes\",\n \"maxMetadataXmlBytes\",\n \"maxRelationshipsXmlBytes\",\n]);\n","import {\n DEFAULT_LIMITS,\n FILE_OPTION_NAMES,\n LIMIT_NAMES,\n SANITIZE_OPTION_NAMES,\n} from \"./constants.js\";\nimport { createError } from \"./errors.js\";\nimport type {\n ExcelSanitizationLimits,\n NormalizedFileOptions,\n NormalizedSanitizeOptions,\n} from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateKnownKeys(\n value: Readonly<Record<string, unknown>>,\n knownKeys: ReadonlySet<string>,\n label: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!knownKeys.has(key)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `Unknown ${label}: ${key}`,\n details: { key },\n });\n }\n }\n}\n\nfunction isLimitName(name: string): name is keyof ExcelSanitizationLimits {\n return LIMIT_NAMES.has(name);\n}\n\nexport function normalizeLimits(overrides: unknown): Readonly<ExcelSanitizationLimits> {\n if (overrides === undefined) {\n return DEFAULT_LIMITS;\n }\n if (!isRecord(overrides)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.limits must be an object\",\n });\n }\n\n validateKnownKeys(overrides, LIMIT_NAMES, \"limit\");\n const limits: ExcelSanitizationLimits = { ...DEFAULT_LIMITS };\n for (const [name, value] of Object.entries(overrides)) {\n if (!isLimitName(name)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `Unknown limit: ${name}`,\n details: { key: name },\n });\n }\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: `options.limits.${name} must be a positive safe integer`,\n details: { limit: name, value },\n });\n }\n limits[name] = value;\n }\n return Object.freeze(limits);\n}\n\nexport function normalizeOptions(options: unknown, fileOptions: true): NormalizedFileOptions;\nexport function normalizeOptions(options?: unknown, fileOptions?: false): NormalizedSanitizeOptions;\nexport function normalizeOptions(\n options?: unknown,\n fileOptions = false,\n): NormalizedSanitizeOptions | NormalizedFileOptions {\n if (options !== undefined && !isRecord(options)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options must be an object\",\n });\n }\n\n const rawOptions = options ?? {};\n validateKnownKeys(rawOptions, fileOptions ? FILE_OPTION_NAMES : SANITIZE_OPTION_NAMES, \"option\");\n if (\n rawOptions.requireSingleWorksheet !== undefined &&\n typeof rawOptions.requireSingleWorksheet !== \"boolean\"\n ) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.requireSingleWorksheet must be a boolean\",\n });\n }\n\n let normalizedOverwrite = false;\n if (fileOptions) {\n const overwrite = rawOptions.overwrite;\n if (overwrite !== undefined && typeof overwrite !== \"boolean\") {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"options.overwrite must be a boolean\",\n });\n }\n normalizedOverwrite = overwrite ?? false;\n }\n\n const normalized: NormalizedSanitizeOptions = {\n requireSingleWorksheet: rawOptions.requireSingleWorksheet ?? false,\n limits: normalizeLimits(rawOptions.limits),\n };\n if (!fileOptions) {\n return normalized;\n }\n return { ...normalized, overwrite: normalizedOverwrite };\n}\n","import { hasCompoundFileSignature, sanitizeBiffWorkbook } from \"../biff/workbook.js\";\nimport { ExcelSanitizationError, createError } from \"../errors.js\";\nimport { sanitizeOoxmlWorkbook } from \"../ooxml/workbook.js\";\nimport { normalizeOptions } from \"../options.js\";\nimport type { SanitizeExcelOptions } from \"../types.js\";\n\nexport async function sanitizeExcel(\n buffer: Buffer,\n options?: SanitizeExcelOptions,\n): Promise<Buffer> {\n if (!Buffer.isBuffer(buffer)) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"buffer must be a Node.js Buffer\",\n });\n }\n\n const normalized = normalizeOptions(options);\n const isBiff = hasCompoundFileSignature(buffer);\n try {\n return isBiff\n ? await sanitizeBiffWorkbook(buffer, normalized)\n : await sanitizeOoxmlWorkbook(buffer, normalized);\n } catch (error) {\n if (error instanceof ExcelSanitizationError) {\n throw error;\n }\n throw createError(isBiff ? \"ERR_INVALID_XLS\" : \"ERR_INVALID_XLSX\", { cause: error });\n }\n}\n","export type ExcelFileFormat = \"xls\" | \"xlsx\" | \"xlsm\";\n\nexport function excelFileFormat(name: unknown): ExcelFileFormat | undefined {\n if (typeof name !== \"string\") {\n return undefined;\n }\n const extension = /\\.(xls|xlsx|xlsm)$/i.exec(name)?.[1]?.toLowerCase();\n return extension === \"xls\" || extension === \"xlsx\" || extension === \"xlsm\"\n ? extension\n : undefined;\n}\n\nexport function isExcelFilename(name: unknown): name is string {\n return excelFileFormat(name) !== undefined;\n}\n\nexport function isXlsxFilename(name: unknown): name is string {\n return excelFileFormat(name) === \"xlsx\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { hasCompoundFileSignature } from \"../biff/workbook.js\";\nimport { createError } from \"../errors.js\";\nimport { excelFileFormat, isExcelFilename, isXlsxFilename } from \"../formats.js\";\nimport type { ExcelFileFormat } from \"../formats.js\";\nimport { normalizeOptions } from \"../options.js\";\nimport type { SanitizeExcelFileOptions } from \"../types.js\";\nimport { sanitizeExcel } from \"./sanitize-excel.js\";\n\nexport { isExcelFilename, isXlsxFilename };\n\nexport async function sanitizeExcelFile(\n inputPath: string,\n outputPath: string,\n options?: SanitizeExcelFileOptions,\n): Promise<void> {\n const format = validateFilePaths(inputPath, outputPath);\n const normalized = normalizeOptions(options, true);\n const absoluteInputPath = resolve(inputPath);\n const absoluteOutputPath = resolve(outputPath);\n if (absoluteInputPath === absoluteOutputPath) {\n throw createError(\"ERR_SAME_PATH\", {\n details: { inputPath: absoluteInputPath, outputPath: absoluteOutputPath },\n });\n }\n\n const input = await readInputFile(absoluteInputPath);\n validateInputFormat(input, format);\n const sanitized = await sanitizeExcel(input, {\n requireSingleWorksheet: normalized.requireSingleWorksheet,\n limits: normalized.limits,\n });\n\n if (normalized.overwrite) {\n await replaceFileAtomically(absoluteOutputPath, sanitized);\n } else {\n await writeNewFile(absoluteOutputPath, sanitized);\n }\n}\n\nfunction validateFilePaths(inputPath: string, outputPath: string): ExcelFileFormat {\n if (\n typeof inputPath !== \"string\" ||\n inputPath.length === 0 ||\n typeof outputPath !== \"string\" ||\n outputPath.length === 0\n ) {\n throw createError(\"ERR_INVALID_ARGUMENT\", {\n message: \"inputPath and outputPath must be non-empty strings\",\n });\n }\n const inputFormat = excelFileFormat(inputPath);\n const outputFormat = excelFileFormat(outputPath);\n if (!inputFormat || !outputFormat || inputFormat !== outputFormat) {\n throw createError(\"ERR_UNSUPPORTED_EXTENSION\", {\n details: { inputPath, outputPath, inputFormat, outputFormat },\n });\n }\n return inputFormat;\n}\n\nfunction validateInputFormat(input: Buffer, format: ExcelFileFormat): void {\n const isXls = hasCompoundFileSignature(input);\n if ((format === \"xls\") !== isXls) {\n throw createError(format === \"xls\" ? \"ERR_INVALID_XLS\" : \"ERR_INVALID_XLSX\", {\n details: { format },\n });\n }\n}\n\nasync function readInputFile(inputPath: string): Promise<Buffer> {\n try {\n return await readFile(inputPath);\n } catch (error) {\n throw createError(\"ERR_FILE_READ\", {\n cause: error,\n details: { inputPath },\n });\n }\n}\n\nasync function writeNewFile(outputPath: string, contents: Buffer): Promise<void> {\n try {\n await writeFile(outputPath, contents, { flag: \"wx\" });\n } catch (error) {\n if (hasErrorCode(error, \"EEXIST\")) {\n throw createError(\"ERR_OUTPUT_EXISTS\", {\n cause: error,\n details: { outputPath },\n });\n }\n await removeIfPresent(outputPath);\n throw createError(\"ERR_FILE_WRITE\", {\n cause: error,\n details: { outputPath },\n });\n }\n}\n\nasync function replaceFileAtomically(outputPath: string, contents: Buffer): Promise<void> {\n const temporaryPath = `${outputPath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, contents, { flag: \"wx\" });\n await rename(temporaryPath, outputPath);\n } catch (error) {\n await removeIfPresent(temporaryPath);\n throw createError(\"ERR_FILE_WRITE\", {\n cause: error,\n details: { outputPath },\n });\n }\n}\n\nfunction hasErrorCode(error: unknown, expectedCode: string): boolean {\n return (\n typeof error === \"object\" && error !== null && \"code\" in error && error.code === expectedCode\n );\n}\n\nasync function removeIfPresent(path: string): Promise<void> {\n await unlink(path).catch(() => undefined);\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clear-excel",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Safely remove drawings, comments, and embedded objects from XLS, XLSX, and XLSM workbooks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"comments",
|
|
7
7
|
"excel",
|
|
8
|
+
"excel-sanitizer",
|
|
8
9
|
"images",
|
|
10
|
+
"ole",
|
|
9
11
|
"ooxml",
|
|
12
|
+
"remove-comments",
|
|
13
|
+
"remove-images",
|
|
10
14
|
"sanitize",
|
|
11
15
|
"styles",
|
|
12
16
|
"xls",
|
|
@@ -26,6 +30,7 @@
|
|
|
26
30
|
"files": [
|
|
27
31
|
"dist",
|
|
28
32
|
"README.md",
|
|
33
|
+
"CHANGELOG.md",
|
|
29
34
|
"LICENSE"
|
|
30
35
|
],
|
|
31
36
|
"type": "module",
|
|
@@ -45,18 +50,18 @@
|
|
|
45
50
|
"scripts": {
|
|
46
51
|
"build:js": "vite build",
|
|
47
52
|
"build:types": "tsc --project tsconfig.build.json",
|
|
48
|
-
"build": "
|
|
53
|
+
"build": "pnpm run build:js && pnpm run build:types",
|
|
49
54
|
"check:types": "tsc --project tsconfig.json",
|
|
50
55
|
"lint": "oxlint --deny-warnings .",
|
|
51
56
|
"lint:fix": "oxlint --fix .",
|
|
52
57
|
"format": "oxfmt --write .",
|
|
53
58
|
"format:check": "oxfmt --check .",
|
|
54
59
|
"test": "tsx --test test/*.test.ts",
|
|
55
|
-
"pack:dry-run": "
|
|
60
|
+
"pack:dry-run": "pnpm --config.ignore-scripts=true pack --dry-run",
|
|
56
61
|
"test:package": "tsx scripts/verify-package.ts",
|
|
57
|
-
"check": "
|
|
58
|
-
"prepack": "
|
|
59
|
-
"prepublishOnly": "
|
|
62
|
+
"check": "pnpm run format:check && pnpm run lint && pnpm run check:types && pnpm test && pnpm run build && pnpm run pack:dry-run && pnpm run test:package",
|
|
63
|
+
"prepack": "pnpm run build",
|
|
64
|
+
"prepublishOnly": "pnpm run check"
|
|
60
65
|
},
|
|
61
66
|
"dependencies": {
|
|
62
67
|
"cfb": "1.2.2",
|
|
@@ -78,5 +83,6 @@
|
|
|
78
83
|
},
|
|
79
84
|
"engines": {
|
|
80
85
|
"node": ">=22"
|
|
81
|
-
}
|
|
86
|
+
},
|
|
87
|
+
"packageManager": "pnpm@11.22.0"
|
|
82
88
|
}
|