@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/index-native.cjs
CHANGED
|
@@ -44,6 +44,7 @@ const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
|
|
|
44
44
|
const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
|
|
45
45
|
const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
|
|
46
46
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
|
|
47
|
+
const CENTRAL_FILE_HEADER_LENGTH = 46;
|
|
47
48
|
const END_OF_CENTRAL_DIR_LENGTH = 22;
|
|
48
49
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
|
|
49
50
|
const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
|
|
@@ -91,9 +92,11 @@ const VERSION_AES = 0x33;
|
|
|
91
92
|
const DIRECTORY_SIGNATURE = "/";
|
|
92
93
|
|
|
93
94
|
const HEADER_SIZE = 30;
|
|
95
|
+
const HEADER_OFFSET_VERSION = 0;
|
|
94
96
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
95
97
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
96
98
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
99
|
+
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
97
100
|
|
|
98
101
|
const MAX_DATE = new Date(2107, 11, 31);
|
|
99
102
|
const MIN_DATE = new Date(1980, 0, 1);
|
|
@@ -148,6 +151,7 @@ const DEFAULT_CONFIGURATION = {
|
|
|
148
151
|
chunkSize: 64 * 1024,
|
|
149
152
|
maxWorkers,
|
|
150
153
|
terminateWorkerTimeout: 5000,
|
|
154
|
+
workerStarvationTimeout: 5000,
|
|
151
155
|
useWebWorkers: true,
|
|
152
156
|
useCompressionStream: true,
|
|
153
157
|
CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
|
|
@@ -170,6 +174,7 @@ function configure(configuration) {
|
|
|
170
174
|
chunkSize,
|
|
171
175
|
maxWorkers,
|
|
172
176
|
terminateWorkerTimeout,
|
|
177
|
+
workerStarvationTimeout,
|
|
173
178
|
useCompressionStream,
|
|
174
179
|
useWebWorkers,
|
|
175
180
|
CompressionStream,
|
|
@@ -185,6 +190,7 @@ function configure(configuration) {
|
|
|
185
190
|
setIfDefined("chunkSize", chunkSize);
|
|
186
191
|
setIfDefined("maxWorkers", maxWorkers);
|
|
187
192
|
setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
|
|
193
|
+
setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
|
|
188
194
|
setIfDefined("useCompressionStream", useCompressionStream);
|
|
189
195
|
setIfDefined("useWebWorkers", useWebWorkers);
|
|
190
196
|
setIfDefined("CompressionStream", CompressionStream);
|
|
@@ -199,7 +205,7 @@ function setIfDefined(propertyName, propertyValue) {
|
|
|
199
205
|
}
|
|
200
206
|
}
|
|
201
207
|
|
|
202
|
-
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}});}
|
|
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 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}});}
|
|
203
209
|
|
|
204
210
|
/*
|
|
205
211
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -948,37 +954,6 @@ cipher.aes = class {
|
|
|
948
954
|
}
|
|
949
955
|
};
|
|
950
956
|
|
|
951
|
-
/**
|
|
952
|
-
* Random values
|
|
953
|
-
* @namespace
|
|
954
|
-
*/
|
|
955
|
-
const random = {
|
|
956
|
-
/**
|
|
957
|
-
* Generate random words with pure js, cryptographically not as strong & safe as native implementation.
|
|
958
|
-
* @param {TypedArray} typedArray The array to fill.
|
|
959
|
-
* @return {TypedArray} The random values.
|
|
960
|
-
*/
|
|
961
|
-
getRandomValues(typedArray) {
|
|
962
|
-
const words = new Uint32Array(typedArray.buffer);
|
|
963
|
-
const r = (m_w) => {
|
|
964
|
-
let m_z = 0x3ade68b1;
|
|
965
|
-
const mask = 0xffffffff;
|
|
966
|
-
return function () {
|
|
967
|
-
m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
|
|
968
|
-
m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
|
|
969
|
-
const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
|
|
970
|
-
return result * (Math.random() > .5 ? 1 : -1);
|
|
971
|
-
};
|
|
972
|
-
};
|
|
973
|
-
for (let i = 0, rcache; i < typedArray.length; i += 4) {
|
|
974
|
-
const _r = r((rcache || Math.random()) * 0x100000000);
|
|
975
|
-
rcache = _r() * 0x3ade67b7;
|
|
976
|
-
words[i / 4] = (_r() * 0x100000000) | 0;
|
|
977
|
-
}
|
|
978
|
-
return typedArray;
|
|
979
|
-
}
|
|
980
|
-
};
|
|
981
|
-
|
|
982
957
|
/** @fileOverview CTR mode implementation.
|
|
983
958
|
*
|
|
984
959
|
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
@@ -1209,12 +1184,15 @@ const GET_RANDOM_VALUES_SUPPORTED = typeof crypto != UNDEFINED_TYPE && typeof cr
|
|
|
1209
1184
|
const ERR_INVALID_PASSWORD = "Invalid password";
|
|
1210
1185
|
const ERR_INVALID_SIGNATURE = "Invalid signature";
|
|
1211
1186
|
const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
|
|
1187
|
+
const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
|
|
1212
1188
|
|
|
1213
1189
|
function getRandomValues(array) {
|
|
1214
1190
|
if (GET_RANDOM_VALUES_SUPPORTED) {
|
|
1215
1191
|
return crypto.getRandomValues(array);
|
|
1216
1192
|
} else {
|
|
1217
|
-
|
|
1193
|
+
// all supported runtimes expose crypto.getRandomValues; failing hard beats
|
|
1194
|
+
// silently generating predictable encryption salts
|
|
1195
|
+
throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
|
|
1218
1196
|
}
|
|
1219
1197
|
}
|
|
1220
1198
|
|
|
@@ -1273,13 +1251,12 @@ let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && type
|
|
|
1273
1251
|
|
|
1274
1252
|
class AESDecryptionStream extends TransformStream {
|
|
1275
1253
|
|
|
1276
|
-
constructor({ password, rawPassword,
|
|
1254
|
+
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
|
|
1277
1255
|
super({
|
|
1278
1256
|
start() {
|
|
1279
1257
|
Object.assign(this, {
|
|
1280
1258
|
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1281
1259
|
password: encodePassword(password, rawPassword),
|
|
1282
|
-
signed,
|
|
1283
1260
|
strength: encryptionStrength - 1,
|
|
1284
1261
|
pending: new Uint8Array()
|
|
1285
1262
|
});
|
|
@@ -1308,7 +1285,6 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1308
1285
|
},
|
|
1309
1286
|
async flush(controller) {
|
|
1310
1287
|
const {
|
|
1311
|
-
signed,
|
|
1312
1288
|
ctr,
|
|
1313
1289
|
hmac,
|
|
1314
1290
|
pending,
|
|
@@ -1325,13 +1301,15 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1325
1301
|
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1326
1302
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1327
1303
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1304
|
+
const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
|
|
1305
|
+
// branch-free comparison: accumulate the differences instead of
|
|
1306
|
+
// short-circuiting on the first mismatching byte
|
|
1307
|
+
let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
|
|
1308
|
+
for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
|
|
1309
|
+
invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
|
|
1310
|
+
}
|
|
1311
|
+
if (invalidSignature) {
|
|
1312
|
+
throw new Error(ERR_INVALID_SIGNATURE);
|
|
1335
1313
|
}
|
|
1336
1314
|
controller.enqueue(decryptedChunkArray);
|
|
1337
1315
|
}
|
|
@@ -1403,11 +1381,11 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignat
|
|
|
1403
1381
|
hmac,
|
|
1404
1382
|
pending
|
|
1405
1383
|
} = aesCrypto;
|
|
1406
|
-
const inputLength = input.length - paddingEnd;
|
|
1407
1384
|
if (pending.length) {
|
|
1408
1385
|
input = concat(pending, input);
|
|
1409
|
-
output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
|
|
1410
1386
|
}
|
|
1387
|
+
const inputLength = input.length - paddingEnd;
|
|
1388
|
+
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
1411
1389
|
let offset;
|
|
1412
1390
|
for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
|
|
1413
1391
|
const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
|
|
@@ -1555,21 +1533,24 @@ const HEADER_LENGTH = 12;
|
|
|
1555
1533
|
|
|
1556
1534
|
class ZipCryptoDecryptionStream extends TransformStream {
|
|
1557
1535
|
|
|
1558
|
-
constructor({ password, passwordVerification, checkPasswordOnly }) {
|
|
1536
|
+
constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
|
|
1559
1537
|
super({
|
|
1560
1538
|
start() {
|
|
1561
1539
|
Object.assign(this, {
|
|
1562
1540
|
password,
|
|
1541
|
+
rawPassword,
|
|
1563
1542
|
passwordVerification
|
|
1564
1543
|
});
|
|
1565
|
-
createKeys(this, password);
|
|
1544
|
+
createKeys(this, password, rawPassword);
|
|
1566
1545
|
},
|
|
1567
1546
|
transform(chunk, controller) {
|
|
1568
1547
|
const zipCrypto = this;
|
|
1569
|
-
if (zipCrypto.password) {
|
|
1548
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1570
1549
|
const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
|
|
1571
|
-
zipCrypto.password = null;
|
|
1572
|
-
|
|
1550
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1551
|
+
// verify the password with a branch-free comparison of the verification byte, mirroring
|
|
1552
|
+
// the constant-time AES HMAC signature check
|
|
1553
|
+
if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
|
|
1573
1554
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1574
1555
|
}
|
|
1575
1556
|
chunk = chunk.subarray(HEADER_LENGTH);
|
|
@@ -1586,21 +1567,22 @@ class ZipCryptoDecryptionStream extends TransformStream {
|
|
|
1586
1567
|
|
|
1587
1568
|
class ZipCryptoEncryptionStream extends TransformStream {
|
|
1588
1569
|
|
|
1589
|
-
constructor({ password, passwordVerification }) {
|
|
1570
|
+
constructor({ password, rawPassword, passwordVerification }) {
|
|
1590
1571
|
super({
|
|
1591
1572
|
start() {
|
|
1592
1573
|
Object.assign(this, {
|
|
1593
1574
|
password,
|
|
1575
|
+
rawPassword,
|
|
1594
1576
|
passwordVerification
|
|
1595
1577
|
});
|
|
1596
|
-
createKeys(this, password);
|
|
1578
|
+
createKeys(this, password, rawPassword);
|
|
1597
1579
|
},
|
|
1598
1580
|
transform(chunk, controller) {
|
|
1599
1581
|
const zipCrypto = this;
|
|
1600
1582
|
let output;
|
|
1601
1583
|
let offset;
|
|
1602
|
-
if (zipCrypto.password) {
|
|
1603
|
-
zipCrypto.password = null;
|
|
1584
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1585
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1604
1586
|
const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
|
|
1605
1587
|
header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
|
|
1606
1588
|
output = new Uint8Array(chunk.length + header.length);
|
|
@@ -1635,25 +1617,31 @@ function encrypt(target, input) {
|
|
|
1635
1617
|
return output;
|
|
1636
1618
|
}
|
|
1637
1619
|
|
|
1638
|
-
function createKeys(target, password) {
|
|
1620
|
+
function createKeys(target, password, rawPassword) {
|
|
1639
1621
|
const keys = [0x12345678, 0x23456789, 0x34567890];
|
|
1640
1622
|
Object.assign(target, {
|
|
1641
1623
|
keys,
|
|
1642
1624
|
crcKey0: new Crc32(keys[0]),
|
|
1643
1625
|
crcKey2: new Crc32(keys[2])
|
|
1644
1626
|
});
|
|
1645
|
-
|
|
1646
|
-
|
|
1627
|
+
if (rawPassword) {
|
|
1628
|
+
for (let index = 0; index < rawPassword.length; index++) {
|
|
1629
|
+
updateKeys(target, rawPassword[index]);
|
|
1630
|
+
}
|
|
1631
|
+
} else {
|
|
1632
|
+
for (let index = 0; index < password.length; index++) {
|
|
1633
|
+
updateKeys(target, password.charCodeAt(index));
|
|
1634
|
+
}
|
|
1647
1635
|
}
|
|
1648
1636
|
}
|
|
1649
1637
|
|
|
1650
1638
|
function updateKeys(target, byte) {
|
|
1651
|
-
let [
|
|
1639
|
+
let [, key1] = target.keys;
|
|
1652
1640
|
target.crcKey0.append([byte]);
|
|
1653
|
-
key0 = ~target.crcKey0.get();
|
|
1641
|
+
const key0 = ~target.crcKey0.get();
|
|
1654
1642
|
key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
|
|
1655
1643
|
target.crcKey2.append([key1 >>> 24]);
|
|
1656
|
-
key2 = ~target.crcKey2.get();
|
|
1644
|
+
const key2 = ~target.crcKey2.get();
|
|
1657
1645
|
target.keys = [key0, key1, key2];
|
|
1658
1646
|
}
|
|
1659
1647
|
|
|
@@ -1700,6 +1688,7 @@ function getInt32(number) {
|
|
|
1700
1688
|
|
|
1701
1689
|
|
|
1702
1690
|
const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
|
|
1691
|
+
const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
|
|
1703
1692
|
const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
1704
1693
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
1705
1694
|
|
|
@@ -1756,6 +1745,7 @@ class InflateStream extends TransformStream {
|
|
|
1756
1745
|
}
|
|
1757
1746
|
if (compressed) {
|
|
1758
1747
|
readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
|
|
1748
|
+
readable = mapInflateStreamError(readable);
|
|
1759
1749
|
}
|
|
1760
1750
|
if ((!encrypted || zipCrypto) && signed) {
|
|
1761
1751
|
crc32Stream = new Crc32Stream();
|
|
@@ -1806,6 +1796,37 @@ function pipeThrough(readable, transformStream) {
|
|
|
1806
1796
|
return readable.pipeThrough(transformStream);
|
|
1807
1797
|
}
|
|
1808
1798
|
|
|
1799
|
+
// DecompressionStream implementations can fail with a message-less TypeError on malformed
|
|
1800
|
+
// input; give these errors an identifiable message (errors raised by the other stages of
|
|
1801
|
+
// the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
|
|
1802
|
+
function mapInflateStreamError(readable) {
|
|
1803
|
+
const reader = readable.getReader();
|
|
1804
|
+
return new ReadableStream({
|
|
1805
|
+
async pull(controller) {
|
|
1806
|
+
let result;
|
|
1807
|
+
try {
|
|
1808
|
+
result = await reader.read();
|
|
1809
|
+
} catch (error) {
|
|
1810
|
+
if (error && error.message) {
|
|
1811
|
+
throw error;
|
|
1812
|
+
}
|
|
1813
|
+
const mappedError = new Error(ERR_INVALID_COMPRESSED_DATA);
|
|
1814
|
+
mappedError.cause = error;
|
|
1815
|
+
throw mappedError;
|
|
1816
|
+
}
|
|
1817
|
+
const { value, done } = result;
|
|
1818
|
+
if (done) {
|
|
1819
|
+
controller.close();
|
|
1820
|
+
} else {
|
|
1821
|
+
controller.enqueue(value);
|
|
1822
|
+
}
|
|
1823
|
+
},
|
|
1824
|
+
cancel(reason) {
|
|
1825
|
+
return reader.cancel(reason);
|
|
1826
|
+
}
|
|
1827
|
+
});
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1809
1830
|
/*
|
|
1810
1831
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1811
1832
|
|
|
@@ -1835,6 +1856,7 @@ function pipeThrough(readable, transformStream) {
|
|
|
1835
1856
|
*/
|
|
1836
1857
|
|
|
1837
1858
|
|
|
1859
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
1838
1860
|
const MESSAGE_EVENT_TYPE = "message";
|
|
1839
1861
|
const MESSAGE_START = "start";
|
|
1840
1862
|
const MESSAGE_PULL = "pull";
|
|
@@ -1903,6 +1925,9 @@ class ChunkStream extends TransformStream {
|
|
|
1903
1925
|
|
|
1904
1926
|
constructor(chunkSize) {
|
|
1905
1927
|
let pendingChunk;
|
|
1928
|
+
if (!(chunkSize >= 1)) {
|
|
1929
|
+
chunkSize = DEFAULT_CHUNK_SIZE$1;
|
|
1930
|
+
}
|
|
1906
1931
|
super({
|
|
1907
1932
|
transform,
|
|
1908
1933
|
flush(controller) {
|
|
@@ -1920,12 +1945,12 @@ class ChunkStream extends TransformStream {
|
|
|
1920
1945
|
chunk = newChunk;
|
|
1921
1946
|
pendingChunk = null;
|
|
1922
1947
|
}
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
pendingChunk = chunk;
|
|
1948
|
+
let offset = 0;
|
|
1949
|
+
while (chunk.length - offset > chunkSize) {
|
|
1950
|
+
controller.enqueue(chunk.slice(offset, offset + chunkSize));
|
|
1951
|
+
offset += chunkSize;
|
|
1928
1952
|
}
|
|
1953
|
+
pendingChunk = offset ? chunk.slice(offset) : chunk;
|
|
1929
1954
|
}
|
|
1930
1955
|
}
|
|
1931
1956
|
}
|
|
@@ -1960,8 +1985,10 @@ class ChunkStream extends TransformStream {
|
|
|
1960
1985
|
|
|
1961
1986
|
|
|
1962
1987
|
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
1988
|
+
const ERROR_EVENT_TYPE = "error";
|
|
1989
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
1963
1990
|
|
|
1964
|
-
let webWorkerSupported, webWorkerURI, webWorkerOptions;
|
|
1991
|
+
let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
1965
1992
|
let transferStreamsSupported = true;
|
|
1966
1993
|
try {
|
|
1967
1994
|
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
@@ -1976,8 +2003,9 @@ class CodecWorker {
|
|
|
1976
2003
|
const { signal } = streamOptions;
|
|
1977
2004
|
Object.assign(workerData, {
|
|
1978
2005
|
busy: true,
|
|
2006
|
+
generation: (workerData.generation || 0) + 1,
|
|
1979
2007
|
readable: readable
|
|
1980
|
-
.pipeThrough(new ChunkStream(config
|
|
2008
|
+
.pipeThrough(new ChunkStream(getChunkSize(config)))
|
|
1981
2009
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
1982
2010
|
writable,
|
|
1983
2011
|
options: Object.assign({}, options),
|
|
@@ -2000,15 +2028,17 @@ class CodecWorker {
|
|
|
2000
2028
|
});
|
|
2001
2029
|
},
|
|
2002
2030
|
onTaskFinished() {
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2031
|
+
if (workerData.busy) {
|
|
2032
|
+
const { resolveTerminated } = workerData;
|
|
2033
|
+
if (resolveTerminated) {
|
|
2034
|
+
workerData.resolveTerminated = null;
|
|
2035
|
+
workerData.terminated = true;
|
|
2036
|
+
workerData.worker.terminate();
|
|
2037
|
+
resolveTerminated();
|
|
2038
|
+
}
|
|
2039
|
+
workerData.busy = false;
|
|
2040
|
+
onTaskFinished(workerData);
|
|
2009
2041
|
}
|
|
2010
|
-
workerData.busy = false;
|
|
2011
|
-
onTaskFinished(workerData);
|
|
2012
2042
|
}
|
|
2013
2043
|
});
|
|
2014
2044
|
if (webWorkerSupported === UNDEFINED_VALUE) {
|
|
@@ -2077,6 +2107,7 @@ function createWebWorkerInterface(workerData, config) {
|
|
|
2077
2107
|
}
|
|
2078
2108
|
Object.assign(workerData, {
|
|
2079
2109
|
worker,
|
|
2110
|
+
terminated: false,
|
|
2080
2111
|
interface: {
|
|
2081
2112
|
run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
|
|
2082
2113
|
}
|
|
@@ -2131,37 +2162,85 @@ async function runWebWorker(workerData, config) {
|
|
|
2131
2162
|
result
|
|
2132
2163
|
});
|
|
2133
2164
|
const { readable, options } = workerData;
|
|
2134
|
-
const { writable, closed } = watchClosedStream(workerData.writable);
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2165
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2166
|
+
let streamsTransferred;
|
|
2167
|
+
try {
|
|
2168
|
+
streamsTransferred = sendMessage({
|
|
2169
|
+
type: MESSAGE_START,
|
|
2170
|
+
options,
|
|
2171
|
+
config,
|
|
2172
|
+
readable,
|
|
2173
|
+
writable
|
|
2174
|
+
}, workerData);
|
|
2175
|
+
} catch (error) {
|
|
2176
|
+
abortPipe();
|
|
2177
|
+
try {
|
|
2178
|
+
await closed;
|
|
2179
|
+
} catch {
|
|
2180
|
+
// ignored
|
|
2181
|
+
}
|
|
2182
|
+
workerData.onTaskFinished();
|
|
2183
|
+
throw error;
|
|
2184
|
+
}
|
|
2142
2185
|
if (!streamsTransferred) {
|
|
2143
2186
|
Object.assign(workerData, {
|
|
2144
2187
|
reader: readable.getReader(),
|
|
2145
2188
|
writer: writable.getWriter()
|
|
2146
2189
|
});
|
|
2147
2190
|
}
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
await
|
|
2191
|
+
try {
|
|
2192
|
+
const resultValue = await result;
|
|
2193
|
+
await closeWritable();
|
|
2194
|
+
await closed;
|
|
2195
|
+
return resultValue;
|
|
2196
|
+
} catch (error) {
|
|
2197
|
+
await closeWritable();
|
|
2198
|
+
// unblock the pipe watcher if the worker died before closing its end of the stream
|
|
2199
|
+
abortPipe();
|
|
2200
|
+
try {
|
|
2201
|
+
await closed;
|
|
2202
|
+
} catch {
|
|
2203
|
+
// ignored
|
|
2204
|
+
}
|
|
2205
|
+
throw error;
|
|
2206
|
+
}
|
|
2207
|
+
|
|
2208
|
+
async function closeWritable() {
|
|
2209
|
+
if (!streamsTransferred && !writable.locked) {
|
|
2210
|
+
try {
|
|
2211
|
+
await writable.getWriter().close();
|
|
2212
|
+
} catch {
|
|
2213
|
+
// ignored
|
|
2214
|
+
}
|
|
2215
|
+
}
|
|
2151
2216
|
}
|
|
2152
|
-
await closed;
|
|
2153
|
-
return resultValue;
|
|
2154
2217
|
}
|
|
2155
2218
|
|
|
2156
2219
|
function watchClosedStream(writableSource) {
|
|
2220
|
+
const abortController = new AbortController();
|
|
2157
2221
|
const { writable, readable } = new TransformStream();
|
|
2158
|
-
const closed = readable.pipeTo(writableSource, { preventClose: true });
|
|
2159
|
-
|
|
2222
|
+
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
2223
|
+
// the pipe can fail before `closed` is awaited (e.g. the destination write fails);
|
|
2224
|
+
// mark the rejection as handled so it cannot kill the process in the meantime
|
|
2225
|
+
closed.catch(() => { });
|
|
2226
|
+
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
function terminateWorker$1(workerData) {
|
|
2230
|
+
const { worker } = workerData;
|
|
2231
|
+
if (worker) {
|
|
2232
|
+
try {
|
|
2233
|
+
worker.terminate();
|
|
2234
|
+
} catch {
|
|
2235
|
+
// ignored
|
|
2236
|
+
}
|
|
2237
|
+
}
|
|
2238
|
+
workerData.interface = null;
|
|
2160
2239
|
}
|
|
2161
2240
|
|
|
2162
2241
|
function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
|
|
2163
2242
|
let worker, resolvedURI, resolvedOptions;
|
|
2164
|
-
if (webWorkerURI === UNDEFINED_VALUE) {
|
|
2243
|
+
if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
|
|
2165
2244
|
// deno-lint-ignore valid-typeof
|
|
2166
2245
|
const isFunctionURI = typeof url == FUNCTION_TYPE;
|
|
2167
2246
|
if (isFunctionURI) {
|
|
@@ -2218,16 +2297,36 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
|
|
|
2218
2297
|
}
|
|
2219
2298
|
}
|
|
2220
2299
|
}
|
|
2300
|
+
webWorkerSource = url;
|
|
2221
2301
|
webWorkerURI = resolvedURI;
|
|
2222
2302
|
webWorkerOptions = resolvedOptions;
|
|
2223
2303
|
} else {
|
|
2224
2304
|
worker = new Worker(webWorkerURI, webWorkerOptions);
|
|
2225
2305
|
}
|
|
2226
2306
|
worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
|
|
2307
|
+
worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2308
|
+
worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2227
2309
|
return worker;
|
|
2228
2310
|
}
|
|
2229
2311
|
|
|
2230
|
-
function
|
|
2312
|
+
function onWorkerError(event, workerData) {
|
|
2313
|
+
if (event.preventDefault) {
|
|
2314
|
+
event.preventDefault();
|
|
2315
|
+
}
|
|
2316
|
+
const { rejectResult, writer, onTaskFinished } = workerData;
|
|
2317
|
+
// the worker is unusable (e.g. its script failed to load); terminate it and
|
|
2318
|
+
// fail the current task instead of letting it hang forever
|
|
2319
|
+
terminateWorker$1(workerData);
|
|
2320
|
+
if (rejectResult) {
|
|
2321
|
+
rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
|
|
2322
|
+
if (writer) {
|
|
2323
|
+
writer.releaseLock();
|
|
2324
|
+
}
|
|
2325
|
+
onTaskFinished();
|
|
2326
|
+
}
|
|
2327
|
+
}
|
|
2328
|
+
|
|
2329
|
+
function sendMessage(message, { worker, writer, transferStreams }) {
|
|
2231
2330
|
try {
|
|
2232
2331
|
const { value, readable, writable } = message;
|
|
2233
2332
|
const transferables = [];
|
|
@@ -2261,14 +2360,16 @@ function sendMessage(message, { worker, writer, onTaskFinished, transferStreams
|
|
|
2261
2360
|
if (writer) {
|
|
2262
2361
|
writer.releaseLock();
|
|
2263
2362
|
}
|
|
2264
|
-
onTaskFinished();
|
|
2265
2363
|
throw error;
|
|
2266
2364
|
}
|
|
2267
2365
|
}
|
|
2268
2366
|
|
|
2269
2367
|
async function onMessage({ data }, workerData) {
|
|
2270
2368
|
const { type, value, messageId, result, error } = data;
|
|
2271
|
-
const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
|
|
2369
|
+
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
2370
|
+
// continuations below can settle after the worker slot has been reassigned to a new
|
|
2371
|
+
// task (e.g. a pending pull read failing late); they must not touch the new task
|
|
2372
|
+
const stale = () => workerData.generation != generation;
|
|
2272
2373
|
try {
|
|
2273
2374
|
if (error) {
|
|
2274
2375
|
const { message, stack, code, name, outputSize } = error;
|
|
@@ -2278,23 +2379,32 @@ async function onMessage({ data }, workerData) {
|
|
|
2278
2379
|
} else {
|
|
2279
2380
|
if (type == MESSAGE_PULL) {
|
|
2280
2381
|
const { value, done } = await reader.read();
|
|
2281
|
-
|
|
2382
|
+
if (!stale()) {
|
|
2383
|
+
sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
|
|
2384
|
+
}
|
|
2282
2385
|
}
|
|
2283
2386
|
if (type == MESSAGE_DATA) {
|
|
2284
2387
|
await writer.ready;
|
|
2285
2388
|
await writer.write(new Uint8Array(value));
|
|
2286
|
-
|
|
2389
|
+
if (!stale()) {
|
|
2390
|
+
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
2391
|
+
}
|
|
2287
2392
|
}
|
|
2288
2393
|
if (type == MESSAGE_CLOSE) {
|
|
2289
2394
|
close(null, result);
|
|
2290
2395
|
}
|
|
2291
2396
|
}
|
|
2292
2397
|
} catch (error) {
|
|
2293
|
-
|
|
2294
|
-
|
|
2398
|
+
if (!stale()) {
|
|
2399
|
+
terminateWorker$1(workerData);
|
|
2400
|
+
close(error);
|
|
2401
|
+
}
|
|
2295
2402
|
}
|
|
2296
2403
|
|
|
2297
2404
|
function close(error, result) {
|
|
2405
|
+
if (stale()) {
|
|
2406
|
+
return;
|
|
2407
|
+
}
|
|
2298
2408
|
if (error) {
|
|
2299
2409
|
rejectResult(error);
|
|
2300
2410
|
} else {
|
|
@@ -2338,6 +2448,8 @@ async function onMessage({ data }, workerData) {
|
|
|
2338
2448
|
|
|
2339
2449
|
let pool = [];
|
|
2340
2450
|
const pendingRequests = [];
|
|
2451
|
+
let starvationTimeout;
|
|
2452
|
+
let starvationDelay;
|
|
2341
2453
|
|
|
2342
2454
|
let indexWorker = 0;
|
|
2343
2455
|
|
|
@@ -2364,14 +2476,20 @@ async function runWorker(stream, workerOptions) {
|
|
|
2364
2476
|
pool.push(workerData);
|
|
2365
2477
|
return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
|
|
2366
2478
|
} else {
|
|
2367
|
-
return new Promise(resolve =>
|
|
2479
|
+
return new Promise(resolve => {
|
|
2480
|
+
pendingRequests.push({ resolve, stream, workerOptions });
|
|
2481
|
+
starvationDelay = config.workerStarvationTimeout;
|
|
2482
|
+
armStarvationTimeout();
|
|
2483
|
+
});
|
|
2368
2484
|
}
|
|
2369
2485
|
}
|
|
2370
2486
|
|
|
2371
2487
|
function onTaskFinished(workerData) {
|
|
2488
|
+
clearStarvationTimeout();
|
|
2372
2489
|
if (pendingRequests.length) {
|
|
2373
2490
|
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2374
2491
|
resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
|
|
2492
|
+
armStarvationTimeout();
|
|
2375
2493
|
} else if (workerData.worker) {
|
|
2376
2494
|
clearTerminateTimeout(workerData);
|
|
2377
2495
|
terminateWorker(workerData, workerOptions);
|
|
@@ -2381,6 +2499,34 @@ async function runWorker(stream, workerOptions) {
|
|
|
2381
2499
|
}
|
|
2382
2500
|
}
|
|
2383
2501
|
|
|
2502
|
+
function armStarvationTimeout() {
|
|
2503
|
+
if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
|
|
2504
|
+
starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
|
|
2505
|
+
}
|
|
2506
|
+
}
|
|
2507
|
+
|
|
2508
|
+
function clearStarvationTimeout() {
|
|
2509
|
+
if (starvationTimeout) {
|
|
2510
|
+
clearTimeout(starvationTimeout);
|
|
2511
|
+
starvationTimeout = null;
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
|
|
2515
|
+
function onWorkerStarvation() {
|
|
2516
|
+
starvationTimeout = null;
|
|
2517
|
+
if (pendingRequests.length) {
|
|
2518
|
+
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2519
|
+
const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
|
|
2520
|
+
resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
|
|
2521
|
+
armStarvationTimeout();
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
|
|
2525
|
+
function onInlineTaskFinished() {
|
|
2526
|
+
clearStarvationTimeout();
|
|
2527
|
+
armStarvationTimeout();
|
|
2528
|
+
}
|
|
2529
|
+
|
|
2384
2530
|
function terminateWorker(workerData, workerOptions) {
|
|
2385
2531
|
const { config } = workerOptions;
|
|
2386
2532
|
const { terminateWorkerTimeout } = config;
|
|
@@ -2451,6 +2597,7 @@ const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
|
2451
2597
|
|
|
2452
2598
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
2453
2599
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
2600
|
+
const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
|
|
2454
2601
|
const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
2455
2602
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
2456
2603
|
const HTTP_HEADER_RANGE = "Range";
|
|
@@ -2575,7 +2722,7 @@ class Data64URIWriter extends Writer {
|
|
|
2575
2722
|
|
|
2576
2723
|
writeUint8Array(array) {
|
|
2577
2724
|
const writer = this;
|
|
2578
|
-
let indexArray
|
|
2725
|
+
let indexArray;
|
|
2579
2726
|
let dataString = writer.pending;
|
|
2580
2727
|
const delta = writer.pending.length;
|
|
2581
2728
|
writer.pending = "";
|
|
@@ -2585,12 +2732,10 @@ class Data64URIWriter extends Writer {
|
|
|
2585
2732
|
for (; indexArray < array.length; indexArray++) {
|
|
2586
2733
|
writer.pending += String.fromCharCode(array[indexArray]);
|
|
2587
2734
|
}
|
|
2588
|
-
if (dataString.length) {
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
writer.pending += dataString;
|
|
2593
|
-
}
|
|
2735
|
+
if (dataString.length > 2) {
|
|
2736
|
+
writer.data += btoa(dataString);
|
|
2737
|
+
} else {
|
|
2738
|
+
writer.pending = dataString + writer.pending;
|
|
2594
2739
|
}
|
|
2595
2740
|
}
|
|
2596
2741
|
|
|
@@ -2637,6 +2782,9 @@ class BlobWriter extends Stream {
|
|
|
2637
2782
|
}
|
|
2638
2783
|
});
|
|
2639
2784
|
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
2785
|
+
// mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
|
|
2786
|
+
// surfaces them
|
|
2787
|
+
writer.blob.catch(() => { });
|
|
2640
2788
|
}
|
|
2641
2789
|
|
|
2642
2790
|
getData() {
|
|
@@ -2721,7 +2869,8 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2721
2869
|
preventHeadRequest,
|
|
2722
2870
|
useRangeHeader,
|
|
2723
2871
|
forceRangeRequests,
|
|
2724
|
-
combineSizeEocd
|
|
2872
|
+
combineSizeEocd,
|
|
2873
|
+
fetch
|
|
2725
2874
|
} = options;
|
|
2726
2875
|
options = Object.assign({}, options);
|
|
2727
2876
|
delete options.preventHeadRequest;
|
|
@@ -2729,13 +2878,15 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2729
2878
|
delete options.forceRangeRequests;
|
|
2730
2879
|
delete options.combineSizeEocd;
|
|
2731
2880
|
delete options.useXHR;
|
|
2881
|
+
delete options.fetch;
|
|
2732
2882
|
Object.assign(httpReader, {
|
|
2733
2883
|
url,
|
|
2734
2884
|
options,
|
|
2735
2885
|
preventHeadRequest,
|
|
2736
2886
|
useRangeHeader,
|
|
2737
2887
|
forceRangeRequests,
|
|
2738
|
-
combineSizeEocd
|
|
2888
|
+
combineSizeEocd,
|
|
2889
|
+
fetch
|
|
2739
2890
|
});
|
|
2740
2891
|
}
|
|
2741
2892
|
|
|
@@ -2754,7 +2905,10 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
2754
2905
|
throw new Error(ERR_HTTP_RANGE);
|
|
2755
2906
|
} else {
|
|
2756
2907
|
if (combineSizeEocd) {
|
|
2757
|
-
|
|
2908
|
+
const eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
2909
|
+
if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
2910
|
+
httpReader.eocdCache = eocdCache;
|
|
2911
|
+
}
|
|
2758
2912
|
}
|
|
2759
2913
|
let contentSize;
|
|
2760
2914
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
@@ -2800,7 +2954,18 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
|
|
|
2800
2954
|
if (response.status != 206) {
|
|
2801
2955
|
throw new Error(ERR_HTTP_RANGE);
|
|
2802
2956
|
}
|
|
2803
|
-
|
|
2957
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
2958
|
+
if (contentRangeHeader) {
|
|
2959
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
2960
|
+
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
2961
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
2962
|
+
}
|
|
2963
|
+
}
|
|
2964
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
2965
|
+
if (data.length != length) {
|
|
2966
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
2967
|
+
}
|
|
2968
|
+
return data;
|
|
2804
2969
|
}
|
|
2805
2970
|
} else {
|
|
2806
2971
|
const { data } = httpReader;
|
|
@@ -2837,9 +3002,9 @@ async function getXMLHttpRequestData(httpReader) {
|
|
|
2837
3002
|
async function getRequestData(httpReader, sendRequest) {
|
|
2838
3003
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
|
|
2839
3004
|
httpReader.data = new Uint8Array(await response.arrayBuffer());
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
3005
|
+
// the downloaded content is authoritative, e.g. the Content-Length response header
|
|
3006
|
+
// of the HEAD request can be the encoded size when the content is compressed
|
|
3007
|
+
httpReader.size = httpReader.data.length;
|
|
2843
3008
|
}
|
|
2844
3009
|
|
|
2845
3010
|
async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
@@ -2848,7 +3013,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
2848
3013
|
} else {
|
|
2849
3014
|
const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
|
|
2850
3015
|
const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
|
|
2851
|
-
if (contentLength) {
|
|
3016
|
+
if (contentLength && !response.headers.get(HTTP_HEADER_CONTENT_ENCODING)) {
|
|
2852
3017
|
httpReader.size = Number(contentLength);
|
|
2853
3018
|
} else {
|
|
2854
3019
|
await getRequestData(httpReader, httpReader.options);
|
|
@@ -2856,8 +3021,8 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
2856
3021
|
}
|
|
2857
3022
|
}
|
|
2858
3023
|
|
|
2859
|
-
async function sendFetchRequest(method, { options, url }, headers) {
|
|
2860
|
-
const response = await
|
|
3024
|
+
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
3025
|
+
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
2861
3026
|
if (response.status < 400) {
|
|
2862
3027
|
return response;
|
|
2863
3028
|
} else {
|
|
@@ -2903,7 +3068,8 @@ class HttpReader extends Reader {
|
|
|
2903
3068
|
super();
|
|
2904
3069
|
Object.assign(this, {
|
|
2905
3070
|
url,
|
|
2906
|
-
|
|
3071
|
+
// an explicit fetch implementation takes precedence over useXHR
|
|
3072
|
+
reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
|
|
2907
3073
|
});
|
|
2908
3074
|
}
|
|
2909
3075
|
|
|
@@ -2928,8 +3094,7 @@ class HttpReader extends Reader {
|
|
|
2928
3094
|
class HttpRangeReader extends HttpReader {
|
|
2929
3095
|
|
|
2930
3096
|
constructor(url, options = {}) {
|
|
2931
|
-
options
|
|
2932
|
-
super(url, options);
|
|
3097
|
+
super(url, Object.assign({}, options, { useRangeHeader: true }));
|
|
2933
3098
|
}
|
|
2934
3099
|
}
|
|
2935
3100
|
|
|
@@ -3003,7 +3168,7 @@ class SplitDataReader extends Reader {
|
|
|
3003
3168
|
reader.lastDiskNumber = 0;
|
|
3004
3169
|
reader.lastDiskOffset = 0;
|
|
3005
3170
|
await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
|
|
3006
|
-
await diskReader
|
|
3171
|
+
await initStream(diskReader);
|
|
3007
3172
|
if (indexDiskReader != readers.length - 1) {
|
|
3008
3173
|
reader.lastDiskOffset += diskReader.size;
|
|
3009
3174
|
}
|
|
@@ -3087,14 +3252,26 @@ class SplitDataWriter extends Stream {
|
|
|
3087
3252
|
writer.diskOffset += diskSourceWriter.size;
|
|
3088
3253
|
writer.diskNumber++;
|
|
3089
3254
|
diskWriter = null;
|
|
3090
|
-
|
|
3255
|
+
// the next disk is not opened yet but its space is available; leaving a
|
|
3256
|
+
// stale value here would force a new disk for every subsequent write
|
|
3257
|
+
writer.availableSize = writer.maxSize;
|
|
3258
|
+
if (chunk.length > availableSize) {
|
|
3259
|
+
await this.write(chunk.subarray(availableSize));
|
|
3260
|
+
}
|
|
3091
3261
|
} else {
|
|
3092
3262
|
await writeChunk(chunk);
|
|
3093
3263
|
}
|
|
3094
3264
|
},
|
|
3095
3265
|
async close() {
|
|
3096
|
-
|
|
3097
|
-
|
|
3266
|
+
if (diskWriter) {
|
|
3267
|
+
await diskWriter.ready;
|
|
3268
|
+
await closeDisk();
|
|
3269
|
+
}
|
|
3270
|
+
},
|
|
3271
|
+
async abort(reason) {
|
|
3272
|
+
if (diskWriter) {
|
|
3273
|
+
await diskWriter.abort(reason);
|
|
3274
|
+
}
|
|
3098
3275
|
}
|
|
3099
3276
|
});
|
|
3100
3277
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -3109,7 +3286,6 @@ class SplitDataWriter extends Stream {
|
|
|
3109
3286
|
await diskWriter.ready;
|
|
3110
3287
|
await diskWriter.write(chunk);
|
|
3111
3288
|
diskSourceWriter.size += chunkLength;
|
|
3112
|
-
writer.size += chunkLength;
|
|
3113
3289
|
writer.availableSize -= chunkLength;
|
|
3114
3290
|
}
|
|
3115
3291
|
}
|
|
@@ -3209,7 +3385,7 @@ function readUint8Array(reader, offset, size, diskNumber) {
|
|
|
3209
3385
|
|
|
3210
3386
|
/* global TextDecoder */
|
|
3211
3387
|
|
|
3212
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■
|
|
3388
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3213
3389
|
const VALID_CP437 = CP437.length == 256;
|
|
3214
3390
|
|
|
3215
3391
|
function decodeCP437(stringValue) {
|
|
@@ -3257,7 +3433,8 @@ function decodeText(value, encoding) {
|
|
|
3257
3433
|
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3258
3434
|
return decodeCP437(value);
|
|
3259
3435
|
} else {
|
|
3260
|
-
|
|
3436
|
+
// ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
|
|
3437
|
+
return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
|
|
3261
3438
|
}
|
|
3262
3439
|
}
|
|
3263
3440
|
|
|
@@ -3434,6 +3611,7 @@ const OPTION_SIGNAL = "signal";
|
|
|
3434
3611
|
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
3435
3612
|
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
3436
3613
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
3614
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
3437
3615
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
3438
3616
|
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
3439
3617
|
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
@@ -3491,12 +3669,16 @@ const ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found";
|
|
|
3491
3669
|
const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
|
|
3492
3670
|
const ERR_ENCRYPTED = "File contains encrypted entry";
|
|
3493
3671
|
const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
3494
|
-
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
3672
|
+
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
3495
3673
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
3496
3674
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
3675
|
+
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
3497
3676
|
const CHARSET_UTF8 = "utf-8";
|
|
3498
3677
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
3499
3678
|
const CHARSET_CP437 = "cp437";
|
|
3679
|
+
// bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
|
|
3680
|
+
// because they are informative only
|
|
3681
|
+
const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
|
|
3500
3682
|
const ZIP64_PROPERTIES = [
|
|
3501
3683
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
3502
3684
|
[PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -3521,7 +3703,7 @@ class ZipReader {
|
|
|
3521
3703
|
reader: new GenericReader(reader),
|
|
3522
3704
|
options,
|
|
3523
3705
|
config: getConfiguration(),
|
|
3524
|
-
readRanges:
|
|
3706
|
+
readRanges: new Map()
|
|
3525
3707
|
});
|
|
3526
3708
|
}
|
|
3527
3709
|
|
|
@@ -3554,21 +3736,30 @@ class ZipReader {
|
|
|
3554
3736
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
3555
3737
|
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
3556
3738
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
3739
|
+
const checkAmbiguity = getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY);
|
|
3740
|
+
if (checkAmbiguity && appendedDataOffset != reader.size) {
|
|
3741
|
+
throwAmbiguousArchive("appended data");
|
|
3742
|
+
}
|
|
3557
3743
|
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
3558
3744
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
3559
3745
|
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
3560
|
-
let filesLength = getUint16(endOfDirectoryView,
|
|
3746
|
+
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
3561
3747
|
let prependedDataLength = 0;
|
|
3562
|
-
let startOffset
|
|
3748
|
+
let startOffset;
|
|
3749
|
+
let zip64EndOfDirectory;
|
|
3563
3750
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
|
|
3564
|
-
const endOfDirectoryLocatorArray =
|
|
3751
|
+
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3752
|
+
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3753
|
+
new Uint8Array();
|
|
3565
3754
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
3566
|
-
if (
|
|
3755
|
+
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3756
|
+
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
3567
3757
|
directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
|
|
3568
3758
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3569
3759
|
let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3570
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3571
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE &&
|
|
3760
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
|
|
3761
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3762
|
+
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3572
3763
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3573
3764
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3574
3765
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3577,24 +3768,36 @@ class ZipReader {
|
|
|
3577
3768
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3578
3769
|
endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3579
3770
|
}
|
|
3580
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3771
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3581
3772
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
3582
3773
|
}
|
|
3774
|
+
zip64EndOfDirectory = true;
|
|
3583
3775
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
3584
3776
|
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
3777
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
3778
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3585
3779
|
}
|
|
3586
3780
|
if (diskNumber == MAX_16_BITS) {
|
|
3587
3781
|
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
3782
|
+
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
3783
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3588
3784
|
}
|
|
3589
3785
|
if (filesLength == MAX_16_BITS) {
|
|
3590
3786
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
3787
|
+
} else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
3788
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3591
3789
|
}
|
|
3592
3790
|
if (directoryDataLength == MAX_32_BITS) {
|
|
3593
3791
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
3792
|
+
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3793
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3594
3794
|
}
|
|
3595
|
-
directoryDataOffset
|
|
3795
|
+
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3596
3796
|
}
|
|
3597
3797
|
}
|
|
3798
|
+
const declaredDirectoryDataLength = directoryDataLength;
|
|
3799
|
+
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
3800
|
+
(zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
3598
3801
|
if (directoryDataOffset >= reader.size) {
|
|
3599
3802
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
3600
3803
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -3609,8 +3812,11 @@ class ZipReader {
|
|
|
3609
3812
|
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3610
3813
|
let directoryView = getDataView$1(directoryArray);
|
|
3611
3814
|
if (directoryDataLength) {
|
|
3612
|
-
|
|
3613
|
-
|
|
3815
|
+
if (directoryArray.length < 4) {
|
|
3816
|
+
throw new Error(ERR_BAD_FORMAT);
|
|
3817
|
+
}
|
|
3818
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
|
|
3819
|
+
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3614
3820
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3615
3821
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3616
3822
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3620,8 +3826,8 @@ class ZipReader {
|
|
|
3620
3826
|
directoryView = getDataView$1(directoryArray);
|
|
3621
3827
|
}
|
|
3622
3828
|
}
|
|
3623
|
-
const expectedDirectoryDataLength =
|
|
3624
|
-
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
|
|
3829
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
|
|
3830
|
+
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3625
3831
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3626
3832
|
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3627
3833
|
directoryView = getDataView$1(directoryArray);
|
|
@@ -3629,16 +3835,19 @@ class ZipReader {
|
|
|
3629
3835
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3630
3836
|
throw new Error(ERR_BAD_FORMAT);
|
|
3631
3837
|
}
|
|
3838
|
+
startOffset = directoryDataOffset;
|
|
3632
3839
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
3633
3840
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
3841
|
+
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
3842
|
+
let duplicateFilename;
|
|
3634
3843
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
3635
3844
|
const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
|
|
3636
|
-
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3845
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3637
3846
|
throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
|
|
3638
3847
|
}
|
|
3639
3848
|
readCommonHeader(fileEntry, directoryView, offset + 6);
|
|
3640
3849
|
const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
|
|
3641
|
-
const filenameOffset = offset +
|
|
3850
|
+
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
3642
3851
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
3643
3852
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
3644
3853
|
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
@@ -3659,7 +3868,7 @@ class ZipReader {
|
|
|
3659
3868
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
3660
3869
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
3661
3870
|
};
|
|
3662
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42)
|
|
3871
|
+
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
3663
3872
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
3664
3873
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
3665
3874
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
@@ -3672,6 +3881,7 @@ class ZipReader {
|
|
|
3672
3881
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
3673
3882
|
}
|
|
3674
3883
|
Object.assign(fileEntry, {
|
|
3884
|
+
index: indexFile,
|
|
3675
3885
|
versionMadeBy,
|
|
3676
3886
|
msDosCompatible,
|
|
3677
3887
|
compressedSize: 0,
|
|
@@ -3691,8 +3901,15 @@ class ZipReader {
|
|
|
3691
3901
|
filename,
|
|
3692
3902
|
comment
|
|
3693
3903
|
});
|
|
3694
|
-
startOffset = Math.max(offsetFileEntry, startOffset);
|
|
3695
3904
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
3905
|
+
fileEntry.offset += prependedDataLength;
|
|
3906
|
+
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
3907
|
+
if (checkAmbiguity) {
|
|
3908
|
+
if (filenames.has(fileEntry.filename)) {
|
|
3909
|
+
duplicateFilename = true;
|
|
3910
|
+
}
|
|
3911
|
+
filenames.add(fileEntry.filename);
|
|
3912
|
+
}
|
|
3696
3913
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
3697
3914
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
3698
3915
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -3713,7 +3930,7 @@ class ZipReader {
|
|
|
3713
3930
|
internalFileAttribute: fileEntry.internalFileAttributes,
|
|
3714
3931
|
externalFileAttribute: fileEntry.externalFileAttributes,
|
|
3715
3932
|
executable,
|
|
3716
|
-
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3933
|
+
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (fileEntry.filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3717
3934
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
3718
3935
|
});
|
|
3719
3936
|
const entry = new Entry(fileEntry);
|
|
@@ -3736,6 +3953,15 @@ class ZipReader {
|
|
|
3736
3953
|
}
|
|
3737
3954
|
yield entry;
|
|
3738
3955
|
}
|
|
3956
|
+
if (checkAmbiguity && offset != declaredDirectoryDataLength) {
|
|
3957
|
+
throwAmbiguousArchive("trailing central directory data");
|
|
3958
|
+
}
|
|
3959
|
+
if (duplicateFilename) {
|
|
3960
|
+
throwAmbiguousArchive("duplicate filename");
|
|
3961
|
+
}
|
|
3962
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
3963
|
+
throwAmbiguousArchive("prepended data");
|
|
3964
|
+
}
|
|
3739
3965
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
3740
3966
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
3741
3967
|
if (extractPrependedData) {
|
|
@@ -3775,9 +4001,21 @@ class ZipReaderStream {
|
|
|
3775
4001
|
readable: (function () {
|
|
3776
4002
|
const { readable, writable } = new TransformStream();
|
|
3777
4003
|
if (value.getData) {
|
|
3778
|
-
|
|
4004
|
+
getData();
|
|
3779
4005
|
return readable;
|
|
3780
4006
|
}
|
|
4007
|
+
|
|
4008
|
+
async function getData() {
|
|
4009
|
+
try {
|
|
4010
|
+
await value.getData(writable);
|
|
4011
|
+
} catch (error) {
|
|
4012
|
+
try {
|
|
4013
|
+
await writable.abort(error);
|
|
4014
|
+
} catch {
|
|
4015
|
+
// ignored
|
|
4016
|
+
}
|
|
4017
|
+
}
|
|
4018
|
+
}
|
|
3781
4019
|
})()
|
|
3782
4020
|
};
|
|
3783
4021
|
delete chunk.getData;
|
|
@@ -3802,6 +4040,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3802
4040
|
const zipEntry = this;
|
|
3803
4041
|
const {
|
|
3804
4042
|
reader,
|
|
4043
|
+
index,
|
|
3805
4044
|
offset,
|
|
3806
4045
|
diskNumberStart,
|
|
3807
4046
|
extraFieldAES,
|
|
@@ -3827,27 +4066,42 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3827
4066
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
3828
4067
|
if (extraFieldAES) {
|
|
3829
4068
|
if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
|
|
3830
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4069
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3831
4070
|
}
|
|
3832
4071
|
}
|
|
3833
4072
|
if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
|
|
3834
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4073
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3835
4074
|
}
|
|
3836
|
-
if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
4075
|
+
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
3837
4076
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
3838
4077
|
}
|
|
3839
4078
|
readCommonHeader(localDirectory, dataView, 4);
|
|
3840
4079
|
const {
|
|
3841
4080
|
extraFieldLength,
|
|
3842
|
-
filenameLength
|
|
3843
|
-
lastAccessDate,
|
|
3844
|
-
creationDate
|
|
4081
|
+
filenameLength
|
|
3845
4082
|
} = localDirectory;
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
4083
|
+
const checkAmbiguity = getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY);
|
|
4084
|
+
let rawLocalFilename = new Uint8Array();
|
|
4085
|
+
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4086
|
+
const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
|
|
4087
|
+
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4088
|
+
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4089
|
+
} else {
|
|
4090
|
+
localDirectory.rawExtraField = extraFieldLength ?
|
|
4091
|
+
await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
|
|
4092
|
+
new Uint8Array();
|
|
4093
|
+
}
|
|
3849
4094
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
3850
|
-
|
|
4095
|
+
if (checkAmbiguity) {
|
|
4096
|
+
checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename);
|
|
4097
|
+
}
|
|
4098
|
+
const { lastAccessDate, creationDate } = localDirectory;
|
|
4099
|
+
if (lastAccessDate) {
|
|
4100
|
+
fileEntry.lastAccessDate = lastAccessDate;
|
|
4101
|
+
}
|
|
4102
|
+
if (creationDate) {
|
|
4103
|
+
fileEntry.creationDate = creationDate;
|
|
4104
|
+
}
|
|
3851
4105
|
const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
|
|
3852
4106
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
3853
4107
|
if (!passThrough) {
|
|
@@ -3893,7 +4147,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3893
4147
|
outputSize: passThrough ? compressedSize : uncompressedSize,
|
|
3894
4148
|
signature,
|
|
3895
4149
|
compressed: compressionMethod != 0 && !passThrough,
|
|
3896
|
-
encrypted
|
|
4150
|
+
encrypted,
|
|
3897
4151
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
3898
4152
|
useCompressionStream,
|
|
3899
4153
|
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
@@ -3907,6 +4161,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3907
4161
|
await detectOverlappingEntry({
|
|
3908
4162
|
reader,
|
|
3909
4163
|
fileEntry,
|
|
4164
|
+
index,
|
|
3910
4165
|
offset,
|
|
3911
4166
|
diskNumberStart,
|
|
3912
4167
|
signature,
|
|
@@ -4009,7 +4264,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
4009
4264
|
directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
|
|
4010
4265
|
}
|
|
4011
4266
|
const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
|
|
4012
|
-
if (extraFieldAES) {
|
|
4267
|
+
if (extraFieldAES && extraFieldAES.data.length >= 7) {
|
|
4013
4268
|
readExtraFieldAES(extraFieldAES, directory, compressionMethod);
|
|
4014
4269
|
directory.extraFieldAES = extraFieldAES;
|
|
4015
4270
|
} else {
|
|
@@ -4046,19 +4301,23 @@ function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
|
4046
4301
|
directory.zip64 = true;
|
|
4047
4302
|
const extraFieldView = getDataView$1(extraFieldZip64.data);
|
|
4048
4303
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4304
|
+
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4305
|
+
if (extraFieldZip64.data.length < requiredLength) {
|
|
4306
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4307
|
+
}
|
|
4049
4308
|
for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
|
|
4050
4309
|
const [propertyName, max] = missingProperties[indexMissingProperty];
|
|
4051
|
-
|
|
4052
|
-
|
|
4053
|
-
|
|
4054
|
-
offset += extraction.bytes;
|
|
4055
|
-
} else if (extraFieldZip64[propertyName]) {
|
|
4056
|
-
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4057
|
-
}
|
|
4310
|
+
const extraction = ZIP64_EXTRACTION[max];
|
|
4311
|
+
directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
|
|
4312
|
+
offset += extraction.bytes;
|
|
4058
4313
|
}
|
|
4059
4314
|
}
|
|
4060
4315
|
|
|
4061
4316
|
function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
|
|
4317
|
+
if (extraFieldUnicode.data.length < 5) {
|
|
4318
|
+
extraFieldUnicode.valid = false;
|
|
4319
|
+
return;
|
|
4320
|
+
}
|
|
4062
4321
|
const extraFieldView = getDataView$1(extraFieldUnicode.data);
|
|
4063
4322
|
const crc32 = new Crc32();
|
|
4064
4323
|
crc32.append(fileEntry[rawPropertyName]);
|
|
@@ -4131,32 +4390,30 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
4131
4390
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4132
4391
|
try {
|
|
4133
4392
|
const view = getDataView$1(new Uint8Array(extraField.data));
|
|
4134
|
-
let
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
if (
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4393
|
+
let uid, gid;
|
|
4394
|
+
if (isInfoZip) {
|
|
4395
|
+
// Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
|
|
4396
|
+
let offset = 0;
|
|
4397
|
+
const version = getUint8(view, offset++);
|
|
4398
|
+
const uidSize = getUint8(view, offset++);
|
|
4399
|
+
uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
|
|
4400
|
+
offset += uidSize;
|
|
4401
|
+
const gidSize = getUint8(view, offset++);
|
|
4402
|
+
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
4403
|
+
Object.assign(extraField, { version, uid, gid });
|
|
4404
|
+
} else if (extraField.data.length >= 4) {
|
|
4405
|
+
// Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
|
|
4406
|
+
// carried in the external file attributes, not here)
|
|
4407
|
+
uid = getUint16(view, 0);
|
|
4408
|
+
gid = getUint16(view, 2);
|
|
4409
|
+
Object.assign(extraField, { uid, gid });
|
|
4410
|
+
}
|
|
4151
4411
|
if (uid !== UNDEFINED_VALUE) {
|
|
4152
4412
|
directory.uid = uid;
|
|
4153
4413
|
}
|
|
4154
4414
|
if (gid !== UNDEFINED_VALUE) {
|
|
4155
4415
|
directory.gid = gid;
|
|
4156
4416
|
}
|
|
4157
|
-
if (unixMode !== UNDEFINED_VALUE) {
|
|
4158
|
-
directory.unixMode = unixMode;
|
|
4159
|
-
}
|
|
4160
4417
|
} catch {
|
|
4161
4418
|
// ignored
|
|
4162
4419
|
}
|
|
@@ -4170,6 +4427,9 @@ function unpackUnixId(bytes) {
|
|
|
4170
4427
|
}
|
|
4171
4428
|
|
|
4172
4429
|
function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
|
|
4430
|
+
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4431
|
+
return;
|
|
4432
|
+
}
|
|
4173
4433
|
const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
|
|
4174
4434
|
const flags = getUint8(extraFieldView, 0);
|
|
4175
4435
|
const timeProperties = [];
|
|
@@ -4195,7 +4455,8 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
4195
4455
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
4196
4456
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
4197
4457
|
const time = getUint32(extraFieldView, offset);
|
|
4198
|
-
|
|
4458
|
+
// the extended timestamp is a signed 32-bit time_t value
|
|
4459
|
+
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
4199
4460
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
4200
4461
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
4201
4462
|
}
|
|
@@ -4206,6 +4467,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
4206
4467
|
async function detectOverlappingEntry({
|
|
4207
4468
|
reader,
|
|
4208
4469
|
fileEntry,
|
|
4470
|
+
index,
|
|
4209
4471
|
offset,
|
|
4210
4472
|
diskNumberStart,
|
|
4211
4473
|
signature,
|
|
@@ -4217,10 +4479,9 @@ async function detectOverlappingEntry({
|
|
|
4217
4479
|
readRanges
|
|
4218
4480
|
}) {
|
|
4219
4481
|
let diskOffset = 0;
|
|
4220
|
-
if (diskNumberStart) {
|
|
4221
|
-
for (let indexReader = 0; indexReader < diskNumberStart; indexReader++) {
|
|
4222
|
-
|
|
4223
|
-
diskOffset += diskReader.size;
|
|
4482
|
+
if (diskNumberStart && reader.readers) {
|
|
4483
|
+
for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
|
|
4484
|
+
diskOffset += reader.readers[indexReader].size;
|
|
4224
4485
|
}
|
|
4225
4486
|
}
|
|
4226
4487
|
let dataDescriptorLength = 0;
|
|
@@ -4233,7 +4494,8 @@ async function detectOverlappingEntry({
|
|
|
4233
4494
|
}
|
|
4234
4495
|
if (dataDescriptorLength) {
|
|
4235
4496
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
|
|
4236
|
-
const dataDescriptorSignature =
|
|
4497
|
+
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4498
|
+
getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4237
4499
|
if (dataDescriptorSignature) {
|
|
4238
4500
|
const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
|
|
4239
4501
|
let readCompressedSize;
|
|
@@ -4258,14 +4520,14 @@ async function detectOverlappingEntry({
|
|
|
4258
4520
|
end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
|
|
4259
4521
|
fileEntry
|
|
4260
4522
|
};
|
|
4261
|
-
for (const otherRange of readRanges) {
|
|
4262
|
-
if (
|
|
4523
|
+
for (const [otherIndex, otherRange] of readRanges) {
|
|
4524
|
+
if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
|
|
4263
4525
|
const error = new Error(ERR_OVERLAPPING_ENTRY);
|
|
4264
4526
|
error.overlappingEntry = otherRange.fileEntry;
|
|
4265
4527
|
throw error;
|
|
4266
4528
|
}
|
|
4267
4529
|
}
|
|
4268
|
-
readRanges.
|
|
4530
|
+
readRanges.set(index, range);
|
|
4269
4531
|
}
|
|
4270
4532
|
|
|
4271
4533
|
async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
|
|
@@ -4290,6 +4552,35 @@ async function seekSignature(reader, signature, startOffset, minimumBytes, maxim
|
|
|
4290
4552
|
}
|
|
4291
4553
|
}
|
|
4292
4554
|
|
|
4555
|
+
function checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename) {
|
|
4556
|
+
const { rawFilename } = zipEntry;
|
|
4557
|
+
if (rawLocalFilename.length != rawFilename.length ||
|
|
4558
|
+
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte])) {
|
|
4559
|
+
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
4560
|
+
}
|
|
4561
|
+
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
4562
|
+
throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
|
|
4563
|
+
}
|
|
4564
|
+
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
4565
|
+
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
4566
|
+
}
|
|
4567
|
+
// when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
|
|
4568
|
+
// also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
|
|
4569
|
+
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
4570
|
+
(localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
4571
|
+
(localDirectory.signature != zipEntry.signature ||
|
|
4572
|
+
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
4573
|
+
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
4574
|
+
throwAmbiguousArchive("mismatched local file header (signature or sizes)");
|
|
4575
|
+
}
|
|
4576
|
+
}
|
|
4577
|
+
|
|
4578
|
+
function throwAmbiguousArchive(reason) {
|
|
4579
|
+
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
4580
|
+
error.reason = reason;
|
|
4581
|
+
throw error;
|
|
4582
|
+
}
|
|
4583
|
+
|
|
4293
4584
|
function getOptionValue$1(zipReader, options, name) {
|
|
4294
4585
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
4295
4586
|
}
|
|
@@ -4328,7 +4619,7 @@ function setUint32$1(view, offset, value) {
|
|
|
4328
4619
|
}
|
|
4329
4620
|
|
|
4330
4621
|
function getDataView$1(array) {
|
|
4331
|
-
return new DataView(array.buffer);
|
|
4622
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
4332
4623
|
}
|
|
4333
4624
|
|
|
4334
4625
|
/*
|
|
@@ -4368,13 +4659,19 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
|
4368
4659
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
4369
4660
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
4370
4661
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
4662
|
+
// same message as the constant exported by zip-reader.js
|
|
4663
|
+
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
4664
|
+
const MIN_UNIX_TIME = -2147483648;
|
|
4665
|
+
const MAX_UNIX_TIME = 2147483647;
|
|
4371
4666
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
4372
4667
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
4668
|
+
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
4373
4669
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
4374
4670
|
const ERR_INVALID_UID = "Invalid uid (must be integer 0..2^32-1)";
|
|
4375
4671
|
const ERR_INVALID_GID = "Invalid gid (must be integer 0..2^32-1)";
|
|
4376
4672
|
const ERR_INVALID_UNIX_MODE = "Invalid UNIX mode (must be integer 0..65535)";
|
|
4377
4673
|
const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be 'infozip' or 'unix')";
|
|
4674
|
+
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
4378
4675
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
4379
4676
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
4380
4677
|
|
|
@@ -4400,9 +4697,10 @@ class ZipWriter {
|
|
|
4400
4697
|
files: new Map(),
|
|
4401
4698
|
filenames: new Set(),
|
|
4402
4699
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
4403
|
-
|
|
4700
|
+
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
4404
4701
|
pendingAddFileCalls: new Set(),
|
|
4405
|
-
bufferedWrites: 0
|
|
4702
|
+
bufferedWrites: 0,
|
|
4703
|
+
lastFileEntry: UNDEFINED_VALUE
|
|
4406
4704
|
});
|
|
4407
4705
|
}
|
|
4408
4706
|
|
|
@@ -4411,17 +4709,18 @@ class ZipWriter {
|
|
|
4411
4709
|
throw new Error(ERR_ZIP_NOT_EMPTY);
|
|
4412
4710
|
}
|
|
4413
4711
|
reader = new GenericReader(reader);
|
|
4712
|
+
await initStream(reader);
|
|
4414
4713
|
const zipReader = new ZipReader(reader.readable);
|
|
4415
4714
|
const entries = await zipReader.getEntries();
|
|
4416
4715
|
await zipReader.close();
|
|
4716
|
+
await initStream(this.writer);
|
|
4417
4717
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4418
4718
|
this.writer.size = this.offset = reader.size;
|
|
4419
4719
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
4420
4720
|
this.files = new Map(entries.map(entry => {
|
|
4421
4721
|
const {
|
|
4422
4722
|
version,
|
|
4423
|
-
|
|
4424
|
-
lastModDate,
|
|
4723
|
+
rawLastModDate,
|
|
4425
4724
|
lastAccessDate,
|
|
4426
4725
|
creationDate,
|
|
4427
4726
|
rawFilename,
|
|
@@ -4434,6 +4733,7 @@ class ZipWriter {
|
|
|
4434
4733
|
zip64
|
|
4435
4734
|
} = entry;
|
|
4436
4735
|
let {
|
|
4736
|
+
compressionMethod,
|
|
4437
4737
|
rawExtraFieldZip64,
|
|
4438
4738
|
rawExtraFieldAES,
|
|
4439
4739
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4446,31 +4746,39 @@ class ZipWriter {
|
|
|
4446
4746
|
rawExtraFieldAES = rawExtraFieldAES || new Uint8Array();
|
|
4447
4747
|
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || new Uint8Array();
|
|
4448
4748
|
rawExtraFieldNTFS = rawExtraFieldNTFS || new Uint8Array();
|
|
4449
|
-
rawExtraFieldUnix =
|
|
4749
|
+
rawExtraFieldUnix = rawExtraFieldUnix || new Uint8Array();
|
|
4450
4750
|
rawExtraField = rawExtraField || new Uint8Array();
|
|
4751
|
+
if (entry.extraFieldAES) {
|
|
4752
|
+
compressionMethod = COMPRESSION_METHOD_AES;
|
|
4753
|
+
}
|
|
4451
4754
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
4452
|
-
const zip64UncompressedSize = zip64 && uncompressedSize
|
|
4453
|
-
const zip64CompressedSize = zip64 && compressedSize
|
|
4755
|
+
const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
|
|
4756
|
+
const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
|
|
4757
|
+
const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
|
|
4454
4758
|
const {
|
|
4455
4759
|
headerArray,
|
|
4456
4760
|
headerView
|
|
4457
4761
|
} = getHeaderArrayData({
|
|
4458
4762
|
version,
|
|
4459
|
-
bitFlag:
|
|
4763
|
+
bitFlag: bitFlagValue,
|
|
4460
4764
|
compressionMethod,
|
|
4461
4765
|
uncompressedSize,
|
|
4462
4766
|
compressedSize,
|
|
4463
|
-
|
|
4767
|
+
rawLastModDate,
|
|
4464
4768
|
rawFilename,
|
|
4465
4769
|
zip64CompressedSize,
|
|
4466
4770
|
zip64UncompressedSize,
|
|
4467
4771
|
extraFieldLength
|
|
4468
4772
|
});
|
|
4773
|
+
const { signature } = entry;
|
|
4774
|
+
if (signature !== UNDEFINED_VALUE) {
|
|
4775
|
+
setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
|
|
4776
|
+
}
|
|
4469
4777
|
Object.assign(entry, {
|
|
4470
4778
|
zip64UncompressedSize,
|
|
4471
4779
|
zip64CompressedSize,
|
|
4472
|
-
zip64Offset: zip64 && this.offset - diskOffset
|
|
4473
|
-
zip64DiskNumberStart: zip64 && diskNumber
|
|
4780
|
+
zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
|
|
4781
|
+
zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
|
|
4474
4782
|
rawExtraFieldZip64,
|
|
4475
4783
|
rawExtraFieldAES,
|
|
4476
4784
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4488,6 +4796,7 @@ class ZipWriter {
|
|
|
4488
4796
|
|
|
4489
4797
|
async add(name = "", reader, options = {}) {
|
|
4490
4798
|
const zipWriter = this;
|
|
4799
|
+
options = Object.assign({}, options);
|
|
4491
4800
|
const {
|
|
4492
4801
|
pendingAddFileCalls,
|
|
4493
4802
|
config
|
|
@@ -4498,17 +4807,24 @@ class ZipWriter {
|
|
|
4498
4807
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
4499
4808
|
}
|
|
4500
4809
|
let promiseAddFile;
|
|
4810
|
+
let nameAdded;
|
|
4501
4811
|
try {
|
|
4502
4812
|
name = name.trim();
|
|
4813
|
+
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
4814
|
+
name += DIRECTORY_SIGNATURE;
|
|
4815
|
+
}
|
|
4503
4816
|
if (zipWriter.filenames.has(name)) {
|
|
4504
4817
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
4505
4818
|
}
|
|
4506
4819
|
zipWriter.filenames.add(name);
|
|
4820
|
+
nameAdded = true;
|
|
4507
4821
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
4508
4822
|
pendingAddFileCalls.add(promiseAddFile);
|
|
4509
4823
|
return await promiseAddFile;
|
|
4510
4824
|
} catch (error) {
|
|
4511
|
-
|
|
4825
|
+
if (nameAdded) {
|
|
4826
|
+
zipWriter.filenames.delete(name);
|
|
4827
|
+
}
|
|
4512
4828
|
throw error;
|
|
4513
4829
|
} finally {
|
|
4514
4830
|
pendingAddFileCalls.delete(promiseAddFile);
|
|
@@ -4541,6 +4857,9 @@ class ZipWriter {
|
|
|
4541
4857
|
const zipWriter = this;
|
|
4542
4858
|
const { pendingAddFileCalls, writer } = this;
|
|
4543
4859
|
const { writable } = writer;
|
|
4860
|
+
if (getLength(comment) > MAX_16_BITS) {
|
|
4861
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
4862
|
+
}
|
|
4544
4863
|
while (pendingAddFileCalls.size) {
|
|
4545
4864
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
4546
4865
|
}
|
|
@@ -4559,28 +4878,94 @@ class ZipWriterStream {
|
|
|
4559
4878
|
const { readable, writable } = new TransformStream();
|
|
4560
4879
|
this.readable = readable;
|
|
4561
4880
|
this.zipWriter = new ZipWriter(writable, options);
|
|
4881
|
+
this.pendingAddFileCalls = new Set();
|
|
4562
4882
|
}
|
|
4563
4883
|
|
|
4564
4884
|
transform(path) {
|
|
4885
|
+
const zipWriter = this.zipWriter;
|
|
4886
|
+
let streamController;
|
|
4565
4887
|
const { readable, writable } = new TransformStream({
|
|
4566
|
-
|
|
4888
|
+
start(controller) {
|
|
4889
|
+
streamController = controller;
|
|
4890
|
+
},
|
|
4891
|
+
flush: () => void closeArchive()
|
|
4567
4892
|
});
|
|
4568
|
-
this.zipWriter.add(path, readable);
|
|
4893
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4569
4894
|
return { readable: this.readable, writable };
|
|
4895
|
+
|
|
4896
|
+
async function closeArchive() {
|
|
4897
|
+
try {
|
|
4898
|
+
await zipWriter.close();
|
|
4899
|
+
} catch (error) {
|
|
4900
|
+
try {
|
|
4901
|
+
await zipWriter.writer.writable.abort(error);
|
|
4902
|
+
} catch {
|
|
4903
|
+
// ignored
|
|
4904
|
+
}
|
|
4905
|
+
}
|
|
4906
|
+
}
|
|
4570
4907
|
}
|
|
4571
4908
|
|
|
4572
4909
|
writable(path) {
|
|
4573
|
-
|
|
4574
|
-
|
|
4910
|
+
let streamController;
|
|
4911
|
+
const { readable, writable } = new TransformStream({
|
|
4912
|
+
start(controller) {
|
|
4913
|
+
streamController = controller;
|
|
4914
|
+
}
|
|
4915
|
+
});
|
|
4916
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4575
4917
|
return writable;
|
|
4576
4918
|
}
|
|
4577
4919
|
|
|
4578
|
-
close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4920
|
+
async close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4921
|
+
await Promise.all(Array.from(this.pendingAddFileCalls));
|
|
4579
4922
|
return this.zipWriter.close(comment, options);
|
|
4580
4923
|
}
|
|
4581
4924
|
}
|
|
4582
4925
|
|
|
4926
|
+
function watchAddFileCall(zipWriterStream, promiseAddFile, onerror) {
|
|
4927
|
+
zipWriterStream.pendingAddFileCalls.add(promiseAddFile);
|
|
4928
|
+
promiseAddFile.catch(error => {
|
|
4929
|
+
try {
|
|
4930
|
+
onerror(error);
|
|
4931
|
+
} catch {
|
|
4932
|
+
// ignored
|
|
4933
|
+
}
|
|
4934
|
+
});
|
|
4935
|
+
}
|
|
4936
|
+
|
|
4583
4937
|
async function addFile(zipWriter, name, reader, options) {
|
|
4938
|
+
const attributesInfo = resolveAttributes(zipWriter, name, options);
|
|
4939
|
+
({ name } = attributesInfo);
|
|
4940
|
+
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
4941
|
+
const { comment } = metadataInfo;
|
|
4942
|
+
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
4943
|
+
zipWriter.files.set(name, UNDEFINED_VALUE);
|
|
4944
|
+
let fileEntry;
|
|
4945
|
+
try {
|
|
4946
|
+
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
4947
|
+
({ reader } = sizesInfo);
|
|
4948
|
+
const { diskOffset, diskNumber } = zipWriter.writer;
|
|
4949
|
+
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
4950
|
+
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
4951
|
+
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
4952
|
+
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4953
|
+
offset: zipWriter.offset - diskOffset,
|
|
4954
|
+
diskNumberStart: diskNumber
|
|
4955
|
+
});
|
|
4956
|
+
const headerInfo = getHeaderInfo(options);
|
|
4957
|
+
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4958
|
+
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4959
|
+
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4960
|
+
} catch (error) {
|
|
4961
|
+
zipWriter.files.delete(name);
|
|
4962
|
+
throw error;
|
|
4963
|
+
}
|
|
4964
|
+
Object.assign(fileEntry, { name, comment, extraField });
|
|
4965
|
+
return new Entry(fileEntry);
|
|
4966
|
+
}
|
|
4967
|
+
|
|
4968
|
+
function resolveAttributes(zipWriter, name, options) {
|
|
4584
4969
|
name = name.trim();
|
|
4585
4970
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
4586
4971
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
@@ -4588,7 +4973,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4588
4973
|
const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
4589
4974
|
const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
4590
4975
|
let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
4591
|
-
|
|
4976
|
+
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
4592
4977
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
4593
4978
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
4594
4979
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
@@ -4604,6 +4989,13 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4604
4989
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
4605
4990
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
4606
4991
|
}
|
|
4992
|
+
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
4993
|
+
((uid !== UNDEFINED_VALUE && uid > MAX_16_BITS) || (gid !== UNDEFINED_VALUE && gid > MAX_16_BITS))) {
|
|
4994
|
+
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
4995
|
+
}
|
|
4996
|
+
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
4997
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
4998
|
+
}
|
|
4607
4999
|
let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
4608
5000
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
4609
5001
|
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
@@ -4674,6 +5066,27 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4674
5066
|
if (hasMsDosProvided) {
|
|
4675
5067
|
externalFileAttributes = (externalFileAttributes & MAX_32_BITS) | (msdosAttributesRaw & MAX_8_BITS);
|
|
4676
5068
|
}
|
|
5069
|
+
return {
|
|
5070
|
+
name,
|
|
5071
|
+
resolvedOptions: {
|
|
5072
|
+
versionMadeBy,
|
|
5073
|
+
msDosCompatible,
|
|
5074
|
+
externalFileAttributes,
|
|
5075
|
+
unixExternalUpper,
|
|
5076
|
+
uid,
|
|
5077
|
+
gid,
|
|
5078
|
+
unixMode,
|
|
5079
|
+
unixExtraFieldType,
|
|
5080
|
+
setuid,
|
|
5081
|
+
setgid,
|
|
5082
|
+
sticky,
|
|
5083
|
+
msdosAttributesRaw,
|
|
5084
|
+
msdosAttributes
|
|
5085
|
+
}
|
|
5086
|
+
};
|
|
5087
|
+
}
|
|
5088
|
+
|
|
5089
|
+
function resolveMetadata(zipWriter, name, options) {
|
|
4677
5090
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
4678
5091
|
let rawFilename = encode(name);
|
|
4679
5092
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
@@ -4712,10 +5125,14 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4712
5125
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
|
|
4713
5126
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
4714
5127
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
4715
|
-
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE,
|
|
5128
|
+
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
4716
5129
|
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
4717
5130
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
4718
5131
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
5132
|
+
if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
|
|
5133
|
+
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
|
|
5134
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5135
|
+
}
|
|
4719
5136
|
let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
4720
5137
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
4721
5138
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
@@ -4731,7 +5148,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4731
5148
|
if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
4732
5149
|
level = 0;
|
|
4733
5150
|
}
|
|
4734
|
-
|
|
5151
|
+
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
4735
5152
|
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
4736
5153
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
4737
5154
|
}
|
|
@@ -4742,6 +5159,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4742
5159
|
let offset = 0;
|
|
4743
5160
|
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
4744
5161
|
rawExtraField = new Uint8Array(extraFieldSize);
|
|
5162
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4745
5163
|
extraField.forEach((data, type) => {
|
|
4746
5164
|
if (type > MAX_16_BITS) {
|
|
4747
5165
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
@@ -4749,22 +5167,72 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4749
5167
|
if (getLength(data) > MAX_16_BITS) {
|
|
4750
5168
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
4751
5169
|
}
|
|
4752
|
-
|
|
4753
|
-
|
|
5170
|
+
setUint16(rawExtraFieldView, offset, type);
|
|
5171
|
+
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
4754
5172
|
arraySet(rawExtraField, data, offset + 4);
|
|
4755
5173
|
offset += 4 + getLength(data);
|
|
4756
5174
|
});
|
|
4757
5175
|
}
|
|
5176
|
+
return {
|
|
5177
|
+
comment,
|
|
5178
|
+
resolvedOptions: {
|
|
5179
|
+
rawFilename,
|
|
5180
|
+
rawComment,
|
|
5181
|
+
version,
|
|
5182
|
+
lastModDate,
|
|
5183
|
+
lastAccessDate,
|
|
5184
|
+
creationDate,
|
|
5185
|
+
internalFileAttributes,
|
|
5186
|
+
passThrough,
|
|
5187
|
+
password,
|
|
5188
|
+
rawPassword,
|
|
5189
|
+
encryptionStrength,
|
|
5190
|
+
zipCrypto,
|
|
5191
|
+
extendedTimestamp,
|
|
5192
|
+
keepOrder,
|
|
5193
|
+
useWebWorkers,
|
|
5194
|
+
transferStreams,
|
|
5195
|
+
bufferedWrite,
|
|
5196
|
+
createTempStream,
|
|
5197
|
+
dataDescriptorSignature,
|
|
5198
|
+
signal,
|
|
5199
|
+
useUnicodeFileNames,
|
|
5200
|
+
compressionMethod,
|
|
5201
|
+
level,
|
|
5202
|
+
useCompressionStream,
|
|
5203
|
+
dataDescriptor,
|
|
5204
|
+
zip64,
|
|
5205
|
+
rawExtraField
|
|
5206
|
+
}
|
|
5207
|
+
};
|
|
5208
|
+
}
|
|
5209
|
+
|
|
5210
|
+
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
5211
|
+
const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
5212
|
+
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
4758
5213
|
let maximumCompressedSize = 0;
|
|
4759
|
-
let maximumEntrySize = 0;
|
|
4760
5214
|
let uncompressedSize = 0;
|
|
4761
5215
|
if (passThrough) {
|
|
5216
|
+
// the headers of a passThrough entry describe the payload verbatim: without a
|
|
5217
|
+
// reader they would declare content that is not there
|
|
5218
|
+
if (!reader) {
|
|
5219
|
+
throw new Error(ERR_UNDEFINED_READER);
|
|
5220
|
+
}
|
|
4762
5221
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
4763
5222
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
4764
5223
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
4765
5224
|
}
|
|
4766
5225
|
}
|
|
4767
5226
|
const zip64Enabled = zip64 === true;
|
|
5227
|
+
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
5228
|
+
// entries without a reader have no payload: write them as empty stored files instead of
|
|
5229
|
+
// declaring a compressed or encrypted content that does not exist
|
|
5230
|
+
const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
|
|
5231
|
+
if (!reader) {
|
|
5232
|
+
level = 0;
|
|
5233
|
+
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
5234
|
+
}
|
|
5235
|
+
const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4768
5236
|
if (reader) {
|
|
4769
5237
|
reader = new GenericReader(reader);
|
|
4770
5238
|
await initStream(reader);
|
|
@@ -4777,16 +5245,15 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4777
5245
|
}
|
|
4778
5246
|
} else {
|
|
4779
5247
|
options.uncompressedSize = uncompressedSize = reader.size;
|
|
4780
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5248
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4781
5249
|
}
|
|
4782
5250
|
} else {
|
|
4783
5251
|
options.uncompressedSize = uncompressedSize;
|
|
4784
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5252
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4785
5253
|
}
|
|
4786
5254
|
}
|
|
4787
|
-
const
|
|
4788
|
-
const
|
|
4789
|
-
const zip64CompressedSize = zip64Enabled || maximumCompressedSize > MAX_32_BITS;
|
|
5255
|
+
const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
|
|
5256
|
+
const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
|
|
4790
5257
|
if (zip64UncompressedSize || zip64CompressedSize) {
|
|
4791
5258
|
if (zip64 === false) {
|
|
4792
5259
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
@@ -4795,73 +5262,19 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4795
5262
|
}
|
|
4796
5263
|
}
|
|
4797
5264
|
zip64 = zip64 || false;
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
password,
|
|
4812
|
-
rawPassword,
|
|
4813
|
-
level,
|
|
4814
|
-
useWebWorkers,
|
|
4815
|
-
transferStreams,
|
|
4816
|
-
encryptionStrength,
|
|
4817
|
-
extendedTimestamp,
|
|
4818
|
-
zipCrypto,
|
|
4819
|
-
bufferedWrite,
|
|
4820
|
-
createTempStream,
|
|
4821
|
-
keepOrder,
|
|
4822
|
-
useUnicodeFileNames,
|
|
4823
|
-
dataDescriptor,
|
|
4824
|
-
dataDescriptorSignature,
|
|
4825
|
-
signal,
|
|
4826
|
-
msDosCompatible,
|
|
4827
|
-
internalFileAttribute: internalFileAttributes,
|
|
4828
|
-
internalFileAttributes,
|
|
4829
|
-
externalFileAttribute: externalFileAttributes,
|
|
4830
|
-
externalFileAttributes,
|
|
4831
|
-
useCompressionStream,
|
|
4832
|
-
passThrough,
|
|
4833
|
-
encrypted: Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted),
|
|
4834
|
-
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4835
|
-
compressionMethod,
|
|
4836
|
-
uncompressedSize,
|
|
4837
|
-
offset: zipWriter.offset - diskOffset,
|
|
4838
|
-
diskNumberStart: diskNumber,
|
|
4839
|
-
uid,
|
|
4840
|
-
gid,
|
|
4841
|
-
setuid,
|
|
4842
|
-
setgid,
|
|
4843
|
-
sticky,
|
|
4844
|
-
unixMode,
|
|
4845
|
-
msdosAttributesRaw,
|
|
4846
|
-
msdosAttributes,
|
|
4847
|
-
unixExternalUpper
|
|
4848
|
-
});
|
|
4849
|
-
const headerInfo = getHeaderInfo(options);
|
|
4850
|
-
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4851
|
-
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4852
|
-
maximumEntrySize = metadataSize + maximumCompressedSize;
|
|
4853
|
-
if (zipWriter.options[OPTION_USDZ]) {
|
|
4854
|
-
maximumEntrySize += maximumEntrySize + 64;
|
|
4855
|
-
}
|
|
4856
|
-
zipWriter.pendingEntriesSize += maximumEntrySize;
|
|
4857
|
-
let fileEntry;
|
|
4858
|
-
try {
|
|
4859
|
-
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4860
|
-
} finally {
|
|
4861
|
-
zipWriter.pendingEntriesSize -= maximumEntrySize;
|
|
4862
|
-
}
|
|
4863
|
-
Object.assign(fileEntry, { name, comment, extraField });
|
|
4864
|
-
return new Entry(fileEntry);
|
|
5265
|
+
return {
|
|
5266
|
+
reader,
|
|
5267
|
+
resolvedOptions: {
|
|
5268
|
+
dataDescriptor,
|
|
5269
|
+
zip64,
|
|
5270
|
+
zip64UncompressedSize,
|
|
5271
|
+
zip64CompressedSize,
|
|
5272
|
+
uncompressedSize,
|
|
5273
|
+
level,
|
|
5274
|
+
compressionMethod,
|
|
5275
|
+
encrypted: encryptedEntry
|
|
5276
|
+
}
|
|
5277
|
+
};
|
|
4865
5278
|
}
|
|
4866
5279
|
|
|
4867
5280
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
@@ -4878,37 +5291,40 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4878
5291
|
headerInfo
|
|
4879
5292
|
} = entryInfo;
|
|
4880
5293
|
const usdz = zipWriter.options[OPTION_USDZ];
|
|
4881
|
-
const previousFileEntry =
|
|
5294
|
+
const previousFileEntry = zipWriter.lastFileEntry;
|
|
4882
5295
|
let fileEntry = {};
|
|
4883
5296
|
let bufferedWrite;
|
|
4884
5297
|
let releaseLockWriter;
|
|
4885
5298
|
let releaseLockCurrentFileEntry;
|
|
4886
5299
|
let writingBufferedEntryData;
|
|
4887
5300
|
let writingEntryData;
|
|
5301
|
+
let writerSizeBeforeEntry;
|
|
5302
|
+
let flushedBufferedSize = 0;
|
|
4888
5303
|
let fileWriter;
|
|
4889
5304
|
files.set(name, fileEntry);
|
|
5305
|
+
zipWriter.lastFileEntry = fileEntry;
|
|
4890
5306
|
try {
|
|
4891
5307
|
let lockPreviousFileEntry;
|
|
4892
5308
|
if (keepOrder) {
|
|
4893
5309
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
4894
5310
|
requestLockCurrentFileEntry();
|
|
4895
5311
|
}
|
|
4896
|
-
if (
|
|
5312
|
+
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
5313
|
+
bufferedWrite = true;
|
|
5314
|
+
zipWriter.bufferedWrites++;
|
|
4897
5315
|
if (options.createTempStream) {
|
|
4898
5316
|
fileWriter = await options.createTempStream();
|
|
4899
5317
|
} else {
|
|
4900
5318
|
fileWriter = new TransformStream(UNDEFINED_VALUE, UNDEFINED_VALUE, { highWaterMark: INFINITY_VALUE });
|
|
4901
5319
|
}
|
|
4902
5320
|
fileWriter.size = 0;
|
|
4903
|
-
bufferedWrite = true;
|
|
4904
|
-
zipWriter.bufferedWrites++;
|
|
4905
5321
|
await initStream(writer);
|
|
4906
5322
|
} else {
|
|
4907
5323
|
fileWriter = writer;
|
|
4908
5324
|
await requestLockWriter();
|
|
4909
5325
|
}
|
|
4910
5326
|
await initStream(fileWriter);
|
|
4911
|
-
const {
|
|
5327
|
+
const { diskOffset } = writer;
|
|
4912
5328
|
if (zipWriter.addSplitZipSignature) {
|
|
4913
5329
|
delete zipWriter.addSplitZipSignature;
|
|
4914
5330
|
const signatureArray = new Uint8Array(4);
|
|
@@ -4917,21 +5333,20 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4917
5333
|
await writeData(writer, signatureArray);
|
|
4918
5334
|
zipWriter.offset += 4;
|
|
4919
5335
|
}
|
|
4920
|
-
if (usdz) {
|
|
5336
|
+
if (usdz && !bufferedWrite) {
|
|
4921
5337
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
4922
5338
|
}
|
|
4923
|
-
const {
|
|
4924
|
-
localHeaderView,
|
|
4925
|
-
localHeaderArray
|
|
4926
|
-
} = headerInfo;
|
|
5339
|
+
const { localHeaderArray } = headerInfo;
|
|
4927
5340
|
if (!bufferedWrite) {
|
|
4928
5341
|
await lockPreviousFileEntry;
|
|
4929
|
-
await skipDiskIfNeeded(
|
|
5342
|
+
await skipDiskIfNeeded();
|
|
4930
5343
|
}
|
|
4931
|
-
const
|
|
4932
|
-
|
|
5344
|
+
const diskNumberStart = writer.diskNumber;
|
|
5345
|
+
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5346
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
4933
5347
|
if (!bufferedWrite) {
|
|
4934
5348
|
writingEntryData = true;
|
|
5349
|
+
writerSizeBeforeEntry = writer.size;
|
|
4935
5350
|
await writeData(fileWriter, localHeaderArray);
|
|
4936
5351
|
}
|
|
4937
5352
|
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
|
|
@@ -4944,16 +5359,24 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4944
5359
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
4945
5360
|
await requestLockWriter();
|
|
4946
5361
|
writingBufferedEntryData = true;
|
|
5362
|
+
writerSizeBeforeEntry = writer.size;
|
|
5363
|
+
await skipDiskIfNeeded();
|
|
4947
5364
|
fileEntry.diskNumberStart = writer.diskNumber;
|
|
4948
|
-
fileEntry.offset = zipWriter
|
|
4949
|
-
|
|
4950
|
-
|
|
4951
|
-
|
|
4952
|
-
|
|
5365
|
+
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5366
|
+
if (usdz) {
|
|
5367
|
+
// the padding depends on the entry offset, only known now that the writer is locked
|
|
5368
|
+
const previousMetadataSize = entryInfo.metadataSize;
|
|
5369
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
|
|
5370
|
+
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5371
|
+
}
|
|
5372
|
+
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
5373
|
+
await writeData(writer, headerInfo.localHeaderArray);
|
|
5374
|
+
await flushBufferedData(fileWriter.readable, writer, signal, chunkLength => flushedBufferedSize += chunkLength);
|
|
4953
5375
|
writer.size += fileWriter.size;
|
|
4954
5376
|
writingBufferedEntryData = false;
|
|
4955
5377
|
} else {
|
|
4956
|
-
fileEntry.
|
|
5378
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
5379
|
+
fileEntry.offset = entryOffset;
|
|
4957
5380
|
}
|
|
4958
5381
|
zipWriter.offset += fileEntry.size;
|
|
4959
5382
|
return fileEntry;
|
|
@@ -4967,10 +5390,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4967
5390
|
// ignored
|
|
4968
5391
|
}
|
|
4969
5392
|
}
|
|
5393
|
+
zipWriter.offset += writer.size - writerSizeBeforeEntry;
|
|
4970
5394
|
if (bufferedWrite) {
|
|
4971
|
-
zipWriter.offset +=
|
|
4972
|
-
} else {
|
|
4973
|
-
zipWriter.offset = fileWriter.size;
|
|
5395
|
+
zipWriter.offset += flushedBufferedSize;
|
|
4974
5396
|
}
|
|
4975
5397
|
}
|
|
4976
5398
|
files.delete(name);
|
|
@@ -5001,10 +5423,10 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5001
5423
|
await lockWriter;
|
|
5002
5424
|
}
|
|
5003
5425
|
|
|
5004
|
-
async function skipDiskIfNeeded(
|
|
5426
|
+
async function skipDiskIfNeeded() {
|
|
5005
5427
|
if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
|
|
5006
5428
|
writer.availableSize = 0;
|
|
5007
|
-
await writeData(
|
|
5429
|
+
await writeData(writer, new Uint8Array());
|
|
5008
5430
|
}
|
|
5009
5431
|
}
|
|
5010
5432
|
}
|
|
@@ -5145,6 +5567,10 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
5145
5567
|
uncompressedSize = result.inputSize;
|
|
5146
5568
|
signature = result.signature;
|
|
5147
5569
|
}
|
|
5570
|
+
if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
|
|
5571
|
+
(!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
|
|
5572
|
+
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5573
|
+
}
|
|
5148
5574
|
} catch (error) {
|
|
5149
5575
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
5150
5576
|
writer.size += error.outputSize;
|
|
@@ -5207,35 +5633,28 @@ function getHeaderInfo(options) {
|
|
|
5207
5633
|
uncompressedSize
|
|
5208
5634
|
} = options;
|
|
5209
5635
|
let { version, compressionMethod } = options;
|
|
5210
|
-
const compressed = !directory && (
|
|
5636
|
+
const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
|
|
5637
|
+
? (level === UNDEFINED_VALUE || level > 0)
|
|
5638
|
+
: compressionMethod !== COMPRESSION_METHOD_STORE);
|
|
5211
5639
|
let rawLocalExtraFieldZip64;
|
|
5212
5640
|
const uncompressedFile = passThrough || !compressed;
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
setUint16(rawLocalExtraFieldZip64View, 2, getLength(rawLocalExtraFieldZip64) - 4);
|
|
5641
|
+
// entries without a data descriptor are always buffered (cf. getFileEntry), so the
|
|
5642
|
+
// zip64 extra field values can be patched into the local header before flushing it
|
|
5643
|
+
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
|
|
5644
|
+
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
5645
|
+
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
5646
|
+
// APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
|
|
5647
|
+
// uncompressed and compressed size fields
|
|
5648
|
+
const length = 4 + 16;
|
|
5649
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
5650
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
5651
|
+
extraFieldZip64.uint16(length - 4);
|
|
5652
|
+
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
5226
5653
|
if (zip64ExtraFieldComplete) {
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5232
|
-
}
|
|
5233
|
-
if (zip64CompressedSize && uncompressedFile) {
|
|
5234
|
-
setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
|
|
5235
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5236
|
-
}
|
|
5237
|
-
if (rawLocalExtraFieldZip64Offset == 4) {
|
|
5238
|
-
rawLocalExtraFieldZip64 = new Uint8Array();
|
|
5654
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
5655
|
+
if (uncompressedFile) {
|
|
5656
|
+
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
5657
|
+
extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
5239
5658
|
}
|
|
5240
5659
|
}
|
|
5241
5660
|
} else {
|
|
@@ -5243,11 +5662,11 @@ function getHeaderInfo(options) {
|
|
|
5243
5662
|
}
|
|
5244
5663
|
let rawExtraFieldAES;
|
|
5245
5664
|
if (encrypted && !zipCrypto) {
|
|
5246
|
-
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
|
|
5665
|
+
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
5666
|
+
extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
|
|
5667
|
+
extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
|
|
5668
|
+
rawExtraFieldAES = extraFieldAES.array;
|
|
5669
|
+
rawExtraFieldAES[8] = encryptionStrength;
|
|
5251
5670
|
} else {
|
|
5252
5671
|
rawExtraFieldAES = new Uint8Array();
|
|
5253
5672
|
}
|
|
@@ -5255,33 +5674,38 @@ function getHeaderInfo(options) {
|
|
|
5255
5674
|
let rawExtraFieldExtendedTimestamp;
|
|
5256
5675
|
let extraFieldExtendedTimestampFlag;
|
|
5257
5676
|
if (extendedTimestamp) {
|
|
5258
|
-
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5677
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
5678
|
+
if (inUnixTimeRange(lastModTimeUnix)) {
|
|
5679
|
+
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
5680
|
+
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
5681
|
+
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
5682
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5683
|
+
extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
|
|
5684
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
5685
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
5686
|
+
if (lastAccessDate) {
|
|
5687
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
5688
|
+
}
|
|
5689
|
+
if (creationDate) {
|
|
5690
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
5691
|
+
}
|
|
5692
|
+
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
5693
|
+
} else {
|
|
5694
|
+
// the date cannot be stored as a 32-bit time_t; the NTFS field replaces it
|
|
5695
|
+
rawExtraFieldExtendedTimestamp = new Uint8Array();
|
|
5273
5696
|
}
|
|
5274
5697
|
try {
|
|
5275
|
-
rawExtraFieldNTFS = new Uint8Array(36);
|
|
5276
|
-
const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
|
|
5277
5698
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
|
|
5282
|
-
|
|
5283
|
-
|
|
5284
|
-
|
|
5699
|
+
const extraFieldNTFS = createRecordWriter(36);
|
|
5700
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
|
|
5701
|
+
extraFieldNTFS.uint16(32);
|
|
5702
|
+
extraFieldNTFS.skip(4);
|
|
5703
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
5704
|
+
extraFieldNTFS.uint16(24);
|
|
5705
|
+
extraFieldNTFS.uint64(lastModTimeNTFS);
|
|
5706
|
+
extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
|
|
5707
|
+
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
5708
|
+
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
5285
5709
|
} catch {
|
|
5286
5710
|
rawExtraFieldNTFS = new Uint8Array();
|
|
5287
5711
|
}
|
|
@@ -5290,41 +5714,27 @@ function getHeaderInfo(options) {
|
|
|
5290
5714
|
}
|
|
5291
5715
|
let rawExtraFieldUnix;
|
|
5292
5716
|
try {
|
|
5293
|
-
const { uid, gid,
|
|
5294
|
-
if (unixExtraFieldType && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE
|
|
5717
|
+
const { uid, gid, unixExtraFieldType } = options;
|
|
5718
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5295
5719
|
const uidBytes = packUnixId(uid);
|
|
5296
5720
|
const gidBytes = packUnixId(gid);
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
|
|
5302
|
-
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
rawExtraFieldUnix = new Uint8Array(4 + payloadLength);
|
|
5315
|
-
const rawExtraFieldUnixView = getDataView(rawExtraFieldUnix);
|
|
5316
|
-
setUint16(rawExtraFieldUnixView, 0, unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE ? EXTRAFIELD_TYPE_INFOZIP : EXTRAFIELD_TYPE_UNIX);
|
|
5317
|
-
setUint16(rawExtraFieldUnixView, 2, payloadLength);
|
|
5318
|
-
setUint8(rawExtraFieldUnixView, 4, 1);
|
|
5319
|
-
setUint8(rawExtraFieldUnixView, 5, uidBytes.length);
|
|
5320
|
-
let offset = 6;
|
|
5321
|
-
arraySet(rawExtraFieldUnix, uidBytes, offset);
|
|
5322
|
-
offset += uidBytes.length;
|
|
5323
|
-
setUint8(rawExtraFieldUnixView, offset, gidBytes.length);
|
|
5324
|
-
offset++;
|
|
5325
|
-
arraySet(rawExtraFieldUnix, gidBytes, offset);
|
|
5326
|
-
offset += gidBytes.length;
|
|
5327
|
-
arraySet(rawExtraFieldUnix, modeArray, offset);
|
|
5721
|
+
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
5722
|
+
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
5723
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
5724
|
+
extraFieldUnix.uint16(payloadLength);
|
|
5725
|
+
extraFieldUnix.uint8(1);
|
|
5726
|
+
extraFieldUnix.uint8(uidBytes.length);
|
|
5727
|
+
extraFieldUnix.bytes(uidBytes);
|
|
5728
|
+
extraFieldUnix.uint8(gidBytes.length);
|
|
5729
|
+
extraFieldUnix.bytes(gidBytes);
|
|
5730
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5731
|
+
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5732
|
+
const extraFieldUnix = createRecordWriter(8);
|
|
5733
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
|
|
5734
|
+
extraFieldUnix.uint16(4);
|
|
5735
|
+
extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
5736
|
+
extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
5737
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5328
5738
|
} else {
|
|
5329
5739
|
rawExtraFieldUnix = new Uint8Array();
|
|
5330
5740
|
}
|
|
@@ -5342,8 +5752,11 @@ function getHeaderInfo(options) {
|
|
|
5342
5752
|
rawExtraFieldAES[9] = compressionMethod;
|
|
5343
5753
|
compressionMethod = COMPRESSION_METHOD_AES;
|
|
5344
5754
|
}
|
|
5345
|
-
const localExtraFieldZip64Length =
|
|
5755
|
+
const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
|
|
5346
5756
|
const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5757
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
5758
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
5759
|
+
}
|
|
5347
5760
|
const {
|
|
5348
5761
|
headerArray,
|
|
5349
5762
|
headerView,
|
|
@@ -5359,29 +5772,27 @@ function getHeaderInfo(options) {
|
|
|
5359
5772
|
zip64UncompressedSize,
|
|
5360
5773
|
extraFieldLength
|
|
5361
5774
|
});
|
|
5362
|
-
|
|
5363
|
-
const localHeaderArray =
|
|
5775
|
+
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
5776
|
+
const localHeaderArray = localHeader.array;
|
|
5364
5777
|
const localHeaderView = getDataView(localHeaderArray);
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5375
|
-
|
|
5376
|
-
localHeaderOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5377
|
-
arraySet(localHeaderArray, rawExtraFieldNTFS, localHeaderOffset);
|
|
5378
|
-
localHeaderOffset += getLength(rawExtraFieldNTFS);
|
|
5379
|
-
arraySet(localHeaderArray, rawExtraFieldUnix, localHeaderOffset);
|
|
5380
|
-
localHeaderOffset += getLength(rawExtraFieldUnix);
|
|
5381
|
-
arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
|
|
5778
|
+
localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
5779
|
+
localHeader.bytes(headerArray);
|
|
5780
|
+
localHeader.bytes(rawFilename);
|
|
5781
|
+
if (writeLocalExtraFieldZip64) {
|
|
5782
|
+
localHeader.bytes(rawLocalExtraFieldZip64);
|
|
5783
|
+
}
|
|
5784
|
+
localHeader.bytes(rawExtraFieldAES);
|
|
5785
|
+
localHeader.bytes(rawExtraFieldExtendedTimestamp);
|
|
5786
|
+
localHeader.bytes(rawExtraFieldNTFS);
|
|
5787
|
+
localHeader.bytes(rawExtraFieldUnix);
|
|
5788
|
+
localHeader.bytes(rawExtraField);
|
|
5382
5789
|
if (dataDescriptor) {
|
|
5383
|
-
|
|
5384
|
-
|
|
5790
|
+
if (!zip64CompressedSize) {
|
|
5791
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5792
|
+
}
|
|
5793
|
+
if (!zip64UncompressedSize) {
|
|
5794
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5795
|
+
}
|
|
5385
5796
|
}
|
|
5386
5797
|
return {
|
|
5387
5798
|
localHeaderArray,
|
|
@@ -5408,7 +5819,7 @@ function getHeaderInfo(options) {
|
|
|
5408
5819
|
function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
5409
5820
|
const { headerInfo } = entryInfo;
|
|
5410
5821
|
let { localHeaderArray, extraFieldLength } = headerInfo;
|
|
5411
|
-
let localHeaderArrayView
|
|
5822
|
+
let localHeaderArrayView;
|
|
5412
5823
|
let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
|
|
5413
5824
|
if (extraBytesLength < 4) {
|
|
5414
5825
|
extraBytesLength += 64;
|
|
@@ -5416,13 +5827,14 @@ function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
|
5416
5827
|
const rawExtraFieldUSDZ = new Uint8Array(extraBytesLength);
|
|
5417
5828
|
const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
|
|
5418
5829
|
setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
|
|
5419
|
-
setUint16(extraFieldUSDZView, 2, extraBytesLength -
|
|
5830
|
+
setUint16(extraFieldUSDZView, 2, extraBytesLength - 4);
|
|
5420
5831
|
const previousLocalHeaderArray = localHeaderArray;
|
|
5421
5832
|
headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
|
|
5422
5833
|
arraySet(localHeaderArray, previousLocalHeaderArray);
|
|
5423
5834
|
arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
|
|
5424
5835
|
localHeaderArrayView = getDataView(localHeaderArray);
|
|
5425
5836
|
setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
|
|
5837
|
+
headerInfo.localHeaderView = localHeaderArrayView;
|
|
5426
5838
|
entryInfo.metadataSize += extraBytesLength;
|
|
5427
5839
|
}
|
|
5428
5840
|
|
|
@@ -5545,37 +5957,32 @@ function updateLocalHeader({
|
|
|
5545
5957
|
}, localHeaderView, { dataDescriptor }) {
|
|
5546
5958
|
if (!dataDescriptor) {
|
|
5547
5959
|
if (!encrypted) {
|
|
5548
|
-
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE +
|
|
5960
|
+
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
|
|
5549
5961
|
}
|
|
5550
5962
|
if (!zip64CompressedSize) {
|
|
5551
|
-
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE +
|
|
5963
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
|
|
5552
5964
|
}
|
|
5553
5965
|
if (!zip64UncompressedSize) {
|
|
5554
|
-
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE +
|
|
5966
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, uncompressedSize);
|
|
5555
5967
|
}
|
|
5556
5968
|
}
|
|
5557
5969
|
if (zip64 && localExtraFieldZip64Length) {
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5562
|
-
}
|
|
5563
|
-
if (zip64CompressedSize) {
|
|
5564
|
-
setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
|
|
5565
|
-
localHeaderOffset += 8;
|
|
5566
|
-
}
|
|
5970
|
+
// the local zip64 extra field always contains both size slots
|
|
5971
|
+
const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
|
|
5972
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
5973
|
+
setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
|
|
5567
5974
|
}
|
|
5568
5975
|
}
|
|
5569
5976
|
|
|
5570
5977
|
|
|
5571
5978
|
async function closeFile(zipWriter, comment, options) {
|
|
5572
|
-
const
|
|
5573
|
-
const {
|
|
5574
|
-
|
|
5575
|
-
|
|
5979
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
5980
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
5981
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
|
|
5982
|
+
}
|
|
5983
|
+
|
|
5984
|
+
function createDirectoryRecords(files) {
|
|
5576
5985
|
let directoryDataLength = 0;
|
|
5577
|
-
let directoryOffset = zipWriter.offset - diskOffset;
|
|
5578
|
-
let filesLength = files.size;
|
|
5579
5986
|
for (const [, fileEntry] of files) {
|
|
5580
5987
|
const {
|
|
5581
5988
|
rawFilename,
|
|
@@ -5592,24 +5999,27 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5592
5999
|
uncompressedSize,
|
|
5593
6000
|
compressedSize
|
|
5594
6001
|
} = fileEntry;
|
|
5595
|
-
const zip64Offset = fileEntry.offset
|
|
5596
|
-
const zip64DiskNumberStart = fileEntry.diskNumberStart
|
|
6002
|
+
const zip64Offset = fileEntry.offset >= MAX_32_BITS;
|
|
6003
|
+
const zip64DiskNumberStart = fileEntry.diskNumberStart >= MAX_16_BITS;
|
|
5597
6004
|
let rawExtraFieldZip64;
|
|
5598
6005
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
5599
|
-
|
|
5600
|
-
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
if (
|
|
5604
|
-
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
5608
|
-
|
|
5609
|
-
if (
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
if (zip64DiskNumberStart) {
|
|
6006
|
+
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
6007
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
6008
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
6009
|
+
extraFieldZip64.uint16(length - 4);
|
|
6010
|
+
if (zip64UncompressedSize) {
|
|
6011
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
6012
|
+
}
|
|
6013
|
+
if (zip64CompressedSize) {
|
|
6014
|
+
extraFieldZip64.uint64(compressedSize);
|
|
6015
|
+
}
|
|
6016
|
+
if (zip64Offset) {
|
|
6017
|
+
extraFieldZip64.uint64(fileEntry.offset);
|
|
6018
|
+
}
|
|
6019
|
+
if (zip64DiskNumberStart) {
|
|
6020
|
+
extraFieldZip64.uint32(fileEntry.diskNumberStart);
|
|
6021
|
+
}
|
|
6022
|
+
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
5613
6023
|
} else {
|
|
5614
6024
|
rawExtraFieldZip64 = new Uint8Array();
|
|
5615
6025
|
}
|
|
@@ -5617,32 +6027,41 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5617
6027
|
fileEntry.zip64Offset = zip64Offset;
|
|
5618
6028
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
5619
6029
|
let rawExtraFieldTimestamp;
|
|
5620
|
-
|
|
5621
|
-
|
|
5622
|
-
const
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
6030
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
6031
|
+
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
6032
|
+
const extraFieldTimestamp = createRecordWriter(9);
|
|
6033
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
6034
|
+
extraFieldTimestamp.uint16(5);
|
|
6035
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
6036
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
6037
|
+
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
5627
6038
|
} else {
|
|
5628
6039
|
rawExtraFieldTimestamp = new Uint8Array();
|
|
5629
6040
|
}
|
|
5630
6041
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
|
|
6042
|
+
const extraFieldLength = getLength(
|
|
6043
|
+
rawExtraFieldZip64,
|
|
6044
|
+
rawExtraFieldAES,
|
|
6045
|
+
rawExtraFieldNTFS,
|
|
6046
|
+
rawExtraFieldUnix,
|
|
6047
|
+
rawExtraFieldTimestamp,
|
|
6048
|
+
rawExtraField);
|
|
6049
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
6050
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6051
|
+
}
|
|
6052
|
+
directoryDataLength += CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
5641
6053
|
}
|
|
6054
|
+
return directoryDataLength;
|
|
6055
|
+
}
|
|
6056
|
+
|
|
6057
|
+
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
6058
|
+
const { files, writer } = zipWriter;
|
|
5642
6059
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
5643
|
-
const directoryView = getDataView(directoryArray);
|
|
5644
6060
|
await initStream(writer);
|
|
6061
|
+
let offset = 0;
|
|
5645
6062
|
let directoryDiskOffset = 0;
|
|
6063
|
+
let cdStartDiskNumber = writer.diskNumber;
|
|
6064
|
+
let cdStartDiskOffset = writer.diskOffset;
|
|
5646
6065
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
5647
6066
|
const {
|
|
5648
6067
|
offset: fileEntryOffset,
|
|
@@ -5668,52 +6087,46 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5668
6087
|
compressedSize
|
|
5669
6088
|
} = fileEntry;
|
|
5670
6089
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5671
|
-
|
|
5672
|
-
|
|
6090
|
+
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6091
|
+
if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
|
|
6092
|
+
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6093
|
+
directoryDiskOffset = offset;
|
|
6094
|
+
writer.availableSize = 0;
|
|
6095
|
+
await writeData(writer, new Uint8Array());
|
|
6096
|
+
}
|
|
6097
|
+
if (indexFileEntry == 0) {
|
|
6098
|
+
cdStartDiskNumber = writer.diskNumber;
|
|
6099
|
+
cdStartDiskOffset = writer.diskOffset;
|
|
6100
|
+
}
|
|
5673
6101
|
if (!zip64UncompressedSize) {
|
|
5674
6102
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
5675
6103
|
}
|
|
5676
6104
|
if (!zip64CompressedSize) {
|
|
5677
6105
|
setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
|
|
5678
6106
|
}
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
|
|
5682
|
-
|
|
5683
|
-
|
|
5684
|
-
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
directoryOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5703
|
-
arraySet(directoryArray, rawExtraFieldNTFS, directoryOffset);
|
|
5704
|
-
directoryOffset += getLength(rawExtraFieldNTFS);
|
|
5705
|
-
arraySet(directoryArray, rawExtraFieldUnix, directoryOffset);
|
|
5706
|
-
directoryOffset += getLength(rawExtraFieldUnix);
|
|
5707
|
-
arraySet(directoryArray, rawExtraField, directoryOffset);
|
|
5708
|
-
directoryOffset += getLength(rawExtraField);
|
|
5709
|
-
arraySet(directoryArray, rawComment, directoryOffset);
|
|
5710
|
-
directoryOffset += getLength(rawComment);
|
|
5711
|
-
if (offset - directoryDiskOffset > writer.availableSize) {
|
|
5712
|
-
writer.availableSize = 0;
|
|
5713
|
-
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
5714
|
-
directoryDiskOffset = offset;
|
|
5715
|
-
}
|
|
5716
|
-
offset = directoryOffset;
|
|
6107
|
+
if ((zip64Offset || zip64DiskNumberStart) && fileEntry.version < VERSION_ZIP64) {
|
|
6108
|
+
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
6109
|
+
}
|
|
6110
|
+
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
6111
|
+
directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
6112
|
+
directoryRecord.uint16(versionMadeBy);
|
|
6113
|
+
directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
6114
|
+
directoryRecord.uint16(extraFieldLength);
|
|
6115
|
+
directoryRecord.uint16(getLength(rawComment));
|
|
6116
|
+
directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
6117
|
+
directoryRecord.uint16(internalFileAttributes);
|
|
6118
|
+
directoryRecord.uint32(externalFileAttributes);
|
|
6119
|
+
directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
6120
|
+
directoryRecord.bytes(rawFilename);
|
|
6121
|
+
directoryRecord.bytes(rawExtraFieldZip64);
|
|
6122
|
+
directoryRecord.bytes(rawExtraFieldAES);
|
|
6123
|
+
directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
|
|
6124
|
+
directoryRecord.bytes(rawExtraFieldNTFS);
|
|
6125
|
+
directoryRecord.bytes(rawExtraFieldUnix);
|
|
6126
|
+
directoryRecord.bytes(rawExtraField);
|
|
6127
|
+
directoryRecord.bytes(rawComment);
|
|
6128
|
+
arraySet(directoryArray, directoryRecord.array, offset);
|
|
6129
|
+
offset += directoryRecordLength;
|
|
5717
6130
|
if (options.onprogress) {
|
|
5718
6131
|
try {
|
|
5719
6132
|
await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
|
|
@@ -5723,36 +6136,53 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5723
6136
|
}
|
|
5724
6137
|
}
|
|
5725
6138
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6139
|
+
return { cdStartDiskNumber, cdStartDiskOffset };
|
|
6140
|
+
}
|
|
6141
|
+
|
|
6142
|
+
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6143
|
+
const { writer } = zipWriter;
|
|
6144
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
|
|
6145
|
+
let { directoryDataLength } = cdInfo;
|
|
6146
|
+
let filesLength = zipWriter.files.size;
|
|
6147
|
+
let diskNumber = cdStartDiskNumber;
|
|
6148
|
+
let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
|
|
5726
6149
|
let lastDiskNumber = writer.diskNumber;
|
|
5727
|
-
|
|
5728
|
-
if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
6150
|
+
if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5729
6151
|
lastDiskNumber++;
|
|
5730
6152
|
}
|
|
5731
6153
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
5732
|
-
if (directoryOffset
|
|
6154
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
5733
6155
|
if (zip64 === false) {
|
|
5734
6156
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5735
6157
|
} else {
|
|
5736
6158
|
zip64 = true;
|
|
5737
6159
|
}
|
|
5738
6160
|
}
|
|
5739
|
-
const
|
|
5740
|
-
|
|
5741
|
-
|
|
6161
|
+
const commentLength = getLength(comment);
|
|
6162
|
+
if (commentLength > MAX_16_BITS) {
|
|
6163
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
6164
|
+
}
|
|
6165
|
+
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6166
|
+
if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
|
|
6167
|
+
writer.availableSize = 0;
|
|
6168
|
+
await writeData(writer, new Uint8Array());
|
|
6169
|
+
}
|
|
6170
|
+
lastDiskNumber = writer.diskNumber;
|
|
5742
6171
|
if (zip64) {
|
|
5743
|
-
|
|
5744
|
-
|
|
5745
|
-
|
|
5746
|
-
|
|
5747
|
-
|
|
5748
|
-
|
|
5749
|
-
|
|
5750
|
-
|
|
5751
|
-
|
|
5752
|
-
|
|
5753
|
-
|
|
5754
|
-
|
|
5755
|
-
|
|
6172
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6173
|
+
endOfdirectoryRecord.uint64(44);
|
|
6174
|
+
endOfdirectoryRecord.uint16(45);
|
|
6175
|
+
endOfdirectoryRecord.uint16(45);
|
|
6176
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6177
|
+
endOfdirectoryRecord.uint32(diskNumber);
|
|
6178
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6179
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6180
|
+
endOfdirectoryRecord.uint64(directoryDataLength);
|
|
6181
|
+
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6182
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6183
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6184
|
+
endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
|
|
6185
|
+
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
5756
6186
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
5757
6187
|
if (supportZip64SplitFile) {
|
|
5758
6188
|
lastDiskNumber = MAX_16_BITS;
|
|
@@ -5761,29 +6191,40 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5761
6191
|
filesLength = MAX_16_BITS;
|
|
5762
6192
|
directoryOffset = MAX_32_BITS;
|
|
5763
6193
|
directoryDataLength = MAX_32_BITS;
|
|
5764
|
-
offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
|
|
5765
|
-
}
|
|
5766
|
-
setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
|
|
5767
|
-
setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
|
|
5768
|
-
setUint16(endOfdirectoryView, offset + 6, diskNumber);
|
|
5769
|
-
setUint16(endOfdirectoryView, offset + 8, filesLength);
|
|
5770
|
-
setUint16(endOfdirectoryView, offset + 10, filesLength);
|
|
5771
|
-
setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
|
|
5772
|
-
setUint32(endOfdirectoryView, offset + 16, directoryOffset);
|
|
5773
|
-
const commentLength = getLength(comment);
|
|
5774
|
-
if (commentLength) {
|
|
5775
|
-
if (commentLength <= MAX_16_BITS) {
|
|
5776
|
-
setUint16(endOfdirectoryView, offset + 20, commentLength);
|
|
5777
|
-
} else {
|
|
5778
|
-
throw new Error(ERR_INVALID_COMMENT);
|
|
5779
|
-
}
|
|
5780
6194
|
}
|
|
5781
|
-
|
|
6195
|
+
endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6196
|
+
endOfdirectoryRecord.uint16(lastDiskNumber);
|
|
6197
|
+
endOfdirectoryRecord.uint16(diskNumber);
|
|
6198
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6199
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6200
|
+
endOfdirectoryRecord.uint32(directoryDataLength);
|
|
6201
|
+
endOfdirectoryRecord.uint32(directoryOffset);
|
|
6202
|
+
endOfdirectoryRecord.uint16(commentLength);
|
|
6203
|
+
await writeData(writer, endOfdirectoryRecord.array);
|
|
5782
6204
|
if (commentLength) {
|
|
5783
6205
|
await writeData(writer, comment);
|
|
5784
6206
|
}
|
|
5785
6207
|
}
|
|
5786
6208
|
|
|
6209
|
+
function createRecordWriter(length) {
|
|
6210
|
+
const array = new Uint8Array(length);
|
|
6211
|
+
const view = getDataView(array);
|
|
6212
|
+
let offset = 0;
|
|
6213
|
+
return {
|
|
6214
|
+
array,
|
|
6215
|
+
uint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
6216
|
+
uint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
6217
|
+
uint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
6218
|
+
uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
6219
|
+
bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
6220
|
+
skip: count => offset += count
|
|
6221
|
+
};
|
|
6222
|
+
}
|
|
6223
|
+
|
|
6224
|
+
function getSegmentOffset(zipWriter, writer) {
|
|
6225
|
+
return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
|
|
6226
|
+
}
|
|
6227
|
+
|
|
5787
6228
|
async function writeData(writer, array) {
|
|
5788
6229
|
const { writable } = writer;
|
|
5789
6230
|
const streamWriter = writable.getWriter();
|
|
@@ -5796,12 +6237,40 @@ async function writeData(writer, array) {
|
|
|
5796
6237
|
}
|
|
5797
6238
|
}
|
|
5798
6239
|
|
|
6240
|
+
async function flushBufferedData(readable, writer, signal, onChunkWritten) {
|
|
6241
|
+
const streamWriter = writer.writable.getWriter();
|
|
6242
|
+
try {
|
|
6243
|
+
await readable.pipeTo(new WritableStream({
|
|
6244
|
+
async write(chunk) {
|
|
6245
|
+
await streamWriter.ready;
|
|
6246
|
+
await streamWriter.write(chunk);
|
|
6247
|
+
onChunkWritten(getLength(chunk));
|
|
6248
|
+
}
|
|
6249
|
+
}), { preventClose: true, preventAbort: true, signal });
|
|
6250
|
+
} finally {
|
|
6251
|
+
streamWriter.releaseLock();
|
|
6252
|
+
}
|
|
6253
|
+
}
|
|
6254
|
+
|
|
5799
6255
|
function getTimeNTFS(date) {
|
|
5800
6256
|
if (date) {
|
|
5801
6257
|
return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
|
|
5802
6258
|
}
|
|
5803
6259
|
}
|
|
5804
6260
|
|
|
6261
|
+
function getTimeUnix(date) {
|
|
6262
|
+
return Math.floor(date.getTime() / 1000);
|
|
6263
|
+
}
|
|
6264
|
+
|
|
6265
|
+
// the extended timestamp extra field stores dates as signed 32-bit time_t values
|
|
6266
|
+
function inUnixTimeRange(timeUnix) {
|
|
6267
|
+
return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
|
|
6268
|
+
}
|
|
6269
|
+
|
|
6270
|
+
function clampUnixTime(timeUnix) {
|
|
6271
|
+
return Math.min(MAX_UNIX_TIME, Math.max(MIN_UNIX_TIME, timeUnix));
|
|
6272
|
+
}
|
|
6273
|
+
|
|
5805
6274
|
function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
5806
6275
|
const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
|
|
5807
6276
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
@@ -5832,7 +6301,7 @@ function arraySet(array, typedArray, offset) {
|
|
|
5832
6301
|
}
|
|
5833
6302
|
|
|
5834
6303
|
function getDataView(array) {
|
|
5835
|
-
return new DataView(array.buffer);
|
|
6304
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
5836
6305
|
}
|
|
5837
6306
|
|
|
5838
6307
|
function getLength(...arrayLikes) {
|
|
@@ -5848,30 +6317,39 @@ function getHeaderArrayData({
|
|
|
5848
6317
|
uncompressedSize,
|
|
5849
6318
|
compressedSize,
|
|
5850
6319
|
lastModDate,
|
|
6320
|
+
rawLastModDate,
|
|
5851
6321
|
rawFilename,
|
|
5852
6322
|
zip64CompressedSize,
|
|
5853
6323
|
zip64UncompressedSize,
|
|
5854
6324
|
extraFieldLength
|
|
5855
6325
|
}) {
|
|
5856
|
-
const
|
|
6326
|
+
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
6327
|
+
const headerArray = headerRecord.array;
|
|
5857
6328
|
const headerView = getDataView(headerArray);
|
|
5858
|
-
|
|
5859
|
-
|
|
5860
|
-
|
|
5861
|
-
|
|
5862
|
-
|
|
5863
|
-
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
6329
|
+
headerRecord.uint16(version);
|
|
6330
|
+
headerRecord.uint16(bitFlag);
|
|
6331
|
+
headerRecord.uint16(compressionMethod);
|
|
6332
|
+
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
6333
|
+
const dateArray = new Uint32Array(1);
|
|
6334
|
+
const dateView = getDataView(dateArray);
|
|
6335
|
+
setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
|
|
6336
|
+
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
6337
|
+
rawLastModDate = dateArray[0];
|
|
6338
|
+
}
|
|
6339
|
+
headerRecord.uint32(rawLastModDate);
|
|
6340
|
+
headerRecord.skip(4);
|
|
5867
6341
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
5868
|
-
|
|
6342
|
+
headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
6343
|
+
} else {
|
|
6344
|
+
headerRecord.skip(4);
|
|
5869
6345
|
}
|
|
5870
6346
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
5871
|
-
|
|
6347
|
+
headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
6348
|
+
} else {
|
|
6349
|
+
headerRecord.skip(4);
|
|
5872
6350
|
}
|
|
5873
|
-
|
|
5874
|
-
|
|
6351
|
+
headerRecord.uint16(getLength(rawFilename));
|
|
6352
|
+
headerRecord.uint16(extraFieldLength);
|
|
5875
6353
|
return {
|
|
5876
6354
|
headerArray,
|
|
5877
6355
|
headerView,
|
|
@@ -5972,7 +6450,7 @@ try {
|
|
|
5972
6450
|
// ignored
|
|
5973
6451
|
}
|
|
5974
6452
|
|
|
5975
|
-
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());}};
|
|
6453
|
+
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());}};
|
|
5976
6454
|
|
|
5977
6455
|
/*
|
|
5978
6456
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -6006,7 +6484,7 @@ var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Arr
|
|
|
6006
6484
|
configure({
|
|
6007
6485
|
workerURI: "./core/web-worker-native.js",
|
|
6008
6486
|
wasmURI: null,
|
|
6009
|
-
CompressionStreamZlib:
|
|
6487
|
+
CompressionStreamZlib: h_,
|
|
6010
6488
|
DecompressionStreamZlib: x_
|
|
6011
6489
|
});
|
|
6012
6490
|
|
|
@@ -6039,12 +6517,15 @@ configure({
|
|
|
6039
6517
|
*/
|
|
6040
6518
|
|
|
6041
6519
|
|
|
6520
|
+
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
6521
|
+
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
6522
|
+
|
|
6042
6523
|
class ZipEntry {
|
|
6043
6524
|
|
|
6044
6525
|
constructor(fs, name, params, parent) {
|
|
6045
6526
|
const zipEntry = this;
|
|
6046
6527
|
if (fs.root && parent && parent.getChildByName(name)) {
|
|
6047
|
-
throw new Error(
|
|
6528
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6048
6529
|
}
|
|
6049
6530
|
if (!params) {
|
|
6050
6531
|
params = {};
|
|
@@ -6054,13 +6535,17 @@ class ZipEntry {
|
|
|
6054
6535
|
name,
|
|
6055
6536
|
data: params.data,
|
|
6056
6537
|
options: params.options,
|
|
6057
|
-
id: fs.
|
|
6538
|
+
id: fs.entryIdCounter++,
|
|
6058
6539
|
parent,
|
|
6059
6540
|
children: [],
|
|
6060
6541
|
uncompressedSize: params.uncompressedSize || 0,
|
|
6061
6542
|
passThrough: params.passThrough
|
|
6062
6543
|
});
|
|
6063
|
-
|
|
6544
|
+
// detached entries (e.g. clones) are not registered until they are attached,
|
|
6545
|
+
// otherwise they could never be garbage collected
|
|
6546
|
+
if (parent || !fs.root) {
|
|
6547
|
+
fs.entries[zipEntry.id] = zipEntry;
|
|
6548
|
+
}
|
|
6064
6549
|
if (parent) {
|
|
6065
6550
|
zipEntry.parent.children.push(zipEntry);
|
|
6066
6551
|
}
|
|
@@ -6098,7 +6583,7 @@ class ZipEntry {
|
|
|
6098
6583
|
rename(name) {
|
|
6099
6584
|
const parent = this.parent;
|
|
6100
6585
|
if (parent && parent.getChildByName(name)) {
|
|
6101
|
-
throw new Error(
|
|
6586
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6102
6587
|
} else {
|
|
6103
6588
|
this.name = name;
|
|
6104
6589
|
}
|
|
@@ -6137,16 +6622,17 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6137
6622
|
}
|
|
6138
6623
|
|
|
6139
6624
|
isPasswordProtected() {
|
|
6140
|
-
return this.data.encrypted;
|
|
6625
|
+
return Boolean(this.data && this.data.encrypted);
|
|
6141
6626
|
}
|
|
6142
6627
|
|
|
6143
6628
|
async checkPassword(password, options = {}) {
|
|
6144
6629
|
const zipEntry = this;
|
|
6145
6630
|
if (zipEntry.isPasswordProtected()) {
|
|
6146
|
-
options.password = password;
|
|
6147
|
-
options.checkPasswordOnly = true;
|
|
6148
6631
|
try {
|
|
6149
|
-
await zipEntry.data.getData(null, options
|
|
6632
|
+
await zipEntry.data.getData(null, Object.assign({}, options, {
|
|
6633
|
+
password,
|
|
6634
|
+
checkPasswordOnly: true
|
|
6635
|
+
}));
|
|
6150
6636
|
return true;
|
|
6151
6637
|
} catch (error) {
|
|
6152
6638
|
if (error.message == ERR_INVALID_PASSWORD) {
|
|
@@ -6180,8 +6666,15 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6180
6666
|
return this.getData({ writable }, options);
|
|
6181
6667
|
}
|
|
6182
6668
|
|
|
6183
|
-
getArrayBuffer(options) {
|
|
6184
|
-
|
|
6669
|
+
async getArrayBuffer(options) {
|
|
6670
|
+
// this.data may be a string, a Uint8Array, a data URI or a Blob depending on how the entry
|
|
6671
|
+
// was created, so retrieve the bytes through getUint8Array rather than assuming a Blob; this
|
|
6672
|
+
// also applies the options (password, signal, onprogress...) like the other getData() getters
|
|
6673
|
+
const array = await this.getUint8Array(options);
|
|
6674
|
+
// return the backing buffer directly when the array spans it, slicing the exact bytes otherwise
|
|
6675
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength
|
|
6676
|
+
? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
|
|
6677
|
+
: array.buffer;
|
|
6185
6678
|
}
|
|
6186
6679
|
|
|
6187
6680
|
replaceBlob(blob) {
|
|
@@ -6223,7 +6716,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6223
6716
|
replaceReadable(readable) {
|
|
6224
6717
|
Object.assign(this, {
|
|
6225
6718
|
data: null,
|
|
6226
|
-
Reader:
|
|
6719
|
+
Reader: getReadableReader(readable),
|
|
6227
6720
|
Writer: null,
|
|
6228
6721
|
reader: null
|
|
6229
6722
|
});
|
|
@@ -6239,7 +6732,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6239
6732
|
|
|
6240
6733
|
clone(deepClone) {
|
|
6241
6734
|
const zipEntry = this;
|
|
6242
|
-
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name);
|
|
6735
|
+
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name, zipEntry);
|
|
6243
6736
|
if (deepClone) {
|
|
6244
6737
|
clonedEntry.children = zipEntry.children.map(child => {
|
|
6245
6738
|
const childClone = child.clone(deepClone);
|
|
@@ -6313,7 +6806,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6313
6806
|
|
|
6314
6807
|
addReadable(name, readable, options = {}) {
|
|
6315
6808
|
return addChild(this, name, {
|
|
6316
|
-
Reader:
|
|
6809
|
+
Reader: getReadableReader(readable),
|
|
6317
6810
|
options
|
|
6318
6811
|
});
|
|
6319
6812
|
}
|
|
@@ -6327,6 +6820,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6327
6820
|
}
|
|
6328
6821
|
|
|
6329
6822
|
addFile(file, options = {}) {
|
|
6823
|
+
options = Object.assign({}, options);
|
|
6330
6824
|
if (!options.lastModDate) {
|
|
6331
6825
|
options.lastModDate = new Date(file.lastModified);
|
|
6332
6826
|
}
|
|
@@ -6393,11 +6887,15 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6393
6887
|
try {
|
|
6394
6888
|
const path = entry.filename.split("/");
|
|
6395
6889
|
const name = path.pop();
|
|
6396
|
-
path.forEach(
|
|
6890
|
+
path.forEach(pathPart => {
|
|
6397
6891
|
const previousParent = parent;
|
|
6398
6892
|
parent = parent.getChildByName(pathPart);
|
|
6399
|
-
if (
|
|
6400
|
-
|
|
6893
|
+
if (parent) {
|
|
6894
|
+
if (!parent.directory) {
|
|
6895
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6896
|
+
}
|
|
6897
|
+
} else {
|
|
6898
|
+
parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
|
|
6401
6899
|
importedEntries.push(parent);
|
|
6402
6900
|
}
|
|
6403
6901
|
});
|
|
@@ -6408,6 +6906,22 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6408
6906
|
uncompressedSize: entry.uncompressedSize,
|
|
6409
6907
|
passThrough: options.passThrough
|
|
6410
6908
|
}));
|
|
6909
|
+
} else {
|
|
6910
|
+
let directoryEntry = parent;
|
|
6911
|
+
if (name) {
|
|
6912
|
+
directoryEntry = parent.getChildByName(name);
|
|
6913
|
+
if (directoryEntry) {
|
|
6914
|
+
if (!directoryEntry.directory) {
|
|
6915
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6916
|
+
}
|
|
6917
|
+
} else {
|
|
6918
|
+
directoryEntry = new ZipDirectoryEntry(this.fs, name, { data: null }, parent);
|
|
6919
|
+
importedEntries.push(directoryEntry);
|
|
6920
|
+
}
|
|
6921
|
+
}
|
|
6922
|
+
if (directoryEntry != this && !directoryEntry.data) {
|
|
6923
|
+
directoryEntry.data = entry;
|
|
6924
|
+
}
|
|
6411
6925
|
}
|
|
6412
6926
|
} catch (error) {
|
|
6413
6927
|
try {
|
|
@@ -6423,14 +6937,15 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6423
6937
|
return importedEntries;
|
|
6424
6938
|
}
|
|
6425
6939
|
|
|
6426
|
-
async exportZip(writer, options) {
|
|
6940
|
+
async exportZip(writer, options = {}) {
|
|
6427
6941
|
const zipEntry = this;
|
|
6942
|
+
options = Object.assign({}, options);
|
|
6428
6943
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
6429
6944
|
options.bufferedWrite = true;
|
|
6430
6945
|
}
|
|
6431
|
-
await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
6946
|
+
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
6432
6947
|
const zipWriter = new ZipWriter(writer, options);
|
|
6433
|
-
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options);
|
|
6948
|
+
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options, readers);
|
|
6434
6949
|
await zipWriter.close();
|
|
6435
6950
|
return writer.getData ? writer.getData() : writer.writable;
|
|
6436
6951
|
}
|
|
@@ -6476,7 +6991,15 @@ class FS {
|
|
|
6476
6991
|
|
|
6477
6992
|
remove(entry) {
|
|
6478
6993
|
detach(entry);
|
|
6479
|
-
|
|
6994
|
+
const removedEntries = [entry];
|
|
6995
|
+
while (removedEntries.length) {
|
|
6996
|
+
const removedEntry = removedEntries.pop();
|
|
6997
|
+
this.entries[removedEntry.id] = null;
|
|
6998
|
+
for (const child of removedEntry.children) {
|
|
6999
|
+
removedEntries.push(child);
|
|
7000
|
+
}
|
|
7001
|
+
}
|
|
7002
|
+
entry.parent = UNDEFINED_VALUE;
|
|
6480
7003
|
}
|
|
6481
7004
|
|
|
6482
7005
|
move(entry, destination) {
|
|
@@ -6486,12 +7009,17 @@ class FS {
|
|
|
6486
7009
|
if (destination.directory) {
|
|
6487
7010
|
if (!destination.isDescendantOf(entry)) {
|
|
6488
7011
|
if (entry != destination) {
|
|
6489
|
-
|
|
6490
|
-
|
|
7012
|
+
const existingChild = destination.getChildByName(entry.name);
|
|
7013
|
+
if (existingChild) {
|
|
7014
|
+
if (existingChild != entry) {
|
|
7015
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
7016
|
+
}
|
|
7017
|
+
} else {
|
|
7018
|
+
detach(entry);
|
|
7019
|
+
entry.parent = destination;
|
|
7020
|
+
destination.children.push(entry);
|
|
7021
|
+
registerEntries(this, entry);
|
|
6491
7022
|
}
|
|
6492
|
-
detach(entry);
|
|
6493
|
-
entry.parent = destination;
|
|
6494
|
-
destination.children.push(entry);
|
|
6495
7023
|
}
|
|
6496
7024
|
} else {
|
|
6497
7025
|
throw new Error("Entry is a ancestor of target entry");
|
|
@@ -6508,6 +7036,11 @@ class FS {
|
|
|
6508
7036
|
for (let index = 0; node && index < path.length; index++) {
|
|
6509
7037
|
node = node.getChildByName(path[index]);
|
|
6510
7038
|
}
|
|
7039
|
+
if (!node) {
|
|
7040
|
+
// exclude detached entries, e.g. clones registered in `entries` but not attached
|
|
7041
|
+
node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
|
|
7042
|
+
entry.getRelativeName() == fullname);
|
|
7043
|
+
}
|
|
6511
7044
|
return node;
|
|
6512
7045
|
}
|
|
6513
7046
|
|
|
@@ -6589,6 +7122,7 @@ class FS {
|
|
|
6589
7122
|
}
|
|
6590
7123
|
|
|
6591
7124
|
importZip(reader, options) {
|
|
7125
|
+
resetFS(this);
|
|
6592
7126
|
return this.root.importZip(reader, options);
|
|
6593
7127
|
}
|
|
6594
7128
|
|
|
@@ -6608,6 +7142,10 @@ class FS {
|
|
|
6608
7142
|
return this.root.exportWritable(writable, options);
|
|
6609
7143
|
}
|
|
6610
7144
|
|
|
7145
|
+
exportZip(writer, options) {
|
|
7146
|
+
return this.root.exportZip(writer, options);
|
|
7147
|
+
}
|
|
7148
|
+
|
|
6611
7149
|
isPasswordProtected() {
|
|
6612
7150
|
return this.root.isPasswordProtected();
|
|
6613
7151
|
}
|
|
@@ -6621,15 +7159,26 @@ const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
|
6621
7159
|
|
|
6622
7160
|
function getTotalSize(entries, propertyName) {
|
|
6623
7161
|
let size = 0;
|
|
6624
|
-
|
|
7162
|
+
const pendingEntries = Array.from(entries);
|
|
7163
|
+
while (pendingEntries.length) {
|
|
7164
|
+
const entry = pendingEntries.pop();
|
|
7165
|
+
size += entry[propertyName] || 0;
|
|
7166
|
+
for (const child of entry.children) {
|
|
7167
|
+
pendingEntries.push(child);
|
|
7168
|
+
}
|
|
7169
|
+
}
|
|
6625
7170
|
return size;
|
|
7171
|
+
}
|
|
6626
7172
|
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
7173
|
+
function getReadableReader(readable) {
|
|
7174
|
+
let consumed;
|
|
7175
|
+
return function () {
|
|
7176
|
+
if (consumed) {
|
|
7177
|
+
throw new Error(ERR_READABLE_CONSUMED);
|
|
6631
7178
|
}
|
|
6632
|
-
|
|
7179
|
+
consumed = true;
|
|
7180
|
+
return { readable };
|
|
7181
|
+
};
|
|
6633
7182
|
}
|
|
6634
7183
|
|
|
6635
7184
|
function getZipBlobReader(options) {
|
|
@@ -6644,7 +7193,7 @@ function getZipBlobReader(options) {
|
|
|
6644
7193
|
async init() {
|
|
6645
7194
|
const zipBlobReader = this;
|
|
6646
7195
|
zipBlobReader.size = zipBlobReader.entry.uncompressedSize;
|
|
6647
|
-
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({},
|
|
7196
|
+
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, options, zipBlobReader.options));
|
|
6648
7197
|
zipBlobReader.data = data;
|
|
6649
7198
|
zipBlobReader.blobReader = new BlobReader(data);
|
|
6650
7199
|
super.init();
|
|
@@ -6657,29 +7206,41 @@ function getZipBlobReader(options) {
|
|
|
6657
7206
|
}
|
|
6658
7207
|
|
|
6659
7208
|
async function initReaders(entry, options) {
|
|
6660
|
-
|
|
6661
|
-
|
|
7209
|
+
const fileEntries = [];
|
|
7210
|
+
const pendingEntries = [entry];
|
|
7211
|
+
// per-export map so concurrent exports do not share (and lock) the same readers
|
|
7212
|
+
const readers = new Map();
|
|
7213
|
+
while (pendingEntries.length) {
|
|
7214
|
+
const pendingEntry = pendingEntries.pop();
|
|
7215
|
+
for (const child of pendingEntry.children) {
|
|
6662
7216
|
if (child.directory) {
|
|
6663
|
-
|
|
7217
|
+
pendingEntries.push(child);
|
|
6664
7218
|
} else {
|
|
6665
|
-
|
|
6666
|
-
try {
|
|
6667
|
-
await initStream(reader);
|
|
6668
|
-
} catch (error) {
|
|
6669
|
-
try {
|
|
6670
|
-
error.entryId = child.id;
|
|
6671
|
-
error.cause = {
|
|
6672
|
-
entry: child
|
|
6673
|
-
};
|
|
6674
|
-
} catch {
|
|
6675
|
-
// ignored
|
|
6676
|
-
}
|
|
6677
|
-
throw error;
|
|
6678
|
-
}
|
|
6679
|
-
child.uncompressedSize = reader.size;
|
|
7219
|
+
fileEntries.push(child);
|
|
6680
7220
|
}
|
|
6681
|
-
}
|
|
7221
|
+
}
|
|
6682
7222
|
}
|
|
7223
|
+
await Promise.all(fileEntries.map(async child => {
|
|
7224
|
+
const reader = child.reader = new child.Reader(child.data, options);
|
|
7225
|
+
readers.set(child, reader);
|
|
7226
|
+
try {
|
|
7227
|
+
await initStream(reader);
|
|
7228
|
+
} catch (error) {
|
|
7229
|
+
try {
|
|
7230
|
+
error.entryId = child.id;
|
|
7231
|
+
error.cause = {
|
|
7232
|
+
entry: child
|
|
7233
|
+
};
|
|
7234
|
+
} catch {
|
|
7235
|
+
// ignored
|
|
7236
|
+
}
|
|
7237
|
+
throw error;
|
|
7238
|
+
}
|
|
7239
|
+
if (reader.size !== UNDEFINED_VALUE) {
|
|
7240
|
+
child.uncompressedSize = reader.size;
|
|
7241
|
+
}
|
|
7242
|
+
}));
|
|
7243
|
+
return readers;
|
|
6683
7244
|
}
|
|
6684
7245
|
|
|
6685
7246
|
function detach(entry) {
|
|
@@ -6693,7 +7254,7 @@ function detach(entry) {
|
|
|
6693
7254
|
}
|
|
6694
7255
|
}
|
|
6695
7256
|
|
|
6696
|
-
async function exportZip(zipWriter, entry, totalSize, options) {
|
|
7257
|
+
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
6697
7258
|
const selectedEntry = entry;
|
|
6698
7259
|
const entryOffsets = new Map();
|
|
6699
7260
|
await process(zipWriter, entry);
|
|
@@ -6703,7 +7264,11 @@ async function exportZip(zipWriter, entry, totalSize, options) {
|
|
|
6703
7264
|
|
|
6704
7265
|
async function exportChild() {
|
|
6705
7266
|
if (options.bufferedWrite) {
|
|
6706
|
-
await Promise.allSettled(entry.children.map(processChild));
|
|
7267
|
+
const results = await Promise.allSettled(entry.children.map(processChild));
|
|
7268
|
+
const errorResult = results.find(result => result.status == "rejected");
|
|
7269
|
+
if (errorResult) {
|
|
7270
|
+
throw errorResult.reason;
|
|
7271
|
+
}
|
|
6707
7272
|
} else {
|
|
6708
7273
|
for (const child of entry.children) {
|
|
6709
7274
|
await processChild(child);
|
|
@@ -6758,7 +7323,7 @@ async function exportZip(zipWriter, entry, totalSize, options) {
|
|
|
6758
7323
|
});
|
|
6759
7324
|
}
|
|
6760
7325
|
}
|
|
6761
|
-
await zipWriter.add(name, child
|
|
7326
|
+
await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
|
|
6762
7327
|
directory: child.directory,
|
|
6763
7328
|
onprogress: async indexProgress => {
|
|
6764
7329
|
if (options.onprogress) {
|
|
@@ -6807,7 +7372,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
6807
7372
|
}
|
|
6808
7373
|
} catch (error) {
|
|
6809
7374
|
const message = error.message + (handle ? " (" + handle.name + ")" : "");
|
|
6810
|
-
throw new Error(message);
|
|
7375
|
+
throw new Error(message, { cause: error });
|
|
6811
7376
|
}
|
|
6812
7377
|
}
|
|
6813
7378
|
return addedEntries;
|
|
@@ -6867,9 +7432,21 @@ async function transformToFileSystemhandles(entry) {
|
|
|
6867
7432
|
|
|
6868
7433
|
function resetFS(fs) {
|
|
6869
7434
|
fs.entries = [];
|
|
7435
|
+
fs.entryIdCounter = 0;
|
|
6870
7436
|
fs.root = new ZipDirectoryEntry(fs);
|
|
6871
7437
|
}
|
|
6872
7438
|
|
|
7439
|
+
function registerEntries(fs, entry) {
|
|
7440
|
+
const pendingEntries = [entry];
|
|
7441
|
+
while (pendingEntries.length) {
|
|
7442
|
+
const pendingEntry = pendingEntries.pop();
|
|
7443
|
+
fs.entries[pendingEntry.id] = pendingEntry;
|
|
7444
|
+
for (const child of pendingEntry.children) {
|
|
7445
|
+
pendingEntries.push(child);
|
|
7446
|
+
}
|
|
7447
|
+
}
|
|
7448
|
+
}
|
|
7449
|
+
|
|
6873
7450
|
function addChild(parent, name, params, directory) {
|
|
6874
7451
|
if (parent.directory) {
|
|
6875
7452
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
@@ -8545,6 +9122,7 @@ exports.BlobReader = BlobReader;
|
|
|
8545
9122
|
exports.BlobWriter = BlobWriter;
|
|
8546
9123
|
exports.Data64URIReader = Data64URIReader;
|
|
8547
9124
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9125
|
+
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
8548
9126
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
8549
9127
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
8550
9128
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -8554,6 +9132,7 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
|
8554
9132
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
8555
9133
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
8556
9134
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
9135
|
+
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
8557
9136
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
8558
9137
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
8559
9138
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -8566,8 +9145,9 @@ exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
|
8566
9145
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
8567
9146
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
8568
9147
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9148
|
+
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
8569
9149
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
8570
|
-
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION;
|
|
9150
|
+
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
8571
9151
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
8572
9152
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
8573
9153
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|