@zip.js/zip.js 2.8.34 → 2.8.35

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/README.md +13 -1
  2. package/deno.json +5 -2
  3. package/dist/README.md +3 -1
  4. package/dist/zip-core.js +472 -220
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core.js +449 -220
  7. package/dist/zip-fs-core.min.js +1 -1
  8. package/dist/zip-fs-native.js +476 -226
  9. package/dist/zip-fs-native.min.js +1 -1
  10. package/dist/zip-fs.js +478 -228
  11. package/dist/zip-fs.min.js +1 -1
  12. package/dist/zip-legacy.js +474 -222
  13. package/dist/zip-legacy.min.js +1 -1
  14. package/dist/zip-native.js +475 -223
  15. package/dist/zip-native.min.js +1 -1
  16. package/dist/zip-web-worker-native.js +1 -1
  17. package/dist/zip-web-worker.js +1 -1
  18. package/dist/zip.js +477 -225
  19. package/dist/zip.min.js +1 -1
  20. package/index-native.cjs +476 -226
  21. package/index-native.min.js +1 -1
  22. package/index.cjs +478 -228
  23. package/index.d.cts +53 -0
  24. package/index.d.ts +53 -0
  25. package/index.min.js +1 -1
  26. package/lib/core/codec-pool.js +2 -2
  27. package/lib/core/codec-worker.js +6 -2
  28. package/lib/core/configuration.js +22 -1
  29. package/lib/core/io.js +209 -56
  30. package/lib/core/streams/aes-crypto-stream.js +1 -10
  31. package/lib/core/streams/codec-stream.js +36 -15
  32. package/lib/core/streams/zip-entry-stream.js +19 -28
  33. package/lib/core/util/array.js +48 -0
  34. package/lib/core/web-worker-base.js +3 -3
  35. package/lib/core/web-worker-inline-native.js +1 -1
  36. package/lib/core/web-worker-inline-wasm.js +1 -1
  37. package/lib/core/zip-fs.js +2 -3
  38. package/lib/core/zip-reader.js +37 -40
  39. package/lib/core/zip-writer.js +58 -51
  40. package/lib/core/zlib-streams-inline.js +1 -1
  41. package/lib/zip-core-base.js +5 -3
  42. package/lib/zip-fs-native.js +2 -2
  43. package/lib/zip-fs-wasm.js +2 -2
  44. package/lib/zip-legacy.js +2 -2
  45. package/lib/zip-module-native.js +2 -2
  46. package/lib/zip-module-wasm.js +3 -3
  47. package/lib/zip-native.js +2 -2
  48. package/lib/zip-wasm.js +2 -2
  49. package/package.json +3 -3
  50. package/worker-message-property-names.js +3 -0
  51. package/.github/workflows/publish.yml +0 -30
  52. package/reserved-property-names.js +0 -50
@@ -162,6 +162,7 @@
162
162
  workerStarvationTimeout: 5000,
163
163
  useWebWorkers: true,
164
164
  useCompressionStream: true,
165
+ transferStreams: true,
165
166
  CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
166
167
  DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
167
168
  };
@@ -176,13 +177,14 @@
176
177
  "workerStarvationTimeout",
177
178
  "useCompressionStream",
178
179
  "useWebWorkers",
180
+ "transferStreams",
179
181
  "CompressionStream",
180
182
  "DecompressionStream",
181
183
  "CompressionStreamZlib",
182
184
  "DecompressionStreamZlib"
183
185
  ];
184
186
 
185
- const config = Object.assign({}, DEFAULT_CONFIGURATION);
187
+ const config = { ...DEFAULT_CONFIGURATION };
186
188
 
187
189
  function getConfiguration() {
188
190
  return config;
@@ -201,7 +203,24 @@
201
203
  }
202
204
  }
203
205
 
