@zip.js/zip.js 2.11.4 → 2.13.0

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.
Files changed (52) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +549 -139
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +559 -136
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +615 -260
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +628 -257
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +615 -260
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +630 -259
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +631 -260
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +561 -138
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +561 -138
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +562 -139
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +630 -259
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +631 -260
  27. package/index.d.cts +474 -59
  28. package/index.d.ts +474 -59
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker-web.js +72 -22
  31. package/lib/core/codec-worker.js +18 -5
  32. package/lib/core/configuration.js +20 -5
  33. package/lib/core/constants.js +2 -0
  34. package/lib/core/io.js +13 -5
  35. package/lib/core/options.js +16 -0
  36. package/lib/core/streams/codec-stream.js +6 -0
  37. package/lib/core/util/error.js +35 -0
  38. package/lib/core/util/warnings.js +42 -0
  39. package/lib/core/version.js +1 -1
  40. package/lib/core/web-worker-base.js +46 -9
  41. package/lib/core/web-worker-inline-native.js +1 -1
  42. package/lib/core/web-worker-inline-wasm.js +1 -1
  43. package/lib/core/zip-entry.js +49 -1
  44. package/lib/core/zip-fs.js +45 -133
  45. package/lib/core/zip-reader.js +115 -52
  46. package/lib/core/zip-writer.js +244 -57
  47. package/lib/zip-core-base.js +9 -3
  48. package/lib/zip-core-reader.js +2 -0
  49. package/lib/zip-core-writer.js +6 -1
  50. package/lib/zip-module-wasm-base.js +2 -2
  51. package/package.json +5 -3
  52. package/worker-message-property-names.js +1 -1
package/index.cjs CHANGED
@@ -128,6 +128,7 @@ const NUMBER_TYPE = "number";
128
128
  const BOOLEAN_TYPE = "boolean";
129
129
 
130
130
  const EMPTY_UINT8_ARRAY = new Uint8Array();
131
+ const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
131
132
 
