@zip.js/zip.js 2.8.58 → 2.8.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/deno.json +2 -2
  2. package/dist/zip-core-external.js +295 -57
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +286 -40
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +295 -58
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +5867 -4360
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +295 -58
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +288 -43
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +313 -58
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +288 -42
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +288 -42
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +313 -57
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +288 -43
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +313 -58
  27. package/index.d.cts +318 -2
  28. package/index.d.ts +318 -2
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-registry.js +5 -0
  31. package/lib/core/compression-methods.js +93 -0
  32. package/lib/core/constants.js +2 -0
  33. package/lib/core/options.js +2 -0
  34. package/lib/core/streams/zip-entry-stream.js +7 -3
  35. package/lib/core/streams/zlib-wasm/zlib-streams.js +18 -8
  36. package/lib/core/version.js +31 -0
  37. package/lib/core/web-worker-inline-native.js +1 -1
  38. package/lib/core/web-worker-inline-wasm.js +1 -1
  39. package/lib/core/zip-reader.js +143 -33
  40. package/lib/core/zip-writer.js +14 -6
  41. package/lib/zip-core-base.js +7 -0
  42. package/lib/zip-core-reader.js +16 -1
  43. package/lib/zip-fs-core.js +32 -0
  44. package/package.json +3 -3
  45. package/sync-versions.js +26 -0
package/index-native.cjs CHANGED
@@ -77,6 +77,7 @@ const BITFLAG_LEVEL_MAX_MASK = 0b010;
77
77
  const BITFLAG_LEVEL_FAST_MASK = 0b100;
78
78
  const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
79
79
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
80
+ const BITFLAG_COMPRESSED_PATCHED_DATA = 0b100000;
80
81
  const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
81
82
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
82
83
  const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
@@ -194,6 +195,7 @@ const OPTION_OFFSET = "offset";
194
195
  const OPTION_USDZ = "usdz";
195
196
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
196
197
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
198
+ const OPTION_CENTRAL_EXTRA_FIELD = "centralExtraField";
197
199
  const OPTION_STRICTNESS = "strictness";
198
200
  const OPTION_FILENAME_VALIDATION = "filenameValidation";
199
201
  const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
@@ -406,7 +408,7 @@ function resetConfiguration() {
406
408
  Object.assign(config, DEFAULT_CONFIGURATION);
407
409
  }
408
410
 