204
- const t=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],o=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],c=new Uint8Array(288);c.fill(8,0,144),c.fill(9,144,256),c.fill(7,256,280),c.fill(8,280,288);const e=new Uint8Array(30).fill(5);function s(t){const r=new Uint16Array(16);for(const f of t)r[f]++;r[0]=0;const f=new Uint16Array(17);for(let t=1;15>=t;t++)f[t+1]=f[t]+r[t];const o=new Uint16Array(t.length);for(let r=0;r<t.length;r++)t[r]&&(o[f[t[r]]++]=r);return {t:r,symbols:o}}const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",m=(a=>{let i=0,v=0,m=0,u=new Uint8Array(1024),j=0,R=0;for(;!R;){R=x(1);const t=x(2);if(0==t)V();else if(1==t)X(s(c),s(e));else {if(2!=t)throw Error("invalid deflate block type");X(...K());}}return u.subarray(0,j);function b(){if(i>=a.length)throw Error("unexpected end of deflate data");return a[i++]}function x(t){for(;t>m;)v|=b()<<m,m+=8;const r=v&(1<<t)-1;return v>>>=t,m-=t,r}function V(){v=0,m=0;const t=b()|b()<<8;i+=2,l(j+t);for(let r=0;t>r;r++)u[j++]=b();}function X(n,c){let e=L(n);for(;256!=e;){if(256>e)l(j+1),u[j++]=e;else {const n=e-257,s=t[n]+x(r[n]),a=L(c),i=f[a]+x(o[a]);l(j+s);const v=j-i;for(let t=0;s>t;t++)u[j++]=u[v+t];}e=L(n);}}function K(){const t=x(5)+257,r=x(5)+1,f=x(4)+4,o=new Uint8Array(19);for(let t=0;f>t;t++)o[n[t]]=x(3);const c=s(o),e=new Uint8Array(t+r);let a=0;for(;a<e.length;){const t=L(c);if(16>t)e[a++]=t;else if(16==t){const t=e[a-1];let r=x(2)+3;for(;r--;)e[a++]=t;}else a+=17==t?x(3)+3:x(7)+11;}return [s(e.subarray(0,t)),s(e.subarray(t))]}function L(t){const{t:r,symbols:f}=t;let o=0,n=0,c=0;for(let t=1;15>=t;t++){o|=x(1);const e=r[t];if(e>o-n)return f[c+(o-n)];c+=e,n=n+e<<1,o<<=1;}throw Error("invalid huffman code")}function l(t){if(u.length<t){let r=2*u.length;for(;t>r;)r*=2;const f=new Uint8Array(r);f.set(u.subarray(0,j)),u=f;}}})((t=>{const r=(t=(t+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let o=0;r>o;o+=4){const r=a.indexOf(t[o])<<18|a.indexOf(t[o+1])<<12|(63&a.indexOf(t[o+2]))<<6|63&a.indexOf(t[o+3]);f.push(r>>16&255),"="!==t[o+2]&&f.push(r>>8&255),"="!==t[o+3]&&f.push(255&r);}return new Uint8Array(f)})("zX1pc9u4suj39ytsV46KCJscklosU4ZUzjbJZLJMnGUSleKiJdCiLZMKCFmxLZ3f/qob4CLZmclZ7ruv7KIIEGgAjUaj0Wg0LMH7t3vxIh2rJEv3OFfXc5HFOxMRJ6loNPSvG11OBvrVEiwUFlszq8hksdu9RS52ciWTsdrrjbM0V7dHUkbXoYA3p+dirEIFrxeXp0KGEl5Fahqm8FTKTIYJfEhS1dWpMwr4HR2KKdQMdCiHF1VgBq+ieRjBk0hFHxOxDMfwVmaXSS7CBbwX39XTdJxNhAyXMJbXc5WFU5hnuXol8jw6E+EE3ssozeNMXh4rKaLLcA7vRDSJTmfCRFzDJ5moWsQFPM4u51LkeZKlJu4SnojxndjTNc/FLIYrfpUlkx0PzvjeItXom+zBMa/wDTc8FcudDM75cDiC+/5HvTiT1kyoHcG9XtDu9EVP2Da7xSjFxcbnrvmouN9QA9Xv9/2vzYNuNzgImt1WSBG986E3GooRV+v7IRexivu9bl/1FJZGvboj+flQOT5m750PFYGR/X6/+5WABu12Q47WlHb4Fj7Ad3gHR3ACj+HFiJ/3xrMoz3eeamByMVaZtAS7VdMkdxUXq5Xjr6P5XKQTjNZ18Fb6c6+ogbcS7kykZ2rawxQp93pJbMk+7zYawj1dxLGQRX0TQu/YKuJBuKfXSryJ41wokAwyLp0uobCX9XnaS23eLTILrr4m7plQRHlWCrseA8nrUXYLI3uKv6C2i9HXx0OB+GgE7fbo6wkF/I4OHVEoaOnQO4Otr9+HssrxgQJFjrcUMjnW1F092cdaYhcrQvxbgmOpr2KYjtioZ5Cp1mdCWexWCrWQ6T917Hqte+DzjviuRDrJd+YbfaFxLgyqFSHvaS9fzIW0blUxZCwBkt0qt+wpkK5Ivy3EArnDGuLZIp9aFckQhVst1tN9IYs+cnOh9BC3PFAu1ZeBcK+i2UJwuV4zEBwrvtYUtfOEI8xxpCwBit0mseVxzgtqWK0wpEyI6YbvCNdkUaykIDEs8jj+CFL+xE0syXomRzPgnKeDWsbwiZtZClLwVkhB+SwZC8uDCghja5ghyRaIKynU1FEV1fFqlcCBVBX60FKOz2xdlzUsyjY2g4cFuMMSjijhWIJXVUrdsUhmlvqlGTDGikqYPKrBmz7IvtdoqEbDEkPp+CP+xJ1aCnSgEfit/Va32Wl1+33l+OBjh6xhGmJtQDLeJ+yIgQotOfBWKlSHh83AEcz2vYODtu93gv39/c5DAUkoeD91ZbZAGvll4zNbrZoBZBoopOwWKVszS8R9o2GlfDhiPdXnzaCnHN4MWOrOkawkDkHvDl7TorcEKxligukOq66w7RLISgyTUb/fVwgN36kVBY9Jyv4bbJBK6EFGxJKUxGIAEhLtrNH0QdlZvxkMZJi682xuMcJhul7De36LvCcPb+d1UnniIuX80oVioCim+dpGO1Q/oQY0G8lqZaVY519aIwZymIx4SkwC0sND3i0qJtdwUS9mOCKoEpBfImTEoqywIxE7PD087K7EUI6g2finXK0spduXMsxXDZGGbDRU1fTuQ6vZkAxSxkCt12v4xInRbDP6ojI4qHvKPZ1l44vj5Ebwth+Aci/50N9vBu1uyz9oQssLmkGz2fL3IWh3gma36XsBBPv+frPZ3e9CM+i2m/v77cAbgXKv+NBv+9225wWtA/C77YP9/XbzoAlBy/MO2gf7XheazYN2q3Ow3w1GIAaWco+5cI+LwcNAuedcuOf1iLdcuG9ZqFwpcuRPa/NbTRHYlJLXIMDLKr9wz/lwBMJ9yz0Q68V8EilxBxF7KDmlZ5XwJXB08vfuBxe7sOJbWL8nJVtyz0Fgtyj3LWT45KmtiQlHR9Y/8Lx9/+AgaLf2W97Bgc/UVGbLHSSyxNp7HKVppnamUT7ducyk2FHTKN0JvrabO86Ov3OaqHyvKDkmysyRRyINzQwFacmh1o126lgbwUYt5PgMp1gUMep5mHLfWbGbL04jFO0sv/NwBn7noTWzfcYYzGzulzTt5nPD6DAZ0trRdlcYqcg9rxite9xTNbzBEEkWeduIbbRDjwQ76PnthhGjNIl7Ol0xFtx4liE9u29/aQUHrYPOfnDQQco3qVdIMr0CXo8J952l6lVnrKIYQ08g1ycVOyy+9v2Dgeg38dHGx/7BQHPJUH2VX9NQNeRKNdKVbKS1mH+qRrp+rOePgvUfHooVygvIq9fvLFXNzog1SLh0jyHjwup6bEOi9AupMCOREQU//BTzZOiNIOfJ0B/BjCfDYAQRT4bNEYx5Mmxtiq37B7rnbXaLAFcri8BJ97HlQzYUTnP0FX+6+sdvmd/OqCR/RanbEDNbuoirHGYQMXtsIyhbulfDsmd+CTw2Wnm9MY8g4jOYUd6mBzmDnMcQc7XG+lMj7HjlATaD2mLnFApG1CR7RqHmiFpmRxRqjaiB9njlrdfwmt8ml/NMqpfimqY8sdx57b6w3pOkmeshDJ+rzkVhlcvVyhct8PrpauX15ebYTNKraJZMduaRjC7zHZXtzE8vJnFQDsiM+7aV9vttdngY6P7Q6ICFSbGkIUurpUckbVkZg6mRhpd6HE94IY3M+RNN4byqtWKw4H7PylYrn/UnvQV2HiaKec6FK1JaWVnz2rhajHDA4njtz3ozs5KoJ84ZRNzrRYd5MTgiTDWMRl95PowMzXCvLLXRmB3GpbRv22yKQqMWvicQD2cjBhObt9aGzpeVJPRLl63hRfi38xAgX33CP0FqlmCjnnLf8yGiSgI9R6VcoNz3Q29Uca9fmkGvmEL7CbFti7Iwt2T27pHFqjGlUCgxi6oU10xqxA+8g3YQtLqdr2KoRpAOfYr2262DdrvTDboU3zOFG8CYGXnO+6Ffi/Mp7hN1NHIszPGDSUuYZMJ9YgmdEIT7mu/6tYmK1g2v+a4H9PapatZ6kpyJfBsqIO/9hE028kwB3R+VKFGEkvtYYEEngkaJLntzaJgUO1m6E82kiCbXOxrqZGd6GY13xtFsJia7eyV4AlJWWrfC1FwwFFVeFbPudJefNRpFAJcj76J0kl1+xOVIzvkxvOR7L8qhmefLTE724FEVmSdnaaQWUuzBc753k8zPcyc6zaRyxlMxvnDKTL1CAbDzh2nrq0KQvVMwzuebMzdpNHaO3r7YwRk8X8yR+4jJHjPLpI/c78AXfptGlyLce/vo5ZNnwd4afufKjXKso3WL035oEjx/dfR4b72GLwy+1ZIkSsgI65iHvmhCPcfx8yPHN1ne8OHeRMjkSjxCkWEEv/FhF/wA/M4I/uRDvwNBC5rBCB5w34NnfOgB/Y3g1zrmQQj+a6MxRUlAzQQoChYCkcAUUhTsCVLxUwLmKz7cUquMYDsChcdXOBDpf7VS7kurLnLRt9aIBK1XONllfEP/YDgv91Hqau1ynjUaHf3TxZ/7WXsk8p0Lcb2TJzdirxAvrvgwrxZzyEqxwjHPeq2HmR10+3EvLjQ/gufDGBeQVvyPjHPurVZdTqXqcIsRN5JG5zA6PAxaXylklAuHh35HR3RNuPtVGi0GGJgEQuAXDeVrhGAg4tHhof816DYfWlG/v49yWj6MR1SlbPRVbCiWYpz3IXacqnvyYbMhBnEYO61Rb4aSQKvP49Wq1ceVJbFFOVS64qOvxA8pbKqOUYGJ6pYxTYzB+qvRaF1nJXVO8MgS4LH1RPzwq8/WL7eYGtEAqOLdH9GiUdME/iQo5GfFEssQxA/UdtnQSrDBosSgIAx+xbgyz5jH3OvtyuF41Bt/5flq5SMdDOMRzotEABmPv8YIJD48DPDRxEerl/EM1UKIiOzrwQEgDJ5BOsxGfEwiGkprKLiNRyNd4wX3O91W0/MOHkZfO+12c//h7GvQ3n+YfzUfug/HsOQYlQyzURWblTXG5WSrL2kdiQtILHXJl0R2S1RUgcLYbMQXfEGxC4xd1/O3a/k5PmorMYxS9aj1o1JDgqOuGJM/Hm40aRcDri79ulc063JpQPzScgLszpJRxUXPK5R4YySGGY+RDiIeo+A75jEKvgseo+CLzVnCFCYw52Lojb5KzHGNGp9BM/Qx7I/ggothgO/BCC7pmx82MdwcwSlvbZBPaohnyfPhXA+Lr7PhdaUojIYXpQpxTIPgEkGdjmDKc0xoslzUs1xuZZlTFtsfwYTnmNRkuqxnmm9lutaZqBE5JjWZ5vVM11uZLnQmbKnNWzDnS7jmU7jgk41mt8oxowbNhiNCMeKLAgGahmpIIIa2qBCBbGtRw4Vtj2DJ5zDn13DNL+CCX8IlXxaCQrZeQ3LvtIJURgTwnAstQHzkSr984aoUrooISlAToeoM5nct1DwHA+gLW38zEgBW9J/IDIIWY8LmPjawJ2a5KDT9RUuR+5hGQsqJY/eCdhvVYQNLcQ90QA5Qx2MC6SDlXmjbKQttW+JDgUClhM0VIg5f5OFhF3/TQpoW6zdYOVS0WUjIum3f6J3R/IKrpjLSHzG2/t1oCm+1DiuJrV0rrbSyRswZViI1qizUptIuJWUXbxmcvkHFg06e1hYTkvXUMBl95Slx52Fi+xTwdSCgQKADTQo0R0XLnrgLS0HC1mvIBH/tvtCcW8scoiZ3uOXaDgXA/J4ElfDD+bHZ4ZiJHyjYbwsRMBQgo+XbIqTAtMrsIiGuQgkkNhaJ3qSz6zBds1ujj89VJEn8FkRUoPG+hii/Tsc7dW399mq/qkUMv4U5/BnOgGTpMFpz2YsHVrSMEmURpHLhyvu3xeqTPu8shfk2F1YKHvw2VLgAjDmFKUSaqKE32iWuuVplQ5/e/dEGn36J+4kScogRliBY+cgOUPvMKcaEIR0oV+DOoaVzPmcsnFmMhbpKkaGTsdGllsrbB07tnf3jI+pnij2LhbAkCBiDBw9wO6fEod7IKMTK2wehgmchNjedJOlZmBqkZWstb+LCvtFQ7FbXJSu1ZwY/aVUByHVkLcqo1m4QTLHkrcSQC2FJATHryWoxU44JVYub8WtKmhargQhL0nGyWPkwhm3VRY55UYnDBwM/9DY48APDgccrHg3F6GuO+p8ktsYb3feI9USJzRmuqlix0xT9d0bCuuAn/0XaT+G3MIE/w9h0Y460X3RCOrBm/M4oqMZAyv+wNIlpqi9mkQn26tbwSJkm7wRSBnFFrHmv6CENaVZoIEtKLV6QXiPUfFgzILX0FulGUOSFnyff5O/IV+v5iCCTOwRZ0pymzIRtkCbEhgwFW6duuS7md+iw1Nc8QOVD0ayJsGKo5WNEUyhu025guXoeI4olpJDQfqReuQq41Q1DrC4sxfvC/ZMrBmXPTxFrKcP+d/wSHzdrVkFelJ0HCcQVCnN4Fs7KLNGai15kcNNoWIpPhBWBKpWW43LmcxItapu9F4tIk/dJz9FoqL7YwrDkomeJckuINkstiWuXcnJGmkpta+yM//GRobbO642dj32+6C1s/nGbd8yFpWABC/sjaqMajdkdRpLwmqakF69WZZIEt3ixAtems2Fhp1VNXIMPrstATY6hwAKdS8K4RqV0i47g6WI2M4Xn/J45BxKDot1YFAqS19WUjHKDkteFhKXptj5nW3syWu4RrF0fp/txpMbTIn0s+K4Pm/DWa2Z5kMDv4MEbXIHfywOwRnmtRp9xB9XNo5mCb26lOAF5f/0qkcGA3KxXbur1Y6hYy0pTgynCeA3fGOTQfWgFD/8cpnr2LFkLg3FFBxF4gEmIaGqxGAc6N2MoK2OkCZf6tKJYCbcX4joP8RmO4ddwUQ6wj0ImcTKm6obLNTygoZgI4pipsMY41mOZXVrPGINn9DUT1oKtGSyrMTgVm3sYnPOrgSXMoNEC2JLzs0qvoBtrCb5IRT6OUHIgQ6AP716g8U6WihTX/OXOONtYvspDVd8NpSWncMfTSD7OJuJI1WwElKF9atGSuboY1CgyNJBSVSMmphG6EFFpPQ2vVxX3kFtCS/mtGH2oujCvqrQ+YDjcyuLmopC/y4LKrTWitDLl9SZ2hTtH8i8/X2x/xh0BM6lf/uuT+r2k8ZMC7tXWJP8X0ztNYiV/Wa2kW6tGRSdnNG1WmPHADxjbzMw38hKrAm+X47hTluOzr1XSeqPYlmDbI/OMcnczYOv7RNhqRtdVwwmvlKFO/1vo/s9QSwIYJH+D4r9EYLmVVwhPhHY19H3cC7yv0pD+eFCkNBKOEWGK4dBIuB+sccW8s50Lv3m9WgbBcBar0J5qhJfkf/UDyaLEuNzAeHo/xpM1A0sDqkTHhA+bXrvlH3QPOtA+8Pfbvtc6gO5+1+sG/kFAAna9TGKzCQhBjPKpleidnyoYjJBzpqy+x6QOC7GetppusD0pLckIQZtJ5Z2kss73FAmwuhkVis7EJpEYUeUOa0WDk7RirWi7JofpiJ8jv/yqcM7RRdanmRpLO/4vl6N+UM5NxamHQKwfEY8rG1GYuhH+il78J30hq7We5B+ElbrJ5WJmfRCWtN+i0MTAb7b299tdv8lsHyc9VYHSln2jakv3n/RZw9Nl82ECErJRVcfzDeuRYKXTDYPSjuxtWQ0F/lfFUMda67O3dY0UaY6qbx/q30rDBkyi2dD3H7EhAbfj6SKlDdFQgRShvMdWtsbY16bRt4XtrJggfet1n5iEGSxycRdCDDfJXO9+hTng6BCTcAYzcSVmYQQTEc8iJTqtcLHmApYV1yJVLFxzKt6VxtDXIP6CzxqNpNHYXTQa1m62WuWs0di1duPVajdlvazR2M1Xq93ZanWxWll6C/0zXPMXwroGnH1x2/diYM3pyzsB1/wpfiJZx9o7u0nme4wVGeaMhdf8Mb7GcFtUvYa+NaR6yQhZo2HlA5MPoZ1iB7HQmlBJEa2zzOcJbsGcCGsJ12Ahq9F2nFR52sSZ1BZTUGuTJfjFYF59DLWFwFQbYZaWmmeVpSZKhrUVnajmqXfir81KQeEOYDGAPXafYWmid35ro929TNK6uEPc0eESdq2NqVVWUp2m4XWhfpHb62oE0e3zeFtwjGtSLi23cIbQgpcsJxI0wLEkV4V+Jeex04WZAUEWDrrOeZWpN9Pw6hJHRFNW3o9wKUaF1L/mTsQwSVLTq2zptroovRdFOFFv0WiMt4vRhYy34RN0XKfx8ba5ruKbVrogNyymKfC7aZWo0YGq0whZSgs33YwmW+kNq14im6Of5CsJ8pX77O3v4ywVp8hqjCUuuIZmH5riZ1BjQ9H9rGdR4y5LXPSXbGWbqcSNhpUN5jgs5zRqLzdG7YxGrflMozZqNKw5coQ5LDYbXC/ScAWYc1oAVXbGaC0goomQlUUFlnNt3eol+HwxmxXG9FKvRo36VlGlLbP4NLsQAm3oL/UxCSPJbpqDJ1Zp7lChbWcSqWivsFNQ7jha5AI3S/QYuSVmEqYwyVKB+ibZy9C+epblwmKhqEthMI7SsZihJRXCwXdaVq2ZNUflcqOBPBrZV8mLDTanmgWSPDvXXDCJLWLkGWs08kohci+PQ6Yw29UYrejYZ1uazk0x8cSIiexWYiW0vdDcuqUxhYSJHESf/Hgrs7mQ6toSsFdQyx7cngkVYl1lXfv0uK59yoqKx1w1GukgDZPVKoOcS7ekkMFe+eqgyiMswhTSWk3qfM2nYisvtQ6m43dV2d2o72Mz09ukxKBdKEyUlYlKhkfqCEN5T7Hes1pDXtxZZCZz8X4qs8XZdGO5+XRLyFPu0hy/wf7AozhI4ZDeS/FGPYM9jm2kYxK9Qo+px+Z1r+h8HZsa4sfGChfpskpv6LJ3KkV0sS5isT7CMqcTcM4rkLelISpqYbQ9LhkA0dqZdDxrUtsJBn+TzZD+Rr4U1alrZiFRFSRkZqHPgu/RIIQngu9RC/bMZtT7H/NXeYdx7qRGTY76jPH76zmNV83v4l7m0sIx/5SoqVWQ2B4bxPy7CDc/Jqn52GhYMT9CS2U3W6j5QpHBt0cQ89ICsaBLrBNEW0wV9JQ33xQVFLslblXqT3K7tAKorexwLV3OceWyKoXbJDWVCfM1TUuLu6WQJsWoaGuKmhK42myWXap7QdSidzm/ajTqCfv1z5sspmSvi7TGYLXZwtZkfVtNYmLNZ71662qfYLulvTs8Kb2XJ0Ubw3XMNoKzzSAq74oZ/dMPKc4c6ur5fW3jjsYmHQbbgmBomRVzXRYUWys/uxKvhNaJocyh1eQ1zRlOQ6R8WBfby/oYVamX74seS8selWZHIoHERsPdxOaip3gyKD+wUBb9gAaSdcoQNcKgiQKLfC14QLzXqCzT6Co5i1Qmyd6wDLnTSE6WkRSPs3S8kFKk4+tGw3ot+F8mKfmDRtIrwW8zEe65v4wzKX5ZilNnmckLIZ1llF+65/ke4MuHdy/KNDmJOPkvN7PklFLpNxPtYsxebYVCXQaxCF8LyEXYFk2Y6Z9IhLve/fLTrnfPitDg45LwcP9RSpPklJKcrisKv13Dq3Lj4qUmjQgemRdiLs8F/IGMZmsr4qMoyRAS6hc9lrK5NnbMYJylcXIWxsj3aNJz72sTq7g1nvZ0kzRRr7LJAiU8V4Mo+uZ+AHzXW8fu3WiCdicaYvceBOnE93wod1Vup8nZ9FOkhHwVyYvQX8OMi5Kzrlb3Cot1gW+BAudLPbD+wA091vsiLCLmcA8z7IGRF19Mwj/EmiHWrT+E7bN/SPfV0Z8nx0fPnp68eP3+6a9P3/XuEQiTdSGR9uqiIC6sSyFxvYac9fBgViEX6KpfFFU303PBYIrJrGyB4oL1HpXNUAzKVnwWoOsj/pWWmF3elGoGGlfvhZVBzOC5psMjnPofZ6mS2WwmZK/GtGe4d/hc9DSQ2ZZctBFESJ8E7mr0U/cy+o7kVYxG6LQYs2Lc0aAsmZVAWQDMpbgSqXqMKMQhaMJUrXDXWxshZCepy1il+LM9xYxr88gSqukrnK65qmjiiQAp8sVMhT+Xd721AKlLCWqgasHQQ5LYTVw05BOT2gC8twEFY/yd9mUqUfNLQSaGCpUZ54qR3rUwI0SGXW6/lqdSVbEsnlgChiZ2VJSFh2G1AhrfeuVbVThWplhHfUgv0myZ7tBmwB4rJnVDg6GCXEXjC9wlySY4WMj4Oqtjj1jUxLolCOG/lnPN1tFk8hQJ4vckVyIV0tozEPbAukVpMhTrUm+te1fVhoiE7WEsiJ8msbVHoiCeaGs0PmrDe84/i2oqf6k1nZL1XuJ+6EwogeoWYRWsgRCfsgI0WyPUaHyBMCswj0owjzbBsLXi/IloNJ4XEniNzAxFsN5VJG9r/ge+iQ0HBG9E3efAb+KO04A/hXZm8EAYbwbPBOjEv4o1P5tlp9HsPW2vKDKE9/fB74IHXdiHA+iA70EbfB9aaC/fBL8JAfgt8MFvj0Bp6vtG5q9SB95QIKXTnHUzncK4ODVH0AR4eEi3G+Kh6+JYGvjU4J3kTna/MLRMNvO3wkBnycrihx74gJVtQQeMnb828IdWFzotOOiAH3TBPwjw1CY0uy3Aw537nS74XtACH6WHwGt1oentB9DyDjrQ8Vst6GIWPwi6XfA7mC1otfc7IwbxfYW3oQP7WAGP6tCianhYk6BLlfGwPu0OVqnrUa0wHdas4+naBS3w8ARgMTRzVTM7MIfLE6NL7GmLa7GTpLnClVkW73wTA02n38QP/AuIurYMYi63stcUdSmkdsIKcPcq32ysFy7BhLJiqC+eZ6rY9PV2uUTB+j+oJ3PjZDbDE/mg7PqGcVS5E7gdi1ApWCBLXuJjio8JRc7x9RofF/jA8yJ7cIqvV/g4w8exCPU5xrotj6pvlPuHh8qs7m9vcGY+L9sgGbxFVeAH5EbfEdw7fBzh40SEdZgLVfmRqNH8naPPPDD2ZWR1Dgn+2P7mIEn6G2dCK/MXQ5yKrXGoLNVfmhA/FoUN8QtRGBE/FRwPEk5/kLPchsS0n8v8T8r87wWX5niW4Kl+ey14sl5XxD2pn3V4pIYOncIU/WBwEAaOGK1We3s1KwLTF8jNUR3IJ5UGw5JMx+3hMkFPXjt7trL3dqw9W9p7bG9dWklU1gYbvYunSbzyJHqBYVVwMTyG7q/8hgTcJKvO/6Y18wQDT7iv8Ij+S2Hb5NCk+H5pvlM6OhTCQOcpfG3UKPtUbRgtk0m1hIRWp+2GohM/j4Qt3Oc1+41XAg8zYNIEdMjGI6QF+CIuGPEUMKfNm5DwxPEbBBaE+1EMf8PNSPupsv2R+wcekxHuFzE8VlbCyojnAk83/F7bqbvaQCa1jjRj99UxHaGVN71h/cr3YMRlWS+qi/yLEs/q5CPct8J5XEP2sdrYVez0xeBPPCkc/qmGQbtj6yMutW3Mm9q4fKfsfdADHlJu4S9zfEj4A2GO81rKPkLfGL8cKXTY4h8edu13JXdwXZdYh99mQJzimwhbAbxBdvBbwWfgTxE2g/3OPjxArvEM+cevKLkIFSagVGgGMabp4nRbRKBTAxVm8KpkPyZJotAbhCKoXXiJpcUYleNjho8xPhb4WKrQCWCKrxN8XOPjAh+n+LjCxxk+jvFxg49zfLzFxwd8fMfHO3wc6ar9Jqzg4WeFu8onqqhaEfO4rP5rCj/H2v2OjxcKWfQjfH2K0D7j44kKu/C+aMonjHqNj1f4+Kgb/quwPqliamDuZTS3UENk3f6BsF5iykf4eK5CD7XeX8pswcMnWImfz/qHqrK+/9eyflThBzxJ+sX8/q5/azPC+X82I0DG3+L+fOa+VDyFzH2ueFIc/M/YPYzvbW3WvK/Wtf33KiXNKUtlDUe0oTBVFpkfKaVPJLEa7/peNIg0tqGCWWEyrXeKdFMfCFo5uq4rioO5vwqrjtzqgPIOnmtgCt3EyKEa2bZxs2QylRuxRU5I7oMH2QZ399GXiznNwzNb4uF+PLEDdBgu623ao4i6PUoxZ+ARaCPfoCELT4ZyZNsFzm/NUsc0X6zJEs+YD71BWtq0BSoKxGpmVYFZdb5SDrPRauXh6S/91kuHCU4zYnCNEphgoQdF1JYwkGph4J3iXThSvAknigftLjxW/AS5me3DC3yFpxjfgc+K4yRgBwfwRPGmB+8V9w/gk+J6TMNrxf02vNKpXyru+PBI8eFeKnD3LSFaiOT1Huxpvd2OSCd7sLcHe3GCp1FoiVl9NEFc45WBJM0XcZyME5GqnUtxmRE4LS+WifZG8FzxhbJShSMV3xKFA6/As3/Aeh/V0O+MeAD4sj/iTXrpjvg+rSa+KP5dWVZlp1DQT9Dt3kOPtEBp9rk+M49kwLu1r36rhaefNr4f1L4H7U4vQP8Tte/79e9drxd097fg14ysGfIRrLGpZdMzlWwzBt8UP1fWF8XgDb39rhj8pirz7oK5bBopibqR0q3WS6MkMMDZb5iOQh9lDhQNEsfvZX1J1qEZWwftrgkE7S6rDUyUi21/8xiV7HPtNOiHXM4ujpKirasuXGLhMXE92gjs87jRiO3M8fs8Ybcp+huSZmtsQ6N+twDHr4pIt4vIqAg7pfahCU3CK/5JpVRgIEV3gwqeKwZ/qjpfM01v+wFp+quC6/hGicT4TENxKO3LAZYdIoJrCZFQpPYBVzKdtN/f7xkhRvaDdnsQtNuhZCPqndox56C932v7gZFgPU6eUvBEgPGa4vg1E+o1s/6nCOR/myJKSZ1ZmYI/8CREOVU9KMXsJK68fanVqnyXhUm9b0hbS+AC51/tFk/Lzlm5i9P3eiW/7geiOQhEM5Q96aBiLLtNeWqrYWbbI/TcwhM7XXnr5TSZCctxBOul/8AiAh8S81LYdSd4KHKVov2cR6z8mfqf8NBY+Wb8Sr4ZjYfGZ+rfcdGoO/SZKj004mvNRaOGanw0XkVy+KsCIUFJkBJSCYmETEIsR/yZqqlFpIUHRYt+2625sqv6jcivMsk0hLz6p6C5Fs0wJMkgSVrfnGN9dLZYTQFjq1Svqr/000jHQ7sFgtOvonLJmBgvjfUo46Ux5XHhIOBrpv0LmFPJiQ4VB5bTwvmADkpZuGpUsu6rUcgNZ42/qnu9NeoBl5KTti4mIneN6Vc8u8oKu02rsrf8aoiu0u7QvqnfwTXZiRhYtLQVLm6p45OWdCeCe2hIcyLIDaZ1sZmm3+ddSuXwujVoRJApV3dQgdVwvEZjA8pThU6HCIjf2N8qu6bGkcUgJyh+x5EDi9LqsUzvK/RH5Z4IBtuNIScPDn4rl8kneDTZ8Tss/As4Jln9BBc1bluu/LghWtK6V+G6t8aBi6RftpJ++XHSP9Rm0j9UmZSKeKVDPu5Pk3NIRZh7jgaMY1VH31Jund9ASj5SeKjZ/OqwcF8rxxnBRKf3Nw6BTOVdV2K6Qodmmb9aFY3hJqbRQKH6kKdDWVuoT+SmZoTKpvWQPDzUs2wvOeRYG5zCD/XLVJLB5pE+k23e8PdEsUYjsW3YpSTp5ieGrtKOzLEbHS95AsnhIfd7xZeaDmgua2oQbSrFlftYoMTuvhDuZwG5fvskYMaNVIBV1GoQxT8pciaZG78T3i7PNDaIZNXQtjH1iM9IV3JCFfBYSImeq2ISCvqYqscSvpEp6M8Gtj1DNcEwKfv/BNtF5efKcdCeDVdUyuExJnquCl8wTwWfgayUIAjzl4DhFO73pOMw6poMrbMSnuNcJ/myiIJ0k2ocB5urNT61YFrWzDTbzoYp/pb1tEyrD+k3HQ3Mb2jimY3u2+TIfaQ45X2E6+GCUrGnTTV9ZqZdbEefB6y3UZOitptike5TIIcqumcjjpiBcdnBC/32hOy98e29gKl+ey1gYroI5QUsNqP1nXAf44quGMdDM6BeqZHuVZo9Xinb731ShjIqys/4bDjTLcXU2P4+2gRlfAoT22ZAH58rnkHUJ1empjj0gcM9SPt8SSZRi2HqLEd4EnxWIj1XNs8fWpkdMxgbyqCYsQZq404v+T7d5RN2O8ludetQ4sUdG11Sj2WO0zMBxwH9Zvsjmwc6MMXoicMD0ymTvllwZXyKa+yslzkOCRlpCdTb5WlJ444jR9g+FNxnmnB30feQpdtgZY6JZQ9nmsTARPCMQeo4ZMdG2/BWdazSnDAiVzqIrJ6ugU99p+XymMe2HKZGeYAkx2NKpp2kGvG2kLx0kVh17fA2GaHe5lpZGSk28KAu1iMDoipsaf2A3Cbvo3o5PqkDPAQLOfdgxvchMt5aPI6SsTXjfrMLEW+S1xrU7D5XetIijXe5xEi0I0LSyyI4y7bzPp+tVskuj9FsLurnA5pLCIE2z0NvlycDKyFU176gzvYPWnNTiIV53/d0Vr+r40Id2jfpseoZT3CbLx7UahwmJqKjg5ZpX13jdLGNF8RKVmIFiTzn+zDjLaRJOsVA8Ge8Wa1GIo2JiBwAJrGV8oxgRAYZth330e1Russzkjtn/ZhNslsSL6gtKfZl+fpcFQzG2+WOE5vNdyTagZXuEqH+RV5yTwVVAkRlkQLfMQl9jZ0mBIyFMWK4BhHxXGbobmTwfdhHA/Ba4v1a4v0t6E1cMnFcraTYPdmghr4wNREdHbQMousazsvaphH3mMaYZ6fQZEACn5a5pPn9JzpUJofQuP/pvsIqvkQACSahnRVeEy1O7w4K5M/GIzOaTz8XjBZedLrIfaGG+QhSm1tV2PZHDF3NIC+hcDCCHLchPPRTowVIPVT173PFQivjv5FEYD5nZtOE0hQB6kj+HNkVHtXEwZg4PKYw5cPz58R+IOPHCs0LKBo1fQiJfjWQP+pAUodnFZAUgRTUlh9Si3umWijoUZVeKU2TuHS8knx4+02FryS8Qb3vb/j4Ex8PUAMM+O0lfWvhtxZ+6+K31p1vbfzmd/Bj987HDn5sBvixGeivj7bA6qx+p/61i1/9H2aufcbt8wf0cydBM6glCNobBTQDAhF0MQlqQRGGF7TupsGPVRq0DViPqpXomaxvMz0UjiX6rcFB6NWY0/GW/GxZtEQQ6qtkDeH+KrYWVzey2Ec8VvxYj9BjHJrnYqhsi/adRnpBi1KBUkPVEO6f6KzNlSg1HKtRzZOlieGqLo6fm2UWfX2GqiCcOHC0SVToWzqSPcSw++jz+6fHJ2+fvjt5+vvTV09fv6+f3qssaHF8o2tqYfy2IoyeQm0ISpVS106h+Ee/pPTyQumkJn26mViZxGozcW1zorak0Nok4S7Lncakn5IGL2U4hpOBh0u1pXB4AjmeVUe5c4yoXZDzCB9FlWPhvhED4V4Jjooh90qAUVvdqwSwJeZMWBiUmUncuBIcNRQ/m51RJWwSUqf0m9Q3U+5D8CTTLnuF+145wr3Gx0RhQ2WjQVLXRJmXazWQPA0dn75Jkr0mKLvYtIGKUyE29Rw9HNFPCqlDbPaTcmifeGJ+p+Z3gZ5BJiS9uAtFZTEgOgBpG3wL9waxzUgFR5ZsHLvLvRG6EMxkY+U0R79WNlf6l+DzI1UKTFg+RpqV0jF50haaNu4bIKjVxPRUv/sS4AAiv7L3jhzYGDKKBJmFIrTVa9djvXW5fLhWh48R37tlu/UZju/iEHuo7D5eNrtHH+WAhsl75UhQ/ReK3LW8UEyPxHM8xkN2ft8Fl7ZCJQhmsk1CfHEwCrBD3ut3+lKGKkg6nQZm40nBisLeSWPniBt6nBc+RHa90nH5cTGqdhU6I8XTA2K1agW7XLnfRKPR3i/eOgfF236zeDvwizffKyN9v3ztdDr6tarSkayZSqBHTWMpoa0mamed6oNDV1Rr4qX2e4GnJbkk4aEv3OsCO9eCgRHAifgniJ85nqh8hY9YaUzNEVMU1tR5IQyVCofiX9IvDjr3paAzGDGWlqi6aPpYbliZEC7d30SjgU/3mfoBx8CqVBZXibJNgXg7hP6tH2na1DroUpLYop5drVS/jR69Sy0pmdI4ARHpLrZ+tSLSXYpGYxe54mrV6XQ4T6l7Wrv83pyau4jNT23tsYKn7lIBPhBBuzx1X2oSow6DrayU7qUCT9upFrCxOmfSUuyQn0lLsvuqosur1dY05L5UraBMhC/ErDHMfb/JoPhakVPXtlL3g3C6h4ctFA41G0vdc1QWrFZBP3Vv1MALO/rFD6kSN2oQhE2QK3Ri2NGNJ2YpV3hlCLLIpu/IfzR9OJJWivyvSkMxSAaocmQ6gdlvcK+EvokGdTZFtcHg02D4Dj6T2Grvm3YRR9KE5tFwSqHpmxe/eWDeunh66DfBKGDhq/srts1jtg49w/ZRiLgFxQmcm1ubcQrjuptxEuPwrgFdFo5mik+liTGh0h5qO1brte9Ea/22iT4oe2G7q1qht11ygoqpxWy2WzREK6prKfKNuuVV3TSi7hvByEWoPzDJZ9TeUH91DnoFfRPAojJ/9/uTDWI/SxU0Yg4Kake+T/xoAw3lPgbyTsktTYQFQhxsllY0YgJb9lM3U71CDMOAgx+wpFxZJULAQCe0oPCDkZQcDJukLygC/U0TSCXm8GT9Y/BSg7e53ADOvTXhab+Jo2O/eRcPmnrLl9IJWsEXqGVaAqP6UwMIwGN9gPHvKi+5t1bFKBlSi+2R7se6ykCxXgGwXvEDHyt+4N9fcSnLl//Risufqriuse8Rrn3vB8h+plhRJzsgUmo0rM2q3K1LOUqJM+pKaM5Z8I6K260J+k+zTDOH0KyYuteKXpQRVKo5QnLPjMxXkjAQ0hRyrgZbO+m7ZleiV5hwowTYaFjfa5OhYsXH2mam3sAmxn2hlcBXem/qHA1MJ2qkZWcj09s2lOP2PeJ/16d5Tw/sEqxaa4gLhNiqlafzeGwwaGrx9bn4KXDF/jidBlYsbN6LBa04ryOC5GZ+ojtf46KIoim6hogKbWwbJxiJEjlqHydkIWYletHgkyR0jipWSDm37aTR2Pxl7DbTMvmJwoFhSPj+xD//m/UTcpeD1lSOlTkJNuyCJFA9WVwo3ZaiGYdHCh0j/3Xn0l7jRIF5XOCIJithn0LOkTIZOH2kTMUrYor9/0EdV8g4btTI/abZBu3EBxxvn2mitUUhlHU6HRobcrUKalYYRnSkVDRkmZ7Q9PIWf5T2x0farwA1jPT2rVSEfSs1YVAsE1IWtvVy4BJHsvarhvNvk04LWefS0svaVPcgSms0q0/1DyKLvN1sSLd3eUvhyGiXo9yIImjfG1iBlkYH1t+ztHrUhixk4jYEIQ1pWkGa3oU0vQfStAaJhXWZtLR2uU801Y3XjSIcvRHcwWfJbFH4Y6Ff87BQrDxpoWLw5QS1dSfdhPNNVD5wzgVXCpSrFJf4K83vKxP/QunfI22I9Zu5M+3ERD82ycs9dzQjqbbVKVTunFPoN1FcmarcRFFUrH8eoa2B7yPVDpxmWNPgfd7eBebC/a5t9ie4GyHcU9yqEe4HRUdfJ6pPypgB8S16DT2ISAkGY44qClgQL4MlcQ6Y8mX/RA1OVLiECV+gIniOP7i3fU0veBEHXOjXUS/uo+KINsT7uNUJeX9JuyBLViqTFCyG0o5Hu/xitaJXBz1jX1NgtMsnOhbj5mycpSpJF9oLQ8IDzdjpwiEsMhlxjomTUY8ltk2cgSeQ9mPD+j/hyjDmKW4+5kZNdE/FCx2LpXg0VI3xiPVntMhznOrCw7i/HCzDuML/E4N/a2PbwcxExeaAcG+UGX6ktTnVyjt6q9nzgeQt76DZCVqt1r7RVHq9pm+MM/E4CPdxceXjBYQkOhQGHJvzl/lyoG0diqDvbYWb9Zy+KbAZ9J4qY1NVg6U20xbFkZkxg7lWfH1U5SvahOa1thH0a5NMp3Wfogcvk1znoSgDAW1JFX+vHDKebhod4x9qKFBLSzubynFqFynh1qvfspsPyRIblDaBxpGQK7tp7/f7TRoQszJkZfreFQR8jsYZVsZjxsKMx1zabcj6XNqtRkMN6ttKLIxpH0qzfb21dKoZP7xR5V5XS3+x6h7kiYIJFXrHxAna+9Au9mEcv3xPnRa0jNtGY0NVbaAJ3AqifcIm612UOEVlPVyU+JSOr/0WGlzbfoFi24ccMXRa644v2I0LzVcbjcjMVjUVqoNaWVCknGX01CzmROtaayqi93LD640eIbSuL9W112JAa/uQPFPgLtEnqTeJq/2O15tgVB8P8tWOFry6x/4F8+CKEA2n3pIfbo+YH2lKS+7zSRKbPBF2K0AyMFU6xLtFk6KCTkIyXdFw2U9tA0f7qi1CDCQZ8EqeMNCmqFo3jlMvXcqrViu5W8vADA+KeYvmfMmrj4gmIGIzkkHMoDzk5bS0DUsRbJJpY7cWE4z4P+spfAxjkqKXgG6XpVqmXDIgneSNUUvekGbS9PhUocMtE2mTNl7jpXi9MLFThb/SQXU8wq2U75twZQ2arKDJCposF3acxySt5U7ReZATN8cNx7eCGa3zRB1ycvBHGwf4BbZ2GChObxugndKYZPdxoWq/u7nASgBG9r0xWzc3uHHi5OjsQIu7OUGwkeRyKoZ2DoyzKLJrq4QLnZm2U+r107CVoVUEy019TXXW5TCrnI2Tot/U+rswWyIxWmw9xeMWTRbqFWSLntX+iF60YHCKg5EI3SARTJI+uZyYKprA9RQ1LfD676AYnccU7bkP1Um/GlFJuZ9BHiXv7OBAUiA+qRCf1BCv9xvuwc3GUE9KFpHAJzKsLcGwjfFupX2e4V3DND3g3ODdQWjS5ymjof8aRdQE+Y0e0vVUOLyrYW32WuIaH8XhUIxPZkzisC+xW4ON7d2XW8r3zdW+2RzaXuM+/qklrtxY31qS3+jaUkfpc0eEHHnIi808Wut91toXvew8PFIs/Zu1ZamYNJT3yawwU73CND1gYu+uNGlt+06tVtS2I8XuLD6h2rij8u/du6Nc/qgcrhfKcXB+KJQbtebXDWswIa63MRFpev61ZS5xLNwTJOk7xLf/7sK3pJRH/0uUgsuNojOu6DJM0y3U1oKOTtFq+J36a5KCdp8g6aU2CmjY6ReKlxoYopM+2kmUecliQVfj8Mhk6GNI70mcGfXfFo3SJm3aaJCo4rFCxWXothJaSsTo3SOER1attdQbV1YVW7DOkeoZcr8ifwOb5O47ZfwGwZ8izuiHB0icaFqLU94dtG+S6Kkye8JnejQU2Df1/EmaXRsQJCncgy4NnsH/G8JGEfG55N12AH9Inik6DCt4H70TwUfJY1V3H+v4rErQZPBF8kRnSVMGv5ehLGW9L1IfX+20IMBvOuS3AjDeP75JnqryohYnYCWgN/d+QaDfCjAd8GG/iX47PPRAAm9K+OjoZD/AR7dwTfKbLF19uK77UQJaAuEVfAz+3P7UNB8eSDyE+E0yeEZvbySDXzcS/yFNUpFuReOJ5wNoHfjtJnpUTzH/FzSIo7ffZe3wUppuCuP/CAYiFLbfqVhO9oMkQbdKE6d3d49pgl4IWqjNBa3QxoKk9gnarac4YaJT4SPtNgEvbDrRrwu8u0nCkqduJGFKp+dTdyzxAP3EhBYUmvPUfaszXfPU/a5fL3jqvtOvl7iNLOGUZ45FZi6CwRXP8MTHtcBVGoMzntjarqfN4Jh7cMM9OOcevMUVfmiskXt+uz/WXBaPihUbI8Q9d0QvstHS3bZHh4djGNtc3wAp+WIYNaYjw57PebUBCRH6gDiHscPPQX9Azy2cn7PbnI52mRMhslLh+53GOQE6Lr7BeQMP0J7rEyG98/uqeJu6U8n9TuCZ3YAdsb5b3WObRw1E7TnitVa59V+0/udAa0wsh1Fj8vOYKNt6899v680P26pZ1zEseOacIue66S+KnZobZ0GGCf3rRuOycBZS3MQ5SbRjmh2VZTtxJHdO0akTlNU5KKujp94LqvpbPnfQGwj6ftp2GWLbghlCmA3f2jZdLUj6sp3Ni2jlvYnJl/hbnjk3pUWE7F+w27d8bl84+kYwwaVDllXi368BarJEX/VsW20l1g7NBQ4jUFh0Hf7Fjyp9YSq9LpzzvuUX/w9wRCSl+kGvSJJTEvirkHJ4s0cGQJvRfX87jmn3aVR/Ku9/tKiSX3RaOIZ+QKjoWOBeAsWhajbrJbOtaqSw0TboJLaaAb4YMP6BX4LZLHZGFz3NftHj9K8KX/ywcCMNneFy9qqfafPVD3zc7zd7icM/4BD+cHjYhKhBk8SYkXC0ELS0nAueAbJ5ftZPBmdOYrfDtmMlzhkJZoJf9bPBlZPZQXs/DNr7uOt2hZsRR4JH2rEPngkcl0dn87TaHqgm1Fl9JuQ53vSiBn6r1Qn9Vqu17d3FM85dpjL0O37Xg4kMd33t5WVOr9cSnapIWmaiZxV8nJNHqit8PcOHwMdMhhIifIwxuMDHMT5uKAs+3uLjAyZ5JyvXMB7uxBRB9FUAJ7JwxpIyeIyZlhIdLb7A16f4+CxDVTP/i9Lt65nwltcVXcG6qpkMj1N96Jb2ob0ydZm9dswRU/r1FJ0W0B3X1ZnCtLKb1mb4jEq1iltkGRVvlRfMogHWShT7UtSH05TffiY8P5HhbxLey/CBhE8y/FXCaxmqFF7JMPDgpUSSgEfY9ucybB+guIrZPiJi1jAxcDyE8yfBeUZwRIpwJMHxDzScDsJxfA2oRYA8AuTXPFvN07qvdNxv0DQ1gwjGsABzEzNcwwVcwilcwRkcww2cw1v4AN9LvxUdBu/qgSOeDyZpONUW0zP0QtHu81lvZtvs+3BWHB/TB1n0OZbvQzWMRugxBb8seeJ+kbDgfru36HOflpbfh4tRb4Fa+yS2ln28c2TJF6QXXhRS/5H7UQ6sY75ILR/H1Re8P5of6zcf3xAw98FjoTnUOOZ+b9EfmyLw0nDb1odtxrT3tORjvDvAhxn3a+1IYmuOpyth7nBsE3j9ebEzSPfZz2l7Edd/q5W/yxes+orA3w21LbsGqmG+G87Q0dS74WxkI8w7WEI10jBC5wjZ8F2BsRGPWC9fJsZD4zjCwzvhOX/LM/jAj9xXRrrr0Rc/POdH7hOck47c95JSvCxSTEQcoftRTPJJJ3mtkzySyJEvOG73Ya3HcMNj7KMpx509D67wKNM1ephawhm/dnwyVUdbQfcPObju8+cyvO4/l4z2yesfjlz6hD9sc0MJBbljfp1aGV7TCRMQhvSO3M94CAdLmzkTOMWXKYz5Ka50Tx1+aUQP66LfnzD7tEf9f2OLET+u1runupsNGL930bjssUvymqY3ry4H1kWDXzo+XNj8koXUfNtGinMc7CB9vArpT+Nvhv5usFfWdOwKyeeiccZ2+ZWWKzzOJ42GNeFLBje2rvWUYxPmFOgt+lMbUxBRTe3JCOZ4vpBNbRuI3LBm1ybnf4bgK37RONMDAzvSvhrxKLWmsIQbByPY2tgYXdBpRhpTM2fC8EjgRc+0Z5faY9pILUPiWNaJQ2dkZjTe2LpPcCjeh/j7sV6s5ami/FoP4iXUtrKv77AymGlmFtHtFAPchTzMQ/yx/cOcRXycWmicl4Ko7vYqk/Z1Utz0xbhGw0ePlsX5jaEa4bquR0BiOm3t6BPBRgjT6TQoAuTkP0y8E6HPG9r4jVLroENTELOkk5b7kxFNJBc1YQAuU377O3H1b+VM2m61UEsQXqTwGz7XcPozqaoJ4Sqt3EAbS3qrMEY/FrBrbRjWK/cz2bKgSNZX7lRi1FT2Sdpiq9VulaDrbSXwfcbqpuFnVclcuJ/l4DQNL1OQ/PaLDL21vtft9/rZOXPCFT0ctfopnn9/J4cpskPj7EL7rqnFH5j4rrcZv1/Ed7fhKPebrHnlwiAo943kGST8wNzyizXM1pDTS4JOwk2dEeo8tVA+fCcBvbMiWQr3SMIMBLGwTI8TvD72C25mPZZ8hm/YrmawWZ12L+Htnj4BSonGRdELU3RP4riIYJ5agS60GdBETmVKU6Zyf5M8M6qnCMO/o+3fWrgztGJ5QyeOJD8A4UYY8RtGLCRv6/phGUSOx6l2ulleWPBMbF1dpe8m2HuNjrYuM4muVecLtcfq3jVv0js7sXr03i+DFP55WiQFEL2uVuZwAJ0J2Datd4JeXs5aqAFC55lK4e449qg+dKsPPABRMh6TmJJXlmK9ETA4t/COixyWfAaXuDCs7koxMy+mNpMv0Xuo1+ASDYtuK1CVouUdiUpBQ5KFf7Pd8ducR+yWMn3Q5zQ+CI6+GaV7KY09PL0eW/iDd1x9sDBKA+/6FXB9dIN+3D8lx839XbT8wNqsVpZ1ZHVRUsXVD55aYf9o+tUibpxJKcZqZ0pXxezQRaN7RTHlQgqL6e7yI6vFiqwL45W75lJ/51KoaTa5P/uJ1WJwQSDsLmw1/ILBRd9vr1YXfQxvrzGXSTrJlvpyj7vApXtBfjEvQLrXetPhSnBC3gOl8TiVvO0HjWiAqDsIqe8RnxvCEmI1LDuLYEXQ3dVHcjH4b7e9vd9stTSILQgG7fEsOst3cqHubV7Vvb8qXDp2Gz5Db9EEsdFoGbKyNulli2CCqpVB+M6iYx81yKnk0Y+B3vwAaLMC2gwLvFVAH2ivqxFFuomkyv/rVW9VpbToRCzlHpQddYUdVS83/8vGbBbDwnpOIblStaLbVdHtkOzFTemNhjXlWDRM+zkFcgZTA8YcpMKTG/pEFR3h4KZuDmZjh+WXXBVlwwUxxemP655LXfm02sXAG1imjK71yh0+xc30KSHF4VONnVIQvMKroBBdXtXCTtXCDrYQfY4bUtVcLa/nnnIPxe4Ljg4dp6gyqrX3V2rvlTwsQ7ph6A7KvZI4r10UW1AXjUbe17cU/qdtvahVUAtZ9R5V1KN3mr1fNXsfm42bg/9ms0VabzaGdMnyf7PZsmi2aW+3am83rJWuTV1pIBXViHaLszVYj5LpFTOEHO9cJvkl+ri+h1t9sNgGx3qGpw+vZb9/0PChmKJ8VuPRxVy3qfCrqntguFWVY5laW9PhgVemP6DZeFe689I++63FIOjdOyvoEsu8xP/bZInVqe1KIgmUaYKQ5tyJZLePqyoEXsdgwMgI76wmfpxIvrt7hAqKE3wcWQErl+1lDZqbi/YktvDi+FoVD6BenRMrYHC1OXsFFbROPb4Zbk6lp3gpyA7eUVHvvDWC3EL8QRMrgk3U+Dc0EbFdjoJE3+981XbX27N1rjIpipK0fja/f16kQWnAbvZnC36I/1bV0oo7HxB3LjgyEXWdL6OBrjXlM1IgTetgc4VX0RRstxpdM3yLa6y0nI1/QKcHHSM7tLAZN5IfWW2Gul84sUisOzdRfhFxLLU01AKSjTBTP+h2VqtdSWspzNJvega9GDfYw92gyyi9NnjdC7djdjJZqeTz68vTbJbfK1S8rbPDg4odHuyH5uKvt8jRjmWPGVJ+J9GgFONtezTiRxh7YhlnNT3/oI+feuxOQq8n3Q+4ljjBY8MzfIvw8QGDY8n3aZ2j1zUYu4ZT8z6Wa3hRWxVe8jmt43G14x/AAk5B4mrnBUha7VA5C1wuEeBTfLuzs4ZbBQVZ/lDk2sROxTwPuhvYuZE29pLRkPTmeM+sHB5ZWDwbgTWvTjLg7uJ3fZGi3+mbwTRn7KSeSGPZYM6MjHl5rST6NqwyasYd2PX82CF1cCRmv5XbKDjFu5Q0uUgxF9F9OEBxxdQFjd+nvGkj8wLkFHq68fdr1UFprPmXdUGFmoZi6IaF1jtr/yfy+L59ZO3jt33t1osQNO2X+P932qfPBjiOIdgC5xdrvTEeeAd6cVi5iyBkvkMnl53RvUTlODgz5kl6hm6lnSx2iAfeS2DVgMDlN42Ap7UR8Lk2Ap4UI4DI39fkj22Hp/BZD4An9QHwtBwAn90vemP2PX+Cr4S6mR57pTnKe3Z3jGzurv14mCwk71ABnwg1tVumsXpV/8DrWttemfeFXMNLen9fje4APhGvhNfwSrftZb1tr3XbFpK/0m/RRmvua0vBDX/UCkLKvfPsxrRzEMrKFMDEBl4hbCC/zvu802jM+uRz+haFDrJiWWqNwra+4QWt1GvESFHez/KQuT4P1dgt3oKWxzQbuubzAooZntfMto4s67qCZFMgaDHW79fjscCNZPeUflJPAVhtm1cxeq0/v5OiioHatD+HogGs1JwEXrvqGtO6ZoCfCWd3RMVask7rrynZ7BPfQ8lCcgPDopm26YdaG2NS+lWf+6HUh/Lf4Q2nUq+xbH5kQidlLDa7eH8qtWxSAgwqgEFYzh6R7vnFX/T8X/R49P9rj/+we7asB+7pmLOKVOq95LerxM0Klc27fXP2t31jwLQqMC2j0ZvVWQEJmEtnRjD7RsjkGHCmgLPRd1oRLuVP2vLcaSzCeCcG1tRBbopuOSVarU9ZOKEIU8xVpXyoi7Yb7rOnxj4lG8b68h2JNpmTEToMBNue6J2LCY8drD+Uqoy/B5bVodQEaxKYjays5Y6rmmI18Lyt9UXgte9DcjaMcRqm6szQ69aW/VWVvaPXYW/MaU1aoywdPjNOcZZ4KZjE32Jduyz2HLJqnoqdJaATxHJteKYX3wqWdBIadcC15fm1HEQhLT/RaoPtUp67ylS6L+JHqlS9QjaR+1V79ov2NOoLc2xVfWFeOcBuYPvY3cILTvczxXer4ruh6YVL7kNt5gu8g+qL09z45Hvmk9Mqt5MLTfx687rK+k1rx2m9x81N6bVrmyxty0brwbditVrumvPVVJt+OYV+lgOqOcWERBP0ylYr8spjuntJZpp0pnvLh2rplGjXQutR2k7AF2P9h6c68HCv2YYgM9EPdJ74HA9nlburmoxTfRQGf7hJCmg2Sqexvws67H6IX0tX7ji4MUVP0DkrYc5ZkSErxuPVcsVVDXQXuoX++tnAKhJ5mynIKcc7vOWMCqSyQgujbG7qUtXyHdUIEx6WceiGSxjbsp17C8GkkOpDMLW2YczGUU+0IRfVMENrKUeR0RRDb7KF025Dh74HTqvY9104tKWDYxn7zTigW/x4WBe+burj957il6b4pTb7x/QnwiZNzqDTIvdBNRlt4AfdMs4sBVYr0j+YBEG7gycVsesXZFCypOelPgek3/G4wSVHO+DL2vYnUWHlc5zYSi5NbGiuf0jr3ho3DKZP0cxF32Z2ioYlpYN+ICCnEGw7b/zJ7KfDQAfNrH06bOqwNnAqwLe2wJ9bxmWFtsmeCzo/fi3IbHtcmm3nulsjLt0jdE2N6K/5bLSQk020Td1c8Fjb0M3II6J28afN7paC57gwEKTzRwO6mvdFi91GeuOv5qzQqlS61QXyx2kvdxyIjMdVvJ2DoT0v+uImA17P2BqXHukKN/k9YcSimmu4msNNbWEomFM7ZHOC3wmqQJvCWrMfW+bDfmOMn/Yb4/otXDWLNL1fP3CCUFsLvtW3fnTgQ3rffYjc74Dib1NzH6JK0Vc0vcq0dtWGvtjEXDkhoMXIjbfJYm5wNO4iGVujcT/BrIx1i6TljTKqj1umjlNYLJoEeCuVXn5Swn7p0m+ngJDPaQlnnPTX7on6RtfQSjETUU53Em+WeWha1WhsVFts7Dx/r5kcIMwPqdUM4G1Kt3wtZrPaAQYqAW81dqsiizuS69X6U1i3dH2vxW7XoIo7b60EtCfmXVnZOMSppU8N5qmlCs/kqZ5vakT5TFh7eD/6ThwlMzEJd/ZstAvheLWn0tcIxVzicce8cKqfHybFnQoFxk1vFvFODuYuvhlPKp6YQ25LLefFOMRmEOMQ8yDGITYrgGKovDwGLQRSbEqC58RoXxyHrIQYhyxmvUa2arIWU+wstWI0TM3LT05sJuS87xWz4S66xrmN0lDWD+jkDEwvhHQPllitLMF30dVF0TsSnZP3EozMateir0sk+3eRPJfZWKA1A11HTGhex0kazWbXt8lqhcr39TpHj85riGdITknRpxsX3WJflNZrGxiKCwxlGkOZxlD2IwxleIq/hqHsv46hGCOTLQyhx66ahusupggryU1EY+M+dMUFujR1CnecWllB4jGReLwFU6STGoXH6Fu+xmfTzev9fjTMyotXVdkk4UZpodZiVQ1FiQhWdie7xUKRjx7dzz73JiKeRUrsVbbXRRXv/7p3dpPM9/A66KYfFt8dGS0pzvHboY+O7VWjsZcuLk+FxBu6r+coD6N0dSVmA/OLxqoGAd9T6zZOqWPr98DhFcOVO4tjwemiUKBb2CBPQ4HJSdTlXUjxkEvC36Gvl9LhSKytC3drljN03A6XEnuAjnm1P1f0d9RPifbRdsbx2/20ypJyJ9XCYtr323RdQwCpw/2O1nP3k9Uq6R+sVt1d9JnU7aerVUp2Hl4fjcvwk9fPVqus31qtutyM1rgqQcdZKT/Q1vm5bmrR+ByPsx+jRJC7N3jlb45umloB5OjpJ4a85ionR0OTFHIjn2MQcvdPwTHG8SF3Hwie2PuQu89MigeY4ldM8UynEIpbGF1etAp5bYEQPMxJMs5dVd7zV8TIWswzisElAeRuqrCsxO5Ajg6DCpOnh/gFk2WK6wAV1WggcHxKer4SAytHB0P4WmPuJvMjrHuibJP/d8GbD+kjGgnl7g06vMndc7yFI3efKC6hdmlczSeLQTe5REIRBA/847H5C321kaYaEqoDMPaDCr35Gc9E6KUI0CqQltGKvDAp8sKEjpR4wNEUTQza+3gjLcnyRRRtDod6w1ahzyon0FUkav1IzgpKv0l9/kmx+jmiT4V/GuOZRl9Kak5yfxT1m03vJNdSBGYwLtG+UGFfqsLMja11CDqqhPLlTqFf7hR6J8udgv9Q+haLWsHv7xb8vg6FLlbaKPgPdbfgrSz1gtEVDDe3q5LjF3O/6je8XRDwGgH4rOC1Psn9pZb0S5n0Dd5rB3htbpHu91q6P9TGla0fMeV7hTdAbN6YpW/U8rTHmTWz0LcaOZwpeYCneRUSBTqq4HiD6VsB5+a4+jvFr+RQkHu338iFRi3iDUZ8qEX8iRHfaxEPtNc6qsi08O1HP4vy0DSdZTcnp89KxwK0DnaPReFgCK+hME7koLgs3GkxIIdj4LQYC50WrZ1T6IKELspMszR8IWGchk/lmq1p0uuRmLuUiYpOZyhMFK9GvBfRxHwoXt15MhfvpzJbnE0tnF9xHjz5m3mvEF6tjciSOfz9dFdEdlq16E7ot//VyY1OQO36m/NbNRnXDEq3pzTDmYw/MAf3T0telmq45C3kGCeGVM8gdIYsGWhrEH2GSvJtt5GlPerG9GmOKaNXa+RPjt8p/Vs7AToqRZ+p0tQDFHeUsdvhbdtS/X6L6QS7PrS6fZqA8YQq6xUubEnhVcMgJunqmTTRfLmmvcIjKaiE0k4EU+2lTjvDIw3RB8EV3OXx5TLTKhn5W83Iv+sf0vr8RL5qilDuqazNE6p2J4HfKOaBKYrO1MAK8YrMZ3y8ONr8XtMOkEKLT0pNS2BzI/dEzIQSO+geD53t6dqe6B+ydj5Bg+6ofPtQvi2lFpj1/pLhL7Un+umVevThiLxJcUSep2vDiDYHpPrRgFR/OSB7uZjFLq7+XmWTxUxwzdCk4Eeo/UgEP0nXa9b7P/8X"));if(i){const t=new Blob([m],{type:v});return URL.createObjectURL(t)}return "data:"+v+";base64,"+(t=>{let r="";const f=t.length;let o=0;for(;f>o+2;o+=3){const f=t[o]<<16|t[o+1]<<8|t[o+2];r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+a[63&f];}const n=f-o;if(1===n){const f=t[o]<<16;r+=a[f>>18&63]+a[f>>12&63]+"==";}else if(2===n){const f=t[o]<<16|t[o+1]<<8;r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+"=";}return r})(m)}});}
206
+ function setDefaultConfiguration(configuration) {
207
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
208
+ const propertyValue = configuration[propertyName];
209
+ if (propertyValue !== UNDEFINED_VALUE) {
210
+ DEFAULT_CONFIGURATION[propertyName] = propertyValue;
211
+ }
212
+ }
213
+ configure(configuration);
214
+ }
215
+
216
+ function resetConfiguration() {
217
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
218
+ delete config[propertyName];
219
+ }
220
+ Object.assign(config, DEFAULT_CONFIGURATION);
221
+ }
222
+
223
+ const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],e=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const b=new Uint8Array(30).fill(5);function l(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;15>=n;n++)t[n+1]=t[n]+e[n];const f=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(f[t[n[e]]++]=e);return {o:e,symbols:f}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",z=(c=>{let i=0,v=0,z=0,K=new Uint8Array(1024),u=0,j=0;for(;!j;){j=T(1);const n=T(2);if(0==n)s();else if(1==n)x(l(r),l(b));else {if(2!=n)throw Error("invalid deflate block type");x(...D());}}return K.subarray(0,u);function m(){if(i>=c.length)throw Error("unexpected end of deflate data");return c[i++]}function T(n){for(;n>z;)v|=m()<<z,z+=8;const e=v&(1<<n)-1;return v>>>=n,z-=n,e}function s(){v=0,z=0;const n=m()|m()<<8;i+=2,w(u+n);for(let e=0;n>e;e++)K[u++]=m();}function x(o,r){let b=F(o);for(;256!=b;){if(256>b)w(u+1),K[u++]=b;else {const o=b-257,l=n[o]+T(e[o]),c=F(r),i=t[c]+T(f[c]);w(u+l);const v=u-i;for(let n=0;l>n;n++)K[u++]=K[v+n];}b=F(o);}}function D(){const n=T(5)+257,e=T(5)+1,t=T(4)+4,f=new Uint8Array(19);for(let n=0;t>n;n++)f[o[n]]=T(3);const r=l(f),b=new Uint8Array(n+e);let c=0;for(;c<b.length;){const n=F(r);if(16>n)b[c++]=n;else if(16==n){const n=b[c-1];let e=T(2)+3;for(;e--;)b[c++]=n;}else c+=17==n?T(3)+3:T(7)+11;}return [l(b.subarray(0,n)),l(b.subarray(n))]}function F(n){const{o:e,symbols:t}=n;let f=0,o=0,r=0;for(let n=1;15>=n;n++){f|=T(1);const b=e[n];if(b>f-o)return t[r+(f-o)];r+=b,o=o+b<<1,f<<=1;}throw Error("invalid huffman code")}function w(n){if(K.length<n){let e=2*K.length;for(;n>e;)e*=2;const t=new Uint8Array(e);t.set(K.subarray(0,u)),K=t;}}})((n=>{const e=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let f=0;e>f;f+=4){const e=c.indexOf(n[f])<<18|c.indexOf(n[f+1])<<12|(63&c.indexOf(n[f+2]))<<6|63&c.indexOf(n[f+3]);t.push(e>>16&255),"="!==n[f+2]&&t.push(e>>8&255),"="!==n[f+3]&&t.push(255&e);}return new Uint8Array(t)})("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"));if(i){const n=new Blob([z],{type:v});return URL.createObjectURL(n)}return "data:"+v+";base64,"+(n=>{let e="";const t=n.length;let f=0;for(;t>f+2;f+=3){const t=n[f]<<16|n[f+1]<<8|n[f+2];e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+c[63&t];}const o=t-f;if(1===o){const t=n[f]<<16;e+=c[t>>18&63]+c[t>>12&63]+"==";}else if(2===o){const t=n[f]<<16|n[f+1]<<8;e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+"=";}return e})(z)}});}
205
224
 