132
133
  /*
133
134
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -172,6 +173,7 @@ const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
172
173
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
173
174
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
174
175
  const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
176
+ const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
175
177
  const OPTION_CHECK_SIGNATURE = "checkSignature";
176
178
  const OPTION_CHECK_CRC32 = "checkCrc32";
177
179
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
@@ -202,15 +204,18 @@ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
202
204
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
203
205
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
204
206
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
207
+ const OPTION_ENTRY = "entry";
205
208
  const TEXT_TYPE_FILENAME = "filename";
206
209
  const TEXT_TYPE_COMMENT = "comment";
207
210
  const STRICTNESS_STRICT = "strict";
208
211
  const STRICTNESS_BALANCED = "balanced";
209
212
  const STRICTNESS_TOLERANT = "tolerant";
213
+ const PASS_THROUGH_COMPRESSED = "compressed";
210
214
 
211
215
  const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
212
216
  const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
213
217
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
218
+ const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
214
219
  const ERR_ABORTED = "The operation was aborted";
215
220
  const ABORT_ERROR_NAME = "AbortError";
216
221
 
@@ -240,6 +245,13 @@ function checkPasswordOption(password, rawPassword) {
240
245
  }
241
246
  }
242
247
 
248
+ function checkPassThroughOption(passThrough) {
249
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
250
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
251
+ }
252
+ return passThrough;
253
+ }
254
+
243
255
  function checkInteger(value, maxValue, errorMessage) {
244
256
  if (!Number.isInteger(value) || value < 0 || value > maxValue) {
245
257
  throw new Error(errorMessage);
@@ -289,6 +301,8 @@ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
289
301
  const MINIMUM_CHUNK_SIZE = 64;
290
302
  const MINIMUM_PROPERTY_VALUE = 1;
291
303
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
304
+ const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
305
+ const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
292
306
  let maxWorkers = 2;
293
307
  try {
294
308
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -313,9 +327,9 @@ const DEFAULT_CONFIGURATION = {
313
327
  };
314
328
 
315
329
  const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
330
+ const PROPERTY_NAME_BASE_URI = "baseURI";
316
331
 
317
- const STRING_PROPERTY_NAMES = [
318
- "baseURI",
332
+ const URI_PROPERTY_NAMES = [
319
333
  "wasmURI",
320
334
  "workerURI"
321
335
  ];
@@ -339,7 +353,8 @@ const FUNCTION_PROPERTY_NAMES = [
339
353
  "DecompressionStreamFallback"
340
354
  ];
341
355
  const CONFIGURABLE_PROPERTY_NAMES = [
342
- ...STRING_PROPERTY_NAMES,
356
+ PROPERTY_NAME_BASE_URI,
357
+ ...URI_PROPERTY_NAMES,
343
358
  ...BOOLEAN_PROPERTY_NAMES,
344
359
  ...NUMBER_PROPERTY_NAMES,
345
360
  ...FUNCTION_PROPERTY_NAMES
@@ -383,6 +398,14 @@ function checkPropertyValue(propertyName, propertyValue) {
383
398
  }
384
399
  } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
385
400
  checkFunctionOption(propertyValue);
401
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
402
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
403
+ throw new Error(ERR_INVALID_BASE_URI);
404
+ }
405
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
406
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
407
+ throw new Error(ERR_INVALID_URI);
408
+ }
386
409
  }
387
410
  return propertyValue;
388
411
  }
@@ -416,7 +439,7 @@ function resetConfiguration() {
416
439
  Object.assign(config, DEFAULT_CONFIGURATION);
417
440
  }
418
441
 
419
- const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const n=[];let s=0;function r(){const e=new o(t);let r=0;for(;r<t;){const s=n[0],o=t-r;s.length<=o?(e.set(s,r),r+=s.length,n.shift()):(e.set(s.subarray(0,o),r),n[0]=s.subarray(o),r+=o)}return s-=t,e}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(e,o){for(n.push(e),s+=e.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(n,s))}})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o;try{const{options:c,config:i}=t;if(c.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(c.codecType.startsWith(Nt)?i.CompressionStream:i.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},u=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},a);o=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},a),n=new qt(c,i),Yt=new AbortController;const{signal:w}=Yt;await u.pipeThrough(n).pipeThrough(new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;tn({type:Ht,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=n?n.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
442
+ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let r='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:r,Error:s,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let r=0;if(e>=8&&t.buffer){const s=new u(t.buffer,t.byteOffset,e),o=e-8;for(;r<=o;r+=8){const t=n^s.getInt32(r,!0),e=s.getInt32(r+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;r<e;r++)n=n>>>8^I[255&(n^t[r])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function V(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function W(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const _={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],r=_.l(e);return 32===r?t.concat(n):_.h(n,r,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+_.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,r.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=_.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>r.round(t/1099511627776)||32,h(t,n,e,r){for(void 0===r&&(r=[]);n>=32;n-=32)r.push(e),e=0;if(0===n)return r.concat(t);for(let s=0;s<t.length;s++)r.push(e|t[s]>>>n),e=t[s]<<32-n;const s=t.length?t[t.length-1]:0,o=_.l(s);return r.push(_.S(n+o&31,n+o>32?e:r.pop(),1)),r}},T={bytes:{v(t){const n=_.bitLength(t)/8,e=new o(n);let r;for(let s=0;s<n;s++)3&s||(r=t[s/4]),e[s]=r>>>24,r<<=8;return e},C(t){const n=[];let e,r=0;for(e=0;e<t.length;e++)r=r<<8|t[e],3&~e||(n.push(r),r=0);return 3&e&&n.push(_.S(8*(3&e),r)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=T.D.C(t));const e=n.P=_.concat(n.P,t),r=n.B,o=n.B=r+_.bitLength(t);if(o>9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+r-(n.blockSize+r&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=_.concat(n,[_.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(r.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,r){return t<=19?n&e|~n&r:t<=39?n^e^r:t<=59?n&e|n&r|e&r:t<=79?n^e^r:void 0}V(t,n){return n<<t|n>>>32-t}F(n){const e=this,s=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=s[0],i=s[1],a=s[2],f=s[3],u=s[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.V(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.V(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[r.floor(t/20)]|0;u=f,f=a,a=e.V(30,i),i=c,c=n}s[0]=s[0]+c|0,s[1]=s[1]+i|0,s[2]=s[2]+a|0,s[3]=s[3]+f|0,s[4]=s[4]+u|0}},j={importKey:t=>new j.W(T.bytes.C(t)),_(t,n,e,r){if(e=e||1e4,r<0||e<0)throw new s("invalid params to pbkdf2");const o=1+(r>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=_;for(n=T.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,r/8)},W:class{constructor(t){const n=this,e=n.T=K,r=[[],[]];n.K=[new e,new e];const s=n.K[0].blockSize/32;t.length>s&&(t=(new e).update(t).R());for(let n=0;n<s;n++)r[0][n]=909522486^t[n],r[1][n]=1549556828^t[n];n.K[0].update(r[0]),n.K[1].update(r[1]),n.j=new e(n.K[0])}reset(){const t=this;t.j=new t.T(t.K[0]),t.L=!1}update(t){this.L=!0,this.j.update(t)}digest(){const t=this,n=t.j.R(),e=new t.T(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.L)throw new s("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},E=typeof h!=b&&typeof h.getRandomValues==k,L="Invalid password",O="zipjs-abort-check-password";function H(t){if(E)return h.getRandomValues(t);throw new s("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,rt=T.bytes,st=class{constructor(t){const n=this;n.O=[[[],[],[],[],[]],[[],[],[],[],[]]],n.O[0][0][0]||n.H();const e=n.O[0][4],r=n.O[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new s("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:r[0][e[n>>>24]]^r[1][e[n>>16&255]]^r[2][e[n>>8&255]]^r[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.O[0],n=this.O[1],e=t[4],r=n[4],s=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(s[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,r[o]=u,f=s[a=s[i=s[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*s[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new s("invalid aes block size");const e=this.A[n],r=e.length/4-2,o=[0,0,0,0],c=this.O[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<r;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,r=255&t;255===n?(n=0,255===e?(e=0,255===r?r=0:++r):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=r}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let r;if(!(r=n.length))return[];const s=_.bitLength(n);for(let s=0;s<r;s+=4){this.$(e);const r=t.encrypt(e);n[s]^=r[0],n[s+1]^=r[1],n[s+2]^=r[2],n[s+3]^=r[3]}return _.m(n,s)}},ct=j.W;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:r,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,r){const o=await ht(t,n,e,dt(r,0,X[n])),c=dt(r,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new s(L)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),r?n.error(new s(O)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:r,ready:o}=this;if(e&&n){await o;const i=dt(r,0,r.length-Z),a=dt(r,r.length-Z);let f=z;if(i.length){const t=mt(rt,i);e.update(t);const r=n.update(t);f=yt(rt,r)}const u=dt(yt(rt,e.digest()),0,Z);let l=r.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new s("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:r,strength:s,nt:c,ready:i}=e;let a=z;r?(a=await async function(t,n,e){const r=H(new o(X[n]));return V(r,await ht(t,n,e,r))}(e,s,r),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:r,ready:s}=this;if(e&&n){await s;let o=z;if(r.length){const t=n.update(mt(rt,r));e.update(t),o=yt(rt,t)}const c=yt(rt,e.digest()).slice(0,Z);t.enqueue(V(o,c))}}})}}function lt(t,e,r,s){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,r),strength:s-1,ot:z})}function wt(t,n,e,r,s,c){const{et:i,st:a,ot:f}=t;f.length&&(n=V(f,n));const u=n.length-s;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,r+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(rt,dt(n,l,l+N));c&&a.update(t);const s=i.update(t);c||a.update(s),e.set(yt(rt,s),l+r)}return t.ot=dt(n,l),e}async function ht(e,r,s,c){e.password=null;const i=await async function(t,n,e,r,s){if(!it)return j.importKey(n);try{return await nt.importKey("raw",n,e,!1,s)}catch{return it=!1,j.importKey(n)}}(0,s,G,0,Q),a=await async function(t,n,e){if(!at)return j._(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,j._(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[r]+2)),f=new o(a),u=mt(rt,dt(f,0,Y[r])),l=mt(rt,dt(f,Y[r],2*Y[r])),w=dt(f,2*Y[r]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new st(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:r}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new s(L);t=t.subarray(12)}r?n.error(new s(O)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let r,s;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,r=new o(t.length+n.length),r.set(kt(e,n),0),s=12}else r=new o(t.length),s=0;r.set(kt(e,t),s),n.enqueue(r)}})}}function vt(t,e,r,s){n.assign(t,{password:e,rawPassword:r,passwordVerification:s}),function(t,e,r){const s=[305419896,591751049,878082192];if(n.assign(t,{keys:s,it:new R(s[0]),ft:new R(s[2])}),r)for(let n=0;n<r.length;n++)zt(t,r[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,r)}function bt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,e[r]);return e}function kt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,n[r]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const s=~t.it.get();e=At(r.imul(At(e+It(s)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[s,e,o]}function Ct(t){const n=2|t.keys[2];return It(r.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:r}=await n.read();r?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:r}){super({});const{compressed:s,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&s&&!l&&!v&&(!o||i)&&Boolean(c&&r);if(o&&!i||!a||b||(y=new U,g=Et(g,y)),s)if(v)g=Lt(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Vt,g=Lt(g,new r(Ft)),g=Et(g,S);else try{g=jt(g,c,{level:f,chunkSize:n},r,e)}catch(t){let n;try{n=new r(Ft)}catch{throw t}g=Lt(g,n),g=Et(g,new Vt)}o&&(i?g=Et(g,new gt(t)):(m=new ut(t),g=Et(g,m))),Tt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,s){if(n){const e=r.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=V(e,t));const c=o-8,i=r.min(c,e.length);s.enqueue(V(e.subarray(0,i),t.subarray(0,c-i))),e=V(e.subarray(i),t.subarray(c-i))},flush(){const n=W(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class Wt extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:r}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Et(C,new St(t)):(z=new ft(t),C=Et(C,z))),w){const t=m&&Pt(m);if(t)C=Lt(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:n,deflate64:p},r,e)}catch(t){if(p||b===v)throw t;let n;try{n=new r(Ft)}catch{throw t}C=function(t,n,e){const r=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),s=W(n);s.setUint32(0,r.get(),!0),s.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){r.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Et(t,h),Et(t=Lt(t,n),p);function y(){m(),c=setTimeout(()=>a(new s(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new s("Invalid compressed data");throw n.cause=t,n}const{value:r,done:o}=e;o?t.close():t.enqueue(r)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Et(C,k)),Tt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new s("Invalid CRC32")}})}}const _t=new f;function Tt(t,e,r){e=Et(e,new d({flush:r})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new s("Compression method not supported");return new t(n,e)}function jt(t,n,e,r,s){const o=n&&r?r:s||r,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!s||o==s)throw t;i=new s(c,e)}return Lt(t,i)}function Et(t,n){return xt(t).pipeThrough(n)}function Lt(t,n){const e=n.writable.getWriter(),r=t.getReader();return async function(){try{for(;;){await e.ready;const t=await r.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(r,t)}}(),n.readable}const Ot="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const r=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=Wt),r.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(r,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),r.outputSize+=n.length,t.outputSize!==v&&r.outputSize>t.outputSize))throw new s(Bt)},flush(){const{crc32:t}=a;n.assign(r,{crc32:t,inputSize:i})}});n.defineProperty(r,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const r=[];let s=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const s=r[0],o=t-e;s.length<=o?(n.set(s,e),e+=s.length,r.shift()):(n.set(s.subarray(0,o),e),r[0]=s.subarray(o),e+=o)}return s-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(r.push(n),s+=n.length;s>t;)c+=t,e.enqueue(i())},flush(t){s&&(c+=s,t.enqueue(function(t,n){const e=new o(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r,s)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}function Qt(t){return Boolean(t)&&"object"==typeof t}const Xt=new f,Yt=new f,Zt=function(){try{return structuredClone(new s)instanceof s}catch{return!1}}();let $t,tn=0;async function nn(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:r}=n;if(typeof e!=k&&typeof r!=k)throw new s("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:r})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){if(Qt(t))try{t.codecImportFailed=!0}catch{}throw t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=_t.get(t);e||(e=new f,_t.set(t,e));let r=e.get(n);if(r===v){try{new t(n),r=!0}catch{r=!1}e.set(n,r)}return r}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Xt.set(tn,t));en({type:"pull",messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER;const{value:r,done:s}=await n;t.enqueue(r),s&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const r=new l(t=>n=t);Yt.set(tn,n),en({type:Ot,value:t,messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER,await r}},u),n=new qt(i,a),o=new Gt(function(t){return s="string"==typeof(n=s=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(s)&&s>=1?r.max(s,64):65536;var n,s}(a)),$t=new AbortController;const{signal:h}=$t;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;en({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){const n=o?o.outputSize:0;if(Qt(t))try{t.outputSize=n}catch{}if(c&&!c.locked)try{await c.getWriter().close()}catch{}rn(t,n)}}function en(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function rn(t,n){const{message:e,stack:r,code:o,name:c,outputSize:i,cause:a,codecImportFailed:f}=function(t=new s("Unknown error")){return Qt(t)?t:new s(String(t))}(t),u={message:e,stack:r,code:o,name:c,outputSize:i===v?n:i};if(a&&(u.cause={name:a.name,message:a.message}),f&&(u.codecImportFailed=!0),Zt)try{return void p({error:u,errorValue:{value:t}})}catch{}p({error:u})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:r,done:s}=t;try{if("start"==n&&nn(t),n==Ot){const t=Xt.get(e);Xt.delete(e),t({value:r||new o,done:s})}if("ack"==n){const t=Yt.get(e);Yt.delete(e),t()}n==Ht&&$t.abort()}catch(t){rn(t)}}),p({type:"ready"});const sn="deflate",on="deflate-raw",cn="deflate64-raw",an="gzip";let fn,un,ln,wn,hn;function pn(t,n,e={}){if(!fn){const t=new s("WASM module not loaded");throw t.cause=hn,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=un(i),this.in=un(a),this.inBufferSize=a,!this.ut||!this.in)throw new s("allocation failed");if(this.lt=new o(i),t?(this.wt=fn.deflate_process,this.ht=fn.deflate_last_consumed,this.yt=fn.deflate_end,this.St=fn.deflate_new(),e=n===an?fn.deflate_init_gzip(this.St,c):n===on?fn.deflate_init_raw(this.St,c):fn.deflate_init(this.St,c)):n===cn?(this.wt=fn.inflate9_process,this.ht=fn.inflate9_last_consumed,this.yt=fn.inflate9_end,this.St=fn.inflate9_new(),e=fn.inflate9_init_raw(this.St)):(this.wt=fn.inflate_process,this.ht=fn.inflate_last_consumed,this.yt=fn.inflate_end,this.St=fn.inflate_new(),e=n===on?fn.inflate_init_raw(this.St):n===an?fn.inflate_init_gzip(this.St):fn.inflate_init(this.St)),0!==e)throw new s("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(wn.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=r.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&ln&&(ln(this.in),this.in=0),this.in=un(t),this.inBufferSize=t,!this.in))throw new s("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new s("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(wn.buffer),e=this.wt,r=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,r,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new s("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(r,r+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new s("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&ln&&ln(t.in),t.in=0,t.ut&&ln&&ln(t.ut),t.ut=0,n}}class dn{constructor(t=sn,n){return pn(!0,t,n)}}class yn{constructor(t=sn,n){return pn(!1,t,n)}}dn.gt=!0,yn.gt=!0,dn.vt=[sn,on,an],yn.vt=[sn,on,an,cn];let mn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,r=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),r&&(t.DecompressionStreamFallback=r)}}({CompressionStreamFallback:dn,DecompressionStreamFallback:yn,init:t=>async function(t,{baseURI:n}){if(!mn)try{await async function(t,n){let e,r;try{try{r=new URL(t,n)}catch{}const s=await fetch(r);e=await s.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),r=e.length,s=new o(r);for(let t=0;t<r;++t)s[t]=e.charCodeAt(t);return s.buffer}(t)}!function(t){if(fn=t,({malloc:un,free:ln,memory:wn}=fn),"function"!=typeof un||"function"!=typeof ln||!wn)throw fn=un=ln=wn=null,new s("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),mn=!0}catch(t){throw function(t){hn=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const r=t.length;let s=0;for(;s+2<r;s+=3){const r=t[s]<<16|t[s+1]<<8|t[s+2];n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+e$1[63&r];}const o=r-s;if(1===o){const r=t[s]<<16;n+=e$1[r>>18&63]+e$1[r>>12&63]+"==";}else if(2===o){const r=t[s]<<16|t[s+1]<<8;n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+"=";}return n}(r)}});
420
443
 
421
444
  /*
422
445
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -462,6 +485,39 @@ function getDataView(array) {
462
485
  return new DataView(array.buffer, array.byteOffset, array.byteLength);
463
486
  }
464
487
 
488
+ /*
489
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
490
+
491
+ Redistribution and use in source and binary forms, with or without
492
+ modification, are permitted provided that the following conditions are met:
493
+
494
+ 1. Redistributions of source code must retain the above copyright notice,
495
+ this list of conditions and the following disclaimer.
496
+
497
+ 2. Redistributions in binary form must reproduce the above copyright
498
+ notice, this list of conditions and the following disclaimer in
499
+ the documentation and/or other materials provided with the distribution.
500
+
501
+ 3. The names of the authors may not be used to endorse or promote products
502
+ derived from this software without specific prior written permission.
503
+
504
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
505
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
506
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
507
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
508
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
509
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
510
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
511
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
512
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
513
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
514
+ */
515
+
516
+
517
+ function isErrorObject(error) {
518
+ return Boolean(error) && typeof error == "object";
519
+ }
520
+
465
521
  /*
466
522
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
467
523
 
@@ -2601,6 +2657,7 @@ class ChunkStream extends TransformStream {
2601
2657
  constructor(chunkSize) {
2602
2658
  const pendingChunks = [];
2603
2659
  let pendingLength = 0;
2660
+ let outputSize = 0;
2604
2661
  if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2605
2662
  chunkSize = DEFAULT_CHUNK_SIZE;
2606
2663
  }
@@ -2609,15 +2666,20 @@ class ChunkStream extends TransformStream {
2609
2666
  pendingChunks.push(chunk);
2610
2667
  pendingLength += chunk.length;
2611
2668
  while (pendingLength > chunkSize) {
2669
+ outputSize += chunkSize;
2612
2670
  controller.enqueue(shiftChunk());
2613
2671
  }
2614
2672
  },
2615
2673
  flush(controller) {
2616
2674
  if (pendingLength) {
2675
+ outputSize += pendingLength;
2617
2676
  controller.enqueue(concatChunks(pendingChunks, pendingLength));
2618
2677
  }
2619
2678
  }
2620
2679
  });
2680
+ Object.defineProperty(this, "outputSize", {
2681
+ get: () => outputSize
2682
+ });
2621
2683
 
2622
2684
  function shiftChunk() {
2623
2685
  const result = new Uint8Array(chunkSize);
@@ -2727,7 +2789,9 @@ function disableWebWorker(workerData) {
2727
2789
 
2728
2790
  class CodecWorker {
2729
2791
 
2730
- constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
2792
+ constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
2793
+ const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
2794
+ let { createWorker } = workerOptions;
2731
2795
  const { signal } = streamOptions;
2732
2796
  if (createWorkerFailed) {
2733
2797
  createWorker = UNDEFINED_VALUE;
@@ -2740,6 +2804,7 @@ class CodecWorker {
2740
2804
  .pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
2741
2805
  writable,
2742
2806
  options: Object.assign({}, options),
2807
+ workerOptions,
2743
2808
  workerURI,
2744
2809
  createWorker,
2745
2810
  transferStreams,
@@ -2821,8 +2886,8 @@ function createWorkerInterface(workerData, config) {
2821
2886
  };
2822
2887
  }
2823
2888
 
2824
- async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2825
- let codecStream;
2889
+ async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2890
+ let codecStream, chunkStream;
2826
2891
  try {
2827
2892
  if (options.compressed && !options.format) {
2828
2893
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
@@ -2845,9 +2910,10 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
2845
2910
  }
2846
2911
  }
2847
2912
  codecStream = new CodecStream(options, config);
2913
+ chunkStream = new ChunkStream(getChunkSize(config));
2848
2914
  await readable
2849
2915
  .pipeThrough(codecStream)
2850
- .pipeThrough(new ChunkStream(getChunkSize(config)))
2916
+ .pipeThrough(chunkStream)
2851
2917
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2852
2918
  const {
2853
2919
  crc32,
@@ -2861,7 +2927,15 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
2861
2927
  };
2862
2928
  } catch (error) {
2863
2929
  if (codecStream) {
2864
- error.outputSize = codecStream.outputSize;
2930
+ const outputSize = chunkStream ? chunkStream.outputSize : 0;
2931
+ workerOptions.outputSize = outputSize;
2932
+ if (isErrorObject(error)) {
2933
+ try {
2934
+ error.outputSize = outputSize;
2935
+ } catch {
2936
+ // ignored
2937
+ }
2938
+ }
2865
2939
  }
2866
2940
  throw error;
2867
2941
  } finally {
@@ -2970,11 +3044,23 @@ async function runWebWorker(workerData, config) {
2970
3044
  let resolveResult, rejectResult;
2971
3045
  const result = new Promise((resolve, reject) => {
2972
3046
  resolveResult = resolve;
2973
- rejectResult = reject;
3047
+ rejectResult = error => {
3048
+ const { outputSize, workerOptions } = workerData;
3049
+ workerOptions.outputSize = outputSize;
3050
+ if (isErrorObject(error) && error.outputSize === UNDEFINED_VALUE) {
3051
+ try {
3052
+ error.outputSize = outputSize;
3053
+ } catch {
3054
+ // ignored
3055
+ }
3056
+ }
3057
+ reject(error);
3058
+ };
2974
3059
  });
2975
3060
  Object.assign(workerData, {
2976
3061
  reader: null,
2977
3062
  writer: null,
3063
+ outputSize: 0,
2978
3064
  resolveResult,
2979
3065
  rejectResult,
2980
3066
  result
@@ -3235,21 +3321,15 @@ function sendMessage(message, { worker, writer, transferStreams, workerAlive })
3235
3321
  }
3236
3322
 
3237
3323
  async function onMessage({ data }, workerData) {
3238
- const { type, value, messageId, result, error } = data;
3324
+ const { type, value, messageId, result, error, errorValue } = data;
3239
3325
  const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
3240
3326
  const stale = () => workerData.generation != generation;
3241
3327
  try {
3242
3328
  if (error) {
3243
- const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
3244
- const responseError = new Error(message);
3245
- Object.assign(responseError, { stack, code, name, outputSize });
3246
- if (cause) {
3247
- responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3248
- }
3249
- if (codecImportFailed) {
3250
- responseError.codecImportFailed = true;
3329
+ if (error.outputSize !== UNDEFINED_VALUE) {
3330
+ workerData.outputSize = error.outputSize;
3251
3331
  }
3252
- close(responseError);
3332
+ fail(getResponseError(error, errorValue));
3253
3333
  } else {
3254
3334
  if (type == MESSAGE_PULL) {
3255
3335
  const { value, done } = await reader.read();
@@ -3258,39 +3338,82 @@ async function onMessage({ data }, workerData) {
3258
3338
  }
3259
3339
  }
3260
3340
  if (type == MESSAGE_DATA) {
3341
+ const chunk = new Uint8Array(value);
3261
3342
  await writer.ready;
3262
- await writer.write(new Uint8Array(value));
3343
+ await writer.write(chunk);
3344
+ workerData.outputSize += chunk.length;
3263
3345
  if (!stale()) {
3264
3346
  sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
3265
3347
  }
3266
3348
  }
3267
3349
  if (type == MESSAGE_CLOSE) {
3268
- close(null, result);
3350
+ succeed(result);
3269
3351
  }
3270
3352
  }
3271
3353
  } catch (error) {
3272
3354
  if (!stale()) {
3273
3355
  terminateWorker$1(workerData);
3274
- close(error);
3356
+ fail(error);
3275
3357
  }
3276
3358
  }
3277
3359
 
3278
- function close(error, result) {
3279
- if (stale()) {
3280
- return;
3281
- }
3282
- if (error) {
3360
+ function fail(error) {
3361
+ if (!stale()) {
3283
3362
  rejectResult(error);
3284
- } else {
3363
+ releaseWriter();
3364
+ if (!(isErrorObject(error) && error.codecImportFailed)) {
3365
+ onTaskFinished();
3366
+ }
3367
+ }
3368
+ }
3369
+
3370
+ function succeed(result) {
3371
+ if (!stale()) {
3285
3372
  resolveResult(result);
3373
+ releaseWriter();
3374
+ onTaskFinished();
3286
3375
  }
3376
+ }
3377
+
3378
+ function releaseWriter() {
3287
3379
  if (writer) {
3288
3380
  writer.releaseLock();
3289
3381
  }
3290
- if (!(error && error.codecImportFailed)) {
3291
- onTaskFinished();
3382
+ }
3383
+ }
3384
+
3385
+ function getResponseError(errorData, errorValue) {
3386
+ const { message, stack, code, name, outputSize, cause, codecImportFailed } = errorData;
3387
+ let responseError;
3388
+ if (errorValue) {
3389
+ responseError = errorValue.value;
3390
+ } else {
3391
+ responseError = Object.assign(new Error(message), { stack, code, name });
3392
+ if (cause) {
3393
+ responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3292
3394
  }
3293
3395
  }
3396
+ if (isErrorObject(responseError)) {
3397
+ try {
3398
+ if (outputSize !== UNDEFINED_VALUE) {
3399
+ responseError.outputSize = outputSize;
3400
+ }
3401
+ if (codecImportFailed) {
3402
+ responseError.codecImportFailed = true;
3403
+ }
3404
+ if (errorValue) {
3405
+ if (responseError.name !== name) {
3406
+ responseError.name = name;
3407
+ }
3408
+ if (responseError.code !== code) {
3409
+ responseError.code = code;
3410
+ }
3411
+ }
3412
+ } catch {
3413
+ // ignored
3414
+ }
3415
+ }
3416
+ return responseError;
3294
3417
  }
3295
3418
 
3296
3419
  /*
@@ -3567,10 +3690,13 @@ function decode(value, encoding, ignoreBOM) {
3567
3690
 
3568
3691
 
3569
3692
  const ERR_HTTP_STATUS = "HTTP error ";
3693
+ const MIN_SUCCESS_HTTP_STATUS = 200;
3694
+ const MAX_SUCCESS_HTTP_STATUS = 299;
3570
3695
  const ERR_HTTP_RANGE = "HTTP Range not supported";
3571
3696
  const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
3572
3697
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
3573
3698
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
3699
+ const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
3574
3700
 
3575
3701
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
3576
3702
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
@@ -3762,6 +3888,7 @@ class BlobReader extends Reader {
3762
3888
  const reader = this;
3763
3889
  const { sourceBlob, size } = reader;
3764
3890
  const { offset = 0, size: readSize = size - offset } = options || {};
3891
+ // deno-lint-ignore valid-typeof
3765
3892
  if (typeof sourceBlob.stream == FUNCTION_TYPE) {
3766
3893
  if (!offset && readSize >= size) {
3767
3894
  return toCompatibleReadable(sourceBlob.stream());
@@ -4168,7 +4295,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
4168
4295
 
4169
4296
  async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
4170
4297
  const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
4171
- if (response.status < 400) {
4298
+ if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
4172
4299
  return response;
4173
4300
  } else {
4174
4301
  throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
@@ -4179,7 +4306,7 @@ function sendXMLHttpRequest(method, { url }, headers) {
4179
4306
  return new Promise((resolve, reject) => {
4180
4307
  const request = new XMLHttpRequest();
4181
4308
  request.addEventListener("load", () => {
4182
- if (request.status < 400) {
4309
+ if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
4183
4310
  const headers = [];
4184
4311
  request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
4185
4312
  const splitHeader = header.trim().split(/\s*:\s*/);
