@zip.js/zip.js 2.8.49 → 2.8.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -1
- package/dist/zip-core-external.js +333 -203
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +339 -203
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +567 -332
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +339 -547
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +567 -332
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +574 -332
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +574 -332
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +339 -203
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +339 -203
- package/dist/zip-native.min.js +1 -1
- package/dist/zip.js +339 -203
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +573 -331
- package/index-native.min.js +1 -1
- package/index.cjs +573 -331
- package/index.d.cts +167 -2
- package/index.d.ts +167 -2
- package/index.min.js +1 -1
- package/lib/core/codec-registry.js +2 -2
- package/lib/core/codec-worker-web.js +436 -0
- package/lib/core/codec-worker.js +23 -404
- package/lib/core/constants.js +5 -1
- package/lib/core/io.js +2 -1
- package/lib/core/options.js +8 -0
- package/lib/core/zip-fs.js +215 -110
- package/lib/core/zip-reader.js +90 -16
- package/lib/core/zip-writer.js +36 -13
- package/lib/zip-core-reader.js +6 -0
- package/lib/zip-core-writer.js +4 -0
- package/package.json +1 -1
package/index-native.cjs
CHANGED
|
@@ -111,6 +111,8 @@ const INFINITY_VALUE = Infinity;
|
|
|
111
111
|
const UNDEFINED_TYPE = "undefined";
|
|
112
112
|
const FUNCTION_TYPE = "function";
|
|
113
113
|
const OBJECT_TYPE = "object";
|
|
114
|
+
const STRING_TYPE = "string";
|
|
115
|
+
const NUMBER_TYPE = "number";
|
|
114
116
|
|
|
115
117
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
116
118
|
|
|
@@ -242,7 +244,7 @@ function resetConfiguration() {
|
|
|
242
244
|
const r=[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],t=[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],n=[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],c=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("zb1rc9s4zwD6/fyKJLOPR1xBWkm+xJFDZ3rfbq/bNrvbetyOY1OxEptyJbpuGvv57WcAUhLtuN193st5z7TjSBSvIAgCIAA6gvdvj5KlHKs0k0ecq5uFyJKDiUhSKRoN/dcfzSdn+tERLBYO2zCnLOSw26NlIQ4KladjddQbZ7JQt/fyfHQTC3h1cSXGKlbwcjm/EHks4cVITeMcHuV5lscZnKdSdXXulF7Cjn5L6K0Z6bcCntYvY3gxWsQzeDhSoz9SsYpH8DrP5mkh4iW8E1/VIznOJiKPVzDObxYqi6ewyAr1QhTF6FLEE3iXj2SRZPn8rcrFaB4v4I0YTUYXM2ESbuDPPFVWwhweZPNFLooizaRJu4aHYnwn9WLDCzFL4Av/kqWTgwAu+dFSavBNjuAtr+EN37gUq4MUrvhgMIR9/4e9JMudmVAHgge9qN3pi55wXXaLSYqLrc9d81HxsKHOVL/fDz82T7rd6CRqdlsxJfSuBsFwIIZcbfbXXKYqHva6fdVT2BrN6oHkVwPlhVi8dzVQVI3s9/vdj1Rp1G435HBDeQcP4DV8hXtwDp/gDTwd8qveeDYqioNHurJ8OVZZ7gh2q6Zp4WdcrNdeuBktFkJOMFn3IVjrz72yB8Fa+DMhL9W0hzlyHvTSxJF93m00hH+xTBKRl/3NCLwjp0wH4V/cKPEqSQqhQDJIufS6BMJe2ud5L3d5tywsuPqY+ZdCEeY5ORwGDCS3k9wWJvYUf0pjF8OPbwYC4dGI2u3hx0/0Enb02zm9RS39ds9A6+PXgaxLvKaXssQDejMlNjRdPdnHXuIUKwL8A6rHUR/FIB+yYc8AU20uhXLYbS7UMpf/1qmbjZ6B9wfiqxJyUhwstuZCw1wYUCsC3qNesVyI3LlV5ZJxBEh2q/xqpkD6Qn5eiiVShw0ks2UxdWqUIQx3Wqyn50KWc+QXQukl7gSgfOovA+F/Gc2WgsvNhoHg2PHNplwwBw8dAWq36hIfXGUeWE8P+0BiG7qH+KCgzMpA1pW+QGwrS/wAX/TLc12BxvKDdxw7Mx4p3bE0cQLOednMeo1vVbdMG8I3RRSrsFoMyjJeOIScv/NnjqzG0Yw45/mZVTB+508dBTkEawnCL2bpWDgB1JUwtoGLVOne4gDLSa1Wj+mrKrsVWJ3BRV43/rOjvJC5uk8bmFdjbUY/l9WdVvWIqh5H8LpruT8W6cxRvzQjxljZCVNGNXgzBNkPGg3VaDhiIL1wyN/5X3DO6KURha3jVrfZaXX7feWFECKybOBLjL0ByXifoCTOVOzIs2CtYnV62ow8wdwwODlph2EnOj4+7vwsYBYL3s/9PFsi/v6y9Zmt180IprpSyNktrjpNyHEOGg0n54Mh66k+b0Y95fFmxHJ/gSgvkTwEd+Cal7MmWEWsMx70stNqKjLXrSpZi0E27Pf7CmvDZxqF6pUUrSx0toUycQApIU1WIY2pkIDopo1mCMpN+83oTMa5v8gWDiMY5psNPOa3iNpFfPvWRpV3vo1Bv3ShXHGKadq7NR7Vz2ggzUa2Xjs59v2X1pCBHGRDnhMhg/z0lHer1bmBK7u5wZBqlYA0HWtGaMoaShKhxPPT0+5aDOQQmo1/y/XaUXqcOcNy9ZJpyEZD1SDo/uw0G5JBzhiozWYDLzkRw93NqOwMEp6e8i9m2fj6bfpN8HYYgfIf8EF43Iza3VZ40oRWEDWjZrMVHkPU7kTNbjMMIoiOw+Nms3vchWbUbTePj9tRMATlv+aDsB1220EQtU4g7LZPjo/bzZMmRK0gOGmfHAddaDZP2q3OyXE3GoI4c5R/jwv/XrmIGCj/nAv/3E74xIX/icXKzwUSObYxf+ttDIdS0R6s8EFdXvjnfDAE4X/iAYjNcjEZKXEHEEfI3cnLmkEUuEr5Y/+Nj1NY0zHs37uKTPnnIHBalP8JUvzlubuNVLha0v5JEByHJydRu3XcCk5OQqamebYiYpw5Rw9GUmbqYDoqpgfzLBcHajqSB9HHdvPAOwgPLlJVHJU9SAhDC6SdiEtjg0may7Gm0809Z+u1Yb15IUN2ANkhuwxT/lMn8YvlxQjZUCfs/DyGsPOzM3ZDxhiMXR5aO8/CED7Mhjj3fndKDAfnn9eE17/XUxb8YICoi7RuyLbGYTa8qBe2G4bl06ge6HzlmvCTWYZ47X/6pRWdtE46x9FJB1eAyb1G1OmV9fWY8J86yu46YzXmGLwCuXlYk8fyaz88ORP9Jv608ef45ExTzVh9lB/zWDXkWjXytWzkVsq/VSPfvND7SbkVnJ6KNfI2SLs3Tx1ru0eoQcalfw9SLpxuwLa437DkYFNib5FJxU8JzwbBEAqeDcIhjHk2iIYw49mgOYQRzwatbRb7+ETPvMtuscL12qHqpP/CCSEdCK85/Ih/uvpP2DJ/O8NqGSjK3YaEudJHWBUwhhlzRy5W5Ur/9aCamV+igA3XQW/EZzDjYxhT2WYABYOCJ5BwtcH+0yDcZB0ADoPG4hb0Fg1pSO6Y3ppDGpk7o7fWkAbojtbBZgP3+W06X2S5eiZucAvEpXLff+c8Jsam0EsZHteTi4w1l+t1KFoQ9PP1OujL7bWZyi+jWTo5WIzy0bw4UNnB4uJ6kkTVgkx56Dp5v99mp6eRng8NDliaHCtasiTZ3Seuy0kZTA3nvtLreMJL7mTB32kM53WvFYMlD3tOul6HrD/pLXHyMFPCCy58IUkKdBbWuloOccHysCf7497YSD125oLBjAe92WlRSRuYazAbfuTFYKZxBslL2WqjMT5NyrxY4xR5Ti0oTCAZjIcMJi5vbQyer2rO6Jcu28C7+G/3I0D6+pK/hNyIi8Oe8u/zAYJKAv0OKz5B+fcHwbCmXr80o165lfYzIt8OFWF+RfT99w6r15RCJsUIgDnKd2rIT4KTdhS1up2PYqCGkA9CSg7brZN2u9ONupTeM42birEw0pz7g9BKCyntV5po6egS39m8hMkm/JeO0BlB+H/ww9DasEjG+YMfBkBPv9bD2kzSS1Hs1gpIe3/FIRu+pqw9HFYgUQSSfSSwxBNBq0S3vb00TI6DTB6MZrkYTW4OdK2Tg+l8ND4Yj2YzMTk8qqqnSqpO61GYnguGLMuv5e47PeSXjUb5gqLTm5GcZPM/UHQqOH8Lv/Ojp9XSLIpVlk+O4I86sUgv5Ugtc3EEf/I/4Bk/+pYurgpvdJHlyhtPxfjaqwr2KlHpuRnvryVze6dx3NO3d2/SwBzce/30AHfxYrlACiQmR6UI9ZmHHXjFb+VoLuKj1/efPXwcHW3gA1f+qMB+Ore49ccmw68v7j042mzgFYPfrCypEvkI+1jEoWiCXeLtr/e80BT5iw+OJiJPv4j7yDYM4Sc+6EIYQdgZwhM+CDsQtaCJ3JfgYQBK8EEA9G8IUtgTALngqCObIkegZgIy/W6y5ALzpKKkU5CIf8Rx/skHO7qgIewmIDf5J65I+r9eK/+ZY/Ng9K01JM7rT9z1Ur6lNDEkmIfIfrUOOU8bjY7+08U/+2n8SBQH1+LmoEi/iaOSz3jNB0Ut5SFNxQ4nPO21fk7dqNtPekmprhK8GCQoWTrJv1LOebBedzm1qt9bjMiSNIqS4elp1PpIb0YjcnoadnRC17x3P0qjegFTJ1Uh8Iuu5eMMq4EZn52ehh+jbvNnZ9bvHyPDVgySIXUpHX4UW9qwBBkASDyvnp5i0GyIsyROvNawN0aWoNXnyXrd6qPISfRRDpTu+PAjEUZ6N13HpMgkdauUJqZg/9VwuLFpik0SnjsCAraZiO9+Ddnm2Q51IxwAVT6HQ5ImNU7gnwy5/rSUuQxCfEfXmA6cDAcsKggKguBHTKvKjHjCg96hHIyGvdFHXqzXIeLBIBniBkkIkPLkY4KVJKenEf408afVS3mKuiwERPrx5ASwDp5CPkiHfES8GrJtyMGNhkPd4yUPO91WMwhOfp597LTbzeOfxx+j9vHPxUfzofvzCFYck7JBOqxT06rHKF+2+pIES5QosdUVXxHarVC7BgpT0yFf8iWlLjF1Y5dvW+U5/liiGSYpO2nzvFKd4KqrtFHfXW60e5cLzmaD/de0/XJpqvil5UU4nRWtSsqZV8j6JogMY54gHsx4ghzwiCfIAS95ghwwDmcFU5jAgotBMPwoscQNqoLOmnGI7+EQ5lwMInyOhnBN38K4ie/NIVzw1hb65AZ5VrwYLPSy+Dge3NTazdlgXuk9R7QIrrGqiyFMeYEZTZG5XeR6p8iCirjhECa8wKym0LVdaLFT6EYXokEUmNUUWtiFbnYKzXUhHKnLW7DgK7jhU5jzydawW9WaUWfNhidiMeTLEgAahywgEEFb1oBAsrW0YOG6Q1jxBSz4DdzwOcz5NVzzVckxpJsNFHu3FcQyQoBXXGhO4gNX+uE3riouq0ygDBYvZROYvzR38wpMRb+xzU+GDcCO/huJQdRiTLg8xAH2xKwQ5fFEOVKkPmaQkHOi2L2o3UY92ZmjeAD6RZ6h0se85Gc5D2LXzVnsuhJ/FAjUUrhcIeDwQZ6edvFvXrLVYvMEO4caOAcRWY/tJ3pmtL+g+FQlhkPGNn8ZFeKtVmqliXPo5LXa1vA6g5q3tnUYalurl5MWjLcMbJ+gJkIXyy3pQrKeGmTDjzwnKj3I3JBeQv0S0UukX5r00hyWI3znzx0FGdtsYCz4ff8dLd6ZZj4ymwHxK2kPWcLRvhw1L8T5W3NAsxTfOR+4LTnCWEA+Wr0u3xSYcZlDMIRLLIG4yDLTKzm7iXOddm+ppkKqdEwM24NsIuKEHwYbdmvOGgo1yhE9p4JwD/T0bGBU3MjxgX0SsasdqLuYQFF2pQAh4jEQDx7PNlz2kjNntBqlyqEaK4GX929LqZU+HyyE+TYXTg4B/DRQKDgmnN7pjTRYg2B4SER2vU4HIT2Hwy2y/juemUooIMG6BNVVDN0ItdicUsw75GfKF3g66uiSzxiLxw5jse7SzKDTaOf0wxPCs1/Yvz6jZqc8mZkIR4KAEQQgBJ5aVeDU5zUlI3qrRKxAilgCHu+k8jLODeTSjeZRUSvQaCh2qzuUmg4V3AAptzoBY51qp2l85d+wolK6rpmXC+GkAgrWk7UsVK0gZaXN+DVlzUtBYoRN6TRZCk6M0YCZ4RnKbpwKcRbGwRblFsKQ7uWajwYCNwQxxD4uG41kay7/ZD1RAXaGohkrj9ZW/zNr5392KeT1UshwKSRmQgtcClpN+q2XnzljfmdR1Esi588djXF6EZR70EMnh53FkjON7BnkDJIadQszjzODuuNSj1mjrXlA3J3Rmd0YSMm9g8YzKMvCfwWTs/2YnPU0k0qYmd/BzAr5LgzebeEopAYfRYmPCb+DjPVBnbBx6KGTQsIMIlXC9hThKSGHjI5btaAr4FaPAUG4dBTvC18IrhhU032DMMqZNeleWIHg24bVLUyqGYMMEgtuBcJtXBWabbjozQxAGg1H8YfODFSl8BxVm6WnYbg05zcO4SXvk46k0VB9sQNVyUUPRT5zrESHwo5EcafazxGTctcZeaN/fWao6Qt6I+9zny97S5d/3iUcc+EoWMLS/YyarEZjfIeKZNzSsvSS9brKkpUHxXreMgZLN6974htwcN0GaoEM3pXwXBDkNSylX04Il8vZrCKSe/YdyAyIDmeiVKzcrzdvZDFUflMyZRpX7d3dOcpHqyOq6zBEzmA8UuNpmX8m+GEI2/VtNswJIIMPEMBfSKT3Lnzs0cjq0WM6QS9GMwW/+bXCBeT+/tW8halyu18j06/v14q9rDU8mCNONvAbgwK6PzvRz08Gud5BK4LCYFTjwQwCwCyENFYqpoEuzRisOCWa90oXVzYr4fZa3BQx/sYjyNHEqJzYP0SeJoaLiVcbUIJWZSGIUCbCGaGaMsmzuaNQsy7197FwlmzDYFUvxBuxfQbCOf9y5gizcDS3tuL8slZH6AE7gi+lKMYjpL1k9HT+5ikaKmVSSFQVVCftbEvqlafKPlUlSVX44+koR27snrJsD5TBfxrTivm6GdRIMjQGU/Ug5qLko6sVU52V0fRXOa+3hyv8t4iT1eeL3c+o4jcb7Jf/fIPdO1172dO72+7bnW33Bxsu7SbVol+vpW91o564b7SD1ZAJIIwY2y7Mt8oS/YDgkDtqEKIo7u8bEdthN3tkfFGdVUZss4+xrHdW3S/chCpm5vJ/Ctb/PbiSVAbZ38D3h9CrDuZKHoZgTuDk+8GJupXvWBdBTpvEFQJMMeRPMh5GGxR7D3ZL4begZxUQDPeVGuw52970335n068gLrcgnu+HeLZh4OiKag4u44Nm0G6FJ92TDrRPwuN2GLROoHvcDbpReBIRs2u3SYQvg0yTrUdORgcvaf0aDZGO5cw+MVKnJedEB0cPcDw5CUoEoO2s8k5WaVMhRYykHkYNom9inxWYukPo0IwkrwkdWs3JQT7kr5F6fVS4C+gmbcJv2YVd/Q+3o77TzgPTzkyoARAhRsD3hJ+J0siO4FfO4r/pC9nL9SS/J5zcT+fLmXNPONL9imwMg7DZOj5ud8Mmc0PchNK6Km1TOKwPaP9Nn3V9um0+yEBCOqz7+HrLJiRa63yDqLIS+1p1Q0H4UTFUlFpz9tVWK5H6p/52z/5WmSlgFt3eueYPZ/Ux1Ce7xLnue8V2vxH1MddSlva5YqLVqPBU8D/gkeBHE5HMRkp4xDu9F/zo8lu6OIKHgg+aIYTNE+gOjUbkxfcIoYDb8XQp6YA1VndNhB+PZrOL0fg6lnvMh63tZmNm47buLopqWjIUkziFZSHu1pDAt3ShD9jiArDsUokH+bgZxWOYiS9iFs/AjLPTipeAFHak0C66ruuFUNNsEk83XMCkprgLuIE5Kkixh35uzKMN0lzwVaPxSTgrBl/4uNHIGo3DZaNxeNFoOIfpel2wRuPQOUzW68Nca0gajcNivT4cr9df1mtnQTP6Hq75H8K5hgVDqpgmzgW75n9iyq/CufDvDBhWcFsOy4b7vtEwQ3DSxPnC5tTeOwGmenzLnffIlJkuzE12ZGSv+e+YlOxtbAN5xcpWZsrE/2qmjKo1nK7ekcXGtKqq1nRv2CZtNJzizEq8RMxmsXNDda1IsDSfb/DI6r5wJnANDrHnNUydiT/Gaedfzub6Kdb2EwttTlvZ3F7WNrdIW8ud/p34sUkwKDwMLUlgwPYZBWf6JLyml7k/T6VtdEv7i8clHDpbzImsuVS9pjclaZK7GgKsotvnaSmUoI2RI/lDzbtURmCp14XCdCABWXUgs0RuafNgBdvmyRKvQHBTzXX6di7Ks2vvrPgLZJ6FmQ9lQ5wsyIVvEyUyLbQzkUW5bfusJ+jxP6RAexwSLBq0z11hHxWqqUpiEaFCs8wlfdFoNgOLZK32k6mpRYMmJQ2a71m118jb3E/V49noMr6AbKkWS0UjuyQNhFAHb+EbXO0SJVQkNhpOcnaFS+WKVtIXs5K0iwXZpoP5/A2ndlVrDuZEy+aEn4Jd4WK9Qgok/D0Ag/k2xP92FLvTHV9WtAmpxhUSmyuYbtdqAWyX4KSJM1mvL1FENCy/hszfEaErrY3Z1ulpE3/bJiCAET8Mt2yzlpUap+ACxlxtWG/l6w4RJdowkOt1UdkgaOutRcnui12xNUSnCeKJHwpcEeWiVHclAbXlW7Cj5xuhtc+No9UPWu+w2iSpHM1mN7dzp+QIyma7yI2/QHVKtuV8kGvmh5an/aWFCpVgt4PjkRyLGQ2K7HIYTMrh7vQ9t3wkZm513AuyPzsbNRo3DosLxxYGxL7qK+sjRF4BUwb4F5EUG4EJq/miG4fhsCHhhVDv0rnIlopmaGxEvje447VF0+LM5ki6ZmKUl/kT0rtcgYJLhkgjKnRBgyk09xGjichrsyis+sa51XOzWM5m5bYoaV6kOUtRtF6dbUwW6LQz135ZFTbbs5Y5FTNnsXKTkRodlYZGyh+PloXAg0494be058U5TDIp8NhC9lJ0nphlhXBYLGzhy8AbzSGxHgP7DcodV2wzbjSct4ZXMcTjrd6FSXq9Mhtx4oxraqI33rfbGy+Sltmhhl+9HYTbQvtTYaRvqunlHbb3vpEN2a3EvmiTv4VzS+sBCTniknY0e51nC5GrG0fAUUkmj+D2UqgYuyxtLfCvld4GFX5ix/i6Jm8Hc6Jvu2ZcNhqIHUXP75aCmVVna6rRyM/yOFuvc0i49Ctid3ZUPRJbHj/SpK0gRCrMMk52yeGhWq8Ps/U65TyrkKgw6EO5TRdpzRRW//7Y0jSVCjdxkMpCIS5kycHNrl/Lf7IKbHSUGh3zzc566OV7cVP+EDcF8xfpQryb5tnycrqlPftzR2xV/sq4MmK30a0Ruw353mEYFTBiNYKcXM565fmIpB7f9EpMN5rechwIOR/HWOc3w+pd5GJ0vSlTsT+4uxJcEN/LudzRQpe90OWET8aJpAqkjW1DRwOCwd8UM5DbKpcDrTWivuX6MOvuGcqGSF/gueBHNIIj+FwLjEdGKHz1fZZM3mGp8OySDuVQeTp+d7MguqSxO+mlPm2UxZ+pmjqfBTtL+AsRb6UepVK3jjYMCX+MfhV+zSChqTIulMpOekzon1BnYLbDMMHoOzsWkePqmKew9ix7k7KY3kpdlMNtKkturdjQvri820pJZvAwqG5IWhvs1rDc6mAJhJV8yPmXRsPO2Lc/b1PVN3ecEm816yo2fNyzB2CSYXcgvTtUNd9LVWdba3K0vUTH269LS/r68F1MuuMcRa5R5UrP7nhZmoPuzLi99EQ/67GK2VNobJJy4WW9UkfXT88cfeaV2+JPqrWUaD9jpWOqy1MWl0UwU+ZWp+qg/GKaJnjQWVLc3OMC5Eb6afE4lbTsWaMh+jxcrx3B0XCvw+CONCkh1Rb8qnKty91KGiTbMpZWSJM5NUqiXgiRuPxWsa47WjxWgxMN+TWUD9CziZXOojk1qnZcFSUeStERN04gVvKb4JHmvfVBjRx9SS9HKsvJSrt686ejfLIa5eJBJsfLPBdyfNNoOL8J/sMsFdXSffzLcAXwU8keYBeeCBCoUd05j1Sq0lBASl3U+J8ttKV0AuNMJuklWgKQFJX4WjpjFf3cJquH58KfjgqaRHTU3ALu7V3J73siJ1e9+mBLHvK3tU3SIX+7zYHU7N9EjA/m2WQ5Q2vIc6Gde+E/aFZrk/W49HEoqpgpmoEZOCQ+tXP+5qnFYxieQn96SgUfj9KZmKD8ITZkx3KnFxQFYI8Oq9gnVerM+8RN7FDJ9zYah9UM0WztE7c1S2SfvB+WZ7iHofaw5C9LnWkPPSilQamXJUglK5eHpHyKNvecRE7aWg2vh1zEYVAe66I7Rr12KgpA0K22vd2dbg/g4r0QgkdI16ttneCFFOUFIYRDvtFJellv8pWE/c8K7AcmDu9wTx9LpUqjsefjh1mKitAfFOPfKcXgcO/g7eb2fK4a/EFR/t2SrGIZbqfp5fTPkRL5i1F+HYcbGHFRcQ3r9fd5XCOtLZGF/sugkSKVnFQOEcb4CAscgRH2nk5ioVDNpbgjlBuyf0n/xb2/Pr299/jRp6cv3z168uhNb480l1Xsc8+W4yBDom/YTbSMZD30eSg5X931edl1w4CWyltbGUIjUFyw3k/VMNAVuxzFMwG6P+I/GYmxkMqpZ6Bh9Uo4Ceodn2hCfg+Z2weZVHk2m4ncjJ38dGbxasOfiJ6uZLTD+W+9Yk0fBNoF9HN/PvqKaF6qlaDTYsxBvaYukjkpVA3AIhdfhFQPEITxYVC+U7diNM40Y0htKaJi8G2+amoxUBNbibdAul9B8rmAXBTLmYr/vtxmR2tgc77qTFmv6AjfaBymPlrOi4lFMfZ2vKQWufaxqnZOqXbFN2W2SKK81SEgVl+GrHAkVyCtiBF4Rl2HjDjkZegLK/FMsyOSxZKVQScmjoCBqXRY9hCVSJqk4VOvfvoyyu3DRBxIqTg5l9cyW8kDOvQ/YuV4DN7GCgql9cJIneMcyF0qtSGfAKlW6HBpZ+uLx3hgNOP/UXWbHuppZ0Zho/2zCh//lKspLkp10IbBWGfes+symDi3NK54tmGb0WTyCLH1eVooIUXuHJlKjsC5RWEuFpuaTyH0U9b6lbBLYwRxS2niHNF+hY7vjQaxU6A4fyZqdc9feiuVrPcXmjzNhELZHYRT0i1Ne9KyaobswtFofI111tX8VFXz03Y1bKM4fy4ajSelAGytBYO2BA1NZElCP9oQXtxawZUytRVdKVV2QKVE3YmIVCgdqWmsTKimmQKdeaQ2/HKWXYxm71CiXSrymguPIexCAF04hhPoQBhAG8IQWuhc14SwCRGELQghbA9hZXR7Ct1kpkY9Sy8TknRss9zSCWliRAEBAUb56MYt1ivTAgj1QljcKR6WDhmL7fKtONJFbqrmBwGEgJ1tQQeMU6D2BoRWFzotOOlAGHUhPIkw3AM0uy3AqBDHnS6EQdSCsN3sQBS0utAMjiNoBScd6IStFnSxSBhF3S6EHSwWtdrHnSGD+b7G29CBY+xAQH1oUTcC7EnUpc4E2J92B7vUDahXmA971gl076IWBENLMXytbD2cjlCSGabQGL1uKb0ydaatPDL1T4LhoBZvp7h1apZD7masrK4kgluU0sV+oRpEKCeBLVswVSong0Mu0X/jv9FP5ifpbIbhhkC5tp7ySx0r6TYR8UpBgTvJGH9m+DOixCU+rvBnij8TER8dgcItJw5ggUk3ItZhD6y95FJV9h0HEn1klJElb+fIRiwryDC4RjXhBRKn6ziAL1jjIg7gUsR2hW9rsc5G9zvhUnhkXFrIMQ0y/OOG2+sj62/Fj6j5doOXim1wlXxTP/QyeitKNyPckPXTleAYdODqOyUrIyfM+6Aq/7ks/lpwqZ++Cp7rp3uCZ5tNjdYPbG/In9TAo4ANoh+dncSRJ4br9dGRZcNi5kHv2RPBH9TKREcynXb0bZZe6B3z4MhV7tGBc+RK94gdbSqDyNqqZWtm0d80qILXlABWBsAUuSZchw0JaIFThwrJLUsYU5/wzzG6zyfhuhSnrfx+br5TPnIbZaDLlCHELJz+pLbcmsjpSkJGOpd2Q5FP8BvhCv+pqB3czwW6O2LWDPSbi9EmyurLtGjIcZ09FS5vQsYzL2xQtSD892JQoPmT+6dyw6H/CB1p8SB18Eg5GasSngr0f3xhmQG92QImjY6U1Pv6mA/RD4yesH/VczTksuoX9UX+oMWnNvqgRZP3uwXsR2rLZKnTF2djORDDeIwuux1XO8FaNlLvrWX5UrnHoBc75NzBv8wLIeNjZSJ/OMq9j2G1frmv0HcgPD3tui8ryuD7PpGNsM2AqMQ7EbcieIwU4WVJY+C+iJvRcecYfkWS8TsSjz+Qi/lTxBk805QxVQ7m6TJ4XiVIBp+RNTuviKfJ8grr/6Br7cInfPsNf/7Cn5/w5wn+CKR5UsVeBBmRP/xJ8KfAnzH+zPBniT8r/Jnizw3+XOPPBf58wZ9L/HmrqCOJcqKfn6EMBd9U2bUy5UqV3f9A70+xJy/w54FC4vwGH19jbV/x556Ku3CuyqFg0hv8eYo/7/XAR8p5pcpNgfnz0YJOS53bR1jXI8qJPw9VHODp2sOqWPTzc+zEPy/6QtVFP/9nRd+p+B0eTz82f1/qv3ZYvP/ehgApf4HGf6n/SPEcUv+h4lkZIyhlewjfC2u/3NfrOue7OidtKd+UMxjSweWVcsiweaW0zzKzaNfjckB0XhIrmJWOUfo8Wg91rEjE9X1flDE8MLqLBdw6lolW7SqMMCcHaui6pYJLF6pslMqSkO2rD9It6h5iGDjj78tTV2IcIPTpBXKXT3vbxq7CNnYt9wyMlmI4G7SS5dlADl23hPmtEaXM8MWGjv5K22TEpW1D47JB7GZaN5jWERjkIB2u1wH6h+unXj7IcJsRZ1+R9xIsDqBM2uEFcs0LvFS8C/cVb8KvikftLvyu+K9IzdwQ/sBH+BPTO/BMcdwE3OgEniveDOCz4uEJvFJcr2n4oHjYht907r8U90L4SfHBkRR4xp8SLozymyPA+GNiND8QcnIER0dwlKQzYeTa+qN5RXmvekllsUySdJwKqQ7mYp5RdZpTrDIdDeGJ4m+VM1EMhMSnhWKgZAnn8IT1lByEnSGPAB+Oh7xJD90hP9YyuOSPlaPtYQyozXrvdvfgI4kmzT7X4XUQDXjX+hq2WugfvfX9xPoetTu9CENVWd+P7e/doBd1j3fqt3yqMPIf9dj0shmYTrbRFlPyh8qRkkFCT7lkUFjeXCVx2baAFrYF9K0+h0Kb5zPc/Qb5MA6R50DWIPPCXtpHnJc8ZZuo3TUvUbvLrIWJTLEbbjtYyz7XcQa/S+XcMtgEurXoxiU2nhDVQx1O1udJo5G4qRf2ecZucwxRKM0p9cY+QbvbgBfWTeS7TaTUhJvT+DDIUsZr+kmt1NUAasbnCp4oBmNp0zUz9HYYUQzIumEb3siRmFCwyA7lfXmGbccIYCsjIorUoW0ropP3+8c9pZkY2Y/a7bOo3Y4lG9LsWIFQovZxrx1GhoMNOAVVQ/8/E2DNCy2PqQ1z/rcQ5P8aI6yjjBt02GWWaD2TlvVMFShUrdfVsywtSEKD2poDF7j/6mi/mncu95ae7Ae9il73I9E8i0Qzlj3pcdGbZLc5z101SF13iEHeeObm62CzmqYz4XieYL38X9hEFEJmHkoXrgzDJqxzNM4PiJSP5P9G4Ok65PRHCjltAk+P5H8l8rSe0JGsAk/joxV5WtdqQk9/GeWDpYSVhKmEiYSFhBsJcwnXcshHsp61CzT2CWqrJysKbj1vhH61v4dB5PW/Be21aeI4kniQFN0E63ARfYwhbW0BGGhSaybUD8NPU+CIbgng/KOoI01nJvi0nWSCT+f8ugwh9HGuIxCZuCU3+q0MabIowxPp14ksI1BPpR2CeiW3YlAv5d4g1HrB5RTXtYuZKAp1/hGjWrDSKcSpnTk+GqSrNS4SObyww2lMZw6JtsJfoLXlggS6S8EDNIi6FBTb27ln5+j3eZfyeNx2M7mkWqlM96yqUlcSNBp2Fa8VRiakKsLG8XazlqqlWt1UR9jx5JmDWfUaxsc1Rqz0LwWD7TFQ7CcPv1Sy8SVGLPHCDou/W4fJZLs70Zh2Wcn3W9wkiboKRV2L6JZZH+5kffj9rC/UdtYXqspKTfym30IQ/l9owv8TxWNB0Vr4T7YAdyV3nEERed8qjHBi/up34b9RnjeE1zp/uBWZ+4G8G2hUd+jUSPbrdTkYblIaDeSjT3k+kLb/ktxWhlDbJALJ01O9sfayU9Q2oFkDhmbGhwfafeGtDtBinvDvN8Uajcx14ZCy5NufGAZSfWucanW65Blkp6c87JVfLLXPV2lpPsh/HIPlvhXIpPvfhP9AQKGfvqL5tWEEsIsa+oq/UhR6ujDBqIJDnmpoILK+VQPXxdxDPib1yDfqQMBiyvRQlftO1MdcPZbxrUJRf3zmumOU8wdZNf/fcFzU/l/C8yBB1az/k/B4gpkeqjJA3JXgY5C13gPr/CViuGuHPel5jKYmRSfyjBe4vUl+VSZBvo01nofD1Uoe6zWvemaG7aaDHP9W/XTMqE/pbz48M39jk85cDO4qh/57xansexSBS0zFmTbdDJnZaXEcfR6x3lZPyt5uc0J6ToFM7PXMzjhCBkbVBC/102dY6YfXAqb66R66ZekZQg7hg+rzlCQ64V+hDFeaMA3MenqqhnpSab94qtyw90oZxKgRP+XjwVgPFHPj8PtoipfyKUxclwF9fKh4CrM+xT03zWFcPB5A3kcXMCfhy0HurYYYrHZcwfwv4fLiZyd1EwYjgxiUMtKVugnTLs/BIZ+w20l2q0eHPC6ezuiWeiz1vJ558TzQT244dHmkX6aYPPF4ZOZk0jciVsqnKFWnvdTziK3Iq0qDQ55XKO55cojjQ1Z9rPH2EOMROnoMTuqZVPbzWGMYmASeMsg9j4xIyQ7fcq4wDssUXg+B1dM9CGnuNCee8MSVg9yoCxDjeELZdCR1w9CWvJZuEruuo+NjTxT/qpyUVBkYiQP7kQIhFY7U2j/ubZM+6pcXkgIgwGqh4AGM+THMTAS3gCMv7Ix52OzCjDcpkh3qch8qvWWRjrsSKjIdpZg0sVid47pFn4/X6+yQJ2itOusXZ7SVEABdXsTBIc/OnIxAbX1BLe0LhVI2vbG46IeBLhp2dVqs345Nfux6yjM80kvOrB7HmUno6FfHjM/WMZ3vwgWhklZQQSQv+DGMeQtxkjz1qP4xb9byx0xDYkbRgclGKqU6ZgYYrpv0MRRifshT4jTH/YRNslviK2gsuGZU9fhQlfQlOOSel5iTfkTaMyc/JET9QVkKWQl1BgKlqp8xC31NvCZEjMUJQtiqkeCs6merQBjCMTpUWZmPrczHO7U3UUjiKJ/kOD3pmQW+ODcJHf3qGEDbOs1Psj4l4gHTEAvcHJoMiM3T7JY0f/+Nty+QUSKedfrn2MVPWEGGWegshVucxZu7iwLJs7m+AR01ngpGohY5K/sP1KAYojmoU7+74ZBh+DmkJfQeDaHAg4cAY9dpzlEvVf33oWKxk/ICL0QA8zktj0mU9UITyZ8gucKwD7gYM4/P6Z3KYYAZIj+Q8keol9PJqNvDmuivrkRIq5Lc4zd1JTlWUmJbcUoj7pluEZ+nzMNDcwb4VPLB7X0V/yXhV9T0/o4/f+DPn6jzBfz2E31r4bcWfuvit9adb238FnbwY/fOxw5+bEb4sRnpr092qtVFw479FfWQ+OE7ha3PeFT+J/25k6EZWRmi9lYDzYiqiLqYBfWeWEcQte7mwY91HrQD2Axr2fORtA+Wfsawbf3W2UkcWMTp/Q777DgkIfwpPkrWEP4fYkeceijLk8OV4u/1Cl3h0lwOlOvQQdOQGeNP4T8TA9UQ/n2M3+o/x6PGlRrWB2xlCpozWTp/I1vR199R98PxHMfBFAjA0YnsZ3z3779/9+jtp9eP3nx69PzRi0cv31ljeydrq2RJHN61MDHdsY6eQvWH8jziX55TnHHzl7RcQSy93OTPtzM/M5mfbWe2zhUsgUKrj4Q/ro4Ws35OKruc4RLOzgIU08bC4xlco1Ercp0JQrag4FAhcio3wn8szoSfclQE+SkYLdVemd+VZDHP4qgqSrxGyi/+eWHyQRYusacz+ptZwH25D7iTTIfyF/658oSf4E+qcJCy0SCGK1XmIVFnkuexF9I3SWxXimyLS6eljYZD9HWJYfX8JeSQe5q+Ko+OhFPzNzN/Bcb8Solt8YWilhgQBoB0DaTRA9AfC0baNrKx4zhR/lxQG1jGxZ5pSp4olyv9l6rn91XFKGHzmGgEpBUmLTVO7FkXqL3E3NS5Pd9x2VCk+b3rBbYWiiLuRSgCmN21HuttKpEhUae/I6QPqzFrr6nrU5yaat54NWQMyHEqz2hpnCtPgur/oSgC2x+K6dW3BApDI/xrLl2Fyo7rU+maXPjgCf8acBpo8q8pvXyp6qA8VIvLlb0P35fG6BIP6zivTMmD6v6Sm3IBoR+e8ufiEO9ya0WHXPnvRKPRPi6fOifl03GzfDoJy6cwqBLDsHrsdDr60XJYlJYZBMbTNlYQ2iLC8j6014LuKGnZSfeEzmNkiktsQl/4K2EgsxIMDKtNuD4iNMTQNOf485vQgFqidxK9a3ycmr8r4VH6J/qLa8z/JMjJCV09/FfCZkL/kFsWJNhF6b8UjQb++s/UXvKAHamtqF4J1zSHdsr6r+0OuK1c0G2kiUPzul6rfhuv9aj0n2Qk40WEl4c49vWasHUsGo1DJH/rdafT4TynyWkd8r0laVGvxPanto5yxXNfKsAfBM8hz/1PGsFoumCnKOX7S0GwKaN5UAbsziPpKHbKH0lHsn1d0e1ZvTUD2ZerFVWZ8IHoMr7zMGwyKL/WyNR1ndy/EF739LSFTKCmWrl/gzqB9Trq5/5UnQVxRz+EMXViqs6iuAlyjQGMO3rwRBvlGu8RQ4rYDD35r2YIv6JHmmRWHkoRfopqRaa/m4MEP6VNIeUhlH0GA0wD3jvATBOnfWwGRRSIcCyghZRDMzQPYfPEPHXRMe+lYPTi4KP/HMcVMFe/PcOx4ZumE5T2GUHQ2k57hWnd7bQPmIaXDem2cB1T+m/KpJi3ysppN1Vrq+8ka621ST6pZmB3mlpxsNvyX7iWlrPZYTkQrYC2cvy01bef6r5pQN1ZuzlSD5oMzPAV9TM0WZ2TKk4NVVd25e/+/sPhsH+KErRWTko8pwCoRIdsIFRnE0gzJXc0/pXg8HBYWpOIGVzZz/0PoldyWvji4Qds6RodDg1AwNROYEEeBxMpOxjySF+Q0/mbIZDSy+PZ5vvVS129y+VW5TzYEJyOm7g0jpt34GBwt3qo4piWFIFGphkt6j8NgCqgdiT7u85LHmxUuUYGNGJ3qOfRVgoo1isrtDt+EmLHT8L9Hf+gqof/1Y5/+Ecd1z0OA4J1GHwH2M8UK/vkRoRKjYaz3ZW7fanWKBJF3QcimSXdqAjdhqr+x8TSbB20GeZ+ouhBGe6k3hokD8yy/EvS8GPaOW7U2c7R+KE5c+iV1tjI7DUazst6D0wUKz9ap5P6RJpIdqF1vG/0qdNygEzjUHPIhm133VLDofgrhP1hqPdgWtRVrWqjK0QXUmiRW4Jdpr5U0ZQ7U3FTl3gq/lH15fk3Od4rFjf3AkVryW24EMPMf9WIoEFTJtFGbcGlhiLbBREmIiuOusaULMCcTIsKIfFDS9TH5Jy7btZobP/FGdDM+K8K14jB5v2Z//nftJ+h5FGgsZTnpF5GMh0yoYneNQqlh1KO4vS+wpsRfjjVdKiYKjA/Ba5tsgEO6c27r0wBTh+pUPmIcGL//8SVp3KAC2ro39cEhc7dI47X0jXRtqJk1DqdDi0cuV5Hls2FYScpF61nprc6Ld/iH6UD7ZLmK0LtolaxyVIJZp5Qn1YKDjmL21pA+ERsGsVnxZ25SX5CzgvpaMk21xOKHBzt95n+g8DDGFTbHO9dwlPGREQ4BjGypf3gzIk0h3rm/B2xs1K2GCSdtMUc6VpmosoxE3fqmYm7Fc3qO61RN1zzqJVZyx5WVQ9bD4eg81hwD38rGozsIIvDWop5VkqhJLYYSHmRJYPS5XjvRB3AeclXCpT/TPAp/n1u/p4Lnf5A6b9vtb1VovRtqt9M8pXS2atzdrQWqY/S6a06Lae3l6K88F35r8i4BAU+/PMG/4QhouuZ14wttd3z3ZNfLvwv2jQ/xSMI4Y/xfEb4FwrGlNgnNcwZkS96RFNrUn2Rr+59PElEeX5FBASmfNX/VZ39ijEfJ3yJyt8F/sHj7Bt6wAu5YK4fh72kjxojOgPv4+kmFP0VnXysWKVFUrAcSDcZHvL5ek2PHl55cUMvw0M+0amYtmDjTKpULoWJSxFp8k43EGKT2ZBzzJwNeyxzXe1mnkHeT8wG8AmlxITneOBYGA3Rno6XKhZH8dlANUZD1h+TwOd59Y3ISX91toqTGvyfDfidraMGsx+VBwLCnyqz7Ehpoyk0Plg2eyB5KzhpdqJWq3VslJNBrxkaA0x0+eAhSloh3ktM3ERpsbG9h5kvJ9q4oXwNg533pl0yNA02o96fythNWXWp7bxlc2RKzOCrVnq9U9XjY4WnufXYqPZ7+tt7nde/Qkqhkx7qMpRkaniJxrP8s/LIQLppVIsv1GCJ9iR0lqk8z7pXEQ9bw5bb/JmsrUFpM2dcBn8Jt+ke9/tNWg0/VW9Oqm9fI0UqWmM4KU8Yi1OecOm2Ie1z6bYaDXVmHySxOKGTJ03s9WHSG03uIZHV6VZLf3Hsi2EIfwkU+ozEi9rH0C5PXrywes69FrRM3GdjJ1UfmS3xJIhOBpusd17BFPXzcF7BU3qhDlVhYO2GJYjdEAqE0BtrOh7iNH7TNLXRuDR7VK079VAbC4qUsox+NXn5XetYLV3RK7kVeF0vDxLyKzXtSpyRoB/jpkfHQh+kPhWuDzh+265G9cWZsAPF/7XH3gXLoICIZlLXgpnjV6MlrUjPB0kk8lK4rQixwHTpFG8cz8oOehmxdeXAZT93TT1k0Fe9MZBkoyt5xkBbm2qNOO6363VAVpzy0CrADAFKeIs2esnrjwgmIFwz7EDCoPLj8lraZqV8bZL1YtdKiYb833aOEN8xSzlLQHfPUy9zjq6CSlMh0k7OSUGpJzyjyDUmzSUlvAZL+Tg1qZnCv9JDLTxWW+vct6uVVm2yrk3WtclKzOM8IQ6t8Mq5g4IoOR4wXgtm9M6pOuWF1o8QP3otYOtYgVL0WQEaJT2huFRPhNGx3z1RYGVxw/zOzUHNHI9KvEKHd0V+t6AKXES3glqh4wJ9yn5LNmw1T6EL0wGK1TldtTJoirVy01vTmU21wuqbQ1C/b7p8bc5AEjTNeo2uFE0Wa2GyRb/1gYgWWPA1w1VIGG7AByZLn+JeZIq2bX2YlJUQ/c+Bm7n1WPYBOevXCymrjjAw9oaze2ADWQnyrAZ5ZoGczhrugmVreWcVWcjgA9nLVpWwrTXu5H2ertdOTjsCbgfBHVhmfZ4zWu6/SR26qlzGdi5c0vVS1qcriUU6cQmUS5IZqzecRZzQaOsI96cdxfu2yG/OgnYl29//kWArt6RajH+sO0uTpL2JCDbylJendiTjPdf6Fy1tnt5XLP+xSFlpJg3KfTKCZa4FSwN/k3pXwCSJ9lKt1zS0+4rdkTmhOqOj5vcd01GZcFgt0UJ5Hu4HpX7DGrttOYMZUcbGTKTr+c9kWyJReP5HnHaMT/+70m6FNk/+j9AGRY1yamb4ZKaV09hLpBqjlfCl+jF+QbtPNWn5GvkzRIFC8UoJQ1jTR8OIqizZKOhunN43Bfr4ps8nlkYbuI2wdD6bNxrEqQSsVHoZJK55lgou+hQJqyMjViv31rWV5fGrd1/1DO7PFPVtC/dDr0rfwv4xgoz+8AhxFS1pccu7A/VtjB0rcxy81EujBL7p5z9E4Y2pghiFu9DStTP4v0FzZBhFzrvtCFTObxR5vwreF8jUypzPlR2G0AtZnaHJIM/5QhdZYMin6u0mZ7081/6qnRZE+E2/ha0ITKCPNOcTVV3A5kWsqijZ+wUrTctqOhDCcRNDdAQYbASSqn6MaXIc4U+3jEJSVP6ZA9/3JWpXunQrL4Px7qem+TDL0eswzRmM6CnJGSy3MqvcZF3tJqOL8wm0TsJ2c8hgSuXznMGEnrLc8lZa5Nus+b+iMxELN+xYd1F9J0vUtYJG53cPlWnrLgRJbUtB4loiiIcfodV67i9hxnN03ehjjHEMuk2PeCvjEwUrnvsKFRboLJ/7QqK//MS85eQ9v+C5f60L3eAjPc157n/RiddYhYQLnnoOkhg8yP/CU/TyWAmU1xhc8szVRj0orvEAvvEArngAD1DSj40lci9s90ea4KJjWHlkQoQUo627aOTuusPT0xGMXK5vhJZ8OZg1pkNDqa947UYDM4z4cAUjj1+B/oARWji/YrcFOXIZXxBZ6/fDTuOKKnpbfoOrBrrLXmlnkN7Vvi7e5r6UPOxEgTkqOBCbu9196/JZAyF7hWC1Orf5wej/WdUaEqvBrDH555Coxvrtf36s3747Vk233sKSp94Fkq1v/WV5jPPNWxIh6980GtdlaJDyZu5JqgPQHKgsO0hG+QHG1zuCqjsnVXf0LqxDMj7gCw9jfyB13Q0Q4rqCGUQYDx64Ll01THqzg+2L6eXezHSpxgOeet8qKwnZn7PbB3zhzj0d4Udw6c1pe/mv9wB1WqKveq6rdjLrmz0ELiNQ2LRd//x7nZ6bTlOvNYzm/x/AiFBK9aNemaWgLPCjN+XxZg/31J3kfribxnScNuo/tfe/2lRFLzotXEPfQVQMI7AXQXGpmmN8yVynXilsuFt1mjjNCB9MNeFJWFWz3eyMbnGc/aLX6Y8aX363ccMZXaKA+6WfatvV13zU7zd7mcdf4xJ+fXrahFmD9ogRI0apECRvLgVPkQET/LKfnV16mduO256TeZeMLLT4l3569sVL3ah9HEftYzyE+4JHEgs+01F80A9wVPnJXuf1IYHlRGrvgvw6h5yrs7DV6sRhq9XaDeUSmEguUsZhJ+wGkMv4MNQhXRJ6LCQGT8GfGf6M8GdJcafwaYKW1p/x54mKJSj8EfghpyAr+DSlfPizwJ8bvObwWtZhYAIGF9UrxiWAL7IMvJKjWX0cgJIY/fEtPn7DnysZK8sc8Eu+e8kj3vm+pgvZ15a18GWuHWzpiDqoclfFLRdLzBnaOTotQHBZLpB5bTGtDfAZteqUd8ozat6prptHk6y1KE+maAqvcn57RWB+IOMih9cynuXwVcbLHO7JeJrDuYwjlPsRIeANjv2pjNsnETyiYu8RMBt4YOoJsJ4x1TOielZUz4TqCU90PR2sxwt1RS2qKKCKQiuK1WsrHpZ2Q9AoNYYZjGAJK5jCBMx9XHABX+AS6BoceACv4WsVo6LD4J79cs6Lswd5fKWNpccYcaLd5+Pe2HXZ18G4dBzTLizag+XrQA1mQ4yOgl9WPPMfSljysN1b9nlIMubXwXLYW6L2Pk2cVX/ZaDgrviQF8bJk+M/99/LMecvf5k6Iq+oh+mjzt/opxCesmIcQsNh4M4542Fv2R6aJ0bA3cl3tZjOiE6gVHzFY8BDGPLTGkSbOAt0qYeFxHBME/UV5OhhiDxd0xIiS4HodHvIlq7/SscaAzNhNpbrOe4MxBpW6NxgPXazzDpRQtzSYYSCEdHCvhNiQz1ivWKUmMuN4hG478RV/wFN4zc/9c8Pb9ehLGF/xc/8B7kjn/mtJOT6VOSYiGWFcVMzyVWe5p7O8kUiP5zygi3rGfATfeIJzNOV4vhfAF3RiusFoUiu45DdeSFbqjYZz7j+SZzd9LvL4pi9yRqfk9odz/6mMb/r4h20fLCEb95Z/zZ0U792GCQiDeuf+FSqisbWxN4ELfJjiDbwo8154/NowHs68358w96JH8//NFUP+tpZ8L/Q0m2rC3rxx3WPXFCFNH2JdnznzBr/2Qpi7/JrFNHzXRYzzPJwg7ViF+GcgjLFtcFY25HCF6DNvXLJDjF5tHNwmjYYz4SsG31zd6ynHISzopbfsT13MQUg1dSdDWKBnIZu6LhC6Yc9uTMn/HoC/8HnjUi8MnEj3y5B/yZ0prOCbhwlsY8yP5uTHSGtq7E0YOgPOe2Y8hzQeM0YaGSLHykYOXZCZ1fjN1XOCS3Ef4PdDvRTjqaP8Ri/iFVjn2V/vkDIYa2I2Q5CNz/A08rSI8Y8bnhZsxi9zB432chD1JaFV1r7Oike/mNZohBi3snTdGKghSnU9qiQhN2tPuwIbFkzn01VRRV7x3cwHM4xvQ8e/X3LnpENbEHOkl1faD33edc/iBeA857cviKq/q3bSdqvF4LGM7+XwEn838Omf5Ko3hDd5HZvaWNY7pXH6jYBDZ8vQXvlXZMmCDFlf+VJikpR94rXYen1YZ+gGOxnCkDHbWPxp3TI6zMqzT3l8noPktw9lHGz0BbEvbK8549uK0Yxa/Rwd36/lIEdyaAJb6Dg1VvqJSe8G2+nHZXp3tx7lv5NWBC58BeU/ljyFjJ/oO1Soh+kGCnrINjAu+4y1vs4d5A6vJWAMVkRL4V9IGKOvLJ0r0DrBm+Ef4rHWpeRjfMJxNaPt7rR7GW/3tO8nZRqVTS9N0z2J62IGr3Mn0o02I9rIqU1p2lT+S8lTo3Wa4fsLNAvcCP+J4jg6unaMn4DwFSa8xIRc8bbuH7ZB6Pgo1/E1qytEZmrnBkd9u8bRSwyqNc9yDKC6WKojZkfSfJ/fOZIFcyPcPh6kjMXTIi6A8HW9Nu4C5CWwa2zvRb2i2rVQ/YOBMlcKT8khxYfE+KvfCCBMRrcJSRFYSmkjYnDl4KUyBaz4GK5RLKyvKDI7L+Y2my/he6wlcInGRbd1VbWa5R6xSlFDks1/s90J25zP2C0VutB+GxeCYxxG6c+ksZKnx7cO/oEZg9cOJunKu2FduXbloD/+fcnxkP8QLUCwN+u145w7XeRUUfZBLxb2r2ZYi3DjLM/FWB1M6YamA7p78ahsphKjsJnuIT93WqwsujRhv8d3ru7aX/yT02IwpyrcLuwMfM5g3g/b6/W8j++7EuYqlZNsZa7WvVO59McUA3MO0i/06QPd6SnRWS4wMGuHUWN2hpA7iWnqEZxbvBICNa7miqqaQfdQ++Li63956O3jZqulq9ipwUA9mY0ui4NCqL2jq2f3uULBsdsIGYaEphobjZbBKmcbXXbwJapHGcX3HPIDsWr+TfHZ9yv99p1Km3WlzbiEW13przrA6owS/b905//zrrfqVlrkCkulz6qJWuJE2e3+9MPBbDfDYrvkZ7TLs5pu1023YzIjN603Gs6UY9Mw7Rf0UjCYmmqMXxW6c9DD75h9zk3fPCzGTqsv16psG+ZEE6ff7/uF1J23rkvKIHOnDKaMQeHxKZ6uTwkoHp9q6FR84Be8yhvBFdQj7NQj7OAIMbC4QVVN1Aq79JQHyHXPOcZunKK+yBrvH+jK6S/lafWmB/ZKDTAZt7V5eRY1bzSKvr6r97871rnVQc1j2TP6imb0zrCP62Ef47DxkPC/OOw/t4b9ZzXsD/+Xw/5QDtuMt1uPtxtbrdNw9UIquzE7LF1usB8V0Ss3iHx8ME+LOYaz3kOtXjtsi2I9Q9fHQvb7J40Qyh1K3xXPt3a6bWVf3dsTQ6yqAt9yZ2cvPAmq7Ce0FR9KP6lMsx84DKLevi1Bt1cVJeLfJnOsjnXIjfNf5Yli2m9zyW7f1D2Igo4ZvuEP7jlN/JhLfnh4jsqJT/hz7kSsEtmrHjS3BfY0cZ7m6DNaZTgBuzufnIjBl+2tK6pr69jpzXh7G73A20oO8AYHe+Y2WOUO2E+a2BEcooa+QYgZO+TIRPTDzkdtdr27Uxcqy0XZktbMFvs3RVqRptrt6WzBd+Hfqkdak+YTIs0lOSaMtokymug6Uz4m5dHUrvZaOch/GppbL60xPiUWHa224u9g6UnHMA4tHMZU8nOnzVDrC58cYukmJiksE1ZSc0ItIL4IC/Wjbme9PpQkR2GRfjMw4MW0syM8B5qP5I2B61G8m3KQ5bUyvriZX2SzYi9HsbBp4UlNC0+OYx15z18gOVvJHjOofC3RqBTTXXc45OeY+skxIWp64UkfP/XYnYxBT/o3KEd8kSBR5pAoZ2Aa4HWM/JhkHC3TYOoGLsyzkBt4akmE1/w1yfAo6YQnsIQLvNtBwlOQJOlQO0sUlajiC3y6c6aGhwQlWn6X39qGTk05T7pb0JlKF2fJaEd6C47jG5zTNZNsCM6i9mPAc8Wv+u7SsNM3i2nB2Cc7k4aygZxZGYteeWaFMQzrgppqR65dHifEro5Y7IXcBcFFqkp0ycVCjPbBAHkV0xc0f5/ypovEC5BS6L0mPLa6g6xY84d9QWWarsXgDYude87xPygThu65c4zfjnUwLwLQtF/B/78yPu0d4HkGYUuYzzf6SDwKTrRgWMeKIGBSCMzOcC9SeR5ui0UqLzF8tJclHtHAvQhWLwgUvWkFPLJWwHtrBTwsVwChf6jRH8cOj+C9XgAP7QXwqFoA7/2H+kj2BX+IjwS6J3rtVVYoL9jdNbJ9rvb9ZZIr3qEG3hFoanaFulfPDzy2xvbSPOdqA/fp+UW9uiN4R7QSHsNLPbb79tge67Hlir/UT2prNPvGUlLD742CgLJ3n93adk5iWRsBmNQoKHkNpNdFn3cajXGfYkvfIs9BxisrrU3Y1TW8JSndQkZKCv4pDVlob6jGYfkUtQKmydANX5S1mOV5w1zn3HFu6ppceolajPX7djo2uJVtT+uf7ByA3XZ5naLl/MWdHHUKWNv+AsoBsEprEgXtemrM6JoRfiaY3WEUrWyd1o8x2ZwQ78Hkz4qbOhzaaZthrDUxJmdYz3kYS+Om7+CDFrBcfm7ePlWpOOzy+ZvUvElVYVRXGMXV7qH0zOfq+zP/gxlX/3+d8e9Oz47dwJ6JmagKVexZCtt15mYNyubduZmov5sbU02rrqZltHljmxQQg7nyxlRn3zCZeKm88qaAu9E18mxK/kMjnjtjxSq+iDNn6uHWgLE4JdqwT1k8oQTTyrJWPNic7VaU7KkxTEkHib5jR/rLwWSIQQLBdSf6zGLCEw97D5UW4+/rSu1aLLaa2GXDKWuuY2mpVKMg2JEuoqC9F8SDBDdh6s4YQ23t2F3VxTtaCnssDB+EEsrK42MTHmcF0h9J/FuKtKvytCGtd6nEW0HCasHwUovdClbkD43KX0swL+TZLCbRE6012CGVuatFpUshvqdD1bKxSTyuh3NcDqdhi+Q4KFskr6NcN3B47G7jJZn7J8136+a7sZmEax6Cte1FwUn9xWtufQoD88lrVefIpQp+s32Jpn2R2qPcnnBz37Fl9eFoEzYSBq/Fer06NG7V1Jt+tX9eyTPqOaXEhBL0yNZrCtBjZntF1pnkyr0TNrWKT3To5P6SjhFyf2lM/tDDw1+Whw9kGXpBnsRLZh2pagzOtT8M/uEmJ6ClKDlgX5O7+yl+LEO147OHGXqCnKyEcbJCu1VMxjvjypsYJAgGDobjZ2eOyRNsZ6DwHF/wDjNsjRqKHUxxuelH3UPsFGa/Pq077XJhDMkO9jWAGSHXfjD1oDBhy78T8EimXlloGOWRWwXeY1mBrMS9MACvVR7yLsmQXeDyxbkyweaW31/JJtyNvWT3tL4yra/I1l/RBdMuKW7OOi2KH2SxZGdh1K3SDOe/XpO6wWSI2h30TsQJX5LtyIp+r7UfkH6moHUcDX6vLfskwrs6rjgRkgtpUuNZ+WTZKW2ZRV+gRYu+pOwCbUiq+D9AlVxAtBOh8ds/LT6I9KvZpC8GTf2ubZnK6ls71V85OlTFSFteLwX5i68EGWcnlXF2oSd1hgIojAj6Vrh1B0nXSNvOLQVPtK3cmMIeksugMa8bC16ARGM5kGQoZwVad9jtTJ/wWWYBTq28re92f5T3Cs+DmQmqilduMDTbxWjbZKcbGJPiKpJxGQi/JwwPZEXztWJqakNCwTzLreYTHWxjrQJNB+175xzz4bgxwk/HjZF9tZZleqYP5s+8KNZWgS/0VR4deJfvu+OQhx1Q/EVu7jh8JjEcND0+l9b9Gfq2EnOPhIAWo0jdpoj2MijDQjK2QU8XqrO2yS2zVtfEqD6ejXpeaZloMuBVU7Sf6Yz9KpbfQVlDsSB5zYThty5/yuie2VzMxKigi7O32zw1o2o0trotto6YH1u2BVjnu9xpRvAip6u7lrNZnRMPrUsbhFfS0RdffJDmGnrtioS/Fi7NlHOEl7sfJPpy4oMjVzLrmk3bhDGjAeQ3t8qvR1RdG2+NulDOLV3/67DbDajyhlxUTbJbuV6jM7HDtGlqwaU/Fxq+v0n7atVxGV5/fJqWtyuU1xCYWS/TvTGYi/hmNkM0hrGba/avwJU4gwJXYgAFrsRZWSm+VTfH5Fz5nxF2KXqQ4WgLXNk5FLiysegK9zxTtIyF+he6xQaM3DVMlwqzUY/7QblVHoZoEfKTjHPbWWfMwIAzpkuwxHrtCH6IATBKMOcYp7yXYmJSXd4uiavThj0IO35oRTnCSOE707zIs7FAewe6lvjgyMXwp6kczWY3t+l6neE1ZZtyHgx/6nK8ej2Z6QvtyJccWbp6onZmM9GzWVq/mWWkAZqXAE0QoBISDdAEASr3ADTBaABF9clLDECLLYBmBFBpA7T4e4BKAmiOiWkF0KwGaK0luwtHgln6bURrYh8wcwQmGqBp/Bb+E+kk5RIsaAkWO3UKObFWYIFR6a3QtPn2VYDfW17VJa2qGpLwf6pUY6zuoagAwarpZbfYKJpy3VpXfiNtoCvciZY8qM0D9HXXj0ezGcp/6HZ45+OHWXpB2+hDMf5RwT2fsWivELPExw68yCbLmeCj4kaODzC8hmo09N30dLE4cZ3f7xvyo/oehh/0g+d0E8Dtd2uJ921URxORzEZKHNXW7OWs7f96dPktXRzhPdrNMC6/e/loRWle2I5DvCVANRpHcjm/EDledn6zQEkDWdgvYnZm/qL9r8GJx7lz+0oSrtvX6OHdzHWkkBvB6Z5VoEvs4IOMBWYnIYJ3IUevoYy/xBg6VSSXRBtsHlrGSOS8iELaEWCoYx0sFwNI9XMiD2iO5IXtfl4XybmXa4Y874dtuvsigtzjYUcfH/Sz9Trrn6zX3UMMQtXt5+t1TqYzQR/t9fBT0E/X67TfWq+7HC/VCPGKhKoFnebk/KTcU2io5eALjBhwg6xX4c/xwuQC4161IigwgFIChRWCqEDbHST2WvrBVyj8+4JjihdC4f8qeOYeQ+H/bnL8ijn+wBy/6xx/Cu5gcnVPLe4dvLqVtSDpo8AAS8bovEx5bqX8TinXtON8ppYytwMFhmEqbch+xi+Y64Pg+gUbajSwavx9Tr/n4swpMGoTPtZksiz7Bjv+Srim+AvBmz/TRzS6KvwphhEq/Bu8z6Tw7ykuwbpwz4p1Y2BNYaaQ06ObQTkKPWS+pFEGBZcIjDmmwqCJJtoTRn4CNLIk5YSiwFaKAlthbCoecbTsE2ftY7zMF6WlMoUO22N9BK4w/pcX6Q4Sor6nEA1VKKo+f6WY7ZP1qoz6Y+L96OtcjcP8e2HfCXsnu2bVsICJNveQGntYN2buurVr0ElVLQ/vNPrwTqN3itxp+IXSt4FYDX++2/Bnuxa6n2qr4RfqbsM7ReyGMcAON/fSUjgdczNtJuEJ3mPqhvBMwQftIP/YyvqwypqgGw4E8LzK99LK90JtXXarMOdnhTdpbN04pi8kC3QYnw1zMEwdRfGpVn+gqRTiBEYB4Xj167WAFyYIwKXiT+VAUKS83yk6iZXwKyZcWAl/YMIXK+FPHRCQOpKVQRPpj6h80SlCgHFIX1bBG0jP4N+IMmoT3uZh4vFBecu612JAEdzAazEWey3STeTQBQld5Df/kvGfEp7I+JnEzRs5gB6JEqs8VaOLGXJW5aMWoXIxmpgP5aO/SBfi3TTPlpdTB5kNZAp+sFf+eCssRRBnK7EiGX+/A5aJnZaV3InD9n+635Gb2WG4veXV+7Nltru7yxl6ZbhRD0+qKwqX63opTMsN7hW53lTITy8703Y32lFt9+ZX3RAJw1s7qvEDx2jiSLe8sFPFFfciDBMLuX8lTT9AcU8Z8yjedh3V77eYznAYQqvbpz0ZvYBZrwwgTNpFC4KYpas310xT61pXiH4/qPTTcRpzCgeogw6STu5CcAV36X4l4TsVdb/W1P2afknV9g+K1buG8kfS2jpUfedD2Ci3BonCBQ2uBroiI6UQlJ+YvwWdsym0qaXcpHsw95tPxEwocYBRCPHiburrpe44mZN/QYt5VT3dyCpNaolCH+IZmmP9YoBkqVckrtL3Oa7Sh/nGEKftRaq+t0jVDxcpVtb7f/5f")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
|
|
243
245
|
|
|
244
246
|
/*
|
|
245
|
-
Copyright (c)
|
|
247
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
246
248
|
|
|
247
249
|
Redistribution and use in source and binary forms, with or without
|
|
248
250
|
modification, are permitted provided that the following conditions are met:
|
|
@@ -270,72 +272,19 @@ const r=[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,1
|
|
|
270
272
|
*/
|
|
271
273
|
|
|
272
274
|
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const RESERVED_COMPRESSION_METHODS = [
|
|
279
|
-
COMPRESSION_METHOD_STORE,
|
|
280
|
-
COMPRESSION_METHOD_DEFLATE,
|
|
281
|
-
COMPRESSION_METHOD_DEFLATE_64,
|
|
282
|
-
COMPRESSION_METHOD_AES
|
|
283
|
-
];
|
|
284
|
-
|
|
285
|
-
const registeredCodecs = new Map();
|
|
286
|
-
const codecStreams = new Map();
|
|
287
|
-
|
|
288
|
-
function registerCodec(codec = {}) {
|
|
289
|
-
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
290
|
-
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
291
|
-
typeof format != STRING_TYPE || !format.length) {
|
|
292
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
293
|
-
}
|
|
294
|
-
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
295
|
-
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
296
|
-
}
|
|
297
|
-
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
298
|
-
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
299
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
300
|
-
}
|
|
301
|
-
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
302
|
-
if (hasStreams) {
|
|
303
|
-
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
function unregisterCodec(compressionMethod) {
|
|
308
|
-
const codec = registeredCodecs.get(compressionMethod);
|
|
309
|
-
if (codec) {
|
|
310
|
-
registeredCodecs.delete(compressionMethod);
|
|
311
|
-
let formatUsed;
|
|
312
|
-
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
313
|
-
if (!formatUsed) {
|
|
314
|
-
codecStreams.delete(codec.format);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function getRegisteredCodec(compressionMethod) {
|
|
320
|
-
return registeredCodecs.get(compressionMethod);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
function getCodecStreams(format) {
|
|
324
|
-
return codecStreams.get(format);
|
|
275
|
+
function concat(first, second) {
|
|
276
|
+
const result = new Uint8Array(first.length + second.length);
|
|
277
|
+
result.set(first);
|
|
278
|
+
result.set(second, first.length);
|
|
279
|
+
return result;
|
|
325
280
|
}
|
|
326
281
|
|
|
327
|
-
function
|
|
328
|
-
|
|
329
|
-
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
330
|
-
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
331
|
-
}
|
|
332
|
-
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
282
|
+
function toExactUint8Array(array) {
|
|
283
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
333
284
|
}
|
|
334
285
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
338
|
-
}
|
|
286
|
+
function getDataView(array) {
|
|
287
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
339
288
|
}
|
|
340
289
|
|
|
341
290
|
/*
|
|
@@ -520,50 +469,6 @@ function encodeText(value) {
|
|
|
520
469
|
}
|
|
521
470
|
}
|
|
522
471
|
|
|
523
|
-
/*
|
|
524
|
-
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
525
|
-
|
|
526
|
-
Redistribution and use in source and binary forms, with or without
|
|
527
|
-
modification, are permitted provided that the following conditions are met:
|
|
528
|
-
|
|
529
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
530
|
-
this list of conditions and the following disclaimer.
|
|
531
|
-
|
|
532
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
533
|
-
notice, this list of conditions and the following disclaimer in
|
|
534
|
-
the documentation and/or other materials provided with the distribution.
|
|
535
|
-
|
|
536
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
537
|
-
derived from this software without specific prior written permission.
|
|
538
|
-
|
|
539
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
540
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
541
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
542
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
543
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
544
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
545
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
546
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
547
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
548
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
549
|
-
*/
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
function concat(first, second) {
|
|
553
|
-
const result = new Uint8Array(first.length + second.length);
|
|
554
|
-
result.set(first);
|
|
555
|
-
result.set(second, first.length);
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
function toExactUint8Array(array) {
|
|
560
|
-
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
function getDataView(array) {
|
|
564
|
-
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
565
|
-
}
|
|
566
|
-
|
|
567
472
|
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
568
473
|
|
|
569
474
|
// deno-lint-ignore-file no-this-alias
|
|
@@ -1933,6 +1838,102 @@ function toCompatibleWritable(writable) {
|
|
|
1933
1838
|
});
|
|
1934
1839
|
}
|
|
1935
1840
|
|
|
1841
|
+
/*
|
|
1842
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1843
|
+
|
|
1844
|
+
Redistribution and use in source and binary forms, with or without
|
|
1845
|
+
modification, are permitted provided that the following conditions are met:
|
|
1846
|
+
|
|
1847
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
1848
|
+
this list of conditions and the following disclaimer.
|
|
1849
|
+
|
|
1850
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1851
|
+
notice, this list of conditions and the following disclaimer in
|
|
1852
|
+
the documentation and/or other materials provided with the distribution.
|
|
1853
|
+
|
|
1854
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
1855
|
+
derived from this software without specific prior written permission.
|
|
1856
|
+
|
|
1857
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
1858
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
1859
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
1860
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
1861
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
1862
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
1863
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
1864
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
1865
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
1866
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1867
|
+
*/
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
|
|
1871
|
+
const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
|
|
1872
|
+
const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
|
|
1873
|
+
|
|
1874
|
+
const RESERVED_COMPRESSION_METHODS = [
|
|
1875
|
+
COMPRESSION_METHOD_STORE,
|
|
1876
|
+
COMPRESSION_METHOD_DEFLATE,
|
|
1877
|
+
COMPRESSION_METHOD_DEFLATE_64,
|
|
1878
|
+
COMPRESSION_METHOD_AES
|
|
1879
|
+
];
|
|
1880
|
+
|
|
1881
|
+
const registeredCodecs = new Map();
|
|
1882
|
+
const codecStreams = new Map();
|
|
1883
|
+
|
|
1884
|
+
function registerCodec(codec = {}) {
|
|
1885
|
+
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
1886
|
+
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
1887
|
+
typeof format != STRING_TYPE || !format.length) {
|
|
1888
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1889
|
+
}
|
|
1890
|
+
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
1891
|
+
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
1892
|
+
}
|
|
1893
|
+
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
1894
|
+
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
1895
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1896
|
+
}
|
|
1897
|
+
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
1898
|
+
if (hasStreams) {
|
|
1899
|
+
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
function unregisterCodec(compressionMethod) {
|
|
1904
|
+
const codec = registeredCodecs.get(compressionMethod);
|
|
1905
|
+
if (codec) {
|
|
1906
|
+
registeredCodecs.delete(compressionMethod);
|
|
1907
|
+
let formatUsed;
|
|
1908
|
+
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
1909
|
+
if (!formatUsed) {
|
|
1910
|
+
codecStreams.delete(codec.format);
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
function getRegisteredCodec(compressionMethod) {
|
|
1916
|
+
return registeredCodecs.get(compressionMethod);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
function getCodecStreams(format) {
|
|
1920
|
+
return codecStreams.get(format);
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
function setCodecStreams(format, streams) {
|
|
1924
|
+
const { CompressionStream, DecompressionStream } = streams;
|
|
1925
|
+
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
1926
|
+
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
1927
|
+
}
|
|
1928
|
+
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
async function ensureCodecStreams(format, codecURI) {
|
|
1932
|
+
if (!codecStreams.has(format) && codecURI) {
|
|
1933
|
+
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
1934
|
+
}
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1936
1937
|
/*
|
|
1937
1938
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1938
1939
|
|
|
@@ -2486,8 +2487,8 @@ class ChunkStream extends TransformStream {
|
|
|
2486
2487
|
1. Redistributions of source code must retain the above copyright notice,
|
|
2487
2488
|
this list of conditions and the following disclaimer.
|
|
2488
2489
|
|
|
2489
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
2490
|
-
notice, this list of conditions and the following disclaimer in
|
|
2490
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2491
|
+
notice, this list of conditions and the following disclaimer in
|
|
2491
2492
|
the documentation and/or other materials provided with the distribution.
|
|
2492
2493
|
|
|
2493
2494
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -2506,20 +2507,15 @@ class ChunkStream extends TransformStream {
|
|
|
2506
2507
|
*/
|
|
2507
2508
|
|
|
2508
2509
|
|
|
2509
|
-
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2510
|
-
const ERROR_EVENT_TYPE = "error";
|
|
2511
|
-
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2512
2510
|
const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
|
|
2513
2511
|
|
|
2514
|
-
let webWorkerSupported,
|
|
2515
|
-
let transferStreamsSupported = true;
|
|
2516
|
-
try {
|
|
2517
|
-
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2518
|
-
} catch {
|
|
2519
|
-
// ignored
|
|
2520
|
-
}
|
|
2512
|
+
let webWorkerSupported, createWorkerFailed, webWorkerBackend;
|
|
2521
2513
|
let initModule = () => { };
|
|
2522
2514
|
|
|
2515
|
+
function setWebWorkerBackend(backend) {
|
|
2516
|
+
webWorkerBackend = backend;
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2523
2519
|
async function supportsDeflate(config) {
|
|
2524
2520
|
const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
|
|
2525
2521
|
if (FallbackStream && !FallbackStream.requiresModule) {
|
|
@@ -2544,6 +2540,14 @@ function resetWebWorkerSupport() {
|
|
|
2544
2540
|
createWorkerFailed = false;
|
|
2545
2541
|
}
|
|
2546
2542
|
|
|
2543
|
+
function disableWebWorker(workerData) {
|
|
2544
|
+
if (workerData.createWorker) {
|
|
2545
|
+
createWorkerFailed = true;
|
|
2546
|
+
} else {
|
|
2547
|
+
webWorkerSupported = false;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
|
|
2547
2551
|
class CodecWorker {
|
|
2548
2552
|
|
|
2549
2553
|
constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
|
|
@@ -2596,7 +2600,7 @@ class CodecWorker {
|
|
|
2596
2600
|
// deno-lint-ignore valid-typeof
|
|
2597
2601
|
webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
|
|
2598
2602
|
}
|
|
2599
|
-
return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ?
|
|
2603
|
+
return (useWebWorkers && webWorkerBackend && ((webWorkerSupported && workerURI) || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
|
|
2600
2604
|
}
|
|
2601
2605
|
}
|
|
2602
2606
|
|
|
@@ -2613,85 +2617,31 @@ class ProgressWatcherStream extends TransformStream {
|
|
|
2613
2617
|
async transform(chunk, controller) {
|
|
2614
2618
|
chunkOffset += chunk.length;
|
|
2615
2619
|
if (onprogress) {
|
|
2616
|
-
await callHandler(onprogress, chunkOffset, size);
|
|
2617
|
-
}
|
|
2618
|
-
controller.enqueue(chunk);
|
|
2619
|
-
},
|
|
2620
|
-
async flush() {
|
|
2621
|
-
if (onend) {
|
|
2622
|
-
await callHandler(onend, chunkOffset);
|
|
2623
|
-
}
|
|
2624
|
-
}
|
|
2625
|
-
});
|
|
2626
|
-
}
|
|
2627
|
-
}
|
|
2628
|
-
|
|
2629
|
-
async function callHandler(handler, ...parameters) {
|
|
2630
|
-
try {
|
|
2631
|
-
await handler(...parameters);
|
|
2632
|
-
} catch {
|
|
2633
|
-
// ignored
|
|
2634
|
-
}
|
|
2635
|
-
}
|
|
2636
|
-
|
|
2637
|
-
function createWorkerInterface(workerData, config) {
|
|
2638
|
-
return {
|
|
2639
|
-
run: () => runWorker$1(workerData, config)
|
|
2640
|
-
};
|
|
2641
|
-
}
|
|
2642
|
-
|
|
2643
|
-
function createWebWorkerInterface(workerData, config) {
|
|
2644
|
-
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2645
|
-
let { wasmURI } = config;
|
|
2646
|
-
|
|
2647
|
-
if (!workerData.interface) {
|
|
2648
|
-
// deno-lint-ignore valid-typeof
|
|
2649
|
-
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2650
|
-
wasmURI = wasmURI();
|
|
2651
|
-
}
|
|
2652
|
-
let worker;
|
|
2653
|
-
try {
|
|
2654
|
-
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2655
|
-
} catch {
|
|
2656
|
-
if (workerData.createWorker) {
|
|
2657
|
-
createWorkerFailed = true;
|
|
2658
|
-
} else {
|
|
2659
|
-
webWorkerSupported = false;
|
|
2660
|
-
}
|
|
2661
|
-
return createWorkerInterface(workerData, config);
|
|
2662
|
-
}
|
|
2663
|
-
Object.assign(workerData, {
|
|
2664
|
-
worker,
|
|
2665
|
-
workerAlive: false,
|
|
2666
|
-
terminated: false,
|
|
2667
|
-
interface: {
|
|
2668
|
-
run: async () => {
|
|
2669
|
-
try {
|
|
2670
|
-
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2671
|
-
} catch (error) {
|
|
2672
|
-
if (error && error.workerStartupFailed) {
|
|
2673
|
-
if (workerData.createWorker) {
|
|
2674
|
-
createWorkerFailed = true;
|
|
2675
|
-
} else {
|
|
2676
|
-
webWorkerSupported = false;
|
|
2677
|
-
}
|
|
2678
|
-
releaseWorkerStreams(workerData);
|
|
2679
|
-
return runWorker$1(workerData, config);
|
|
2680
|
-
}
|
|
2681
|
-
if (error && error.codecImportFailed) {
|
|
2682
|
-
if (workerData.reader) {
|
|
2683
|
-
releaseWorkerStreams(workerData);
|
|
2684
|
-
return runWorker$1(workerData, config);
|
|
2685
|
-
}
|
|
2686
|
-
workerData.onTaskFinished();
|
|
2687
|
-
}
|
|
2688
|
-
throw error;
|
|
2689
|
-
}
|
|
2620
|
+
await callHandler(onprogress, chunkOffset, size);
|
|
2621
|
+
}
|
|
2622
|
+
controller.enqueue(chunk);
|
|
2623
|
+
},
|
|
2624
|
+
async flush() {
|
|
2625
|
+
if (onend) {
|
|
2626
|
+
await callHandler(onend, chunkOffset);
|
|
2690
2627
|
}
|
|
2691
2628
|
}
|
|
2692
2629
|
});
|
|
2693
2630
|
}
|
|
2694
|
-
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2633
|
+
async function callHandler(handler, ...parameters) {
|
|
2634
|
+
try {
|
|
2635
|
+
await handler(...parameters);
|
|
2636
|
+
} catch {
|
|
2637
|
+
// ignored
|
|
2638
|
+
}
|
|
2639
|
+
}
|
|
2640
|
+
|
|
2641
|
+
function createWorkerInterface(workerData, config) {
|
|
2642
|
+
return {
|
|
2643
|
+
run: () => runWorker$1(workerData, config)
|
|
2644
|
+
};
|
|
2695
2645
|
}
|
|
2696
2646
|
|
|
2697
2647
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
@@ -2742,6 +2692,95 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2742
2692
|
}
|
|
2743
2693
|
}
|
|
2744
2694
|
|
|
2695
|
+
/*
|
|
2696
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
2697
|
+
|
|
2698
|
+
Redistribution and use in source and binary forms, with or without
|
|
2699
|
+
modification, are permitted provided that the following conditions are met:
|
|
2700
|
+
|
|
2701
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
2702
|
+
this list of conditions and the following disclaimer.
|
|
2703
|
+
|
|
2704
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2705
|
+
notice, this list of conditions and the following disclaimer in
|
|
2706
|
+
the documentation and/or other materials provided with the distribution.
|
|
2707
|
+
|
|
2708
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
2709
|
+
derived from this software without specific prior written permission.
|
|
2710
|
+
|
|
2711
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
2712
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
2713
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
2714
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
2715
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
2716
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
2717
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
2718
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
2719
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
2720
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
2721
|
+
*/
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2725
|
+
const ERROR_EVENT_TYPE = "error";
|
|
2726
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2727
|
+
|
|
2728
|
+
let webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
2729
|
+
let transferStreamsSupported = true;
|
|
2730
|
+
try {
|
|
2731
|
+
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2732
|
+
} catch {
|
|
2733
|
+
// ignored
|
|
2734
|
+
}
|
|
2735
|
+
|
|
2736
|
+
setWebWorkerBackend(createWebWorkerInterface);
|
|
2737
|
+
|
|
2738
|
+
function createWebWorkerInterface(workerData, config) {
|
|
2739
|
+
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2740
|
+
let { wasmURI } = config;
|
|
2741
|
+
|
|
2742
|
+
if (!workerData.interface) {
|
|
2743
|
+
// deno-lint-ignore valid-typeof
|
|
2744
|
+
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2745
|
+
wasmURI = wasmURI();
|
|
2746
|
+
}
|
|
2747
|
+
let worker;
|
|
2748
|
+
try {
|
|
2749
|
+
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2750
|
+
} catch {
|
|
2751
|
+
disableWebWorker(workerData);
|
|
2752
|
+
return createWorkerInterface(workerData, config);
|
|
2753
|
+
}
|
|
2754
|
+
Object.assign(workerData, {
|
|
2755
|
+
worker,
|
|
2756
|
+
workerAlive: false,
|
|
2757
|
+
terminated: false,
|
|
2758
|
+
interface: {
|
|
2759
|
+
run: async () => {
|
|
2760
|
+
try {
|
|
2761
|
+
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2762
|
+
} catch (error) {
|
|
2763
|
+
if (error && error.workerStartupFailed) {
|
|
2764
|
+
disableWebWorker(workerData);
|
|
2765
|
+
releaseWorkerStreams(workerData);
|
|
2766
|
+
return runWorker$1(workerData, config);
|
|
2767
|
+
}
|
|
2768
|
+
if (error && error.codecImportFailed) {
|
|
2769
|
+
if (workerData.reader) {
|
|
2770
|
+
releaseWorkerStreams(workerData);
|
|
2771
|
+
return runWorker$1(workerData, config);
|
|
2772
|
+
}
|
|
2773
|
+
workerData.onTaskFinished();
|
|
2774
|
+
}
|
|
2775
|
+
throw error;
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2778
|
+
}
|
|
2779
|
+
});
|
|
2780
|
+
}
|
|
2781
|
+
return workerData.interface;
|
|
2782
|
+
}
|
|
2783
|
+
|
|
2745
2784
|
async function runWebWorker(workerData, config) {
|
|
2746
2785
|
let resolveResult, rejectResult;
|
|
2747
2786
|
const result = new Promise((resolve, reject) => {
|
|
@@ -3618,7 +3657,7 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
3618
3657
|
forceRangeRequests,
|
|
3619
3658
|
combineSizeEocd
|
|
3620
3659
|
} = httpReader;
|
|
3621
|
-
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest ==
|
|
3660
|
+
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
3622
3661
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
|
|
3623
3662
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
3624
3663
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
@@ -4471,9 +4510,13 @@ const OPTION_USDZ = "usdz";
|
|
|
4471
4510
|
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4472
4511
|
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4473
4512
|
const OPTION_STRICTNESS = "strictness";
|
|
4513
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4514
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4474
4515
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4475
4516
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4476
4517
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4518
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
4519
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
4477
4520
|
const STRICTNESS_STRICT = "strict";
|
|
4478
4521
|
const STRICTNESS_BALANCED = "balanced";
|
|
4479
4522
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
@@ -4520,6 +4563,11 @@ const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
|
4520
4563
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4521
4564
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4522
4565
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4566
|
+
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
4567
|
+
const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
|
|
4568
|
+
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4569
|
+
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4570
|
+
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4523
4571
|
const CHARSET_UTF8 = "utf-8";
|
|
4524
4572
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
4525
4573
|
const CHARSET_CP437 = "cp437";
|
|
@@ -4541,6 +4589,10 @@ const ZIP64_EXTRACTION = {
|
|
|
4541
4589
|
bytes: 8
|
|
4542
4590
|
}
|
|
4543
4591
|
};
|
|
4592
|
+
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4593
|
+
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4594
|
+
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4595
|
+
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
4544
4596
|
|
|
4545
4597
|
class ZipReader {
|
|
4546
4598
|
|
|
@@ -4569,6 +4621,8 @@ class ZipReader {
|
|
|
4569
4621
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4570
4622
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
4571
4623
|
const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue$1(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
|
|
4624
|
+
const filenameValidation = getFilenameValidation(getOptionValue$1(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
|
|
4625
|
+
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4572
4626
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4573
4627
|
if (!endOfDirectoryInfo) {
|
|
4574
4628
|
const signatureArray = await readUint8Array(reader, 0, 4);
|
|
@@ -4762,11 +4816,22 @@ class ZipReader {
|
|
|
4762
4816
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4763
4817
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4764
4818
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4765
|
-
let filename = decode(rawFilename, rawFilenameEncoding);
|
|
4819
|
+
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
4766
4820
|
if (filename === UNDEFINED_VALUE) {
|
|
4767
4821
|
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
4768
4822
|
}
|
|
4769
|
-
|
|
4823
|
+
if (normalizeFilename) {
|
|
4824
|
+
const normalizedFilename = normalizeFilename(filename);
|
|
4825
|
+
if (normalizedFilename !== UNDEFINED_VALUE) {
|
|
4826
|
+
filename = normalizedFilename;
|
|
4827
|
+
}
|
|
4828
|
+
}
|
|
4829
|
+
if (isUnsafeFilename(filename, filenameValidation)) {
|
|
4830
|
+
const error = new Error(ERR_UNSAFE_FILENAME);
|
|
4831
|
+
error.filename = filename;
|
|
4832
|
+
throw error;
|
|
4833
|
+
}
|
|
4834
|
+
let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
|
|
4770
4835
|
if (comment === UNDEFINED_VALUE) {
|
|
4771
4836
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
4772
4837
|
}
|
|
@@ -4827,10 +4892,10 @@ class ZipReader {
|
|
|
4827
4892
|
entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4828
4893
|
entry.arrayBuffer = async options => {
|
|
4829
4894
|
const writer = new TransformStream();
|
|
4830
|
-
const
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
return
|
|
4895
|
+
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
4896
|
+
arrayBufferPromise.catch(() => { });
|
|
4897
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4898
|
+
return arrayBufferPromise;
|
|
4834
4899
|
};
|
|
4835
4900
|
offset = endOffset;
|
|
4836
4901
|
const { onprogress } = options;
|
|
@@ -5081,7 +5146,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5081
5146
|
readRanges
|
|
5082
5147
|
});
|
|
5083
5148
|
}
|
|
5084
|
-
let writable;
|
|
5149
|
+
let writable, abortError;
|
|
5085
5150
|
try {
|
|
5086
5151
|
if (!checkOverlappingEntryOnly) {
|
|
5087
5152
|
if (checkPasswordOnly) {
|
|
@@ -5101,12 +5166,22 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5101
5166
|
writer.size += error.outputSize;
|
|
5102
5167
|
}
|
|
5103
5168
|
if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5169
|
+
abortError = error;
|
|
5104
5170
|
throw error;
|
|
5105
5171
|
}
|
|
5106
5172
|
} finally {
|
|
5107
5173
|
const preventClose = getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
|
|
5108
5174
|
if (!preventClose && writable && !writable.locked) {
|
|
5109
|
-
|
|
5175
|
+
const writableWriter = writable.getWriter();
|
|
5176
|
+
if (abortError) {
|
|
5177
|
+
try {
|
|
5178
|
+
await writableWriter.abort(abortError);
|
|
5179
|
+
} catch {
|
|
5180
|
+
// the error being propagated is more relevant; ignored
|
|
5181
|
+
}
|
|
5182
|
+
} else {
|
|
5183
|
+
await writableWriter.close();
|
|
5184
|
+
}
|
|
5110
5185
|
}
|
|
5111
5186
|
}
|
|
5112
5187
|
return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
|
|
@@ -5486,16 +5561,51 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5486
5561
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5487
5562
|
}
|
|
5488
5563
|
|
|
5564
|
+
function isStrictnessValue(value) {
|
|
5565
|
+
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5566
|
+
}
|
|
5567
|
+
|
|
5489
5568
|
function getStrictness(strictness, checkAmbiguity) {
|
|
5490
5569
|
if (strictness === UNDEFINED_VALUE) {
|
|
5491
5570
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
5492
5571
|
}
|
|
5572
|
+
if (!isStrictnessValue(strictness)) {
|
|
5573
|
+
throw new Error(ERR_INVALID_STRICTNESS);
|
|
5574
|
+
}
|
|
5493
5575
|
return strictness;
|
|
5494
5576
|
}
|
|
5495
5577
|
|
|
5578
|
+
function getFilenameValidation(filenameValidation, strictness) {
|
|
5579
|
+
if (filenameValidation === UNDEFINED_VALUE) {
|
|
5580
|
+
return strictness;
|
|
5581
|
+
}
|
|
5582
|
+
if (!isStrictnessValue(filenameValidation)) {
|
|
5583
|
+
throw new Error(ERR_INVALID_FILENAME_VALIDATION);
|
|
5584
|
+
}
|
|
5585
|
+
return filenameValidation;
|
|
5586
|
+
}
|
|
5587
|
+
|
|
5588
|
+
function isUnsafeFilename(filename, filenameValidation) {
|
|
5589
|
+
if (filenameValidation == STRICTNESS_TOLERANT) {
|
|
5590
|
+
return false;
|
|
5591
|
+
}
|
|
5592
|
+
const pathParts = filename.split("/");
|
|
5593
|
+
if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
|
|
5594
|
+
pathParts.pop();
|
|
5595
|
+
}
|
|
5596
|
+
if (pathParts.includes("..") || filename.startsWith("/") || filename.startsWith("\\\\") || DRIVE_LETTER_REGEXP.test(filename)) {
|
|
5597
|
+
return true;
|
|
5598
|
+
}
|
|
5599
|
+
return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes(""));
|
|
5600
|
+
}
|
|
5601
|
+
|
|
5496
5602
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5497
5603
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5498
|
-
|
|
5604
|
+
const size = toNumber$1(maxAppendedDataSize);
|
|
5605
|
+
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5606
|
+
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5607
|
+
}
|
|
5608
|
+
return size;
|
|
5499
5609
|
}
|
|
5500
5610
|
if (strictness == STRICTNESS_STRICT) {
|
|
5501
5611
|
return 0;
|
|
@@ -5506,12 +5616,6 @@ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
|
5506
5616
|
return MAX_16_BITS;
|
|
5507
5617
|
}
|
|
5508
5618
|
|
|
5509
|
-
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
5510
|
-
|
|
5511
|
-
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
5512
|
-
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
5513
|
-
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
5514
|
-
|
|
5515
5619
|
async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
|
|
5516
5620
|
const { size } = reader;
|
|
5517
5621
|
const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
|
|
@@ -5647,6 +5751,10 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5647
5751
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5648
5752
|
}
|
|
5649
5753
|
|
|
5754
|
+
function toNumber$1(value) {
|
|
5755
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
5756
|
+
}
|
|
5757
|
+
|
|
5650
5758
|
function getDate(timeRaw) {
|
|
5651
5759
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5652
5760
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5685,12 +5793,16 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5685
5793
|
ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
|
|
5686
5794
|
ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
|
|
5687
5795
|
ERR_INVALID_CRC32: ERR_INVALID_CRC32,
|
|
5796
|
+
ERR_INVALID_FILENAME_VALIDATION: ERR_INVALID_FILENAME_VALIDATION,
|
|
5797
|
+
ERR_INVALID_MAX_APPENDED_DATA_SIZE: ERR_INVALID_MAX_APPENDED_DATA_SIZE,
|
|
5688
5798
|
ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
|
|
5689
5799
|
ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
|
|
5800
|
+
ERR_INVALID_STRICTNESS: ERR_INVALID_STRICTNESS,
|
|
5690
5801
|
ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
|
|
5691
5802
|
ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
|
|
5692
5803
|
ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
|
|
5693
5804
|
ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
|
|
5805
|
+
ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
|
|
5694
5806
|
ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
|
|
5695
5807
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
5696
5808
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
@@ -5752,6 +5864,8 @@ const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be '
|
|
|
5752
5864
|
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
5753
5865
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5754
5866
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5867
|
+
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5868
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5755
5869
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5756
5870
|
|
|
5757
5871
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -5759,6 +5873,7 @@ const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
|
5759
5873
|
const VENDOR_VERSION_AE_1 = 1;
|
|
5760
5874
|
const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
|
|
5761
5875
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
5876
|
+
const MAX_LEVEL = 9;
|
|
5762
5877
|
|
|
5763
5878
|
let workers = 0;
|
|
5764
5879
|
const pendingEntries = [];
|
|
@@ -5921,7 +6036,8 @@ class ZipWriter {
|
|
|
5921
6036
|
|
|
5922
6037
|
remove(entry) {
|
|
5923
6038
|
const { filenames, files } = this;
|
|
5924
|
-
|
|
6039
|
+
// deno-lint-ignore valid-typeof
|
|
6040
|
+
if (typeof entry == STRING_TYPE) {
|
|
5925
6041
|
entry = files.get(entry);
|
|
5926
6042
|
}
|
|
5927
6043
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
@@ -6059,20 +6175,20 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6059
6175
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6060
6176
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
6061
6177
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
6062
|
-
const uid =
|
|
6063
|
-
const gid =
|
|
6064
|
-
let unixMode =
|
|
6178
|
+
const uid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
6179
|
+
const gid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
6180
|
+
let unixMode = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
6065
6181
|
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
6066
6182
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
6067
6183
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
6068
6184
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
6069
|
-
if (uid !== UNDEFINED_VALUE && (uid < 0 || uid > MAX_32_BITS)) {
|
|
6185
|
+
if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
|
|
6070
6186
|
throw new Error(ERR_INVALID_UID);
|
|
6071
6187
|
}
|
|
6072
|
-
if (gid !== UNDEFINED_VALUE && (gid < 0 || gid > MAX_32_BITS)) {
|
|
6188
|
+
if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
|
|
6073
6189
|
throw new Error(ERR_INVALID_GID);
|
|
6074
6190
|
}
|
|
6075
|
-
if (unixMode !== UNDEFINED_VALUE && (unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6191
|
+
if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6076
6192
|
throw new Error(ERR_INVALID_UNIX_MODE);
|
|
6077
6193
|
}
|
|
6078
6194
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
@@ -6184,7 +6300,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6184
6300
|
|
|
6185
6301
|
function resolveMetadata(zipWriter, name, options) {
|
|
6186
6302
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
6187
|
-
let rawFilename = encode(name);
|
|
6303
|
+
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6188
6304
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6189
6305
|
rawFilename = encodeText(name);
|
|
6190
6306
|
}
|
|
@@ -6192,7 +6308,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6192
6308
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6193
6309
|
}
|
|
6194
6310
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6195
|
-
let rawComment = encode(comment);
|
|
6311
|
+
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6196
6312
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6197
6313
|
rawComment = encodeText(comment);
|
|
6198
6314
|
}
|
|
@@ -6212,8 +6328,11 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6212
6328
|
if (!passThrough) {
|
|
6213
6329
|
password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6214
6330
|
rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6331
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
6332
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6333
|
+
}
|
|
6215
6334
|
}
|
|
6216
|
-
const encryptionStrength =
|
|
6335
|
+
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6217
6336
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6218
6337
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
6219
6338
|
const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
|
|
@@ -6231,7 +6350,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6231
6350
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6232
6351
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6233
6352
|
}
|
|
6234
|
-
let level =
|
|
6353
|
+
let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
6354
|
+
if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
|
|
6355
|
+
throw new Error(ERR_INVALID_LEVEL);
|
|
6356
|
+
}
|
|
6235
6357
|
if (zipWriter.options[OPTION_USDZ]) {
|
|
6236
6358
|
if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
|
|
6237
6359
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
|
|
@@ -6252,7 +6374,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6252
6374
|
useCompressionStream = false;
|
|
6253
6375
|
}
|
|
6254
6376
|
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
6255
|
-
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6377
|
+
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(Number.isInteger(encryptionStrength) && encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6256
6378
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
6257
6379
|
}
|
|
6258
6380
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
@@ -7446,6 +7568,14 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7446
7568
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7447
7569
|
}
|
|
7448
7570
|
|
|
7571
|
+
function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
7572
|
+
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7573
|
+
}
|
|
7574
|
+
|
|
7575
|
+
function toNumber(value) {
|
|
7576
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7577
|
+
}
|
|
7578
|
+
|
|
7449
7579
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7450
7580
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
7451
7581
|
}
|
|
@@ -8098,6 +8228,9 @@ setDefaultConfiguration({
|
|
|
8098
8228
|
|
|
8099
8229
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8100
8230
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8231
|
+
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8232
|
+
const ERR_ABORTED = "The operation was aborted";
|
|
8233
|
+
const ABORT_ERROR_NAME = "AbortError";
|
|
8101
8234
|
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
8102
8235
|
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
8103
8236
|
EXTRAFIELD_TYPE_ZIP64,
|
|
@@ -8206,8 +8339,9 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8206
8339
|
const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
|
|
8207
8340
|
await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
|
|
8208
8341
|
const { readable } = reader;
|
|
8342
|
+
const { signal } = options;
|
|
8209
8343
|
zipEntry.uncompressedSize = reader.size;
|
|
8210
|
-
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
|
|
8344
|
+
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable), { signal });
|
|
8211
8345
|
return writer.getData ? writer.getData() : writer.writable;
|
|
8212
8346
|
}
|
|
8213
8347
|
}
|
|
@@ -8474,7 +8608,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8474
8608
|
for (const entry of entries) {
|
|
8475
8609
|
let parent = this;
|
|
8476
8610
|
try {
|
|
8477
|
-
const path = entry.filename.split("/");
|
|
8611
|
+
const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
|
|
8478
8612
|
const name = path.pop();
|
|
8479
8613
|
path.forEach(pathPart => {
|
|
8480
8614
|
const previousParent = parent;
|
|
@@ -8549,6 +8683,10 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8549
8683
|
}
|
|
8550
8684
|
}
|
|
8551
8685
|
|
|
8686
|
+
getChildren(options = {}) {
|
|
8687
|
+
return collectChildren(this, options.recursive);
|
|
8688
|
+
}
|
|
8689
|
+
|
|
8552
8690
|
isPasswordProtected() {
|
|
8553
8691
|
const children = this.children;
|
|
8554
8692
|
for (let childIndex = 0; childIndex < children.length; childIndex++) {
|
|
@@ -8640,6 +8778,10 @@ class FS {
|
|
|
8640
8778
|
return this.root.getChildByName(name);
|
|
8641
8779
|
}
|
|
8642
8780
|
|
|
8781
|
+
getChildren(options) {
|
|
8782
|
+
return this.root.getChildren(options);
|
|
8783
|
+
}
|
|
8784
|
+
|
|
8643
8785
|
addDirectory(name, options) {
|
|
8644
8786
|
return this.root.addDirectory(name, options);
|
|
8645
8787
|
}
|
|
@@ -8849,6 +8991,39 @@ function detach(entry) {
|
|
|
8849
8991
|
}
|
|
8850
8992
|
}
|
|
8851
8993
|
|
|
8994
|
+
function forwardAbort(signal, abortController) {
|
|
8995
|
+
if (!signal) {
|
|
8996
|
+
return () => { };
|
|
8997
|
+
}
|
|
8998
|
+
if (signal.aborted) {
|
|
8999
|
+
abortController.abort(signal.reason);
|
|
9000
|
+
return () => { };
|
|
9001
|
+
}
|
|
9002
|
+
const abort = () => abortController.abort(signal.reason);
|
|
9003
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
9004
|
+
return () => signal.removeEventListener("abort", abort);
|
|
9005
|
+
}
|
|
9006
|
+
|
|
9007
|
+
function isExportAborted(error) {
|
|
9008
|
+
return Boolean(error) && error.message == ERR_ABORT_EXPORT;
|
|
9009
|
+
}
|
|
9010
|
+
|
|
9011
|
+
function aggregateEntryErrors(errors) {
|
|
9012
|
+
const [error] = errors;
|
|
9013
|
+
const otherErrors = errors
|
|
9014
|
+
.slice(1)
|
|
9015
|
+
.flatMap(otherError => [otherError, ...(otherError && otherError.entryErrors || [])])
|
|
9016
|
+
.filter(otherError => otherError !== error);
|
|
9017
|
+
if (otherErrors.length) {
|
|
9018
|
+
try {
|
|
9019
|
+
error.entryErrors = [...(error.entryErrors || []), ...otherErrors];
|
|
9020
|
+
} catch {
|
|
9021
|
+
// ignored
|
|
9022
|
+
}
|
|
9023
|
+
}
|
|
9024
|
+
return error;
|
|
9025
|
+
}
|
|
9026
|
+
|
|
8852
9027
|
function getUserExtraField(extraField) {
|
|
8853
9028
|
if (extraField) {
|
|
8854
9029
|
const userExtraField = new Map();
|
|
@@ -8866,111 +9041,110 @@ function getUserExtraField(extraField) {
|
|
|
8866
9041
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
8867
9042
|
const selectedEntry = entry;
|
|
8868
9043
|
const entryOffsets = new Map();
|
|
8869
|
-
|
|
9044
|
+
if (options.bufferedWrite) {
|
|
9045
|
+
await processChildren(entry);
|
|
9046
|
+
} else {
|
|
9047
|
+
for (const child of entry.getChildren({ recursive: true })) {
|
|
9048
|
+
await addChild(child);
|
|
9049
|
+
}
|
|
9050
|
+
}
|
|
8870
9051
|
|
|
8871
|
-
async function
|
|
8872
|
-
await
|
|
9052
|
+
async function processChildren(entry) {
|
|
9053
|
+
const results = await Promise.allSettled(entry.children.map(async child => {
|
|
9054
|
+
await addChild(child);
|
|
9055
|
+
await processChildren(child);
|
|
9056
|
+
}));
|
|
9057
|
+
const errorResult = results.find(result => result.status == "rejected");
|
|
9058
|
+
if (errorResult) {
|
|
9059
|
+
throw errorResult.reason;
|
|
9060
|
+
}
|
|
9061
|
+
}
|
|
8873
9062
|
|
|
8874
|
-
|
|
8875
|
-
|
|
8876
|
-
|
|
8877
|
-
|
|
8878
|
-
|
|
8879
|
-
|
|
9063
|
+
async function addChild(child) {
|
|
9064
|
+
const name = options.relativePath ? child.getRelativeName(selectedEntry) : child.getFullname();
|
|
9065
|
+
const childOptions = child.options || {};
|
|
9066
|
+
let zipEntryOptions = {};
|
|
9067
|
+
if (child.data instanceof Entry) {
|
|
9068
|
+
const {
|
|
9069
|
+
externalFileAttributes,
|
|
9070
|
+
versionMadeBy,
|
|
9071
|
+
comment,
|
|
9072
|
+
lastModDate,
|
|
9073
|
+
creationDate,
|
|
9074
|
+
lastAccessDate,
|
|
9075
|
+
uncompressedSize,
|
|
9076
|
+
encrypted,
|
|
9077
|
+
zipCrypto,
|
|
9078
|
+
crc32,
|
|
9079
|
+
compressionMethod,
|
|
9080
|
+
extraFieldAES,
|
|
9081
|
+
internalFileAttributes,
|
|
9082
|
+
extraField,
|
|
9083
|
+
uid,
|
|
9084
|
+
gid
|
|
9085
|
+
} = child.data;
|
|
9086
|
+
zipEntryOptions = {
|
|
9087
|
+
externalFileAttributes,
|
|
9088
|
+
versionMadeBy,
|
|
9089
|
+
comment,
|
|
9090
|
+
lastModDate,
|
|
9091
|
+
creationDate,
|
|
9092
|
+
lastAccessDate,
|
|
9093
|
+
internalFileAttributes
|
|
9094
|
+
};
|
|
9095
|
+
const userExtraField = getUserExtraField(extraField);
|
|
9096
|
+
if (userExtraField) {
|
|
9097
|
+
zipEntryOptions.extraField = userExtraField;
|
|
9098
|
+
}
|
|
9099
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
9100
|
+
Object.assign(zipEntryOptions, {
|
|
9101
|
+
uid,
|
|
9102
|
+
gid,
|
|
9103
|
+
unixExtraFieldType: options.unixExtraFieldType || INFOZIP_EXTRA_FIELD_TYPE
|
|
9104
|
+
});
|
|
9105
|
+
}
|
|
9106
|
+
if (child.passThrough) {
|
|
9107
|
+
let level, encryptionStrength;
|
|
9108
|
+
if (compressionMethod === 0) {
|
|
9109
|
+
level = 0;
|
|
8880
9110
|
}
|
|
8881
|
-
|
|
8882
|
-
|
|
8883
|
-
await processChild(child);
|
|
9111
|
+
if (extraFieldAES) {
|
|
9112
|
+
encryptionStrength = extraFieldAES.strength;
|
|
8884
9113
|
}
|
|
8885
|
-
|
|
8886
|
-
|
|
8887
|
-
|
|
8888
|
-
async function processChild(child) {
|
|
8889
|
-
const name = options.relativePath ? child.getRelativeName(selectedEntry) : child.getFullname();
|
|
8890
|
-
const childOptions = child.options || {};
|
|
8891
|
-
let zipEntryOptions = {};
|
|
8892
|
-
if (child.data instanceof Entry) {
|
|
8893
|
-
const {
|
|
8894
|
-
externalFileAttributes,
|
|
8895
|
-
versionMadeBy,
|
|
8896
|
-
comment,
|
|
8897
|
-
lastModDate,
|
|
8898
|
-
creationDate,
|
|
8899
|
-
lastAccessDate,
|
|
8900
|
-
uncompressedSize,
|
|
9114
|
+
zipEntryOptions = Object.assign(zipEntryOptions, {
|
|
9115
|
+
passThrough: true,
|
|
8901
9116
|
encrypted,
|
|
8902
9117
|
zipCrypto,
|
|
8903
9118
|
crc32,
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
gid
|
|
8910
|
-
} = child.data;
|
|
8911
|
-
zipEntryOptions = {
|
|
8912
|
-
externalFileAttributes,
|
|
8913
|
-
versionMadeBy,
|
|
8914
|
-
comment,
|
|
8915
|
-
lastModDate,
|
|
8916
|
-
creationDate,
|
|
8917
|
-
lastAccessDate,
|
|
8918
|
-
internalFileAttributes
|
|
8919
|
-
};
|
|
8920
|
-
const userExtraField = getUserExtraField(extraField);
|
|
8921
|
-
if (userExtraField) {
|
|
8922
|
-
zipEntryOptions.extraField = userExtraField;
|
|
8923
|
-
}
|
|
8924
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
8925
|
-
Object.assign(zipEntryOptions, {
|
|
8926
|
-
uid,
|
|
8927
|
-
gid,
|
|
8928
|
-
unixExtraFieldType: options.unixExtraFieldType || INFOZIP_EXTRA_FIELD_TYPE
|
|
8929
|
-
});
|
|
8930
|
-
}
|
|
8931
|
-
if (child.passThrough) {
|
|
8932
|
-
let level, encryptionStrength;
|
|
8933
|
-
if (compressionMethod === 0) {
|
|
8934
|
-
level = 0;
|
|
8935
|
-
}
|
|
8936
|
-
if (extraFieldAES) {
|
|
8937
|
-
encryptionStrength = extraFieldAES.strength;
|
|
8938
|
-
}
|
|
8939
|
-
zipEntryOptions = Object.assign(zipEntryOptions, {
|
|
8940
|
-
passThrough: true,
|
|
8941
|
-
encrypted,
|
|
8942
|
-
zipCrypto,
|
|
8943
|
-
crc32,
|
|
8944
|
-
uncompressedSize,
|
|
8945
|
-
level,
|
|
8946
|
-
encryptionStrength,
|
|
8947
|
-
compressionMethod
|
|
8948
|
-
});
|
|
8949
|
-
}
|
|
9119
|
+
uncompressedSize,
|
|
9120
|
+
level,
|
|
9121
|
+
encryptionStrength,
|
|
9122
|
+
compressionMethod
|
|
9123
|
+
});
|
|
8950
9124
|
}
|
|
8951
|
-
|
|
8952
|
-
|
|
8953
|
-
|
|
8954
|
-
|
|
8955
|
-
|
|
8956
|
-
|
|
8957
|
-
|
|
8958
|
-
|
|
8959
|
-
|
|
8960
|
-
|
|
9125
|
+
}
|
|
9126
|
+
await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
|
|
9127
|
+
directory: child.directory,
|
|
9128
|
+
onprogress: async indexProgress => {
|
|
9129
|
+
if (options.onprogress) {
|
|
9130
|
+
entryOffsets.set(name, indexProgress);
|
|
9131
|
+
try {
|
|
9132
|
+
await options.onprogress(Array.from(entryOffsets.values()).reduce((previousValue, currentValue) => previousValue + currentValue), totalSize);
|
|
9133
|
+
} catch {
|
|
9134
|
+
// ignored
|
|
8961
9135
|
}
|
|
8962
9136
|
}
|
|
8963
|
-
}
|
|
8964
|
-
|
|
8965
|
-
}
|
|
9137
|
+
}
|
|
9138
|
+
}));
|
|
8966
9139
|
}
|
|
8967
9140
|
}
|
|
8968
9141
|
|
|
8969
9142
|
function addFileSystemHandle(zipEntry, handle, options) {
|
|
8970
9143
|
return addFile(zipEntry, handle, []);
|
|
8971
9144
|
|
|
8972
|
-
async function addFile(parentEntry, handle, addedEntries) {
|
|
9145
|
+
async function addFile(parentEntry, handle, addedEntries, parentName = "") {
|
|
8973
9146
|
if (handle) {
|
|
9147
|
+
const entryName = parentName ? parentName + "/" + handle.name : handle.name;
|
|
8974
9148
|
try {
|
|
8975
9149
|
if (handle.isFile || handle.isDirectory) {
|
|
8976
9150
|
handle = await transformToFileSystemhandle(handle);
|
|
@@ -8992,12 +9166,18 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
8992
9166
|
const directoryEntry = parentEntry.addDirectory(handle.name);
|
|
8993
9167
|
addedEntries.push(directoryEntry);
|
|
8994
9168
|
for await (const childHandle of handle.values()) {
|
|
8995
|
-
await addFile(directoryEntry, childHandle, addedEntries);
|
|
9169
|
+
await addFile(directoryEntry, childHandle, addedEntries, entryName);
|
|
8996
9170
|
}
|
|
8997
9171
|
}
|
|
8998
9172
|
} catch (error) {
|
|
8999
|
-
|
|
9000
|
-
|
|
9173
|
+
try {
|
|
9174
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9175
|
+
error.entryName = entryName;
|
|
9176
|
+
}
|
|
9177
|
+
} catch {
|
|
9178
|
+
// ignored
|
|
9179
|
+
}
|
|
9180
|
+
throw error;
|
|
9001
9181
|
}
|
|
9002
9182
|
}
|
|
9003
9183
|
return addedEntries;
|
|
@@ -9007,15 +9187,33 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9007
9187
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9008
9188
|
const totalSize = getTotalSize([zipEntry], "uncompressedSize");
|
|
9009
9189
|
const writtenSizes = new Map();
|
|
9010
|
-
|
|
9190
|
+
const abortController = new AbortController();
|
|
9191
|
+
const { signal } = abortController;
|
|
9192
|
+
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9193
|
+
const exportedEntryNames = [];
|
|
9194
|
+
let exportAborted = false;
|
|
9195
|
+
try {
|
|
9196
|
+
await exportChildren(zipEntry, directoryHandle);
|
|
9197
|
+
} catch (error) {
|
|
9198
|
+
try {
|
|
9199
|
+
error.exportedEntryNames = exportedEntryNames;
|
|
9200
|
+
} catch {
|
|
9201
|
+
// ignored
|
|
9202
|
+
}
|
|
9203
|
+
throw error;
|
|
9204
|
+
} finally {
|
|
9205
|
+
releaseSignal();
|
|
9206
|
+
}
|
|
9011
9207
|
return directoryHandle;
|
|
9012
9208
|
|
|
9013
9209
|
async function exportChildren(entry, parentHandle) {
|
|
9014
9210
|
if (options.concurrent) {
|
|
9015
9211
|
const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
|
|
9016
|
-
const
|
|
9017
|
-
if (
|
|
9018
|
-
|
|
9212
|
+
const rejectedResults = results.filter(result => result.status == "rejected");
|
|
9213
|
+
if (rejectedResults.length) {
|
|
9214
|
+
const failedResults = rejectedResults.filter(result => !isExportAborted(result.reason));
|
|
9215
|
+
const reportedResults = failedResults.length ? failedResults : rejectedResults;
|
|
9216
|
+
throw aggregateEntryErrors(reportedResults.map(result => result.reason));
|
|
9019
9217
|
}
|
|
9020
9218
|
} else {
|
|
9021
9219
|
for (const child of entry.children) {
|
|
@@ -9025,6 +9223,12 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9025
9223
|
}
|
|
9026
9224
|
|
|
9027
9225
|
async function exportChild(child, parentHandle) {
|
|
9226
|
+
if (signal.aborted) {
|
|
9227
|
+
if (exportAborted || isExportAborted(signal.reason)) {
|
|
9228
|
+
return;
|
|
9229
|
+
}
|
|
9230
|
+
throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
|
|
9231
|
+
}
|
|
9028
9232
|
try {
|
|
9029
9233
|
if (child.directory) {
|
|
9030
9234
|
const childDirectoryHandle = await parentHandle.getDirectoryHandle(child.name, { create: true });
|
|
@@ -9032,21 +9236,37 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9032
9236
|
} else {
|
|
9033
9237
|
const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
|
|
9034
9238
|
const writable = await fileHandle.createWritable();
|
|
9035
|
-
|
|
9036
|
-
|
|
9037
|
-
|
|
9038
|
-
|
|
9039
|
-
|
|
9040
|
-
|
|
9041
|
-
|
|
9042
|
-
|
|
9239
|
+
try {
|
|
9240
|
+
await child.getData({ writable }, Object.assign({}, options, {
|
|
9241
|
+
signal,
|
|
9242
|
+
onprogress: async progress => {
|
|
9243
|
+
if (options.onprogress) {
|
|
9244
|
+
writtenSizes.set(child.id, progress);
|
|
9245
|
+
try {
|
|
9246
|
+
await options.onprogress(Array.from(writtenSizes.values()).reduce((previousValue, currentValue) => previousValue + currentValue, 0), totalSize);
|
|
9247
|
+
} catch {
|
|
9248
|
+
// ignored
|
|
9249
|
+
}
|
|
9043
9250
|
}
|
|
9044
9251
|
}
|
|
9045
|
-
}
|
|
9046
|
-
})
|
|
9252
|
+
}));
|
|
9253
|
+
} catch (error) {
|
|
9254
|
+
throw exportAborted ? new Error(ERR_ABORT_EXPORT) : error;
|
|
9255
|
+
}
|
|
9256
|
+
exportedEntryNames.push(child.getRelativeName(zipEntry));
|
|
9047
9257
|
}
|
|
9048
9258
|
} catch (error) {
|
|
9049
|
-
|
|
9259
|
+
exportAborted = true;
|
|
9260
|
+
abortController.abort(new Error(ERR_ABORT_EXPORT));
|
|
9261
|
+
try {
|
|
9262
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9263
|
+
error.entryName = child.getRelativeName(zipEntry);
|
|
9264
|
+
error.entryId = child.id;
|
|
9265
|
+
}
|
|
9266
|
+
} catch {
|
|
9267
|
+
// ignored
|
|
9268
|
+
}
|
|
9269
|
+
throw error;
|
|
9050
9270
|
}
|
|
9051
9271
|
}
|
|
9052
9272
|
}
|
|
@@ -9108,6 +9328,21 @@ function resetFS(fs) {
|
|
|
9108
9328
|
fs.root = new ZipDirectoryEntry(fs);
|
|
9109
9329
|
}
|
|
9110
9330
|
|
|
9331
|
+
function collectChildren(directory, recursive) {
|
|
9332
|
+
const children = [];
|
|
9333
|
+
const pendingDirectories = [directory];
|
|
9334
|
+
let directoryIndex = 0;
|
|
9335
|
+
while (directoryIndex < pendingDirectories.length) {
|
|
9336
|
+
for (const child of pendingDirectories[directoryIndex++].children) {
|
|
9337
|
+
children.push(child);
|
|
9338
|
+
if (recursive) {
|
|
9339
|
+
pendingDirectories.push(child);
|
|
9340
|
+
}
|
|
9341
|
+
}
|
|
9342
|
+
}
|
|
9343
|
+
return children;
|
|
9344
|
+
}
|
|
9345
|
+
|
|
9111
9346
|
function registerEntries(fs, entry) {
|
|
9112
9347
|
const pendingEntries = [entry];
|
|
9113
9348
|
while (pendingEntries.length) {
|
|
@@ -9226,6 +9461,7 @@ exports.BlobReader = BlobReader;
|
|
|
9226
9461
|
exports.BlobWriter = BlobWriter;
|
|
9227
9462
|
exports.Data64URIReader = Data64URIReader;
|
|
9228
9463
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9464
|
+
exports.ERR_ABORTED = ERR_ABORTED;
|
|
9229
9465
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
9230
9466
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
9231
9467
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
@@ -9249,12 +9485,17 @@ exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
|
9249
9485
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
9250
9486
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
9251
9487
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9488
|
+
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
9252
9489
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9490
|
+
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9491
|
+
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
9253
9492
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9254
9493
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9255
9494
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9495
|
+
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9256
9496
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9257
9497
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9498
|
+
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
9258
9499
|
exports.ERR_INVALID_UID = ERR_INVALID_UID;
|
|
9259
9500
|
exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
9260
9501
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
@@ -9269,6 +9510,7 @@ exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
|
9269
9510
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9270
9511
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
9271
9512
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
9513
|
+
exports.ERR_UNSAFE_FILENAME = ERR_UNSAFE_FILENAME;
|
|
9272
9514
|
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
9273
9515
|
exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
|
|
9274
9516
|
exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;
|