206
225
  /*
207
226
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -385,6 +404,50 @@
385
404
  }
386
405
  }
387
406
 
407
+ /*
408
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
409
+
410
+ Redistribution and use in source and binary forms, with or without
411
+ modification, are permitted provided that the following conditions are met:
412
+
413
+ 1. Redistributions of source code must retain the above copyright notice,
414
+ this list of conditions and the following disclaimer.
415
+
416
+ 2. Redistributions in binary form must reproduce the above copyright
417
+ notice, this list of conditions and the following disclaimer in
418
+ the documentation and/or other materials provided with the distribution.
419
+
420
+ 3. The names of the authors may not be used to endorse or promote products
421
+ derived from this software without specific prior written permission.
422
+
423
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
424
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
425
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
426
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
427
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
428
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
429
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
430
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
431
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
432
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
433
+ */
434
+
435
+
436
+ function concat(first, second) {
437
+ const result = new Uint8Array(first.length + second.length);
438
+ result.set(first);
439
+ result.set(second, first.length);
440
+ return result;
441
+ }
442
+
443
+ function toExactUint8Array(array) {
444
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
445
+ }
446
+
447
+ function getDataView(array) {
448
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
449
+ }
450
+
388
451
  // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
389
452
 
390
453
  // deno-lint-ignore-file no-this-alias