409
- const o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],e=[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],t=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],w=new Uint8Array(288);w.fill(8,0,144),w.fill(9,144,256),w.fill(7,256,280),w.fill(8,280,288);const U=new Uint8Array(30).fill(5);function s(o){const r=new Uint16Array(16);for(const e of o)r[e]++;r[0]=0;const e=new Uint16Array(17);for(let o=1;o<=15;o++)e[o+1]=e[o]+r[o];const t=new Uint16Array(o.length);for(let r=0;r<o.length;r++)o[r]&&(t[e[o[r]]++]=r);return {o:r,symbols:t}}const x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(B=()=>function(x){let c=0,B=0,q=0,C=new Uint8Array(1024),f=0,h=0;for(;!h;){h=Y(1);const o=Y(2);if(0==o)g();else if(1==o)u(s(w),s(U));else {if(2!=o)throw new Error("invalid deflate block type");u(...z());}}return C.subarray(0,f);function i(){if(c>=x.length)throw new Error("unexpected end of deflate data");return x[c++]}function Y(o){for(;q<o;)B|=i()<<q,q+=8;const r=B&(1<<o)-1;return B>>>=o,q-=o,r}function g(){B=0,q=0;const o=i()|i()<<8;c+=2,O(f+o);for(let r=0;r<o;r++)C[f++]=i();}function u(n,w){let U=l(n);for(;256!=U;){if(U<256)O(f+1),C[f++]=U;else {const n=U-257,s=o[n]+Y(r[n]),x=l(w),c=e[x]+Y(t[x]);O(f+s);const B=f-c;for(let o=0;o<s;o++)C[f++]=C[B+o];}U=l(n);}}function z(){const o=Y(5)+257,r=Y(5)+1,e=Y(4)+4,t=new Uint8Array(19);for(let o=0;o<e;o++)t[n[o]]=Y(3);const w=s(t),U=new Uint8Array(o+r);let x=0;for(;x<U.length;){const o=l(w);if(o<16)U[x++]=o;else if(16==o){const o=U[x-1];let r=Y(2)+3;for(;r--;)U[x++]=o;}else x+=17==o?Y(3)+3:Y(7)+11;}return [s(U.subarray(0,o)),s(U.subarray(o))]}function l(o){const{o:r,symbols:e}=o;let t=0,n=0,w=0;for(let o=1;o<=15;o++){t|=Y(1);const U=r[o];if(t-n<U)return e[w+(t-n)];w+=U,n=n+U<<1,t<<=1;}throw new Error("invalid huffman code")}function O(o){if(C.length<o){let r=2*C.length;for(;r<o;)r*=2;const e=new Uint8Array(r);e.set(C.subarray(0,f)),C=e;}}}(function(o){const r=(o=String(o).replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let t=0;t<r;t+=4){const r=x.indexOf(o[t])<<18|x.indexOf(o[t+1])<<12|(63&x.indexOf(o[t+2]))<<6|63&x.indexOf(o[t+3]);e.push(r>>16&255),"="!==o[t+2]&&e.push(r>>8&255),"="!==o[t+3]&&e.push(255&r);}return new Uint8Array(e)}("zb1rc9s4sgD6/f4KyzWrIkKQS1IPy5QgVZ6TZOIkEyczk6iUlEyBFm0JdCDIimNpf/utboAkJMuZ7J6z99xKSiZBPBuNRneju1FLlyJRWS4cTm4Pi5dDxtTNFc/TgwlPM8Hrdf3XH88nA/3ocBJzh2ycsgJye7hc8IOFklmiDrtJLhbq9qGU45uY0zdnFzxRsaKvl/MzLmNBT8ZqGkv6VMpcxjn9kAnV0bkzfAnb+i3Ft0ak3xL6onpZ0JPxVTyjT8Zq/EfGV/GYvpX5PFvweEnf82/qqUjyCZfxiiby5krl8ZRe5Qt1wheL8TmPJ/S9HItFmsv5qZJ8PI+v6Ds+nozPZtwk3NA/ZaashDl9nM+vJF8sslyYtEv6hCd3Us82bMFnKb1m13k2OQjoOTtcCg29ySE9ZRW46Xcm+OogoxdsOBzRff9H3TSXzoyrA86CLu9FrXaXuy65hSTF+M7nDn5ULKyrger3++HnxnGnEx1HjU4zxoTuxTAYDfmIqc3+motUxcKu6nW6ClrDWT0Q7GKovBCKdy+GCqsR/X6/8xkrjVqtuhhtMO/wMX1LX9Bv9CH9QL/QdyN20U1m48Xi4KmuTC4TlUtAPzXNFn7O+HrthZvx1RUXE0jWfQjW+nO36EGw5v6Mi3M17UIOyYJuljqizzr1OvfPlmnKZdHfHME7dop0yv2zG8XfpOmCKyoIzZjwOgjCruyxrCtd1ikKc6Y+5/45V4h5jqS1gFDB7CS3CYldxd7h2Pno85chB3jUo1Zr9PkDvoRt/fYQ36KmfvtmoPX5xVBUJd7iS1HiMb6ZEpuN6aboSpxihYB/jPU46jMfyhEZdQ0w1eacK4fcSq6WUvxLp242egY+HvBviovJ4uBqay40zLkBtULgPe0ulldcOreqWDIOp4LcKr+cKSp8Lr4u+RKIw4ams+Vi6lQogxjuNElXz4Uo5shfcKWXuBNQ5WN/CeX+9Xi25ExsNoRyBh3fbIoFc/DE4VTtVl3gg6vMA+nqYR8IaEP3EB4ULbISKqpKTwDbihI/wBf98kpXoLH84D2DziRjpTuWpU7AGCuaWa/hreyWaYP7pogiJVbzYVHGC0dUsvf+zBHlOBoRY0wOrILxe3/qKCppsBaU+4tZlnAnoFUlhGzoWaZ0b2GAxaSWq8f0VRXdCqzOwCKvGn/gKC8kru7Ths7LsTaiB0V1vbIeXtbjcFZ1TfoJz2aO+mcjIoQUnTBlVJ01Qir6Qb2u6nWHD4UXjth7/xrmDF/qUdg8anYa7Wan31deSENAlg29jqE3VBDWRyjxgYodMQjWKla9XiPyOHHD4Pi4FYbt6OjoqP2A01nMWV/6Ml8C/v5z6zNZrxsRnepKqSS3sOo0IYc5qNcdyYYj0lV91oi6ymONiEj/ClBeAHkI7sBVFrPGSUmscxZ08145FbnrlpWs+TAf9ft9BbXBM45CdQuKVhQabKFMHNAMkSYvkcZUiEB0s3ojpMrN+o1oIGLpX+VXDkEYys2GPmK3gNqL+PbURpX3vo1B/+zQYsUpomnvzngUDqRRz9drR0Lf/9kcESqG+YhJJGRU9nqsU67ODb2wmxuOsFZBgaZDzQBNUUFJAJSY7PU6az4UI9qo/0us147S45QEylVLpi7qdVWBoPPAadQFoZIQqjabDX3GkBjubkZFZ4DwdJV/NsuTy9PsO2etMKLKf8yG4VEjanWa4XGDNoOoETUazfCIRq121Og0wiCi0VF41Gh0jjq0EXVajaOjVhSMqPLfsmHYCjutIIiaxzTstI6PjlqN4waNmkFw3Do+Cjq00ThuNdvHR51oRPnAUf4Lxv0XxSIiVPkPGfcf2gkfGPc/kFj5kgORIxvzt9rGYCgl7YEKH1fluf+QDUeU+x9YQPlmeTUZK34HEIfA3Ynzij/ksErZI/+LD1NY0THo3/uSTPkPKYdpUf4HmsEvk+42UsFqyfrHQXAUHh9HreZRMzg+DomaynyFxDh3Dh+PhcjVwXS8mB7Mc8kP1HQsDqLPrcaBdxAenGVqcVj0IEUMTYB2Ai4tDCZpLseaTld6ztZr3XrzQtLlwA5w1y5DlP/OSf3F8mwMbKgTth8saNh+4CzckBBCFy4LrZ3nyhA+yAY493F3SgwH5z+sCK//oqss+NEhoC7QuhHZGofZ8KJu2KpzzfJpVA90vmJN+OksB7z2P/yzGR03j9tH0XEbVoDJvQbU6Rb1dQn33znK7johFeYYvKJi86Qij8XXHguPB6ou1v9SdRnzHmscD9Rn8RmfW/qTqsu10F+Piq+atG5O9J5SbAe9Hl8DfwP0e/POsbZ8gBzNmfBf0IxxpxOQHQ441FxshiwuMKrwKWX5MBjRhOXDcEQXLB9GIzpj+bAxomOWD5u7bDY7OtZsNu+zsF2vO1if8E+ckGZD7jVGn+FPR/8Jm+Zve1SuBYW5WzQlrvABYAld0Blxxy5U5Qr/7bCcnn9GARmtg+6YzeiMLegCyzYCmhCasJSmTG1gADgKN10HFMaBg3ETfItGOCZ3gW+NEQ7NneFbc4QjdMfrYLOhr9ltNr/KpfqN38A+COvltf/eeYTczUKvZ/qommHgrplYr0MO9DtYr0Uv2F6gmbgez7LJwdVYjueLA5UfXJ1dTtKoXJUZC11H9vst0utFekI0OOjS5FjhukXx7hGyXk5G6NSw7yu9mCesYFGu2HuN5qzqtSJ0ycLupOdk63VIukuYPciUsoRxnwsUBZ0ra3EtR7BqWdhd9ER3YUQfO3NC6IwF3VkvKUUOyDWcjT6zZDjTSAM0pmi1Xl/00iIv1DgFxlNLCxOaDhcjQicua24Moq8q9uifHbKh7+O/3ZQoENln7BmVRmYcdZX/mg0BVILi76hkFpT/ehiMKhL2z0bULfbTfo403MEixC8pv//RIdWiUizoql6OUqAEIU+N2HFw3IqiZqf9mQ/ViMphiMlhq3ncarU7UQfTu6ZxUzEUBsLzehhaaSGmPceJFo4ucc8Oxk027j9zuM5Iuf8Hq4XWroWCzh+sFlB8el4NazPJzvlit1YKBPg5DNkwN0Xt4agEiUKQ7KODBZ5wXCW67e2lYXIc5OJgPJN8PLk50LVODqbzcXKQjGczPqkdltVjJWWn9ShMzzkBvuV5sQVPa+y8Xi9eQH56NxaTfP4HyE8Lxk7p7+zwRbk0F4tVLieH9I8qcZGdi7FaSn5I/2R/0N/Y4ffs6mLhjc9yqbxkypNLryzYLeWlV2a8zwsO907jsLFvb+Gohjl4+PbFAWzli+UVUCA+OSzkqK8sbNM37FaM5zw+fPvotyfPosMN/cSUP15AP51b2P9jk+H5ycPHh5sNfUPoSytLprgcQx8Xccgb1C5x+vyhF5oif7Hh4YTL7Jo/At5hRH9hww4NIxq2R/RXNgzbNGrSBrBgnIUBVZwNA4r/RlRwewKo5Az0ZFNgC9SM01y/myySQ56MF3SKpvyn2M4/2XBHITSiuwnAUv4JKxL/r9fK/82xGTH81hwh+/UnbHsZ29KcGBLMQuDBmjXGsnq9rf904M9+Gj/mi4NLfnOwyL7zw4LZeMuGSSXqAU2FDqcs66a95oPMjTrdtNBZcZYMUxAvnfQfGWMsWK87DFvV702CZEkYbcmo14uan/HNqEV6vbCtEzrmvfNZGP0LNXViFRy+6Fo+z6AaOmOzXi/8HHUaD5xZv38EXFsyTEfYpWz0mW+pxFLgAGjqedX0JMNGnQ/SOPWao+4CWIK0x5rrNe81BypG+iiGSnd89BkJI76brkNSZJI6ZUoDUqD/ajTa2DTFJgmvHE4Dspnwe7+GZPPbDnVDHKCqeA5HKFJqnIA/ObD+WSF4GYS4R+GYDZ0cBsxLCHKE4GdIK8uMWcqCbk0Mx6Pu+DNL1usQ8GCYjmB7RATIWPo5hUrSXi+Cnwb8NLsZy0ChBYDIPh8fU6iDZVQOsxEbI7MGfBuwcOPRSPd4ycJ2p9kIguMHs8/tVqtx9GDxOWodPUg+mw+dB2O6YpCUD7NRlZqVPdZCZhOlSxArodUVWyHarUDFRhWkZiO2ZEtMXULqZrt8qyzP4MeSzyBJ2UmbV6X+BFZdqZK6d7nh7l0sOJsP9t/i9suEqeKfTS+C6SxpVVrMvALeNwVkWLAU8GDGUmCBxywFFnjJUmCBYTgrOqUTesX4MBh9FlDiBvRBg0Ycwns4onPGhxE8RyN6id/CuAHvjRE9Y80d9JGIPCuWDK/0svi8GN5UKs7ZcF4qP8e4CC6hqrMRnbIEMpoic7vI5U6RKyzihiM6YQlkNYUu7UJXO4VudCEcRAJZTaEru9DNTqG5LgQjdVmTXrEVvWFTOmeTnWE3zZpRg0bd4zEfsWUBAI1DFhCQoC0rQADZWlqwcN0RXbEresVu6A2b0zm7pJdsVXAM2WZDk73bCmAZIsAbxjUn8Ykp/fCSqZLLKhIwg8VL2QTmL83dvKGmopdk84thA6Cj/wJiEDUJ4S4LYYBdPlvw4oyiGClQHzNIKhlS7G7UaoGybOAoFlD9Igag+TEvciBZELuuJLHrCvhRlIOqwmUKAAcPotfrwF9ZsNV88yt0DtRwDiCyHtsv+ExwfwHxqUwMR4Rs/jJ6xFut2cpSp+bISndreJ1hxVvbigy1q9qT3dxlTQPbX0EdoYtJS7oQpKuG+egzk0ilh7kb4kuoXyJ8ifRLA18ao2KE7/25o2hONhu64Oy1/x4X70wzH7nNgPiltAcs4XhfjooXYuzUnNIs+T2HBLcFRxhzKsert8WbomZc5iQM4BILilxkkemNmN3EUqc9XKopFypLkGF7nE94nLJasCG35sBhocYS0HPKEfeonp4NHS9uRHJgH0fsqgeqLqZ0UXQloZzHC4o8eDzbMNFNB854Nc7Uga6xOhEtJN9CeNW5rrj5MueOpAH9ZahAfkwZvuMbarOGwaiGtHa9zoYhPoejLer+O9k4giY0hao4VpWM3AgU2gxTzDuVA+VzOCh1dMHfCIkXDiGx7tHMINV45yDE49yzX8g/voKSpzikmXBHUE7HNKCcwwFWCVR9dFOwo7eKx4oKHgsqeSwN6LKNZlJBLVCvK3Kr+5KZviTMgEda7dOFTrXTNMKy71BRIV5X3MsZdzJOE9IVlTBULiFlpc3YJWaVhSQxhqZ0migkJ0JwrMQwDUU3epwPwjjYId1cK9SWazYectgR+Aj6uKzX061Z/JN0eQnTGchmpDhgW/3vLJ7/3bUgq7WQw1pIzYQmsBa0svR7Vw6cBbt/VRSVS/bK0TinV0GxFz1xJN1ZLZIgtudUEppWuJuY2ZwZ3F0UOs0Kb80DIO8Mz+8WFBXeO3g8o0VZ+m+icr4flfOuZlMRNeUd1Cyx78wg3haS0swgJC8QMmV3sLE6r+M2Ej1xMpoSg0mluD0FSAoqaY6nrlrU5fRWjwGgt3QU63Ofc6YILef7BsAjiTXrXgij/74hVeWTcppoTlMLWglAC8gl0ErenRkw1OuOYk+cGVWlonNcbpKehtzSHN7YqKMVJPW66vMdgArGuyDvmYMlPBZ2BMg65WYO43CdsTf+x1cCWr6gu+yxsfe1u3TZ112aMeeOoku6dL+CFqteX9whIDlLrLR0vS6z5MVJsZ6xnNClK6uO+BLps6JLUP5srw9A+BKKwi9mgYnlbFaSxh9tNzC9wHTMeKFWeV1t3cBgKHlTsGS6Hntvdw7leHWINdVC4AuSsUqmRf4ZZ7WQbte32TgBzeknGtC/gED/aNFDv8ZWvx7hUfpiPFP0pV8pXajY38uKvzAVbvdubHp3f62bjVMpeSBDnG7oS0IT2nngRA9+HUq9fZbEhNBxhQ4zGlDIgrhjpUIa1aUJoSuGiea9VMcVzQp6e8lvFjH8xmOag6lRMcl/cJmlhpGJVxuqOC7LhCONTLkzBk1lKvO5o0C5LvT3BXeWZEPoqlqON3z7HIQxdj2wTbVgFWm+bcXYObnlbCn4IhkDuUWjpw/vXoChUi64UNbJnNphEciO/KvsQ1aUWbmfTMcS+LKHyjJFUGY14NBWxNetgm4SLMNUNZQ5L7CnXD7lyRniQJnzcnvQ3D8F9Cw/n+1+Bl2/2Wiv//2Ndu+k7eVT726/pzvb7w82XtxUSjKwXgvf6kalUPqOe1gFmYCGESHbhdlWWaQoNKgxRw1DkMn9fSMiOwxnF00xypPLiGz28ZbV3qr7BXtRydSc/2/B+n8GVxTPaP438P0h9Mo1UTAxCHMEJ9sPTlCy3GNrRCXuGBcAMEWAQ8lZGG1A/j3YLQXfgq5VgBPYZCqwS7K995/es/eXEBdbEJf7IZ5vCLVIuiXb5GzYCFrN8Lhz3Kat4/CoFQbNY9o56gSdKDyOkPO1G0YamNNMU7CnTo7HMGn1Go2ApEmyfX5UcFF4jPQYBiVRXkIobWcVd7IKmxIpYCf1GCowfef77MLUHVoHhiWyonVgRyeGcsTeAgH7rGA/0C3aW4BlKXbxv9yOuqedx6adGVdDirQY4N7lfsYLszsEXzGJ/8IvaEHXFewbd6SfzZcz5xt3hPsC+BpCw0bz6KjVCRvEDXE7qqrSVoaj6rT2X/hZ16fbZsOcCpqNqj6+3bISidY63zAq7cZelN1QNPysCGhNrTl7YeuYUBdUfftmfysNF7ayPORmO+QHmViosUhgU7zZNUKD4z04nOLjCZfVIR5M3I1zq7mdq+VsVkkKaH4YCzrJBY/lxvBFYF0znkAFYIU3yxfcIXHFuQPRSqAPaFqmfP0Mu2IhBXzQLO6sOkb7Yg/ygwZ3KTS849Ux3VIURsZ8otXA9Clnf9CPnB1OeDobK+4h9/eEs8Pz79nVIT3hbNgIadg4pp2R0ei8v49+c3qbTJcCD4hjddfO+dl4NjsbJ5ex2GMDbe2SG4NAt1V3QdLUgi2fxBldLvjdGlL6PbvSB4RxQqHsUvHHMmlE8YLO+DWfxTNqxtluxksKG8NYgXF3VdcJV9N8Ek83jNNJtVFc0Rs6p5cMe4hTCCbdBjfO2Kpe/8KdFaHXbFGv5/V6bVmv187qdaeWrdcJqdcf5fmMj4WT1utSq3fq9VqyXtcW6/X1eu1c4ax+pJfsT+5c0isCBD1LnTNyyX6DlN+5c+bfGTRd0dtiaDbs942IGDKZpc41mWN7jzg11cObdJ4AV2m6MDfZgRG/ZH9AUrq3sQ2VJSte2lsj/66ZRazWcOqameAb06oqW9O9IZusXneSgZV4DthNYucG61qhaGw+38Cx23PuTOgldQjr31owdSZ+AlPPrgdz/RRrG5ArbRdcGg+fV8bDhFRMyiP+Y9tmquBAt6DcAdln3awFMYvMS3+eCdt6GHdFjwlac7b4KlEatho6tCkoqthVbyAu9VinIFhgB+UI9kSzXaU1W+Z1aGI6kFJRdiC3lAbCZh8Tss1Opl4C4Maaq/TtXJhn13BbsRNg+7mZD2VDHE3huW8TJrSRtDOhabxtxK0n6NlPUqE9nhUWHdrnd7GPElWUJbUIUaK5/YLGaDSbUYtsrfaTqqlFhyYFHZrvWbWXwJY9ytSz2fg8PqP5Ul0tFY7sHLUpXB2c0u/0YpcwgS60XnfSwQUslQtcSddmJWlfETSyp+bzd5jaVaUBmSM9myN+cnIBi/UCKBD39wCMzrch/rej2J3u+LykTUA1LoDYXNDpdq0WwHYJTpY6k/X6HGRcI61oyPwdEbpg9ykltcOCbdwQ0DGrhVtGZksHmSvWv00YpwumNqS78nWvkBxtCBXrdVIaU2gztKtCXLG4HiM9gAsI8vQnHJZFsTLVXUlGbXlK7Ggqx2C2dONoHYpmO1abNBPj2ezmdu4UrEHRbAekiRPQDOVbrhRSM264Ru0vTdANBbsdLDmV2wUaGBE6KYa703dpeXzM3PLcms76TAwSh8Tjev3GsaUZvq/+0o4KUJjTKaHwF1AVWqETUnFINw6BcdOULbh6n815vlQ4RQsjs76Dfa/FGxZbOQcCNuNjWeRPQXt0QRU9J1uYY3tE/CyHiPoSnB6xwxduYTUHT6S5djYrMduevNwpmTuLtZuM1fiwMJwCHnK54HBwu7EZU6kZ0wyU9tleXlT+gBd1LshmUa87p4ZtMXTkVG/IKINfmD05dRYVYdF78On2HgxUZlbT4Kt2hnBb9fCUGx0C1vT6Dhf8nBcSqYC+aAvGK+cWVwXQdEAo7Tz3VuZXXKobh9PDgmIe0ttzrmLosrD12r9zW3fJdwzKK0p3MEdSt2uVZmMB31FX/cFtlW2xwat6XQ5knK/XkqZM+CXdGxyWj8ilxx81lUsQjxKzmNNdylhT63UtX68zxvIKhwz2YG7TRVw4idW/P7f1ZSgo+VfZFX8/lfnyfLqlXPttR6JV/sr4PcKsgg8kLAoq9y+SHW0xuYUhoZtatzhMEbhAbroFJhmlcCFOwWrxAaOr/Aaju2eSjy83RSp0CzYyxEDApwJW9+mtdWf0V+6jSSPqDXEr2Wy08uXnCpsVZJeWcL6zQWpXoKJB8VcglcFKpl85O8TBHNI3lah2aMSxT/czQuIOIwOHnniaB8rW5P3NFVIAjUhpN/NxZ1r8mamp84aTQcre83gr9TATunWwfkjZM3DL8Cu2BIycASdLC+sFYlqKnQGT9C02hY7v2SKQ8JUHRYm1SdibgsVqlqolSW8zUfBIyQY3ouXdVooVDSdJVUPC2tG2huWWR1OUW8k1xq7rdTtj3/68TcDe3fFpvNUMI98wMNWsBmCS6e5AuncImNxLwGZbq3S8vWgX269LS+Z5eS8m3fGtQs+qYu3nd5w0zQl5brxmwEWtW3FXCsxUMsa9vFueoLNs4OgjM6CGNHfLw3Wq/MU0S+G4My6y2IJJplWfYJ1jpWdYR1ZSN+kxTsXGqQk/WzzLBBIBAgaXobYTBau/NqF3xDhBM23+r0rnPOmWYlhX9nmXZCXe5E6FlaCUATwuvm3ThR3VH6nACr4DGtoH4CBFCp9TiS2rHY9HscFPenOEOv7iLNKMrz7fEePr7Hyscolm3uWbPx3LyWos+eNcJEspuUhu6nXnL85+mKUkXbqLv5h9mP5abMgoHSuqQAm7c7KJB0laPUAzvWvhMsivtKl1SpNcpNk5WBKgCJP6WjQiFRHdR2JrH7g/HQNbiF6fe+B8e1cEu0/2Y6pbnY2JGjutDJxq7HR7/694rwlPDub5ZDkD08oPXLsL03+jWVRG4xAdfbgKCmqIjmBAQFMfW/nw7oW1v5v9XH96geWejbMZn4AEwDdoEXOnDxhVYI8qKdkn3OnM+6Q+6FDBctbrtXKucN72Sb2aHblzmF8rzoNroXbbZK8LHWYX3DKFwbDXBVQFKRaLwHwKd3+J4h9ut4bZAm6jFhRHxODeUa2kkiwAhMu9cHf72wO8eC+U6Ecg9iWSIsyAxpwgSjjob51m59W+Xwq7P1dgP0BhdLU9fSz0G/X6no+fZhnoJX9QjN1TitDa3sHbze35XDb4g6Ls3pKk5CNup9n59M+x4vJkLC/jcEPHjJesxADY0/KNxPcr5o3otHQ46/+icUop1JVJ5SDRjA+hwCE1kteLSazUhgBJc5RyQ/IP4Z88/OvL6cNnT7+8eP3+6a9P33X3iFZ5qfPv2kIVzWFTMMwpmF2SLjhUFOzy7in91rHE/J5jiYK/tsWNuXOLvK4W3gzbSyg2jGyCKjpBkanV+TR/q2W8qlManvMCnkVlRtVra00QrIpx0v21hC2sxAK0rzjVQOL/DngNfy0RXFRP4CfupKil1K8PoeOPc6FkPptxaSYEPZNm8WrDuOqaHWRHhtl6hZpe2lt1Kf7kbNd32VEsR+sGo6SC3cdXMps7ZCAgtIKiwGy8EIqfc+nkpF7P+ywcSH8+/ubktN0kMXId3euxPFA03zigYtX9yZ2Mlr2nV5Jfc6Ee49zVguIdxxyDrasBUGYjQykA2czm1OIqJ7Y+8Qp2vnKavnIq+WI5U/Hfl9vsKC1scUANlPUKwQXq9VrmgyMCn1gUc2/HC2qZa5e1ko+wdGdmxSnDMODuUx6jQvVFGBBHMJiOKgoHnPRXYThqrAgnYiUONG8mSCxIEchj4nA6NJWOih6CKkuTdHjqVk8wsdZxLAyk0Nt8EJciX4kDNJ04JMV4zKKIFV0oraKG3SmWFL3PMhvyKUXNDp517Wz/8QLOr2bs36pu0wWV8czoi7S7W+LDn2KpxkmhjdoQutCZ93AehE6cWxxXPNuQzXgyeQrY+ipbKC64dA5NJYfUuQUJN+Yb1KJqk0FAP2URB0F3qSpH3jFLnUPcr2FB1uvIXFLF2CteqZt+0ZyEIN1fwHpsxhUcsVLuFJR6vdZxk0zVBFimw3FyCXVW1fxaVvPrdjVkoxj7CtJqQTmttWDQFqGhtxXUYBxuEC9u7YBVajtilbKDVCXqTpSphdLRr2bKhL8aK6ozL9WGnc/ys/HsPYj5K4VOiOERDTs0oB16RI9pm4YBbdEwpE3wVWzQsEEjGjZpSMPWiE6NXliB19FEv6T4coXi37aRs/bpujLCEacBRE7pxE3SLdICGuqFcLOneKj9W262yzfjSBeZl80PAxpS6GyTtqnxsdTOlbTZoe0mPW7TMOrQ8DiCEBq00WlSiLRx1O7QMIiaNGw12jQKmh3aCI4i2gyO27QdNpu0A0XCKOp0aNiGYlGzddQeEXq5r/EWbdMj6ECAfWhiNwLoSdTBzgTQn1YbutQJsFeQD3rWDnTvoiYNRpZ2+kztmG4GoKrT246xIN5iAjI10GYymfqZAEOgRdwpbh3gSSrdnBTVFURwi1K60C/QDXHlpNRW+l2rQjka1JgAMfp/0E/ip9lsBiGcqHJtPel5FX/qNuHxVNEF7CQz+BnDzxITV/A4hZ8J/MB6O6QKtpw4oDeQNOdFlAjLMEqVFjIHAlyOlOGhbi+BR1mWkCH0DKw5roE4XcYBPcdG4oCe8tiu8Hsl5NroficEDYuMhxD6+dEc/rjh7vrI7Zgcldhi8FKRDaySC/VDp63vvPDauuCF29ZjziCGw+N7SpamYugcWJb/WhR/wZnQT984k/rpIWf5ZlOh9VvbufRXNeQ9r71e8340OI4jj4/W68NDy4pHVepS7l9x9rbSsjqC6LTD77PsTO+YB4fuKbJjjiLu4YFz6Ar3kBxuSuvSygZoa4bBjTcoAwNVgFYIaIwKFK7DuqBgy1SFYZGWwZCpj/sfIHLSF+66GAOv+P7BfMd86I1LqC5ThGezcPuL2vIWQ182QXPURrXqCl2t33GX+095FTfgAwcvUsiaU/3mQhCPovoiLRoxWG9PucsaNGe5F9axWgqnuMMFGJK5vyk3HPkfwT+Z+yd8+FE5OSkTnnJwK31vWUu92wImjg51+vv6KEfgXodP0L/yORoxUfYL+yJ+0OJTG424f8a9Pyxgf9z6Cj7Gg5kY8lE8A0/otqt9iy1rsyfW8nyt3COqFz2VzIG/xAtpzmbKBFRxlPscQpb987kCh4yw1+u4r0sK4fs+ko+wRShSi0c8bkb0GVCG1wWtoc953IiO2kf0dyAdfwAR+RO4md94nNNXmkKmyoE8HUK/lgmC0DfAon0oiajJ8gnqf6lr7dAv8PYX/PwCP7/CDweyJ+AnVzG48sJjCj8J/CzgZwY/S/hZwc8Ufm7g5xJ+zuDnGn7O4ecUfr4rbY2unOjBKxDU6IUqulakPFZF91/i+1Poznv4eauASL+DxxdQ2zf4eajiDv2giqFA0jv4eQo/T/TAl8r5pIrNgfjz8RUe3Tq3H6Guj5gTfk5UHMAp30lZLHrwFTrx80Xfq6rom3+v6CMVP4LD8mfm72v919oYTv5nGwOEZQMzysz/qJikmX+iWF7EX6r03NbaeG/tm/t6XeV8VOXEreVCOcMRHqA+Vg6aiU+VdgUnFu16VgwID5NiRWeFu9nW6bge8Uyh1Ov7Pi8ipCyVY8O4ihSj1d4KgviJoRq5bqHu04VK66miJM331UezLSIfQjAmTeUzlrkCoiyBxzTFYATZTpwabhsPF1sHxKIxjA5YHbN8KEauW4D+1khWBgp8A44Mxt47BYzaNt4u2oNeZlV7WRXeQgyz0XodgPO9furKYQ6bDR98A06MkzigRdIOZyA1Z/BasQ59rliD/q5Y1OrQPxT7HWiaG9I/4ZH+Bult+kox2Arc6Jh+VawR0DeKhcf0k2J6ZdOXioUt+pfO/YtiXkh/VWx4KDgYHGQ422N5c0hBS8LH8wMuJof08JAeptmMGym3+mheQforXzKxWKZplmRcqIM5n+dYneYby0yHI8oF+66cK0WowqcbiHAoCjiHx6QrxDBsj1hE4eFoxBr40BmxI5QqpGDPlB132MDbLP1OZw9OIlawsNlAjABUYB3ra9hswveo1aq+H1vfIfgFfD86rr4f2d87WH/UObLrrxzXwBwUe2062QhMH1vgOSzYiXKkIDTBp1wQuth1mytozbZpObdNy2/1mR0Ykw9gMxzKURwCCwKcQu6F3awPuC/gWE30olYHX6JWh1gLFHhlN9x1Y2cCQzreS/TcIqQHuAzpxgU0niIRBNVO3mdpvZ73WOpmXkhuJUSDFOZwf2OfNt5twAurJuRuExk24UocH4Syyu1jQ2ilqobKjXMJPraEzsQeKmcA0AojDLpZNb8NdcAGjL0LPJLsMTEAEMc41Con5gLIyYoGyX7/qKs0ayP6Uas1iFqtWJARTpIVdSZqHXV5rxVGSPEChiHswOnShLPzQss3beP8V3Hl/xo5qrOeuaIKjo/KPWxsuyaW0VnVel0+i0LlHhok16w5h41Zh1jWTHWx23RFP+iWJKUf8cYg4o1YdIXHeHeS30omXTXMXHcEQfVY7sp1sFlNsxl3PI+TrvwHNBGFNDcPhaNcDmEq1hL8HwKk7kvx34j2XcX5/oxxvk2076X4T8J96/lcijLaNzxa4b51rSbe9/VYDleCTgWdCHol6I2gc0EvBT0TI7YU1axdCwdCd5RmWVbo4WreEPsqlxqDx+t/cdx+s9RxBHIlGfhkVuE5+hC4u9oQxhDdU6su1P0xv3MI8pm7RVHF5GdehffOTcRvO8lE/JbsrAjZ9PlSR3wycWLm+q0IIXNThIPSr1eiCPs9EXbc76nYCvy9Ensif+c9vd4kBtPtQCYM/S0/QxQRUvjdOJW/zGeDdJVKBmle2AZh7ZQPHJR5uX8FRqFXKOmdchaAMeEpx4DqzkM7R7/POpjHY7YnzynWimU6g7JKXUlQr9tVvFAQCRKrCOtH281auphydWMdYdsTAwey6jUMj2sIEeqfckK3x4Cxtjz4UgrNpxAhxgvbJL63DpPJGtMFjmmXuXyyxV+iDKxABrZobpH1ZCfryf1Z36vtrO9VmRWb+Eu/hZT7v4C7wa8Y/wZkbu5zZQPusdjxuQXk/a4gooz5q9+5/0553oi+0PnDrXDob8Xd6K66Qz0j8q/XxWCYSanXgbPuMTkUltD+QmxrSbBtlI1ErxeWSxB6A/t3Tz+81a4W33VAHPMEfy8UHMW5Lq1hFrn9iUD02u/GdVmnC5bTvNcDGcJ8sfRB3+xNEx33IULxdw58u3/B/becJvrpG1iJG2YAuqihr9gnRfWel+BmF9RYpqEByPpdDV0Xco/YAvUmF9iBgMSY6UQV+w7k6UVdkrPtQr1o4LoL0IMO83L+L2Bc2P4v3PNoCrpb/1fusRQynagiIN9jziBQaKkQgTr/GZGuAN2Y8DyCU5OBw37OEtjeBHtcJFG5jTWeB8PV2h/rVZY9M8N2s6GEv2U/HTPqPsMHORqYhNi8Exei6YqR/0QxLPwEhOMCVWGqTT9DYrZaGEifRaS71ZWiu3vYIT2zFP0B9PzOGMCHjstpXuqnr3SlH15wOtVPD8GZTM+TlvfYS4WiHvcfg3Bnvi2GZlU9VSM9tbhrPFVu2BW9T8pELi/QP2OL4UKPFnIDDPpgxpixKZ24LqH48USxjNYc2Z+hoZtuEOIRsoDKPriuOSlbDqW3GkGQ4EUJ+1+4y5IHTuamhI4NgmDKWFfrpkR7mAc1NiG3k/xWjw/4XTjG0S11SeZ5XfPieVQ/ueHIZZF+mULyxGORmZpJ3wheGZuCvJ11M89D9kKWlQY1JktU9zwxojUn1yNcaAyuQSRIR4/CyTyTSh4sNK5Rk8AyQqXngQ0uug3seoQYL3EMbggg6+p+hMCZv1TICqcsdcVQGnUCoB9LMZvhbnU0+4Lz0s3CAPQFBdAbxb4pJ0NVB8RD2WycjCJuwXCtzeThnm55ISoIAqiVJiygC3ZEZyZ8XsCAL3YWLGx06Iw1MIwgaHxPlN6/qGbtjZCR6xDRqK+F6mqO6yY98GhkLAXYJr3ZAPcVhKHLkjiosXzg5Aht6wvoct8rkMLxjcRJj4WBLhse6cRYv3VMAeh7xnI4AUwHVpfj3CS09atjBmiroj7sAgbAkpVgAVRP2BFdsCZgJvoYYv0L1qiEER2hGWIYgY4ILMoyrGNmQSPtJfW6hKCmyHmmvQWZ5LfIZ+BoYO2o8vFEFeQmqDHPS41pACDvwJE1BtLmD8piyFBaZUBoquoZsuDX1GvQiJA4RSBbVSKoVfW8VaKBzmBV3o6Vt7OVNwzpEUhNDAQWCTOUDSwIxtIktPWrY2Btaz+/WPFpWEA0yAJX0gahyPdp/kuYv/+COzDQmhNOR/0P0McvUEEOWfDUhVmsxru7CwMotblEA1xLnnKCshc6iPtv1TAZgTWtU7274YhA/D8gKvgejWgCRxQBBA/UrKRerfrviSKxk7EFXEtBzeesOFBR1gvOJOOgzoNwG7Agc49dAh3T5SDUD1IhmrGPoLvTyVAAasK/uhJlVyI9Nq8qkVBJgW5JD0fcNd1Cxk+ZhxNzavhUsOHtcxX/IujvoBP+A37+hJ/fQDtM4duv+K0J35rwrQPfmne+teBb2IaPnTsf2/CxEcHHRqS/crldrS4atu2voKuED/cUtj7D4fpv+OdOhkZkZYhaWw00Iqwi6kAW0I1CHUHUvJsHPlZ5wHJgM6qE0Y+2lVj0ACLm9ZuD4ziw6NOTHX7acVBk+I1/FqTO/T/5jnx1IoozxqliT/QSncLaXA6V6+CR1IgYa1nuv+JDVef+cwig63+FQ8mpGlVHcUUKGEBZpwNG2MKvf4A+iMGJjwMpNKCOTiQP4N1/9PH909Mvb5+++/L01dOTp6/fW2N7VOm/YHkzOKMzQfWhjq4CfYjyPGRlvmKgd/OXiT6TA+FJEzpPMbmd+5XJ/Wont3UGYckYWqEE4lIx9rwvUZ8nCSzifBDEeHjgsZyegR0wMKIJwHaBMbpCYFrm3H/GB9zPGOiG/IwavdVeNYAr0FmBxFFZFJmOjF3/fGF0oeYuMqxj/Jtb4H29D7yTXN+mwP0PyuN+Aj+pgkGKeh15r1SZh0QNBJOxF+I3gRxYqvpMuniyWq87SGGXENjQX1JJpacprPLw+Dg1fzPzV0DktRR5F18obIlQxAEqXANpCOHhzzhB/Rva5TGYKP+SYxtQxoWeaVqeKJcp/RerZ89VyS1B85BoZKYpJC01UuxZGaDThNzYuT3fYeFgsP+9K4ZuLRWFPIwAVKw5Zed6z1FA7G5KMSJRvT8A1rVy1NoX7bIHk1POHCsHDYFQemKAy+OD8gRV/T8VhsP7UxG9ApcUQwBx/5IJV4EG5LInXJMLHjzuX1KYCJz+S0wvXso6MA/W4jJl78XPC9tiONpjrLS/D8qbZObFEgLvQeVf8hrcqteMakz5j3i93joqntrHxdNRo3g6DounMCgTw7B8bLfb+tFysxSW0QQENTc2E9p+wvKZtFeD7uiWsS4qpjYEDs/h3hRgGfrcn3IDoSkn1HDeGusBPVYQGegD/PzFNcBW4PCF7xozJ+bvlHuY/gX/wmrzv3D0GwO3Gf8Tt3nSP7eU6dhV4b/m9Tr8+q/UXkIBHalssD5x1zQHR1z6r+1zuS2f6jbgPgWBrk2q31qvVS8olKNoYuNFiJ81GPt6jVg74/V6DQjhet1utxmTOEnNWnXzmF0Sl/eUb39q6UhjTPq5Asc5BeCpMel/0YiG00Z3imK+XxQNNkVYkoCZ7nwE++ke+ygcQfZ1Rbdn9dYMZF+uZlRmggek0PDOwrBBaPG1QqqO60j/mnudXq8JDKGmX9K/BH3Bei39G9WLBkGMD+1BGGMnbtQgihtUrCGadFsPHqmkWMPNbkAbG6En/tEI6e/g5CeIlQdTuJ+BzpHo7+aUwc9we8hYSIs+UwNMA947wMxSp3VkBoWUCHEswAUlaSM0D2Hj2Dx1wNfxNSf44sCj/xVisQfE1W+vYGzwpukFpr1RgyBubqd9grTOdtpLSIPrn3RbsJ4x/S9lUsxbaRu1m6pV2XeStUrbJB+XM7A7Tc042G35F1hLy9msVgxEa6etHL9u9e3Xqm8aUHfWrgTqgZMBGb6B2gYnq31cBtzB6oqu/N3fnxwO+VmUwLVyXOA5xqJFOmQDoTy4AJopmKPxrwCHB8My15uC7CX60n/JuwXPBS8efICWzsA/0wCEmtoRLMDtQCJmp4Y84hfgef5mCKgL81i+ub96oat3mdiqnAUbhNNRA5bGUeMOHAzulg9lXNmCIuDINMuF/ccBYAXYjiB/13nBgo0q1sgQR+yO9DzaGgJFukWFdsePQ+j4cbi/4y9V+fBf7fjLn+q47nEYIKzD4B5gv1Kk6JMbISrV6852V+72pVyjQBR1H5BkFnSjJHQbrPqniaXZOnAzlH6i8EEZLqXaGgQLzLL8ReDwY9w5LtVg39l5zZxKdAuDbuD86nXndbURJooUH63zS31kjXR7ofW/7/S51HIIHORIM8yGi3fdQuWh2CdovxbqjRhXdlmr2ugKBVTYRM8Gu0x116UpN1BxQ5d4yn+q+uKEfKMB07gfMFqLbsMGOWj2u8YIDZ4iCXdsCzYVJMkumCARBAdQQqZoOebkWnoIkTFagpJGMua6OervrL8wC5o7/13BYjFovT/zz//NexkIIwuwsvKczMtRzANuNNHbx0LpoRSjgO7DgU+qqPlZwBpGC+EQ37znykw/w4/Y6eIRwAAO8j/GF/L/S4R5Koawskb+c01Z8HQ+YnBZYAMsMAqOrd1u4+IR63VkWWYYvhJz4cImes/TIi/8UVtelagVi0DzqPWbolCQmSfQtWlBwpEkbml54QtybRgyFzbqBjodOe+Fo0VeqacVGDrc/jP9ByAIsbW2GeC7dKgIUQnABNbyGe+xYBDGTqR51oHzd+TPStlimXTSFrukaxnzMseY36lnzO9WNK7uHQfVccW1llYwe5hXPXIYA65KeGAe/JZUGRhES6p5VUinKMYYUHmRJZvizYWPeBVae8mmiir/FWcT+PvV/P3Adfpbpf9+1wZaidL33V6Y5MdKZy8P5cG0pDp3x7fyaB3fXnNmjLuV/wktUUAAhD/v4E8YAtYOvIatqfq6SwbBHEQb+KdwQsH9GZzfcP9a0QUm9lFBM0Aqho9gtY1aMfR8fg4HjiDnr5CO0Cn7XfVWg98hoOWELUExfAV/4Oz7Bh/gtjQ614+jbgqnqWd4YN6Hk1Ca9Fd4MLIipX5J0eVQuOmoxubrNT56cBHJDb6MamyiUyHtiiS5UJlYchP6IyrO5af1OjSZjxiDzPmoS3LX1T77OZX91OwDX0BqTJmEU8nE6I72dLxQvTiKzYaqPh6R/gIFQM+r7qxOe2w1SGMrIvobA3/nbrx8OI9AAzNzZsD9G9UPBk5kNFmaXsPDXZM/KlgzOG60o2azeWS0mGjK2Qi7uD+DFwnIYSHcI428RmHssb2xmS/H2i6ieA2DnfeGXTI0DcIF4r3fFJp9WHWp7bxFcxu8mPWb1o09UuXjM4WXxO6OENt4qLM80UX8x0A7dNKJLopJpqLXYJrL3igvxNvNjSLyvRquwCAFjz+V51kXYcIZbeMBWm+7LbflNqna6Csw8FvDPer3G7hGfi3fnLTHsvW6iXMEBh1OxlJC4oylTLgtKtxmD0761MA+eiJximdVegvQx0/v9CZAE1EeiDX1l7s3+SBqI0T00YoXtY5oqziw8cLyWXpN2tSW3voSJ5dUR20rOEDCM8UG6X4oQQtqffqhBKvwQowKYiDuhgWg3ZAm4FzxzpqUE5jTC01r6/VTowar9K0eaHCpQkUu8spauYrk2b/kFv39JLbCful1g+qAUrU75QNUCcSwH+Jh0kuhz5OrY5G/tqvhPfAGtLwTftljNgNlQJQEa6szTsy5rdGrlkTppUDiecrdZgSYYLrUg9vi86KDXo58XzFw0ZeuqQftAss3QgUa/QoGd3b04GhYa9FhK16vAzQGFTWrADGkKWVN7XjMqo8AJor4ZjiFlNDST8xratOX4rWBRpAdKyUasX/ZOUJ4hyzFLMHcOhItayUDl0SlCRPqMS9RlaknPMNwQSbNRcW9BkvxODGpmYK/wgPNPVRb6em3qxVWbaKqTVS1iVIgBGMBjEDqFXNHE6TxCW45eOzEFau29Es4APHwZMM6jLjEwxllcAHmEkvT8txB6w2N3jtVPZYgoU6RPz7jdOtgwxRNEfu56kUYmqnQ8t890yBFccOMX5qjIt3XRMfHBf47wQpcQN4EW8EDC+D9zRqrrn2BMwHTzKU5OUmB5X8BbhoNEmvBs4m/1TGKlmngNYN1iDhuhkxNlj7GFMmUhq/WThVQ+PcBkrsVoPcBJu9XSykvjz0gromze8xD8wJMeQWm3AITotVdsGwt8LwkDDl9iYa3ZSVka5U7sg97giNxX4BNIbgDS9ljEInDEVAJxhorFrKdCxZ1tZj1iUxqEU9YBMWiJMZ8DmYRJjTaOvr9dUdJv60ZMOdHu8LvHz8l+4otwdcR7ER3FidJOyohbESPFWd9KCd+1boaI5DCcRv2BNHpixE8pRY8DWxN6l0BdKHA7PIU5e7EHN1hTg/IdaGjsDpm28NARlgnkKlYyzsSLS3P/FCa3Xfsh2XC4g4I+WP5F7nOf08CRtICJ4fIicfw9N+ViUvU4fL/BnVAFCkmYQlPZvoZjr1ArBmYHJ+qH+OYQZGWFsOBU1uv8Xupq0Hs6oNRRVkW7Rt0Nwqdjsaz2dbBMJ6mes9V16DuEgOrb6Nu6JXpW8g7g5HgHxYBpoK1LOwgd4Cxja8zZU53Vxo3C5gYRP9JzCoOBaAarQjdRlo8pJb1OrJeASlqN4hcMWHlFBeLZ6VYuJ17Y5pBhuFuI3oghP7fIDqGPZKs04qokGyu0MuWsz4H5lZKdqnsOI9eSKoMDUJzyW50kRtJaFa+zSXp5lL7xbabNIJv+i1sRtQEFkklu1Ll7XleRMqKkr1foNK0qKZNQ3rUgJAgAQQ3oUlZP8RQOYrgp1NEPVmUHqBD3/claF86eKkyobPdTw3zYSzBrzGVhC7xKZGErrYyC2myTneTwZX6mDaPw1ZjROgEy+eS0Ct8yqQdFltuXxL2j2jAY+6GbSsK9j1Zoo517Za8ewyNG/iCowS34ii6JRx5+SUYwUt/SWdMgidIHyKrS3DPgEe4U5MLumLSV6DSAKd86SsBfvkT8ybRS/+KSf9MF7oBdTM+zRkELcfHSyZ9IegZyzwHiAwc/V+zDJxGphzENkLPWe5qg6AWoacsoN9ZQC9YQB+DEiA2Bs3dcS9saZJbc/JeWnoKITGFUPMuWM277qjXG9Oxy/SV3oIth7P6dGSo9QWr/HLoDGJLXNCxxy6o/gAxYRi7ILcJeoYZ5xJRHQeE7foFVnRafKMXdXDJvSBFLy/2dfJW+lKwsB0F5mzhgG/udvjUZbM6QPcCQGt1b/NDCPxc5Roaq+GsPvl5aJTj/f7fGO/3e8er6dcpXbLMOwPy9b2/LA51vntLJGj9m3r9sghJUlywPsl04JsDlecH6VgeQFzDQ1p257jsjt6PdTjMx+zKg9s/RA9Og3ZDkrguJwYhFsPHrot3RqOO7YDveOGJPZnxZpHHLPO+l1vOvCfI7WN25c49HVuIM+HN9SXV/D/vg/FA6rqu2smsLzjhsKTovKd265/v7/bcdBv7reE0//8ETohaqh91iywJZqE/elMea3Rhh91J7oe7aURHicP+Y3v/1aZK2tFuwlq6B10hasFeNIUla8wABHGdar2Q0W7VWeo0Ingw1YTHYVnNdrMzvI5z9k+9XH/U+PLexg1LlvfO6/Wsd63tYN+ycb/f6OYeewsL+W2v16CzOu4YY4Ic2oKjDLriLMMLeFjeOx+ce7nbiluek3vnBC28WNa7Hlx7mRu1juKodQRnd9dwgHHFZjp2EDgZjksn3DNZHSpYHqr2nsjOJJVMDcJmsx2HzWZzN4BMYOLHSBGH7bAT0FTEtVAHkknwcSFA+Q8/Y/hZ4g9GvYKnCVhtv4EfDldQKgU/8EFiaBfMAj9X8HMDP5eQ70xUwWcCQq/LVwiBQM9FEe5Fgok+RJQREHvyOzxewM9jESvLrPBc7l7U2etFTXCODNtry/L4VGrvXTzdDsrcZXHLfxNyhnaOdpMCuCz/SllZX2tjfoKtQuAffaKFzcOrOc3q9TprXpxj4RQ+luz2MYL5rYgXkr4Q8VjSbyJeSfpQxBNJP4g4Al0AIAR9B2N/KuLWcUQ/YrEnAJgNfWvqCaCeGdazxHqmWM8V1hMe63raUI8X6oqaWFGAFYVWDK0XVjQu7dKgUWpBZ3RMl3RFp3RCzeVk9Ixe03OK9wHRx/QtfVHGxGgT+s1+eciSwVsZP5ba7YwF3UWPha3uwnXJi+Gi8EfTHjHaIebFUA1nIwjGAl9WLPdPBF1CoWWfhShzvhguR90laPaz1Fn1l/W6s2JLVBsvC/b/of9EDJxT9l06wOT7J+AAzk71UwhPUDELaUBi4yo5ZmF33FuaJsaj7th1tdfOqjfGNsaEXrGQLlhojSNLnSvw2aRXHoMx0avSFBLCE6TOFR5Igji1Xoc1tiTVV6j82xBN4nWlps5vwwWEsvo2XIxcqPMOlEDfNJxBoIVs+K2A2IjNSHexykxcyGQMPkDxBXvMMvqWPfQ/GD6vi1/C+II99N/CjvTQfyEwx5cix4SnY4jKClm+6SwPdZZ3AujxnAV4WdGCjel3lsIcTRmcBwb0GnyibiCG1YqesxsvRHt3MH7zP4rBTZ8pGd/0lSR4uG5/eOg/FfFNH/6Q7aMnYOdO2TfpZHB7Op1QblDvof9YwD1tYa+38Cb0DB6mcJcyCNtnHrs0zIcz7/cnxD3r4vx/d/mInVYi95meZlNN2J3XL7vkEuOy6WOuy4Ezr7NLL6Rzl12SGIfvuoBxngcThHvTAvBPw28BsXRgVgBYCzzwnNfPSQ1ChxuHuUm97kzYitDvru71lMEQrvClO3UngIoOItXUnYDj4VUPDvm7ZOq6FFEOendjSv/PgHzN5vVzvThgMt3rETuXzpSu6HcPEsjGmDDN0UES19XCmxDwL5x3zZhqOCYzThwdIMjKRhBdkJgV+d3V8wLLcR/w90O+EOyxo+xGL+QVtc7Av90hZ3ShCdoMQLYYwJllL4nhjxv2EjJjp9IBwz9JeXXPa5m1r7PCcTGk1eshRM4sHEGGagRyXhcrSdGP29O+xoYN0/l0VViRl9yb+WBmnYxu71rHbb0nOcKTpXJEH4s9tJgD+kGy2/dI5h+VW2ur2ST0mYgfSvoafjf0y8/kqnaId7I6qDUm+05h7T7ntOZsWfAr/zEc8ihfih6yaZAkRR+ZL7Je13YydIIqQxgSYlufP61aBrdcMfgi4w+SCnZ7IuJgoy/8fW+75BnfWXA4hXhJhPtnYiiBPpowGjoyjpV+XKZ3Ajv9qErvbNej/EfCigAGr1T5zwTLaM6O9T032MNsQxN8yDd0UfQZan0hHWAXzwSFkLCAo9y/FnQBzrh4+ICLJmcJ/OH+qWALeNLjakR2d1rdnLW62rcUM42Lppem6a6ARTKjL6QT6UYbEe7s2KYwbSr/tWCZUUrN4P09mBhuIKw8g9FR7ivBjuGPYpCbcl8q1tL9gzYQHT9KHe6zvOZlrHbuttTXnxy+hqhe81xCPNerpTokdmDPJ/Iet/j9TEkR+KeJbAHi63pt/A/Q7WDXet+Lukm5jYF2COJ1ThWcpdMMHlLjFz/nFJEY/DAkxnspxI+I0AsHLv5J6Iot6CWIp9WNUmYrhtxmN0ZUj7VgLsA26baqqtLBfEPeKaoLdCJotNphi7EZucVC19oR5JozCAcp/LEwZvf4eOrAHzoj9K0DSbryTlhVrn1D8I//XDAwBaiB0Qj0Zr12nIdOB1hXEIbAPYb8oxFWMl2SS8kTdTDFe7UO8FbKw6KZUq6CZjo19tBpkqLo0kQhT+7cZLa/+AenSegcq3A7dGfgc0Ln/bC1Xs/78L4rcq4yMclX5uLhO5ULf4ahOOdU+At9PAG3nY4F+OEFBmatMKrPBgC54xinHsC5xTwBUONyrrCqGe3UtKMvvP7HQ28dNZpNXcVODQbq6Wx8vjhYcLV3dNXsflUgSXbqIYEI1Vhjvd40WOVso8sOvkTVKKP4m4OOJVbNfyk2u7/S7/dU2qgqbcQF3KpKf9dxXmeY6P+iO//vd71ZtdJEP1ssPSgnagUTZbf76w8Hs90Mie2Sb8Cwz2q6VTXditEu3bRerztTBk3TaT/Bl4TQqanGOGqBfwg+/AHZ58z0zYNipFd+OVNF23SONHF6f9+vhe68dV1VTnN3SuiUEJp4bApH8FMEisemGjolU3gNd7MDuIJqhO1qhG0YIcQ5N6iqiVpil56yANjwOYPgkVNQIFnj/RO8RP2V6JVvemCf1BCSYVubF6di83p92kuQrv9Pxzq3OqgZLntGP+GM3hn2UTXsIxg2nCL+h8P+bWvYv5XDfvl/OeyXxbDNeDvVeDux1ToOVy+kohuzWuHDA/0oiV6xQcjkYJ4t5hBdew+1euuQLYr1CnwpF6LfP66HtNihQlKR6OuKRFvav6q3x4ZYlQUupLOzFx4HZfZj3Iprwk9KE+/HDqFRd9+WoNsriyLxb6HVVts6BYf5L/NEMe63qSC3X6oeREHbDN/wB9+cBnxMBavVHoK24gP8PHQiUsrwZQ8a2xJ8ljpPJTihlhmOqd2dD05E6PX21hVVtbXt9Ea8vY2eweUpB3ChhD1zG6hyB+zHDegIDFFD3yDEjNQYMBH9sP1ZW23v7tQLlUtetKRVtYv9myKuSFPt9nQ26b3wb1YjrUjzMZLmghwjRttEGWx8nSlboDZpald7phzgPw3NrZbWAp5Si46WW/E9WHrcNoxDE4YxEeyh0yKgBqYfHGTprkxSWCRMheaEmhT5IijUjzrt9bomUI6CIv1GYMALaYNDOB6aj8WNgethvJtykMtKO7+4mZ/ls8VejuLGpoXHFS08Pop1IEr/BsjZVHSJQeUzAaankO66oxF7CKkfHBMCR+cPj7vkTsagK/xLkCPOBYU7MpkAOQPSqADB4whlHC3TQOqGnplnJTb0nSURXrIXKNCDpBMe0yU9owIknXdUoKSD7SxBVMKKz+DpzlEbnBoUaHkvv7UNnYpyHne2oDMRLsySUZV0rxiMb/jQgeYJKHecq8oRosfGpEte6OtmzWq6Ir2wTT7Y2TSkDfTM6rjqFkdZEDWxLGsod+Ta5WFS7OqQzb4Ru2A4y1SBMpJf8fE+OAC/YvoCNvRT1nCBgFGgFnq/CY+s7gA71vhhX0DDpmsxuENi55tz9BNlwtB96BzBtyMdNgwBNO2Xc/CfjA8nbep5BmkLmM83+sw8Co61cFiFokBgYtDN9mgvYnkebI2LTJxDDGsvTz2kg3uRrFoUIH7jKnhqrYKP1ip4UqwCXAKhXgIwdvqUftSL4Im9CJ6Wi+Cjf6LPak/YE3hE0OEivBSlocoJubtOtg/b7l8qUrE2NvAeQVOxLNi9an7oI2tsz8yzVBv6Gp9PqhUe0fdIL+kj+kyP7bU9tkd6bFKxZ2aUyh7NvrEUFPG+USBQ9u61W1vPcSwq+wCTGgUFvwE0O+mzdr2+6GNc61vgO9C+ZaU1Crv6hu8oqVvIiEnBv0NHrrRTVb1WPEXNwJxx37CroiazRG+I6zx0nJuqLhdfoiYh/b6drhvdyri3Bx/sPBS677IqRcv8V3dyVCnUYgGuaDEIUmpQoqBVTZEZYSOCzwi7O0yjla3d/DFGm+PjPRj9RjFTh4O7biOMtVbG5AyruQ9joWMAfHPgQQtbLnto3j6UqTDs4vlCaD6lrDCqKozicidRCjFAqh9jwA9mXqn/H8/8vdO0Y1ywZ4ImqkQZe7bCVpW5UYG0cXeOJurv5shU06yqaRoN38ImDch0rrwF1tk3jCeDF29KYXe6BD5OiJ+097kzVqjinA+cqYfX1dIJ0FjuTUk8wQTTyqpSRtjc7k6c7ilar2TDVF//I/zlcDKirptS153oQ40JSz3oPS01G39fV2bXYrHayEIb7llzIStLzRoFwY7EEQWtvSAeprApY3cWENprx0SrKt7WktkzbvgikFpWHluYGDwrKvylgL+FmLsqTiCyatdKvRVNSSUsnmtRXNEV+lqDQtgS1hdiMItRHAWTDlLDMnc1q3hTxX16VS0vm8SjajhHxXDqtpgOg7LF9CrONkyoIHcbL8jdzzTfqZrvxGYSLllIrW0wCo6rL15j61MYmE9eszxsLtTym+17Pu273j5Ke8LNtdTWRXGOtnZDAfGMr9ermnHZFvqkKQqO64ZWlymduHxsk/UaowCZ2V6hQSdeEb4vXmsZCanmSH+J5wvSXxobQfAP8ZfFqQRalF6jh/KSWAevGo2l9qaBP8zkpGBhir7dl2A5DUHpwA8Fw5KAa40qY8l78IFK7aVSFYKEbnn+yPHdg+9djo5d3Dh2QXWQbNcoKCfUgZsEyMDZ16TQwUPO4X62ojESO5DiMtP3alTQJ8h+2SuTLl0GUawsX1GwGOfV6gILKk+hIRWBYLWFMbjBvzCgXrMovkRTew5LGObLxLdb3r+aTVwde9nuaX1lWl+hkwCwjqfcRYXOoN3EQEUWmzYIo06ZZqSB9RrVECZD1GqDcyPMtzYyWeHvpXYi0s/gm3DJwE740jJ4QqSropsjMbkWJjUeF0+W6dOWNfUZmL7oO9TOwNikDDREsZIzGu2Ehfz+k8XPhpF+NRv12bCh37XRU1F9c6f6C0eHwlhqg+0VR0f0KUeb7qS06U70pM6Y8K/oGKFvRY53gHwttZHdirNUG9UtMNIiehwaO7wZZwnICKj1B4s6K3A8XMmjT/6sGPBOpdTV9AVW8EfZTTyPzkwkV7j3g4CVL4T8RrPewNgglyYIRTj+7rjHkQ+ywitbgTy1xSEnnuWP8wEPvKFWDjaG1qi/OObDUX0Mn47qY/vmL8tGTR/YD7wo1uaD7/WFIm36SO67ipGFbarYe2muYnwlIAy1votRWLd46PDx5jYLTpsEI4WbIto5oYhEScgG/Eqwzsp8t8haXlij+nBm6nmFCaPJAFdg4Z6mM/bL4IEHRQ2LK5ThzGUA1q1UGV6HK/mMjxd4efh2mz0zqnp9q9t86+j5mdy+a+eRdBoRfS/xSrHlbFbllE5lm/BJOPr6jZcQVs6YDmlvfGHh0lg5h5nI1EGq71A+OHQFsW4DtW0dcxyAvLlVfjWi4r5qe9QL5dziLcUOud1QVVzkCypLcivWa/BFdoi2YU1ACOYavn8J+wbYRRHkf9HLijseir3OzHqR7i2ouSdwZjNFC7pwpWYBE1iJM5rASgxoAitxVlQKb+X9NZIp/w3ALgPXMxhtAitb0gRWNhSdwvZlihbhV38BP9iAoJeH6VJiNutFPyjuVqmFYCnyq4il7eOzINSAE2+ov+XrtcNZDSJrFGCWEB+9m0Fi6nPxdcmXcBnzRsd7yUGw/EuwmhVJCUKU70zzlcwTDnYQeHvywaELEVczMZ7Nbm6z9TqH+9M2xTwYyzGXwfXz6Uzft4eu6MC+VBO1M5upns3CTM4sIw1QWQA0BYAKmmqApgBQsQegKcQSSMpPXmoAmmwBNEeAChugyd8DVCBAJSRmJUDzCqCV5uwuHBFm2fexcVe8C0wJwAQrNY3f3OfSSYslmOASTHbq5GJircAEbtC2ouHK7ZsK71te5V2yqhwS938t1WWk6iEvAUHK6SW30GjNMvi63RQXtAOFwPvmkaI8rowH9N3cz8azGUiC4OZ45+OnWXaGm+kTnvyo4J7PULS74LPUhw6c5JPljLPx4kYkB5z1b1W9Pl6NM3WAt6ALfdHDfU0Agykxyw/6wWAJOLf3VhLv260OJzydjRU/rGzfLSDu+Xp4/j27OoQ7vxthXHz35HiFaV7YikO4o0DV64diOT/jEi5mv7kCkQN43ms+G5i/YC1sEOOZdG4/CUT4O5f8wWXSVeCROWd4ISyFK/boSxFzqwhKFKxDJbgd5ew1BOsxyy3VNp41y2QJPSBBbDukEGtZx+ptEyp7gb4qANj/nhe2qiKSeVIr4WU/bOE9HBGVHgvbuELyXrhe5/3j9bpTg5BXstdZryUa2KgeGObBpwyesn5zve4wJuv1sMbSqgWd5kh2XOwwONwCAAkEH5gDI5b4l3DLcwJRtpoRTSBKU0oTK9JRAhY+QPq1KASvNPGfcwYpXkgT/3fOcveIJv4fJsfvkONPyPGHzvEbZw4kl5fq0qSSxKIHCYpKCcRxMrbqRcpXK+UPTLnE/ecNtpS7bZpAtKfC0uwBfIFcLznTL9BQvQ5Vw+9X/P3AB04CwaHgsSKaRdl30PFP3DXF33MIUQMvYJqV+DcQrSjxL+F2lcR/qICK37kP8G4wHQN5jG0FXKADMhEDgQhNnjQCgVATUWPCqSByowkxBeGmwJyR9wK00oRYWgpjaUFALBYxsAbkg9YR3EMMklSRggf0sT42VxB1zIu2uovY+wRDTZRhsPrskyLbHl6flH1hlb6QFkVZSLFvtb2TXXNzUMAEvDvBxk6qxsxtvds16ET76qutRk/2NLpT5E7D75W+qcRq+M2+ht9UteBFWlsNv1f7Gt4qYjcMIXyYuVkXA/aYu3VTQbmgcE0EfaXoS+18/8zKelJmTcClhwb0a5nvtZXvvdq6rldAzjcKbu3YuhpN35wW6EBBGwcC5UGIoZIgBEi4bMSAUCMM7q494/S9iTJwqthTMeQYse8PjM9iJfwOCddWwp+QcG4l/KYjF2oTvyJ4I/4RpVc9hiAwrvWrMg4EqCP8OWA7xrCKncREBaTFlfFek1AMIEe9JiGx19zg1RgdKmgHmNJfRPyboFzGr8SG6Ct/uihvrGSmxmczYL+KRy1nST6emA/Fo3+VXfH3U5kvz6cOcCTAOfxgK/3xVnmXVtz99vfbZJHYblrJ7Ths/UebIrqv1cJ798XS+Hd3FzQUzPCuHpx1lzRP6moxIswc9hKpNx10/8sH2npH+7/tvbxWt4by89a2azzOldloVQ/u6CszCFS7PRamM1QxzwQOEqzlOqrfbxKdoRZS1WvCZYUKPI1Jtwhu/FgMtkCJeztsxqqfayJeaRfBpwjUhDpopMTQhDr8IWrkrjnEuLtvVyh1A05J+8807b/EX9Qh/nzpamtR/lJY+4uq7qkI68X+IUE6waFW86DQ+imkyk/M3wUe2ikw1sXcqLww97dP+IwrfgDxEeFicuzyqe4/2qmfgyk+Gqjj02WZJoQWSfSJoCZJ5Q/EcRbm7y8ifiJh+Z7IjSZc24tX3bd41Q8X74ZsSPf/+X8B")),o=>o({workerURI:o=>{const r="text/javascript";let e=B();if("string"==typeof e&&(e=(new TextEncoder).encode(e)),o){const o=new Blob([e],{type:r});return URL.createObjectURL(o)}return "data:"+r+";base64,"+function(o){let r="";const e=o.length;let t=0;for(;t+2<e;t+=3){const e=o[t]<<16|o[t+1]<<8|o[t+2];r+=x[e>>18&63]+x[e>>12&63]+x[e>>6&63]+x[63&e];}const n=e-t;if(1===n){const e=o[t]<<16;r+=x[e>>18&63]+x[e>>12&63]+"==";}else if(2===n){const e=o[t]<<16|o[t+1]<<8;r+=x[e>>18&63]+x[e>>12&63]+x[e>>6&63]+"=";}return r}(e)}}));var B;
411
+ const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],o=[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],r=[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],t=[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 V=new Uint8Array(30).fill(5);function i(n){const o=new Uint16Array(16);for(const f of n)o[f]++;o[0]=0;const f=new Uint16Array(17);for(let n=1;n<=15;n++)f[n+1]=f[n]+o[n];const r=new Uint16Array(n.length);for(let o=0;o<n.length;o++)n[o]&&(r[f[n[o]]++]=o);return {o:o,symbols:r}}const g$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=(B=()=>function(g){let s=0,B=0,A=0,q=new Uint8Array(1024),c=0,h=0;for(;!h;){h=u(1);const n=u(2);if(0==n)w();else if(1==n)E(i(e),i(V));else {if(2!=n)throw new Error("invalid deflate block type");E(...v());}}return q.subarray(0,c);function x(){if(s>=g.length)throw new Error("unexpected end of deflate data");return g[s++]}function u(n){for(;A<n;)B|=x()<<A,A+=8;const o=B&(1<<n)-1;return B>>>=n,A-=n,o}function w(){B=0,A=0;const n=x()|x()<<8;s+=2,G(c+n);for(let o=0;o<n;o++)q[c++]=x();}function E(t,e){let V=z(t);for(;256!=V;){if(V<256)G(c+1),q[c++]=V;else {const t=V-257,i=n[t]+u(o[t]),g=z(e),s=f[g]+u(r[g]);G(c+i);const B=c-s;for(let n=0;n<i;n++)q[c++]=q[B+n];}V=z(t);}}function v(){const n=u(5)+257,o=u(5)+1,f=u(4)+4,r=new Uint8Array(19);for(let n=0;n<f;n++)r[t[n]]=u(3);const e=i(r),V=new Uint8Array(n+o);let g=0;for(;g<V.length;){const n=z(e);if(n<16)V[g++]=n;else if(16==n){const n=V[g-1];let o=u(2)+3;for(;o--;)V[g++]=n;}else g+=17==n?u(3)+3:u(7)+11;}return [i(V.subarray(0,n)),i(V.subarray(n))]}function z(n){const{o:o,symbols:f}=n;let r=0,t=0,e=0;for(let n=1;n<=15;n++){r|=u(1);const V=o[n];if(r-t<V)return f[e+(r-t)];e+=V,t=t+V<<1,r<<=1;}throw new Error("invalid huffman code")}function G(n){if(q.length<n){let o=2*q.length;for(;o<n;)o*=2;const f=new Uint8Array(o);f.set(q.subarray(0,c)),q=f;}}}(function(n){const o=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let r=0;r<o;r+=4){const o=g$1.indexOf(n[r])<<18|g$1.indexOf(n[r+1])<<12|(63&g$1.indexOf(n[r+2]))<<6|63&g$1.indexOf(n[r+3]);f.push(o>>16&255),"="!==n[r+2]&&f.push(o>>8&255),"="!==n[r+3]&&f.push(255&o);}return new Uint8Array(f)}("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")),n=>n({workerURI:n=>{const o="text/javascript";let f=B();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),n){const n=new Blob([f],{type:o});return URL.createObjectURL(n)}return "data:"+o+";base64,"+function(n){let o="";const f=n.length;let r=0;for(;r+2<f;r+=3){const f=n[r]<<16|n[r+1]<<8|n[r+2];o+=g$1[f>>18&63]+g$1[f>>12&63]+g$1[f>>6&63]+g$1[63&f];}const t=f-r;if(1===t){const f=n[r]<<16;o+=g$1[f>>18&63]+g$1[f>>12&63]+"==";}else if(2===t){const f=n[r]<<16|n[r+1]<<8;o+=g$1[f>>18&63]+g$1[f>>12&63]+g$1[f>>6&63]+"=";}return o}(f)}}));var B;
410
412
 
