@zip.js/zip.js 2.8.25 → 2.8.28
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/README.md +2 -2
- package/deno.json +1 -1
- package/dist/zip-core.js +1050 -569
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +1146 -617
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +1207 -627
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +1279 -681
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +1051 -570
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +1053 -572
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +1125 -626
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +6 -1
- package/index-native.cjs +1207 -627
- package/index-native.min.js +1 -1
- package/index.cjs +1279 -681
- package/index.d.ts +2451 -2355
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +39 -1
- package/lib/core/codec-worker.js +120 -34
- package/lib/core/configuration.js +3 -0
- package/lib/core/constants.js +6 -0
- package/lib/core/io.js +55 -25
- package/lib/core/options.js +2 -0
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/streams/codec-stream.js +11 -5
- package/lib/core/streams/codecs/sjcl.js +1 -33
- package/lib/core/streams/common-crypto.js +4 -4
- package/lib/core/streams/zip-crypto-stream.js +25 -15
- package/lib/core/streams/zip-entry-stream.js +35 -1
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/streams/zlib-wasm/zlib-streams.js +73 -55
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/util/decode-cp437.js +1 -1
- package/lib/core/util/decode-text.js +2 -1
- package/lib/core/web-worker-base.js +12 -4
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +154 -55
- package/lib/core/zip-reader.js +185 -67
- package/lib/core/zip-writer.js +613 -376
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-reader.js +3 -1
- package/lib/zip-core-writer.js +1 -0
- package/package.json +20 -6
package/dist/zip-fs-native.js
CHANGED
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
|
|
51
51
|
const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
|
|
52
52
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
|
|
53
|
+
const CENTRAL_FILE_HEADER_LENGTH = 46;
|
|
53
54
|
const END_OF_CENTRAL_DIR_LENGTH = 22;
|
|
54
55
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
|
|
55
56
|
const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
|
|
@@ -97,9 +98,11 @@
|
|
|
97
98
|
const DIRECTORY_SIGNATURE = "/";
|
|
98
99
|
|
|
99
100
|
const HEADER_SIZE = 30;
|
|
101
|
+
const HEADER_OFFSET_VERSION = 0;
|
|
100
102
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
101
103
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
102
104
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
105
|
+
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
103
106
|
|
|
104
107
|
const MAX_DATE = new Date(2107, 11, 31);
|
|
105
108
|
const MIN_DATE = new Date(1980, 0, 1);
|
|
@@ -154,6 +157,7 @@
|
|
|
154
157
|
chunkSize: 64 * 1024,
|
|
155
158
|
maxWorkers,
|
|
156
159
|
terminateWorkerTimeout: 5000,
|
|
160
|
+
workerStarvationTimeout: 5000,
|
|
157
161
|
useWebWorkers: true,
|
|
158
162
|
useCompressionStream: true,
|
|
159
163
|
CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
|
|
@@ -176,6 +180,7 @@
|
|
|
176
180
|
chunkSize,
|
|
177
181
|
maxWorkers,
|
|
178
182
|
terminateWorkerTimeout,
|
|
183
|
+
workerStarvationTimeout,
|
|
179
184
|
useCompressionStream,
|
|
180
185
|
useWebWorkers,
|
|
181
186
|
CompressionStream,
|
|
@@ -191,6 +196,7 @@
|
|
|
191
196
|
setIfDefined("chunkSize", chunkSize);
|
|
192
197
|
setIfDefined("maxWorkers", maxWorkers);
|
|
193
198
|
setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
|
|
199
|
+
setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
|
|
194
200
|
setIfDefined("useCompressionStream", useCompressionStream);
|
|
195
201
|
setIfDefined("useWebWorkers", useWebWorkers);
|
|
196
202
|
setIfDefined("CompressionStream", CompressionStream);
|
|
@@ -205,7 +211,7 @@
|
|
|
205
211
|
}
|
|
206
212
|
}
|
|
207
213
|
|
|
208
|
-
const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let C=0;B>C;C+=4){const B=A.indexOf(g[C])<<18|A.indexOf(g[C+1])<<12|(63&A.indexOf(g[C+2]))<<6|63&A.indexOf(g[C+3]);I.push(B>>16&255),"="!==g[C+2]&&I.push(B>>8&255),"="!==g[C+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const E=g[A++];if(128&E){const Q=3+(127&E),Y=g[A++]<<8|g[A++],F=I-Y;C(I+Q);for(let A=0;Q>A;A++)B[I++]=B[F+A];}else {const Q=E;C(I+Q);for(let C=0;Q>C&&A<g.length;C++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let C=0;for(;I>C+2;C+=3){const I=g[C]<<16|g[C+1]<<8|g[C+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const E=I-C;if(1===E){const I=g[C]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===E){const I=g[C]<<16|g[C+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function C(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const C=new Uint8Array(g);C.set(B.subarray(0,I)),B=C;}}})("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");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
|
|
214
|
+
const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let E=0;B>E;E+=4){const B=A.indexOf(g[E])<<18|A.indexOf(g[E+1])<<12|(63&A.indexOf(g[E+2]))<<6|63&A.indexOf(g[E+3]);I.push(B>>16&255),"="!==g[E+2]&&I.push(B>>8&255),"="!==g[E+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const C=g[A++];if(128&C){const Q=3+(127&C),Y=g[A++]<<8|g[A++],F=I-Y;E(I+Q);for(let A=0;Q>A;A++)B[I++]=B[F+A];}else {const Q=C;E(I+Q);for(let E=0;Q>E&&A<g.length;E++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let E=0;for(;I>E+2;E+=3){const I=g[E]<<16|g[E+1]<<8|g[E+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const C=I-E;if(1===C){const I=g[E]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===C){const I=g[E]<<16|g[E+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function E(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const E=new Uint8Array(g);E.set(B.subarray(0,I)),B=E;}}})("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");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
|
|
209
215
|
|
|
210
216
|
/*
|
|
211
217
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -954,37 +960,6 @@
|
|
|
954
960
|
}
|
|
955
961
|
};
|
|
956
962
|
|
|
957
|
-
/**
|
|
958
|
-
* Random values
|
|
959
|
-
* @namespace
|
|
960
|
-
*/
|
|
961
|
-
const random = {
|
|
962
|
-
/**
|
|
963
|
-
* Generate random words with pure js, cryptographically not as strong & safe as native implementation.
|
|
964
|
-
* @param {TypedArray} typedArray The array to fill.
|
|
965
|
-
* @return {TypedArray} The random values.
|
|
966
|
-
*/
|
|
967
|
-
getRandomValues(typedArray) {
|
|
968
|
-
const words = new Uint32Array(typedArray.buffer);
|
|
969
|
-
const r = (m_w) => {
|
|
970
|
-
let m_z = 0x3ade68b1;
|
|
971
|
-
const mask = 0xffffffff;
|
|
972
|
-
return function () {
|
|
973
|
-
m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
|
|
974
|
-
m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
|
|
975
|
-
const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
|
|
976
|
-
return result * (Math.random() > .5 ? 1 : -1);
|
|
977
|
-
};
|
|
978
|
-
};
|
|
979
|
-
for (let i = 0, rcache; i < typedArray.length; i += 4) {
|
|
980
|
-
const _r = r((rcache || Math.random()) * 0x100000000);
|
|
981
|
-
rcache = _r() * 0x3ade67b7;
|
|
982
|
-
words[i / 4] = (_r() * 0x100000000) | 0;
|
|
983
|
-
}
|
|
984
|
-
return typedArray;
|
|
985
|
-
}
|
|
986
|
-
};
|
|
987
|
-
|
|
988
963
|
/** @fileOverview CTR mode implementation.
|
|
989
964
|
*
|
|
990
965
|
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
@@ -1215,12 +1190,15 @@
|
|
|
1215
1190
|
const ERR_INVALID_PASSWORD = "Invalid password";
|
|
1216
1191
|
const ERR_INVALID_SIGNATURE = "Invalid signature";
|
|
1217
1192
|
const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
|
|
1193
|
+
const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
|
|
1218
1194
|
|
|
1219
1195
|
function getRandomValues(array) {
|
|
1220
1196
|
if (GET_RANDOM_VALUES_SUPPORTED) {
|
|
1221
1197
|
return crypto.getRandomValues(array);
|
|
1222
1198
|
} else {
|
|
1223
|
-
|
|
1199
|
+
// all supported runtimes expose crypto.getRandomValues; failing hard beats
|
|
1200
|
+
// silently generating predictable encryption salts
|
|
1201
|
+
throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
|
|
1224
1202
|
}
|
|
1225
1203
|
}
|
|
1226
1204
|
|
|
@@ -1279,13 +1257,12 @@
|
|
|
1279
1257
|
|
|
1280
1258
|
class AESDecryptionStream extends TransformStream {
|
|
1281
1259
|
|
|
1282
|
-
constructor({ password, rawPassword,
|
|
1260
|
+
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
|
|
1283
1261
|
super({
|
|
1284
1262
|
start() {
|
|
1285
1263
|
Object.assign(this, {
|
|
1286
1264
|
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1287
1265
|
password: encodePassword(password, rawPassword),
|
|
1288
|
-
signed,
|
|
1289
1266
|
strength: encryptionStrength - 1,
|
|
1290
1267
|
pending: new Uint8Array()
|
|
1291
1268
|
});
|
|
@@ -1314,7 +1291,6 @@
|
|
|
1314
1291
|
},
|
|
1315
1292
|
async flush(controller) {
|
|
1316
1293
|
const {
|
|
1317
|
-
signed,
|
|
1318
1294
|
ctr,
|
|
1319
1295
|
hmac,
|
|
1320
1296
|
pending,
|
|
@@ -1331,13 +1307,15 @@
|
|
|
1331
1307
|
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1332
1308
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1333
1309
|
}
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1310
|
+
const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
|
|
1311
|
+
// branch-free comparison: accumulate the differences instead of
|
|
1312
|
+
// short-circuiting on the first mismatching byte
|
|
1313
|
+
let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
|
|
1314
|
+
for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
|
|
1315
|
+
invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
|
|
1316
|
+
}
|
|
1317
|
+
if (invalidSignature) {
|
|
1318
|
+
throw new Error(ERR_INVALID_SIGNATURE);
|
|
1341
1319
|
}
|
|
1342
1320
|
controller.enqueue(decryptedChunkArray);
|
|
1343
1321
|
}
|
|
@@ -1409,11 +1387,11 @@
|
|
|
1409
1387
|
hmac,
|
|
1410
1388
|
pending
|
|
1411
1389
|
} = aesCrypto;
|
|
1412
|
-
const inputLength = input.length - paddingEnd;
|
|
1413
1390
|
if (pending.length) {
|
|
1414
1391
|
input = concat(pending, input);
|
|
1415
|
-
output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
|
|
1416
1392
|
}
|
|
1393
|
+
const inputLength = input.length - paddingEnd;
|
|
1394
|
+
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
1417
1395
|
let offset;
|
|
1418
1396
|
for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
|
|
1419
1397
|
const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
|
|
@@ -1561,21 +1539,24 @@
|
|
|
1561
1539
|
|
|
1562
1540
|
class ZipCryptoDecryptionStream extends TransformStream {
|
|
1563
1541
|
|
|
1564
|
-
constructor({ password, passwordVerification, checkPasswordOnly }) {
|
|
1542
|
+
constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
|
|
1565
1543
|
super({
|
|
1566
1544
|
start() {
|
|
1567
1545
|
Object.assign(this, {
|
|
1568
1546
|
password,
|
|
1547
|
+
rawPassword,
|
|
1569
1548
|
passwordVerification
|
|
1570
1549
|
});
|
|
1571
|
-
createKeys(this, password);
|
|
1550
|
+
createKeys(this, password, rawPassword);
|
|
1572
1551
|
},
|
|
1573
1552
|
transform(chunk, controller) {
|
|
1574
1553
|
const zipCrypto = this;
|
|
1575
|
-
if (zipCrypto.password) {
|
|
1554
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1576
1555
|
const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
|
|
1577
|
-
zipCrypto.password = null;
|
|
1578
|
-
|
|
1556
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1557
|
+
// verify the password with a branch-free comparison of the verification byte, mirroring
|
|
1558
|
+
// the constant-time AES HMAC signature check
|
|
1559
|
+
if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
|
|
1579
1560
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1580
1561
|
}
|
|
1581
1562
|
chunk = chunk.subarray(HEADER_LENGTH);
|
|
@@ -1592,21 +1573,22 @@
|
|
|
1592
1573
|
|
|
1593
1574
|
class ZipCryptoEncryptionStream extends TransformStream {
|
|
1594
1575
|
|
|
1595
|
-
constructor({ password, passwordVerification }) {
|
|
1576
|
+
constructor({ password, rawPassword, passwordVerification }) {
|
|
1596
1577
|
super({
|
|
1597
1578
|
start() {
|
|
1598
1579
|
Object.assign(this, {
|
|
1599
1580
|
password,
|
|
1581
|
+
rawPassword,
|
|
1600
1582
|
passwordVerification
|
|
1601
1583
|
});
|
|
1602
|
-
createKeys(this, password);
|
|
1584
|
+
createKeys(this, password, rawPassword);
|
|
1603
1585
|
},
|
|
1604
1586
|
transform(chunk, controller) {
|
|
1605
1587
|
const zipCrypto = this;
|
|
1606
1588
|
let output;
|
|
1607
1589
|
let offset;
|
|
1608
|
-
if (zipCrypto.password) {
|
|
1609
|
-
zipCrypto.password = null;
|
|
1590
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1591
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1610
1592
|
const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
|
|
1611
1593
|
header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
|
|
1612
1594
|
output = new Uint8Array(chunk.length + header.length);
|
|
@@ -1641,25 +1623,31 @@
|
|
|
1641
1623
|
return output;
|
|
1642
1624
|
}
|
|
1643
1625
|
|
|
1644
|
-
function createKeys(target, password) {
|
|
1626
|
+
function createKeys(target, password, rawPassword) {
|
|
1645
1627
|
const keys = [0x12345678, 0x23456789, 0x34567890];
|
|
1646
1628
|
Object.assign(target, {
|
|
1647
1629
|
keys,
|
|
1648
1630
|
crcKey0: new Crc32(keys[0]),
|
|
1649
1631
|
crcKey2: new Crc32(keys[2])
|
|
1650
1632
|
});
|
|
1651
|
-
|
|
1652
|
-
|
|
1633
|
+
if (rawPassword) {
|
|
1634
|
+
for (let index = 0; index < rawPassword.length; index++) {
|
|
1635
|
+
updateKeys(target, rawPassword[index]);
|
|
1636
|
+
}
|
|
1637
|
+
} else {
|
|
1638
|
+
for (let index = 0; index < password.length; index++) {
|
|
1639
|
+
updateKeys(target, password.charCodeAt(index));
|
|
1640
|
+
}
|
|
1653
1641
|
}
|
|
1654
1642
|
}
|
|
1655
1643
|
|
|
1656
1644
|
function updateKeys(target, byte) {
|
|
1657
|
-
let [
|
|
1645
|
+
let [, key1] = target.keys;
|
|
1658
1646
|
target.crcKey0.append([byte]);
|
|
1659
|
-
key0 = ~target.crcKey0.get();
|
|
1647
|
+
const key0 = ~target.crcKey0.get();
|
|
1660
1648
|
key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
|
|
1661
1649
|
target.crcKey2.append([key1 >>> 24]);
|
|
1662
|
-
key2 = ~target.crcKey2.get();
|
|
1650
|
+
const key2 = ~target.crcKey2.get();
|
|
1663
1651
|
target.keys = [key0, key1, key2];
|
|
1664
1652
|
}
|
|
1665
1653
|
|
|
@@ -1706,6 +1694,7 @@
|
|
|
1706
1694
|
|
|
1707
1695
|
|
|
1708
1696
|
const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
|
|
1697
|
+
const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
|
|
1709
1698
|
const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
1710
1699
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
1711
1700
|
|
|
@@ -1762,6 +1751,7 @@
|
|
|
1762
1751
|
}
|
|
1763
1752
|
if (compressed) {
|
|
1764
1753
|
readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
|
|
1754
|
+
readable = mapInflateStreamError(readable);
|
|
1765
1755
|
}
|
|
1766
1756
|
if ((!encrypted || zipCrypto) && signed) {
|
|
1767
1757
|
crc32Stream = new Crc32Stream();
|
|
@@ -1812,6 +1802,37 @@
|
|
|
1812
1802
|
return readable.pipeThrough(transformStream);
|
|
1813
1803
|
}
|
|
1814
1804
|
|
|
1805
|
+
// DecompressionStream implementations can fail with a message-less TypeError on malformed
|
|
1806
|
+
// input; give these errors an identifiable message (errors raised by the other stages of
|
|
1807
|
+
// the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
|
|
1808
|
+
function mapInflateStreamError(readable) {
|
|
1809
|
+
const reader = readable.getReader();
|
|
1810
|
+
return new ReadableStream({
|
|
1811
|
+
async pull(controller) {
|
|
1812
|
+
let result;
|
|
1813
|
+
try {
|
|
1814
|
+
result = await reader.read();
|
|
1815
|
+
} catch (error) {
|
|
1816
|
+
if (error && error.message) {
|
|
1817
|
+
throw error;
|
|
1818
|
+
}
|
|
1819
|
+
const mappedError = new Error(ERR_INVALID_COMPRESSED_DATA);
|
|
1820
|
+
mappedError.cause = error;
|
|
1821
|
+
throw mappedError;
|
|
1822
|
+
}
|
|
1823
|
+
const { value, done } = result;
|
|
1824
|
+
if (done) {
|
|
1825
|
+
controller.close();
|
|
1826
|
+
} else {
|
|
1827
|
+
controller.enqueue(value);
|
|
1828
|
+
}
|
|
1829
|
+
},
|
|
1830
|
+
cancel(reason) {
|
|
1831
|
+
return reader.cancel(reason);
|
|
1832
|
+
}
|
|
1833
|
+
});
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1815
1836
|
/*
|
|
1816
1837
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1817
1838
|
|
|
@@ -1841,6 +1862,7 @@
|
|
|
1841
1862
|
*/
|
|
1842
1863
|
|
|
1843
1864
|
|
|
1865
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
1844
1866
|
const MESSAGE_EVENT_TYPE = "message";
|
|
1845
1867
|
const MESSAGE_START = "start";
|
|
1846
1868
|
const MESSAGE_PULL = "pull";
|
|
@@ -1909,6 +1931,9 @@
|
|
|
1909
1931
|
|
|
1910
1932
|
constructor(chunkSize) {
|
|
1911
1933
|
let pendingChunk;
|
|
1934
|
+
if (!(chunkSize >= 1)) {
|
|
1935
|
+
chunkSize = DEFAULT_CHUNK_SIZE$1;
|
|
1936
|
+
}
|
|
1912
1937
|
super({
|
|
1913
1938
|
transform,
|
|
1914
1939
|
flush(controller) {
|
|
@@ -1926,12 +1951,12 @@
|
|
|
1926
1951
|
chunk = newChunk;
|
|
1927
1952
|
pendingChunk = null;
|
|
1928
1953
|
}
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
pendingChunk = chunk;
|
|
1954
|
+
let offset = 0;
|
|
1955
|
+
while (chunk.length - offset > chunkSize) {
|
|
1956
|
+
controller.enqueue(chunk.slice(offset, offset + chunkSize));
|
|
1957
|
+
offset += chunkSize;
|
|
1934
1958
|
}
|
|
1959
|
+
pendingChunk = offset ? chunk.slice(offset) : chunk;
|
|
1935
1960
|
}
|
|
1936
1961
|
}
|
|
1937
1962
|
}
|
|
@@ -1966,8 +1991,10 @@
|
|
|
1966
1991
|
|
|
1967
1992
|
|
|
1968
1993
|
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
1994
|
+
const ERROR_EVENT_TYPE = "error";
|
|
1995
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
1969
1996
|
|
|
1970
|
-
let webWorkerSupported, webWorkerURI, webWorkerOptions;
|
|
1997
|
+
let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
1971
1998
|
let transferStreamsSupported = true;
|
|
1972
1999
|
try {
|
|
1973
2000
|
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
@@ -1982,8 +2009,9 @@
|
|
|
1982
2009
|
const { signal } = streamOptions;
|
|
1983
2010
|
Object.assign(workerData, {
|
|
1984
2011
|
busy: true,
|
|
2012
|
+
generation: (workerData.generation || 0) + 1,
|
|
1985
2013
|
readable: readable
|
|
1986
|
-
.pipeThrough(new ChunkStream(config
|
|
2014
|
+
.pipeThrough(new ChunkStream(getChunkSize(config)))
|
|
1987
2015
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
1988
2016
|
writable,
|
|
1989
2017
|
options: Object.assign({}, options),
|
|
@@ -2006,15 +2034,17 @@
|
|
|
2006
2034
|
});
|
|
2007
2035
|
},
|
|
2008
2036
|
onTaskFinished() {
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2037
|
+
if (workerData.busy) {
|
|
2038
|
+
const { resolveTerminated } = workerData;
|
|
2039
|
+
if (resolveTerminated) {
|
|
2040
|
+
workerData.resolveTerminated = null;
|
|
2041
|
+
workerData.terminated = true;
|
|
2042
|
+
workerData.worker.terminate();
|
|
2043
|
+
resolveTerminated();
|
|
2044
|
+
}
|
|
2045
|
+
workerData.busy = false;
|
|
2046
|
+
onTaskFinished(workerData);
|
|
2015
2047
|
}
|
|
2016
|
-
workerData.busy = false;
|
|
2017
|
-
onTaskFinished(workerData);
|
|
2018
2048
|
}
|
|
2019
2049
|
});
|
|
2020
2050
|
if (webWorkerSupported === UNDEFINED_VALUE) {
|
|
@@ -2083,6 +2113,7 @@
|
|
|
2083
2113
|
}
|
|
2084
2114
|
Object.assign(workerData, {
|
|
2085
2115
|
worker,
|
|
2116
|
+
terminated: false,
|
|
2086
2117
|
interface: {
|
|
2087
2118
|
run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
|
|
2088
2119
|
}
|
|
@@ -2137,37 +2168,85 @@
|
|
|
2137
2168
|
result
|
|
2138
2169
|
});
|
|
2139
2170
|
const { readable, options } = workerData;
|
|
2140
|
-
const { writable, closed } = watchClosedStream(workerData.writable);
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2171
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2172
|
+
let streamsTransferred;
|
|
2173
|
+
try {
|
|
2174
|
+
streamsTransferred = sendMessage({
|
|
2175
|
+
type: MESSAGE_START,
|
|
2176
|
+
options,
|
|
2177
|
+
config,
|
|
2178
|
+
readable,
|
|
2179
|
+
writable
|
|
2180
|
+
}, workerData);
|
|
2181
|
+
} catch (error) {
|
|
2182
|
+
abortPipe();
|
|
2183
|
+
try {
|
|
2184
|
+
await closed;
|
|
2185
|
+
} catch {
|
|
2186
|
+
// ignored
|
|
2187
|
+
}
|
|
2188
|
+
workerData.onTaskFinished();
|
|
2189
|
+
throw error;
|
|
2190
|
+
}
|
|
2148
2191
|
if (!streamsTransferred) {
|
|
2149
2192
|
Object.assign(workerData, {
|
|
2150
2193
|
reader: readable.getReader(),
|
|
2151
2194
|
writer: writable.getWriter()
|
|
2152
2195
|
});
|
|
2153
2196
|
}
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
await
|
|
2197
|
+
try {
|
|
2198
|
+
const resultValue = await result;
|
|
2199
|
+
await closeWritable();
|
|
2200
|
+
await closed;
|
|
2201
|
+
return resultValue;
|
|
2202
|
+
} catch (error) {
|
|
2203
|
+
await closeWritable();
|
|
2204
|
+
// unblock the pipe watcher if the worker died before closing its end of the stream
|
|
2205
|
+
abortPipe();
|
|
2206
|
+
try {
|
|
2207
|
+
await closed;
|
|
2208
|
+
} catch {
|
|
2209
|
+
// ignored
|
|
2210
|
+
}
|
|
2211
|
+
throw error;
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
async function closeWritable() {
|
|
2215
|
+
if (!streamsTransferred && !writable.locked) {
|
|
2216
|
+
try {
|
|
2217
|
+
await writable.getWriter().close();
|
|
2218
|
+
} catch {
|
|
2219
|
+
// ignored
|
|
2220
|
+
}
|
|
2221
|
+
}
|
|
2157
2222
|
}
|
|
2158
|
-
await closed;
|
|
2159
|
-
return resultValue;
|
|
2160
2223
|
}
|
|
2161
2224
|
|
|
2162
2225
|
function watchClosedStream(writableSource) {
|
|
2226
|
+
const abortController = new AbortController();
|
|
2163
2227
|
const { writable, readable } = new TransformStream();
|
|
2164
|
-
const closed = readable.pipeTo(writableSource, { preventClose: true });
|
|
2165
|
-
|
|
2228
|
+
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
2229
|
+
// the pipe can fail before `closed` is awaited (e.g. the destination write fails);
|
|
2230
|
+
// mark the rejection as handled so it cannot kill the process in the meantime
|
|
2231
|
+
closed.catch(() => { });
|
|
2232
|
+
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2233
|
+
}
|
|
2234
|
+
|
|
2235
|
+
function terminateWorker$1(workerData) {
|
|
2236
|
+
const { worker } = workerData;
|
|
2237
|
+
if (worker) {
|
|
2238
|
+
try {
|
|
2239
|
+
worker.terminate();
|
|
2240
|
+
} catch {
|
|
2241
|
+
// ignored
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
workerData.interface = null;
|
|
2166
2245
|
}
|
|
2167
2246
|
|
|
2168
2247
|
function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
|
|
2169
2248
|
let worker, resolvedURI, resolvedOptions;
|
|
2170
|
-
if (webWorkerURI === UNDEFINED_VALUE) {
|
|
2249
|
+
if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
|
|
2171
2250
|
// deno-lint-ignore valid-typeof
|
|
2172
2251
|
const isFunctionURI = typeof url == FUNCTION_TYPE;
|
|
2173
2252
|
if (isFunctionURI) {
|
|
@@ -2224,16 +2303,36 @@
|
|
|
2224
2303
|
}
|
|
2225
2304
|
}
|
|
2226
2305
|
}
|
|
2306
|
+
webWorkerSource = url;
|
|
2227
2307
|
webWorkerURI = resolvedURI;
|
|
2228
2308
|
webWorkerOptions = resolvedOptions;
|
|
2229
2309
|
} else {
|
|
2230
2310
|
worker = new Worker(webWorkerURI, webWorkerOptions);
|
|
2231
2311
|
}
|
|
2232
2312
|
worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
|
|
2313
|
+
worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2314
|
+
worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2233
2315
|
return worker;
|
|
2234
2316
|
}
|
|
2235
2317
|
|
|
2236
|
-
function
|
|
2318
|
+
function onWorkerError(event, workerData) {
|
|
2319
|
+
if (event.preventDefault) {
|
|
2320
|
+
event.preventDefault();
|
|
2321
|
+
}
|
|
2322
|
+
const { rejectResult, writer, onTaskFinished } = workerData;
|
|
2323
|
+
// the worker is unusable (e.g. its script failed to load); terminate it and
|
|
2324
|
+
// fail the current task instead of letting it hang forever
|
|
2325
|
+
terminateWorker$1(workerData);
|
|
2326
|
+
if (rejectResult) {
|
|
2327
|
+
rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
|
|
2328
|
+
if (writer) {
|
|
2329
|
+
writer.releaseLock();
|
|
2330
|
+
}
|
|
2331
|
+
onTaskFinished();
|
|
2332
|
+
}
|
|
2333
|
+
}
|
|
2334
|
+
|
|
2335
|
+
function sendMessage(message, { worker, writer, transferStreams }) {
|
|
2237
2336
|
try {
|
|
2238
2337
|
const { value, readable, writable } = message;
|
|
2239
2338
|
const transferables = [];
|
|
@@ -2267,14 +2366,16 @@
|
|
|
2267
2366
|
if (writer) {
|
|
2268
2367
|
writer.releaseLock();
|
|
2269
2368
|
}
|
|
2270
|
-
onTaskFinished();
|
|
2271
2369
|
throw error;
|
|
2272
2370
|
}
|
|
2273
2371
|
}
|
|
2274
2372
|
|
|
2275
2373
|
async function onMessage({ data }, workerData) {
|
|
2276
2374
|
const { type, value, messageId, result, error } = data;
|
|
2277
|
-
const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
|
|
2375
|
+
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
2376
|
+
// continuations below can settle after the worker slot has been reassigned to a new
|
|
2377
|
+
// task (e.g. a pending pull read failing late); they must not touch the new task
|
|
2378
|
+
const stale = () => workerData.generation != generation;
|
|
2278
2379
|
try {
|
|
2279
2380
|
if (error) {
|
|
2280
2381
|
const { message, stack, code, name, outputSize } = error;
|
|
@@ -2284,23 +2385,32 @@
|
|
|
2284
2385
|
} else {
|
|
2285
2386
|
if (type == MESSAGE_PULL) {
|
|
2286
2387
|
const { value, done } = await reader.read();
|
|
2287
|
-
|
|
2388
|
+
if (!stale()) {
|
|
2389
|
+
sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
|
|
2390
|
+
}
|
|
2288
2391
|
}
|
|
2289
2392
|
if (type == MESSAGE_DATA) {
|
|
2290
2393
|
await writer.ready;
|
|
2291
2394
|
await writer.write(new Uint8Array(value));
|
|
2292
|
-
|
|
2395
|
+
if (!stale()) {
|
|
2396
|
+
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
2397
|
+
}
|
|
2293
2398
|
}
|
|
2294
2399
|
if (type == MESSAGE_CLOSE) {
|
|
2295
2400
|
close(null, result);
|
|
2296
2401
|
}
|
|
2297
2402
|
}
|
|
2298
2403
|
} catch (error) {
|
|
2299
|
-
|
|
2300
|
-
|
|
2404
|
+
if (!stale()) {
|
|
2405
|
+
terminateWorker$1(workerData);
|
|
2406
|
+
close(error);
|
|
2407
|
+
}
|
|
2301
2408
|
}
|
|
2302
2409
|
|
|
2303
2410
|
function close(error, result) {
|
|
2411
|
+
if (stale()) {
|
|
2412
|
+
return;
|
|
2413
|
+
}
|
|
2304
2414
|
if (error) {
|
|
2305
2415
|
rejectResult(error);
|
|
2306
2416
|
} else {
|
|
@@ -2344,6 +2454,8 @@
|
|
|
2344
2454
|
|
|
2345
2455
|
let pool = [];
|
|
2346
2456
|
const pendingRequests = [];
|
|
2457
|
+
let starvationTimeout;
|
|
2458
|
+
let starvationDelay;
|
|
2347
2459
|
|
|
2348
2460
|
let indexWorker = 0;
|
|
2349
2461
|
|
|
@@ -2370,14 +2482,20 @@
|
|
|
2370
2482
|
pool.push(workerData);
|
|
2371
2483
|
return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
|
|
2372
2484
|
} else {
|
|
2373
|
-
return new Promise(resolve =>
|
|
2485
|
+
return new Promise(resolve => {
|
|
2486
|
+
pendingRequests.push({ resolve, stream, workerOptions });
|
|
2487
|
+
starvationDelay = config.workerStarvationTimeout;
|
|
2488
|
+
armStarvationTimeout();
|
|
2489
|
+
});
|
|
2374
2490
|
}
|
|
2375
2491
|
}
|
|
2376
2492
|
|
|
2377
2493
|
function onTaskFinished(workerData) {
|
|
2494
|
+
clearStarvationTimeout();
|
|
2378
2495
|
if (pendingRequests.length) {
|
|
2379
2496
|
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2380
2497
|
resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
|
|
2498
|
+
armStarvationTimeout();
|
|
2381
2499
|
} else if (workerData.worker) {
|
|
2382
2500
|
clearTerminateTimeout(workerData);
|
|
2383
2501
|
terminateWorker(workerData, workerOptions);
|
|
@@ -2387,6 +2505,34 @@
|
|
|
2387
2505
|
}
|
|
2388
2506
|
}
|
|
2389
2507
|
|
|
2508
|
+
function armStarvationTimeout() {
|
|
2509
|
+
if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
|
|
2510
|
+
starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
function clearStarvationTimeout() {
|
|
2515
|
+
if (starvationTimeout) {
|
|
2516
|
+
clearTimeout(starvationTimeout);
|
|
2517
|
+
starvationTimeout = null;
|
|
2518
|
+
}
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
function onWorkerStarvation() {
|
|
2522
|
+
starvationTimeout = null;
|
|
2523
|
+
if (pendingRequests.length) {
|
|
2524
|
+
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2525
|
+
const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
|
|
2526
|
+
resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
|
|
2527
|
+
armStarvationTimeout();
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
function onInlineTaskFinished() {
|
|
2532
|
+
clearStarvationTimeout();
|
|
2533
|
+
armStarvationTimeout();
|
|
2534
|
+
}
|
|
2535
|
+
|
|
2390
2536
|
function terminateWorker(workerData, workerOptions) {
|
|
2391
2537
|
const { config } = workerOptions;
|
|
2392
2538
|
const { terminateWorkerTimeout } = config;
|
|
@@ -2457,6 +2603,7 @@
|
|
|
2457
2603
|
|
|
2458
2604
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
2459
2605
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
2606
|
+
const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
|
|
2460
2607
|
const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
2461
2608
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
2462
2609
|
const HTTP_HEADER_RANGE = "Range";
|
|
@@ -2581,7 +2728,7 @@
|
|
|
2581
2728
|
|
|
2582
2729
|
writeUint8Array(array) {
|
|
2583
2730
|
const writer = this;
|
|
2584
|
-
let indexArray
|
|
2731
|
+
let indexArray;
|
|
2585
2732
|
let dataString = writer.pending;
|
|
2586
2733
|
const delta = writer.pending.length;
|
|
2587
2734
|
writer.pending = "";
|
|
@@ -2591,12 +2738,10 @@
|
|
|
2591
2738
|
for (; indexArray < array.length; indexArray++) {
|
|
2592
2739
|
writer.pending += String.fromCharCode(array[indexArray]);
|
|
2593
2740
|
}
|
|
2594
|
-
if (dataString.length) {
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
writer.pending += dataString;
|
|
2599
|
-
}
|
|
2741
|
+
if (dataString.length > 2) {
|
|
2742
|
+
writer.data += btoa(dataString);
|
|
2743
|
+
} else {
|
|
2744
|
+
writer.pending = dataString + writer.pending;
|
|
2600
2745
|
}
|
|
2601
2746
|
}
|
|
2602
2747
|
|
|
@@ -2643,6 +2788,9 @@
|
|
|
2643
2788
|
}
|
|
2644
2789
|
});
|
|
2645
2790
|
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
2791
|
+
// mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
|
|
2792
|
+
// surfaces them
|
|
2793
|
+
writer.blob.catch(() => { });
|
|
2646
2794
|
}
|
|
2647
2795
|
|
|
2648
2796
|
getData() {
|
|
@@ -2727,7 +2875,8 @@
|
|
|
2727
2875
|
preventHeadRequest,
|
|
2728
2876
|
useRangeHeader,
|
|
2729
2877
|
forceRangeRequests,
|
|
2730
|
-
combineSizeEocd
|
|
2878
|
+
combineSizeEocd,
|
|
2879
|
+
fetch
|
|
2731
2880
|
} = options;
|
|
2732
2881
|
options = Object.assign({}, options);
|
|
2733
2882
|
delete options.preventHeadRequest;
|
|
@@ -2735,13 +2884,15 @@
|
|
|
2735
2884
|
delete options.forceRangeRequests;
|
|
2736
2885
|
delete options.combineSizeEocd;
|
|
2737
2886
|
delete options.useXHR;
|
|
2887
|
+
delete options.fetch;
|
|
2738
2888
|
Object.assign(httpReader, {
|
|
2739
2889
|
url,
|
|
2740
2890
|
options,
|
|
2741
2891
|
preventHeadRequest,
|
|
2742
2892
|
useRangeHeader,
|
|
2743
2893
|
forceRangeRequests,
|
|
2744
|
-
combineSizeEocd
|
|
2894
|
+
combineSizeEocd,
|
|
2895
|
+
fetch
|
|
2745
2896
|
});
|
|
2746
2897
|
}
|
|
2747
2898
|
|
|
@@ -2760,7 +2911,10 @@
|
|
|
2760
2911
|
throw new Error(ERR_HTTP_RANGE);
|
|
2761
2912
|
} else {
|
|
2762
2913
|
if (combineSizeEocd) {
|
|
2763
|
-
|
|
2914
|
+
const eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
2915
|
+
if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
2916
|
+
httpReader.eocdCache = eocdCache;
|
|
2917
|
+
}
|
|
2764
2918
|
}
|
|
2765
2919
|
let contentSize;
|
|
2766
2920
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
@@ -2806,7 +2960,18 @@
|
|
|
2806
2960
|
if (response.status != 206) {
|
|
2807
2961
|
throw new Error(ERR_HTTP_RANGE);
|
|
2808
2962
|
}
|
|
2809
|
-
|
|
2963
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
2964
|
+
if (contentRangeHeader) {
|
|
2965
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
2966
|
+
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
2967
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
2971
|
+
if (data.length != length) {
|
|
2972
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
2973
|
+
}
|
|
2974
|
+
return data;
|
|
2810
2975
|
}
|
|
2811
2976
|
} else {
|
|
2812
2977
|
const { data } = httpReader;
|
|
@@ -2843,9 +3008,9 @@
|
|
|
2843
3008
|
async function getRequestData(httpReader, sendRequest) {
|
|
2844
3009
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
|
|
2845
3010
|
httpReader.data = new Uint8Array(await response.arrayBuffer());
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
3011
|
+
// the downloaded content is authoritative, e.g. the Content-Length response header
|
|
3012
|
+
// of the HEAD request can be the encoded size when the content is compressed
|
|
3013
|
+
httpReader.size = httpReader.data.length;
|
|
2849
3014
|
}
|
|
2850
3015
|
|
|
2851
3016
|
async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
@@ -2854,7 +3019,7 @@
|
|
|
2854
3019
|
} else {
|
|
2855
3020
|
const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
|
|
2856
3021
|
const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
|
|
2857
|
-
if (contentLength) {
|
|
3022
|
+
if (contentLength && !response.headers.get(HTTP_HEADER_CONTENT_ENCODING)) {
|
|
2858
3023
|
httpReader.size = Number(contentLength);
|
|
2859
3024
|
} else {
|
|
2860
3025
|
await getRequestData(httpReader, httpReader.options);
|
|
@@ -2862,8 +3027,8 @@
|
|
|
2862
3027
|
}
|
|
2863
3028
|
}
|
|
2864
3029
|
|
|
2865
|
-
async function sendFetchRequest(method, { options, url }, headers) {
|
|
2866
|
-
const response = await
|
|
3030
|
+
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
3031
|
+
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
2867
3032
|
if (response.status < 400) {
|
|
2868
3033
|
return response;
|
|
2869
3034
|
} else {
|
|
@@ -2909,7 +3074,8 @@
|
|
|
2909
3074
|
super();
|
|
2910
3075
|
Object.assign(this, {
|
|
2911
3076
|
url,
|
|
2912
|
-
|
|
3077
|
+
// an explicit fetch implementation takes precedence over useXHR
|
|
3078
|
+
reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
|
|
2913
3079
|
});
|
|
2914
3080
|
}
|
|
2915
3081
|
|
|
@@ -2934,8 +3100,7 @@
|
|
|
2934
3100
|
class HttpRangeReader extends HttpReader {
|
|
2935
3101
|
|
|
2936
3102
|
constructor(url, options = {}) {
|
|
2937
|
-
options
|
|
2938
|
-
super(url, options);
|
|
3103
|
+
super(url, Object.assign({}, options, { useRangeHeader: true }));
|
|
2939
3104
|
}
|
|
2940
3105
|
}
|
|
2941
3106
|
|
|
@@ -3009,7 +3174,7 @@
|
|
|
3009
3174
|
reader.lastDiskNumber = 0;
|
|
3010
3175
|
reader.lastDiskOffset = 0;
|
|
3011
3176
|
await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
|
|
3012
|
-
await diskReader
|
|
3177
|
+
await initStream(diskReader);
|
|
3013
3178
|
if (indexDiskReader != readers.length - 1) {
|
|
3014
3179
|
reader.lastDiskOffset += diskReader.size;
|
|
3015
3180
|
}
|
|
@@ -3093,14 +3258,26 @@
|
|
|
3093
3258
|
writer.diskOffset += diskSourceWriter.size;
|
|
3094
3259
|
writer.diskNumber++;
|
|
3095
3260
|
diskWriter = null;
|
|
3096
|
-
|
|
3261
|
+
// the next disk is not opened yet but its space is available; leaving a
|
|
3262
|
+
// stale value here would force a new disk for every subsequent write
|
|
3263
|
+
writer.availableSize = writer.maxSize;
|
|
3264
|
+
if (chunk.length > availableSize) {
|
|
3265
|
+
await this.write(chunk.subarray(availableSize));
|
|
3266
|
+
}
|
|
3097
3267
|
} else {
|
|
3098
3268
|
await writeChunk(chunk);
|
|
3099
3269
|
}
|
|
3100
3270
|
},
|
|
3101
3271
|
async close() {
|
|
3102
|
-
|
|
3103
|
-
|
|
3272
|
+
if (diskWriter) {
|
|
3273
|
+
await diskWriter.ready;
|
|
3274
|
+
await closeDisk();
|
|
3275
|
+
}
|
|
3276
|
+
},
|
|
3277
|
+
async abort(reason) {
|
|
3278
|
+
if (diskWriter) {
|
|
3279
|
+
await diskWriter.abort(reason);
|
|
3280
|
+
}
|
|
3104
3281
|
}
|
|
3105
3282
|
});
|
|
3106
3283
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -3115,7 +3292,6 @@
|
|
|
3115
3292
|
await diskWriter.ready;
|
|
3116
3293
|
await diskWriter.write(chunk);
|
|
3117
3294
|
diskSourceWriter.size += chunkLength;
|
|
3118
|
-
writer.size += chunkLength;
|
|
3119
3295
|
writer.availableSize -= chunkLength;
|
|
3120
3296
|
}
|
|
3121
3297
|
}
|
|
@@ -3215,7 +3391,7 @@
|
|
|
3215
3391
|
|
|
3216
3392
|
/* global TextDecoder */
|
|
3217
3393
|
|
|
3218
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■
|
|
3394
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3219
3395
|
const VALID_CP437 = CP437.length == 256;
|
|
3220
3396
|
|
|
3221
3397
|
function decodeCP437(stringValue) {
|
|
@@ -3263,7 +3439,8 @@
|
|
|
3263
3439
|
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3264
3440
|
return decodeCP437(value);
|
|
3265
3441
|
} else {
|
|
3266
|
-
|
|
3442
|
+
// ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
|
|
3443
|
+
return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
|
|
3267
3444
|
}
|
|
3268
3445
|
}
|
|
3269
3446
|
|
|
@@ -3440,6 +3617,7 @@
|
|
|
3440
3617
|
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
3441
3618
|
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
3442
3619
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
3620
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
3443
3621
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
3444
3622
|
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
3445
3623
|
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
@@ -3497,12 +3675,16 @@
|
|
|
3497
3675
|
const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
|
|
3498
3676
|
const ERR_ENCRYPTED = "File contains encrypted entry";
|
|
3499
3677
|
const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
3500
|
-
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
3678
|
+
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
3501
3679
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
3502
3680
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
3681
|
+
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
3503
3682
|
const CHARSET_UTF8 = "utf-8";
|
|
3504
3683
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
3505
3684
|
const CHARSET_CP437 = "cp437";
|
|
3685
|
+
// bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
|
|
3686
|
+
// because they are informative only
|
|
3687
|
+
const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
|
|
3506
3688
|
const ZIP64_PROPERTIES = [
|
|
3507
3689
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
3508
3690
|
[PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -3527,7 +3709,7 @@
|
|
|
3527
3709
|
reader: new GenericReader(reader),
|
|
3528
3710
|
options,
|
|
3529
3711
|
config: getConfiguration(),
|
|
3530
|
-
readRanges:
|
|
3712
|
+
readRanges: new Map()
|
|
3531
3713
|
});
|
|
3532
3714
|
}
|
|
3533
3715
|
|
|
@@ -3560,21 +3742,30 @@
|
|
|
3560
3742
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
3561
3743
|
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
3562
3744
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
3745
|
+
const checkAmbiguity = getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY);
|
|
3746
|
+
if (checkAmbiguity && appendedDataOffset != reader.size) {
|
|
3747
|
+
throwAmbiguousArchive("appended data");
|
|
3748
|
+
}
|
|
3563
3749
|
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
3564
3750
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
3565
3751
|
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
3566
|
-
let filesLength = getUint16(endOfDirectoryView,
|
|
3752
|
+
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
3567
3753
|
let prependedDataLength = 0;
|
|
3568
|
-
let startOffset
|
|
3754
|
+
let startOffset;
|
|
3755
|
+
let zip64EndOfDirectory;
|
|
3569
3756
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
|
|
3570
|
-
const endOfDirectoryLocatorArray =
|
|
3757
|
+
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3758
|
+
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3759
|
+
new Uint8Array();
|
|
3571
3760
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
3572
|
-
if (
|
|
3761
|
+
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3762
|
+
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
3573
3763
|
directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
|
|
3574
3764
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3575
3765
|
let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3576
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3577
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE &&
|
|
3766
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
|
|
3767
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3768
|
+
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3578
3769
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3579
3770
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3580
3771
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3583,24 +3774,36 @@
|
|
|
3583
3774
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3584
3775
|
endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3585
3776
|
}
|
|
3586
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3777
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3587
3778
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
3588
3779
|
}
|
|
3780
|
+
zip64EndOfDirectory = true;
|
|
3589
3781
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
3590
3782
|
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
3783
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
3784
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3591
3785
|
}
|
|
3592
3786
|
if (diskNumber == MAX_16_BITS) {
|
|
3593
3787
|
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
3788
|
+
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
3789
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3594
3790
|
}
|
|
3595
3791
|
if (filesLength == MAX_16_BITS) {
|
|
3596
3792
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
3793
|
+
} else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
3794
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3597
3795
|
}
|
|
3598
3796
|
if (directoryDataLength == MAX_32_BITS) {
|
|
3599
3797
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
3798
|
+
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3799
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3600
3800
|
}
|
|
3601
|
-
directoryDataOffset
|
|
3801
|
+
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3602
3802
|
}
|
|
3603
3803
|
}
|
|
3804
|
+
const declaredDirectoryDataLength = directoryDataLength;
|
|
3805
|
+
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
3806
|
+
(zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
3604
3807
|
if (directoryDataOffset >= reader.size) {
|
|
3605
3808
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
3606
3809
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -3615,8 +3818,11 @@
|
|
|
3615
3818
|
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3616
3819
|
let directoryView = getDataView$1(directoryArray);
|
|
3617
3820
|
if (directoryDataLength) {
|
|
3618
|
-
|
|
3619
|
-
|
|
3821
|
+
if (directoryArray.length < 4) {
|
|
3822
|
+
throw new Error(ERR_BAD_FORMAT);
|
|
3823
|
+
}
|
|
3824
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
|
|
3825
|
+
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3620
3826
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3621
3827
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3622
3828
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3626,8 +3832,8 @@
|
|
|
3626
3832
|
directoryView = getDataView$1(directoryArray);
|
|
3627
3833
|
}
|
|
3628
3834
|
}
|
|
3629
|
-
const expectedDirectoryDataLength =
|
|
3630
|
-
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
|
|
3835
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
|
|
3836
|
+
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3631
3837
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3632
3838
|
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3633
3839
|
directoryView = getDataView$1(directoryArray);
|
|
@@ -3635,16 +3841,19 @@
|
|
|
3635
3841
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3636
3842
|
throw new Error(ERR_BAD_FORMAT);
|
|
3637
3843
|
}
|
|
3844
|
+
startOffset = directoryDataOffset;
|
|
3638
3845
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
3639
3846
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
3847
|
+
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
3848
|
+
let duplicateFilename;
|
|
3640
3849
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
3641
3850
|
const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
|
|
3642
|
-
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3851
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3643
3852
|
throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
|
|
3644
3853
|
}
|
|
3645
3854
|
readCommonHeader(fileEntry, directoryView, offset + 6);
|
|
3646
3855
|
const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
|
|
3647
|
-
const filenameOffset = offset +
|
|
3856
|
+
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
3648
3857
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
3649
3858
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
3650
3859
|
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
@@ -3665,7 +3874,7 @@
|
|
|
3665
3874
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
3666
3875
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
3667
3876
|
};
|
|
3668
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42)
|
|
3877
|
+
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
3669
3878
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
3670
3879
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
3671
3880
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
@@ -3678,6 +3887,7 @@
|
|
|
3678
3887
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
3679
3888
|
}
|
|
3680
3889
|
Object.assign(fileEntry, {
|
|
3890
|
+
index: indexFile,
|
|
3681
3891
|
versionMadeBy,
|
|
3682
3892
|
msDosCompatible,
|
|
3683
3893
|
compressedSize: 0,
|
|
@@ -3697,8 +3907,15 @@
|
|
|
3697
3907
|
filename,
|
|
3698
3908
|
comment
|
|
3699
3909
|
});
|
|
3700
|
-
startOffset = Math.max(offsetFileEntry, startOffset);
|
|
3701
3910
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
3911
|
+
fileEntry.offset += prependedDataLength;
|
|
3912
|
+
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
3913
|
+
if (checkAmbiguity) {
|
|
3914
|
+
if (filenames.has(fileEntry.filename)) {
|
|
3915
|
+
duplicateFilename = true;
|
|
3916
|
+
}
|
|
3917
|
+
filenames.add(fileEntry.filename);
|
|
3918
|
+
}
|
|
3702
3919
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
3703
3920
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
3704
3921
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -3719,7 +3936,7 @@
|
|
|
3719
3936
|
internalFileAttribute: fileEntry.internalFileAttributes,
|
|
3720
3937
|
externalFileAttribute: fileEntry.externalFileAttributes,
|
|
3721
3938
|
executable,
|
|
3722
|
-
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3939
|
+
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (fileEntry.filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3723
3940
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
3724
3941
|
});
|
|
3725
3942
|
const entry = new Entry(fileEntry);
|
|
@@ -3742,6 +3959,15 @@
|
|
|
3742
3959
|
}
|
|
3743
3960
|
yield entry;
|
|
3744
3961
|
}
|
|
3962
|
+
if (checkAmbiguity && offset != declaredDirectoryDataLength) {
|
|
3963
|
+
throwAmbiguousArchive("trailing central directory data");
|
|
3964
|
+
}
|
|
3965
|
+
if (duplicateFilename) {
|
|
3966
|
+
throwAmbiguousArchive("duplicate filename");
|
|
3967
|
+
}
|
|
3968
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
3969
|
+
throwAmbiguousArchive("prepended data");
|
|
3970
|
+
}
|
|
3745
3971
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
3746
3972
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
3747
3973
|
if (extractPrependedData) {
|
|
@@ -3781,9 +4007,21 @@
|
|
|
3781
4007
|
readable: (function () {
|
|
3782
4008
|
const { readable, writable } = new TransformStream();
|
|
3783
4009
|
if (value.getData) {
|
|
3784
|
-
|
|
4010
|
+
getData();
|
|
3785
4011
|
return readable;
|
|
3786
4012
|
}
|
|
4013
|
+
|
|
4014
|
+
async function getData() {
|
|
4015
|
+
try {
|
|
4016
|
+
await value.getData(writable);
|
|
4017
|
+
} catch (error) {
|
|
4018
|
+
try {
|
|
4019
|
+
await writable.abort(error);
|
|
4020
|
+
} catch {
|
|
4021
|
+
// ignored
|
|
4022
|
+
}
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
3787
4025
|
})()
|
|
3788
4026
|
};
|
|
3789
4027
|
delete chunk.getData;
|
|
@@ -3808,6 +4046,7 @@
|
|
|
3808
4046
|
const zipEntry = this;
|
|
3809
4047
|
const {
|
|
3810
4048
|
reader,
|
|
4049
|
+
index,
|
|
3811
4050
|
offset,
|
|
3812
4051
|
diskNumberStart,
|
|
3813
4052
|
extraFieldAES,
|
|
@@ -3833,27 +4072,42 @@
|
|
|
3833
4072
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
3834
4073
|
if (extraFieldAES) {
|
|
3835
4074
|
if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
|
|
3836
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4075
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3837
4076
|
}
|
|
3838
4077
|
}
|
|
3839
4078
|
if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
|
|
3840
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4079
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3841
4080
|
}
|
|
3842
|
-
if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
4081
|
+
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
3843
4082
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
3844
4083
|
}
|
|
3845
4084
|
readCommonHeader(localDirectory, dataView, 4);
|
|
3846
4085
|
const {
|
|
3847
4086
|
extraFieldLength,
|
|
3848
|
-
filenameLength
|
|
3849
|
-
lastAccessDate,
|
|
3850
|
-
creationDate
|
|
4087
|
+
filenameLength
|
|
3851
4088
|
} = localDirectory;
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
4089
|
+
const checkAmbiguity = getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY);
|
|
4090
|
+
let rawLocalFilename = new Uint8Array();
|
|
4091
|
+
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4092
|
+
const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
|
|
4093
|
+
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4094
|
+
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4095
|
+
} else {
|
|
4096
|
+
localDirectory.rawExtraField = extraFieldLength ?
|
|
4097
|
+
await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
|
|
4098
|
+
new Uint8Array();
|
|
4099
|
+
}
|
|
3855
4100
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
3856
|
-
|
|
4101
|
+
if (checkAmbiguity) {
|
|
4102
|
+
checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename);
|
|
4103
|
+
}
|
|
4104
|
+
const { lastAccessDate, creationDate } = localDirectory;
|
|
4105
|
+
if (lastAccessDate) {
|
|
4106
|
+
fileEntry.lastAccessDate = lastAccessDate;
|
|
4107
|
+
}
|
|
4108
|
+
if (creationDate) {
|
|
4109
|
+
fileEntry.creationDate = creationDate;
|
|
4110
|
+
}
|
|
3857
4111
|
const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
|
|
3858
4112
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
3859
4113
|
if (!passThrough) {
|
|
@@ -3899,7 +4153,7 @@
|
|
|
3899
4153
|
outputSize: passThrough ? compressedSize : uncompressedSize,
|
|
3900
4154
|
signature,
|
|
3901
4155
|
compressed: compressionMethod != 0 && !passThrough,
|
|
3902
|
-
encrypted
|
|
4156
|
+
encrypted,
|
|
3903
4157
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
3904
4158
|
useCompressionStream,
|
|
3905
4159
|
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
@@ -3913,6 +4167,7 @@
|
|
|
3913
4167
|
await detectOverlappingEntry({
|
|
3914
4168
|
reader,
|
|
3915
4169
|
fileEntry,
|
|
4170
|
+
index,
|
|
3916
4171
|
offset,
|
|
3917
4172
|
diskNumberStart,
|
|
3918
4173
|
signature,
|
|
@@ -4015,7 +4270,7 @@
|
|
|
4015
4270
|
directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
|
|
4016
4271
|
}
|
|
4017
4272
|
const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
|
|
4018
|
-
if (extraFieldAES) {
|
|
4273
|
+
if (extraFieldAES && extraFieldAES.data.length >= 7) {
|
|
4019
4274
|
readExtraFieldAES(extraFieldAES, directory, compressionMethod);
|
|
4020
4275
|
directory.extraFieldAES = extraFieldAES;
|
|
4021
4276
|
} else {
|
|
@@ -4052,19 +4307,23 @@
|
|
|
4052
4307
|
directory.zip64 = true;
|
|
4053
4308
|
const extraFieldView = getDataView$1(extraFieldZip64.data);
|
|
4054
4309
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4310
|
+
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4311
|
+
if (extraFieldZip64.data.length < requiredLength) {
|
|
4312
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4313
|
+
}
|
|
4055
4314
|
for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
|
|
4056
4315
|
const [propertyName, max] = missingProperties[indexMissingProperty];
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
offset += extraction.bytes;
|
|
4061
|
-
} else if (extraFieldZip64[propertyName]) {
|
|
4062
|
-
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4063
|
-
}
|
|
4316
|
+
const extraction = ZIP64_EXTRACTION[max];
|
|
4317
|
+
directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
|
|
4318
|
+
offset += extraction.bytes;
|
|
4064
4319
|
}
|
|
4065
4320
|
}
|
|
4066
4321
|
|
|
4067
4322
|
function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
|
|
4323
|
+
if (extraFieldUnicode.data.length < 5) {
|
|
4324
|
+
extraFieldUnicode.valid = false;
|
|
4325
|
+
return;
|
|
4326
|
+
}
|
|
4068
4327
|
const extraFieldView = getDataView$1(extraFieldUnicode.data);
|
|
4069
4328
|
const crc32 = new Crc32();
|
|
4070
4329
|
crc32.append(fileEntry[rawPropertyName]);
|
|
@@ -4137,32 +4396,30 @@
|
|
|
4137
4396
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4138
4397
|
try {
|
|
4139
4398
|
const view = getDataView$1(new Uint8Array(extraField.data));
|
|
4140
|
-
let
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
if (
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4399
|
+
let uid, gid;
|
|
4400
|
+
if (isInfoZip) {
|
|
4401
|
+
// Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
|
|
4402
|
+
let offset = 0;
|
|
4403
|
+
const version = getUint8(view, offset++);
|
|
4404
|
+
const uidSize = getUint8(view, offset++);
|
|
4405
|
+
uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
|
|
4406
|
+
offset += uidSize;
|
|
4407
|
+
const gidSize = getUint8(view, offset++);
|
|
4408
|
+
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
4409
|
+
Object.assign(extraField, { version, uid, gid });
|
|
4410
|
+
} else if (extraField.data.length >= 4) {
|
|
4411
|
+
// Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
|
|
4412
|
+
// carried in the external file attributes, not here)
|
|
4413
|
+
uid = getUint16(view, 0);
|
|
4414
|
+
gid = getUint16(view, 2);
|
|
4415
|
+
Object.assign(extraField, { uid, gid });
|
|
4416
|
+
}
|
|
4157
4417
|
if (uid !== UNDEFINED_VALUE) {
|
|
4158
4418
|
directory.uid = uid;
|
|
4159
4419
|
}
|
|
4160
4420
|
if (gid !== UNDEFINED_VALUE) {
|
|
4161
4421
|
directory.gid = gid;
|
|
4162
4422
|
}
|
|
4163
|
-
if (unixMode !== UNDEFINED_VALUE) {
|
|
4164
|
-
directory.unixMode = unixMode;
|
|
4165
|
-
}
|
|
4166
4423
|
} catch {
|
|
4167
4424
|
// ignored
|
|
4168
4425
|
}
|
|
@@ -4176,6 +4433,9 @@
|
|
|
4176
4433
|
}
|
|
4177
4434
|
|
|
4178
4435
|
function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
|
|
4436
|
+
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4437
|
+
return;
|
|
4438
|
+
}
|
|
4179
4439
|
const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
|
|
4180
4440
|
const flags = getUint8(extraFieldView, 0);
|
|
4181
4441
|
const timeProperties = [];
|
|
@@ -4201,7 +4461,8 @@
|
|
|
4201
4461
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
4202
4462
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
4203
4463
|
const time = getUint32(extraFieldView, offset);
|
|
4204
|
-
|
|
4464
|
+
// the extended timestamp is a signed 32-bit time_t value
|
|
4465
|
+
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
4205
4466
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
4206
4467
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
4207
4468
|
}
|
|
@@ -4212,6 +4473,7 @@
|
|
|
4212
4473
|
async function detectOverlappingEntry({
|
|
4213
4474
|
reader,
|
|
4214
4475
|
fileEntry,
|
|
4476
|
+
index,
|
|
4215
4477
|
offset,
|
|
4216
4478
|
diskNumberStart,
|
|
4217
4479
|
signature,
|
|
@@ -4223,10 +4485,9 @@
|
|
|
4223
4485
|
readRanges
|
|
4224
4486
|
}) {
|
|
4225
4487
|
let diskOffset = 0;
|
|
4226
|
-
if (diskNumberStart) {
|
|
4227
|
-
for (let indexReader = 0; indexReader < diskNumberStart; indexReader++) {
|
|
4228
|
-
|
|
4229
|
-
diskOffset += diskReader.size;
|
|
4488
|
+
if (diskNumberStart && reader.readers) {
|
|
4489
|
+
for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
|
|
4490
|
+
diskOffset += reader.readers[indexReader].size;
|
|
4230
4491
|
}
|
|
4231
4492
|
}
|
|
4232
4493
|
let dataDescriptorLength = 0;
|
|
@@ -4239,7 +4500,8 @@
|
|
|
4239
4500
|
}
|
|
4240
4501
|
if (dataDescriptorLength) {
|
|
4241
4502
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
|
|
4242
|
-
const dataDescriptorSignature =
|
|
4503
|
+
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4504
|
+
getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4243
4505
|
if (dataDescriptorSignature) {
|
|
4244
4506
|
const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
|
|
4245
4507
|
let readCompressedSize;
|
|
@@ -4264,14 +4526,14 @@
|
|
|
4264
4526
|
end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
|
|
4265
4527
|
fileEntry
|
|
4266
4528
|
};
|
|
4267
|
-
for (const otherRange of readRanges) {
|
|
4268
|
-
if (
|
|
4529
|
+
for (const [otherIndex, otherRange] of readRanges) {
|
|
4530
|
+
if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
|
|
4269
4531
|
const error = new Error(ERR_OVERLAPPING_ENTRY);
|
|
4270
4532
|
error.overlappingEntry = otherRange.fileEntry;
|
|
4271
4533
|
throw error;
|
|
4272
4534
|
}
|
|
4273
4535
|
}
|
|
4274
|
-
readRanges.
|
|
4536
|
+
readRanges.set(index, range);
|
|
4275
4537
|
}
|
|
4276
4538
|
|
|
4277
4539
|
async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
|
|
@@ -4296,6 +4558,35 @@
|
|
|
4296
4558
|
}
|
|
4297
4559
|
}
|
|
4298
4560
|
|
|
4561
|
+
function checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename) {
|
|
4562
|
+
const { rawFilename } = zipEntry;
|
|
4563
|
+
if (rawLocalFilename.length != rawFilename.length ||
|
|
4564
|
+
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte])) {
|
|
4565
|
+
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
4566
|
+
}
|
|
4567
|
+
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
4568
|
+
throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
|
|
4569
|
+
}
|
|
4570
|
+
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
4571
|
+
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
4572
|
+
}
|
|
4573
|
+
// when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
|
|
4574
|
+
// also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
|
|
4575
|
+
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
4576
|
+
(localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
4577
|
+
(localDirectory.signature != zipEntry.signature ||
|
|
4578
|
+
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
4579
|
+
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
4580
|
+
throwAmbiguousArchive("mismatched local file header (signature or sizes)");
|
|
4581
|
+
}
|
|
4582
|
+
}
|
|
4583
|
+
|
|
4584
|
+
function throwAmbiguousArchive(reason) {
|
|
4585
|
+
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
4586
|
+
error.reason = reason;
|
|
4587
|
+
throw error;
|
|
4588
|
+
}
|
|
4589
|
+
|
|
4299
4590
|
function getOptionValue$1(zipReader, options, name) {
|
|
4300
4591
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
4301
4592
|
}
|
|
@@ -4334,7 +4625,7 @@
|
|
|
4334
4625
|
}
|
|
4335
4626
|
|
|
4336
4627
|
function getDataView$1(array) {
|
|
4337
|
-
return new DataView(array.buffer);
|
|
4628
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
4338
4629
|
}
|
|
4339
4630
|
|
|
4340
4631
|
/*
|
|
@@ -4374,13 +4665,19 @@
|
|
|
4374
4665
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
4375
4666
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
4376
4667
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
4668
|
+
// same message as the constant exported by zip-reader.js
|
|
4669
|
+
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
4670
|
+
const MIN_UNIX_TIME = -2147483648;
|
|
4671
|
+
const MAX_UNIX_TIME = 2147483647;
|
|
4377
4672
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
4378
4673
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
4674
|
+
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
4379
4675
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
4380
4676
|
const ERR_INVALID_UID = "Invalid uid (must be integer 0..2^32-1)";
|
|
4381
4677
|
const ERR_INVALID_GID = "Invalid gid (must be integer 0..2^32-1)";
|
|
4382
4678
|
const ERR_INVALID_UNIX_MODE = "Invalid UNIX mode (must be integer 0..65535)";
|
|
4383
4679
|
const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be 'infozip' or 'unix')";
|
|
4680
|
+
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
4384
4681
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
4385
4682
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
4386
4683
|
|
|
@@ -4406,9 +4703,10 @@
|
|
|
4406
4703
|
files: new Map(),
|
|
4407
4704
|
filenames: new Set(),
|
|
4408
4705
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
4409
|
-
|
|
4706
|
+
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
4410
4707
|
pendingAddFileCalls: new Set(),
|
|
4411
|
-
bufferedWrites: 0
|
|
4708
|
+
bufferedWrites: 0,
|
|
4709
|
+
lastFileEntry: UNDEFINED_VALUE
|
|
4412
4710
|
});
|
|
4413
4711
|
}
|
|
4414
4712
|
|
|
@@ -4417,17 +4715,18 @@
|
|
|
4417
4715
|
throw new Error(ERR_ZIP_NOT_EMPTY);
|
|
4418
4716
|
}
|
|
4419
4717
|
reader = new GenericReader(reader);
|
|
4718
|
+
await initStream(reader);
|
|
4420
4719
|
const zipReader = new ZipReader(reader.readable);
|
|
4421
4720
|
const entries = await zipReader.getEntries();
|
|
4422
4721
|
await zipReader.close();
|
|
4722
|
+
await initStream(this.writer);
|
|
4423
4723
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4424
4724
|
this.writer.size = this.offset = reader.size;
|
|
4425
4725
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
4426
4726
|
this.files = new Map(entries.map(entry => {
|
|
4427
4727
|
const {
|
|
4428
4728
|
version,
|
|
4429
|
-
|
|
4430
|
-
lastModDate,
|
|
4729
|
+
rawLastModDate,
|
|
4431
4730
|
lastAccessDate,
|
|
4432
4731
|
creationDate,
|
|
4433
4732
|
rawFilename,
|
|
@@ -4440,6 +4739,7 @@
|
|
|
4440
4739
|
zip64
|
|
4441
4740
|
} = entry;
|
|
4442
4741
|
let {
|
|
4742
|
+
compressionMethod,
|
|
4443
4743
|
rawExtraFieldZip64,
|
|
4444
4744
|
rawExtraFieldAES,
|
|
4445
4745
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4452,31 +4752,39 @@
|
|
|
4452
4752
|
rawExtraFieldAES = rawExtraFieldAES || new Uint8Array();
|
|
4453
4753
|
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || new Uint8Array();
|
|
4454
4754
|
rawExtraFieldNTFS = rawExtraFieldNTFS || new Uint8Array();
|
|
4455
|
-
rawExtraFieldUnix =
|
|
4755
|
+
rawExtraFieldUnix = rawExtraFieldUnix || new Uint8Array();
|
|
4456
4756
|
rawExtraField = rawExtraField || new Uint8Array();
|
|
4757
|
+
if (entry.extraFieldAES) {
|
|
4758
|
+
compressionMethod = COMPRESSION_METHOD_AES;
|
|
4759
|
+
}
|
|
4457
4760
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
4458
|
-
const zip64UncompressedSize = zip64 && uncompressedSize
|
|
4459
|
-
const zip64CompressedSize = zip64 && compressedSize
|
|
4761
|
+
const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
|
|
4762
|
+
const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
|
|
4763
|
+
const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
|
|
4460
4764
|
const {
|
|
4461
4765
|
headerArray,
|
|
4462
4766
|
headerView
|
|
4463
4767
|
} = getHeaderArrayData({
|
|
4464
4768
|
version,
|
|
4465
|
-
bitFlag:
|
|
4769
|
+
bitFlag: bitFlagValue,
|
|
4466
4770
|
compressionMethod,
|
|
4467
4771
|
uncompressedSize,
|
|
4468
4772
|
compressedSize,
|
|
4469
|
-
|
|
4773
|
+
rawLastModDate,
|
|
4470
4774
|
rawFilename,
|
|
4471
4775
|
zip64CompressedSize,
|
|
4472
4776
|
zip64UncompressedSize,
|
|
4473
4777
|
extraFieldLength
|
|
4474
4778
|
});
|
|
4779
|
+
const { signature } = entry;
|
|
4780
|
+
if (signature !== UNDEFINED_VALUE) {
|
|
4781
|
+
setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
|
|
4782
|
+
}
|
|
4475
4783
|
Object.assign(entry, {
|
|
4476
4784
|
zip64UncompressedSize,
|
|
4477
4785
|
zip64CompressedSize,
|
|
4478
|
-
zip64Offset: zip64 && this.offset - diskOffset
|
|
4479
|
-
zip64DiskNumberStart: zip64 && diskNumber
|
|
4786
|
+
zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
|
|
4787
|
+
zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
|
|
4480
4788
|
rawExtraFieldZip64,
|
|
4481
4789
|
rawExtraFieldAES,
|
|
4482
4790
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4494,6 +4802,7 @@
|
|
|
4494
4802
|
|
|
4495
4803
|
async add(name = "", reader, options = {}) {
|
|
4496
4804
|
const zipWriter = this;
|
|
4805
|
+
options = Object.assign({}, options);
|
|
4497
4806
|
const {
|
|
4498
4807
|
pendingAddFileCalls,
|
|
4499
4808
|
config
|
|
@@ -4504,17 +4813,24 @@
|
|
|
4504
4813
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
4505
4814
|
}
|
|
4506
4815
|
let promiseAddFile;
|
|
4816
|
+
let nameAdded;
|
|
4507
4817
|
try {
|
|
4508
4818
|
name = name.trim();
|
|
4819
|
+
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
4820
|
+
name += DIRECTORY_SIGNATURE;
|
|
4821
|
+
}
|
|
4509
4822
|
if (zipWriter.filenames.has(name)) {
|
|
4510
4823
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
4511
4824
|
}
|
|
4512
4825
|
zipWriter.filenames.add(name);
|
|
4826
|
+
nameAdded = true;
|
|
4513
4827
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
4514
4828
|
pendingAddFileCalls.add(promiseAddFile);
|
|
4515
4829
|
return await promiseAddFile;
|
|
4516
4830
|
} catch (error) {
|
|
4517
|
-
|
|
4831
|
+
if (nameAdded) {
|
|
4832
|
+
zipWriter.filenames.delete(name);
|
|
4833
|
+
}
|
|
4518
4834
|
throw error;
|
|
4519
4835
|
} finally {
|
|
4520
4836
|
pendingAddFileCalls.delete(promiseAddFile);
|
|
@@ -4547,6 +4863,9 @@
|
|
|
4547
4863
|
const zipWriter = this;
|
|
4548
4864
|
const { pendingAddFileCalls, writer } = this;
|
|
4549
4865
|
const { writable } = writer;
|
|
4866
|
+
if (getLength(comment) > MAX_16_BITS) {
|
|
4867
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
4868
|
+
}
|
|
4550
4869
|
while (pendingAddFileCalls.size) {
|
|
4551
4870
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
4552
4871
|
}
|
|
@@ -4565,28 +4884,94 @@
|
|
|
4565
4884
|
const { readable, writable } = new TransformStream();
|
|
4566
4885
|
this.readable = readable;
|
|
4567
4886
|
this.zipWriter = new ZipWriter(writable, options);
|
|
4887
|
+
this.pendingAddFileCalls = new Set();
|
|
4568
4888
|
}
|
|
4569
4889
|
|
|
4570
4890
|
transform(path) {
|
|
4891
|
+
const zipWriter = this.zipWriter;
|
|
4892
|
+
let streamController;
|
|
4571
4893
|
const { readable, writable } = new TransformStream({
|
|
4572
|
-
|
|
4894
|
+
start(controller) {
|
|
4895
|
+
streamController = controller;
|
|
4896
|
+
},
|
|
4897
|
+
flush: () => void closeArchive()
|
|
4573
4898
|
});
|
|
4574
|
-
this.zipWriter.add(path, readable);
|
|
4899
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4575
4900
|
return { readable: this.readable, writable };
|
|
4901
|
+
|
|
4902
|
+
async function closeArchive() {
|
|
4903
|
+
try {
|
|
4904
|
+
await zipWriter.close();
|
|
4905
|
+
} catch (error) {
|
|
4906
|
+
try {
|
|
4907
|
+
await zipWriter.writer.writable.abort(error);
|
|
4908
|
+
} catch {
|
|
4909
|
+
// ignored
|
|
4910
|
+
}
|
|
4911
|
+
}
|
|
4912
|
+
}
|
|
4576
4913
|
}
|
|
4577
4914
|
|
|
4578
4915
|
writable(path) {
|
|
4579
|
-
|
|
4580
|
-
|
|
4916
|
+
let streamController;
|
|
4917
|
+
const { readable, writable } = new TransformStream({
|
|
4918
|
+
start(controller) {
|
|
4919
|
+
streamController = controller;
|
|
4920
|
+
}
|
|
4921
|
+
});
|
|
4922
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4581
4923
|
return writable;
|
|
4582
4924
|
}
|
|
4583
4925
|
|
|
4584
|
-
close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4926
|
+
async close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4927
|
+
await Promise.all(Array.from(this.pendingAddFileCalls));
|
|
4585
4928
|
return this.zipWriter.close(comment, options);
|
|
4586
4929
|
}
|
|
4587
4930
|
}
|
|
4588
4931
|
|
|
4932
|
+
function watchAddFileCall(zipWriterStream, promiseAddFile, onerror) {
|
|
4933
|
+
zipWriterStream.pendingAddFileCalls.add(promiseAddFile);
|
|
4934
|
+
promiseAddFile.catch(error => {
|
|
4935
|
+
try {
|
|
4936
|
+
onerror(error);
|
|
4937
|
+
} catch {
|
|
4938
|
+
// ignored
|
|
4939
|
+
}
|
|
4940
|
+
});
|
|
4941
|
+
}
|
|
4942
|
+
|
|
4589
4943
|
async function addFile(zipWriter, name, reader, options) {
|
|
4944
|
+
const attributesInfo = resolveAttributes(zipWriter, name, options);
|
|
4945
|
+
({ name } = attributesInfo);
|
|
4946
|
+
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
4947
|
+
const { comment } = metadataInfo;
|
|
4948
|
+
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
4949
|
+
zipWriter.files.set(name, UNDEFINED_VALUE);
|
|
4950
|
+
let fileEntry;
|
|
4951
|
+
try {
|
|
4952
|
+
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
4953
|
+
({ reader } = sizesInfo);
|
|
4954
|
+
const { diskOffset, diskNumber } = zipWriter.writer;
|
|
4955
|
+
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
4956
|
+
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
4957
|
+
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
4958
|
+
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4959
|
+
offset: zipWriter.offset - diskOffset,
|
|
4960
|
+
diskNumberStart: diskNumber
|
|
4961
|
+
});
|
|
4962
|
+
const headerInfo = getHeaderInfo(options);
|
|
4963
|
+
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4964
|
+
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4965
|
+
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4966
|
+
} catch (error) {
|
|
4967
|
+
zipWriter.files.delete(name);
|
|
4968
|
+
throw error;
|
|
4969
|
+
}
|
|
4970
|
+
Object.assign(fileEntry, { name, comment, extraField });
|
|
4971
|
+
return new Entry(fileEntry);
|
|
4972
|
+
}
|
|
4973
|
+
|
|
4974
|
+
function resolveAttributes(zipWriter, name, options) {
|
|
4590
4975
|
name = name.trim();
|
|
4591
4976
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
4592
4977
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
@@ -4594,7 +4979,7 @@
|
|
|
4594
4979
|
const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
4595
4980
|
const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
4596
4981
|
let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
4597
|
-
|
|
4982
|
+
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
4598
4983
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
4599
4984
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
4600
4985
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
@@ -4610,6 +4995,13 @@
|
|
|
4610
4995
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
4611
4996
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
4612
4997
|
}
|
|
4998
|
+
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
4999
|
+
((uid !== UNDEFINED_VALUE && uid > MAX_16_BITS) || (gid !== UNDEFINED_VALUE && gid > MAX_16_BITS))) {
|
|
5000
|
+
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
5001
|
+
}
|
|
5002
|
+
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5003
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
5004
|
+
}
|
|
4613
5005
|
let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
4614
5006
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
4615
5007
|
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
@@ -4680,6 +5072,27 @@
|
|
|
4680
5072
|
if (hasMsDosProvided) {
|
|
4681
5073
|
externalFileAttributes = (externalFileAttributes & MAX_32_BITS) | (msdosAttributesRaw & MAX_8_BITS);
|
|
4682
5074
|
}
|
|
5075
|
+
return {
|
|
5076
|
+
name,
|
|
5077
|
+
resolvedOptions: {
|
|
5078
|
+
versionMadeBy,
|
|
5079
|
+
msDosCompatible,
|
|
5080
|
+
externalFileAttributes,
|
|
5081
|
+
unixExternalUpper,
|
|
5082
|
+
uid,
|
|
5083
|
+
gid,
|
|
5084
|
+
unixMode,
|
|
5085
|
+
unixExtraFieldType,
|
|
5086
|
+
setuid,
|
|
5087
|
+
setgid,
|
|
5088
|
+
sticky,
|
|
5089
|
+
msdosAttributesRaw,
|
|
5090
|
+
msdosAttributes
|
|
5091
|
+
}
|
|
5092
|
+
};
|
|
5093
|
+
}
|
|
5094
|
+
|
|
5095
|
+
function resolveMetadata(zipWriter, name, options) {
|
|
4683
5096
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
4684
5097
|
let rawFilename = encode(name);
|
|
4685
5098
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
@@ -4718,10 +5131,14 @@
|
|
|
4718
5131
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
|
|
4719
5132
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
4720
5133
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
4721
|
-
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE,
|
|
5134
|
+
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
4722
5135
|
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
4723
5136
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
4724
5137
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
5138
|
+
if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
|
|
5139
|
+
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
|
|
5140
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5141
|
+
}
|
|
4725
5142
|
let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
4726
5143
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
4727
5144
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
@@ -4737,7 +5154,7 @@
|
|
|
4737
5154
|
if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
4738
5155
|
level = 0;
|
|
4739
5156
|
}
|
|
4740
|
-
|
|
5157
|
+
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
4741
5158
|
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
4742
5159
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
4743
5160
|
}
|
|
@@ -4748,6 +5165,7 @@
|
|
|
4748
5165
|
let offset = 0;
|
|
4749
5166
|
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
4750
5167
|
rawExtraField = new Uint8Array(extraFieldSize);
|
|
5168
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4751
5169
|
extraField.forEach((data, type) => {
|
|
4752
5170
|
if (type > MAX_16_BITS) {
|
|
4753
5171
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
@@ -4755,22 +5173,72 @@
|
|
|
4755
5173
|
if (getLength(data) > MAX_16_BITS) {
|
|
4756
5174
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
4757
5175
|
}
|
|
4758
|
-
|
|
4759
|
-
|
|
5176
|
+
setUint16(rawExtraFieldView, offset, type);
|
|
5177
|
+
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
4760
5178
|
arraySet(rawExtraField, data, offset + 4);
|
|
4761
5179
|
offset += 4 + getLength(data);
|
|
4762
5180
|
});
|
|
4763
5181
|
}
|
|
5182
|
+
return {
|
|
5183
|
+
comment,
|
|
5184
|
+
resolvedOptions: {
|
|
5185
|
+
rawFilename,
|
|
5186
|
+
rawComment,
|
|
5187
|
+
version,
|
|
5188
|
+
lastModDate,
|
|
5189
|
+
lastAccessDate,
|
|
5190
|
+
creationDate,
|
|
5191
|
+
internalFileAttributes,
|
|
5192
|
+
passThrough,
|
|
5193
|
+
password,
|
|
5194
|
+
rawPassword,
|
|
5195
|
+
encryptionStrength,
|
|
5196
|
+
zipCrypto,
|
|
5197
|
+
extendedTimestamp,
|
|
5198
|
+
keepOrder,
|
|
5199
|
+
useWebWorkers,
|
|
5200
|
+
transferStreams,
|
|
5201
|
+
bufferedWrite,
|
|
5202
|
+
createTempStream,
|
|
5203
|
+
dataDescriptorSignature,
|
|
5204
|
+
signal,
|
|
5205
|
+
useUnicodeFileNames,
|
|
5206
|
+
compressionMethod,
|
|
5207
|
+
level,
|
|
5208
|
+
useCompressionStream,
|
|
5209
|
+
dataDescriptor,
|
|
5210
|
+
zip64,
|
|
5211
|
+
rawExtraField
|
|
5212
|
+
}
|
|
5213
|
+
};
|
|
5214
|
+
}
|
|
5215
|
+
|
|
5216
|
+
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
5217
|
+
const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
5218
|
+
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
4764
5219
|
let maximumCompressedSize = 0;
|
|
4765
|
-
let maximumEntrySize = 0;
|
|
4766
5220
|
let uncompressedSize = 0;
|
|
4767
5221
|
if (passThrough) {
|
|
5222
|
+
// the headers of a passThrough entry describe the payload verbatim: without a
|
|
5223
|
+
// reader they would declare content that is not there
|
|
5224
|
+
if (!reader) {
|
|
5225
|
+
throw new Error(ERR_UNDEFINED_READER);
|
|
5226
|
+
}
|
|
4768
5227
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
4769
5228
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
4770
5229
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
4771
5230
|
}
|
|
4772
5231
|
}
|
|
4773
5232
|
const zip64Enabled = zip64 === true;
|
|
5233
|
+
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
5234
|
+
// entries without a reader have no payload: write them as empty stored files instead of
|
|
5235
|
+
// declaring a compressed or encrypted content that does not exist
|
|
5236
|
+
const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
|
|
5237
|
+
if (!reader) {
|
|
5238
|
+
level = 0;
|
|
5239
|
+
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
5240
|
+
}
|
|
5241
|
+
const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4774
5242
|
if (reader) {
|
|
4775
5243
|
reader = new GenericReader(reader);
|
|
4776
5244
|
await initStream(reader);
|
|
@@ -4783,16 +5251,15 @@
|
|
|
4783
5251
|
}
|
|
4784
5252
|
} else {
|
|
4785
5253
|
options.uncompressedSize = uncompressedSize = reader.size;
|
|
4786
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5254
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4787
5255
|
}
|
|
4788
5256
|
} else {
|
|
4789
5257
|
options.uncompressedSize = uncompressedSize;
|
|
4790
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5258
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4791
5259
|
}
|
|
4792
5260
|
}
|
|
4793
|
-
const
|
|
4794
|
-
const
|
|
4795
|
-
const zip64CompressedSize = zip64Enabled || maximumCompressedSize > MAX_32_BITS;
|
|
5261
|
+
const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
|
|
5262
|
+
const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
|
|
4796
5263
|
if (zip64UncompressedSize || zip64CompressedSize) {
|
|
4797
5264
|
if (zip64 === false) {
|
|
4798
5265
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
@@ -4801,73 +5268,19 @@
|
|
|
4801
5268
|
}
|
|
4802
5269
|
}
|
|
4803
5270
|
zip64 = zip64 || false;
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
password,
|
|
4818
|
-
rawPassword,
|
|
4819
|
-
level,
|
|
4820
|
-
useWebWorkers,
|
|
4821
|
-
transferStreams,
|
|
4822
|
-
encryptionStrength,
|
|
4823
|
-
extendedTimestamp,
|
|
4824
|
-
zipCrypto,
|
|
4825
|
-
bufferedWrite,
|
|
4826
|
-
createTempStream,
|
|
4827
|
-
keepOrder,
|
|
4828
|
-
useUnicodeFileNames,
|
|
4829
|
-
dataDescriptor,
|
|
4830
|
-
dataDescriptorSignature,
|
|
4831
|
-
signal,
|
|
4832
|
-
msDosCompatible,
|
|
4833
|
-
internalFileAttribute: internalFileAttributes,
|
|
4834
|
-
internalFileAttributes,
|
|
4835
|
-
externalFileAttribute: externalFileAttributes,
|
|
4836
|
-
externalFileAttributes,
|
|
4837
|
-
useCompressionStream,
|
|
4838
|
-
passThrough,
|
|
4839
|
-
encrypted: Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted),
|
|
4840
|
-
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4841
|
-
compressionMethod,
|
|
4842
|
-
uncompressedSize,
|
|
4843
|
-
offset: zipWriter.offset - diskOffset,
|
|
4844
|
-
diskNumberStart: diskNumber,
|
|
4845
|
-
uid,
|
|
4846
|
-
gid,
|
|
4847
|
-
setuid,
|
|
4848
|
-
setgid,
|
|
4849
|
-
sticky,
|
|
4850
|
-
unixMode,
|
|
4851
|
-
msdosAttributesRaw,
|
|
4852
|
-
msdosAttributes,
|
|
4853
|
-
unixExternalUpper
|
|
4854
|
-
});
|
|
4855
|
-
const headerInfo = getHeaderInfo(options);
|
|
4856
|
-
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4857
|
-
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4858
|
-
maximumEntrySize = metadataSize + maximumCompressedSize;
|
|
4859
|
-
if (zipWriter.options[OPTION_USDZ]) {
|
|
4860
|
-
maximumEntrySize += maximumEntrySize + 64;
|
|
4861
|
-
}
|
|
4862
|
-
zipWriter.pendingEntriesSize += maximumEntrySize;
|
|
4863
|
-
let fileEntry;
|
|
4864
|
-
try {
|
|
4865
|
-
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4866
|
-
} finally {
|
|
4867
|
-
zipWriter.pendingEntriesSize -= maximumEntrySize;
|
|
4868
|
-
}
|
|
4869
|
-
Object.assign(fileEntry, { name, comment, extraField });
|
|
4870
|
-
return new Entry(fileEntry);
|
|
5271
|
+
return {
|
|
5272
|
+
reader,
|
|
5273
|
+
resolvedOptions: {
|
|
5274
|
+
dataDescriptor,
|
|
5275
|
+
zip64,
|
|
5276
|
+
zip64UncompressedSize,
|
|
5277
|
+
zip64CompressedSize,
|
|
5278
|
+
uncompressedSize,
|
|
5279
|
+
level,
|
|
5280
|
+
compressionMethod,
|
|
5281
|
+
encrypted: encryptedEntry
|
|
5282
|
+
}
|
|
5283
|
+
};
|
|
4871
5284
|
}
|
|
4872
5285
|
|
|
4873
5286
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
@@ -4884,37 +5297,40 @@
|
|
|
4884
5297
|
headerInfo
|
|
4885
5298
|
} = entryInfo;
|
|
4886
5299
|
const usdz = zipWriter.options[OPTION_USDZ];
|
|
4887
|
-
const previousFileEntry =
|
|
5300
|
+
const previousFileEntry = zipWriter.lastFileEntry;
|
|
4888
5301
|
let fileEntry = {};
|
|
4889
5302
|
let bufferedWrite;
|
|
4890
5303
|
let releaseLockWriter;
|
|
4891
5304
|
let releaseLockCurrentFileEntry;
|
|
4892
5305
|
let writingBufferedEntryData;
|
|
4893
5306
|
let writingEntryData;
|
|
5307
|
+
let writerSizeBeforeEntry;
|
|
5308
|
+
let flushedBufferedSize = 0;
|
|
4894
5309
|
let fileWriter;
|
|
4895
5310
|
files.set(name, fileEntry);
|
|
5311
|
+
zipWriter.lastFileEntry = fileEntry;
|
|
4896
5312
|
try {
|
|
4897
5313
|
let lockPreviousFileEntry;
|
|
4898
5314
|
if (keepOrder) {
|
|
4899
5315
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
4900
5316
|
requestLockCurrentFileEntry();
|
|
4901
5317
|
}
|
|
4902
|
-
if (
|
|
5318
|
+
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
5319
|
+
bufferedWrite = true;
|
|
5320
|
+
zipWriter.bufferedWrites++;
|
|
4903
5321
|
if (options.createTempStream) {
|
|
4904
5322
|
fileWriter = await options.createTempStream();
|
|
4905
5323
|
} else {
|
|
4906
5324
|
fileWriter = new TransformStream(UNDEFINED_VALUE, UNDEFINED_VALUE, { highWaterMark: INFINITY_VALUE });
|
|
4907
5325
|
}
|
|
4908
5326
|
fileWriter.size = 0;
|
|
4909
|
-
bufferedWrite = true;
|
|
4910
|
-
zipWriter.bufferedWrites++;
|
|
4911
5327
|
await initStream(writer);
|
|
4912
5328
|
} else {
|
|
4913
5329
|
fileWriter = writer;
|
|
4914
5330
|
await requestLockWriter();
|
|
4915
5331
|
}
|
|
4916
5332
|
await initStream(fileWriter);
|
|
4917
|
-
const {
|
|
5333
|
+
const { diskOffset } = writer;
|
|
4918
5334
|
if (zipWriter.addSplitZipSignature) {
|
|
4919
5335
|
delete zipWriter.addSplitZipSignature;
|
|
4920
5336
|
const signatureArray = new Uint8Array(4);
|
|
@@ -4923,21 +5339,20 @@
|
|
|
4923
5339
|
await writeData(writer, signatureArray);
|
|
4924
5340
|
zipWriter.offset += 4;
|
|
4925
5341
|
}
|
|
4926
|
-
if (usdz) {
|
|
5342
|
+
if (usdz && !bufferedWrite) {
|
|
4927
5343
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
4928
5344
|
}
|
|
4929
|
-
const {
|
|
4930
|
-
localHeaderView,
|
|
4931
|
-
localHeaderArray
|
|
4932
|
-
} = headerInfo;
|
|
5345
|
+
const { localHeaderArray } = headerInfo;
|
|
4933
5346
|
if (!bufferedWrite) {
|
|
4934
5347
|
await lockPreviousFileEntry;
|
|
4935
|
-
await skipDiskIfNeeded(
|
|
5348
|
+
await skipDiskIfNeeded();
|
|
4936
5349
|
}
|
|
4937
|
-
const
|
|
4938
|
-
|
|
5350
|
+
const diskNumberStart = writer.diskNumber;
|
|
5351
|
+
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5352
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
4939
5353
|
if (!bufferedWrite) {
|
|
4940
5354
|
writingEntryData = true;
|
|
5355
|
+
writerSizeBeforeEntry = writer.size;
|
|
4941
5356
|
await writeData(fileWriter, localHeaderArray);
|
|
4942
5357
|
}
|
|
4943
5358
|
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
|
|
@@ -4950,16 +5365,24 @@
|
|
|
4950
5365
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
4951
5366
|
await requestLockWriter();
|
|
4952
5367
|
writingBufferedEntryData = true;
|
|
5368
|
+
writerSizeBeforeEntry = writer.size;
|
|
5369
|
+
await skipDiskIfNeeded();
|
|
4953
5370
|
fileEntry.diskNumberStart = writer.diskNumber;
|
|
4954
|
-
fileEntry.offset = zipWriter
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
|
|
4958
|
-
|
|
5371
|
+
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5372
|
+
if (usdz) {
|
|
5373
|
+
// the padding depends on the entry offset, only known now that the writer is locked
|
|
5374
|
+
const previousMetadataSize = entryInfo.metadataSize;
|
|
5375
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
|
|
5376
|
+
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5377
|
+
}
|
|
5378
|
+
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
5379
|
+
await writeData(writer, headerInfo.localHeaderArray);
|
|
5380
|
+
await flushBufferedData(fileWriter.readable, writer, signal, chunkLength => flushedBufferedSize += chunkLength);
|
|
4959
5381
|
writer.size += fileWriter.size;
|
|
4960
5382
|
writingBufferedEntryData = false;
|
|
4961
5383
|
} else {
|
|
4962
|
-
fileEntry.
|
|
5384
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
5385
|
+
fileEntry.offset = entryOffset;
|
|
4963
5386
|
}
|
|
4964
5387
|
zipWriter.offset += fileEntry.size;
|
|
4965
5388
|
return fileEntry;
|
|
@@ -4973,10 +5396,9 @@
|
|
|
4973
5396
|
// ignored
|
|
4974
5397
|
}
|
|
4975
5398
|
}
|
|
5399
|
+
zipWriter.offset += writer.size - writerSizeBeforeEntry;
|
|
4976
5400
|
if (bufferedWrite) {
|
|
4977
|
-
zipWriter.offset +=
|
|
4978
|
-
} else {
|
|
4979
|
-
zipWriter.offset = fileWriter.size;
|
|
5401
|
+
zipWriter.offset += flushedBufferedSize;
|
|
4980
5402
|
}
|
|
4981
5403
|
}
|
|
4982
5404
|
files.delete(name);
|
|
@@ -5007,10 +5429,10 @@
|
|
|
5007
5429
|
await lockWriter;
|
|
5008
5430
|
}
|
|
5009
5431
|
|
|
5010
|
-
async function skipDiskIfNeeded(
|
|
5432
|
+
async function skipDiskIfNeeded() {
|
|
5011
5433
|
if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
|
|
5012
5434
|
writer.availableSize = 0;
|
|
5013
|
-
await writeData(
|
|
5435
|
+
await writeData(writer, new Uint8Array());
|
|
5014
5436
|
}
|
|
5015
5437
|
}
|
|
5016
5438
|
}
|
|
@@ -5151,6 +5573,10 @@
|
|
|
5151
5573
|
uncompressedSize = result.inputSize;
|
|
5152
5574
|
signature = result.signature;
|
|
5153
5575
|
}
|
|
5576
|
+
if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
|
|
5577
|
+
(!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
|
|
5578
|
+
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5579
|
+
}
|
|
5154
5580
|
} catch (error) {
|
|
5155
5581
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
5156
5582
|
writer.size += error.outputSize;
|
|
@@ -5213,35 +5639,28 @@
|
|
|
5213
5639
|
uncompressedSize
|
|
5214
5640
|
} = options;
|
|
5215
5641
|
let { version, compressionMethod } = options;
|
|
5216
|
-
const compressed = !directory && (
|
|
5642
|
+
const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
|
|
5643
|
+
? (level === UNDEFINED_VALUE || level > 0)
|
|
5644
|
+
: compressionMethod !== COMPRESSION_METHOD_STORE);
|
|
5217
5645
|
let rawLocalExtraFieldZip64;
|
|
5218
5646
|
const uncompressedFile = passThrough || !compressed;
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
setUint16(rawLocalExtraFieldZip64View, 2, getLength(rawLocalExtraFieldZip64) - 4);
|
|
5647
|
+
// entries without a data descriptor are always buffered (cf. getFileEntry), so the
|
|
5648
|
+
// zip64 extra field values can be patched into the local header before flushing it
|
|
5649
|
+
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
|
|
5650
|
+
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
5651
|
+
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
5652
|
+
// APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
|
|
5653
|
+
// uncompressed and compressed size fields
|
|
5654
|
+
const length = 4 + 16;
|
|
5655
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
5656
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
5657
|
+
extraFieldZip64.uint16(length - 4);
|
|
5658
|
+
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
5232
5659
|
if (zip64ExtraFieldComplete) {
|
|
5233
|
-
|
|
5234
|
-
|
|
5235
|
-
|
|
5236
|
-
|
|
5237
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5238
|
-
}
|
|
5239
|
-
if (zip64CompressedSize && uncompressedFile) {
|
|
5240
|
-
setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
|
|
5241
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5242
|
-
}
|
|
5243
|
-
if (rawLocalExtraFieldZip64Offset == 4) {
|
|
5244
|
-
rawLocalExtraFieldZip64 = new Uint8Array();
|
|
5660
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
5661
|
+
if (uncompressedFile) {
|
|
5662
|
+
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
5663
|
+
extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
5245
5664
|
}
|
|
5246
5665
|
}
|
|
5247
5666
|
} else {
|
|
@@ -5249,11 +5668,11 @@
|
|
|
5249
5668
|
}
|
|
5250
5669
|
let rawExtraFieldAES;
|
|
5251
5670
|
if (encrypted && !zipCrypto) {
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5671
|
+
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
5672
|
+
extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
|
|
5673
|
+
extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
|
|
5674
|
+
rawExtraFieldAES = extraFieldAES.array;
|
|
5675
|
+
rawExtraFieldAES[8] = encryptionStrength;
|
|
5257
5676
|
} else {
|
|
5258
5677
|
rawExtraFieldAES = new Uint8Array();
|
|
5259
5678
|
}
|
|
@@ -5261,33 +5680,38 @@
|
|
|
5261
5680
|
let rawExtraFieldExtendedTimestamp;
|
|
5262
5681
|
let extraFieldExtendedTimestampFlag;
|
|
5263
5682
|
if (extendedTimestamp) {
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5683
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
5684
|
+
if (inUnixTimeRange(lastModTimeUnix)) {
|
|
5685
|
+
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
5686
|
+
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
5687
|
+
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
5688
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5689
|
+
extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
|
|
5690
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
5691
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
5692
|
+
if (lastAccessDate) {
|
|
5693
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
5694
|
+
}
|
|
5695
|
+
if (creationDate) {
|
|
5696
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
5697
|
+
}
|
|
5698
|
+
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
5699
|
+
} else {
|
|
5700
|
+
// the date cannot be stored as a 32-bit time_t; the NTFS field replaces it
|
|
5701
|
+
rawExtraFieldExtendedTimestamp = new Uint8Array();
|
|
5279
5702
|
}
|
|
5280
5703
|
try {
|
|
5281
|
-
rawExtraFieldNTFS = new Uint8Array(36);
|
|
5282
|
-
const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
|
|
5283
5704
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5705
|
+
const extraFieldNTFS = createRecordWriter(36);
|
|
5706
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
|
|
5707
|
+
extraFieldNTFS.uint16(32);
|
|
5708
|
+
extraFieldNTFS.skip(4);
|
|
5709
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
5710
|
+
extraFieldNTFS.uint16(24);
|
|
5711
|
+
extraFieldNTFS.uint64(lastModTimeNTFS);
|
|
5712
|
+
extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
|
|
5713
|
+
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
5714
|
+
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
5291
5715
|
} catch {
|
|
5292
5716
|
rawExtraFieldNTFS = new Uint8Array();
|
|
5293
5717
|
}
|
|
@@ -5296,41 +5720,27 @@
|
|
|
5296
5720
|
}
|
|
5297
5721
|
let rawExtraFieldUnix;
|
|
5298
5722
|
try {
|
|
5299
|
-
const { uid, gid,
|
|
5300
|
-
if (unixExtraFieldType && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE
|
|
5723
|
+
const { uid, gid, unixExtraFieldType } = options;
|
|
5724
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5301
5725
|
const uidBytes = packUnixId(uid);
|
|
5302
5726
|
const gidBytes = packUnixId(gid);
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
rawExtraFieldUnix = new Uint8Array(4 + payloadLength);
|
|
5321
|
-
const rawExtraFieldUnixView = getDataView(rawExtraFieldUnix);
|
|
5322
|
-
setUint16(rawExtraFieldUnixView, 0, unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE ? EXTRAFIELD_TYPE_INFOZIP : EXTRAFIELD_TYPE_UNIX);
|
|
5323
|
-
setUint16(rawExtraFieldUnixView, 2, payloadLength);
|
|
5324
|
-
setUint8(rawExtraFieldUnixView, 4, 1);
|
|
5325
|
-
setUint8(rawExtraFieldUnixView, 5, uidBytes.length);
|
|
5326
|
-
let offset = 6;
|
|
5327
|
-
arraySet(rawExtraFieldUnix, uidBytes, offset);
|
|
5328
|
-
offset += uidBytes.length;
|
|
5329
|
-
setUint8(rawExtraFieldUnixView, offset, gidBytes.length);
|
|
5330
|
-
offset++;
|
|
5331
|
-
arraySet(rawExtraFieldUnix, gidBytes, offset);
|
|
5332
|
-
offset += gidBytes.length;
|
|
5333
|
-
arraySet(rawExtraFieldUnix, modeArray, offset);
|
|
5727
|
+
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
5728
|
+
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
5729
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
5730
|
+
extraFieldUnix.uint16(payloadLength);
|
|
5731
|
+
extraFieldUnix.uint8(1);
|
|
5732
|
+
extraFieldUnix.uint8(uidBytes.length);
|
|
5733
|
+
extraFieldUnix.bytes(uidBytes);
|
|
5734
|
+
extraFieldUnix.uint8(gidBytes.length);
|
|
5735
|
+
extraFieldUnix.bytes(gidBytes);
|
|
5736
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5737
|
+
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5738
|
+
const extraFieldUnix = createRecordWriter(8);
|
|
5739
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
|
|
5740
|
+
extraFieldUnix.uint16(4);
|
|
5741
|
+
extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
5742
|
+
extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
5743
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5334
5744
|
} else {
|
|
5335
5745
|
rawExtraFieldUnix = new Uint8Array();
|
|
5336
5746
|
}
|
|
@@ -5348,8 +5758,11 @@
|
|
|
5348
5758
|
rawExtraFieldAES[9] = compressionMethod;
|
|
5349
5759
|
compressionMethod = COMPRESSION_METHOD_AES;
|
|
5350
5760
|
}
|
|
5351
|
-
const localExtraFieldZip64Length =
|
|
5761
|
+
const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
|
|
5352
5762
|
const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5763
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
5764
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
5765
|
+
}
|
|
5353
5766
|
const {
|
|
5354
5767
|
headerArray,
|
|
5355
5768
|
headerView,
|
|
@@ -5365,29 +5778,27 @@
|
|
|
5365
5778
|
zip64UncompressedSize,
|
|
5366
5779
|
extraFieldLength
|
|
5367
5780
|
});
|
|
5368
|
-
|
|
5369
|
-
const localHeaderArray =
|
|
5781
|
+
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
5782
|
+
const localHeaderArray = localHeader.array;
|
|
5370
5783
|
const localHeaderView = getDataView(localHeaderArray);
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5375
|
-
|
|
5376
|
-
|
|
5377
|
-
|
|
5378
|
-
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
|
|
5382
|
-
localHeaderOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5383
|
-
arraySet(localHeaderArray, rawExtraFieldNTFS, localHeaderOffset);
|
|
5384
|
-
localHeaderOffset += getLength(rawExtraFieldNTFS);
|
|
5385
|
-
arraySet(localHeaderArray, rawExtraFieldUnix, localHeaderOffset);
|
|
5386
|
-
localHeaderOffset += getLength(rawExtraFieldUnix);
|
|
5387
|
-
arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
|
|
5784
|
+
localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
5785
|
+
localHeader.bytes(headerArray);
|
|
5786
|
+
localHeader.bytes(rawFilename);
|
|
5787
|
+
if (writeLocalExtraFieldZip64) {
|
|
5788
|
+
localHeader.bytes(rawLocalExtraFieldZip64);
|
|
5789
|
+
}
|
|
5790
|
+
localHeader.bytes(rawExtraFieldAES);
|
|
5791
|
+
localHeader.bytes(rawExtraFieldExtendedTimestamp);
|
|
5792
|
+
localHeader.bytes(rawExtraFieldNTFS);
|
|
5793
|
+
localHeader.bytes(rawExtraFieldUnix);
|
|
5794
|
+
localHeader.bytes(rawExtraField);
|
|
5388
5795
|
if (dataDescriptor) {
|
|
5389
|
-
|
|
5390
|
-
|
|
5796
|
+
if (!zip64CompressedSize) {
|
|
5797
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5798
|
+
}
|
|
5799
|
+
if (!zip64UncompressedSize) {
|
|
5800
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5801
|
+
}
|
|
5391
5802
|
}
|
|
5392
5803
|
return {
|
|
5393
5804
|
localHeaderArray,
|
|
@@ -5414,7 +5825,7 @@
|
|
|
5414
5825
|
function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
5415
5826
|
const { headerInfo } = entryInfo;
|
|
5416
5827
|
let { localHeaderArray, extraFieldLength } = headerInfo;
|
|
5417
|
-
let localHeaderArrayView
|
|
5828
|
+
let localHeaderArrayView;
|
|
5418
5829
|
let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
|
|
5419
5830
|
if (extraBytesLength < 4) {
|
|
5420
5831
|
extraBytesLength += 64;
|
|
@@ -5422,13 +5833,14 @@
|
|
|
5422
5833
|
const rawExtraFieldUSDZ = new Uint8Array(extraBytesLength);
|
|
5423
5834
|
const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
|
|
5424
5835
|
setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
|
|
5425
|
-
setUint16(extraFieldUSDZView, 2, extraBytesLength -
|
|
5836
|
+
setUint16(extraFieldUSDZView, 2, extraBytesLength - 4);
|
|
5426
5837
|
const previousLocalHeaderArray = localHeaderArray;
|
|
5427
5838
|
headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
|
|
5428
5839
|
arraySet(localHeaderArray, previousLocalHeaderArray);
|
|
5429
5840
|
arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
|
|
5430
5841
|
localHeaderArrayView = getDataView(localHeaderArray);
|
|
5431
5842
|
setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
|
|
5843
|
+
headerInfo.localHeaderView = localHeaderArrayView;
|
|
5432
5844
|
entryInfo.metadataSize += extraBytesLength;
|
|
5433
5845
|
}
|
|
5434
5846
|
|
|
@@ -5551,37 +5963,32 @@
|
|
|
5551
5963
|
}, localHeaderView, { dataDescriptor }) {
|
|
5552
5964
|
if (!dataDescriptor) {
|
|
5553
5965
|
if (!encrypted) {
|
|
5554
|
-
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE +
|
|
5966
|
+
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
|
|
5555
5967
|
}
|
|
5556
5968
|
if (!zip64CompressedSize) {
|
|
5557
|
-
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE +
|
|
5969
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
|
|
5558
5970
|
}
|
|
5559
5971
|
if (!zip64UncompressedSize) {
|
|
5560
|
-
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE +
|
|
5972
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, uncompressedSize);
|
|
5561
5973
|
}
|
|
5562
5974
|
}
|
|
5563
5975
|
if (zip64 && localExtraFieldZip64Length) {
|
|
5564
|
-
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
5568
|
-
}
|
|
5569
|
-
if (zip64CompressedSize) {
|
|
5570
|
-
setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
|
|
5571
|
-
localHeaderOffset += 8;
|
|
5572
|
-
}
|
|
5976
|
+
// the local zip64 extra field always contains both size slots
|
|
5977
|
+
const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
|
|
5978
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
5979
|
+
setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
|
|
5573
5980
|
}
|
|
5574
5981
|
}
|
|
5575
5982
|
|
|
5576
5983
|
|
|
5577
5984
|
async function closeFile(zipWriter, comment, options) {
|
|
5578
|
-
const
|
|
5579
|
-
const {
|
|
5580
|
-
|
|
5581
|
-
|
|
5985
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
5986
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
5987
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
|
|
5988
|
+
}
|
|
5989
|
+
|
|
5990
|
+
function createDirectoryRecords(files) {
|
|
5582
5991
|
let directoryDataLength = 0;
|
|
5583
|
-
let directoryOffset = zipWriter.offset - diskOffset;
|
|
5584
|
-
let filesLength = files.size;
|
|
5585
5992
|
for (const [, fileEntry] of files) {
|
|
5586
5993
|
const {
|
|
5587
5994
|
rawFilename,
|
|
@@ -5598,24 +6005,27 @@
|
|
|
5598
6005
|
uncompressedSize,
|
|
5599
6006
|
compressedSize
|
|
5600
6007
|
} = fileEntry;
|
|
5601
|
-
const zip64Offset = fileEntry.offset
|
|
5602
|
-
const zip64DiskNumberStart = fileEntry.diskNumberStart
|
|
6008
|
+
const zip64Offset = fileEntry.offset >= MAX_32_BITS;
|
|
6009
|
+
const zip64DiskNumberStart = fileEntry.diskNumberStart >= MAX_16_BITS;
|
|
5603
6010
|
let rawExtraFieldZip64;
|
|
5604
6011
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
5608
|
-
|
|
5609
|
-
if (
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
|
|
5613
|
-
|
|
5614
|
-
|
|
5615
|
-
if (
|
|
5616
|
-
|
|
5617
|
-
|
|
5618
|
-
if (zip64DiskNumberStart) {
|
|
6012
|
+
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
6013
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
6014
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
6015
|
+
extraFieldZip64.uint16(length - 4);
|
|
6016
|
+
if (zip64UncompressedSize) {
|
|
6017
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
6018
|
+
}
|
|
6019
|
+
if (zip64CompressedSize) {
|
|
6020
|
+
extraFieldZip64.uint64(compressedSize);
|
|
6021
|
+
}
|
|
6022
|
+
if (zip64Offset) {
|
|
6023
|
+
extraFieldZip64.uint64(fileEntry.offset);
|
|
6024
|
+
}
|
|
6025
|
+
if (zip64DiskNumberStart) {
|
|
6026
|
+
extraFieldZip64.uint32(fileEntry.diskNumberStart);
|
|
6027
|
+
}
|
|
6028
|
+
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
5619
6029
|
} else {
|
|
5620
6030
|
rawExtraFieldZip64 = new Uint8Array();
|
|
5621
6031
|
}
|
|
@@ -5623,32 +6033,41 @@
|
|
|
5623
6033
|
fileEntry.zip64Offset = zip64Offset;
|
|
5624
6034
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
5625
6035
|
let rawExtraFieldTimestamp;
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
const
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
6036
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
6037
|
+
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
6038
|
+
const extraFieldTimestamp = createRecordWriter(9);
|
|
6039
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
6040
|
+
extraFieldTimestamp.uint16(5);
|
|
6041
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
6042
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
6043
|
+
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
5633
6044
|
} else {
|
|
5634
6045
|
rawExtraFieldTimestamp = new Uint8Array();
|
|
5635
6046
|
}
|
|
5636
6047
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
|
|
5641
|
-
|
|
5642
|
-
|
|
5643
|
-
|
|
5644
|
-
|
|
5645
|
-
|
|
5646
|
-
|
|
6048
|
+
const extraFieldLength = getLength(
|
|
6049
|
+
rawExtraFieldZip64,
|
|
6050
|
+
rawExtraFieldAES,
|
|
6051
|
+
rawExtraFieldNTFS,
|
|
6052
|
+
rawExtraFieldUnix,
|
|
6053
|
+
rawExtraFieldTimestamp,
|
|
6054
|
+
rawExtraField);
|
|
6055
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
6056
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6057
|
+
}
|
|
6058
|
+
directoryDataLength += CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
5647
6059
|
}
|
|
6060
|
+
return directoryDataLength;
|
|
6061
|
+
}
|
|
6062
|
+
|
|
6063
|
+
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
6064
|
+
const { files, writer } = zipWriter;
|
|
5648
6065
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
5649
|
-
const directoryView = getDataView(directoryArray);
|
|
5650
6066
|
await initStream(writer);
|
|
6067
|
+
let offset = 0;
|
|
5651
6068
|
let directoryDiskOffset = 0;
|
|
6069
|
+
let cdStartDiskNumber = writer.diskNumber;
|
|
6070
|
+
let cdStartDiskOffset = writer.diskOffset;
|
|
5652
6071
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
5653
6072
|
const {
|
|
5654
6073
|
offset: fileEntryOffset,
|
|
@@ -5674,52 +6093,46 @@
|
|
|
5674
6093
|
compressedSize
|
|
5675
6094
|
} = fileEntry;
|
|
5676
6095
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5677
|
-
|
|
5678
|
-
|
|
6096
|
+
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6097
|
+
if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
|
|
6098
|
+
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6099
|
+
directoryDiskOffset = offset;
|
|
6100
|
+
writer.availableSize = 0;
|
|
6101
|
+
await writeData(writer, new Uint8Array());
|
|
6102
|
+
}
|
|
6103
|
+
if (indexFileEntry == 0) {
|
|
6104
|
+
cdStartDiskNumber = writer.diskNumber;
|
|
6105
|
+
cdStartDiskOffset = writer.diskOffset;
|
|
6106
|
+
}
|
|
5679
6107
|
if (!zip64UncompressedSize) {
|
|
5680
6108
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
5681
6109
|
}
|
|
5682
6110
|
if (!zip64CompressedSize) {
|
|
5683
6111
|
setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
|
|
5684
6112
|
}
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
|
|
5703
|
-
|
|
5704
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
|
|
5708
|
-
directoryOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5709
|
-
arraySet(directoryArray, rawExtraFieldNTFS, directoryOffset);
|
|
5710
|
-
directoryOffset += getLength(rawExtraFieldNTFS);
|
|
5711
|
-
arraySet(directoryArray, rawExtraFieldUnix, directoryOffset);
|
|
5712
|
-
directoryOffset += getLength(rawExtraFieldUnix);
|
|
5713
|
-
arraySet(directoryArray, rawExtraField, directoryOffset);
|
|
5714
|
-
directoryOffset += getLength(rawExtraField);
|
|
5715
|
-
arraySet(directoryArray, rawComment, directoryOffset);
|
|
5716
|
-
directoryOffset += getLength(rawComment);
|
|
5717
|
-
if (offset - directoryDiskOffset > writer.availableSize) {
|
|
5718
|
-
writer.availableSize = 0;
|
|
5719
|
-
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
5720
|
-
directoryDiskOffset = offset;
|
|
5721
|
-
}
|
|
5722
|
-
offset = directoryOffset;
|
|
6113
|
+
if ((zip64Offset || zip64DiskNumberStart) && fileEntry.version < VERSION_ZIP64) {
|
|
6114
|
+
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
6115
|
+
}
|
|
6116
|
+
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
6117
|
+
directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
6118
|
+
directoryRecord.uint16(versionMadeBy);
|
|
6119
|
+
directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
6120
|
+
directoryRecord.uint16(extraFieldLength);
|
|
6121
|
+
directoryRecord.uint16(getLength(rawComment));
|
|
6122
|
+
directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
6123
|
+
directoryRecord.uint16(internalFileAttributes);
|
|
6124
|
+
directoryRecord.uint32(externalFileAttributes);
|
|
6125
|
+
directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
6126
|
+
directoryRecord.bytes(rawFilename);
|
|
6127
|
+
directoryRecord.bytes(rawExtraFieldZip64);
|
|
6128
|
+
directoryRecord.bytes(rawExtraFieldAES);
|
|
6129
|
+
directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
|
|
6130
|
+
directoryRecord.bytes(rawExtraFieldNTFS);
|
|
6131
|
+
directoryRecord.bytes(rawExtraFieldUnix);
|
|
6132
|
+
directoryRecord.bytes(rawExtraField);
|
|
6133
|
+
directoryRecord.bytes(rawComment);
|
|
6134
|
+
arraySet(directoryArray, directoryRecord.array, offset);
|
|
6135
|
+
offset += directoryRecordLength;
|
|
5723
6136
|
if (options.onprogress) {
|
|
5724
6137
|
try {
|
|
5725
6138
|
await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
|
|
@@ -5729,36 +6142,53 @@
|
|
|
5729
6142
|
}
|
|
5730
6143
|
}
|
|
5731
6144
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6145
|
+
return { cdStartDiskNumber, cdStartDiskOffset };
|
|
6146
|
+
}
|
|
6147
|
+
|
|
6148
|
+
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6149
|
+
const { writer } = zipWriter;
|
|
6150
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
|
|
6151
|
+
let { directoryDataLength } = cdInfo;
|
|
6152
|
+
let filesLength = zipWriter.files.size;
|
|
6153
|
+
let diskNumber = cdStartDiskNumber;
|
|
6154
|
+
let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
|
|
5732
6155
|
let lastDiskNumber = writer.diskNumber;
|
|
5733
|
-
|
|
5734
|
-
if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
6156
|
+
if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5735
6157
|
lastDiskNumber++;
|
|
5736
6158
|
}
|
|
5737
6159
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
5738
|
-
if (directoryOffset
|
|
6160
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
5739
6161
|
if (zip64 === false) {
|
|
5740
6162
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5741
6163
|
} else {
|
|
5742
6164
|
zip64 = true;
|
|
5743
6165
|
}
|
|
5744
6166
|
}
|
|
5745
|
-
const
|
|
5746
|
-
|
|
5747
|
-
|
|
6167
|
+
const commentLength = getLength(comment);
|
|
6168
|
+
if (commentLength > MAX_16_BITS) {
|
|
6169
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
6170
|
+
}
|
|
6171
|
+
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6172
|
+
if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
|
|
6173
|
+
writer.availableSize = 0;
|
|
6174
|
+
await writeData(writer, new Uint8Array());
|
|
6175
|
+
}
|
|
6176
|
+
lastDiskNumber = writer.diskNumber;
|
|
5748
6177
|
if (zip64) {
|
|
5749
|
-
|
|
5750
|
-
|
|
5751
|
-
|
|
5752
|
-
|
|
5753
|
-
|
|
5754
|
-
|
|
5755
|
-
|
|
5756
|
-
|
|
5757
|
-
|
|
5758
|
-
|
|
5759
|
-
|
|
5760
|
-
|
|
5761
|
-
|
|
6178
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6179
|
+
endOfdirectoryRecord.uint64(44);
|
|
6180
|
+
endOfdirectoryRecord.uint16(45);
|
|
6181
|
+
endOfdirectoryRecord.uint16(45);
|
|
6182
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6183
|
+
endOfdirectoryRecord.uint32(diskNumber);
|
|
6184
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6185
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6186
|
+
endOfdirectoryRecord.uint64(directoryDataLength);
|
|
6187
|
+
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6188
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6189
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6190
|
+
endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
|
|
6191
|
+
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
5762
6192
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
5763
6193
|
if (supportZip64SplitFile) {
|
|
5764
6194
|
lastDiskNumber = MAX_16_BITS;
|
|
@@ -5767,29 +6197,40 @@
|
|
|
5767
6197
|
filesLength = MAX_16_BITS;
|
|
5768
6198
|
directoryOffset = MAX_32_BITS;
|
|
5769
6199
|
directoryDataLength = MAX_32_BITS;
|
|
5770
|
-
offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
|
|
5771
|
-
}
|
|
5772
|
-
setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
|
|
5773
|
-
setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
|
|
5774
|
-
setUint16(endOfdirectoryView, offset + 6, diskNumber);
|
|
5775
|
-
setUint16(endOfdirectoryView, offset + 8, filesLength);
|
|
5776
|
-
setUint16(endOfdirectoryView, offset + 10, filesLength);
|
|
5777
|
-
setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
|
|
5778
|
-
setUint32(endOfdirectoryView, offset + 16, directoryOffset);
|
|
5779
|
-
const commentLength = getLength(comment);
|
|
5780
|
-
if (commentLength) {
|
|
5781
|
-
if (commentLength <= MAX_16_BITS) {
|
|
5782
|
-
setUint16(endOfdirectoryView, offset + 20, commentLength);
|
|
5783
|
-
} else {
|
|
5784
|
-
throw new Error(ERR_INVALID_COMMENT);
|
|
5785
|
-
}
|
|
5786
6200
|
}
|
|
5787
|
-
|
|
6201
|
+
endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6202
|
+
endOfdirectoryRecord.uint16(lastDiskNumber);
|
|
6203
|
+
endOfdirectoryRecord.uint16(diskNumber);
|
|
6204
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6205
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6206
|
+
endOfdirectoryRecord.uint32(directoryDataLength);
|
|
6207
|
+
endOfdirectoryRecord.uint32(directoryOffset);
|
|
6208
|
+
endOfdirectoryRecord.uint16(commentLength);
|
|
6209
|
+
await writeData(writer, endOfdirectoryRecord.array);
|
|
5788
6210
|
if (commentLength) {
|
|
5789
6211
|
await writeData(writer, comment);
|
|
5790
6212
|
}
|
|
5791
6213
|
}
|
|
5792
6214
|
|
|
6215
|
+
function createRecordWriter(length) {
|
|
6216
|
+
const array = new Uint8Array(length);
|
|
6217
|
+
const view = getDataView(array);
|
|
6218
|
+
let offset = 0;
|
|
6219
|
+
return {
|
|
6220
|
+
array,
|
|
6221
|
+
uint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
6222
|
+
uint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
6223
|
+
uint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
6224
|
+
uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
6225
|
+
bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
6226
|
+
skip: count => offset += count
|
|
6227
|
+
};
|
|
6228
|
+
}
|
|
6229
|
+
|
|
6230
|
+
function getSegmentOffset(zipWriter, writer) {
|
|
6231
|
+
return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
|
|
6232
|
+
}
|
|
6233
|
+
|
|
5793
6234
|
async function writeData(writer, array) {
|
|
5794
6235
|
const { writable } = writer;
|
|
5795
6236
|
const streamWriter = writable.getWriter();
|
|
@@ -5802,12 +6243,40 @@
|
|
|
5802
6243
|
}
|
|
5803
6244
|
}
|
|
5804
6245
|
|
|
6246
|
+
async function flushBufferedData(readable, writer, signal, onChunkWritten) {
|
|
6247
|
+
const streamWriter = writer.writable.getWriter();
|
|
6248
|
+
try {
|
|
6249
|
+
await readable.pipeTo(new WritableStream({
|
|
6250
|
+
async write(chunk) {
|
|
6251
|
+
await streamWriter.ready;
|
|
6252
|
+
await streamWriter.write(chunk);
|
|
6253
|
+
onChunkWritten(getLength(chunk));
|
|
6254
|
+
}
|
|
6255
|
+
}), { preventClose: true, preventAbort: true, signal });
|
|
6256
|
+
} finally {
|
|
6257
|
+
streamWriter.releaseLock();
|
|
6258
|
+
}
|
|
6259
|
+
}
|
|
6260
|
+
|
|
5805
6261
|
function getTimeNTFS(date) {
|
|
5806
6262
|
if (date) {
|
|
5807
6263
|
return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
|
|
5808
6264
|
}
|
|
5809
6265
|
}
|
|
5810
6266
|
|
|
6267
|
+
function getTimeUnix(date) {
|
|
6268
|
+
return Math.floor(date.getTime() / 1000);
|
|
6269
|
+
}
|
|
6270
|
+
|
|
6271
|
+
// the extended timestamp extra field stores dates as signed 32-bit time_t values
|
|
6272
|
+
function inUnixTimeRange(timeUnix) {
|
|
6273
|
+
return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
|
|
6274
|
+
}
|
|
6275
|
+
|
|
6276
|
+
function clampUnixTime(timeUnix) {
|
|
6277
|
+
return Math.min(MAX_UNIX_TIME, Math.max(MIN_UNIX_TIME, timeUnix));
|
|
6278
|
+
}
|
|
6279
|
+
|
|
5811
6280
|
function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
5812
6281
|
const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
|
|
5813
6282
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
@@ -5838,7 +6307,7 @@
|
|
|
5838
6307
|
}
|
|
5839
6308
|
|
|
5840
6309
|
function getDataView(array) {
|
|
5841
|
-
return new DataView(array.buffer);
|
|
6310
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
5842
6311
|
}
|
|
5843
6312
|
|
|
5844
6313
|
function getLength(...arrayLikes) {
|
|
@@ -5854,30 +6323,39 @@
|
|
|
5854
6323
|
uncompressedSize,
|
|
5855
6324
|
compressedSize,
|
|
5856
6325
|
lastModDate,
|
|
6326
|
+
rawLastModDate,
|
|
5857
6327
|
rawFilename,
|
|
5858
6328
|
zip64CompressedSize,
|
|
5859
6329
|
zip64UncompressedSize,
|
|
5860
6330
|
extraFieldLength
|
|
5861
6331
|
}) {
|
|
5862
|
-
const
|
|
6332
|
+
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
6333
|
+
const headerArray = headerRecord.array;
|
|
5863
6334
|
const headerView = getDataView(headerArray);
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
5867
|
-
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
5872
|
-
|
|
6335
|
+
headerRecord.uint16(version);
|
|
6336
|
+
headerRecord.uint16(bitFlag);
|
|
6337
|
+
headerRecord.uint16(compressionMethod);
|
|
6338
|
+
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
6339
|
+
const dateArray = new Uint32Array(1);
|
|
6340
|
+
const dateView = getDataView(dateArray);
|
|
6341
|
+
setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
|
|
6342
|
+
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
6343
|
+
rawLastModDate = dateArray[0];
|
|
6344
|
+
}
|
|
6345
|
+
headerRecord.uint32(rawLastModDate);
|
|
6346
|
+
headerRecord.skip(4);
|
|
5873
6347
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
5874
|
-
|
|
6348
|
+
headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
6349
|
+
} else {
|
|
6350
|
+
headerRecord.skip(4);
|
|
5875
6351
|
}
|
|
5876
6352
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
5877
|
-
|
|
6353
|
+
headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
6354
|
+
} else {
|
|
6355
|
+
headerRecord.skip(4);
|
|
5878
6356
|
}
|
|
5879
|
-
|
|
5880
|
-
|
|
6357
|
+
headerRecord.uint16(getLength(rawFilename));
|
|
6358
|
+
headerRecord.uint16(extraFieldLength);
|
|
5881
6359
|
return {
|
|
5882
6360
|
headerArray,
|
|
5883
6361
|
headerView,
|
|
@@ -5978,7 +6456,7 @@
|
|
|
5978
6456
|
// ignored
|
|
5979
6457
|
}
|
|
5980
6458
|
|
|
5981
|
-
var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:v}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],F=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:F,next_in_index:0,avail_in:0,total_in:0,next_out:F,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,v:t,k:0,m:0,p:0,I:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.M=t,this.F=0;}},re=class{constructor(e,t,n,r,i){this.q=e,this.N=t,this.V=n,this.W=r,this.S=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.$[e.A++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.U+e.D;return e.$[f]=255&i,e.$[f+1]=i>>>8&255,e.$[f+2]=r,e.D+=3,i=i-1&65535,e.C[__[r]+ie+1].Z++,e.T[T_(i)].Z++,e.D==e.B}function ye(e,t){let n=255&t,r=e.U+e.D;return e.$[r]=0,e.$[r+1]=0,e.$[r+2]=n,e.D+=3,e.C[n].Z++,e.D==e.B}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+I-1)/I),f=1<<8+He;return {...Je(e,15),o:e,R:42,G:0,O:void 0,P:32767,H:t,J:n,X:r,Y:i,j:new E(32768),K:new E(n),ee:f,$:new x(32768),te:0,ne:32768,A:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,he:0,de:0,we:0,be:0,ge:0,ve:0,ke:0,me:0,xe:0,ye:0,pe:new H(2*we+1),Ie:new x(2*we+1),ze:new E(be+1),D:0,B:0,Le:F,U:0,Ee:0,Me:0,Fe:8,qe:32768,Ne:0,Ve:0,We:0,C:new v(le).fill(0).map(()=>Q()),T:new v(2*me+1).fill(0).map(()=>Q()),Se:new v(2*oe+1).fill(0).map(()=>Q()),$e:S_(),Ae:S_(),Ue:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.De=i,t.push(f);}return t}function Q(){return {Z:0,Qe:0,Ze:0,De:0}}function S_(){return new ne([],mn(null,F,0,0,0))}function mn(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new v(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=bn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function bn(e){let t=N.max(...e),n=new v(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new v(e.length).fill(0),i=new v(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,I=3,_e=258,ae=_e+I+1,Ue=16,Be=_e,hn=29,ie=256,we=ie+1+hn,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,ke=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Ze=new E(19);Ze[16]=2,Ze[17]=3,Ze[18]=7;var sn=D_(J_()),xn=D_(new v(30).fill(5)),Fe=A_(sn),v_=A_(xn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function he(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var pn=(()=>{let e=new v(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^pn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.I?(De(e,e.p),e.p=0,e.I=0):e.I>=8&&(g(e,e.p),e.p>>=8,e.I-=8);}function bt(e){e.I>8?De(e,e.p):e.I>0&&g(e,e.p),e.Ee=1+(e.I-1&7),e.p=0,e.I=0;}function Sn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].De;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.I>Ue-n?(e.p=65535&(e.p|t<<e.I),De(e,e.p),e.p=t>>Ue-e.I&65535,e.I+=n-Ue):(e.p=65535&(e.p|t<<e.I),e.I+=n);}function ht(e){for(let t=0;t<e.C.length;t++)e.C[t].Z=0;for(let t=0;t<e.T.length;t++)e.T[t].Z=0;for(let t=0;t<e.Se.length;t++)e.Se[t].Z=0;e.C[ke].Z=1,e.ie=e.fe=0,e.D=e._e=0;}function st(e){if(e.C&&e.C.length>=le)for(let t=0;t<le;t++)e.C[t]=Q();else {e.C=[];for(let t=0;t<le;t++)e.C.push(Q());}if(e.T&&e.T.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.T[t]=Q();else {e.T=[];for(let t=0;t<2*me+1;t++)e.T.push(Q());}if(e.Se&&e.Se.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.Se[t]=Q();else {e.Se=[];for(let t=0;t<2*oe+1;t++)e.Se.push(Q());}e.$e=new ne(e.C,new re(Fe,a_,ie+1,we,be)),e.Ae=new ne(e.T,new re(v_,i_,0,me,be)),e.Ue=new ne(e.Se,new re(null,Ze,0,oe,7)),e.p=0,e.I=0,e.Ee=0,ht(e);}var se=1;function En(e,t,n){return n=e.pe[se],e.pe[se]=e.pe[e.Ve--],k_(e,t,se),n}function ft(e,t,n,r){return e[t].Z<e[n].Z||e[t].Z==e[n].Z&&r[t]<=r[n]}function k_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.Ve&&(i<e.Ve&&ft(t,e.pe[i+1],e.pe[i],e.Ie)&&i++,!ft(t,r,e.pe[i],e.Ie));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function gn(e,t){let n,r,i,f,_,l,o=t.L,u=t.F,a=t.M.q,c=t.M.N,s=t.M.V,h=t.M.S,d=0;for(f=0;f<=be;f++)e.ze[f]=0;for(o[e.pe[e.We]].De=0,n=e.We+1;n<le;n++)r=e.pe[n],f=o[o[r].Ze].De+1,f>h&&(f=h,d++),o[r].De=f,!(r>u)&&(e.ze[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].Z,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].De+_)));if(0!=d){do{for(f=h-1;0==e.ze[f];)f--;e.ze[f]--,e.ze[f+1]+=2,e.ze[h]--,d-=2;}while(d>0);for(f=h;0!=f;f--)for(r=e.ze[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].De!=f&&(e.ie+=(f-o[i].De)*o[i].Z,o[i].De=f),r--);}}function I_(e,t){let n,r,i,f=t.L,_=t.M.q,l=t.M.W,o=-1;for(e.Ve=0,e.We=le,n=0;n<l;n++)0!=f[n].Z?(e.pe[++e.Ve]=o=n,e.Ie[n]=0):f[n].De=0;for(;e.Ve<2;)i=e.pe[++e.Ve]=o<2?++o:0,f[i].Z=1,e.Ie[i]=0,e.ie--,_&&(e.fe-=_[i].De);for(t.F=o,n=N.floor(e.Ve/2);n>=1;n--)k_(e,f,n);i=l;do{n=En(e,f,n),r=e.pe[se],e.pe[--e.We]=n,e.pe[--e.We]=r,f[i].Z=f[n].Z+f[r].Z,e.Ie[i]=(e.Ie[n]>=e.Ie[r]?e.Ie[n]:e.Ie[r])+1,f[n].Ze=f[r].Ze=i,e.pe[se]=i++,k_(e,f,se);}while(e.Ve>=2);e.pe[--e.We]=e.pe[se],gn(e,t),Sn(f,t.F,e.ze);}function ut(e,t,n){let r,i,f=-1,_=t[0].De,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].De=65535,r=0;r<=n;r++)i=_,_=t[r+1].De,!(++l<o&&i==_)&&(l<u?e.Se[i].Z+=l:0!=i?(i!=f&&e.Se[i].Z++,e.Se[t_].Z++):l<=10?e.Se[n_].Z++:e.Se[r_].Z++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].De,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].De,!(++_<l&&r==f)){if(_<o)do{L(e,e.Se[r].Qe,e.Se[r].De);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.Se[r].Qe,e.Se[r].De),_--),L(e,e.Se[t_].Qe,e.Se[t_].De),L(e,_-3,2)):_<=10?(L(e,e.Se[n_].Qe,e.Se[n_].De),L(e,_-3,3)):(L(e,e.Se[r_].Qe,e.Se[r_].De),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function Tn(e){let t;for(ut(e,e.C,e.$e.F),ut(e,e.T,e.Ae.F),I_(e,e.Ue),t=oe-1;t>=3&&0==e.Se[Se[t]].De;t--);return e.ie+=3*(t+1)+5+5+4,t}function wn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.Se[Se[i]].De,3);ct(e,e.C,t-1),ct(e,e.T,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.$,e.A,t,i,n),e.A+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Fe[ke].Qe,Fe[ke].De),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.D)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].De):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].De),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].De),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.D);L(e,t[ke].Qe,t[ke].De);}function An(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.C[t].Z)return 0;if(0!=e.C[9].Z||0!=e.C[10].Z||0!=e.C[13].Z)return 1;for(t=32;t<ie;t++)if(0!=e.C[t].Z)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.ge>0?(2==e.o.t&&(e.o.t=An(e)),I_(e,e.$e),I_(e,e.Ae),l=Tn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ve)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Fe,v_)):(L(e,(it<<1)+r,3),wn(e,e.$e.F+1,e.Ae.F+1,l+1),dt(e,e.C,e.T)),ht(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Xe=[{Ce:It,Te:0,Be:0,Re:0,Ge:0},{Ce:z_,Te:4,Be:4,Re:8,Ge:4},{Ce:z_,Te:5,Be:5,Re:16,Ge:8},{Ce:z_,Te:6,Be:16,Re:32,Ge:32},{Ce:Re,Te:4,Be:4,Re:16,Ge:16},{Ce:Re,Te:16,Be:8,Re:16,Ge:32},{Ce:Re,Te:16,Be:16,Re:32,Ge:128},{Ce:Re,Te:32,Be:32,Re:128,Ge:256},{Ce:Re,Te:128,Be:128,Re:256,Ge:1024},{Ce:Re,Te:258,Be:258,Re:258,Ge:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.Y^n)&e.X)>>>0}function u_(e,t){e.be=f_(e,e.be,e.u[t+(I-1)]);let n=e.j[t&e.P]=e.K[e.be];return e.K[e.be]=t,n}function At(e){e.K[e.J-1]=0,je(e.K,0,(e.J-1)*e.K.BYTES_PER_ELEMENT);}function Nn(e){let t,n,r=e.h;for(t=e.J;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.j[t],e.j[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.G?e.i=he(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.G&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.qe-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ne-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Nn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=I){let t=e.ae-e.le;for(e.be=e.u[t],e.be=f_(e,e.be,e.u[t+1]);e.le&&(e.be=f_(e,e.be,e.u[t+I-1]),e.j[t&e.P]=e.K[e.be],e.K[e.be]=t,t++,e.le--,!(e.ce+e.le<I)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.k<e.qe){let t,n=e.ae+e.ce;e.k<n?(t=e.qe-n,t>Be&&(t=Be),je(e.u,n,t),e.k=n+t):e.k<n+Be&&(t=n+Be-e.k,t>e.qe-e.k&&(t=e.qe-e.k),je(e.u,e.k,t),e.k+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.R=42,l.G=_,l.O=void 0,l.v=r,l.h=1<<l.v,l.P=l.h-1,l.H=i+7,l.J=1<<l.H,l.X=l.J-1,l.Y=(l.H+I-1)/I,l.u=new x(2*l.h),l.j=new E(l.h),l.K=new E(l.J),l.k=0,l.ee=1<<i+6,l.$=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.j&&l.K&&l.$?(l.Le=l.$.subarray(l.ee),l.U=l.te+l.ee,l.B=3*(l.ee-1),l.ge=t,l.ve=f,l.Fe=n,Cn(e)):(l.R=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.R&&57!=t.R&&69!=t.R&&73!=t.R&&91!=t.R&&103!=t.R&&113!=t.R&&666!=t.R}function Rn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.A=0,t.re=t.te,t.G<0&&(t.G=-t.G),t.R=2==t.G?57:42,e.i=2==t.G?W(0):he(0),t.oe=-2,st(t),0)}function zn(e){e.qe=2*e.h,At(e),e.ye=Xe[e.ge].Te,e.ke=Xe[e.ge].Be,e.me=Xe[e.ge].Re,e.xe=Xe[e.ge].Ge,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.he=I-1,e.we=0,e.be=0;}function Cn(e){let t=Rn(e);return 0==t&&zn(e.l),t}function Ye(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.A,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.$,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.A-=t,0==n.A&&(n.re=n.te));}function Ie(e,t){let n=e.l;n.O&&n.O.Oe&&(e.i=W(e.i,new x(n.$.buffer,n.te+t,n.A-t),n.A-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.R&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.A){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.R&&0!=e.avail_in)return Ae(e,-5);if(42==r.R&&0==r.G&&(r.R=113),42==r.R){let t,n=8+(r.v-8<<4)<<8;if(t=r.ve>=2||r.ge<2?0:r.ge<6?1:6==r.ge?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Ye(r,n),0!=r.ae&&(Ye(r,e.i>>16),Ye(r,65535&e.i)),e.i=1,r.R=113,q(e),0!=r.A)return r.oe=$,0}if(57==r.R)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.O)g(r,(r.O.Pe?1:0)+(r.O.Oe?2:0)+(null==r.O.He?0:4)+(null==r.O.Je?0:8)+(null==r.O.Xe?0:16)),g(r,255&r.O.Ye),g(r,r.O.Ye>>>8&255),g(r,r.O.Ye>>>16&255),g(r,r.O.Ye>>>24&255),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,255&r.O.je),null!=r.O.He&&(g(r,255&r.O.Ke),g(r,r.O.Ke>>>8&255)),r.O.Oe&&(e.i=W(e.i,r.$,r.A)),r.Me=0,r.R=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,tt),r.R=113,q(e),0!=r.A)return r.oe=$,0;if(69==r.R){if(r.O&&null!=r.O.He){let t=r.A,n=(65535&r.O.Ke)-r.Me;for(;r.A+n>r.ne;){let i=r.ne-r.A;if(M(r.$,r.A,r.O.He,r.Me,i),r.A=r.ne,Ie(e,t),r.Me+=i,q(e),0!=r.A)return r.oe=$,0;t=0,n-=i;}M(r.$,r.A,r.O.He,r.Me,n),r.A+=n,Ie(e,t),r.Me=0;}r.R=73;}if(73==r.R){if(r.O&&r.O.Je&&r.O.Je.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Je[r.Me++],g(r,t);}while(0!=t);Ie(e,n),r.Me=0;}r.R=91;}if(91==r.R){if(r.O&&r.O.Xe&&r.O.Xe.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Xe[r.Me++],g(r,t);}while(0!=t);Ie(e,n);}r.R=103;}if(103==r.R){if(r.O&&r.O.Oe){if(r.A+2>r.ne&&(q(e),0!=r.A))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.R=113,q(e),0!=r.A)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.R){let n=0==r.ge?It(r,t):2==r.ve?On(r,t):3==r.ve?Ln(r,t):Xe[r.ge].Ce(r,t);if((2==n||3==n)&&(r.R=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.G<=0?1:(2==r.G?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Ye(r,e.i>>>16&65535),Ye(r,65535&e.i)),q(e),r.G>0&&(r.G=-r.G),0!=r.A?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.R;return t.u=F,t.j=qe,t.K=qe,t.$=F,t.Le=F,t.pe=new H(0),t.Ie=F,t.ze=qe,t.C.length=0,t.T.length=0,t.Se.length=0,t.O=void 0,t.te=0,t.re=0,t.U=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.he,l=e.me,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.j,a=e.P,c=e.u[f],s=e.u[f+1],h=e.u[f+_-1],d=e.u[f+_];e.he>=e.ke&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=d||e.u[n+_-1]!=h||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ne=t,_=r,r>=l)break;h=e.u[f+_-1],d=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function kt(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return kt(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function It(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.I+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.$[e.A-4]=n,e.$[e.A-3]=n>>8,e.$[e.A-2]=~n,e.$[e.A-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.qe-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.k<e.ae&&(e.k=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.qe-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.k<e.ae&&(e.k=e.ae),i=e.I+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=I)if(e.ae,e.Ne,e.se,r=e_(e,e.ae-e.Ne,e.se-I),e.ce-=e.se,e.se<=e.ye&&e.ce>=I){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.be=e.u[e.ae],e.be=f_(e,e.be,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),e.he=e.se,e.de=e.Ne,e.se=I-1,0!=n&&e.he<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ve&&(e.se=I-1)),e.he>=I&&e.se<=e.he){let t=e.ae+e.ce-I;e.ae,e.de,e.he,r=e_(e,e.ae-1-e.de,e.he-I),e.ce-=e.he-1,e.he-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.he);if(e.we=0,e.se=I-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&kt(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Ln(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=I&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=I?(e.ae,e.ae,e.se,n=e_(e,1,e.se-I),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function On(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),zt=[16,1,73,1,200,1],Ct=Ee.map(Wt),Lt=Ee.map(Gt);Ct.push(64,2),Lt.push(142,2);var Ot=de.map(Wt),Ht=de.map(Gt);Ot.push(...zt),Ht.push(...zt);var Ut=new E([...Rt,258,0,0]),Bt=new E([...Rt,3,0,0]),Zt=te(Ot),Ft=te(Ht),Pt=new E([...Nt,0,0]),Mt=new E([...Nt,32769,49153]),Yt=te(Ct),Xt=te(Lt);function Wt(e,t){return t%2?e:e+16}function Gt(e,t){return t%2?e:e+128}function qt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.I>>>0,c=r.et,s=r.tt,h=(1<<r.nt)-1,d=(1<<r.rt)-1,w=r.h>>>0,b=r.k>>>0,g=r.m>>>0,v=r.it,k=f-(t-e.avail_out),m=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,I=0,z=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&h];t:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,0==I){l[f++]=n.lt;break}if(16&I){if(y=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<I)-1,u>>>=I,a-=I;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&d];n:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,16&I){if(p=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<I)-1,u>>>=I,a-=I;}let t=y,c=f-k;if(p>c){let n=p-c;if(n>b&&v){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==g){if(z=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}else if(g<n){z=w+g-n;let e=n-g;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let t=0;t<e;++t)l[f++]=o[z++];if(t-=e,z=0,g<t){for(let e=0;e<g;++e)l[f++]=o[z++];t-=g,z=f-p;}}else {if(z=g-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}for(;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}else {for(z=f-p;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}break}if(64&I){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<I)-1)];continue n}break}if(64&I){if(32&I){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<I)-1)];continue t}}while(i<x&&f<m);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<m?m-f+257:257-(f-m),r.p=u>>>0,r.I=a>>>0;}function Z_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,G:0,ct:false,st:0,ht:0,dt:0,wt:0,u:F,bt:0,gt:0,He:0,et:n,tt:n,nt:0,rt:0,vt:0,kt:0,xt:0,yt:0,It:n,zt:new E(320),Lt:new E(288),Et:new v(r).fill(null).map(()=>pe()),Mt:0,it:true,Ft:0,qt:0,Nt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function F_(e=1){return {_t:64,ft:e,lt:0}}function jt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Un={Nt:false,Vt:Ut,Wt:Zt,St:Pt,$t:Yt,At:20,Ut:257,Qt:0,Dt:d_,Zt:false,Ct:true},Bn={Nt:true,Vt:Bt,Wt:Ft,St:Mt,$t:Xt,At:19,Ut:256,Qt:-1,Dt:m_,Zt:true,Ct:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,h,d,w,b,g,v,k,m,x,y,p,I,z,L,M=new E(Le+1),F=new E(Le+1),q=l?Bn:Un;for(o=0;o<=Le;o++)M[o]=0;for(u=0;u<n;u++)M[t[u]]++;for(s=i.Tt,c=Le;c>=1&&0==M[c];c--);if(s>c&&(s=c),0==c)return q.Ct?(y=F_(1),r.Tt[0]=y,r.Tt[1]=y,i.Tt=1,0):-1;for(a=1;a<c&&0==M[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=M[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(F[1]=0,o=1;o<Le;o++)F[o+1]=F[o]+M[o];for(u=0;u<n;u++)0!=t[u]&&(f[F[t[u]]++]=u);switch(e){case 0:I=z=f,L=q.At;break;case 1:I=q.Vt,z=q.Wt,L=q.Ut;break;default:I=q.St,z=q.$t,L=q.Qt;}if(g=0,u=0,o=a,p=_.Tt,h=s,d=0,m=-1,b=1<<s,x=b-1,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;for(;;){y=Zn(f,u,o,d,e,I,z,L,q.Nt),v=1<<o-d,k=1<<h,a=k;do{k-=v;let e=(g>>d)+k;r.Tt[p+e]={...y};}while(0!=k);for(v=1<<o-1;g&v;)v>>=1;if(0!=v?(g&=v-1,g+=v):g=0,u++,0==--M[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(g&x)!=m){for(0==d&&(d=s),p+=1<<h,h=o-d,w=1<<h;h+d<c&&(w-=M[h+d],!(w<=0));)h++,w<<=1;if(b+=1<<h,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;m=g&x,r.Tt[_.Tt+m]={_t:h,ft:s,lt:p-_.Tt};}}if(0!=g)for(y=F_(o-d);0!=g;){for(0!=d&&(g&x)!=m&&(d=0,o=s,p=_.Tt,h=s,y.ft=o),r.Tt[p+(g>>d)]={...y},v=1<<o-1;g&v;)v>>=1;0!=v?(g&=v-1,g+=v):g=0;}return _.Tt+=b,i.Tt=s,0}function Zn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=jt(n-r);return u}var Qt,$t,Vt=new v(544),Jt=true;function en(e){let t=Ve();return t.l=Z_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Nt&&(t.ot<16191||t.ot>16209)||!t.Nt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.G&&(e.i=1&t.G),t.ot=t.Nt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.ht=t.Nt?65536:32768,delete t.O,t.p=0,t.I=0,t.et=t.Et,t.tt=t.Et,t.It=t.Et,t.it=true,t.Ft=-1,0)}function Wn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.k=0,t.m=0,Xn(e))}function Gn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Nt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Nt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.v!=t&&(r.u=F),r.G=n,r.v=t,Wn(e))}function _n(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Nt;return r=Z_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Nt?16191:16180,n=Gn(e,t),n}function Kn(e){let t={Tt:0};if(Jt){let n,r,i;for(n=0;n<144;)e.zt[n++]=8;for(;n<256;)e.zt[n++]=9;for(;n<280;)e.zt[n++]=7;for(;n<288;)e.zt[n++]=8;for(let e=0;e<544;e++)Vt[e]=pe();i=Vt,Qt=i,r=9;let f={Tt:i},_={Tt:r},l={Tt:0};for(Oe(1,e.zt,288,f,_,e.Lt,l,e.Nt),i=f.Tt,r=_.Tt,e.Mt=l.Tt,n=0;n<32;)e.zt[n++]=5;r=5;let o=l.Tt,u={Tt:i},a={Tt:r};t.Tt=o,Oe(2,e.zt,32,u,a,e.Lt,t,e.Nt),$t=i.slice(o),Jt=false;}e.et=Qt,e.nt=9,e.tt=$t,e.rt=5,e.Mt=t.Tt;}function qn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.v),r.u)))return 1;if(0==r.h&&(r.h=1<<r.v,r.m=0,r.k=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.m=0,r.k=r.h;else {let e=r.h-r.m;e>n&&(e=n),M(r.u,r.m,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.m=n,r.k=r.h):(r.m+=e,r.m==r.h&&(r.m=0),r.k<r.h&&(r.k+=e));}return 0}var h_=class extends z{constructor(){super("Need more input");}};function tn(e,t){let n,r,i,f,_,l,o,u,a,c,s,h,d,w,b,g,v,k=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=F,i=0,f=F,_=0,n=e.l,16191==n.ot&&(n.ot=16192),z(),c=l,s=o,v=0;try{for(;;)switch(n.ot){case 16180:if(0==n.G){n.ot=16192;break}if(N(16),2&n.G&&35615==u){0==n.v&&(n.v=15),n.dt=W(0),n.dt=p(n.dt,u),E(),n.ot=16181;break}if(n.O&&(n.O.Bt=-1),!(1&n.G)||((V(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=V(4)){e.msg="unknown compression method",n.ot=16209;break}if(S(4),g=V(4)+8,0==n.v&&(n.v=g),g>15||g>n.v){e.msg="invalid window size",n.ot=16209;break}n.ht=1<<g,n.st=0,e.i=n.dt=he(0),n.ot=512&u?16189:16191,E();break;case 16181:if(N(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.O&&(n.O.Pe=u>>8&1),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16182;case 16182:N(32),n.O&&(n.O.Ye=u),512&n.st&&4&n.G&&(n.dt=I(n.dt,u)),E(),n.ot=16183;case 16183:N(16),n.O&&(n.O.Rt=255&u,n.O.je=u>>8),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16184;case 16184:1024&n.st?(N(16),n.bt=u,n.O&&(n.O.Ke=u),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E()):n.O&&(n.O.He=F),n.ot=16185;case 16185:if(1024&n.st&&(h=n.bt,h>l&&(h=l),h&&(n.O&&n.O.He&&n.O.Gt&&(g=n.O.Ke-n.bt)<n.O.Gt&&M(n.O.He,g,r,i,h),512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,n.bt-=h),n.bt))return m();n.bt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Ot&&n.bt<n.O.Ot&&(n.O.Je[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Je=F);n.bt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Pt&&n.bt<n.O.Pt&&(n.O.Xe[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Xe=F);n.ot=16188;case 16188:if(512&n.st){if(N(16),4&n.G&&u!=(65535&n.dt)){e.msg="header crc mismatch",n.ot=16209;break}E();}n.O&&(n.O.Oe=n.st>>9&1,n.O.Bt=1),e.i=n.dt=W(0),n.ot=16191;break;case 16189:N(32),e.i=n.dt=P_(u),E(),n.ot=16190;case 16190:if(!n.ct)return L(),2;e.i=n.dt=he(0),n.ot=16191;case 16191:if(5==t||6==t)return m();case 16192:if(n.ut){$(),n.ot=16206;break}switch(N(3),n.ut=!!V(1),S(1),V(2)){case 0:n.ot=16193;break;case 1:if(Kn(n),n.ot=16199,6==t)return S(2),m();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}S(2);break;case 16193:if($(),N(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.bt=65535&u,E(),n.ot=16194,6==t)return m();case 16194:n.ot=16195;case 16195:if(h=n.bt,h){if(h>l&&(h=l),h>o&&(h=o),0==h)return m();M(f,_,r,i,h),l-=h,i+=h,o-=h,_+=h,n.bt-=h;break}n.ot=16191;break;case 16196:if(N(14),n.kt=V(5)+257,S(5),n.xt=V(5)+1,S(5),n.vt=V(4)+4,S(4),n.kt>286||!n.Nt&&n.xt>30){e.msg=n.Nt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.vt;)N(3),n.zt[Se[n.yt++]]=V(3),S(3);for(;n.yt<19;)n.zt[Se[n.yt++]]=0;n.It=n.Et,n.et=n.tt=n.It,n.nt=7;let c={Tt:n.It},k={Tt:n.nt},x={Tt:0};if(v=Oe(0,n.zt,19,c,k,n.Lt,x,n.Nt),n.It=c.Tt,n.nt=k.Tt,v){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.kt+n.xt;){for(;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w.lt<16)S(w.ft),n.zt[n.yt++]=w.lt;else {if(16==w.lt){if(N(w.ft+2),S(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}g=n.zt[n.yt-1],h=3+V(2),S(2);}else 17==w.lt?(N(w.ft+3),S(w.ft),g=0,h=3+V(3),S(3)):(N(w.ft+7),S(w.ft),g=0,h=11+V(7),S(7));if(n.yt+h>n.kt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;h--;)n.zt[n.yt++]=g;}}if(16209==n.ot)break;if(0==n.zt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.It=n.Et,n.nt=9;let A={Tt:n.It},U={Tt:n.nt},Q={Tt:0};v=Oe(1,n.zt,n.kt,A,U,n.Lt,Q,n.Nt),n.It=A.Tt,n.nt=U.Tt;let D=Q.Tt;if(n.et=n.It.slice(0,D),v){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let Z=n.zt.subarray(n.kt,n.kt+n.xt),C={Tt:n.It},T={Tt:n.rt},B={Tt:D};if(v=Oe(2,Z,n.xt,C,T,n.Lt,B,n.Nt),n.It=C.Tt,n.rt=T.Tt,n.tt=n.It.slice(D),v){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return m();case 16199:n.ot=16200;case 16200:if(!n.Nt&&l>=6&&o>=258){L(),qt(e,s),z(),16191==n.ot&&(n.Ft=-1);break}for(n.Ft=0;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w._t&&!(240&w._t)){for(b=w;w=n.et[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,n.bt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.Ft=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.He=15&w._t,n.ot=16201;case 16201:n.He&&(N(n.He),n.bt+=V(n.He),S(n.He),n.Ft+=n.He),n.qt=n.bt,n.ot=16202;case 16202:for(;w=n.tt[V(n.rt)],!(w.ft<=a);)q();if(!(240&w._t)){for(b=w;w=n.tt[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.gt=w.lt,n.He=15&w._t,n.ot=16203;case 16203:n.He&&(N(n.He),n.gt+=V(n.He),S(n.He),n.Ft+=n.He),n.ot=16204;case 16204:if(0==o)return m();if(h=s-o,n.gt>h){if(h=n.gt-h,h>n.k&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}h>n.m?(h-=n.m,d=n.h-h):d=n.m-h,h>n.bt&&(h=n.bt),h>o&&(h=o);for(let e=0;e<h;++e)f[_]=255&n.u[d],++_,++d;}else {d=_-n.gt,h=n.bt,h>o&&(h=o);for(let e=0;e<h;++e)f[_]=f[d],++_,++d;}h>o&&(h=o),o-=h,n.bt-=h,0==n.bt&&(n.ot=16200);break;case 16205:if(0==o)return m();f[_++]=n.bt,o--,n.ot=16200;break;case 16206:if(n.G){if(N(32),s-=o,e.total_out+=s,n.wt+=s,4&n.G&&s){let t=f.subarray(_-s,_);e.i=n.dt=y(n.dt,t,s);}if(s=o,4&n.G&&(n.st?u:P_(u)>>>0)!=n.dt){e.msg="incorrect data check",n.ot=16209;break}E();}n.ot=16207;case 16207:if(n.G&&n.st){if(N(32),4&n.G&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}E();}n.ot=16208;case 16208:return v=1,m();case 16209:return v=-3,m();case 16210:return -4;default:return -2}}catch(e){if(e instanceof h_)return m();throw e}function m(){if(L(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Nt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(qn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.G&&s&&(e.i=n.dt=y(n.dt,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.I+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==v||4==t&&0==v)&&(v=-5),v}function y(e,t,r){return n.st?W(e,t,r):he(e,t,r)}function p(e,t){return k[0]=255&t,k[1]=t>>>8&255,W(e,k,2)>>>0}function I(e,t){return k[0]=255&t,k[1]=t>>>8&255,k[2]=t>>>16&255,k[3]=t>>>24&255,W(e,k,4)>>>0}function z(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.I;}function L(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.I=a;}function E(){u=0,a=0;}function q(){if(0==l)throw new h_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function N(e){for(;a<e;)q();}function V(e){return u&(1<<e)-1}function S(e){u>>>=e,a-=e;}function $(){u>>>=7&a,a-=7&a;}}function nn(e){return Ge(e)?-2:0}var M_=65536,jn=32768,Y_=class{constructor(e=16,t=M_){this.Ht=[],this.Jt=e;for(let n=0;n<N.min(e,4);n++)this.Ht.push(new x(t));}acquire(e=M_){for(let t=this.Ht.length-1;t>=0;t--){let n=this.Ht[t];if(n.length>=e)return this.Ht.splice(t,1),n}return new x(e)}release(e){this.Ht.length<this.Jt&&this.Ht.push(e);}};function rn(e){let t=new Y_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.Xt(),r=e.Yt(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,jn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.jt(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.jt(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.en(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function an(){return new U({start(){},transform(e,t){try{t.enqueue(e.Kt.slice(0));}finally{e.release();}},flush(){}})}function Vn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return rn({Xt:()=>wt(),Yt:e=>Dt(e,r,8,n,8,0),jt:yt,en:B_})}function Jn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return rn({Xt:()=>en("deflate64-raw"==e),Yt:e=>_n(e,t),jt:tn,en:nn})}var s_=class{constructor(e="deflate",t){let n=Vn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(an());}},x_=class{constructor(e="deflate"){let t=Jn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(an());}};
|
|
6459
|
+
var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:y}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Z=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:Z,next_in_index:0,avail_in:0,total_in:0,next_out:Z,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,k:t,m:0,v:0,p:0,M:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.Z=t,this.q=0;}},re=class{constructor(e,t,n,r,i){this.N=e,this.V=t,this.W=n,this.S=r,this.$=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.I[e.D++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.A+e.U;return e.I[f]=255&i,e.I[f+1]=i>>>8&255,e.I[f+2]=r,e.U+=3,i=i-1&65535,e.R[__[r]+ie+1].P++,e.X[T_(i)].P++,e.U==e.C}function ye(e,t){let n=255&t,r=e.A+e.U;return e.I[r]=0,e.I[r+1]=0,e.I[r+2]=n,e.U+=3,e.R[n].P++,e.U==e.C}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+k-1)/k),f=1<<8+He;return {...Je(e,15),o:e,H:42,O:0,T:void 0,Y:32767,B:t,F:n,j:r,G:i,J:new E(32768),K:new E(n),ee:f,I:new x(32768),te:0,ne:32768,D:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,de:0,he:0,we:0,ke:0,be:0,ge:0,me:0,ve:0,xe:0,ye:0,pe:new H(2*we+1),ze:new x(2*we+1),Me:new E(be+1),U:0,C:0,Le:Z,A:0,Ee:0,Ze:0,qe:8,Ne:32768,Ve:0,We:0,Se:0,R:new y(le).fill(0).map(()=>Q()),X:new y(2*me+1).fill(0).map(()=>Q()),$e:new y(2*oe+1).fill(0).map(()=>Q()),Ie:S_(),De:S_(),Ae:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.Ue=i,t.push(f);}return t}function Q(){return {P:0,Qe:0,Pe:0,Ue:0}}function S_(){return new ne([],ln(null,Z,0,0,0))}function ln(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new y(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=fn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function fn(e){let t=N.max(...e),n=new y(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new y(e.length).fill(0),i=new y(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,k=3,_e=258,ae=_e+k+1,Ue=16,Be=_e,un=29,ie=256,we=ie+1+un,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,Ie=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Fe=new E(19);Fe[16]=2,Fe[17]=3,Fe[18]=7;var cn=D_(J_()),dn=D_(new y(30).fill(5)),Ze=A_(cn),v_=A_(dn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function se(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var mn=(()=>{let e=new y(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^mn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.M?(De(e,e.p),e.p=0,e.M=0):e.M>=8&&(g(e,e.p),e.p>>=8,e.M-=8);}function bt(e){e.M>8?De(e,e.p):e.M>0&&g(e,e.p),e.Ee=1+(e.M-1&7),e.p=0,e.M=0;}function bn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].Ue;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.M>Ue-n?(e.p=65535&(e.p|t<<e.M),De(e,e.p),e.p=t>>Ue-e.M&65535,e.M+=n-Ue):(e.p=65535&(e.p|t<<e.M),e.M+=n);}function st(e){for(let t=0;t<e.R.length;t++)e.R[t].P=0;for(let t=0;t<e.X.length;t++)e.X[t].P=0;for(let t=0;t<e.$e.length;t++)e.$e[t].P=0;e.R[Ie].P=1,e.ie=e.fe=0,e.U=e._e=0;}function ht(e){if(e.R&&e.R.length>=le)for(let t=0;t<le;t++)e.R[t]=Q();else {e.R=[];for(let t=0;t<le;t++)e.R.push(Q());}if(e.X&&e.X.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.X[t]=Q();else {e.X=[];for(let t=0;t<2*me+1;t++)e.X.push(Q());}if(e.$e&&e.$e.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.$e[t]=Q();else {e.$e=[];for(let t=0;t<2*oe+1;t++)e.$e.push(Q());}e.Ie=new ne(e.R,new re(Ze,a_,ie+1,we,be)),e.De=new ne(e.X,new re(v_,i_,0,me,be)),e.Ae=new ne(e.$e,new re(null,Fe,0,oe,7)),e.p=0,e.M=0,e.Ee=0,st(e);}var he=1;function sn(e,t,n){return n=e.pe[he],e.pe[he]=e.pe[e.We--],I_(e,t,he),n}function ft(e,t,n,r){return e[t].P<e[n].P||e[t].P==e[n].P&&r[t]<=r[n]}function I_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.We&&(i<e.We&&ft(t,e.pe[i+1],e.pe[i],e.ze)&&i++,!ft(t,r,e.pe[i],e.ze));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function hn(e,t){let n,r,i,f,_,l,o=t.L,u=t.q,a=t.Z.N,c=t.Z.V,s=t.Z.W,d=t.Z.$,h=0;for(f=0;f<=be;f++)e.Me[f]=0;for(o[e.pe[e.Se]].Ue=0,n=e.Se+1;n<le;n++)r=e.pe[n],f=o[o[r].Pe].Ue+1,f>d&&(f=d,h++),o[r].Ue=f,!(r>u)&&(e.Me[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].P,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].Ue+_)));if(0!=h){do{for(f=d-1;0==e.Me[f];)f--;e.Me[f]--,e.Me[f+1]+=2,e.Me[d]--,h-=2;}while(h>0);for(f=d;0!=f;f--)for(r=e.Me[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].Ue!=f&&(e.ie+=(f-o[i].Ue)*o[i].P,o[i].Ue=f),r--);}}function k_(e,t){let n,r,i,f=t.L,_=t.Z.N,l=t.Z.S,o=-1;for(e.We=0,e.Se=le,n=0;n<l;n++)0!=f[n].P?(e.pe[++e.We]=o=n,e.ze[n]=0):f[n].Ue=0;for(;e.We<2;)i=e.pe[++e.We]=o<2?++o:0,f[i].P=1,e.ze[i]=0,e.ie--,_&&(e.fe-=_[i].Ue);for(t.q=o,n=N.floor(e.We/2);n>=1;n--)I_(e,f,n);i=l;do{n=sn(e,f,n),r=e.pe[he],e.pe[--e.Se]=n,e.pe[--e.Se]=r,f[i].P=f[n].P+f[r].P,e.ze[i]=(e.ze[n]>=e.ze[r]?e.ze[n]:e.ze[r])+1,f[n].Pe=f[r].Pe=i,e.pe[he]=i++,I_(e,f,he);}while(e.We>=2);e.pe[--e.Se]=e.pe[he],hn(e,t),bn(f,t.q,e.Me);}function ut(e,t,n){let r,i,f=-1,_=t[0].Ue,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].Ue=65535,r=0;r<=n;r++)i=_,_=t[r+1].Ue,!(++l<o&&i==_)&&(l<u?e.$e[i].P+=l:0!=i?(i!=f&&e.$e[i].P++,e.$e[t_].P++):l<=10?e.$e[n_].P++:e.$e[r_].P++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].Ue,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].Ue,!(++_<l&&r==f)){if(_<o)do{L(e,e.$e[r].Qe,e.$e[r].Ue);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.$e[r].Qe,e.$e[r].Ue),_--),L(e,e.$e[t_].Qe,e.$e[t_].Ue),L(e,_-3,2)):_<=10?(L(e,e.$e[n_].Qe,e.$e[n_].Ue),L(e,_-3,3)):(L(e,e.$e[r_].Qe,e.$e[r_].Ue),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function xn(e){let t;for(ut(e,e.R,e.Ie.q),ut(e,e.X,e.De.q),k_(e,e.Ae),t=oe-1;t>=3&&0==e.$e[Se[t]].Ue;t--);return e.ie+=3*(t+1)+5+5+4,t}function pn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.$e[Se[i]].Ue,3);ct(e,e.R,t-1),ct(e,e.X,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.I,e.D,t,i,n),e.D+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Ze[Ie].Qe,Ze[Ie].Ue),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.U)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].Ue):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].Ue),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].Ue),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.U);L(e,t[Ie].Qe,t[Ie].Ue);}function Sn(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.R[t].P)return 0;if(0!=e.R[9].P||0!=e.R[10].P||0!=e.R[13].P)return 1;for(t=32;t<ie;t++)if(0!=e.R[t].P)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.be>0?(2==e.o.t&&(e.o.t=Sn(e)),k_(e,e.Ie),k_(e,e.De),l=xn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ge)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Ze,v_)):(L(e,(it<<1)+r,3),pn(e,e.Ie.q+1,e.De.q+1,l+1),dt(e,e.R,e.X)),st(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Ye=[{Re:kt,Xe:0,Ce:0,He:0,Oe:0},{Re:z_,Xe:4,Ce:4,He:8,Oe:4},{Re:z_,Xe:5,Ce:5,He:16,Oe:8},{Re:z_,Xe:6,Ce:16,He:32,Oe:32},{Re:Re,Xe:4,Ce:4,He:16,Oe:16},{Re:Re,Xe:16,Ce:8,He:16,Oe:32},{Re:Re,Xe:16,Ce:16,He:32,Oe:128},{Re:Re,Xe:32,Ce:32,He:128,Oe:256},{Re:Re,Xe:128,Ce:128,He:256,Oe:1024},{Re:Re,Xe:258,Ce:258,He:258,Oe:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.G^n)&e.j)>>>0}function u_(e,t){e.ke=f_(e,e.ke,e.u[t+(k-1)]);let n=e.J[t&e.Y]=e.K[e.ke];return e.K[e.ke]=t,n}function At(e){e.K[e.F-1]=0,je(e.K,0,(e.F-1)*e.K.BYTES_PER_ELEMENT);}function Dn(e){let t,n,r=e.h;for(t=e.F;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.J[t],e.J[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.O?e.i=se(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.O&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.Ne-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ve-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Dn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=k){let t=e.ae-e.le;for(e.ke=e.u[t],e.ke=f_(e,e.ke,e.u[t+1]);e.le&&(e.ke=f_(e,e.ke,e.u[t+k-1]),e.J[t&e.Y]=e.K[e.ke],e.K[e.ke]=t,t++,e.le--,!(e.ce+e.le<k)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.m<e.Ne){let t,n=e.ae+e.ce;e.m<n?(t=e.Ne-n,t>Be&&(t=Be),je(e.u,n,t),e.m=n+t):e.m<n+Be&&(t=n+Be-e.m,t>e.Ne-e.m&&(t=e.Ne-e.m),je(e.u,e.m,t),e.m+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.H=42,l.O=_,l.T=void 0,l.k=r,l.h=1<<l.k,l.Y=l.h-1,l.B=i+7,l.F=1<<l.B,l.j=l.F-1,l.G=(l.B+k-1)/k,l.u=new x(2*l.h),l.J=new E(l.h),l.K=new E(l.F),l.m=0,l.ee=1<<i+6,l.I=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.J&&l.K&&l.I?(l.Le=l.I.subarray(l.ee),l.A=l.te+l.ee,l.C=3*(l.ee-1),l.be=t,l.ge=f,l.qe=n,In(e)):(l.H=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.H&&57!=t.H&&69!=t.H&&73!=t.H&&91!=t.H&&103!=t.H&&113!=t.H&&666!=t.H}function yn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.D=0,t.re=t.te,t.O<0&&(t.O=-t.O),t.H=2==t.O?57:42,e.i=2==t.O?W(0):se(0),t.oe=-2,ht(t),0)}function vn(e){e.Ne=2*e.h,At(e),e.ye=Ye[e.be].Xe,e.me=Ye[e.be].Ce,e.ve=Ye[e.be].He,e.xe=Ye[e.be].Oe,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.de=k-1,e.we=0,e.ke=0;}function In(e){let t=yn(e);return 0==t&&vn(e.l),t}function Xe(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.D,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.I,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.D-=t,0==n.D&&(n.re=n.te));}function ke(e,t){let n=e.l;n.T&&n.T.Te&&(e.i=W(e.i,new x(n.I.buffer,n.te+t,n.D-t),n.D-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.H&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.D){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.H&&0!=e.avail_in)return Ae(e,-5);if(42==r.H&&0==r.O&&(r.H=113),42==r.H){let t,n=8+(r.k-8<<4)<<8;if(t=r.ge>=2||r.be<2?0:r.be<6?1:6==r.be?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Xe(r,n),0!=r.ae&&(Xe(r,e.i>>16),Xe(r,65535&e.i)),e.i=1,r.H=113,q(e),0!=r.D)return r.oe=$,0}if(57==r.H)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.T)g(r,(r.T.Ye?1:0)+(r.T.Te?2:0)+(null==r.T.Be?0:4)+(null==r.T.Fe?0:8)+(null==r.T.je?0:16)),g(r,255&r.T.Ge),g(r,r.T.Ge>>>8&255),g(r,r.T.Ge>>>16&255),g(r,r.T.Ge>>>24&255),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,255&r.T.Je),null!=r.T.Be&&(g(r,255&r.T.Ke),g(r,r.T.Ke>>>8&255)),r.T.Te&&(e.i=W(e.i,r.I,r.D)),r.Ze=0,r.H=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,tt),r.H=113,q(e),0!=r.D)return r.oe=$,0;if(69==r.H){if(r.T&&null!=r.T.Be){let t=r.D,n=(65535&r.T.Ke)-r.Ze;for(;r.D+n>r.ne;){let i=r.ne-r.D;if(M(r.I,r.D,r.T.Be,r.Ze,i),r.D=r.ne,ke(e,t),r.Ze+=i,q(e),0!=r.D)return r.oe=$,0;t=0,n-=i;}M(r.I,r.D,r.T.Be,r.Ze,n),r.D+=n,ke(e,t),r.Ze=0;}r.H=73;}if(73==r.H){if(r.T&&r.T.Fe&&r.T.Fe.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.Fe[r.Ze++],g(r,t);}while(0!=t);ke(e,n),r.Ze=0;}r.H=91;}if(91==r.H){if(r.T&&r.T.je&&r.T.je.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.je[r.Ze++],g(r,t);}while(0!=t);ke(e,n);}r.H=103;}if(103==r.H){if(r.T&&r.T.Te){if(r.D+2>r.ne&&(q(e),0!=r.D))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.H=113,q(e),0!=r.D)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.H){let n=0==r.be?kt(r,t):2==r.ge?Nn(r,t):3==r.ge?kn(r,t):Ye[r.be].Re(r,t);if((2==n||3==n)&&(r.H=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.O<=0?1:(2==r.O?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Xe(r,e.i>>>16&65535),Xe(r,65535&e.i)),q(e),r.O>0&&(r.O=-r.O),0!=r.D?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.H;return t.u=Z,t.J=qe,t.K=qe,t.I=Z,t.Le=Z,t.pe=new H(0),t.ze=Z,t.Me=qe,t.R.length=0,t.X.length=0,t.$e.length=0,t.T=void 0,t.te=0,t.re=0,t.A=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.de,l=e.ve,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.J,a=e.Y,c=e.u[f],s=e.u[f+1],d=e.u[f+_-1],h=e.u[f+_];e.de>=e.me&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=h||e.u[n+_-1]!=d||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ve=t,_=r,r>=l)break;d=e.u[f+_-1],h=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function It(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return It(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function kt(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.M+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.I[e.D-4]=n,e.I[e.D-3]=n>>8,e.I[e.D-2]=~n,e.I[e.D-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.Ne-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.m<e.ae&&(e.m=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.Ne-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.m<e.ae&&(e.m=e.ae),i=e.M+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=k)if(e.ae,e.Ve,e.se,r=e_(e,e.ae-e.Ve,e.se-k),e.ce-=e.se,e.se<=e.ye&&e.ce>=k){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.ke=e.u[e.ae],e.ke=f_(e,e.ke,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),e.de=e.se,e.he=e.Ve,e.se=k-1,0!=n&&e.de<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ge&&(e.se=k-1)),e.de>=k&&e.se<=e.de){let t=e.ae+e.ce-k;e.ae,e.he,e.de,r=e_(e,e.ae-1-e.he,e.de-k),e.ce-=e.de-1,e.de-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.de);if(e.we=0,e.se=k-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&It(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function kn(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=k&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=k?(e.ae,e.ae,e.se,n=e_(e,1,e.se-k),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Nn(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),Rn=[16,1,73,1,200,1],zn=[144,1,72,1,78,1],zt=Ee.map(Yt),Ct=Ee.map(Wt);zt.push(64,2),Ct.push(142,2);var Lt=de.slice(0,-2).map(Yt),Ot=de.slice(0,-2).map(Wt);Lt.push(...Rn),Ot.push(...zn);var Ht=new E([...Rt,258,0,0]),Ut=new E([...Rt,3,0,0]),Bt=te(Lt),Ft=te(Ot),Zt=new E([...Nt,0,0]),Pt=new E([...Nt,32769,49153]),Mt=te(zt),Xt=te(Ct);function Yt(e,t){return t%2?e:e+16}function Wt(e,t){return t%2?e:e+128}function Kt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.M>>>0,c=r.et,s=r.tt,d=(1<<r.nt)-1,h=(1<<r.rt)-1,w=r.h>>>0,k=r.m>>>0,b=r.v>>>0,g=r.it,m=f-(t-e.avail_out),v=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,z=0,M=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&d];t:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,0==z){l[f++]=n.lt;break}if(16&z){if(y=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<z)-1,u>>>=z,a-=z;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&h];n:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,16&z){if(p=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<z)-1,u>>>=z,a-=z;}let t=y,c=f-m;if(p>c){let n=p-c;if(n>k&&g){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==b){if(M=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}else if(b<n){M=w+b-n;let e=n-b;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let t=0;t<e;++t)l[f++]=o[M++];if(t-=e,M=0,b<t){for(let e=0;e<b;++e)l[f++]=o[M++];t-=b,M=f-p;}}else {if(M=b-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}for(;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}else {for(M=f-p;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}break}if(64&z){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<z)-1)];continue n}break}if(64&z){if(32&z){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<z)-1)];continue t}}while(i<x&&f<v);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<v?v-f+257:257-(f-v),r.p=u>>>0,r.M=a>>>0;}function F_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,O:0,ct:false,st:0,dt:0,ht:0,wt:0,u:Z,kt:0,bt:0,Be:0,et:n,tt:n,nt:0,rt:0,gt:0,vt:0,xt:0,yt:0,zt:n,Mt:new E(320),Lt:new E(288),Et:new y(r).fill(null).map(()=>pe()),Zt:0,it:true,qt:0,Nt:0,Vt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function Z_(e=1){return {_t:64,ft:e,lt:0}}function qt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Ln={Vt:false,Wt:Ht,St:Bt,$t:Zt,It:Mt,Dt:20,At:257,Qt:0,Ut:d_,Pt:false,Rt:true},On={Vt:true,Wt:Ut,St:Ft,$t:Pt,It:Xt,Dt:19,At:256,Qt:-1,Ut:m_,Pt:true,Rt:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,d,h,w,k,b,g,m,v,x,y,p,z,M,L,Z=new E(Le+1),q=new E(Le+1),N=l?On:Ln;for(o=0;o<=Le;o++)Z[o]=0;for(u=0;u<n;u++)Z[t[u]]++;for(s=i.Xt,c=Le;c>=1&&0==Z[c];c--);if(s>c&&(s=c),0==c)return N.Rt?(y=Z_(1),r.Xt[0]=y,r.Xt[1]=y,i.Xt=1,0):-1;for(a=1;a<c&&0==Z[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=Z[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(q[1]=0,o=1;o<Le;o++)q[o+1]=q[o]+Z[o];for(u=0;u<n;u++)0!=t[u]&&(f[q[t[u]]++]=u);switch(e){case 0:z=M=f,L=N.Dt;break;case 1:z=N.Wt,M=N.St,L=N.At;break;default:z=N.$t,M=N.It,L=N.Qt;}if(b=0,u=0,o=a,p=_.Xt,d=s,h=0,v=-1,k=1<<s,x=k-1,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;for(;;){y=Hn(f,u,o,h,e,z,M,L,N.Vt),g=1<<o-h,m=1<<d,a=m;do{m-=g;let e=(b>>h)+m;r.Xt[p+e]={...y};}while(0!=m);for(g=1<<o-1;b&g;)g>>=1;if(0!=g?(b&=g-1,b+=g):b=0,u++,0==--Z[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(b&x)!=v){for(0==h&&(h=s),p+=1<<d,d=o-h,w=1<<d;d+h<c&&(w-=Z[d+h],!(w<=0));)d++,w<<=1;if(k+=1<<d,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;v=b&x,r.Xt[_.Xt+v]={_t:d,ft:s,lt:p-_.Xt};}}if(0!=b)for(y=Z_(o-h);0!=b;){for(0!=h&&(b&x)!=v&&(h=0,o=s,p=_.Xt,d=s,y.ft=o),r.Xt[p+(b>>h)]={...y},g=1<<o-1;b&g;)g>>=1;0!=g?(b&=g-1,b+=g):b=0;}return _.Xt+=k,i.Xt=s,0}function Hn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=qt(n-r);return u}var Pn={Ct:true,Ht:new y(544),Ot:[],Tt:[]},Mn={Ct:true,Ht:new y(544),Ot:[],Tt:[]};function jt(e){let t=Ve();return t.l=F_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Vt&&(t.ot<16191||t.ot>16209)||!t.Vt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.O&&(e.i=1&t.O),t.ot=t.Vt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.dt=t.Vt?65536:32768,delete t.T,t.p=0,t.M=0,t.et=t.Et,t.tt=t.Et,t.zt=t.Et,t.it=true,t.qt=-1,0)}function Yn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.m=0,t.v=0,Xn(e))}function Wn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Vt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Vt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.k!=t&&(r.u=Z),r.O=n,r.k=t,Yn(e))}function Vt(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Vt;return r=F_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Vt?16191:16180,n=Wn(e,t),n}function Gn(e){let t=e.Vt?Mn:Pn,n={Xt:0};if(t.Ct){let r,i,f;for(r=0;r<144;)e.Mt[r++]=8;for(;r<256;)e.Mt[r++]=9;for(;r<280;)e.Mt[r++]=7;for(;r<288;)e.Mt[r++]=8;for(let e=0;e<544;e++)t.Ht[e]=pe();f=t.Ht,t.Ot=f,i=9;let _={Xt:f},l={Xt:i},o={Xt:0};for(Oe(1,e.Mt,288,_,l,e.Lt,o,e.Vt),f=_.Xt,i=l.Xt,e.Zt=o.Xt,r=0;r<32;)e.Mt[r++]=5;i=5;let u=o.Xt,a={Xt:f},c={Xt:i};n.Xt=u,Oe(2,e.Mt,32,a,c,e.Lt,n,e.Vt),t.Tt=f.slice(u),t.Ct=false;}e.et=t.Ot,e.nt=9,e.tt=t.Tt,e.rt=5,e.Zt=n.Xt;}function Kn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.k),r.u)))return 1;if(0==r.h&&(r.h=1<<r.k,r.v=0,r.m=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.v=0,r.m=r.h;else {let e=r.h-r.v;e>n&&(e=n),M(r.u,r.v,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.v=n,r.m=r.h):(r.v+=e,r.v==r.h&&(r.v=0),r.m<r.h&&(r.m+=e));}return 0}var s_=class extends z{constructor(){super("Need more input");}};function Jt(e,t){let n,r,i,f,_,l,o,u,a,c,s,d,h,w,k,b,g,m=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=Z,i=0,f=Z,_=0,n=e.l,16191==n.ot&&(n.ot=16192),L(),c=l,s=o,g=0;try{for(;;)switch(n.ot){case 16180:if(0==n.O){n.ot=16192;break}if(V(16),2&n.O&&35615==u){0==n.k&&(n.k=15),n.ht=W(0),n.ht=p(n.ht,u),q(),n.ot=16181;break}if(n.T&&(n.T.Yt=-1),!(1&n.O)||((S(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=S(4)){e.msg="unknown compression method",n.ot=16209;break}if($(4),b=S(4)+8,0==n.k&&(n.k=b),b>15||b>n.k){e.msg="invalid window size",n.ot=16209;break}n.dt=1<<b,n.st=0,e.i=n.ht=se(0),n.ot=512&u?16189:16191,q();break;case 16181:if(V(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.T&&(n.T.Ye=u>>8&1),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16182;case 16182:V(32),n.T&&(n.T.Ge=u),512&n.st&&4&n.O&&(n.ht=z(n.ht,u)),q(),n.ot=16183;case 16183:V(16),n.T&&(n.T.Bt=255&u,n.T.Je=u>>8),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16184;case 16184:1024&n.st?(V(16),n.kt=u,n.T&&(n.T.Ke=u),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q()):n.T&&(n.T.Be=Z),n.ot=16185;case 16185:if(1024&n.st&&(d=n.kt,d>l&&(d=l),d&&(n.T&&n.T.Be&&n.T.Ft&&(b=n.T.Ke-n.kt)<n.T.Ft&&M(n.T.Be,b,r,i,d),512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,n.kt-=d),n.kt))return v();n.kt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.jt&&n.kt<n.T.jt&&(n.T.Fe[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.Fe=Z);n.kt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.Gt&&n.kt<n.T.Gt&&(n.T.je[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.je=Z);n.ot=16188;case 16188:if(512&n.st){if(V(16),4&n.O&&u!=(65535&n.ht)){e.msg="header crc mismatch",n.ot=16209;break}q();}n.T&&(n.T.Te=n.st>>9&1,n.T.Yt=1),e.i=n.ht=W(0),n.ot=16191;break;case 16189:V(32),e.i=n.ht=P_(u),q(),n.ot=16190;case 16190:if(!n.ct)return E(),2;e.i=n.ht=se(0),n.ot=16191;case 16191:if(5==t||6==t)return v();case 16192:if(n.ut){I(),n.ot=16206;break}switch(V(3),n.ut=!!S(1),$(1),S(2)){case 0:n.ot=16193;break;case 1:if(Gn(n),n.ot=16199,6==t)return $(2),v();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}$(2);break;case 16193:if(I(),V(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.kt=65535&u,q(),n.ot=16194,6==t)return v();case 16194:n.ot=16195;case 16195:if(d=n.kt,d){if(d>l&&(d=l),d>o&&(d=o),0==d)return v();M(f,_,r,i,d),l-=d,i+=d,o-=d,_+=d,n.kt-=d;break}n.ot=16191;break;case 16196:if(V(14),n.vt=S(5)+257,$(5),n.xt=S(5)+1,$(5),n.gt=S(4)+4,$(4),n.vt>286||!n.Vt&&n.xt>30){e.msg=n.Vt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.gt;)V(3),n.Mt[Se[n.yt++]]=S(3),$(3);for(;n.yt<19;)n.Mt[Se[n.yt++]]=0;n.zt=n.Et,n.et=n.tt=n.zt,n.nt=7;let c={Xt:n.zt},m={Xt:n.nt},x={Xt:0};if(g=Oe(0,n.Mt,19,c,m,n.Lt,x,n.Vt),n.zt=c.Xt,n.nt=m.Xt,g){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.vt+n.xt;){for(;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w.lt<16)$(w.ft),n.Mt[n.yt++]=w.lt;else {if(16==w.lt){if(V(w.ft+2),$(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}b=n.Mt[n.yt-1],d=3+S(2),$(2);}else 17==w.lt?(V(w.ft+3),$(w.ft),b=0,d=3+S(3),$(3)):(V(w.ft+7),$(w.ft),b=0,d=11+S(7),$(7));if(n.yt+d>n.vt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;d--;)n.Mt[n.yt++]=b;}}if(16209==n.ot)break;if(0==n.Mt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.zt=n.Et,n.nt=9;let D={Xt:n.zt},A={Xt:n.nt},Q={Xt:0};g=Oe(1,n.Mt,n.vt,D,A,n.Lt,Q,n.Vt),n.zt=D.Xt,n.nt=A.Xt;let U=Q.Xt;if(n.et=n.zt.slice(0,U),g){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let P=n.Mt.subarray(n.vt,n.vt+n.xt),R={Xt:n.zt},X={Xt:n.rt},C={Xt:U};if(g=Oe(2,P,n.xt,R,X,n.Lt,C,n.Vt),n.zt=R.Xt,n.rt=X.Xt,n.tt=n.zt.slice(U),g){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return v();case 16199:n.ot=16200;case 16200:if(!n.Vt&&l>=6&&o>=258){E(),Kt(e,s),L(),16191==n.ot&&(n.qt=-1);break}for(n.qt=0;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w._t&&!(240&w._t)){for(k=w;w=n.et[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,n.kt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.qt=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.Be=w._t&(n.Vt?31:15),n.ot=16201;case 16201:n.Be&&(V(n.Be),n.kt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.Nt=n.kt,n.ot=16202;case 16202:for(;w=n.tt[S(n.rt)],!(w.ft<=a);)N();if(!(240&w._t)){for(k=w;w=n.tt[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.bt=w.lt,n.Be=15&w._t,n.ot=16203;case 16203:n.Be&&(V(n.Be),n.bt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.ot=16204;case 16204:if(0==o)return v();if(d=s-o,n.bt>d){if(d=n.bt-d,d>n.m&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}d>n.v?(d-=n.v,h=n.h-d):h=n.v-d,d>n.kt&&(d=n.kt),d>o&&(d=o);for(let e=0;e<d;++e)f[_]=255&n.u[h],++_,++h;}else {h=_-n.bt,d=n.kt,d>o&&(d=o);for(let e=0;e<d;++e)f[_]=f[h],++_,++h;}d>o&&(d=o),o-=d,n.kt-=d,0==n.kt&&(n.ot=16200);break;case 16205:if(0==o)return v();f[_++]=n.kt,o--,n.ot=16200;break;case 16206:if(n.O){if(V(32),s-=o,e.total_out+=s,n.wt+=s,4&n.O&&s){let t=f.subarray(_-s,_);e.i=n.ht=y(n.ht,t,s);}if(s=o,4&n.O&&(n.st?u:P_(u)>>>0)!=n.ht){e.msg="incorrect data check",n.ot=16209;break}q();}n.ot=16207;case 16207:if(n.O&&n.st){if(V(32),4&n.O&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}q();}n.ot=16208;case 16208:return g=1,v();case 16209:return g=-3,v();case 16210:return -4;default:return -2}}catch(e){if(e instanceof s_)return v();throw e}function v(){if(E(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Vt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(Kn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.O&&s&&(e.i=n.ht=y(n.ht,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.M+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==g||4==t&&0==g)&&(g=-5),g}function y(e,t,r){return n.st?W(e,t,r):se(e,t,r)}function p(e,t){return m[0]=255&t,m[1]=t>>>8&255,W(e,m,2)>>>0}function z(e,t){return m[0]=255&t,m[1]=t>>>8&255,m[2]=t>>>16&255,m[3]=t>>>24&255,W(e,m,4)>>>0}function L(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.M;}function E(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.M=a;}function q(){u=0,a=0;}function N(){if(0==l)throw new s_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function V(e){for(;a<e;)N();}function S(e){return u&(1<<e)-1}function $(e){u>>>=e,a-=e;}function I(){u>>>=7&a,a-=7&a;}}function Qt(e){return Ge(e)?-2:0}var M_=65536,qn=32768,X_=class{constructor(e=16,t=M_){this.Jt=[],this.Kt=e;for(let n=0;n<N.min(e,4);n++)this.Jt.push(new x(t));}acquire(e=M_){for(let t=this.Jt.length-1;t>=0;t--){let n=this.Jt[t];if(n.length>=e)return this.Jt.splice(t,1),n}return new x(e)}release(e){this.Jt.length<this.Kt&&this.Jt.push(e);}};function $t(e){let t=new X_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.en(),r=e.tn(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,qn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.nn(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.nn(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.fn(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function en(){return new U({start(){},transform(e,t){try{t.enqueue(e.rn.slice(0));}finally{e.release();}},flush(){}})}function jn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return $t({en:()=>wt(),tn:e=>Dt(e,r,8,n,8,0),nn:yt,fn:B_})}function Vn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return $t({en:()=>jt("deflate64-raw"==e),tn:e=>Vt(e,t),nn:Jt,fn:Qt})}var h_=class{constructor(e="deflate",t){let n=jn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(en());}},x_=class{constructor(e="deflate"){let t=Vn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(en());}};
|
|
5982
6460
|
|
|
5983
6461
|
/*
|
|
5984
6462
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -6012,7 +6490,7 @@
|
|
|
6012
6490
|
configure({
|
|
6013
6491
|
workerURI: "./core/web-worker-native.js",
|
|
6014
6492
|
wasmURI: null,
|
|
6015
|
-
CompressionStreamZlib:
|
|
6493
|
+
CompressionStreamZlib: h_,
|
|
6016
6494
|
DecompressionStreamZlib: x_
|
|
6017
6495
|
});
|
|
6018
6496
|
|
|
@@ -6045,12 +6523,15 @@
|
|
|
6045
6523
|
*/
|
|
6046
6524
|
|
|
6047
6525
|
|
|
6526
|
+
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
6527
|
+
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
6528
|
+
|
|
6048
6529
|
class ZipEntry {
|
|
6049
6530
|
|
|
6050
6531
|
constructor(fs, name, params, parent) {
|
|
6051
6532
|
const zipEntry = this;
|
|
6052
6533
|
if (fs.root && parent && parent.getChildByName(name)) {
|
|
6053
|
-
throw new Error(
|
|
6534
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6054
6535
|
}
|
|
6055
6536
|
if (!params) {
|
|
6056
6537
|
params = {};
|
|
@@ -6060,13 +6541,17 @@
|
|
|
6060
6541
|
name,
|
|
6061
6542
|
data: params.data,
|
|
6062
6543
|
options: params.options,
|
|
6063
|
-
id: fs.
|
|
6544
|
+
id: fs.entryIdCounter++,
|
|
6064
6545
|
parent,
|
|
6065
6546
|
children: [],
|
|
6066
6547
|
uncompressedSize: params.uncompressedSize || 0,
|
|
6067
6548
|
passThrough: params.passThrough
|
|
6068
6549
|
});
|
|
6069
|
-
|
|
6550
|
+
// detached entries (e.g. clones) are not registered until they are attached,
|
|
6551
|
+
// otherwise they could never be garbage collected
|
|
6552
|
+
if (parent || !fs.root) {
|
|
6553
|
+
fs.entries[zipEntry.id] = zipEntry;
|
|
6554
|
+
}
|
|
6070
6555
|
if (parent) {
|
|
6071
6556
|
zipEntry.parent.children.push(zipEntry);
|
|
6072
6557
|
}
|
|
@@ -6104,7 +6589,7 @@
|
|
|
6104
6589
|
rename(name) {
|
|
6105
6590
|
const parent = this.parent;
|
|
6106
6591
|
if (parent && parent.getChildByName(name)) {
|
|
6107
|
-
throw new Error(
|
|
6592
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6108
6593
|
} else {
|
|
6109
6594
|
this.name = name;
|
|
6110
6595
|
}
|
|
@@ -6143,16 +6628,17 @@
|
|
|
6143
6628
|
}
|
|
6144
6629
|
|
|
6145
6630
|
isPasswordProtected() {
|
|
6146
|
-
return this.data.encrypted;
|
|
6631
|
+
return Boolean(this.data && this.data.encrypted);
|
|
6147
6632
|
}
|
|
6148
6633
|
|
|
6149
6634
|
async checkPassword(password, options = {}) {
|
|
6150
6635
|
const zipEntry = this;
|
|
6151
6636
|
if (zipEntry.isPasswordProtected()) {
|
|
6152
|
-
options.password = password;
|
|
6153
|
-
options.checkPasswordOnly = true;
|
|
6154
6637
|
try {
|
|
6155
|
-
await zipEntry.data.getData(null, options
|
|
6638
|
+
await zipEntry.data.getData(null, Object.assign({}, options, {
|
|
6639
|
+
password,
|
|
6640
|
+
checkPasswordOnly: true
|
|
6641
|
+
}));
|
|
6156
6642
|
return true;
|
|
6157
6643
|
} catch (error) {
|
|
6158
6644
|
if (error.message == ERR_INVALID_PASSWORD) {
|
|
@@ -6186,8 +6672,15 @@
|
|
|
6186
6672
|
return this.getData({ writable }, options);
|
|
6187
6673
|
}
|
|
6188
6674
|
|
|
6189
|
-
getArrayBuffer(options) {
|
|
6190
|
-
|
|
6675
|
+
async getArrayBuffer(options) {
|
|
6676
|
+
// this.data may be a string, a Uint8Array, a data URI or a Blob depending on how the entry
|
|
6677
|
+
// was created, so retrieve the bytes through getUint8Array rather than assuming a Blob; this
|
|
6678
|
+
// also applies the options (password, signal, onprogress...) like the other getData() getters
|
|
6679
|
+
const array = await this.getUint8Array(options);
|
|
6680
|
+
// return the backing buffer directly when the array spans it, slicing the exact bytes otherwise
|
|
6681
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength
|
|
6682
|
+
? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
|
|
6683
|
+
: array.buffer;
|
|
6191
6684
|
}
|
|
6192
6685
|
|
|
6193
6686
|
replaceBlob(blob) {
|
|
@@ -6229,7 +6722,7 @@
|
|
|
6229
6722
|
replaceReadable(readable) {
|
|
6230
6723
|
Object.assign(this, {
|
|
6231
6724
|
data: null,
|
|
6232
|
-
Reader:
|
|
6725
|
+
Reader: getReadableReader(readable),
|
|
6233
6726
|
Writer: null,
|
|
6234
6727
|
reader: null
|
|
6235
6728
|
});
|
|
@@ -6245,7 +6738,7 @@
|
|
|
6245
6738
|
|
|
6246
6739
|
clone(deepClone) {
|
|
6247
6740
|
const zipEntry = this;
|
|
6248
|
-
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name);
|
|
6741
|
+
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name, zipEntry);
|
|
6249
6742
|
if (deepClone) {
|
|
6250
6743
|
clonedEntry.children = zipEntry.children.map(child => {
|
|
6251
6744
|
const childClone = child.clone(deepClone);
|
|
@@ -6319,7 +6812,7 @@
|
|
|
6319
6812
|
|
|
6320
6813
|
addReadable(name, readable, options = {}) {
|
|
6321
6814
|
return addChild(this, name, {
|
|
6322
|
-
Reader:
|
|
6815
|
+
Reader: getReadableReader(readable),
|
|
6323
6816
|
options
|
|
6324
6817
|
});
|
|
6325
6818
|
}
|
|
@@ -6333,6 +6826,7 @@
|
|
|
6333
6826
|
}
|
|
6334
6827
|
|
|
6335
6828
|
addFile(file, options = {}) {
|
|
6829
|
+
options = Object.assign({}, options);
|
|
6336
6830
|
if (!options.lastModDate) {
|
|
6337
6831
|
options.lastModDate = new Date(file.lastModified);
|
|
6338
6832
|
}
|
|
@@ -6399,11 +6893,15 @@
|
|
|
6399
6893
|
try {
|
|
6400
6894
|
const path = entry.filename.split("/");
|
|
6401
6895
|
const name = path.pop();
|
|
6402
|
-
path.forEach(
|
|
6896
|
+
path.forEach(pathPart => {
|
|
6403
6897
|
const previousParent = parent;
|
|
6404
6898
|
parent = parent.getChildByName(pathPart);
|
|
6405
|
-
if (
|
|
6406
|
-
|
|
6899
|
+
if (parent) {
|
|
6900
|
+
if (!parent.directory) {
|
|
6901
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6902
|
+
}
|
|
6903
|
+
} else {
|
|
6904
|
+
parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
|
|
6407
6905
|
importedEntries.push(parent);
|
|
6408
6906
|
}
|
|
6409
6907
|
});
|
|
@@ -6414,6 +6912,22 @@
|
|
|
6414
6912
|
uncompressedSize: entry.uncompressedSize,
|
|
6415
6913
|
passThrough: options.passThrough
|
|
6416
6914
|
}));
|
|
6915
|
+
} else {
|
|
6916
|
+
let directoryEntry = parent;
|
|
6917
|
+
if (name) {
|
|
6918
|
+
directoryEntry = parent.getChildByName(name);
|
|
6919
|
+
if (directoryEntry) {
|
|
6920
|
+
if (!directoryEntry.directory) {
|
|
6921
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6922
|
+
}
|
|
6923
|
+
} else {
|
|
6924
|
+
directoryEntry = new ZipDirectoryEntry(this.fs, name, { data: null }, parent);
|
|
6925
|
+
importedEntries.push(directoryEntry);
|
|
6926
|
+
}
|
|
6927
|
+
}
|
|
6928
|
+
if (directoryEntry != this && !directoryEntry.data) {
|
|
6929
|
+
directoryEntry.data = entry;
|
|
6930
|
+
}
|
|
6417
6931
|
}
|
|
6418
6932
|
} catch (error) {
|
|
6419
6933
|
try {
|
|
@@ -6429,14 +6943,15 @@
|
|
|
6429
6943
|
return importedEntries;
|
|
6430
6944
|
}
|
|
6431
6945
|
|
|
6432
|
-
async exportZip(writer, options) {
|
|
6946
|
+
async exportZip(writer, options = {}) {
|
|
6433
6947
|
const zipEntry = this;
|
|
6948
|
+
options = Object.assign({}, options);
|
|
6434
6949
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
6435
6950
|
options.bufferedWrite = true;
|
|
6436
6951
|
}
|
|
6437
|
-
await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
6952
|
+
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
6438
6953
|
const zipWriter = new ZipWriter(writer, options);
|
|
6439
|
-
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options);
|
|
6954
|
+
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options, readers);
|
|
6440
6955
|
await zipWriter.close();
|
|
6441
6956
|
return writer.getData ? writer.getData() : writer.writable;
|
|
6442
6957
|
}
|
|
@@ -6482,7 +6997,15 @@
|
|
|
6482
6997
|
|
|
6483
6998
|
remove(entry) {
|
|
6484
6999
|
detach(entry);
|
|
6485
|
-
|
|
7000
|
+
const removedEntries = [entry];
|
|
7001
|
+
while (removedEntries.length) {
|
|
7002
|
+
const removedEntry = removedEntries.pop();
|
|
7003
|
+
this.entries[removedEntry.id] = null;
|
|
7004
|
+
for (const child of removedEntry.children) {
|
|
7005
|
+
removedEntries.push(child);
|
|
7006
|
+
}
|
|
7007
|
+
}
|
|
7008
|
+
entry.parent = UNDEFINED_VALUE;
|
|
6486
7009
|
}
|
|
6487
7010
|
|
|
6488
7011
|
move(entry, destination) {
|
|
@@ -6492,12 +7015,17 @@
|
|
|
6492
7015
|
if (destination.directory) {
|
|
6493
7016
|
if (!destination.isDescendantOf(entry)) {
|
|
6494
7017
|
if (entry != destination) {
|
|
6495
|
-
|
|
6496
|
-
|
|
7018
|
+
const existingChild = destination.getChildByName(entry.name);
|
|
7019
|
+
if (existingChild) {
|
|
7020
|
+
if (existingChild != entry) {
|
|
7021
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
7022
|
+
}
|
|
7023
|
+
} else {
|
|
7024
|
+
detach(entry);
|
|
7025
|
+
entry.parent = destination;
|
|
7026
|
+
destination.children.push(entry);
|
|
7027
|
+
registerEntries(this, entry);
|
|
6497
7028
|
}
|
|
6498
|
-
detach(entry);
|
|
6499
|
-
entry.parent = destination;
|
|
6500
|
-
destination.children.push(entry);
|
|
6501
7029
|
}
|
|
6502
7030
|
} else {
|
|
6503
7031
|
throw new Error("Entry is a ancestor of target entry");
|
|
@@ -6514,6 +7042,11 @@
|
|
|
6514
7042
|
for (let index = 0; node && index < path.length; index++) {
|
|
6515
7043
|
node = node.getChildByName(path[index]);
|
|
6516
7044
|
}
|
|
7045
|
+
if (!node) {
|
|
7046
|
+
// exclude detached entries, e.g. clones registered in `entries` but not attached
|
|
7047
|
+
node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
|
|
7048
|
+
entry.getRelativeName() == fullname);
|
|
7049
|
+
}
|
|
6517
7050
|
return node;
|
|
6518
7051
|
}
|
|
6519
7052
|
|
|
@@ -6595,6 +7128,7 @@
|
|
|
6595
7128
|
}
|
|
6596
7129
|
|
|
6597
7130
|
importZip(reader, options) {
|
|
7131
|
+
resetFS(this);
|
|
6598
7132
|
return this.root.importZip(reader, options);
|
|
6599
7133
|
}
|
|
6600
7134
|
|
|
@@ -6614,6 +7148,10 @@
|
|
|
6614
7148
|
return this.root.exportWritable(writable, options);
|
|
6615
7149
|
}
|
|
6616
7150
|
|
|
7151
|
+
exportZip(writer, options) {
|
|
7152
|
+
return this.root.exportZip(writer, options);
|
|
7153
|
+
}
|
|
7154
|
+
|
|
6617
7155
|
isPasswordProtected() {
|
|
6618
7156
|
return this.root.isPasswordProtected();
|
|
6619
7157
|
}
|
|
@@ -6627,15 +7165,26 @@
|
|
|
6627
7165
|
|
|
6628
7166
|
function getTotalSize(entries, propertyName) {
|
|
6629
7167
|
let size = 0;
|
|
6630
|
-
|
|
7168
|
+
const pendingEntries = Array.from(entries);
|
|
7169
|
+
while (pendingEntries.length) {
|
|
7170
|
+
const entry = pendingEntries.pop();
|
|
7171
|
+
size += entry[propertyName] || 0;
|
|
7172
|
+
for (const child of entry.children) {
|
|
7173
|
+
pendingEntries.push(child);
|
|
7174
|
+
}
|
|
7175
|
+
}
|
|
6631
7176
|
return size;
|
|
7177
|
+
}
|
|
6632
7178
|
|
|
6633
|
-
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
|
|
7179
|
+
function getReadableReader(readable) {
|
|
7180
|
+
let consumed;
|
|
7181
|
+
return function () {
|
|
7182
|
+
if (consumed) {
|
|
7183
|
+
throw new Error(ERR_READABLE_CONSUMED);
|
|
6637
7184
|
}
|
|
6638
|
-
|
|
7185
|
+
consumed = true;
|
|
7186
|
+
return { readable };
|
|
7187
|
+
};
|
|
6639
7188
|
}
|
|
6640
7189
|
|
|
6641
7190
|
function getZipBlobReader(options) {
|
|
@@ -6650,7 +7199,7 @@
|
|
|
6650
7199
|
async init() {
|
|
6651
7200
|
const zipBlobReader = this;
|
|
6652
7201
|
zipBlobReader.size = zipBlobReader.entry.uncompressedSize;
|
|
6653
|
-
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({},
|
|
7202
|
+
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, options, zipBlobReader.options));
|
|
6654
7203
|
zipBlobReader.data = data;
|
|
6655
7204
|
zipBlobReader.blobReader = new BlobReader(data);
|
|
6656
7205
|
super.init();
|
|
@@ -6663,29 +7212,41 @@
|
|
|
6663
7212
|
}
|
|
6664
7213
|
|
|
6665
7214
|
async function initReaders(entry, options) {
|
|
6666
|
-
|
|
6667
|
-
|
|
7215
|
+
const fileEntries = [];
|
|
7216
|
+
const pendingEntries = [entry];
|
|
7217
|
+
// per-export map so concurrent exports do not share (and lock) the same readers
|
|
7218
|
+
const readers = new Map();
|
|
7219
|
+
while (pendingEntries.length) {
|
|
7220
|
+
const pendingEntry = pendingEntries.pop();
|
|
7221
|
+
for (const child of pendingEntry.children) {
|
|
6668
7222
|
if (child.directory) {
|
|
6669
|
-
|
|
7223
|
+
pendingEntries.push(child);
|
|
6670
7224
|
} else {
|
|
6671
|
-
|
|
6672
|
-
try {
|
|
6673
|
-
await initStream(reader);
|
|
6674
|
-
} catch (error) {
|
|
6675
|
-
try {
|
|
6676
|
-
error.entryId = child.id;
|
|
6677
|
-
error.cause = {
|
|
6678
|
-
entry: child
|
|
6679
|
-
};
|
|
6680
|
-
} catch {
|
|
6681
|
-
// ignored
|
|
6682
|
-
}
|
|
6683
|
-
throw error;
|
|
6684
|
-
}
|
|
6685
|
-
child.uncompressedSize = reader.size;
|
|
7225
|
+
fileEntries.push(child);
|
|
6686
7226
|
}
|
|
6687
|
-
}
|
|
7227
|
+
}
|
|
6688
7228
|
}
|
|
7229
|
+
await Promise.all(fileEntries.map(async child => {
|
|
7230
|
+
const reader = child.reader = new child.Reader(child.data, options);
|
|
7231
|
+
readers.set(child, reader);
|
|
7232
|
+
try {
|
|
7233
|
+
await initStream(reader);
|
|
7234
|
+
} catch (error) {
|
|
7235
|
+
try {
|
|
7236
|
+
error.entryId = child.id;
|
|
7237
|
+
error.cause = {
|
|
7238
|
+
entry: child
|
|
7239
|
+
};
|
|
7240
|
+
} catch {
|
|
7241
|
+
// ignored
|
|
7242
|
+
}
|
|
7243
|
+
throw error;
|
|
7244
|
+
}
|
|
7245
|
+
if (reader.size !== UNDEFINED_VALUE) {
|
|
7246
|
+
child.uncompressedSize = reader.size;
|
|
7247
|
+
}
|
|
7248
|
+
}));
|
|
7249
|
+
return readers;
|
|
6689
7250
|
}
|
|
6690
7251
|
|
|
6691
7252
|
function detach(entry) {
|
|
@@ -6699,7 +7260,7 @@
|
|
|
6699
7260
|
}
|
|
6700
7261
|
}
|
|
6701
7262
|
|
|
6702
|
-
async function exportZip(zipWriter, entry, totalSize, options) {
|
|
7263
|
+
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
6703
7264
|
const selectedEntry = entry;
|
|
6704
7265
|
const entryOffsets = new Map();
|
|
6705
7266
|
await process(zipWriter, entry);
|
|
@@ -6709,7 +7270,11 @@
|
|
|
6709
7270
|
|
|
6710
7271
|
async function exportChild() {
|
|
6711
7272
|
if (options.bufferedWrite) {
|
|
6712
|
-
await Promise.allSettled(entry.children.map(processChild));
|
|
7273
|
+
const results = await Promise.allSettled(entry.children.map(processChild));
|
|
7274
|
+
const errorResult = results.find(result => result.status == "rejected");
|
|
7275
|
+
if (errorResult) {
|
|
7276
|
+
throw errorResult.reason;
|
|
7277
|
+
}
|
|
6713
7278
|
} else {
|
|
6714
7279
|
for (const child of entry.children) {
|
|
6715
7280
|
await processChild(child);
|
|
@@ -6764,7 +7329,7 @@
|
|
|
6764
7329
|
});
|
|
6765
7330
|
}
|
|
6766
7331
|
}
|
|
6767
|
-
await zipWriter.add(name, child
|
|
7332
|
+
await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
|
|
6768
7333
|
directory: child.directory,
|
|
6769
7334
|
onprogress: async indexProgress => {
|
|
6770
7335
|
if (options.onprogress) {
|
|
@@ -6813,7 +7378,7 @@
|
|
|
6813
7378
|
}
|
|
6814
7379
|
} catch (error) {
|
|
6815
7380
|
const message = error.message + (handle ? " (" + handle.name + ")" : "");
|
|
6816
|
-
throw new Error(message);
|
|
7381
|
+
throw new Error(message, { cause: error });
|
|
6817
7382
|
}
|
|
6818
7383
|
}
|
|
6819
7384
|
return addedEntries;
|
|
@@ -6873,9 +7438,21 @@
|
|
|
6873
7438
|
|
|
6874
7439
|
function resetFS(fs) {
|
|
6875
7440
|
fs.entries = [];
|
|
7441
|
+
fs.entryIdCounter = 0;
|
|
6876
7442
|
fs.root = new ZipDirectoryEntry(fs);
|
|
6877
7443
|
}
|
|
6878
7444
|
|
|
7445
|
+
function registerEntries(fs, entry) {
|
|
7446
|
+
const pendingEntries = [entry];
|
|
7447
|
+
while (pendingEntries.length) {
|
|
7448
|
+
const pendingEntry = pendingEntries.pop();
|
|
7449
|
+
fs.entries[pendingEntry.id] = pendingEntry;
|
|
7450
|
+
for (const child of pendingEntry.children) {
|
|
7451
|
+
pendingEntries.push(child);
|
|
7452
|
+
}
|
|
7453
|
+
}
|
|
7454
|
+
}
|
|
7455
|
+
|
|
6879
7456
|
function addChild(parent, name, params, directory) {
|
|
6880
7457
|
if (parent.directory) {
|
|
6881
7458
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
@@ -8551,6 +9128,7 @@
|
|
|
8551
9128
|
exports.BlobWriter = BlobWriter;
|
|
8552
9129
|
exports.Data64URIReader = Data64URIReader;
|
|
8553
9130
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9131
|
+
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
8554
9132
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
8555
9133
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
8556
9134
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -8560,6 +9138,7 @@
|
|
|
8560
9138
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
8561
9139
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
8562
9140
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
9141
|
+
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
8563
9142
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
8564
9143
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
8565
9144
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -8572,8 +9151,9 @@
|
|
|
8572
9151
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
8573
9152
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
8574
9153
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9154
|
+
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
8575
9155
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
8576
|
-
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION;
|
|
9156
|
+
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
8577
9157
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
8578
9158
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
8579
9159
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|