@@ -1489,16 +1552,6 @@
1489
1552
  }
1490
1553
  }
1491
1554
 
1492
- function concat(leftArray, rightArray) {
1493
- let array = leftArray;
1494
- if (leftArray.length + rightArray.length) {
1495
- array = new Uint8Array(leftArray.length + rightArray.length);
1496
- array.set(leftArray, 0);
1497
- array.set(rightArray, leftArray.length);
1498
- }
1499
- return array;
1500
- }
1501
-
1502
1555
  function expand(inputArray, length) {
1503
1556
  if (length && length > inputArray.length) {
1504
1557
  const array = inputArray;
@@ -1760,44 +1813,34 @@
1760
1813
  constructor() {
1761
1814
  // deno-lint-ignore prefer-const
1762
1815
  let stream;
1763
- let headerLeft = GZIP_HEADER_LENGTH;
1764
- let tail = new Uint8Array(0);
1816
+ let headerBytesLeft = GZIP_HEADER_LENGTH;
1817
+ let trailerCandidate = new Uint8Array(0);
1765
1818
  super({
1766
1819
  transform(chunk, controller) {
1767
- if (headerLeft) {
1768
- const dropped = Math.min(headerLeft, chunk.length);
1769
- headerLeft -= dropped;
1770
- chunk = chunk.subarray(dropped);
1820
+ if (headerBytesLeft) {
1821
+ const droppedLength = Math.min(headerBytesLeft, chunk.length);
1822
+ headerBytesLeft -= droppedLength;
1823
+ chunk = chunk.subarray(droppedLength);
1771
1824
  if (!chunk.length) {
1772
1825
  return;
1773
1826
  }
1774
1827
  }
1775
- const available = tail.length + chunk.length;
1776
- if (available <= GZIP_TRAILER_LENGTH) {
1777
- const pending = new Uint8Array(available);
1778
- pending.set(tail);
1779
- pending.set(chunk, tail.length);
1780
- tail = pending;
1828
+ const availableLength = trailerCandidate.length + chunk.length;
1829
+ if (availableLength <= GZIP_TRAILER_LENGTH) {
1830
+ trailerCandidate = concat(trailerCandidate, chunk);
1781
1831
  return;
1782
1832
  }
1783
- const emitLength = available - GZIP_TRAILER_LENGTH;
1784
- const output = new Uint8Array(emitLength);
1785
- const fromTail = Math.min(emitLength, tail.length);
1786
- output.set(tail.subarray(0, fromTail), 0);
1787
- if (emitLength > fromTail) {
1788
- output.set(chunk.subarray(0, emitLength - fromTail), fromTail);
1789
- }
1790
- controller.enqueue(output);
1791
- const nextTail = new Uint8Array(GZIP_TRAILER_LENGTH);
1792
- const tailRemaining = tail.length - fromTail;
1793
- if (tailRemaining) {
1794
- nextTail.set(tail.subarray(fromTail), 0);
1795
- }
1796
- nextTail.set(chunk.subarray(emitLength - fromTail), tailRemaining);
1797
- tail = nextTail;
1833
+ const emitLength = availableLength - GZIP_TRAILER_LENGTH;
1834
+ const emittedFromTrailer = Math.min(emitLength, trailerCandidate.length);
1835
+ controller.enqueue(concat(
1836
+ trailerCandidate.subarray(0, emittedFromTrailer),
1837
+ chunk.subarray(0, emitLength - emittedFromTrailer)));
1838
+ trailerCandidate = concat(
1839
+ trailerCandidate.subarray(emittedFromTrailer),
1840
+ chunk.subarray(emitLength - emittedFromTrailer));
1798
1841
  },
1799
1842
  flush() {
1800
- const dataView = new DataView(tail.buffer, tail.byteOffset, tail.byteLength);
1843
+ const dataView = getDataView(trailerCandidate);
1801
1844
  stream.signature = dataView.getUint32(0, true);
1802
1845
  stream.uncompressedSize = dataView.getUint32(4, true);
1803
1846
  }
@@ -1972,7 +2015,7 @@
1972
2015
  */
1973
2016
 
1974
2017
 
1975
- const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
2018
+ const DEFAULT_CHUNK_SIZE = 64 * 1024;
1976
2019
  const MESSAGE_EVENT_TYPE = "message";
1977
2020
  const MESSAGE_START = "start";
1978
2021
  const MESSAGE_PULL = "pull";
@@ -2040,33 +2083,54 @@
2040
2083
  class ChunkStream extends TransformStream {
2041
2084
 
2042
2085
  constructor(chunkSize) {
2043
- let pendingChunk;
2086
+ const pendingChunks = [];
2087
+ let pendingLength = 0;
2044
2088
  if (!(chunkSize >= 1)) {
2045
- chunkSize = DEFAULT_CHUNK_SIZE$1;
2089
+ chunkSize = DEFAULT_CHUNK_SIZE;
2046
2090
  }
2047
2091
  super({
2048
- transform,
2092
+ transform(chunk, controller) {
2093
+ pendingChunks.push(chunk);
2094
+ pendingLength += chunk.length;
2095
+ while (pendingLength > chunkSize) {
2096
+ controller.enqueue(shiftChunk());
2097
+ }
2098
+ },
2049
2099
  flush(controller) {
2050
- if (pendingChunk && pendingChunk.length) {
2051
- controller.enqueue(pendingChunk);
2100
+ if (pendingLength) {
2101
+ controller.enqueue(concatChunks(pendingChunks, pendingLength));
2052
2102
  }
2053
2103
  }
2054
2104
  });
2055
2105
 
2056
- function transform(chunk, controller) {
2057
- if (pendingChunk) {
2058
- const newChunk = new Uint8Array(pendingChunk.length + chunk.length);
2059
- newChunk.set(pendingChunk);
2060
- newChunk.set(chunk, pendingChunk.length);
2061
- chunk = newChunk;
2062
- pendingChunk = null;
2106
+ function shiftChunk() {
2107
+ const result = new Uint8Array(chunkSize);
2108
+ let resultOffset = 0;
2109
+ while (resultOffset < chunkSize) {
2110
+ const firstChunk = pendingChunks[0];
2111
+ const remainingLength = chunkSize - resultOffset;
2112
+ if (firstChunk.length <= remainingLength) {
2113
+ result.set(firstChunk, resultOffset);
2114
+ resultOffset += firstChunk.length;
2115
+ pendingChunks.shift();
2116
+ } else {
2117
+ result.set(firstChunk.subarray(0, remainingLength), resultOffset);
2118
+ pendingChunks[0] = firstChunk.subarray(remainingLength);
2119
+ resultOffset += remainingLength;
2120
+ }
2063
2121
  }
2122
+ pendingLength -= chunkSize;
2123
+ return result;
2124
+ }
2125
+
2126
+ function concatChunks(chunks, length) {
2127
+ const result = new Uint8Array(length);
2064
2128
  let offset = 0;
2065
- while (chunk.length - offset > chunkSize) {
2066
- controller.enqueue(chunk.slice(offset, offset + chunkSize));
2067
- offset += chunkSize;
2129
+ for (const chunk of chunks) {
2130
+ result.set(chunk, offset);
2131
+ offset += chunk.length;
2068
2132
  }
2069
- pendingChunk = offset ? chunk.slice(offset) : chunk;
2133
+ return result;
2070
2134
  }
2071
2135
  }
2072
2136
  }
@@ -2248,7 +2312,10 @@
2248
2312
  }
2249
2313
  }
2250
2314
  codecStream = new CodecStream(options, config);
2251
- await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true });
2315
+ await readable
2316
+ .pipeThrough(codecStream)
2317
+ .pipeThrough(new ChunkStream(getChunkSize(config)))
2318
+ .pipeTo(writable, { preventClose: true, preventAbort: true });
2252
2319
  const {
2253
2320
  signature,
2254
2321
  inputSize,
@@ -2447,7 +2514,7 @@
2447
2514
  const { value, readable, writable } = message;
2448
2515
  const transferables = [];
2449
2516
  if (value) {
2450
- message.value = value.byteOffset || value.byteLength != value.buffer.byteLength ? new Uint8Array(value) : value;
2517
+ message.value = toExactUint8Array(value);
2451
2518
  transferables.push(message.value.buffer);
2452
2519
  }
2453
2520
  if (transferStreams && transferStreamsSupported) {
@@ -2571,8 +2638,8 @@
2571
2638
  const { options, config } = workerOptions;
2572
2639
  const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
2573
2640
  const { workerURI, maxWorkers } = config;
2574
- workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE;
2575
- const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams;
2641
+ workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
2642
+ const streamCopy = !compressed && !signed && !encrypted;
2576
2643
  workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2577
2644
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
2578
2645
  options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
@@ -2706,6 +2773,7 @@
2706
2773
 
2707
2774
  const ERR_HTTP_STATUS = "HTTP error ";
2708
2775
  const ERR_HTTP_RANGE = "HTTP Range not supported";
2776
+ const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
2709
2777
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
2710
2778
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
2711
2779
 
@@ -2716,13 +2784,15 @@
2716
2784
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
2717
2785
  const HTTP_HEADER_RANGE = "Range";
2718
2786
  const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
2787
+ const HTTP_HEADER_ETAG = "Etag";
2788
+ const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
2719
2789
  const HTTP_METHOD_HEAD = "HEAD";
2720
2790
  const HTTP_METHOD_GET = "GET";
2721
2791
  const HTTP_RANGE_UNIT = "bytes";
2722
- const DEFAULT_CHUNK_SIZE = 64 * 1024;
2723
2792
  const DEFAULT_BUFFER_SIZE = 256 * 1024;
2724
2793
 
2725
2794
  const PROPERTY_NAME_WRITABLE = "writable";
2795
+ const DISK_BOUNDARY = Symbol();
2726
2796
 
2727
2797
  class Stream {
2728
2798
 
@@ -2741,13 +2811,13 @@
2741
2811
  return this.createReadable();
2742
2812
  }
2743
2813
 
2744
- createReadable({ offset = 0, size, diskNumberStart, chunkSize = DEFAULT_CHUNK_SIZE } = {}) {
2814
+ createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
2745
2815
  const reader = this;
2746
2816
  let chunkOffset = 0;
2747
2817
  return new ReadableStream({
2748
2818
  async pull(controller) {
2749
2819
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
2750
- const data = await readUint8Array(reader, offset + chunkOffset, dataSize, diskNumberStart);
2820
+ const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
2751
2821
  controller.enqueue(data);
2752
2822
  if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
2753
2823
  controller.close();
@@ -2769,7 +2839,7 @@
2769
2839
  if (!writer.initialized) {
2770
2840
  throw new Error(ERR_WRITER_NOT_INITIALIZED);
2771
2841
  }
2772
- return writer.writeUint8Array(chunk);
2842
+ return writer.writeUint8Array(toExactUint8Array(chunk));
2773
2843
  }
2774
2844
  });
2775
2845
  Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
@@ -2856,6 +2926,27 @@
2856
2926
  }
2857
2927
  }
2858
2928
 
2929
+ let blobSliceReliable;
2930
+ let blobSliceProbe;
2931
+
2932
+ function probeBlobSliceReliability() {
2933
+ blobSliceProbe = (async () => {
2934
+ try {
2935
+ const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
2936
+ const streamReader = slicedBlob.stream().getReader();
2937
+ let streamedLength = 0;
2938
+ let result = await streamReader.read();
2939
+ while (!result.done) {
2940
+ streamedLength += result.value.length;
2941
+ result = await streamReader.read();
2942
+ }
2943
+ blobSliceReliable = streamedLength == 1;
2944
+ } catch {
2945
+ blobSliceReliable = false;
2946
+ }
2947
+ })();
2948
+ }
2949
+
2859
2950
  class BlobReader extends Reader {
2860
2951
 
2861
2952
  constructor(blob) {
@@ -2864,14 +2955,32 @@
2864
2955
  blob,
2865
2956
  size: blob.size
2866
2957
  });
2958
+ if (!blobSliceProbe) {
2959
+ probeBlobSliceReliability();
2960
+ }
2961
+ }
2962
+
2963
+ createReadable(options) {
2964
+ const reader = this;
2965
+ const { blob, size } = reader;
2966
+ const { offset = 0, size: readSize = size - offset } = options || {};
2967
+ if (!offset && readSize >= size) {
2968
+ return blob.stream();
2969
+ }
2970
+ if (blobSliceReliable) {
2971
+ return blob.slice(offset, offset + readSize).stream();
2972
+ }
2973
+ return super.createReadable(options);
2867
2974
  }
2868
2975
 
2869
2976
  async readUint8Array(offset, length) {
2870
2977
  const reader = this;
2871
2978
  const offsetEnd = offset + length;
2872
- const blob = offset || offsetEnd < reader.size ? reader.blob.slice(offset, offsetEnd) : reader.blob;
2979
+ const readsWholeBlob = !offset && offsetEnd >= reader.size;
2980
+ const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
2873
2981
  let arrayBuffer = await blob.arrayBuffer();
2874
- if (arrayBuffer.byteLength > length) {
2982
+ const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
2983
+ if (sliceIgnoredByBuggyImplementation) {
2875
2984
  arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
2876
2985
  }
2877
2986
  return new Uint8Array(arrayBuffer);
@@ -2952,6 +3061,18 @@
2952
3061
  super.init();
2953
3062
  }
2954
3063
 
3064
+ createReadable(options) {
3065
+ const reader = this;
3066
+ const { useRangeHeader, forceRangeRequests, size } = reader;
3067
+ if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3068
+ const { offset = 0, size: readSize = size - offset } = options || {};
3069
+ if (readSize > 0 && offset < size) {
3070
+ return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3071
+ }
3072
+ }
3073
+ return super.createReadable(options);
3074
+ }
3075
+
2955
3076
  readUint8Array(index, length) {
2956
3077
  return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
2957
3078
  }
@@ -2980,6 +3101,7 @@
2980
3101
  useRangeHeader,
2981
3102
  forceRangeRequests,
2982
3103
  combineSizeEocd,
3104
+ checkResourceChanges = true,
2983
3105
  fetch
2984
3106
  } = options;
2985
3107
  options = Object.assign({}, options);
@@ -2987,6 +3109,7 @@
2987
3109
  delete options.useRangeHeader;
2988
3110
  delete options.forceRangeRequests;
2989
3111
  delete options.combineSizeEocd;
3112
+ delete options.checkResourceChanges;
2990
3113
  delete options.useXHR;
2991
3114
  delete options.fetch;
2992
3115
  Object.assign(httpReader, {
@@ -2996,6 +3119,7 @@
2996
3119
  useRangeHeader,
2997
3120
  forceRangeRequests,
2998
3121
  combineSizeEocd,
3122
+ checkResourceChanges,
2999
3123
  fetch
3000
3124
  });
3001
3125
  }
@@ -3020,17 +3144,8 @@
3020
3144
  httpReader.eocdCache = eocdCache;
3021
3145
  }
3022
3146
  }
3023
- let contentSize;
3024
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3025
- if (contentRangeHeader) {
3026
- const splitHeader = contentRangeHeader.trim().split(/\s*\/\s*/);
3027
- if (splitHeader.length) {
3028
- const headerValue = splitHeader[1];
3029
- if (headerValue && headerValue != "*") {
3030
- contentSize = Number(headerValue);
3031
- }
3032
- }
3033
- }
3147
+ setResourceValidators(httpReader, response);
3148
+ const contentSize = getContentRangeSize(response);
3034
3149
  if (contentSize === UNDEFINED_VALUE) {
3035
3150
  await getContentLength(httpReader, sendRequest, getRequestData);
3036
3151
  } else {
@@ -3071,6 +3186,8 @@
3071
3186
  throw new Error(ERR_HTTP_RANGE);
3072
3187
  }
3073
3188
  }
3189
+ checkResourceValidators(httpReader, response);
3190
+ setResourceValidators(httpReader, response);
3074
3191
  const data = new Uint8Array(await response.arrayBuffer());
3075
3192
  if (data.length != length) {
3076
3193
  throw new Error(ERR_HTTP_RANGE);
@@ -3082,7 +3199,97 @@
3082
3199
  if (!data) {
3083
3200
  await getRequestData(httpReader, options);
3084
3201
  }
3085
- return new Uint8Array(httpReader.data.subarray(index, index + length));
3202
+ return httpReader.data.subarray(index, index + length);
3203
+ }
3204
+ }
3205
+
3206
+ function createRangeReadable(httpReader, offset, size) {
3207
+ let bodyReader;
3208
+ let remainingLength = size;
3209
+ return new ReadableStream({
3210
+ async start() {
3211
+ const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, offset, size));
3212
+ if (response.status != 206) {
3213
+ throw new Error(ERR_HTTP_RANGE);
3214
+ }
3215
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3216
+ if (contentRangeHeader) {
3217
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3218
+ if (!Number.isNaN(rangeStart) && rangeStart != offset) {
3219
+ throw new Error(ERR_HTTP_RANGE);
3220
+ }
3221
+ }
3222
+ checkResourceValidators(httpReader, response);
3223
+ setResourceValidators(httpReader, response);
3224
+ bodyReader = response.body.getReader();
3225
+ },
3226
+ async pull(controller) {
3227
+ const { value, done } = await bodyReader.read();
3228
+ if (done) {
3229
+ if (remainingLength) {
3230
+ throw new Error(ERR_HTTP_RANGE);
3231
+ }
3232
+ controller.close();
3233
+ } else {
3234
+ const chunk = value.length > remainingLength ? value.subarray(0, remainingLength) : value;
3235
+ remainingLength -= chunk.length;
3236
+ if (chunk.length) {
3237
+ controller.enqueue(chunk);
3238
+ }
3239
+ if (!remainingLength) {
3240
+ controller.close();
3241
+ await bodyReader.cancel();
3242
+ }
3243
+ }
3244
+ },
3245
+ cancel(reason) {
3246
+ return bodyReader && bodyReader.cancel(reason);
3247
+ }
3248
+ });
3249
+ }
3250
+
3251
+ function getContentRangeSize(response) {
3252
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3253
+ if (contentRangeHeader) {
3254
+ const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
3255
+ if (headerValue && headerValue != "*") {
3256
+ const contentSize = Number(headerValue);
3257
+ if (!Number.isNaN(contentSize)) {
3258
+ return contentSize;
3259
+ }
3260
+ }
3261
+ }
3262
+ }
3263
+
3264
+ function getResourceValidators({ headers }) {
3265
+ return {
3266
+ etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
3267
+ lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
3268
+ };
3269
+ }
3270
+
3271
+ function setResourceValidators(httpReader, response) {
3272
+ const { checkResourceChanges, resourceValidators } = httpReader;
3273
+ if (checkResourceChanges && !resourceValidators && response.status == 206) {
3274
+ httpReader.resourceValidators = getResourceValidators(response);
3275
+ }
3276
+ }
3277
+
3278
+ function checkResourceValidators(httpReader, response) {
3279
+ const { checkResourceChanges, resourceValidators, size } = httpReader;
3280
+ if (checkResourceChanges) {
3281
+ const contentRangeSize = getContentRangeSize(response);
3282
+ if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
3283
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3284
+ }
3285
+ if (resourceValidators) {
3286
+ const validators = getResourceValidators(response);
3287
+ const changed = Object.entries(resourceValidators).some(([name, value]) =>
3288
+ value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
3289
+ if (changed) {
3290
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3291
+ }
3292
+ }
3086
3293
  }
3087
3294
  }