411
413
  /*
412
414
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -2076,6 +2078,10 @@ function getRegisteredCodec(compressionMethod) {
2076
2078
  return registeredCodecs.get(compressionMethod);
2077
2079
  }
2078
2080
 
2081
+ function getRegisteredCodecs() {
2082
+ return Array.from(registeredCodecs.values(), codec => Object.assign({}, codec, codecStreams.get(codec.format)));
2083
+ }
2084
+
2079
2085
  function getCodecStreams(format) {
2080
2086
  return codecStreams.get(format);
2081
2087
  }
@@ -2139,7 +2145,7 @@ class DeflateStream extends TransformStream {
2139
2145
 
2140
2146
  constructor(options, { chunkSize, CompressionStreamFallback, CompressionStream }) {
2141
2147
  super({});
2142
- const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod } = options;
2148
+ const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod, inputSize } = options;
2143
2149
  const stream = this;
2144
2150
  let crc32Stream, encryptionStream, gzipCrc32Stream;
2145
2151
  let readable = super.readable;
@@ -2152,7 +2158,7 @@ class DeflateStream extends TransformStream {
2152
2158
  }
2153
2159
  if (compressed) {
2154
2160
  if (codecStreams) {
2155
- readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize, compressionMethod }));
2161
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize, compressionMethod, uncompressedSize: inputSize }));
2156
2162
  } else if (useGzipCrc32) {
2157
2163
  gzipCrc32Stream = new GzipToRawDeflateStream();
2158
2164
  readable = pipeThroughBackpressured(readable, new CompressionStream(FORMAT_GZIP));
@@ -4725,6 +4731,21 @@ const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced'
4725
4731
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4726
4732
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4727
4733
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4734
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4735
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4736
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4737
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4738
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4739
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4740
+ const WARNING_APPENDED_DATA = "appended data";
4741
+ const WARNING_PREPENDED_DATA = "prepended data";
4742
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4743
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4744
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4745
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4746
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4747
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4748
+ const MAX_KNOWN_VERSION = 63;
4728
4749
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4729
4750
  const CHARSET_UTF8 = "utf-8";
4730
4751
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4775,6 +4796,7 @@ class ZipReader {
4775
4796
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4776
4797
  throw new Error(ERR_BAD_FORMAT);
4777
4798
  }
4799
+ const warnings = zipReader.warnings = [];
4778
4800
  const strictness = getStrictness(options, zipReader.options);
4779
4801
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4780
4802
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4798,8 +4820,12 @@ class ZipReader {
4798
4820
  const commentOffset = endOfDirectoryInfo.offset;
4799
4821
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4800
4822
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4801
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4802
- throwAmbiguousArchive("appended data");
4823
+ const appendedDataLength = reader.size - appendedDataOffset;
4824
+ if (appendedDataLength > maxAppendedDataSize) {
4825
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4826
+ }
4827
+ if (appendedDataLength > 0) {
4828
+ addWarning(warnings, WARNING_APPENDED_DATA);
4803
4829
  }
4804
4830
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4805
4831
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4853,23 +4879,23 @@ class ZipReader {
4853
4879
  }
4854
4880
  if (lastDiskNumber == MAX_16_BITS) {
4855
4881
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4856
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4857
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4882
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4883
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4858
4884
  }
4859
4885
  if (diskNumber == MAX_16_BITS) {
4860
4886
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4861
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4862
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4887
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4888
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4863
4889
  }
4864
4890
  if (filesLength == MAX_16_BITS) {
4865
4891
  filesLength = getBigUint64(endOfDirectoryView, 32);
4866
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4867
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4892
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4893
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4868
4894
  }
4869
4895
  if (directoryDataLength == MAX_32_BITS) {
4870
4896
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4871
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4872
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4897
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4898
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4873
4899
  }
4874
4900
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4875
4901
  }
@@ -4938,14 +4964,22 @@ class ZipReader {
4938
4964
  declaredDirectoryDataLength = directoryArray.length;
4939
4965
  decryptedDirectory = true;
4940
4966
  }
4967
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4968
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4969
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4970
+ }
4941
4971
  startOffset = directoryDataOffset;
4942
4972
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4943
4973
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4944
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4974
+ const filenames = new Set();
4945
4975
  let duplicateFilename;
4976
+ let previousEntryPosition = -1;
4946
4977
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4947
4978
  if (!filesLength && recoverWrappedFilesLength) {
4948
4979
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4980
+ if (filesLength) {
4981
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4982
+ }
4949
4983
  }
4950
4984
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4951
4985
  const fileEntry = new ZipEntry$1(reader, zipReader.options);
@@ -5024,15 +5058,26 @@ class ZipReader {
5024
5058
  filename,
5025
5059
  comment
5026
5060
  });
5027
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5061
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5062
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5063
+ }
5028
5064
  fileEntry.offset += prependedDataLength;
5029
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5030
- if (checkAmbiguity) {
5031
- if (filenames.has(fileEntry.filename)) {
5032
- duplicateFilename = true;
5033
- }
5034
- filenames.add(fileEntry.filename);
5065
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5066
+ startOffset = Math.min(entryPosition, startOffset);
5067
+ if (entryPosition < previousEntryPosition) {
5068
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5035
5069
  }
5070
+ previousEntryPosition = entryPosition;
5071
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5072
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5073
+ }
5074
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5075
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5076
+ }
5077
+ if (filenames.has(fileEntry.filename)) {
5078
+ duplicateFilename = true;
5079
+ }
5080
+ filenames.add(fileEntry.filename);
5036
5081
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5037
5082
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5038
5083
  fileEntry.unixMode = unixExternalUpper;
@@ -5070,7 +5115,11 @@ class ZipReader {
5070
5115
  };
5071
5116
  offset = endOffset;
5072
5117
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5073
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5118
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5119
+ if (wrappedFilesLength) {
5120
+ filesLength += wrappedFilesLength;
5121
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5122
+ }
5074
5123
  }
5075
5124
  const { onprogress } = options;
5076
5125
  if (onprogress) {
@@ -5096,18 +5145,22 @@ class ZipReader {
5096
5145
  zipReader.digitalSignature = digitalSignature;
5097
5146
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5098
5147
  }
5099
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5100
- throwAmbiguousArchive("trailing central directory data");
5148
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5149
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5150
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5101
5151
  }
5102
5152
  if (duplicateFilename) {
5103
- throwAmbiguousArchive("duplicate filename");
5153
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5104
5154
  }
5105
5155
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5106
5156
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5107
5157
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5108
5158
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5109
5159
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5110
- throwAmbiguousArchive("prepended data");
5160
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5161
+ }
5162
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5163
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5111
5164
  }
5112
5165
  if (extractPrependedData) {
5113
5166
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5177,6 +5230,28 @@ class ZipReaderStream {
5177
5230
  }
5178
5231
  }
5179
5232
 
5233
+ async function isZipFile(reader, options = {}) {
5234
+ reader = new GenericReader(reader);
5235
+ await initStream(reader);
5236
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5237
+ reader = new BlobReader(await streamToBlob(reader.readable));
5238
+ await initStream(reader);
5239
+ }
5240
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5241
+ return false;
5242
+ }
5243
+ const strictness = getStrictness(options, {});
5244
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5245
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5246
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5247
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5248
+ return false;
5249
+ }
5250
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5251
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5252
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5253
+ }
5254
+
5180
5255
  let ZipEntry$1 = class ZipEntry {
5181
5256
 
5182
5257
  constructor(reader, options) {
@@ -5208,6 +5283,7 @@ let ZipEntry$1 = class ZipEntry {
5208
5283
  dataDescriptor
5209
5284
  } = bitFlag;
5210
5285
  const localDirectory = fileEntry.localDirectory = {};
5286
+ const warnings = fileEntry.warnings = [];
5211
5287
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5212
5288
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5213
5289
  const dataView = getDataView(dataArray);
@@ -5248,10 +5324,10 @@ let ZipEntry$1 = class ZipEntry {
5248
5324
  if (checkLocalFilename) {
5249
5325
  localDirectory.rawFilename = rawLocalFilename;
5250
5326
  }
5251
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5252
- if (checkLocalDirectory) {
5253
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5327
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5328
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5254
5329
  }
5330
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5255
5331
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5256
5332
  if (lastAccessDate) {
5257
5333
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5477,6 +5553,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5477
5553
  const extraField = directory.extraField = new Map();
5478
5554
  const rawExtraFieldView = getDataView(rawExtraField);
5479
5555
  let offsetExtraField = 0;
5556
+ let malformedExtraField = false;
5480
5557
  try {
5481
5558
  while (offsetExtraField < rawExtraField.length) {
5482
5559
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5488,7 +5565,10 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5488
5565
  offsetExtraField += 4 + size;
5489
5566
  }
5490
5567
  } catch {
5491
- // ignored
5568
+ malformedExtraField = true;
5569
+ }
5570
+ if (offsetExtraField > rawExtraField.length) {
5571
+ malformedExtraField = true;
5492
5572
  }
5493
5573
  const compressionMethod = getUint16$1(dataView, offset + 4);
5494
5574
  Object.assign(directory, {
@@ -5556,6 +5636,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5556
5636
  if (extraFieldUSDZ) {
5557
5637
  directory.extraFieldUSDZ = extraFieldUSDZ;
5558
5638
  }
5639
+ return malformedExtraField;
5559
5640
  }
5560
5641
 
5561
5642
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6017,27 +6098,46 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
6017
6098
  return UNDEFINED_VALUE;
6018
6099
  }
6019
6100
 
6020
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6101
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6021
6102
  const { rawFilename } = zipEntry;
6103
+ const reject = !warnings;
6022
6104
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6023
6105
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6024
6106
  if (checkLocalFilename && !maskedLocalDirectory &&
6025
6107
  (rawLocalFilename.length != rawFilename.length ||
6026
6108
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6027
- throwAmbiguousArchive("mismatched local file header (filename)");
6109
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6028
6110
  }
6029
6111
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6030
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6112
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6031
6113
  }
6032
6114
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6033
- throwAmbiguousArchive("mismatched local file header (compression method)");
6115
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6034
6116
  }
6035
6117
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6036
6118
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6037
6119
  (localDirectory.crc32 != zipEntry.crc32 ||
6038
6120
  localDirectory.compressedSize != zipEntry.compressedSize ||
6039
6121
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6040
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6122
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6123
+ }
6124
+ }
6125
+
6126
+ function reportAmbiguity(reject, warnings, reason) {
6127
+ if (reject) {
6128
+ throwAmbiguousArchive(reason);
6129
+ } else {
6130
+ addWarning(warnings, reason);
6131
+ }
6132
+ }
6133
+
6134
+ function addWarning(warnings, reason, filename) {
6135
+ if (!warnings.some(warning => warning.reason == reason)) {
6136
+ const warning = { reason };
6137
+ if (filename !== UNDEFINED_VALUE) {
6138
+ warning.filename = filename;
6139
+ }
6140
+ warnings.push(warning);
6041
6141
  }
6042
6142
  }
6043
6143
 
@@ -6114,8 +6214,23 @@ var zipReader = /*#__PURE__*/Object.freeze({
6114
6214
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6115
6215
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6116
6216
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6217
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6218
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6219
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6220
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6221
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6222
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6223
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6224
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6225
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6226
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6227
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6228
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6229
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6230
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6117
6231
  ZipReader: ZipReader,
6118
- ZipReaderStream: ZipReaderStream
6232
+ ZipReaderStream: ZipReaderStream,
6233
+ isZipFile: isZipFile
6119
6234
  });