@@ -4483,8 +4610,10 @@ class GenericWriter {
4483
4610
  writable: toCompatibleWritable(writer)
4484
4611
  };
4485
4612
  }
4486
- if (writer.size === UNDEFINED_VALUE) {
4487
- writer.size = 0;
4613
+ try {
4614
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
4615
+ } catch {
4616
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
4488
4617
  }
4489
4618
  return writer;
4490
4619
  }
@@ -4532,6 +4661,45 @@ function createReadable(reader, options) {
4532
4661
  }
4533
4662
  }
4534
4663
 
4664
+ /*
4665
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
4666
+
4667
+ Redistribution and use in source and binary forms, with or without
4668
+ modification, are permitted provided that the following conditions are met:
4669
+
4670
+ 1. Redistributions of source code must retain the above copyright notice,
4671
+ this list of conditions and the following disclaimer.
4672
+
4673
+ 2. Redistributions in binary form must reproduce the above copyright
4674
+ notice, this list of conditions and the following disclaimer in
4675
+ the documentation and/or other materials provided with the distribution.
4676
+
4677
+ 3. The names of the authors may not be used to endorse or promote products
4678
+ derived from this software without specific prior written permission.
4679
+
4680
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4681
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4682
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4683
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4684
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4685
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4686
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4687
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4688
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4689
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4690
+ */
4691
+
4692
+
4693
+ function addWarning(warnings, reason, filename) {
4694
+ if (!warnings.some(warning => warning.reason == reason)) {
4695
+ const warning = { reason };
4696
+ if (filename !== UNDEFINED_VALUE) {
4697
+ warning.filename = filename;
4698
+ }
4699
+ warnings.push(warning);
4700
+ }
4701
+ }
4702
+
4535
4703
  /*
4536
4704
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4537
4705
 
@@ -4560,6 +4728,7 @@ function createReadable(reader, options) {
4560
4728
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4561
4729
  */
