tasmota-webserial-esptool 6.4.1 → 6.5.1

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.
@@ -1 +1 @@
1
- const t=t=>{let e=[];for(let a=0;a<t.length;a++){let s=t.charCodeAt(a);s<=255&&e.push(s)}return e},e=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{let a=t.toString(16).toUpperCase();return a.startsWith("-")?"-0x"+a.substring(1).padStart(e,"0"):"0x"+a.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),i={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB"},r=115200,n=t(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),h=33382,l=50,o=12882,_=12883,d=12994,f=12995,u=12997,c=12998,g=207969,m=12914,w=12928,p={4293968129:{name:"ESP8266",family:h},15736195:{name:"ESP32",family:l},1990:{name:"ESP32-S2",family:o},9:{name:"ESP32-S3",family:_},203546735:{name:"ESP32-C2",family:d},1867591791:{name:"ESP32-C2",family:d},2084675695:{name:"ESP32-C2",family:d},456216687:{name:"ESP32-C3",family:f},1130455151:{name:"ESP32-C3",family:f},1216438383:{name:"ESP32-C3",family:f},1763790959:{name:"ESP32-C3",family:f},285294703:{name:"ESP32-C5",family:u},1607549039:{name:"ESP32-C5",family:u},1548751960:{name:"ESP32-C5",family:u},1675706479:{name:"ESP32-C5",family:u},752910447:{name:"ESP32-C6",family:c},606167151:{name:"ESP32-C61",family:g},871374959:{name:"ESP32-C61",family:g},1333878895:{name:"ESP32-C61",family:g},1913741423:{name:"ESP32-C61",family:g},2548236392:{name:"ESP32-H2",family:m},3619110528:{name:"ESP32-H2",family:m},0:{name:"ESP32-P4",family:w},117676761:{name:"ESP32-P4",family:w},182303440:{name:"ESP32-P4",family:w}},y=3e3,b=6e5,v=(t,e)=>{let a=Math.floor(t*(e/486));return a<y?y:a},k=t=>{switch(t){case l:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case o:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case h:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case d:case f:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case u:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case c:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case g:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1610719232,macFuse:1610719300,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case w:return{regBase:1342754816,baseFuse:1343410176,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class z extends Error{constructor(t){super(t),this.name="SlipReadError"}}const S=async e=>{let a;return e==l?a=await import("./esp32-BNIFdu1P.js"):e==o?a=await import("./esp32s2-Bk4mqADi.js"):e==_?a=await import("./esp32s3-Df3OUCOC.js"):e==h?a=await import("./esp8266-CQFcqJ_a.js"):e==d?a=await import("./esp32c2-BqxquOKw.js"):e==f?a=await import("./esp32c3-BOOqe8me.js"):e==u?a=await import("./esp32c5-C8uE-s4t.js"):e==c?a=await import("./esp32c6-Cg5qYgg7.js"):e==g?a=await import("./esp32c61-CzCdsydk.js"):e==m?a=await import("./esp32h2-DZa_lpff.js"):e==w&&(a=await import("./esp32p4-DyGqUAeZ.js")),{...a,text:t(atob(a.text)),data:t(atob(a.data))}};function F(t){let e=t.length;for(;--e>=0;)t[e]=0}const U=256,D=286,O=30,x=15,R=new Uint8Array([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=new Uint8Array([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]),I=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),A=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),B=new Array(576);F(B);const T=new Array(60);F(T);const C=new Array(512);F(C);const P=new Array(256);F(P);const L=new Array(29);F(L);const Z=new Array(O);function M(t,e,a,s,i){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=s,this.max_length=i,this.has_stree=t&&t.length}let N,$,H;function j(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}F(Z);const V=t=>t<256?C[t]:C[256+(t>>>7)],W=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},K=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<<t.bi_valid&65535,W(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=a)},Y=(t,e,a)=>{K(t,a[2*e],a[2*e+1])},q=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},G=(t,e,a)=>{const s=new Array(16);let i,r,n=0;for(i=1;i<=x;i++)n=n+a[i-1]<<1,s[i]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=q(s[e]++,e))}},X=t=>{let e;for(e=0;e<D;e++)t.dyn_ltree[2*e]=0;for(e=0;e<O;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Q=t=>{t.bi_valid>8?W(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},J=(t,e,a,s)=>{const i=2*e,r=2*a;return t[i]<t[r]||t[i]===t[r]&&s[e]<=s[a]},tt=(t,e,a)=>{const s=t.heap[a];let i=a<<1;for(;i<=t.heap_len&&(i<t.heap_len&&J(e,t.heap[i+1],t.heap[i],t.depth)&&i++,!J(e,s,t.heap[i],t.depth));)t.heap[a]=t.heap[i],a=i,i<<=1;t.heap[a]=s},et=(t,e,a)=>{let s,i,r,n,h=0;if(0!==t.sym_next)do{s=255&t.pending_buf[t.sym_buf+h++],s+=(255&t.pending_buf[t.sym_buf+h++])<<8,i=t.pending_buf[t.sym_buf+h++],0===s?Y(t,i,e):(r=P[i],Y(t,r+U+1,e),n=R[r],0!==n&&(i-=L[r],K(t,i,n)),s--,r=V(s),Y(t,r,a),n=E[r],0!==n&&(s-=Z[r],K(t,s,n)))}while(h<t.sym_next);Y(t,256,e)},at=(t,e)=>{const a=e.dyn_tree,s=e.stat_desc.static_tree,i=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,l,o=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==a[2*n]?(t.heap[++t.heap_len]=o=n,t.depth[n]=0):a[2*n+1]=0;for(;t.heap_len<2;)l=t.heap[++t.heap_len]=o<2?++o:0,a[2*l]=1,t.depth[l]=0,t.opt_len--,i&&(t.static_len-=s[2*l+1]);for(e.max_code=o,n=t.heap_len>>1;n>=1;n--)tt(t,a,n);l=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],tt(t,a,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,a[2*l]=a[2*n]+a[2*h],t.depth[l]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,a[2*n+1]=a[2*h+1]=l,t.heap[1]=l++,tt(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,s=e.max_code,i=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,l=e.stat_desc.max_length;let o,_,d,f,u,c,g=0;for(f=0;f<=x;f++)t.bl_count[f]=0;for(a[2*t.heap[t.heap_max]+1]=0,o=t.heap_max+1;o<573;o++)_=t.heap[o],f=a[2*a[2*_+1]+1]+1,f>l&&(f=l,g++),a[2*_+1]=f,_>s||(t.bl_count[f]++,u=0,_>=h&&(u=n[_-h]),c=a[2*_],t.opt_len+=c*(f+u),r&&(t.static_len+=c*(i[2*_+1]+u)));if(0!==g){do{for(f=l-1;0===t.bl_count[f];)f--;t.bl_count[f]--,t.bl_count[f+1]+=2,t.bl_count[l]--,g-=2}while(g>0);for(f=l;0!==f;f--)for(_=t.bl_count[f];0!==_;)d=t.heap[--o],d>s||(a[2*d+1]!==f&&(t.opt_len+=(f-a[2*d+1])*a[2*d],a[2*d+1]=f),_--)}})(t,e),G(a,o,t.bl_count)},st=(t,e,a)=>{let s,i,r=-1,n=e[1],h=0,l=7,o=4;for(0===n&&(l=138,o=3),e[2*(a+1)+1]=65535,s=0;s<=a;s++)i=n,n=e[2*(s+1)+1],++h<l&&i===n||(h<o?t.bl_tree[2*i]+=h:0!==i?(i!==r&&t.bl_tree[2*i]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=i,0===n?(l=138,o=3):i===n?(l=6,o=3):(l=7,o=4))},it=(t,e,a)=>{let s,i,r=-1,n=e[1],h=0,l=7,o=4;for(0===n&&(l=138,o=3),s=0;s<=a;s++)if(i=n,n=e[2*(s+1)+1],!(++h<l&&i===n)){if(h<o)do{Y(t,i,t.bl_tree)}while(0!==--h);else 0!==i?(i!==r&&(Y(t,i,t.bl_tree),h--),Y(t,16,t.bl_tree),K(t,h-3,2)):h<=10?(Y(t,17,t.bl_tree),K(t,h-3,3)):(Y(t,18,t.bl_tree),K(t,h-11,7));h=0,r=i,0===n?(l=138,o=3):i===n?(l=6,o=3):(l=7,o=4)}};let rt=!1;const nt=(t,e,a,s)=>{K(t,0+(s?1:0),3),Q(t),W(t,a),W(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var ht=(t,e,a,s)=>{let i,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<U;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),at(t,t.l_desc),at(t,t.d_desc),n=(t=>{let e;for(st(t,t.dyn_ltree,t.l_desc.max_code),st(t,t.dyn_dtree,t.d_desc.max_code),at(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*A[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),i=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=i&&(i=r)):i=r=a+5,a+4<=i&&-1!==e?nt(t,e,a,s):4===t.strategy||r===i?(K(t,2+(s?1:0),3),et(t,B,T)):(K(t,4+(s?1:0),3),((t,e,a,s)=>{let i;for(K(t,e-257,5),K(t,a-1,5),K(t,s-4,4),i=0;i<s;i++)K(t,t.bl_tree[2*A[i]+1],3);it(t,t.dyn_ltree,e-1),it(t,t.dyn_dtree,a-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),et(t,t.dyn_ltree,t.dyn_dtree)),X(t),s&&Q(t)},lt={_tr_init:t=>{rt||((()=>{let t,e,a,s,i;const r=new Array(16);for(a=0,s=0;s<28;s++)for(L[s]=a,t=0;t<1<<R[s];t++)P[a++]=s;for(P[a-1]=s,i=0,s=0;s<16;s++)for(Z[s]=i,t=0;t<1<<E[s];t++)C[i++]=s;for(i>>=7;s<O;s++)for(Z[s]=i<<7,t=0;t<1<<E[s]-7;t++)C[256+i++]=s;for(e=0;e<=x;e++)r[e]=0;for(t=0;t<=143;)B[2*t+1]=8,t++,r[8]++;for(;t<=255;)B[2*t+1]=9,t++,r[9]++;for(;t<=279;)B[2*t+1]=7,t++,r[7]++;for(;t<=287;)B[2*t+1]=8,t++,r[8]++;for(G(B,287,r),t=0;t<O;t++)T[2*t+1]=5,T[2*t]=q(t,5);N=new M(B,R,257,D,x),$=new M(T,E,0,O,x),H=new M(new Array(0),I,0,19,7)})(),rt=!0),t.l_desc=new j(t.dyn_ltree,N),t.d_desc=new j(t.dyn_dtree,$),t.bl_desc=new j(t.bl_tree,H),t.bi_buf=0,t.bi_valid=0,X(t)},_tr_stored_block:nt,_tr_flush_block:ht,_tr_tally:(t,e,a)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=a,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(P[a]+U+1)]++,t.dyn_dtree[2*V(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{K(t,2,3),Y(t,256,B),(t=>{16===t.bi_valid?(W(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var ot=(t,e,a,s)=>{let i=65535&t,r=t>>>16&65535,n=0;for(;0!==a;){n=a>2e3?2e3:a,a-=n;do{i=i+e[s++]|0,r=r+i|0}while(--n);i%=65521,r%=65521}return i|r<<16};const _t=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var dt=(t,e,a,s)=>{const i=_t,r=s+a;t^=-1;for(let a=s;a<r;a++)t=t>>>8^i[255&(t^e[a])];return-1^t},ft={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},ut={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:ct,_tr_stored_block:gt,_tr_flush_block:mt,_tr_tally:wt,_tr_align:pt}=lt,{Z_NO_FLUSH:yt,Z_PARTIAL_FLUSH:bt,Z_FULL_FLUSH:vt,Z_FINISH:kt,Z_BLOCK:zt,Z_OK:St,Z_STREAM_END:Ft,Z_STREAM_ERROR:Ut,Z_DATA_ERROR:Dt,Z_BUF_ERROR:Ot,Z_DEFAULT_COMPRESSION:xt,Z_FILTERED:Rt,Z_HUFFMAN_ONLY:Et,Z_RLE:It,Z_FIXED:At,Z_DEFAULT_STRATEGY:Bt,Z_UNKNOWN:Tt,Z_DEFLATED:Ct}=ut,Pt=258,Lt=262,Zt=42,Mt=113,Nt=666,$t=(t,e)=>(t.msg=ft[e],e),Ht=t=>2*t-(t>4?9:0),jt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Vt=t=>{let e,a,s,i=t.w_size;e=t.hash_size,s=e;do{a=t.head[--s],t.head[s]=a>=i?a-i:0}while(--e);e=i,s=e;do{a=t.prev[--s],t.prev[s]=a>=i?a-i:0}while(--e)};let Wt=(t,e,a)=>(e<<t.hash_shift^a)&t.hash_mask;const Kt=t=>{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},Yt=(t,e)=>{mt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Kt(t.strm)},qt=(t,e)=>{t.pending_buf[t.pending++]=e},Gt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Xt=(t,e,a,s)=>{let i=t.avail_in;return i>s&&(i=s),0===i?0:(t.avail_in-=i,e.set(t.input.subarray(t.next_in,t.next_in+i),a),1===t.state.wrap?t.adler=ot(t.adler,e,i,a):2===t.state.wrap&&(t.adler=dt(t.adler,e,i,a)),t.next_in+=i,t.total_in+=i,i)},Qt=(t,e)=>{let a,s,i=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const l=t.strstart>t.w_size-Lt?t.strstart-(t.w_size-Lt):0,o=t.window,_=t.w_mask,d=t.prev,f=t.strstart+Pt;let u=o[r+n-1],c=o[r+n];t.prev_length>=t.good_match&&(i>>=2),h>t.lookahead&&(h=t.lookahead);do{if(a=e,o[a+n]===c&&o[a+n-1]===u&&o[a]===o[r]&&o[++a]===o[r+1]){r+=2,a++;do{}while(o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&r<f);if(s=Pt-(f-r),r=f-Pt,s>n){if(t.match_start=e,n=s,s>=h)break;u=o[r+n-1],c=o[r+n]}}}while((e=d[e&_])>l&&0!==--i);return n<=t.lookahead?n:t.lookahead},Jt=t=>{const e=t.w_size;let a,s,i;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Lt)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Vt(t),s+=e),0===t.strm.avail_in)break;if(a=Xt(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=a,t.lookahead+t.insert>=3)for(i=t.strstart-t.insert,t.ins_h=t.window[i],t.ins_h=Wt(t,t.ins_h,t.window[i+1]);t.insert&&(t.ins_h=Wt(t,t.ins_h,t.window[i+3-1]),t.prev[i&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=i,i++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<Lt&&0!==t.strm.avail_in)},te=(t,e)=>{let a,s,i,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(a=65535,i=t.bi_valid+42>>3,t.strm.avail_out<i)break;if(i=t.strm.avail_out-i,s=t.strstart-t.block_start,a>s+t.strm.avail_in&&(a=s+t.strm.avail_in),a>i&&(a=i),a<r&&(0===a&&e!==kt||e===yt||a!==s+t.strm.avail_in))break;n=e===kt&&a===s+t.strm.avail_in?1:0,gt(t,0,0,n),t.pending_buf[t.pending-4]=a,t.pending_buf[t.pending-3]=a>>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,Kt(t.strm),s&&(s>a&&(s=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,a-=s),a&&(Xt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==yt&&e!==kt&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(i=t.window_size-t.strstart,t.strm.avail_in>i&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,i+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),i>t.strm.avail_in&&(i=t.strm.avail_in),i&&(Xt(t.strm,t.window,t.strstart,i),t.strstart+=i,t.insert+=i>t.w_size-t.insert?t.w_size-t.insert:i),t.high_water<t.strstart&&(t.high_water=t.strstart),i=t.bi_valid+42>>3,i=t.pending_buf_size-i>65535?65535:t.pending_buf_size-i,r=i>t.w_size?t.w_size:i,s=t.strstart-t.block_start,(s>=r||(s||e===kt)&&e!==yt&&0===t.strm.avail_in&&s<=i)&&(a=s>i?i:s,n=e===kt&&0===t.strm.avail_in&&a===s?1:0,gt(t,t.block_start,a,n),t.block_start+=a,Kt(t.strm)),n?3:1)},ee=(t,e)=>{let a,s;for(;;){if(t.lookahead<Lt){if(Jt(t),t.lookahead<Lt&&e===yt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=Wt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-Lt&&(t.match_length=Qt(t,a)),t.match_length>=3)if(s=wt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=Wt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=Wt(t,t.ins_h,t.window[t.strstart+1]);else s=wt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(Yt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===kt?(Yt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Yt(t,!1),0===t.strm.avail_out)?1:2},ae=(t,e)=>{let a,s,i;for(;;){if(t.lookahead<Lt){if(Jt(t),t.lookahead<Lt&&e===yt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=Wt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length<t.max_lazy_match&&t.strstart-a<=t.w_size-Lt&&(t.match_length=Qt(t,a),t.match_length<=5&&(t.strategy===Rt||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,s=wt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=Wt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(Yt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=wt(t,0,t.window[t.strstart-1]),s&&Yt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=wt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===kt?(Yt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Yt(t,!1),0===t.strm.avail_out)?1:2};function se(t,e,a,s,i){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=s,this.func=i}const ie=[new se(0,0,0,0,te),new se(4,4,8,4,ee),new se(4,5,16,8,ee),new se(4,6,32,32,ee),new se(4,4,16,16,ae),new se(8,16,32,32,ae),new se(8,16,128,128,ae),new se(8,32,128,256,ae),new se(32,128,258,1024,ae),new se(32,258,258,4096,ae)];function re(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Ct,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),jt(this.dyn_ltree),jt(this.dyn_dtree),jt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),jt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),jt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const ne=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==Zt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Mt&&e.status!==Nt?1:0},he=t=>{if(ne(t))return $t(t,Ut);t.total_in=t.total_out=0,t.data_type=Tt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?Zt:Mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,ct(e),St},le=t=>{const e=he(t);var a;return e===St&&((a=t.state).window_size=2*a.w_size,jt(a.head),a.max_lazy_match=ie[a.level].max_lazy,a.good_match=ie[a.level].good_length,a.nice_match=ie[a.level].nice_length,a.max_chain_length=ie[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},oe=(t,e,a,s,i,r)=>{if(!t)return Ut;let n=1;if(e===xt&&(e=6),s<0?(n=0,s=-s):s>15&&(n=2,s-=16),i<1||i>9||a!==Ct||s<8||s>15||e<0||e>9||r<0||r>At||8===s&&1!==n)return $t(t,Ut);8===s&&(s=9);const h=new re;return t.state=h,h.strm=t,h.status=Zt,h.wrap=n,h.gzhead=null,h.w_bits=s,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=i+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<i+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=a,le(t)};var _e={deflateInit:(t,e)=>oe(t,e,Ct,15,8,Bt),deflateInit2:oe,deflateReset:le,deflateResetKeep:he,deflateSetHeader:(t,e)=>ne(t)||2!==t.state.wrap?Ut:(t.state.gzhead=e,St),deflate:(t,e)=>{if(ne(t)||e>zt||e<0)return t?$t(t,Ut):Ut;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===Nt&&e!==kt)return $t(t,0===t.avail_out?Ot:Ut);const s=a.last_flush;if(a.last_flush=e,0!==a.pending){if(Kt(t),0===t.avail_out)return a.last_flush=-1,St}else if(0===t.avail_in&&Ht(e)<=Ht(s)&&e!==kt)return $t(t,Ot);if(a.status===Nt&&0!==t.avail_in)return $t(t,Ot);if(a.status===Zt&&0===a.wrap&&(a.status=Mt),a.status===Zt){let e=Ct+(a.w_bits-8<<4)<<8,s=-1;if(s=a.strategy>=Et||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=s<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Gt(a,e),0!==a.strstart&&(Gt(a,t.adler>>>16),Gt(a,65535&t.adler)),t.adler=1,a.status=Mt,Kt(t),0!==a.pending)return a.last_flush=-1,St}if(57===a.status)if(t.adler=0,qt(a,31),qt(a,139),qt(a,8),a.gzhead)qt(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),qt(a,255&a.gzhead.time),qt(a,a.gzhead.time>>8&255),qt(a,a.gzhead.time>>16&255),qt(a,a.gzhead.time>>24&255),qt(a,9===a.level?2:a.strategy>=Et||a.level<2?4:0),qt(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(qt(a,255&a.gzhead.extra.length),qt(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=dt(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(qt(a,0),qt(a,0),qt(a,0),qt(a,0),qt(a,0),qt(a,9===a.level?2:a.strategy>=Et||a.level<2?4:0),qt(a,3),a.status=Mt,Kt(t),0!==a.pending)return a.last_flush=-1,St;if(69===a.status){if(a.gzhead.extra){let e=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+s>a.pending_buf_size;){let i=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=dt(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=i,Kt(t),0!==a.pending)return a.last_flush=-1,St;e=0,s-=i}let i=new Uint8Array(a.gzhead.extra);a.pending_buf.set(i.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>e&&(t.adler=dt(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=dt(t.adler,a.pending_buf,a.pending-s,s)),Kt(t),0!==a.pending)return a.last_flush=-1,St;s=0}e=a.gzindex<a.gzhead.name.length?255&a.gzhead.name.charCodeAt(a.gzindex++):0,qt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=dt(t.adler,a.pending_buf,a.pending-s,s)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=dt(t.adler,a.pending_buf,a.pending-s,s)),Kt(t),0!==a.pending)return a.last_flush=-1,St;s=0}e=a.gzindex<a.gzhead.comment.length?255&a.gzhead.comment.charCodeAt(a.gzindex++):0,qt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=dt(t.adler,a.pending_buf,a.pending-s,s))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(Kt(t),0!==a.pending))return a.last_flush=-1,St;qt(a,255&t.adler),qt(a,t.adler>>8&255),t.adler=0}if(a.status=Mt,Kt(t),0!==a.pending)return a.last_flush=-1,St}if(0!==t.avail_in||0!==a.lookahead||e!==yt&&a.status!==Nt){let s=0===a.level?te(a,e):a.strategy===Et?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Jt(t),0===t.lookahead)){if(e===yt)return 1;break}if(t.match_length=0,a=wt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(Yt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===kt?(Yt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Yt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===It?((t,e)=>{let a,s,i,r;const n=t.window;for(;;){if(t.lookahead<=Pt){if(Jt(t),t.lookahead<=Pt&&e===yt)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(i=t.strstart-1,s=n[i],s===n[++i]&&s===n[++i]&&s===n[++i])){r=t.strstart+Pt;do{}while(s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&i<r);t.match_length=Pt-(r-i),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=wt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=wt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(Yt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===kt?(Yt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Yt(t,!1),0===t.strm.avail_out)?1:2})(a,e):ie[a.level].func(a,e);if(3!==s&&4!==s||(a.status=Nt),1===s||3===s)return 0===t.avail_out&&(a.last_flush=-1),St;if(2===s&&(e===bt?pt(a):e!==zt&&(gt(a,0,0,!1),e===vt&&(jt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),Kt(t),0===t.avail_out))return a.last_flush=-1,St}return e!==kt?St:a.wrap<=0?Ft:(2===a.wrap?(qt(a,255&t.adler),qt(a,t.adler>>8&255),qt(a,t.adler>>16&255),qt(a,t.adler>>24&255),qt(a,255&t.total_in),qt(a,t.total_in>>8&255),qt(a,t.total_in>>16&255),qt(a,t.total_in>>24&255)):(Gt(a,t.adler>>>16),Gt(a,65535&t.adler)),Kt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?St:Ft)},deflateEnd:t=>{if(ne(t))return Ut;const e=t.state.status;return t.state=null,e===Mt?$t(t,Dt):St},deflateSetDictionary:(t,e)=>{let a=e.length;if(ne(t))return Ut;const s=t.state,i=s.wrap;if(2===i||1===i&&s.status!==Zt||s.lookahead)return Ut;if(1===i&&(t.adler=ot(t.adler,e,a,0)),s.wrap=0,a>=s.w_size){0===i&&(jt(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(a-s.w_size,a),0),e=t,a=s.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Jt(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{s.ins_h=Wt(s,s.ins_h,s.window[t+3-1]),s.prev[t&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=t,t++}while(--e);s.strstart=t,s.lookahead=2,Jt(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,s.wrap=i,St},deflateInfo:"pako deflate (from Nodeca project)"};const de=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var fe=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)de(a,e)&&(t[e]=a[e])}}return t},ue=t=>{let e=0;for(let a=0,s=t.length;a<s;a++)e+=t[a].length;const a=new Uint8Array(e);for(let e=0,s=0,i=t.length;e<i;e++){let i=t[e];a.set(i,s),s+=i.length}return a};let ce=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){ce=!1}const ge=new Uint8Array(256);for(let t=0;t<256;t++)ge[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;ge[254]=ge[254]=1;var me=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,s,i,r,n=t.length,h=0;for(i=0;i<n;i++)a=t.charCodeAt(i),55296==(64512&a)&&i+1<n&&(s=t.charCodeAt(i+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),i++)),h+=a<128?1:a<2048?2:a<65536?3:4;for(e=new Uint8Array(h),r=0,i=0;r<h;i++)a=t.charCodeAt(i),55296==(64512&a)&&i+1<n&&(s=t.charCodeAt(i+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),i++)),a<128?e[r++]=a:a<2048?(e[r++]=192|a>>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e};var we=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const pe=Object.prototype.toString,{Z_NO_FLUSH:ye,Z_SYNC_FLUSH:be,Z_FULL_FLUSH:ve,Z_FINISH:ke,Z_OK:ze,Z_STREAM_END:Se,Z_DEFAULT_COMPRESSION:Fe,Z_DEFAULT_STRATEGY:Ue,Z_DEFLATED:De}=ut;function Oe(t){this.options=fe({level:Fe,method:De,chunkSize:16384,windowBits:15,memLevel:8,strategy:Ue},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new we,this.strm.avail_out=0;let a=_e.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==ze)throw new Error(ft[a]);if(e.header&&_e.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?me(e.dictionary):"[object ArrayBuffer]"===pe.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=_e.deflateSetDictionary(this.strm,t),a!==ze)throw new Error(ft[a]);this._dict_set=!0}}Oe.prototype.push=function(t,e){const a=this.strm,s=this.options.chunkSize;let i,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?ke:ye,"string"==typeof t?a.input=me(t):"[object ArrayBuffer]"===pe.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(s),a.next_out=0,a.avail_out=s),(r===be||r===ve)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(i=_e.deflate(a,r),i===Se)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),i=_e.deflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===ze;if(0!==a.avail_out){if(r>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},Oe.prototype.onData=function(t){this.chunks.push(t)},Oe.prototype.onEnd=function(t){t===ze&&(this.result=ue(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var xe={deflate:function(t,e){const a=new Oe(e);if(a.push(t,!0),a.err)throw a.msg||ft[a.err];return a.result}};const{deflate:Re}=xe;var Ee=Re;const Ie={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4},q:{u:DataView.prototype.getInt64,p:DataView.prototype.setInt64,bytes:8},Q:{u:DataView.prototype.getUint64,p:DataView.prototype.setUint64,bytes:8}},Ae=(t,...e)=>{let a=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";let s=[],i=!0;for(let s=0;s<t.length;s++)"<"==t[s]?i=!0:">"==t[s]?i=!1:(r(t[s],e[a]),a++);function r(t,e){if(!(t in Ie))throw"Unhandled character '"+t+"' in pack format";let a=Ie[t].bytes,r=new DataView(new ArrayBuffer(a));Ie[t].p.bind(r)(0,e,i);for(let t=0;t<a;t++)s.push(r.getUint8(t))}return s},Be=(t,e)=>{let a=0,s=[],i=!0;for(let e of t)"<"==e?i=!0:">"==e?i=!1:r(e);function r(t){if(!(t in Ie))throw"Unhandled character '"+t+"' in unpack format";let r=Ie[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[a+t]);let h=Ie[t].u.bind(n);s.push(h(0,i)),a+=r}return s};class Te extends EventTarget{constructor(t,e,a){super(),this.port=t,this.logger=e,this._parent=a,this.chipName=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this.state_DTR=!1}get _inputBuffer(){return this._parent?this._parent._inputBuffer:this.__inputBuffer}async initialize(){await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.readLoop()),await this.sync();let t=await this.readRegister(1073745920),e=p[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family;let s=k(this.getChipFamily()).macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(s+4*t);this.logger.log(`Chip type ${this.chipName}`)}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{for(;;){const{value:t,done:e}=await this._reader.read();if(e){this._reader.releaseLock();break}t&&0!==t.length&&this._inputBuffer.push(...Array.from(t))}}catch(t){console.error("Read loop got disconnected")}this.connected=!1,this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async hardReset(t=!1){this.logger.log("Try hard reset."),t?4097===this.port.getInfo().usbProductId?(await this.setDTR(!1),await this.setRTS(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1)):(await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1)):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1)),await new Promise(t=>setTimeout(t,1e3))}macAddr(){let t,e=new Array(6).fill(0),a=this._efuses[0],s=this._efuses[1],i=this._efuses[2],r=this._efuses[3];if(this.chipFamily==h){if(0!=r)t=[r>>16&255,r>>8&255,255&r];else if(s>>16&255){if(1!=(s>>16&255))throw new Error("Couldnt determine OUI");t=[172,208,116]}else t=[24,254,52];e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=s>>8&255,e[4]=255&s,e[5]=a>>24&255}else if(this.chipFamily==l)e[0]=i>>8&255,e[1]=255&i,e[2]=s>>24&255,e[3]=s>>16&255,e[4]=s>>8&255,e[5]=255&s;else{if(this.chipFamily!=o&&this.chipFamily!=_&&this.chipFamily!=d&&this.chipFamily!=f&&this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=g&&this.chipFamily!=m&&this.chipFamily!=w)throw new Error("Unknown chip family");e[0]=s>>8&255,e[1]=255&s,e[2]=a>>24&255,e[3]=a>>16&255,e[4]=a>>8&255,e[5]=255&a}return e}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));let e=Ae("<I",t);await this.sendCommand(10,e);let[s,i]=await this.getResponse(10);return s}async checkCommand(t,e,s=0,i=3e3){i=Math.min(i,12e5),await this.sendCommand(t,e,s);let[r,n]=await this.getResponse(t,i);if(null===n)throw new Error("Didn't get enough status bytes");let p=0;if(this.IS_STUB||this.chipFamily==h?p=2:[l,o,_,d,f,u,c,g,m,w].includes(this.chipFamily)?p=4:[2,4].includes(n.length)&&(p=n.length),n.length<p)throw new Error("Didn't get enough status bytes");let y=n.slice(-p,n.length);if(n=n.slice(0,-p),this.debug&&(this.logger.debug("status",y),this.logger.debug("value",r),this.logger.debug("data",n)),1==y[0])throw 5==y[1]?new Error("Invalid (unsupported) command "+a(t)):new Error("Command failure error code "+a(y[1]));return[r,n]}async sendCommand(t,e,a=0){let s=(t=>{let e=[192];for(let a of t)219==a?e=e.concat([219,221]):192==a?e=e.concat([219,220]):e.push(a);return e.push(192),e})([...Ae("<BBHI",0,t,e.length,a),...e]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let i=null,r=!1,n=[];for(;;){let h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBuffer.length>0){n.push(this._inputBuffer.shift());break}await s(10)}if(0==n.length){throw new z("Timed out waiting for packet "+(null===i?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+e(n));for(let t of n)if(null===i){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+e(n)),this.logger.debug("Remaining data in serial buffer: "+e(this._inputBuffer))),new z("Invalid head of packet ("+a(t)+")");i=[]}else if(r)if(r=!1,220==t)i.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+e(n)),this.logger.debug("Remaining data in serial buffer: "+e(this._inputBuffer))),new z("Invalid SLIP escape (0xdb, "+a(t)+")");i.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+e(i)),i;i.push(t)}}throw new z("Invalid state")}async getResponse(t,e=3e3){for(let s=0;s<100;s++){const s=await this.readPacket(e);if(s.length<8)continue;const[i,r,n,h]=Be("<BBHI",s.slice(0,8));if(1!=i)continue;const l=s.slice(8);if(null==t||r==t)return[h,l];if(0!=l[0]&&5==l[1])throw this._inputBuffer.length=0,new Error(`Invalid (unsupported) command ${a(t)}`)}throw"Response doesn't match request"}checksum(t,e=239){for(let a of t)e^=a;return e}async setBaudrate(t){if(this.chipFamily==h)throw new Error("Changing baud rate is not supported on the ESP8266");this.logger.log("Attempting to change baud rate to "+t+"...");try{let e=Ae("<II",t,this.IS_STUB?r:0);await this.checkCommand(15,e)}catch(e){throw console.error(e),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t)}async reconfigurePort(t){var e;try{await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),this.readLoop(),this.logger.log(`Changed baud rate to ${t}`)}catch(e){throw console.error(e),new Error(`Unable to change the baud rate to ${t}: ${e}`)}}async sync(){for(let t=0;t<5;t++){if(this._inputBuffer.length=0,await this._sync())return await s(100),!0;await s(100)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,n);for(let t=0;t<8;t++)try{let[t,e]=await this.getResponse(8,100);if(e.length>1&&0==e[0]&&0==e[1])return!0}catch(t){}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,s=0,i=!1){if(t.byteLength>=8){var r=Array.from(new Uint8Array(t,0,4));let e=r[0],s=r[2],i=r[3];this.logger.log(`Image header, Magic=${a(e)}, FlashMode=${a(s)}, FlashSizeFreq=${a(i)}`)}let n,h=t.byteLength,l=0,o=y;i?(n=Ee(new Uint8Array(t),{level:9}).buffer,l=n.byteLength,this.logger.log(`Writing data with filesize: ${h}. Compressed Size: ${l}`),o=await this.flashDeflBegin(h,l,s)):(this.logger.log(`Writing data with filesize: ${h}`),n=t,await this.flashBegin(h,s));let _=[],d=0,f=0,u=0,c=Date.now(),g=this.getFlashWriteSize(),m=i?l:h;for(;m-u>0;)this.debug&&this.logger.log(`Writing at ${a(s+d*g,8)} `),m-u>=g?_=Array.from(new Uint8Array(n,u,g)):(_=Array.from(new Uint8Array(n,u,m-u)),i||(_=_.concat(new Array(g-_.length).fill(255)))),i?await this.flashDeflBlock(_,d,o):await this.flashBlock(_,d),d+=1,f+=i?Math.round(_.length*h/l):_.length,u+=g,e(Math.min(f,h),h);this.logger.log("Took "+(Date.now()-c)+"ms to write "+m+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),i?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,a=3e3){await this.checkCommand(3,Ae("<IIII",t.length,e,0,0).concat(t),this.checksum(t),a)}async flashDeflBlock(t,e,a=3e3){await this.checkCommand(17,Ae("<IIII",t.length,e,0,0).concat(t),this.checksum(t),a)}async flashBegin(t=0,e=0,s=!1){let i,r,n=this.getFlashWriteSize();!this.IS_STUB&&[l,o,_,d,f,u,c,g,m,w].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));let p,b=Math.floor((t+n-1)/n);i=this.chipFamily==h?this.getEraseSize(e,t):t,p=this.IS_STUB?y:v(3e4,t);let k=Date.now();return r=Ae("<IIII",i,b,n,e),this.chipFamily!=l&&this.chipFamily!=o&&this.chipFamily!=_&&this.chipFamily!=d&&this.chipFamily!=f&&this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=g&&this.chipFamily!=m&&this.chipFamily!=w||(r=r.concat(Ae("<I",s?1:0))),this.logger.log("Erase size "+i+", blocks "+b+", block size "+a(n,4)+", offset "+a(e,4)+", encrypted "+(s?"yes":"no")),await this.checkCommand(2,r,0,p),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-k)+"ms to erase "+b+" bytes"),b}async flashDeflBegin(t=0,e=0,a=0,s=!1){let i,r=this.getFlashWriteSize(),n=Math.floor((e+r-1)/r),h=Math.floor((t+r-1)/r),l=0,o=0;return this.IS_STUB?(l=t,o=v(3e4,l)):(l=h*r,o=y),i=Ae("<IIII",l,n,r,a),await this.checkCommand(16,i,0,o),o}async flashFinish(){let t=Ae("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){let t=Ae("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return k(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,a=4294967295,s=0,i=0){let r=Ae("<IIII",t,e,a,s);i>0&&r.concat(Ae("<IIII",k(this.getChipFamily()).uartDateReg,0,0,i)),await this.checkCommand(9,r)}async setDataLengths(t,e,a){if(-1!=t.mosiDlenOffs){let s=t.regBase+t.mosiDlenOffs,i=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(s,e-1),a>0&&await this.writeRegister(i,a-1)}else{let s=t.regBase+t.usr1Offs,i=(0==a?0:a-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(s,i)}}async waitDone(t,e){for(let a=0;a<10;a++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,s=0){let i=k(this.getChipFamily()),r=i.regBase,n=r,h=r+i.usrOffs,l=r+i.usr2Offs,o=r+i.w0Offs,_=1<<18;if(s>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");let d=8*e.length,f=await this.readRegister(h),u=await this.readRegister(l),c=1<<31;if(s>0&&(c|=268435456),d>0&&(c|=134217728),await this.setDataLengths(i,d,s),await this.writeRegister(h,c),await this.writeRegister(l,7<<28|t),0==d)await this.writeRegister(o,0);else{e.concat(new Array(e.length%4).fill(0));let t=Be("I".repeat(Math.floor(e.length/4)),e),s=o;this.logger.debug(`Words Length: ${t.length}`);for(const e of t)this.logger.debug(`Writing word ${a(e)} to register offset ${a(s)}`),await this.writeRegister(s,e),s+=4}await this.writeRegister(n,_),await this.waitDone(n,_);let g=await this.readRegister(o);return await this.writeRegister(h,f),await this.writeRegister(l,u),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");let t=await this.flashId(),e=255&t,s=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${s.toString(16)}`),this.flashSize=i[s],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){let a=4096,s=Math.floor((e+a-1)/a),i=16-Math.floor(t/a)%16;return s<i&&(i=s),s<2*i?Math.floor((s+1)/2*a):(s-i)*a}async memBegin(t,e,a,s){return await this.checkCommand(5,Ae("<IIII",t,e,a,s))}async memBlock(t,e){return await this.checkCommand(7,Ae("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){let e=this.IS_STUB?y:500,a=Ae("<II",0==t?1:0,t);return await this.checkCommand(6,a,0,e)}async runStub(){const t=await S(this.chipFamily);let e,a=2048;this.logger.log("Uploading stub...");for(let e of["text","data"])if(Object.keys(t).includes(e)){let s=t[e+"_start"],i=t[e].length,r=Math.floor((i+a-1)/a);await this.memBegin(i,r,a,s);for(let s of Array(r).keys()){let r=s*a,n=r+a;n>i&&(n=i),await this.memBlock(t[e].slice(r,n),s)}}this.logger.log("Running stub..."),await this.memFinish(t.entry);const s=await this.readPacket(500);if(e=String.fromCharCode(...s),"OHAI"!=e)throw new Error("Failed to start stub. Unexpected response: "+e);this.logger.log("Stub is now running...");const i=new Ce(this.port,this.logger,this);return await i.detectFlashSize(),i}async writeToStream(t){const e=this.port.writable.getWriter();await e.write(new Uint8Array(t));try{e.releaseLock()}catch(t){console.error("Ignoring release lock error",t)}}async disconnect(){this._parent?await this._parent.disconnect():(await this.port.writable.getWriter().close(),await new Promise(t=>{this._reader||t(void 0),this.addEventListener("disconnect",t,{once:!0}),this._reader.cancel()}),this.connected=!1)}}class Ce extends Te{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,s,i){let r=await S(this.chipFamily),n=i,h=i+t;console.log(n,h),console.log(r.data_start,r.data.length,r.text_start,r.text.length);for(let[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.")}async eraseFlash(){await this.checkCommand(208,[],0,b)}}const Pe=async t=>{const e=await navigator.serial.requestPort();return t.log("Connecting..."),await e.open({baudRate:r}),t.log("Connected successfully."),new Te(e,t)};export{l as CHIP_FAMILY_ESP32,d as CHIP_FAMILY_ESP32C2,f as CHIP_FAMILY_ESP32C3,u as CHIP_FAMILY_ESP32C5,c as CHIP_FAMILY_ESP32C6,g as CHIP_FAMILY_ESP32C61,m as CHIP_FAMILY_ESP32H2,w as CHIP_FAMILY_ESP32P4,o as CHIP_FAMILY_ESP32S2,_ as CHIP_FAMILY_ESP32S3,h as CHIP_FAMILY_ESP8266,Te as ESPLoader,Pe as connect};
1
+ const t=t=>{let e=[];for(let a=0;a<t.length;a++){let s=t.charCodeAt(a);s<=255&&e.push(s)}return e},e=t=>"["+t.map(t=>a(t)).join(", ")+"]",a=(t,e=2)=>{let a=t.toString(16).toUpperCase();return a.startsWith("-")?"-0x"+a.substring(1).padStart(e,"0"):"0x"+a.padStart(e,"0")},s=t=>new Promise(e=>setTimeout(e,t)),i={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB"},r=115200,n=1343410176,h=t(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),l=33382,o=50,_=12882,d=12883,f=12994,u=12995,c=12997,g=12998,p=207969,m=12914,w=12928,y={5:{name:"ESP32-C3",family:u},9:{name:"ESP32-S3",family:d},12:{name:"ESP32-C2",family:f},13:{name:"ESP32-C6",family:g},16:{name:"ESP32-H2",family:m},17:{name:"ESP32-C5",family:c},18:{name:"ESP32-P4",family:w},20:{name:"ESP32-C61",family:p}},b={4293968129:{name:"ESP8266",family:l},15736195:{name:"ESP32",family:o},1990:{name:"ESP32-S2",family:_},9:{name:"ESP32-S3",family:d},203546735:{name:"ESP32-C2",family:f},1867591791:{name:"ESP32-C2",family:f},2084675695:{name:"ESP32-C2",family:f},456216687:{name:"ESP32-C3",family:u},1130455151:{name:"ESP32-C3",family:u},1216438383:{name:"ESP32-C3",family:u},1763790959:{name:"ESP32-C3",family:u},285294703:{name:"ESP32-C5",family:c},1607549039:{name:"ESP32-C5",family:c},1548751960:{name:"ESP32-C5",family:c},1675706479:{name:"ESP32-C5",family:c},752910447:{name:"ESP32-C6",family:g},606167151:{name:"ESP32-C61",family:p},871374959:{name:"ESP32-C61",family:p},1333878895:{name:"ESP32-C61",family:p},1913741423:{name:"ESP32-C61",family:p},2548236392:{name:"ESP32-H2",family:m},3619110528:{name:"ESP32-H2",family:m},0:{name:"ESP32-P4",family:w},117676761:{name:"ESP32-P4",family:w},182303440:{name:"ESP32-P4",family:w}},v=3e3,S=6e5,k=(t,e)=>{let a=Math.floor(t*(e/486));return a<v?v:a},z=t=>{switch(t){case o:return{regBase:1072963584,baseFuse:1073061888,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case _:return{regBase:1061167104,baseFuse:1061265408,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case d:return{regBase:1610620928,usrOffs:24,baseFuse:1610641408,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case l:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case f:case u:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case c:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case g:return{regBase:1610625024,baseFuse:1611335680,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case p:return{regBase:1610625024,baseFuse:1611352064,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case m:return{regBase:1610625024,baseFuse:1610719232,macFuse:1610719300,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case w:return{regBase:1342754816,baseFuse:n,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class R extends Error{constructor(t){super(t),this.name="SlipReadError"}}const F=async(e,a)=>{let s;return e==o?s=await import("./esp32-BNIFdu1P.js"):e==_?s=await import("./esp32s2-Bk4mqADi.js"):e==d?s=await import("./esp32s3-Df3OUCOC.js"):e==l?s=await import("./esp8266-CQFcqJ_a.js"):e==f?s=await import("./esp32c2-BqxquOKw.js"):e==u?s=await import("./esp32c3-BOOqe8me.js"):e==c?s=await import("./esp32c5-mcj52-K1.js"):e==g?s=await import("./esp32c6-Cg5qYgg7.js"):e==p?s=await import("./esp32c61-CzCdsydk.js"):e==m?s=await import("./esp32h2-DZa_lpff.js"):e==w&&(s=null!=a&&a>=300?await import("./esp32p4r3-Cle9QJmZ.js"):await import("./esp32p4-DyGqUAeZ.js")),{...s,text:t(atob(s.text)),data:t(atob(s.data))}};function E(t){let e=t.length;for(;--e>=0;)t[e]=0}const D=256,U=286,I=30,O=15,x=new Uint8Array([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]),A=new Uint8Array([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=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),B=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),T=new Array(576);E(T);const P=new Array(60);E(P);const L=new Array(512);E(L);const Z=new Array(256);E(Z);const $=new Array(29);E($);const N=new Array(I);function M(t,e,a,s,i){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=s,this.max_length=i,this.has_stree=t&&t.length}let H,V,j;function W(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}E(N);const K=t=>t<256?L[t]:L[256+(t>>>7)],Y=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},G=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<<t.bi_valid&65535,Y(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=a)},q=(t,e,a)=>{G(t,a[2*e],a[2*e+1])},X=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},Q=(t,e,a)=>{const s=new Array(16);let i,r,n=0;for(i=1;i<=O;i++)n=n+a[i-1]<<1,s[i]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=X(s[e]++,e))}},J=t=>{let e;for(e=0;e<U;e++)t.dyn_ltree[2*e]=0;for(e=0;e<I;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},tt=t=>{t.bi_valid>8?Y(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},et=(t,e,a,s)=>{const i=2*e,r=2*a;return t[i]<t[r]||t[i]===t[r]&&s[e]<=s[a]},at=(t,e,a)=>{const s=t.heap[a];let i=a<<1;for(;i<=t.heap_len&&(i<t.heap_len&&et(e,t.heap[i+1],t.heap[i],t.depth)&&i++,!et(e,s,t.heap[i],t.depth));)t.heap[a]=t.heap[i],a=i,i<<=1;t.heap[a]=s},st=(t,e,a)=>{let s,i,r,n,h=0;if(0!==t.sym_next)do{s=255&t.pending_buf[t.sym_buf+h++],s+=(255&t.pending_buf[t.sym_buf+h++])<<8,i=t.pending_buf[t.sym_buf+h++],0===s?q(t,i,e):(r=Z[i],q(t,r+D+1,e),n=x[r],0!==n&&(i-=$[r],G(t,i,n)),s--,r=K(s),q(t,r,a),n=A[r],0!==n&&(s-=N[r],G(t,s,n)))}while(h<t.sym_next);q(t,256,e)},it=(t,e)=>{const a=e.dyn_tree,s=e.stat_desc.static_tree,i=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,h,l,o=-1;for(t.heap_len=0,t.heap_max=573,n=0;n<r;n++)0!==a[2*n]?(t.heap[++t.heap_len]=o=n,t.depth[n]=0):a[2*n+1]=0;for(;t.heap_len<2;)l=t.heap[++t.heap_len]=o<2?++o:0,a[2*l]=1,t.depth[l]=0,t.opt_len--,i&&(t.static_len-=s[2*l+1]);for(e.max_code=o,n=t.heap_len>>1;n>=1;n--)at(t,a,n);l=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],at(t,a,1),h=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=h,a[2*l]=a[2*n]+a[2*h],t.depth[l]=(t.depth[n]>=t.depth[h]?t.depth[n]:t.depth[h])+1,a[2*n+1]=a[2*h+1]=l,t.heap[1]=l++,at(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,s=e.max_code,i=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,h=e.stat_desc.extra_base,l=e.stat_desc.max_length;let o,_,d,f,u,c,g=0;for(f=0;f<=O;f++)t.bl_count[f]=0;for(a[2*t.heap[t.heap_max]+1]=0,o=t.heap_max+1;o<573;o++)_=t.heap[o],f=a[2*a[2*_+1]+1]+1,f>l&&(f=l,g++),a[2*_+1]=f,_>s||(t.bl_count[f]++,u=0,_>=h&&(u=n[_-h]),c=a[2*_],t.opt_len+=c*(f+u),r&&(t.static_len+=c*(i[2*_+1]+u)));if(0!==g){do{for(f=l-1;0===t.bl_count[f];)f--;t.bl_count[f]--,t.bl_count[f+1]+=2,t.bl_count[l]--,g-=2}while(g>0);for(f=l;0!==f;f--)for(_=t.bl_count[f];0!==_;)d=t.heap[--o],d>s||(a[2*d+1]!==f&&(t.opt_len+=(f-a[2*d+1])*a[2*d],a[2*d+1]=f),_--)}})(t,e),Q(a,o,t.bl_count)},rt=(t,e,a)=>{let s,i,r=-1,n=e[1],h=0,l=7,o=4;for(0===n&&(l=138,o=3),e[2*(a+1)+1]=65535,s=0;s<=a;s++)i=n,n=e[2*(s+1)+1],++h<l&&i===n||(h<o?t.bl_tree[2*i]+=h:0!==i?(i!==r&&t.bl_tree[2*i]++,t.bl_tree[32]++):h<=10?t.bl_tree[34]++:t.bl_tree[36]++,h=0,r=i,0===n?(l=138,o=3):i===n?(l=6,o=3):(l=7,o=4))},nt=(t,e,a)=>{let s,i,r=-1,n=e[1],h=0,l=7,o=4;for(0===n&&(l=138,o=3),s=0;s<=a;s++)if(i=n,n=e[2*(s+1)+1],!(++h<l&&i===n)){if(h<o)do{q(t,i,t.bl_tree)}while(0!==--h);else 0!==i?(i!==r&&(q(t,i,t.bl_tree),h--),q(t,16,t.bl_tree),G(t,h-3,2)):h<=10?(q(t,17,t.bl_tree),G(t,h-3,3)):(q(t,18,t.bl_tree),G(t,h-11,7));h=0,r=i,0===n?(l=138,o=3):i===n?(l=6,o=3):(l=7,o=4)}};let ht=!1;const lt=(t,e,a,s)=>{G(t,0+(s?1:0),3),tt(t),Y(t,a),Y(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var ot=(t,e,a,s)=>{let i,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<D;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),it(t,t.l_desc),it(t,t.d_desc),n=(t=>{let e;for(rt(t,t.dyn_ltree,t.l_desc.max_code),rt(t,t.dyn_dtree,t.d_desc.max_code),it(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*B[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),i=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=i&&(i=r)):i=r=a+5,a+4<=i&&-1!==e?lt(t,e,a,s):4===t.strategy||r===i?(G(t,2+(s?1:0),3),st(t,T,P)):(G(t,4+(s?1:0),3),((t,e,a,s)=>{let i;for(G(t,e-257,5),G(t,a-1,5),G(t,s-4,4),i=0;i<s;i++)G(t,t.bl_tree[2*B[i]+1],3);nt(t,t.dyn_ltree,e-1),nt(t,t.dyn_dtree,a-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,n+1),st(t,t.dyn_ltree,t.dyn_dtree)),J(t),s&&tt(t)},_t={_tr_init:t=>{ht||((()=>{let t,e,a,s,i;const r=new Array(16);for(a=0,s=0;s<28;s++)for($[s]=a,t=0;t<1<<x[s];t++)Z[a++]=s;for(Z[a-1]=s,i=0,s=0;s<16;s++)for(N[s]=i,t=0;t<1<<A[s];t++)L[i++]=s;for(i>>=7;s<I;s++)for(N[s]=i<<7,t=0;t<1<<A[s]-7;t++)L[256+i++]=s;for(e=0;e<=O;e++)r[e]=0;for(t=0;t<=143;)T[2*t+1]=8,t++,r[8]++;for(;t<=255;)T[2*t+1]=9,t++,r[9]++;for(;t<=279;)T[2*t+1]=7,t++,r[7]++;for(;t<=287;)T[2*t+1]=8,t++,r[8]++;for(Q(T,287,r),t=0;t<I;t++)P[2*t+1]=5,P[2*t]=X(t,5);H=new M(T,x,257,U,O),V=new M(P,A,0,I,O),j=new M(new Array(0),C,0,19,7)})(),ht=!0),t.l_desc=new W(t.dyn_ltree,H),t.d_desc=new W(t.dyn_dtree,V),t.bl_desc=new W(t.bl_tree,j),t.bi_buf=0,t.bi_valid=0,J(t)},_tr_stored_block:lt,_tr_flush_block:ot,_tr_tally:(t,e,a)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=a,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(Z[a]+D+1)]++,t.dyn_dtree[2*K(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{G(t,2,3),q(t,256,T),(t=>{16===t.bi_valid?(Y(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var dt=(t,e,a,s)=>{let i=65535&t,r=t>>>16&65535,n=0;for(;0!==a;){n=a>2e3?2e3:a,a-=n;do{i=i+e[s++]|0,r=r+i|0}while(--n);i%=65521,r%=65521}return i|r<<16};const ft=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var ut=(t,e,a,s)=>{const i=ft,r=s+a;t^=-1;for(let a=s;a<r;a++)t=t>>>8^i[255&(t^e[a])];return-1^t},ct={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},gt={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:pt,_tr_stored_block:mt,_tr_flush_block:wt,_tr_tally:yt,_tr_align:bt}=_t,{Z_NO_FLUSH:vt,Z_PARTIAL_FLUSH:St,Z_FULL_FLUSH:kt,Z_FINISH:zt,Z_BLOCK:Rt,Z_OK:Ft,Z_STREAM_END:Et,Z_STREAM_ERROR:Dt,Z_DATA_ERROR:Ut,Z_BUF_ERROR:It,Z_DEFAULT_COMPRESSION:Ot,Z_FILTERED:xt,Z_HUFFMAN_ONLY:At,Z_RLE:Ct,Z_FIXED:Bt,Z_DEFAULT_STRATEGY:Tt,Z_UNKNOWN:Pt,Z_DEFLATED:Lt}=gt,Zt=258,$t=262,Nt=42,Mt=113,Ht=666,Vt=(t,e)=>(t.msg=ct[e],e),jt=t=>2*t-(t>4?9:0),Wt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},Kt=t=>{let e,a,s,i=t.w_size;e=t.hash_size,s=e;do{a=t.head[--s],t.head[s]=a>=i?a-i:0}while(--e);e=i,s=e;do{a=t.prev[--s],t.prev[s]=a>=i?a-i:0}while(--e)};let Yt=(t,e,a)=>(e<<t.hash_shift^a)&t.hash_mask;const Gt=t=>{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},qt=(t,e)=>{wt(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Gt(t.strm)},Xt=(t,e)=>{t.pending_buf[t.pending++]=e},Qt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Jt=(t,e,a,s)=>{let i=t.avail_in;return i>s&&(i=s),0===i?0:(t.avail_in-=i,e.set(t.input.subarray(t.next_in,t.next_in+i),a),1===t.state.wrap?t.adler=dt(t.adler,e,i,a):2===t.state.wrap&&(t.adler=ut(t.adler,e,i,a)),t.next_in+=i,t.total_in+=i,i)},te=(t,e)=>{let a,s,i=t.max_chain_length,r=t.strstart,n=t.prev_length,h=t.nice_match;const l=t.strstart>t.w_size-$t?t.strstart-(t.w_size-$t):0,o=t.window,_=t.w_mask,d=t.prev,f=t.strstart+Zt;let u=o[r+n-1],c=o[r+n];t.prev_length>=t.good_match&&(i>>=2),h>t.lookahead&&(h=t.lookahead);do{if(a=e,o[a+n]===c&&o[a+n-1]===u&&o[a]===o[r]&&o[++a]===o[r+1]){r+=2,a++;do{}while(o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&o[++r]===o[++a]&&r<f);if(s=Zt-(f-r),r=f-Zt,s>n){if(t.match_start=e,n=s,s>=h)break;u=o[r+n-1],c=o[r+n]}}}while((e=d[e&_])>l&&0!==--i);return n<=t.lookahead?n:t.lookahead},ee=t=>{const e=t.w_size;let a,s,i;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-$t)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),Kt(t),s+=e),0===t.strm.avail_in)break;if(a=Jt(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=a,t.lookahead+t.insert>=3)for(i=t.strstart-t.insert,t.ins_h=t.window[i],t.ins_h=Yt(t,t.ins_h,t.window[i+1]);t.insert&&(t.ins_h=Yt(t,t.ins_h,t.window[i+3-1]),t.prev[i&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=i,i++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<$t&&0!==t.strm.avail_in)},ae=(t,e)=>{let a,s,i,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,h=t.strm.avail_in;do{if(a=65535,i=t.bi_valid+42>>3,t.strm.avail_out<i)break;if(i=t.strm.avail_out-i,s=t.strstart-t.block_start,a>s+t.strm.avail_in&&(a=s+t.strm.avail_in),a>i&&(a=i),a<r&&(0===a&&e!==zt||e===vt||a!==s+t.strm.avail_in))break;n=e===zt&&a===s+t.strm.avail_in?1:0,mt(t,0,0,n),t.pending_buf[t.pending-4]=a,t.pending_buf[t.pending-3]=a>>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,Gt(t.strm),s&&(s>a&&(s=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,a-=s),a&&(Jt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===n);return h-=t.strm.avail_in,h&&(h>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=h&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-h,t.strm.next_in),t.strstart),t.strstart+=h,t.insert+=h>t.w_size-t.insert?t.w_size-t.insert:h),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),n?4:e!==vt&&e!==zt&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(i=t.window_size-t.strstart,t.strm.avail_in>i&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,i+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),i>t.strm.avail_in&&(i=t.strm.avail_in),i&&(Jt(t.strm,t.window,t.strstart,i),t.strstart+=i,t.insert+=i>t.w_size-t.insert?t.w_size-t.insert:i),t.high_water<t.strstart&&(t.high_water=t.strstart),i=t.bi_valid+42>>3,i=t.pending_buf_size-i>65535?65535:t.pending_buf_size-i,r=i>t.w_size?t.w_size:i,s=t.strstart-t.block_start,(s>=r||(s||e===zt)&&e!==vt&&0===t.strm.avail_in&&s<=i)&&(a=s>i?i:s,n=e===zt&&0===t.strm.avail_in&&a===s?1:0,mt(t,t.block_start,a,n),t.block_start+=a,Gt(t.strm)),n?3:1)},se=(t,e)=>{let a,s;for(;;){if(t.lookahead<$t){if(ee(t),t.lookahead<$t&&e===vt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=Yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-$t&&(t.match_length=te(t,a)),t.match_length>=3)if(s=yt(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=Yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=Yt(t,t.ins_h,t.window[t.strstart+1]);else s=yt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(qt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===zt?(qt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(qt(t,!1),0===t.strm.avail_out)?1:2},ie=(t,e)=>{let a,s,i;for(;;){if(t.lookahead<$t){if(ee(t),t.lookahead<$t&&e===vt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=Yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length<t.max_lazy_match&&t.strstart-a<=t.w_size-$t&&(t.match_length=te(t,a),t.match_length<=5&&(t.strategy===xt||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,s=yt(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=Yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(qt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=yt(t,0,t.window[t.strstart-1]),s&&qt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=yt(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===zt?(qt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(qt(t,!1),0===t.strm.avail_out)?1:2};function re(t,e,a,s,i){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=s,this.func=i}const ne=[new re(0,0,0,0,ae),new re(4,4,8,4,se),new re(4,5,16,8,se),new re(4,6,32,32,se),new re(4,4,16,16,ie),new re(8,16,32,32,ie),new re(8,16,128,128,ie),new re(8,32,128,256,ie),new re(32,128,258,1024,ie),new re(32,258,258,4096,ie)];function he(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Lt,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Wt(this.dyn_ltree),Wt(this.dyn_dtree),Wt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Wt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Wt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const le=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==Nt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==Mt&&e.status!==Ht?1:0},oe=t=>{if(le(t))return Vt(t,Dt);t.total_in=t.total_out=0,t.data_type=Pt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?Nt:Mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,pt(e),Ft},_e=t=>{const e=oe(t);var a;return e===Ft&&((a=t.state).window_size=2*a.w_size,Wt(a.head),a.max_lazy_match=ne[a.level].max_lazy,a.good_match=ne[a.level].good_length,a.nice_match=ne[a.level].nice_length,a.max_chain_length=ne[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},de=(t,e,a,s,i,r)=>{if(!t)return Dt;let n=1;if(e===Ot&&(e=6),s<0?(n=0,s=-s):s>15&&(n=2,s-=16),i<1||i>9||a!==Lt||s<8||s>15||e<0||e>9||r<0||r>Bt||8===s&&1!==n)return Vt(t,Dt);8===s&&(s=9);const h=new he;return t.state=h,h.strm=t,h.status=Nt,h.wrap=n,h.gzhead=null,h.w_bits=s,h.w_size=1<<h.w_bits,h.w_mask=h.w_size-1,h.hash_bits=i+7,h.hash_size=1<<h.hash_bits,h.hash_mask=h.hash_size-1,h.hash_shift=~~((h.hash_bits+3-1)/3),h.window=new Uint8Array(2*h.w_size),h.head=new Uint16Array(h.hash_size),h.prev=new Uint16Array(h.w_size),h.lit_bufsize=1<<i+6,h.pending_buf_size=4*h.lit_bufsize,h.pending_buf=new Uint8Array(h.pending_buf_size),h.sym_buf=h.lit_bufsize,h.sym_end=3*(h.lit_bufsize-1),h.level=e,h.strategy=r,h.method=a,_e(t)};var fe={deflateInit:(t,e)=>de(t,e,Lt,15,8,Tt),deflateInit2:de,deflateReset:_e,deflateResetKeep:oe,deflateSetHeader:(t,e)=>le(t)||2!==t.state.wrap?Dt:(t.state.gzhead=e,Ft),deflate:(t,e)=>{if(le(t)||e>Rt||e<0)return t?Vt(t,Dt):Dt;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===Ht&&e!==zt)return Vt(t,0===t.avail_out?It:Dt);const s=a.last_flush;if(a.last_flush=e,0!==a.pending){if(Gt(t),0===t.avail_out)return a.last_flush=-1,Ft}else if(0===t.avail_in&&jt(e)<=jt(s)&&e!==zt)return Vt(t,It);if(a.status===Ht&&0!==t.avail_in)return Vt(t,It);if(a.status===Nt&&0===a.wrap&&(a.status=Mt),a.status===Nt){let e=Lt+(a.w_bits-8<<4)<<8,s=-1;if(s=a.strategy>=At||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=s<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Qt(a,e),0!==a.strstart&&(Qt(a,t.adler>>>16),Qt(a,65535&t.adler)),t.adler=1,a.status=Mt,Gt(t),0!==a.pending)return a.last_flush=-1,Ft}if(57===a.status)if(t.adler=0,Xt(a,31),Xt(a,139),Xt(a,8),a.gzhead)Xt(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),Xt(a,255&a.gzhead.time),Xt(a,a.gzhead.time>>8&255),Xt(a,a.gzhead.time>>16&255),Xt(a,a.gzhead.time>>24&255),Xt(a,9===a.level?2:a.strategy>=At||a.level<2?4:0),Xt(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(Xt(a,255&a.gzhead.extra.length),Xt(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=ut(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(Xt(a,0),Xt(a,0),Xt(a,0),Xt(a,0),Xt(a,0),Xt(a,9===a.level?2:a.strategy>=At||a.level<2?4:0),Xt(a,3),a.status=Mt,Gt(t),0!==a.pending)return a.last_flush=-1,Ft;if(69===a.status){if(a.gzhead.extra){let e=a.pending,s=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+s>a.pending_buf_size;){let i=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=ut(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=i,Gt(t),0!==a.pending)return a.last_flush=-1,Ft;e=0,s-=i}let i=new Uint8Array(a.gzhead.extra);a.pending_buf.set(i.subarray(a.gzindex,a.gzindex+s),a.pending),a.pending+=s,a.gzhead.hcrc&&a.pending>e&&(t.adler=ut(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=ut(t.adler,a.pending_buf,a.pending-s,s)),Gt(t),0!==a.pending)return a.last_flush=-1,Ft;s=0}e=a.gzindex<a.gzhead.name.length?255&a.gzhead.name.charCodeAt(a.gzindex++):0,Xt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=ut(t.adler,a.pending_buf,a.pending-s,s)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,s=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>s&&(t.adler=ut(t.adler,a.pending_buf,a.pending-s,s)),Gt(t),0!==a.pending)return a.last_flush=-1,Ft;s=0}e=a.gzindex<a.gzhead.comment.length?255&a.gzhead.comment.charCodeAt(a.gzindex++):0,Xt(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>s&&(t.adler=ut(t.adler,a.pending_buf,a.pending-s,s))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(Gt(t),0!==a.pending))return a.last_flush=-1,Ft;Xt(a,255&t.adler),Xt(a,t.adler>>8&255),t.adler=0}if(a.status=Mt,Gt(t),0!==a.pending)return a.last_flush=-1,Ft}if(0!==t.avail_in||0!==a.lookahead||e!==vt&&a.status!==Ht){let s=0===a.level?ae(a,e):a.strategy===At?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(ee(t),0===t.lookahead)){if(e===vt)return 1;break}if(t.match_length=0,a=yt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(qt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===zt?(qt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(qt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===Ct?((t,e)=>{let a,s,i,r;const n=t.window;for(;;){if(t.lookahead<=Zt){if(ee(t),t.lookahead<=Zt&&e===vt)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(i=t.strstart-1,s=n[i],s===n[++i]&&s===n[++i]&&s===n[++i])){r=t.strstart+Zt;do{}while(s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&s===n[++i]&&i<r);t.match_length=Zt-(r-i),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=yt(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=yt(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(qt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===zt?(qt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(qt(t,!1),0===t.strm.avail_out)?1:2})(a,e):ne[a.level].func(a,e);if(3!==s&&4!==s||(a.status=Ht),1===s||3===s)return 0===t.avail_out&&(a.last_flush=-1),Ft;if(2===s&&(e===St?bt(a):e!==Rt&&(mt(a,0,0,!1),e===kt&&(Wt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),Gt(t),0===t.avail_out))return a.last_flush=-1,Ft}return e!==zt?Ft:a.wrap<=0?Et:(2===a.wrap?(Xt(a,255&t.adler),Xt(a,t.adler>>8&255),Xt(a,t.adler>>16&255),Xt(a,t.adler>>24&255),Xt(a,255&t.total_in),Xt(a,t.total_in>>8&255),Xt(a,t.total_in>>16&255),Xt(a,t.total_in>>24&255)):(Qt(a,t.adler>>>16),Qt(a,65535&t.adler)),Gt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?Ft:Et)},deflateEnd:t=>{if(le(t))return Dt;const e=t.state.status;return t.state=null,e===Mt?Vt(t,Ut):Ft},deflateSetDictionary:(t,e)=>{let a=e.length;if(le(t))return Dt;const s=t.state,i=s.wrap;if(2===i||1===i&&s.status!==Nt||s.lookahead)return Dt;if(1===i&&(t.adler=dt(t.adler,e,a,0)),s.wrap=0,a>=s.w_size){0===i&&(Wt(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(a-s.w_size,a),0),e=t,a=s.w_size}const r=t.avail_in,n=t.next_in,h=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,ee(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{s.ins_h=Yt(s,s.ins_h,s.window[t+3-1]),s.prev[t&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=t,t++}while(--e);s.strstart=t,s.lookahead=2,ee(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=n,t.input=h,t.avail_in=r,s.wrap=i,Ft},deflateInfo:"pako deflate (from Nodeca project)"};const ue=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var ce=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)ue(a,e)&&(t[e]=a[e])}}return t},ge=t=>{let e=0;for(let a=0,s=t.length;a<s;a++)e+=t[a].length;const a=new Uint8Array(e);for(let e=0,s=0,i=t.length;e<i;e++){let i=t[e];a.set(i,s),s+=i.length}return a};let pe=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){pe=!1}const me=new Uint8Array(256);for(let t=0;t<256;t++)me[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;me[254]=me[254]=1;var we=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,s,i,r,n=t.length,h=0;for(i=0;i<n;i++)a=t.charCodeAt(i),55296==(64512&a)&&i+1<n&&(s=t.charCodeAt(i+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),i++)),h+=a<128?1:a<2048?2:a<65536?3:4;for(e=new Uint8Array(h),r=0,i=0;r<h;i++)a=t.charCodeAt(i),55296==(64512&a)&&i+1<n&&(s=t.charCodeAt(i+1),56320==(64512&s)&&(a=65536+(a-55296<<10)+(s-56320),i++)),a<128?e[r++]=a:a<2048?(e[r++]=192|a>>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e};var ye=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const be=Object.prototype.toString,{Z_NO_FLUSH:ve,Z_SYNC_FLUSH:Se,Z_FULL_FLUSH:ke,Z_FINISH:ze,Z_OK:Re,Z_STREAM_END:Fe,Z_DEFAULT_COMPRESSION:Ee,Z_DEFAULT_STRATEGY:De,Z_DEFLATED:Ue}=gt;function Ie(t){this.options=ce({level:Ee,method:Ue,chunkSize:16384,windowBits:15,memLevel:8,strategy:De},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ye,this.strm.avail_out=0;let a=fe.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==Re)throw new Error(ct[a]);if(e.header&&fe.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?we(e.dictionary):"[object ArrayBuffer]"===be.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=fe.deflateSetDictionary(this.strm,t),a!==Re)throw new Error(ct[a]);this._dict_set=!0}}Ie.prototype.push=function(t,e){const a=this.strm,s=this.options.chunkSize;let i,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?ze:ve,"string"==typeof t?a.input=we(t):"[object ArrayBuffer]"===be.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(s),a.next_out=0,a.avail_out=s),(r===Se||r===ke)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(i=fe.deflate(a,r),i===Fe)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),i=fe.deflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===Re;if(0!==a.avail_out){if(r>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},Ie.prototype.onData=function(t){this.chunks.push(t)},Ie.prototype.onEnd=function(t){t===Re&&(this.result=ge(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Oe={deflate:function(t,e){const a=new Ie(e);if(a.push(t,!0),a.err)throw a.msg||ct[a.err];return a.result}};const{deflate:xe}=Oe;var Ae=xe;const Ce={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4},q:{u:DataView.prototype.getInt64,p:DataView.prototype.setInt64,bytes:8},Q:{u:DataView.prototype.getUint64,p:DataView.prototype.setUint64,bytes:8}},Be=(t,...e)=>{let a=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";let s=[],i=!0;for(let s=0;s<t.length;s++)"<"==t[s]?i=!0:">"==t[s]?i=!1:(r(t[s],e[a]),a++);function r(t,e){if(!(t in Ce))throw"Unhandled character '"+t+"' in pack format";let a=Ce[t].bytes,r=new DataView(new ArrayBuffer(a));Ce[t].p.bind(r)(0,e,i);for(let t=0;t<a;t++)s.push(r.getUint8(t))}return s},Te=(t,e)=>{let a=0,s=[],i=!0;for(let e of t)"<"==e?i=!0:">"==e?i=!1:r(e);function r(t){if(!(t in Ce))throw"Unhandled character '"+t+"' in unpack format";let r=Ce[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t<r;t++)n.setUint8(t,255&e[a+t]);let h=Ce[t].u.bind(n);s.push(h(0,i)),a+=r}return s};class Pe extends EventTarget{constructor(t,e,a){super(),this.port=t,this.logger=e,this._parent=a,this.chipName=null,this.chipRevision=null,this.chipVariant=null,this._efuses=new Array(4).fill(0),this._flashsize=4194304,this.debug=!1,this.IS_STUB=!1,this.connected=!0,this.flashSize=null,this.state_DTR=!1}get _inputBuffer(){return this._parent?this._parent._inputBuffer:this.__inputBuffer}async initialize(){await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.readLoop()),await this.sync(),await this.detectChip();let t=z(this.getChipFamily()).macFuse;for(let e=0;e<4;e++)this._efuses[e]=await this.readRegister(t+4*e);this.logger.log(`Chip type ${this.chipName}`)}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=y[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===w&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`)}let t=await this.readRegister(1073745920),e=b[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${a(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipFamily===w&&(this.chipRevision=await this.getChipRevision(),this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`),this.chipRevision>=300?this.chipVariant="rev300":this.chipVariant="rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${a(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){if(this.chipFamily!==w)return 0;const t=await this.readRegister(1343410252);return 100*((t>>23&1)<<2|t>>4&3)+(15&t)}async getSecurityInfo(){const[t,e]=await this.checkCommand(20,[],0);if(0===e.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(e.length<12)throw new Error(`Invalid security info response length: ${e.length} (expected at least 12 bytes)`);return{flags:Te("<I",e.slice(0,4))[0],flashCryptCnt:e[4],keyPurposes:Array.from(e.slice(5,12)),chipId:e.length>=16?Te("<I",e.slice(12,16))[0]:0,apiVersion:e.length>=20?Te("<I",e.slice(16,20))[0]:0}}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{for(;;){const{value:t,done:e}=await this._reader.read();if(e){this._reader.releaseLock();break}t&&0!==t.length&&this._inputBuffer.push(...Array.from(t))}}catch(t){console.error("Read loop got disconnected")}this.connected=!1,this.dispatchEvent(new Event("disconnect")),this.logger.debug("Finished read loop")}sleep(t=100){return new Promise(e=>setTimeout(e,t))}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async hardReset(t=!1){this.logger.log("Try hard reset."),t?4097===this.port.getInfo().usbProductId?(await this.setDTR(!1),await this.setRTS(!1),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(100),await this.setRTS(!0),await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!1),await this.setRTS(!1)):(await this.setDTR(!1),await this.setRTS(!0),await this.sleep(100),await this.setDTR(!0),await this.setRTS(!1),await this.sleep(50),await this.setDTR(!1)):(await this.setRTS(!0),await this.sleep(100),await this.setRTS(!1)),await new Promise(t=>setTimeout(t,1e3))}macAddr(){let t,e=new Array(6).fill(0),a=this._efuses[0],s=this._efuses[1],i=this._efuses[2],r=this._efuses[3];if(this.chipFamily==l){if(0!=r)t=[r>>16&255,r>>8&255,255&r];else if(s>>16&255){if(1!=(s>>16&255))throw new Error("Couldnt determine OUI");t=[172,208,116]}else t=[24,254,52];e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=s>>8&255,e[4]=255&s,e[5]=a>>24&255}else if(this.chipFamily==o)e[0]=i>>8&255,e[1]=255&i,e[2]=s>>24&255,e[3]=s>>16&255,e[4]=s>>8&255,e[5]=255&s;else{if(this.chipFamily!=_&&this.chipFamily!=d&&this.chipFamily!=f&&this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=m&&this.chipFamily!=w)throw new Error("Unknown chip family");e[0]=s>>8&255,e[1]=255&s,e[2]=a>>24&255,e[3]=a>>16&255,e[4]=a>>8&255,e[5]=255&a}return e}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+a(t,8));let e=Be("<I",t);await this.sendCommand(10,e);let[s,i]=await this.getResponse(10);return s}async checkCommand(t,e,s=0,i=3e3){i=Math.min(i,12e5),await this.sendCommand(t,e,s);let[r,n]=await this.getResponse(t,i);if(null===n)throw new Error("Didn't get enough status bytes");let h=0;if(this.IS_STUB||this.chipFamily==l?h=2:[o,_,d,f,u,c,g,p,m,w].includes(this.chipFamily)||20===t?h=4:[2,4].includes(n.length)&&(h=n.length),n.length<h)throw new Error("Didn't get enough status bytes");let y=n.slice(-h,n.length);if(n=n.slice(0,-h),this.debug&&(this.logger.debug("status",y),this.logger.debug("value",r),this.logger.debug("data",n)),1==y[0])throw 5==y[1]?new Error("Invalid (unsupported) command "+a(t)):new Error("Command failure error code "+a(y[1]));return[r,n]}async sendCommand(t,e,a=0){let s=(t=>{let e=[192];for(let a of t)219==a?e=e.concat([219,221]):192==a?e=e.concat([219,220]):e.push(a);return e.push(192),e})([...Be("<BBHI",0,t,e.length,a),...e]);this.debug&&this.logger.debug(`Writing ${s.length} byte${1==s.length?"":"s"}:`,s),await this.writeToStream(s)}async readPacket(t){let i=null,r=!1,n=[];for(;;){let h=Date.now();for(n=[];Date.now()-h<t;){if(this._inputBuffer.length>0){n.push(this._inputBuffer.shift());break}await s(10)}if(0==n.length){throw new R("Timed out waiting for packet "+(null===i?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+e(n));for(let t of n)if(null===i){if(192!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+e(n)),this.logger.debug("Remaining data in serial buffer: "+e(this._inputBuffer))),new R("Invalid head of packet ("+a(t)+")");i=[]}else if(r)if(r=!1,220==t)i.push(192);else{if(221!=t)throw this.debug&&(this.logger.debug("Read invalid data: "+e(n)),this.logger.debug("Remaining data in serial buffer: "+e(this._inputBuffer))),new R("Invalid SLIP escape (0xdb, "+a(t)+")");i.push(219)}else if(219==t)r=!0;else{if(192==t)return this.debug&&this.logger.debug("Received full packet: "+e(i)),i;i.push(t)}}throw new R("Invalid state")}async getResponse(t,e=3e3){for(let s=0;s<100;s++){const s=await this.readPacket(e);if(s.length<8)continue;const[i,r,n,h]=Te("<BBHI",s.slice(0,8));if(1!=i)continue;const l=s.slice(8);if(null==t||r==t)return[h,l];if(0!=l[0]&&5==l[1])throw this._inputBuffer.length=0,new Error(`Invalid (unsupported) command ${a(t)}`)}throw"Response doesn't match request"}checksum(t,e=239){for(let a of t)e^=a;return e}async setBaudrate(t){if(this.chipFamily==l)throw new Error("Changing baud rate is not supported on the ESP8266");this.logger.log("Attempting to change baud rate to "+t+"...");try{let e=Be("<II",t,this.IS_STUB?r:0);await this.checkCommand(15,e)}catch(e){throw console.error(e),new Error(`Unable to change the baud rate to ${t}: No response from set baud rate command.`)}this._parent?await this._parent.reconfigurePort(t):await this.reconfigurePort(t),this.logger.log(`Changed baud rate to ${t}`)}async reconfigurePort(t){var e;try{await(null===(e=this._reader)||void 0===e?void 0:e.cancel()),await this.port.close(),await this.port.open({baudRate:t}),this.readLoop()}catch(e){throw console.error(e),new Error(`Unable to change the baud rate to ${t}: ${e}`)}}async sync(){for(let t=0;t<5;t++){if(this._inputBuffer.length=0,await this._sync())return await s(100),!0;await s(100)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,h);for(let t=0;t<8;t++)try{let[t,e]=await this.getResponse(8,100);if(e.length>1&&0==e[0]&&0==e[1])return!0}catch(t){}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,s=0,i=!1){if(t.byteLength>=8){var r=Array.from(new Uint8Array(t,0,4));let e=r[0],s=r[2],i=r[3];this.logger.log(`Image header, Magic=${a(e)}, FlashMode=${a(s)}, FlashSizeFreq=${a(i)}`)}let n,h=t.byteLength,l=0,o=v;i?(n=Ae(new Uint8Array(t),{level:9}).buffer,l=n.byteLength,this.logger.log(`Writing data with filesize: ${h}. Compressed Size: ${l}`),o=await this.flashDeflBegin(h,l,s)):(this.logger.log(`Writing data with filesize: ${h}`),n=t,await this.flashBegin(h,s));let _=[],d=0,f=0,u=0,c=Date.now(),g=this.getFlashWriteSize(),p=i?l:h;for(;p-u>0;)this.debug&&this.logger.log(`Writing at ${a(s+d*g,8)} `),p-u>=g?_=Array.from(new Uint8Array(n,u,g)):(_=Array.from(new Uint8Array(n,u,p-u)),i||(_=_.concat(new Array(g-_.length).fill(255)))),i?await this.flashDeflBlock(_,d,o):await this.flashBlock(_,d),d+=1,f+=i?Math.round(_.length*h/l):_.length,u+=g,e(Math.min(f,h),h);this.logger.log("Took "+(Date.now()-c)+"ms to write "+p+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),i?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,a=3e3){await this.checkCommand(3,Be("<IIII",t.length,e,0,0).concat(t),this.checksum(t),a)}async flashDeflBlock(t,e,a=3e3){await this.checkCommand(17,Be("<IIII",t.length,e,0,0).concat(t),this.checksum(t),a)}async flashBegin(t=0,e=0,s=!1){let i,r,n=this.getFlashWriteSize();!this.IS_STUB&&[o,_,d,f,u,c,g,p,m,w].includes(this.chipFamily)&&await this.checkCommand(13,new Array(8).fill(0));let h,y=Math.floor((t+n-1)/n);i=this.chipFamily==l?this.getEraseSize(e,t):t,h=this.IS_STUB?v:k(3e4,t);let b=Date.now();return r=Be("<IIII",i,y,n,e),this.chipFamily!=o&&this.chipFamily!=_&&this.chipFamily!=d&&this.chipFamily!=f&&this.chipFamily!=u&&this.chipFamily!=c&&this.chipFamily!=g&&this.chipFamily!=p&&this.chipFamily!=m&&this.chipFamily!=w||(r=r.concat(Be("<I",s?1:0))),this.logger.log("Erase size "+i+", blocks "+y+", block size "+a(n,4)+", offset "+a(e,4)+", encrypted "+(s?"yes":"no")),await this.checkCommand(2,r,0,h),0==t||this.IS_STUB||this.logger.log("Took "+(Date.now()-b)+"ms to erase "+y+" bytes"),y}async flashDeflBegin(t=0,e=0,a=0,s=!1){let i,r=this.getFlashWriteSize(),n=Math.floor((e+r-1)/r),h=Math.floor((t+r-1)/r),l=0,o=0;return this.IS_STUB?(l=t,o=k(3e4,l)):(l=h*r,o=v),i=Be("<IIII",l,n,r,a),await this.checkCommand(16,i,0,o),o}async flashFinish(){let t=Be("<I",1);await this.checkCommand(4,t)}async flashDeflFinish(){let t=Be("<I",1);await this.checkCommand(18,t)}getBootloaderOffset(){return z(this.getChipFamily()).flashOffs}async flashId(){return await this.runSpiFlashCommand(159,[],24)}getChipFamily(){return this._parent?this._parent.chipFamily:this.chipFamily}async writeRegister(t,e,a=4294967295,s=0,i=0){let r=Be("<IIII",t,e,a,s);i>0&&r.concat(Be("<IIII",z(this.getChipFamily()).uartDateReg,0,0,i)),await this.checkCommand(9,r)}async setDataLengths(t,e,a){if(-1!=t.mosiDlenOffs){let s=t.regBase+t.mosiDlenOffs,i=t.regBase+t.misoDlenOffs;e>0&&await this.writeRegister(s,e-1),a>0&&await this.writeRegister(i,a-1)}else{let s=t.regBase+t.usr1Offs,i=(0==a?0:a-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(s,i)}}async waitDone(t,e){for(let a=0;a<10;a++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,s=0){let i=z(this.getChipFamily()),r=i.regBase,n=r,h=r+i.usrOffs,l=r+i.usr2Offs,o=r+i.w0Offs,_=1<<18;if(s>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");let d=8*e.length,f=await this.readRegister(h),u=await this.readRegister(l),c=1<<31;if(s>0&&(c|=268435456),d>0&&(c|=134217728),await this.setDataLengths(i,d,s),await this.writeRegister(h,c),await this.writeRegister(l,7<<28|t),0==d)await this.writeRegister(o,0);else{e.concat(new Array(e.length%4).fill(0));let t=Te("I".repeat(Math.floor(e.length/4)),e),s=o;this.logger.debug(`Words Length: ${t.length}`);for(const e of t)this.logger.debug(`Writing word ${a(e)} to register offset ${a(s)}`),await this.writeRegister(s,e),s+=4}await this.writeRegister(n,_),await this.waitDone(n,_);let g=await this.readRegister(o);return await this.writeRegister(h,f),await this.writeRegister(l,u),g}async detectFlashSize(){this.logger.log("Detecting Flash Size");let t=await this.flashId(),e=255&t,s=t>>16&255;this.logger.log(`FlashId: ${a(t)}`),this.logger.log(`Flash Manufacturer: ${e.toString(16)}`),this.logger.log(`Flash Device: ${(t>>8&255).toString(16)}${s.toString(16)}`),this.flashSize=i[s],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){let a=4096,s=Math.floor((e+a-1)/a),i=16-Math.floor(t/a)%16;return s<i&&(i=s),s<2*i?Math.floor((s+1)/2*a):(s-i)*a}async memBegin(t,e,a,s){return await this.checkCommand(5,Be("<IIII",t,e,a,s))}async memBlock(t,e){return await this.checkCommand(7,Be("<IIII",t.length,e,0,0).concat(t),this.checksum(t))}async memFinish(t=0){let e=this.IS_STUB?v:500,a=Be("<II",0==t?1:0,t);return await this.checkCommand(6,a,0,e)}async runStub(){const t=await F(this.chipFamily,this.chipRevision);let e,a=2048;this.logger.log("Uploading stub...");for(let e of["text","data"])if(Object.keys(t).includes(e)){let s=t[e+"_start"],i=t[e].length,r=Math.floor((i+a-1)/a);await this.memBegin(i,r,a,s);for(let s of Array(r).keys()){let r=s*a,n=r+a;n>i&&(n=i),await this.memBlock(t[e].slice(r,n),s)}}this.logger.log("Running stub..."),await this.memFinish(t.entry);const s=await this.readPacket(500);if(e=String.fromCharCode(...s),"OHAI"!=e)throw new Error("Failed to start stub. Unexpected response: "+e);this.logger.log("Stub is now running...");const i=new Le(this.port,this.logger,this);return await i.detectFlashSize(),i}async writeToStream(t){const e=this.port.writable.getWriter();await e.write(new Uint8Array(t));try{e.releaseLock()}catch(t){console.error("Ignoring release lock error",t)}}async disconnect(){this._parent?await this._parent.disconnect():(await this.port.writable.getWriter().close(),await new Promise(t=>{this._reader||t(void 0),this.addEventListener("disconnect",t,{once:!0}),this._reader.cancel()}),this.connected=!1)}}class Le extends Pe{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,s,i){let r=await F(this.chipFamily,this.chipRevision),n=i,h=i+t;console.log(n,h),console.log(r.data_start,r.data.length,r.text_start,r.text.length);for(let[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(n<e&&h>t)throw new Error("Software loader is resident at "+a(t,8)+"-"+a(e,8)+". Can't load binary at overlapping address range "+a(n,8)+"-"+a(h,8)+". Try changing the binary loading address.")}async eraseFlash(){await this.checkCommand(208,[],0,S)}}const Ze=async t=>{const e=await navigator.serial.requestPort();return t.log("Connecting..."),await e.open({baudRate:r}),t.log("Connected successfully."),new Pe(e,t)};export{o as CHIP_FAMILY_ESP32,f as CHIP_FAMILY_ESP32C2,u as CHIP_FAMILY_ESP32C3,c as CHIP_FAMILY_ESP32C5,g as CHIP_FAMILY_ESP32C6,p as CHIP_FAMILY_ESP32C61,m as CHIP_FAMILY_ESP32H2,w as CHIP_FAMILY_ESP32P4,_ as CHIP_FAMILY_ESP32S2,d as CHIP_FAMILY_ESP32S3,l as CHIP_FAMILY_ESP8266,Pe as ESPLoader,Ze as connect};
package/js/script.js CHANGED
@@ -16,6 +16,7 @@ const autoscroll = document.getElementById("autoscroll");
16
16
  const lightSS = document.getElementById("light");
17
17
  const darkSS = document.getElementById("dark");
18
18
  const darkMode = document.getElementById("darkmode");
19
+ const debugMode = document.getElementById("debugmode");
19
20
  const firmware = document.querySelectorAll(".upload .firmware input");
20
21
  const progress = document.querySelectorAll(".upload .progress-bar");
21
22
  const offsets = document.querySelectorAll(".upload .offset");
@@ -44,6 +45,7 @@ document.addEventListener("DOMContentLoaded", () => {
44
45
  autoscroll.addEventListener("click", clickAutoscroll);
45
46
  baudRate.addEventListener("change", changeBaudRate);
46
47
  darkMode.addEventListener("click", clickDarkMode);
48
+ debugMode.addEventListener("click", clickDebugMode);
47
49
  window.addEventListener("error", function (event) {
48
50
  console.log("Got an uncaught error: ", event.error);
49
51
  });
@@ -82,6 +84,10 @@ function logMsg(text) {
82
84
  }
83
85
 
84
86
  function debugMsg(...args) {
87
+ if (!debugMode.checked) {
88
+ return;
89
+ }
90
+
85
91
  function getStackTrace() {
86
92
  let stack = new Error().stack;
87
93
  //console.log(stack);
@@ -199,6 +205,13 @@ async function clickConnect() {
199
205
  espStub = await esploader.runStub();
200
206
  toggleUIConnected(true);
201
207
  toggleUIToolbar(true);
208
+
209
+ // Set the selected baud rate
210
+ let baud = parseInt(baudRate.value);
211
+ if (baudRates.includes(baud)) {
212
+ await espStub.setBaudrate(baud);
213
+ }
214
+
202
215
  espStub.addEventListener("disconnect", () => {
203
216
  toggleUIConnected(false);
204
217
  espStub = false;
@@ -240,6 +253,15 @@ async function clickDarkMode() {
240
253
  saveSetting("darkmode", darkMode.checked);
241
254
  }
242
255
 
256
+ /**
257
+ * @name clickDebugMode
258
+ * Change handler for the Debug Mode checkbox.
259
+ */
260
+ async function clickDebugMode() {
261
+ saveSetting("debugmode", debugMode.checked);
262
+ logMsg("Debug mode " + (debugMode.checked ? "enabled" : "disabled"));
263
+ }
264
+
243
265
  /**
244
266
  * @name clickErase
245
267
  * Click handler for the erase button.
@@ -420,6 +442,7 @@ function loadAllSettings() {
420
442
  autoscroll.checked = loadSetting("autoscroll", true);
421
443
  baudRate.value = loadSetting("baudrate", 1500000);
422
444
  darkMode.checked = loadSetting("darkmode", false);
445
+ debugMode.checked = loadSetting("debugmode", true);
423
446
  }
424
447
 
425
448
  function loadSetting(setting, defaultValue) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tasmota-webserial-esptool",
3
- "version": "6.4.1",
3
+ "version": "6.5.1",
4
4
  "description": "Flash ESP devices using WebSerial",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
package/src/const.ts CHANGED
@@ -176,6 +176,7 @@ export const ESP32H2_BOOTLOADER_FLASH_OFFSET = 0x0;
176
176
 
177
177
  export const ESP32P4_SPI_REG_BASE = 0x5008d000;
178
178
  export const ESP32P4_BASEFUSEADDR = 0x5012d000;
179
+ export const ESP32P4_EFUSE_BLOCK1_ADDR = ESP32P4_BASEFUSEADDR + 0x044;
179
180
  export const ESP32P4_MACFUSEADDR = 0x5012d000 + 0x044;
180
181
  export const ESP32P4_SPI_USR_OFFS = 0x18;
181
182
  export const ESP32P4_SPI_USR1_OFFS = 0x1c;
@@ -204,6 +205,8 @@ export const SYNC_PACKET = toByteArray(
204
205
  "\x07\x07\x12 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU",
205
206
  );
206
207
  export const CHIP_DETECT_MAGIC_REG_ADDR = 0x40001000;
208
+
209
+ // Image Chip IDs (used by ESP32-C3 and later for chip detection)
207
210
  // These values for the families are made up; nothing that esptool uses.
208
211
  export const CHIP_FAMILY_ESP8266 = 0x8266;
209
212
  export const CHIP_FAMILY_ESP32 = 0x32;
@@ -229,6 +232,22 @@ export type ChipFamily =
229
232
  | typeof CHIP_FAMILY_ESP32H2
230
233
  | typeof CHIP_FAMILY_ESP32P4;
231
234
 
235
+ interface ChipIdInfo {
236
+ name: string;
237
+ family: ChipFamily;
238
+ }
239
+
240
+ export const CHIP_ID_TO_INFO: { [chipId: number]: ChipIdInfo } = {
241
+ 5: { name: "ESP32-C3", family: CHIP_FAMILY_ESP32C3 },
242
+ 9: { name: "ESP32-S3", family: CHIP_FAMILY_ESP32S3 },
243
+ 12: { name: "ESP32-C2", family: CHIP_FAMILY_ESP32C2 },
244
+ 13: { name: "ESP32-C6", family: CHIP_FAMILY_ESP32C6 },
245
+ 16: { name: "ESP32-H2", family: CHIP_FAMILY_ESP32H2 },
246
+ 17: { name: "ESP32-C5", family: CHIP_FAMILY_ESP32C5 },
247
+ 18: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 },
248
+ 20: { name: "ESP32-C61", family: CHIP_FAMILY_ESP32C61 },
249
+ };
250
+
232
251
  interface ChipInfo {
233
252
  [magicValue: number]: {
234
253
  name: string;
@@ -259,6 +278,8 @@ export const CHIP_DETECT_MAGIC_VALUES: ChipInfo = {
259
278
  0x7211606f: { name: "ESP32-C61", family: CHIP_FAMILY_ESP32C61 },
260
279
  0x97e30068: { name: "ESP32-H2", family: CHIP_FAMILY_ESP32H2 },
261
280
  0xd7b73e80: { name: "ESP32-H2", family: CHIP_FAMILY_ESP32H2 },
281
+ // ESP32-P4 old revisions (< Rev. 300) - use magic value detection
282
+ // Rev. 300+ uses IMAGE_CHIP_ID detection instead
262
283
  0x0: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 },
263
284
  0x7039ad9: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 },
264
285
  0x0addbad0: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 },
@@ -282,6 +303,7 @@ export const ESP_SPI_SET_PARAMS = 0x0b;
282
303
  export const ESP_SPI_ATTACH = 0x0d;
283
304
  export const ESP_CHANGE_BAUDRATE = 0x0f;
284
305
  export const ESP_SPI_FLASH_MD5 = 0x13;
306
+ export const ESP_GET_SECURITY_INFO = 0x14;
285
307
  export const ESP_CHECKSUM_MAGIC = 0xef;
286
308
  export const ESP_FLASH_DEFL_BEGIN = 0x10;
287
309
  export const ESP_FLASH_DEFL_DATA = 0x11;
package/src/esp_loader.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="@types/w3c-web-serial" />
2
+
1
3
  import {
2
4
  CHIP_FAMILY_ESP32,
3
5
  CHIP_FAMILY_ESP32S2,
@@ -26,6 +28,7 @@ import {
26
28
  ESP_WRITE_REG,
27
29
  ESP_SPI_ATTACH,
28
30
  ESP_SYNC,
31
+ ESP_GET_SECURITY_INFO,
29
32
  FLASH_SECTOR_SIZE,
30
33
  FLASH_WRITE_SIZE,
31
34
  STUB_FLASH_WRITE_SIZE,
@@ -48,6 +51,8 @@ import {
48
51
  DETECTED_FLASH_SIZES,
49
52
  CHIP_DETECT_MAGIC_REG_ADDR,
50
53
  CHIP_DETECT_MAGIC_VALUES,
54
+ CHIP_ID_TO_INFO,
55
+ ESP32P4_EFUSE_BLOCK1_ADDR,
51
56
  SlipReadError,
52
57
  } from "./const";
53
58
  import { getStubCode } from "./stubs";
@@ -59,6 +64,8 @@ import { pack, unpack } from "./struct";
59
64
  export class ESPLoader extends EventTarget {
60
65
  chipFamily!: ChipFamily;
61
66
  chipName: string | null = null;
67
+ chipRevision: number | null = null;
68
+ chipVariant: string | null = null;
62
69
  _efuses = new Array(4).fill(0);
63
70
  _flashsize = 4 * 1024 * 1024;
64
71
  debug = false;
@@ -91,7 +98,64 @@ export class ESPLoader extends EventTarget {
91
98
  }
92
99
  await this.sync();
93
100
 
94
- // Determine chip family and name
101
+ // Detect chip type
102
+ await this.detectChip();
103
+
104
+ // Read the OTP data for this chip and store into this.efuses array
105
+ let FlAddr = getSpiFlashAddresses(this.getChipFamily());
106
+ let AddrMAC = FlAddr.macFuse;
107
+ for (let i = 0; i < 4; i++) {
108
+ this._efuses[i] = await this.readRegister(AddrMAC + 4 * i);
109
+ }
110
+ this.logger.log(`Chip type ${this.chipName}`);
111
+ //this.logger.log("FLASHID");
112
+ }
113
+
114
+ /**
115
+ * Detect chip type using GET_SECURITY_INFO (for newer chips) or magic value (for older chips)
116
+ */
117
+ async detectChip() {
118
+ try {
119
+ // Try GET_SECURITY_INFO command first (ESP32-C3 and later)
120
+ const securityInfo = await this.getSecurityInfo();
121
+ const chipId = securityInfo.chipId;
122
+
123
+ const chipInfo = CHIP_ID_TO_INFO[chipId];
124
+ if (chipInfo) {
125
+ this.chipName = chipInfo.name;
126
+ this.chipFamily = chipInfo.family;
127
+
128
+ // Get chip revision for ESP32-P4
129
+ if (this.chipFamily === CHIP_FAMILY_ESP32P4) {
130
+ this.chipRevision = await this.getChipRevision();
131
+ this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`);
132
+
133
+ // Set chip variant based on revision
134
+ if (this.chipRevision >= 300) {
135
+ this.chipVariant = "rev300";
136
+ } else {
137
+ this.chipVariant = "rev0";
138
+ }
139
+ this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`);
140
+ }
141
+
142
+ this.logger.debug(
143
+ `Detected chip via IMAGE_CHIP_ID: ${chipId} (${this.chipName})`,
144
+ );
145
+ return;
146
+ }
147
+
148
+ this.logger.debug(
149
+ `Unknown IMAGE_CHIP_ID: ${chipId}, falling back to magic value detection`,
150
+ );
151
+ } catch (err) {
152
+ // GET_SECURITY_INFO not supported, fall back to magic value detection
153
+ this.logger.debug(
154
+ `GET_SECURITY_INFO failed, using magic value detection: ${err}`,
155
+ );
156
+ }
157
+
158
+ // Fallback: Use magic value detection for ESP8266, ESP32, ESP32-S2, and ESP32-P4 RC versions
95
159
  let chipMagicValue = await this.readRegister(CHIP_DETECT_MAGIC_REG_ADDR);
96
160
  let chip = CHIP_DETECT_MAGIC_VALUES[chipMagicValue >>> 0];
97
161
  if (chip === undefined) {
@@ -105,14 +169,94 @@ export class ESPLoader extends EventTarget {
105
169
  this.chipName = chip.name;
106
170
  this.chipFamily = chip.family;
107
171
 
108
- // Read the OTP data for this chip and store into this.efuses array
109
- let FlAddr = getSpiFlashAddresses(this.getChipFamily());
110
- let AddrMAC = FlAddr.macFuse;
111
- for (let i = 0; i < 4; i++) {
112
- this._efuses[i] = await this.readRegister(AddrMAC + 4 * i);
172
+ // For ESP32-P4 detected via magic value (old revisions), set variant
173
+ if (this.chipFamily === CHIP_FAMILY_ESP32P4) {
174
+ this.chipRevision = await this.getChipRevision();
175
+ this.logger.debug(`ESP32-P4 revision: ${this.chipRevision}`);
176
+
177
+ if (this.chipRevision >= 300) {
178
+ this.chipVariant = "rev300";
179
+ } else {
180
+ this.chipVariant = "rev0";
181
+ }
182
+ this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`);
113
183
  }
114
- this.logger.log(`Chip type ${this.chipName}`);
115
- //this.logger.log("FLASHID");
184
+
185
+ this.logger.debug(
186
+ `Detected chip via magic value: ${toHex(chipMagicValue >>> 0, 8)} (${this.chipName})`,
187
+ );
188
+ }
189
+
190
+ /**
191
+ * Get chip revision for ESP32-P4
192
+ */
193
+ async getChipRevision(): Promise<number> {
194
+ if (this.chipFamily !== CHIP_FAMILY_ESP32P4) {
195
+ return 0;
196
+ }
197
+
198
+ // Read from EFUSE_BLOCK1 to get chip revision
199
+ // Word 2 contains revision info for ESP32-P4
200
+ const word2 = await this.readRegister(ESP32P4_EFUSE_BLOCK1_ADDR + 8);
201
+
202
+ // Minor revision: bits [3:0]
203
+ const minorRev = word2 & 0x0f;
204
+
205
+ // Major revision: bits [23] << 2 | bits [5:4]
206
+ const majorRev = (((word2 >> 23) & 1) << 2) | ((word2 >> 4) & 0x03);
207
+
208
+ // Revision is major * 100 + minor
209
+ return majorRev * 100 + minorRev;
210
+ }
211
+
212
+ /**
213
+ * Get security info including chip ID (ESP32-C3 and later)
214
+ */
215
+ async getSecurityInfo(): Promise<{
216
+ flags: number;
217
+ flashCryptCnt: number;
218
+ keyPurposes: number[];
219
+ chipId: number;
220
+ apiVersion: number;
221
+ }> {
222
+ const [_, responseData] = await this.checkCommand(
223
+ ESP_GET_SECURITY_INFO,
224
+ [],
225
+ 0,
226
+ );
227
+
228
+ // Some chips/ROM versions return empty response or don't support this command
229
+ if (responseData.length === 0) {
230
+ throw new Error(
231
+ `GET_SECURITY_INFO not supported or returned empty response`,
232
+ );
233
+ }
234
+
235
+ if (responseData.length < 12) {
236
+ throw new Error(
237
+ `Invalid security info response length: ${responseData.length} (expected at least 12 bytes)`,
238
+ );
239
+ }
240
+
241
+ const flags = unpack("<I", responseData.slice(0, 4))[0];
242
+ const flashCryptCnt = responseData[4];
243
+ const keyPurposes = Array.from(responseData.slice(5, 12));
244
+ const chipId =
245
+ responseData.length >= 16
246
+ ? unpack("<I", responseData.slice(12, 16))[0]
247
+ : 0;
248
+ const apiVersion =
249
+ responseData.length >= 20
250
+ ? unpack("<I", responseData.slice(16, 20))[0]
251
+ : 0;
252
+
253
+ return {
254
+ flags,
255
+ flashCryptCnt,
256
+ keyPurposes,
257
+ chipId,
258
+ apiVersion,
259
+ };
116
260
  }
117
261
 
118
262
  /**
@@ -318,7 +462,11 @@ export class ESPLoader extends EventTarget {
318
462
  ) {
319
463
  statusLen = 4;
320
464
  } else {
321
- if ([2, 4].includes(data.length)) {
465
+ // When chipFamily is not yet set (e.g., during GET_SECURITY_INFO in detectChip),
466
+ // assume modern chips use 4-byte status
467
+ if (opcode === ESP_GET_SECURITY_INFO) {
468
+ statusLen = 4;
469
+ } else if ([2, 4].includes(data.length)) {
322
470
  statusLen = data.length;
323
471
  }
324
472
  }
@@ -520,6 +668,8 @@ export class ESPLoader extends EventTarget {
520
668
  } else {
521
669
  await this.reconfigurePort(baud);
522
670
  }
671
+
672
+ this.logger.log(`Changed baud rate to ${baud}`);
523
673
  }
524
674
 
525
675
  async reconfigurePort(baud: number) {
@@ -536,8 +686,6 @@ export class ESPLoader extends EventTarget {
536
686
 
537
687
  // Restart Readloop
538
688
  this.readLoop();
539
-
540
- this.logger.log(`Changed baud rate to ${baud}`);
541
689
  } catch (e) {
542
690
  console.error(e);
543
691
  throw new Error(`Unable to change the baud rate to ${baud}: ${e}`);
@@ -1105,7 +1253,10 @@ export class ESPLoader extends EventTarget {
1105
1253
  }
1106
1254
 
1107
1255
  async runStub(): Promise<EspStubLoader> {
1108
- const stub: Record<string, any> = await getStubCode(this.chipFamily);
1256
+ const stub: Record<string, any> = await getStubCode(
1257
+ this.chipFamily,
1258
+ this.chipRevision,
1259
+ );
1109
1260
 
1110
1261
  // We're transferring over USB, right?
1111
1262
  let ramBlock = USB_RAM_BLOCK;
@@ -1192,7 +1343,7 @@ class EspStubLoader extends ESPLoader {
1192
1343
  blocksize: number,
1193
1344
  offset: number,
1194
1345
  ): Promise<any> {
1195
- let stub = await getStubCode(this.chipFamily);
1346
+ let stub = await getStubCode(this.chipFamily, this.chipRevision);
1196
1347
  let load_start = offset;
1197
1348
  let load_end = offset + size;
1198
1349
  console.log(load_start, load_end);
package/src/index.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="@types/w3c-web-serial" />
2
+
1
3
  import { ESP_ROM_BAUD, Logger } from "./const";
2
4
  import { ESPLoader } from "./esp_loader";
3
5