6120
6235
 
6121
6236
  /*
@@ -6328,6 +6443,7 @@ class ZipWriter {
6328
6443
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6329
6444
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6330
6445
  rawExtraField,
6446
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6331
6447
  extendedTimestamp: false,
6332
6448
  headerArray,
6333
6449
  headerView
@@ -6501,7 +6617,6 @@ async function prependZipEntries(zipWriter, reader) {
6501
6617
 
6502
6618
  async function addFileEntry(zipWriter, name, reader, options) {
6503
6619
  options = Object.assign({}, options);
6504
- name = name.trim();
6505
6620
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6506
6621
  name += DIRECTORY_SIGNATURE;
6507
6622
  }
@@ -6592,7 +6707,6 @@ async function addFile(zipWriter, name, reader, options) {
6592
6707
  }
6593
6708
 
6594
6709
  function resolveAttributes(zipWriter, name, options) {
6595
- name = name.trim();
6596
6710
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6597
6711
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6598
6712
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6797,6 +6911,7 @@ function resolveMetadata(zipWriter, name, options) {
6797
6911
  }
6798
6912
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6799
6913
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6914
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6800
6915
  return {
6801
6916
  comment,
6802
6917
  resolvedOptions: {
@@ -6832,7 +6947,8 @@ function resolveMetadata(zipWriter, name, options) {
6832
6947
  dataDescriptor,
6833
6948
  zip64,
6834
6949
  rawExtraField,
6835
- rawLocalExtraField
6950
+ rawLocalExtraField,
6951
+ rawCentralExtraField
6836
6952
  }
6837
6953
  };
6838
6954
  }
@@ -6974,7 +7090,6 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6974
7090
  let { name } = entry;
6975
7091
  const { size } = entry;
6976
7092
  const options = Object.assign({}, entry.options);
6977
- name = name.trim();
6978
7093
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6979
7094
  name += DIRECTORY_SIGNATURE;
6980
7095
  }
@@ -7230,6 +7345,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7230
7345
  versionMadeBy,
7231
7346
  rawComment,
7232
7347
  rawExtraField,
7348
+ rawCentralExtraField,
7233
7349
  useWebWorkers,
7234
7350
  transferStreams,
7235
7351
  onstart,
@@ -7273,6 +7389,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7273
7389
  rawExtraFieldUnix,
7274
7390
  rawExtraFieldAES,
7275
7391
  rawExtraField,
7392
+ rawCentralExtraField,
7276
7393
  extendedTimestamp,
7277
7394
  msDosCompatible,
7278
7395
  internalFileAttributes,
@@ -7304,6 +7421,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7304
7421
  const workerOptions = {
7305
7422
  options: {
7306
7423
  codecType: CODEC_DEFLATE,
7424
+ inputSize: size,
7307
7425
  level,
7308
7426
  rawPassword,
7309
7427
  password,
@@ -7773,6 +7891,7 @@ function createDirectoryRecords(files) {
7773
7891
  rawExtraFieldNTFS,
7774
7892
  rawExtraFieldUnix,
7775
7893
  rawExtraField,
7894
+ rawCentralExtraField,
7776
7895
  extendedTimestamp,
7777
7896
  extraFieldExtendedTimestampFlag,
7778
7897
  lastModDate,
@@ -7827,7 +7946,8 @@ function createDirectoryRecords(files) {
7827
7946
  rawExtraFieldNTFS,
7828
7947
  rawExtraFieldUnix,
7829
7948
  rawExtraFieldTimestamp,
7830
- rawExtraField);
7949
+ rawExtraField,
7950
+ rawCentralExtraField);
7831
7951
  if (extraFieldLength > MAX_16_BITS) {
7832
7952
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7833
7953
  }
@@ -7855,6 +7975,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7855
7975
  rawExtraFieldNTFS,
7856
7976
  rawExtraFieldUnix,
7857
7977
  rawExtraField,
7978
+ rawCentralExtraField,
7858
7979
  rawComment,
7859
7980
  versionMadeBy,
7860
7981
  headerArray,
@@ -7869,7 +7990,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7869
7990
  uncompressedSize,
7870
7991
  compressedSize
7871
7992
  } = fileEntry;
7872
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7993
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7873
7994
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7874
7995
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7875
7996
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7907,6 +8028,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7907
8028
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7908
8029
  directoryRecord.writeBytes(rawExtraFieldUnix);
7909
8030
  directoryRecord.writeBytes(rawExtraField);
8031
+ directoryRecord.writeBytes(rawCentralExtraField);
7910
8032
  directoryRecord.writeBytes(rawComment);
7911
8033
  arraySet(directoryArray, directoryRecord.array, offset);
7912
8034
  offset += directoryRecordLength;
@@ -8410,6 +8532,111 @@ function getMimeType$1() {
8410
8532
  */
