diff --git a/docs/index.js b/docs/index.js
index 912957d7..0b7dce43 100644
--- a/docs/index.js
+++ b/docs/index.js
@@ -1,2 +1,2 @@
-const e=(e,t=document)=>[...t.querySelectorAll(e)],t=(e,t=document)=>{const n=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),r=[];for(let e=0,{snapshotLength:t}=n;e<t;e++)r.push(n.snapshotItem(e));return r},n=Object.getOwnPropertyDescriptors(Response.prototype),r=e=>"function"==typeof e,s={get:(e,t)=>n.hasOwnProperty(t)?((e,t,{get:n,value:s})=>n||!r(s)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,n[t]):((e,t)=>r(t)?t.bind(e):t)(e,e[t])};var o=(e,...t)=>new Proxy(fetch(e,...t),s);const a=new Proxy(new Map,{get:(e,t)=>(e.has(t)||e.set(t,Promise.withResolvers()),e.get(t))}),i=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),c=new Proxy(Object.freeze({}),{get:(e,t)=>"string"!=typeof t||i.has(t)?void 0:a[t].promise.then((e=>e.sync))}),l="object"==typeof self?self:globalThis,u=e=>((e,t)=>{const n=(t,n)=>(e.set(n,t),t),r=s=>{if(e.has(s))return e.get(s);const[o,a]=t[s];switch(o){case 0:case-1:return n(a,s);case 1:{const e=n([],s);for(const t of a)e.push(r(t));return e}case 2:{const e=n({},s);for(const[t,n]of a)e[r(t)]=r(n);return e}case 3:return n(new Date(a),s);case 4:{const{source:e,flags:t}=a;return n(new RegExp(e,t),s)}case 5:{const e=n(new Map,s);for(const[t,n]of a)e.set(r(t),r(n));return e}case 6:{const e=n(new Set,s);for(const t of a)e.add(r(t));return e}case 7:{const{name:e,message:t}=a;return n(new l[e](t),s)}case 8:return n(BigInt(a),s);case"BigInt":return n(Object(BigInt(a)),s)}return n(new l[o](a),s)};return r})(new Map,e)(0),p="",{toString:f}={},{keys:h}=Object,d=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const n=f.call(e).slice(8,-1);switch(n){case"Array":return[1,p];case"Object":return[2,p];case"Date":return[3,p];case"RegExp":return[4,p];case"Map":return[5,p];case"Set":return[6,p]}return n.includes("Array")?[1,n]:n.includes("Error")?[7,n]:[2,n]},g=([e,t])=>0===e&&("function"===t||"symbol"===t),y=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const s=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},o=r=>{if(n.has(r))return n.get(r);let[a,i]=d(r);switch(a){case 0:{let t=r;switch(i){case"bigint":a=8,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+i);t=null;break;case"undefined":return s([-1],r)}return s([a,t],r)}case 1:{if(i)return s([i,[...r]],r);const e=[],t=s([a,e],r);for(const t of r)e.push(o(t));return t}case 2:{if(i)switch(i){case"BigInt":return s([i,r.toString()],r);case"Boolean":case"Number":case"String":return s([i,r.valueOf()],r)}if(t&&"toJSON"in r)return o(r.toJSON());const n=[],c=s([a,n],r);for(const t of h(r))!e&&g(d(r[t]))||n.push([o(t),o(r[t])]);return c}case 3:return s([a,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return s([a,{source:e,flags:t}],r)}case 5:{const t=[],n=s([a,t],r);for(const[n,s]of r)(e||!g(d(n))&&!g(d(s)))&&t.push([o(n),o(s)]);return n}case 6:{const t=[],n=s([a,t],r);for(const n of r)!e&&g(d(n))||t.push(o(n));return n}}const{message:c}=r;return s([a,{name:i,message:c}],r)};return o})(!(t||n),!!t,new Map,r)(e),r},{parse:w,stringify:m}=JSON,b={json:!0,lossy:!0};var _=Object.freeze({__proto__:null,parse:e=>u(w(e)),stringify:e=>m(y(e,b))});const v="array",E="function",k="null",x="number",T="object",S="string",A="symbol",O="undefined";let R=0;const j=new Map,$=new Map,P=e=>$.get(e),N=e=>{if(!j.has(e)){let t;for(;$.has(t=R++););j.set(e,t),$.set(t,e)}return j.get(e)},{ArrayBuffer:I,Atomics:M,Promise:F}=globalThis,{isArray:W}=Array,{create:H,getPrototypeOf:D,values:L}=Object,C=D(Int32Array),U=H(M),B=()=>F.withResolvers();let q=0;const J=new Map,z=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&J.set(this,[q++,0,B()])}},G=new WeakSet,Y=e=>(G.add(e),e),K=(e,t)=>{const{data:n}=e,r=W(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},X=e=>null!==e&&"object"==typeof e&&!G.has(e),V=new WeakMap,Z=(e,t,n)=>{if(J.has(e))t.set(e,J.get(e)[0]);else if(!(e instanceof C||e instanceof I))for(const r of L(e))X(r)&&!n.has(r)&&(n.add(r),Z(r,t,n))},Q=(...e)=>({value:new F((t=>{let n=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");n.onmessage=()=>t("ok"),n.postMessage(e)}))}),ee=(e,t,n)=>{for(const[n,r]of t)V.set(n,[r,e.currentTarget]);(({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>{e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o}))})(e,n)};let{BigInt64Array:te,Int32Array:ne,SharedArrayBuffer:re,Worker:se}=globalThis,oe=e=>e,ae=!1;const ie=e=>({...e,type:"module"});try{new re(4),se=class extends se{constructor(e,t){super(e,ie(t))}},U.waitAsync||(U.waitAsync=Q)}catch(e){const t=crypto.randomUUID(),n=new Map,r=(e,t,n,...r)=>{e.addEventListener(t,n,...r)},s=({serviceWorker:e},s,o)=>{let a,i=!0;r(e,"message",(e=>{if(K(e,t)){const[r,s,o]=e.data,i=[s,o].join(","),c=e=>{n.delete(i),a.postMessage([t,s,o,e])},l=n.get(i);if(l)c(l);else{const{promise:e,resolve:t}=B();n.set(i,t),e.then(c)}}})),e.getRegistration(s).then((t=>t??e.register(s))).then((function t(n){i=i&&!!e.controller,a=n.installing||n.waiting||n.active,"activated"===a.state?i?o():location.reload():r(a,"statechange",(()=>t(n)),{once:!0})}))};oe=Y,ae=!0,U.notify=(e,r)=>{const[s,o]=(e=>V.get(e))(e),a=[s,r].join(","),i=n.get(a);return i?i(e):n.set(a,e),o.postMessage([t,1,e,s,r]),0},U.waitAsync=(e,...t)=>{const[n,r]=((e,t)=>{const n=J.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]})(e,...t);return{value:r}},re=class extends I{},te=z(te,re),ne=z(ne,re);let o=null;se=class extends se{constructor(e,n){let a=n?.serviceWorker||"";if(a){if(a=new URL(a,location.href).href,n={...n,serviceWorker:a},!o){const{promise:e,resolve:t}=B();s(navigator,a,t),o=e}o.then((()=>super.postMessage([t,3])))}super(e,ie(n)),super.postMessage([t,0,n]),r(this,"message",(e=>{if(K(e,t)){const[t,n,...r]=e.data;switch(n){case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of J)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];J.delete(r),a("ok");break}})(...r);break;case 2:ee(e,...r)}}}))}postMessage(e,...n){return super.postMessage(((e,t)=>{const n=new Map;return X(t)&&Z(t,n,new Set),n.size?[e,2,n,t]:t})(t,e),...n)}}}const{BYTES_PER_ELEMENT:ce}=Int32Array,{BYTES_PER_ELEMENT:le}=Uint16Array,{notify:ue}=U,pe=new TextDecoder("utf-16"),fe=new WeakSet,he=(...e)=>(fe.add(e),e);let de="";let ge=0;const ye=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=""!==de,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,de));const h=ge++,d=[];fe.has(u.at(-1)||d)&&fe.delete(d=u.pop());const g=n(i?u.map(i):u);let y=t(2*ce);return a([e,2,l,h,y,g,r],{transfer:d}),c(y,0).value.then((()=>{p&&clearTimeout(f);const n=y[1];if(!n)return;const r=le*n;return y=t(r+r%ce),a([e,1,h,y]),c(y,0).value.then((()=>{const e=new Uint16Array(y.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(pe.decode(t))}))}))};var we=({parse:e,stringify:t,transform:n}=JSON)=>{const r=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(de=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(de=""),a[0]=1,ue(a,0)}})(t,n),s=crypto.randomUUID();return{Worker:class extends se{constructor(t,o){const a=new Map,i=new Map;super(t,o),this.proxy=((e,t)=>new Proxy(t,{get:(t,n)=>{let r;return"then"!==n&&(r=t.get(n),r||(r=ye(e,n),t.set(n,r))),r},set:(e,t,n)=>"then"!==t&&!!e.set(t,n)}))([s,e=>new ne(new re(e)),oe,!1,e,ae,(...e)=>this.postMessage(...e),n,U.waitAsync],a),this.postMessage(oe([s,0,o])),this.addEventListener("message",(e=>{if(K(e,s)){const[t,n,...s]=e.data;switch(n){case 2:((e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)})(r,i,a,s);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);ue(n,0)})(i,s)}}}))}},polyfill:ae,transfer:he}},me=Object.fromEntries([v,"bigint","boolean",E,k,x,T,S,A,O].map(((e,t)=>[e,t])));const be="ownKeys",_e="destruct",{[be]:ve}=Reflect,Ee=new Map(ve(Symbol).filter((e=>typeof Symbol[e]===A)).map((e=>[Symbol[e],e]))),ke=e=>Ee.get(e)||`.${Symbol.keyFor(e)||""}`,xe="42fb1e9a-1373-441e-813f-357c3deaee87",Te="M"+xe,Se="W"+xe,Ae=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),Oe=Object.create(null),Re=(e,t,{debug:n,handler:r,return:s,token:o=e}=Oe)=>{const a=s||new Proxy(e,r||Oe),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),Ae.register(...i),a},{addEventListener:je}=EventTarget.prototype,$e=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,...n){const r=n.at(0)?.invoke;if(r){let t=$e.get(this);t||(t=new Map,$e.set(this,t)),t.set(e,[].concat(r)),delete n[0].invoke}return je.call(this,e,t,...n)}});const{isArray:Pe}=Array;const{url:Ne}=import.meta,Ie=/import\((['"])([^)]+?\.js)\1\)/g,Me=(e,t,n)=>`import(${t}${new URL(n,Ne).href}${t})`,{Worker:Fe}=(e=>{const t=we(e),n=e=>{const t=typeof e;switch(t){case T:return null===e?[me[k],e]:e===globalThis?[me[T],null]:Pe(e)?[me[v],N(e)]:[me[T],e instanceof C?e:N(e)];case E:return[me[E],N(e)];case A:return[me[A],ke(e)];default:return[me[t],e]}};class r extends t.Worker{constructor(e,t){const{proxy:r}=super(e,t),{[Se]:s}=r,o=new Map,a=e=>{o.delete(e),s(_e,e)},i=([e,t])=>{switch(e){case me[T]:if(null===t)return globalThis;if(typeof t===x)return P(t);if(!(t instanceof C))for(const e in t)t[e]=i(t[e]);return t;case me[v]:return typeof t===x?P(t):t.map(i);case me[E]:switch(typeof t){case x:return P(t);case S:{let e=o.get(t)?.deref();return e||(e=Re(t,a,{token:!1,return:function(...e){return e.length&&e[0]instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e,s=$e.get(t||n)?.get(r);if(s)for(const t of s)e[t]()})(e[0]),s("apply",t,n(this),e.map(n)).then(i)}}),o.set(t,new WeakRef(e))),e}}case me[A]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,n]of Ee)if(n===e)return t})(t);default:return t}};r[Te]=(e,t,...r)=>{if(e===_e)(e=>{const[t,n]=typeof e===x?[$,j]:[j,$],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(t);else{const s=Reflect[e],o=null==t?globalThis:P(t);switch(e){case"defineProperty":{const[e,t]=r.map(i);return n(s(o,e,t))}case"getOwnPropertyDescriptor":{const e=s(o,...r.map(i));if(e){const{get:t,set:r,value:s}=e;t&&(e.get=n(t)),r&&(e.set=n(r)),s&&(e.value=n(s))}return[me[e?T:O],e]}case be:return[me[v],s(o).map(n)];default:return((e,t,r)=>n(e(t,...r.map(i))))(s,o,r)}}}}}return{...t,Worker:r}})(_);Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const We={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\r\n]+/))if(t.trim().length){/^(\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},{replace:He}="",De=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g,Le={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"'},Ce=e=>Le[e],Ue=new WeakMap,Be=e=>{const t=e||console,n={buffered:Je,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return Ue.set(t,n),t}}},qe=new TextDecoder,Je=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(qe.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},ze=(e,...t)=>We[typeof e](e,...t),Ge=e=>He.call(e,De,Ce),{isArray:Ye}=Array,{assign:Ke,create:Xe,defineProperties:Ve,defineProperty:Ze,entries:Qe}=Object,{all:et,resolve:tt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),nt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;let rt=0;const st=(e,t)=>({id:e.id||(e.id=`${t}-w${rt++}`),tag:e.tagName}),ot=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},at=(e,t,n,r)=>({type:t,config:n,interpreter:r,io:Ue.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}),it=e=>e.replace(/^(?:\n|\r\n)/,""),ct=(e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,it(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,it(t),...o);return r&&await s(e,r,...o),a}},lt=Symbol.for("polyscript.js_modules"),ut=new Map;Ze(globalThis,lt,{value:ut});const pt=new Proxy(ut,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]}),ft=(e,t)=>!t.startsWith("_"),ht=(e,t)=>new Proxy(e,{has:ft,get:(e,n)=>e[t][n]}),dt=(e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,ht(r,e));t.registerJSModule(n,s,r)},gt=(e,t)=>import(e).then((e=>{ut.set(t,{...e})})),yt=e=>new Promise(((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(Ke(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))})),wt=e=>/\.css$/i.test(new URL(e).pathname),mt=!globalThis.window,bt=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):vt(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},_t=e=>{const t=e.split("/");return t.pop(),t.join("/")},vt=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},Et=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\/+/,"/")},kt=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},xt=(e,t)=>o(nt(e,t)).arrayBuffer(),Tt=(e,t,n,r)=>et((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(Ye(r))return r.map((n=>({url:kt([e,n]),path:kt([t,n])})));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:kt([t,s])}]}))})(n).map((({url:n,path:s})=>xt(n,r).then((n=>e.writeFile(t,s,n)))))),St=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,At=(e,t)=>e.replace(/\{.+?\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Ot=(e,t,n,r)=>et((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of Qe(e))if(/^\{.+\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,At(o,t))}else{const e=At(s,t),a=St(e,At(o||"./",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>xt(n,r).then((r=>e.writeFile(t,s,r,n)))))),Rt=({main:e,worker:t},n)=>{const r=[];if(t&&mt)for(let[e,s]of Qe(t))e=nt(e,n),r.push(gt(e,s));if(e&&!mt)for(let[t,s]of Qe(e))t=nt(t,n),wt(t)?yt(t):r.push(gt(t,s));return et(r)},{assign:jt}=Object,$t="entries",Pt="readonly",Nt="readwrite",It={durability:"default",prefix:"IDBMap"},Mt=({target:{result:e}})=>e;class Ft extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction($t,t,this.#t);return new Promise(((t,r)=>jt(e(n.objectStore($t)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=It.durability,prefix:n=It.prefix}=It){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{jt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore($t),n.oncomplete=()=>t(e)},onsuccess(e){t(Mt(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?jt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Pt).then(Mt)}async clear(){await this.#r((e=>e.clear()),Nt)}async delete(e){await this.#r((t=>t.delete(e)),Nt)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Pt).then(Mt)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Pt).then(Mt)}async keys(){return await this.#r((e=>e.getAllKeys()),Pt).then(Mt)}async set(e,t){return await this.#r((n=>n.put(t,e)),Nt),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class Wt extends Map{#s;#o;constructor(...e){super(),this.#s=new Ft(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const Ht=new WeakMap,Dt=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await Ht.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new Wt(e);return await t.sync(),t},n.JSON=_),e.registerJsModule(t,n)},Lt=(e,t)=>{if(e.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Ct=(e,t,...n)=>{try{return e.runPython(ze(t),...n)}catch(t){Ue.get(e).stderr(t)}},Ut=async(e,t,...n)=>{try{return await e.runPythonAsync(ze(t),...n)}catch(t){Ue.get(e).stderr(t)}},Bt=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){Ue.get(e).stderr(t)}};var qt=(new TextEncoder).encode('from uio import StringIO\nimport sys\n\nclass Response:\n    def __init__(self, f):\n        self.raw = f\n        self.encoding = "utf-8"\n        self._cached = None\n\n    def close(self):\n        if self.raw:\n            self.raw.close()\n            self.raw = None\n        self._cached = None\n\n    @property\n    def content(self):\n        if self._cached is None:\n            try:\n                self._cached = self.raw.read()\n            finally:\n                self.raw.close()\n                self.raw = None\n        return self._cached\n\n    @property\n    def text(self):\n        return str(self.content, self.encoding)\n\n    def json(self):\n        import ujson\n\n        return ujson.loads(self.content)\n\n\n# TODO try to support streaming xhr requests, a-la pyodide-http\nHEADERS_TO_IGNORE = ("user-agent",)\n\n\ntry:\n    import js\nexcept Exception as err:\n    raise OSError("This version of urequests can only be used in the browser")\n\n# TODO try to support streaming xhr requests, a-la pyodide-http\n\nHEADERS_TO_IGNORE = ("user-agent",)\n\n\ndef request(\n    method,\n    url,\n    data=None,\n    json=None,\n    headers={},\n    stream=None,\n    auth=None,\n    timeout=None,\n    parse_headers=True,\n):\n    from js import XMLHttpRequest\n\n    xhr = XMLHttpRequest.new()\n    xhr.withCredentials = False\n\n    if auth is not None:\n        import ubinascii\n\n        username, password = auth\n        xhr.open(method, url, False, username, password)\n    else:\n        xhr.open(method, url, False)\n\n    for name, value in headers.items():\n        if name.lower() not in HEADERS_TO_IGNORE:\n            xhr.setRequestHeader(name, value)\n\n    if timeout:\n        xhr.timeout = int(timeout * 1000)\n\n    if json is not None:\n        assert data is None\n        import ujson\n\n        data = ujson.dumps(json)\n        # s.write(b"Content-Type: application/json\\r\\n")\n        xhr.setRequestHeader("Content-Type", "application/json")\n\n    xhr.send(data)\n\n    # Emulates the construction process in the original urequests\n    resp = Response(StringIO(xhr.responseText))\n    resp.status_code = xhr.status\n    resp.reason = xhr.statusText\n    resp.headers = xhr.getAllResponseHeaders()\n\n    return resp\n\n\n# Other methods - head, post, put, patch, delete - are not used by\n# mip and therefore not included\n\n\ndef get(url, **kw):\n    return request("GET", url, **kw)\n\n\n# Content below this line is from the Micropython MIP package and is covered\n# by the applicable MIT license:\n# \n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \n# DEALINGS IN THE SOFTWARE.\n\n# MicroPython package installer\n# MIT license; Copyright (c) 2022 Jim Mussared\n\n\n_PACKAGE_INDEX = const("https://micropython.org/pi/v2")\n_CHUNK_SIZE = 128\n\n\n# This implements os.makedirs(os.dirname(path))\ndef _ensure_path_exists(path):\n    import os\n\n    split = path.split("/")\n\n    # Handle paths starting with "/".\n    if not split[0]:\n        split.pop(0)\n        split[0] = "/" + split[0]\n\n    prefix = ""\n    for i in range(len(split) - 1):\n        prefix += split[i]\n        try:\n            os.stat(prefix)\n        except:\n            os.mkdir(prefix)\n        prefix += "/"\n\n\n# Copy from src (stream) to dest (function-taking-bytes)\ndef _chunk(src, dest):\n    buf = memoryview(bytearray(_CHUNK_SIZE))\n    while True:\n        n = src.readinto(buf)\n        if n == 0:\n            break\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\n\n\n# Check if the specified path exists and matches the hash.\ndef _check_exists(path, short_hash):\n    import os\n\n    try:\n        import binascii\n        import hashlib\n\n        with open(path, "rb") as f:\n            hs256 = hashlib.sha256()\n            _chunk(f, hs256.update)\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], "utf-8")\n            return existing_hash == short_hash\n    except:\n        return False\n\n\ndef _rewrite_url(url, branch=None):\n    if not branch:\n        branch = "HEAD"\n    if url.startswith("github:"):\n        url = url[7:].split("/")\n        url = (\n            "https://raw.githubusercontent.com/"\n            + url[0]\n            + "/"\n            + url[1]\n            + "/"\n            + branch\n            + "/"\n            + "/".join(url[2:])\n        )\n    return url\n\n\ndef _download_file(url, dest):\n    response = get(url)\n    try:\n        if response.status_code != 200:\n            print("Error", response.status_code, "requesting", url)\n            return False\n\n        print("Copying:", dest)\n        _ensure_path_exists(dest)\n        with open(dest, "wb") as f:\n            _chunk(response.raw, f.write)\n\n        return True\n    finally:\n        response.close()\n\n\ndef _install_json(package_json_url, index, target, version, mpy):\n    response = get(_rewrite_url(package_json_url, version))\n    try:\n        if response.status_code != 200:\n            print("Package not found:", package_json_url)\n            return False\n\n        package_json = response.json()\n    finally:\n        response.close()\n    for target_path, short_hash in package_json.get("hashes", ()):\n        fs_target_path = target + "/" + target_path\n        if _check_exists(fs_target_path, short_hash):\n            print("Exists:", fs_target_path)\n        else:\n            file_url = "{}/file/{}/{}".format(index, short_hash[:2], short_hash)\n            if not _download_file(file_url, fs_target_path):\n                print("File not found: {} {}".format(target_path, short_hash))\n                return False\n    for target_path, url in package_json.get("urls", ()):\n        fs_target_path = target + "/" + target_path\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\n            print("File not found: {} {}".format(target_path, url))\n            return False\n    for dep, dep_version in package_json.get("deps", ()):\n        if not _install_package(dep, index, target, dep_version, mpy):\n            return False\n    return True\n\n\ndef _install_package(package, index, target, version, mpy):\n    if (\n        package.startswith("http://")\n        or package.startswith("https://")\n        or package.startswith("github:")\n    ):\n        if package.endswith(".py") or package.endswith(".mpy"):\n            print("Downloading {} to {}".format(package, target))\n            return _download_file(\n                _rewrite_url(package, version), target + "/" + package.rsplit("/")[-1]\n            )\n        else:\n            if not package.endswith(".json"):\n                if not package.endswith("/"):\n                    package += "/"\n                package += "package.json"\n            print("Installing {} to {}".format(package, target))\n    else:\n        if not version:\n            version = "latest"\n        print("Installing {} ({}) from {} to {}".format(package, version, index, target))\n\n        mpy_version = (\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, "_mpy") else "py"\n        )\n\n        # WARNING: mpy_version fails miserably with 1.22.0-380\n        package = "{}/package/{}/{}/{}.json".format(index, "py", package, version)\n\n    return _install_json(package, index, target, version, mpy)\n\n\ndef install(package, index=None, target=None, version=None, mpy=True):\n    if not target:\n        for p in sys.path:\n            if p.endswith("/lib"):\n                target = p\n                break\n        else:\n            print("Unable to find lib dir in sys.path")\n            return\n\n    if not index:\n        index = _PACKAGE_INDEX\n\n    if _install_package(package, index.rstrip("/"), target, version, mpy):\n        print("Done")\n    else:\n        print("Package may be partially installed")\n');const Jt=async e=>(await import("./toml-DiUM0_qs.js")).parse(e),zt=(e,t)=>{try{e.mkdir(t)}catch(e){}};var Gt={type:"micropython",module:(e="1.24.0-preview-114")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=Be({stderr:Je(console.error),stdout:Je(console.log)});n=n.replace(/\.m?js$/,".wasm");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=Yt.bind(this,i,r);return Ht.set(i,c),t.files&&await Ot(this,i,t.files,r),t.fetch&&await Tt(this,i,t.fetch,r),t.js_modules&&await Rt(t.js_modules,r),this.writeFile(i,"./mip.py",qt),t.packages&&await c(t.packages),i},registerJSModule:Dt,run:Ct,runAsync:Ut,runEvent:Bt,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=Lt(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-gl8b5xR3.js").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)zt(s,i);else{zt(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case"tgz":case"tar.gz":{const t="./_.tar.gz";return bt(i,t,n),void e.runPython(`\n                        import os, gzip, tarfile\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\n                        for f in tar:\n                            name = f"${r}{f.name}"\n                            if f.type == tarfile.DIRTYPE:\n                                if f.name != "./":\n                                    os.mkdir(name.strip("/"))\n                            else:\n                                dir = os.path.dirname(name)\n                                if not os.path.exists(dir):\n                                    os.mkdir(dir)\n                                source = tar.extractfile(f)\n                                with open(name, "wb") as dest:\n                                    dest.write(source.read())\n                                    dest.close()\n                        tar.close()\n                        os.remove("${t}")\n                    `)}}}return bt(i,t,n)}};async function Yt(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=nt(s,t),r=await o(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Kt={dict_converter:Object.fromEntries};let Xt=!1;const Vt=e=>(...t)=>{try{return Xt=!0,e(...t)}finally{Xt=!1}};let Zt=!1;const Qt=()=>{if(Zt)return;Zt=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if("function"==typeof s&&"copy"in s){Xt=!1;let o=e.get(s)?.deref();if(!o)try{o=Re(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),Xt=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return Xt&&n(t),s(this,e,t)}},call:{value(e,...t){return Xt&&n(t),s(this,e,t)}}})};var en={type:"pyodide",module:(e="0.26.1")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){mt||"auto"!==t.experimental_create_proxy||Qt();const{stderr:s,stdout:o,get:a}=Be(),i=n.slice(0,n.lastIndexOf("/")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=tn.bind(c);return Ht.set(c,l),t.files&&await Ot(this,c,t.files,r),t.fetch&&await Tt(this,c,t.fetch,r),t.js_modules&&await Rt(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:Dt,run:Vt(Ct),runAsync:Vt(Ut),runEvent:Vt(Bt),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(Kt):t,writeFile:(e,t,n,r)=>{const s=Lt(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return bt({FS:o,PATH:a,PATH_FS:i},t,n)}};async function tn(e){await this.loadPackage("micropip");const t=this.pyimport("micropip");await t.install(e,{keep_going:!0}),t.destroy()}const nn="ruby-wasm-wasi",rn=nn.replace(/\W+/g,"_");var sn={type:nn,experimental:!0,module:(e="2.6.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\/browser\/\+esm$/,"/ruby.wasm");const s=await o(n).arrayBuffer(),a=await WebAssembly.compile(s),{vm:i}=await e(a);return t.files&&await Ot(this,i,t.files,r),t.fetch&&await Tt(this,i,t.fetch,r),t.js_modules&&await Rt(t.js_modules,r),i},registerJSModule(e,t,n){t=t.replace(/\W+/g,"__");const r=`__module_${rn}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(ze(t),...n),runAsync:(e,t,...n)=>e.evalAsync(ze(t),...n),async runEvent(e,t,n){if(/^xworker\.(on\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${rn}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${nn}`)}};var on={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=Be(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)})),n.files&&await Ot(this,c,n.files,s),n.fetch&&await Tt(this,c,n.fetch,s),n.js_modules&&await Rt(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(ze(t),...n)}catch(t){Ue.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(ze(t),...n)}catch(t){Ue.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){Ue.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(vt(e,_t(t)),t=Et(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const an=new WeakMap,cn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=an.get(e),{output:o,result:a}=await n.captureR(ze(t));for(const{type:e,data:t}of o)s[e](t);return Re(a,r,{token:!1})};var ln={type:"webr",experimental:!0,module:(e="0.4.0")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=Be(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return an.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:Ue.get(o)}),t.files&&await Ot(this,o,t.files,r),t.fetch&&await Tt(this,o,t.fetch,r),t.js_modules&&await Rt(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:cn,runAsync:cn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log("transforming",t),t),writeFile:()=>{}};const un=new Map,pn=new Map,fn=[],hn=[],dn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=un.get(n),o=/^(?:\.?\.?\/|https?:\/\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>(pn.set(t,e),s(r,e,n,o))))}}),gn=e=>{for(const t of[].concat(e.type))un.set(t,e),fn.push(`script[type="${t}"]`),hn.push(`${t}-`)};for(const e of[Gt,en,sn,on,ln])gn(e);const{parse:yn}=JSON,wn=(e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[nt(e),n]},mn=e=>{try{return yn(e)}catch(t){return Jt(e)}},bn=(e,t,n,r={})=>{if(t){const[e,s]=wn(t,n);"json"===s?r=o(e).json():"toml"===s?r=o(e).text().then(Jt):"string"===s?r=mn(t):"object"===s&&t?r=t:"txt"===s&&"string"==typeof r&&(r=mn(r)),t=e}return tt(r).then((n=>dn[e](n,t)))},_n=(e,t="")=>`${e}@${t}`.replace(/@$/,"");function vn(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,((e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e))}const En="BeforeRun",kn="AfterRun",xn=[`code${En}`,`code${En}Async`,`code${kn}`,`code${kn}Async`],Tn=["onWorker","onReady",`on${En}`,`on${En}Async`,`on${kn}`,`on${kn}Async`];function Sn(e,t){const{run:n,runAsync:r}=un.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const An=(e,t,n,r,s,o)=>{if(s||o){const a=Sn.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let On=class{constructor(e,t={}){const{main:n,worker:r}=t;this.interpreter=e,this.onWorker=n?.onWorker;for(const e of Tn.slice(1))this[e]=r?.[e];for(const e of xn)this[e]=r?.[e]}toJSON(){const e={};for(const t of Tn.slice(1))this[t]&&(e[t]=vn(this[t]));for(const t of xn)this[t]&&(e[t]=ze(this[t]()));return e}};var Rn=(...e)=>function(t,n){if(e.length){const[t,r]=e;(n=Ke({},n||{type:t,version:r})).type||(n.type=t)}const[r]=wn(n.config,n.configURL),s=((...e)=>new Fe(URL.createObjectURL(new Blob(['const e="object"==typeof self?self:globalThis,t=t=>((t,n)=>{const r=(e,n)=>(t.set(n,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=n[o];switch(a){case 0:case-1:return r(i,o);case 1:{const e=r([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=r({},o);for(const[t,n]of i)e[s(t)]=s(n);return e}case 3:return r(new Date(i),o);case 4:{const{source:e,flags:t}=i;return r(new RegExp(e,t),o)}case 5:{const e=r(new Map,o);for(const[t,n]of i)e.set(s(t),s(n));return e}case 6:{const e=r(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:n}=i;return r(new e[t](n),o)}case 8:return r(BigInt(i),o);case"BigInt":return r(Object(BigInt(i)),o)}return r(new e[a](i),o)};return s})(new Map,t)(0),n="",{toString:r}={},{keys:s}=Object,o=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const s=r.call(e).slice(8,-1);switch(s){case"Array":return[1,n];case"Object":return[2,n];case"Date":return[3,n];case"RegExp":return[4,n];case"Map":return[5,n];case"Set":return[6,n]}return s.includes("Array")?[1,s]:s.includes("Error")?[7,s]:[2,s]},a=([e,t])=>0===e&&("function"===t||"symbol"===t),i=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const i=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},c=r=>{if(n.has(r))return n.get(r);let[l,u]=o(r);switch(l){case 0:{let t=r;switch(u){case"bigint":l=8,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return i([-1],r)}return i([l,t],r)}case 1:{if(u)return i([u,[...r]],r);const e=[],t=i([l,e],r);for(const t of r)e.push(c(t));return t}case 2:{if(u)switch(u){case"BigInt":return i([u,r.toString()],r);case"Boolean":case"Number":case"String":return i([u,r.valueOf()],r)}if(t&&"toJSON"in r)return c(r.toJSON());const n=[],p=i([l,n],r);for(const t of s(r))!e&&a(o(r[t]))||n.push([c(t),c(r[t])]);return p}case 3:return i([l,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return i([l,{source:e,flags:t}],r)}case 5:{const t=[],n=i([l,t],r);for(const[n,s]of r)(e||!a(o(n))&&!a(o(s)))&&t.push([c(n),c(s)]);return n}case 6:{const t=[],n=i([l,t],r);for(const n of r)!e&&a(o(n))||t.push(c(n));return n}}const{message:p}=r;return i([l,{name:u,message:p}],r)};return c})(!(t||n),!!t,new Map,r)(e),r},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var p=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))});const f="array",h="function",d="null",y="number",g="object",w="symbol",m="undefined",_="apply",b="construct",E="defineProperty",v="deleteProperty",T="get",x="getOwnPropertyDescriptor",k="getPrototypeOf",S="has",O="isExtensible",A="ownKeys",R="preventExtensions",j="set",P="setPrototypeOf";var $=Object.freeze({__proto__:null,APPLY:_,CONSTRUCT:b,DEFINE_PROPERTY:E,DELETE_PROPERTY:v,GET:T,GET_OWN_PROPERTY_DESCRIPTOR:x,GET_PROTOTYPE_OF:k,HAS:S,IS_EXTENSIBLE:O,OWN_KEYS:A,PREVENT_EXTENSION:R,SET:j,SET_PROTOTYPE_OF:P});function I(){return this}const N=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),M=Object.create(null),F=(e,t,{debug:n,handler:r,return:s,token:o=e}=M)=>{const a=s||new Proxy(e,r||M),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),N.register(...i),a},{Object:W,Proxy:H,Reflect:D}=globalThis,{isArray:C}=Array,{ownKeys:L}=D,{create:B,hasOwn:U,values:q}=W,J=(e,t)=>t===f?e[0]:t===h?e():t===g?e.$:e,z=(e,t,n,r)=>{const s={type:{value:t}},o=U(e,"valueOf");for(const a of q($)){let i=r(e[a]||D[a]);if(o&&a===T){const{valueOf:r}=e,{value:s}=i;i={value(e,o,...a){return o===n?r.call(this,J(e,t)):s.call(this,e,o,...a)}}}s[a]=i}return B(e,s)},G=(e,t,n,r=e)=>{if(r===e)switch(typeof e){case g:case m:r||(r=!1);case h:break;default:r=!1,t===e&&(t=W(e))}const s=new H(t,n),{destruct:o}=n;return o?F(e,o,{token:r,return:s}):s},Y=e=>t=>{const n=typeof t;return n===g?t?e.get(t)?.[0]??(e=>C(e)?f:g)(t):d:n},K=e=>t=>{let n=typeof t;switch(n){case g:if(!t){n=d;break}case h:const r=e.get(t);r&&([n,t]=r)}return[n,t]},X=e=>((e=>{N.unregister(e)})(e),e);var V=e=>{const t=new WeakMap,n=Symbol(),r={},s=(e,n,r)=>(t.set(e,[n,r]),e),o={proxy:r,release:X,pair:K(t),typeOf:Y(t),isProxy:e=>t.has(e),valueOf:e=>e[n]??e.valueOf()};for(const t of L(e)){if(U(o,t))continue;const a=e[t];switch(t){case f:{const e=z(a,t,n,(e=>({value([t],...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,[t],e,...n),f,t);break}case h:{const e=z(a,t,n,(e=>({value(t,...n){return e.call(this,t(),...n)}})));r[t]=(t,...n)=>{return s(G(t,(r=t,I.bind(r)),e,...n),h,t);var r};break}case g:{const e=z(a,t,n,(e=>({value({$:t},...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,{$:t},e,...n),g,t);break}default:{const e=z(a,t,n,(e=>({value:e})));r[t]=(n,...r)=>s(G(n,n,e,...r),t,n);break}}}return o};let Z=0;const Q=new Map,ee=new Map,te=e=>ee.get(e),ne=e=>{if(!Q.has(e)){let t;for(;ee.has(t=Z++););Q.set(e,t),ee.set(t,e)}return Q.get(e)},{ArrayBuffer:re,Atomics:se,Promise:oe}=globalThis,{isArray:ae}=Array,{create:ie,getPrototypeOf:ce,values:le}=Object,ue=ce(Int32Array),pe=ie(se),fe=({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o})),he=()=>oe.withResolvers();let de=0;const ye=new Map,ge=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&ye.set(this,[de++,0,he()])}},we=new WeakSet,me=e=>(we.add(e),e),_e=(e,t)=>{const{data:n}=e,r=ae(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},be=e=>null!==e&&"object"==typeof e&&!we.has(e),Ee=new WeakMap,ve=(e,t,n)=>{if(ye.has(e))t.set(e,ye.get(e)[0]);else if(!(e instanceof ue||e instanceof re))for(const r of le(e))be(r)&&!n.has(r)&&(n.add(r),ve(r,t,n))},Te=(...e)=>({value:new oe((t=>{let n=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");n.onmessage=()=>t("ok"),n.postMessage(e)}))}),xe=(e,t)=>{const n=ye.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]};let{BigInt64Array:ke,Int32Array:Se,SharedArrayBuffer:Oe,addEventListener:Ae,postMessage:Re}=globalThis,je=!0,Pe=e=>e,$e=!1;const Ie=he();try{new Oe(4),pe.waitAsync||(pe.waitAsync=Te),Ie.resolve()}catch(e){const t=Re,n=Ae,r=[];let s="",o="";Oe=class extends re{},ke=ge(ke,Oe),Se=ge(Se,Oe),Pe=me,$e=!0,pe.notify=(e,n)=>{const[r]=(e=>Ee.get(e))(e);return t([s,1,e,r,n]),0},pe.waitAsync=(...e)=>{const[t,n]=xe(...e);return{value:n}},pe.wait=(e,t,...n)=>{const[r]=xe(e,t,...n),a=new XMLHttpRequest;a.responseType="json",a.open("POST",`${o}?sabayon`,!1),a.setRequestHeader("Content-Type","application/json"),a.send(`["${s}",${r},${t}]`);const{response:i}=a;ye.delete(e);for(let t=0;t<i.length;t++)e[t]=i[t];return"ok"},n("message",(e=>{if(_e(e,s)){const[t,n,...r]=e.data;switch(n){case 0:s=t,o=r.at(0)?.serviceWorker||"",o||(pe.wait=null,Ie.resolve());break;case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of ye)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];ye.delete(r),a("ok");break}})(...r);break;case 2:((e,t,n)=>{for(const[n,r]of t)Ee.set(n,[r,e.currentTarget]);fe(e,n)})(e,...r);break;case 3:Ie.resolve()}}else if(je){const{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i}=e;r.push([{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i},e.data])}})),Ae=(e,...t)=>{if(n(e,...t),r.length)for(const e of r.splice(0))fe(...e)},Re=(e,...n)=>t(((e,t)=>{const n=new Map;return be(t)&&ve(t,n,new Set),n.size?[e,2,n,t]:t})(s,e),...n)}await Ie.promise,je=!1;const{BYTES_PER_ELEMENT:Ne}=Int32Array,{BYTES_PER_ELEMENT:Me}=Uint16Array,{notify:Fe}=pe,We=new TextDecoder("utf-16"),He=new WeakSet,De=(...e)=>(He.add(e),e);let Ce="";const Le=(e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)};let Be=0;const Ue=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=""!==Ce,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,Ce));const h=Be++,d=[];He.has(u.at(-1)||d)&&He.delete(d=u.pop());const y=n(i?u.map(i):u);let g=t(2*Ne);return a([e,2,l,h,g,y,r],{transfer:d}),c(g,0).value.then((()=>{p&&clearTimeout(f);const n=g[1];if(!n)return;const r=Me*n;return g=t(r+r%Ne),a([e,1,h,g]),c(g,0).value.then((()=>{const e=new Uint16Array(g.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(We.decode(t))}))}))},qe=(e,t)=>new Proxy(t,{get:(t,n)=>{let r;return"then"!==n&&(r=t.get(n),r||(r=Ue(e,n),t.set(n,r))),r},set:(e,t,n)=>"then"!==t&&!!e.set(t,n)}),{wait:Je,waitAsync:ze}=pe;var Ge=({parse:e,stringify:t,transform:n,interrupt:r}=JSON)=>{const s=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(Ce=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(Ce=""),a[0]=1,Fe(a,0)}})(t,n),o=he(),a=new Map,i=new Map;let c="",l=Je;if(Je&&r){const{handler:e,timeout:t=42}=r;l=(n,r,s)=>{for(;"timed-out"===(s=Je(n,r,0,t));)e();return s}}return Ae("message",(t=>{if(_e(t,c)){const[r,u,...p]=t.data;switch(u){case 0:{const t=!!Je;c=r,o.resolve({polyfill:$e,sync:t,transfer:De,proxy:qe([c,e=>new Se(new Oe(e)),Pe,t,e,$e,Re,n,t?(...e)=>({value:{then:t=>t(l(...e))}}):ze],a)});break}case 2:a.size?Le(s,i,a,p):setTimeout(Le,0,s,i,a,p);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);Fe(n,0)})(i,p)}}})),o.promise},Ye=Object.fromEntries([f,"bigint","boolean",h,d,y,g,"string",w,m].map(((e,t)=>[e,t])));const Ke="destruct",{[A]:Xe}=Reflect,Ve=new Map(Xe(Symbol).filter((e=>typeof Symbol[e]===w)).map((e=>[Symbol[e],e]))),Ze=e=>Ve.get(e)||`.${Symbol.keyFor(e)||""}`,Qe="42fb1e9a-1373-441e-813f-357c3deaee87",et="M"+Qe,tt="W"+Qe,{[_]:nt}=Reflect;const rt={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\r\\n]+/))if(t.trim().length){/^(\\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},st=new WeakMap,ot=e=>{const t=e||console,n={buffered:it,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return st.set(t,n),t}}},at=new TextDecoder,it=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(at.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},ct=(e,...t)=>rt[typeof e](e,...t),{isArray:lt}=Array,{assign:ut,create:pt,defineProperties:ft,defineProperty:ht,entries:dt}=Object,{all:yt,resolve:gt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),wt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href,mt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},_t=e=>Function(`\'use strict\';return (${e})`)(),bt=e=>e.replace(/^(?:\\n|\\r\\n)/,""),Et=Symbol.for("polyscript.js_modules"),vt=new Map;ht(globalThis,Et,{value:vt}),new Proxy(vt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Tt=(e,t)=>!t.startsWith("_"),xt=(e,t)=>new Proxy(e,{has:Tt,get:(e,n)=>e[t][n]}),kt=(e,t)=>import(e).then((e=>{vt.set(t,{...e})})),St=e=>new Promise(((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(ut(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))})),Ot=e=>/\\.css$/i.test(new URL(e).pathname),At=(e,t)=>e.has(t),Rt=e=>[...e.keys()];var jt=(e,t,n,r)=>{const s=globalThis[Et];if(n)for(let[e,t]of dt(n)){let n=s.get(t);n&&!lt(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:At,ownKeys:Rt,get:(e,s)=>{let o=e.get(s);if(lt(o)){let a=o;o=null;for(let e of a)e=wt(e,r),Ot(e)?n.importCSS(e):(n.importJS(e,s),o=t[Et].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Pt=Object.getOwnPropertyDescriptors(Response.prototype),$t=e=>"function"==typeof e,It={get:(e,t)=>Pt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!$t(r)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,Pt[t]):((e,t)=>$t(t)?t.bind(e):t)(e,e[t])};var Nt=(e,...t)=>new Proxy(fetch(e,...t),It);Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const Mt=!globalThis.window,Ft=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Ht(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Wt=e=>{const t=e.split("/");return t.pop(),t.join("/")},Ht=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},Dt=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\\/+/,"/")},Ct=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},Lt=(e,t)=>Nt(wt(e,t)).arrayBuffer(),Bt=(e,t,n,r)=>yt((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${r}, please supply \'to_file\' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(lt(r))return r.map((n=>({url:Ct([e,n]),path:Ct([t,n])})));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Ct([t,s])}]}))})(n).map((({url:n,path:s})=>Lt(n,r).then((n=>e.writeFile(t,s,n)))))),Ut=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,qt=(e,t)=>e.replace(/\\{.+?\\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Jt=(e,t,n,r)=>yt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of dt(e))if(/^\\{.+\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,qt(o,t))}else{const e=qt(s,t),a=Ut(e,qt(o||"./",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>Lt(n,r).then((r=>e.writeFile(t,s,r,n)))))),zt=({main:e,worker:t},n)=>{const r=[];if(t&&Mt)for(let[e,s]of dt(t))e=wt(e,n),r.push(kt(e,s));if(e&&!Mt)for(let[t,s]of dt(e))t=wt(t,n),Ot(t)?St(t):r.push(kt(t,s));return yt(r)},{assign:Gt}=Object,Yt="entries",Kt="readonly",Xt="readwrite",Vt={durability:"default",prefix:"IDBMap"},Zt=({target:{result:e}})=>e;class Qt extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Yt,t,this.#t);return new Promise(((t,r)=>Gt(e(n.objectStore(Yt)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=Vt.durability,prefix:n=Vt.prefix}=Vt){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{Gt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Yt),n.oncomplete=()=>t(e)},onsuccess(e){t(Zt(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Gt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Kt).then(Zt)}async clear(){await this.#r((e=>e.clear()),Xt)}async delete(e){await this.#r((t=>t.delete(e)),Xt)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Kt).then(Zt)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Kt).then(Zt)}async keys(){return await this.#r((e=>e.getAllKeys()),Kt).then(Zt)}async set(e,t){return await this.#r((n=>n.put(t,e)),Xt),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class en extends Map{#s;#o;constructor(...e){super(),this.#s=new Qt(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const tn=new WeakMap,nn=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await tn.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new en(e);return await t.sync(),t},n.JSON=p),e.registerJsModule(t,n)},rn=(e,t)=>{if(e.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},sn=(e,t,...n)=>{try{return e.runPython(ct(t),...n)}catch(t){st.get(e).stderr(t)}},on=async(e,t,...n)=>{try{return await e.runPythonAsync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},an=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}};var cn=(new TextEncoder).encode(\'from uio import StringIO\\nimport sys\\n\\nclass Response:\\n    def __init__(self, f):\\n        self.raw = f\\n        self.encoding = "utf-8"\\n        self._cached = None\\n\\n    def close(self):\\n        if self.raw:\\n            self.raw.close()\\n            self.raw = None\\n        self._cached = None\\n\\n    @property\\n    def content(self):\\n        if self._cached is None:\\n            try:\\n                self._cached = self.raw.read()\\n            finally:\\n                self.raw.close()\\n                self.raw = None\\n        return self._cached\\n\\n    @property\\n    def text(self):\\n        return str(self.content, self.encoding)\\n\\n    def json(self):\\n        import ujson\\n\\n        return ujson.loads(self.content)\\n\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\nHEADERS_TO_IGNORE = ("user-agent",)\\n\\n\\ntry:\\n    import js\\nexcept Exception as err:\\n    raise OSError("This version of urequests can only be used in the browser")\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\n\\nHEADERS_TO_IGNORE = ("user-agent",)\\n\\n\\ndef request(\\n    method,\\n    url,\\n    data=None,\\n    json=None,\\n    headers={},\\n    stream=None,\\n    auth=None,\\n    timeout=None,\\n    parse_headers=True,\\n):\\n    from js import XMLHttpRequest\\n\\n    xhr = XMLHttpRequest.new()\\n    xhr.withCredentials = False\\n\\n    if auth is not None:\\n        import ubinascii\\n\\n        username, password = auth\\n        xhr.open(method, url, False, username, password)\\n    else:\\n        xhr.open(method, url, False)\\n\\n    for name, value in headers.items():\\n        if name.lower() not in HEADERS_TO_IGNORE:\\n            xhr.setRequestHeader(name, value)\\n\\n    if timeout:\\n        xhr.timeout = int(timeout * 1000)\\n\\n    if json is not None:\\n        assert data is None\\n        import ujson\\n\\n        data = ujson.dumps(json)\\n        # s.write(b"Content-Type: application/json\\\\r\\\\n")\\n        xhr.setRequestHeader("Content-Type", "application/json")\\n\\n    xhr.send(data)\\n\\n    # Emulates the construction process in the original urequests\\n    resp = Response(StringIO(xhr.responseText))\\n    resp.status_code = xhr.status\\n    resp.reason = xhr.statusText\\n    resp.headers = xhr.getAllResponseHeaders()\\n\\n    return resp\\n\\n\\n# Other methods - head, post, put, patch, delete - are not used by\\n# mip and therefore not included\\n\\n\\ndef get(url, **kw):\\n    return request("GET", url, **kw)\\n\\n\\n# Content below this line is from the Micropython MIP package and is covered\\n# by the applicable MIT license:\\n# \\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\n# DEALINGS IN THE SOFTWARE.\\n\\n# MicroPython package installer\\n# MIT license; Copyright (c) 2022 Jim Mussared\\n\\n\\n_PACKAGE_INDEX = const("https://micropython.org/pi/v2")\\n_CHUNK_SIZE = 128\\n\\n\\n# This implements os.makedirs(os.dirname(path))\\ndef _ensure_path_exists(path):\\n    import os\\n\\n    split = path.split("/")\\n\\n    # Handle paths starting with "/".\\n    if not split[0]:\\n        split.pop(0)\\n        split[0] = "/" + split[0]\\n\\n    prefix = ""\\n    for i in range(len(split) - 1):\\n        prefix += split[i]\\n        try:\\n            os.stat(prefix)\\n        except:\\n            os.mkdir(prefix)\\n        prefix += "/"\\n\\n\\n# Copy from src (stream) to dest (function-taking-bytes)\\ndef _chunk(src, dest):\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\n    while True:\\n        n = src.readinto(buf)\\n        if n == 0:\\n            break\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\n\\n\\n# Check if the specified path exists and matches the hash.\\ndef _check_exists(path, short_hash):\\n    import os\\n\\n    try:\\n        import binascii\\n        import hashlib\\n\\n        with open(path, "rb") as f:\\n            hs256 = hashlib.sha256()\\n            _chunk(f, hs256.update)\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], "utf-8")\\n            return existing_hash == short_hash\\n    except:\\n        return False\\n\\n\\ndef _rewrite_url(url, branch=None):\\n    if not branch:\\n        branch = "HEAD"\\n    if url.startswith("github:"):\\n        url = url[7:].split("/")\\n        url = (\\n            "https://raw.githubusercontent.com/"\\n            + url[0]\\n            + "/"\\n            + url[1]\\n            + "/"\\n            + branch\\n            + "/"\\n            + "/".join(url[2:])\\n        )\\n    return url\\n\\n\\ndef _download_file(url, dest):\\n    response = get(url)\\n    try:\\n        if response.status_code != 200:\\n            print("Error", response.status_code, "requesting", url)\\n            return False\\n\\n        print("Copying:", dest)\\n        _ensure_path_exists(dest)\\n        with open(dest, "wb") as f:\\n            _chunk(response.raw, f.write)\\n\\n        return True\\n    finally:\\n        response.close()\\n\\n\\ndef _install_json(package_json_url, index, target, version, mpy):\\n    response = get(_rewrite_url(package_json_url, version))\\n    try:\\n        if response.status_code != 200:\\n            print("Package not found:", package_json_url)\\n            return False\\n\\n        package_json = response.json()\\n    finally:\\n        response.close()\\n    for target_path, short_hash in package_json.get("hashes", ()):\\n        fs_target_path = target + "/" + target_path\\n        if _check_exists(fs_target_path, short_hash):\\n            print("Exists:", fs_target_path)\\n        else:\\n            file_url = "{}/file/{}/{}".format(index, short_hash[:2], short_hash)\\n            if not _download_file(file_url, fs_target_path):\\n                print("File not found: {} {}".format(target_path, short_hash))\\n                return False\\n    for target_path, url in package_json.get("urls", ()):\\n        fs_target_path = target + "/" + target_path\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\n            print("File not found: {} {}".format(target_path, url))\\n            return False\\n    for dep, dep_version in package_json.get("deps", ()):\\n        if not _install_package(dep, index, target, dep_version, mpy):\\n            return False\\n    return True\\n\\n\\ndef _install_package(package, index, target, version, mpy):\\n    if (\\n        package.startswith("http://")\\n        or package.startswith("https://")\\n        or package.startswith("github:")\\n    ):\\n        if package.endswith(".py") or package.endswith(".mpy"):\\n            print("Downloading {} to {}".format(package, target))\\n            return _download_file(\\n                _rewrite_url(package, version), target + "/" + package.rsplit("/")[-1]\\n            )\\n        else:\\n            if not package.endswith(".json"):\\n                if not package.endswith("/"):\\n                    package += "/"\\n                package += "package.json"\\n            print("Installing {} to {}".format(package, target))\\n    else:\\n        if not version:\\n            version = "latest"\\n        print("Installing {} ({}) from {} to {}".format(package, version, index, target))\\n\\n        mpy_version = (\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, "_mpy") else "py"\\n        )\\n\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\n        package = "{}/package/{}/{}/{}.json".format(index, "py", package, version)\\n\\n    return _install_json(package, index, target, version, mpy)\\n\\n\\ndef install(package, index=None, target=None, version=None, mpy=True):\\n    if not target:\\n        for p in sys.path:\\n            if p.endswith("/lib"):\\n                target = p\\n                break\\n        else:\\n            print("Unable to find lib dir in sys.path")\\n            return\\n\\n    if not index:\\n        index = _PACKAGE_INDEX\\n\\n    if _install_package(package, index.rstrip("/"), target, version, mpy):\\n        print("Done")\\n    else:\\n        print("Package may be partially installed")\\n\');const ln=async e=>(await import("./toml-DiUM0_qs.js")).parse(e),un=(e,t)=>{try{e.mkdir(t)}catch(e){}};var pn={type:"micropython",module:(e="1.24.0-preview-114")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=ot({stderr:it(console.error),stdout:it(console.log)});n=n.replace(/\\.m?js$/,".wasm");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=fn.bind(this,i,r);return tn.set(i,c),t.files&&await Jt(this,i,t.files,r),t.fetch&&await Bt(this,i,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),this.writeFile(i,"./mip.py",cn),t.packages&&await c(t.packages),i},registerJSModule:nn,run:sn,runAsync:on,runEvent:an,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=rn(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-gl8b5xR3.js").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)un(s,i);else{un(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case"tgz":case"tar.gz":{const t="./_.tar.gz";return Ft(i,t,n),void e.runPython(`\\n                        import os, gzip, tarfile\\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\\n                        for f in tar:\\n                            name = f"${r}{f.name}"\\n                            if f.type == tarfile.DIRTYPE:\\n                                if f.name != "./":\\n                                    os.mkdir(name.strip("/"))\\n                            else:\\n                                dir = os.path.dirname(name)\\n                                if not os.path.exists(dir):\\n                                    os.mkdir(dir)\\n                                source = tar.extractfile(f)\\n                                with open(name, "wb") as dest:\\n                                    dest.write(source.read())\\n                                    dest.close()\\n                        tar.close()\\n                        os.remove("${t}")\\n                    `)}}}return Ft(i,t,n)}};async function fn(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=wt(s,t),r=await Nt(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const hn={dict_converter:Object.fromEntries};let dn=!1;const yn=e=>(...t)=>{try{return dn=!0,e(...t)}finally{dn=!1}};let gn=!1;const wn=()=>{if(gn)return;gn=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if("function"==typeof s&&"copy"in s){dn=!1;let o=e.get(s)?.deref();if(!o)try{o=F(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),dn=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return dn&&n(t),s(this,e,t)}},call:{value(e,...t){return dn&&n(t),s(this,e,t)}}})};var mn={type:"pyodide",module:(e="0.26.1")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){Mt||"auto"!==t.experimental_create_proxy||wn();const{stderr:s,stdout:o,get:a}=ot(),i=n.slice(0,n.lastIndexOf("/")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=_n.bind(c);return tn.set(c,l),t.files&&await Jt(this,c,t.files,r),t.fetch&&await Bt(this,c,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:nn,run:yn(sn),runAsync:yn(on),runEvent:yn(an),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(hn):t,writeFile:(e,t,n,r)=>{const s=rn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return Ft({FS:o,PATH:a,PATH_FS:i},t,n)}};async function _n(e){await this.loadPackage("micropip");const t=this.pyimport("micropip");await t.install(e,{keep_going:!0}),t.destroy()}const bn="ruby-wasm-wasi",En=bn.replace(/\\W+/g,"_");var vn={type:bn,experimental:!0,module:(e="2.6.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\\/browser\\/\\+esm$/,"/ruby.wasm");const s=await Nt(n).arrayBuffer(),o=await WebAssembly.compile(s),{vm:a}=await e(o);return t.files&&await Jt(this,a,t.files,r),t.fetch&&await Bt(this,a,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),a},registerJSModule(e,t,n){t=t.replace(/\\W+/g,"__");const r=`__module_${En}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(ct(t),...n),runAsync:(e,t,...n)=>e.evalAsync(ct(t),...n),async runEvent(e,t,n){if(/^xworker\\.(on\\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${En}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${bn}`)}};var Tn={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=ot(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)})),n.files&&await Jt(this,c,n.files,s),n.fetch&&await Bt(this,c,n.fetch,s),n.js_modules&&await zt(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Ht(e,Wt(t)),t=Dt(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const xn=new WeakMap,kn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=xn.get(e),{output:o,result:a}=await n.captureR(ct(t));for(const{type:e,data:t}of o)s[e](t);return F(a,r,{token:!1})};var Sn={type:"webr",experimental:!0,module:(e="0.4.0")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=ot(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return xn.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:st.get(o)}),t.files&&await Jt(this,o,t.files,r),t.fetch&&await Bt(this,o,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:kn,runAsync:kn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log("transforming",t),t),writeFile:()=>{}};const On=new Map,An=new Map,Rn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=On.get(n),o=/^(?:\\.?\\.?\\/|https?:\\/\\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>(An.set(t,e),s(r,e,n,o))))}}),jn=e=>{for(const t of[].concat(e.type))On.set(t,e)};for(const e of[pn,mn,vn,Tn,Sn])jn(e);const{parse:Pn}=JSON,$n=e=>{try{return Pn(e)}catch(t){return ln(e)}},In=(e,t,n,r={})=>{if(t){const[e,s]=((e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[wt(e),n]})(t,n);"json"===s?r=Nt(e).json():"toml"===s?r=Nt(e).text().then(ln):"string"===s?r=$n(t):"object"===s&&t?r=t:"txt"===s&&"string"==typeof r&&(r=$n(r)),t=e}return gt(r).then((n=>Rn[e](n,t)))},Nn="BeforeRun",Mn="AfterRun",Fn=[`code${Nn}`,`code${Nn}Async`,`code${Mn}`,`code${Mn}Async`],Wn=["onWorker","onReady",`on${Nn}`,`on${Nn}Async`,`on${Mn}`,`on${Mn}Async`];function Hn(e,t){const{run:n,runAsync:r}=On.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const Dn=(e,t,n,r,s,o)=>{if(s||o){const a=Hn.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Cn,Ln,Bn;const Un=(e,t)=>{addEventListener(e,t||(async t=>{try{await Cn,Ln(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{parse:qn,stringify:Jn}=p,{proxy:zn,sync:Gn,polyfill:Yn,window:Kn,isWindowProxy:Xn}=await(async e=>{const t=await Ge(e),n=e?.transform||(e=>e),{[et]:r}=t.proxy,s=new Map,o=(e,t)=>{let n=s.get(e)?.deref();return n||s.set(e,new WeakRef(n=t(e))),n},a=([e,t])=>{switch(e){case Ye[g]:return null==t?globalThis:typeof t===y?o(t,p.object):t;case Ye[f]:return typeof t===y?o(t,p.array):t;case Ye[h]:return typeof t===y?o(t,p.function):te(parseInt(t));case Ye[w]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,n]of Ve)if(n===e)return t})(t);default:return t}},i=e=>{let[t,r]=m(e);switch(t){case g:if(r==globalThis||null==r)r=null;else if(typeof r===g&&!(r instanceof ue)){r=n(r);for(const e in r)r[e]=i(r[e])}return[Ye[g],r];case f:return[Ye[f],typeof r===y?r:n(r).map(i)];case h:return[Ye[h],typeof r===h?String(ne(n(r))):r];case w:return[Ye[w],Ze(e)];default:return[Ye[t],r]}},c=(...e)=>a(r(...e)),l={[E]:(e,t,n)=>c(E,e,i(t),i(n)),[v]:(e,t)=>c(v,e,i(t)),[T]:(e,t)=>c(T,e,i(t)),[k]:e=>c(k,e),[x]:(e,t)=>{const n=c(x,e,i(t));if(n){const{get:e,set:t,value:r}=n;e&&(n.get=a(e)),t&&(n.set=a(t)),r&&(n.value=a(r))}return n},[S]:(e,t)=>c(S,e,i(t)),[O]:e=>c(O,e),[A]:e=>c(A,e).map(a),[R]:e=>c(R,e),[j]:(e,t,n)=>c(j,e,i(t),i(n)),[P]:(e,t)=>c(P,e,i(t)),[Ke](e){s.delete(e),r(Ke,e)}},u={object:l,array:l,function:{...l,[_]:(e,...t)=>c(_,e,...t.map(i)),[b]:(e,...t)=>c(b,e,...t.map(i))}},{proxy:p,isProxy:d,pair:m}=V(u),$=p.object(null);return t.proxy[tt]=(e,t,...n)=>{const r=parseInt(t);switch(e){case _:{const[e,t]=n;return i(nt(te(r),a(e),t.map(a)))}case Ke:(e=>{const[t,n]=typeof e===y?[ee,Q]:[Q,ee],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(r)}},{...t,window:$,isWindowProxy:d}})({parse:qn,stringify:Jn,transform:e=>Bn?Bn(e):e}),Vn={polyfill:Yn,sync:zn,window:Gn?Kn:null,isWindowProxy:Xn,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};Un("message",(({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{Cn=(async()=>{try{const{id:o,tag:a,type:i,custom:c,version:l,config:u,async:p}=e,f=((e,t="")=>`${e}@${t}`.replace(/@$/,""))(i,l),h=await In(f,t,n,u),{js_modules:d}=An.get(f),y=d?.main,g=pt(On.get(i)),w=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:st.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(g,c||i,u||{},h);let m="run";if(p&&(m+="Async"),s){let e,t,n="",r="";for(const e of Fn){const t=s[e];if(t){const s=e.endsWith("Async");(s&&p||!s&&!p)&&(e.startsWith("codeBefore")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,bt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,bt(t),...o);return r&&await s(e,r,...o),a}})(g,m,n,r);for(const n of Wn.slice(2)){const r=s[n];if(r){const s=n.endsWith("Async");if(s&&p||!s&&!p){const s=_t(r);n.startsWith("onBefore")?e=s:t=s}}}Dn(g,w,Vn,p,e,t)}let _,b,E,v=null,T="";Gn&&(({CustomEvent:_,document:b}=Kn),v=o&&b.getElementById(o)||null,E=e=>mt(v,c||i,e,!0,_));const x=jt(Kn,zn,y,t);if(((e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,xt(r,e));t.registerJSModule(n,s,r)})(i,g,h,x),g.registerJSModule(h,"polyscript",{xworker:Vn,currentScript:v,config:w.config,js_modules:x,get target(){return!T&&v&&("SCRIPT"===a?v.after(ut(b.createElement(`script-${c||i}`),{id:T=`${o}-target`})):(T=o,v.replaceChildren(),v.style.display="block")),T}}),Ln=g.runEvent.bind(g,h),Bn=g.transform.bind(g,h),v&&E("ready"),s?.onReady&&_t(s?.onReady).call(g,Hn.call(g,w,h),Vn),await g[m](h,r),["micropython","pyodide"].includes(g.type)){const e="polyscript",t=`__${e}_workers__`,n="__export__";h.runPython([`import js as ${t}`,`${t}.${t} = "${n}" in locals() and ${n} or []`,`del ${t}`].join("\\n"));const r=[...globalThis[t]];delete globalThis[t],r.length&&h.runPython([`from ${e} import xworker as ${t}`,...r.map((e=>`${t}.sync.${e} = ${e}`)),`del ${t}`].join("\\n"))}return v&&E("done"),postMessage("polyscript:done"),h}catch(e){postMessage(e)}})(),Un("error"),Un("message"),Un("messageerror")}));\n'.replace(Ie,Me)],{type:"application/javascript"})),...e))({serviceWorker:n?.serviceWorker||n?.service_worker}),{postMessage:a}=s,i=this instanceof On,c=Ke(s.proxy,{importJS:gt,importCSS:yt}),l=Promise.withResolvers();let u=o(t).text().then((e=>{const t=i?this.toJSON():void 0;a.call(s,{options:n,config:r,code:e,hooks:t})})).then((()=>{u={then:e=>e()}}));return Ve(s,{sync:{value:c},ready:{value:l.promise},postMessage:{value:(e,...t)=>u.then((()=>a.call(s,e,...t)))},onerror:{writable:!0,configurable:!0,value:console.error}}),s.addEventListener("message",(e=>{const{data:t}=e,n=t instanceof Error;(n||"polyscript:done"===t)&&(e.stopImmediatePropagation(),n?(l.reject(t),s.onerror(Xe(e,{type:{value:"error"},error:{value:t}}))):l.resolve(s))})),i&&this.onWorker?.(this.interpreter,s),s};const jn="Invalid content",$n="Invalid worker attribute",Pn="Invalid worker attribute";var Nn=e=>{const{src:t,worker:n}=e.attributes;if(n){let{value:r}=n;if(r)throw new SyntaxError(Pn);if(r=t?.value,!r){if(t)throw new SyntaxError($n);if(e.childElementCount){const{innerHTML:t,localName:n,type:s}=e,o=s||n.replace(/-script$/,"");r=Ge(t),console.warn(`Deprecated: use <script type="${o}"> for an always safe content parsing:\n`,r)}else r=e.textContent;return URL.createObjectURL(new Blob([ze(r)],{type:"text/plain"}))}return r}if(t&&e.textContent.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*(?:\/\/|#).*/gm,"").trim())throw new SyntaxError(jn)};const In=(e,t)=>{const n=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(e);return n.getElementById(t)||((e,t=document)=>t.querySelector(e))(t,n)},Mn=new WeakMap,Fn={get(){let e=Mn.get(this);return e||(e=document.createElement(`${this.type}-script`),Mn.set(this,e),Cn(this)),e},set(e){"string"==typeof e?Mn.set(this,In(this,e)):(Mn.set(this,e),Cn(this))}},Wn=new WeakMap,Hn=new Map,Dn=(e,t)=>{const n=e?.value;return n?t+n:""},Ln=(e,t,n,r,s,o,a=e)=>{if(!Hn.has(t)){const i={interpreter:bn(n,s,o),queue:tt(),XWorker:Rn(e,r)};Hn.set(t,i),Hn.has(e)||Hn.set(e,i),Hn.has(a)||Hn.set(a,i)}return Hn.get(t)},Cn=async e=>{if(Wn.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{async:t,config:n,env:r,name:s,target:i,version:l,"service-worker":u},src:p,type:f}=e,h=l?.value,d=_n(f,h);let g=Dn(n,"|");const y=Dn(r,"")||`${d}${g}`;g=g.slice(1);const w=Nn(e);if(w){const n=new(Rn(f,h))(w,{...st(e,f),async:!!t,config:g,serviceWorker:u?.value});Wn.set(Ze(e,"xworker",{value:n}),{xworker:n});const r=s?.value;return void(r&&a[r].resolve(n.ready))}const m=Dn(i,""),b=Ln(f,y,d,h,g);Wn.set(Ze(e,"target",Fn),b),m&&Mn.set(e,In(e,m));const _=p?o(p).text():e.textContent;b.queue=b.queue.then((()=>(async(e,t,n,r)=>{const{type:s}=e,o=un.get(s);o.experimental&&console.warn(`The ${s} interpreter is experimental`);const[a,i]=await et([Wn.get(e).interpreter,t]);try{Ze(document,"currentScript",{configurable:!0,get:()=>e}),dt(s,o,a,pt),o.registerJSModule(a,"polyscript",{XWorker:n,currentScript:e,js_modules:pt,workers:c}),ot(e,s,"ready");const t=o[r?"runAsync":"run"](a,i),l=ot.bind(null,e,s,"done");return r?t.then(l):l(),t}finally{delete document.currentScript}})(e,_,b.XWorker,!!t)))}},Un=new Proxy(Xe(null),{get:(e,t)=>new Promise(queueMicrotask).then((()=>Bn(t)))}),Bn=async e=>{if(Hn.has(e)){const{interpreter:t,queue:n}=Hn.get(e);return(await et([t,n]))[0]}const t=Hn.size?`Available interpreters are: ${[...Hn.keys()].map((e=>`"${e}"`)).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},qn=async e=>{const{type:n,currentTarget:r}=e;if(hn.length)for(let{name:s,value:o,ownerElement:a}of t(`./@*[${hn.map((e=>`name()="${e}${n}"`)).join(" or ")}]`,r)){s=s.slice(0,-(n.length+1));const t=await Bn(a.getAttribute(`${s}-env`)||s);un.get(s).runEvent(t,o,e)}},Jn=e=>{if(hn.length)for(let{name:n,ownerElement:r}of t(`.//@*[${hn.map((e=>`starts-with(name(),"${e}")`)).join(" or ")}]`,e)){const e=n.lastIndexOf("-"),t=n.slice(e+1);"env"!==t&&(r.addEventListener(t,qn),"disabled"in r&&!r.disabled&&(r.disabled=!0,Un[n.slice(0,e)].then((()=>{r.disabled=!1}))))}},zn=Rn(),Gn=[],Yn=new Map,Kn=new Map,Xn=new Map,Vn=async e=>{for(const t of Gn)if(e.matches(t)){const n=Kn.get(t),r=Zn.get(n),{resolve:s}=Xn.get(n),{options:o,known:i}=r;if(i.has(e))return;i.add(e);for(const[t,n]of Yn)e.matches(t)&&await n(e);const{interpreter:l,configURL:u,config:p,version:f,env:h,onerror:d,hooks:g}=o;let y;try{const t=Nn(e);if(t){const r=zn.call(new On(null,g),t,{...st(e,n),version:f,configURL:u,type:l,custom:n,config:e.getAttribute("config")||p||{},async:e.hasAttribute("async"),serviceWorker:e.getAttribute("service-worker")});Ze(e,"xworker",{value:r}),s({type:n,xworker:r});const o=e.getAttribute("name");return void(o&&a[o].resolve(r.ready))}}catch(e){y=e}const w=_n(l,f),m=h||`${w}${p?`|${p}`:""}`,{interpreter:b,XWorker:_}=Ln(n,m,w,f,p,u,l),v=await b,E=Xe(un.get(l)),k=new On(v,g),x=function(...e){return _.apply(k,e)},T={...at(E,n,structuredClone(pn.get(w)),v),XWorker:x};dt(l,E,v,pt),E.registerJSModule(v,"polyscript",{XWorker:x,config:T.config,currentScript:n.startsWith("_")?null:e,js_modules:pt,workers:c});for(const t of["Run","RunAsync"]){let n,r,s="",o="";for(const e of xn){const n=g?.main?.[e];n&&e.endsWith(t)&&(e.startsWith("codeBefore")?s=ze(n()):o=ze(n()))}(s||o)&&ct(E,`r${t.slice(1)}`,s,o);for(let e=2;e<Tn.length;e++){const s=Tn[e],o=g?.main?.[s];o&&s.endsWith(t)&&(s.startsWith("onBefore")?n=o:r=o)}An(E,T,e,t.endsWith("Async"),n,r)}r.queue=r.queue.then((()=>(s(T),y&&d?.(y,e),g?.main?.onReady?.(T,e))))}},Zn=new Map;let Qn=0;const er=e=>(Xn.has(e)||Xn.set(e,Promise.withResolvers()),Xn.get(e).promise),[{customObserver:tr,define:nr,whenDefined:rr,env:sr,Hook:or,XWorker:ar},ir]=((e,t,n=globalThis)=>{const r=Symbol.for(e),s=r in n;return[s?n[r]:Object.defineProperty(n,r,{value:t})[r],s]})("polyscript",{customObserver:Yn,define:(t,n)=>{let r=null==t;if(r)t="_ps"+Qn++;else if(un.has(t)||Zn.has(t))throw new Error(`<script type="${t}"> already registered`);if(!un.has(n?.interpreter))throw new Error("Unspecified interpreter");un.set(t,un.get(n.interpreter));const s=[`script[type="${t}"]`];if(er(t),r){const{hooks:e}=n,r=e?.main?.onReady;n={...n,hooks:{...e,main:{...e?.main,onReady(e,n){Gn.splice(Gn.indexOf(t),1),un.delete(t),Zn.delete(t),Xn.delete(t),n.remove(),r?.(e)}}}},document.head.append(Ke(document.createElement("script"),{type:t}))}else s.push(`${t}-script`),hn.push(`${t}-`);for(const e of s)Kn.set(e,t);Gn.push(...s),Zn.set(t,{options:Ke({env:t},n),known:new WeakSet,queue:Promise.resolve()}),r||Jn(document),e(s.join(",")).forEach(Vn)},whenDefined:er,env:Un,Hook:On,XWorker:zn});if(!ir){const t=new MutationObserver((e=>{const t=fn.join(",");for(const{type:r,target:s,attributeName:o,addedNodes:a}of e)if("attributes"!==r)for(const e of a)1===e.nodeType&&(Jn(e),t&&e.matches(t)?Cn(e):n(t,e,!0));else{const e=o.lastIndexOf("-")+1;if(e){const t=o.slice(0,e);for(const n of hn)if(t===n){const t=o.slice(e);if("env"!==t){const e=s.hasAttribute(o)?"add":"remove";s[`${e}EventListener`](t,qn)}break}}}})),n=(t,n,r)=>{t&&e(t,n).forEach(Cn),(t=Gn.join(","))&&(r&&Vn(n),e(t,n).forEach(Vn))},r=e=>(t.observe(e,{childList:!0,subtree:!0,attributes:!0}),e),{attachShadow:s}=Element.prototype;Ke(Element.prototype,{attachShadow(e){return r(s.call(this,e))}}),queueMicrotask((()=>{Jn(r(document)),n(fn.join(","),document,!1)}))}export{or as Hook,jn as INVALID_CONTENT,$n as INVALID_SRC_ATTR,Pn as INVALID_WORKER_ATTR,ar as XWorker,tr as customObserver,nr as define,sr as env,rr as whenDefined};
+const e=(e,t=document)=>[...t.querySelectorAll(e)],t=(e,t=document)=>{const n=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),r=[];for(let e=0,{snapshotLength:t}=n;e<t;e++)r.push(n.snapshotItem(e));return r},n=Object.getOwnPropertyDescriptors(Response.prototype),r=e=>"function"==typeof e,s={get:(e,t)=>n.hasOwnProperty(t)?((e,t,{get:n,value:s})=>n||!r(s)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,n[t]):((e,t)=>r(t)?t.bind(e):t)(e,e[t])};var o=(e,...t)=>new Proxy(fetch(e,...t),s);const a=new Proxy(new Map,{get:(e,t)=>(e.has(t)||e.set(t,Promise.withResolvers()),e.get(t))}),i=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),c=new Proxy(Object.freeze({}),{get:(e,t)=>"string"!=typeof t||i.has(t)?void 0:a[t].promise.then((e=>e.sync))}),l="object"==typeof self?self:globalThis,u=e=>((e,t)=>{const n=(t,n)=>(e.set(n,t),t),r=s=>{if(e.has(s))return e.get(s);const[o,a]=t[s];switch(o){case 0:case-1:return n(a,s);case 1:{const e=n([],s);for(const t of a)e.push(r(t));return e}case 2:{const e=n({},s);for(const[t,n]of a)e[r(t)]=r(n);return e}case 3:return n(new Date(a),s);case 4:{const{source:e,flags:t}=a;return n(new RegExp(e,t),s)}case 5:{const e=n(new Map,s);for(const[t,n]of a)e.set(r(t),r(n));return e}case 6:{const e=n(new Set,s);for(const t of a)e.add(r(t));return e}case 7:{const{name:e,message:t}=a;return n(new l[e](t),s)}case 8:return n(BigInt(a),s);case"BigInt":return n(Object(BigInt(a)),s)}return n(new l[o](a),s)};return r})(new Map,e)(0),p="",{toString:f}={},{keys:h}=Object,d=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const n=f.call(e).slice(8,-1);switch(n){case"Array":return[1,p];case"Object":return[2,p];case"Date":return[3,p];case"RegExp":return[4,p];case"Map":return[5,p];case"Set":return[6,p]}return n.includes("Array")?[1,n]:n.includes("Error")?[7,n]:[2,n]},g=([e,t])=>0===e&&("function"===t||"symbol"===t),y=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const s=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},o=r=>{if(n.has(r))return n.get(r);let[a,i]=d(r);switch(a){case 0:{let t=r;switch(i){case"bigint":a=8,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+i);t=null;break;case"undefined":return s([-1],r)}return s([a,t],r)}case 1:{if(i)return s([i,[...r]],r);const e=[],t=s([a,e],r);for(const t of r)e.push(o(t));return t}case 2:{if(i)switch(i){case"BigInt":return s([i,r.toString()],r);case"Boolean":case"Number":case"String":return s([i,r.valueOf()],r)}if(t&&"toJSON"in r)return o(r.toJSON());const n=[],c=s([a,n],r);for(const t of h(r))!e&&g(d(r[t]))||n.push([o(t),o(r[t])]);return c}case 3:return s([a,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return s([a,{source:e,flags:t}],r)}case 5:{const t=[],n=s([a,t],r);for(const[n,s]of r)(e||!g(d(n))&&!g(d(s)))&&t.push([o(n),o(s)]);return n}case 6:{const t=[],n=s([a,t],r);for(const n of r)!e&&g(d(n))||t.push(o(n));return n}}const{message:c}=r;return s([a,{name:i,message:c}],r)};return o})(!(t||n),!!t,new Map,r)(e),r},{parse:w,stringify:m}=JSON,_={json:!0,lossy:!0};var b=Object.freeze({__proto__:null,parse:e=>u(w(e)),stringify:e=>m(y(e,_))});const v="array",E="function",k="null",x="number",T="object",S="string",A="symbol",j="undefined";let O=0;const R=new Map,$=new Map,P=e=>$.get(e),I=e=>{if(!R.has(e)){let t;for(;$.has(t=O++););R.set(e,t),$.set(t,e)}return R.get(e)},{ArrayBuffer:M,Atomics:N,Promise:F}=globalThis,{isArray:W}=Array,{create:H,getPrototypeOf:D,values:L}=Object,C=D(Int32Array),U=H(N),B=()=>F.withResolvers();let q=0;const J=new Map,z=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&J.set(this,[q++,0,B()])}},G=new WeakSet,Y=e=>(G.add(e),e),K=(e,t)=>{const{data:n}=e,r=W(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},X=e=>null!==e&&"object"==typeof e&&!G.has(e),V=new WeakMap,Q=(e,t,n)=>{if(J.has(e))t.set(e,J.get(e)[0]);else if(!(e instanceof C||e instanceof M))for(const r of L(e))X(r)&&!n.has(r)&&(n.add(r),Q(r,t,n))},Z=(...e)=>({value:new F((t=>{let n=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");n.onmessage=()=>t("ok"),n.postMessage(e)}))}),ee=(e,t,n)=>{for(const[n,r]of t)V.set(n,[r,e.currentTarget]);(({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>{e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o}))})(e,n)};let{BigInt64Array:te,Int32Array:ne,SharedArrayBuffer:re,Worker:se}=globalThis,oe=e=>e,ae=!1;const ie=e=>({...e,type:"module"});try{new re(4),se=class extends se{constructor(e,t){super(e,ie(t))}},U.waitAsync||(U.waitAsync=Z)}catch(e){const t=crypto.randomUUID(),n=new Map,r=(e,t,n,...r)=>{e.addEventListener(t,n,...r)},s=({serviceWorker:e},s,o)=>{let a,i=!0;r(e,"message",(e=>{if(K(e,t)){const[r,s,o]=e.data,i=[s,o].join(","),c=e=>{n.delete(i),a.postMessage([t,s,o,e])},l=n.get(i);if(l)c(l);else{const{promise:e,resolve:t}=B();n.set(i,t),e.then(c)}}})),e.getRegistration(s).then((t=>t??e.register(s))).then((function t(n){i=i&&!!e.controller,a=n.installing||n.waiting||n.active,"activated"===a.state?i?o():location.reload():r(a,"statechange",(()=>t(n)),{once:!0})}))};oe=Y,ae=!0,U.notify=(e,r)=>{const[s,o]=(e=>V.get(e))(e),a=[s,r].join(","),i=n.get(a);return i?i(e):n.set(a,e),o.postMessage([t,1,e,s,r]),0},U.waitAsync=(e,...t)=>{const[n,r]=((e,t)=>{const n=J.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]})(e,...t);return{value:r}},re=class extends M{},te=z(te,re),ne=z(ne,re);let o=null;se=class extends se{constructor(e,n){let a=n?.serviceWorker||"";if(a){if(a=new URL(a,location.href).href,n={...n,serviceWorker:a},!o){const{promise:e,resolve:t}=B();s(navigator,a,t),o=e}o.then((()=>super.postMessage([t,3])))}super(e,ie(n)),super.postMessage([t,0,n]),r(this,"message",(e=>{if(K(e,t)){const[t,n,...r]=e.data;switch(n){case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of J)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];J.delete(r),a("ok");break}})(...r);break;case 2:ee(e,...r)}}}))}postMessage(e,...n){return super.postMessage(((e,t)=>{const n=new Map;return X(t)&&Q(t,n,new Set),n.size?[e,2,n,t]:t})(t,e),...n)}}}const{BYTES_PER_ELEMENT:ce}=Int32Array,{BYTES_PER_ELEMENT:le}=Uint16Array,{notify:ue}=U,pe=new TextDecoder("utf-16"),fe=new WeakSet,he=(...e)=>(fe.add(e),e);let de="";let ge=0;const ye=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=""!==de,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,de));const h=ge++,d=[];fe.has(u.at(-1)||d)&&fe.delete(d=u.pop());const g=n(i?u.map(i):u);let y=t(2*ce);return a([e,2,l,h,y,g,r],{transfer:d}),c(y,0).value.then((()=>{p&&clearTimeout(f);const n=y[1];if(!n)return;const r=le*n;return y=t(r+r%ce),a([e,1,h,y]),c(y,0).value.then((()=>{const e=new Uint16Array(y.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(pe.decode(t))}))}))};var we=({parse:e,stringify:t,transform:n}=JSON)=>{const r=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(de=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(de=""),a[0]=1,ue(a,0)}})(t,n),s=crypto.randomUUID();return{Worker:class extends se{constructor(t,o){const a=new Map,i=new Map;super(t,o),this.proxy=((e,t)=>new Proxy(t,{get:(t,n)=>{let r;return"then"!==n&&(r=t.get(n),r||(r=ye(e,n),t.set(n,r))),r},set:(e,t,n)=>"then"!==t&&!!e.set(t,n)}))([s,e=>new ne(new re(e)),oe,!1,e,ae,(...e)=>this.postMessage(...e),n,U.waitAsync],a),this.postMessage(oe([s,0,o])),this.addEventListener("message",(e=>{if(K(e,s)){const[t,n,...s]=e.data;switch(n){case 2:((e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)})(r,i,a,s);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);ue(n,0)})(i,s)}}}))}},polyfill:ae,transfer:he}},me=Object.fromEntries([v,"bigint","boolean",E,k,x,T,S,A,j].map(((e,t)=>[e,t])));const _e="ownKeys",be="destruct",{[_e]:ve}=Reflect,Ee=new Map(ve(Symbol).filter((e=>typeof Symbol[e]===A)).map((e=>[Symbol[e],e]))),ke=e=>Ee.get(e)||`.${Symbol.keyFor(e)||""}`,xe="42fb1e9a-1373-441e-813f-357c3deaee87",Te="M"+xe,Se="W"+xe,Ae=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),je=Object.create(null),Oe=(e,t,{debug:n,handler:r,return:s,token:o=e}=je)=>{const a=s||new Proxy(e,r||je),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),Ae.register(...i),a},{addEventListener:Re}=EventTarget.prototype,$e=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,...n){const r=n.at(0)?.invoke;if(r){let t=$e.get(this);t||(t=new Map,$e.set(this,t)),t.set(e,[].concat(r)),delete n[0].invoke}return Re.call(this,e,t,...n)}});const{isArray:Pe}=Array;const{url:Ie}=import.meta,Me=/import\((['"])([^)]+?\.js)\1\)/g,Ne=(e,t,n)=>`import(${t}${new URL(n,Ie).href}${t})`,{Worker:Fe}=(e=>{const t=we(e),n=e=>{const t=typeof e;switch(t){case T:return null===e?[me[k],e]:e===globalThis?[me[T],null]:Pe(e)?[me[v],I(e)]:[me[T],e instanceof C?e:I(e)];case E:return[me[E],I(e)];case A:return[me[A],ke(e)];default:return[me[t],e]}};class r extends t.Worker{constructor(e,t){const{proxy:r}=super(e,t),{[Se]:s}=r,o=new Map,a=e=>{o.delete(e),s(be,e)},i=([e,t])=>{switch(e){case me[T]:if(null===t)return globalThis;if(typeof t===x)return P(t);if(!(t instanceof C))for(const e in t)t[e]=i(t[e]);return t;case me[v]:return typeof t===x?P(t):t.map(i);case me[E]:switch(typeof t){case x:return P(t);case S:{let e=o.get(t)?.deref();return e||(e=Oe(t,a,{token:!1,return:function(...e){return e.length&&e[0]instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e,s=$e.get(t||n)?.get(r);if(s)for(const t of s)e[t]()})(e[0]),s("apply",t,n(this),e.map(n)).then(i)}}),o.set(t,new WeakRef(e))),e}}case me[A]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,n]of Ee)if(n===e)return t})(t);default:return t}};r[Te]=(e,t,...r)=>{if(e===be)(e=>{const[t,n]=typeof e===x?[$,R]:[R,$],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(t);else{const s=Reflect[e],o=null==t?globalThis:P(t);switch(e){case"defineProperty":{const[e,t]=r.map(i);return n(s(o,e,t))}case"getOwnPropertyDescriptor":{const e=s(o,...r.map(i));if(e){const{get:t,set:r,value:s}=e;t&&(e.get=n(t)),r&&(e.set=n(r)),s&&(e.value=n(s))}return[me[e?T:j],e]}case _e:return[me[v],s(o).map(n)];default:return((e,t,r)=>n(e(t,...r.map(i))))(s,o,r)}}}}}return{...t,Worker:r}})(b);const We=new WeakMap,He=e=>{const t=e||console,n={buffered:Le,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return We.set(t,n),t}}},De=new TextDecoder,Le=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(De.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},Ce=new Map,Ue=e=>Ce.get(e),Be=(e,t)=>{try{return Function("require",t)(Ue)}catch(t){We.get(e).stderr(t)}};var qe={type:"dummy",module:()=>"data:application/javascript,",engine:e=>He().get(e),registerJSModule(e,t,n){Ce.set(t,n)},run:Be,runAsync:Be,runEvent:async(e,t,n)=>{try{await Function("require","e",`return ${t}(e)`)(Ue,n)}catch(t){We.get(e).stderr(t)}},transform:(e,t)=>t,writeFile(){}};Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const Je={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\r\n]+/))if(t.trim().length){/^(\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},{replace:ze}="",Ge=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g,Ye={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"'},Ke=e=>Ye[e],Xe=(e,...t)=>Je[typeof e](e,...t),Ve=e=>ze.call(e,Ge,Ke),{isArray:Qe}=Array,{assign:Ze,create:et,defineProperties:tt,defineProperty:nt,entries:rt}=Object,{all:st,resolve:ot}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),at=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;let it=0;const ct=(e,t)=>({id:e.id||(e.id=`${t}-w${it++}`),tag:e.tagName}),lt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},ut=(e,t,n,r)=>({type:t,config:n,interpreter:r,io:We.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}),pt=e=>e.replace(/^(?:\n|\r\n)/,""),ft=(e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,pt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,pt(t),...o);return r&&await s(e,r,...o),a}},ht=Symbol.for("polyscript.js_modules"),dt=new Map;nt(globalThis,ht,{value:dt});const gt=new Proxy(dt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]}),yt=(e,t)=>!t.startsWith("_"),wt=(e,t)=>new Proxy(e,{has:yt,get:(e,n)=>e[t][n]}),mt=(e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,wt(r,e));t.registerJSModule(n,s,r)},_t=(e,t)=>import(e).then((e=>{dt.set(t,{...e})})),bt=e=>new Promise(((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(Ze(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))})),vt=e=>/\.css$/i.test(new URL(e).pathname),Et=!globalThis.window,kt=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Tt(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},xt=e=>{const t=e.split("/");return t.pop(),t.join("/")},Tt=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},St=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\/+/,"/")},At=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},jt=(e,t)=>o(at(e,t)).arrayBuffer(),Ot=(e,t,n,r)=>st((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(Qe(r))return r.map((n=>({url:At([e,n]),path:At([t,n])})));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:At([t,s])}]}))})(n).map((({url:n,path:s})=>jt(n,r).then((n=>e.writeFile(t,s,n)))))),Rt=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,$t=(e,t)=>e.replace(/\{.+?\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Pt=(e,t,n,r)=>st((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of rt(e))if(/^\{.+\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,$t(o,t))}else{const e=$t(s,t),a=Rt(e,$t(o||"./",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>jt(n,r).then((r=>e.writeFile(t,s,r,n)))))),It=({main:e,worker:t},n)=>{const r=[];if(t&&Et)for(let[e,s]of rt(t))e=at(e,n),r.push(_t(e,s));if(e&&!Et)for(let[t,s]of rt(e))t=at(t,n),vt(t)?bt(t):r.push(_t(t,s));return st(r)},{assign:Mt}=Object,Nt="entries",Ft="readonly",Wt="readwrite",Ht={durability:"default",prefix:"IDBMap"},Dt=({target:{result:e}})=>e;class Lt extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Nt,t,this.#t);return new Promise(((t,r)=>Mt(e(n.objectStore(Nt)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=Ht.durability,prefix:n=Ht.prefix}=Ht){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{Mt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Nt),n.oncomplete=()=>t(e)},onsuccess(e){t(Dt(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Mt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Ft).then(Dt)}async clear(){await this.#r((e=>e.clear()),Wt)}async delete(e){await this.#r((t=>t.delete(e)),Wt)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Ft).then(Dt)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Ft).then(Dt)}async keys(){return await this.#r((e=>e.getAllKeys()),Ft).then(Dt)}async set(e,t){return await this.#r((n=>n.put(t,e)),Wt),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class Ct extends Map{#s;#o;constructor(...e){super(),this.#s=new Lt(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const Ut=new WeakMap,Bt=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await Ut.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new Ct(e);return await t.sync(),t},n.JSON=b),e.registerJsModule(t,n)},qt=(e,t)=>{if(e.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Jt=(e,t,...n)=>{try{return e.runPython(Xe(t),...n)}catch(t){We.get(e).stderr(t)}},zt=async(e,t,...n)=>{try{return await e.runPythonAsync(Xe(t),...n)}catch(t){We.get(e).stderr(t)}},Gt=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){We.get(e).stderr(t)}};var Yt=(new TextEncoder).encode('from uio import StringIO\nimport sys\n\nclass Response:\n    def __init__(self, f):\n        self.raw = f\n        self.encoding = "utf-8"\n        self._cached = None\n\n    def close(self):\n        if self.raw:\n            self.raw.close()\n            self.raw = None\n        self._cached = None\n\n    @property\n    def content(self):\n        if self._cached is None:\n            try:\n                self._cached = self.raw.read()\n            finally:\n                self.raw.close()\n                self.raw = None\n        return self._cached\n\n    @property\n    def text(self):\n        return str(self.content, self.encoding)\n\n    def json(self):\n        import ujson\n\n        return ujson.loads(self.content)\n\n\n# TODO try to support streaming xhr requests, a-la pyodide-http\nHEADERS_TO_IGNORE = ("user-agent",)\n\n\ntry:\n    import js\nexcept Exception as err:\n    raise OSError("This version of urequests can only be used in the browser")\n\n# TODO try to support streaming xhr requests, a-la pyodide-http\n\nHEADERS_TO_IGNORE = ("user-agent",)\n\n\ndef request(\n    method,\n    url,\n    data=None,\n    json=None,\n    headers={},\n    stream=None,\n    auth=None,\n    timeout=None,\n    parse_headers=True,\n):\n    from js import XMLHttpRequest\n\n    xhr = XMLHttpRequest.new()\n    xhr.withCredentials = False\n\n    if auth is not None:\n        import ubinascii\n\n        username, password = auth\n        xhr.open(method, url, False, username, password)\n    else:\n        xhr.open(method, url, False)\n\n    for name, value in headers.items():\n        if name.lower() not in HEADERS_TO_IGNORE:\n            xhr.setRequestHeader(name, value)\n\n    if timeout:\n        xhr.timeout = int(timeout * 1000)\n\n    if json is not None:\n        assert data is None\n        import ujson\n\n        data = ujson.dumps(json)\n        # s.write(b"Content-Type: application/json\\r\\n")\n        xhr.setRequestHeader("Content-Type", "application/json")\n\n    xhr.send(data)\n\n    # Emulates the construction process in the original urequests\n    resp = Response(StringIO(xhr.responseText))\n    resp.status_code = xhr.status\n    resp.reason = xhr.statusText\n    resp.headers = xhr.getAllResponseHeaders()\n\n    return resp\n\n\n# Other methods - head, post, put, patch, delete - are not used by\n# mip and therefore not included\n\n\ndef get(url, **kw):\n    return request("GET", url, **kw)\n\n\n# Content below this line is from the Micropython MIP package and is covered\n# by the applicable MIT license:\n# \n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \n# DEALINGS IN THE SOFTWARE.\n\n# MicroPython package installer\n# MIT license; Copyright (c) 2022 Jim Mussared\n\n\n_PACKAGE_INDEX = const("https://micropython.org/pi/v2")\n_CHUNK_SIZE = 128\n\n\n# This implements os.makedirs(os.dirname(path))\ndef _ensure_path_exists(path):\n    import os\n\n    split = path.split("/")\n\n    # Handle paths starting with "/".\n    if not split[0]:\n        split.pop(0)\n        split[0] = "/" + split[0]\n\n    prefix = ""\n    for i in range(len(split) - 1):\n        prefix += split[i]\n        try:\n            os.stat(prefix)\n        except:\n            os.mkdir(prefix)\n        prefix += "/"\n\n\n# Copy from src (stream) to dest (function-taking-bytes)\ndef _chunk(src, dest):\n    buf = memoryview(bytearray(_CHUNK_SIZE))\n    while True:\n        n = src.readinto(buf)\n        if n == 0:\n            break\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\n\n\n# Check if the specified path exists and matches the hash.\ndef _check_exists(path, short_hash):\n    import os\n\n    try:\n        import binascii\n        import hashlib\n\n        with open(path, "rb") as f:\n            hs256 = hashlib.sha256()\n            _chunk(f, hs256.update)\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], "utf-8")\n            return existing_hash == short_hash\n    except:\n        return False\n\n\ndef _rewrite_url(url, branch=None):\n    if not branch:\n        branch = "HEAD"\n    if url.startswith("github:"):\n        url = url[7:].split("/")\n        url = (\n            "https://raw.githubusercontent.com/"\n            + url[0]\n            + "/"\n            + url[1]\n            + "/"\n            + branch\n            + "/"\n            + "/".join(url[2:])\n        )\n    return url\n\n\ndef _download_file(url, dest):\n    response = get(url)\n    try:\n        if response.status_code != 200:\n            print("Error", response.status_code, "requesting", url)\n            return False\n\n        print("Copying:", dest)\n        _ensure_path_exists(dest)\n        with open(dest, "wb") as f:\n            _chunk(response.raw, f.write)\n\n        return True\n    finally:\n        response.close()\n\n\ndef _install_json(package_json_url, index, target, version, mpy):\n    response = get(_rewrite_url(package_json_url, version))\n    try:\n        if response.status_code != 200:\n            print("Package not found:", package_json_url)\n            return False\n\n        package_json = response.json()\n    finally:\n        response.close()\n    for target_path, short_hash in package_json.get("hashes", ()):\n        fs_target_path = target + "/" + target_path\n        if _check_exists(fs_target_path, short_hash):\n            print("Exists:", fs_target_path)\n        else:\n            file_url = "{}/file/{}/{}".format(index, short_hash[:2], short_hash)\n            if not _download_file(file_url, fs_target_path):\n                print("File not found: {} {}".format(target_path, short_hash))\n                return False\n    for target_path, url in package_json.get("urls", ()):\n        fs_target_path = target + "/" + target_path\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\n            print("File not found: {} {}".format(target_path, url))\n            return False\n    for dep, dep_version in package_json.get("deps", ()):\n        if not _install_package(dep, index, target, dep_version, mpy):\n            return False\n    return True\n\n\ndef _install_package(package, index, target, version, mpy):\n    if (\n        package.startswith("http://")\n        or package.startswith("https://")\n        or package.startswith("github:")\n    ):\n        if package.endswith(".py") or package.endswith(".mpy"):\n            print("Downloading {} to {}".format(package, target))\n            return _download_file(\n                _rewrite_url(package, version), target + "/" + package.rsplit("/")[-1]\n            )\n        else:\n            if not package.endswith(".json"):\n                if not package.endswith("/"):\n                    package += "/"\n                package += "package.json"\n            print("Installing {} to {}".format(package, target))\n    else:\n        if not version:\n            version = "latest"\n        print("Installing {} ({}) from {} to {}".format(package, version, index, target))\n\n        mpy_version = (\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, "_mpy") else "py"\n        )\n\n        # WARNING: mpy_version fails miserably with 1.22.0-380\n        package = "{}/package/{}/{}/{}.json".format(index, "py", package, version)\n\n    return _install_json(package, index, target, version, mpy)\n\n\ndef install(package, index=None, target=None, version=None, mpy=True):\n    if not target:\n        for p in sys.path:\n            if p.endswith("/lib"):\n                target = p\n                break\n        else:\n            print("Unable to find lib dir in sys.path")\n            return\n\n    if not index:\n        index = _PACKAGE_INDEX\n\n    if _install_package(package, index.rstrip("/"), target, version, mpy):\n        print("Done")\n    else:\n        print("Package may be partially installed")\n');const Kt=async e=>(await import("./toml-DiUM0_qs.js")).parse(e),Xt=(e,t)=>{try{e.mkdir(t)}catch(e){}};var Vt={type:"micropython",module:(e="1.24.0-preview-114")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=He({stderr:Le(console.error),stdout:Le(console.log)});n=n.replace(/\.m?js$/,".wasm");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=Qt.bind(this,i,r);return Ut.set(i,c),t.files&&await Pt(this,i,t.files,r),t.fetch&&await Ot(this,i,t.fetch,r),t.js_modules&&await It(t.js_modules,r),this.writeFile(i,"./mip.py",Yt),t.packages&&await c(t.packages),i},registerJSModule:Bt,run:Jt,runAsync:zt,runEvent:Gt,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=qt(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-gl8b5xR3.js").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)Xt(s,i);else{Xt(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case"tgz":case"tar.gz":{const t="./_.tar.gz";return kt(i,t,n),void e.runPython(`\n                        import os, gzip, tarfile\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\n                        for f in tar:\n                            name = f"${r}{f.name}"\n                            if f.type == tarfile.DIRTYPE:\n                                if f.name != "./":\n                                    os.mkdir(name.strip("/"))\n                            else:\n                                dir = os.path.dirname(name)\n                                if not os.path.exists(dir):\n                                    os.mkdir(dir)\n                                source = tar.extractfile(f)\n                                with open(name, "wb") as dest:\n                                    dest.write(source.read())\n                                    dest.close()\n                        tar.close()\n                        os.remove("${t}")\n                    `)}}}return kt(i,t,n)}};async function Qt(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=at(s,t),r=await o(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Zt={dict_converter:Object.fromEntries};let en=!1;const tn=e=>(...t)=>{try{return en=!0,e(...t)}finally{en=!1}};let nn=!1;const rn=()=>{if(nn)return;nn=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if("function"==typeof s&&"copy"in s){en=!1;let o=e.get(s)?.deref();if(!o)try{o=Oe(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),en=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return en&&n(t),s(this,e,t)}},call:{value(e,...t){return en&&n(t),s(this,e,t)}}})};var sn={type:"pyodide",module:(e="0.26.1")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){Et||"auto"!==t.experimental_create_proxy||rn();const{stderr:s,stdout:o,get:a}=He(),i=n.slice(0,n.lastIndexOf("/")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=on.bind(c);return Ut.set(c,l),t.files&&await Pt(this,c,t.files,r),t.fetch&&await Ot(this,c,t.fetch,r),t.js_modules&&await It(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:Bt,run:tn(Jt),runAsync:tn(zt),runEvent:tn(Gt),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(Zt):t,writeFile:(e,t,n,r)=>{const s=qt(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return kt({FS:o,PATH:a,PATH_FS:i},t,n)}};async function on(e){await this.loadPackage("micropip");const t=this.pyimport("micropip");await t.install(e,{keep_going:!0}),t.destroy()}const an="ruby-wasm-wasi",cn=an.replace(/\W+/g,"_");var ln={type:an,experimental:!0,module:(e="2.6.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\/browser\/\+esm$/,"/ruby.wasm");const s=await o(n).arrayBuffer(),a=await WebAssembly.compile(s),{vm:i}=await e(a);return t.files&&await Pt(this,i,t.files,r),t.fetch&&await Ot(this,i,t.fetch,r),t.js_modules&&await It(t.js_modules,r),i},registerJSModule(e,t,n){t=t.replace(/\W+/g,"__");const r=`__module_${cn}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(Xe(t),...n),runAsync:(e,t,...n)=>e.evalAsync(Xe(t),...n),async runEvent(e,t,n){if(/^xworker\.(on\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${cn}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${an}`)}};var un={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=He(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)})),n.files&&await Pt(this,c,n.files,s),n.fetch&&await Ot(this,c,n.fetch,s),n.js_modules&&await It(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(Xe(t),...n)}catch(t){We.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(Xe(t),...n)}catch(t){We.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){We.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Tt(e,xt(t)),t=St(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const pn=new WeakMap,fn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=pn.get(e),{output:o,result:a}=await n.captureR(Xe(t));for(const{type:e,data:t}of o)s[e](t);return Oe(a,r,{token:!1})};var hn={type:"webr",experimental:!0,module:(e="0.4.0")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=He(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return pn.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:We.get(o)}),t.files&&await Pt(this,o,t.files,r),t.fetch&&await Ot(this,o,t.fetch,r),t.js_modules&&await It(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:fn,runAsync:fn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log("transforming",t),t),writeFile:()=>{}};const dn=new Map,gn=new Map,yn=[],wn=[],mn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=dn.get(n),o=/^(?:\.?\.?\/|https?:\/\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>(gn.set(t,e),s(r,e,n,o))))}}),_n=e=>{for(const t of[].concat(e.type))dn.set(t,e),yn.push(`script[type="${t}"]`),wn.push(`${t}-`)};for(const e of[qe,Vt,sn,ln,un,hn])_n(e);const{parse:bn}=JSON,vn=(e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[at(e),n]},En=e=>{try{return bn(e)}catch(t){return Kt(e)}},kn=(e,t,n,r={})=>{if(t){const[e,s]=vn(t,n);"json"===s?r=o(e).json():"toml"===s?r=o(e).text().then(Kt):"string"===s?r=En(t):"object"===s&&t?r=t:"txt"===s&&"string"==typeof r&&(r=En(r)),t=e}return ot(r).then((n=>mn[e](n,t)))},xn=(e,t="")=>`${e}@${t}`.replace(/@$/,"");function Tn(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,((e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e))}const Sn="BeforeRun",An="AfterRun",jn=[`code${Sn}`,`code${Sn}Async`,`code${An}`,`code${An}Async`],On=["onWorker","onReady",`on${Sn}`,`on${Sn}Async`,`on${An}`,`on${An}Async`];function Rn(e,t){const{run:n,runAsync:r}=dn.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const $n=(e,t,n,r,s,o)=>{if(s||o){const a=Rn.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Pn=class{constructor(e,t={}){const{main:n,worker:r}=t;this.interpreter=e,this.onWorker=n?.onWorker;for(const e of On.slice(1))this[e]=r?.[e];for(const e of jn)this[e]=r?.[e]}toJSON(){const e={};for(const t of On.slice(1))this[t]&&(e[t]=Tn(this[t]));for(const t of jn)this[t]&&(e[t]=Xe(this[t]()));return e}};var In=(...e)=>function(t,n){if(e.length){const[t,r]=e;(n=Ze({},n||{type:t,version:r})).type||(n.type=t)}const[r]=vn(n.config,n.configURL),s=((...e)=>new Fe(URL.createObjectURL(new Blob(['const e="object"==typeof self?self:globalThis,t=t=>((t,n)=>{const r=(e,n)=>(t.set(n,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=n[o];switch(a){case 0:case-1:return r(i,o);case 1:{const e=r([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=r({},o);for(const[t,n]of i)e[s(t)]=s(n);return e}case 3:return r(new Date(i),o);case 4:{const{source:e,flags:t}=i;return r(new RegExp(e,t),o)}case 5:{const e=r(new Map,o);for(const[t,n]of i)e.set(s(t),s(n));return e}case 6:{const e=r(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:n}=i;return r(new e[t](n),o)}case 8:return r(BigInt(i),o);case"BigInt":return r(Object(BigInt(i)),o)}return r(new e[a](i),o)};return s})(new Map,t)(0),n="",{toString:r}={},{keys:s}=Object,o=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const s=r.call(e).slice(8,-1);switch(s){case"Array":return[1,n];case"Object":return[2,n];case"Date":return[3,n];case"RegExp":return[4,n];case"Map":return[5,n];case"Set":return[6,n]}return s.includes("Array")?[1,s]:s.includes("Error")?[7,s]:[2,s]},a=([e,t])=>0===e&&("function"===t||"symbol"===t),i=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const i=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},c=r=>{if(n.has(r))return n.get(r);let[l,u]=o(r);switch(l){case 0:{let t=r;switch(u){case"bigint":l=8,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return i([-1],r)}return i([l,t],r)}case 1:{if(u)return i([u,[...r]],r);const e=[],t=i([l,e],r);for(const t of r)e.push(c(t));return t}case 2:{if(u)switch(u){case"BigInt":return i([u,r.toString()],r);case"Boolean":case"Number":case"String":return i([u,r.valueOf()],r)}if(t&&"toJSON"in r)return c(r.toJSON());const n=[],p=i([l,n],r);for(const t of s(r))!e&&a(o(r[t]))||n.push([c(t),c(r[t])]);return p}case 3:return i([l,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return i([l,{source:e,flags:t}],r)}case 5:{const t=[],n=i([l,t],r);for(const[n,s]of r)(e||!a(o(n))&&!a(o(s)))&&t.push([c(n),c(s)]);return n}case 6:{const t=[],n=i([l,t],r);for(const n of r)!e&&a(o(n))||t.push(c(n));return n}}const{message:p}=r;return i([l,{name:u,message:p}],r)};return c})(!(t||n),!!t,new Map,r)(e),r},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var p=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))});const f="array",d="function",h="null",y="number",g="object",w="symbol",m="undefined",_="apply",b="construct",E="defineProperty",v="deleteProperty",T="get",x="getOwnPropertyDescriptor",k="getPrototypeOf",S="has",O="isExtensible",A="ownKeys",j="preventExtensions",R="set",P="setPrototypeOf";var $=Object.freeze({__proto__:null,APPLY:_,CONSTRUCT:b,DEFINE_PROPERTY:E,DELETE_PROPERTY:v,GET:T,GET_OWN_PROPERTY_DESCRIPTOR:x,GET_PROTOTYPE_OF:k,HAS:S,IS_EXTENSIBLE:O,OWN_KEYS:A,PREVENT_EXTENSION:j,SET:R,SET_PROTOTYPE_OF:P});function I(){return this}const N=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),M=Object.create(null),F=(e,t,{debug:n,handler:r,return:s,token:o=e}=M)=>{const a=s||new Proxy(e,r||M),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),N.register(...i),a},{Object:W,Proxy:H,Reflect:D}=globalThis,{isArray:C}=Array,{ownKeys:L}=D,{create:B,hasOwn:q,values:U}=W,J=(e,t)=>t===f?e[0]:t===d?e():t===g?e.$:e,z=(e,t,n,r)=>{const s={type:{value:t}},o=q(e,"valueOf");for(const a of U($)){let i=r(e[a]||D[a]);if(o&&a===T){const{valueOf:r}=e,{value:s}=i;i={value(e,o,...a){return o===n?r.call(this,J(e,t)):s.call(this,e,o,...a)}}}s[a]=i}return B(e,s)},G=(e,t,n,r=e)=>{if(r===e)switch(typeof e){case g:case m:r||(r=!1);case d:break;default:r=!1,t===e&&(t=W(e))}const s=new H(t,n),{destruct:o}=n;return o?F(e,o,{token:r,return:s}):s},Y=e=>t=>{const n=typeof t;return n===g?t?e.get(t)?.[0]??(e=>C(e)?f:g)(t):h:n},K=e=>t=>{let n=typeof t;switch(n){case g:if(!t){n=h;break}case d:const r=e.get(t);r&&([n,t]=r)}return[n,t]},X=e=>((e=>{N.unregister(e)})(e),e);var V=e=>{const t=new WeakMap,n=Symbol(),r={},s=(e,n,r)=>(t.set(e,[n,r]),e),o={proxy:r,release:X,pair:K(t),typeOf:Y(t),isProxy:e=>t.has(e),valueOf:e=>e[n]??e.valueOf()};for(const t of L(e)){if(q(o,t))continue;const a=e[t];switch(t){case f:{const e=z(a,t,n,(e=>({value([t],...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,[t],e,...n),f,t);break}case d:{const e=z(a,t,n,(e=>({value(t,...n){return e.call(this,t(),...n)}})));r[t]=(t,...n)=>{return s(G(t,(r=t,I.bind(r)),e,...n),d,t);var r};break}case g:{const e=z(a,t,n,(e=>({value({$:t},...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,{$:t},e,...n),g,t);break}default:{const e=z(a,t,n,(e=>({value:e})));r[t]=(n,...r)=>s(G(n,n,e,...r),t,n);break}}}return o};let Z=0;const Q=new Map,ee=new Map,te=e=>ee.get(e),ne=e=>{if(!Q.has(e)){let t;for(;ee.has(t=Z++););Q.set(e,t),ee.set(t,e)}return Q.get(e)},{ArrayBuffer:re,Atomics:se,Promise:oe}=globalThis,{isArray:ae}=Array,{create:ie,getPrototypeOf:ce,values:le}=Object,ue=ce(Int32Array),pe=ie(se),fe=({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o})),de=()=>oe.withResolvers();let he=0;const ye=new Map,ge=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&ye.set(this,[he++,0,de()])}},we=new WeakSet,me=e=>(we.add(e),e),_e=(e,t)=>{const{data:n}=e,r=ae(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},be=e=>null!==e&&"object"==typeof e&&!we.has(e),Ee=new WeakMap,ve=(e,t,n)=>{if(ye.has(e))t.set(e,ye.get(e)[0]);else if(!(e instanceof ue||e instanceof re))for(const r of le(e))be(r)&&!n.has(r)&&(n.add(r),ve(r,t,n))},Te=(...e)=>({value:new oe((t=>{let n=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");n.onmessage=()=>t("ok"),n.postMessage(e)}))}),xe=(e,t)=>{const n=ye.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]};let{BigInt64Array:ke,Int32Array:Se,SharedArrayBuffer:Oe,addEventListener:Ae,postMessage:je}=globalThis,Re=!0,Pe=e=>e,$e=!1;const Ie=de();try{new Oe(4),pe.waitAsync||(pe.waitAsync=Te),Ie.resolve()}catch(e){const t=je,n=Ae,r=[];let s="",o="";Oe=class extends re{},ke=ge(ke,Oe),Se=ge(Se,Oe),Pe=me,$e=!0,pe.notify=(e,n)=>{const[r]=(e=>Ee.get(e))(e);return t([s,1,e,r,n]),0},pe.waitAsync=(...e)=>{const[t,n]=xe(...e);return{value:n}},pe.wait=(e,t,...n)=>{const[r]=xe(e,t,...n),a=new XMLHttpRequest;a.responseType="json",a.open("POST",`${o}?sabayon`,!1),a.setRequestHeader("Content-Type","application/json"),a.send(`["${s}",${r},${t}]`);const{response:i}=a;ye.delete(e);for(let t=0;t<i.length;t++)e[t]=i[t];return"ok"},n("message",(e=>{if(_e(e,s)){const[t,n,...r]=e.data;switch(n){case 0:s=t,o=r.at(0)?.serviceWorker||"",o||(pe.wait=null,Ie.resolve());break;case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of ye)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];ye.delete(r),a("ok");break}})(...r);break;case 2:((e,t,n)=>{for(const[n,r]of t)Ee.set(n,[r,e.currentTarget]);fe(e,n)})(e,...r);break;case 3:Ie.resolve()}}else if(Re){const{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i}=e;r.push([{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i},e.data])}})),Ae=(e,...t)=>{if(n(e,...t),r.length)for(const e of r.splice(0))fe(...e)},je=(e,...n)=>t(((e,t)=>{const n=new Map;return be(t)&&ve(t,n,new Set),n.size?[e,2,n,t]:t})(s,e),...n)}await Ie.promise,Re=!1;const{BYTES_PER_ELEMENT:Ne}=Int32Array,{BYTES_PER_ELEMENT:Me}=Uint16Array,{notify:Fe}=pe,We=new TextDecoder("utf-16"),He=new WeakSet,De=(...e)=>(He.add(e),e);let Ce="";const Le=(e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)};let Be=0;const qe=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=""!==Ce,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,Ce));const d=Be++,h=[];He.has(u.at(-1)||h)&&He.delete(h=u.pop());const y=n(i?u.map(i):u);let g=t(2*Ne);return a([e,2,l,d,g,y,r],{transfer:h}),c(g,0).value.then((()=>{p&&clearTimeout(f);const n=g[1];if(!n)return;const r=Me*n;return g=t(r+r%Ne),a([e,1,d,g]),c(g,0).value.then((()=>{const e=new Uint16Array(g.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(We.decode(t))}))}))},Ue=(e,t)=>new Proxy(t,{get:(t,n)=>{let r;return"then"!==n&&(r=t.get(n),r||(r=qe(e,n),t.set(n,r))),r},set:(e,t,n)=>"then"!==t&&!!e.set(t,n)}),{wait:Je,waitAsync:ze}=pe;var Ge=({parse:e,stringify:t,transform:n,interrupt:r}=JSON)=>{const s=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(Ce=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(Ce=""),a[0]=1,Fe(a,0)}})(t,n),o=de(),a=new Map,i=new Map;let c="",l=Je;if(Je&&r){const{handler:e,timeout:t=42}=r;l=(n,r,s)=>{for(;"timed-out"===(s=Je(n,r,0,t));)e();return s}}return Ae("message",(t=>{if(_e(t,c)){const[r,u,...p]=t.data;switch(u){case 0:{const t=!!Je;c=r,o.resolve({polyfill:$e,sync:t,transfer:De,proxy:Ue([c,e=>new Se(new Oe(e)),Pe,t,e,$e,je,n,t?(...e)=>({value:{then:t=>t(l(...e))}}):ze],a)});break}case 2:a.size?Le(s,i,a,p):setTimeout(Le,0,s,i,a,p);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);Fe(n,0)})(i,p)}}})),o.promise},Ye=Object.fromEntries([f,"bigint","boolean",d,h,y,g,"string",w,m].map(((e,t)=>[e,t])));const Ke="destruct",{[A]:Xe}=Reflect,Ve=new Map(Xe(Symbol).filter((e=>typeof Symbol[e]===w)).map((e=>[Symbol[e],e]))),Ze=e=>Ve.get(e)||`.${Symbol.keyFor(e)||""}`,Qe="42fb1e9a-1373-441e-813f-357c3deaee87",et="M"+Qe,tt="W"+Qe,{[_]:nt}=Reflect;const rt={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\r\\n]+/))if(t.trim().length){/^(\\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},st=new WeakMap,ot=e=>{const t=e||console,n={buffered:it,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return st.set(t,n),t}}},at=new TextDecoder,it=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(at.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},ct=(e,...t)=>rt[typeof e](e,...t),{isArray:lt}=Array,{assign:ut,create:pt,defineProperties:ft,defineProperty:dt,entries:ht}=Object,{all:yt,resolve:gt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),wt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href,mt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},_t=e=>Function(`\'use strict\';return (${e})`)(),bt=e=>e.replace(/^(?:\\n|\\r\\n)/,""),Et=Symbol.for("polyscript.js_modules"),vt=new Map;dt(globalThis,Et,{value:vt}),new Proxy(vt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Tt=(e,t)=>!t.startsWith("_"),xt=(e,t)=>new Proxy(e,{has:Tt,get:(e,n)=>e[t][n]}),kt=(e,t)=>import(e).then((e=>{vt.set(t,{...e})})),St=e=>new Promise(((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(ut(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))})),Ot=e=>/\\.css$/i.test(new URL(e).pathname),At=(e,t)=>e.has(t),jt=e=>[...e.keys()];var Rt=(e,t,n,r)=>{const s=globalThis[Et];if(n)for(let[e,t]of ht(n)){let n=s.get(t);n&&!lt(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:At,ownKeys:jt,get:(e,s)=>{let o=e.get(s);if(lt(o)){let a=o;o=null;for(let e of a)e=wt(e,r),Ot(e)?n.importCSS(e):(n.importJS(e,s),o=t[Et].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Pt=new Map,$t=e=>Pt.get(e),It=(e,t)=>{try{return Function("require",t)($t)}catch(t){st.get(e).stderr(t)}};var Nt={type:"dummy",module:()=>"data:application/javascript,",engine:e=>ot().get(e),registerJSModule(e,t,n){Pt.set(t,n)},run:It,runAsync:It,runEvent:async(e,t,n)=>{try{await Function("require","e",`return ${t}(e)`)($t,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile(){}};const Mt=Object.getOwnPropertyDescriptors(Response.prototype),Ft=e=>"function"==typeof e,Wt={get:(e,t)=>Mt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!Ft(r)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,Mt[t]):((e,t)=>Ft(t)?t.bind(e):t)(e,e[t])};var Ht=(e,...t)=>new Proxy(fetch(e,...t),Wt);Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const Dt=!globalThis.window,Ct=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Bt(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Lt=e=>{const t=e.split("/");return t.pop(),t.join("/")},Bt=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},qt=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\\/+/,"/")},Ut=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},Jt=(e,t)=>Ht(wt(e,t)).arrayBuffer(),zt=(e,t,n,r)=>yt((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${r}, please supply \'to_file\' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(lt(r))return r.map((n=>({url:Ut([e,n]),path:Ut([t,n])})));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Ut([t,s])}]}))})(n).map((({url:n,path:s})=>Jt(n,r).then((n=>e.writeFile(t,s,n)))))),Gt=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,Yt=(e,t)=>e.replace(/\\{.+?\\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Kt=(e,t,n,r)=>yt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of ht(e))if(/^\\{.+\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,Yt(o,t))}else{const e=Yt(s,t),a=Gt(e,Yt(o||"./",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>Jt(n,r).then((r=>e.writeFile(t,s,r,n)))))),Xt=({main:e,worker:t},n)=>{const r=[];if(t&&Dt)for(let[e,s]of ht(t))e=wt(e,n),r.push(kt(e,s));if(e&&!Dt)for(let[t,s]of ht(e))t=wt(t,n),Ot(t)?St(t):r.push(kt(t,s));return yt(r)},{assign:Vt}=Object,Zt="entries",Qt="readonly",en="readwrite",tn={durability:"default",prefix:"IDBMap"},nn=({target:{result:e}})=>e;class rn extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Zt,t,this.#t);return new Promise(((t,r)=>Vt(e(n.objectStore(Zt)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=tn.durability,prefix:n=tn.prefix}=tn){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{Vt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Zt),n.oncomplete=()=>t(e)},onsuccess(e){t(nn(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Vt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Qt).then(nn)}async clear(){await this.#r((e=>e.clear()),en)}async delete(e){await this.#r((t=>t.delete(e)),en)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Qt).then(nn)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Qt).then(nn)}async keys(){return await this.#r((e=>e.getAllKeys()),Qt).then(nn)}async set(e,t){return await this.#r((n=>n.put(t,e)),en),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class sn extends Map{#s;#o;constructor(...e){super(),this.#s=new rn(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const on=new WeakMap,an=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await on.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new sn(e);return await t.sync(),t},n.JSON=p),e.registerJsModule(t,n)},cn=(e,t)=>{if(e.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},ln=(e,t,...n)=>{try{return e.runPython(ct(t),...n)}catch(t){st.get(e).stderr(t)}},un=async(e,t,...n)=>{try{return await e.runPythonAsync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},pn=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}};var fn=(new TextEncoder).encode(\'from uio import StringIO\\nimport sys\\n\\nclass Response:\\n    def __init__(self, f):\\n        self.raw = f\\n        self.encoding = "utf-8"\\n        self._cached = None\\n\\n    def close(self):\\n        if self.raw:\\n            self.raw.close()\\n            self.raw = None\\n        self._cached = None\\n\\n    @property\\n    def content(self):\\n        if self._cached is None:\\n            try:\\n                self._cached = self.raw.read()\\n            finally:\\n                self.raw.close()\\n                self.raw = None\\n        return self._cached\\n\\n    @property\\n    def text(self):\\n        return str(self.content, self.encoding)\\n\\n    def json(self):\\n        import ujson\\n\\n        return ujson.loads(self.content)\\n\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\nHEADERS_TO_IGNORE = ("user-agent",)\\n\\n\\ntry:\\n    import js\\nexcept Exception as err:\\n    raise OSError("This version of urequests can only be used in the browser")\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\n\\nHEADERS_TO_IGNORE = ("user-agent",)\\n\\n\\ndef request(\\n    method,\\n    url,\\n    data=None,\\n    json=None,\\n    headers={},\\n    stream=None,\\n    auth=None,\\n    timeout=None,\\n    parse_headers=True,\\n):\\n    from js import XMLHttpRequest\\n\\n    xhr = XMLHttpRequest.new()\\n    xhr.withCredentials = False\\n\\n    if auth is not None:\\n        import ubinascii\\n\\n        username, password = auth\\n        xhr.open(method, url, False, username, password)\\n    else:\\n        xhr.open(method, url, False)\\n\\n    for name, value in headers.items():\\n        if name.lower() not in HEADERS_TO_IGNORE:\\n            xhr.setRequestHeader(name, value)\\n\\n    if timeout:\\n        xhr.timeout = int(timeout * 1000)\\n\\n    if json is not None:\\n        assert data is None\\n        import ujson\\n\\n        data = ujson.dumps(json)\\n        # s.write(b"Content-Type: application/json\\\\r\\\\n")\\n        xhr.setRequestHeader("Content-Type", "application/json")\\n\\n    xhr.send(data)\\n\\n    # Emulates the construction process in the original urequests\\n    resp = Response(StringIO(xhr.responseText))\\n    resp.status_code = xhr.status\\n    resp.reason = xhr.statusText\\n    resp.headers = xhr.getAllResponseHeaders()\\n\\n    return resp\\n\\n\\n# Other methods - head, post, put, patch, delete - are not used by\\n# mip and therefore not included\\n\\n\\ndef get(url, **kw):\\n    return request("GET", url, **kw)\\n\\n\\n# Content below this line is from the Micropython MIP package and is covered\\n# by the applicable MIT license:\\n# \\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\n# DEALINGS IN THE SOFTWARE.\\n\\n# MicroPython package installer\\n# MIT license; Copyright (c) 2022 Jim Mussared\\n\\n\\n_PACKAGE_INDEX = const("https://micropython.org/pi/v2")\\n_CHUNK_SIZE = 128\\n\\n\\n# This implements os.makedirs(os.dirname(path))\\ndef _ensure_path_exists(path):\\n    import os\\n\\n    split = path.split("/")\\n\\n    # Handle paths starting with "/".\\n    if not split[0]:\\n        split.pop(0)\\n        split[0] = "/" + split[0]\\n\\n    prefix = ""\\n    for i in range(len(split) - 1):\\n        prefix += split[i]\\n        try:\\n            os.stat(prefix)\\n        except:\\n            os.mkdir(prefix)\\n        prefix += "/"\\n\\n\\n# Copy from src (stream) to dest (function-taking-bytes)\\ndef _chunk(src, dest):\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\n    while True:\\n        n = src.readinto(buf)\\n        if n == 0:\\n            break\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\n\\n\\n# Check if the specified path exists and matches the hash.\\ndef _check_exists(path, short_hash):\\n    import os\\n\\n    try:\\n        import binascii\\n        import hashlib\\n\\n        with open(path, "rb") as f:\\n            hs256 = hashlib.sha256()\\n            _chunk(f, hs256.update)\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], "utf-8")\\n            return existing_hash == short_hash\\n    except:\\n        return False\\n\\n\\ndef _rewrite_url(url, branch=None):\\n    if not branch:\\n        branch = "HEAD"\\n    if url.startswith("github:"):\\n        url = url[7:].split("/")\\n        url = (\\n            "https://raw.githubusercontent.com/"\\n            + url[0]\\n            + "/"\\n            + url[1]\\n            + "/"\\n            + branch\\n            + "/"\\n            + "/".join(url[2:])\\n        )\\n    return url\\n\\n\\ndef _download_file(url, dest):\\n    response = get(url)\\n    try:\\n        if response.status_code != 200:\\n            print("Error", response.status_code, "requesting", url)\\n            return False\\n\\n        print("Copying:", dest)\\n        _ensure_path_exists(dest)\\n        with open(dest, "wb") as f:\\n            _chunk(response.raw, f.write)\\n\\n        return True\\n    finally:\\n        response.close()\\n\\n\\ndef _install_json(package_json_url, index, target, version, mpy):\\n    response = get(_rewrite_url(package_json_url, version))\\n    try:\\n        if response.status_code != 200:\\n            print("Package not found:", package_json_url)\\n            return False\\n\\n        package_json = response.json()\\n    finally:\\n        response.close()\\n    for target_path, short_hash in package_json.get("hashes", ()):\\n        fs_target_path = target + "/" + target_path\\n        if _check_exists(fs_target_path, short_hash):\\n            print("Exists:", fs_target_path)\\n        else:\\n            file_url = "{}/file/{}/{}".format(index, short_hash[:2], short_hash)\\n            if not _download_file(file_url, fs_target_path):\\n                print("File not found: {} {}".format(target_path, short_hash))\\n                return False\\n    for target_path, url in package_json.get("urls", ()):\\n        fs_target_path = target + "/" + target_path\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\n            print("File not found: {} {}".format(target_path, url))\\n            return False\\n    for dep, dep_version in package_json.get("deps", ()):\\n        if not _install_package(dep, index, target, dep_version, mpy):\\n            return False\\n    return True\\n\\n\\ndef _install_package(package, index, target, version, mpy):\\n    if (\\n        package.startswith("http://")\\n        or package.startswith("https://")\\n        or package.startswith("github:")\\n    ):\\n        if package.endswith(".py") or package.endswith(".mpy"):\\n            print("Downloading {} to {}".format(package, target))\\n            return _download_file(\\n                _rewrite_url(package, version), target + "/" + package.rsplit("/")[-1]\\n            )\\n        else:\\n            if not package.endswith(".json"):\\n                if not package.endswith("/"):\\n                    package += "/"\\n                package += "package.json"\\n            print("Installing {} to {}".format(package, target))\\n    else:\\n        if not version:\\n            version = "latest"\\n        print("Installing {} ({}) from {} to {}".format(package, version, index, target))\\n\\n        mpy_version = (\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, "_mpy") else "py"\\n        )\\n\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\n        package = "{}/package/{}/{}/{}.json".format(index, "py", package, version)\\n\\n    return _install_json(package, index, target, version, mpy)\\n\\n\\ndef install(package, index=None, target=None, version=None, mpy=True):\\n    if not target:\\n        for p in sys.path:\\n            if p.endswith("/lib"):\\n                target = p\\n                break\\n        else:\\n            print("Unable to find lib dir in sys.path")\\n            return\\n\\n    if not index:\\n        index = _PACKAGE_INDEX\\n\\n    if _install_package(package, index.rstrip("/"), target, version, mpy):\\n        print("Done")\\n    else:\\n        print("Package may be partially installed")\\n\');const dn=async e=>(await import("./toml-DiUM0_qs.js")).parse(e),hn=(e,t)=>{try{e.mkdir(t)}catch(e){}};var yn={type:"micropython",module:(e="1.24.0-preview-114")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=ot({stderr:it(console.error),stdout:it(console.log)});n=n.replace(/\\.m?js$/,".wasm");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=gn.bind(this,i,r);return on.set(i,c),t.files&&await Kt(this,i,t.files,r),t.fetch&&await zt(this,i,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),this.writeFile(i,"./mip.py",fn),t.packages&&await c(t.packages),i},registerJSModule:an,run:ln,runAsync:un,runEvent:pn,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=cn(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-gl8b5xR3.js").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)hn(s,i);else{hn(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case"tgz":case"tar.gz":{const t="./_.tar.gz";return Ct(i,t,n),void e.runPython(`\\n                        import os, gzip, tarfile\\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\\n                        for f in tar:\\n                            name = f"${r}{f.name}"\\n                            if f.type == tarfile.DIRTYPE:\\n                                if f.name != "./":\\n                                    os.mkdir(name.strip("/"))\\n                            else:\\n                                dir = os.path.dirname(name)\\n                                if not os.path.exists(dir):\\n                                    os.mkdir(dir)\\n                                source = tar.extractfile(f)\\n                                with open(name, "wb") as dest:\\n                                    dest.write(source.read())\\n                                    dest.close()\\n                        tar.close()\\n                        os.remove("${t}")\\n                    `)}}}return Ct(i,t,n)}};async function gn(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=wt(s,t),r=await Ht(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const wn={dict_converter:Object.fromEntries};let mn=!1;const _n=e=>(...t)=>{try{return mn=!0,e(...t)}finally{mn=!1}};let bn=!1;const En=()=>{if(bn)return;bn=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if("function"==typeof s&&"copy"in s){mn=!1;let o=e.get(s)?.deref();if(!o)try{o=F(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),mn=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return mn&&n(t),s(this,e,t)}},call:{value(e,...t){return mn&&n(t),s(this,e,t)}}})};var vn={type:"pyodide",module:(e="0.26.1")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){Dt||"auto"!==t.experimental_create_proxy||En();const{stderr:s,stdout:o,get:a}=ot(),i=n.slice(0,n.lastIndexOf("/")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=Tn.bind(c);return on.set(c,l),t.files&&await Kt(this,c,t.files,r),t.fetch&&await zt(this,c,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:an,run:_n(ln),runAsync:_n(un),runEvent:_n(pn),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(wn):t,writeFile:(e,t,n,r)=>{const s=cn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return Ct({FS:o,PATH:a,PATH_FS:i},t,n)}};async function Tn(e){await this.loadPackage("micropip");const t=this.pyimport("micropip");await t.install(e,{keep_going:!0}),t.destroy()}const xn="ruby-wasm-wasi",kn=xn.replace(/\\W+/g,"_");var Sn={type:xn,experimental:!0,module:(e="2.6.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\\/browser\\/\\+esm$/,"/ruby.wasm");const s=await Ht(n).arrayBuffer(),o=await WebAssembly.compile(s),{vm:a}=await e(o);return t.files&&await Kt(this,a,t.files,r),t.fetch&&await zt(this,a,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),a},registerJSModule(e,t,n){t=t.replace(/\\W+/g,"__");const r=`__module_${kn}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(ct(t),...n),runAsync:(e,t,...n)=>e.evalAsync(ct(t),...n),async runEvent(e,t,n){if(/^xworker\\.(on\\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${kn}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${xn}`)}};var On={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=ot(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)})),n.files&&await Kt(this,c,n.files,s),n.fetch&&await zt(this,c,n.fetch,s),n.js_modules&&await Xt(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Bt(e,Lt(t)),t=qt(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const An=new WeakMap,jn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=An.get(e),{output:o,result:a}=await n.captureR(ct(t));for(const{type:e,data:t}of o)s[e](t);return F(a,r,{token:!1})};var Rn={type:"webr",experimental:!0,module:(e="0.4.0")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=ot(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return An.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:st.get(o)}),t.files&&await Kt(this,o,t.files,r),t.fetch&&await zt(this,o,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:jn,runAsync:jn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log("transforming",t),t),writeFile:()=>{}};const Pn=new Map,$n=new Map,In=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=Pn.get(n),o=/^(?:\\.?\\.?\\/|https?:\\/\\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>($n.set(t,e),s(r,e,n,o))))}}),Nn=e=>{for(const t of[].concat(e.type))Pn.set(t,e)};for(const e of[Nt,yn,vn,Sn,On,Rn])Nn(e);const{parse:Mn}=JSON,Fn=e=>{try{return Mn(e)}catch(t){return dn(e)}},Wn=(e,t,n,r={})=>{if(t){const[e,s]=((e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[wt(e),n]})(t,n);"json"===s?r=Ht(e).json():"toml"===s?r=Ht(e).text().then(dn):"string"===s?r=Fn(t):"object"===s&&t?r=t:"txt"===s&&"string"==typeof r&&(r=Fn(r)),t=e}return gt(r).then((n=>In[e](n,t)))},Hn="BeforeRun",Dn="AfterRun",Cn=[`code${Hn}`,`code${Hn}Async`,`code${Dn}`,`code${Dn}Async`],Ln=["onWorker","onReady",`on${Hn}`,`on${Hn}Async`,`on${Dn}`,`on${Dn}Async`];function Bn(e,t){const{run:n,runAsync:r}=Pn.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const qn=(e,t,n,r,s,o)=>{if(s||o){const a=Bn.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Un,Jn,zn;const Gn=(e,t)=>{addEventListener(e,t||(async t=>{try{await Un,Jn(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{parse:Yn,stringify:Kn}=p,{proxy:Xn,sync:Vn,polyfill:Zn,window:Qn,isWindowProxy:er}=await(async e=>{const t=await Ge(e),n=e?.transform||(e=>e),{[et]:r}=t.proxy,s=new Map,o=(e,t)=>{let n=s.get(e)?.deref();return n||s.set(e,new WeakRef(n=t(e))),n},a=([e,t])=>{switch(e){case Ye[g]:return null==t?globalThis:typeof t===y?o(t,p.object):t;case Ye[f]:return typeof t===y?o(t,p.array):t;case Ye[d]:return typeof t===y?o(t,p.function):te(parseInt(t));case Ye[w]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,n]of Ve)if(n===e)return t})(t);default:return t}},i=e=>{let[t,r]=m(e);switch(t){case g:if(r==globalThis||null==r)r=null;else if(typeof r===g&&!(r instanceof ue)){r=n(r);for(const e in r)r[e]=i(r[e])}return[Ye[g],r];case f:return[Ye[f],typeof r===y?r:n(r).map(i)];case d:return[Ye[d],typeof r===d?String(ne(n(r))):r];case w:return[Ye[w],Ze(e)];default:return[Ye[t],r]}},c=(...e)=>a(r(...e)),l={[E]:(e,t,n)=>c(E,e,i(t),i(n)),[v]:(e,t)=>c(v,e,i(t)),[T]:(e,t)=>c(T,e,i(t)),[k]:e=>c(k,e),[x]:(e,t)=>{const n=c(x,e,i(t));if(n){const{get:e,set:t,value:r}=n;e&&(n.get=a(e)),t&&(n.set=a(t)),r&&(n.value=a(r))}return n},[S]:(e,t)=>c(S,e,i(t)),[O]:e=>c(O,e),[A]:e=>c(A,e).map(a),[j]:e=>c(j,e),[R]:(e,t,n)=>c(R,e,i(t),i(n)),[P]:(e,t)=>c(P,e,i(t)),[Ke](e){s.delete(e),r(Ke,e)}},u={object:l,array:l,function:{...l,[_]:(e,...t)=>c(_,e,...t.map(i)),[b]:(e,...t)=>c(b,e,...t.map(i))}},{proxy:p,isProxy:h,pair:m}=V(u),$=p.object(null);return t.proxy[tt]=(e,t,...n)=>{const r=parseInt(t);switch(e){case _:{const[e,t]=n;return i(nt(te(r),a(e),t.map(a)))}case Ke:(e=>{const[t,n]=typeof e===y?[ee,Q]:[Q,ee],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(r)}},{...t,window:$,isWindowProxy:h}})({parse:Yn,stringify:Kn,transform:e=>zn?zn(e):e}),tr={polyfill:Zn,sync:Xn,window:Vn?Qn:null,isWindowProxy:er,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};Gn("message",(({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{Un=(async()=>{try{const{id:o,tag:a,type:i,custom:c,version:l,config:u,async:p}=e,f=((e,t="")=>`${e}@${t}`.replace(/@$/,""))(i,l),d=await Wn(f,t,n,u),{js_modules:h}=$n.get(f),y=h?.main,g=pt(Pn.get(i)),w=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:st.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(g,c||i,u||{},d);let m="run";if(p&&(m+="Async"),s){let e,t,n="",r="";for(const e of Cn){const t=s[e];if(t){const s=e.endsWith("Async");(s&&p||!s&&!p)&&(e.startsWith("codeBefore")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,bt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,bt(t),...o);return r&&await s(e,r,...o),a}})(g,m,n,r);for(const n of Ln.slice(2)){const r=s[n];if(r){const s=n.endsWith("Async");if(s&&p||!s&&!p){const s=_t(r);n.startsWith("onBefore")?e=s:t=s}}}qn(g,w,tr,p,e,t)}let _,b,E,v=null,T="";Vn&&(({CustomEvent:_,document:b}=Qn),v=o&&b.getElementById(o)||null,E=e=>mt(v,c||i,e,!0,_));const x=Rt(Qn,Xn,y,t);if(((e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,xt(r,e));t.registerJSModule(n,s,r)})(i,g,d,x),g.registerJSModule(d,"polyscript",{xworker:tr,currentScript:v,config:w.config,js_modules:x,get target(){return!T&&v&&("SCRIPT"===a?v.after(ut(b.createElement(`script-${c||i}`),{id:T=`${o}-target`})):(T=o,v.replaceChildren(),v.style.display="block")),T}}),Jn=g.runEvent.bind(g,d),zn=g.transform.bind(g,d),v&&E("ready"),s?.onReady&&_t(s?.onReady).call(g,Bn.call(g,w,d),tr),await g[m](d,r),["micropython","pyodide"].includes(g.type)){const e="polyscript",t=`__${e}_workers__`,n="__export__";d.runPython([`import js as ${t}`,`${t}.${t} = "${n}" in locals() and ${n} or []`,`del ${t}`].join("\\n"));const r=[...globalThis[t]];delete globalThis[t],r.length&&d.runPython([`from ${e} import xworker as ${t}`,...r.map((e=>`${t}.sync.${e} = ${e}`)),`del ${t}`].join("\\n"))}return v&&E("done"),postMessage("polyscript:done"),d}catch(e){postMessage(e)}})(),Gn("error"),Gn("message"),Gn("messageerror")}));\n'.replace(Me,Ne)],{type:"application/javascript"})),...e))({serviceWorker:n?.serviceWorker||n?.service_worker}),{postMessage:a}=s,i=this instanceof Pn,c=Ze(s.proxy,{importJS:_t,importCSS:bt}),l=Promise.withResolvers();let u=o(t).text().then((e=>{const t=i?this.toJSON():void 0;a.call(s,{options:n,config:r,code:e,hooks:t})})).then((()=>{u={then:e=>e()}}));return tt(s,{sync:{value:c},ready:{value:l.promise},postMessage:{value:(e,...t)=>u.then((()=>a.call(s,e,...t)))},onerror:{writable:!0,configurable:!0,value:console.error}}),s.addEventListener("message",(e=>{const{data:t}=e,n=t instanceof Error;(n||"polyscript:done"===t)&&(e.stopImmediatePropagation(),n?(l.reject(t),s.onerror(et(e,{type:{value:"error"},error:{value:t}}))):l.resolve(s))})),i&&this.onWorker?.(this.interpreter,s),s};const Mn="Invalid content",Nn="Invalid worker attribute",Fn="Invalid worker attribute";var Wn=e=>{const{src:t,worker:n}=e.attributes;if(n){let{value:r}=n;if(r)throw new SyntaxError(Fn);if(r=t?.value,!r){if(t)throw new SyntaxError(Nn);if(e.childElementCount){const{innerHTML:t,localName:n,type:s}=e,o=s||n.replace(/-script$/,"");r=Ve(t),console.warn(`Deprecated: use <script type="${o}"> for an always safe content parsing:\n`,r)}else r=e.textContent;return URL.createObjectURL(new Blob([Xe(r)],{type:"text/plain"}))}return r}if(t&&e.textContent.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*(?:\/\/|#).*/gm,"").trim())throw new SyntaxError(Mn)};const Hn=(e,t)=>{const n=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(e);return n.getElementById(t)||((e,t=document)=>t.querySelector(e))(t,n)},Dn=new WeakMap,Ln={get(){let e=Dn.get(this);return e||(e=document.createElement(`${this.type}-script`),Dn.set(this,e),Jn(this)),e},set(e){"string"==typeof e?Dn.set(this,Hn(this,e)):(Dn.set(this,e),Jn(this))}},Cn=new WeakMap,Un=new Map,Bn=(e,t)=>{const n=e?.value;return n?t+n:""},qn=(e,t,n,r,s,o,a=e)=>{if(!Un.has(t)){const i={interpreter:kn(n,s,o),queue:ot(),XWorker:In(e,r)};Un.set(t,i),Un.has(e)||Un.set(e,i),Un.has(a)||Un.set(a,i)}return Un.get(t)},Jn=async e=>{if(Cn.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{async:t,config:n,env:r,name:s,target:i,version:l,"service-worker":u},src:p,type:f}=e,h=l?.value,d=xn(f,h);let g=Bn(n,"|");const y=Bn(r,"")||`${d}${g}`;g=g.slice(1);const w=Wn(e);if(w){const n=new(In(f,h))(w,{...ct(e,f),async:!!t,config:g,serviceWorker:u?.value});Cn.set(nt(e,"xworker",{value:n}),{xworker:n});const r=s?.value;return void(r&&a[r].resolve(n.ready))}const m=Bn(i,""),_=qn(f,y,d,h,g);Cn.set(nt(e,"target",Ln),_),m&&Dn.set(e,Hn(e,m));const b=p?o(p).text():e.textContent;_.queue=_.queue.then((()=>(async(e,t,n,r)=>{const{type:s}=e,o=dn.get(s);o.experimental&&console.warn(`The ${s} interpreter is experimental`);const[a,i]=await st([Cn.get(e).interpreter,t]);try{nt(document,"currentScript",{configurable:!0,get:()=>e}),mt(s,o,a,gt),o.registerJSModule(a,"polyscript",{XWorker:n,currentScript:e,js_modules:gt,workers:c}),lt(e,s,"ready");const t=o[r?"runAsync":"run"](a,i),l=lt.bind(null,e,s,"done");return r?t.then(l):l(),t}finally{delete document.currentScript}})(e,b,_.XWorker,!!t)))}},zn=new Proxy(et(null),{get:(e,t)=>new Promise(queueMicrotask).then((()=>Gn(t)))}),Gn=async e=>{if(Un.has(e)){const{interpreter:t,queue:n}=Un.get(e);return(await st([t,n]))[0]}const t=Un.size?`Available interpreters are: ${[...Un.keys()].map((e=>`"${e}"`)).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},Yn=async e=>{const{type:n,currentTarget:r}=e;if(wn.length)for(let{name:s,value:o,ownerElement:a}of t(`./@*[${wn.map((e=>`name()="${e}${n}"`)).join(" or ")}]`,r)){s=s.slice(0,-(n.length+1));const t=await Gn(a.getAttribute(`${s}-env`)||s);dn.get(s).runEvent(t,o,e)}},Kn=e=>{if(wn.length)for(let{name:n,ownerElement:r}of t(`.//@*[${wn.map((e=>`starts-with(name(),"${e}")`)).join(" or ")}]`,e)){const e=n.lastIndexOf("-"),t=n.slice(e+1);"env"!==t&&(r.addEventListener(t,Yn),"disabled"in r&&!r.disabled&&(r.disabled=!0,zn[n.slice(0,e)].then((()=>{r.disabled=!1}))))}},Xn=In(),Vn=[],Qn=new Map,Zn=new Map,er=new Map,tr=async e=>{for(const t of Vn)if(e.matches(t)){const n=Zn.get(t),r=nr.get(n),{resolve:s}=er.get(n),{options:o,known:i}=r;if(i.has(e))return;i.add(e);for(const[t,n]of Qn)e.matches(t)&&await n(e);const{interpreter:l,configURL:u,config:p,version:f,env:h,onerror:d,hooks:g}=o;let y;try{const t=Wn(e);if(t){const r=Xn.call(new Pn(null,g),t,{...ct(e,n),version:f,configURL:u,type:l,custom:n,config:e.getAttribute("config")||p||{},async:e.hasAttribute("async"),serviceWorker:e.getAttribute("service-worker")});nt(e,"xworker",{value:r}),s({type:n,xworker:r});const o=e.getAttribute("name");return void(o&&a[o].resolve(r.ready))}}catch(e){y=e}const w=xn(l,f),m=h||`${w}${p?`|${p}`:""}`,{interpreter:_,XWorker:b}=qn(n,m,w,f,p,u,l),v=await _,E=et(dn.get(l)),k=new Pn(v,g),x=function(...e){return b.apply(k,e)},T={...ut(E,n,structuredClone(gn.get(w)),v),XWorker:x};mt(l,E,v,gt),E.registerJSModule(v,"polyscript",{XWorker:x,config:T.config,currentScript:n.startsWith("_")?null:e,js_modules:gt,workers:c});for(const t of["Run","RunAsync"]){let n,r,s="",o="";for(const e of jn){const n=g?.main?.[e];n&&e.endsWith(t)&&(e.startsWith("codeBefore")?s=Xe(n()):o=Xe(n()))}(s||o)&&ft(E,`r${t.slice(1)}`,s,o);for(let e=2;e<On.length;e++){const s=On[e],o=g?.main?.[s];o&&s.endsWith(t)&&(s.startsWith("onBefore")?n=o:r=o)}$n(E,T,e,t.endsWith("Async"),n,r)}r.queue=r.queue.then((()=>(s(T),y&&d?.(y,e),g?.main?.onReady?.(T,e))))}},nr=new Map;let rr=0;const sr=e=>(er.has(e)||er.set(e,Promise.withResolvers()),er.get(e).promise),[{customObserver:or,define:ar,whenDefined:ir,env:cr,Hook:lr,XWorker:ur},pr]=((e,t,n=globalThis)=>{const r=Symbol.for(e),s=r in n;return[s?n[r]:Object.defineProperty(n,r,{value:t})[r],s]})("polyscript",{customObserver:Qn,define:(t,n)=>{let r=null==t;if(r)t="_ps"+rr++;else if(dn.has(t)||nr.has(t))throw new Error(`<script type="${t}"> already registered`);if(!dn.has(n?.interpreter))throw new Error("Unspecified interpreter");dn.set(t,dn.get(n.interpreter));const s=[`script[type="${t}"]`];if(sr(t),r){const{hooks:e}=n,r=e?.main?.onReady;n={...n,hooks:{...e,main:{...e?.main,onReady(e,n){Vn.splice(Vn.indexOf(t),1),dn.delete(t),nr.delete(t),er.delete(t),n.remove(),r?.(e)}}}},document.head.append(Ze(document.createElement("script"),{type:t}))}else s.push(`${t}-script`),wn.push(`${t}-`);for(const e of s)Zn.set(e,t);Vn.push(...s),nr.set(t,{options:Ze({env:t},n),known:new WeakSet,queue:Promise.resolve()}),r||Kn(document),e(s.join(",")).forEach(tr)},whenDefined:sr,env:zn,Hook:Pn,XWorker:Xn});if(!pr){const t=new MutationObserver((e=>{const t=yn.join(",");for(const{type:r,target:s,attributeName:o,addedNodes:a}of e)if("attributes"!==r)for(const e of a)1===e.nodeType&&(Kn(e),t&&e.matches(t)?Jn(e):n(t,e,!0));else{const e=o.lastIndexOf("-")+1;if(e){const t=o.slice(0,e);for(const n of wn)if(t===n){const t=o.slice(e);if("env"!==t){const e=s.hasAttribute(o)?"add":"remove";s[`${e}EventListener`](t,Yn)}break}}}})),n=(t,n,r)=>{t&&e(t,n).forEach(Jn),(t=Vn.join(","))&&(r&&tr(n),e(t,n).forEach(tr))},r=e=>(t.observe(e,{childList:!0,subtree:!0,attributes:!0}),e),{attachShadow:s}=Element.prototype;Ze(Element.prototype,{attachShadow(e){return r(s.call(this,e))}}),queueMicrotask((()=>{Kn(r(document)),n(yn.join(","),document,!1)}))}export{lr as Hook,Mn as INVALID_CONTENT,Nn as INVALID_SRC_ATTR,Fn as INVALID_WORKER_ATTR,ur as XWorker,or as customObserver,ar as define,cr as env,ir as whenDefined};
 //# sourceMappingURL=index.js.map
diff --git a/docs/index.js.map b/docs/index.js.map
index 7c7c423a..1c6fac39 100644
--- a/docs/index.js.map
+++ b/docs/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sources":["../node_modules/sticky-module/esm/index.js","../node_modules/basic-devtools/esm/index.js","../node_modules/@webreflection/fetch/esm/index.js","../esm/workers.js","../node_modules/@ungap/structured-clone/esm/deserialize.js","../node_modules/@ungap/structured-clone/esm/types.js","../node_modules/@ungap/structured-clone/esm/serialize.js","../node_modules/@ungap/structured-clone/esm/json.js","../node_modules/proxy-target/esm/types.js","../node_modules/js-proxy/esm/heap.js","../node_modules/sabayon/src/shared.js","../node_modules/sabayon/src/main.js","../node_modules/coincident/src/shared.js","../node_modules/coincident/src/main.js","../node_modules/coincident/src/window/types.js","../node_modules/proxy-target/esm/traps.js","../node_modules/js-proxy/esm/traps.js","../node_modules/coincident/src/window/symbol.js","../node_modules/coincident/src/window/constants.js","../node_modules/gc-hook/esm/index.js","../node_modules/coincident/src/window/events.js","../node_modules/coincident/src/window/main.js","../esm/worker/xworker.js","../node_modules/@ungap/with-resolvers/index.js","../node_modules/codedent/esm/index.js","../node_modules/plain-tag/esm/index.js","../node_modules/html-escaper/esm/index.js","../esm/interpreter/_io.js","../esm/utils.js","../esm/interpreter/_utils.js","../node_modules/@webreflection/idb-map/index.js","../node_modules/@webreflection/idb-map/sync.js","../esm/interpreter/_python.js","../esm/python/mip.js","../esm/3rd-party.js","../esm/interpreter/micropython.js","../esm/interpreter/pyodide.js","../esm/interpreter/ruby-wasm-wasi.js","../esm/interpreter/wasmoon.js","../esm/interpreter/webr.js","../esm/interpreters.js","../esm/loader.js","../node_modules/to-json-callback/esm/index.js","../esm/hooks.js","../esm/worker/hook.js","../esm/worker/class.js","../esm/errors.js","../esm/worker/url.js","../esm/script-handler.js","../esm/listeners.js","../esm/xworker.js","../esm/custom.js","../esm/index.js"],"sourcesContent":["/**\n * Allow leaking a module globally to help avoid conflicting exports\n * if the module might have been re-bundled in other projects.\n * @template T\n * @param {string} name the module name to save or retrieve\n * @param {T} value the module as value to save if not known\n * @param {globalThis} [global=globalThis] the reference where modules are saved where `globalThis` is the default\n * @returns {[T, boolean]} the passed `value` or the previous one as first entry, a boolean indicating if it was known or not\n */\nconst stickyModule = (name, value, global = globalThis) => {\n  const symbol = Symbol.for(name);\n  const known = symbol in global;\n  return [\n    known ?\n      global[symbol] :\n      Object.defineProperty(global, symbol, { value })[symbol],\n    known\n  ];\n};\n\nexport default stickyModule;\n","/**\n * Given a CSS selector, returns the first matching node, if any.\n * @param {string} css the CSS selector to query\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Element?} the found element, if any\n */\nconst $ = (css, root = document) => root.querySelector(css);\n\n/**\n * Given a CSS selector, returns a list of all matching nodes.\n * @param {string} css the CSS selector to query\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Element[]} a list of found nodes\n */\nconst $$ = (css, root = document) => [...root.querySelectorAll(css)];\n\n/**\n * Given a XPath selector, returns a list of all matching nodes.\n * @param {string} path the XPath selector to evaluate\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Node[]} a list of found nodes (elements, attributes, text, comments)\n */\nconst $x = (path, root = document) => {\n  const expression = (new XPathEvaluator).createExpression(path);\n  const xpath = expression.evaluate(root, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);\n  const result = [];\n  for (let i = 0, {snapshotLength} = xpath; i < snapshotLength; i++)\n    result.push(xpath.snapshotItem(i));\n  return result;\n};\n\nexport {$, $$, $x};\n","// a bit terser code than I usually write but it's 10 LOC within 80 cols\n// if you are struggling to follow the code you can replace 1-char\n// references around with the following one, hoping that helps :-)\n\n// d => descriptors\n// k => key\n// p => promise\n// r => response\n\nconst d = Object.getOwnPropertyDescriptors(Response.prototype);\n\nconst isFunction = value => typeof value === 'function';\n\nconst bypass = (p, k, { get, value }) => get || !isFunction(value) ?\n                p.then(r => r[k]) :\n                (...args) => p.then(r => r[k](...args));\n\nconst direct = (p, value) => isFunction(value) ? value.bind(p) : value;\n\nconst handler = {\n    get: (p, k) => d.hasOwnProperty(k) ? bypass(p, k, d[k]) : direct(p, p[k])\n};\n\n/**\n * @param {RequestInfo | URL} input\n * @param  {...RequestInit} init\n * @returns {Promise<Response> & Response}\n */\nexport default (input, ...init) => new Proxy(fetch(input, ...init), handler);\n","// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const workers = new Proxy(new Map, {\n  get(map, name) {\n    if (!map.has(name))\n      map.set(name, Promise.withResolvers());\n    return map.get(name);\n  },\n});\n\n// filter out forever pending Promises in Pyodide\n// @issue https://github.com/pyscript/pyscript/issues/2106\nconst ignore = new Set(['__dict__', 'constructor', 'get', 'has', 'includes', 'next', 'set', 'then']);\n\nexport const workersHandler = new Proxy(Object.freeze({}), {\n  // guard against forever pending Promises in Pyodide\n  // @issue https://github.com/pyscript/pyscript/issues/2106\n  get: (_, name) => (typeof name === 'string' && !ignore.has(name)) ?\n    workers[name].promise.then(w => w.sync) :\n    void 0,\n});\n/* c8 ignore stop */\n","import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst env = typeof self === 'object' ? self : globalThis;\n\nconst deserializer = ($, _) => {\n  const as = (out, index) => {\n    $.set(index, out);\n    return out;\n  };\n\n  const unpair = index => {\n    if ($.has(index))\n      return $.get(index);\n\n    const [type, value] = _[index];\n    switch (type) {\n      case PRIMITIVE:\n      case VOID:\n        return as(value, index);\n      case ARRAY: {\n        const arr = as([], index);\n        for (const index of value)\n          arr.push(unpair(index));\n        return arr;\n      }\n      case OBJECT: {\n        const object = as({}, index);\n        for (const [key, index] of value)\n          object[unpair(key)] = unpair(index);\n        return object;\n      }\n      case DATE:\n        return as(new Date(value), index);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as(new RegExp(source, flags), index);\n      }\n      case MAP: {\n        const map = as(new Map, index);\n        for (const [key, index] of value)\n          map.set(unpair(key), unpair(index));\n        return map;\n      }\n      case SET: {\n        const set = as(new Set, index);\n        for (const index of value)\n          set.add(unpair(index));\n        return set;\n      }\n      case ERROR: {\n        const {name, message} = value;\n        return as(new env[name](message), index);\n      }\n      case BIGINT:\n        return as(BigInt(value), index);\n      case 'BigInt':\n        return as(Object(BigInt(value)), index);\n    }\n    return as(new env[type](value), index);\n  };\n\n  return unpair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns a deserialized value from a serialized array of Records.\n * @param {Record[]} serialized a previously serialized value.\n * @returns {any}\n */\nexport const deserialize = serialized => deserializer(new Map, serialized)(0);\n","export const VOID       = -1;\nexport const PRIMITIVE  = 0;\nexport const ARRAY      = 1;\nexport const OBJECT     = 2;\nexport const DATE       = 3;\nexport const REGEXP     = 4;\nexport const MAP        = 5;\nexport const SET        = 6;\nexport const ERROR      = 7;\nexport const BIGINT     = 8;\n// export const SYMBOL = 9;\n","import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst EMPTY = '';\n\nconst {toString} = {};\nconst {keys} = Object;\n\nconst typeOf = value => {\n  const type = typeof value;\n  if (type !== 'object' || !value)\n    return [PRIMITIVE, type];\n\n  const asString = toString.call(value).slice(8, -1);\n  switch (asString) {\n    case 'Array':\n      return [ARRAY, EMPTY];\n    case 'Object':\n      return [OBJECT, EMPTY];\n    case 'Date':\n      return [DATE, EMPTY];\n    case 'RegExp':\n      return [REGEXP, EMPTY];\n    case 'Map':\n      return [MAP, EMPTY];\n    case 'Set':\n      return [SET, EMPTY];\n  }\n\n  if (asString.includes('Array'))\n    return [ARRAY, asString];\n\n  if (asString.includes('Error'))\n    return [ERROR, asString];\n\n  return [OBJECT, asString];\n};\n\nconst shouldSkip = ([TYPE, type]) => (\n  TYPE === PRIMITIVE &&\n  (type === 'function' || type === 'symbol')\n);\n\nconst serializer = (strict, json, $, _) => {\n\n  const as = (out, value) => {\n    const index = _.push(out) - 1;\n    $.set(value, index);\n    return index;\n  };\n\n  const pair = value => {\n    if ($.has(value))\n      return $.get(value);\n\n    let [TYPE, type] = typeOf(value);\n    switch (TYPE) {\n      case PRIMITIVE: {\n        let entry = value;\n        switch (type) {\n          case 'bigint':\n            TYPE = BIGINT;\n            entry = value.toString();\n            break;\n          case 'function':\n          case 'symbol':\n            if (strict)\n              throw new TypeError('unable to serialize ' + type);\n            entry = null;\n            break;\n          case 'undefined':\n            return as([VOID], value);\n        }\n        return as([TYPE, entry], value);\n      }\n      case ARRAY: {\n        if (type)\n          return as([type, [...value]], value);\n  \n        const arr = [];\n        const index = as([TYPE, arr], value);\n        for (const entry of value)\n          arr.push(pair(entry));\n        return index;\n      }\n      case OBJECT: {\n        if (type) {\n          switch (type) {\n            case 'BigInt':\n              return as([type, value.toString()], value);\n            case 'Boolean':\n            case 'Number':\n            case 'String':\n              return as([type, value.valueOf()], value);\n          }\n        }\n\n        if (json && ('toJSON' in value))\n          return pair(value.toJSON());\n\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const key of keys(value)) {\n          if (strict || !shouldSkip(typeOf(value[key])))\n            entries.push([pair(key), pair(value[key])]);\n        }\n        return index;\n      }\n      case DATE:\n        return as([TYPE, value.toISOString()], value);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as([TYPE, {source, flags}], value);\n      }\n      case MAP: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const [key, entry] of value) {\n          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))\n            entries.push([pair(key), pair(entry)]);\n        }\n        return index;\n      }\n      case SET: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const entry of value) {\n          if (strict || !shouldSkip(typeOf(entry)))\n            entries.push(pair(entry));\n        }\n        return index;\n      }\n    }\n\n    const {message} = value;\n    return as([TYPE, {name: type, message}], value);\n  };\n\n  return pair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} value a serializable value.\n * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,\n *  if `true`, will not throw errors on incompatible types, and behave more\n *  like JSON stringify would behave. Symbol and Function will be discarded.\n * @returns {Record[]}\n */\n export const serialize = (value, {json, lossy} = {}) => {\n  const _ = [];\n  return serializer(!(json || lossy), !!json, new Map, _)(value), _;\n};\n","/*! (c) Andrea Giammarchi - ISC */\n\nimport {deserialize} from './deserialize.js';\nimport {serialize} from './serialize.js';\n\nconst {parse: $parse, stringify: $stringify} = JSON;\nconst options = {json: true, lossy: true};\n\n/**\n * Revive a previously stringified structured clone.\n * @param {string} str previously stringified data as string.\n * @returns {any} whatever was previously stringified as clone.\n */\nexport const parse = str => deserialize($parse(str));\n\n/**\n * Represent a structured clone value as string.\n * @param {any} any some clone-able value to stringify.\n * @returns {string} the value stringified.\n */\nexport const stringify = any => $stringify(serialize(any, options));\n","export const ARRAY     = 'array';\nexport const BIGINT    = 'bigint';\nexport const BOOLEAN   = 'boolean';\nexport const FUNCTION  = 'function';\nexport const NULL      = 'null';\nexport const NUMBER    = 'number';\nexport const OBJECT    = 'object';\nexport const STRING    = 'string';\nexport const SYMBOL    = 'symbol';\nexport const UNDEFINED = 'undefined';\n","import { NUMBER } from 'proxy-target/types';\n\nlet uid = 0;\nconst ids = new Map;\nconst values = new Map;\n\n/**\n * Remove by id or value any previously stored reference.\n * @param {number | unknown} id the held value by id or the value itself.\n * @returns {boolean} `true` if the operation was successful, `false` otherwise.\n */\nexport const drop = id => {\n  const [a, b] = typeof id === NUMBER ? [values, ids] : [ids, values];\n  const had = a.has(id);\n  if (had) {\n    b.delete(a.get(id));\n    a.delete(id);\n  }\n  return had;\n};\n\n/**\n * Return the held value reference by its unique identifier.\n * @param {number} id the unique identifier for the value reference.\n * @returns {unknown} the related value / reference or undefined.\n */\nexport const get = id => values.get(id);\n\n/**\n * Create once a unique number id for a generic value reference.\n * @param {unknown} value a reference used to create a unique identifier.\n * @returns {number} a unique identifier for that reference.\n */\nexport const hold = value => {\n  if (!ids.has(value)) {\n    let id;\n    // a bit apocalyptic scenario but if this thread runs forever\n    // and the id does a whole int32 roundtrip we might have still\n    // some reference dangling around\n    while (/* c8 ignore next */ values.has(id = uid++));\n    ids.set(value, id);\n    values.set(id, value);\n  }\n  return ids.get(value);\n};\n","// (c) Andrea Giammarchi - MIT\n\nconst ACTION_INIT = 0;\nconst ACTION_NOTIFY = 1;\nconst ACTION_WAIT = 2;\nconst ACTION_SW = 3;\n\nconst { ArrayBuffer, Atomics: $Atomics, Promise } = globalThis;\nconst { isArray } = Array;\nconst { create, getPrototypeOf, values } = Object;\n\nconst TypedArray = getPrototypeOf(Int32Array);\nconst Atomics = create($Atomics);\n\nconst dispatch = ({ currentTarget, type, origin, lastEventId, source, ports }, data) =>\n  currentTarget.dispatchEvent(new MessageEvent(type, { data, origin, lastEventId, source, ports }));\n\nconst withResolvers = () => Promise.withResolvers();\n\nlet id = 0;\nconst views = new Map;\nconst extend = (Class, SharedArrayBuffer) => class extends Class {\n  constructor(value, ...rest) {\n    super(value, ...rest);\n    if (value instanceof SharedArrayBuffer)\n      views.set(this, [id++, 0, withResolvers()]);\n  }\n};\n\nconst ignoreList = new WeakSet;\n\n/**\n * @template {T}\n * @callback PassThrough\n * @param {T} value\n * @returns {T}\n */\n\n/** @type {PassThrough} */\nconst ignoreDirect = value => value;\n\n/** @type {PassThrough} */\nconst ignorePatch = value => {\n  ignoreList.add(value);\n  return value;\n};\n\nconst isChannel = (event, channel) => {\n  const { data } = event;\n  const yes = isArray(data) && (\n    data.at(0) === channel ||\n    (data.at(1) === ACTION_INIT && !channel)\n  );\n  if (yes) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  }\n  return yes;\n};\n\nconst isObject = value => (\n  value !== null &&\n  typeof value === 'object' &&\n  !ignoreList.has(value)\n);\n\nconst transferred = new WeakMap;\nconst transferViews = (data, transfer, visited) => {\n  if (views.has(data))\n    transfer.set(data, views.get(data)[0]);\n  else if (!(data instanceof TypedArray || data instanceof ArrayBuffer)) {\n    for (const value of values(data)) {\n      if (isObject(value) && !visited.has(value)) {\n        visited.add(value);\n        transferViews(value, transfer, visited);\n      }\n    }\n  }\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync#browser_compatibility\nconst waitAsyncPatch = (...args) => ({\n  value: new Promise(resolve => {\n    // encodeURIComponent('onmessage=e=>postMessage(!Atomics.wait(...e.data))')\n    let w = new Worker('data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))');\n    w.onmessage = () => resolve('ok');\n    w.postMessage(args);\n  })\n});\n\nconst waitAsyncPoly = (view, index) => {\n  const value = views.get(view), [id, _, { promise }] = value;\n  value[1] = index;\n  return [id, promise];\n};\n\nconst actionNotify = (_view, _id, _index) => {\n  for (const [view, [id, index, { resolve }]] of views) {\n    if (_id === id && _index === index) {\n      for (let i = 0; i < _view.length; i++) view[i] = _view[i];\n      views.delete(view);\n      resolve('ok');\n      break;\n    }\n  }\n};\n\nconst actionWait = (event, transfer, data) => {\n  for (const [view, id] of transfer)\n    transferred.set(view, [id, event.currentTarget]);\n  dispatch(event, data);\n};\n\nconst postData = (CHANNEL, data) => {\n  const transfer = new Map;\n  if (isObject(data)) transferViews(data, transfer, new Set);\n  return transfer.size ? [CHANNEL, ACTION_WAIT, transfer, data] : data;\n};\n\nconst getData = view => transferred.get(view);\n\nexport {\n  ACTION_INIT, ACTION_NOTIFY, ACTION_WAIT, ACTION_SW,\n\n  ArrayBuffer, Atomics, TypedArray,\n\n  actionNotify, actionWait,\n  getData, postData,\n  ignoreDirect, ignorePatch,\n  waitAsyncPatch, waitAsyncPoly,\n\n  dispatch,\n  extend,\n  isChannel,\n  views,\n  withResolvers,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  ACTION_INIT, ACTION_NOTIFY, ACTION_WAIT, ACTION_SW,\n\n  ArrayBuffer, Atomics,\n\n  actionNotify, actionWait,\n  getData, postData,\n  ignoreDirect, ignorePatch,\n  waitAsyncPatch, waitAsyncPoly,\n\n  extend,\n  isChannel,\n  withResolvers,\n} from './shared.js';\n\nlet {\n  BigInt64Array,\n  Int32Array,\n  SharedArrayBuffer,\n  Worker,\n} = globalThis;\n\nlet ignore = ignoreDirect;\nlet polyfill = false;\n\nconst asModule = options => ({ ...options, type: 'module' });\n\ntry {\n  new SharedArrayBuffer(4);\n\n  Worker = class extends Worker {\n    constructor(url, options) {\n      super(url, asModule(options));\n    }\n  }\n\n  if (!Atomics.waitAsync)\n    Atomics.waitAsync = waitAsyncPatch;\n}\ncatch (_) {\n  const CHANNEL = crypto.randomUUID();\n\n  const sync = new Map;\n\n  const addListener = (self, type, handler, ...rest) => {\n    self.addEventListener(type, handler, ...rest);\n  };\n\n  const register = ({ serviceWorker: s }, sw, done) => {\n    let w, c = true;\n    addListener(s, 'message', event => {\n      if (isChannel(event, CHANNEL)) {\n        const [_, id, index] = event.data;\n        const uid = [id, index].join(',');\n        const done = view => {\n          sync.delete(uid);\n          w.postMessage([ CHANNEL, id, index, view ]);\n        };\n        const view = sync.get(uid);\n        if (view) done(view);\n        else {\n          const { promise, resolve } = withResolvers();\n          sync.set(uid, resolve);\n          promise.then(done);\n        }\n      }\n    });\n    // use previous registration, if any, before registering it\n    s.getRegistration(sw)\n      .then(r => (r ?? s.register(sw)))\n      .then(function ready(r) {\n        c = c && !!s.controller;\n        w = (r.installing || r.waiting || r.active);\n        if (w.state === 'activated') {\n          if (c) done();\n          else location.reload();\n        }\n        else\n          addListener(w, 'statechange', () => ready(r), { once: true });\n      });\n  };\n\n  ignore = ignorePatch;\n  polyfill = true;\n\n  Atomics.notify = (view, index) => {\n    const [id, worker] = getData(view);\n    const uid = [id, index].join(',');\n    const known = sync.get(uid);\n    if (known) known(view);\n    else sync.set(uid, view);\n    worker.postMessage([CHANNEL, ACTION_NOTIFY, view, id, index]);\n    return 0;\n  };\n\n  Atomics.waitAsync = (view, ...rest) => {\n    const [_, value] = waitAsyncPoly(view, ...rest);\n    return { value };\n  };\n\n  SharedArrayBuffer = class extends ArrayBuffer {}\n  BigInt64Array = extend(BigInt64Array, SharedArrayBuffer);\n  Int32Array = extend(Int32Array, SharedArrayBuffer);\n\n  let serviceWorker = null;\n  Worker = class extends Worker {\n    constructor(url, options) {\n      let sw = options?.serviceWorker || '';\n      if (sw) {\n        sw = new URL(sw, location.href).href;\n        options = { ...options, serviceWorker: sw };\n        if (!serviceWorker) {\n          const { promise, resolve } = withResolvers();\n          register(navigator, sw, resolve);\n          serviceWorker = promise;\n        }\n        serviceWorker.then(\n          () => super.postMessage([CHANNEL, ACTION_SW])\n        );\n      }\n      super(url, asModule(options));\n      super.postMessage([CHANNEL, ACTION_INIT, options]);\n      addListener(this, 'message', event => {\n        if (isChannel(event, CHANNEL)) {\n          const [_, ACTION, ...rest] = event.data;\n          switch (ACTION) {\n            case ACTION_NOTIFY: {\n              actionNotify(...rest);\n              break;\n            }\n            case ACTION_WAIT: {\n              actionWait(event, ...rest);\n              break;\n            }\n          }\n        }\n      });\n    }\n    postMessage(data, ...rest) {\n      return super.postMessage(postData(CHANNEL, data), ...rest);\n    }\n  }\n}\n\nexport {\n  /** @type {globalThis.Atomics} */ Atomics,\n  /** @type {globalThis.BigInt64Array} */ BigInt64Array,\n  /** @type {globalThis.Int32Array} */ Int32Array,\n  /** @type {globalThis.SharedArrayBuffer} */ SharedArrayBuffer,\n  /** @type {globalThis.Worker} */ Worker,\n  ignore,\n  polyfill,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  ACTION_INIT,\n  ACTION_NOTIFY,\n  ACTION_WAIT,\n  Atomics,\n  isChannel,\n  withResolvers,\n} from 'sabayon/shared';\n\nconst { BYTES_PER_ELEMENT: I32_BYTES } = Int32Array;\nconst { BYTES_PER_ELEMENT: UI16_BYTES } = Uint16Array;\n\nconst { notify } = Atomics;\n\nconst decoder = new TextDecoder('utf-16');\n\nconst buffers = new WeakSet;\n\nconst transfer = (...args) => (buffers.add(args), args);\n\nlet seppuku = '';\nconst actionLength = (stringify, transform) => async (callback, results, [name, id, sb, args, isSync]) => {\n  if (isSync) seppuku = name;\n  try {\n    const result = await callback(...args);\n    if (result !== void 0) {\n      const serialized = stringify(transform ? transform(result) : result);\n      results.set(id, serialized);\n      sb[1] = serialized.length;\n    }\n  }\n  finally {\n    if (isSync) seppuku = '';\n    sb[0] = 1;\n    notify(sb, 0);\n  }\n};\nconst actionFill = (results, [id, sb]) => {\n  const result = results.get(id);\n  results.delete(id);\n  for (let ui16a = new Uint16Array(sb.buffer), i = 0, { length } = result; i < length; i++)\n    ui16a[i] = result.charCodeAt(i);\n  notify(sb, 0);\n};\nconst actionWait = (waitLength, results, map, rest) => {\n  const [name] = rest;\n  const callback = map.get(name);\n  if (!callback) throw new Error(`Unknown proxy.${name}()`);\n  waitLength(callback, results, rest);\n};\n\nconst warn = (name, seppuku) => setTimeout(\n  console.warn,\n  1000,\n  `πŸ’€πŸ”’ - proxy.${name}() in proxy.${seppuku}()`\n);\n\nlet uid = 0;\nconst invoke = (\n  [\n    CHANNEL,\n    i32View,\n    ignore,\n    isSync,\n    parse,\n    polyfill,\n    postMessage,\n    transform,\n    waitAsync,\n  ],\n  name,\n) => (...args) => {\n  let deadlock = seppuku !== '', timer = 0;\n  if (deadlock) timer = warn(name, seppuku);\n  const id = uid++;\n  const transfer = [];\n  if (buffers.has(args.at(-1) || transfer))\n    buffers.delete(transfer = args.pop());\n  const data = ignore(transform ? args.map(transform) : args);\n  let sb = i32View(I32_BYTES * 2);\n  postMessage([CHANNEL, ACTION_WAIT, name, id, sb, data, isSync], { transfer });\n  return waitAsync(sb, 0).value.then(() => {\n    if (deadlock) clearTimeout(timer);\n    const length = sb[1];\n    if (!length) return;\n    const bytes = UI16_BYTES * length;\n    sb = i32View(bytes + (bytes % I32_BYTES));\n    postMessage([CHANNEL, ACTION_NOTIFY, id, sb]);\n    return waitAsync(sb, 0).value.then(() =>{\n      const ui16a = new Uint16Array(sb.buffer);\n      const sub = polyfill ? ui16a.subarray(0, length) : ui16a.slice(0, length);\n      return parse(decoder.decode(sub));\n    });\n  });\n};\n\nconst createProxy = (details, map) => new Proxy(map, {\n  get: (map, name) => {\n    let cb;\n    // the curse of potentially awaiting proxies in the wild\n    // requires this ugly guard around `then`\n    if (name !== 'then') {\n      cb = map.get(name);\n      if (!cb) {\n        cb = invoke(details, name);\n        map.set(name, cb);\n      }\n    }\n    return cb;\n  },\n  set: (map, name, callback) => (\n    name !== 'then' &&\n    !!map.set(name, callback)\n  ),\n});\n\nexport {\n  ACTION_INIT,\n  ACTION_WAIT,\n  ACTION_NOTIFY,\n\n  actionLength,\n  actionFill,\n  actionWait,\n\n  createProxy,\n\n  isChannel,\n  transfer,\n\n  withResolvers,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  Atomics,\n  Int32Array,\n  SharedArrayBuffer,\n  Worker as $Worker,\n  ignore,\n  polyfill,\n} from 'sabayon/main';\n\nimport {\n  ACTION_INIT,\n  ACTION_WAIT,\n  ACTION_NOTIFY,\n\n  actionLength,\n  actionFill,\n  actionWait,\n\n  createProxy,\n\n  isChannel,\n  transfer,\n} from './shared.js';\n\n/**\n * @typedef {Object} MainOptions\n * @prop {(text: string, ...args:any) => any} [parse=JSON.parse]\n * @prop {(value: any, ...args:any) => string} [stringify=JSON.stringify]\n * @prop {(value: any) => any} [transform]\n */\n\n/**\n * @callback Coincident\n * @param {MainOptions} [options]\n * @returns {{Worker: import('./ts.js').CoincidentWorker, polyfill: boolean, transfer: (...args: Transferable[]) => Transferable[]}}\n */\n\nexport default /** @type {Coincident} */ ({\n  parse,\n  stringify,\n  transform,\n} = JSON) => {\n  const waitLength = actionLength(stringify, transform);\n\n  const CHANNEL = crypto.randomUUID();\n\n  class Worker extends $Worker {\n    constructor(url, options) {\n      const map = new Map;\n      const results = new Map;\n      super(url, options);\n      this.proxy = createProxy(\n        [\n          CHANNEL,\n          bytes => new Int32Array(new SharedArrayBuffer(bytes)),\n          ignore,\n          false,\n          parse,\n          polyfill,\n          (...args) => this.postMessage(...args),\n          transform,\n          Atomics.waitAsync,\n        ],\n        map,\n      );\n      this.postMessage(ignore([CHANNEL, ACTION_INIT, options]));\n      this.addEventListener('message', event => {\n        if (isChannel(event, CHANNEL)) {\n          const [_, ACTION, ...rest] = event.data;\n          switch (ACTION) {\n            case ACTION_WAIT: {\n              actionWait(waitLength, results, map, rest);\n              break;\n            }\n            case ACTION_NOTIFY: {\n              actionFill(results, rest);\n              break;\n            }\n          }\n        }\n      });\n    }\n  }\n\n  return {\n    Worker,\n    polyfill,\n    transfer,\n  };\n};\n","import {\n  ARRAY,\n  BIGINT,\n  BOOLEAN,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n} from 'js-proxy/types';\n\n// this literal allows mapping right away\n// string types into numeric values so that\n// the transported and transformed arrays\n// would use less bytes to satisfy te same\n// contract while exchanging information.\n// basically this is an home-made ENUM like\n// object literal ... that's it.\n// TBD: should this be part of js-proxy? it feels\n//      to me like it would rather belong in there.\nexport default Object.fromEntries([\n  ARRAY,\n  BIGINT,\n  BOOLEAN,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n].map((k, i) => [k, i]));\n","export const APPLY                        = 'apply';\nexport const CONSTRUCT                    = 'construct';\nexport const DEFINE_PROPERTY              = 'defineProperty';\nexport const DELETE_PROPERTY              = 'deleteProperty';\nexport const GET                          = 'get';\nexport const GET_OWN_PROPERTY_DESCRIPTOR  = 'getOwnPropertyDescriptor';\nexport const GET_PROTOTYPE_OF             = 'getPrototypeOf';\nexport const HAS                          = 'has';\nexport const IS_EXTENSIBLE                = 'isExtensible';\nexport const OWN_KEYS                     = 'ownKeys';\nexport const PREVENT_EXTENSION            = 'preventExtensions';\nexport const SET                          = 'set';\nexport const SET_PROTOTYPE_OF             = 'setPrototypeOf';\n","export * from 'proxy-target/traps';\nexport const DESTRUCT = 'destruct';\nexport const VALUE_OF = 'valueOf';\n","import { OWN_KEYS } from 'js-proxy/traps';\nimport { SYMBOL } from 'js-proxy/types';\n\nconst { [OWN_KEYS]: ownKeys } = Reflect;\n\nconst known = new Map(\n  ownKeys(Symbol)\n    .filter(s => typeof Symbol[s] === SYMBOL)\n    .map(s => [Symbol[s], s])\n);\n\nexport const fromSymbol = value => {\n  if (value.startsWith('.'))\n    return Symbol.for(value.slice(1));\n  for (const [symbol, name] of known) {\n    if (name === value)\n      return symbol;\n  }\n};\n\nexport const toSymbol = value => (\n  known.get(value) ||\n  `.${Symbol.keyFor(value) || ''}`\n);\n","// ⚠️ AUTOMATICALLY GENERATED - DO NOT CHANGE\nconst CHANNEL = '42fb1e9a-1373-441e-813f-357c3deaee87';\nexport const MAIN = 'M' + CHANNEL;\nexport const WORKER = 'W' + CHANNEL;\n","// (c) Andrea Giammarchi - ISC\n\nconst registry = new FinalizationRegistry(\n  ([onGarbageCollected, held, debug]) => {\n    if (debug) console.debug(`Held value ${String(held)} not relevant anymore`);\n    onGarbageCollected(held);\n  }\n);\n\nconst nullHandler = Object.create(null);\n\n/**\n * @template {unknown} H\n * @typedef {Object} GCHookOptions\n * @prop {boolean} [debug=false] if `true`, logs values once these can get collected.\n * @prop {ProxyHandler<object>} [handler] optional proxy handler to use instead of the default one.\n * @prop {H} [return=H] if specified, overrides the returned proxy with its value.\n * @prop {unknown} [token=H] it's the held value by default, but it can be any other token except the returned value itself.\n */\n\n/**\n * @template {unknown} H\n * @param {H} hold the reference to hold behind the scene and passed along the callback once it triggers.\n * @param {(held:H) => void} onGarbageCollected the callback that will receive the held value once its wrapper or indirect reference is no longer needed.\n * @param {GCHookOptions<H>} [options] an optional configuration object to change some default behavior.\n */\nexport const create = (\n  hold,\n  onGarbageCollected,\n  { debug, handler, return: r, token = hold } = nullHandler\n) => {\n  // if no reference to return is defined,\n  // create a proxy for the held one and register that instead.\n  /** @type {H} */\n  const target = r || new Proxy(hold, handler || nullHandler);\n  const args = [target, [onGarbageCollected, hold, !!debug]];\n  if (token !== false) args.push(token);\n  // register the target reference in a way that\n  // the `onGarbageCollected(held)` callback will eventually notify.\n  registry.register(...args);\n  return target;\n};\n\n/**\n * If previously registered as either `token` or `hold` value, allow explicit removal of the entry in the registry.\n * @param {unknown} token the token used during registration. If no `token` was passed, this can be the same `hold` reference.\n * @returns {boolean} `true` if successfully unregistered.\n */\nexport const drop = token => registry.unregister(token);\n","const { addEventListener } = EventTarget.prototype;\nconst eventsHandler = new WeakMap;\nReflect.defineProperty(EventTarget.prototype, 'addEventListener', {\n  value(type, listener, ...options) {\n    const invoke = options.at(0)?.invoke;\n    if (invoke) {\n      let map = eventsHandler.get(this);\n      if (!map) {\n        map = new Map;\n        eventsHandler.set(this, map);\n      }\n      map.set(type, [].concat(invoke));\n      delete options[0].invoke;\n    }\n    return addEventListener.call(this, type, listener, ...options);\n  },\n});\n\nexport default event => {\n  const { currentTarget, target, type } = event;\n  const methods = eventsHandler.get(currentTarget || target)?.get(type);\n  if (methods) for (const method of methods) event[method]();\n};\n","import { drop, get, hold } from 'js-proxy/heap';\nimport { TypedArray } from 'sabayon/shared';\n\nimport coincident from '../main.js';\nimport numeric from './types.js';\nimport { fromSymbol, toSymbol } from './symbol.js';\n\nimport {\n  APPLY,\n  DEFINE_PROPERTY,\n  GET_OWN_PROPERTY_DESCRIPTOR,\n  OWN_KEYS,\n  DESTRUCT,\n} from 'js-proxy/traps';\n\nimport {\n  ARRAY,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n} from 'js-proxy/types';\n\nimport { MAIN, WORKER } from './constants.js';\n\nimport { create } from 'gc-hook';\n\nimport handleEvent from './events.js';\n\nimport DEBUG from '../debug.js';\n\nconst { isArray } = Array;\n\nexport default /** @type {import('../main.js').Coincident} */ options => {\n  const exports = coincident(options);\n\n  const toEntry = value => {\n    const TYPE = typeof value;\n    switch (TYPE) {\n      case OBJECT: {\n        if (value === null) return [numeric[NULL], value];\n        if (value === globalThis) return [numeric[OBJECT], null];\n        if (isArray(value)) return [numeric[ARRAY], hold(value)];\n        return [numeric[OBJECT], value instanceof TypedArray ? value : hold(value)];\n      }\n      case FUNCTION: return [numeric[FUNCTION], hold(value)];\n      case SYMBOL: return [numeric[SYMBOL], toSymbol(value)];\n      default: return [numeric[TYPE], value];\n    }\n  };\n\n  class Worker extends exports.Worker {\n    constructor(url, options) {\n      const { proxy } = super(url, options);\n      const { [WORKER]: __worker__ } = proxy;\n\n      const proxies = new Map;\n      const onGC = ref => {\n        proxies.delete(ref);\n        __worker__(DESTRUCT, ref);\n      }\n\n      const fromEntry = ([numericTYPE, value]) => {\n        switch (numericTYPE) {\n          case numeric[OBJECT]: {\n            if (value === null) return globalThis;\n            if (typeof value === NUMBER) return get(value);\n            if (!(value instanceof TypedArray)) {\n              for (const key in value)\n                value[key] = fromEntry(value[key]);\n            }\n            return value;\n          };\n          case numeric[ARRAY]: {\n            if (typeof value === NUMBER) return get(value);\n            return value.map(fromEntry);\n          };\n          case numeric[FUNCTION]: {\n            switch (typeof value) {\n              case NUMBER: return get(value);\n              case STRING: {\n                let fn = proxies.get(value)?.deref();\n                if (!fn) {\n                  fn = create(value, onGC, {\n                    token: false,\n                    return: function (...args) {\n                      if (args.length && args[0] instanceof Event) handleEvent(args[0]);\n                      return __worker__(APPLY, value, toEntry(this), args.map(toEntry)).then(fromEntry);\n                    }\n                  });\n                  proxies.set(value, new WeakRef(fn));\n                }\n                return fn;\n              }\n            }\n          };\n          case numeric[SYMBOL]: return fromSymbol(value);\n          default: return value;\n        }\n      };\n\n      const asEntry = (method, target, args) => toEntry(method(target, ...args.map(fromEntry)));\n\n      proxy[MAIN] = (TRAP, ref, ...args) => {\n        if (TRAP === DESTRUCT) drop(ref);\n        else {\n          const method = Reflect[TRAP];\n          const target = ref == null ? globalThis : get(ref);\n          switch (TRAP) {\n            case DEFINE_PROPERTY: {\n              const [name, descriptor] = args.map(fromEntry);\n              return toEntry(method(target, name, descriptor));\n            }\n            case GET_OWN_PROPERTY_DESCRIPTOR: {\n              const descriptor = method(target, ...args.map(fromEntry));\n              if (descriptor) {\n                const { get, set, value } = descriptor;\n                if (get) descriptor.get = toEntry(get);\n                if (set) descriptor.set = toEntry(set);\n                if (value) descriptor.value = toEntry(value);\n              }\n              return [numeric[descriptor ? OBJECT : UNDEFINED], descriptor];\n            }\n            case OWN_KEYS: return [numeric[ARRAY], method(target).map(toEntry)];\n            default: return asEntry(method, target, args);\n          }\n        }\n      };\n\n      if (DEBUG) {\n        const debug = proxy[MAIN];\n        proxy[MAIN] = (TRAP, ...args) => {\n          const destructing = TRAP === DESTRUCT;\n          const method = destructing ? console.warn : console.log;\n          method('Main before', TRAP, ...args);\n          const result = debug(TRAP, ...args);\n          if (!destructing) method('Main after', TRAP, result);\n          return result;\n        };\n      }\n    }\n  }\n\n  return { ...exports, Worker };\n};\n","/* c8 ignore start */\nconst {url} = import.meta;\nconst re = /import\\((['\"])([^)]+?\\.js)\\1\\)/g;\nconst place = (_,q,f) => `import(${q}${new URL(f,url).href}${q})`;\nimport * as JSON from '@ungap/structured-clone/json';\nimport coincident from 'coincident/window/main';\nconst { Worker } = coincident(JSON);\nexport default (...args) => new Worker(URL.createObjectURL(new Blob([\"const e=\\\"object\\\"==typeof self?self:globalThis,t=t=>((t,n)=>{const r=(e,n)=>(t.set(n,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=n[o];switch(a){case 0:case-1:return r(i,o);case 1:{const e=r([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=r({},o);for(const[t,n]of i)e[s(t)]=s(n);return e}case 3:return r(new Date(i),o);case 4:{const{source:e,flags:t}=i;return r(new RegExp(e,t),o)}case 5:{const e=r(new Map,o);for(const[t,n]of i)e.set(s(t),s(n));return e}case 6:{const e=r(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:n}=i;return r(new e[t](n),o)}case 8:return r(BigInt(i),o);case\\\"BigInt\\\":return r(Object(BigInt(i)),o)}return r(new e[a](i),o)};return s})(new Map,t)(0),n=\\\"\\\",{toString:r}={},{keys:s}=Object,o=e=>{const t=typeof e;if(\\\"object\\\"!==t||!e)return[0,t];const s=r.call(e).slice(8,-1);switch(s){case\\\"Array\\\":return[1,n];case\\\"Object\\\":return[2,n];case\\\"Date\\\":return[3,n];case\\\"RegExp\\\":return[4,n];case\\\"Map\\\":return[5,n];case\\\"Set\\\":return[6,n]}return s.includes(\\\"Array\\\")?[1,s]:s.includes(\\\"Error\\\")?[7,s]:[2,s]},a=([e,t])=>0===e&&(\\\"function\\\"===t||\\\"symbol\\\"===t),i=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const i=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},c=r=>{if(n.has(r))return n.get(r);let[l,u]=o(r);switch(l){case 0:{let t=r;switch(u){case\\\"bigint\\\":l=8,t=r.toString();break;case\\\"function\\\":case\\\"symbol\\\":if(e)throw new TypeError(\\\"unable to serialize \\\"+u);t=null;break;case\\\"undefined\\\":return i([-1],r)}return i([l,t],r)}case 1:{if(u)return i([u,[...r]],r);const e=[],t=i([l,e],r);for(const t of r)e.push(c(t));return t}case 2:{if(u)switch(u){case\\\"BigInt\\\":return i([u,r.toString()],r);case\\\"Boolean\\\":case\\\"Number\\\":case\\\"String\\\":return i([u,r.valueOf()],r)}if(t&&\\\"toJSON\\\"in r)return c(r.toJSON());const n=[],p=i([l,n],r);for(const t of s(r))!e&&a(o(r[t]))||n.push([c(t),c(r[t])]);return p}case 3:return i([l,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return i([l,{source:e,flags:t}],r)}case 5:{const t=[],n=i([l,t],r);for(const[n,s]of r)(e||!a(o(n))&&!a(o(s)))&&t.push([c(n),c(s)]);return n}case 6:{const t=[],n=i([l,t],r);for(const n of r)!e&&a(o(n))||t.push(c(n));return n}}const{message:p}=r;return i([l,{name:u,message:p}],r)};return c})(!(t||n),!!t,new Map,r)(e),r},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var p=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))});const f=\\\"array\\\",h=\\\"function\\\",d=\\\"null\\\",y=\\\"number\\\",g=\\\"object\\\",w=\\\"symbol\\\",m=\\\"undefined\\\",_=\\\"apply\\\",b=\\\"construct\\\",E=\\\"defineProperty\\\",v=\\\"deleteProperty\\\",T=\\\"get\\\",x=\\\"getOwnPropertyDescriptor\\\",k=\\\"getPrototypeOf\\\",S=\\\"has\\\",O=\\\"isExtensible\\\",A=\\\"ownKeys\\\",R=\\\"preventExtensions\\\",j=\\\"set\\\",P=\\\"setPrototypeOf\\\";var $=Object.freeze({__proto__:null,APPLY:_,CONSTRUCT:b,DEFINE_PROPERTY:E,DELETE_PROPERTY:v,GET:T,GET_OWN_PROPERTY_DESCRIPTOR:x,GET_PROTOTYPE_OF:k,HAS:S,IS_EXTENSIBLE:O,OWN_KEYS:A,PREVENT_EXTENSION:R,SET:j,SET_PROTOTYPE_OF:P});function I(){return this}const N=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),M=Object.create(null),F=(e,t,{debug:n,handler:r,return:s,token:o=e}=M)=>{const a=s||new Proxy(e,r||M),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),N.register(...i),a},{Object:W,Proxy:H,Reflect:D}=globalThis,{isArray:C}=Array,{ownKeys:L}=D,{create:B,hasOwn:U,values:q}=W,J=(e,t)=>t===f?e[0]:t===h?e():t===g?e.$:e,z=(e,t,n,r)=>{const s={type:{value:t}},o=U(e,\\\"valueOf\\\");for(const a of q($)){let i=r(e[a]||D[a]);if(o&&a===T){const{valueOf:r}=e,{value:s}=i;i={value(e,o,...a){return o===n?r.call(this,J(e,t)):s.call(this,e,o,...a)}}}s[a]=i}return B(e,s)},G=(e,t,n,r=e)=>{if(r===e)switch(typeof e){case g:case m:r||(r=!1);case h:break;default:r=!1,t===e&&(t=W(e))}const s=new H(t,n),{destruct:o}=n;return o?F(e,o,{token:r,return:s}):s},Y=e=>t=>{const n=typeof t;return n===g?t?e.get(t)?.[0]??(e=>C(e)?f:g)(t):d:n},K=e=>t=>{let n=typeof t;switch(n){case g:if(!t){n=d;break}case h:const r=e.get(t);r&&([n,t]=r)}return[n,t]},X=e=>((e=>{N.unregister(e)})(e),e);var V=e=>{const t=new WeakMap,n=Symbol(),r={},s=(e,n,r)=>(t.set(e,[n,r]),e),o={proxy:r,release:X,pair:K(t),typeOf:Y(t),isProxy:e=>t.has(e),valueOf:e=>e[n]??e.valueOf()};for(const t of L(e)){if(U(o,t))continue;const a=e[t];switch(t){case f:{const e=z(a,t,n,(e=>({value([t],...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,[t],e,...n),f,t);break}case h:{const e=z(a,t,n,(e=>({value(t,...n){return e.call(this,t(),...n)}})));r[t]=(t,...n)=>{return s(G(t,(r=t,I.bind(r)),e,...n),h,t);var r};break}case g:{const e=z(a,t,n,(e=>({value({$:t},...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,{$:t},e,...n),g,t);break}default:{const e=z(a,t,n,(e=>({value:e})));r[t]=(n,...r)=>s(G(n,n,e,...r),t,n);break}}}return o};let Z=0;const Q=new Map,ee=new Map,te=e=>ee.get(e),ne=e=>{if(!Q.has(e)){let t;for(;ee.has(t=Z++););Q.set(e,t),ee.set(t,e)}return Q.get(e)},{ArrayBuffer:re,Atomics:se,Promise:oe}=globalThis,{isArray:ae}=Array,{create:ie,getPrototypeOf:ce,values:le}=Object,ue=ce(Int32Array),pe=ie(se),fe=({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o})),he=()=>oe.withResolvers();let de=0;const ye=new Map,ge=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&ye.set(this,[de++,0,he()])}},we=new WeakSet,me=e=>(we.add(e),e),_e=(e,t)=>{const{data:n}=e,r=ae(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},be=e=>null!==e&&\\\"object\\\"==typeof e&&!we.has(e),Ee=new WeakMap,ve=(e,t,n)=>{if(ye.has(e))t.set(e,ye.get(e)[0]);else if(!(e instanceof ue||e instanceof re))for(const r of le(e))be(r)&&!n.has(r)&&(n.add(r),ve(r,t,n))},Te=(...e)=>({value:new oe((t=>{let n=new Worker(\\\"data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))\\\");n.onmessage=()=>t(\\\"ok\\\"),n.postMessage(e)}))}),xe=(e,t)=>{const n=ye.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]};let{BigInt64Array:ke,Int32Array:Se,SharedArrayBuffer:Oe,addEventListener:Ae,postMessage:Re}=globalThis,je=!0,Pe=e=>e,$e=!1;const Ie=he();try{new Oe(4),pe.waitAsync||(pe.waitAsync=Te),Ie.resolve()}catch(e){const t=Re,n=Ae,r=[];let s=\\\"\\\",o=\\\"\\\";Oe=class extends re{},ke=ge(ke,Oe),Se=ge(Se,Oe),Pe=me,$e=!0,pe.notify=(e,n)=>{const[r]=(e=>Ee.get(e))(e);return t([s,1,e,r,n]),0},pe.waitAsync=(...e)=>{const[t,n]=xe(...e);return{value:n}},pe.wait=(e,t,...n)=>{const[r]=xe(e,t,...n),a=new XMLHttpRequest;a.responseType=\\\"json\\\",a.open(\\\"POST\\\",`${o}?sabayon`,!1),a.setRequestHeader(\\\"Content-Type\\\",\\\"application/json\\\"),a.send(`[\\\"${s}\\\",${r},${t}]`);const{response:i}=a;ye.delete(e);for(let t=0;t<i.length;t++)e[t]=i[t];return\\\"ok\\\"},n(\\\"message\\\",(e=>{if(_e(e,s)){const[t,n,...r]=e.data;switch(n){case 0:s=t,o=r.at(0)?.serviceWorker||\\\"\\\",o||(pe.wait=null,Ie.resolve());break;case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of ye)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];ye.delete(r),a(\\\"ok\\\");break}})(...r);break;case 2:((e,t,n)=>{for(const[n,r]of t)Ee.set(n,[r,e.currentTarget]);fe(e,n)})(e,...r);break;case 3:Ie.resolve()}}else if(je){const{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i}=e;r.push([{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i},e.data])}})),Ae=(e,...t)=>{if(n(e,...t),r.length)for(const e of r.splice(0))fe(...e)},Re=(e,...n)=>t(((e,t)=>{const n=new Map;return be(t)&&ve(t,n,new Set),n.size?[e,2,n,t]:t})(s,e),...n)}await Ie.promise,je=!1;const{BYTES_PER_ELEMENT:Ne}=Int32Array,{BYTES_PER_ELEMENT:Me}=Uint16Array,{notify:Fe}=pe,We=new TextDecoder(\\\"utf-16\\\"),He=new WeakSet,De=(...e)=>(He.add(e),e);let Ce=\\\"\\\";const Le=(e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)};let Be=0;const Ue=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=\\\"\\\"!==Ce,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,Ce));const h=Be++,d=[];He.has(u.at(-1)||d)&&He.delete(d=u.pop());const y=n(i?u.map(i):u);let g=t(2*Ne);return a([e,2,l,h,g,y,r],{transfer:d}),c(g,0).value.then((()=>{p&&clearTimeout(f);const n=g[1];if(!n)return;const r=Me*n;return g=t(r+r%Ne),a([e,1,h,g]),c(g,0).value.then((()=>{const e=new Uint16Array(g.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(We.decode(t))}))}))},qe=(e,t)=>new Proxy(t,{get:(t,n)=>{let r;return\\\"then\\\"!==n&&(r=t.get(n),r||(r=Ue(e,n),t.set(n,r))),r},set:(e,t,n)=>\\\"then\\\"!==t&&!!e.set(t,n)}),{wait:Je,waitAsync:ze}=pe;var Ge=({parse:e,stringify:t,transform:n,interrupt:r}=JSON)=>{const s=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(Ce=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(Ce=\\\"\\\"),a[0]=1,Fe(a,0)}})(t,n),o=he(),a=new Map,i=new Map;let c=\\\"\\\",l=Je;if(Je&&r){const{handler:e,timeout:t=42}=r;l=(n,r,s)=>{for(;\\\"timed-out\\\"===(s=Je(n,r,0,t));)e();return s}}return Ae(\\\"message\\\",(t=>{if(_e(t,c)){const[r,u,...p]=t.data;switch(u){case 0:{const t=!!Je;c=r,o.resolve({polyfill:$e,sync:t,transfer:De,proxy:qe([c,e=>new Se(new Oe(e)),Pe,t,e,$e,Re,n,t?(...e)=>({value:{then:t=>t(l(...e))}}):ze],a)});break}case 2:a.size?Le(s,i,a,p):setTimeout(Le,0,s,i,a,p);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);Fe(n,0)})(i,p)}}})),o.promise},Ye=Object.fromEntries([f,\\\"bigint\\\",\\\"boolean\\\",h,d,y,g,\\\"string\\\",w,m].map(((e,t)=>[e,t])));const Ke=\\\"destruct\\\",{[A]:Xe}=Reflect,Ve=new Map(Xe(Symbol).filter((e=>typeof Symbol[e]===w)).map((e=>[Symbol[e],e]))),Ze=e=>Ve.get(e)||`.${Symbol.keyFor(e)||\\\"\\\"}`,Qe=\\\"42fb1e9a-1373-441e-813f-357c3deaee87\\\",et=\\\"M\\\"+Qe,tt=\\\"W\\\"+Qe,{[_]:nt}=Reflect;const rt={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\\\r\\\\n]+/))if(t.trim().length){/^(\\\\s+)/.test(t)&&(e=e.replace(new RegExp(\\\"^\\\"+RegExp.$1,\\\"gm\\\"),\\\"\\\"));break}return e}},st=new WeakMap,ot=e=>{const t=e||console,n={buffered:it,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return st.set(t,n),t}}},at=new TextDecoder,it=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(at.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},ct=(e,...t)=>rt[typeof e](e,...t),{isArray:lt}=Array,{assign:ut,create:pt,defineProperties:ft,defineProperty:ht,entries:dt}=Object,{all:yt,resolve:gt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),wt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,\\\"\\\")).href,mt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},_t=e=>Function(`'use strict';return (${e})`)(),bt=e=>e.replace(/^(?:\\\\n|\\\\r\\\\n)/,\\\"\\\"),Et=Symbol.for(\\\"polyscript.js_modules\\\"),vt=new Map;ht(globalThis,Et,{value:vt}),new Proxy(vt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Tt=(e,t)=>!t.startsWith(\\\"_\\\"),xt=(e,t)=>new Proxy(e,{has:Tt,get:(e,n)=>e[t][n]}),kt=(e,t)=>import(e).then((e=>{vt.set(t,{...e})})),St=e=>new Promise(((t,n)=>{document.querySelector(`link[rel=\\\"stylesheet\\\"][href=\\\"${e}\\\"]`)?t():document.head.append(ut(document.createElement(\\\"link\\\"),{rel:\\\"stylesheet\\\",href:e,onload:t,onerror:n}))})),Ot=e=>/\\\\.css$/i.test(new URL(e).pathname),At=(e,t)=>e.has(t),Rt=e=>[...e.keys()];var jt=(e,t,n,r)=>{const s=globalThis[Et];if(n)for(let[e,t]of dt(n)){let n=s.get(t);n&&!lt(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:At,ownKeys:Rt,get:(e,s)=>{let o=e.get(s);if(lt(o)){let a=o;o=null;for(let e of a)e=wt(e,r),Ot(e)?n.importCSS(e):(n.importJS(e,s),o=t[Et].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Pt=Object.getOwnPropertyDescriptors(Response.prototype),$t=e=>\\\"function\\\"==typeof e,It={get:(e,t)=>Pt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!$t(r)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,Pt[t]):((e,t)=>$t(t)?t.bind(e):t)(e,e[t])};var Nt=(e,...t)=>new Proxy(fetch(e,...t),It);Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const Mt=!globalThis.window,Ft=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Ht(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Wt=e=>{const t=e.split(\\\"/\\\");return t.pop(),t.join(\\\"/\\\")},Ht=(e,t)=>{const n=[];for(const r of t.split(\\\"/\\\"))\\\".\\\"!==r&&\\\"..\\\"!==r&&(n.push(r),r&&e.mkdir(n.join(\\\"/\\\")))},Dt=(e,t)=>{const n=[];for(const e of t.split(\\\"/\\\"))switch(e){case\\\"\\\":case\\\".\\\":break;case\\\"..\\\":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join(\\\"/\\\").replace(/^\\\\/+/,\\\"/\\\")},Ct=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,\\\"\\\"))).filter((e=>\\\"\\\"!==e&&\\\".\\\"!==e)).join(\\\"/\\\");return e[0].startsWith(\\\"/\\\")?`/${t}`:t},Lt=(e,t)=>Nt(wt(e,t)).arrayBuffer(),Bt=(e,t,n,r)=>yt((e=>{for(const{files:t,to_file:n,from:r=\\\"\\\"}of e){if(void 0!==t&&void 0!==n)throw new Error(\\\"Cannot use 'to_file' and 'files' parameters together!\\\");if(void 0===t&&void 0===n&&r.endsWith(\\\"/\\\"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e=\\\"\\\",to_folder:t=\\\".\\\",to_file:n,files:r})=>{if(lt(r))return r.map((n=>({url:Ct([e,n]),path:Ct([t,n])})));const s=n||e.slice(1+e.lastIndexOf(\\\"/\\\"));return[{url:e,path:Ct([t,s])}]}))})(n).map((({url:n,path:s})=>Lt(n,r).then((n=>e.writeFile(t,s,n)))))),Ut=(e,t)=>t.endsWith(\\\"/\\\")?`${t}${e.split(\\\"/\\\").pop()}`:t,qt=(e,t)=>e.replace(/\\\\{.+?\\\\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Jt=(e,t,n,r)=>yt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of dt(e))if(/^\\\\{.+\\\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,qt(o,t))}else{const e=qt(s,t),a=Ut(e,qt(o||\\\"./\\\",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>Lt(n,r).then((r=>e.writeFile(t,s,r,n)))))),zt=({main:e,worker:t},n)=>{const r=[];if(t&&Mt)for(let[e,s]of dt(t))e=wt(e,n),r.push(kt(e,s));if(e&&!Mt)for(let[t,s]of dt(e))t=wt(t,n),Ot(t)?St(t):r.push(kt(t,s));return yt(r)},{assign:Gt}=Object,Yt=\\\"entries\\\",Kt=\\\"readonly\\\",Xt=\\\"readwrite\\\",Vt={durability:\\\"default\\\",prefix:\\\"IDBMap\\\"},Zt=({target:{result:e}})=>e;class Qt extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Yt,t,this.#t);return new Promise(((t,r)=>Gt(e(n.objectStore(Yt)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=Vt.durability,prefix:n=Vt.prefix}=Vt){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{Gt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Yt),n.oncomplete=()=>t(e)},onsuccess(e){t(Zt(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith(\\\"on\\\")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Gt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Kt).then(Zt)}async clear(){await this.#r((e=>e.clear()),Xt)}async delete(e){await this.#r((t=>t.delete(e)),Xt)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Kt).then(Zt)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Kt).then(Zt)}async keys(){return await this.#r((e=>e.getAllKeys()),Kt).then(Zt)}async set(e,t){return await this.#r((n=>n.put(t,e)),Xt),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class en extends Map{#s;#o;constructor(...e){super(),this.#s=new Qt(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const tn=new WeakMap,nn=(e,t,n)=>{\\\"polyscript\\\"===t&&(n.lazy_py_modules=async(...t)=>(await tn.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new en(e);return await t.sync(),t},n.JSON=p),e.registerJsModule(t,n)},rn=(e,t)=>{if(e.endsWith(\\\"/*\\\")){if(/\\\\.(zip|whl|tgz|tar(?:\\\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return\\\"\\\"},sn=(e,t,...n)=>{try{return e.runPython(ct(t),...n)}catch(t){st.get(e).stderr(t)}},on=async(e,t,...n)=>{try{return await e.runPythonAsync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},an=async(e,t,n)=>{const[r,...s]=t.split(\\\".\\\");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}};var cn=(new TextEncoder).encode('from uio import StringIO\\\\nimport sys\\\\n\\\\nclass Response:\\\\n    def __init__(self, f):\\\\n        self.raw = f\\\\n        self.encoding = \\\"utf-8\\\"\\\\n        self._cached = None\\\\n\\\\n    def close(self):\\\\n        if self.raw:\\\\n            self.raw.close()\\\\n            self.raw = None\\\\n        self._cached = None\\\\n\\\\n    @property\\\\n    def content(self):\\\\n        if self._cached is None:\\\\n            try:\\\\n                self._cached = self.raw.read()\\\\n            finally:\\\\n                self.raw.close()\\\\n                self.raw = None\\\\n        return self._cached\\\\n\\\\n    @property\\\\n    def text(self):\\\\n        return str(self.content, self.encoding)\\\\n\\\\n    def json(self):\\\\n        import ujson\\\\n\\\\n        return ujson.loads(self.content)\\\\n\\\\n\\\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\\\n\\\\n\\\\ntry:\\\\n    import js\\\\nexcept Exception as err:\\\\n    raise OSError(\\\"This version of urequests can only be used in the browser\\\")\\\\n\\\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\\\n\\\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\\\n\\\\n\\\\ndef request(\\\\n    method,\\\\n    url,\\\\n    data=None,\\\\n    json=None,\\\\n    headers={},\\\\n    stream=None,\\\\n    auth=None,\\\\n    timeout=None,\\\\n    parse_headers=True,\\\\n):\\\\n    from js import XMLHttpRequest\\\\n\\\\n    xhr = XMLHttpRequest.new()\\\\n    xhr.withCredentials = False\\\\n\\\\n    if auth is not None:\\\\n        import ubinascii\\\\n\\\\n        username, password = auth\\\\n        xhr.open(method, url, False, username, password)\\\\n    else:\\\\n        xhr.open(method, url, False)\\\\n\\\\n    for name, value in headers.items():\\\\n        if name.lower() not in HEADERS_TO_IGNORE:\\\\n            xhr.setRequestHeader(name, value)\\\\n\\\\n    if timeout:\\\\n        xhr.timeout = int(timeout * 1000)\\\\n\\\\n    if json is not None:\\\\n        assert data is None\\\\n        import ujson\\\\n\\\\n        data = ujson.dumps(json)\\\\n        # s.write(b\\\"Content-Type: application/json\\\\\\\\r\\\\\\\\n\\\")\\\\n        xhr.setRequestHeader(\\\"Content-Type\\\", \\\"application/json\\\")\\\\n\\\\n    xhr.send(data)\\\\n\\\\n    # Emulates the construction process in the original urequests\\\\n    resp = Response(StringIO(xhr.responseText))\\\\n    resp.status_code = xhr.status\\\\n    resp.reason = xhr.statusText\\\\n    resp.headers = xhr.getAllResponseHeaders()\\\\n\\\\n    return resp\\\\n\\\\n\\\\n# Other methods - head, post, put, patch, delete - are not used by\\\\n# mip and therefore not included\\\\n\\\\n\\\\ndef get(url, **kw):\\\\n    return request(\\\"GET\\\", url, **kw)\\\\n\\\\n\\\\n# Content below this line is from the Micropython MIP package and is covered\\\\n# by the applicable MIT license:\\\\n# \\\\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\\\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\\\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\\\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\\\n# DEALINGS IN THE SOFTWARE.\\\\n\\\\n# MicroPython package installer\\\\n# MIT license; Copyright (c) 2022 Jim Mussared\\\\n\\\\n\\\\n_PACKAGE_INDEX = const(\\\"https://micropython.org/pi/v2\\\")\\\\n_CHUNK_SIZE = 128\\\\n\\\\n\\\\n# This implements os.makedirs(os.dirname(path))\\\\ndef _ensure_path_exists(path):\\\\n    import os\\\\n\\\\n    split = path.split(\\\"/\\\")\\\\n\\\\n    # Handle paths starting with \\\"/\\\".\\\\n    if not split[0]:\\\\n        split.pop(0)\\\\n        split[0] = \\\"/\\\" + split[0]\\\\n\\\\n    prefix = \\\"\\\"\\\\n    for i in range(len(split) - 1):\\\\n        prefix += split[i]\\\\n        try:\\\\n            os.stat(prefix)\\\\n        except:\\\\n            os.mkdir(prefix)\\\\n        prefix += \\\"/\\\"\\\\n\\\\n\\\\n# Copy from src (stream) to dest (function-taking-bytes)\\\\ndef _chunk(src, dest):\\\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\\\n    while True:\\\\n        n = src.readinto(buf)\\\\n        if n == 0:\\\\n            break\\\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\\\n\\\\n\\\\n# Check if the specified path exists and matches the hash.\\\\ndef _check_exists(path, short_hash):\\\\n    import os\\\\n\\\\n    try:\\\\n        import binascii\\\\n        import hashlib\\\\n\\\\n        with open(path, \\\"rb\\\") as f:\\\\n            hs256 = hashlib.sha256()\\\\n            _chunk(f, hs256.update)\\\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], \\\"utf-8\\\")\\\\n            return existing_hash == short_hash\\\\n    except:\\\\n        return False\\\\n\\\\n\\\\ndef _rewrite_url(url, branch=None):\\\\n    if not branch:\\\\n        branch = \\\"HEAD\\\"\\\\n    if url.startswith(\\\"github:\\\"):\\\\n        url = url[7:].split(\\\"/\\\")\\\\n        url = (\\\\n            \\\"https://raw.githubusercontent.com/\\\"\\\\n            + url[0]\\\\n            + \\\"/\\\"\\\\n            + url[1]\\\\n            + \\\"/\\\"\\\\n            + branch\\\\n            + \\\"/\\\"\\\\n            + \\\"/\\\".join(url[2:])\\\\n        )\\\\n    return url\\\\n\\\\n\\\\ndef _download_file(url, dest):\\\\n    response = get(url)\\\\n    try:\\\\n        if response.status_code != 200:\\\\n            print(\\\"Error\\\", response.status_code, \\\"requesting\\\", url)\\\\n            return False\\\\n\\\\n        print(\\\"Copying:\\\", dest)\\\\n        _ensure_path_exists(dest)\\\\n        with open(dest, \\\"wb\\\") as f:\\\\n            _chunk(response.raw, f.write)\\\\n\\\\n        return True\\\\n    finally:\\\\n        response.close()\\\\n\\\\n\\\\ndef _install_json(package_json_url, index, target, version, mpy):\\\\n    response = get(_rewrite_url(package_json_url, version))\\\\n    try:\\\\n        if response.status_code != 200:\\\\n            print(\\\"Package not found:\\\", package_json_url)\\\\n            return False\\\\n\\\\n        package_json = response.json()\\\\n    finally:\\\\n        response.close()\\\\n    for target_path, short_hash in package_json.get(\\\"hashes\\\", ()):\\\\n        fs_target_path = target + \\\"/\\\" + target_path\\\\n        if _check_exists(fs_target_path, short_hash):\\\\n            print(\\\"Exists:\\\", fs_target_path)\\\\n        else:\\\\n            file_url = \\\"{}/file/{}/{}\\\".format(index, short_hash[:2], short_hash)\\\\n            if not _download_file(file_url, fs_target_path):\\\\n                print(\\\"File not found: {} {}\\\".format(target_path, short_hash))\\\\n                return False\\\\n    for target_path, url in package_json.get(\\\"urls\\\", ()):\\\\n        fs_target_path = target + \\\"/\\\" + target_path\\\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\\\n            print(\\\"File not found: {} {}\\\".format(target_path, url))\\\\n            return False\\\\n    for dep, dep_version in package_json.get(\\\"deps\\\", ()):\\\\n        if not _install_package(dep, index, target, dep_version, mpy):\\\\n            return False\\\\n    return True\\\\n\\\\n\\\\ndef _install_package(package, index, target, version, mpy):\\\\n    if (\\\\n        package.startswith(\\\"http://\\\")\\\\n        or package.startswith(\\\"https://\\\")\\\\n        or package.startswith(\\\"github:\\\")\\\\n    ):\\\\n        if package.endswith(\\\".py\\\") or package.endswith(\\\".mpy\\\"):\\\\n            print(\\\"Downloading {} to {}\\\".format(package, target))\\\\n            return _download_file(\\\\n                _rewrite_url(package, version), target + \\\"/\\\" + package.rsplit(\\\"/\\\")[-1]\\\\n            )\\\\n        else:\\\\n            if not package.endswith(\\\".json\\\"):\\\\n                if not package.endswith(\\\"/\\\"):\\\\n                    package += \\\"/\\\"\\\\n                package += \\\"package.json\\\"\\\\n            print(\\\"Installing {} to {}\\\".format(package, target))\\\\n    else:\\\\n        if not version:\\\\n            version = \\\"latest\\\"\\\\n        print(\\\"Installing {} ({}) from {} to {}\\\".format(package, version, index, target))\\\\n\\\\n        mpy_version = (\\\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, \\\"_mpy\\\") else \\\"py\\\"\\\\n        )\\\\n\\\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\\\n        package = \\\"{}/package/{}/{}/{}.json\\\".format(index, \\\"py\\\", package, version)\\\\n\\\\n    return _install_json(package, index, target, version, mpy)\\\\n\\\\n\\\\ndef install(package, index=None, target=None, version=None, mpy=True):\\\\n    if not target:\\\\n        for p in sys.path:\\\\n            if p.endswith(\\\"/lib\\\"):\\\\n                target = p\\\\n                break\\\\n        else:\\\\n            print(\\\"Unable to find lib dir in sys.path\\\")\\\\n            return\\\\n\\\\n    if not index:\\\\n        index = _PACKAGE_INDEX\\\\n\\\\n    if _install_package(package, index.rstrip(\\\"/\\\"), target, version, mpy):\\\\n        print(\\\"Done\\\")\\\\n    else:\\\\n        print(\\\"Package may be partially installed\\\")\\\\n');const ln=async e=>(await import(\\\"./toml-DiUM0_qs.js\\\")).parse(e),un=(e,t)=>{try{e.mkdir(t)}catch(e){}};var pn={type:\\\"micropython\\\",module:(e=\\\"1.24.0-preview-114\\\")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=ot({stderr:it(console.error),stdout:it(console.log)});n=n.replace(/\\\\.m?js$/,\\\".wasm\\\");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=fn.bind(this,i,r);return tn.set(i,c),t.files&&await Jt(this,i,t.files,r),t.fetch&&await Bt(this,i,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),this.writeFile(i,\\\"./mip.py\\\",cn),t.packages&&await c(t.packages),i},registerJSModule:nn,run:sn,runAsync:on,runEvent:an,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=rn(t,r);if(c){const r=t.slice(0,-1);switch(\\\"./\\\"!==r&&s.mkdir(r),c){case\\\"whl\\\":case\\\"zip\\\":{const e=new Blob([n],{type:\\\"application/zip\\\"});return import(\\\"./zip-gl8b5xR3.js\\\").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)un(s,i);else{un(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case\\\"tgz\\\":case\\\"tar.gz\\\":{const t=\\\"./_.tar.gz\\\";return Ft(i,t,n),void e.runPython(`\\\\n                        import os, gzip, tarfile\\\\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open(\\\"${t}\\\", \\\"rb\\\")))\\\\n                        for f in tar:\\\\n                            name = f\\\"${r}{f.name}\\\"\\\\n                            if f.type == tarfile.DIRTYPE:\\\\n                                if f.name != \\\"./\\\":\\\\n                                    os.mkdir(name.strip(\\\"/\\\"))\\\\n                            else:\\\\n                                dir = os.path.dirname(name)\\\\n                                if not os.path.exists(dir):\\\\n                                    os.mkdir(dir)\\\\n                                source = tar.extractfile(f)\\\\n                                with open(name, \\\"wb\\\") as dest:\\\\n                                    dest.write(source.read())\\\\n                                    dest.close()\\\\n                        tar.close()\\\\n                        os.remove(\\\"${t}\\\")\\\\n                    `)}}}return Ft(i,t,n)}};async function fn(e,t,n){let r;for(const s of n)if(s.endsWith(\\\".whl\\\")){const n=wt(s,t),r=await Nt(n).arrayBuffer();await this.writeFile(e,\\\"./*\\\",r,n)}else r||(r=e.pyimport(\\\"mip\\\")),r.install(s)}const hn={dict_converter:Object.fromEntries};let dn=!1;const yn=e=>(...t)=>{try{return dn=!0,e(...t)}finally{dn=!1}};let gn=!1;const wn=()=>{if(gn)return;gn=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if(\\\"function\\\"==typeof s&&\\\"copy\\\"in s){dn=!1;let o=e.get(s)?.deref();if(!o)try{o=F(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),dn=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return dn&&n(t),s(this,e,t)}},call:{value(e,...t){return dn&&n(t),s(this,e,t)}}})};var mn={type:\\\"pyodide\\\",module:(e=\\\"0.26.1\\\")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){Mt||\\\"auto\\\"!==t.experimental_create_proxy||wn();const{stderr:s,stdout:o,get:a}=ot(),i=n.slice(0,n.lastIndexOf(\\\"/\\\")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=_n.bind(c);return tn.set(c,l),t.files&&await Jt(this,c,t.files,r),t.fetch&&await Bt(this,c,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:nn,run:yn(sn),runAsync:yn(on),runEvent:yn(an),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(hn):t,writeFile:(e,t,n,r)=>{const s=rn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return Ft({FS:o,PATH:a,PATH_FS:i},t,n)}};async function _n(e){await this.loadPackage(\\\"micropip\\\");const t=this.pyimport(\\\"micropip\\\");await t.install(e,{keep_going:!0}),t.destroy()}const bn=\\\"ruby-wasm-wasi\\\",En=bn.replace(/\\\\W+/g,\\\"_\\\");var vn={type:bn,experimental:!0,module:(e=\\\"2.6.2\\\")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\\\\/browser\\\\/\\\\+esm$/,\\\"/ruby.wasm\\\");const s=await Nt(n).arrayBuffer(),o=await WebAssembly.compile(s),{vm:a}=await e(o);return t.files&&await Jt(this,a,t.files,r),t.fetch&&await Bt(this,a,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),a},registerJSModule(e,t,n){t=t.replace(/\\\\W+/g,\\\"__\\\");const r=`__module_${En}_${t}`;globalThis[r]=n,this.run(e,`require \\\"js\\\";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(ct(t),...n),runAsync:(e,t,...n)=>e.evalAsync(ct(t),...n),async runEvent(e,t,n){if(/^xworker\\\\.(on\\\\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${En}_event`;globalThis[r]=n,this.run(e,`require \\\"js\\\";$xworker.call(\\\"${t}\\\",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${bn}`)}};var Tn={type:\\\"wasmoon\\\",module:(e=\\\"1.16.0\\\")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=ot(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,\\\"print\\\",a),c.global.setField(e,\\\"printErr\\\",o)})),n.files&&await Jt(this,c,n.files,s),n.fetch&&await Bt(this,c,n.fetch,s),n.js_modules&&await zt(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(\\\".\\\");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Ht(e,Wt(t)),t=Dt(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const xn=new WeakMap,kn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=xn.get(e),{output:o,result:a}=await n.captureR(ct(t));for(const{type:e,data:t}of o)s[e](t);return F(a,r,{token:!1})};var Sn={type:\\\"webr\\\",experimental:!0,module:(e=\\\"0.4.0\\\")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=ot(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return xn.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:st.get(o)}),t.files&&await Jt(this,o,t.files,r),t.fetch&&await Bt(this,o,t.fetch,r),t.js_modules&&await zt(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:kn,runAsync:kn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log(\\\"transforming\\\",t),t),writeFile:()=>{}};const On=new Map,An=new Map,Rn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split(\\\"@\\\"),s=On.get(n),o=/^(?:\\\\.?\\\\.?\\\\/|https?:\\\\/\\\\/)/i.test(r)?r.join(\\\"@\\\"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>(An.set(t,e),s(r,e,n,o))))}}),jn=e=>{for(const t of[].concat(e.type))On.set(t,e)};for(const e of[pn,mn,vn,Tn,Sn])jn(e);const{parse:Pn}=JSON,$n=e=>{try{return Pn(e)}catch(t){return ln(e)}},In=(e,t,n,r={})=>{if(t){const[e,s]=((e,t=\\\"./config.txt\\\")=>{let n=typeof e;return\\\"string\\\"===n&&/\\\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[wt(e),n]})(t,n);\\\"json\\\"===s?r=Nt(e).json():\\\"toml\\\"===s?r=Nt(e).text().then(ln):\\\"string\\\"===s?r=$n(t):\\\"object\\\"===s&&t?r=t:\\\"txt\\\"===s&&\\\"string\\\"==typeof r&&(r=$n(r)),t=e}return gt(r).then((n=>Rn[e](n,t)))},Nn=\\\"BeforeRun\\\",Mn=\\\"AfterRun\\\",Fn=[`code${Nn}`,`code${Nn}Async`,`code${Mn}`,`code${Mn}Async`],Wn=[\\\"onWorker\\\",\\\"onReady\\\",`on${Nn}`,`on${Nn}Async`,`on${Mn}`,`on${Mn}Async`];function Hn(e,t){const{run:n,runAsync:r}=On.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const Dn=(e,t,n,r,s,o)=>{if(s||o){const a=Hn.bind(e,t),i=r?\\\"runAsync\\\":\\\"run\\\",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Cn,Ln,Bn;const Un=(e,t)=>{addEventListener(e,t||(async t=>{try{await Cn,Ln(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{parse:qn,stringify:Jn}=p,{proxy:zn,sync:Gn,polyfill:Yn,window:Kn,isWindowProxy:Xn}=await(async e=>{const t=await Ge(e),n=e?.transform||(e=>e),{[et]:r}=t.proxy,s=new Map,o=(e,t)=>{let n=s.get(e)?.deref();return n||s.set(e,new WeakRef(n=t(e))),n},a=([e,t])=>{switch(e){case Ye[g]:return null==t?globalThis:typeof t===y?o(t,p.object):t;case Ye[f]:return typeof t===y?o(t,p.array):t;case Ye[h]:return typeof t===y?o(t,p.function):te(parseInt(t));case Ye[w]:return(e=>{if(e.startsWith(\\\".\\\"))return Symbol.for(e.slice(1));for(const[t,n]of Ve)if(n===e)return t})(t);default:return t}},i=e=>{let[t,r]=m(e);switch(t){case g:if(r==globalThis||null==r)r=null;else if(typeof r===g&&!(r instanceof ue)){r=n(r);for(const e in r)r[e]=i(r[e])}return[Ye[g],r];case f:return[Ye[f],typeof r===y?r:n(r).map(i)];case h:return[Ye[h],typeof r===h?String(ne(n(r))):r];case w:return[Ye[w],Ze(e)];default:return[Ye[t],r]}},c=(...e)=>a(r(...e)),l={[E]:(e,t,n)=>c(E,e,i(t),i(n)),[v]:(e,t)=>c(v,e,i(t)),[T]:(e,t)=>c(T,e,i(t)),[k]:e=>c(k,e),[x]:(e,t)=>{const n=c(x,e,i(t));if(n){const{get:e,set:t,value:r}=n;e&&(n.get=a(e)),t&&(n.set=a(t)),r&&(n.value=a(r))}return n},[S]:(e,t)=>c(S,e,i(t)),[O]:e=>c(O,e),[A]:e=>c(A,e).map(a),[R]:e=>c(R,e),[j]:(e,t,n)=>c(j,e,i(t),i(n)),[P]:(e,t)=>c(P,e,i(t)),[Ke](e){s.delete(e),r(Ke,e)}},u={object:l,array:l,function:{...l,[_]:(e,...t)=>c(_,e,...t.map(i)),[b]:(e,...t)=>c(b,e,...t.map(i))}},{proxy:p,isProxy:d,pair:m}=V(u),$=p.object(null);return t.proxy[tt]=(e,t,...n)=>{const r=parseInt(t);switch(e){case _:{const[e,t]=n;return i(nt(te(r),a(e),t.map(a)))}case Ke:(e=>{const[t,n]=typeof e===y?[ee,Q]:[Q,ee],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(r)}},{...t,window:$,isWindowProxy:d}})({parse:qn,stringify:Jn,transform:e=>Bn?Bn(e):e}),Vn={polyfill:Yn,sync:zn,window:Gn?Kn:null,isWindowProxy:Xn,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};Un(\\\"message\\\",(({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{Cn=(async()=>{try{const{id:o,tag:a,type:i,custom:c,version:l,config:u,async:p}=e,f=((e,t=\\\"\\\")=>`${e}@${t}`.replace(/@$/,\\\"\\\"))(i,l),h=await In(f,t,n,u),{js_modules:d}=An.get(f),y=d?.main,g=pt(On.get(i)),w=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:st.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(g,c||i,u||{},h);let m=\\\"run\\\";if(p&&(m+=\\\"Async\\\"),s){let e,t,n=\\\"\\\",r=\\\"\\\";for(const e of Fn){const t=s[e];if(t){const s=e.endsWith(\\\"Async\\\");(s&&p||!s&&!p)&&(e.startsWith(\\\"codeBefore\\\")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]=\\\"run\\\"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,bt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,bt(t),...o);return r&&await s(e,r,...o),a}})(g,m,n,r);for(const n of Wn.slice(2)){const r=s[n];if(r){const s=n.endsWith(\\\"Async\\\");if(s&&p||!s&&!p){const s=_t(r);n.startsWith(\\\"onBefore\\\")?e=s:t=s}}}Dn(g,w,Vn,p,e,t)}let _,b,E,v=null,T=\\\"\\\";Gn&&(({CustomEvent:_,document:b}=Kn),v=o&&b.getElementById(o)||null,E=e=>mt(v,c||i,e,!0,_));const x=jt(Kn,zn,y,t);if(((e,t,n,r)=>{if(\\\"pyodide\\\"===e)return;const s=\\\"polyscript.js_modules\\\";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,xt(r,e));t.registerJSModule(n,s,r)})(i,g,h,x),g.registerJSModule(h,\\\"polyscript\\\",{xworker:Vn,currentScript:v,config:w.config,js_modules:x,get target(){return!T&&v&&(\\\"SCRIPT\\\"===a?v.after(ut(b.createElement(`script-${c||i}`),{id:T=`${o}-target`})):(T=o,v.replaceChildren(),v.style.display=\\\"block\\\")),T}}),Ln=g.runEvent.bind(g,h),Bn=g.transform.bind(g,h),v&&E(\\\"ready\\\"),s?.onReady&&_t(s?.onReady).call(g,Hn.call(g,w,h),Vn),await g[m](h,r),[\\\"micropython\\\",\\\"pyodide\\\"].includes(g.type)){const e=\\\"polyscript\\\",t=`__${e}_workers__`,n=\\\"__export__\\\";h.runPython([`import js as ${t}`,`${t}.${t} = \\\"${n}\\\" in locals() and ${n} or []`,`del ${t}`].join(\\\"\\\\n\\\"));const r=[...globalThis[t]];delete globalThis[t],r.length&&h.runPython([`from ${e} import xworker as ${t}`,...r.map((e=>`${t}.sync.${e} = ${e}`)),`del ${t}`].join(\\\"\\\\n\\\"))}return v&&E(\\\"done\\\"),postMessage(\\\"polyscript:done\\\"),h}catch(e){postMessage(e)}})(),Un(\\\"error\\\"),Un(\\\"message\\\"),Un(\\\"messageerror\\\")}));\\n\".replace(re,place)],{type:'application/javascript'})), ...args)\n/* c8 ignore stop */\n","Promise.withResolvers || (Promise.withResolvers = function withResolvers() {\n  var a, b, c = new this(function (resolve, reject) {\n    a = resolve;\n    b = reject;\n  });\n  return {resolve: a, reject: b, promise: c};\n});\n","import content from 'plain-tag';\n\nconst dedent = {\n  object(...args) {\n    return this.string(content(...args));\n  },\n  string(content) {\n    for (const line of content.split(/[\\r\\n]+/)) {\n      // skip initial empty lines\n      if (line.trim().length) {\n        // trap indentation at the very first line of code\n        if (/^(\\s+)/.test(line))\n          content = content.replace(new RegExp('^' + RegExp.$1, 'gm'), '');\n        // no indentation? all good: get out of here!\n        break;\n      }\n    }\n    return content;\n  }\n};\n\n/**\n * Usable both as template literal tag or just as callback for strings, removes all spaces found\n * at the very first line of code encountered while sanitizing, keeping everything else around.\n * @param {string | TemplateStringsArray} tpl either code as string or as template, when used as tag\n * @param  {...any} values the template interpolations, when used as tag\n * @returns {string} code without undesired indentation\n */\nconst codedent = (tpl, ...values) => dedent[typeof tpl](tpl, ...values);\n\nexport default codedent;\n","export default function (t) {\n  for (var s = t[0], i = 1, l = arguments.length; i < l; i++)\n    s += arguments[i] + t[i];\n  return s;\n};\n","/**\n * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nconst {replace} = '';\n\n// escape\nconst es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\nconst ca = /[&<>'\"]/g;\n\nconst esca = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  \"'\": '&#39;',\n  '\"': '&quot;'\n};\nconst pe = m => esca[m];\n\n/**\n * Safely escape HTML entities such as `&`, `<`, `>`, `\"`, and `'`.\n * @param {string} es the input to safely escape\n * @returns {string} the escaped input, and it **throws** an error if\n *  the input type is unexpected, except for boolean and numbers,\n *  converted as string.\n */\nexport const escape = es => replace.call(es, ca, pe);\n\n\n// unescape\nconst unes = {\n  '&amp;': '&',\n  '&#38;': '&',\n  '&lt;': '<',\n  '&#60;': '<',\n  '&gt;': '>',\n  '&#62;': '>',\n  '&apos;': \"'\",\n  '&#39;': \"'\",\n  '&quot;': '\"',\n  '&#34;': '\"'\n};\nconst cape = m => unes[m];\n\n/**\n * Safely unescape previously escaped entities such as `&`, `<`, `>`, `\"`,\n * and `'`.\n * @param {string} un a previously escaped string\n * @returns {string} the unescaped input, and it **throws** an error if\n *  the input type is unexpected, except for boolean and numbers,\n *  converted as string.\n */\nexport const unescape = un => replace.call(un, es, cape);\n","// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const io = new WeakMap();\nexport const stdio = (init) => {\n    const context = init || console;\n    const localIO = {\n        // allow plugins or other io manipulating logic to reuse\n        // the buffered utility exposed in here (see py-editor)\n        buffered,\n        stderr: (context.stderr || console.error).bind(context),\n        stdout: (context.stdout || console.log).bind(context),\n    };\n    return {\n        stderr: (...args) => localIO.stderr(...args),\n        stdout: (...args) => localIO.stdout(...args),\n        async get(engine) {\n            const interpreter = await engine;\n            io.set(interpreter, localIO);\n            return interpreter;\n        },\n    };\n};\n\nconst decoder = new TextDecoder();\nexport const buffered = (callback, EOL = 10) => {\n    const buffer = [];\n    return (maybeUI8) => {\n        if (maybeUI8 instanceof Uint8Array) {\n            for (const c of maybeUI8) {\n                if (c === EOL)\n                    callback(decoder.decode(new Uint8Array(buffer.splice(0))));\n                else\n                    buffer.push(c);\n            }\n        }\n        // if io.stderr(error) is passed instead\n        // or any io.stdout(\"thing\") this should\n        // still work as expected\n        else {\n            callback(maybeUI8);\n        }\n    };\n};\n/* c8 ignore stop */\n","import $dedent from 'codedent';\nimport { unescape as $unescape } from 'html-escaper';\nimport { io } from './interpreter/_io.js';\n\n/** @type {(tpl: string | TemplateStringsArray, ...values:any[]) => string} */\nconst dedent = $dedent;\n\n/** @type {(value:string) => string} */\nconst unescape = $unescape;\n\nconst { isArray } = Array;\n\nconst { assign, create, defineProperties, defineProperty, entries } = Object;\n\nconst { all, resolve } = new Proxy(Promise, {\n    get: ($, name) => $[name].bind($),\n});\n\nconst absoluteURL = (path, base = location.href) =>\n    new URL(path, base.replace(/^blob:/, '')).href;\n\n/* c8 ignore start */\nlet id = 0;\nconst nodeInfo = (node, type) => ({\n    id: node.id || (node.id = `${type}-w${id++}`),\n    tag: node.tagName\n});\n\n/**\n * Notify the main thread about element \"readiness\".\n * @param {HTMLScriptElement | HTMLElement} target the script or custom-type element\n * @param {string} type the custom/type as event prefix\n * @param {string} what the kind of event to dispatch, i.e. `ready` or `done`\n * @param {boolean} [worker = false] `true` if dispatched form a worker, `false` by default if in main\n * @param {globalThis.CustomEvent} [CustomEvent = globalThis.CustomEvent] the `CustomEvent` to use\n */\nconst dispatch = (target, type, what, worker = false, CE = CustomEvent) => {\n    target.dispatchEvent(\n        new CE(`${type}:${what}`, {\n            bubbles: true,\n            detail: { worker },\n        })\n    );\n};\n\nexport const createFunction = value => Function(`'use strict';return (${value})`)();\n\nexport const createResolved = (module, type, config, interpreter) => ({\n    type,\n    config,\n    interpreter,\n    io: io.get(interpreter),\n    run: (code, ...args) => module.run(interpreter, code, ...args),\n    runAsync: (code, ...args) => module.runAsync(interpreter, code, ...args),\n    runEvent: (...args) => module.runEvent(interpreter, ...args),\n});\n\nconst dropLine0 = code => code.replace(/^(?:\\n|\\r\\n)/, '');\n\nexport const createOverload = (module, name, before, after) => {\n    const method = module[name].bind(module);\n    module[name] = name === 'run' ?\n        // patch the sync method\n        (interpreter, code, ...args) => {\n            if (before) method(interpreter, before, ...args);\n            const result = method(interpreter, dropLine0(code), ...args);\n            if (after) method(interpreter, after, ...args);\n            return result;\n        } :\n        // patch the async one\n        async (interpreter, code, ...args) => {\n            if (before) await method(interpreter, before, ...args);\n            const result = await method(interpreter, dropLine0(code), ...args);\n            if (after) await method(interpreter, after, ...args);\n            return result;\n        };\n};\n\nexport const js_modules = Symbol.for('polyscript.js_modules');\n\nconst jsModules = new Map;\ndefineProperty(globalThis, js_modules, { value: jsModules });\n\nexport const JSModules = new Proxy(jsModules, {\n    get: (map, name) => map.get(name),\n    has: (map, name) => map.has(name),\n    ownKeys: map => [...map.keys()],\n});\n\nconst has = (_, field) => !field.startsWith('_');\n\nconst proxy = (modules, name) => new Proxy(\n    modules,\n    { has, get: (modules, field) => modules[name][field] }\n);\n\nexport const registerJSModules = (type, module, interpreter, modules) => {\n    // Pyodide resolves JS modules magically\n    if (type === 'pyodide') return;\n\n    // other runtimes need this pretty ugly dance (it works though)\n    const jsModules = 'polyscript.js_modules';\n    for (const name of Reflect.ownKeys(modules))\n        module.registerJSModule(interpreter, `${jsModules}.${name}`, proxy(modules, name));\n    module.registerJSModule(interpreter, jsModules, modules);\n};\n\nexport const importJS = (source, name) => import(source).then(esm => {\n    jsModules.set(name, { ...esm });\n});\n\nexport const importCSS = href => new Promise((onload, onerror) => {\n    if (document.querySelector(`link[rel=\"stylesheet\"][href=\"${href}\"]`)) {\n        onload();\n    }\n    else {\n        document.head.append(\n            assign(\n                document.createElement('link'),\n                { rel: 'stylesheet', href, onload, onerror },\n            )\n        );\n    }\n});\n\nexport const isCSS = source => /\\.css$/i.test(new URL(source).pathname);\n/* c8 ignore stop */\n\nexport {\n    dedent, unescape,\n    dispatch,\n    isArray,\n    assign,\n    create,\n    defineProperties,\n    defineProperty,\n    entries,\n    all,\n    resolve,\n    absoluteURL,\n    nodeInfo,\n};\n","import '@ungap/with-resolvers';\nimport fetch from '@webreflection/fetch';\n\nimport { absoluteURL, all, entries, importCSS, importJS, isArray, isCSS } from '../utils.js';\n\nexport const RUNNING_IN_WORKER = !globalThis.window;\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\n\n// This should be the only helper needed for all Emscripten based FS exports\nexport const writeFile = ({ FS, PATH, PATH_FS }, path, buffer) => {\n    const absPath = PATH_FS.resolve(path);\n    const dirPath = PATH.dirname(absPath);\n    if (FS.mkdirTree) FS.mkdirTree(dirPath);\n    else mkdirTree(FS, dirPath);\n    return FS.writeFile(absPath, new Uint8Array(buffer), {\n        canOwn: true,\n    });\n};\n\n// This is instead a fallback for Lua or others\nexport const writeFileShim = (FS, path, buffer) => {\n    mkdirTree(FS, dirname(path));\n    path = resolve(FS, path);\n    return FS.writeFile(path, new Uint8Array(buffer), { canOwn: true });\n};\n\nconst dirname = (path) => {\n    const tree = path.split('/');\n    tree.pop();\n    return tree.join('/');\n};\n\nconst mkdirTree = (FS, path) => {\n    const current = [];\n    for (const branch of path.split('/')) {\n        if (branch === '.' || branch === '..') continue;\n        current.push(branch);\n        if (branch) FS.mkdir(current.join('/'));\n    }\n};\n\nconst resolve = (FS, path) => {\n    const tree = [];\n    for (const branch of path.split('/')) {\n        switch (branch) {\n            case '':\n                break;\n            case '.':\n                break;\n            case '..':\n                tree.pop();\n                break;\n            default:\n                tree.push(branch);\n        }\n    }\n    return [FS.cwd()].concat(tree).join('/').replace(/^\\/+/, '/');\n};\n\nconst calculateFetchPaths = (config_fetch) => {\n    for (const { files, to_file, from = '' } of config_fetch) {\n        if (files !== undefined && to_file !== undefined)\n            throw new Error(\n                'Cannot use \\'to_file\\' and \\'files\\' parameters together!',\n            );\n        if (files === undefined && to_file === undefined && from.endsWith('/'))\n            throw new Error(\n                `Couldn't determine the filename from the path ${from}, please supply 'to_file' parameter.`,\n            );\n    }\n    return config_fetch.flatMap(\n        ({ from = '', to_folder = '.', to_file, files }) => {\n            if (isArray(files))\n                return files.map((file) => ({\n                    url: joinPaths([from, file]),\n                    path: joinPaths([to_folder, file]),\n                }));\n            const filename = to_file || from.slice(1 + from.lastIndexOf('/'));\n            return [{ url: from, path: joinPaths([to_folder, filename]) }];\n        },\n    );\n};\n\nconst joinPaths = (parts) => {\n    const res = parts\n        .map((part) => part.trim().replace(/(^[/]*|[/]*$)/g, ''))\n        .filter((p) => p !== '' && p !== '.')\n        .join('/');\n\n    return parts[0].startsWith('/') ? `/${res}` : res;\n};\n\nconst fetchBuffer = (url, baseURL) =>\n    fetch(absoluteURL(url, baseURL)).arrayBuffer();\n\nexport const fetchPaths = (module, interpreter, config_fetch, baseURL) =>\n    all(\n        calculateFetchPaths(config_fetch).map(({ url, path }) =>\n            fetchBuffer(url, baseURL)\n                .then((buffer) => module.writeFile(interpreter, path, buffer)),\n        ),\n    );\n\n    const fillName = (source, dest) => dest.endsWith('/') ?\n                        `${dest}${source.split('/').pop()}` : dest;\n\nconst parseTemplate = (src, map) => src.replace(\n  /\\{.+?\\}/g,\n  k => {\n    if (!map.has(k))\n      throw new SyntaxError(`Invalid template: ${k}`);\n    return map.get(k);\n  }\n);\n\nconst calculateFilesPaths = files => {\n  const map = new Map;\n  const targets = new Set;\n  const sourceDest = [];\n  for (const [source, dest] of entries(files)) {\n    if (/^\\{.+\\}$/.test(source)) {\n      if (map.has(source))\n        throw new SyntaxError(`Duplicated template: ${source}`);\n      map.set(source, parseTemplate(dest, map));\n    }\n    else {\n      const url = parseTemplate(source, map);\n      const path = fillName(url, parseTemplate(dest || './', map));\n      if (targets.has(path))\n        throw new SyntaxError(`Duplicated destination: ${path}`);\n      targets.add(path);\n      sourceDest.push({ url, path });\n    }\n  }\n  return sourceDest;\n};\n\nexport const fetchFiles = (module, interpreter, config_files, baseURL) =>\n    all(\n        calculateFilesPaths(config_files).map(({ url, path }) =>\n            fetchBuffer(url, baseURL)\n                .then((buffer) => module.writeFile(\n                    interpreter,\n                    path,\n                    buffer,\n                    url,\n                )),\n        ),\n    );\n\nexport const fetchJSModules = ({ main, worker }, baseURL) => {\n    const promises = [];\n    if (worker && RUNNING_IN_WORKER) {\n        for (let [source, name] of entries(worker)) {\n            source = absoluteURL(source, baseURL);\n            promises.push(importJS(source, name));\n        }\n    }\n    if (main && !RUNNING_IN_WORKER) {\n        for (let [source, name] of entries(main)) {\n            source = absoluteURL(source, baseURL);\n            if (isCSS(source)) importCSS(source);\n            else promises.push(importJS(source, name));\n        }\n    }\n    return all(promises);\n};\n/* c8 ignore stop */\n","const { assign } = Object;\n\nconst STORAGE = 'entries';\nconst READONLY = 'readonly';\nconst READWRITE = 'readwrite';\n\n/**\n * @typedef {Object} IDBMapOptions\n * @prop {'strict' | 'relaxed' | 'default'} [durability]\n * @prop {string} [prefix]\n */\n\n/** @typedef {[IDBValidKey, unknown]} IDBMapEntry */\n\n/** @type {IDBMapOptions} */\nconst defaultOptions = { durability: 'default', prefix: 'IDBMap' };\n\n/**\n * @template T\n * @param {{ target: IDBRequest<T> }} event\n * @returns {T}\n */\nconst result = ({ target: { result } }) => result;\n\nexport default class IDBMap extends EventTarget {\n  // Privates\n  /** @type {Promise<IDBDatabase>} */ #db;\n  /** @type {IDBMapOptions} */ #options;\n  /** @type {string} */ #prefix;\n\n  /**\n   * @template T\n   * @param {(store: IDBObjectStore) => IDBRequest<T>} what\n   * @param {'readonly' | 'readwrite'} how\n   * @returns {Promise<T>}\n   */\n  async #transaction(what, how) {\n    const db = await this.#db;\n    const t = db.transaction(STORAGE, how, this.#options);\n    return new Promise((onsuccess, onerror) => assign(\n      what(t.objectStore(STORAGE)),\n      {\n        onsuccess,\n        onerror,\n      }\n    ));\n  }\n\n  /**\n   * @param {string} name\n   * @param {IDBMapOptions} options\n   */\n  constructor(\n    name,\n    {\n      durability = defaultOptions.durability,\n      prefix = defaultOptions.prefix,\n    } = defaultOptions\n  ) {\n    super();\n    this.#prefix = prefix;\n    this.#options = { durability };\n    this.#db = new Promise((resolve, reject) => {\n      assign(\n        indexedDB.open(`${this.#prefix}/${name}`),\n        {\n          onupgradeneeded({ target: { result, transaction } }) {\n            if (!result.objectStoreNames.length)\n              result.createObjectStore(STORAGE);\n            transaction.oncomplete = () => resolve(result);\n          },\n          onsuccess(event) {\n            resolve(result(event));\n          },\n          onerror(event) {\n            reject(event);\n            this.dispatchEvent(event);\n          },\n        },\n      );\n    }).then(result => {\n      const boundDispatch = this.dispatchEvent.bind(this);\n      for (const key in result) {\n        if (key.startsWith('on'))\n          result[key] = boundDispatch;\n      }\n      return result;\n    });\n  }\n\n  // EventTarget Forwards\n  /**\n   * @param {Event} event\n   * @returns \n   */\n  dispatchEvent(event) {\n    const { type, message, isTrusted } = event;\n    return super.dispatchEvent(\n      // avoid re-dispatching of the same event\n      isTrusted ?\n        assign(new Event(type), { message }) :\n        event\n    );\n  }\n\n  // IDBDatabase Forwards\n  async close() {\n    (await this.#db).close();\n  }\n\n  // Map async API\n  get size() {\n    return this.#transaction(\n      store => store.count(),\n      READONLY,\n    ).then(result);\n  }\n\n  async clear() {\n    await this.#transaction(\n      store => store.clear(),\n      READWRITE,\n    );\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   */\n  async delete(key) {\n    await this.#transaction(\n      store => store.delete(key),\n      READWRITE,\n    );\n  }\n\n  /**\n   * @returns {Promise<IDBMapEntry[]>}\n   */\n  async entries() {\n    const keys = await this.keys();\n    return Promise.all(keys.map(key => this.get(key).then(value => [key, value])));\n  }\n\n  /**\n   * @param {(unknown, IDBValidKey, IDBMap) => void} callback\n   * @param {unknown} [context]\n   */\n  async forEach(callback, context = this) {\n    for (const [key, value] of await this.entries())\n      await callback.call(context, value, key, this);\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   * @returns {Promise<unknown | undefined>}\n   */\n  async get(key) {\n    const value = await this.#transaction(\n      store => store.get(key),\n      READONLY,\n    ).then(result);\n    return value;\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   */\n  async has(key) {\n    const k = await this.#transaction(\n      store => store.getKey(key),\n      READONLY,\n    ).then(result);\n    return k !== void 0;\n  }\n\n  async keys() {\n    const keys = await this.#transaction(\n      store => store.getAllKeys(),\n      READONLY,\n    ).then(result);\n    return keys;\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   * @param {unknown} value\n   */\n  async set(key, value) {\n    await this.#transaction(\n      store => store.put(value, key),\n      READWRITE,\n    );\n    return this;\n  }\n\n  async values() {\n    const keys = await this.keys();\n    return Promise.all(keys.map(key => this.get(key)));\n  }\n\n  get [Symbol.toStringTag]() {\n    return this.#prefix;\n  }\n}\n","import IDBMap from './index.js';\n\nexport default class IDBMapSync extends Map {\n  #map;\n  #queue;\n  constructor(...args) {\n    super();\n    this.#map = new IDBMap(...args);\n    this.#queue = this.#map.entries().then(entries => {\n      for (const [key, value] of entries)\n        super.set(key, value);\n    });\n  }\n  async sync() {\n    await this.#queue;\n  }\n  clear() {\n    this.#queue = this.#queue.then(() => this.#map.clear());\n    return super.clear();\n  }\n  delete(key) {\n    this.#queue = this.#queue.then(() => this.#map.delete(key));\n    return super.delete(key);\n  }\n  set(key, value) {\n    this.#queue = this.#queue.then(() => this.#map.set(key, value));\n    return super.set(key, value);\n  }\n}\n","import * as JSON from '@ungap/structured-clone/json';\nimport IDBMapSync from '@webreflection/idb-map/sync';\nimport { dedent } from '../utils.js';\nimport { io } from './_io.js';\n\nexport const loader = new WeakMap();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const registerJSModule = (interpreter, name, value) => {\n    if (name === 'polyscript') {\n        value.lazy_py_modules = async (...packages) => {\n            await loader.get(interpreter)(packages);\n            return packages.map(name => interpreter.pyimport(name));\n        };\n        value.storage = async (name) => {\n            const storage = new IDBMapSync(name);\n            await storage.sync();\n            return storage;\n        };\n        value.JSON = JSON;\n    }\n    interpreter.registerJsModule(name, value);\n};\n\nexport const getFormat = (path, url) => {\n    if (path.endsWith('/*')) {\n        if (/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(url))\n            return RegExp.$1;\n        throw new Error(`Unsupported archive ${url}`);\n    }\n    return '';\n};\n\nexport const run = (interpreter, code, ...args) => {\n    try {\n        return interpreter.runPython(dedent(code), ...args);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n\nexport const runAsync = async (interpreter, code, ...args) => {\n    try {\n        return await interpreter.runPythonAsync(dedent(code), ...args);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n\nexport const runEvent = async (interpreter, code, event) => {\n    // allows method(event) as well as namespace.method(event)\n    // it does not allow fancy brackets names for now\n    const [name, ...keys] = code.split('.');\n    let target = interpreter.globals.get(name);\n    let context;\n    for (const key of keys) [context, target] = [target, target[key]];\n    try {\n        await target.call(context, event);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n/* c8 ignore stop */\n","// ⚠️ DO NOT MODIFY - SOURCE FILE: \"../../python/mip.py\"\nexport default new TextEncoder().encode(\"from uio import StringIO\\nimport sys\\n\\nclass Response:\\n    def __init__(self, f):\\n        self.raw = f\\n        self.encoding = \\\"utf-8\\\"\\n        self._cached = None\\n\\n    def close(self):\\n        if self.raw:\\n            self.raw.close()\\n            self.raw = None\\n        self._cached = None\\n\\n    @property\\n    def content(self):\\n        if self._cached is None:\\n            try:\\n                self._cached = self.raw.read()\\n            finally:\\n                self.raw.close()\\n                self.raw = None\\n        return self._cached\\n\\n    @property\\n    def text(self):\\n        return str(self.content, self.encoding)\\n\\n    def json(self):\\n        import ujson\\n\\n        return ujson.loads(self.content)\\n\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\n\\n\\ntry:\\n    import js\\nexcept Exception as err:\\n    raise OSError(\\\"This version of urequests can only be used in the browser\\\")\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\n\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\n\\n\\ndef request(\\n    method,\\n    url,\\n    data=None,\\n    json=None,\\n    headers={},\\n    stream=None,\\n    auth=None,\\n    timeout=None,\\n    parse_headers=True,\\n):\\n    from js import XMLHttpRequest\\n\\n    xhr = XMLHttpRequest.new()\\n    xhr.withCredentials = False\\n\\n    if auth is not None:\\n        import ubinascii\\n\\n        username, password = auth\\n        xhr.open(method, url, False, username, password)\\n    else:\\n        xhr.open(method, url, False)\\n\\n    for name, value in headers.items():\\n        if name.lower() not in HEADERS_TO_IGNORE:\\n            xhr.setRequestHeader(name, value)\\n\\n    if timeout:\\n        xhr.timeout = int(timeout * 1000)\\n\\n    if json is not None:\\n        assert data is None\\n        import ujson\\n\\n        data = ujson.dumps(json)\\n        # s.write(b\\\"Content-Type: application/json\\\\r\\\\n\\\")\\n        xhr.setRequestHeader(\\\"Content-Type\\\", \\\"application/json\\\")\\n\\n    xhr.send(data)\\n\\n    # Emulates the construction process in the original urequests\\n    resp = Response(StringIO(xhr.responseText))\\n    resp.status_code = xhr.status\\n    resp.reason = xhr.statusText\\n    resp.headers = xhr.getAllResponseHeaders()\\n\\n    return resp\\n\\n\\n# Other methods - head, post, put, patch, delete - are not used by\\n# mip and therefore not included\\n\\n\\ndef get(url, **kw):\\n    return request(\\\"GET\\\", url, **kw)\\n\\n\\n# Content below this line is from the Micropython MIP package and is covered\\n# by the applicable MIT license:\\n# \\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\n# DEALINGS IN THE SOFTWARE.\\n\\n# MicroPython package installer\\n# MIT license; Copyright (c) 2022 Jim Mussared\\n\\n\\n_PACKAGE_INDEX = const(\\\"https://micropython.org/pi/v2\\\")\\n_CHUNK_SIZE = 128\\n\\n\\n# This implements os.makedirs(os.dirname(path))\\ndef _ensure_path_exists(path):\\n    import os\\n\\n    split = path.split(\\\"/\\\")\\n\\n    # Handle paths starting with \\\"/\\\".\\n    if not split[0]:\\n        split.pop(0)\\n        split[0] = \\\"/\\\" + split[0]\\n\\n    prefix = \\\"\\\"\\n    for i in range(len(split) - 1):\\n        prefix += split[i]\\n        try:\\n            os.stat(prefix)\\n        except:\\n            os.mkdir(prefix)\\n        prefix += \\\"/\\\"\\n\\n\\n# Copy from src (stream) to dest (function-taking-bytes)\\ndef _chunk(src, dest):\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\n    while True:\\n        n = src.readinto(buf)\\n        if n == 0:\\n            break\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\n\\n\\n# Check if the specified path exists and matches the hash.\\ndef _check_exists(path, short_hash):\\n    import os\\n\\n    try:\\n        import binascii\\n        import hashlib\\n\\n        with open(path, \\\"rb\\\") as f:\\n            hs256 = hashlib.sha256()\\n            _chunk(f, hs256.update)\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], \\\"utf-8\\\")\\n            return existing_hash == short_hash\\n    except:\\n        return False\\n\\n\\ndef _rewrite_url(url, branch=None):\\n    if not branch:\\n        branch = \\\"HEAD\\\"\\n    if url.startswith(\\\"github:\\\"):\\n        url = url[7:].split(\\\"/\\\")\\n        url = (\\n            \\\"https://raw.githubusercontent.com/\\\"\\n            + url[0]\\n            + \\\"/\\\"\\n            + url[1]\\n            + \\\"/\\\"\\n            + branch\\n            + \\\"/\\\"\\n            + \\\"/\\\".join(url[2:])\\n        )\\n    return url\\n\\n\\ndef _download_file(url, dest):\\n    response = get(url)\\n    try:\\n        if response.status_code != 200:\\n            print(\\\"Error\\\", response.status_code, \\\"requesting\\\", url)\\n            return False\\n\\n        print(\\\"Copying:\\\", dest)\\n        _ensure_path_exists(dest)\\n        with open(dest, \\\"wb\\\") as f:\\n            _chunk(response.raw, f.write)\\n\\n        return True\\n    finally:\\n        response.close()\\n\\n\\ndef _install_json(package_json_url, index, target, version, mpy):\\n    response = get(_rewrite_url(package_json_url, version))\\n    try:\\n        if response.status_code != 200:\\n            print(\\\"Package not found:\\\", package_json_url)\\n            return False\\n\\n        package_json = response.json()\\n    finally:\\n        response.close()\\n    for target_path, short_hash in package_json.get(\\\"hashes\\\", ()):\\n        fs_target_path = target + \\\"/\\\" + target_path\\n        if _check_exists(fs_target_path, short_hash):\\n            print(\\\"Exists:\\\", fs_target_path)\\n        else:\\n            file_url = \\\"{}/file/{}/{}\\\".format(index, short_hash[:2], short_hash)\\n            if not _download_file(file_url, fs_target_path):\\n                print(\\\"File not found: {} {}\\\".format(target_path, short_hash))\\n                return False\\n    for target_path, url in package_json.get(\\\"urls\\\", ()):\\n        fs_target_path = target + \\\"/\\\" + target_path\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\n            print(\\\"File not found: {} {}\\\".format(target_path, url))\\n            return False\\n    for dep, dep_version in package_json.get(\\\"deps\\\", ()):\\n        if not _install_package(dep, index, target, dep_version, mpy):\\n            return False\\n    return True\\n\\n\\ndef _install_package(package, index, target, version, mpy):\\n    if (\\n        package.startswith(\\\"http://\\\")\\n        or package.startswith(\\\"https://\\\")\\n        or package.startswith(\\\"github:\\\")\\n    ):\\n        if package.endswith(\\\".py\\\") or package.endswith(\\\".mpy\\\"):\\n            print(\\\"Downloading {} to {}\\\".format(package, target))\\n            return _download_file(\\n                _rewrite_url(package, version), target + \\\"/\\\" + package.rsplit(\\\"/\\\")[-1]\\n            )\\n        else:\\n            if not package.endswith(\\\".json\\\"):\\n                if not package.endswith(\\\"/\\\"):\\n                    package += \\\"/\\\"\\n                package += \\\"package.json\\\"\\n            print(\\\"Installing {} to {}\\\".format(package, target))\\n    else:\\n        if not version:\\n            version = \\\"latest\\\"\\n        print(\\\"Installing {} ({}) from {} to {}\\\".format(package, version, index, target))\\n\\n        mpy_version = (\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, \\\"_mpy\\\") else \\\"py\\\"\\n        )\\n\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\n        package = \\\"{}/package/{}/{}/{}.json\\\".format(index, \\\"py\\\", package, version)\\n\\n    return _install_json(package, index, target, version, mpy)\\n\\n\\ndef install(package, index=None, target=None, version=None, mpy=True):\\n    if not target:\\n        for p in sys.path:\\n            if p.endswith(\\\"/lib\\\"):\\n                target = p\\n                break\\n        else:\\n            print(\\\"Unable to find lib dir in sys.path\\\")\\n            return\\n\\n    if not index:\\n        index = _PACKAGE_INDEX\\n\\n    if _install_package(package, index.rstrip(\\\"/\\\"), target, version, mpy):\\n        print(\\\"Done\\\")\\n    else:\\n        print(\\\"Package may be partially installed\\\")\\n\");","/* c8 ignore start */\n\n// toml\nexport const toml = async (text) => (\n  await import(/* webpackIgnore: true */'./3rd-party/toml.js')\n).parse(text);\n\n// zip\nexport const zip = () => import(/* webpackIgnore: true */'./3rd-party/zip.js');\n\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\n\nimport { fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';\nimport { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';\nimport { stdio, buffered } from './_io.js';\nimport { absoluteURL } from '../utils.js';\nimport mip from '../python/mip.js';\nimport { zip } from '../3rd-party.js';\n\nconst type = 'micropython';\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nconst mkdir = (FS, path) => {\n    try {\n        FS.mkdir(path);\n    }\n    // eslint-disable-next-line no-unused-vars\n    catch (_) {\n        // ignore as there's no path.exists here\n    }\n};\n\nexport default {\n    type,\n    module: (version = '1.24.0-preview-114') =>\n        `https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${version}/micropython.mjs`,\n    async engine({ loadMicroPython }, config, url, baseURL) {\n        const { stderr, stdout, get } = stdio({\n            stderr: buffered(console.error),\n            stdout: buffered(console.log),\n        });\n        url = url.replace(/\\.m?js$/, '.wasm');\n        const interpreter = await get(loadMicroPython({ linebuffer: false, stderr, stdout, url }));\n        const py_imports = importPackages.bind(this, interpreter, baseURL);\n        loader.set(interpreter, py_imports);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n\n        // Install Micropython Package\n        this.writeFile(interpreter, './mip.py', mip);\n        if (config.packages) await py_imports(config.packages);\n        return interpreter;\n    },\n    registerJSModule,\n    run,\n    runAsync,\n    runEvent,\n    transform: (interpreter, value) => interpreter.PyProxy.toJs(value),\n    writeFile: (interpreter, path, buffer, url) => {\n        const { FS, _module: { PATH, PATH_FS } } = interpreter;\n        const fs = { FS, PATH, PATH_FS };\n        const format = getFormat(path, url);\n        if (format) {\n            const extractDir = path.slice(0, -1);\n            if (extractDir !== './') FS.mkdir(extractDir);\n            switch (format) {\n                case 'whl':\n                case 'zip': {\n                    const blob = new Blob([buffer], { type: 'application/zip' });\n                    return zip().then(async ({ BlobReader, Uint8ArrayWriter, ZipReader }) => {\n                        const zipFileReader = new BlobReader(blob);\n                        const zipReader = new ZipReader(zipFileReader);\n                        for (const entry of await zipReader.getEntries()) {\n                            const { directory, filename } = entry;\n                            const name = extractDir + filename;\n                            if (directory) mkdir(FS, name);\n                            else {\n                                mkdir(FS, PATH.dirname(name));\n                                const buffer = await entry.getData(new Uint8ArrayWriter);\n                                FS.writeFile(name, buffer, {\n                                    canOwn: true,\n                                });\n                            }\n                        }\n                        zipReader.close();\n                    });\n                }\n                case 'tgz':\n                case 'tar.gz': {\n                    const TMP = './_.tar.gz';\n                    writeFile(fs, TMP, buffer);\n                    interpreter.runPython(`\n                        import os, gzip, tarfile\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open(\"${TMP}\", \"rb\")))\n                        for f in tar:\n                            name = f\"${extractDir}{f.name}\"\n                            if f.type == tarfile.DIRTYPE:\n                                if f.name != \"./\":\n                                    os.mkdir(name.strip(\"/\"))\n                            else:\n                                dir = os.path.dirname(name)\n                                if not os.path.exists(dir):\n                                    os.mkdir(dir)\n                                source = tar.extractfile(f)\n                                with open(name, \"wb\") as dest:\n                                    dest.write(source.read())\n                                    dest.close()\n                        tar.close()\n                        os.remove(\"${TMP}\")\n                    `);\n                    return;\n                }\n            }\n        }\n        return writeFile(fs, path, buffer);\n    },\n};\n\nasync function importPackages(interpreter, baseURL, packages) {\n    let mip;\n    for (const mpyPackage of packages) {\n        if (mpyPackage.endsWith('.whl')) {\n            const url = absoluteURL(mpyPackage, baseURL);\n            const buffer = await fetch(url).arrayBuffer();\n            await this.writeFile(interpreter, './*', buffer, url);\n        }\n        else {\n            if (!mip) mip = interpreter.pyimport('mip');\n            mip.install(mpyPackage);\n        }\n    }\n}\n/* c8 ignore stop */\n","import { create } from 'gc-hook';\n\nimport { RUNNING_IN_WORKER, fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';\nimport { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';\nimport { stdio } from './_io.js';\n\nconst type = 'pyodide';\nconst toJsOptions = { dict_converter: Object.fromEntries };\n\n/* c8 ignore start */\nlet overrideFunction = false;\nconst overrideMethod = method => (...args) => {\n    try {\n        overrideFunction = true;\n        return method(...args);\n    }\n    finally {\n        overrideFunction = false;\n    }\n};\n\nlet overridden = false;\nconst applyOverride = () => {\n    if (overridden) return;\n    overridden = true;\n\n    const proxies = new WeakMap;\n    const onGC = value => value.destroy();\n    const patchArgs = args => {\n        for (let i = 0; i < args.length; i++) {\n            const value = args[i];\n            if (\n                typeof value === 'function' &&\n                'copy' in value\n            ) {\n                // avoid seppuku / Harakiri + speed up\n                overrideFunction = false;\n                // reuse copied value if known already\n                let proxy = proxies.get(value)?.deref();\n                if (!proxy) {\n                    try {\n                        // observe the copy and return a Proxy reference\n                        proxy = create(value.copy(), onGC);\n                        proxies.set(value, new WeakRef(proxy));\n                    }\n                    catch (error) {\n                        console.error(error);\n                    }\n                }\n                if (proxy) args[i] = proxy;\n                overrideFunction = true;\n            }\n        }\n    };\n\n    // trap apply to make call possible after the patch\n    const { call } = Function;\n    const apply = call.bind(call, call.apply);\n    // the patch\n    Object.defineProperties(Function.prototype, {\n        apply: {\n            value(context, args) {\n                if (overrideFunction) patchArgs(args);\n                return apply(this, context, args);\n            }\n        },\n        call: {\n            value(context, ...args) {\n                if (overrideFunction) patchArgs(args);\n                return apply(this, context, args);\n            }\n        }\n    });\n};\n/* c8 ignore stop */\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    module: (version = '0.26.1') =>\n        `https://cdn.jsdelivr.net/pyodide/v${version}/full/pyodide.mjs`,\n    async engine({ loadPyodide }, config, url, baseURL) {\n        // apply override ASAP then load foreign code\n        if (!RUNNING_IN_WORKER && config.experimental_create_proxy === 'auto')\n            applyOverride();\n        const { stderr, stdout, get } = stdio();\n        const indexURL = url.slice(0, url.lastIndexOf('/'));\n        const interpreter = await get(\n            loadPyodide({ stderr, stdout, indexURL }),\n        );\n        const py_imports = importPackages.bind(interpreter);\n        loader.set(interpreter, py_imports);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        if (config.packages) await py_imports(config.packages);\n        return interpreter;\n    },\n    registerJSModule,\n    run: overrideMethod(run),\n    runAsync: overrideMethod(runAsync),\n    runEvent: overrideMethod(runEvent),\n    transform: ({ ffi: { PyProxy } }, value) => (\n        value instanceof PyProxy ?\n            value.toJs(toJsOptions) :\n            value\n    ),\n    writeFile: (interpreter, path, buffer, url) => {\n        const format = getFormat(path, url);\n        if (format) {\n            return interpreter.unpackArchive(buffer, format, {\n                extractDir: path.slice(0, -1)\n            });\n        }\n        const { FS, PATH, _module: { PATH_FS } } = interpreter;\n        return writeFile({ FS, PATH, PATH_FS }, path, buffer);\n    },\n};\n\n// exposed utility to import packages via polyscript.lazy_py_modules\nasync function importPackages(packages) {\n    await this.loadPackage('micropip');\n    const micropip = this.pyimport('micropip');\n    await micropip.install(packages, { keep_going: true });\n    micropip.destroy();\n}\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\n\nimport { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths } from './_utils.js';\n\nconst type = 'ruby-wasm-wasi';\nconst jsType = type.replace(/\\W+/g, '_');\n\n// MISSING:\n//  * there is no VFS apparently or I couldn't reach any\n//  * I've no idea how to override the stderr and stdout\n//  * I've no idea how to import packages\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    experimental: true,\n    module: (version = '2.6.2') =>\n        `https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${version}/dist/browser/+esm`,\n    async engine({ DefaultRubyVM }, config, url, baseURL) {\n        url = url.replace(/\\/browser\\/\\+esm$/, '/ruby.wasm');\n        const buffer = await fetch(url).arrayBuffer();\n        const module = await WebAssembly.compile(buffer);\n        const { vm: interpreter } = await DefaultRubyVM(module);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields (i.e. $xworker)\n    registerJSModule(interpreter, name, value) {\n        name = name.replace(/\\W+/g, '__');\n        const id = `__module_${jsType}_${name}`;\n        globalThis[id] = value;\n        this.run(interpreter, `require \"js\";$${name}=JS.global[:${id}]`);\n        delete globalThis[id];\n    },\n    run: (interpreter, code, ...args) => interpreter.eval(dedent(code), ...args),\n    runAsync: (interpreter, code, ...args) => interpreter.evalAsync(dedent(code), ...args),\n    async runEvent(interpreter, code, event) {\n        // patch common xworker.onmessage/onerror cases\n        if (/^xworker\\.(on\\w+)$/.test(code)) {\n            const { $1: name } = RegExp;\n            const id = `__module_${jsType}_event`;\n            globalThis[id] = event;\n            this.run(\n                interpreter,\n                `require \"js\";$xworker.call(\"${name}\",JS.global[:${id}])`,\n            );\n            delete globalThis[id];\n        } else {\n            // Experimental: allows only events by fully qualified method name\n            const method = this.run(interpreter, `method(:${code})`);\n            await method.call(code, interpreter.wrap(event));\n        }\n    },\n    transform: (_, value) => value,\n    writeFile: () => {\n        throw new Error(`writeFile is not supported in ${type}`);\n    },\n};\n/* c8 ignore stop */\n","import { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths, writeFileShim } from './_utils.js';\nimport { io, stdio } from './_io.js';\n\nconst type = 'wasmoon';\n\n// MISSING:\n//  * I've no idea how to import packages\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    module: (version = '1.16.0') =>\n        `https://cdn.jsdelivr.net/npm/wasmoon@${version}/+esm`,\n    async engine({ LuaFactory, LuaLibraries }, config, _, baseURL) {\n        const { stderr, stdout, get } = stdio();\n        const interpreter = await get(new LuaFactory().createEngine());\n        interpreter.global.getTable(LuaLibraries.Base, (index) => {\n            interpreter.global.setField(index, 'print', stdout);\n            interpreter.global.setField(index, 'printErr', stderr);\n        });\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields\n    registerJSModule: (interpreter, name, value) => {\n        interpreter.global.set(name, value);\n    },\n    run: (interpreter, code, ...args) => {\n        try {\n            return interpreter.doStringSync(dedent(code), ...args);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    runAsync: async (interpreter, code, ...args) => {\n        try {\n            return await interpreter.doString(dedent(code), ...args);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    runEvent: async (interpreter, code, event) => {\n        // allows method(event) as well as namespace.method(event)\n        // it does not allow fancy brackets names for now\n        const [name, ...keys] = code.split('.');\n        let target = interpreter.global.get(name);\n        let context;\n        for (const key of keys) [context, target] = [target, target[key]];\n        try {\n            await target.call(context, event);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    transform: (_, value) => value,\n    writeFile: (\n        {\n            cmodule: {\n                module: { FS },\n            },\n        },\n        path,\n        buffer,\n    ) => writeFileShim(FS, path, buffer),\n};\n/* c8 ignore stop */\n","import { create } from 'gc-hook';\nimport { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths } from './_utils.js';\nimport { io, stdio } from './_io.js';\n\nconst type = 'webr';\nconst r = new WeakMap();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nconst run = async (interpreter, code) => {\n  const { shelter, destroy, io } = r.get(interpreter);\n  const { output, result } = await shelter.captureR(dedent(code));\n  for (const { type, data } of output) io[type](data);\n  // this is a double proxy but it's OK as the consumer\n  // of the result here needs to invoke explicitly a conversion\n  // or trust the `(await p.toJs()).values` returns what's expected.\n  return create(result, destroy, { token: false });\n};\n\nexport default {\n    type,\n    experimental: true,\n    module: (version = '0.4.0') =>\n        `https://cdn.jsdelivr.net/npm/webr@${version}/dist/webr.mjs`,\n    async engine(module, config, _, baseURL) {\n        const { get } = stdio();\n        const interpreter = new module.WebR();\n        await get(interpreter.init().then(() => interpreter));\n        const shelter = await new interpreter.Shelter();\n        r.set(interpreter, {\n          module,\n          shelter,\n          destroy: shelter.destroy.bind(shelter),\n          io: io.get(interpreter),\n        });\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields (i.e. $xworker)\n    registerJSModule(_, name) {\n        console.warn(`Experimental interpreter: module ${name} is not supported (yet)`);\n        // TODO: as complex JS objects / modules are not allowed\n        // it's not clear how we can bind anything or import a module\n        // in a context that doesn't understand methods from JS\n        // https://docs.r-wasm.org/webr/latest/convert-js-to-r.html#constructing-r-objects-from-javascript-objects\n    },\n    run,\n    runAsync: run,\n    async runEvent(interpreter, code, event) {\n        // TODO: WebR cannot convert exoteric objects or any literal\n        // to an easy to reason about data/frame ... that convertion\n        // is reserved for the future:\n        // https://docs.r-wasm.org/webr/latest/convert-js-to-r.html#constructing-r-objects-from-javascript-objects\n        await interpreter.evalRVoid(`${code}(event)`, {\n          env: { event: { type: [ event.type ] } }\n        });\n    },\n    transform: (_, value) => {\n        console.log('transforming', value);\n        return value;\n    },\n    writeFile: () => {\n        // MAYBE ???\n    },\n};\n/* c8 ignore stop */\n","// ⚠️ Part of this file is automatically generated\n//    The :RUNTIMES comment is a delimiter and no code should be written/changed after\n//    See rollup/build_interpreters.cjs to know more\n\n/** @type {Map<string, object>} */\nexport const registry = new Map();\n\n/** @type {Map<string, object>} */\nexport const configs = new Map();\n\n/** @type {string[]} */\nexport const selectors = [];\n\n/** @type {string[]} */\nexport const prefixes = [];\n\n/* c8 ignore start */\nexport const interpreter = new Proxy(new Map(), {\n    get(map, id) {\n        if (!map.has(id)) {\n            const [type, ...rest] = id.split('@');\n            const interpreter = registry.get(type);\n            const url = /^(?:\\.?\\.?\\/|https?:\\/\\/)/i.test(rest) \n                ? rest.join('@')\n                : interpreter.module(...rest);\n            map.set(id, {\n                url,\n                module: import(/* webpackIgnore: true */url),\n                engine: interpreter.engine.bind(interpreter),\n            });\n        }\n        const { url, module, engine } = map.get(id);\n        return (config, baseURL) =>\n            module.then((module) => {\n                configs.set(id, config);\n                return engine(module, config, url, baseURL);\n            });\n    },\n});\n/* c8 ignore stop */\n\nconst register = (interpreter) => {\n    for (const type of [].concat(interpreter.type)) {\n        registry.set(type, interpreter);\n        selectors.push(`script[type=\"${type}\"]`);\n        prefixes.push(`${type}-`);\n    }\n};\n\n//:RUNTIMES\nimport micropython from './interpreter/micropython.js';\nimport pyodide from './interpreter/pyodide.js';\nimport ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js';\nimport wasmoon from './interpreter/wasmoon.js';\nimport webr from './interpreter/webr.js';\nfor (const interpreter of [micropython, pyodide, ruby_wasm_wasi, wasmoon, webr])\n    register(interpreter);\n","import fetch from '@webreflection/fetch';\n\nimport { interpreter } from './interpreters.js';\nimport { absoluteURL, resolve } from './utils.js';\nimport { toml } from './3rd-party.js';\n\nconst { parse } = JSON;\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const getConfigURLAndType = (config, configURL = './config.txt') => {\n    let type = typeof config;\n    if (type === 'string' && /\\.(json|toml|txt)$/.test(config))\n        type = RegExp.$1;\n    else\n        config = configURL;\n    return [absoluteURL(config), type];\n};\n\nconst parseString = config => {\n    try {\n        return parse(config);\n    }\n    // eslint-disable-next-line no-unused-vars\n    catch (_) {\n        return toml(config);\n    }\n};\n/* c8 ignore stop */\n\n/**\n * Parse a generic config if it came from an attribute either as URL\n * or as a serialized string. In XWorker case, accepts a pre-defined\n * options to use as it is to avoid needing at all a fetch operation.\n * In latter case, config will be suffixed as `config.txt`.\n * @param {string} id the interpreter name @ version identifier\n * @param {string | object} config optional config file to parse\n * @param {string} [configURL] optional config URL if config is not string\n * @param {object} [options] optional options used to bootstrap XWorker\n * @returns\n */\nexport const getRuntime = (id, config, configURL, options = {}) => {\n    if (config) {\n        // REQUIRES INTEGRATION TEST\n        /* c8 ignore start */\n        const [absolute, type] = getConfigURLAndType(config, configURL);\n        if (type === 'json') {\n            options = fetch(absolute).json();\n        } else if (type === 'toml') {\n            options = fetch(absolute).text().then(toml);\n        } else if (type === 'string') {\n            options = parseString(config);\n        } else if (type === 'object' && config) {\n            options = config;\n        } else if (type === 'txt' && typeof options === 'string') {\n            options = parseString(options);\n        }\n        config = absolute;\n        /* c8 ignore stop */\n    }\n    return resolve(options).then(options => interpreter[id](options, config));\n};\n\n/**\n * @param {string} type the interpreter type\n * @param {string} [version] the optional interpreter version\n * @returns\n */\nexport const getRuntimeID = (type, version = '') =>\n    `${type}@${version}`.replace(/@$/, '');\n","export default function (callback = this) {\n  return String(callback).replace(\n    /^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,\n    (_, isAsync, fn, name) => (\n      name && !fn ?\n        `${isAsync || \"\"}function ${name}(` :\n        _\n    ),\n  );\n};\n","import { registry } from './interpreters.js';\n\nconst beforeRun = 'BeforeRun';\nconst afterRun = 'AfterRun';\n\nexport const code = [\n    `code${beforeRun}`,\n    `code${beforeRun}Async`,\n    `code${afterRun}`,\n    `code${afterRun}Async`,\n];\n\nexport const js = [\n    'onWorker',\n    'onReady',\n    `on${beforeRun}`,\n    `on${beforeRun}Async`,\n    `on${afterRun}`,\n    `on${afterRun}Async`,\n];\n\n/* c8 ignore start */\n// create a copy of the resolved wrapper with the original\n// run and runAsync so that, if used within onBeforeRun/Async\n// or onAfterRun/Async polluted entries won't matter and just\n// the native utilities will be available without seppuku.\n// The same applies if called within `onReady` worker hook.\nexport function patch(resolved, interpreter) {\n    const { run, runAsync } = registry.get(this.type);\n    return {\n        ...resolved,\n        run: run.bind(this, interpreter),\n        runAsync: runAsync.bind(this, interpreter)\n    };\n}\n\n/**\n * Created the wrapper to pass along hooked callbacks.\n * @param {object} module the details module\n * @param {object} ref the node or reference to pass as second argument\n * @param {boolean} isAsync if run should be async\n * @param {function?} before callback to run before\n * @param {function?} after callback to run after\n * @returns {object}\n */\nexport const polluteJS = (module, resolved, ref, isAsync, before, after) => {\n    if (before || after) {\n        const patched = patch.bind(module, resolved);\n        const name = isAsync ? 'runAsync' : 'run';\n        const method = module[name];\n        module[name] = isAsync ?\n            async function (interpreter, code, ...args) {\n                if (before) await before.call(this, patched(interpreter), ref);\n                const result = await method.call(\n                    this,\n                    interpreter,\n                    code,\n                    ...args\n                );\n                if (after) await after.call(this, patched(interpreter), ref);\n                return result;\n            } :\n            function (interpreter, code, ...args) {\n                if (before) before.call(this, patched(interpreter), ref);\n                const result = method.call(this, interpreter, code, ...args);\n                if (after) after.call(this, patched(interpreter), ref);\n                return result;\n            }\n        ;\n    }\n};\n/* c8 ignore stop */\n","import toJSONCallback from 'to-json-callback';\n\nimport { dedent } from '../utils.js';\nimport { js as jsHooks, code as codeHooks } from '../hooks.js';\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default class Hook {\n    constructor(interpreter, hooks = {}) {\n        const { main, worker } = hooks;\n        this.interpreter = interpreter;\n        this.onWorker = main?.onWorker;\n        // ignore onWorker as that's main only\n        for (const key of jsHooks.slice(1))\n            this[key] = worker?.[key];\n        for (const key of codeHooks)\n            this[key] = worker?.[key];\n    }\n    toJSON() {\n        const hooks = {};\n        // ignore onWorker as that's main only\n        for (const key of jsHooks.slice(1)) {\n            if (this[key]) hooks[key] = toJSONCallback(this[key]);\n        }\n        // code related: exclude `onReady` callback\n        for (const key of codeHooks) {\n            if (this[key]) hooks[key] = dedent(this[key]());\n        }\n        return hooks;\n    }\n}\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\nimport xworker from './xworker.js';\nimport { getConfigURLAndType } from '../loader.js';\nimport { assign, create, defineProperties, importCSS, importJS } from '../utils.js';\nimport Hook from './hook.js';\n\n/**\n * @typedef {Object} WorkerOptions custom configuration\n * @prop {string} type the interpreter type to use\n * @prop {string} [version] the optional interpreter version to use\n * @prop {string | object} [config] the optional config to use within such interpreter\n * @prop {string} [configURL] the optional configURL used to resolve config entries\n * @prop {string} [serviceWorker] the optional Service Worker for SharedArrayBuffer fallback\n * @prop {string} [service_worker] alias for `serviceWorker`\n */\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default (...args) =>\n    /**\n     * A XWorker is a Worker facade able to bootstrap a channel with any desired interpreter.\n     * @param {string} url the remote file to evaluate on bootstrap\n     * @param {WorkerOptions} [options] optional arguments to define the interpreter to use\n     * @returns {Worker}\n     */\n    function XWorker(url, options) {\n        if (args.length) {\n            const [type, version] = args;\n            options = assign({}, options || { type, version });\n            if (!options.type) options.type = type;\n        }\n\n        // provide a base url to fetch or load config files from a Worker\n        // because there's no location at all in the Worker as it's embedded.\n        // fallback to a generic, ignored, config.txt file to still provide a URL.\n        const [ config ] = getConfigURLAndType(options.config, options.configURL);\n\n        const serviceWorker = options?.serviceWorker || options?.service_worker;\n        const worker = xworker({ serviceWorker });\n        const { postMessage } = worker;\n        const isHook = this instanceof Hook;\n\n        const sync = assign(\n            worker.proxy,\n            { importJS, importCSS },\n        );\n\n        const resolver = Promise.withResolvers();\n\n        let bootstrap = fetch(url)\n            .text()\n            .then(code => {\n                const hooks = isHook ? this.toJSON() : void 0;\n                postMessage.call(worker, { options, config, code, hooks });\n            })\n            .then(() => {\n                // boost postMessage performance\n                bootstrap = { then: fn => fn() };\n            });\n\n        defineProperties(worker, {\n            sync: { value: sync },\n            ready: { value: resolver.promise },\n            postMessage: {\n                value: (data, ...rest) => bootstrap.then(\n                    () => postMessage.call(worker, data, ...rest),\n                ),\n            },\n            onerror: {\n                writable: true,\n                configurable: true,\n                value: console.error\n            }\n        });\n\n        worker.addEventListener('message', event => {\n            const { data } = event;\n            const isError = data instanceof Error;\n            if (isError || data === 'polyscript:done') {\n                event.stopImmediatePropagation();\n                if (isError) {\n                    resolver.reject(data);\n                    worker.onerror(create(event, {\n                        type: { value: 'error' },\n                        error: { value: data }\n                    }));\n                }\n                else resolver.resolve(worker);\n            }\n        });\n\n        if (isHook) this.onWorker?.(this.interpreter, worker);\n\n        return worker;\n    };\n\n/* c8 ignore stop */","export const INVALID_CONTENT = 'Invalid content';\nexport const INVALID_SRC_ATTR = 'Invalid worker attribute';\nexport const INVALID_WORKER_ATTR = 'Invalid worker attribute';\n","import { INVALID_CONTENT, INVALID_SRC_ATTR, INVALID_WORKER_ATTR } from '../errors.js';\n\nimport { dedent, unescape } from '../utils.js';\n\nconst hasCommentsOnly = text => !text\n    .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n    .replace(/^\\s*(?:\\/\\/|#).*/gm, '')\n    .trim()\n;\n\n/* c8 ignore start */ // tested via integration\nexport default element => {\n  const { src, worker } = element.attributes;\n  if (worker) {\n      let { value } = worker;\n      // throw on worker values as ambiguous\n      // @see https://github.com/pyscript/polyscript/issues/43\n      if (value) throw new SyntaxError(INVALID_WORKER_ATTR);\n      value = src?.value;\n      if (!value) {\n          // throw on empty src attributes\n          if (src) throw new SyntaxError(INVALID_SRC_ATTR);\n          if (!element.childElementCount)\n              value = element.textContent;\n          else {\n              const { innerHTML, localName, type } = element;\n              const name = type || localName.replace(/-script$/, '');\n              value = unescape(innerHTML);\n              console.warn(\n                  `Deprecated: use <script type=\"${name}\"> for an always safe content parsing:\\n`,\n                  value,\n              );\n          }\n\n          const url = URL.createObjectURL(new Blob([dedent(value)], { type: 'text/plain' }));\n          // TODO: should we really clean up this? debugging non-existent resources\n          //       at distance might be very problematic if the url is revoked.\n          // setTimeout(URL.revokeObjectURL, 5000, url);\n          return url;\n      }\n      return value;\n  }\n  // validate ambiguous cases with src and not empty/commented content\n  if (src && !hasCommentsOnly(element.textContent))\n    throw new SyntaxError(INVALID_CONTENT);\n};\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\nimport { $ } from 'basic-devtools';\n\nimport { workers, workersHandler } from './workers.js';\nimport $xworker from './worker/class.js';\nimport workerURL from './worker/url.js';\nimport { getRuntime, getRuntimeID } from './loader.js';\nimport { registry } from './interpreters.js';\nimport { JSModules, all, dispatch, resolve, defineProperty, nodeInfo, registerJSModules } from './utils.js';\n\nconst getRoot = (script) => {\n    let parent = script;\n    while (parent.parentNode) parent = parent.parentNode;\n    return parent;\n};\n\nexport const queryTarget = (script, idOrSelector) => {\n    const root = getRoot(script);\n    return root.getElementById(idOrSelector) || $(idOrSelector, root);\n};\n\nconst targets = new WeakMap();\nconst targetDescriptor = {\n    get() {\n        let target = targets.get(this);\n        if (!target) {\n            target = document.createElement(`${this.type}-script`);\n            targets.set(this, target);\n            handle(this);\n        }\n        return target;\n    },\n    set(target) {\n        if (typeof target === 'string')\n            targets.set(this, queryTarget(this, target));\n        else {\n            targets.set(this, target);\n            handle(this);\n        }\n    },\n};\n\nconst handled = new WeakMap();\n\nexport const interpreters = new Map();\n\nconst execute = async (currentScript, source, XWorker, isAsync) => {\n    const { type } = currentScript;\n    const module = registry.get(type);\n    /* c8 ignore start */\n    if (module.experimental)\n        console.warn(`The ${type} interpreter is experimental`);\n    const [interpreter, content] = await all([\n        handled.get(currentScript).interpreter,\n        source,\n    ]);\n    try {\n        // temporarily override inherited document.currentScript in a non writable way\n        // but it deletes it right after to preserve native behavior (as it's sync: no trouble)\n        defineProperty(document, 'currentScript', {\n            configurable: true,\n            get: () => currentScript,\n        });\n        registerJSModules(type, module, interpreter, JSModules);\n        module.registerJSModule(interpreter, 'polyscript', {\n            XWorker,\n            currentScript,\n            js_modules: JSModules,\n            workers: workersHandler,\n        });\n        dispatch(currentScript, type, 'ready');\n        const result = module[isAsync ? 'runAsync' : 'run'](interpreter, content);\n        const done = dispatch.bind(null, currentScript, type, 'done');\n        if (isAsync) result.then(done);\n        else done();\n        return result;\n    } finally {\n        delete document.currentScript;\n    }\n    /* c8 ignore stop */\n};\n\nconst getValue = (ref, prefix) => {\n    const value = ref?.value;\n    return value ? prefix + value : '';\n};\n\nexport const getDetails = (type, id, name, version, config, configURL, runtime = type) => {\n    if (!interpreters.has(id)) {\n        const details = {\n            interpreter: getRuntime(name, config, configURL),\n            queue: resolve(),\n            XWorker: $xworker(type, version),\n        };\n        interpreters.set(id, details);\n        // enable sane defaults when single interpreter *of kind* is used in the page\n        // this allows `xxx-*` attributes to refer to such interpreter without `env` around\n        /* c8 ignore start *//* this is tested very well in PyScript */\n        if (!interpreters.has(type)) interpreters.set(type, details);\n        if (!interpreters.has(runtime)) interpreters.set(runtime, details);\n        /* c8 ignore stopt */\n    }\n    return interpreters.get(id);\n};\n\n/**\n * @param {HTMLScriptElement} script a special type of <script>\n */\nexport const handle = async (script) => {\n    // known node, move its companion target after\n    // vDOM or other use cases where the script is a tracked element\n    if (handled.has(script)) {\n        const { target } = script;\n        if (target) {\n            // if the script is in the head just append target to the body\n            if (script.closest('head')) document.body.append(target);\n            // in any other case preserve the script position\n            else script.after(target);\n        }\n    }\n    // new script to handle ... allow newly created scripts to work\n    // just exactly like any other script would\n    else {\n        // allow a shared config among scripts, beside interpreter,\n        // and/or source code with different config or interpreter\n        const {\n            attributes: {\n                async: isAsync,\n                config,\n                env,\n                name: wn,\n                target,\n                version,\n                ['service-worker']: sw,\n            },\n            src,\n            type,\n        } = script;\n\n        const versionValue = version?.value;\n        const name = getRuntimeID(type, versionValue);\n        let configValue = getValue(config, '|');\n        const id = getValue(env, '') || `${name}${configValue}`;\n        configValue = configValue.slice(1);\n\n        /* c8 ignore start */\n        const url = workerURL(script);\n        if (url) {\n            const XWorker = $xworker(type, versionValue);\n            const xworker = new XWorker(url, {\n                ...nodeInfo(script, type),\n                async: !!isAsync,\n                config: configValue,\n                serviceWorker: sw?.value,\n            });\n            handled.set(\n                defineProperty(script, 'xworker', { value: xworker }),\n                { xworker },\n            );\n            const workerName = wn?.value;\n            if (workerName) workers[workerName].resolve(xworker.ready);\n            return;\n        }\n        /* c8 ignore stop */\n\n        const targetValue = getValue(target, '');\n        const details = getDetails(type, id, name, versionValue, configValue);\n\n        handled.set(\n            defineProperty(script, 'target', targetDescriptor),\n            details,\n        );\n\n        if (targetValue) targets.set(script, queryTarget(script, targetValue));\n\n        // start fetching external resources ASAP\n        const source = src ? fetch(src).text() : script.textContent;\n        details.queue = details.queue.then(() =>\n            execute(script, source, details.XWorker, !!isAsync),\n        );\n    }\n};\n","import { $x } from 'basic-devtools';\n\nimport { interpreters } from './script-handler.js';\nimport { all, create } from './utils.js';\nimport { registry, prefixes } from './interpreters.js';\n\n/* c8 ignore start */\nexport const env = new Proxy(create(null), {\n    get: (_, name) => new Promise(queueMicrotask).then(\n        () => awaitInterpreter(name)\n    ),\n});\n\n// attributes are tested via integration / e2e\n// ensure both interpreter and its queue are awaited then returns the interpreter\nconst awaitInterpreter = async (key) => {\n    if (interpreters.has(key)) {\n        const { interpreter, queue } = interpreters.get(key);\n        return (await all([interpreter, queue]))[0];\n    }\n\n    const available = interpreters.size\n        ? `Available interpreters are: ${[...interpreters.keys()]\n              .map((r) => `\"${r}\"`)\n              .join(', ')}.`\n        : 'There are no interpreters in this page.';\n\n    throw new Error(`The interpreter \"${key}\" was not found. ${available}`);\n};\n\nexport const listener = async (event) => {\n    const { type, currentTarget } = event;\n    if (!prefixes.length) return;\n    for (let { name, value, ownerElement: el } of $x(\n        `./@*[${prefixes.map((p) => `name()=\"${p}${type}\"`).join(' or ')}]`,\n        currentTarget,\n    )) {\n        name = name.slice(0, -(type.length + 1));\n        const interpreter = await awaitInterpreter(\n            el.getAttribute(`${name}-env`) || name,\n        );\n        const handler = registry.get(name);\n        handler.runEvent(interpreter, value, event);\n    }\n};\n\n/**\n * Look for known prefixes and add related listeners.\n * @param {Document | Element} root\n */\nexport const addAllListeners = (root) => {\n    if (!prefixes.length) return;\n    for (let { name, ownerElement: el } of $x(\n        `.//@*[${prefixes\n            .map((p) => `starts-with(name(),\"${p}\")`)\n            .join(' or ')}]`,\n        root,\n    )) {\n        const i = name.lastIndexOf('-');\n        const type = name.slice(i + 1);\n        if (type !== 'env') {\n            el.addEventListener(type, listener);\n            // automatically disable form controls that are not disabled already\n            if ('disabled' in el && !el.disabled) {\n                el.disabled = true;\n                // set these to enable once the interpreter is known (registered + loaded)\n                env[name.slice(0, i)].then(() => {\n                    el.disabled = false;\n                });\n            }\n        }\n    }\n};\n/* c8 ignore stop */\n","import xworker from './worker/class.js';\nimport Hook from './worker/hook.js';\n\nconst XWorker = xworker();\n\nexport { Hook, XWorker };\n","import '@ungap/with-resolvers';\nimport { $$ } from 'basic-devtools';\n\nimport { JSModules, assign, create, createOverload, createResolved, dedent, defineProperty, nodeInfo, registerJSModules } from './utils.js';\nimport { getDetails } from './script-handler.js';\nimport { registry as defaultRegistry, prefixes, configs } from './interpreters.js';\nimport { getRuntimeID } from './loader.js';\nimport { addAllListeners } from './listeners.js';\nimport { Hook, XWorker as XW } from './xworker.js';\nimport { workers, workersHandler } from './workers.js';\nimport { polluteJS, js as jsHooks, code as codeHooks } from './hooks.js';\nimport workerURL from './worker/url.js';\n\nexport const CUSTOM_SELECTORS = [];\n\nexport const customObserver = new Map();\n\n/**\n * @typedef {Object} Runtime custom configuration\n * @prop {object} interpreter the bootstrapped interpreter\n * @prop {(url:string, options?: object) => Worker} XWorker an XWorker constructor that defaults to same interpreter on the Worker.\n * @prop {object} config a cloned config used to bootstrap the interpreter\n * @prop {(code:string) => any} run an utility to run code within the interpreter\n * @prop {(code:string) => Promise<any>} runAsync an utility to run code asynchronously within the interpreter\n * @prop {(path:string, data:ArrayBuffer) => void} writeFile an utility to write a file in the virtual FS, if available\n */\n\nconst types = new Map();\nconst waitList = new Map();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\n/**\n * @param {Element} node any DOM element registered via define.\n */\nexport const handleCustomType = async (node) => {\n    for (const selector of CUSTOM_SELECTORS) {\n        if (node.matches(selector)) {\n            const type = types.get(selector);\n            const details = registry.get(type);\n            const { resolve } = waitList.get(type);\n            const { options, known } = details;\n\n            if (known.has(node)) return;\n            known.add(node);\n\n            for (const [selector, callback] of customObserver) {\n                if (node.matches(selector)) await callback(node);\n            }\n\n            const {\n                interpreter: runtime,\n                configURL,\n                config,\n                version,\n                env,\n                onerror,\n                hooks,\n            } = options;\n\n            let error;\n            try {\n                const worker = workerURL(node);\n                if (worker) {\n                    const xworker = XW.call(new Hook(null, hooks), worker, {\n                        ...nodeInfo(node, type),\n                        version,\n                        configURL,\n                        type: runtime,\n                        custom: type,\n                        config: node.getAttribute('config') || config || {},\n                        async: node.hasAttribute('async'),\n                        serviceWorker: node.getAttribute('service-worker'),\n                    });\n                    defineProperty(node, 'xworker', { value: xworker });\n                    resolve({ type, xworker });\n                    const workerName = node.getAttribute('name');\n                    if (workerName) workers[workerName].resolve(xworker.ready);\n                    return;\n                }\n            }\n            // let the custom type handle errors via its `io`\n            catch (workerError) {\n                error = workerError;\n            }\n\n            const name = getRuntimeID(runtime, version);\n            const id = env || `${name}${config ? `|${config}` : ''}`;\n            const { interpreter: engine, XWorker: Worker } = getDetails(\n                type,\n                id,\n                name,\n                version,\n                config,\n                configURL,\n                runtime\n            );\n\n            const interpreter = await engine;\n\n            const module = create(defaultRegistry.get(runtime));\n\n            const hook = new Hook(interpreter, hooks);\n\n            const XWorker = function XWorker(...args) {\n                return Worker.apply(hook, args);\n            };\n\n            const resolved = {\n                ...createResolved(\n                    module,\n                    type,\n                    structuredClone(configs.get(name)),\n                    interpreter,\n                ),\n                XWorker,\n            };\n\n            registerJSModules(runtime, module, interpreter, JSModules);\n            module.registerJSModule(interpreter, 'polyscript', {\n                XWorker,\n                config: resolved.config,\n                currentScript: type.startsWith('_') ? null : node,\n                js_modules: JSModules,\n                workers: workersHandler,\n            });\n\n            // patch methods accordingly to hooks (and only if needed)\n            for (const suffix of ['Run', 'RunAsync']) {\n                let before = '';\n                let after = '';\n\n                for (const key of codeHooks) {\n                    const value = hooks?.main?.[key];\n                    if (value && key.endsWith(suffix)) {\n                        if (key.startsWith('codeBefore'))\n                            before = dedent(value());\n                        else\n                            after = dedent(value());\n                    }\n                }\n\n                if (before || after) {\n                    createOverload(\n                        module,\n                        `r${suffix.slice(1)}`,\n                        before,\n                        after,\n                    );\n                }\n\n                let beforeCB, afterCB;\n                // ignore onReady and onWorker\n                for (let i = 2; i < jsHooks.length; i++) {\n                    const key = jsHooks[i];\n                    const value = hooks?.main?.[key];\n                    if (value && key.endsWith(suffix)) {\n                        if (key.startsWith('onBefore'))\n                            beforeCB = value;\n                        else\n                            afterCB = value;\n                    }\n                }\n                polluteJS(module, resolved, node, suffix.endsWith('Async'), beforeCB, afterCB);\n            }\n\n            details.queue = details.queue.then(() => {\n                resolve(resolved);\n                if (error) onerror?.(error, node);\n                return hooks?.main?.onReady?.(resolved, node);\n            });\n        }\n    }\n};\n\n/**\n * @type {Map<string, {options:object, known:WeakSet<Element>}>}\n */\nconst registry = new Map();\n\n/**\n * @typedef {Object} CustomOptions custom configuration\n * @prop {'pyodide' | 'micropython' | 'ruby-wasm-wasi' | 'wasmoon'} interpreter the interpreter to use\n * @prop {string} [version] the optional interpreter version to use\n * @prop {string} [config] the optional config to use within such interpreter\n */\n\nlet dontBotherCount = 0;\n\n/**\n * Allows custom types and components on the page to receive interpreters to execute any code\n * @param {string} type the unique `<script type=\"...\">` identifier\n * @param {CustomOptions} options the custom type configuration\n */\nexport const define = (type, options) => {\n    // allow no-type to be bootstrapped out of the box\n    let dontBother = type == null;\n\n    if (dontBother)\n        type = `_ps${dontBotherCount++}`;\n    else if (defaultRegistry.has(type) || registry.has(type))\n        throw new Error(`<script type=\"${type}\"> already registered`);\n\n    if (!defaultRegistry.has(options?.interpreter))\n        throw new Error('Unspecified interpreter');\n\n    // allows reaching out the interpreter helpers on events\n    defaultRegistry.set(type, defaultRegistry.get(options.interpreter));\n\n    // allows selector -> registry by type\n    const selectors = [`script[type=\"${type}\"]`];\n\n    // ensure a Promise can resolve once a custom type has been bootstrapped\n    whenDefined(type);\n\n    if (dontBother) {\n        // add a script then cleanup everything once that's ready\n        const { hooks } = options;\n        const onReady = hooks?.main?.onReady;\n        options = {\n            ...options,\n            hooks: {\n                ...hooks,\n                main: {\n                    ...hooks?.main,\n                    onReady(resolved, node) {\n                        CUSTOM_SELECTORS.splice(CUSTOM_SELECTORS.indexOf(type), 1);\n                        defaultRegistry.delete(type);\n                        registry.delete(type);\n                        waitList.delete(type);\n                        node.remove();\n                        onReady?.(resolved);\n                    }\n                }\n            },\n        };\n        document.head.append(\n            assign(document.createElement('script'), { type })\n        );\n    }\n    else {\n        selectors.push(`${type}-script`);\n        prefixes.push(`${type}-`);\n    }\n\n    for (const selector of selectors) types.set(selector, type);\n    CUSTOM_SELECTORS.push(...selectors);\n\n    // ensure always same env for this custom type\n    registry.set(type, {\n        options: assign({ env: type }, options),\n        known: new WeakSet(),\n        queue: Promise.resolve(),\n    });\n\n    if (!dontBother) addAllListeners(document);\n    $$(selectors.join(',')).forEach(handleCustomType);\n};\n\n/**\n * Resolves whenever a defined custom type is bootstrapped on the page\n * @param {string} type the unique `<script type=\"...\">` identifier\n * @returns {Promise<object>}\n */\nexport const whenDefined = (type) => {\n    if (!waitList.has(type)) waitList.set(type, Promise.withResolvers());\n    return waitList.get(type).promise;\n};\n/* c8 ignore stop */\n","/** @typedef {(type: string, options: import(\"./custom.js\").CustomOptions) => void} CustomOptions */\n\nimport stickyModule from 'sticky-module';\nimport { $$ } from 'basic-devtools';\n\nimport { handle } from './script-handler.js';\nimport { assign } from './utils.js';\nimport { selectors, prefixes } from './interpreters.js';\nimport { listener, addAllListeners } from './listeners.js';\n\nimport {\n    CUSTOM_SELECTORS,\n    handleCustomType,\n    customObserver as $customObserver,\n    define as $define,\n    whenDefined as $whenDefined\n} from './custom.js';\n\nimport { env as $env } from './listeners.js';\nimport { Hook as $Hook, XWorker as $XWorker } from './xworker.js';\n\n// avoid multiple initialization of the same library\nconst [\n    {\n        customObserver,\n        define,\n        whenDefined,\n        env,\n        Hook,\n        XWorker\n    },\n    alreadyLive\n] = stickyModule(\n    'polyscript',\n    {\n        customObserver: $customObserver,\n        define: $define,\n        whenDefined: $whenDefined,\n        env: $env,\n        Hook: $Hook,\n        XWorker: $XWorker\n    }\n);\n\nexport {\n    customObserver,\n    define,\n    whenDefined,\n    env,\n    Hook,\n    XWorker\n};\n\nexport * from './errors.js';\n\n\nif (!alreadyLive) {\n    const mo = new MutationObserver((records) => {\n        const selector = selectors.join(',');\n        for (const { type, target, attributeName, addedNodes } of records) {\n            // attributes are tested via integration / e2e\n            /* c8 ignore start */\n            if (type === 'attributes') {\n                const i = attributeName.lastIndexOf('-') + 1;\n                if (i) {\n                    const prefix = attributeName.slice(0, i);\n                    for (const p of prefixes) {\n                        if (prefix === p) {\n                            const type = attributeName.slice(i);\n                            if (type !== 'env') {\n                                const method = target.hasAttribute(attributeName)\n                                    ? 'add'\n                                    : 'remove';\n                                target[`${method}EventListener`](type, listener);\n                            }\n                            break;\n                        }\n                    }\n                }\n                continue;\n            }\n            for (const node of addedNodes) {\n                if (node.nodeType === 1) {\n                    addAllListeners(node);\n                    if (selector && node.matches(selector)) handle(node);\n                    else bootstrap(selector, node, true);\n                }\n            }\n            /* c8 ignore stop */\n        }\n    });\n\n    /* c8 ignore start */\n    const bootstrap = (selector, node, shouldHandle) => {\n        if (selector) $$(selector, node).forEach(handle);\n        selector = CUSTOM_SELECTORS.join(',');\n        if (selector) {\n            if (shouldHandle) handleCustomType(node);\n            $$(selector, node).forEach(handleCustomType);\n        }\n    };\n    /* c8 ignore stop */\n\n    const observe = (root) => {\n        mo.observe(root, { childList: true, subtree: true, attributes: true });\n        return root;\n    };\n\n    const { attachShadow } = Element.prototype;\n    assign(Element.prototype, {\n        attachShadow(init) {\n            return observe(attachShadow.call(this, init));\n        },\n    });\n\n    // give 3rd party a chance to apply changes before this happens\n    queueMicrotask(() => {\n        addAllListeners(observe(document));\n        bootstrap(selectors.join(','), document, false);\n    });\n\n}\n"],"names":["$$","css","root","document","querySelectorAll","$x","path","xpath","XPathEvaluator","createExpression","evaluate","XPathResult","ORDERED_NODE_SNAPSHOT_TYPE","result","i","snapshotLength","push","snapshotItem","d","Object","getOwnPropertyDescriptors","Response","prototype","isFunction","value","handler","get","p","k","hasOwnProperty","then","r","args","bypass","bind","direct","fetch$1","input","init","Proxy","fetch","workers","Map","map","name","has","set","Promise","withResolvers","ignore","Set","workersHandler","freeze","_","promise","w","sync","env","self","globalThis","deserialize","serialized","$","as","out","index","unpair","type","arr","object","key","Date","source","flags","RegExp","add","message","BigInt","deserializer","EMPTY","toString","keys","typeOf","asString","call","slice","includes","shouldSkip","TYPE","serialize","json","lossy","strict","pair","entry","TypeError","valueOf","toJSON","entries","toISOString","serializer","parse","$parse","stringify","$stringify","JSON","options","str","any","ARRAY","FUNCTION","NULL","NUMBER","OBJECT","STRING","SYMBOL","UNDEFINED","uid","ids","values","id","hold","ArrayBuffer","Atomics","$Atomics","isArray","Array","create","getPrototypeOf","TypedArray","Int32Array","views","extend","Class","SharedArrayBuffer","constructor","rest","super","this","ignoreList","WeakSet","ignorePatch","isChannel","event","channel","data","yes","at","stopImmediatePropagation","preventDefault","isObject","transferred","WeakMap","transferViews","transfer","visited","waitAsyncPatch","resolve","Worker","onmessage","postMessage","actionWait","view","currentTarget","origin","lastEventId","ports","dispatchEvent","MessageEvent","dispatch","BigInt64Array","polyfill","asModule","url","waitAsync","CHANNEL","crypto","randomUUID","addListener","addEventListener","register","serviceWorker","s","sw","done","c","join","delete","getRegistration","ready","controller","installing","waiting","active","state","location","reload","once","notify","worker","getData","known","waitAsyncPoly","URL","href","navigator","ACTION","_view","_id","_index","length","actionNotify","size","postData","BYTES_PER_ELEMENT","I32_BYTES","UI16_BYTES","Uint16Array","decoder","TextDecoder","buffers","seppuku","invoke","i32View","isSync","transform","deadlock","timer","setTimeout","console","warn","pop","sb","clearTimeout","bytes","ui16a","buffer","sub","subarray","decode","coincident$1","waitLength","async","callback","results","actionLength","$Worker","proxy","details","cb","createProxy","Error","charCodeAt","actionFill","numeric","fromEntries","OWN_KEYS","DESTRUCT","ownKeys","Reflect","Symbol","filter","toSymbol","keyFor","MAIN","WORKER","registry","FinalizationRegistry","onGarbageCollected","held","debug","String","nullHandler","return","token","target","EventTarget","eventsHandler","defineProperty","listener","concat","re","place","q","f","exports","coincident","toEntry","__worker__","proxies","onGC","ref","fromEntry","numericTYPE","fn","deref","Event","methods","method","handleEvent","WeakRef","startsWith","for","symbol","fromSymbol","TRAP","a","b","had","drop","descriptor","asEntry","reject","dedent","string","t","l","arguments","content","line","split","trim","test","replace","$1","es","unes","cape","m","io","stdio","context","localIO","buffered","stderr","error","stdout","log","engine","interpreter","EOL","maybeUI8","Uint8Array","splice","tpl","unescape","un","assign","defineProperties","all","absoluteURL","base","nodeInfo","node","tag","tagName","what","CE","CustomEvent","bubbles","detail","createResolved","module","config","run","code","runAsync","runEvent","dropLine0","createOverload","before","after","js_modules","jsModules","JSModules","field","modules","registerJSModules","registerJSModule","importJS","import","esm","importCSS","onload","onerror","querySelector","head","append","createElement","rel","isCSS","pathname","RUNNING_IN_WORKER","window","writeFile","FS","PATH","PATH_FS","absPath","dirPath","dirname","mkdirTree","canOwn","tree","current","branch","mkdir","cwd","joinPaths","parts","res","part","fetchBuffer","baseURL","arrayBuffer","fetchPaths","config_fetch","files","to_file","from","undefined","endsWith","flatMap","to_folder","file","filename","lastIndexOf","calculateFetchPaths","fillName","dest","parseTemplate","src","SyntaxError","fetchFiles","config_files","targets","sourceDest","calculateFilesPaths","fetchJSModules","main","promises","STORAGE","READONLY","READWRITE","defaultOptions","durability","prefix","IDBMap","db","transaction","how","onsuccess","objectStore","indexedDB","open","onupgradeneeded","objectStoreNames","createObjectStore","oncomplete","boundDispatch","isTrusted","close","store","count","clear","forEach","getKey","getAllKeys","put","toStringTag","IDBMapSync","queue","loader","lazy_py_modules","packages","pyimport","storage","registerJsModule","getFormat","runPython","runPythonAsync","globals","mip","TextEncoder","encode","toml","text","micropython","version","loadMicroPython","linebuffer","py_imports","importPackages","PyProxy","toJs","_module","fs","format","extractDir","blob","Blob","BlobReader","Uint8ArrayWriter","ZipReader","zipReader","getEntries","directory","TMP","mpyPackage","install","toJsOptions","dict_converter","overrideFunction","overrideMethod","overridden","applyOverride","destroy","patchArgs","copy","Function","apply","pyodide","loadPyodide","experimental_create_proxy","indexURL","ffi","unpackArchive","loadPackage","micropip","keep_going","jsType","ruby_wasm_wasi","experimental","DefaultRubyVM","WebAssembly","compile","vm","eval","evalAsync","wrap","wasmoon","LuaFactory","LuaLibraries","createEngine","global","getTable","Base","setField","doStringSync","doString","cmodule","writeFileShim","shelter","output","captureR","webr","WebR","Shelter","evalRVoid","configs","selectors","prefixes","getConfigURLAndType","configURL","parseString","getRuntime","absolute","getRuntimeID","toJSONCallback","isAsync","beforeRun","afterRun","js","patch","resolved","polluteJS","patched","Hook$1","hooks","onWorker","jsHooks","codeHooks","xworker","createObjectURL","service_worker","isHook","Hook","resolver","bootstrap","writable","configurable","isError","INVALID_CONTENT","INVALID_SRC_ATTR","INVALID_WORKER_ATTR","workerURL","element","attributes","childElementCount","innerHTML","localName","textContent","queryTarget","script","idOrSelector","parent","parentNode","getRoot","getElementById","targetDescriptor","handle","handled","interpreters","getValue","getDetails","runtime","XWorker","$xworker","closest","body","wn","versionValue","configValue","workerName","targetValue","currentScript","execute","queueMicrotask","awaitInterpreter","available","ownerElement","el","getAttribute","addAllListeners","disabled","CUSTOM_SELECTORS","customObserver","types","waitList","handleCustomType","selector","matches","XW","custom","hasAttribute","workerError","defaultRegistry","hook","structuredClone","suffix","beforeCB","afterCB","onReady","dontBotherCount","whenDefined","define","alreadyLive","stickyModule","$customObserver","dontBother","indexOf","remove","$whenDefined","$env","$Hook","$XWorker","mo","MutationObserver","records","attributeName","addedNodes","nodeType","shouldHandle","observe","childList","subtree","attachShadow","Element"],"mappings":"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","x_google_ignoreList":[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25,26,30,31,42]}
\ No newline at end of file
+{"version":3,"file":"index.js","sources":["../node_modules/sticky-module/esm/index.js","../node_modules/basic-devtools/esm/index.js","../node_modules/@webreflection/fetch/esm/index.js","../esm/workers.js","../node_modules/@ungap/structured-clone/esm/deserialize.js","../node_modules/@ungap/structured-clone/esm/types.js","../node_modules/@ungap/structured-clone/esm/serialize.js","../node_modules/@ungap/structured-clone/esm/json.js","../node_modules/proxy-target/esm/types.js","../node_modules/js-proxy/esm/heap.js","../node_modules/sabayon/src/shared.js","../node_modules/sabayon/src/main.js","../node_modules/coincident/src/shared.js","../node_modules/coincident/src/main.js","../node_modules/coincident/src/window/types.js","../node_modules/proxy-target/esm/traps.js","../node_modules/js-proxy/esm/traps.js","../node_modules/coincident/src/window/symbol.js","../node_modules/coincident/src/window/constants.js","../node_modules/gc-hook/esm/index.js","../node_modules/coincident/src/window/events.js","../node_modules/coincident/src/window/main.js","../esm/worker/xworker.js","../esm/interpreter/_io.js","../esm/interpreter/dummy.js","../node_modules/@ungap/with-resolvers/index.js","../node_modules/codedent/esm/index.js","../node_modules/plain-tag/esm/index.js","../node_modules/html-escaper/esm/index.js","../esm/utils.js","../esm/interpreter/_utils.js","../node_modules/@webreflection/idb-map/index.js","../node_modules/@webreflection/idb-map/sync.js","../esm/interpreter/_python.js","../esm/python/mip.js","../esm/3rd-party.js","../esm/interpreter/micropython.js","../esm/interpreter/pyodide.js","../esm/interpreter/ruby-wasm-wasi.js","../esm/interpreter/wasmoon.js","../esm/interpreter/webr.js","../esm/interpreters.js","../esm/loader.js","../node_modules/to-json-callback/esm/index.js","../esm/hooks.js","../esm/worker/hook.js","../esm/worker/class.js","../esm/errors.js","../esm/worker/url.js","../esm/script-handler.js","../esm/listeners.js","../esm/xworker.js","../esm/custom.js","../esm/index.js"],"sourcesContent":["/**\n * Allow leaking a module globally to help avoid conflicting exports\n * if the module might have been re-bundled in other projects.\n * @template T\n * @param {string} name the module name to save or retrieve\n * @param {T} value the module as value to save if not known\n * @param {globalThis} [global=globalThis] the reference where modules are saved where `globalThis` is the default\n * @returns {[T, boolean]} the passed `value` or the previous one as first entry, a boolean indicating if it was known or not\n */\nconst stickyModule = (name, value, global = globalThis) => {\n  const symbol = Symbol.for(name);\n  const known = symbol in global;\n  return [\n    known ?\n      global[symbol] :\n      Object.defineProperty(global, symbol, { value })[symbol],\n    known\n  ];\n};\n\nexport default stickyModule;\n","/**\n * Given a CSS selector, returns the first matching node, if any.\n * @param {string} css the CSS selector to query\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Element?} the found element, if any\n */\nconst $ = (css, root = document) => root.querySelector(css);\n\n/**\n * Given a CSS selector, returns a list of all matching nodes.\n * @param {string} css the CSS selector to query\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Element[]} a list of found nodes\n */\nconst $$ = (css, root = document) => [...root.querySelectorAll(css)];\n\n/**\n * Given a XPath selector, returns a list of all matching nodes.\n * @param {string} path the XPath selector to evaluate\n * @param {Document | DocumentFragment | Element} [root] the optional parent node to query\n * @returns {Node[]} a list of found nodes (elements, attributes, text, comments)\n */\nconst $x = (path, root = document) => {\n  const expression = (new XPathEvaluator).createExpression(path);\n  const xpath = expression.evaluate(root, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);\n  const result = [];\n  for (let i = 0, {snapshotLength} = xpath; i < snapshotLength; i++)\n    result.push(xpath.snapshotItem(i));\n  return result;\n};\n\nexport {$, $$, $x};\n","// a bit terser code than I usually write but it's 10 LOC within 80 cols\n// if you are struggling to follow the code you can replace 1-char\n// references around with the following one, hoping that helps :-)\n\n// d => descriptors\n// k => key\n// p => promise\n// r => response\n\nconst d = Object.getOwnPropertyDescriptors(Response.prototype);\n\nconst isFunction = value => typeof value === 'function';\n\nconst bypass = (p, k, { get, value }) => get || !isFunction(value) ?\n                p.then(r => r[k]) :\n                (...args) => p.then(r => r[k](...args));\n\nconst direct = (p, value) => isFunction(value) ? value.bind(p) : value;\n\nconst handler = {\n    get: (p, k) => d.hasOwnProperty(k) ? bypass(p, k, d[k]) : direct(p, p[k])\n};\n\n/**\n * @param {RequestInfo | URL} input\n * @param  {...RequestInit} init\n * @returns {Promise<Response> & Response}\n */\nexport default (input, ...init) => new Proxy(fetch(input, ...init), handler);\n","// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const workers = new Proxy(new Map, {\n  get(map, name) {\n    if (!map.has(name))\n      map.set(name, Promise.withResolvers());\n    return map.get(name);\n  },\n});\n\n// filter out forever pending Promises in Pyodide\n// @issue https://github.com/pyscript/pyscript/issues/2106\nconst ignore = new Set(['__dict__', 'constructor', 'get', 'has', 'includes', 'next', 'set', 'then']);\n\nexport const workersHandler = new Proxy(Object.freeze({}), {\n  // guard against forever pending Promises in Pyodide\n  // @issue https://github.com/pyscript/pyscript/issues/2106\n  get: (_, name) => (typeof name === 'string' && !ignore.has(name)) ?\n    workers[name].promise.then(w => w.sync) :\n    void 0,\n});\n/* c8 ignore stop */\n","import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst env = typeof self === 'object' ? self : globalThis;\n\nconst deserializer = ($, _) => {\n  const as = (out, index) => {\n    $.set(index, out);\n    return out;\n  };\n\n  const unpair = index => {\n    if ($.has(index))\n      return $.get(index);\n\n    const [type, value] = _[index];\n    switch (type) {\n      case PRIMITIVE:\n      case VOID:\n        return as(value, index);\n      case ARRAY: {\n        const arr = as([], index);\n        for (const index of value)\n          arr.push(unpair(index));\n        return arr;\n      }\n      case OBJECT: {\n        const object = as({}, index);\n        for (const [key, index] of value)\n          object[unpair(key)] = unpair(index);\n        return object;\n      }\n      case DATE:\n        return as(new Date(value), index);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as(new RegExp(source, flags), index);\n      }\n      case MAP: {\n        const map = as(new Map, index);\n        for (const [key, index] of value)\n          map.set(unpair(key), unpair(index));\n        return map;\n      }\n      case SET: {\n        const set = as(new Set, index);\n        for (const index of value)\n          set.add(unpair(index));\n        return set;\n      }\n      case ERROR: {\n        const {name, message} = value;\n        return as(new env[name](message), index);\n      }\n      case BIGINT:\n        return as(BigInt(value), index);\n      case 'BigInt':\n        return as(Object(BigInt(value)), index);\n    }\n    return as(new env[type](value), index);\n  };\n\n  return unpair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns a deserialized value from a serialized array of Records.\n * @param {Record[]} serialized a previously serialized value.\n * @returns {any}\n */\nexport const deserialize = serialized => deserializer(new Map, serialized)(0);\n","export const VOID       = -1;\nexport const PRIMITIVE  = 0;\nexport const ARRAY      = 1;\nexport const OBJECT     = 2;\nexport const DATE       = 3;\nexport const REGEXP     = 4;\nexport const MAP        = 5;\nexport const SET        = 6;\nexport const ERROR      = 7;\nexport const BIGINT     = 8;\n// export const SYMBOL = 9;\n","import {\n  VOID, PRIMITIVE,\n  ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst EMPTY = '';\n\nconst {toString} = {};\nconst {keys} = Object;\n\nconst typeOf = value => {\n  const type = typeof value;\n  if (type !== 'object' || !value)\n    return [PRIMITIVE, type];\n\n  const asString = toString.call(value).slice(8, -1);\n  switch (asString) {\n    case 'Array':\n      return [ARRAY, EMPTY];\n    case 'Object':\n      return [OBJECT, EMPTY];\n    case 'Date':\n      return [DATE, EMPTY];\n    case 'RegExp':\n      return [REGEXP, EMPTY];\n    case 'Map':\n      return [MAP, EMPTY];\n    case 'Set':\n      return [SET, EMPTY];\n  }\n\n  if (asString.includes('Array'))\n    return [ARRAY, asString];\n\n  if (asString.includes('Error'))\n    return [ERROR, asString];\n\n  return [OBJECT, asString];\n};\n\nconst shouldSkip = ([TYPE, type]) => (\n  TYPE === PRIMITIVE &&\n  (type === 'function' || type === 'symbol')\n);\n\nconst serializer = (strict, json, $, _) => {\n\n  const as = (out, value) => {\n    const index = _.push(out) - 1;\n    $.set(value, index);\n    return index;\n  };\n\n  const pair = value => {\n    if ($.has(value))\n      return $.get(value);\n\n    let [TYPE, type] = typeOf(value);\n    switch (TYPE) {\n      case PRIMITIVE: {\n        let entry = value;\n        switch (type) {\n          case 'bigint':\n            TYPE = BIGINT;\n            entry = value.toString();\n            break;\n          case 'function':\n          case 'symbol':\n            if (strict)\n              throw new TypeError('unable to serialize ' + type);\n            entry = null;\n            break;\n          case 'undefined':\n            return as([VOID], value);\n        }\n        return as([TYPE, entry], value);\n      }\n      case ARRAY: {\n        if (type)\n          return as([type, [...value]], value);\n  \n        const arr = [];\n        const index = as([TYPE, arr], value);\n        for (const entry of value)\n          arr.push(pair(entry));\n        return index;\n      }\n      case OBJECT: {\n        if (type) {\n          switch (type) {\n            case 'BigInt':\n              return as([type, value.toString()], value);\n            case 'Boolean':\n            case 'Number':\n            case 'String':\n              return as([type, value.valueOf()], value);\n          }\n        }\n\n        if (json && ('toJSON' in value))\n          return pair(value.toJSON());\n\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const key of keys(value)) {\n          if (strict || !shouldSkip(typeOf(value[key])))\n            entries.push([pair(key), pair(value[key])]);\n        }\n        return index;\n      }\n      case DATE:\n        return as([TYPE, value.toISOString()], value);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as([TYPE, {source, flags}], value);\n      }\n      case MAP: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const [key, entry] of value) {\n          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))\n            entries.push([pair(key), pair(entry)]);\n        }\n        return index;\n      }\n      case SET: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const entry of value) {\n          if (strict || !shouldSkip(typeOf(entry)))\n            entries.push(pair(entry));\n        }\n        return index;\n      }\n    }\n\n    const {message} = value;\n    return as([TYPE, {name: type, message}], value);\n  };\n\n  return pair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} value a serializable value.\n * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,\n *  if `true`, will not throw errors on incompatible types, and behave more\n *  like JSON stringify would behave. Symbol and Function will be discarded.\n * @returns {Record[]}\n */\n export const serialize = (value, {json, lossy} = {}) => {\n  const _ = [];\n  return serializer(!(json || lossy), !!json, new Map, _)(value), _;\n};\n","/*! (c) Andrea Giammarchi - ISC */\n\nimport {deserialize} from './deserialize.js';\nimport {serialize} from './serialize.js';\n\nconst {parse: $parse, stringify: $stringify} = JSON;\nconst options = {json: true, lossy: true};\n\n/**\n * Revive a previously stringified structured clone.\n * @param {string} str previously stringified data as string.\n * @returns {any} whatever was previously stringified as clone.\n */\nexport const parse = str => deserialize($parse(str));\n\n/**\n * Represent a structured clone value as string.\n * @param {any} any some clone-able value to stringify.\n * @returns {string} the value stringified.\n */\nexport const stringify = any => $stringify(serialize(any, options));\n","export const ARRAY     = 'array';\nexport const BIGINT    = 'bigint';\nexport const BOOLEAN   = 'boolean';\nexport const FUNCTION  = 'function';\nexport const NULL      = 'null';\nexport const NUMBER    = 'number';\nexport const OBJECT    = 'object';\nexport const STRING    = 'string';\nexport const SYMBOL    = 'symbol';\nexport const UNDEFINED = 'undefined';\n","import { NUMBER } from 'proxy-target/types';\n\nlet uid = 0;\nconst ids = new Map;\nconst values = new Map;\n\n/**\n * Remove by id or value any previously stored reference.\n * @param {number | unknown} id the held value by id or the value itself.\n * @returns {boolean} `true` if the operation was successful, `false` otherwise.\n */\nexport const drop = id => {\n  const [a, b] = typeof id === NUMBER ? [values, ids] : [ids, values];\n  const had = a.has(id);\n  if (had) {\n    b.delete(a.get(id));\n    a.delete(id);\n  }\n  return had;\n};\n\n/**\n * Return the held value reference by its unique identifier.\n * @param {number} id the unique identifier for the value reference.\n * @returns {unknown} the related value / reference or undefined.\n */\nexport const get = id => values.get(id);\n\n/**\n * Create once a unique number id for a generic value reference.\n * @param {unknown} value a reference used to create a unique identifier.\n * @returns {number} a unique identifier for that reference.\n */\nexport const hold = value => {\n  if (!ids.has(value)) {\n    let id;\n    // a bit apocalyptic scenario but if this thread runs forever\n    // and the id does a whole int32 roundtrip we might have still\n    // some reference dangling around\n    while (/* c8 ignore next */ values.has(id = uid++));\n    ids.set(value, id);\n    values.set(id, value);\n  }\n  return ids.get(value);\n};\n","// (c) Andrea Giammarchi - MIT\n\nconst ACTION_INIT = 0;\nconst ACTION_NOTIFY = 1;\nconst ACTION_WAIT = 2;\nconst ACTION_SW = 3;\n\nconst { ArrayBuffer, Atomics: $Atomics, Promise } = globalThis;\nconst { isArray } = Array;\nconst { create, getPrototypeOf, values } = Object;\n\nconst TypedArray = getPrototypeOf(Int32Array);\nconst Atomics = create($Atomics);\n\nconst dispatch = ({ currentTarget, type, origin, lastEventId, source, ports }, data) =>\n  currentTarget.dispatchEvent(new MessageEvent(type, { data, origin, lastEventId, source, ports }));\n\nconst withResolvers = () => Promise.withResolvers();\n\nlet id = 0;\nconst views = new Map;\nconst extend = (Class, SharedArrayBuffer) => class extends Class {\n  constructor(value, ...rest) {\n    super(value, ...rest);\n    if (value instanceof SharedArrayBuffer)\n      views.set(this, [id++, 0, withResolvers()]);\n  }\n};\n\nconst ignoreList = new WeakSet;\n\n/**\n * @template {T}\n * @callback PassThrough\n * @param {T} value\n * @returns {T}\n */\n\n/** @type {PassThrough} */\nconst ignoreDirect = value => value;\n\n/** @type {PassThrough} */\nconst ignorePatch = value => {\n  ignoreList.add(value);\n  return value;\n};\n\nconst isChannel = (event, channel) => {\n  const { data } = event;\n  const yes = isArray(data) && (\n    data.at(0) === channel ||\n    (data.at(1) === ACTION_INIT && !channel)\n  );\n  if (yes) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  }\n  return yes;\n};\n\nconst isObject = value => (\n  value !== null &&\n  typeof value === 'object' &&\n  !ignoreList.has(value)\n);\n\nconst transferred = new WeakMap;\nconst transferViews = (data, transfer, visited) => {\n  if (views.has(data))\n    transfer.set(data, views.get(data)[0]);\n  else if (!(data instanceof TypedArray || data instanceof ArrayBuffer)) {\n    for (const value of values(data)) {\n      if (isObject(value) && !visited.has(value)) {\n        visited.add(value);\n        transferViews(value, transfer, visited);\n      }\n    }\n  }\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync#browser_compatibility\nconst waitAsyncPatch = (...args) => ({\n  value: new Promise(resolve => {\n    // encodeURIComponent('onmessage=e=>postMessage(!Atomics.wait(...e.data))')\n    let w = new Worker('data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))');\n    w.onmessage = () => resolve('ok');\n    w.postMessage(args);\n  })\n});\n\nconst waitAsyncPoly = (view, index) => {\n  const value = views.get(view), [id, _, { promise }] = value;\n  value[1] = index;\n  return [id, promise];\n};\n\nconst actionNotify = (_view, _id, _index) => {\n  for (const [view, [id, index, { resolve }]] of views) {\n    if (_id === id && _index === index) {\n      for (let i = 0; i < _view.length; i++) view[i] = _view[i];\n      views.delete(view);\n      resolve('ok');\n      break;\n    }\n  }\n};\n\nconst actionWait = (event, transfer, data) => {\n  for (const [view, id] of transfer)\n    transferred.set(view, [id, event.currentTarget]);\n  dispatch(event, data);\n};\n\nconst postData = (CHANNEL, data) => {\n  const transfer = new Map;\n  if (isObject(data)) transferViews(data, transfer, new Set);\n  return transfer.size ? [CHANNEL, ACTION_WAIT, transfer, data] : data;\n};\n\nconst getData = view => transferred.get(view);\n\nexport {\n  ACTION_INIT, ACTION_NOTIFY, ACTION_WAIT, ACTION_SW,\n\n  ArrayBuffer, Atomics, TypedArray,\n\n  actionNotify, actionWait,\n  getData, postData,\n  ignoreDirect, ignorePatch,\n  waitAsyncPatch, waitAsyncPoly,\n\n  dispatch,\n  extend,\n  isChannel,\n  views,\n  withResolvers,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  ACTION_INIT, ACTION_NOTIFY, ACTION_WAIT, ACTION_SW,\n\n  ArrayBuffer, Atomics,\n\n  actionNotify, actionWait,\n  getData, postData,\n  ignoreDirect, ignorePatch,\n  waitAsyncPatch, waitAsyncPoly,\n\n  extend,\n  isChannel,\n  withResolvers,\n} from './shared.js';\n\nlet {\n  BigInt64Array,\n  Int32Array,\n  SharedArrayBuffer,\n  Worker,\n} = globalThis;\n\nlet ignore = ignoreDirect;\nlet polyfill = false;\n\nconst asModule = options => ({ ...options, type: 'module' });\n\ntry {\n  new SharedArrayBuffer(4);\n\n  Worker = class extends Worker {\n    constructor(url, options) {\n      super(url, asModule(options));\n    }\n  }\n\n  if (!Atomics.waitAsync)\n    Atomics.waitAsync = waitAsyncPatch;\n}\ncatch (_) {\n  const CHANNEL = crypto.randomUUID();\n\n  const sync = new Map;\n\n  const addListener = (self, type, handler, ...rest) => {\n    self.addEventListener(type, handler, ...rest);\n  };\n\n  const register = ({ serviceWorker: s }, sw, done) => {\n    let w, c = true;\n    addListener(s, 'message', event => {\n      if (isChannel(event, CHANNEL)) {\n        const [_, id, index] = event.data;\n        const uid = [id, index].join(',');\n        const done = view => {\n          sync.delete(uid);\n          w.postMessage([ CHANNEL, id, index, view ]);\n        };\n        const view = sync.get(uid);\n        if (view) done(view);\n        else {\n          const { promise, resolve } = withResolvers();\n          sync.set(uid, resolve);\n          promise.then(done);\n        }\n      }\n    });\n    // use previous registration, if any, before registering it\n    s.getRegistration(sw)\n      .then(r => (r ?? s.register(sw)))\n      .then(function ready(r) {\n        c = c && !!s.controller;\n        w = (r.installing || r.waiting || r.active);\n        if (w.state === 'activated') {\n          if (c) done();\n          else location.reload();\n        }\n        else\n          addListener(w, 'statechange', () => ready(r), { once: true });\n      });\n  };\n\n  ignore = ignorePatch;\n  polyfill = true;\n\n  Atomics.notify = (view, index) => {\n    const [id, worker] = getData(view);\n    const uid = [id, index].join(',');\n    const known = sync.get(uid);\n    if (known) known(view);\n    else sync.set(uid, view);\n    worker.postMessage([CHANNEL, ACTION_NOTIFY, view, id, index]);\n    return 0;\n  };\n\n  Atomics.waitAsync = (view, ...rest) => {\n    const [_, value] = waitAsyncPoly(view, ...rest);\n    return { value };\n  };\n\n  SharedArrayBuffer = class extends ArrayBuffer {}\n  BigInt64Array = extend(BigInt64Array, SharedArrayBuffer);\n  Int32Array = extend(Int32Array, SharedArrayBuffer);\n\n  let serviceWorker = null;\n  Worker = class extends Worker {\n    constructor(url, options) {\n      let sw = options?.serviceWorker || '';\n      if (sw) {\n        sw = new URL(sw, location.href).href;\n        options = { ...options, serviceWorker: sw };\n        if (!serviceWorker) {\n          const { promise, resolve } = withResolvers();\n          register(navigator, sw, resolve);\n          serviceWorker = promise;\n        }\n        serviceWorker.then(\n          () => super.postMessage([CHANNEL, ACTION_SW])\n        );\n      }\n      super(url, asModule(options));\n      super.postMessage([CHANNEL, ACTION_INIT, options]);\n      addListener(this, 'message', event => {\n        if (isChannel(event, CHANNEL)) {\n          const [_, ACTION, ...rest] = event.data;\n          switch (ACTION) {\n            case ACTION_NOTIFY: {\n              actionNotify(...rest);\n              break;\n            }\n            case ACTION_WAIT: {\n              actionWait(event, ...rest);\n              break;\n            }\n          }\n        }\n      });\n    }\n    postMessage(data, ...rest) {\n      return super.postMessage(postData(CHANNEL, data), ...rest);\n    }\n  }\n}\n\nexport {\n  /** @type {globalThis.Atomics} */ Atomics,\n  /** @type {globalThis.BigInt64Array} */ BigInt64Array,\n  /** @type {globalThis.Int32Array} */ Int32Array,\n  /** @type {globalThis.SharedArrayBuffer} */ SharedArrayBuffer,\n  /** @type {globalThis.Worker} */ Worker,\n  ignore,\n  polyfill,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  ACTION_INIT,\n  ACTION_NOTIFY,\n  ACTION_WAIT,\n  Atomics,\n  isChannel,\n  withResolvers,\n} from 'sabayon/shared';\n\nconst { BYTES_PER_ELEMENT: I32_BYTES } = Int32Array;\nconst { BYTES_PER_ELEMENT: UI16_BYTES } = Uint16Array;\n\nconst { notify } = Atomics;\n\nconst decoder = new TextDecoder('utf-16');\n\nconst buffers = new WeakSet;\n\nconst transfer = (...args) => (buffers.add(args), args);\n\nlet seppuku = '';\nconst actionLength = (stringify, transform) => async (callback, results, [name, id, sb, args, isSync]) => {\n  if (isSync) seppuku = name;\n  try {\n    const result = await callback(...args);\n    if (result !== void 0) {\n      const serialized = stringify(transform ? transform(result) : result);\n      results.set(id, serialized);\n      sb[1] = serialized.length;\n    }\n  }\n  finally {\n    if (isSync) seppuku = '';\n    sb[0] = 1;\n    notify(sb, 0);\n  }\n};\nconst actionFill = (results, [id, sb]) => {\n  const result = results.get(id);\n  results.delete(id);\n  for (let ui16a = new Uint16Array(sb.buffer), i = 0, { length } = result; i < length; i++)\n    ui16a[i] = result.charCodeAt(i);\n  notify(sb, 0);\n};\nconst actionWait = (waitLength, results, map, rest) => {\n  const [name] = rest;\n  const callback = map.get(name);\n  if (!callback) throw new Error(`Unknown proxy.${name}()`);\n  waitLength(callback, results, rest);\n};\n\nconst warn = (name, seppuku) => setTimeout(\n  console.warn,\n  1000,\n  `πŸ’€πŸ”’ - proxy.${name}() in proxy.${seppuku}()`\n);\n\nlet uid = 0;\nconst invoke = (\n  [\n    CHANNEL,\n    i32View,\n    ignore,\n    isSync,\n    parse,\n    polyfill,\n    postMessage,\n    transform,\n    waitAsync,\n  ],\n  name,\n) => (...args) => {\n  let deadlock = seppuku !== '', timer = 0;\n  if (deadlock) timer = warn(name, seppuku);\n  const id = uid++;\n  const transfer = [];\n  if (buffers.has(args.at(-1) || transfer))\n    buffers.delete(transfer = args.pop());\n  const data = ignore(transform ? args.map(transform) : args);\n  let sb = i32View(I32_BYTES * 2);\n  postMessage([CHANNEL, ACTION_WAIT, name, id, sb, data, isSync], { transfer });\n  return waitAsync(sb, 0).value.then(() => {\n    if (deadlock) clearTimeout(timer);\n    const length = sb[1];\n    if (!length) return;\n    const bytes = UI16_BYTES * length;\n    sb = i32View(bytes + (bytes % I32_BYTES));\n    postMessage([CHANNEL, ACTION_NOTIFY, id, sb]);\n    return waitAsync(sb, 0).value.then(() =>{\n      const ui16a = new Uint16Array(sb.buffer);\n      const sub = polyfill ? ui16a.subarray(0, length) : ui16a.slice(0, length);\n      return parse(decoder.decode(sub));\n    });\n  });\n};\n\nconst createProxy = (details, map) => new Proxy(map, {\n  get: (map, name) => {\n    let cb;\n    // the curse of potentially awaiting proxies in the wild\n    // requires this ugly guard around `then`\n    if (name !== 'then') {\n      cb = map.get(name);\n      if (!cb) {\n        cb = invoke(details, name);\n        map.set(name, cb);\n      }\n    }\n    return cb;\n  },\n  set: (map, name, callback) => (\n    name !== 'then' &&\n    !!map.set(name, callback)\n  ),\n});\n\nexport {\n  ACTION_INIT,\n  ACTION_WAIT,\n  ACTION_NOTIFY,\n\n  actionLength,\n  actionFill,\n  actionWait,\n\n  createProxy,\n\n  isChannel,\n  transfer,\n\n  withResolvers,\n};\n","// (c) Andrea Giammarchi - MIT\n\nimport {\n  Atomics,\n  Int32Array,\n  SharedArrayBuffer,\n  Worker as $Worker,\n  ignore,\n  polyfill,\n} from 'sabayon/main';\n\nimport {\n  ACTION_INIT,\n  ACTION_WAIT,\n  ACTION_NOTIFY,\n\n  actionLength,\n  actionFill,\n  actionWait,\n\n  createProxy,\n\n  isChannel,\n  transfer,\n} from './shared.js';\n\n/**\n * @typedef {Object} MainOptions\n * @prop {(text: string, ...args:any) => any} [parse=JSON.parse]\n * @prop {(value: any, ...args:any) => string} [stringify=JSON.stringify]\n * @prop {(value: any) => any} [transform]\n */\n\n/**\n * @callback Coincident\n * @param {MainOptions} [options]\n * @returns {{Worker: import('./ts.js').CoincidentWorker, polyfill: boolean, transfer: (...args: Transferable[]) => Transferable[]}}\n */\n\nexport default /** @type {Coincident} */ ({\n  parse,\n  stringify,\n  transform,\n} = JSON) => {\n  const waitLength = actionLength(stringify, transform);\n\n  const CHANNEL = crypto.randomUUID();\n\n  class Worker extends $Worker {\n    constructor(url, options) {\n      const map = new Map;\n      const results = new Map;\n      super(url, options);\n      this.proxy = createProxy(\n        [\n          CHANNEL,\n          bytes => new Int32Array(new SharedArrayBuffer(bytes)),\n          ignore,\n          false,\n          parse,\n          polyfill,\n          (...args) => this.postMessage(...args),\n          transform,\n          Atomics.waitAsync,\n        ],\n        map,\n      );\n      this.postMessage(ignore([CHANNEL, ACTION_INIT, options]));\n      this.addEventListener('message', event => {\n        if (isChannel(event, CHANNEL)) {\n          const [_, ACTION, ...rest] = event.data;\n          switch (ACTION) {\n            case ACTION_WAIT: {\n              actionWait(waitLength, results, map, rest);\n              break;\n            }\n            case ACTION_NOTIFY: {\n              actionFill(results, rest);\n              break;\n            }\n          }\n        }\n      });\n    }\n  }\n\n  return {\n    Worker,\n    polyfill,\n    transfer,\n  };\n};\n","import {\n  ARRAY,\n  BIGINT,\n  BOOLEAN,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n} from 'js-proxy/types';\n\n// this literal allows mapping right away\n// string types into numeric values so that\n// the transported and transformed arrays\n// would use less bytes to satisfy te same\n// contract while exchanging information.\n// basically this is an home-made ENUM like\n// object literal ... that's it.\n// TBD: should this be part of js-proxy? it feels\n//      to me like it would rather belong in there.\nexport default Object.fromEntries([\n  ARRAY,\n  BIGINT,\n  BOOLEAN,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n].map((k, i) => [k, i]));\n","export const APPLY                        = 'apply';\nexport const CONSTRUCT                    = 'construct';\nexport const DEFINE_PROPERTY              = 'defineProperty';\nexport const DELETE_PROPERTY              = 'deleteProperty';\nexport const GET                          = 'get';\nexport const GET_OWN_PROPERTY_DESCRIPTOR  = 'getOwnPropertyDescriptor';\nexport const GET_PROTOTYPE_OF             = 'getPrototypeOf';\nexport const HAS                          = 'has';\nexport const IS_EXTENSIBLE                = 'isExtensible';\nexport const OWN_KEYS                     = 'ownKeys';\nexport const PREVENT_EXTENSION            = 'preventExtensions';\nexport const SET                          = 'set';\nexport const SET_PROTOTYPE_OF             = 'setPrototypeOf';\n","export * from 'proxy-target/traps';\nexport const DESTRUCT = 'destruct';\nexport const VALUE_OF = 'valueOf';\n","import { OWN_KEYS } from 'js-proxy/traps';\nimport { SYMBOL } from 'js-proxy/types';\n\nconst { [OWN_KEYS]: ownKeys } = Reflect;\n\nconst known = new Map(\n  ownKeys(Symbol)\n    .filter(s => typeof Symbol[s] === SYMBOL)\n    .map(s => [Symbol[s], s])\n);\n\nexport const fromSymbol = value => {\n  if (value.startsWith('.'))\n    return Symbol.for(value.slice(1));\n  for (const [symbol, name] of known) {\n    if (name === value)\n      return symbol;\n  }\n};\n\nexport const toSymbol = value => (\n  known.get(value) ||\n  `.${Symbol.keyFor(value) || ''}`\n);\n","// ⚠️ AUTOMATICALLY GENERATED - DO NOT CHANGE\nconst CHANNEL = '42fb1e9a-1373-441e-813f-357c3deaee87';\nexport const MAIN = 'M' + CHANNEL;\nexport const WORKER = 'W' + CHANNEL;\n","// (c) Andrea Giammarchi - ISC\n\nconst registry = new FinalizationRegistry(\n  ([onGarbageCollected, held, debug]) => {\n    if (debug) console.debug(`Held value ${String(held)} not relevant anymore`);\n    onGarbageCollected(held);\n  }\n);\n\nconst nullHandler = Object.create(null);\n\n/**\n * @template {unknown} H\n * @typedef {Object} GCHookOptions\n * @prop {boolean} [debug=false] if `true`, logs values once these can get collected.\n * @prop {ProxyHandler<object>} [handler] optional proxy handler to use instead of the default one.\n * @prop {H} [return=H] if specified, overrides the returned proxy with its value.\n * @prop {unknown} [token=H] it's the held value by default, but it can be any other token except the returned value itself.\n */\n\n/**\n * @template {unknown} H\n * @param {H} hold the reference to hold behind the scene and passed along the callback once it triggers.\n * @param {(held:H) => void} onGarbageCollected the callback that will receive the held value once its wrapper or indirect reference is no longer needed.\n * @param {GCHookOptions<H>} [options] an optional configuration object to change some default behavior.\n */\nexport const create = (\n  hold,\n  onGarbageCollected,\n  { debug, handler, return: r, token = hold } = nullHandler\n) => {\n  // if no reference to return is defined,\n  // create a proxy for the held one and register that instead.\n  /** @type {H} */\n  const target = r || new Proxy(hold, handler || nullHandler);\n  const args = [target, [onGarbageCollected, hold, !!debug]];\n  if (token !== false) args.push(token);\n  // register the target reference in a way that\n  // the `onGarbageCollected(held)` callback will eventually notify.\n  registry.register(...args);\n  return target;\n};\n\n/**\n * If previously registered as either `token` or `hold` value, allow explicit removal of the entry in the registry.\n * @param {unknown} token the token used during registration. If no `token` was passed, this can be the same `hold` reference.\n * @returns {boolean} `true` if successfully unregistered.\n */\nexport const drop = token => registry.unregister(token);\n","const { addEventListener } = EventTarget.prototype;\nconst eventsHandler = new WeakMap;\nReflect.defineProperty(EventTarget.prototype, 'addEventListener', {\n  value(type, listener, ...options) {\n    const invoke = options.at(0)?.invoke;\n    if (invoke) {\n      let map = eventsHandler.get(this);\n      if (!map) {\n        map = new Map;\n        eventsHandler.set(this, map);\n      }\n      map.set(type, [].concat(invoke));\n      delete options[0].invoke;\n    }\n    return addEventListener.call(this, type, listener, ...options);\n  },\n});\n\nexport default event => {\n  const { currentTarget, target, type } = event;\n  const methods = eventsHandler.get(currentTarget || target)?.get(type);\n  if (methods) for (const method of methods) event[method]();\n};\n","import { drop, get, hold } from 'js-proxy/heap';\nimport { TypedArray } from 'sabayon/shared';\n\nimport coincident from '../main.js';\nimport numeric from './types.js';\nimport { fromSymbol, toSymbol } from './symbol.js';\n\nimport {\n  APPLY,\n  DEFINE_PROPERTY,\n  GET_OWN_PROPERTY_DESCRIPTOR,\n  OWN_KEYS,\n  DESTRUCT,\n} from 'js-proxy/traps';\n\nimport {\n  ARRAY,\n  FUNCTION,\n  NULL,\n  NUMBER,\n  OBJECT,\n  STRING,\n  SYMBOL,\n  UNDEFINED,\n} from 'js-proxy/types';\n\nimport { MAIN, WORKER } from './constants.js';\n\nimport { create } from 'gc-hook';\n\nimport handleEvent from './events.js';\n\nimport DEBUG from '../debug.js';\n\nconst { isArray } = Array;\n\nexport default /** @type {import('../main.js').Coincident} */ options => {\n  const exports = coincident(options);\n\n  const toEntry = value => {\n    const TYPE = typeof value;\n    switch (TYPE) {\n      case OBJECT: {\n        if (value === null) return [numeric[NULL], value];\n        if (value === globalThis) return [numeric[OBJECT], null];\n        if (isArray(value)) return [numeric[ARRAY], hold(value)];\n        return [numeric[OBJECT], value instanceof TypedArray ? value : hold(value)];\n      }\n      case FUNCTION: return [numeric[FUNCTION], hold(value)];\n      case SYMBOL: return [numeric[SYMBOL], toSymbol(value)];\n      default: return [numeric[TYPE], value];\n    }\n  };\n\n  class Worker extends exports.Worker {\n    constructor(url, options) {\n      const { proxy } = super(url, options);\n      const { [WORKER]: __worker__ } = proxy;\n\n      const proxies = new Map;\n      const onGC = ref => {\n        proxies.delete(ref);\n        __worker__(DESTRUCT, ref);\n      }\n\n      const fromEntry = ([numericTYPE, value]) => {\n        switch (numericTYPE) {\n          case numeric[OBJECT]: {\n            if (value === null) return globalThis;\n            if (typeof value === NUMBER) return get(value);\n            if (!(value instanceof TypedArray)) {\n              for (const key in value)\n                value[key] = fromEntry(value[key]);\n            }\n            return value;\n          };\n          case numeric[ARRAY]: {\n            if (typeof value === NUMBER) return get(value);\n            return value.map(fromEntry);\n          };\n          case numeric[FUNCTION]: {\n            switch (typeof value) {\n              case NUMBER: return get(value);\n              case STRING: {\n                let fn = proxies.get(value)?.deref();\n                if (!fn) {\n                  fn = create(value, onGC, {\n                    token: false,\n                    return: function (...args) {\n                      if (args.length && args[0] instanceof Event) handleEvent(args[0]);\n                      return __worker__(APPLY, value, toEntry(this), args.map(toEntry)).then(fromEntry);\n                    }\n                  });\n                  proxies.set(value, new WeakRef(fn));\n                }\n                return fn;\n              }\n            }\n          };\n          case numeric[SYMBOL]: return fromSymbol(value);\n          default: return value;\n        }\n      };\n\n      const asEntry = (method, target, args) => toEntry(method(target, ...args.map(fromEntry)));\n\n      proxy[MAIN] = (TRAP, ref, ...args) => {\n        if (TRAP === DESTRUCT) drop(ref);\n        else {\n          const method = Reflect[TRAP];\n          const target = ref == null ? globalThis : get(ref);\n          switch (TRAP) {\n            case DEFINE_PROPERTY: {\n              const [name, descriptor] = args.map(fromEntry);\n              return toEntry(method(target, name, descriptor));\n            }\n            case GET_OWN_PROPERTY_DESCRIPTOR: {\n              const descriptor = method(target, ...args.map(fromEntry));\n              if (descriptor) {\n                const { get, set, value } = descriptor;\n                if (get) descriptor.get = toEntry(get);\n                if (set) descriptor.set = toEntry(set);\n                if (value) descriptor.value = toEntry(value);\n              }\n              return [numeric[descriptor ? OBJECT : UNDEFINED], descriptor];\n            }\n            case OWN_KEYS: return [numeric[ARRAY], method(target).map(toEntry)];\n            default: return asEntry(method, target, args);\n          }\n        }\n      };\n\n      if (DEBUG) {\n        const debug = proxy[MAIN];\n        proxy[MAIN] = (TRAP, ...args) => {\n          const destructing = TRAP === DESTRUCT;\n          const method = destructing ? console.warn : console.log;\n          method('Main before', TRAP, ...args);\n          const result = debug(TRAP, ...args);\n          if (!destructing) method('Main after', TRAP, result);\n          return result;\n        };\n      }\n    }\n  }\n\n  return { ...exports, Worker };\n};\n","/* c8 ignore start */\nconst {url} = import.meta;\nconst re = /import\\((['\"])([^)]+?\\.js)\\1\\)/g;\nconst place = (_,q,f) => `import(${q}${new URL(f,url).href}${q})`;\nimport * as JSON from '@ungap/structured-clone/json';\nimport coincident from 'coincident/window/main';\nconst { Worker } = coincident(JSON);\nexport default (...args) => new Worker(URL.createObjectURL(new Blob([\"const e=\\\"object\\\"==typeof self?self:globalThis,t=t=>((t,n)=>{const r=(e,n)=>(t.set(n,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=n[o];switch(a){case 0:case-1:return r(i,o);case 1:{const e=r([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=r({},o);for(const[t,n]of i)e[s(t)]=s(n);return e}case 3:return r(new Date(i),o);case 4:{const{source:e,flags:t}=i;return r(new RegExp(e,t),o)}case 5:{const e=r(new Map,o);for(const[t,n]of i)e.set(s(t),s(n));return e}case 6:{const e=r(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:n}=i;return r(new e[t](n),o)}case 8:return r(BigInt(i),o);case\\\"BigInt\\\":return r(Object(BigInt(i)),o)}return r(new e[a](i),o)};return s})(new Map,t)(0),n=\\\"\\\",{toString:r}={},{keys:s}=Object,o=e=>{const t=typeof e;if(\\\"object\\\"!==t||!e)return[0,t];const s=r.call(e).slice(8,-1);switch(s){case\\\"Array\\\":return[1,n];case\\\"Object\\\":return[2,n];case\\\"Date\\\":return[3,n];case\\\"RegExp\\\":return[4,n];case\\\"Map\\\":return[5,n];case\\\"Set\\\":return[6,n]}return s.includes(\\\"Array\\\")?[1,s]:s.includes(\\\"Error\\\")?[7,s]:[2,s]},a=([e,t])=>0===e&&(\\\"function\\\"===t||\\\"symbol\\\"===t),i=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const i=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},c=r=>{if(n.has(r))return n.get(r);let[l,u]=o(r);switch(l){case 0:{let t=r;switch(u){case\\\"bigint\\\":l=8,t=r.toString();break;case\\\"function\\\":case\\\"symbol\\\":if(e)throw new TypeError(\\\"unable to serialize \\\"+u);t=null;break;case\\\"undefined\\\":return i([-1],r)}return i([l,t],r)}case 1:{if(u)return i([u,[...r]],r);const e=[],t=i([l,e],r);for(const t of r)e.push(c(t));return t}case 2:{if(u)switch(u){case\\\"BigInt\\\":return i([u,r.toString()],r);case\\\"Boolean\\\":case\\\"Number\\\":case\\\"String\\\":return i([u,r.valueOf()],r)}if(t&&\\\"toJSON\\\"in r)return c(r.toJSON());const n=[],p=i([l,n],r);for(const t of s(r))!e&&a(o(r[t]))||n.push([c(t),c(r[t])]);return p}case 3:return i([l,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return i([l,{source:e,flags:t}],r)}case 5:{const t=[],n=i([l,t],r);for(const[n,s]of r)(e||!a(o(n))&&!a(o(s)))&&t.push([c(n),c(s)]);return n}case 6:{const t=[],n=i([l,t],r);for(const n of r)!e&&a(o(n))||t.push(c(n));return n}}const{message:p}=r;return i([l,{name:u,message:p}],r)};return c})(!(t||n),!!t,new Map,r)(e),r},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var p=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))});const f=\\\"array\\\",d=\\\"function\\\",h=\\\"null\\\",y=\\\"number\\\",g=\\\"object\\\",w=\\\"symbol\\\",m=\\\"undefined\\\",_=\\\"apply\\\",b=\\\"construct\\\",E=\\\"defineProperty\\\",v=\\\"deleteProperty\\\",T=\\\"get\\\",x=\\\"getOwnPropertyDescriptor\\\",k=\\\"getPrototypeOf\\\",S=\\\"has\\\",O=\\\"isExtensible\\\",A=\\\"ownKeys\\\",j=\\\"preventExtensions\\\",R=\\\"set\\\",P=\\\"setPrototypeOf\\\";var $=Object.freeze({__proto__:null,APPLY:_,CONSTRUCT:b,DEFINE_PROPERTY:E,DELETE_PROPERTY:v,GET:T,GET_OWN_PROPERTY_DESCRIPTOR:x,GET_PROTOTYPE_OF:k,HAS:S,IS_EXTENSIBLE:O,OWN_KEYS:A,PREVENT_EXTENSION:j,SET:R,SET_PROTOTYPE_OF:P});function I(){return this}const N=new FinalizationRegistry((([e,t,n])=>{n&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),M=Object.create(null),F=(e,t,{debug:n,handler:r,return:s,token:o=e}=M)=>{const a=s||new Proxy(e,r||M),i=[a,[t,e,!!n]];return!1!==o&&i.push(o),N.register(...i),a},{Object:W,Proxy:H,Reflect:D}=globalThis,{isArray:C}=Array,{ownKeys:L}=D,{create:B,hasOwn:q,values:U}=W,J=(e,t)=>t===f?e[0]:t===d?e():t===g?e.$:e,z=(e,t,n,r)=>{const s={type:{value:t}},o=q(e,\\\"valueOf\\\");for(const a of U($)){let i=r(e[a]||D[a]);if(o&&a===T){const{valueOf:r}=e,{value:s}=i;i={value(e,o,...a){return o===n?r.call(this,J(e,t)):s.call(this,e,o,...a)}}}s[a]=i}return B(e,s)},G=(e,t,n,r=e)=>{if(r===e)switch(typeof e){case g:case m:r||(r=!1);case d:break;default:r=!1,t===e&&(t=W(e))}const s=new H(t,n),{destruct:o}=n;return o?F(e,o,{token:r,return:s}):s},Y=e=>t=>{const n=typeof t;return n===g?t?e.get(t)?.[0]??(e=>C(e)?f:g)(t):h:n},K=e=>t=>{let n=typeof t;switch(n){case g:if(!t){n=h;break}case d:const r=e.get(t);r&&([n,t]=r)}return[n,t]},X=e=>((e=>{N.unregister(e)})(e),e);var V=e=>{const t=new WeakMap,n=Symbol(),r={},s=(e,n,r)=>(t.set(e,[n,r]),e),o={proxy:r,release:X,pair:K(t),typeOf:Y(t),isProxy:e=>t.has(e),valueOf:e=>e[n]??e.valueOf()};for(const t of L(e)){if(q(o,t))continue;const a=e[t];switch(t){case f:{const e=z(a,t,n,(e=>({value([t],...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,[t],e,...n),f,t);break}case d:{const e=z(a,t,n,(e=>({value(t,...n){return e.call(this,t(),...n)}})));r[t]=(t,...n)=>{return s(G(t,(r=t,I.bind(r)),e,...n),d,t);var r};break}case g:{const e=z(a,t,n,(e=>({value({$:t},...n){return e.call(this,t,...n)}})));r[t]=(t,...n)=>s(G(t,{$:t},e,...n),g,t);break}default:{const e=z(a,t,n,(e=>({value:e})));r[t]=(n,...r)=>s(G(n,n,e,...r),t,n);break}}}return o};let Z=0;const Q=new Map,ee=new Map,te=e=>ee.get(e),ne=e=>{if(!Q.has(e)){let t;for(;ee.has(t=Z++););Q.set(e,t),ee.set(t,e)}return Q.get(e)},{ArrayBuffer:re,Atomics:se,Promise:oe}=globalThis,{isArray:ae}=Array,{create:ie,getPrototypeOf:ce,values:le}=Object,ue=ce(Int32Array),pe=ie(se),fe=({currentTarget:e,type:t,origin:n,lastEventId:r,source:s,ports:o},a)=>e.dispatchEvent(new MessageEvent(t,{data:a,origin:n,lastEventId:r,source:s,ports:o})),de=()=>oe.withResolvers();let he=0;const ye=new Map,ge=(e,t)=>class extends e{constructor(e,...n){super(e,...n),e instanceof t&&ye.set(this,[he++,0,de()])}},we=new WeakSet,me=e=>(we.add(e),e),_e=(e,t)=>{const{data:n}=e,r=ae(n)&&(n.at(0)===t||0===n.at(1)&&!t);return r&&(e.stopImmediatePropagation(),e.preventDefault()),r},be=e=>null!==e&&\\\"object\\\"==typeof e&&!we.has(e),Ee=new WeakMap,ve=(e,t,n)=>{if(ye.has(e))t.set(e,ye.get(e)[0]);else if(!(e instanceof ue||e instanceof re))for(const r of le(e))be(r)&&!n.has(r)&&(n.add(r),ve(r,t,n))},Te=(...e)=>({value:new oe((t=>{let n=new Worker(\\\"data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))\\\");n.onmessage=()=>t(\\\"ok\\\"),n.postMessage(e)}))}),xe=(e,t)=>{const n=ye.get(e),[r,s,{promise:o}]=n;return n[1]=t,[r,o]};let{BigInt64Array:ke,Int32Array:Se,SharedArrayBuffer:Oe,addEventListener:Ae,postMessage:je}=globalThis,Re=!0,Pe=e=>e,$e=!1;const Ie=de();try{new Oe(4),pe.waitAsync||(pe.waitAsync=Te),Ie.resolve()}catch(e){const t=je,n=Ae,r=[];let s=\\\"\\\",o=\\\"\\\";Oe=class extends re{},ke=ge(ke,Oe),Se=ge(Se,Oe),Pe=me,$e=!0,pe.notify=(e,n)=>{const[r]=(e=>Ee.get(e))(e);return t([s,1,e,r,n]),0},pe.waitAsync=(...e)=>{const[t,n]=xe(...e);return{value:n}},pe.wait=(e,t,...n)=>{const[r]=xe(e,t,...n),a=new XMLHttpRequest;a.responseType=\\\"json\\\",a.open(\\\"POST\\\",`${o}?sabayon`,!1),a.setRequestHeader(\\\"Content-Type\\\",\\\"application/json\\\"),a.send(`[\\\"${s}\\\",${r},${t}]`);const{response:i}=a;ye.delete(e);for(let t=0;t<i.length;t++)e[t]=i[t];return\\\"ok\\\"},n(\\\"message\\\",(e=>{if(_e(e,s)){const[t,n,...r]=e.data;switch(n){case 0:s=t,o=r.at(0)?.serviceWorker||\\\"\\\",o||(pe.wait=null,Ie.resolve());break;case 1:((e,t,n)=>{for(const[r,[s,o,{resolve:a}]]of ye)if(t===s&&n===o){for(let t=0;t<e.length;t++)r[t]=e[t];ye.delete(r),a(\\\"ok\\\");break}})(...r);break;case 2:((e,t,n)=>{for(const[n,r]of t)Ee.set(n,[r,e.currentTarget]);fe(e,n)})(e,...r);break;case 3:Ie.resolve()}}else if(Re){const{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i}=e;r.push([{currentTarget:t,type:n,origin:s,lastEventId:o,source:a,ports:i},e.data])}})),Ae=(e,...t)=>{if(n(e,...t),r.length)for(const e of r.splice(0))fe(...e)},je=(e,...n)=>t(((e,t)=>{const n=new Map;return be(t)&&ve(t,n,new Set),n.size?[e,2,n,t]:t})(s,e),...n)}await Ie.promise,Re=!1;const{BYTES_PER_ELEMENT:Ne}=Int32Array,{BYTES_PER_ELEMENT:Me}=Uint16Array,{notify:Fe}=pe,We=new TextDecoder(\\\"utf-16\\\"),He=new WeakSet,De=(...e)=>(He.add(e),e);let Ce=\\\"\\\";const Le=(e,t,n,r)=>{const[s]=r,o=n.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,r)};let Be=0;const qe=([e,t,n,r,s,o,a,i,c],l)=>(...u)=>{let p=\\\"\\\"!==Ce,f=0;p&&(f=((e,t)=>setTimeout(console.warn,1e3,`πŸ’€πŸ”’ - proxy.${e}() in proxy.${t}()`))(l,Ce));const d=Be++,h=[];He.has(u.at(-1)||h)&&He.delete(h=u.pop());const y=n(i?u.map(i):u);let g=t(2*Ne);return a([e,2,l,d,g,y,r],{transfer:h}),c(g,0).value.then((()=>{p&&clearTimeout(f);const n=g[1];if(!n)return;const r=Me*n;return g=t(r+r%Ne),a([e,1,d,g]),c(g,0).value.then((()=>{const e=new Uint16Array(g.buffer),t=o?e.subarray(0,n):e.slice(0,n);return s(We.decode(t))}))}))},Ue=(e,t)=>new Proxy(t,{get:(t,n)=>{let r;return\\\"then\\\"!==n&&(r=t.get(n),r||(r=qe(e,n),t.set(n,r))),r},set:(e,t,n)=>\\\"then\\\"!==t&&!!e.set(t,n)}),{wait:Je,waitAsync:ze}=pe;var Ge=({parse:e,stringify:t,transform:n,interrupt:r}=JSON)=>{const s=((e,t)=>async(n,r,[s,o,a,i,c])=>{c&&(Ce=s);try{const s=await n(...i);if(void 0!==s){const n=e(t?t(s):s);r.set(o,n),a[1]=n.length}}finally{c&&(Ce=\\\"\\\"),a[0]=1,Fe(a,0)}})(t,n),o=de(),a=new Map,i=new Map;let c=\\\"\\\",l=Je;if(Je&&r){const{handler:e,timeout:t=42}=r;l=(n,r,s)=>{for(;\\\"timed-out\\\"===(s=Je(n,r,0,t));)e();return s}}return Ae(\\\"message\\\",(t=>{if(_e(t,c)){const[r,u,...p]=t.data;switch(u){case 0:{const t=!!Je;c=r,o.resolve({polyfill:$e,sync:t,transfer:De,proxy:Ue([c,e=>new Se(new Oe(e)),Pe,t,e,$e,je,n,t?(...e)=>({value:{then:t=>t(l(...e))}}):ze],a)});break}case 2:a.size?Le(s,i,a,p):setTimeout(Le,0,s,i,a,p);break;case 1:((e,[t,n])=>{const r=e.get(t);e.delete(t);for(let e=new Uint16Array(n.buffer),t=0,{length:s}=r;t<s;t++)e[t]=r.charCodeAt(t);Fe(n,0)})(i,p)}}})),o.promise},Ye=Object.fromEntries([f,\\\"bigint\\\",\\\"boolean\\\",d,h,y,g,\\\"string\\\",w,m].map(((e,t)=>[e,t])));const Ke=\\\"destruct\\\",{[A]:Xe}=Reflect,Ve=new Map(Xe(Symbol).filter((e=>typeof Symbol[e]===w)).map((e=>[Symbol[e],e]))),Ze=e=>Ve.get(e)||`.${Symbol.keyFor(e)||\\\"\\\"}`,Qe=\\\"42fb1e9a-1373-441e-813f-357c3deaee87\\\",et=\\\"M\\\"+Qe,tt=\\\"W\\\"+Qe,{[_]:nt}=Reflect;const rt={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\\\r\\\\n]+/))if(t.trim().length){/^(\\\\s+)/.test(t)&&(e=e.replace(new RegExp(\\\"^\\\"+RegExp.$1,\\\"gm\\\"),\\\"\\\"));break}return e}},st=new WeakMap,ot=e=>{const t=e||console,n={buffered:it,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return st.set(t,n),t}}},at=new TextDecoder,it=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(at.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},ct=(e,...t)=>rt[typeof e](e,...t),{isArray:lt}=Array,{assign:ut,create:pt,defineProperties:ft,defineProperty:dt,entries:ht}=Object,{all:yt,resolve:gt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),wt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,\\\"\\\")).href,mt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},_t=e=>Function(`'use strict';return (${e})`)(),bt=e=>e.replace(/^(?:\\\\n|\\\\r\\\\n)/,\\\"\\\"),Et=Symbol.for(\\\"polyscript.js_modules\\\"),vt=new Map;dt(globalThis,Et,{value:vt}),new Proxy(vt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Tt=(e,t)=>!t.startsWith(\\\"_\\\"),xt=(e,t)=>new Proxy(e,{has:Tt,get:(e,n)=>e[t][n]}),kt=(e,t)=>import(e).then((e=>{vt.set(t,{...e})})),St=e=>new Promise(((t,n)=>{document.querySelector(`link[rel=\\\"stylesheet\\\"][href=\\\"${e}\\\"]`)?t():document.head.append(ut(document.createElement(\\\"link\\\"),{rel:\\\"stylesheet\\\",href:e,onload:t,onerror:n}))})),Ot=e=>/\\\\.css$/i.test(new URL(e).pathname),At=(e,t)=>e.has(t),jt=e=>[...e.keys()];var Rt=(e,t,n,r)=>{const s=globalThis[Et];if(n)for(let[e,t]of ht(n)){let n=s.get(t);n&&!lt(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:At,ownKeys:jt,get:(e,s)=>{let o=e.get(s);if(lt(o)){let a=o;o=null;for(let e of a)e=wt(e,r),Ot(e)?n.importCSS(e):(n.importJS(e,s),o=t[Et].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Pt=new Map,$t=e=>Pt.get(e),It=(e,t)=>{try{return Function(\\\"require\\\",t)($t)}catch(t){st.get(e).stderr(t)}};var Nt={type:\\\"dummy\\\",module:()=>\\\"data:application/javascript,\\\",engine:e=>ot().get(e),registerJSModule(e,t,n){Pt.set(t,n)},run:It,runAsync:It,runEvent:async(e,t,n)=>{try{await Function(\\\"require\\\",\\\"e\\\",`return ${t}(e)`)($t,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile(){}};const Mt=Object.getOwnPropertyDescriptors(Response.prototype),Ft=e=>\\\"function\\\"==typeof e,Wt={get:(e,t)=>Mt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!Ft(r)?e.then((e=>e[t])):(...n)=>e.then((e=>e[t](...n))))(e,t,Mt[t]):((e,t)=>Ft(t)?t.bind(e):t)(e,e[t])};var Ht=(e,...t)=>new Proxy(fetch(e,...t),Wt);Promise.withResolvers||(Promise.withResolvers=function(){var e,t,n=new this((function(n,r){e=n,t=r}));return{resolve:e,reject:t,promise:n}});const Dt=!globalThis.window,Ct=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Bt(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Lt=e=>{const t=e.split(\\\"/\\\");return t.pop(),t.join(\\\"/\\\")},Bt=(e,t)=>{const n=[];for(const r of t.split(\\\"/\\\"))\\\".\\\"!==r&&\\\"..\\\"!==r&&(n.push(r),r&&e.mkdir(n.join(\\\"/\\\")))},qt=(e,t)=>{const n=[];for(const e of t.split(\\\"/\\\"))switch(e){case\\\"\\\":case\\\".\\\":break;case\\\"..\\\":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join(\\\"/\\\").replace(/^\\\\/+/,\\\"/\\\")},Ut=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,\\\"\\\"))).filter((e=>\\\"\\\"!==e&&\\\".\\\"!==e)).join(\\\"/\\\");return e[0].startsWith(\\\"/\\\")?`/${t}`:t},Jt=(e,t)=>Ht(wt(e,t)).arrayBuffer(),zt=(e,t,n,r)=>yt((e=>{for(const{files:t,to_file:n,from:r=\\\"\\\"}of e){if(void 0!==t&&void 0!==n)throw new Error(\\\"Cannot use 'to_file' and 'files' parameters together!\\\");if(void 0===t&&void 0===n&&r.endsWith(\\\"/\\\"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e=\\\"\\\",to_folder:t=\\\".\\\",to_file:n,files:r})=>{if(lt(r))return r.map((n=>({url:Ut([e,n]),path:Ut([t,n])})));const s=n||e.slice(1+e.lastIndexOf(\\\"/\\\"));return[{url:e,path:Ut([t,s])}]}))})(n).map((({url:n,path:s})=>Jt(n,r).then((n=>e.writeFile(t,s,n)))))),Gt=(e,t)=>t.endsWith(\\\"/\\\")?`${t}${e.split(\\\"/\\\").pop()}`:t,Yt=(e,t)=>e.replace(/\\\\{.+?\\\\}/g,(e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)})),Kt=(e,t,n,r)=>yt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of ht(e))if(/^\\\\{.+\\\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,Yt(o,t))}else{const e=Yt(s,t),a=Gt(e,Yt(o||\\\"./\\\",t));if(n.has(a))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map((({url:n,path:s})=>Jt(n,r).then((r=>e.writeFile(t,s,r,n)))))),Xt=({main:e,worker:t},n)=>{const r=[];if(t&&Dt)for(let[e,s]of ht(t))e=wt(e,n),r.push(kt(e,s));if(e&&!Dt)for(let[t,s]of ht(e))t=wt(t,n),Ot(t)?St(t):r.push(kt(t,s));return yt(r)},{assign:Vt}=Object,Zt=\\\"entries\\\",Qt=\\\"readonly\\\",en=\\\"readwrite\\\",tn={durability:\\\"default\\\",prefix:\\\"IDBMap\\\"},nn=({target:{result:e}})=>e;class rn extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Zt,t,this.#t);return new Promise(((t,r)=>Vt(e(n.objectStore(Zt)),{onsuccess:t,onerror:r})))}constructor(e,{durability:t=tn.durability,prefix:n=tn.prefix}=tn){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise(((t,n)=>{Vt(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Zt),n.oncomplete=()=>t(e)},onsuccess(e){t(nn(e))},onerror(e){n(e),this.dispatchEvent(e)}})})).then((e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith(\\\"on\\\")&&(e[n]=t);return e}))}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Vt(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r((e=>e.count()),Qt).then(nn)}async clear(){await this.#r((e=>e.clear()),en)}async delete(e){await this.#r((t=>t.delete(e)),en)}async entries(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e).then((t=>[e,t])))))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r((t=>t.get(e)),Qt).then(nn)}async has(e){return void 0!==await this.#r((t=>t.getKey(e)),Qt).then(nn)}async keys(){return await this.#r((e=>e.getAllKeys()),Qt).then(nn)}async set(e,t){return await this.#r((n=>n.put(t,e)),en),this}async values(){const e=await this.keys();return Promise.all(e.map((e=>this.get(e))))}get[Symbol.toStringTag](){return this.#n}}class sn extends Map{#s;#o;constructor(...e){super(),this.#s=new rn(...e),this.#o=this.#s.entries().then((e=>{for(const[t,n]of e)super.set(t,n)}))}async sync(){await this.#o}clear(){return this.#o=this.#o.then((()=>this.#s.clear())),super.clear()}delete(e){return this.#o=this.#o.then((()=>this.#s.delete(e))),super.delete(e)}set(e,t){return this.#o=this.#o.then((()=>this.#s.set(e,t))),super.set(e,t)}}const on=new WeakMap,an=(e,t,n)=>{\\\"polyscript\\\"===t&&(n.lazy_py_modules=async(...t)=>(await on.get(e)(t),t.map((t=>e.pyimport(t)))),n.storage=async e=>{const t=new sn(e);return await t.sync(),t},n.JSON=p),e.registerJsModule(t,n)},cn=(e,t)=>{if(e.endsWith(\\\"/*\\\")){if(/\\\\.(zip|whl|tgz|tar(?:\\\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return\\\"\\\"},ln=(e,t,...n)=>{try{return e.runPython(ct(t),...n)}catch(t){st.get(e).stderr(t)}},un=async(e,t,...n)=>{try{return await e.runPythonAsync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},pn=async(e,t,n)=>{const[r,...s]=t.split(\\\".\\\");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}};var fn=(new TextEncoder).encode('from uio import StringIO\\\\nimport sys\\\\n\\\\nclass Response:\\\\n    def __init__(self, f):\\\\n        self.raw = f\\\\n        self.encoding = \\\"utf-8\\\"\\\\n        self._cached = None\\\\n\\\\n    def close(self):\\\\n        if self.raw:\\\\n            self.raw.close()\\\\n            self.raw = None\\\\n        self._cached = None\\\\n\\\\n    @property\\\\n    def content(self):\\\\n        if self._cached is None:\\\\n            try:\\\\n                self._cached = self.raw.read()\\\\n            finally:\\\\n                self.raw.close()\\\\n                self.raw = None\\\\n        return self._cached\\\\n\\\\n    @property\\\\n    def text(self):\\\\n        return str(self.content, self.encoding)\\\\n\\\\n    def json(self):\\\\n        import ujson\\\\n\\\\n        return ujson.loads(self.content)\\\\n\\\\n\\\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\\\n\\\\n\\\\ntry:\\\\n    import js\\\\nexcept Exception as err:\\\\n    raise OSError(\\\"This version of urequests can only be used in the browser\\\")\\\\n\\\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\\\n\\\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\\\n\\\\n\\\\ndef request(\\\\n    method,\\\\n    url,\\\\n    data=None,\\\\n    json=None,\\\\n    headers={},\\\\n    stream=None,\\\\n    auth=None,\\\\n    timeout=None,\\\\n    parse_headers=True,\\\\n):\\\\n    from js import XMLHttpRequest\\\\n\\\\n    xhr = XMLHttpRequest.new()\\\\n    xhr.withCredentials = False\\\\n\\\\n    if auth is not None:\\\\n        import ubinascii\\\\n\\\\n        username, password = auth\\\\n        xhr.open(method, url, False, username, password)\\\\n    else:\\\\n        xhr.open(method, url, False)\\\\n\\\\n    for name, value in headers.items():\\\\n        if name.lower() not in HEADERS_TO_IGNORE:\\\\n            xhr.setRequestHeader(name, value)\\\\n\\\\n    if timeout:\\\\n        xhr.timeout = int(timeout * 1000)\\\\n\\\\n    if json is not None:\\\\n        assert data is None\\\\n        import ujson\\\\n\\\\n        data = ujson.dumps(json)\\\\n        # s.write(b\\\"Content-Type: application/json\\\\\\\\r\\\\\\\\n\\\")\\\\n        xhr.setRequestHeader(\\\"Content-Type\\\", \\\"application/json\\\")\\\\n\\\\n    xhr.send(data)\\\\n\\\\n    # Emulates the construction process in the original urequests\\\\n    resp = Response(StringIO(xhr.responseText))\\\\n    resp.status_code = xhr.status\\\\n    resp.reason = xhr.statusText\\\\n    resp.headers = xhr.getAllResponseHeaders()\\\\n\\\\n    return resp\\\\n\\\\n\\\\n# Other methods - head, post, put, patch, delete - are not used by\\\\n# mip and therefore not included\\\\n\\\\n\\\\ndef get(url, **kw):\\\\n    return request(\\\"GET\\\", url, **kw)\\\\n\\\\n\\\\n# Content below this line is from the Micropython MIP package and is covered\\\\n# by the applicable MIT license:\\\\n# \\\\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\\\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\\\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\\\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\\\n# DEALINGS IN THE SOFTWARE.\\\\n\\\\n# MicroPython package installer\\\\n# MIT license; Copyright (c) 2022 Jim Mussared\\\\n\\\\n\\\\n_PACKAGE_INDEX = const(\\\"https://micropython.org/pi/v2\\\")\\\\n_CHUNK_SIZE = 128\\\\n\\\\n\\\\n# This implements os.makedirs(os.dirname(path))\\\\ndef _ensure_path_exists(path):\\\\n    import os\\\\n\\\\n    split = path.split(\\\"/\\\")\\\\n\\\\n    # Handle paths starting with \\\"/\\\".\\\\n    if not split[0]:\\\\n        split.pop(0)\\\\n        split[0] = \\\"/\\\" + split[0]\\\\n\\\\n    prefix = \\\"\\\"\\\\n    for i in range(len(split) - 1):\\\\n        prefix += split[i]\\\\n        try:\\\\n            os.stat(prefix)\\\\n        except:\\\\n            os.mkdir(prefix)\\\\n        prefix += \\\"/\\\"\\\\n\\\\n\\\\n# Copy from src (stream) to dest (function-taking-bytes)\\\\ndef _chunk(src, dest):\\\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\\\n    while True:\\\\n        n = src.readinto(buf)\\\\n        if n == 0:\\\\n            break\\\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\\\n\\\\n\\\\n# Check if the specified path exists and matches the hash.\\\\ndef _check_exists(path, short_hash):\\\\n    import os\\\\n\\\\n    try:\\\\n        import binascii\\\\n        import hashlib\\\\n\\\\n        with open(path, \\\"rb\\\") as f:\\\\n            hs256 = hashlib.sha256()\\\\n            _chunk(f, hs256.update)\\\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], \\\"utf-8\\\")\\\\n            return existing_hash == short_hash\\\\n    except:\\\\n        return False\\\\n\\\\n\\\\ndef _rewrite_url(url, branch=None):\\\\n    if not branch:\\\\n        branch = \\\"HEAD\\\"\\\\n    if url.startswith(\\\"github:\\\"):\\\\n        url = url[7:].split(\\\"/\\\")\\\\n        url = (\\\\n            \\\"https://raw.githubusercontent.com/\\\"\\\\n            + url[0]\\\\n            + \\\"/\\\"\\\\n            + url[1]\\\\n            + \\\"/\\\"\\\\n            + branch\\\\n            + \\\"/\\\"\\\\n            + \\\"/\\\".join(url[2:])\\\\n        )\\\\n    return url\\\\n\\\\n\\\\ndef _download_file(url, dest):\\\\n    response = get(url)\\\\n    try:\\\\n        if response.status_code != 200:\\\\n            print(\\\"Error\\\", response.status_code, \\\"requesting\\\", url)\\\\n            return False\\\\n\\\\n        print(\\\"Copying:\\\", dest)\\\\n        _ensure_path_exists(dest)\\\\n        with open(dest, \\\"wb\\\") as f:\\\\n            _chunk(response.raw, f.write)\\\\n\\\\n        return True\\\\n    finally:\\\\n        response.close()\\\\n\\\\n\\\\ndef _install_json(package_json_url, index, target, version, mpy):\\\\n    response = get(_rewrite_url(package_json_url, version))\\\\n    try:\\\\n        if response.status_code != 200:\\\\n            print(\\\"Package not found:\\\", package_json_url)\\\\n            return False\\\\n\\\\n        package_json = response.json()\\\\n    finally:\\\\n        response.close()\\\\n    for target_path, short_hash in package_json.get(\\\"hashes\\\", ()):\\\\n        fs_target_path = target + \\\"/\\\" + target_path\\\\n        if _check_exists(fs_target_path, short_hash):\\\\n            print(\\\"Exists:\\\", fs_target_path)\\\\n        else:\\\\n            file_url = \\\"{}/file/{}/{}\\\".format(index, short_hash[:2], short_hash)\\\\n            if not _download_file(file_url, fs_target_path):\\\\n                print(\\\"File not found: {} {}\\\".format(target_path, short_hash))\\\\n                return False\\\\n    for target_path, url in package_json.get(\\\"urls\\\", ()):\\\\n        fs_target_path = target + \\\"/\\\" + target_path\\\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\\\n            print(\\\"File not found: {} {}\\\".format(target_path, url))\\\\n            return False\\\\n    for dep, dep_version in package_json.get(\\\"deps\\\", ()):\\\\n        if not _install_package(dep, index, target, dep_version, mpy):\\\\n            return False\\\\n    return True\\\\n\\\\n\\\\ndef _install_package(package, index, target, version, mpy):\\\\n    if (\\\\n        package.startswith(\\\"http://\\\")\\\\n        or package.startswith(\\\"https://\\\")\\\\n        or package.startswith(\\\"github:\\\")\\\\n    ):\\\\n        if package.endswith(\\\".py\\\") or package.endswith(\\\".mpy\\\"):\\\\n            print(\\\"Downloading {} to {}\\\".format(package, target))\\\\n            return _download_file(\\\\n                _rewrite_url(package, version), target + \\\"/\\\" + package.rsplit(\\\"/\\\")[-1]\\\\n            )\\\\n        else:\\\\n            if not package.endswith(\\\".json\\\"):\\\\n                if not package.endswith(\\\"/\\\"):\\\\n                    package += \\\"/\\\"\\\\n                package += \\\"package.json\\\"\\\\n            print(\\\"Installing {} to {}\\\".format(package, target))\\\\n    else:\\\\n        if not version:\\\\n            version = \\\"latest\\\"\\\\n        print(\\\"Installing {} ({}) from {} to {}\\\".format(package, version, index, target))\\\\n\\\\n        mpy_version = (\\\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, \\\"_mpy\\\") else \\\"py\\\"\\\\n        )\\\\n\\\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\\\n        package = \\\"{}/package/{}/{}/{}.json\\\".format(index, \\\"py\\\", package, version)\\\\n\\\\n    return _install_json(package, index, target, version, mpy)\\\\n\\\\n\\\\ndef install(package, index=None, target=None, version=None, mpy=True):\\\\n    if not target:\\\\n        for p in sys.path:\\\\n            if p.endswith(\\\"/lib\\\"):\\\\n                target = p\\\\n                break\\\\n        else:\\\\n            print(\\\"Unable to find lib dir in sys.path\\\")\\\\n            return\\\\n\\\\n    if not index:\\\\n        index = _PACKAGE_INDEX\\\\n\\\\n    if _install_package(package, index.rstrip(\\\"/\\\"), target, version, mpy):\\\\n        print(\\\"Done\\\")\\\\n    else:\\\\n        print(\\\"Package may be partially installed\\\")\\\\n');const dn=async e=>(await import(\\\"./toml-DiUM0_qs.js\\\")).parse(e),hn=(e,t)=>{try{e.mkdir(t)}catch(e){}};var yn={type:\\\"micropython\\\",module:(e=\\\"1.24.0-preview-114\\\")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=ot({stderr:it(console.error),stdout:it(console.log)});n=n.replace(/\\\\.m?js$/,\\\".wasm\\\");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n})),c=gn.bind(this,i,r);return on.set(i,c),t.files&&await Kt(this,i,t.files,r),t.fetch&&await zt(this,i,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),this.writeFile(i,\\\"./mip.py\\\",fn),t.packages&&await c(t.packages),i},registerJSModule:an,run:ln,runAsync:un,runEvent:pn,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=cn(t,r);if(c){const r=t.slice(0,-1);switch(\\\"./\\\"!==r&&s.mkdir(r),c){case\\\"whl\\\":case\\\"zip\\\":{const e=new Blob([n],{type:\\\"application/zip\\\"});return import(\\\"./zip-gl8b5xR3.js\\\").then((async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)hn(s,i);else{hn(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()}))}case\\\"tgz\\\":case\\\"tar.gz\\\":{const t=\\\"./_.tar.gz\\\";return Ct(i,t,n),void e.runPython(`\\\\n                        import os, gzip, tarfile\\\\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open(\\\"${t}\\\", \\\"rb\\\")))\\\\n                        for f in tar:\\\\n                            name = f\\\"${r}{f.name}\\\"\\\\n                            if f.type == tarfile.DIRTYPE:\\\\n                                if f.name != \\\"./\\\":\\\\n                                    os.mkdir(name.strip(\\\"/\\\"))\\\\n                            else:\\\\n                                dir = os.path.dirname(name)\\\\n                                if not os.path.exists(dir):\\\\n                                    os.mkdir(dir)\\\\n                                source = tar.extractfile(f)\\\\n                                with open(name, \\\"wb\\\") as dest:\\\\n                                    dest.write(source.read())\\\\n                                    dest.close()\\\\n                        tar.close()\\\\n                        os.remove(\\\"${t}\\\")\\\\n                    `)}}}return Ct(i,t,n)}};async function gn(e,t,n){let r;for(const s of n)if(s.endsWith(\\\".whl\\\")){const n=wt(s,t),r=await Ht(n).arrayBuffer();await this.writeFile(e,\\\"./*\\\",r,n)}else r||(r=e.pyimport(\\\"mip\\\")),r.install(s)}const wn={dict_converter:Object.fromEntries};let mn=!1;const _n=e=>(...t)=>{try{return mn=!0,e(...t)}finally{mn=!1}};let bn=!1;const En=()=>{if(bn)return;bn=!0;const e=new WeakMap,t=e=>e.destroy(),n=n=>{for(let r=0;r<n.length;r++){const s=n[r];if(\\\"function\\\"==typeof s&&\\\"copy\\\"in s){mn=!1;let o=e.get(s)?.deref();if(!o)try{o=F(s.copy(),t),e.set(s,new WeakRef(o))}catch(e){console.error(e)}o&&(n[r]=o),mn=!0}}},{call:r}=Function,s=r.bind(r,r.apply);Object.defineProperties(Function.prototype,{apply:{value(e,t){return mn&&n(t),s(this,e,t)}},call:{value(e,...t){return mn&&n(t),s(this,e,t)}}})};var vn={type:\\\"pyodide\\\",module:(e=\\\"0.26.1\\\")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,n,r){Dt||\\\"auto\\\"!==t.experimental_create_proxy||En();const{stderr:s,stdout:o,get:a}=ot(),i=n.slice(0,n.lastIndexOf(\\\"/\\\")),c=await a(e({stderr:s,stdout:o,indexURL:i})),l=Tn.bind(c);return on.set(c,l),t.files&&await Kt(this,c,t.files,r),t.fetch&&await zt(this,c,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),t.packages&&await l(t.packages),c},registerJSModule:an,run:_n(ln),runAsync:_n(un),runEvent:_n(pn),transform:({ffi:{PyProxy:e}},t)=>t instanceof e?t.toJs(wn):t,writeFile:(e,t,n,r)=>{const s=cn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return Ct({FS:o,PATH:a,PATH_FS:i},t,n)}};async function Tn(e){await this.loadPackage(\\\"micropip\\\");const t=this.pyimport(\\\"micropip\\\");await t.install(e,{keep_going:!0}),t.destroy()}const xn=\\\"ruby-wasm-wasi\\\",kn=xn.replace(/\\\\W+/g,\\\"_\\\");var Sn={type:xn,experimental:!0,module:(e=\\\"2.6.2\\\")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\\\\/browser\\\\/\\\\+esm$/,\\\"/ruby.wasm\\\");const s=await Ht(n).arrayBuffer(),o=await WebAssembly.compile(s),{vm:a}=await e(o);return t.files&&await Kt(this,a,t.files,r),t.fetch&&await zt(this,a,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),a},registerJSModule(e,t,n){t=t.replace(/\\\\W+/g,\\\"__\\\");const r=`__module_${kn}_${t}`;globalThis[r]=n,this.run(e,`require \\\"js\\\";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(ct(t),...n),runAsync:(e,t,...n)=>e.evalAsync(ct(t),...n),async runEvent(e,t,n){if(/^xworker\\\\.(on\\\\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${kn}_event`;globalThis[r]=n,this.run(e,`require \\\"js\\\";$xworker.call(\\\"${t}\\\",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${xn}`)}};var On={type:\\\"wasmoon\\\",module:(e=\\\"1.16.0\\\")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=ot(),c=await i((new e).createEngine());return c.global.getTable(t.Base,(e=>{c.global.setField(e,\\\"print\\\",a),c.global.setField(e,\\\"printErr\\\",o)})),n.files&&await Kt(this,c,n.files,s),n.fetch&&await zt(this,c,n.fetch,s),n.js_modules&&await Xt(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(ct(t),...n)}catch(t){st.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(\\\".\\\");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){st.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Bt(e,Lt(t)),t=qt(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const An=new WeakMap,jn=async(e,t)=>{const{shelter:n,destroy:r,io:s}=An.get(e),{output:o,result:a}=await n.captureR(ct(t));for(const{type:e,data:t}of o)s[e](t);return F(a,r,{token:!1})};var Rn={type:\\\"webr\\\",experimental:!0,module:(e=\\\"0.4.0\\\")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=ot(),o=new e.WebR;await s(o.init().then((()=>o)));const a=await new o.Shelter;return An.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:st.get(o)}),t.files&&await Kt(this,o,t.files,r),t.fetch&&await zt(this,o,t.fetch,r),t.js_modules&&await Xt(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:jn,runAsync:jn,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>(console.log(\\\"transforming\\\",t),t),writeFile:()=>{}};const Pn=new Map,$n=new Map,In=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split(\\\"@\\\"),s=Pn.get(n),o=/^(?:\\\\.?\\\\.?\\\\/|https?:\\\\/\\\\/)/i.test(r)?r.join(\\\"@\\\"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then((r=>($n.set(t,e),s(r,e,n,o))))}}),Nn=e=>{for(const t of[].concat(e.type))Pn.set(t,e)};for(const e of[Nt,yn,vn,Sn,On,Rn])Nn(e);const{parse:Mn}=JSON,Fn=e=>{try{return Mn(e)}catch(t){return dn(e)}},Wn=(e,t,n,r={})=>{if(t){const[e,s]=((e,t=\\\"./config.txt\\\")=>{let n=typeof e;return\\\"string\\\"===n&&/\\\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[wt(e),n]})(t,n);\\\"json\\\"===s?r=Ht(e).json():\\\"toml\\\"===s?r=Ht(e).text().then(dn):\\\"string\\\"===s?r=Fn(t):\\\"object\\\"===s&&t?r=t:\\\"txt\\\"===s&&\\\"string\\\"==typeof r&&(r=Fn(r)),t=e}return gt(r).then((n=>In[e](n,t)))},Hn=\\\"BeforeRun\\\",Dn=\\\"AfterRun\\\",Cn=[`code${Hn}`,`code${Hn}Async`,`code${Dn}`,`code${Dn}Async`],Ln=[\\\"onWorker\\\",\\\"onReady\\\",`on${Hn}`,`on${Hn}Async`,`on${Dn}`,`on${Dn}Async`];function Bn(e,t){const{run:n,runAsync:r}=Pn.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const qn=(e,t,n,r,s,o)=>{if(s||o){const a=Bn.bind(e,t),i=r?\\\"runAsync\\\":\\\"run\\\",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Un,Jn,zn;const Gn=(e,t)=>{addEventListener(e,t||(async t=>{try{await Un,Jn(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{parse:Yn,stringify:Kn}=p,{proxy:Xn,sync:Vn,polyfill:Zn,window:Qn,isWindowProxy:er}=await(async e=>{const t=await Ge(e),n=e?.transform||(e=>e),{[et]:r}=t.proxy,s=new Map,o=(e,t)=>{let n=s.get(e)?.deref();return n||s.set(e,new WeakRef(n=t(e))),n},a=([e,t])=>{switch(e){case Ye[g]:return null==t?globalThis:typeof t===y?o(t,p.object):t;case Ye[f]:return typeof t===y?o(t,p.array):t;case Ye[d]:return typeof t===y?o(t,p.function):te(parseInt(t));case Ye[w]:return(e=>{if(e.startsWith(\\\".\\\"))return Symbol.for(e.slice(1));for(const[t,n]of Ve)if(n===e)return t})(t);default:return t}},i=e=>{let[t,r]=m(e);switch(t){case g:if(r==globalThis||null==r)r=null;else if(typeof r===g&&!(r instanceof ue)){r=n(r);for(const e in r)r[e]=i(r[e])}return[Ye[g],r];case f:return[Ye[f],typeof r===y?r:n(r).map(i)];case d:return[Ye[d],typeof r===d?String(ne(n(r))):r];case w:return[Ye[w],Ze(e)];default:return[Ye[t],r]}},c=(...e)=>a(r(...e)),l={[E]:(e,t,n)=>c(E,e,i(t),i(n)),[v]:(e,t)=>c(v,e,i(t)),[T]:(e,t)=>c(T,e,i(t)),[k]:e=>c(k,e),[x]:(e,t)=>{const n=c(x,e,i(t));if(n){const{get:e,set:t,value:r}=n;e&&(n.get=a(e)),t&&(n.set=a(t)),r&&(n.value=a(r))}return n},[S]:(e,t)=>c(S,e,i(t)),[O]:e=>c(O,e),[A]:e=>c(A,e).map(a),[j]:e=>c(j,e),[R]:(e,t,n)=>c(R,e,i(t),i(n)),[P]:(e,t)=>c(P,e,i(t)),[Ke](e){s.delete(e),r(Ke,e)}},u={object:l,array:l,function:{...l,[_]:(e,...t)=>c(_,e,...t.map(i)),[b]:(e,...t)=>c(b,e,...t.map(i))}},{proxy:p,isProxy:h,pair:m}=V(u),$=p.object(null);return t.proxy[tt]=(e,t,...n)=>{const r=parseInt(t);switch(e){case _:{const[e,t]=n;return i(nt(te(r),a(e),t.map(a)))}case Ke:(e=>{const[t,n]=typeof e===y?[ee,Q]:[Q,ee],r=t.has(e);r&&(n.delete(t.get(e)),t.delete(e))})(r)}},{...t,window:$,isWindowProxy:h}})({parse:Yn,stringify:Kn,transform:e=>zn?zn(e):e}),tr={polyfill:Zn,sync:Xn,window:Vn?Qn:null,isWindowProxy:er,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};Gn(\\\"message\\\",(({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{Un=(async()=>{try{const{id:o,tag:a,type:i,custom:c,version:l,config:u,async:p}=e,f=((e,t=\\\"\\\")=>`${e}@${t}`.replace(/@$/,\\\"\\\"))(i,l),d=await Wn(f,t,n,u),{js_modules:h}=$n.get(f),y=h?.main,g=pt(Pn.get(i)),w=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:st.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(g,c||i,u||{},d);let m=\\\"run\\\";if(p&&(m+=\\\"Async\\\"),s){let e,t,n=\\\"\\\",r=\\\"\\\";for(const e of Cn){const t=s[e];if(t){const s=e.endsWith(\\\"Async\\\");(s&&p||!s&&!p)&&(e.startsWith(\\\"codeBefore\\\")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]=\\\"run\\\"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,bt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,bt(t),...o);return r&&await s(e,r,...o),a}})(g,m,n,r);for(const n of Ln.slice(2)){const r=s[n];if(r){const s=n.endsWith(\\\"Async\\\");if(s&&p||!s&&!p){const s=_t(r);n.startsWith(\\\"onBefore\\\")?e=s:t=s}}}qn(g,w,tr,p,e,t)}let _,b,E,v=null,T=\\\"\\\";Vn&&(({CustomEvent:_,document:b}=Qn),v=o&&b.getElementById(o)||null,E=e=>mt(v,c||i,e,!0,_));const x=Rt(Qn,Xn,y,t);if(((e,t,n,r)=>{if(\\\"pyodide\\\"===e)return;const s=\\\"polyscript.js_modules\\\";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,xt(r,e));t.registerJSModule(n,s,r)})(i,g,d,x),g.registerJSModule(d,\\\"polyscript\\\",{xworker:tr,currentScript:v,config:w.config,js_modules:x,get target(){return!T&&v&&(\\\"SCRIPT\\\"===a?v.after(ut(b.createElement(`script-${c||i}`),{id:T=`${o}-target`})):(T=o,v.replaceChildren(),v.style.display=\\\"block\\\")),T}}),Jn=g.runEvent.bind(g,d),zn=g.transform.bind(g,d),v&&E(\\\"ready\\\"),s?.onReady&&_t(s?.onReady).call(g,Bn.call(g,w,d),tr),await g[m](d,r),[\\\"micropython\\\",\\\"pyodide\\\"].includes(g.type)){const e=\\\"polyscript\\\",t=`__${e}_workers__`,n=\\\"__export__\\\";d.runPython([`import js as ${t}`,`${t}.${t} = \\\"${n}\\\" in locals() and ${n} or []`,`del ${t}`].join(\\\"\\\\n\\\"));const r=[...globalThis[t]];delete globalThis[t],r.length&&d.runPython([`from ${e} import xworker as ${t}`,...r.map((e=>`${t}.sync.${e} = ${e}`)),`del ${t}`].join(\\\"\\\\n\\\"))}return v&&E(\\\"done\\\"),postMessage(\\\"polyscript:done\\\"),d}catch(e){postMessage(e)}})(),Gn(\\\"error\\\"),Gn(\\\"message\\\"),Gn(\\\"messageerror\\\")}));\\n\".replace(re,place)],{type:'application/javascript'})), ...args)\n/* c8 ignore stop */\n","// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const io = new WeakMap();\nexport const stdio = (init) => {\n    const context = init || console;\n    const localIO = {\n        // allow plugins or other io manipulating logic to reuse\n        // the buffered utility exposed in here (see py-editor)\n        buffered,\n        stderr: (context.stderr || console.error).bind(context),\n        stdout: (context.stdout || console.log).bind(context),\n    };\n    return {\n        stderr: (...args) => localIO.stderr(...args),\n        stdout: (...args) => localIO.stdout(...args),\n        async get(engine) {\n            const interpreter = await engine;\n            io.set(interpreter, localIO);\n            return interpreter;\n        },\n    };\n};\n\nconst decoder = new TextDecoder();\nexport const buffered = (callback, EOL = 10) => {\n    const buffer = [];\n    return (maybeUI8) => {\n        if (maybeUI8 instanceof Uint8Array) {\n            for (const c of maybeUI8) {\n                if (c === EOL)\n                    callback(decoder.decode(new Uint8Array(buffer.splice(0))));\n                else\n                    buffer.push(c);\n            }\n        }\n        // if io.stderr(error) is passed instead\n        // or any io.stdout(\"thing\") this should\n        // still work as expected\n        else {\n            callback(maybeUI8);\n        }\n    };\n};\n/* c8 ignore stop */\n","import { io, stdio } from './_io.js';\n\nconst registry = new Map;\n\nconst type = 'dummy';\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nconst require = name => registry.get(name);\n\nconst run = (interpreter, code) => {\n    try {\n        return Function('require', code)(require);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n\nexport default {\n    type,\n    module: () => 'data:application/javascript,',\n    engine: module => stdio().get(module),\n    registerJSModule(_, name, value) {\n        registry.set(name, value);\n    },\n    run,\n    runAsync: run,\n    runEvent: async (interpreter, code, event) => {\n        try {\n            await Function('require', 'e', `return ${code}(e)`)(require, event);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    transform: (_, value) => value,\n    writeFile() {},\n};\n","Promise.withResolvers || (Promise.withResolvers = function withResolvers() {\n  var a, b, c = new this(function (resolve, reject) {\n    a = resolve;\n    b = reject;\n  });\n  return {resolve: a, reject: b, promise: c};\n});\n","import content from 'plain-tag';\n\nconst dedent = {\n  object(...args) {\n    return this.string(content(...args));\n  },\n  string(content) {\n    for (const line of content.split(/[\\r\\n]+/)) {\n      // skip initial empty lines\n      if (line.trim().length) {\n        // trap indentation at the very first line of code\n        if (/^(\\s+)/.test(line))\n          content = content.replace(new RegExp('^' + RegExp.$1, 'gm'), '');\n        // no indentation? all good: get out of here!\n        break;\n      }\n    }\n    return content;\n  }\n};\n\n/**\n * Usable both as template literal tag or just as callback for strings, removes all spaces found\n * at the very first line of code encountered while sanitizing, keeping everything else around.\n * @param {string | TemplateStringsArray} tpl either code as string or as template, when used as tag\n * @param  {...any} values the template interpolations, when used as tag\n * @returns {string} code without undesired indentation\n */\nconst codedent = (tpl, ...values) => dedent[typeof tpl](tpl, ...values);\n\nexport default codedent;\n","export default function (t) {\n  for (var s = t[0], i = 1, l = arguments.length; i < l; i++)\n    s += arguments[i] + t[i];\n  return s;\n};\n","/**\n * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nconst {replace} = '';\n\n// escape\nconst es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\nconst ca = /[&<>'\"]/g;\n\nconst esca = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  \"'\": '&#39;',\n  '\"': '&quot;'\n};\nconst pe = m => esca[m];\n\n/**\n * Safely escape HTML entities such as `&`, `<`, `>`, `\"`, and `'`.\n * @param {string} es the input to safely escape\n * @returns {string} the escaped input, and it **throws** an error if\n *  the input type is unexpected, except for boolean and numbers,\n *  converted as string.\n */\nexport const escape = es => replace.call(es, ca, pe);\n\n\n// unescape\nconst unes = {\n  '&amp;': '&',\n  '&#38;': '&',\n  '&lt;': '<',\n  '&#60;': '<',\n  '&gt;': '>',\n  '&#62;': '>',\n  '&apos;': \"'\",\n  '&#39;': \"'\",\n  '&quot;': '\"',\n  '&#34;': '\"'\n};\nconst cape = m => unes[m];\n\n/**\n * Safely unescape previously escaped entities such as `&`, `<`, `>`, `\"`,\n * and `'`.\n * @param {string} un a previously escaped string\n * @returns {string} the unescaped input, and it **throws** an error if\n *  the input type is unexpected, except for boolean and numbers,\n *  converted as string.\n */\nexport const unescape = un => replace.call(un, es, cape);\n","import $dedent from 'codedent';\nimport { unescape as $unescape } from 'html-escaper';\nimport { io } from './interpreter/_io.js';\n\n/** @type {(tpl: string | TemplateStringsArray, ...values:any[]) => string} */\nconst dedent = $dedent;\n\n/** @type {(value:string) => string} */\nconst unescape = $unescape;\n\nconst { isArray } = Array;\n\nconst { assign, create, defineProperties, defineProperty, entries } = Object;\n\nconst { all, resolve } = new Proxy(Promise, {\n    get: ($, name) => $[name].bind($),\n});\n\nconst absoluteURL = (path, base = location.href) =>\n    new URL(path, base.replace(/^blob:/, '')).href;\n\n/* c8 ignore start */\nlet id = 0;\nconst nodeInfo = (node, type) => ({\n    id: node.id || (node.id = `${type}-w${id++}`),\n    tag: node.tagName\n});\n\n/**\n * Notify the main thread about element \"readiness\".\n * @param {HTMLScriptElement | HTMLElement} target the script or custom-type element\n * @param {string} type the custom/type as event prefix\n * @param {string} what the kind of event to dispatch, i.e. `ready` or `done`\n * @param {boolean} [worker = false] `true` if dispatched form a worker, `false` by default if in main\n * @param {globalThis.CustomEvent} [CustomEvent = globalThis.CustomEvent] the `CustomEvent` to use\n */\nconst dispatch = (target, type, what, worker = false, CE = CustomEvent) => {\n    target.dispatchEvent(\n        new CE(`${type}:${what}`, {\n            bubbles: true,\n            detail: { worker },\n        })\n    );\n};\n\nexport const createFunction = value => Function(`'use strict';return (${value})`)();\n\nexport const createResolved = (module, type, config, interpreter) => ({\n    type,\n    config,\n    interpreter,\n    io: io.get(interpreter),\n    run: (code, ...args) => module.run(interpreter, code, ...args),\n    runAsync: (code, ...args) => module.runAsync(interpreter, code, ...args),\n    runEvent: (...args) => module.runEvent(interpreter, ...args),\n});\n\nconst dropLine0 = code => code.replace(/^(?:\\n|\\r\\n)/, '');\n\nexport const createOverload = (module, name, before, after) => {\n    const method = module[name].bind(module);\n    module[name] = name === 'run' ?\n        // patch the sync method\n        (interpreter, code, ...args) => {\n            if (before) method(interpreter, before, ...args);\n            const result = method(interpreter, dropLine0(code), ...args);\n            if (after) method(interpreter, after, ...args);\n            return result;\n        } :\n        // patch the async one\n        async (interpreter, code, ...args) => {\n            if (before) await method(interpreter, before, ...args);\n            const result = await method(interpreter, dropLine0(code), ...args);\n            if (after) await method(interpreter, after, ...args);\n            return result;\n        };\n};\n\nexport const js_modules = Symbol.for('polyscript.js_modules');\n\nconst jsModules = new Map;\ndefineProperty(globalThis, js_modules, { value: jsModules });\n\nexport const JSModules = new Proxy(jsModules, {\n    get: (map, name) => map.get(name),\n    has: (map, name) => map.has(name),\n    ownKeys: map => [...map.keys()],\n});\n\nconst has = (_, field) => !field.startsWith('_');\n\nconst proxy = (modules, name) => new Proxy(\n    modules,\n    { has, get: (modules, field) => modules[name][field] }\n);\n\nexport const registerJSModules = (type, module, interpreter, modules) => {\n    // Pyodide resolves JS modules magically\n    if (type === 'pyodide') return;\n\n    // other runtimes need this pretty ugly dance (it works though)\n    const jsModules = 'polyscript.js_modules';\n    for (const name of Reflect.ownKeys(modules))\n        module.registerJSModule(interpreter, `${jsModules}.${name}`, proxy(modules, name));\n    module.registerJSModule(interpreter, jsModules, modules);\n};\n\nexport const importJS = (source, name) => import(source).then(esm => {\n    jsModules.set(name, { ...esm });\n});\n\nexport const importCSS = href => new Promise((onload, onerror) => {\n    if (document.querySelector(`link[rel=\"stylesheet\"][href=\"${href}\"]`)) {\n        onload();\n    }\n    else {\n        document.head.append(\n            assign(\n                document.createElement('link'),\n                { rel: 'stylesheet', href, onload, onerror },\n            )\n        );\n    }\n});\n\nexport const isCSS = source => /\\.css$/i.test(new URL(source).pathname);\n/* c8 ignore stop */\n\nexport {\n    dedent, unescape,\n    dispatch,\n    isArray,\n    assign,\n    create,\n    defineProperties,\n    defineProperty,\n    entries,\n    all,\n    resolve,\n    absoluteURL,\n    nodeInfo,\n};\n","import '@ungap/with-resolvers';\nimport fetch from '@webreflection/fetch';\n\nimport { absoluteURL, all, entries, importCSS, importJS, isArray, isCSS } from '../utils.js';\n\nexport const RUNNING_IN_WORKER = !globalThis.window;\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\n\n// This should be the only helper needed for all Emscripten based FS exports\nexport const writeFile = ({ FS, PATH, PATH_FS }, path, buffer) => {\n    const absPath = PATH_FS.resolve(path);\n    const dirPath = PATH.dirname(absPath);\n    if (FS.mkdirTree) FS.mkdirTree(dirPath);\n    else mkdirTree(FS, dirPath);\n    return FS.writeFile(absPath, new Uint8Array(buffer), {\n        canOwn: true,\n    });\n};\n\n// This is instead a fallback for Lua or others\nexport const writeFileShim = (FS, path, buffer) => {\n    mkdirTree(FS, dirname(path));\n    path = resolve(FS, path);\n    return FS.writeFile(path, new Uint8Array(buffer), { canOwn: true });\n};\n\nconst dirname = (path) => {\n    const tree = path.split('/');\n    tree.pop();\n    return tree.join('/');\n};\n\nconst mkdirTree = (FS, path) => {\n    const current = [];\n    for (const branch of path.split('/')) {\n        if (branch === '.' || branch === '..') continue;\n        current.push(branch);\n        if (branch) FS.mkdir(current.join('/'));\n    }\n};\n\nconst resolve = (FS, path) => {\n    const tree = [];\n    for (const branch of path.split('/')) {\n        switch (branch) {\n            case '':\n                break;\n            case '.':\n                break;\n            case '..':\n                tree.pop();\n                break;\n            default:\n                tree.push(branch);\n        }\n    }\n    return [FS.cwd()].concat(tree).join('/').replace(/^\\/+/, '/');\n};\n\nconst calculateFetchPaths = (config_fetch) => {\n    for (const { files, to_file, from = '' } of config_fetch) {\n        if (files !== undefined && to_file !== undefined)\n            throw new Error(\n                'Cannot use \\'to_file\\' and \\'files\\' parameters together!',\n            );\n        if (files === undefined && to_file === undefined && from.endsWith('/'))\n            throw new Error(\n                `Couldn't determine the filename from the path ${from}, please supply 'to_file' parameter.`,\n            );\n    }\n    return config_fetch.flatMap(\n        ({ from = '', to_folder = '.', to_file, files }) => {\n            if (isArray(files))\n                return files.map((file) => ({\n                    url: joinPaths([from, file]),\n                    path: joinPaths([to_folder, file]),\n                }));\n            const filename = to_file || from.slice(1 + from.lastIndexOf('/'));\n            return [{ url: from, path: joinPaths([to_folder, filename]) }];\n        },\n    );\n};\n\nconst joinPaths = (parts) => {\n    const res = parts\n        .map((part) => part.trim().replace(/(^[/]*|[/]*$)/g, ''))\n        .filter((p) => p !== '' && p !== '.')\n        .join('/');\n\n    return parts[0].startsWith('/') ? `/${res}` : res;\n};\n\nconst fetchBuffer = (url, baseURL) =>\n    fetch(absoluteURL(url, baseURL)).arrayBuffer();\n\nexport const fetchPaths = (module, interpreter, config_fetch, baseURL) =>\n    all(\n        calculateFetchPaths(config_fetch).map(({ url, path }) =>\n            fetchBuffer(url, baseURL)\n                .then((buffer) => module.writeFile(interpreter, path, buffer)),\n        ),\n    );\n\n    const fillName = (source, dest) => dest.endsWith('/') ?\n                        `${dest}${source.split('/').pop()}` : dest;\n\nconst parseTemplate = (src, map) => src.replace(\n  /\\{.+?\\}/g,\n  k => {\n    if (!map.has(k))\n      throw new SyntaxError(`Invalid template: ${k}`);\n    return map.get(k);\n  }\n);\n\nconst calculateFilesPaths = files => {\n  const map = new Map;\n  const targets = new Set;\n  const sourceDest = [];\n  for (const [source, dest] of entries(files)) {\n    if (/^\\{.+\\}$/.test(source)) {\n      if (map.has(source))\n        throw new SyntaxError(`Duplicated template: ${source}`);\n      map.set(source, parseTemplate(dest, map));\n    }\n    else {\n      const url = parseTemplate(source, map);\n      const path = fillName(url, parseTemplate(dest || './', map));\n      if (targets.has(path))\n        throw new SyntaxError(`Duplicated destination: ${path}`);\n      targets.add(path);\n      sourceDest.push({ url, path });\n    }\n  }\n  return sourceDest;\n};\n\nexport const fetchFiles = (module, interpreter, config_files, baseURL) =>\n    all(\n        calculateFilesPaths(config_files).map(({ url, path }) =>\n            fetchBuffer(url, baseURL)\n                .then((buffer) => module.writeFile(\n                    interpreter,\n                    path,\n                    buffer,\n                    url,\n                )),\n        ),\n    );\n\nexport const fetchJSModules = ({ main, worker }, baseURL) => {\n    const promises = [];\n    if (worker && RUNNING_IN_WORKER) {\n        for (let [source, name] of entries(worker)) {\n            source = absoluteURL(source, baseURL);\n            promises.push(importJS(source, name));\n        }\n    }\n    if (main && !RUNNING_IN_WORKER) {\n        for (let [source, name] of entries(main)) {\n            source = absoluteURL(source, baseURL);\n            if (isCSS(source)) importCSS(source);\n            else promises.push(importJS(source, name));\n        }\n    }\n    return all(promises);\n};\n/* c8 ignore stop */\n","const { assign } = Object;\n\nconst STORAGE = 'entries';\nconst READONLY = 'readonly';\nconst READWRITE = 'readwrite';\n\n/**\n * @typedef {Object} IDBMapOptions\n * @prop {'strict' | 'relaxed' | 'default'} [durability]\n * @prop {string} [prefix]\n */\n\n/** @typedef {[IDBValidKey, unknown]} IDBMapEntry */\n\n/** @type {IDBMapOptions} */\nconst defaultOptions = { durability: 'default', prefix: 'IDBMap' };\n\n/**\n * @template T\n * @param {{ target: IDBRequest<T> }} event\n * @returns {T}\n */\nconst result = ({ target: { result } }) => result;\n\nexport default class IDBMap extends EventTarget {\n  // Privates\n  /** @type {Promise<IDBDatabase>} */ #db;\n  /** @type {IDBMapOptions} */ #options;\n  /** @type {string} */ #prefix;\n\n  /**\n   * @template T\n   * @param {(store: IDBObjectStore) => IDBRequest<T>} what\n   * @param {'readonly' | 'readwrite'} how\n   * @returns {Promise<T>}\n   */\n  async #transaction(what, how) {\n    const db = await this.#db;\n    const t = db.transaction(STORAGE, how, this.#options);\n    return new Promise((onsuccess, onerror) => assign(\n      what(t.objectStore(STORAGE)),\n      {\n        onsuccess,\n        onerror,\n      }\n    ));\n  }\n\n  /**\n   * @param {string} name\n   * @param {IDBMapOptions} options\n   */\n  constructor(\n    name,\n    {\n      durability = defaultOptions.durability,\n      prefix = defaultOptions.prefix,\n    } = defaultOptions\n  ) {\n    super();\n    this.#prefix = prefix;\n    this.#options = { durability };\n    this.#db = new Promise((resolve, reject) => {\n      assign(\n        indexedDB.open(`${this.#prefix}/${name}`),\n        {\n          onupgradeneeded({ target: { result, transaction } }) {\n            if (!result.objectStoreNames.length)\n              result.createObjectStore(STORAGE);\n            transaction.oncomplete = () => resolve(result);\n          },\n          onsuccess(event) {\n            resolve(result(event));\n          },\n          onerror(event) {\n            reject(event);\n            this.dispatchEvent(event);\n          },\n        },\n      );\n    }).then(result => {\n      const boundDispatch = this.dispatchEvent.bind(this);\n      for (const key in result) {\n        if (key.startsWith('on'))\n          result[key] = boundDispatch;\n      }\n      return result;\n    });\n  }\n\n  // EventTarget Forwards\n  /**\n   * @param {Event} event\n   * @returns \n   */\n  dispatchEvent(event) {\n    const { type, message, isTrusted } = event;\n    return super.dispatchEvent(\n      // avoid re-dispatching of the same event\n      isTrusted ?\n        assign(new Event(type), { message }) :\n        event\n    );\n  }\n\n  // IDBDatabase Forwards\n  async close() {\n    (await this.#db).close();\n  }\n\n  // Map async API\n  get size() {\n    return this.#transaction(\n      store => store.count(),\n      READONLY,\n    ).then(result);\n  }\n\n  async clear() {\n    await this.#transaction(\n      store => store.clear(),\n      READWRITE,\n    );\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   */\n  async delete(key) {\n    await this.#transaction(\n      store => store.delete(key),\n      READWRITE,\n    );\n  }\n\n  /**\n   * @returns {Promise<IDBMapEntry[]>}\n   */\n  async entries() {\n    const keys = await this.keys();\n    return Promise.all(keys.map(key => this.get(key).then(value => [key, value])));\n  }\n\n  /**\n   * @param {(unknown, IDBValidKey, IDBMap) => void} callback\n   * @param {unknown} [context]\n   */\n  async forEach(callback, context = this) {\n    for (const [key, value] of await this.entries())\n      await callback.call(context, value, key, this);\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   * @returns {Promise<unknown | undefined>}\n   */\n  async get(key) {\n    const value = await this.#transaction(\n      store => store.get(key),\n      READONLY,\n    ).then(result);\n    return value;\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   */\n  async has(key) {\n    const k = await this.#transaction(\n      store => store.getKey(key),\n      READONLY,\n    ).then(result);\n    return k !== void 0;\n  }\n\n  async keys() {\n    const keys = await this.#transaction(\n      store => store.getAllKeys(),\n      READONLY,\n    ).then(result);\n    return keys;\n  }\n\n  /**\n   * @param {IDBValidKey} key\n   * @param {unknown} value\n   */\n  async set(key, value) {\n    await this.#transaction(\n      store => store.put(value, key),\n      READWRITE,\n    );\n    return this;\n  }\n\n  async values() {\n    const keys = await this.keys();\n    return Promise.all(keys.map(key => this.get(key)));\n  }\n\n  get [Symbol.toStringTag]() {\n    return this.#prefix;\n  }\n}\n","import IDBMap from './index.js';\n\nexport default class IDBMapSync extends Map {\n  #map;\n  #queue;\n  constructor(...args) {\n    super();\n    this.#map = new IDBMap(...args);\n    this.#queue = this.#map.entries().then(entries => {\n      for (const [key, value] of entries)\n        super.set(key, value);\n    });\n  }\n  async sync() {\n    await this.#queue;\n  }\n  clear() {\n    this.#queue = this.#queue.then(() => this.#map.clear());\n    return super.clear();\n  }\n  delete(key) {\n    this.#queue = this.#queue.then(() => this.#map.delete(key));\n    return super.delete(key);\n  }\n  set(key, value) {\n    this.#queue = this.#queue.then(() => this.#map.set(key, value));\n    return super.set(key, value);\n  }\n}\n","import * as JSON from '@ungap/structured-clone/json';\nimport IDBMapSync from '@webreflection/idb-map/sync';\nimport { dedent } from '../utils.js';\nimport { io } from './_io.js';\n\nexport const loader = new WeakMap();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const registerJSModule = (interpreter, name, value) => {\n    if (name === 'polyscript') {\n        value.lazy_py_modules = async (...packages) => {\n            await loader.get(interpreter)(packages);\n            return packages.map(name => interpreter.pyimport(name));\n        };\n        value.storage = async (name) => {\n            const storage = new IDBMapSync(name);\n            await storage.sync();\n            return storage;\n        };\n        value.JSON = JSON;\n    }\n    interpreter.registerJsModule(name, value);\n};\n\nexport const getFormat = (path, url) => {\n    if (path.endsWith('/*')) {\n        if (/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(url))\n            return RegExp.$1;\n        throw new Error(`Unsupported archive ${url}`);\n    }\n    return '';\n};\n\nexport const run = (interpreter, code, ...args) => {\n    try {\n        return interpreter.runPython(dedent(code), ...args);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n\nexport const runAsync = async (interpreter, code, ...args) => {\n    try {\n        return await interpreter.runPythonAsync(dedent(code), ...args);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n\nexport const runEvent = async (interpreter, code, event) => {\n    // allows method(event) as well as namespace.method(event)\n    // it does not allow fancy brackets names for now\n    const [name, ...keys] = code.split('.');\n    let target = interpreter.globals.get(name);\n    let context;\n    for (const key of keys) [context, target] = [target, target[key]];\n    try {\n        await target.call(context, event);\n    }\n    catch (error) {\n        io.get(interpreter).stderr(error);\n    }\n};\n/* c8 ignore stop */\n","// ⚠️ DO NOT MODIFY - SOURCE FILE: \"../../python/mip.py\"\nexport default new TextEncoder().encode(\"from uio import StringIO\\nimport sys\\n\\nclass Response:\\n    def __init__(self, f):\\n        self.raw = f\\n        self.encoding = \\\"utf-8\\\"\\n        self._cached = None\\n\\n    def close(self):\\n        if self.raw:\\n            self.raw.close()\\n            self.raw = None\\n        self._cached = None\\n\\n    @property\\n    def content(self):\\n        if self._cached is None:\\n            try:\\n                self._cached = self.raw.read()\\n            finally:\\n                self.raw.close()\\n                self.raw = None\\n        return self._cached\\n\\n    @property\\n    def text(self):\\n        return str(self.content, self.encoding)\\n\\n    def json(self):\\n        import ujson\\n\\n        return ujson.loads(self.content)\\n\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\n\\n\\ntry:\\n    import js\\nexcept Exception as err:\\n    raise OSError(\\\"This version of urequests can only be used in the browser\\\")\\n\\n# TODO try to support streaming xhr requests, a-la pyodide-http\\n\\nHEADERS_TO_IGNORE = (\\\"user-agent\\\",)\\n\\n\\ndef request(\\n    method,\\n    url,\\n    data=None,\\n    json=None,\\n    headers={},\\n    stream=None,\\n    auth=None,\\n    timeout=None,\\n    parse_headers=True,\\n):\\n    from js import XMLHttpRequest\\n\\n    xhr = XMLHttpRequest.new()\\n    xhr.withCredentials = False\\n\\n    if auth is not None:\\n        import ubinascii\\n\\n        username, password = auth\\n        xhr.open(method, url, False, username, password)\\n    else:\\n        xhr.open(method, url, False)\\n\\n    for name, value in headers.items():\\n        if name.lower() not in HEADERS_TO_IGNORE:\\n            xhr.setRequestHeader(name, value)\\n\\n    if timeout:\\n        xhr.timeout = int(timeout * 1000)\\n\\n    if json is not None:\\n        assert data is None\\n        import ujson\\n\\n        data = ujson.dumps(json)\\n        # s.write(b\\\"Content-Type: application/json\\\\r\\\\n\\\")\\n        xhr.setRequestHeader(\\\"Content-Type\\\", \\\"application/json\\\")\\n\\n    xhr.send(data)\\n\\n    # Emulates the construction process in the original urequests\\n    resp = Response(StringIO(xhr.responseText))\\n    resp.status_code = xhr.status\\n    resp.reason = xhr.statusText\\n    resp.headers = xhr.getAllResponseHeaders()\\n\\n    return resp\\n\\n\\n# Other methods - head, post, put, patch, delete - are not used by\\n# mip and therefore not included\\n\\n\\ndef get(url, **kw):\\n    return request(\\\"GET\\\", url, **kw)\\n\\n\\n# Content below this line is from the Micropython MIP package and is covered\\n# by the applicable MIT license:\\n# \\n# THE SOFTWARE IS PROVIDED β€œAS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \\n# DEALINGS IN THE SOFTWARE.\\n\\n# MicroPython package installer\\n# MIT license; Copyright (c) 2022 Jim Mussared\\n\\n\\n_PACKAGE_INDEX = const(\\\"https://micropython.org/pi/v2\\\")\\n_CHUNK_SIZE = 128\\n\\n\\n# This implements os.makedirs(os.dirname(path))\\ndef _ensure_path_exists(path):\\n    import os\\n\\n    split = path.split(\\\"/\\\")\\n\\n    # Handle paths starting with \\\"/\\\".\\n    if not split[0]:\\n        split.pop(0)\\n        split[0] = \\\"/\\\" + split[0]\\n\\n    prefix = \\\"\\\"\\n    for i in range(len(split) - 1):\\n        prefix += split[i]\\n        try:\\n            os.stat(prefix)\\n        except:\\n            os.mkdir(prefix)\\n        prefix += \\\"/\\\"\\n\\n\\n# Copy from src (stream) to dest (function-taking-bytes)\\ndef _chunk(src, dest):\\n    buf = memoryview(bytearray(_CHUNK_SIZE))\\n    while True:\\n        n = src.readinto(buf)\\n        if n == 0:\\n            break\\n        dest(buf if n == _CHUNK_SIZE else buf[:n])\\n\\n\\n# Check if the specified path exists and matches the hash.\\ndef _check_exists(path, short_hash):\\n    import os\\n\\n    try:\\n        import binascii\\n        import hashlib\\n\\n        with open(path, \\\"rb\\\") as f:\\n            hs256 = hashlib.sha256()\\n            _chunk(f, hs256.update)\\n            existing_hash = str(binascii.hexlify(hs256.digest())[: len(short_hash)], \\\"utf-8\\\")\\n            return existing_hash == short_hash\\n    except:\\n        return False\\n\\n\\ndef _rewrite_url(url, branch=None):\\n    if not branch:\\n        branch = \\\"HEAD\\\"\\n    if url.startswith(\\\"github:\\\"):\\n        url = url[7:].split(\\\"/\\\")\\n        url = (\\n            \\\"https://raw.githubusercontent.com/\\\"\\n            + url[0]\\n            + \\\"/\\\"\\n            + url[1]\\n            + \\\"/\\\"\\n            + branch\\n            + \\\"/\\\"\\n            + \\\"/\\\".join(url[2:])\\n        )\\n    return url\\n\\n\\ndef _download_file(url, dest):\\n    response = get(url)\\n    try:\\n        if response.status_code != 200:\\n            print(\\\"Error\\\", response.status_code, \\\"requesting\\\", url)\\n            return False\\n\\n        print(\\\"Copying:\\\", dest)\\n        _ensure_path_exists(dest)\\n        with open(dest, \\\"wb\\\") as f:\\n            _chunk(response.raw, f.write)\\n\\n        return True\\n    finally:\\n        response.close()\\n\\n\\ndef _install_json(package_json_url, index, target, version, mpy):\\n    response = get(_rewrite_url(package_json_url, version))\\n    try:\\n        if response.status_code != 200:\\n            print(\\\"Package not found:\\\", package_json_url)\\n            return False\\n\\n        package_json = response.json()\\n    finally:\\n        response.close()\\n    for target_path, short_hash in package_json.get(\\\"hashes\\\", ()):\\n        fs_target_path = target + \\\"/\\\" + target_path\\n        if _check_exists(fs_target_path, short_hash):\\n            print(\\\"Exists:\\\", fs_target_path)\\n        else:\\n            file_url = \\\"{}/file/{}/{}\\\".format(index, short_hash[:2], short_hash)\\n            if not _download_file(file_url, fs_target_path):\\n                print(\\\"File not found: {} {}\\\".format(target_path, short_hash))\\n                return False\\n    for target_path, url in package_json.get(\\\"urls\\\", ()):\\n        fs_target_path = target + \\\"/\\\" + target_path\\n        if not _download_file(_rewrite_url(url, version), fs_target_path):\\n            print(\\\"File not found: {} {}\\\".format(target_path, url))\\n            return False\\n    for dep, dep_version in package_json.get(\\\"deps\\\", ()):\\n        if not _install_package(dep, index, target, dep_version, mpy):\\n            return False\\n    return True\\n\\n\\ndef _install_package(package, index, target, version, mpy):\\n    if (\\n        package.startswith(\\\"http://\\\")\\n        or package.startswith(\\\"https://\\\")\\n        or package.startswith(\\\"github:\\\")\\n    ):\\n        if package.endswith(\\\".py\\\") or package.endswith(\\\".mpy\\\"):\\n            print(\\\"Downloading {} to {}\\\".format(package, target))\\n            return _download_file(\\n                _rewrite_url(package, version), target + \\\"/\\\" + package.rsplit(\\\"/\\\")[-1]\\n            )\\n        else:\\n            if not package.endswith(\\\".json\\\"):\\n                if not package.endswith(\\\"/\\\"):\\n                    package += \\\"/\\\"\\n                package += \\\"package.json\\\"\\n            print(\\\"Installing {} to {}\\\".format(package, target))\\n    else:\\n        if not version:\\n            version = \\\"latest\\\"\\n        print(\\\"Installing {} ({}) from {} to {}\\\".format(package, version, index, target))\\n\\n        mpy_version = (\\n            sys.implementation._mpy & 0xFF if mpy and hasattr(sys.implementation, \\\"_mpy\\\") else \\\"py\\\"\\n        )\\n\\n        # WARNING: mpy_version fails miserably with 1.22.0-380\\n        package = \\\"{}/package/{}/{}/{}.json\\\".format(index, \\\"py\\\", package, version)\\n\\n    return _install_json(package, index, target, version, mpy)\\n\\n\\ndef install(package, index=None, target=None, version=None, mpy=True):\\n    if not target:\\n        for p in sys.path:\\n            if p.endswith(\\\"/lib\\\"):\\n                target = p\\n                break\\n        else:\\n            print(\\\"Unable to find lib dir in sys.path\\\")\\n            return\\n\\n    if not index:\\n        index = _PACKAGE_INDEX\\n\\n    if _install_package(package, index.rstrip(\\\"/\\\"), target, version, mpy):\\n        print(\\\"Done\\\")\\n    else:\\n        print(\\\"Package may be partially installed\\\")\\n\");","/* c8 ignore start */\n\n// toml\nexport const toml = async (text) => (\n  await import(/* webpackIgnore: true */'./3rd-party/toml.js')\n).parse(text);\n\n// zip\nexport const zip = () => import(/* webpackIgnore: true */'./3rd-party/zip.js');\n\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\n\nimport { fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';\nimport { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';\nimport { stdio, buffered } from './_io.js';\nimport { absoluteURL } from '../utils.js';\nimport mip from '../python/mip.js';\nimport { zip } from '../3rd-party.js';\n\nconst type = 'micropython';\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nconst mkdir = (FS, path) => {\n    try {\n        FS.mkdir(path);\n    }\n    // eslint-disable-next-line no-unused-vars\n    catch (_) {\n        // ignore as there's no path.exists here\n    }\n};\n\nexport default {\n    type,\n    module: (version = '1.24.0-preview-114') =>\n        `https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${version}/micropython.mjs`,\n    async engine({ loadMicroPython }, config, url, baseURL) {\n        const { stderr, stdout, get } = stdio({\n            stderr: buffered(console.error),\n            stdout: buffered(console.log),\n        });\n        url = url.replace(/\\.m?js$/, '.wasm');\n        const interpreter = await get(loadMicroPython({ linebuffer: false, stderr, stdout, url }));\n        const py_imports = importPackages.bind(this, interpreter, baseURL);\n        loader.set(interpreter, py_imports);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n\n        // Install Micropython Package\n        this.writeFile(interpreter, './mip.py', mip);\n        if (config.packages) await py_imports(config.packages);\n        return interpreter;\n    },\n    registerJSModule,\n    run,\n    runAsync,\n    runEvent,\n    transform: (interpreter, value) => interpreter.PyProxy.toJs(value),\n    writeFile: (interpreter, path, buffer, url) => {\n        const { FS, _module: { PATH, PATH_FS } } = interpreter;\n        const fs = { FS, PATH, PATH_FS };\n        const format = getFormat(path, url);\n        if (format) {\n            const extractDir = path.slice(0, -1);\n            if (extractDir !== './') FS.mkdir(extractDir);\n            switch (format) {\n                case 'whl':\n                case 'zip': {\n                    const blob = new Blob([buffer], { type: 'application/zip' });\n                    return zip().then(async ({ BlobReader, Uint8ArrayWriter, ZipReader }) => {\n                        const zipFileReader = new BlobReader(blob);\n                        const zipReader = new ZipReader(zipFileReader);\n                        for (const entry of await zipReader.getEntries()) {\n                            const { directory, filename } = entry;\n                            const name = extractDir + filename;\n                            if (directory) mkdir(FS, name);\n                            else {\n                                mkdir(FS, PATH.dirname(name));\n                                const buffer = await entry.getData(new Uint8ArrayWriter);\n                                FS.writeFile(name, buffer, {\n                                    canOwn: true,\n                                });\n                            }\n                        }\n                        zipReader.close();\n                    });\n                }\n                case 'tgz':\n                case 'tar.gz': {\n                    const TMP = './_.tar.gz';\n                    writeFile(fs, TMP, buffer);\n                    interpreter.runPython(`\n                        import os, gzip, tarfile\n                        tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open(\"${TMP}\", \"rb\")))\n                        for f in tar:\n                            name = f\"${extractDir}{f.name}\"\n                            if f.type == tarfile.DIRTYPE:\n                                if f.name != \"./\":\n                                    os.mkdir(name.strip(\"/\"))\n                            else:\n                                dir = os.path.dirname(name)\n                                if not os.path.exists(dir):\n                                    os.mkdir(dir)\n                                source = tar.extractfile(f)\n                                with open(name, \"wb\") as dest:\n                                    dest.write(source.read())\n                                    dest.close()\n                        tar.close()\n                        os.remove(\"${TMP}\")\n                    `);\n                    return;\n                }\n            }\n        }\n        return writeFile(fs, path, buffer);\n    },\n};\n\nasync function importPackages(interpreter, baseURL, packages) {\n    let mip;\n    for (const mpyPackage of packages) {\n        if (mpyPackage.endsWith('.whl')) {\n            const url = absoluteURL(mpyPackage, baseURL);\n            const buffer = await fetch(url).arrayBuffer();\n            await this.writeFile(interpreter, './*', buffer, url);\n        }\n        else {\n            if (!mip) mip = interpreter.pyimport('mip');\n            mip.install(mpyPackage);\n        }\n    }\n}\n/* c8 ignore stop */\n","import { create } from 'gc-hook';\n\nimport { RUNNING_IN_WORKER, fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';\nimport { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';\nimport { stdio } from './_io.js';\n\nconst type = 'pyodide';\nconst toJsOptions = { dict_converter: Object.fromEntries };\n\n/* c8 ignore start */\nlet overrideFunction = false;\nconst overrideMethod = method => (...args) => {\n    try {\n        overrideFunction = true;\n        return method(...args);\n    }\n    finally {\n        overrideFunction = false;\n    }\n};\n\nlet overridden = false;\nconst applyOverride = () => {\n    if (overridden) return;\n    overridden = true;\n\n    const proxies = new WeakMap;\n    const onGC = value => value.destroy();\n    const patchArgs = args => {\n        for (let i = 0; i < args.length; i++) {\n            const value = args[i];\n            if (\n                typeof value === 'function' &&\n                'copy' in value\n            ) {\n                // avoid seppuku / Harakiri + speed up\n                overrideFunction = false;\n                // reuse copied value if known already\n                let proxy = proxies.get(value)?.deref();\n                if (!proxy) {\n                    try {\n                        // observe the copy and return a Proxy reference\n                        proxy = create(value.copy(), onGC);\n                        proxies.set(value, new WeakRef(proxy));\n                    }\n                    catch (error) {\n                        console.error(error);\n                    }\n                }\n                if (proxy) args[i] = proxy;\n                overrideFunction = true;\n            }\n        }\n    };\n\n    // trap apply to make call possible after the patch\n    const { call } = Function;\n    const apply = call.bind(call, call.apply);\n    // the patch\n    Object.defineProperties(Function.prototype, {\n        apply: {\n            value(context, args) {\n                if (overrideFunction) patchArgs(args);\n                return apply(this, context, args);\n            }\n        },\n        call: {\n            value(context, ...args) {\n                if (overrideFunction) patchArgs(args);\n                return apply(this, context, args);\n            }\n        }\n    });\n};\n/* c8 ignore stop */\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    module: (version = '0.26.1') =>\n        `https://cdn.jsdelivr.net/pyodide/v${version}/full/pyodide.mjs`,\n    async engine({ loadPyodide }, config, url, baseURL) {\n        // apply override ASAP then load foreign code\n        if (!RUNNING_IN_WORKER && config.experimental_create_proxy === 'auto')\n            applyOverride();\n        const { stderr, stdout, get } = stdio();\n        const indexURL = url.slice(0, url.lastIndexOf('/'));\n        const interpreter = await get(\n            loadPyodide({ stderr, stdout, indexURL }),\n        );\n        const py_imports = importPackages.bind(interpreter);\n        loader.set(interpreter, py_imports);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        if (config.packages) await py_imports(config.packages);\n        return interpreter;\n    },\n    registerJSModule,\n    run: overrideMethod(run),\n    runAsync: overrideMethod(runAsync),\n    runEvent: overrideMethod(runEvent),\n    transform: ({ ffi: { PyProxy } }, value) => (\n        value instanceof PyProxy ?\n            value.toJs(toJsOptions) :\n            value\n    ),\n    writeFile: (interpreter, path, buffer, url) => {\n        const format = getFormat(path, url);\n        if (format) {\n            return interpreter.unpackArchive(buffer, format, {\n                extractDir: path.slice(0, -1)\n            });\n        }\n        const { FS, PATH, _module: { PATH_FS } } = interpreter;\n        return writeFile({ FS, PATH, PATH_FS }, path, buffer);\n    },\n};\n\n// exposed utility to import packages via polyscript.lazy_py_modules\nasync function importPackages(packages) {\n    await this.loadPackage('micropip');\n    const micropip = this.pyimport('micropip');\n    await micropip.install(packages, { keep_going: true });\n    micropip.destroy();\n}\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\n\nimport { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths } from './_utils.js';\n\nconst type = 'ruby-wasm-wasi';\nconst jsType = type.replace(/\\W+/g, '_');\n\n// MISSING:\n//  * there is no VFS apparently or I couldn't reach any\n//  * I've no idea how to override the stderr and stdout\n//  * I've no idea how to import packages\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    experimental: true,\n    module: (version = '2.6.2') =>\n        `https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${version}/dist/browser/+esm`,\n    async engine({ DefaultRubyVM }, config, url, baseURL) {\n        url = url.replace(/\\/browser\\/\\+esm$/, '/ruby.wasm');\n        const buffer = await fetch(url).arrayBuffer();\n        const module = await WebAssembly.compile(buffer);\n        const { vm: interpreter } = await DefaultRubyVM(module);\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields (i.e. $xworker)\n    registerJSModule(interpreter, name, value) {\n        name = name.replace(/\\W+/g, '__');\n        const id = `__module_${jsType}_${name}`;\n        globalThis[id] = value;\n        this.run(interpreter, `require \"js\";$${name}=JS.global[:${id}]`);\n        delete globalThis[id];\n    },\n    run: (interpreter, code, ...args) => interpreter.eval(dedent(code), ...args),\n    runAsync: (interpreter, code, ...args) => interpreter.evalAsync(dedent(code), ...args),\n    async runEvent(interpreter, code, event) {\n        // patch common xworker.onmessage/onerror cases\n        if (/^xworker\\.(on\\w+)$/.test(code)) {\n            const { $1: name } = RegExp;\n            const id = `__module_${jsType}_event`;\n            globalThis[id] = event;\n            this.run(\n                interpreter,\n                `require \"js\";$xworker.call(\"${name}\",JS.global[:${id}])`,\n            );\n            delete globalThis[id];\n        } else {\n            // Experimental: allows only events by fully qualified method name\n            const method = this.run(interpreter, `method(:${code})`);\n            await method.call(code, interpreter.wrap(event));\n        }\n    },\n    transform: (_, value) => value,\n    writeFile: () => {\n        throw new Error(`writeFile is not supported in ${type}`);\n    },\n};\n/* c8 ignore stop */\n","import { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths, writeFileShim } from './_utils.js';\nimport { io, stdio } from './_io.js';\n\nconst type = 'wasmoon';\n\n// MISSING:\n//  * I've no idea how to import packages\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default {\n    type,\n    module: (version = '1.16.0') =>\n        `https://cdn.jsdelivr.net/npm/wasmoon@${version}/+esm`,\n    async engine({ LuaFactory, LuaLibraries }, config, _, baseURL) {\n        const { stderr, stdout, get } = stdio();\n        const interpreter = await get(new LuaFactory().createEngine());\n        interpreter.global.getTable(LuaLibraries.Base, (index) => {\n            interpreter.global.setField(index, 'print', stdout);\n            interpreter.global.setField(index, 'printErr', stderr);\n        });\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields\n    registerJSModule: (interpreter, name, value) => {\n        interpreter.global.set(name, value);\n    },\n    run: (interpreter, code, ...args) => {\n        try {\n            return interpreter.doStringSync(dedent(code), ...args);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    runAsync: async (interpreter, code, ...args) => {\n        try {\n            return await interpreter.doString(dedent(code), ...args);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    runEvent: async (interpreter, code, event) => {\n        // allows method(event) as well as namespace.method(event)\n        // it does not allow fancy brackets names for now\n        const [name, ...keys] = code.split('.');\n        let target = interpreter.global.get(name);\n        let context;\n        for (const key of keys) [context, target] = [target, target[key]];\n        try {\n            await target.call(context, event);\n        }\n        catch (error) {\n            io.get(interpreter).stderr(error);\n        }\n    },\n    transform: (_, value) => value,\n    writeFile: (\n        {\n            cmodule: {\n                module: { FS },\n            },\n        },\n        path,\n        buffer,\n    ) => writeFileShim(FS, path, buffer),\n};\n/* c8 ignore stop */\n","import { create } from 'gc-hook';\nimport { dedent } from '../utils.js';\nimport { fetchFiles, fetchJSModules, fetchPaths } from './_utils.js';\nimport { io, stdio } from './_io.js';\n\nconst type = 'webr';\nconst r = new WeakMap();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nconst run = async (interpreter, code) => {\n  const { shelter, destroy, io } = r.get(interpreter);\n  const { output, result } = await shelter.captureR(dedent(code));\n  for (const { type, data } of output) io[type](data);\n  // this is a double proxy but it's OK as the consumer\n  // of the result here needs to invoke explicitly a conversion\n  // or trust the `(await p.toJs()).values` returns what's expected.\n  return create(result, destroy, { token: false });\n};\n\nexport default {\n    type,\n    experimental: true,\n    module: (version = '0.4.0') =>\n        `https://cdn.jsdelivr.net/npm/webr@${version}/dist/webr.mjs`,\n    async engine(module, config, _, baseURL) {\n        const { get } = stdio();\n        const interpreter = new module.WebR();\n        await get(interpreter.init().then(() => interpreter));\n        const shelter = await new interpreter.Shelter();\n        r.set(interpreter, {\n          module,\n          shelter,\n          destroy: shelter.destroy.bind(shelter),\n          io: io.get(interpreter),\n        });\n        if (config.files) await fetchFiles(this, interpreter, config.files, baseURL);\n        if (config.fetch) await fetchPaths(this, interpreter, config.fetch, baseURL);\n        if (config.js_modules) await fetchJSModules(config.js_modules, baseURL);\n        return interpreter;\n    },\n    // Fallback to globally defined module fields (i.e. $xworker)\n    registerJSModule(_, name) {\n        console.warn(`Experimental interpreter: module ${name} is not supported (yet)`);\n        // TODO: as complex JS objects / modules are not allowed\n        // it's not clear how we can bind anything or import a module\n        // in a context that doesn't understand methods from JS\n        // https://docs.r-wasm.org/webr/latest/convert-js-to-r.html#constructing-r-objects-from-javascript-objects\n    },\n    run,\n    runAsync: run,\n    async runEvent(interpreter, code, event) {\n        // TODO: WebR cannot convert exoteric objects or any literal\n        // to an easy to reason about data/frame ... that conversion\n        // is reserved for the future:\n        // https://docs.r-wasm.org/webr/latest/convert-js-to-r.html#constructing-r-objects-from-javascript-objects\n        await interpreter.evalRVoid(`${code}(event)`, {\n          env: { event: { type: [ event.type ] } }\n        });\n    },\n    transform: (_, value) => {\n        console.log('transforming', value);\n        return value;\n    },\n    writeFile: () => {\n        // MAYBE ???\n    },\n};\n/* c8 ignore stop */\n","// ⚠️ Part of this file is automatically generated\n//    The :RUNTIMES comment is a delimiter and no code should be written/changed after\n//    See rollup/build_interpreters.cjs to know more\n\n/** @type {Map<string, object>} */\nexport const registry = new Map();\n\n/** @type {Map<string, object>} */\nexport const configs = new Map();\n\n/** @type {string[]} */\nexport const selectors = [];\n\n/** @type {string[]} */\nexport const prefixes = [];\n\n/* c8 ignore start */\nexport const interpreter = new Proxy(new Map(), {\n    get(map, id) {\n        if (!map.has(id)) {\n            const [type, ...rest] = id.split('@');\n            const interpreter = registry.get(type);\n            const url = /^(?:\\.?\\.?\\/|https?:\\/\\/)/i.test(rest) \n                ? rest.join('@')\n                : interpreter.module(...rest);\n            map.set(id, {\n                url,\n                module: import(/* webpackIgnore: true */url),\n                engine: interpreter.engine.bind(interpreter),\n            });\n        }\n        const { url, module, engine } = map.get(id);\n        return (config, baseURL) =>\n            module.then((module) => {\n                configs.set(id, config);\n                return engine(module, config, url, baseURL);\n            });\n    },\n});\n/* c8 ignore stop */\n\nconst register = (interpreter) => {\n    for (const type of [].concat(interpreter.type)) {\n        registry.set(type, interpreter);\n        selectors.push(`script[type=\"${type}\"]`);\n        prefixes.push(`${type}-`);\n    }\n};\n\n//:RUNTIMES\nimport dummy from './interpreter/dummy.js';\nimport micropython from './interpreter/micropython.js';\nimport pyodide from './interpreter/pyodide.js';\nimport ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js';\nimport wasmoon from './interpreter/wasmoon.js';\nimport webr from './interpreter/webr.js';\nfor (const interpreter of [dummy, micropython, pyodide, ruby_wasm_wasi, wasmoon, webr])\n    register(interpreter);\n","import fetch from '@webreflection/fetch';\n\nimport { interpreter } from './interpreters.js';\nimport { absoluteURL, resolve } from './utils.js';\nimport { toml } from './3rd-party.js';\n\nconst { parse } = JSON;\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport const getConfigURLAndType = (config, configURL = './config.txt') => {\n    let type = typeof config;\n    if (type === 'string' && /\\.(json|toml|txt)$/.test(config))\n        type = RegExp.$1;\n    else\n        config = configURL;\n    return [absoluteURL(config), type];\n};\n\nconst parseString = config => {\n    try {\n        return parse(config);\n    }\n    // eslint-disable-next-line no-unused-vars\n    catch (_) {\n        return toml(config);\n    }\n};\n/* c8 ignore stop */\n\n/**\n * Parse a generic config if it came from an attribute either as URL\n * or as a serialized string. In XWorker case, accepts a pre-defined\n * options to use as it is to avoid needing at all a fetch operation.\n * In latter case, config will be suffixed as `config.txt`.\n * @param {string} id the interpreter name @ version identifier\n * @param {string | object} config optional config file to parse\n * @param {string} [configURL] optional config URL if config is not string\n * @param {object} [options] optional options used to bootstrap XWorker\n * @returns\n */\nexport const getRuntime = (id, config, configURL, options = {}) => {\n    if (config) {\n        // REQUIRES INTEGRATION TEST\n        /* c8 ignore start */\n        const [absolute, type] = getConfigURLAndType(config, configURL);\n        if (type === 'json') {\n            options = fetch(absolute).json();\n        } else if (type === 'toml') {\n            options = fetch(absolute).text().then(toml);\n        } else if (type === 'string') {\n            options = parseString(config);\n        } else if (type === 'object' && config) {\n            options = config;\n        } else if (type === 'txt' && typeof options === 'string') {\n            options = parseString(options);\n        }\n        config = absolute;\n        /* c8 ignore stop */\n    }\n    return resolve(options).then(options => interpreter[id](options, config));\n};\n\n/**\n * @param {string} type the interpreter type\n * @param {string} [version] the optional interpreter version\n * @returns\n */\nexport const getRuntimeID = (type, version = '') =>\n    `${type}@${version}`.replace(/@$/, '');\n","export default function (callback = this) {\n  return String(callback).replace(\n    /^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,\n    (_, isAsync, fn, name) => (\n      name && !fn ?\n        `${isAsync || \"\"}function ${name}(` :\n        _\n    ),\n  );\n};\n","import { registry } from './interpreters.js';\n\nconst beforeRun = 'BeforeRun';\nconst afterRun = 'AfterRun';\n\nexport const code = [\n    `code${beforeRun}`,\n    `code${beforeRun}Async`,\n    `code${afterRun}`,\n    `code${afterRun}Async`,\n];\n\nexport const js = [\n    'onWorker',\n    'onReady',\n    `on${beforeRun}`,\n    `on${beforeRun}Async`,\n    `on${afterRun}`,\n    `on${afterRun}Async`,\n];\n\n/* c8 ignore start */\n// create a copy of the resolved wrapper with the original\n// run and runAsync so that, if used within onBeforeRun/Async\n// or onAfterRun/Async polluted entries won't matter and just\n// the native utilities will be available without seppuku.\n// The same applies if called within `onReady` worker hook.\nexport function patch(resolved, interpreter) {\n    const { run, runAsync } = registry.get(this.type);\n    return {\n        ...resolved,\n        run: run.bind(this, interpreter),\n        runAsync: runAsync.bind(this, interpreter)\n    };\n}\n\n/**\n * Created the wrapper to pass along hooked callbacks.\n * @param {object} module the details module\n * @param {object} ref the node or reference to pass as second argument\n * @param {boolean} isAsync if run should be async\n * @param {function?} before callback to run before\n * @param {function?} after callback to run after\n * @returns {object}\n */\nexport const polluteJS = (module, resolved, ref, isAsync, before, after) => {\n    if (before || after) {\n        const patched = patch.bind(module, resolved);\n        const name = isAsync ? 'runAsync' : 'run';\n        const method = module[name];\n        module[name] = isAsync ?\n            async function (interpreter, code, ...args) {\n                if (before) await before.call(this, patched(interpreter), ref);\n                const result = await method.call(\n                    this,\n                    interpreter,\n                    code,\n                    ...args\n                );\n                if (after) await after.call(this, patched(interpreter), ref);\n                return result;\n            } :\n            function (interpreter, code, ...args) {\n                if (before) before.call(this, patched(interpreter), ref);\n                const result = method.call(this, interpreter, code, ...args);\n                if (after) after.call(this, patched(interpreter), ref);\n                return result;\n            }\n        ;\n    }\n};\n/* c8 ignore stop */\n","import toJSONCallback from 'to-json-callback';\n\nimport { dedent } from '../utils.js';\nimport { js as jsHooks, code as codeHooks } from '../hooks.js';\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default class Hook {\n    constructor(interpreter, hooks = {}) {\n        const { main, worker } = hooks;\n        this.interpreter = interpreter;\n        this.onWorker = main?.onWorker;\n        // ignore onWorker as that's main only\n        for (const key of jsHooks.slice(1))\n            this[key] = worker?.[key];\n        for (const key of codeHooks)\n            this[key] = worker?.[key];\n    }\n    toJSON() {\n        const hooks = {};\n        // ignore onWorker as that's main only\n        for (const key of jsHooks.slice(1)) {\n            if (this[key]) hooks[key] = toJSONCallback(this[key]);\n        }\n        // code related: exclude `onReady` callback\n        for (const key of codeHooks) {\n            if (this[key]) hooks[key] = dedent(this[key]());\n        }\n        return hooks;\n    }\n}\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\nimport xworker from './xworker.js';\nimport { getConfigURLAndType } from '../loader.js';\nimport { assign, create, defineProperties, importCSS, importJS } from '../utils.js';\nimport Hook from './hook.js';\n\n/**\n * @typedef {Object} WorkerOptions custom configuration\n * @prop {string} type the interpreter type to use\n * @prop {string} [version] the optional interpreter version to use\n * @prop {string | object} [config] the optional config to use within such interpreter\n * @prop {string} [configURL] the optional configURL used to resolve config entries\n * @prop {string} [serviceWorker] the optional Service Worker for SharedArrayBuffer fallback\n * @prop {string} [service_worker] alias for `serviceWorker`\n */\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\nexport default (...args) =>\n    /**\n     * A XWorker is a Worker facade able to bootstrap a channel with any desired interpreter.\n     * @param {string} url the remote file to evaluate on bootstrap\n     * @param {WorkerOptions} [options] optional arguments to define the interpreter to use\n     * @returns {Worker}\n     */\n    function XWorker(url, options) {\n        if (args.length) {\n            const [type, version] = args;\n            options = assign({}, options || { type, version });\n            if (!options.type) options.type = type;\n        }\n\n        // provide a base url to fetch or load config files from a Worker\n        // because there's no location at all in the Worker as it's embedded.\n        // fallback to a generic, ignored, config.txt file to still provide a URL.\n        const [ config ] = getConfigURLAndType(options.config, options.configURL);\n\n        const serviceWorker = options?.serviceWorker || options?.service_worker;\n        const worker = xworker({ serviceWorker });\n        const { postMessage } = worker;\n        const isHook = this instanceof Hook;\n\n        const sync = assign(\n            worker.proxy,\n            { importJS, importCSS },\n        );\n\n        const resolver = Promise.withResolvers();\n\n        let bootstrap = fetch(url)\n            .text()\n            .then(code => {\n                const hooks = isHook ? this.toJSON() : void 0;\n                postMessage.call(worker, { options, config, code, hooks });\n            })\n            .then(() => {\n                // boost postMessage performance\n                bootstrap = { then: fn => fn() };\n            });\n\n        defineProperties(worker, {\n            sync: { value: sync },\n            ready: { value: resolver.promise },\n            postMessage: {\n                value: (data, ...rest) => bootstrap.then(\n                    () => postMessage.call(worker, data, ...rest),\n                ),\n            },\n            onerror: {\n                writable: true,\n                configurable: true,\n                value: console.error\n            }\n        });\n\n        worker.addEventListener('message', event => {\n            const { data } = event;\n            const isError = data instanceof Error;\n            if (isError || data === 'polyscript:done') {\n                event.stopImmediatePropagation();\n                if (isError) {\n                    resolver.reject(data);\n                    worker.onerror(create(event, {\n                        type: { value: 'error' },\n                        error: { value: data }\n                    }));\n                }\n                else resolver.resolve(worker);\n            }\n        });\n\n        if (isHook) this.onWorker?.(this.interpreter, worker);\n\n        return worker;\n    };\n\n/* c8 ignore stop */","export const INVALID_CONTENT = 'Invalid content';\nexport const INVALID_SRC_ATTR = 'Invalid worker attribute';\nexport const INVALID_WORKER_ATTR = 'Invalid worker attribute';\n","import { INVALID_CONTENT, INVALID_SRC_ATTR, INVALID_WORKER_ATTR } from '../errors.js';\n\nimport { dedent, unescape } from '../utils.js';\n\nconst hasCommentsOnly = text => !text\n    .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n    .replace(/^\\s*(?:\\/\\/|#).*/gm, '')\n    .trim()\n;\n\n/* c8 ignore start */ // tested via integration\nexport default element => {\n  const { src, worker } = element.attributes;\n  if (worker) {\n      let { value } = worker;\n      // throw on worker values as ambiguous\n      // @see https://github.com/pyscript/polyscript/issues/43\n      if (value) throw new SyntaxError(INVALID_WORKER_ATTR);\n      value = src?.value;\n      if (!value) {\n          // throw on empty src attributes\n          if (src) throw new SyntaxError(INVALID_SRC_ATTR);\n          if (!element.childElementCount)\n              value = element.textContent;\n          else {\n              const { innerHTML, localName, type } = element;\n              const name = type || localName.replace(/-script$/, '');\n              value = unescape(innerHTML);\n              console.warn(\n                  `Deprecated: use <script type=\"${name}\"> for an always safe content parsing:\\n`,\n                  value,\n              );\n          }\n\n          const url = URL.createObjectURL(new Blob([dedent(value)], { type: 'text/plain' }));\n          // TODO: should we really clean up this? debugging non-existent resources\n          //       at distance might be very problematic if the url is revoked.\n          // setTimeout(URL.revokeObjectURL, 5000, url);\n          return url;\n      }\n      return value;\n  }\n  // validate ambiguous cases with src and not empty/commented content\n  if (src && !hasCommentsOnly(element.textContent))\n    throw new SyntaxError(INVALID_CONTENT);\n};\n/* c8 ignore stop */\n","import fetch from '@webreflection/fetch';\nimport { $ } from 'basic-devtools';\n\nimport { workers, workersHandler } from './workers.js';\nimport $xworker from './worker/class.js';\nimport workerURL from './worker/url.js';\nimport { getRuntime, getRuntimeID } from './loader.js';\nimport { registry } from './interpreters.js';\nimport { JSModules, all, dispatch, resolve, defineProperty, nodeInfo, registerJSModules } from './utils.js';\n\nconst getRoot = (script) => {\n    let parent = script;\n    while (parent.parentNode) parent = parent.parentNode;\n    return parent;\n};\n\nexport const queryTarget = (script, idOrSelector) => {\n    const root = getRoot(script);\n    return root.getElementById(idOrSelector) || $(idOrSelector, root);\n};\n\nconst targets = new WeakMap();\nconst targetDescriptor = {\n    get() {\n        let target = targets.get(this);\n        if (!target) {\n            target = document.createElement(`${this.type}-script`);\n            targets.set(this, target);\n            handle(this);\n        }\n        return target;\n    },\n    set(target) {\n        if (typeof target === 'string')\n            targets.set(this, queryTarget(this, target));\n        else {\n            targets.set(this, target);\n            handle(this);\n        }\n    },\n};\n\nconst handled = new WeakMap();\n\nexport const interpreters = new Map();\n\nconst execute = async (currentScript, source, XWorker, isAsync) => {\n    const { type } = currentScript;\n    const module = registry.get(type);\n    /* c8 ignore start */\n    if (module.experimental)\n        console.warn(`The ${type} interpreter is experimental`);\n    const [interpreter, content] = await all([\n        handled.get(currentScript).interpreter,\n        source,\n    ]);\n    try {\n        // temporarily override inherited document.currentScript in a non writable way\n        // but it deletes it right after to preserve native behavior (as it's sync: no trouble)\n        defineProperty(document, 'currentScript', {\n            configurable: true,\n            get: () => currentScript,\n        });\n        registerJSModules(type, module, interpreter, JSModules);\n        module.registerJSModule(interpreter, 'polyscript', {\n            XWorker,\n            currentScript,\n            js_modules: JSModules,\n            workers: workersHandler,\n        });\n        dispatch(currentScript, type, 'ready');\n        const result = module[isAsync ? 'runAsync' : 'run'](interpreter, content);\n        const done = dispatch.bind(null, currentScript, type, 'done');\n        if (isAsync) result.then(done);\n        else done();\n        return result;\n    } finally {\n        delete document.currentScript;\n    }\n    /* c8 ignore stop */\n};\n\nconst getValue = (ref, prefix) => {\n    const value = ref?.value;\n    return value ? prefix + value : '';\n};\n\nexport const getDetails = (type, id, name, version, config, configURL, runtime = type) => {\n    if (!interpreters.has(id)) {\n        const details = {\n            interpreter: getRuntime(name, config, configURL),\n            queue: resolve(),\n            XWorker: $xworker(type, version),\n        };\n        interpreters.set(id, details);\n        // enable sane defaults when single interpreter *of kind* is used in the page\n        // this allows `xxx-*` attributes to refer to such interpreter without `env` around\n        /* c8 ignore start *//* this is tested very well in PyScript */\n        if (!interpreters.has(type)) interpreters.set(type, details);\n        if (!interpreters.has(runtime)) interpreters.set(runtime, details);\n        /* c8 ignore stopt */\n    }\n    return interpreters.get(id);\n};\n\n/**\n * @param {HTMLScriptElement} script a special type of <script>\n */\nexport const handle = async (script) => {\n    // known node, move its companion target after\n    // vDOM or other use cases where the script is a tracked element\n    if (handled.has(script)) {\n        const { target } = script;\n        if (target) {\n            // if the script is in the head just append target to the body\n            if (script.closest('head')) document.body.append(target);\n            // in any other case preserve the script position\n            else script.after(target);\n        }\n    }\n    // new script to handle ... allow newly created scripts to work\n    // just exactly like any other script would\n    else {\n        // allow a shared config among scripts, beside interpreter,\n        // and/or source code with different config or interpreter\n        const {\n            attributes: {\n                async: isAsync,\n                config,\n                env,\n                name: wn,\n                target,\n                version,\n                ['service-worker']: sw,\n            },\n            src,\n            type,\n        } = script;\n\n        const versionValue = version?.value;\n        const name = getRuntimeID(type, versionValue);\n        let configValue = getValue(config, '|');\n        const id = getValue(env, '') || `${name}${configValue}`;\n        configValue = configValue.slice(1);\n\n        /* c8 ignore start */\n        const url = workerURL(script);\n        if (url) {\n            const XWorker = $xworker(type, versionValue);\n            const xworker = new XWorker(url, {\n                ...nodeInfo(script, type),\n                async: !!isAsync,\n                config: configValue,\n                serviceWorker: sw?.value,\n            });\n            handled.set(\n                defineProperty(script, 'xworker', { value: xworker }),\n                { xworker },\n            );\n            const workerName = wn?.value;\n            if (workerName) workers[workerName].resolve(xworker.ready);\n            return;\n        }\n        /* c8 ignore stop */\n\n        const targetValue = getValue(target, '');\n        const details = getDetails(type, id, name, versionValue, configValue);\n\n        handled.set(\n            defineProperty(script, 'target', targetDescriptor),\n            details,\n        );\n\n        if (targetValue) targets.set(script, queryTarget(script, targetValue));\n\n        // start fetching external resources ASAP\n        const source = src ? fetch(src).text() : script.textContent;\n        details.queue = details.queue.then(() =>\n            execute(script, source, details.XWorker, !!isAsync),\n        );\n    }\n};\n","import { $x } from 'basic-devtools';\n\nimport { interpreters } from './script-handler.js';\nimport { all, create } from './utils.js';\nimport { registry, prefixes } from './interpreters.js';\n\n/* c8 ignore start */\nexport const env = new Proxy(create(null), {\n    get: (_, name) => new Promise(queueMicrotask).then(\n        () => awaitInterpreter(name)\n    ),\n});\n\n// attributes are tested via integration / e2e\n// ensure both interpreter and its queue are awaited then returns the interpreter\nconst awaitInterpreter = async (key) => {\n    if (interpreters.has(key)) {\n        const { interpreter, queue } = interpreters.get(key);\n        return (await all([interpreter, queue]))[0];\n    }\n\n    const available = interpreters.size\n        ? `Available interpreters are: ${[...interpreters.keys()]\n              .map((r) => `\"${r}\"`)\n              .join(', ')}.`\n        : 'There are no interpreters in this page.';\n\n    throw new Error(`The interpreter \"${key}\" was not found. ${available}`);\n};\n\nexport const listener = async (event) => {\n    const { type, currentTarget } = event;\n    if (!prefixes.length) return;\n    for (let { name, value, ownerElement: el } of $x(\n        `./@*[${prefixes.map((p) => `name()=\"${p}${type}\"`).join(' or ')}]`,\n        currentTarget,\n    )) {\n        name = name.slice(0, -(type.length + 1));\n        const interpreter = await awaitInterpreter(\n            el.getAttribute(`${name}-env`) || name,\n        );\n        const handler = registry.get(name);\n        handler.runEvent(interpreter, value, event);\n    }\n};\n\n/**\n * Look for known prefixes and add related listeners.\n * @param {Document | Element} root\n */\nexport const addAllListeners = (root) => {\n    if (!prefixes.length) return;\n    for (let { name, ownerElement: el } of $x(\n        `.//@*[${prefixes\n            .map((p) => `starts-with(name(),\"${p}\")`)\n            .join(' or ')}]`,\n        root,\n    )) {\n        const i = name.lastIndexOf('-');\n        const type = name.slice(i + 1);\n        if (type !== 'env') {\n            el.addEventListener(type, listener);\n            // automatically disable form controls that are not disabled already\n            if ('disabled' in el && !el.disabled) {\n                el.disabled = true;\n                // set these to enable once the interpreter is known (registered + loaded)\n                env[name.slice(0, i)].then(() => {\n                    el.disabled = false;\n                });\n            }\n        }\n    }\n};\n/* c8 ignore stop */\n","import xworker from './worker/class.js';\nimport Hook from './worker/hook.js';\n\nconst XWorker = xworker();\n\nexport { Hook, XWorker };\n","import '@ungap/with-resolvers';\nimport { $$ } from 'basic-devtools';\n\nimport { JSModules, assign, create, createOverload, createResolved, dedent, defineProperty, nodeInfo, registerJSModules } from './utils.js';\nimport { getDetails } from './script-handler.js';\nimport { registry as defaultRegistry, prefixes, configs } from './interpreters.js';\nimport { getRuntimeID } from './loader.js';\nimport { addAllListeners } from './listeners.js';\nimport { Hook, XWorker as XW } from './xworker.js';\nimport { workers, workersHandler } from './workers.js';\nimport { polluteJS, js as jsHooks, code as codeHooks } from './hooks.js';\nimport workerURL from './worker/url.js';\n\nexport const CUSTOM_SELECTORS = [];\n\nexport const customObserver = new Map();\n\n/**\n * @typedef {Object} Runtime custom configuration\n * @prop {object} interpreter the bootstrapped interpreter\n * @prop {(url:string, options?: object) => Worker} XWorker an XWorker constructor that defaults to same interpreter on the Worker.\n * @prop {object} config a cloned config used to bootstrap the interpreter\n * @prop {(code:string) => any} run an utility to run code within the interpreter\n * @prop {(code:string) => Promise<any>} runAsync an utility to run code asynchronously within the interpreter\n * @prop {(path:string, data:ArrayBuffer) => void} writeFile an utility to write a file in the virtual FS, if available\n */\n\nconst types = new Map();\nconst waitList = new Map();\n\n// REQUIRES INTEGRATION TEST\n/* c8 ignore start */\n/**\n * @param {Element} node any DOM element registered via define.\n */\nexport const handleCustomType = async (node) => {\n    for (const selector of CUSTOM_SELECTORS) {\n        if (node.matches(selector)) {\n            const type = types.get(selector);\n            const details = registry.get(type);\n            const { resolve } = waitList.get(type);\n            const { options, known } = details;\n\n            if (known.has(node)) return;\n            known.add(node);\n\n            for (const [selector, callback] of customObserver) {\n                if (node.matches(selector)) await callback(node);\n            }\n\n            const {\n                interpreter: runtime,\n                configURL,\n                config,\n                version,\n                env,\n                onerror,\n                hooks,\n            } = options;\n\n            let error;\n            try {\n                const worker = workerURL(node);\n                if (worker) {\n                    const xworker = XW.call(new Hook(null, hooks), worker, {\n                        ...nodeInfo(node, type),\n                        version,\n                        configURL,\n                        type: runtime,\n                        custom: type,\n                        config: node.getAttribute('config') || config || {},\n                        async: node.hasAttribute('async'),\n                        serviceWorker: node.getAttribute('service-worker'),\n                    });\n                    defineProperty(node, 'xworker', { value: xworker });\n                    resolve({ type, xworker });\n                    const workerName = node.getAttribute('name');\n                    if (workerName) workers[workerName].resolve(xworker.ready);\n                    return;\n                }\n            }\n            // let the custom type handle errors via its `io`\n            catch (workerError) {\n                error = workerError;\n            }\n\n            const name = getRuntimeID(runtime, version);\n            const id = env || `${name}${config ? `|${config}` : ''}`;\n            const { interpreter: engine, XWorker: Worker } = getDetails(\n                type,\n                id,\n                name,\n                version,\n                config,\n                configURL,\n                runtime\n            );\n\n            const interpreter = await engine;\n\n            const module = create(defaultRegistry.get(runtime));\n\n            const hook = new Hook(interpreter, hooks);\n\n            const XWorker = function XWorker(...args) {\n                return Worker.apply(hook, args);\n            };\n\n            const resolved = {\n                ...createResolved(\n                    module,\n                    type,\n                    structuredClone(configs.get(name)),\n                    interpreter,\n                ),\n                XWorker,\n            };\n\n            registerJSModules(runtime, module, interpreter, JSModules);\n            module.registerJSModule(interpreter, 'polyscript', {\n                XWorker,\n                config: resolved.config,\n                currentScript: type.startsWith('_') ? null : node,\n                js_modules: JSModules,\n                workers: workersHandler,\n            });\n\n            // patch methods accordingly to hooks (and only if needed)\n            for (const suffix of ['Run', 'RunAsync']) {\n                let before = '';\n                let after = '';\n\n                for (const key of codeHooks) {\n                    const value = hooks?.main?.[key];\n                    if (value && key.endsWith(suffix)) {\n                        if (key.startsWith('codeBefore'))\n                            before = dedent(value());\n                        else\n                            after = dedent(value());\n                    }\n                }\n\n                if (before || after) {\n                    createOverload(\n                        module,\n                        `r${suffix.slice(1)}`,\n                        before,\n                        after,\n                    );\n                }\n\n                let beforeCB, afterCB;\n                // ignore onReady and onWorker\n                for (let i = 2; i < jsHooks.length; i++) {\n                    const key = jsHooks[i];\n                    const value = hooks?.main?.[key];\n                    if (value && key.endsWith(suffix)) {\n                        if (key.startsWith('onBefore'))\n                            beforeCB = value;\n                        else\n                            afterCB = value;\n                    }\n                }\n                polluteJS(module, resolved, node, suffix.endsWith('Async'), beforeCB, afterCB);\n            }\n\n            details.queue = details.queue.then(() => {\n                resolve(resolved);\n                if (error) onerror?.(error, node);\n                return hooks?.main?.onReady?.(resolved, node);\n            });\n        }\n    }\n};\n\n/**\n * @type {Map<string, {options:object, known:WeakSet<Element>}>}\n */\nconst registry = new Map();\n\n/**\n * @typedef {Object} CustomOptions custom configuration\n * @prop {'pyodide' | 'micropython' | 'ruby-wasm-wasi' | 'wasmoon'} interpreter the interpreter to use\n * @prop {string} [version] the optional interpreter version to use\n * @prop {string} [config] the optional config to use within such interpreter\n */\n\nlet dontBotherCount = 0;\n\n/**\n * Allows custom types and components on the page to receive interpreters to execute any code\n * @param {string} type the unique `<script type=\"...\">` identifier\n * @param {CustomOptions} options the custom type configuration\n */\nexport const define = (type, options) => {\n    // allow no-type to be bootstrapped out of the box\n    let dontBother = type == null;\n\n    if (dontBother)\n        type = `_ps${dontBotherCount++}`;\n    else if (defaultRegistry.has(type) || registry.has(type))\n        throw new Error(`<script type=\"${type}\"> already registered`);\n\n    if (!defaultRegistry.has(options?.interpreter))\n        throw new Error('Unspecified interpreter');\n\n    // allows reaching out the interpreter helpers on events\n    defaultRegistry.set(type, defaultRegistry.get(options.interpreter));\n\n    // allows selector -> registry by type\n    const selectors = [`script[type=\"${type}\"]`];\n\n    // ensure a Promise can resolve once a custom type has been bootstrapped\n    whenDefined(type);\n\n    if (dontBother) {\n        // add a script then cleanup everything once that's ready\n        const { hooks } = options;\n        const onReady = hooks?.main?.onReady;\n        options = {\n            ...options,\n            hooks: {\n                ...hooks,\n                main: {\n                    ...hooks?.main,\n                    onReady(resolved, node) {\n                        CUSTOM_SELECTORS.splice(CUSTOM_SELECTORS.indexOf(type), 1);\n                        defaultRegistry.delete(type);\n                        registry.delete(type);\n                        waitList.delete(type);\n                        node.remove();\n                        onReady?.(resolved);\n                    }\n                }\n            },\n        };\n        document.head.append(\n            assign(document.createElement('script'), { type })\n        );\n    }\n    else {\n        selectors.push(`${type}-script`);\n        prefixes.push(`${type}-`);\n    }\n\n    for (const selector of selectors) types.set(selector, type);\n    CUSTOM_SELECTORS.push(...selectors);\n\n    // ensure always same env for this custom type\n    registry.set(type, {\n        options: assign({ env: type }, options),\n        known: new WeakSet(),\n        queue: Promise.resolve(),\n    });\n\n    if (!dontBother) addAllListeners(document);\n    $$(selectors.join(',')).forEach(handleCustomType);\n};\n\n/**\n * Resolves whenever a defined custom type is bootstrapped on the page\n * @param {string} type the unique `<script type=\"...\">` identifier\n * @returns {Promise<object>}\n */\nexport const whenDefined = (type) => {\n    if (!waitList.has(type)) waitList.set(type, Promise.withResolvers());\n    return waitList.get(type).promise;\n};\n/* c8 ignore stop */\n","/** @typedef {(type: string, options: import(\"./custom.js\").CustomOptions) => void} CustomOptions */\n\nimport stickyModule from 'sticky-module';\nimport { $$ } from 'basic-devtools';\n\nimport { handle } from './script-handler.js';\nimport { assign } from './utils.js';\nimport { selectors, prefixes } from './interpreters.js';\nimport { listener, addAllListeners } from './listeners.js';\n\nimport {\n    CUSTOM_SELECTORS,\n    handleCustomType,\n    customObserver as $customObserver,\n    define as $define,\n    whenDefined as $whenDefined\n} from './custom.js';\n\nimport { env as $env } from './listeners.js';\nimport { Hook as $Hook, XWorker as $XWorker } from './xworker.js';\n\n// avoid multiple initialization of the same library\nconst [\n    {\n        customObserver,\n        define,\n        whenDefined,\n        env,\n        Hook,\n        XWorker\n    },\n    alreadyLive\n] = stickyModule(\n    'polyscript',\n    {\n        customObserver: $customObserver,\n        define: $define,\n        whenDefined: $whenDefined,\n        env: $env,\n        Hook: $Hook,\n        XWorker: $XWorker\n    }\n);\n\nexport {\n    customObserver,\n    define,\n    whenDefined,\n    env,\n    Hook,\n    XWorker\n};\n\nexport * from './errors.js';\n\n\nif (!alreadyLive) {\n    const mo = new MutationObserver((records) => {\n        const selector = selectors.join(',');\n        for (const { type, target, attributeName, addedNodes } of records) {\n            // attributes are tested via integration / e2e\n            /* c8 ignore start */\n            if (type === 'attributes') {\n                const i = attributeName.lastIndexOf('-') + 1;\n                if (i) {\n                    const prefix = attributeName.slice(0, i);\n                    for (const p of prefixes) {\n                        if (prefix === p) {\n                            const type = attributeName.slice(i);\n                            if (type !== 'env') {\n                                const method = target.hasAttribute(attributeName)\n                                    ? 'add'\n                                    : 'remove';\n                                target[`${method}EventListener`](type, listener);\n                            }\n                            break;\n                        }\n                    }\n                }\n                continue;\n            }\n            for (const node of addedNodes) {\n                if (node.nodeType === 1) {\n                    addAllListeners(node);\n                    if (selector && node.matches(selector)) handle(node);\n                    else bootstrap(selector, node, true);\n                }\n            }\n            /* c8 ignore stop */\n        }\n    });\n\n    /* c8 ignore start */\n    const bootstrap = (selector, node, shouldHandle) => {\n        if (selector) $$(selector, node).forEach(handle);\n        selector = CUSTOM_SELECTORS.join(',');\n        if (selector) {\n            if (shouldHandle) handleCustomType(node);\n            $$(selector, node).forEach(handleCustomType);\n        }\n    };\n    /* c8 ignore stop */\n\n    const observe = (root) => {\n        mo.observe(root, { childList: true, subtree: true, attributes: true });\n        return root;\n    };\n\n    const { attachShadow } = Element.prototype;\n    assign(Element.prototype, {\n        attachShadow(init) {\n            return observe(attachShadow.call(this, init));\n        },\n    });\n\n    // give 3rd party a chance to apply changes before this happens\n    queueMicrotask(() => {\n        addAllListeners(observe(document));\n        bootstrap(selectors.join(','), document, false);\n    });\n\n}\n"],"names":["$$","css","root","document","querySelectorAll","$x","path","xpath","XPathEvaluator","createExpression","evaluate","XPathResult","ORDERED_NODE_SNAPSHOT_TYPE","result","i","snapshotLength","push","snapshotItem","d","Object","getOwnPropertyDescriptors","Response","prototype","isFunction","value","handler","get","p","k","hasOwnProperty","then","r","args","bypass","bind","direct","fetch$1","input","init","Proxy","fetch","workers","Map","map","name","has","set","Promise","withResolvers","ignore","Set","workersHandler","freeze","_","promise","w","sync","env","self","globalThis","deserialize","serialized","$","as","out","index","unpair","type","arr","object","key","Date","source","flags","RegExp","add","message","BigInt","deserializer","EMPTY","toString","keys","typeOf","asString","call","slice","includes","shouldSkip","TYPE","serialize","json","lossy","strict","pair","entry","TypeError","valueOf","toJSON","entries","toISOString","serializer","parse","$parse","stringify","$stringify","JSON","options","str","any","ARRAY","FUNCTION","NULL","NUMBER","OBJECT","STRING","SYMBOL","UNDEFINED","uid","ids","values","id","hold","ArrayBuffer","Atomics","$Atomics","isArray","Array","create","getPrototypeOf","TypedArray","Int32Array","views","extend","Class","SharedArrayBuffer","constructor","rest","super","this","ignoreList","WeakSet","ignorePatch","isChannel","event","channel","data","yes","at","stopImmediatePropagation","preventDefault","isObject","transferred","WeakMap","transferViews","transfer","visited","waitAsyncPatch","resolve","Worker","onmessage","postMessage","actionWait","view","currentTarget","origin","lastEventId","ports","dispatchEvent","MessageEvent","dispatch","BigInt64Array","polyfill","asModule","url","waitAsync","CHANNEL","crypto","randomUUID","addListener","addEventListener","register","serviceWorker","s","sw","done","c","join","delete","getRegistration","ready","controller","installing","waiting","active","state","location","reload","once","notify","worker","getData","known","waitAsyncPoly","URL","href","navigator","ACTION","_view","_id","_index","length","actionNotify","size","postData","BYTES_PER_ELEMENT","I32_BYTES","UI16_BYTES","Uint16Array","decoder","TextDecoder","buffers","seppuku","invoke","i32View","isSync","transform","deadlock","timer","setTimeout","console","warn","pop","sb","clearTimeout","bytes","ui16a","buffer","sub","subarray","decode","coincident$1","waitLength","async","callback","results","actionLength","$Worker","proxy","details","cb","createProxy","Error","charCodeAt","actionFill","numeric","fromEntries","OWN_KEYS","DESTRUCT","ownKeys","Reflect","Symbol","filter","toSymbol","keyFor","MAIN","WORKER","registry","FinalizationRegistry","onGarbageCollected","held","debug","String","nullHandler","return","token","target","EventTarget","eventsHandler","defineProperty","listener","concat","re","place","q","f","exports","coincident","toEntry","__worker__","proxies","onGC","ref","fromEntry","numericTYPE","fn","deref","Event","methods","method","handleEvent","WeakRef","startsWith","for","symbol","fromSymbol","TRAP","a","b","had","drop","descriptor","asEntry","io","stdio","context","localIO","buffered","stderr","error","stdout","log","engine","interpreter","EOL","maybeUI8","Uint8Array","splice","require","run","code","Function","dummy","module","registerJSModule","runAsync","runEvent","writeFile","reject","dedent","string","t","l","arguments","content","line","split","trim","test","replace","$1","es","unes","cape","m","tpl","unescape","un","assign","defineProperties","all","absoluteURL","base","nodeInfo","node","tag","tagName","what","CE","CustomEvent","bubbles","detail","createResolved","config","dropLine0","createOverload","before","after","js_modules","jsModules","JSModules","field","modules","registerJSModules","importJS","import","esm","importCSS","onload","onerror","querySelector","head","append","createElement","rel","isCSS","pathname","RUNNING_IN_WORKER","window","FS","PATH","PATH_FS","absPath","dirPath","dirname","mkdirTree","canOwn","tree","current","branch","mkdir","cwd","joinPaths","parts","res","part","fetchBuffer","baseURL","arrayBuffer","fetchPaths","config_fetch","files","to_file","from","undefined","endsWith","flatMap","to_folder","file","filename","lastIndexOf","calculateFetchPaths","fillName","dest","parseTemplate","src","SyntaxError","fetchFiles","config_files","targets","sourceDest","calculateFilesPaths","fetchJSModules","main","promises","STORAGE","READONLY","READWRITE","defaultOptions","durability","prefix","IDBMap","db","transaction","how","onsuccess","objectStore","indexedDB","open","onupgradeneeded","objectStoreNames","createObjectStore","oncomplete","boundDispatch","isTrusted","close","store","count","clear","forEach","getKey","getAllKeys","put","toStringTag","IDBMapSync","queue","loader","lazy_py_modules","packages","pyimport","storage","registerJsModule","getFormat","runPython","runPythonAsync","globals","mip","TextEncoder","encode","toml","text","micropython","version","loadMicroPython","linebuffer","py_imports","importPackages","PyProxy","toJs","_module","fs","format","extractDir","blob","Blob","BlobReader","Uint8ArrayWriter","ZipReader","zipReader","getEntries","directory","TMP","mpyPackage","install","toJsOptions","dict_converter","overrideFunction","overrideMethod","overridden","applyOverride","destroy","patchArgs","copy","apply","pyodide","loadPyodide","experimental_create_proxy","indexURL","ffi","unpackArchive","loadPackage","micropip","keep_going","jsType","ruby_wasm_wasi","experimental","DefaultRubyVM","WebAssembly","compile","vm","eval","evalAsync","wrap","wasmoon","LuaFactory","LuaLibraries","createEngine","global","getTable","Base","setField","doStringSync","doString","cmodule","writeFileShim","shelter","output","captureR","webr","WebR","Shelter","evalRVoid","configs","selectors","prefixes","getConfigURLAndType","configURL","parseString","getRuntime","absolute","getRuntimeID","toJSONCallback","isAsync","beforeRun","afterRun","js","patch","resolved","polluteJS","patched","Hook$1","hooks","onWorker","jsHooks","codeHooks","xworker","createObjectURL","service_worker","isHook","Hook","resolver","bootstrap","writable","configurable","isError","INVALID_CONTENT","INVALID_SRC_ATTR","INVALID_WORKER_ATTR","workerURL","element","attributes","childElementCount","innerHTML","localName","textContent","queryTarget","script","idOrSelector","parent","parentNode","getRoot","getElementById","targetDescriptor","handle","handled","interpreters","getValue","getDetails","runtime","XWorker","$xworker","closest","body","wn","versionValue","configValue","workerName","targetValue","currentScript","execute","queueMicrotask","awaitInterpreter","available","ownerElement","el","getAttribute","addAllListeners","disabled","CUSTOM_SELECTORS","customObserver","types","waitList","handleCustomType","selector","matches","XW","custom","hasAttribute","workerError","defaultRegistry","hook","structuredClone","suffix","beforeCB","afterCB","onReady","dontBotherCount","whenDefined","define","alreadyLive","stickyModule","$customObserver","dontBother","indexOf","remove","$whenDefined","$env","$Hook","$XWorker","mo","MutationObserver","records","attributeName","addedNodes","nodeType","shouldHandle","observe","childList","subtree","attachShadow","Element"],"mappings":"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","x_google_ignoreList":[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,25,26,27,28,31,32,43]}
\ No newline at end of file
diff --git a/esm/interpreter/dummy.js b/esm/interpreter/dummy.js
new file mode 100644
index 00000000..3c608d8f
--- /dev/null
+++ b/esm/interpreter/dummy.js
@@ -0,0 +1,39 @@
+import { io, stdio } from './_io.js';
+
+const registry = new Map;
+
+const type = 'dummy';
+
+// REQUIRES INTEGRATION TEST
+/* c8 ignore start */
+const require = name => registry.get(name);
+
+const run = (interpreter, code) => {
+    try {
+        return Function('require', code)(require);
+    }
+    catch (error) {
+        io.get(interpreter).stderr(error);
+    }
+};
+
+export default {
+    type,
+    module: () => 'data:application/javascript,',
+    engine: module => stdio().get(module),
+    registerJSModule(_, name, value) {
+        registry.set(name, value);
+    },
+    run,
+    runAsync: run,
+    runEvent: async (interpreter, code, event) => {
+        try {
+            await Function('require', 'e', `return ${code}(e)`)(require, event);
+        }
+        catch (error) {
+            io.get(interpreter).stderr(error);
+        }
+    },
+    transform: (_, value) => value,
+    writeFile() {},
+};
diff --git a/esm/interpreter/webr.js b/esm/interpreter/webr.js
index 2d6348f8..61a71050 100644
--- a/esm/interpreter/webr.js
+++ b/esm/interpreter/webr.js
@@ -51,7 +51,7 @@ export default {
     runAsync: run,
     async runEvent(interpreter, code, event) {
         // TODO: WebR cannot convert exoteric objects or any literal
-        // to an easy to reason about data/frame ... that convertion
+        // to an easy to reason about data/frame ... that conversion
         // is reserved for the future:
         // https://docs.r-wasm.org/webr/latest/convert-js-to-r.html#constructing-r-objects-from-javascript-objects
         await interpreter.evalRVoid(`${code}(event)`, {
diff --git a/esm/interpreters.js b/esm/interpreters.js
index c9881412..84ab436a 100644
--- a/esm/interpreters.js
+++ b/esm/interpreters.js
@@ -48,10 +48,11 @@ const register = (interpreter) => {
 };
 
 //:RUNTIMES
+import dummy from './interpreter/dummy.js';
 import micropython from './interpreter/micropython.js';
 import pyodide from './interpreter/pyodide.js';
 import ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js';
 import wasmoon from './interpreter/wasmoon.js';
 import webr from './interpreter/webr.js';
-for (const interpreter of [micropython, pyodide, ruby_wasm_wasi, wasmoon, webr])
+for (const interpreter of [dummy, micropython, pyodide, ruby_wasm_wasi, wasmoon, webr])
     register(interpreter);
diff --git a/package-lock.json b/package-lock.json
index 57d9ddb8..dd4a9b70 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "polyscript",
-    "version": "0.14.1",
+    "version": "0.14.2",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "polyscript",
-            "version": "0.14.1",
+            "version": "0.14.2",
             "license": "APACHE-2.0",
             "dependencies": {
                 "@ungap/structured-clone": "^1.2.0",
diff --git a/package.json b/package.json
index cc82607b..69ffcf03 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "polyscript",
-    "version": "0.14.1",
+    "version": "0.14.2",
     "description": "PyScript single core to rule them all",
     "main": "./esm/index.js",
     "types": "./types/polyscript/esm/index.d.ts",
@@ -86,6 +86,6 @@
         "to-json-callback": "^0.1.1"
     },
     "worker": {
-        "blob": "sha256-jyja7vDWOV2Fy/al1o2uc7OkyteLjKTTY6jkJhlIEAg="
+        "blob": "sha256-1s+d/z97T1TW7Z1FKqUH9XkdwJnOr2YgB5K73a94okA="
     }
 }
diff --git a/test/dummy.html b/test/dummy.html
new file mode 100644
index 00000000..9a54c40e
--- /dev/null
+++ b/test/dummy.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Polyscript dummy interpreter (JS)</title>
+  <script type="module" src="../dist/index.js"></script>
+</head>
+<body>
+  <script type="dummy">
+    self.greetings = () => {
+      console.log('Hello World');
+    };
+  </script>
+  <button dummy-click="greetings">click me</button>
+  <script type="dummy" worker>
+    const { xworker: { window } } = require('polyscript');
+    window.document.body.append('OK');
+  </script>
+</body>
+</html>