4562
4730
 
4731
+
4563
4732
  const PROPERTY_NAME_FILENAME = "filename";
4564
4733
  const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
4565
4734
  const PROPERTY_NAME_COMMENT = "comment";
@@ -4684,6 +4853,38 @@ class Entry {
4684
4853
 
4685
4854
  }
4686
4855
 
4856
+ const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
4857
+ EXTRAFIELD_TYPE_ZIP64,
4858
+ EXTRAFIELD_TYPE_AES,
4859
+ EXTRAFIELD_TYPE_NTFS,
4860
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
4861
+ EXTRAFIELD_TYPE_UNICODE_PATH,
4862
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
4863
+ EXTRAFIELD_TYPE_USDZ,
4864
+ EXTRAFIELD_TYPE_INFOZIP,
4865
+ EXTRAFIELD_TYPE_UNIX,
4866
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
4867
+ EXTRAFIELD_TYPE_PKWARE_UNIX
4868
+ ]);
4869
+
4870
+ function getUserExtraField(extraField) {
4871
+ if (extraField) {
4872
+ const userExtraField = new Map();
4873
+ extraField.forEach((field, type) => {
4874
+ if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
4875
+ userExtraField.set(type, field.data);
4876
+ }
4877
+ });
4878
+ if (userExtraField.size) {
4879
+ return userExtraField;
4880
+ }
4881
+ }
4882
+ }
4883
+
4884
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
4885
+ return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4886
+ }
4887
+
4687
4888
  /*
4688
4889
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4689
4890
 
@@ -4743,6 +4944,8 @@ const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4743
4944
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4744
4945
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4745
4946
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4947
+ const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
4948
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
4746
4949
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4747
4950
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4748
4951
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
@@ -4813,7 +5016,7 @@ class ZipReader {
4813
5016
  }
4814
5017
  }
4815
5018
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
4816
- throwAmbiguousArchive("multiple end of central directory records");
5019
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
4817
5020
  }
4818
5021
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4819
5022
  let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
@@ -5111,7 +5314,8 @@ class ZipReader {
5111
5314
  const writer = new TransformStream();
5112
5315
  const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
5113
5316
  arrayBufferPromise.catch(() => { });
5114
- await fileEntry.getData(writer, entry, zipReader.readRanges, options);
5317
+ await fileEntry.getData(writer, entry, zipReader.readRanges,
5318
+ Object.assign({}, options, { preventClose: false }));
5115
5319
  return arrayBufferPromise;
5116
5320
  };
5117
5321
  offset = endOffset;
@@ -5192,49 +5396,101 @@ class ZipReader {
5192
5396
  await reader.readable.cancel();
5193
5397
  }
5194
5398
  }
5399
+
5400
+ [SYMBOL_ASYNC_DISPOSE]() {
5401
+ return this.close();
5402
+ }
5195
5403
  }
5196
5404
 
5197
5405
  class ZipReaderStream {
5198
5406
 
5199
5407
  constructor(options = {}) {
5200
- const { readable, writable } = new TransformStream();
5201
- const gen = new ZipReader(readable, options).getEntriesGenerator();
5408
+ let sourceController;
5409
+ const { readable, writable } = new TransformStream({
5410
+ start(controller) {
5411
+ sourceController = controller;
5412
+ }
5413
+ });
5414
+ const zipReader = new ZipReader(readable, options);
5415
+ const gen = zipReader.getEntriesGenerator();
5416
+ const pendingEntries = new Set();
5202
5417
  this.readable = new ReadableStream({
5203
5418
  async pull(controller) {
5204
5419
  const { done, value } = await gen.next();
5205
5420
  if (done)
5206
5421
  return controller.close();
5207
- const entryReadable = (function () {
5208
- const { readable, writable } = new TransformStream();
5209
- if (value.getData) {
5210
- getData();
5211
- return readable;
5212
- }
5213
-
5214
- async function getData() {
5215
- try {
5216
- await value.getData(writable);
5217
- } catch (error) {
5218
- try {
5219
- await writable.abort(error);
5220
- } catch {
5221
- // ignored
5222
- }
5223
- }
5224
- }
5225
- })();
5422
+ const entryStream = createEntryStream(value, pendingEntries);
5226
5423
  const chunk = {
5227
5424
  ...value,
5228
- readable: entryReadable
5425
+ readable: entryStream.readable
5229
5426
  };
5230
5427
  delete chunk.getData;
5428
+ Object.defineProperties(chunk, {
5429
+ localDirectory: {
5430
+ get: () => value.localDirectory,
5431
+ enumerable: true
5432
+ },
5433
+ warnings: {
5434
+ get: () => value.warnings,
5435
+ enumerable: true
5436
+ }
5437
+ });
5231
5438
  controller.enqueue(chunk);
5439
+ },
5440
+ async cancel(reason) {
5441
+ const entryStreams = Array.from(pendingEntries);
5442
+ pendingEntries.clear();
5443
+ sourceController.error(reason);
5444
+ await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
5445
+ await Promise.allSettled([gen.return(), zipReader.close()]);
5232
5446
  }
5233
5447
  });
5234
5448
  this.writable = writable;
5235
5449
  }
5236
5450
  }
5237
5451
 
5452
+ function createEntryStream(entry, pendingEntries) {
5453
+ const { readable, writable } = new TransformStream();
5454
+ let dataReader;
5455
+ const entryStream = {
5456
+ cancel: async reason => {
5457
+ pendingEntries.delete(entryStream);
5458
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
5459
+ }
5460
+ };
5461
+ entryStream.readable = new ReadableStream({
5462
+ async pull(controller) {
5463
+ if (!dataReader) {
5464
+ dataReader = readable.getReader();
5465
+ pendingEntries.add(entryStream);
5466
+ getData();
5467
+ }
5468
+ const { done, value } = await dataReader.read();
5469
+ if (done) {
5470
+ controller.close();
5471
+ } else {
5472
+ controller.enqueue(value);
5473
+ }
5474
+ },
5475
+ cancel: reason => entryStream.cancel(reason)
5476
+ }, { highWaterMark: 0 });
5477
+ return entryStream;
5478
+
5479
+ async function getData() {
5480
+ try {
5481
+ await entry.getData(writable, { preventClose: false });
5482
+ } catch (error) {
5483
+ try {
5484
+ await writable.abort(error);
5485
+ } catch {
5486
+ // ignored
5487
+ }
5488
+ } finally {
5489
+ pendingEntries.delete(entryStream);
5490
+ }
5491
+ }
5492
+ }
5493
+
5238
5494
  async function isZipFile(reader, options = {}) {
5239
5495
  reader = new GenericReader(reader);
5240
5496
  await initStream(reader);
@@ -5294,7 +5550,9 @@ let ZipEntry$1 = class ZipEntry {
5294
5550
  const dataView = getDataView(dataArray);
5295
5551
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5296
5552
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5297
- const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5553
+ const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
5554
+ const passThroughCompression = Boolean(passThrough);
5555
+ const passThroughEncryption = passThrough === true;
5298
5556
  checkPasswordOption(password, rawPassword);
5299
5557
  password = password && password.length && password;
5300
5558
  rawPassword = rawPassword && rawPassword.length && rawPassword;
@@ -5315,7 +5573,9 @@ let ZipEntry$1 = class ZipEntry {
5315
5573
  const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
5316
5574
  const entryStrictness = getStrictness(options, zipEntry.options);
5317
5575
  const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
5318
- const checkLocalFilename = getCheckLocalFilename(checkLocalDirectoryOption, entryStrictness);
5576
+ const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
5577
+ const checkLocalFilename = getCheckLocalFilename(
5578
+ checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
5319
5579
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
5320
5580
  if (checkLocalFilename && (filenameLength || extraFieldLength)) {
5321
5581
  const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
@@ -5346,16 +5606,17 @@ let ZipEntry$1 = class ZipEntry {
5346
5606
  if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
5347
5607
  fileEntry.gid = gid;
5348
5608
  }
5349
- const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
5609
+ const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5610
+ const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
5350
5611
  const zipCrypto = encrypted && !extraFieldAES;
5351
- if (!passThrough) {
5612
+ if (!passThroughEncryption) {
5352
5613
  fileEntry.zipCrypto = zipCrypto;
5353
5614
  }
5354
5615
  if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
5355
5616
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
5356
5617
  }
5357
- const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5358
- if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThrough) {
5618
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5619
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
5359
5620
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5360
5621
  }
5361
5622
  if (encrypted) {
@@ -5372,15 +5633,16 @@ let ZipEntry$1 = class ZipEntry {
5372
5633
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5373
5634
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5374
5635
  throwIfAborted(signal);
5375
- const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5376
5636
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5377
5637
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
5378
5638
  if (checkOverlappingEntryOnly) {
5379
5639
  checkOverlappingEntry = true;
5380
5640
  }
5381
5641
  const { onstart, onprogress, onend } = options;
5382
- const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5383
- const outputSize = passThrough ? compressedSize : uncompressedSize;
5642
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
5643
+ const outputSize = passThroughCompression ?
5644
+ compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
5645
+ uncompressedSize;
5384
5646
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5385
5647
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5386
5648
  if (deflate64) {
@@ -5389,7 +5651,7 @@ let ZipEntry$1 = class ZipEntry {
5389
5651
  const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
5390
5652
  const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
5391
5653
  getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
5392
- checkCrc32Option) && !passThrough &&
5654
+ checkCrc32Option) && !passThroughCompression &&
5393
5655
  (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
5394
5656
  const workerOptions = {
5395
5657
  options: {
@@ -5433,7 +5695,7 @@ let ZipEntry$1 = class ZipEntry {
5433
5695
  readRanges
5434
5696
  });
5435
5697
  }
5436
- let writable, abortError;
5698
+ let writable, abortError, aborted;
5437
5699
  try {
5438
5700
  if (!checkOverlappingEntryOnly) {
5439
5701
  if (checkPasswordOnly) {
@@ -5443,24 +5705,28 @@ let ZipEntry$1 = class ZipEntry {
5443
5705
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5444
5706
  ({ writable } = writer);
5445
5707
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5446
- writer.size += writtenSize;
5447
5708
  if (writtenSize != outputSize) {
5448
- throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5709
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
5449
5710
  }
5711
+ writer.size += writtenSize;
5450
5712
  }
5451
5713
  } catch (error) {
5452
- if (error.outputSize !== UNDEFINED_VALUE) {
5714
+ const { outputSize: failedOutputSize } = workerOptions;
5715
+ if (failedOutputSize !== UNDEFINED_VALUE) {
5716
+ writer.size += failedOutputSize;
5717
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
5453
5718
  writer.size += error.outputSize;
5454
5719
  }
5455
- if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
5720
+ if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
5456
5721
  abortError = error;
5722
+ aborted = true;
5457
5723
  throw error;
5458
5724
  }
5459
5725
  } finally {
5460
5726
  const preventClose = !ownsWritable(writer) && getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
5461
5727
  if (!preventClose && writable && !writable.locked) {
5462
5728
  const writableWriter = writable.getWriter();
5463
- if (abortError) {
5729
+ if (aborted) {
5464
5730
  try {
5465
5731
  await writableWriter.abort(abortError);
5466
5732
  } catch {
@@ -6112,7 +6378,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
6112
6378
  if (checkLocalFilename && !maskedLocalDirectory &&
6113
6379
  (rawLocalFilename.length != rawFilename.length ||
6114
6380
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6115
- reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6381
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
6116
6382
  }
6117
6383
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6118
6384
  reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
@@ -6137,16 +6403,6 @@ function reportAmbiguity(reject, warnings, reason) {
6137
6403
  }
6138
6404
  }
6139
6405
 
6140
- function addWarning(warnings, reason, filename) {
6141
- if (!warnings.some(warning => warning.reason == reason)) {
6142
- const warning = { reason };
6143
- if (filename !== UNDEFINED_VALUE) {
6144
- warning.filename = filename;
6145
- }
6146
- warnings.push(warning);
6147
- }
6148
- }
6149
-
6150
6406
  function throwAmbiguousArchive(reason) {
6151
6407
  const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
6152
6408
  error.reason = reason;
@@ -6226,7 +6482,9 @@ var zipReader = /*#__PURE__*/Object.freeze({
6226
6482
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6227
6483
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6228
6484
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6485
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6229
6486
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6487
+ WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6230
6488
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6231
6489
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6232
6490
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
@@ -6279,7 +6537,7 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
6279
6537
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
6280
6538
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
6281
6539
  const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
6282
- const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
6540
+ const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
6283
6541
  const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6284
6542
  const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6285
6543
  const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
@@ -6291,6 +6549,7 @@ const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
6291
6549
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
6292
6550
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6293
6551
  const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
6552
+ const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
6294
6553
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
6295
6554
  const ERR_UNDEFINED_READER = "Undefined reader";
6296
6555
  const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
@@ -6304,14 +6563,21 @@ const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be intege
6304
6563
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6305
6564
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6306
6565
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6566
+ const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
6567
+ const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
6568
+ const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
6569
+ const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
6307
6570
 
6308
6571
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6309
6572
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6310
6573
  const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6311
6574
  const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6575
+ const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
6576
+ const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
6312
6577
  const VENDOR_VERSION_AE_1 = 1;
6313
- const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
6578
+ const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
6314
6579
  const UNIX_EXTRA_FIELD_TYPE = "unix";
6580
+ const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
6315
6581
  const MAX_LEVEL = 9;
6316
6582
 
6317
6583
  let workers = 0;
@@ -6338,9 +6604,11 @@ class ZipWriter {
6338
6604
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
6339
6605
  pendingAddFileCalls: new Set(),
6340
6606
  pendingErrors: [],
6607
+ warnings: [],
6341
6608
  bufferedWrites: 0,
6342
6609
  directWrites: 0,
6343
- lastFileEntry: UNDEFINED_VALUE
6610
+ lastFileEntry: UNDEFINED_VALUE,
6611
+ archiveClosed: false
6344
6612
  });
6345
6613
  }