8411
8533
 
8412
8534
 
8535
+ function getSupportedCompressionMethods() {
8536
+ const { CompressionStream, DecompressionStream, CompressionStreamFallback, DecompressionStreamFallback } = getConfiguration();
8537
+ const supportedMethods = [{
8538
+ compressionMethod: COMPRESSION_METHOD_STORE,
8539
+ compression: true,
8540
+ decompression: true,
8541
+ registered: false
8542
+ }, {
8543
+ compressionMethod: COMPRESSION_METHOD_DEFLATE,
8544
+ compression: formatSupported(CompressionStreamFallback, FORMAT_DEFLATE_RAW) ||
8545
+ formatSupported(CompressionStream, FORMAT_DEFLATE_RAW) || formatSupported(CompressionStream, FORMAT_GZIP),
8546
+ decompression: formatSupported(DecompressionStreamFallback, FORMAT_DEFLATE_RAW) ||
8547
+ formatSupported(DecompressionStream, FORMAT_DEFLATE_RAW) || formatSupported(DecompressionStream, FORMAT_GZIP),
8548
+ registered: false
8549
+ }, {
8550
+ compressionMethod: COMPRESSION_METHOD_DEFLATE_64,
8551
+ compression: false,
8552
+ decompression: formatSupported(DecompressionStreamFallback, FORMAT_DEFLATE64_RAW) ||
8553
+ formatSupported(DecompressionStream, FORMAT_DEFLATE64_RAW),
8554
+ registered: false
8555
+ }];
8556
+ for (const codec of getRegisteredCodecs()) {
8557
+ const codecStreams = getCodecStreams(codec.format);
8558
+ supportedMethods.push({
8559
+ compressionMethod: codec.compressionMethod,
8560
+ // deno-lint-ignore valid-typeof
8561
+ compression: codecStreams ? typeof codecStreams.CompressionStream == FUNCTION_TYPE : UNDEFINED_VALUE,
8562
+ // deno-lint-ignore valid-typeof
8563
+ decompression: codecStreams ? typeof codecStreams.DecompressionStream == FUNCTION_TYPE : UNDEFINED_VALUE,
8564
+ registered: true
8565
+ });
8566
+ }
8567
+ return supportedMethods;
8568
+ }
8569
+
8570
+ function formatSupported(StreamClass, format) {
8571
+ if (!StreamClass) {
8572
+ return false;
8573
+ }
8574
+ const { supportedFormats } = StreamClass;
8575
+ if (supportedFormats) {
8576
+ return supportedFormats.includes(format);
8577
+ }
8578
+ return supportsFormat(StreamClass, format);
8579
+ }
8580
+
8581
+ /*
8582
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
8583
+
8584
+ Redistribution and use in source and binary forms, with or without
8585
+ modification, are permitted provided that the following conditions are met:
8586
+
8587
+ 1. Redistributions of source code must retain the above copyright notice,
8588
+ this list of conditions and the following disclaimer.
8589
+
8590
+ 2. Redistributions in binary form must reproduce the above copyright
8591
+ notice, this list of conditions and the following disclaimer in
8592
+ the documentation and/or other materials provided with the distribution.
8593
+
8594
+ 3. The names of the authors may not be used to endorse or promote products
8595
+ derived from this software without specific prior written permission.
8596
+
8597
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
8598
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
8599
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
8600
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
8601
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8602
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
8603
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
8604
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
8605
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
8606
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8607
+ */
8608
+
8609
+ const VERSION = "2.8.60";
8610
+
8611
+ /*
8612
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
8613
+
8614
+ Redistribution and use in source and binary forms, with or without
8615
+ modification, are permitted provided that the following conditions are met:
8616
+
8617
+ 1. Redistributions of source code must retain the above copyright notice,
8618
+ this list of conditions and the following disclaimer.
8619
+
8620
+ 2. Redistributions in binary form must reproduce the above copyright
8621
+ notice, this list of conditions and the following disclaimer in
8622
+ the documentation and/or other materials provided with the distribution.
8623
+
8624
+ 3. The names of the authors may not be used to endorse or promote products
8625
+ derived from this software without specific prior written permission.
8626
+
8627
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
8628
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
8629
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
8630
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
8631
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8632
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
8633
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
8634
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
8635
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
8636
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8637
+ */
8638
+
8639
+
8413
8640
  const DEFAULT_THRESHOLD$2 = 1024 * 1024;