3088
3295
 
@@ -3193,6 +3400,10 @@
3193
3400
  super.init();
3194
3401
  }
3195
3402
 
3403
+ createReadable(options) {
3404
+ return this.reader.createReadable(options);
3405
+ }
3406
+
3196
3407
  readUint8Array(index, length) {
3197
3408
  return this.reader.readUint8Array(index, length);
3198
3409
  }
@@ -3273,25 +3484,26 @@
3273
3484
  const reader = this;
3274
3485
  const { readers } = reader;
3275
3486
  reader.lastDiskNumber = 0;
3276
- reader.lastDiskOffset = 0;
3277
- await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
3278
- await initStream(diskReader);
3279
- if (indexDiskReader != readers.length - 1) {
3280
- reader.lastDiskOffset += diskReader.size;
3281
- }
3487
+ await Promise.all(readers.map(diskReader => initStream(diskReader)));
3488
+ reader.diskOffsets = readers.map(diskReader => {
3489
+ const diskOffset = reader.size;
3282
3490
  reader.size += diskReader.size;
3283
- }));
3491
+ return diskOffset;
3492
+ });
3284
3493
  super.init();
3285
3494
  }
3286
3495
 
3287
- async readUint8Array(offset, length, diskNumber = 0) {
3496
+ getDiskOffset(diskNumber) {
3497
+ const { diskOffsets, size } = this;
3498
+ const diskOffset = diskOffsets.at(diskNumber);
3499
+ return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
3500
+ }
3501
+
3502
+ async readUint8Array(offset, length) {
3288
3503
  const reader = this;
3289
3504
  const { readers } = this;
3290
3505
  let result;
3291
- let currentDiskNumber = diskNumber;
3292
- if (currentDiskNumber == -1) {
3293
- currentDiskNumber = readers.length - 1;
3294
- }
3506
+ let currentDiskNumber = 0;
3295
3507
  let currentReaderOffset = offset;
3296
3508
  while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
3297
3509
  currentReaderOffset -= readers[currentDiskNumber].size;
@@ -3304,14 +3516,9 @@
3304
3516
  result = await readUint8Array(currentReader, currentReaderOffset, length);
3305
3517
  } else {
3306
3518
  const chunkLength = currentReaderSize - currentReaderOffset;
3307
- result = new Uint8Array(length);
3308
3519
  const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
3309
- result.set(firstPart, 0);
3310
- const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength, diskNumber);
3311
- result.set(secondPart, chunkLength);
3312
- if (firstPart.length + secondPart.length < length) {
3313
- result = result.subarray(0, firstPart.length + secondPart.length);
3314
- }
3520
+ const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
3521
+ result = concat(firstPart, secondPart);
3315
3522
  }