6346
6614
 
@@ -6505,6 +6773,9 @@ class ZipWriter {
6505
6773
  const zipWriter = this;
6506
6774
  const { pendingAddFileCalls, writer } = this;
6507
6775
  const { writable } = writer;
6776
+ if (zipWriter.archiveClosed) {
6777
+ return getWriterData(writer);
6778
+ }
6508
6779
  if (!(comment instanceof Uint8Array)) {
6509
6780
  throw new Error(ERR_INVALID_COMMENT_TYPE);
6510
6781
  }
@@ -6515,7 +6786,7 @@ class ZipWriter {
6515
6786
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6516
6787
  }
6517
6788
  await Promise.allSettled(zipWriter.pendingErrors.map(watcher => watcher.recorded));
6518
- const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.error && !watcher.observed);
6789
+ const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.failed && !watcher.observed);
6519
6790
  if (unobservedWatchers.length) {
6520
6791
  const unobservedErrors = unobservedWatchers.map(watcher => watcher.error);
6521
6792
  unobservedWatchers.forEach(watcher => watcher.observed = true);
@@ -6528,11 +6799,16 @@ class ZipWriter {
6528
6799
  throw error;
6529
6800
  }
6530
6801
  await closeFile(zipWriter, comment, options);
6802
+ zipWriter.archiveClosed = true;
6531
6803
  const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
6532
6804
  if (!preventClose) {
6533
6805
  await writable.getWriter().close();
6534
6806
  }
6535
- return writer.getData ? writer.getData() : writable;
6807
+ return getWriterData(writer);
6808
+ }
6809
+
6810
+ [SYMBOL_ASYNC_DISPOSE]() {
6811
+ return this.close();
6536
6812
  }
6537
6813
  }
6538
6814
 
@@ -6611,11 +6887,16 @@ class WatchedPromise extends Promise {
6611
6887
  }
6612
6888
  }
6613
6889
 
6890
+ function getWriterData(writer) {
6891
+ return writer.getData ? writer.getData() : writer.writable;
6892
+ }
6893
+
6614
6894
  function watchPromiseError(zipWriter, promise) {
6615
6895
  const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
6616
6896
  const watcher = {};
6617
6897
  watchedPromise.watcher = watcher;
6618
- watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE, error => watcher.error = error);
6898
+ watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
6899
+ error => Object.assign(watcher, { failed: true, error }));
6619
6900
  zipWriter.pendingErrors.push(watcher);
6620
6901
  return watchedPromise;
6621
6902
  }
@@ -6629,6 +6910,14 @@ async function prependZipEntries(zipWriter, reader) {
6629
6910
 
6630
6911
  async function addFileEntry(zipWriter, name, reader, options) {
6631
6912
  options = Object.assign({}, options);
6913
+ const entry = options[OPTION_ENTRY];
6914
+ if (entry !== UNDEFINED_VALUE) {
6915
+ const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
6916
+ checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
6917
+ getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
6918
+ delete options[OPTION_ENTRY];
6919
+ options = Object.assign(entryOptions, passThroughOptions, options);
6920
+ }
6632
6921
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6633
6922
  name += DIRECTORY_SIGNATURE;
6634
6923
  }
@@ -6693,21 +6982,33 @@ async function addFile(zipWriter, name, reader, options) {
6693
6982
  try {
6694
6983
  const { resolvedOptions } = metadataInfo;
6695
6984
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6696
- !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6985
+ !resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
6697
6986
  resolvedOptions.level = 0;
6987
+ addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
6698
6988
  }
6699
6989
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
6700
6990
  ({ reader } = sizesInfo);
6701
6991
  const diskOffset = getDiskOffset(zipWriter.writer);
6702
6992
  const diskNumber = getDiskNumber(zipWriter.writer);
6993
+ let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
6994
+ const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
6995
+ if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
6996
+ crc32 = UNDEFINED_VALUE;
6997
+ }
6998
+ if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
6999
+ throw new Error(ERR_UNDEFINED_CRC32);
7000
+ }
6703
7001
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
6704
7002
  signature: options[PROPERTY_NAME_SIGNATURE],
6705
- crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
7003
+ crc32,
6706
7004
  offset: zipWriter.offset - diskOffset,
6707
7005
  diskNumberStart: diskNumber,
6708
7006
  [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6709
7007
  });
6710
7008
  const headerInfo = getHeaderInfo(options);