8414
8641
  const DEFAULT_DIRECTORY_NAME$1 = ".zip.js-temp";
8415
8642
 
@@ -10276,7 +10503,7 @@ function decodeMimeTypes(data) {
10276
10503
  */
10277
10504
 
10278
10505
 
10279
- c(setDefaultConfiguration);
10506
+ s(setDefaultConfiguration);
10280
10507
 
10281
10508
  exports.BlobReader = BlobReader;
10282
10509
  exports.BlobWriter = BlobWriter;
@@ -10366,6 +10593,21 @@ exports.TextReader = TextReader;
10366
10593
  exports.TextWriter = TextWriter;
10367
10594
  exports.Uint8ArrayReader = Uint8ArrayReader;
10368
10595
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10596
+ exports.VERSION = VERSION;
10597
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
10598
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
10599
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10600
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10601
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10602
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10603
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10604
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10605
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10606
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10607
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
10608
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
10609
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
10610
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
10369
10611
  exports.Writer = Writer;
10370
10612
  exports.ZipDirectoryEntry = ZipDirectoryEntry;
10371
10613
  exports.ZipEntry = ZipEntry;
@@ -10381,6 +10623,9 @@ exports.createOPFSTempStream = createOPFSTempStream;
10381
10623
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
10382
10624
  exports.fs = fs;
10383
10625
  exports.getMimeType = getMimeType;
10626
+ exports.getRegisteredCodecs = getRegisteredCodecs;
10627
+ exports.getSupportedCompressionMethods = getSupportedCompressionMethods;
10628
+ exports.isZipFile = isZipFile;
10384
10629
  exports.registerCodec = registerCodec;
10385
10630
  exports.resetConfiguration = resetConfiguration;
10386
10631
  exports.terminateWorkers = terminateWorkers;