3316
3523
  } else {
3317
3524
  result = EMPTY_UINT8_ARRAY;
@@ -3336,6 +3543,12 @@
3336
3543
  let diskSourceWriter, diskWritable, diskWriter;
3337
3544
  const writable = new WritableStream({
3338
3545
  async write(chunk) {
3546
+ if (chunk === DISK_BOUNDARY) {
3547
+ if (diskWriter) {
3548
+ await endDisk();
3549
+ }
3550
+ return;
3551
+ }
3339
3552
  const { availableSize } = writer;
3340
3553
  if (!diskWriter) {
3341
3554
  const { value, done } = await writerGenerator.next();
@@ -3355,11 +3568,7 @@
3355
3568
  await this.write(chunk);
3356
3569
  } else if (chunk.length >= availableSize) {
3357
3570
  await writeChunk(chunk.subarray(0, availableSize));
3358
- await closeDisk();
3359
- writer.diskOffset += diskSourceWriter.size;
3360
- writer.diskNumber++;
3361
- diskWriter = null;
3362
- writer.availableSize = writer.maxSize;
3571
+ await endDisk();
3363
3572
  if (chunk.length > availableSize) {
3364
3573
  await this.write(chunk.subarray(availableSize));
3365
3574
  }
@@ -3370,7 +3579,7 @@
3370
3579
  async close() {
3371
3580
  if (diskWriter) {
3372
3581
  await diskWriter.ready;
3373
- await closeDisk();
3582
+ await closeDiskWriter();
3374
3583
  }
3375
3584
  },
3376
3585
  async abort(reason) {
@@ -3395,10 +3604,28 @@
3395
3604
  }
3396
3605
  }
3397
3606
 
3398
- async function closeDisk() {
3607
+ async function endDisk() {
3608
+ await closeDiskWriter();
3609
+ writer.diskOffset += diskSourceWriter.size;
3610
+ writer.diskNumber++;
3611
+ diskWriter = null;
3612
+ writer.availableSize = writer.maxSize;
3613
+ }
3614
+
3615
+ async function closeDiskWriter() {
3399
3616
  await diskWriter.close();
3400
3617
  }
3401
3618
  }
3619
+
3620
+ async closeDisk() {
3621
+ const streamWriter = this.writable.getWriter();
3622
+ try {
3623
+ await streamWriter.ready;
3624
+ await streamWriter.write(DISK_BOUNDARY);
3625
+ } finally {
3626
+ streamWriter.releaseLock();
3627
+ }
3628
+ }
3402
3629
  }
3403
3630
 
3404
3631
  class GenericReader {
@@ -3430,14 +3657,6 @@
3430
3657
  if (writer.size === UNDEFINED_VALUE) {
3431
3658
  writer.size = 0;
3432
3659
  }
3433
- if (!(writer instanceof SplitDataWriter)) {
3434
- Object.assign(writer, {
3435
- diskNumber: 0,
3436
- diskOffset: 0,
3437
- availableSize: INFINITY_VALUE,
3438
- maxSize: INFINITY_VALUE
3439
- });
3440
- }
3441
3660
  return writer;
3442
3661
  }
3443
3662
  }
@@ -3456,8 +3675,8 @@
3456
3675
  }
3457
3676
  }