7009
+ if (headerInfo.lastModDateClamped) {
7010
+ addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
7011
+ }
6711
7012
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6712
7013
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6713
7014
  fileEntry = await getFileEntry(zipWriter, name, reader, {
@@ -6734,6 +7035,95 @@ async function addFile(zipWriter, name, reader, options) {
6734
7035
  return new Entry(fileEntry);
6735
7036
  }
6736
7037
 
7038
+ function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
7039
+ if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
7040
+ throw new Error(ERR_INVALID_ENTRY);
7041
+ }
7042
+ const {
7043
+ externalFileAttributes,
7044
+ versionMadeBy,
7045
+ comment,
7046
+ lastModDate,
7047
+ rawLastModDate,
7048
+ creationDate,
7049
+ lastAccessDate,
7050
+ uncompressedSize,
7051
+ encrypted,
7052
+ zipCrypto,
7053
+ crc32,
7054
+ compressionMethod,
7055
+ extraFieldAES,
7056
+ extraFieldUnix,
7057
+ internalFileAttributes,
7058
+ extraField,
7059
+ bitFlag,
7060
+ directory,
7061
+ uid,
7062
+ gid
7063
+ } = entry;
7064
+ const entryOptions = {
7065
+ externalFileAttributes,
7066
+ versionMadeBy,
7067
+ comment,
7068
+ lastModDate,
7069
+ creationDate,
7070
+ lastAccessDate,
7071
+ internalFileAttributes,
7072
+ directory
7073
+ };
7074
+ if (bitFlag && bitFlag.languageEncodingFlag) {
7075
+ entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
7076
+ }
7077
+ const userExtraField = getUserExtraField(extraField);
7078
+ if (userExtraField) {
7079
+ entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
7080
+ }
7081
+ if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
7082
+ Object.assign(entryOptions, {
7083
+ uid,
7084
+ gid,
7085
+ unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
7086
+ });
7087
+ }
7088
+ const passThroughOptions = {};
7089
+ if (passThrough && !directory) {
7090
+ Object.assign(passThroughOptions, {
7091
+ uncompressedSize,
7092
+ crc32,
7093
+ compressionMethod
7094
+ });
7095
+ if (passThrough !== PASS_THROUGH_COMPRESSED) {
7096
+ Object.assign(passThroughOptions, {
7097
+ encrypted,
7098
+ zipCrypto,
7099
+ encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
7100
+ });
7101
+ }
7102
+ if (bitFlag) {
7103
+ passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
7104
+ passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
7105
+ }
7106
+ if (lastModDateOverride === UNDEFINED_VALUE) {
7107
+ passThroughOptions.rawLastModDate = rawLastModDate;
7108
+ } else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
7109
+ lastModDateOverride instanceof Date &&
7110
+ getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
7111
+ throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
7112
+ }
7113
+ }
7114
+ return { entryOptions, passThroughOptions };
7115
+ }
7116
+
7117
+ function getDosTimeHighByte(lastModDate) {
7118
+ let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
7119
+ if (dosLastModDate < MIN_DATE) {
7120
+ dosLastModDate = MIN_DATE;
7121
+ } else if (dosLastModDate > MAX_DATE) {
7122
+ dosLastModDate = MAX_DATE;
7123
+ }
7124
+ return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
7125
+ }
7126
+
6737
7127
  function resolveAttributes(zipWriter, name, options) {
6738
7128
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6739
7129
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
@@ -6748,7 +7138,7 @@ function resolveAttributes(zipWriter, name, options) {
6748
7138
  checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
6749
7139
  checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
6750
7140
  checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
6751
- if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
7141
+ if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
6752
7142
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
6753
7143
  }
6754
7144
  if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
@@ -6756,7 +7146,7 @@ function resolveAttributes(zipWriter, name, options) {
6756
7146
  throw new Error(ERR_INVALID_UNIX_ID_SIZE);
6757
7147
  }
6758
7148
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6759
- unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
7149
+ unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
6760
7150
  }
6761
7151
  let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6762
7152
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
@@ -6887,7 +7277,9 @@ function resolveMetadata(zipWriter, name, options) {
6887
7277
  const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6888
7278
  const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6889
7279
  const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
6890
- const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
7280
+ const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7281
+ const passThroughCompression = Boolean(passThrough);
7282
+ const passThroughEncryption = passThrough === true;
6891
7283
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6892
7284
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6893
7285
  checkPasswordOption(password, rawPassword);
@@ -6903,10 +7295,11 @@ function resolveMetadata(zipWriter, name, options) {
6903
7295
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6904
7296
  const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6905
7297
  throwIfAborted(signal);
6906
- const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
7298
+ const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
7299
+ !isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
6907
7300
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6908
- const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
6909
- if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
7301
+ const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
7302
+ if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
6910
7303
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6911
7304
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6912
7305
  }
@@ -6920,15 +7313,15 @@ function resolveMetadata(zipWriter, name, options) {
6920
7313
  level = 0;
6921
7314
  }
6922
7315
  }
6923
- if (passThrough) {
6924
- level = UNDEFINED_VALUE;
7316
+ if (passThroughCompression) {
7317
+ level = toNumber(options[OPTION_LEVEL]);
6925
7318
  }
6926
7319
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6927
7320
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6928
7321
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
6929
7322
  dataDescriptor = false;
6930
7323
  }
6931
- if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThrough)) {
7324
+ if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
6932
7325
  dataDescriptor = true;
6933
7326
  }
6934
7327
  if (level !== UNDEFINED_VALUE && level != 6) {
@@ -6952,7 +7345,8 @@ function resolveMetadata(zipWriter, name, options) {
6952
7345
  lastAccessDate,
6953
7346
  creationDate,
6954
7347
  internalFileAttributes,
6955
- passThrough,
7348
+ passThroughCompression,
7349
+ passThroughEncryption,
6956
7350
  password,
6957
7351
  rawPassword,
6958
7352
  encryptionStrength,
@@ -7013,7 +7407,7 @@ function serializeExtraField(extraField) {
7013
7407
  }
7014
7408
 
7015
7409
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
7016
- if (metadata.passThrough && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7410
+ if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7017
7411
  throw new Error(ERR_UNDEFINED_READER);
7018
7412
  }
7019
7413
  let contentSize;
@@ -7029,12 +7423,12 @@ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, op
7029
7423
  }
7030
7424
 
7031
7425
  function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
7032
- const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7426
+ const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7033
7427
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
7034
7428
  let maximumCompressedSize = 0;
7035
7429
  let uncompressedSize = 0;
7036
7430
  let unknownSize = false;
7037
- if (passThrough && hasContent) {
7431
+ if (passThroughCompression && hasContent) {
7038
7432
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
7039
7433
  if (uncompressedSize === UNDEFINED_VALUE) {
7040
7434
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
@@ -7045,17 +7439,17 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
7045
7439
  }
7046
7440
  const zip64Enabled = zip64 === true;
7047
7441
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
7048
- if (hasContent && passThrough && !encrypted && getLength(password, rawPassword)) {
7442
+ if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
7049
7443
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
7050
7444
  }
7051
- const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
7445
+ const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
7052
7446
  if (!hasContent) {
7053
7447
  level = 0;
7054
7448
  compressionMethod = COMPRESSION_METHOD_STORE;
7055
7449
  }
7056
- const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7450
+ const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
7057
7451
  if (hasContent) {
7058
- if (!passThrough) {
7452
+ if (!passThroughCompression) {
7059
7453
  if (contentSize === UNDEFINED_VALUE) {
7060
7454
  dataDescriptor = true;
7061
7455
  if (zip64 || zip64 === UNDEFINED_VALUE) {
@@ -7068,10 +7462,12 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
7068
7462
  }
7069
7463
  } else {
7070
7464
  options.uncompressedSize = uncompressedSize;
7071
- maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
7465
+ maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
7466
+ getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
7467
+ contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
7072
7468
  }
7073
7469
  }
7074
- const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
7470
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7075
7471
  if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7076
7472
  dataDescriptor = false;
7077
7473
  }
@@ -7120,6 +7516,8 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7120
7516
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7121
7517
  let offset = initialOffset;
7122
7518
  let minimumEntrySize = INFINITY_VALUE;
7519
+ const entrySizes = [];
7520
+ const entriesAlreadyZip64 = new Set();
7123
7521
  for (const entry of entries) {
7124
7522
  let { name } = entry;
7125
7523
  const { size } = entry;
@@ -7131,7 +7529,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7131
7529
  ({ name } = attributesInfo);
7132
7530
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
7133
7531
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
7134
- !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
7532
+ !metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
7135
7533
  metadata.level = 0;
7136
7534
  }
7137
7535
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -7139,7 +7537,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7139
7537
  throw new Error(ERR_UNDETERMINED_SIZE);
7140
7538
  }
7141
7539
  const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
7142
- if (hasContent && !metadata.passThrough && isCompressed(sizes.compressionMethod, sizes.level)) {
7540
+ if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
7143
7541
  throw new Error(ERR_UNDETERMINED_SIZE);
7144
7542
  }
7145
7543
  const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
@@ -7159,10 +7557,15 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7159
7557
  compressedSize
7160
7558
  }));
7161
7559
  const entrySize = entryInfo.metadataSize + compressedSize;
7560
+ entrySizes.push(entrySize);
7561
+ entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
7562
+ entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
7162
7563
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7163
7564
  offset += entrySize;
7164
7565
  }
7165
- const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7566
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
7567
+ (offset - minimumEntrySize >= MAX_32_BITS &&
7568
+ (entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
7166
7569
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7167
7570
  throw new Error(ERR_UNDETERMINED_SIZE);
7168
7571
  }
@@ -7180,6 +7583,20 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7180
7583
  return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
7181
7584
  }
7182
7585
 
7586
+ function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
7587
+ const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
7588
+ let position = initialOffset;
7589
+ let count = 0;
7590
+ for (const entrySize of ordered) {
7591
+ if (position >= MAX_32_BITS) {
7592
+ break;
7593
+ }
7594
+ position += entrySize;
7595
+ count++;
7596
+ }
7597
+ return count;
7598
+ }
7599
+
7183
7600
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7184
7601
  const {
7185
7602
  fileEntries,
@@ -7355,6 +7772,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7355
7772
  localExtraFieldZip64Length,
7356
7773
  rawExtraFieldExtendedTimestamp,
7357
7774
  extraFieldExtendedTimestampFlag,
7775
+ extraFieldExtendedTimestampTime,
7358
7776
  rawExtraFieldNTFS,
7359
7777
  rawExtraFieldUnix,
7360
7778
  rawExtraFieldAES,
@@ -7367,6 +7785,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7367
7785
  password,
7368
7786
  rawPassword,
7369
7787
  level,
7788
+ useUnicodeFileNames,
7370
7789
  zip64,
7371
7790
  zip64Enabled,
7372
7791
  zip64UncompressedSize,
@@ -7401,7 +7820,8 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7401
7820
  msdosAttributesRaw,
7402
7821
  msdosAttributes,
7403
7822
  useCompressionStream,
7404
- passThrough,
7823
+ passThroughCompression,
7824
+ passThroughEncryption,
7405
7825
  format,
7406
7826
  codecURI
7407
7827
  } = options;
@@ -7412,9 +7832,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7412
7832
  zip64Enabled,
7413
7833
  directory: Boolean(directory),
7414
7834
  executable: Boolean(executable),
7415
- filenameUTF8: true,
7835
+ filenameUTF8: Boolean(useUnicodeFileNames),
7416
7836
  rawFilename,
7417
- commentUTF8: true,
7837
+ commentUTF8: Boolean(useUnicodeFileNames),
7418
7838
  rawComment,
7419
7839
  rawExtraFieldZip64,
7420
7840
  localExtraFieldZip64Length,
@@ -7445,7 +7865,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7445
7865
  uncompressedSize
7446
7866
  } = options;
7447
7867
  let compressedSize = 0;
