(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const c of s)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const c={};return s.integrity&&(c.integrity=s.integrity),s.referrerPolicy&&(c.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?c.credentials="include":s.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function o(s){if(s.ep)return;s.ep=!0;const c=a(s);fetch(s.href,c)}})();const Qe=new Worker(new URL("/assets/db-worker-DFFhVJkA.js",import.meta.url),{type:"module"});let pr=0,Ae=null;const et=new Map;function On(){return Ae||(Ae=new Promise((e,r)=>{Qe.onmessage=o=>{const s=o.data;if(s.type==="ready")return;const c=et.get(s.id);c&&(et.delete(s.id),s.type=="success"?c.resolve(s.data):c.reject(new Error(s.error??s.message??"Неизвестная ошибка Worker")))},Qe.onerror=o=>{console.error("[SQLite Worker] Ошибка:",o),r(new Error("Ошибка Worker"))};const a=++pr;et.set(a,{resolve:e,reject:r}),Qe.postMessage({type:"start",id:a})}),Ae)}function hr(e,r){return new Promise((a,o)=>{if(!Qe){o(new Error("Worker не создан"));return}const s=++pr;et.set(s,{resolve:a,reject:o}),Qe.postMessage({type:e,id:s,...r})})}async function ie(e,r){return await hr("query",{sql:e,params:r??[]})}async function wr(e,r){await hr("command",{sql:e,params:r??[]})}function gr(e){return new Date(e*1e3)}function Jn(){return Math.floor(Date.now()/1e3)}function Kn(e){const r=gr(e),a=String(r.getDate()).padStart(2,"0"),o=String(r.getMonth()+1).padStart(2,"0");return`${a}.${o}.${r.getFullYear()}`}function Dn(e){const r=gr(e),a=String(r.getHours()).padStart(2,"0"),o=String(r.getMinutes()).padStart(2,"0");return`${Kn(e)} ${a}:${o}`}function Xn(e){if(e==null)return[];const r=String(e).trim();return r?r.split(/[,\s;]+/).map(a=>a.trim()).filter(a=>a.length>0):[]}function zn(e){const r=new Map;if(e==null)return r;const a=String(e);if(!a)return r;const o=a.split("");for(let s=0;s+10?`WHERE ${r.join(" AND ")}`:"",params:a}}async function Bn(e={}){const{clause:r,params:a}=vr(e),s=(await ie(`SELECT COUNT(*) as cnt FROM words ${r}`,a))[0]?.cnt;return typeof s=="number"?s:Number(s??0)}async function tr(e={}){const{clause:r,params:a}=vr(e),o=Math.max(1,Math.min(e.limit??50,500)),s=Math.max(0,e.offset??0);return(await ie(`SELECT id, key, value, tags, more, group_id FROM words ${r} ORDER BY id LIMIT ? OFFSET ?`,[...a,o,s])).map(mr)}async function Vn(){return(await ie("SELECT id, name FROM word_groups ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??"")}))}async function Yn(){return(await ie("SELECT id, name, forward, backward, filter FROM decks ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??""),forward:String(r.forward??""),backward:String(r.backward??""),filter:String(r.filter??"")}))}async function Zn(e,r){return await wr("UPDATE decks SET forward = ?, backward = ?, filter = ? WHERE id = ?",[r.forward,r.backward,r.filter,e]),nt(e)}async function nt(e){const a=(await ie("SELECT id, name, forward, backward, filter FROM decks WHERE id = ? LIMIT 1",[e]))[0];return a?{id:Number(a.id),name:String(a.name??""),forward:String(a.forward??""),backward:String(a.backward??""),filter:String(a.filter??"")}:null}async function Gn(){const e=await ie("SELECT deck_id, COUNT(*) as cnt FROM states WHERE deck_id IS NOT NULL GROUP BY deck_id"),r=new Map;for(const a of e){if(a.deck_id==null)continue;const o=a.cnt;r.set(Number(a.deck_id),typeof o=="number"?o:Number(o??0))}return r}async function jn(e){const a=(await ie("SELECT COUNT(DISTINCT word_id) as cnt FROM states WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function rr(e){const r=new Map,a=[...new Set(e.filter(s=>Number.isFinite(s)))];if(a.length===0)return r;const o=400;for(let s=0;s"?").join(","),h=await ie(`SELECT id, key, value, tags, more, group_id FROM words WHERE id IN (${u})`,c);for(const v of h.map(mr))r.set(v.id,v)}return r}function Wn(e,r){const a=new Map;a.set("key",e.key),a.set("value",e.value),a.set("tags",e.tagsList.join(", "));for(const o of r){const s=e.more.get(o.id)??"";if(s)for(const c of[o.identifier,o.name]){const u=c.trim().toLowerCase();!u||a.has(u)||a.set(u,s)}}return a}function nr(e,r){const a=[];for(const o of e.split(/\s+/)){const s=o.trim().toLowerCase();if(!s)continue;const c=(r.get(s)??"").trim();c&&a.push(c)}return a}async function ar(e,r){const o=(await ie("SELECT DISTINCT word_id as word_id FROM states WHERE deck_id = ?",[e])).map(s=>Number(s.word_id)).filter(s=>Number.isFinite(s));for(let s=o.length-1;s>0;s--){const c=Math.floor(Math.random()*(s+1));[o[s],o[c]]=[o[c],o[s]]}return o}async function yr(){return(await ie("SELECT id, name, identifier FROM custom_fields ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??""),identifier:String(r.identifier??"")}))}async function An(e,r){const o=(await ie("SELECT score FROM states WHERE deck_id = ? AND word_id = ? ORDER BY id DESC LIMIT 1",[e,r]))[0];if(!o||o.score==null)return null;const s=Number(o.score);return Number.isFinite(s)?s:null}async function ea(e){await wr("INSERT INTO history (deck_id, word_id, timestamp, answer, before, after, fsrs) VALUES (?, ?, ?, ?, ?, ?, 0)",[e.deckId,e.wordId,Jn(),e.answer,e.before,e.after])}async function ta(e){const a=(await ie("SELECT COUNT(*) as cnt FROM history WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function ra(e,r={}){const a=Math.max(1,Math.min(r.limit??50,500)),o=Math.max(0,r.offset??0);return(await ie(`SELECT h.id, h.deck_id, h.word_id, h.timestamp, h.answer, h.before, h.after, h.fsrs, w.key as wkey, w.value as wvalue FROM history h LEFT JOIN words w ON w.id = h.word_id WHERE h.deck_id = ? ORDER BY h.timestamp DESC, h.id DESC LIMIT ? OFFSET ?`,[e,a,o])).map(c=>({id:Number(c.id),deck_id:Number(c.deck_id),word_id:Number(c.word_id),timestamp:Number(c.timestamp??0),answer:Number(c.answer??0),before:Number(c.before??0),after:Number(c.after??0),fsrs:Number(c.fsrs??0),wordKey:c.wkey==null?"":String(c.wkey),wordValue:c.wvalue==null?"":String(c.wvalue)}))}const Ut="japanese_app.db";async function xt(){return navigator.storage.getDirectory()}async function na(e){e[18]=1,e[19]=1;const a=await(await xt()).getFileHandle(Ut,{create:!0}),o=a.createSyncAccessHandle;if(typeof o=="function")try{const c=await o.call(a);try{c.truncate(0),c.write(e,{at:0}),c.flush()}finally{c.close()}return}catch{}const s=await a.createWritable();try{await s.truncate(0);const c=new Uint8Array(e.length);c.set(e),await s.write(c)}finally{await s.close()}}async function aa(){const e=await xt();let r;try{r=await e.getFileHandle(Ut)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const a=await r.getFile();if(a.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await a.arrayBuffer())}async function Oe(){try{return(await(await(await xt()).getFileHandle(Ut)).getFile()).size>0}catch{return!1}}var sa=ArrayBuffer,G=Uint8Array,tt=Uint16Array,ia=Int16Array,at=Int32Array,mt=function(e,r,a){if(G.prototype.slice)return G.prototype.slice.call(e,r,a);(r==null||r<0)&&(r=0),(a==null||a>e.length)&&(a=e.length);var o=new G(a-r);return o.set(e.subarray(r,a)),o},Ie=function(e,r,a,o){if(G.prototype.fill)return G.prototype.fill.call(e,r,a,o);for((a==null||a<0)&&(a=0),(o==null||o>e.length)&&(o=e.length);ae.length)&&(o=e.length);a2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],A=function(e,r,a){var o=new Error(r||ca[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,A),!a)throw o;return o},sr=function(e,r,a){for(var o=0,s=0;o>>0},ua=function(e,r){var a=e[0]|e[1]<<8|e[2]<<16;if(a==3126568&&e[3]==253){var o=e[4],s=o>>5&1,c=o>>2&1,u=o&3,h=o>>6;o&8&&A(0);var v=6-s,p=u==3?4:u,y=sr(e,v,p);v+=p;var C=h?1<>3);E=$+($>>3)*(e[5]&7)}E>2145386496&&A(1);var w=new G((r==1?k||E:r?0:E)+12);return w[0]=1,w[4]=4,w[8]=8,{b:v+C,y:0,l:0,d:y,w:r&&r!=1?r:w.subarray(12),e:E,o:new at(w.buffer,0,3),u:k,c,m:Math.min(131072,E)}}else if((a>>4|e[3]<<20)==25481893)return la(e,4)+8;A(0)},Ce=function(e){for(var r=0;1<a&&A(3);for(var c=1<0;){var O=Ce(u+1),H=o>>3,z=(1<>(o&7)&z,x=(1<x&&(R-=F)),k[++h]=--R,R==-1?(u+=R,U[--y]=h):u-=R,!R)do{var q=o>>3;v=(e[q]|e[q+1]<<8)>>(o&7)&3,o+=2,h+=v}while(v==3)}(h>255||u)&&A(0);for(var X=0,j=(c>>1)+(c>>3)+3,V=c-1,B=0;B<=h;++B){var L=k[B];if(L<1){E[B]=-L;continue}for(p=0;p=y)}}for(X&&A(0),p=0;p>3,{b:s,s:U,n:I,t:$}]},da=function(e,r){var a=0,o=-1,s=new G(292),c=e[r],u=s.subarray(0,256),h=s.subarray(256,268),v=new tt(s.buffer,268);if(c<128){var p=Je(e,r+1,6),y=p[0],C=p[1];r+=c;var k=y<<3,E=e[r];E||A(0);for(var $=0,w=0,U=C.b,I=U,O=(++r<<3)-8+Ce(E);O-=U,!(O>3;if($+=(e[H]|e[H+1]<<8)>>(O&7)&(1<>3,w+=(e[H]|e[H+1]<<8)>>(O&7)&(1<255&&A(0)}else{for(o=c-127;a>4,u[a+1]=z&15}++r}var R=0;for(a=0;a11&&A(0),R+=x&&1<0;--a){var B=v[a];Ie(V,a,B,v[a-1]=B+h[a]*(1<h&&C>3,E=(e[k]|e[k+1]<<8|e[k+2]<<16)>>(y&7);v=(v<>2,u=c<<1,h=c+u;Re(e.subarray(o,o+=e[0]|e[1]<<8),r.subarray(0,c),a),Re(e.subarray(o,o+=e[2]|e[3]<<8),r.subarray(c,u),a),Re(e.subarray(o,o+=e[4]|e[5]<<8),r.subarray(u,h),a),Re(e.subarray(o),r.subarray(h),a)},va=function(e,r,a){var o,s=r.b,c=e[s],u=c>>1&3;r.l=c&1;var h=c>>3|e[s+1]<<5|e[s+2]<<13,v=(s+=3)+h;if(u==1)return s>=e.length?void 0:(r.b=s+1,a?(Ie(a,e[s],r.y,r.y+=h),a):Ie(new G(h),e[s]));if(!(v>e.length)){if(u==0)return r.b=v,a?(a.set(e.subarray(s,v),r.y),r.y+=h,a):mt(e,s,v);if(u==2){var p=e[s],y=p&3,C=p>>2&3,k=p>>4,E=0,$=0;y<2?C&1?k|=e[++s]<<4|(C&2&&e[++s]<<12):k=p>>3:($=C,C<2?(k|=(e[++s]&63)<<4,E=e[s]>>6|e[++s]<<2):C==2?(k|=e[++s]<<4|(e[++s]&3)<<12,E=e[s]>>2|e[++s]<<6):(k|=e[++s]<<4|(e[++s]&63)<<12,E=e[s]>>6|e[++s]<<2|e[++s]<<10)),++s;var w=a?a.subarray(r.y,r.y+r.m):new G(r.m),U=w.length-k;if(y==0)w.set(e.subarray(s,s+=k),U);else if(y==1)Ie(w,e[s++],U);else{var I=r.h;if(y==2){var O=da(e,s);E+=s-(s=O[0]),r.h=I=O[1]}else I||A(0);($?ma:Re)(e.subarray(s,s+=E),w.subarray(U),I)}var H=e[s++];if(H){H==255?H=(e[s++]|e[s++]<<8)+32512:H>127&&(H=H-128<<8|e[s++]);var z=e[s++];z&3&&A(0);for(var R=[pa,ha,fa],x=2;x>-1;--x){var F=z>>(x<<1)+2&3;if(F==1){var Q=new G([0,0,e[s++]]);R[x]={s:Q.subarray(2,3),n:Q.subarray(0,1),t:new tt(Q.buffer,0,1),b:0}}else F==2?(o=Je(e,s,9-(x&1)),s=o[0],R[x]=o[1]):F==3&&(r.t||A(0),R[x]=r.t[x])}var q=r.t=R,X=q[0],j=q[1],V=q[2],B=e[v-1];B||A(0);var L=(v<<3)-8+Ce(B)-V.b,b=L>>3,S=0,T=(e[b]|e[b+1]<<8)>>(L&7)&(1<>3;var P=(e[b]|e[b+1]<<8)>>(L&7)&(1<>3;var J=(e[b]|e[b+1]<<8)>>(L&7)&(1<>3;var ve=1<>>(L&7)&ve-1);b=(L-=Et[xe])>>3;var oe=ga[xe]+((e[b]|e[b+1]<<8|e[b+2]<<16)>>(L&7)&(1<>3;var we=wa[he]+((e[b]|e[b+1]<<8|e[b+2]<<16)>>(L&7)&(1<>3,T=V.t[T]+((e[b]|e[b+1]<<8)>>(L&7)&(1<>3,J=X.t[J]+((e[b]|e[b+1]<<8)>>(L&7)&(1<>3,P=j.t[P]+((e[b]|e[b+1]<<8)>>(L&7)&(1<3)r.o[2]=r.o[1],r.o[1]=r.o[0],r.o[0]=ne-=3;else{var $e=ne-(we!=0);$e?(ne=$e==3?r.o[0]-1:r.o[$e],$e>1&&(r.o[2]=r.o[1]),r.o[1]=r.o[0],r.o[0]=ne):ne=r.o[0]}for(var x=0;xoe&&(ae=oe);for(var x=0;x{throw t},o,s=console.log.bind(console),c=console.error.bind(console),u,h=!1,v,p=n=>n.startsWith("file://"),y=!1;function C(){return je.buffer}function k(){if(!Q?.buffer?.resizable){var n=C();Q=new Int8Array(n),ze=new Int16Array(n),r.HEAPU8=T=new Uint8Array(n),Te=new Uint16Array(n),Be=new Int32Array(n),J=new Uint32Array(n),It=new Float32Array(n),Ot=new Float64Array(n),St=new BigInt64Array(n),Tt=new BigUint64Array(n)}}function E(){y=!0,_e.A()}function $(n){n=`Aborted(${n})`,c(n),h=!0,n+=". Build with -sASSERTIONS for more info.",y&&Bt();var t=new WebAssembly.RuntimeError(n);throw t}var w;let U=()=>"";function I(n){if(n==w&&u)return new Uint8Array(u);throw"both async and sync fetching of the wasm failed"}async function O(n){if(!u)try{var t=await o(n);return new Uint8Array(t)}catch{}return I(n)}async function H(n,t){try{var i=await O(n),l=await WebAssembly.instantiate(i,t);return l}catch(d){c(`failed to asynchronously prepare wasm: ${d}`),$(d)}}async function z(n,t,i){if(!n&&!p(t))try{var l=fetch(t,{credentials:"same-origin"}),d=await WebAssembly.instantiateStreaming(l,i);return d}catch(f){c(`wasm streaming compile failed: ${f}`),c("falling back to ArrayBuffer instantiation")}return H(t,i)}function R(){var n={a:Qn};return n}async function x(){function n(f){return _e=f.exports,Rn(_e),k(),_e}function t(f){return n(f.instance)}var i=R();w??=U();var l=await z(u,w,i),d=t(l);return d}class F{name="ExitStatus";constructor(t){this.message=`Program terminated with exit(${t})`,this.status=t}}var Q,q=()=>Wt,X=n=>{var t=n.getArg(q(),0);return Gt(t)},j=()=>Zt(),V=n=>Vt(n),B=n=>Yt(n),L=globalThis.TextDecoder&&new TextDecoder,b=(n,t,i,l)=>{var d=t+i;if(l)return d;for(;n[t]&&!(t>=d);)++t;return t},S=(n,t=0,i,l)=>{var d=b(n,t,i,l);if(d-t>16&&n.buffer&&L)return L.decode(n.subarray(t,d));for(var f="";t>10,56320|N&1023)}}return f},T,P=(n,t,i)=>n?S(T,n,t,i):"",J,he=n=>{var t=j(),i=B(4),l=B(4);jt(n,i,l);var d=J[i>>2],f=J[l>>2],g=P(d);pe(d);var m;return f&&(m=P(f),pe(f)),V(t),[g,m]},ue=n=>{var t=X(n);return he(t)},xe=n=>{var t=new WebAssembly.Exception(q(),[n],{traceStack:!0});throw t.message=ue(t),t},Xe=()=>$(""),be={},Me=n=>{for(;n.length;){var t=n.pop(),i=n.pop();i(t)}};function ve(n){return this.fromWireType(J[n>>2])}var ne={},oe={},we={};class $e extends Error{constructor(t){super(t),this.name="InternalError"}}var de=n=>{throw new $e(n)},ae=(n,t,i)=>{n.forEach(m=>we[m]=t);function l(m){var M=i(m);M.length!==n.length&&de("Mismatched type converter count");for(var N=0;N{d[m]=oe[M],++g,g===f.length&&l(d)}));f.length===0&&l(d)},st=n=>{var t=be[n];delete be[n];var i=t.rawConstructor,l=t.rawDestructor,d=t.fields,f=d.map(g=>g.getterReturnType).concat(d.map(g=>g.setterArgumentType));ae([n],f,g=>{var m={};for(var[M,N]of d.entries()){let _=g[M],Y=N.getter,D=N.getterContext,Z=g[M+d.length],ee=N.setter,se=N.setterContext;m[N.fieldName]={read:te=>_.fromWireType(Y(D,te)),write:(te,W)=>{var ye=[];ee(se,te,Z.toWireType(ye,W)),Me(ye)},optional:_.optional}}return[{name:t.name,fromWireType:_=>{var Y={};for(var D in m)Y[D]=m[D].read(_);return l(_),Y},toWireType:(_,Y)=>{for(var D in m)if(!(D in Y)&&!m[D].optional)throw new TypeError(`Missing field: "${D}"`);var Z=i();for(D in m)m[D].write(Z,Y[D]);return _!==null&&_.push(l,Z),Z},readValueFromPointer:ve,destructorFunction:l}]})},re=n=>{for(var t="";;){var i=T[n++];if(!i)return t;t+=String.fromCharCode(i)}};class Se extends Error{constructor(t){super(t),this.name="BindingError"}}var K=n=>{throw new Se(n)};function Sr(n,t,i={}){var l=t.name;if(n||K(`type "${l}" must have a positive integer typeid pointer`),oe.hasOwnProperty(n)){if(i.ignoreDuplicateRegistrations)return;K(`Cannot register type '${l}' twice`)}if(oe[n]=t,delete we[n],ne.hasOwnProperty(n)){var d=ne[n];delete ne[n],d.forEach(f=>f())}}function fe(n,t,i={}){return Sr(n,t,i)}var ze,Te,Be,St,Tt,Nt=(n,t,i)=>{switch(t){case 1:return i?l=>Q[l]:l=>T[l];case 2:return i?l=>ze[l>>1]:l=>Te[l>>1];case 4:return i?l=>Be[l>>2]:l=>J[l>>2];case 8:return i?l=>St[l>>3]:l=>Tt[l>>3];default:throw new TypeError(`invalid integer width (${t}): ${n}`)}},Tr=(n,t,i,l,d)=>{t=re(t);let f=l===0n,g=m=>m;if(f){let m=i*8;g=M=>BigInt.asUintN(m,M),d=g(d)}fe(n,{name:t,fromWireType:g,toWireType:(m,M)=>(typeof M=="number"&&(M=BigInt(M)),M),readValueFromPointer:Nt(t,i,!f),destructorFunction:null})},Nr=(n,t,i,l)=>{t=re(t),fe(n,{name:t,fromWireType:function(d){return!!d},toWireType:function(d,f){return f?i:l},readValueFromPointer:function(d){return this.fromWireType(T[d])},destructorFunction:null})},Lr=n=>({count:n.count,deleteScheduled:n.deleteScheduled,preservePointerOnDelete:n.preservePointerOnDelete,ptr:n.ptr,ptrType:n.ptrType,smartPtr:n.smartPtr,smartPtrType:n.smartPtrType}),it=n=>{function t(i){return i.$$.ptrType.registeredClass.name}K(t(n)+" instance already deleted")},ot=!1,Lt=n=>{},_r=n=>{n.smartPtr?n.smartPtrType.rawDestructor(n.smartPtr):n.ptrType.registeredClass.rawDestructor(n.ptr)},_t=n=>{n.count.value-=1;var t=n.count.value===0;t&&_r(n)},Ne=n=>globalThis.FinalizationRegistry?(ot=new FinalizationRegistry(t=>{_t(t.$$)}),Ne=t=>{var i=t.$$,l=!!i.smartPtr;if(l){var d={$$:i};ot.register(t,d,t)}return t},Lt=t=>ot.unregister(t),Ne(n)):(Ne=t=>t,n),Hr=()=>{let n=Ve.prototype;Object.assign(n,{isAliasOf(i){if(!(this instanceof Ve)||!(i instanceof Ve))return!1;var l=this.$$.ptrType.registeredClass,d=this.$$.ptr;i.$$=i.$$;for(var f=i.$$.ptrType.registeredClass,g=i.$$.ptr;l.baseClass;)d=l.upcast(d),l=l.baseClass;for(;f.baseClass;)g=f.upcast(g),f=f.baseClass;return l===f&&d===g},clone(){if(this.$$.ptr||it(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var i=Ne(Object.create(Object.getPrototypeOf(this),{$$:{value:Lr(this.$$)}}));return i.$$.count.value+=1,i.$$.deleteScheduled=!1,i},delete(){this.$$.ptr||it(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&K("Object already scheduled for deletion"),Lt(this),_t(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||it(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&K("Object already scheduled for deletion"),this.$$.deleteScheduled=!0,this}});let t=Symbol.dispose;t&&(n[t]=n.delete)};function Ve(){}var Ht=(n,t)=>Object.defineProperty(t,"name",{value:n}),qt={},ct=(n,t,i)=>{if(n[t].overloadTable===void 0){var l=n[t];n[t]=function(...d){return n[t].overloadTable.hasOwnProperty(d.length)||K(`Function '${i}' called with an invalid number of arguments (${d.length}) - expects one of (${n[t].overloadTable})!`),n[t].overloadTable[d.length].apply(this,d)},n[t].overloadTable=[],n[t].overloadTable[l.argCount]=l}},qr=(n,t,i)=>{r.hasOwnProperty(n)?(K(`Cannot register public name '${n}' twice`),ct(r,n,n),r[n].overloadTable.hasOwnProperty(i)&&K(`Cannot register multiple overloads of a function with the same number of arguments (${i})!`),r[n].overloadTable[i]=t):(r[n]=t,r[n].argCount=i)},Fr=48,Pr=57,Rr=n=>{n=n.replace(/[^a-zA-Z0-9_]/g,"$");var t=n.charCodeAt(0);return t>=Fr&&t<=Pr?`_${n}`:n};function Qr(n,t,i,l,d,f,g,m){this.name=n,this.constructor=t,this.instancePrototype=i,this.rawDestructor=l,this.baseClass=d,this.getActualType=f,this.upcast=g,this.downcast=m,this.pureVirtualFunctions=[]}var lt=(n,t,i)=>{for(;t!==i;)t.upcast||K(`Expected null or instance of ${i.name}, got an instance of ${t.name}`),n=t.upcast(n),t=t.baseClass;return n},ut=n=>{if(n===null)return"null";var t=typeof n;return t==="object"||t==="array"||t==="function"?n.toString():""+n};function Ir(n,t){if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),0;t.$$||K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=lt(t.$$.ptr,i,this.registeredClass);return l}function Or(n,t){var i;if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),this.isSmartPointer?(i=this.rawConstructor(),n!==null&&n.push(this.rawDestructor,i),i):0;(!t||!t.$$)&&K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&K(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var l=t.$$.ptrType.registeredClass;if(i=lt(t.$$.ptr,l,this.registeredClass),this.isSmartPointer)switch(t.$$.smartPtr===void 0&&K("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?i=t.$$.smartPtr:K(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:i=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)i=t.$$.smartPtr;else{var d=t.clone();i=this.rawShare(i,pt.toHandle(()=>d.delete())),n!==null&&n.push(this.rawDestructor,i)}break;default:K("Unsupported sharing policy")}return i}function Jr(n,t){if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),0;t.$$||K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&K(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=lt(t.$$.ptr,i,this.registeredClass);return l}var Ft=(n,t,i)=>{if(t===i)return n;if(i.baseClass===void 0)return null;var l=Ft(n,t,i.baseClass);return l===null?null:i.downcast(l)},Kr={},Dr=(n,t)=>{for(t===void 0&&K("ptr should not be undefined");n.baseClass;)t=n.upcast(t),n=n.baseClass;return t},Xr=(n,t)=>(t=Dr(n,t),Kr[t]),Ye=(n,t)=>{(!t.ptrType||!t.ptr)&&de("makeClassHandle requires ptr and ptrType");var i=!!t.smartPtrType,l=!!t.smartPtr;return i!==l&&de("Both smartPtrType and smartPtr must be specified"),t.count={value:1},Ne(Object.create(n,{$$:{value:t,writable:!0}}))};function zr(n){var t=this.getPointee(n);if(!t)return this.destructor(n),null;var i=Xr(this.registeredClass,t);if(i!==void 0){if(i.$$.count.value===0)return i.$$.ptr=t,i.$$.smartPtr=n,i.clone();var l=i.clone();return this.destructor(n),l}function d(){return this.isSmartPointer?Ye(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:n}):Ye(this.registeredClass.instancePrototype,{ptrType:this,ptr:n})}var f=this.registeredClass.getActualType(t),g=qt[f];if(!g)return d.call(this);var m;this.isConst?m=g.constPointerType:m=g.pointerType;var M=Ft(t,this.registeredClass,m.registeredClass);return M===null?d.call(this):this.isSmartPointer?Ye(m.registeredClass.instancePrototype,{ptrType:m,ptr:M,smartPtrType:this,smartPtr:n}):Ye(m.registeredClass.instancePrototype,{ptrType:m,ptr:M})}var Br=()=>{Object.assign(Ze.prototype,{getPointee(n){return this.rawGetPointee&&(n=this.rawGetPointee(n)),n},destructor(n){this.rawDestructor?.(n)},readValueFromPointer:ve,fromWireType:zr})};function Ze(n,t,i,l,d,f,g,m,M,N,_){this.name=n,this.registeredClass=t,this.isReference=i,this.isConst=l,this.isSmartPointer=d,this.pointeeType=f,this.sharingPolicy=g,this.rawGetPointee=m,this.rawConstructor=M,this.rawShare=N,this.rawDestructor=_,!d&&t.baseClass===void 0?l?(this.toWireType=Ir,this.destructorFunction=null):(this.toWireType=Jr,this.destructorFunction=null):this.toWireType=Or}var Vr=(n,t,i)=>{r.hasOwnProperty(n)||de("Replacing nonexistent public symbol"),r[n].overloadTable!==void 0&&i!==void 0?r[n].overloadTable[i]=t:(r[n]=t,r[n].argCount=i)},Yr=n=>At.get(n),le=(n,t,i=!1)=>{n=re(n);function l(){var f=Yr(t);return f}var d=l();return typeof d!="function"&&K(`unknown function pointer with signature ${n}: ${t}`),d};class Zr extends Error{}var Gr=n=>{var t=Xt(n),i=re(t);return pe(t),i},Ge=(n,t)=>{var i=[],l={};function d(f){if(!l[f]&&!oe[f]){if(we[f]){we[f].forEach(d);return}i.push(f),l[f]=!0}}throw t.forEach(d),new Zr(`${n}: `+i.map(Gr).join([", "]))},jr=(n,t,i,l,d,f,g,m,M,N,_,Y,D)=>{_=re(_),f=le(d,f),m&&=le(g,m),N&&=le(M,N),D=le(Y,D);var Z=Rr(_);qr(Z,function(){Ge(`Cannot construct ${_} due to unbound types`,[l])}),ae([n,t,i],l?[l]:[],ee=>{ee=ee[0];var se,te;l?(se=ee.registeredClass,te=se.instancePrototype):te=Ve.prototype;var W=Ht(_,function(...gt){if(Object.getPrototypeOf(this)!==ye)throw new Se(`Use 'new' to construct ${_}`);if(ce.constructor_body===void 0)throw new Se(`${_} has no accessible constructor`);var er=ce.constructor_body[gt.length];if(er===void 0)throw new Se(`Tried to invoke ctor of ${_} with invalid number of parameters (${gt.length}) - expected (${Object.keys(ce.constructor_body).toString()}) parameters instead!`);return er.apply(this,gt)}),ye=Object.create(te,{constructor:{value:W}});W.prototype=ye;var ce=new Qr(_,W,ye,D,se,f,m,N);ce.baseClass&&(ce.baseClass.__derivedClasses??=[],ce.baseClass.__derivedClasses.push(ce));var wt=new Ze(_,ce,!0,!1,!1),ge=new Ze(_+"*",ce,!1,!1,!1),We=new Ze(_+" const*",ce,!1,!0,!1);return qt[n]={pointerType:ge,constPointerType:We},Vr(Z,W),[wt,ge,We]})};function Wr(n){for(var t=1;t{for(var i=[],l=0;l>2]);return i},Pt=n=>{n=n.trim();let t=n.indexOf("(");return t===-1?n:n.slice(0,t)},Ar=(n,t,i,l,d,f,g,m,M)=>{var N=ft(i,l);t=re(t),t=Pt(t),f=le(d,f,m),ae([],[n],_=>{_=_[0];var Y=`${_.name}.${t}`;function D(){Ge(`Cannot call ${Y} due to unbound types`,N)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]);var Z=_.registeredClass.constructor;return Z[t]===void 0?(D.argCount=i-1,Z[t]=D):(ct(Z,t,Y),Z[t].overloadTable[i-1]=D),ae([],N,ee=>{var se=[ee[0],null].concat(ee.slice(1)),te=dt(Y,se,null,f,g);if(Z[t].overloadTable===void 0?(te.argCount=i-1,Z[t]=te):Z[t].overloadTable[i-1]=te,_.registeredClass.__derivedClasses)for(let W of _.registeredClass.__derivedClasses)W.constructor.hasOwnProperty(t)||(W.constructor[t]=te);return[]}),[]})},en=(n,t,i,l,d,f)=>{var g=ft(t,i);d=le(l,d),ae([],[n],m=>{m=m[0];var M=`constructor ${m.name}`;if(m.registeredClass.constructor_body===void 0&&(m.registeredClass.constructor_body=[]),m.registeredClass.constructor_body[t-1]!==void 0)throw new Se(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${m.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return m.registeredClass.constructor_body[t-1]=()=>{Ge(`Cannot construct ${m.name} due to unbound types`,g)},ae([],g,N=>(N.splice(1,0,null),m.registeredClass.constructor_body[t-1]=dt(M,N,null,d,f),[])),[]})},tn=(n,t,i,l,d,f,g,m,M,N)=>{var _=ft(i,l);t=re(t),t=Pt(t),f=le(d,f,M),ae([],[n],Y=>{Y=Y[0];var D=`${Y.name}.${t}`;t.startsWith("@@")&&(t=Symbol[t.substring(2)]),m&&Y.registeredClass.pureVirtualFunctions.push(t);function Z(){Ge(`Cannot call ${D} due to unbound types`,_)}var ee=Y.registeredClass.instancePrototype,se=ee[t];return se===void 0||se.overloadTable===void 0&&se.className!==Y.name&&se.argCount===i-2?(Z.argCount=i-2,Z.className=Y.name,ee[t]=Z):(ct(ee,t,D),ee[t].overloadTable[i-2]=Z),ae([],_,te=>{var W=dt(D,te,Y,f,g);return ee[t].overloadTable===void 0?(W.argCount=i-2,ee[t]=W):ee[t].overloadTable[i-2]=W,[]}),[]})},Rt=[],ke=[0,1,,1,null,1,!0,1,!1,1],Qt=[],rn=n=>{if(n>9&&--ke[n+1]===0){var t=ke[n];ke[n]=void 0;var i=Qt[n];i&&(Qt[n]=void 0,i(t)),Rt.push(n)}},pt={toValue:n=>(n||K(`Cannot use deleted val. handle = ${n}`),ke[n]),toHandle:n=>{switch(n){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let t=Rt.pop()||ke.length;return ke[t]=n,ke[t+1]=1,t}}}},nn={name:"emscripten::val",fromWireType:n=>{var t=pt.toValue(n);return rn(n),t},toWireType:(n,t)=>pt.toHandle(t),readValueFromPointer:ve,destructorFunction:null},an=n=>fe(n,nn),It,Ot,sn=(n,t)=>{switch(t){case 4:return function(i){return this.fromWireType(It[i>>2])};case 8:return function(i){return this.fromWireType(Ot[i>>3])};default:throw new TypeError(`invalid float width (${t}): ${n}`)}},on=(n,t,i)=>{t=re(t),fe(n,{name:t,fromWireType:l=>l,toWireType:(l,d)=>d,readValueFromPointer:sn(t,i),destructorFunction:null})},cn=(n,t,i,l,d)=>{t=re(t);let f=l===0,g=M=>M;if(f){var m=32-8*i;g=M=>M<>>m,d=g(d)}fe(n,{name:t,fromWireType:g,toWireType:(M,N)=>N,readValueFromPointer:Nt(t,i,l!==0),destructorFunction:null})},ln=(n,t,i)=>{var l=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],d=l[t];function f(g){var m=J[g>>2],M=J[g+4>>2];return new d(Q.buffer,M,m)}i=re(i),fe(n,{name:i,fromWireType:f,readValueFromPointer:f},{ignoreDuplicateRegistrations:!0})},un=(n,t,i,l)=>{if(!(l>0))return 0;for(var d=i,f=i+l-1,g=0;g=f)break;t[i++]=m}else if(m<=2047){if(i+1>=f)break;t[i++]=192|m>>6,t[i++]=128|m&63}else if(m<=65535){if(i+2>=f)break;t[i++]=224|m>>12,t[i++]=128|m>>6&63,t[i++]=128|m&63}else{if(i+3>=f)break;t[i++]=240|m>>18,t[i++]=128|m>>12&63,t[i++]=128|m>>6&63,t[i++]=128|m&63,g++}}return t[i]=0,i-d},Jt=(n,t,i)=>un(n,T,t,i),Kt=n=>{for(var t=0,i=0;i=55296&&l<=57343?(t+=4,++i):t+=3}return t},dn=(n,t)=>{t=re(t),fe(n,{name:t,fromWireType(i){var l=J[i>>2],d=i+4,f;return f=P(d,l,!0),pe(i),f},toWireType(i,l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));var d,f=typeof l=="string";f||ArrayBuffer.isView(l)&&l.BYTES_PER_ELEMENT==1||K("Cannot pass non-string to std::string"),f?d=Kt(l):d=l.length;var g=ht(4+d+1),m=g+4;return J[g>>2]=d,f?Jt(l,m,d+1):T.set(l,m),i!==null&&i.push(pe,g),g},readValueFromPointer:ve,destructorFunction(i){pe(i)}})},Dt=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,fn=(n,t,i)=>{var l=n>>1,d=b(Te,l,t/2,i);if(d-l>16&&Dt)return Dt.decode(Te.subarray(l,d));for(var f="",g=l;g{if(i<2)return 0;i-=2;for(var l=t,d=i>1]=g,t+=2}return ze[t>>1]=0,t-l},hn=n=>n.length*2,wn=(n,t,i)=>{for(var l="",d=n>>2,f=0;!(f>=t/4);f++){var g=J[d+f];if(!g&&!i)break;l+=String.fromCodePoint(g)}return l},gn=(n,t,i=2147483647)=>{if(i<4)return 0;for(var l=t,d=l+i-4,f=0;f65535&&f++,Be[t>>2]=g,t+=4,t+4>d)break}return Be[t>>2]=0,t-l},mn=n=>{for(var t=0,i=0;i65535&&i++,t+=4}return t},vn=(n,t,i)=>{i=re(i);var l,d,f;t===2?(l=fn,d=pn,f=hn):(l=wn,d=gn,f=mn),fe(n,{name:i,fromWireType:g=>{var m=J[g>>2],M=l(g+4,m*t,!0);return pe(g),M},toWireType:(g,m)=>{typeof m!="string"&&K(`Cannot pass non-string to C++ string type ${i}`);var M=f(m),N=ht(4+M+t);return J[N>>2]=M/t,d(m,N+4,M+t),g!==null&&g.push(pe,N),N},readValueFromPointer:ve,destructorFunction(g){pe(g)}})},yn=(n,t,i,l,d,f)=>{be[n]={name:re(t),rawConstructor:le(i,l),rawDestructor:le(d,f),fields:[]}},bn=(n,t,i,l,d,f,g,m,M,N)=>{be[n].fields.push({fieldName:re(t),getterReturnType:i,getter:le(l,d),getterContext:f,setterArgumentType:g,setter:le(m,M),setterContext:N})},kn=(n,t)=>{t=re(t),fe(n,{isVoid:!0,name:t,fromWireType:()=>{},toWireType:(i,l)=>{}})},En=()=>{},Le={},Cn=n=>{if(n instanceof F||n=="unwind")return v;a(1,n)},$n=n=>{v=n,a(n,new F(n))},Un=n=>{if(!h)try{return n()}catch(t){Cn(t)}},xn=()=>performance.now(),Mn=(n,t)=>{if(Le[n]&&(clearTimeout(Le[n].id),delete Le[n]),!t)return 0;var i=setTimeout(()=>{delete Le[n],Un(()=>zt(n,xn()))},t);return Le[n]={id:i,timeout_ms:t},0},Sn=()=>2147483648,Tn=(n,t)=>Math.ceil(n/t)*t,Nn=n=>{var t=je.buffer.byteLength,i=(n-t+65535)/65536|0;try{return je.grow(i),k(),1}catch{}},Ln=n=>{var t=T.length;n>>>=0;var i=Sn();if(n>i)return!1;for(var l=1;l<=4;l*=2){var d=t*(1+.2/l);d=Math.min(d,n+100663296);var f=Math.min(i,Tn(Math.max(n,d),65536)),g=Nn(f);if(g)return!0}return!1},_n=n=>52;function Hn(n,t,i,l){return 70}var qn=[null,[],[]],Fn=(n,t)=>{var i=qn[n];!t||t===10?((n===1?s:c)(S(i)),i.length=0):i.push(t)},Pn=(n,t,i,l)=>{for(var d=0,f=0;f>2],m=J[t+4>>2];t+=8;for(var M=0;M>2]=d,0};Hr(),Br(),r.wasmBinary&&(u=r.wasmBinary),r.UTF8ToString=P,r.stringToUTF8=Jt,r.lengthBytesUTF8=Kt;var Xt,ht,pe,zt,Bt,Vt,Yt,Zt,Gt,jt,Wt,je,At;function Rn(n){Xt=n.B,ht=r._malloc=n.C,pe=r._free=n.D,zt=n.F,Bt=n.G,Vt=n.H,Yt=n.I,Zt=n.J,Gt=n.K,jt=n.L,je=n.z,At=n.E,Wt=n.M}var Qn={t:xe,x:Xe,f:st,i:Tr,l:Nr,o:jr,b:Ar,n:en,d:tn,y:an,h:on,c:cn,a:ln,k:dn,g:vn,j:yn,e:bn,m:kn,w:En,p:Mn,u:Ln,s:_n,q:Hn,r:Pn,v:$n};async function In(){!h&&E()}var _e;return _e=await x(),await In(),r}var Ea=ka,Ca=new Int8Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,90,63,64,65,66,-1,67,68,69,70,71,-1,72,73,52,53,54,55,56,57,58,59,60,61,74,75,76,77,78,79,80,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,81,-1,82,83,84,85,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,86,87,88,89,-1]);function $a(e){let r=new Uint8Array(170930),a=0,o=0,s=0,c=-1;for(let u=0,h=e.length;u127)continue;let p=Ca[v];if(!(p<0))if(c<0)c=p;else{c+=p*91,o|=c<88?13:14;do r[a++]=o,o>>>=8,s-=8;while(s>7);c=-1}}return c>=0&&(r[a++]=(o|c<""})}function Ma(){Ct=void 0}var Sa=class{_module;constructor(e){this._module=e}malloc(e){let r=this._module._malloc(e);return{ptr:r,size:e,dispose:()=>this.free({ptr:r,size:e,dispose:()=>{}})}}free(e){this._module._free(e.ptr)}dataToHeap(e){let r=this.malloc(e.byteLength);return this._module.HEAPU8.set(e,r.ptr),r}heapView(e){return this._module.HEAPU8.subarray(e.ptr,e.ptr+e.size)}heapToUint8Array(e){return new Uint8Array([...this.heapView(e)])}lengthBytes(e){return this._module.lengthBytesUTF8(e)}stringToHeap(e){let r=this.lengthBytes(e)+1,a=this._module._malloc(r);return this._module.stringToUTF8(e,a,r),{ptr:a,size:r,dispose:()=>this.free({ptr:a,size:r,dispose:()=>{}})}}heapToString(e){return this._module.UTF8ToString(e.ptr,e.size)}hasFilesystem(){let e=this._module;return e.FS_createPath!==void 0&&e.FS_createDataFile!==void 0&&e.FS_preloadFile!==void 0&&e.FS_unlink!==void 0}createPath(e,r=!0,a=!0){return this._module.FS_createPath("/",e,r,a)}createDataFile(e,r,a=!0,o=!0,s=!0){return this._module.FS_createDataFile("/",e,r,a,o,s)}preloadFile(e,r,a=!0,o=!0,s=!1,c=!0,u=!1){return this._module.FS_preloadFile("/",e,r,a,o,s,c,u)}unlink(e){return this._module.FS_unlink(e)}},He,Ta=4294967295;function qe(e,r){if(!Number.isInteger(e)||e<0||e>Ta)throw new Error(`${r} length ${e} is outside the WASM32-safe range`)}function vt(e){if(e.length===0)return new Uint8Array(0);if(e.length===1)return e[0];let r=0;for(let s of e)r+=s.length;let a=new Uint8Array(r),o=0;for(let s of e)a.set(s,o),o+=s.length;return a}var Na=class kr{_mainModule;_zstdClass;_zstd;_compressionLevel;_decompressFrameCompleted=!1;_decompressRemaining=0;_decompressSawInput=!1;constructor(r){this._mainModule=new Sa(r),this._zstdClass=r.zstd,this._zstd=new this._zstdClass,this._compressionLevel=this._zstdClass.defaultCLevel()}static load(){return He||(He=xa().then(r=>new kr(r))),He}static unload(){Ma(),He?.then(r=>{r?._zstd?.delete()}),He=void 0}copyHeap(r){return this._mainModule.heapView(r).slice()}mallocChecked(r,a){qe(r,a);let o=this._mainModule.malloc(r);if(!o.ptr)throw this._mainModule.free(o),new Error(`Failed to allocate ${r} bytes for ${a}`);return o}throwStreamError(r,a){throw new Error(`${r} failed: ${a.errorName||"unknown error"}`)}ensureStreamOk(r,a){a.error&&this.throwStreamError(r,a)}version(){return this._zstdClass.version()}reset(){let r=this._zstd.reset();this.ensureStreamOk("reset",r),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}resetCompression(r){r!==void 0&&(this._compressionLevel=r);let a=this._zstd.resetCompression(this._compressionLevel);this.ensureStreamOk("resetCompression",a)}resetDecompression(){let r=this._zstd.resetDecompression();this.ensureStreamOk("resetDecompression",r),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}setCompressionLevel(r){let a=this._zstd.setCompressionLevel(r);this.ensureStreamOk("setCompressionLevel",a),this._compressionLevel=r}compress(r,a=this.defaultCLevel()){qe(r.length,"compress input");let o=this._mainModule.dataToHeap(r);try{if(!o.ptr&&r.length>0)throw new Error("Failed to allocate compress input buffer");let s=this._zstdClass.compressBound(r.length),c=this.mallocChecked(s,"compress output");try{if(c.size=this._zstdClass.compress(c.ptr,s,o.ptr,o.size,a),this._zstdClass.isError(c.size))throw new Error(`compress failed: ${this._zstdClass.getErrorName(c.size)}`);return this.copyHeap(c)}finally{this._mainModule.free(c)}}finally{this._mainModule.free(o)}}compressChunk(r){if(qe(r.length,"compressChunk input"),r.length===0)return new Uint8Array(0);let a=this._mainModule.dataToHeap(r);try{if(!a.ptr)throw new Error("Failed to allocate compressChunk input buffer");let o=this._zstdClass.CStreamOutSize(),s=[],c=0;for(;c0&&(u.size=h.produced,s.push(this.copyHeap(u)))}finally{this._mainModule.free(u)}}return vt(s)}finally{this._mainModule.free(a)}}compressEnd(){let r=this._zstdClass.CStreamOutSize(),a=[],o=1;for(;o!==0;){let s=this.mallocChecked(r,"compressEnd output");try{let c=this._zstd.compressEnd(s.ptr,r);if(this.ensureStreamOk("compressEnd",c),c.produced===0&&c.remaining!==0)throw new Error("compressEnd failed: no progress while finishing stream");o=c.remaining,c.produced>0&&(s.size=c.produced,a.push(this.copyHeap(s)))}finally{this._mainModule.free(s)}}return vt(a)}frameContentSize(r){return this._zstdClass.getFrameContentSize(r.ptr,r.size)}decompress(r){qe(r.length,"decompress input");let a=this._mainModule.dataToHeap(r);try{if(!a.ptr&&r.length>0)throw new Error("Failed to allocate decompress input buffer");let o=this.frameContentSize(a);if(o.error)throw new Error(`Failed to get frame content size: ${o.errorName}`);let s=o.known;if(s){let c=this._zstdClass.findFrameCompressedSize(a.ptr,a.size);if(this._zstdClass.isError(c))throw new Error(`Failed to find frame compressed size: ${this._zstdClass.getErrorName(c)}`);c0?a.ptr+c:0,y=this._zstd.decompressChunk(h.ptr,o,p,v);if(this.ensureStreamOk("decompressChunk",y),y.consumed===0&&y.produced===0){if(v===0){y.remaining>0&&(this._decompressRemaining=y.remaining);break}throw new Error("decompressChunk failed: no progress while consuming input")}c+=y.consumed,u=y.produced===o&&y.remaining!==0,y.produced>0&&(h.size=y.produced,s.push(this.copyHeap(h))),y.remaining===0?(this._decompressFrameCompleted=!0,this._decompressRemaining=0):this._decompressRemaining=y.remaining}finally{this._mainModule.free(h)}}return vt(s)}finally{this._mainModule.free(a)}}decompressEnd(){if(!this._decompressSawInput)throw new Error("decompressEnd failed: empty compressed input is not a completed frame");if(!this._decompressFrameCompleted||this._decompressRemaining!==0)throw new Error("decompressEnd failed: truncated Zstandard input")}defaultCLevel(){return this._zstdClass.defaultCLevel()}minCLevel(){return this._zstdClass.minCLevel()}maxCLevel(){return this._zstdClass.maxCLevel()}};let yt=null;function La(){return yt||(yt=Na.load()),yt}function _a(e){return e.length>=4&&e[0]===40&&e[1]===181&&e[2]===47&&e[3]===253}function $t(e){const r="SQLite format 3\0";if(e.length/g,">").replace(/"/g,""").replace(/'/g,"'")}function or(e,r,a){const o=e.tagsList[0]??"",s=e.tagsList.length>1?` +${e.tagsList.length-1}`:"",c=Ee(e.tagsList.join(", ")),u=o?`${Ee(o)}${s}`:"",h=e.more.size>0?'':"";return`
`+(a?Er(e,r):"")+"
"}function Er(e,r){const a=[...e.more.entries()].map(([o,s])=>{const c=r.get(o);return`
${c?Ee(c.name):`Поле #${o}`}
${Ee(s)}
`}).join("");return a?`
${a}
`:""}function qa(e,r){e.innerHTML=`

Слова

База ещё не проверена.
`;const a=e.querySelector("#home-db-banner"),o=e.querySelector("#home-db-text"),s=e.querySelector("#home-db-go"),c=e.querySelector("#words-search"),u=e.querySelector("#words-group"),h=e.querySelector("#words-count"),v=e.querySelector("#words-status"),p=e.querySelector("#words-list"),y=e.querySelector("#words-more");function C(b,S){a.hidden=!1,o.textContent=b,s.hidden=!1}function k(){a.hidden=!0}s.addEventListener("click",()=>{document.querySelector('.drawer-btn[data-page="sync"]')?.click()});let E=!1,$=new Map,w=0,U=[],I=null,O=0,H=!1,z=0,R=0;function x(){const b=u.value;if(b==="")return{search:c.value.trim(),groupId:null};const S=Number(b);return{search:c.value.trim(),groupId:Number.isFinite(S)?S:null}}function F(){y.hidden=!(E&&U.lengthor(b,$,b.id===I)).join(""),h.textContent=w>0?`Показано ${U.length} из ${w}`:"",F()}function q(b){if(I===b){b!=null&&X(b),I=null;return}I!=null&&X(I),I=b,b!=null&&j(b)}function X(b){const S=p.querySelector(`.word-row-wrap[data-word-id="${b}"]`);if(!S)return;const T=S.querySelector(".word-row"),P=S.querySelector(".word-extra");T&&(T.classList.remove("open"),T.setAttribute("aria-expanded","false")),P&&(P.hidden=!0,P.innerHTML="")}function j(b){const S=U.find(he=>he.id===b),T=p.querySelector(`.word-row-wrap[data-word-id="${b}"]`);if(!S||!T)return;const P=T.querySelector(".word-row"),J=T.querySelector(".word-extra");P&&(P.classList.add("open"),P.setAttribute("aria-expanded","true")),J&&(J.hidden=!1,J.innerHTML=Er(S,$))}function V(b){v.textContent=b,v.hidden=b===""}async function B(){if(!E||H)return;H=!0;const b=++z,S=x();y.disabled=!0,U.length===0&&V("Загрузка слов…");try{const[T,P]=await Promise.all([Bn({search:S.search,groupId:S.groupId??void 0}),tr({search:S.search,groupId:S.groupId??void 0,limit:ir,offset:0})]);if(b!==z)return;w=T,U=P,O=P.length,I!=null&&!U.some(J=>J.id===I)&&(I=null),Q(),V(P.length===0?"По этому запросу слов нет.":""),P.length===0&&w===0&&(h.textContent="Слов в базе пока нет.")}catch(T){if(b!==z)return;V(`Не удалось загрузить слова: ${T instanceof Error?T.message:String(T)}`)}finally{b===z&&(H=!1,y.disabled=!1,F())}}async function L(){if(!E||H||U.length>=w)return;H=!0;const b=++z,S=x();y.disabled=!0,y.textContent="Загрузка…";try{const T=await tr({search:S.search,groupId:S.groupId??void 0,limit:ir,offset:O});if(b!==z)return;U=U.concat(T),O+=T.length,p.insertAdjacentHTML("beforeend",T.map(P=>or(P,$,P.id===I)).join("")),h.textContent=`Показано ${U.length} из ${w}`,F()}catch(T){if(b!==z)return;V(`Не удалось догрузить: ${T instanceof Error?T.message:String(T)}`)}finally{b===z&&(H=!1,y.disabled=!1,F())}}c.addEventListener("input",()=>{window.clearTimeout(R),R=window.setTimeout(()=>{B()},300)}),c.addEventListener("keydown",b=>{b.key==="Enter"&&(window.clearTimeout(R),B())}),u.addEventListener("change",()=>{B()}),y.addEventListener("click",()=>{L()}),p.addEventListener("click",b=>{const S=b.target.closest(".word-row");if(!S||S.disabled)return;const T=Number(S.dataset.wordId);Number.isFinite(T)&&q(I===T?null:T)}),(async()=>{if(!await Oe()){C("Локальной базы нет — скачай сохранение."),V("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),h.textContent="";return}try{const S=await aa();if(!$t(S)){C("Файл в OPFS не похож на SQLite — перекачай сохранение.",!0),V("Файл в OPFS не похож на SQLite — перекачай сохранение.");return}k();try{const[P,J]=await Promise.all([Vn(),yr()]),he=P;$=new Map(J.map(ue=>[ue.id,ue])),u.innerHTML=''+he.map(ue=>``).join(""),E=!0,await B(),u.options[0].textContent=`Все группы (${w})`}catch(P){V(`БД есть, но слова не прочитались: ${P instanceof Error?P.message:String(P)}`)}}catch(S){C(`Не удалось прочитать базу: ${S instanceof Error?S.message:String(S)}`)}})()}function cr(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Fa(e){const r=e%10,a=e%100;return r===1&&a!==11?"запись":r>=2&&r<=4&&(a<12||a>14)?"записи":"записей"}function Pa(e,r){const a=cr(e.name)||`Колода #${e.id}`;return`
`}function Ra(e,r){e.innerHTML=`

Колоды

Проверка локальной базы…
`;const a=e.querySelector("#decks-count"),o=e.querySelector("#decks-status"),s=e.querySelector("#decks-list");function c(u){o.textContent=u,o.hidden=u===""}s.addEventListener("click",u=>{const h=u.target.closest("[data-act]");if(!h)return;const v=Number(h.dataset.deckId);Number.isFinite(v)&&(h.dataset.act==="review"?r.goReview(v):r.goDeck(v))}),(async()=>{if(!await Oe()){c("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),a.textContent="";return}c("Загрузка колод…");try{const[h,v]=await Promise.all([Yn(),Gn()]);if(h.length===0){a.textContent="Колоды пока отсутствуют.",c(""),s.innerHTML="";return}a.textContent=`Всего: ${h.length}`,c(""),s.innerHTML=h.map(p=>Pa(p,v.get(p.id)??0)).join("")}catch(h){c(`Не удалось загрузить колоды: ${h instanceof Error?h.message:String(h)}`)}})()}function Qa(e){return e?Ia(e):'—'}function Ia(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function bt(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Oa(e){const r=e%10,a=e%100;return r===1&&a!==11?"слово":r>=2&&r<=4&&(a<12||a>14)?"слова":"слов"}function Ja(e,r,a){e.innerHTML=`

Колода…

Загрузка колоды…
`;const o=e.querySelector("#deck-back"),s=e.querySelector("#deck-title"),c=e.querySelector("#deck-status"),u=e.querySelector("#deck-body");o.addEventListener("click",()=>a.goDecks()),(async()=>{if(!await Oe()){s.textContent="Колода недоступна",c.textContent="Нет локальной базы — скачай сохранение на странице «Синхронизация».";return}let v=null;try{v=await nt(r)}catch(x){s.textContent="Колода недоступна",c.textContent=`Не удалось загрузить колоду: ${x instanceof Error?x.message:String(x)}`;return}if(!v){s.textContent="Колода не найдена",c.textContent=`Колоды с id=${r} нет в локальной базе. Возможно, база обновилась — вернись к списку.`;return}const p=v;s.textContent=p.name||`Колода #${p.id}`,c.hidden=!0;let y=null;try{y=await jn(p.id)}catch(x){c.hidden=!1,c.textContent=`Данные колоды загружены, а количество слов — нет: ${x instanceof Error?x.message:String(x)}`}u.innerHTML=`
id
${p.id}
name
${Qa(p.name)}

${y==null?"Количество слов неизвестно":`${y} ${Oa(y)}`}

`;const C=u.querySelector("#deck-form"),k=u.querySelector("#deck-forward"),E=u.querySelector("#deck-backward"),$=u.querySelector("#deck-filter"),w=u.querySelector("#deck-save"),U=u.querySelector("#deck-form-status"),I=u.querySelector("#deck-review"),O=u.querySelector("#deck-history");I.addEventListener("click",()=>a.goReview(p.id)),O.addEventListener("click",()=>a.goHistory(p.id));const H=()=>`${k.value} ${E.value} ${$.value}`;let z=H();function R(){w.disabled=H()===z||w.dataset.busy==="1"}for(const x of[k,E,$])x.addEventListener("input",R);R(),C.addEventListener("submit",x=>{x.preventDefault(),!w.disabled&&(w.dataset.busy="1",w.disabled=!0,w.textContent="Сохранение…",U.textContent="",(async()=>{try{const F=await Zn(p.id,{forward:k.value,backward:E.value,filter:$.value});if(!F){U.textContent="Колода пропала из базы — вернись к списку.";return}k.value=F.forward,E.value=F.backward,$.value=F.filter,z=H(),U.textContent="Сохранено в локальную базу."}catch(F){U.textContent=`Не удалось сохранить: ${F instanceof Error?F.message:String(F)}`}finally{delete w.dataset.busy,w.textContent="Сохранить",R()}})())})})()}function Fe(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Ka=50,Da=[{label:"Не получилось",cls:"grade-fail"},{label:"Тяжело",cls:"grade-hard"},{label:"Хорошо",cls:"grade-good"},{label:"Легко",cls:"grade-easy"}];function Xa(e){const r=Da[e.answer]??{label:`Оценка ${e.answer}`,cls:""},a=e.wordKey?`${Fe(e.wordKey)}`+(e.wordValue?` — ${Fe(e.wordValue)}`:""):`Слово #${e.word_id} (удалено)`,o=e.before===e.after?`${e.before}`:`${e.before}→${e.after}`;return`
${a}
${Fe(r.label)}${Fe(Dn(e.timestamp))} · score ${Fe(o)}
`}function za(e,r,a){e.innerHTML=`

История…

Загрузка истории…
`;const o=e.querySelector("#hist-back"),s=e.querySelector("#hist-title"),c=e.querySelector("#hist-count"),u=e.querySelector("#hist-status"),h=e.querySelector("#hist-list"),v=e.querySelector("#hist-more");o.addEventListener("click",()=>a.goDeck(r));function p(w){u.textContent=w,u.hidden=w===""}let y=0,C=0,k=!1;function E(){const w=y-C;v.hidden=w<=0,w>0&&(v.textContent=`Показать ещё (${w} осталось)`)}async function $(){if(!(k||C>=y)){k=!0,v.disabled=!0,v.textContent="Загрузка…";try{const w=await ra(r,{limit:Ka,offset:C});C+=w.length,h.insertAdjacentHTML("beforeend",w.map(Xa).join("")),c.textContent=`Показано ${C} из ${y}`}catch(w){p(`Не удалось загрузить историю: ${w instanceof Error?w.message:String(w)}`)}finally{k=!1,v.disabled=!1,E()}}}v.addEventListener("click",()=>{$()}),(async()=>{if(!await Oe()){s.textContent="История недоступна",p("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const U=await nt(r);if(!U){s.textContent="Колода не найдена",p(`Колоды с id=${r} нет в локальной базе.`);return}if(s.textContent=U.name||`Колода #${U.id}`,y=await ta(U.id),y===0){c.textContent="Ответов пока нет — начни повторение.",p("");return}p(""),await $()}catch(U){s.textContent="История недоступна",p(`Не удалось загрузить историю: ${U instanceof Error?U.message:String(U)}`)}})()}function Ba(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Va=[{value:0,label:"Не получилось",cls:"grade-fail"},{value:1,label:"Тяжело",cls:"grade-hard"},{value:2,label:"Хорошо",cls:"grade-good"},{value:3,label:"Легко",cls:"grade-easy"}];function Ya(e,r,a){e.innerHTML=`

Повторение…

Загрузка карточек…
`;const o=e.querySelector("#review-back"),s=e.querySelector("#review-title"),c=e.querySelector("#review-progress"),u=e.querySelector("#review-status"),h=e.querySelector("#review-body");o.addEventListener("click",()=>a.goDecks());function v(Q){u.textContent=Q,u.hidden=Q===""}let p=[],y=new Map,C=[],k="",E="",$=0,w=!1,U=null,I=0,O=!1;function H(Q,q){return Q.length===0?`
—
`:`
`+Q.map(X=>`

${Ba(X)}

`).join("")+"
"}async function z(){const Q=++I,q=p[$],X=y.get(q);if(!X){h.innerHTML="",c.textContent="",v("Слово пропало из базы — пропускаю.");return}U=null;let j="";try{U=await An(r,q)??1}catch{U=1,j=" (score прочитать не удалось — пишу before/after=1)"}if(Q!==I)return;O=!1;const V=Wn(X,C),B=nr(k,V),L=w?nr(E,V):null;c.textContent=`Карточка ${$+1} из ${p.length}`,v("");const b=w?H(L??[],"review-back-side"):'

Тап — показать ответ

',S=w?`
${Va.map(T=>``).join("")}
`:"";h.innerHTML=` ${S} `,h.querySelector("#review-card").addEventListener("click",()=>{w||(w=!0,z())}),h.querySelectorAll(".review-grade").forEach(T=>{T.addEventListener("click",()=>{const P=Number(T.dataset.grade);R(P,j)})})}async function R(Q,q){if(O)return;O=!0;const X=p[$],j=U??1,V=[...h.querySelectorAll(".review-grade")];for(const B of V)B.disabled=!0;try{await ea({deckId:r,wordId:X,answer:Q,before:j,after:j})}catch(B){v(`Ответ не записался: ${B instanceof Error?B.message:String(B)}${q}`),O=!1;for(const L of V)L.disabled=!1;return}$+=1,w=!1,U=null,$>=p.length?x():await z()}function x(){c.textContent=`Готово: ${p.length} из ${p.length}`,v(""),h.innerHTML=`

Все карточки сессии просмотрены, ответы записаны в history.

`,h.querySelector("#review-again").addEventListener("click",()=>{F()})}async function F(){if(v("Перемешиваю…"),h.innerHTML="",c.textContent="",p=await ar(r),$=0,w=!1,p.length===0){v("В колоде нет слов для повторения.");return}y=await rr(p),z()}(async()=>{if(!await Oe()){s.textContent="Повторение недоступно",v("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const[q,X]=await Promise.all([nt(r),yr()]);if(!q){s.textContent="Колода не найдена",v(`Колоды с id=${r} нет в локальной базе. Вернись к списку.`);return}if(C=X,k=q.forward,E=q.backward,s.textContent=q.name||`Колода #${q.id}`,p=await ar(q.id),p.length===0){c.textContent="",v("В колоде нет слов для повторения.");return}y=await rr(p),$=0,w=!1,await z()}catch(q){s.textContent="Повторение недоступно",v(`Не удалось загрузить карточки: ${q instanceof Error?q.message:String(q)}`)}})()}const lr=24,Za=/^[A-Za-z0-9]{24}$/,Cr="japlearn_sync_token";function ur(e){return e.trim().replace(/\s+/g,"")}function Pe(e){return Za.test(e)}function Ga(){try{return localStorage.getItem(Cr)??""}catch{return""}}function dr(e){try{localStorage.setItem(Cr,e)}catch{}}const $r="https://learning.micialware.ru";function ja(e,r=$r){return`${r.replace(/\/+$/,"")}/download/${encodeURIComponent(e)}`}async function Wa(e,r,a=$r){const o=ja(e,a);let s;try{s=await fetch(o,{method:"GET",...r})}catch(u){throw new Error(`Нет связи с сервером: ${u instanceof Error?u.message:String(u)}`)}if(!s.ok)throw s.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${s.status} ${s.statusText}`);const c=await s.arrayBuffer();if(c.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(c)}function Aa(e){e.innerHTML=`

Синхронизация

Токен сохранения — 24 символа: латинские буквы и цифры.

0 / 24

Введите токен из 24 символов

`;const r=e.querySelector("#token-input"),a=e.querySelector("#token-error"),o=e.querySelector("#token-counter"),s=e.querySelector("#btn-download"),c=e.querySelector("#status");function u(k){c.textContent=k,console.log(`[JapLearn] ${k}`)}function h(){return ur(r.value)}function v(k){s.disabled=k||!Pe(h()),r.disabled=k}function p(){const k=h(),E=k.length;o.textContent=`${E} / ${lr}`;const $=Pe(k),w=E===0;r.classList.toggle("invalid",!w&&!$),r.setAttribute("aria-invalid",String(!w&&!$)),w?a.textContent="":E!==lr?a.textContent=`Нужно 24 символа, сейчас ${E}`:a.textContent=$?"":"Только латинские буквы и цифры",s.disabled=!$}async function y(){const k=h();if(Pe(k)){dr(k),v(!0),u("Скачивание сохранения...");try{const E=await Wa(k);u(`Скачано ${(E.length/1024).toFixed(1)} КБ, распаковка...`);const $=await Ha(E);u(`Распаковано ${($.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await na($),u(`Готово: база ${($.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch(E){u(`Ошибка скачивания: ${E instanceof Error?E.message:String(E)}`)}finally{v(!1),p()}}}r.addEventListener("input",()=>{p()}),r.addEventListener("change",()=>{const k=h();r.value=k,Pe(k)&&(dr(k),u("Токен сохранён локально. Можно скачивать.")),p()}),s.addEventListener("click",()=>{y()});const C=Ga();C&&(r.value=C),p(),Pe(ur(C))&&u("Токен восстановлен. Нажми «Скачать», чтобы получить базу.")}const es="modulepreload",ts=function(e){return"/"+e},fr={},rs=function(r,a,o){let s=Promise.resolve();if(a&&a.length>0){let v=function(p){return Promise.all(p.map(y=>Promise.resolve(y).then(C=>({status:"fulfilled",value:C}),C=>({status:"rejected",reason:C}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),h=u?.nonce||u?.getAttribute("nonce");s=v(a.map(p=>{if(p=ts(p),p in fr)return;fr[p]=!0;const y=p.endsWith(".css"),C=y?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${C}`))return;const k=document.createElement("link");if(k.rel=y?"stylesheet":es,y||(k.as="script"),k.crossOrigin="",k.href=p,h&&k.setAttribute("nonce",h),document.head.appendChild(k),y)return new Promise((E,$)=>{k.addEventListener("load",E),k.addEventListener("error",()=>$(new Error(`Unable to preload CSS for ${p}`)))})}))}function c(u){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=u,window.dispatchEvent(h),!h.defaultPrevented)throw u}return s.then(u=>{for(const h of u||[])h.status==="rejected"&&c(h.reason);return r().catch(c)})};function ns(e={}){const{immediate:r=!1,onNeedReload:a,onNeedRefresh:o,onOfflineReady:s,onRegistered:c,onRegisteredSW:u,onRegisterError:h}=e;let v,p,y;const C=async(E=!0)=>{await p,y?.()};async function k(){if("serviceWorker"in navigator){if(v=await rs(async()=>{const{Workbox:E}=await import("./workbox-window.prod.es5-BBnX5xw4.js");return{Workbox:E}},[]).then(({Workbox:E})=>new E("/sw.js",{scope:"/",type:"classic"})).catch(E=>{h?.(E)}),!v)return;y=()=>{v?.messageSkipWaiting()};{let E=!1;const $=()=>{E=!0,v?.addEventListener("controlling",w=>{w.isUpdate&&(a?a():window.location.reload())}),o?.()};v.addEventListener("installed",w=>{typeof w.isUpdate>"u"?typeof w.isExternal<"u"&&w.isExternal?$():!E&&s?.():w.isUpdate||s?.()}),v.addEventListener("waiting",$)}v.register({immediate:r}).then(E=>{u?u("/sw.js",E):c?.(E)}).catch(E=>{h?.(E)})}}return p=k(),C}const Ur="japlearn_ios_install_hint_seen";function as(){const e=navigator;return window.matchMedia("(display-mode: standalone)").matches||e.standalone===!0}function ss(){const e=navigator.userAgent;return(/iPhone|iPad|iPod/.test(e)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)&&/WebKit/.test(e)&&!/CriOS|FxiOS|EdgiOS|OPiOS/.test(e)}function is(){try{return localStorage.getItem(Ur)==="1"}catch{return!0}}function os(){const e=document.getElementById("pwa-banner");if(!e)return;let r=null,a=null,o=!1;function s(){e.hidden=!0,e.replaceChildren()}function c(p,y){const C=document.createElement("span");C.className="pwa-banner-text",C.textContent=p;const k=document.createElement("div");k.className="pwa-actions";for(const E of y){const $=document.createElement("button");$.type="button",$.className=E.primary?"btn btn-primary pwa-btn":"btn pwa-btn",$.textContent=E.label,$.addEventListener("click",E.onClick),k.append($)}e.replaceChildren(C,k),e.hidden=!1}function u(){if(r){c("Доступна новая версия приложения",[{label:"Обновить",primary:!0,onClick:()=>{r?.()}},{label:"Позже",onClick:()=>{r=null,u()}}]);return}if(a){c("Установить JapLearn на домашний экран?",[{label:"Установить",primary:!0,onClick:()=>{h()}},{label:"Не сейчас",onClick:()=>{a=null,u()}}]);return}if(ss()&&!as()&&!is()){c("На iPhone: «Поделиться» → «На экран „Домой“»",[{label:"Понятно",primary:!0,onClick:()=>{try{localStorage.setItem(Ur,"1")}catch{}u()}}]);return}if(o){c("Готово: приложение работает офлайн",[{label:"Хорошо",primary:!0,onClick:()=>{o=!1,u()}}]);return}s()}async function h(){const p=a;if(p){a=null;try{await p.prompt();const y=await p.userChoice;console.log("[JapLearn] установка:",y.outcome)}catch(y){console.warn("[JapLearn] install prompt:",y)}u()}}const v=ns({immediate:!0,onNeedRefresh(){r=()=>v(!0),u()},onOfflineReady(){o=!0,u()},onRegisterError(p){console.warn("[JapLearn] service worker:",p)}});window.addEventListener("beforeinstallprompt",p=>{p.preventDefault(),a=p,u()}),window.addEventListener("appinstalled",()=>{a=null,u()}),(async()=>{try{if(await navigator.storage.persisted()===!1){const p=await navigator.storage.persist();console.log("[JapLearn] storage.persist =",p)}}catch(p){console.warn("[JapLearn] storage.persist:",p)}})(),u()}const cs={home:"Главная",decks:"Колоды",deck:"Колода",review:"Повторение",history:"История",sync:"Синхронизация"};function Ke(e){const r=document.getElementById(e);if(!r)throw new Error(`[JapLearn] Не найден элемент #${e}`);return r}const xr=Ke("burger-btn"),rt=Ke("drawer"),Mr=Ke("drawer-overlay"),ls=Ke("page-title"),Ue=Ke("page");let Mt=!1;function De(e){Mt=e,rt.classList.toggle("open",e),Mr.hidden=!e,xr.setAttribute("aria-expanded",String(e)),rt.setAttribute("aria-hidden",String(!e)),document.body.classList.toggle("drawer-open",e)}function us(e){rt.querySelectorAll(".drawer-btn").forEach(r=>{r.classList.toggle("active",r.dataset.page===e)})}function me(e,r){ls.textContent=cs[e],us(e==="deck"||e==="review"||e==="history"?"decks":e),e==="home"?qa(Ue):e==="decks"?Ra(Ue,{goDeck:a=>me("deck",a),goReview:a=>me("review",a)}):e==="deck"?Ja(Ue,r??0,{goDecks:()=>me("decks"),goReview:a=>me("review",a),goHistory:a=>me("history",a)}):e==="review"?Ya(Ue,r??0,{goDecks:()=>me("decks")}):e==="history"?za(Ue,r??0,{goDeck:a=>me("deck",a)}):Aa(Ue)}xr.addEventListener("click",()=>{De(!Mt)});Mr.addEventListener("click",()=>{De(!1)});document.addEventListener("keydown",e=>{e.key==="Escape"&&Mt&&De(!1)});rt.querySelectorAll(".drawer-btn").forEach(e=>{e.addEventListener("click",()=>{const r=e.dataset.page;(r==="home"||r==="decks"||r==="sync")&&me(r),De(!1)})});await On();De(!1);me("home");os();console.log("[JapLearn] crossOriginIsolated =",window.crossOriginIsolated);