3458
3677
 
3459
- function readUint8Array(reader, offset, size, diskNumber) {
3460
- return reader.readUint8Array(offset, size, diskNumber);
3678
+ function readUint8Array(reader, offset, size) {
3679
+ return reader.readUint8Array(offset, size);
3461
3680
  }
3462
3681
 
3463
3682
  /*
@@ -3833,7 +4052,7 @@
3833
4052
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
3834
4053
  if (!endOfDirectoryInfo) {
3835
4054
  const signatureArray = await readUint8Array(reader, 0, 4);
3836
- const signatureView = getDataView$1(signatureArray);
4055
+ const signatureView = getDataView(signatureArray);
3837
4056
  if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
3838
4057
  throw new Error(ERR_SPLIT_ZIP_FILE);
3839
4058
  } else {
@@ -3843,7 +4062,7 @@
3843
4062
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
3844
4063
  throwAmbiguousArchive("multiple end of central directory records");
3845
4064
  }
3846
- const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
4065
+ const endOfDirectoryView = getDataView(endOfDirectoryInfo);
3847
4066
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
3848
4067
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
3849
4068
  const commentOffset = endOfDirectoryInfo.offset;
@@ -3859,17 +4078,21 @@
3859
4078
  let prependedDataLength = 0;
3860
4079
  let startOffset;
3861
4080
  let zip64EndOfDirectory;
3862
- if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
4081
+ const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4082
+ if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4083
+ directoryDataOffset += getDiskOffset$1(reader, diskNumber);
4084
+ }
4085
+ if (requiresZip64) {
3863
4086
  const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
3864
4087
  await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
3865
4088
  EMPTY_UINT8_ARRAY;
3866
- const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
4089
+ const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
3867
4090
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
3868
4091
  getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
3869
- directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
3870
- let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3871
- let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
3872
- const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
4092
+ directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4093
+ let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4094
+ let endOfDirectoryView = getDataView(endOfDirectoryArray);
4095
+ const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
3873
4096
  if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
3874
4097
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
3875
4098
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3877,8 +4100,8 @@
3877
4100
  if (directoryDataOffset > originalDirectoryDataOffset) {
3878
4101
  prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
3879
4102
  }
3880
- endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3881
- endOfDirectoryView = getDataView$1(endOfDirectoryArray);
4103
+ endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4104
+ endOfDirectoryView = getDataView(endOfDirectoryArray);
3882
4105
  }
3883
4106
  if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3884
4107
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
@@ -3904,7 +4127,7 @@
3904
4127
  } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
3905
4128
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
3906
4129
  }
3907
- directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4130
+ directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
3908
4131
  }
3909
4132
  }
3910
4133
  const declaredDirectoryDataLength = directoryDataLength;
@@ -3921,19 +4144,19 @@
3921
4144
  throw new Error(ERR_BAD_FORMAT);
3922
4145
  }
3923
4146
  let offset = 0;
3924
- let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3925
- let directoryView = getDataView$1(directoryArray);
4147
+ let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4148
+ let directoryView = getDataView(directoryArray);
3926
4149
  if (directoryDataLength) {
3927
4150
  if (directoryArray.length < 4) {
3928
4151
  throw new Error(ERR_BAD_FORMAT);
3929
4152
  }
3930
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
4153
+ const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
3931
4154
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
3932
4155
  const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
3933
4156
  let reconcile = !storedPointsAtDirectory;
3934
4157
  if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
3935
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4, diskNumber);
3936
- reconcile = getUint32(getDataView$1(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4158
+ const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4159
+ reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
3937
4160
  }
3938
4161
  if (reconcile) {
3939
4162
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3941,16 +4164,16 @@
3941
4164
  if (directoryDataOffset > originalDirectoryDataOffset) {
3942
4165
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
3943
4166
  }
3944
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3945
- directoryView = getDataView$1(directoryArray);
4167
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4168
+ directoryView = getDataView(directoryArray);
3946
4169
  }
3947
4170
  }
3948
4171
  }
3949
- const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
4172
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
3950
4173
  if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
3951
4174
  directoryDataLength = expectedDirectoryDataLength;
3952
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3953
- directoryView = getDataView$1(directoryArray);
4175
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4176
+ directoryView = getDataView(directoryArray);
3954
4177
  }
3955
4178
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
3956
4179
  throw new Error(ERR_BAD_FORMAT);
@@ -4023,7 +4246,7 @@
4023
4246
  });
4024
4247
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
4025
4248
  fileEntry.offset += prependedDataLength;
4026
- startOffset = Math.min(fileEntry.offset, startOffset);
4249
+ startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
4027
4250
  if (checkAmbiguity) {
4028
4251
  if (filenames.has(fileEntry.filename)) {
4029
4252
  duplicateFilename = true;
@@ -4177,8 +4400,9 @@
4177
4400
  dataDescriptor
4178
4401
  } = bitFlag;
4179
4402
  const localDirectory = fileEntry.localDirectory = {};
4180
- const dataArray = await readUint8Array(reader, offset, HEADER_SIZE, diskNumberStart);
4181
- const dataView = getDataView$1(dataArray);
4403
+ const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
4404
+ const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
4405
+ const dataView = getDataView(dataArray);
4182
4406
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
4183
4407
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
4184
4408
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
@@ -4203,12 +4427,12 @@
4203
4427
  const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
4204
4428
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
4205
4429
  if (checkAmbiguity && (filenameLength || extraFieldLength)) {
4206
- const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
4430
+ const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
4207
4431
  rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
4208
4432
  localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
4209
4433
  } else {
4210
4434
  localDirectory.rawExtraField = extraFieldLength ?
4211
- await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
4435
+ await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
4212
4436
  EMPTY_UINT8_ARRAY;
4213
4437
  }
4214
4438
  readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
@@ -4234,9 +4458,9 @@
4234
4458
  throw new Error(ERR_ENCRYPTED);
4235
4459
  }
4236
4460
  }
4237
- const dataOffset = offset + HEADER_SIZE + filenameLength + extraFieldLength;
4461
+ const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
4238
4462
  const size = compressedSize;
4239
- const readable = reader.createReadable({ offset: dataOffset, size, diskNumberStart, chunkSize: getChunkSize(config) });
4463
+ const readable = reader.createReadable({ offset: dataOffset, size });
4240
4464
  const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
4241
4465
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
4242
4466
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -4277,8 +4501,7 @@
4277
4501
  reader,
4278
4502
  fileEntry,
4279
4503
  index,
4280
- offset,
4281
- diskNumberStart,
4504
+ offset: localHeaderOffset,
4282
4505
  signature,
4283
4506
  compressedSize,
4284
4507
  uncompressedSize,
@@ -4342,7 +4565,7 @@
4342
4565
  function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
4343
4566
  const { rawExtraField } = directory;
4344
4567
  const extraField = directory.extraField = new Map();
4345
- const rawExtraFieldView = getDataView$1(new Uint8Array(rawExtraField));
4568
+ const rawExtraFieldView = getDataView(rawExtraField);
4346
4569
  let offsetExtraField = 0;
4347
4570
  try {
4348
4571
  while (offsetExtraField < rawExtraField.length) {
@@ -4414,7 +4637,7 @@
4414
4637
 
4415
4638
  function readExtraFieldZip64(extraFieldZip64, directory) {
4416
4639
  directory.zip64 = true;
4417
- const extraFieldView = getDataView$1(extraFieldZip64.data);
4640
+ const extraFieldView = getDataView(extraFieldZip64.data);
4418
4641
  const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
4419
4642
  const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
4420
4643
  if (extraFieldZip64.data.length < requiredLength) {
@@ -4433,10 +4656,10 @@
4433
4656
  extraFieldUnicode.valid = false;
4434
4657
  return;
4435
4658
  }
4436
- const extraFieldView = getDataView$1(extraFieldUnicode.data);
4659
+ const extraFieldView = getDataView(extraFieldUnicode.data);
4437
4660
  const crc32 = new Crc32();
4438
4661
  crc32.append(fileEntry[rawPropertyName]);
4439
- const dataViewSignature = getDataView$1(new Uint8Array(4));
4662
+ const dataViewSignature = getDataView(new Uint8Array(4));
4440
4663
  dataViewSignature.setUint32(0, crc32.get(), true);
4441
4664
  const signature = getUint32(extraFieldView, 1);
4442
4665
  Object.assign(extraFieldUnicode, {
@@ -4451,7 +4674,7 @@
4451
4674
  }
4452
4675
 
4453
4676
  function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4454
- const extraFieldView = getDataView$1(extraFieldAES.data);
4677
+ const extraFieldView = getDataView(extraFieldAES.data);
4455
4678
  const strength = getUint8(extraFieldView, 4);
4456
4679
  Object.assign(extraFieldAES, {
4457
4680
  vendorVersion: getUint8(extraFieldView, 0),
@@ -4464,7 +4687,7 @@
4464
4687
  }
4465
4688
 
4466
4689
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
4467
- const extraFieldView = getDataView$1(extraFieldNTFS.data);
4690
+ const extraFieldView = getDataView(extraFieldNTFS.data);
4468
4691
  let offsetExtraField = 4;
4469
4692
  let tag1Data;
4470
4693
  try {
@@ -4481,7 +4704,7 @@
4481
4704
  }
4482
4705
  try {
4483
4706
  if (tag1Data && tag1Data.length == 24) {
4484
- const tag1View = getDataView$1(tag1Data);
4707
+ const tag1View = getDataView(tag1Data);
4485
4708
  const rawLastModDate = tag1View.getBigUint64(0, true);
4486
4709
  const rawLastAccessDate = tag1View.getBigUint64(8, true);
4487
4710
  const rawCreationDate = tag1View.getBigUint64(16, true);
@@ -4504,7 +4727,7 @@
4504
4727
 
4505
4728
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
4506
4729
  try {
4507
- const view = getDataView$1(new Uint8Array(extraField.data));
4730
+ const view = getDataView(extraField.data);
4508
4731
  let uid, gid;
4509
4732
  if (isInfoZip) {
4510
4733
  let offset = 0;
@@ -4542,7 +4765,7 @@
4542
4765
  if (!extraFieldExtendedTimestamp.data.length) {
4543
4766
  return;
4544
4767
  }
4545
- const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
4768
+ const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
4546
4769
  const flags = getUint8(extraFieldView, 0);
4547
4770
  const timeProperties = [];
4548
4771
  const timeRawProperties = [];
@@ -4580,7 +4803,6 @@
4580
4803
  fileEntry,
4581
4804
  index,
4582
4805
  offset,
4583
- diskNumberStart,
4584
4806
  signature,
4585
4807
  compressedSize,
4586
4808
  uncompressedSize,
@@ -4589,12 +4811,6 @@
4589
4811
  extraFieldZip64,
4590
4812
  readRanges
4591
4813
  }) {
4592
- let diskOffset = 0;
4593
- if (diskNumberStart && reader.readers) {
4594
- for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
4595
- diskOffset += reader.readers[indexReader].size;
4596
- }
4597
- }
4598
4814
  let dataDescriptorLength = 0;
4599
4815
  if (dataDescriptor) {
4600
4816
  if (extraFieldZip64) {
@@ -4604,19 +4820,19 @@
4604
4820
  }
4605
4821
  }
4606
4822
  if (dataDescriptorLength) {
4607
- const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
4823
+ const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
4608
4824
  const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
4609
- getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4825
+ getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4610
4826
  if (dataDescriptorSignature) {
4611
- const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
4827
+ const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
4612
4828
  let readCompressedSize;
4613
4829
  let readUncompressedSize;
4614
4830
  if (extraFieldZip64) {
4615
- readCompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 8);
4616
- readUncompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 16);
4831
+ readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
4832
+ readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
4617
4833
  } else {
4618
- readCompressedSize = getUint32(getDataView$1(dataDescriptorArray), 8);
4619
- readUncompressedSize = getUint32(getDataView$1(dataDescriptorArray), 12);
4834
+ readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
4835
+ readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
4620
4836
  }
4621
4837
  const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
4622
4838
  if (matchSignature &&
@@ -4627,8 +4843,8 @@
4627
4843
  }
4628
4844
  }
4629
4845
  const range = {
4630
- start: diskOffset + offset,
4631
- end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
4846
+ start: offset,
4847
+ end: dataOffset + compressedSize + dataDescriptorLength,
4632
4848
  fileEntry
4633
4849
  };
4634
4850
  for (const [otherIndex, otherRange] of readRanges) {
@@ -4641,6 +4857,10 @@
4641
4857
  readRanges.set(index, range);
4642
4858
  }
4643
4859
 
4860
+ function getDiskOffset$1(reader, diskNumber) {
4861
+ return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
4862
+ }
4863
+
4644
4864
  function getStrictness(strictness, checkAmbiguity) {
4645
4865
  if (strictness === UNDEFINED_VALUE) {
4646
4866
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
@@ -4724,7 +4944,7 @@
4724
4944
  async function* scanEndOfCentralDirectory(reader, scanLength) {
4725
4945
  const scanOffset = reader.size - scanLength;
4726
4946
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
4727
- const scanView = getDataView$1(scanArray);
4947
+ const scanView = getDataView(scanArray);
4728
4948
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
4729
4949
  if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
4730
4950
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
@@ -4747,7 +4967,8 @@
4747
4967
  if (!filesLength && !directoryDataLength) {
4748
4968
  return CENTRAL_DIRECTORY_PLAUSIBLE;
4749
4969
  }
4750
- for (const centralDirectoryOffset of [offset - directoryDataLength, directoryDataOffset]) {
4970
+ const directoryDiskNumber = getUint16(view, indexByte + 6);
4971
+ for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
4751
4972
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
4752
4973
  return CENTRAL_DIRECTORY_REACHABLE;
4753
4974
  }
@@ -4765,7 +4986,7 @@
4765
4986
  if (remoteProbeBudget.count > 0) {
4766
4987
  remoteProbeBudget.count--;
4767
4988
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
4768
- return getUint32(getDataView$1(signatureArray), 0);
4989
+ return getUint32(getDataView(signatureArray), 0);
4769
4990
  }
4770
4991
  return UNDEFINED_VALUE;
4771
4992
  }
@@ -4830,9 +5051,27 @@
4830
5051
  return Number(view.getBigUint64(offset, true));
4831
5052
  }
4832
5053
 
4833
- function getDataView$1(array) {
4834
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
4835
- }
5054
+ var zipReader = /*#__PURE__*/Object.freeze({
5055
+ __proto__: null,
5056
+ ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
5057
+ ERR_BAD_FORMAT: ERR_BAD_FORMAT,
5058
+ ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5059
+ ERR_ENCRYPTED: ERR_ENCRYPTED,
5060
+ ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5061
+ ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5062
+ ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5063
+ ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5064
+ ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5065
+ ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5066
+ ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5067
+ ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5068
+ ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5069
+ ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5070
+ ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5071
+ ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5072
+ ZipReader: ZipReader,
5073
+ ZipReaderStream: ZipReaderStream
5074
+ });
4836
5075
 
4837
5076
  /*
4838
5077
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -4897,9 +5136,10 @@
4897
5136
 
4898
5137
  constructor(writer, options = {}) {
4899
5138
  writer = new GenericWriter(writer);
5139
+ const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
4900
5140
  const addSplitZipSignature =
4901
- writer.availableSize !== UNDEFINED_VALUE && writer.availableSize > 0 && writer.availableSize !== INFINITY_VALUE &&
4902
- writer.maxSize !== UNDEFINED_VALUE && writer.maxSize > 0 && writer.maxSize !== INFINITY_VALUE;
5141
+ availableSize > 0 && availableSize !== INFINITY_VALUE &&
5142
+ maxSize > 0 && maxSize !== INFINITY_VALUE;
4903
5143
  Object.assign(this, {
4904
5144
  writer,
4905
5145
  addSplitZipSignature,
@@ -4921,9 +5161,10 @@
4921
5161
  }
4922
5162
  reader = new GenericReader(reader);
4923
5163
  await initStream(reader);
4924
- const zipReader = new ZipReader(reader.readable);
4925
- const entries = await zipReader.getEntries();
4926
- await zipReader.close();
5164
+ const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
5165
+ const zipReader$1 = new ZipReader(reader.readable);
5166
+ const entries = await zipReader$1.getEntries();
5167
+ await zipReader$1.close();
4927
5168
  await initStream(this.writer);
4928
5169
  await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
4929
5170
  this.writer.size = this.offset = reader.size;
@@ -4939,8 +5180,6 @@
4939
5180
  encrypted,
4940
5181
  uncompressedSize,
4941
5182
  compressedSize,
4942
- diskOffset,
4943
- diskNumber,
4944
5183
  zip64
4945
5184
  } = entry;
4946
5185
  let {
@@ -4988,8 +5227,9 @@
4988
5227
  Object.assign(entry, {
4989
5228
  zip64UncompressedSize,
4990
5229
  zip64CompressedSize,
4991
- zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
4992
- zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
5230
+ zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
5231
+ diskNumberStart: 0,
5232
+ zip64DiskNumberStart: false,
4993
5233
  rawExtraFieldZip64,
4994
5234
  rawExtraFieldAES,
4995
5235
  rawExtraFieldExtendedTimestamp,
@@ -5156,7 +5396,8 @@
5156
5396
  try {
5157
5397
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
5158
5398
  ({ reader } = sizesInfo);
5159
- const { diskOffset, diskNumber } = zipWriter.writer;
5399
+ const diskOffset = getDiskOffset(zipWriter.writer);
5400
+ const diskNumber = getDiskNumber(zipWriter.writer);
5160
5401
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
5161
5402
  internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
5162
5403
  externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
@@ -5333,7 +5574,7 @@
5333
5574
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
5334
5575
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
5335
5576
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
5336
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
5577
+ const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
5337
5578
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
5338
5579
  const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
5339
5580
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -5531,7 +5772,7 @@
5531
5772
  await requestLockWriter();
5532
5773
  }
5533
5774
  await initStream(fileWriter);
5534
- const { diskOffset } = writer;
5775
+ const diskOffset = getDiskOffset(writer);
5535
5776
  if (zipWriter.addSplitZipSignature) {
5536
5777
  delete zipWriter.addSplitZipSignature;
5537
5778
  const signatureArray = new Uint8Array(4);
@@ -5548,7 +5789,7 @@
5548
5789
  await lockPreviousFileEntry;
5549
5790
  await skipDiskIfNeeded();
5550
5791
  }
5551
- const diskNumberStart = writer.diskNumber;
5792
+ const diskNumberStart = getDiskNumber(writer);
5552
5793
  const entryOffset = getSegmentOffset(zipWriter, writer);
5553
5794
  fileEntry.diskNumberStart = diskNumberStart;
5554
5795
  if (!bufferedWrite) {
@@ -5568,11 +5809,11 @@
5568
5809
  writingBufferedEntryData = true;
5569
5810
  writerSizeBeforeEntry = writer.size;
5570
5811
  await skipDiskIfNeeded();
5571
- fileEntry.diskNumberStart = writer.diskNumber;
5812
+ fileEntry.diskNumberStart = getDiskNumber(writer);
5572
5813
  fileEntry.offset = getSegmentOffset(zipWriter, writer);
5573
5814
  if (usdz) {
5574
5815
  const previousMetadataSize = entryInfo.metadataSize;
5575
- appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
5816
+ appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
5576
5817
  fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
5577
5818
  }
5578
5819
  updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
@@ -5637,9 +5878,8 @@
5637
5878
  }
5638
5879
 
5639
5880
  async function skipDiskIfNeeded() {
5640
- if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
5641
- writer.availableSize = 0;
5642
- await writeData(writer, EMPTY_UINT8_ARRAY);
5881
+ if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
5882
+ await writer.closeDisk();
5643
5883
  }
5644
5884
  }
5645
5885
  }
@@ -5750,7 +5990,7 @@
5750
5990
  }
5751
5991
  const { writable } = writer;
5752
5992
  if (reader) {
5753
- const readable = reader.createReadable ? reader.createReadable({ chunkSize: getChunkSize(config) }) : reader.readable;
5993
+ const readable = reader.createReadable ? reader.createReadable() : reader.readable;
5754
5994
  const size = reader.size;
5755
5995
  const workerOptions = {
5756
5996
  options: {
@@ -6182,8 +6422,8 @@
6182
6422
 
6183
6423
  async function closeFile(zipWriter, comment, options) {
6184
6424
  const directoryDataLength = createDirectoryRecords(zipWriter.files);
6185
- const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6186
- await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
6425
+ const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6426
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
6187
6427
  }
6188
6428
 
6189
6429
  function createDirectoryRecords(files) {
@@ -6265,8 +6505,8 @@
6265
6505
  await initStream(writer);
6266
6506
  let offset = 0;
6267
6507
  let directoryDiskOffset = 0;
6268
- let cdStartDiskNumber = writer.diskNumber;
6269
- let cdStartDiskOffset = writer.diskOffset;
6508
+ let directoryStartDiskNumber = getDiskNumber(writer);
6509
+ let directoryStartDiskOffset = getDiskOffset(writer);
6270
6510
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
6271
6511
  const {
6272
6512
  offset: fileEntryOffset,
@@ -6293,15 +6533,14 @@
6293
6533
  } = fileEntry;
6294
6534
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6295
6535
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
6296
- if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
6536
+ if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
6297
6537
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
6298
6538
  directoryDiskOffset = offset;
6299
- writer.availableSize = 0;
6300
- await writeData(writer, EMPTY_UINT8_ARRAY);
6539
+ await writer.closeDisk();
6301
6540
  }
6302
6541
  if (indexFileEntry == 0) {
6303
- cdStartDiskNumber = writer.diskNumber;
6304
- cdStartDiskOffset = writer.diskOffset;
6542
+ directoryStartDiskNumber = getDiskNumber(writer);
6543
+ directoryStartDiskOffset = getDiskOffset(writer);
6305
6544
  }
6306
6545
  if (!zip64UncompressedSize) {
6307
6546
  setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
@@ -6341,18 +6580,18 @@
6341
6580
  }
6342
6581
  }
6343
6582
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
6344
- return { cdStartDiskNumber, cdStartDiskOffset };
6583
+ return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
6345
6584
  }
6346
6585
 
6347
6586
  async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6348
6587
  const { writer } = zipWriter;
6349
- const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
6588
+ const { directoryStart } = cdInfo;
6350
6589
  let { directoryDataLength } = cdInfo;
6351
6590
  let filesLength = zipWriter.files.size;
6352
- let diskNumber = cdStartDiskNumber;
6353
- let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
6354
- let lastDiskNumber = writer.diskNumber;
6355
- if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
6591
+ let diskNumber = directoryStart.diskNumber;
6592
+ let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
6593
+ let lastDiskNumber = getDiskNumber(writer);
6594
+ if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
6356
6595
  lastDiskNumber++;
6357
6596
  }
6358
6597
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
@@ -6368,11 +6607,10 @@
6368
6607
  throw new Error(ERR_INVALID_COMMENT);
6369
6608
  }
6370
6609
  const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6371
- if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
6372
- writer.availableSize = 0;
6373
- await writeData(writer, EMPTY_UINT8_ARRAY);
6610
+ if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
6611
+ await writer.closeDisk();
6374
6612
  }
6375
- lastDiskNumber = writer.diskNumber;
6613
+ lastDiskNumber = getDiskNumber(writer);
6376
6614
  if (zip64) {
6377
6615
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
6378
6616
  endOfdirectoryRecord.uint64(44);
@@ -6386,7 +6624,7 @@
6386
6624
  endOfdirectoryRecord.uint64(directoryOffset);
6387
6625
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
6388
6626
  endOfdirectoryRecord.uint32(lastDiskNumber);
6389
- endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
6627
+ endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
6390
6628
  endOfdirectoryRecord.uint32(lastDiskNumber + 1);
6391
6629
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
6392
6630
  if (supportZip64SplitFile) {
@@ -6426,8 +6664,23 @@
6426
6664
  };
6427
6665
  }
6428
6666
 
6429
- function getSegmentOffset(zipWriter, writer) {
6430
- return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
6667
+ function getDiskNumber(writer) {
6668
+ const { diskNumber = 0 } = writer;
6669
+ return diskNumber;
6670
+ }
6671
+
6672
+ function getDiskOffset(writer) {
6673
+ const { diskOffset = 0 } = writer;
6674
+ return diskOffset;
6675
+ }
6676
+
6677
+ function exceedsAvailableSize(writer, length) {
6678
+ const { availableSize = INFINITY_VALUE } = writer;
6679
+ return length > availableSize;
6680
+ }
6681
+
6682
+ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
6683
+ return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
6431
6684
  }
6432
6685
 
6433
6686
  async function writeData(writer, array) {
@@ -6504,9 +6757,6 @@
6504
6757
  array.set(typedArray, offset);
6505
6758
  }
6506
6759
 
6507
- function getDataView(array) {
6508
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
6509
- }
6510
6760
 
6511
6761
  function getLength(...arrayLikes) {
6512
6762
  let result = 0;
@@ -7047,7 +7297,7 @@
7047
7297
 
7048
7298
 
7049
7299
  try {
7050
- configure({ baseURI: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('zip-fs-native.js', document.baseURI).href)) });
7300
+ setDefaultConfiguration({ baseURI: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('zip-fs-native.js', document.baseURI).href)) });
7051
7301
  } catch {
7052
7302
  // ignored
7053
7303
  }
@@ -7083,7 +7333,7 @@
7083
7333
  */
7084
7334
 
7085
7335
 
7086
- configure({
7336
+ setDefaultConfiguration({
7087
7337
  workerURI: "./core/web-worker-native.js",
7088
7338
  wasmURI: null,
7089
7339
  CompressionStreamZlib: E_,
@@ -7268,9 +7518,7 @@
7268
7518
 
7269
7519
  async getArrayBuffer(options) {
7270
7520
  const array = await this.getUint8Array(options);
7271
- return array.byteOffset || array.byteLength != array.buffer.byteLength
7272
- ? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
7273
- : array.buffer;
7521
+ return toExactUint8Array(array).buffer;
7274
7522
  }
7275
7523
 
7276
7524
  replaceBlob(blob) {
@@ -9774,7 +10022,7 @@
9774
10022
  */
9775
10023
 
9776
10024
 
9777
- i(configure);
10025
+ i(setDefaultConfiguration);
9778
10026
 
9779
10027
  exports.BlobReader = BlobReader;
9780
10028
  exports.BlobWriter = BlobWriter;
@@ -9789,6 +10037,7 @@
9789
10037
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
9790
10038
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
9791
10039
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10040
+ exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
9792
10041
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
9793
10042
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
9794
10043
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
@@ -9831,6 +10080,7 @@
9831
10080
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
9832
10081
  exports.fs = fs;
9833
10082
  exports.getMimeType = getMimeType;
10083
+ exports.resetConfiguration = resetConfiguration;
9834
10084
  exports.terminateWorkers = terminateWorkers;
9835
10085
 
9836
10086
  }));