7448
- if (!passThrough) {
7868
+ if (!passThroughCompression) {
7449
7869
  uncompressedSize = 0;
7450
7870
  }
7451
7871
  const { writable } = writer;
@@ -7462,9 +7882,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7462
7882
  encryptionStrength,
7463
7883
  zipCrypto: encrypted && zipCrypto,
7464
7884
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
7465
- computeCrc32: !passThrough,
7466
- compressed: compressed && !passThrough,
7467
- encrypted: encrypted && !passThrough,
7885
+ computeCrc32: !passThroughCompression,
7886
+ compressed: compressed && !passThroughCompression,
7887
+ encrypted: encrypted && !passThroughEncryption,
7468
7888
  useWebWorkers,
7469
7889
  useCompressionStream,
7470
7890
  transferStreams,
@@ -7479,7 +7899,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7479
7899
  const result = await runWorker({ readable, writable }, workerOptions);
7480
7900
  compressedSize = result.outputSize;
7481
7901
  writer.size += compressedSize;
7482
- if (!passThrough) {
7902
+ if (!passThroughCompression) {
7483
7903
  uncompressedSize = result.inputSize;
7484
7904
  if (!encrypted || zipCrypto) {
7485
7905
  crc32 = result.crc32;
@@ -7490,7 +7910,10 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7490
7910
  throw new Error(ERR_UNSUPPORTED_FORMAT);
7491
7911
  }
7492
7912
  } catch (error) {
7493
- if (error.outputSize !== UNDEFINED_VALUE) {
7913
+ const { outputSize: failedOutputSize } = workerOptions;
7914
+ if (failedOutputSize !== UNDEFINED_VALUE) {
7915
+ writer.size += failedOutputSize;
7916
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
7494
7917
  writer.size += error.outputSize;
7495
7918
  }
7496
7919
  throw error;
@@ -7522,8 +7945,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7522
7945
  headerArray,
7523
7946
  headerView,
7524
7947
  signature: crc32,
7525
- crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
7948
+ crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
7526
7949
  extraFieldExtendedTimestampFlag,
7950
+ extraFieldExtendedTimestampTime,
7527
7951
  zip64UncompressedSize,
7528
7952
  zip64CompressedSize
7529
7953
  });
@@ -7548,7 +7972,7 @@ function getHeaderInfo(options) {
7548
7972
  encryptionStrength,
7549
7973
  extendedTimestamp,
7550
7974
  ntfsTimestamp,
7551
- passThrough,
7975
+ passThroughCompression,
7552
7976
  encrypted,
7553
7977
  zip64UncompressedSize,
7554
7978
  zip64CompressedSize,
@@ -7559,7 +7983,7 @@ function getHeaderInfo(options) {
7559
7983
  let { version, compressionMethod } = options;
7560
7984
  const compressed = !directory && isCompressed(compressionMethod, level);
7561
7985
  let rawLocalExtraFieldZip64;
7562
- const uncompressedFile = passThrough || !compressed;
7986
+ const uncompressedFile = passThroughCompression || !compressed;
7563
7987
  const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
7564
7988
  const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
7565
7989
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
@@ -7571,8 +7995,8 @@ function getHeaderInfo(options) {
7571
7995
  if (zip64ExtraFieldComplete) {
7572
7996
  extraFieldZip64.writeUint64(uncompressedSize);
7573
7997
  if (uncompressedFile) {
7574
- const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7575
- extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7998
+ const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
7999
+ extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
7576
8000
  }
7577
8001
  }
7578
8002
  } else {
@@ -7591,6 +8015,7 @@ function getHeaderInfo(options) {
7591
8015
  let rawExtraFieldNTFS;
7592
8016
  let rawExtraFieldExtendedTimestamp;
7593
8017
  let extraFieldExtendedTimestampFlag;
8018
+ let extraFieldExtendedTimestampTime;
7594
8019
  if (extendedTimestamp) {
7595
8020
  const lastModTimeUnix = getTimeUnix(lastModDate);
7596
8021
  const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
@@ -7598,6 +8023,7 @@ function getHeaderInfo(options) {
7598
8023
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7599
8024
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7600
8025
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
8026
+ extraFieldExtendedTimestampTime = lastModTimeUnix;
7601
8027
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7602
8028
  extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7603
8029
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
@@ -7640,7 +8066,7 @@ function getHeaderInfo(options) {
7640
8066
  let rawExtraFieldUnix;
7641
8067
  try {
7642
8068
  const { uid, gid, unixExtraFieldType } = options;
7643
- if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE$1 && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
8069
+ if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7644
8070
  const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
7645
8071
  const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
7646
8072
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
@@ -7681,7 +8107,7 @@ function getHeaderInfo(options) {
7681
8107
  }
7682
8108
  if (encrypted && !zipCrypto) {
7683
8109
  version = version > VERSION_AES ? version : VERSION_AES;
7684
- if (passThrough && crc32 !== UNDEFINED_VALUE) {
8110
+ if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
7685
8111
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7686
8112
  }
7687
8113
  setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
@@ -7743,12 +8169,14 @@ function getHeaderInfo(options) {
7743
8169
  headerArray,
7744
8170
  headerView,
7745
8171
  lastModDate: storedLastModDate,
8172
+ lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
7746
8173
  rawLastModDate,
7747
8174
  encrypted,
7748
8175
  compressed,
7749
8176
  version,
7750
8177
  compressionMethod,
7751
8178
  extraFieldExtendedTimestampFlag,
8179
+ extraFieldExtendedTimestampTime,
7752
8180
  rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
7753
8181
  localExtraFieldZip64Length,
7754
8182
  rawExtraFieldExtendedTimestamp,
@@ -7851,7 +8279,7 @@ function setEntryInfo({
7851
8279
  }, {
7852
8280
  zip64,
7853
8281
  zipCrypto,
7854
- passThrough,
8282
+ passThroughCompression,
7855
8283
  dataDescriptor
7856
8284
  }) {
7857
8285
  const {
@@ -7862,7 +8290,7 @@ function setEntryInfo({
7862
8290
  dataDescriptorView,
7863
8291
  dataDescriptorOffset
7864
8292
  } = dataDescriptorInfo;
7865
- if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
8293
+ if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
7866
8294
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
7867
8295
  if (dataDescriptor) {
7868
8296
  setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
@@ -7893,9 +8321,9 @@ function updateLocalHeader({
7893
8321
  uncompressedSize,
7894
8322
  zip64UncompressedSize,
7895
8323
  zip64CompressedSize
7896
- }, localHeaderView, { dataDescriptor, passThrough }) {
8324
+ }, localHeaderView, { dataDescriptor, passThroughCompression }) {
7897
8325
  if (!dataDescriptor) {
7898
- if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
8326
+ if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
7899
8327
  setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
7900
8328
  }
7901
8329
  if (!zip64CompressedSize) {
@@ -7932,9 +8360,8 @@ function createDirectoryRecords(files) {
7932
8360
  rawExtraFieldUnix,
7933
8361
  rawExtraField,
7934
8362
  rawCentralExtraField,
7935
- extendedTimestamp,
7936
8363
  extraFieldExtendedTimestampFlag,
7937
- lastModDate,
8364
+ extraFieldExtendedTimestampTime,
7938
8365
  zip64Enabled,
7939
8366
  uncompressedSize,
7940
8367
  compressedSize
@@ -7977,16 +8404,15 @@ function createDirectoryRecords(files) {
7977
8404
  fileEntry.zip64Offset = zip64Offset;
7978
8405
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
7979
8406
  let rawExtraFieldTimestamp;
7980
- const lastModTimeUnix = getTimeUnix(lastModDate);
7981
- if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
8407
+ if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
8408
+ rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
8409
+ } else {
7982
8410
  const extraFieldTimestamp = createRecordWriter(9);
7983
8411
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7984
8412
  extraFieldTimestamp.writeUint16(5);
7985
8413
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7986
- extraFieldTimestamp.writeUint32(lastModTimeUnix);
8414
+ extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
7987
8415
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7988
- } else {
7989
- rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
7990
8416
  }
7991
8417
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
7992
8418
  const extraFieldLength = getLength(
@@ -8486,6 +8912,11 @@ function getHeaderArrayData({
8486
8912
  };
8487
8913
  }
8488
8914
 
8915
+ function isPrintableASCIIText(rawText) {
8916
+ return rawText.every(characterCode =>
8917
+ characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
8918
+ }
8919
+
8489
8920
  function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
8490
8921
  let bitFlag = 0;
8491
8922
  if (useUnicodeFileNames) {
@@ -8647,7 +9078,7 @@ function formatSupported(StreamClass, format) {
8647
9078
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8648
9079
  */
8649
9080
 
8650
- const VERSION = "2.11.4";
9081
+ const VERSION = "2.13.0";
8651
9082
 
8652
9083
  /*
8653
9084
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9469,9 +9900,9 @@ setDefaultConfiguration({
9469
9900
  DecompressionStreamFallback: DecompressionStreamZlib
9470
9901
  });
9471
9902
 
9472
- function terminateWorkersAndModule() {
9903
+ async function terminateWorkersAndModule() {
9904
+ await terminateWorkers();
9473
9905
  modulePromise = null;
9474
- terminateWorkers();
9475
9906
  resetWasmModule();
9476
9907
  }
9477
9908
 
@@ -9538,7 +9969,10 @@ s(setDefaultConfiguration);
9538
9969
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
9539
9970
  const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
9540
9971
  const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
9541
- const ERR_ANCESTOR_ENTRY = "Entry is a ancestor of target entry";
9972
+ const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
9973
+ const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
9974
+ const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
9975
+ const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
9542
9976
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
9543
9977
  const DUPLICATES_THROW = "throw";
9544
9978
  const DUPLICATES_KEEP_FIRST = "keep-first";
@@ -9546,22 +9980,8 @@ const DUPLICATES_KEEP_LAST = "keep-last";
9546
9980
  const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
9547
9981
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9548
9982
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9549
- const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
9983
+ const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9550
9984
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9551
- const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
9552
- const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
9553
- EXTRAFIELD_TYPE_ZIP64,
9554
- EXTRAFIELD_TYPE_AES,
9555
- EXTRAFIELD_TYPE_NTFS,
9556
- EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
9557
- EXTRAFIELD_TYPE_UNICODE_PATH,
9558
- EXTRAFIELD_TYPE_UNICODE_COMMENT,
9559
- EXTRAFIELD_TYPE_USDZ,
9560
- EXTRAFIELD_TYPE_INFOZIP,
9561
- EXTRAFIELD_TYPE_UNIX,
9562
- EXTRAFIELD_TYPE_UNIX_TYPE1,
9563
- EXTRAFIELD_TYPE_PKWARE_UNIX
9564
- ]);
9565
9985
 
9566
9986
  class ZipEntry {
9567
9987
 
@@ -9693,7 +10113,7 @@ class ZipFileEntry extends ZipEntry {
9693
10113
  }));
9694
10114
  return true;
9695
10115
  } catch (error) {
9696
- if (error.message == ERR_INVALID_PASSWORD) {
10116
+ if (isErrorObject(error) && error.message == ERR_INVALID_PASSWORD) {
9697
10117
  return false;
9698
10118
  } else {
9699
10119
  throw error;
@@ -9933,6 +10353,7 @@ class ZipDirectoryEntry extends ZipEntry {
9933
10353
  await initStream(reader);
9934
10354
  zipReader = new ZipReader(reader, options);
9935
10355
  }
10356
+ checkPassThroughValue(options.passThrough);
9936
10357
  const duplicates = checkDuplicatesOption(options.duplicates);
9937
10358
  const importedEntries = [];
9938
10359
  const entries = await zipReader.getEntries(options);
@@ -10023,18 +10444,25 @@ class ZipDirectoryEntry extends ZipEntry {
10023
10444
 
10024
10445
  async exportZip(writer, options = {}) {
10025
10446
  const zipEntry = this;
10447
+ const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
10026
10448
  options = Object.assign({}, options);
10027
- if (options.bufferedWrite === UNDEFINED_VALUE) {
10449
+ if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
10028
10450
  options.bufferedWrite = true;
10029
10451
  }
10030
- const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
10031
- const zipWriter = new ZipWriter(writer, options);
10452
+ const [readers] = await Promise.all([
10453
+ initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
10454
+ zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
10455
+ ]);
10456
+ const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
10032
10457
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
10458
+ if (zipWriterProvided) {
10459
+ return zipWriter;
10460
+ }
10033
10461
  await zipWriter.close(options.globalComment);
10034
10462
  return writer.getData ? writer.getData() : writer.writable;
10035
10463
  }
10036
10464
 
10037
- getExportedSize(options = {}) {
10465
+ async getExportedSize(options = {}) {
10038
10466
  const zipEntry = this;
10039
10467
  options = Object.assign({}, options);
10040
10468
  checkReaderOptions(options.readerOptions);
@@ -10049,7 +10477,7 @@ class ZipDirectoryEntry extends ZipEntry {
10049
10477
  const writeOrderGuaranteed = !options.bufferedWrite ||
10050
10478
  (entries.every(entry => entry.options.keepOrder !== false) &&
10051
10479
  children.every(child => isImplicitDirectory(child) || !child.children.length));
10052
- return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10480
+ return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10053
10481
  }
10054
10482
 
10055
10483
  getChildByName(name) {
@@ -10110,7 +10538,7 @@ class ZipFS {
10110
10538
 
10111
10539
  move(entry, destination) {
10112
10540
  if (entry == this.root) {
10113
- throw new Error("Root directory cannot be moved");
10541
+ throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
10114
10542
  } else {
10115
10543
  if (destination.directory) {
10116
10544
  if (!destination.isDescendantOf(entry)) {
@@ -10131,7 +10559,7 @@ class ZipFS {
10131
10559
  throw new Error(ERR_ANCESTOR_ENTRY);
10132
10560
  }
10133
10561
  } else {
10134
- throw new Error("Target entry is not a directory");
10562
+ throw new Error(ERR_TARGET_NOT_DIRECTORY);
10135
10563
  }
10136
10564
  }
10137
10565
  }
@@ -10444,70 +10872,11 @@ function getChildEntryOptions(child, selectedEntry, options) {
10444
10872
  let zipEntryMetadata = {};
10445
10873
  let passThroughOptions = {};
10446
10874
  if (child.data instanceof Entry) {
10447
- const {
10448
- externalFileAttributes,
10449
- versionMadeBy,
10450
- comment,
10451
- lastModDate,
10452
- rawLastModDate,
10453
- creationDate,
10454
- lastAccessDate,
10455
- uncompressedSize,
10456
- encrypted,
10457
- zipCrypto,
10458
- crc32,
10459
- compressionMethod,
10460
- extraFieldAES,
10461
- internalFileAttributes,
10462
- extraField,
10463
- bitFlag,
10464
- uid,
10465
- gid
10466
- } = child.data;
10467
- zipEntryMetadata = {
10468
- externalFileAttributes,
10469
- versionMadeBy,
10470
- comment,
10471
- lastModDate,
10472
- creationDate,
10473
- lastAccessDate,
10474
- internalFileAttributes
10475
- };
10476
- const userExtraField = getUserExtraField(extraField);
10477
- if (userExtraField) {
10478
- zipEntryMetadata.extraField = userExtraField;
10479
- }
10480
- if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
10481
- Object.assign(zipEntryMetadata, {
10482
- uid,
10483
- gid,
10484
- unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
10485
- });
10486
- }
10487
- if (isPassThrough(child, options)) {
10488
- let encryptionStrength;
10489
- if (extraFieldAES) {
10490
- encryptionStrength = extraFieldAES.strength;
10491
- }
10492
- passThroughOptions = {
10493
- passThrough: true,
10494
- encrypted,
10495
- zipCrypto,
10496
- crc32,
10497
- uncompressedSize,
10498
- encryptionStrength,
10499
- compressionMethod
10500
- };
10501
- if (bitFlag) {
10502
- passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
10503
- }
10504
- const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10505
- if (lastModDateOverride === UNDEFINED_VALUE) {
10506
- passThroughOptions.rawLastModDate = rawLastModDate;
10507
- } else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
10508
- getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
10509
- throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
10510
- }
10875
+ const passThrough = isPassThrough(child, options);
10876
+ const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10877
+ ({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
10878
+ if (passThrough) {
10879
+ passThroughOptions.passThrough = true;
10511
10880
  }
10512
10881
  }
10513
10882
  const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
@@ -10517,16 +10886,6 @@ function getChildEntryOptions(child, selectedEntry, options) {
10517
10886
  return { name, entryOptions };
10518
10887
  }
10519
10888
 
10520
- function getDosTimeHighByte(lastModDate) {
10521
- let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
10522
- if (dosLastModDate < MIN_DATE) {
10523
- dosLastModDate = MIN_DATE;
10524
- } else if (dosLastModDate > MAX_DATE) {
10525
- dosLastModDate = MAX_DATE;
10526
- }
10527
- return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
10528
- }
10529
-
10530
10889
  function getDeterminedSize(child, passThrough) {
10531
10890
  const { reader } = child;
10532
10891
  if (reader && reader.size !== UNDEFINED_VALUE) {
@@ -10539,9 +10898,18 @@ function checkReaderOptions(readerOptions) {
10539
10898
  if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10540
10899
  throw new Error(ERR_INVALID_READER_OPTIONS);
10541
10900
  }
10901
+ if (readerOptions) {
10902
+ checkPassThroughValue(readerOptions.passThrough);
10903
+ }
10542
10904
  return readerOptions;
10543
10905
  }
10544
10906
 
10907
+ function checkPassThroughValue(passThrough) {
10908
+ if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10909
+ throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
10910
+ }
10911
+ }
10912
+
10545
10913
  function replaceContent(zipEntry, params) {
10546
10914
  const { uncompressedSize } = params;
10547
10915
  Object.assign(zipEntry, params, {
@@ -10570,20 +10938,6 @@ function isImplicitDirectory(child) {
10570
10938
  return child.directory && child.data === null;
10571
10939
  }
10572
10940
 
10573
- function getUserExtraField(extraField) {
10574
- if (extraField) {
10575
- const userExtraField = new Map();
10576
- extraField.forEach((field, type) => {
10577
- if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
10578
- userExtraField.set(type, field.data);
10579
- }
10580
- });
10581
- if (userExtraField.size) {
10582
- return userExtraField;
10583
- }
10584
- }
10585
- }
10586
-
10587
10941
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
10588
10942
  const { onstart, onprogress, onend, onentryprogress } = options;
10589
10943
  const selectedEntry = entry;
@@ -10686,6 +11040,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
10686
11040
 
10687
11041
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10688
11042
  const { onstart, onprogress, onend } = options;
11043
+ checkPassThroughValue(options.passThrough);
10689
11044
  const readerOptions = checkReaderOptions(options.readerOptions);
10690
11045
  const abortController = new AbortController();
10691
11046
  const { signal } = abortController;
@@ -10761,7 +11116,7 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10761
11116
  if (exportAborted || isExportAborted(signal.reason)) {
10762
11117
  return;
10763
11118
  }
10764
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
11119
+ throwIfAborted(signal);
10765
11120
  }
10766
11121
  try {
10767
11122
  if (child.directory) {
@@ -10894,7 +11249,7 @@ function addChild(parent, name, params, directory) {
10894
11249
  }
10895
11250
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
10896
11251
  } else {
10897
- throw new Error("Parent entry is not a directory");
11252
+ throw new Error(ERR_PARENT_NOT_DIRECTORY);
10898
11253
  }
10899
11254
  }
10900
11255
 
@@ -11036,6 +11391,7 @@ exports.Data64URIReader = Data64URIReader;
11036
11391
  exports.Data64URIWriter = Data64URIWriter;
11037
11392
  exports.ERR_ABORTED = ERR_ABORTED;
11038
11393
  exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
11394
+ exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
11039
11395
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
11040
11396
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
11041
11397
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
@@ -11049,7 +11405,9 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
11049
11405
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
11050
11406
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
11051
11407
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
11408
+ exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
11052
11409
  exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
11410
+ exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
11053
11411
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
11054
11412
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
11055
11413
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
@@ -11059,6 +11417,7 @@ exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
11059
11417
  exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
11060
11418
  exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
11061
11419
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
11420
+ exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
11062
11421
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
11063
11422
  exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
11064
11423
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -11077,6 +11436,7 @@ exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
11077
11436
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
11078
11437
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
11079
11438
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
11439
+ exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
11080
11440
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
11081
11441
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
11082
11442
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
@@ -11087,14 +11447,19 @@ exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
11087
11447
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
11088
11448
  exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
11089
11449
  exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
11450
+ exports.ERR_INVALID_URI = ERR_INVALID_URI;
11090
11451
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
11091
11452
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
11092
11453
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
11093
11454
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
11455
+ exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
11094
11456
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
11095
11457
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
11458
+ exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
11096
11459
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
11460
+ exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
11097
11461
  exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
11462
+ exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
11098
11463
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
11099
11464
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
11100
11465
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -11106,10 +11471,12 @@ exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
11106
11471
  exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
11107
11472
  exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
11108
11473
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
11474
+ exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
11109
11475
  exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
11110
11476
  exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
11111
11477
  exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
11112
11478
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
11479
+ exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
11113
11480
  exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
11114
11481
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
11115
11482
  exports.HttpRangeReader = HttpRangeReader;
@@ -11123,13 +11490,17 @@ exports.Uint8ArrayReader = Uint8ArrayReader;
11123
11490
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
11124
11491
  exports.VERSION = VERSION;
11125
11492
  exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
11493
+ exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
11126
11494
  exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
11495
+ exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
11127
11496
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
11128
11497
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
11129
11498
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
11130
11499
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
11131
11500
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
11501
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
11132
11502
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11503
+ exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
11133
11504
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
11134
11505
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
11135
11506
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;