From a1c239b7e564225d60c7294a07c34899baaba2ec Mon Sep 17 00:00:00 2001 From: quantumaikr Date: Sun, 12 Apr 2026 09:27:57 +0900 Subject: [PATCH] =?UTF-8?q?feat(wasm):=20chat=20KV=20cache=20reuse=20?= =?UTF-8?q?=E2=80=94=20turn=20N+1=20is=20near-instant=20in=20browser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #50 added text-prefix matching to src/engine/tq_generate.c (used by the HTTP server). This PR ports it to quant.h (single-header) so the WASM browser demo and Python wheel get the same speedup. Three layers: 1. **quant.h**: ported tq_generate_chat_text from src/engine. Added cached_text field to quant_ctx struct. quant_chat() now uses the text-prefix path instead of the token-LCP path. quant_free_ctx() frees cached_text. Pass NULL prompt to reset session (frees cached_text too). 2. **wasm/quant_wasm.c**: - wasm_generate_async / wasm_generate now call quant_chat() instead of quant_generate() (which destroyed the cache via free+recreate of g_ctx every call — biggest reason WASM was slow on multi-turn). - Reuse the existing g_ctx across calls; only update temperature/ top_p/max_tokens fields (kv_compress is immutable post-creation). - New wasm_reset_chat() for starting a new chat session. 3. **wasm/index.html**: - Accumulates ChatML history client-side (chatHistory string). Each turn appends `<|im_start|>user\n${text}<|im_end|>\n <|im_start|>assistant\n` and sends the FULL history to WASM. - The C side's text-prefix matching reuses everything before the new turn — turn N's prefill is O(new user message), not O(full history). - After response, appends model output + <|im_end|>\n so the next turn matches the cached_text byte-for-byte. - Loading message differentiates first turn ("Processing prompt — may take a few seconds") vs subsequent ("Generating..."). 4. **wasm/build.sh**: exports _wasm_reset_chat. Validated end-to-end with the C test (real response replay): turn 1: 206 ms (cold, SLOW path) turn 2: 315 ms (FAST text_match=64) turn 5: 437 ms (FAST text_match=321) turn 10: 637 ms (FAST text_match=750) Every turn after the first hits the FAST text-prefix path. The remaining ~50ms/turn growth is the unavoidable O(n) attention cost. For the WASM browser demo, this means: instead of every turn taking full prefill time (5-10s for a 0.8B model), only turn 1 is slow. Turns 2+ feel instantaneous to the user. Co-Authored-By: Claude Opus 4.6 (1M context) --- quant.h | 230 +++++++++++++++++++++++++++++++++++++++++++++- wasm/build.sh | 2 +- wasm/index.html | 35 +++++-- wasm/quant.js | 2 +- wasm/quant.wasm | Bin 292901 -> 293327 bytes wasm/quant_wasm.c | 36 ++++---- 6 files changed, 280 insertions(+), 25 deletions(-) diff --git a/quant.h b/quant.h index b0e6358..2e4d457 100644 --- a/quant.h +++ b/quant.h @@ -1745,6 +1745,10 @@ struct quant_ctx { int* cached_tokens; int n_cached; int cached_capacity; + /* Text-prefix cache: stores the entire prompt + generated response + * text from the last call, allowing the next call to bypass BPE + * re-tokenization issues by matching at the byte level. */ + char* cached_text; }; // ============================================================================ @@ -15848,6 +15852,225 @@ int tq_generate_continue(tq_model_t* model, return generated; } +/* ============================================================================ + * tq_generate_chat_text — text-prefix matching for chat reuse + * + * Solves the BPE re-tokenization issue: when the model generates response + * tokens via sample_topp, those token IDs may not match what tq_encode() + * produces from the same response text in the next turn's prompt. The + * token-level LCP in tq_generate_continue truncates at that boundary. + * + * This function tracks the *text* of the last prompt+response. On the next + * call, if the new prompt starts with cached_text byte-for-byte, the entire + * cached state is valid — tokenize ONLY the new SUFFIX text and prefill + * those tokens at positions [n_cached..]. No LCP, no truncation. + * + * Pass cached_text_io == NULL to disable text-prefix tracking. + * ============================================================================ */ + +typedef struct { + char* buf; + size_t len; + size_t cap; + void (*user_cb)(const char*, void*); + void* user_data; +} chat_accum_t; + +static void chat_accum_callback(const char* tok, void* u) { + chat_accum_t* ctx = (chat_accum_t*)u; + if (!tok) return; + size_t tlen = strlen(tok); + if (ctx->len + tlen + 1 > ctx->cap) { + size_t new_cap = (ctx->cap + tlen + 64) * 2; + char* nb = (char*)realloc(ctx->buf, new_cap); + if (!nb) return; + ctx->buf = nb; + ctx->cap = new_cap; + } + memcpy(ctx->buf + ctx->len, tok, tlen); + ctx->len += tlen; + ctx->buf[ctx->len] = '\0'; + if (ctx->user_cb) ctx->user_cb(tok, ctx->user_data); +} + +int tq_generate_chat_text(tq_model_t* model, + tq_tokenizer_t* tokenizer, + tq_state_t* state, + const char* prompt, + tq_gen_config_t* config, + char** cached_text_io, + int** cached_tokens_io, + int* n_cached_io, + int* cached_capacity_io, + char* output, int output_size) { + if (!model || !state || !config || !cached_tokens_io || !n_cached_io || !cached_capacity_io || !prompt) { + return -1; + } + + int matched_text_len = 0; + int prefix_pos = 0; + + if (cached_text_io && *cached_text_io && *n_cached_io > 0) { + size_t cached_len = strlen(*cached_text_io); + if (cached_len > 0 && strncmp(*cached_text_io, prompt, cached_len) == 0) { + matched_text_len = (int)cached_len; + prefix_pos = *n_cached_io; + } + } + + chat_accum_t accum = { .buf = NULL, .len = 0, .cap = 0, + .user_cb = config->on_token, + .user_data = config->user_data }; + void (*orig_cb)(const char*, void*) = config->on_token; + void* orig_ud = config->user_data; + config->on_token = chat_accum_callback; + config->user_data = &accum; + + int generated = 0; + + if (matched_text_len > 0) { + const char* suffix = prompt + matched_text_len; + int max_prompt = model->config.max_seq_len > 0 + ? model->config.max_seq_len : 4096; + int* suffix_toks = (int*)malloc((size_t)max_prompt * sizeof(int)); + if (!suffix_toks) { + config->on_token = orig_cb; config->user_data = orig_ud; + return -1; + } + int n_suffix = 0; + if (*suffix != '\0') { + n_suffix = tq_encode(tokenizer, suffix, suffix_toks, max_prompt, 0); + if (n_suffix < 0) n_suffix = 0; + } + + int reserve = config->max_tokens > 0 ? config->max_tokens : 256; + if (prefix_pos + n_suffix + reserve + 32 > max_prompt) { + free(suffix_toks); + config->on_token = orig_cb; config->user_data = orig_ud; + *n_cached_io = 0; + if (cached_text_io && *cached_text_io) { + free(*cached_text_io); *cached_text_io = NULL; + } + int n2 = tq_generate_continue(model, tokenizer, state, prompt, config, + cached_tokens_io, n_cached_io, cached_capacity_io, + output, output_size); + generated = n2; + goto update_cache; + } + + int needed = prefix_pos + n_suffix + reserve + 16; + if (*cached_capacity_io < needed) { + int new_cap = needed < 4096 ? 4096 : needed; + int* nb = (int*)realloc(*cached_tokens_io, (size_t)new_cap * sizeof(int)); + if (!nb) { free(suffix_toks); config->on_token = orig_cb; config->user_data = orig_ud; return -1; } + *cached_tokens_io = nb; + *cached_capacity_io = new_cap; + } + + int* cached = *cached_tokens_io; + for (int i = 0; i < n_suffix; i++) { + cached[prefix_pos + i] = suffix_toks[i]; + tq_forward(model, state, suffix_toks[i], prefix_pos + i); + } + *n_cached_io = prefix_pos + n_suffix; + free(suffix_toks); + + if (getenv("TQ_CHAT_DEBUG")) { + fprintf(stderr, "[chat-text] FAST text_match=%d new_suffix_tokens=%d\n", + matched_text_len, n_suffix); + } + + /* Generation loop */ + int vocab_size = model->config.vocab_size; + int n_cached = *n_cached_io; + int pos = n_cached; + int prev_token = n_cached > 0 ? cached[n_cached - 1] : 1; + + uint64_t rng_state = config->rng_seed + ? (uint64_t)config->rng_seed : (uint64_t)time(NULL); + int next_token = tq_sample_topp(state->logits, vocab_size, + config->temperature, config->top_p, + &rng_state); + + int output_pos = 0; + int eos_tokens[] = { 1, 2, 106, 128001, 128006, 128007, 128008, 128009, 248044, 248046 }; + int n_eos = sizeof(eos_tokens) / sizeof(eos_tokens[0]); + + while (generated < config->max_tokens) { + int is_eos = 0; + for (int e = 0; e < n_eos; e++) { + if (next_token == eos_tokens[e]) { is_eos = 1; break; } + } + if (is_eos) break; + if (pos >= model->config.max_seq_len) break; + + const char* piece = tokenizer ? tq_decode(tokenizer, prev_token, next_token) : ""; + int should_stop = 0; + if (piece) { + if (strstr(piece, "<|im_end|>") || strstr(piece, "<|eot_id|>") || + strstr(piece, "<|start_header_id|>")) { + should_stop = 1; piece = ""; + } + } + if (should_stop) break; + + int piece_len = (int)strlen(piece ? piece : ""); + if (config->on_token && piece) config->on_token(piece, config->user_data); + if (output && piece && output_pos + piece_len < output_size - 1) { + memcpy(output + output_pos, piece, piece_len); + output_pos += piece_len; + } + + if (n_cached < *cached_capacity_io) { + cached[n_cached++] = next_token; + *n_cached_io = n_cached; + } + + prev_token = next_token; + tq_forward(model, state, next_token, pos); + pos++; + generated++; + + next_token = tq_sample_topp(state->logits, vocab_size, + config->temperature, config->top_p, + &rng_state); + } + + if (output && output_size > 0) { + output[output_pos < output_size ? output_pos : output_size - 1] = '\0'; + } + } else { + if (getenv("TQ_CHAT_DEBUG")) { + fprintf(stderr, "[chat-text] SLOW no text-prefix match, full tokenize\n"); + } + generated = tq_generate_continue( + model, tokenizer, state, prompt, config, + cached_tokens_io, n_cached_io, cached_capacity_io, + output, output_size); + } + +update_cache: + config->on_token = orig_cb; + config->user_data = orig_ud; + + if (cached_text_io) { + size_t plen = strlen(prompt); + size_t glen = accum.len; + size_t new_len = plen + glen; + char* nt = (char*)malloc(new_len + 1); + if (nt) { + memcpy(nt, prompt, plen); + if (glen > 0 && accum.buf) memcpy(nt + plen, accum.buf, glen); + nt[new_len] = '\0'; + if (*cached_text_io) free(*cached_text_io); + *cached_text_io = nt; + } + } + if (accum.buf) free(accum.buf); + + return generated; +} + // ============================================================================ // ============================================================================ @@ -16182,6 +16405,7 @@ void quant_free_ctx(quant_ctx* ctx) { tq_free_state(ctx->state); tq_free_tokenizer(ctx->tokenizer); if (ctx->cached_tokens) free(ctx->cached_tokens); + if (ctx->cached_text) free(ctx->cached_text); free(ctx); } @@ -16217,6 +16441,7 @@ int quant_chat(quant_ctx* ctx, const char* prompt, ctx->n_cached = 0; ctx->cached_capacity = 0; ctx->n_ctx_tokens = 0; + if (ctx->cached_text) { free(ctx->cached_text); ctx->cached_text = NULL; } return 0; } @@ -16231,8 +16456,11 @@ int quant_chat(quant_ctx* ctx, const char* prompt, ctx->config.user_data = user_data; char output[65536]; - int n = tq_generate_continue( + /* Use the text-prefix path so chat replays bypass BPE re-tokenization + * issues. Falls back to token-LCP path if text prefix doesn't match. */ + int n = tq_generate_chat_text( ctx->model, ctx->tokenizer, ctx->state, prompt, &ctx->config, + &ctx->cached_text, &ctx->cached_tokens, &ctx->n_cached, &ctx->cached_capacity, output, sizeof(output)); diff --git a/wasm/build.sh b/wasm/build.sh index df74c62..076fd4d 100755 --- a/wasm/build.sh +++ b/wasm/build.sh @@ -26,7 +26,7 @@ emcc "$SCRIPT_DIR/quant_wasm.c" \ -s ALLOW_MEMORY_GROWTH=1 \ -s MAXIMUM_MEMORY=4GB \ -s INITIAL_MEMORY=256MB \ - -s EXPORTED_FUNCTIONS='["_main","_wasm_load_model","_wasm_generate","_wasm_generate_async","_wasm_model_info","_wasm_is_ready","_malloc","_free"]' \ + -s EXPORTED_FUNCTIONS='["_main","_wasm_load_model","_wasm_generate","_wasm_generate_async","_wasm_reset_chat","_wasm_model_info","_wasm_is_ready","_malloc","_free"]' \ -s EXPORTED_RUNTIME_METHODS='["UTF8ToString","allocateUTF8","FS","ccall","cwrap"]' \ -s FORCE_FILESYSTEM=1 \ -s MODULARIZE=0 \ diff --git a/wasm/index.html b/wasm/index.html index 32b30ee..b8ec0ae 100644 --- a/wasm/index.html +++ b/wasm/index.html @@ -389,6 +389,18 @@

Run an LLM in your browser

return `<|im_start|>user\n${text}<|im_end|>\n<|im_start|>assistant\n`; } +/* Multi-turn chat history. Sent on every turn so the model has context. + * The C side's quant_chat() does text-prefix matching: turn N's prefill + * is O(new tokens since last call), not O(full history). */ +let chatHistory = ''; + +function resetChatSession() { + chatHistory = ''; + if (typeof Module !== 'undefined' && Module._wasm_reset_chat) { + Module._wasm_reset_chat(); + } +} + function stopGeneration() { stopRequested = true; } async function generate() { @@ -405,11 +417,14 @@

Run an LLM in your browser

addMessage('user', text); const aDiv = addMessage('assistant', ''); - aDiv.innerHTML = ' Processing prompt (may take a few seconds)...'; + const isFirstTurn = chatHistory.length === 0; + aDiv.innerHTML = isFirstTurn + ? ' Processing prompt (first turn — may take a few seconds)...' + : ' Generating...'; let output = '', count = 0; const t0 = performance.now(); document.getElementById('statTokens').textContent = ''; - document.getElementById('statSpeed').textContent = 'processing prompt...'; + document.getElementById('statSpeed').textContent = isFirstTurn ? 'processing prompt...' : 'generating...'; Module.onToken = (tok) => { output += tok; count++; @@ -433,11 +448,13 @@

Run an LLM in your browser

await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); - const prompt = getChatPrompt(text); + /* Build the full ChatML prompt by appending this turn to the history. + * The C side's quant_chat() does text-prefix matching, so the previous + * turns are reused from the KV cache — only the new user message gets + * prefilled. Turn N's latency: O(new user message), not O(full history). */ + chatHistory += `<|im_start|>user\n${text}<|im_end|>\n<|im_start|>assistant\n`; + const prompt = chatHistory; - // Use ccall with async:true — this is the correct way to call - // ASYNCIFY-enabled C functions. Module._fn() direct calls do NOT - // return Promises; only ccall({async:true}) does. try { await Module.ccall( 'wasm_generate_async', @@ -450,6 +467,12 @@

Run an LLM in your browser

console.error('generate error:', e); } + /* Append the model's response to history so the next turn matches + * the cached_text prefix exactly (byte-for-byte). */ + if (output) { + chatHistory += `${output}<|im_end|>\n`; + } + if (!output && !count) { aDiv.innerHTML = 'No output. Try a different prompt.'; } diff --git a/wasm/quant.js b/wasm/quant.js index 86f9c7a..a8c39b0 100644 --- a/wasm/quant.js +++ b/wasm/quant.js @@ -1 +1 @@ -var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["z"]();FS.ignorePermissions=false}function preMain(){}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("quant.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmExports=applySignatureConversions(wasmExports);assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP64;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU64;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var dynCalls={};var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>(crypto.getRandomValues(view),0);var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{idx>>>=0;var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63;i++}}heap[outIdx>>>0]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length>>0)}}return{ptr,allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS_modeStringToFlags=str=>{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)abort("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{ptr>>>=0;return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):""};var SYSCALLS={calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>>2>>>0]=stat.dev;HEAPU32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAPU32[buf+12>>>2>>>0]=stat.uid;HEAPU32[buf+16>>>2>>>0]=stat.gid;HEAPU32[buf+20>>>2>>>0]=stat.rdev;HEAP64[buf+24>>>3>>>0]=BigInt(stat.size);HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>>3>>>0]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3*1e3;HEAP64[buf+56>>>3>>>0]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>>3>>>0]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>>3>>>0]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>>2>>>0]=stats.bsize;HEAPU32[buf+60>>>2>>>0]=stats.bsize;HEAP64[buf+8>>>3>>>0]=BigInt(stats.blocks);HEAP64[buf+16>>>3>>>0]=BigInt(stats.bfree);HEAP64[buf+24>>>3>>>0]=BigInt(stats.bavail);HEAP64[buf+32>>>3>>>0]=BigInt(stats.files);HEAP64[buf+40>>>3>>>0]=BigInt(stats.ffree);HEAPU32[buf+48>>>2>>>0]=stats.fsid;HEAPU32[buf+64>>>2>>>0]=stats.flags;HEAPU32[buf+56>>>2>>>0]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function ___syscall_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){buf>>>=0;try{return SYSCALLS.writeStat(buf,FS.fstat(fd))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getdents64(fd,dirp,count){dirp>>>=0;count>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var startIdx=Math.floor(off/struct_size);var endIdx=Math.min(stream.getdents.length,startIdx+Math.floor(count/struct_size));for(var idx=startIdx;idx>>3>>>0]=BigInt(id);HEAP64[dirp+pos+8>>>3>>>0]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>>1>>>0]=280;HEAP8[dirp+pos+18>>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_ioctl(fd,op,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};function __mmap_js(len,prot,flags,fd,offset,allocated,addr){len>>>=0;offset=bigintToI53Checked(offset);allocated>>>=0;addr>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>>2>>>0]=res.allocated;HEAPU32[addr>>>2>>>0]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){addr>>>=0;len>>>=0;offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var getHeapMax=()=>4294901760;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var _emscripten_sleep=function(ms){let innerFunc=()=>new Promise(resolve=>setTimeout(resolve,ms));return Asyncify.handleAsync(innerFunc)};_emscripten_sleep.isAsync=true;var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};function _environ_get(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>>2>>>0]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>>3>>>0]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(emscripten_sleep|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentFunction(original){var wrapper=(...args)=>{Asyncify.exportCallStack.push(original);try{return original(...args)}finally{if(!ABORT){var top=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}};Asyncify.funcWrappers.set(original,wrapper);return wrapper},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){var wrapper=Asyncify.instrumentFunction(original);ret[x]=wrapper}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:65536,currData:null,handleSleepReturnValue:0,exportCallStack:[],callstackFuncToId:new Map,callStackIdToFunc:new Map,funcWrappers:new Map,callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(func){if(!Asyncify.callstackFuncToId.has(func)){var id=Asyncify.callStackId++;Asyncify.callstackFuncToId.set(func,id);Asyncify.callStackIdToFunc.set(id,func)}return Asyncify.callstackFuncToId.get(func)},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve,reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>>2>>>0]=stack;HEAPU32[ptr+4>>>2>>>0]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>>2>>>0]=rewindId},getDataRewindFunc(ptr){var id=HEAP32[ptr+8>>>2>>>0];var func=Asyncify.callStackIdToFunc.get(id);return func},doRewind(ptr){var original=Asyncify.getDataRewindFunc(ptr);var func=Asyncify.funcWrappers.get(original);return callUserCallback(func)},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync:startAsync=>Asyncify.handleSleep(async wakeUp=>{wakeUp(await startAsync())})};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var allocateUTF8=(...args)=>stringToNewUTF8(...args);var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="pointer")return ret>>>0;if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=(...args)=>FS.createPath(...args);var FS_unlink=(...args)=>FS.unlink(...args);var FS_createLazyFile=(...args)=>FS.createLazyFile(...args);var FS_createDevice=(...args)=>FS.createDevice(...args);FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;Module["allocateUTF8"]=allocateUTF8;function js_on_token(text){if(Module.onToken)Module.onToken(UTF8ToString(text))}function js_on_done(n_tokens,elapsed_ms){if(Module.onDone)Module.onDone(n_tokens,elapsed_ms)}function js_on_status(msg){if(Module.onStatus)Module.onStatus(UTF8ToString(msg))}function js_get_hw_concurrency(){return Math.min(navigator.hardwareConcurrency||1,8)}var _free,_malloc,_wasm_load_model,_wasm_generate_async,_wasm_generate,_wasm_model_info,_wasm_is_ready,_main,_emscripten_builtin_memalign,__emscripten_timeout,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,dynCall_vii,dynCall_iii,dynCall_ii,dynCall_jiji,dynCall_iiii,dynCall_iidiiii,dynCall_viii,dynCall_viiiii,dynCall_fiii,dynCall_vi,_asyncify_start_unwind,_asyncify_stop_unwind,_asyncify_start_rewind,_asyncify_stop_rewind,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_free=Module["_free"]=wasmExports["A"];_malloc=Module["_malloc"]=wasmExports["B"];_wasm_load_model=Module["_wasm_load_model"]=wasmExports["C"];_wasm_generate_async=Module["_wasm_generate_async"]=wasmExports["D"];_wasm_generate=Module["_wasm_generate"]=wasmExports["E"];_wasm_model_info=Module["_wasm_model_info"]=wasmExports["F"];_wasm_is_ready=Module["_wasm_is_ready"]=wasmExports["G"];_main=Module["_main"]=wasmExports["H"];_emscripten_builtin_memalign=wasmExports["I"];__emscripten_timeout=wasmExports["J"];__emscripten_stack_restore=wasmExports["K"];__emscripten_stack_alloc=wasmExports["L"];_emscripten_stack_get_current=wasmExports["M"];dynCall_vii=dynCalls["vii"]=wasmExports["N"];dynCall_iii=dynCalls["iii"]=wasmExports["O"];dynCall_ii=dynCalls["ii"]=wasmExports["P"];dynCall_jiji=dynCalls["jiji"]=wasmExports["Q"];dynCall_iiii=dynCalls["iiii"]=wasmExports["R"];dynCall_iidiiii=dynCalls["iidiiii"]=wasmExports["S"];dynCall_viii=dynCalls["viii"]=wasmExports["T"];dynCall_viiiii=dynCalls["viiiii"]=wasmExports["U"];dynCall_fiii=dynCalls["fiii"]=wasmExports["V"];dynCall_vi=dynCalls["vi"]=wasmExports["W"];_asyncify_start_unwind=wasmExports["X"];_asyncify_stop_unwind=wasmExports["Y"];_asyncify_start_rewind=wasmExports["Z"];_asyncify_stop_rewind=wasmExports["_"];memory=wasmMemory=wasmExports["y"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={h:___syscall_faccessat,v:___syscall_fstat64,p:___syscall_getdents64,g:___syscall_ioctl,d:___syscall_openat,m:__abort_js,l:__emscripten_runtime_keepalive_clear,q:__mmap_js,r:__munmap_js,n:__setitimer_js,c:_emscripten_get_now,o:_emscripten_resize_heap,i:_emscripten_sleep,t:_environ_get,u:_environ_sizes_get,b:_fd_close,x:_fd_read,s:_fd_seek,w:_fd_write,j:js_get_hw_concurrency,e:js_on_done,a:js_on_status,f:js_on_token,k:_proc_exit};function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_ppp=f=>(a0,a1)=>f(a0,a1)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["B"]=makeWrapper_pp(wasmExports["B"]);wasmExports["I"]=makeWrapper_ppp(wasmExports["I"]);wasmExports["L"]=makeWrapper_pp(wasmExports["L"]);wasmExports["M"]=makeWrapper_p(wasmExports["M"]);return wasmExports}function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();Module["onRuntimeInitialized"]?.();var noInitialRun=Module["noInitialRun"]||false;if(!noInitialRun)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;createWasm();run(); +var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["A"]();FS.ignorePermissions=false}function preMain(){}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("quant.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmExports=applySignatureConversions(wasmExports);assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP64;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU64;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var dynCalls={};var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>(crypto.getRandomValues(view),0);var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{idx>>>=0;var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63;i++}}heap[outIdx>>>0]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(ptr,size)=>HEAPU8.fill(0,ptr,ptr+size);var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length>>0)}}return{ptr,allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS_modeStringToFlags=str=>{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)abort("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{ptr>>>=0;return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):""};var SYSCALLS={calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>>2>>>0]=stat.dev;HEAPU32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAPU32[buf+12>>>2>>>0]=stat.uid;HEAPU32[buf+16>>>2>>>0]=stat.gid;HEAPU32[buf+20>>>2>>>0]=stat.rdev;HEAP64[buf+24>>>3>>>0]=BigInt(stat.size);HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>>3>>>0]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3*1e3;HEAP64[buf+56>>>3>>>0]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>>3>>>0]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>>3>>>0]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>>2>>>0]=stats.bsize;HEAPU32[buf+60>>>2>>>0]=stats.bsize;HEAP64[buf+8>>>3>>>0]=BigInt(stats.blocks);HEAP64[buf+16>>>3>>>0]=BigInt(stats.bfree);HEAP64[buf+24>>>3>>>0]=BigInt(stats.bavail);HEAP64[buf+32>>>3>>>0]=BigInt(stats.files);HEAP64[buf+40>>>3>>>0]=BigInt(stats.ffree);HEAPU32[buf+48>>>2>>>0]=stats.fsid;HEAPU32[buf+64>>>2>>>0]=stats.flags;HEAPU32[buf+56>>>2>>>0]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function ___syscall_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){buf>>>=0;try{return SYSCALLS.writeStat(buf,FS.fstat(fd))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getdents64(fd,dirp,count){dirp>>>=0;count>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var startIdx=Math.floor(off/struct_size);var endIdx=Math.min(stream.getdents.length,startIdx+Math.floor(count/struct_size));for(var idx=startIdx;idx>>3>>>0]=BigInt(id);HEAP64[dirp+pos+8>>>3>>>0]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>>1>>>0]=280;HEAP8[dirp+pos+18>>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_ioctl(fd,op,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};function __mmap_js(len,prot,flags,fd,offset,allocated,addr){len>>>=0;offset=bigintToI53Checked(offset);allocated>>>=0;addr>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>>2>>>0]=res.allocated;HEAPU32[addr>>>2>>>0]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){addr>>>=0;len>>>=0;offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var _emscripten_date_now=()=>Date.now();var getHeapMax=()=>4294901760;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var _emscripten_sleep=function(ms){let innerFunc=()=>new Promise(resolve=>setTimeout(resolve,ms));return Asyncify.handleAsync(innerFunc)};_emscripten_sleep.isAsync=true;var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};function _environ_get(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>>2>>>0]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>>3>>>0]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(emscripten_sleep|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentFunction(original){var wrapper=(...args)=>{Asyncify.exportCallStack.push(original);try{return original(...args)}finally{if(!ABORT){var top=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}};Asyncify.funcWrappers.set(original,wrapper);return wrapper},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){var wrapper=Asyncify.instrumentFunction(original);ret[x]=wrapper}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:65536,currData:null,handleSleepReturnValue:0,exportCallStack:[],callstackFuncToId:new Map,callStackIdToFunc:new Map,funcWrappers:new Map,callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(func){if(!Asyncify.callstackFuncToId.has(func)){var id=Asyncify.callStackId++;Asyncify.callstackFuncToId.set(func,id);Asyncify.callStackIdToFunc.set(id,func)}return Asyncify.callstackFuncToId.get(func)},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve,reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>>2>>>0]=stack;HEAPU32[ptr+4>>>2>>>0]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>>2>>>0]=rewindId},getDataRewindFunc(ptr){var id=HEAP32[ptr+8>>>2>>>0];var func=Asyncify.callStackIdToFunc.get(id);return func},doRewind(ptr){var original=Asyncify.getDataRewindFunc(ptr);var func=Asyncify.funcWrappers.get(original);return callUserCallback(func)},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync:startAsync=>Asyncify.handleSleep(async wakeUp=>{wakeUp(await startAsync())})};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var allocateUTF8=(...args)=>stringToNewUTF8(...args);var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="pointer")return ret>>>0;if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=(...args)=>FS.createPath(...args);var FS_unlink=(...args)=>FS.unlink(...args);var FS_createLazyFile=(...args)=>FS.createLazyFile(...args);var FS_createDevice=(...args)=>FS.createDevice(...args);FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;Module["allocateUTF8"]=allocateUTF8;function js_on_token(text){if(Module.onToken)Module.onToken(UTF8ToString(text))}function js_on_done(n_tokens,elapsed_ms){if(Module.onDone)Module.onDone(n_tokens,elapsed_ms)}function js_on_status(msg){if(Module.onStatus)Module.onStatus(UTF8ToString(msg))}function js_get_hw_concurrency(){return Math.min(navigator.hardwareConcurrency||1,8)}var _free,_malloc,_wasm_load_model,_wasm_generate_async,_wasm_generate,_wasm_reset_chat,_wasm_model_info,_wasm_is_ready,_main,_emscripten_builtin_memalign,__emscripten_timeout,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,dynCall_vii,dynCall_iii,dynCall_ii,dynCall_jiji,dynCall_iiii,dynCall_iidiiii,dynCall_viii,dynCall_viiiii,dynCall_fiii,dynCall_vi,_asyncify_start_unwind,_asyncify_stop_unwind,_asyncify_start_rewind,_asyncify_stop_rewind,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_free=Module["_free"]=wasmExports["B"];_malloc=Module["_malloc"]=wasmExports["C"];_wasm_load_model=Module["_wasm_load_model"]=wasmExports["D"];_wasm_generate_async=Module["_wasm_generate_async"]=wasmExports["E"];_wasm_generate=Module["_wasm_generate"]=wasmExports["F"];_wasm_reset_chat=Module["_wasm_reset_chat"]=wasmExports["G"];_wasm_model_info=Module["_wasm_model_info"]=wasmExports["H"];_wasm_is_ready=Module["_wasm_is_ready"]=wasmExports["I"];_main=Module["_main"]=wasmExports["J"];_emscripten_builtin_memalign=wasmExports["K"];__emscripten_timeout=wasmExports["L"];__emscripten_stack_restore=wasmExports["M"];__emscripten_stack_alloc=wasmExports["N"];_emscripten_stack_get_current=wasmExports["O"];dynCall_vii=dynCalls["vii"]=wasmExports["P"];dynCall_iii=dynCalls["iii"]=wasmExports["Q"];dynCall_ii=dynCalls["ii"]=wasmExports["R"];dynCall_jiji=dynCalls["jiji"]=wasmExports["S"];dynCall_iiii=dynCalls["iiii"]=wasmExports["T"];dynCall_iidiiii=dynCalls["iidiiii"]=wasmExports["U"];dynCall_viii=dynCalls["viii"]=wasmExports["V"];dynCall_viiiii=dynCalls["viiiii"]=wasmExports["W"];dynCall_fiii=dynCalls["fiii"]=wasmExports["X"];dynCall_vi=dynCalls["vi"]=wasmExports["Y"];_asyncify_start_unwind=wasmExports["Z"];_asyncify_stop_unwind=wasmExports["_"];_asyncify_start_rewind=wasmExports["$"];_asyncify_stop_rewind=wasmExports["aa"];memory=wasmMemory=wasmExports["z"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={h:___syscall_faccessat,v:___syscall_fstat64,p:___syscall_getdents64,y:___syscall_ioctl,d:___syscall_openat,m:__abort_js,l:__emscripten_runtime_keepalive_clear,q:__mmap_js,r:__munmap_js,n:__setitimer_js,g:_emscripten_date_now,c:_emscripten_get_now,o:_emscripten_resize_heap,i:_emscripten_sleep,t:_environ_get,u:_environ_sizes_get,b:_fd_close,x:_fd_read,s:_fd_seek,w:_fd_write,j:js_get_hw_concurrency,e:js_on_done,a:js_on_status,f:js_on_token,k:_proc_exit};function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_ppp=f=>(a0,a1)=>f(a0,a1)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["C"]=makeWrapper_pp(wasmExports["C"]);wasmExports["K"]=makeWrapper_ppp(wasmExports["K"]);wasmExports["N"]=makeWrapper_pp(wasmExports["N"]);wasmExports["O"]=makeWrapper_p(wasmExports["O"]);return wasmExports}function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();Module["onRuntimeInitialized"]?.();var noInitialRun=Module["noInitialRun"]||false;if(!noInitialRun)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;createWasm();run(); diff --git a/wasm/quant.wasm b/wasm/quant.wasm index dc5a3ffbec4be0bb449c33205b6a09b6fea4195f..f75dfa95ae86f4aa7c218e4b6105854a08f34f8a 100755 GIT binary patch delta 51920 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 a1Pr;$&84dV*TFb)JchmS6xtmkwZ77M8Y zI?ZDd8a%_GobA@xpnYU}boNVM$G&~5DEsd^D_3Rtbk-YR$GW^-l)Xo1nJO!wv)=nU zHWOJN>a22=m8`Qq{W`YdZ7X}9&Z<;dA)U4V>)2DM^_|YDQCTTE>%iBsAKo6`{%lX% zQ#bOr&Nk7<2q-o|u-qmuFb?mBGzYjjdG?jk%`@jma7yysk?*FKg zZQJ_ABfPNK3YuM;ON>ad6`}}7B$Xl}QXIQte`#v56*j%5zrigPdw72xFScXHf1j7c z-E#ERJvQ>|*I04v$M5rEpMUT5CwJkVl>qVM_g%Iv{AMF7cHvV)3O+RyaRFH2*p>S& zG?fB1skN!O-_-%)!~64MkA4?$V|#$yL@PlRn}FXjKTHJu-TcEqzV_4DTR-$k#Ymk> zqL?VmpGdQRT)J)V$0zb=@d2ZsVPHfd)1$jc2~Z$)LI8cH1fEC;xd|eX5OEVciG)ly z!JA0PbrXDvghDp~_SdLx#&lBxi6UigLQ*23+)YSMBy@8Vf{BDmHzAZr=C7yF;HkT>{*CmEi{{=`8!$pJj;qT?>iPGck~zK_+9cv zai$^|Vy&Ev3`sD>1%ume{c$17UmjpVY$dc`vPcn(urD`15(kf!AAPRS4Q#6%8~{ha*LD{#ITYI0`m{ zNS^80_Q+3jlcHPGQlvBV*~ooA#Ro0Hi5;`$geI0HOPW}vj!!~xTNC?A_#?;5 z>z1-2jeLs@ zJr=Q&kLv~pSv95b4mO&ByiR<-t$UkCb98y z(kj-I^^+H`Vm7Ol8&`Q<9snbpX`)ohfga(wc6$#Uh= z)vSQ^lsBzrV*u#m)e2Bp0_ zOVjIg(}k@~KfFdkcz=z8(DOP4;neHcbhP=zbqd1X>sVj3S#&+ir8fIs&w8M$AtIq1zqbRMW&v`%4Q{W?}ky?J&W4ySA6?2RmE z^#xQPn5cGh5Vzg#2_J%a`5_ zC{raXHn2KWoV$U|M8&5zs5U>|pxP|lsM~ZP+2}U=qsC1eRZ}l+WE)ZA{5w>Qo9|$q zQU{a8G`$tqFWte)QLp(9R)=ZMlz-faX`Z|Z6xcI<#wK=?FWM0pJXPbcBjHfRc?5B; zY^u16O%*>9Hctey=4x!VAeOfxR=9{g5!g8rP9cXSuqm(D$~wrK5F!{(Fv|5N35}~y$tKCc52+*UPi%wHt&dST)&^4al{M^wMf={%|1P1E{0nzPydEh z(wP7F4eR1JTQ^vHPWxMIpP%5~q_)@s`QcCOob-OQ55YIWB+WC=^heH+XC1^EpX~}H z@V9|HlGnOX{pld9z()1KK{gQ^Rgv1LR!!#Er&gW8b3G(3-G2pN$N0uK!b7@2{Ouv7h|5 z6DP4Fznpi+*T`~So>WVoDG=m#$~}2JM_yCT%K-X;ay}fvPvyKHNf-S(^OAxZsBUyj zli`$+VG>giHvMKQjFUa(qRzaE3T{L}bnxlU+=Afoac5qK<~nxa53<_$J6-q>ytH-N zk2LA_@sJ3l(;%{BMt2Orjvv*X|BWS3l?+6AAn&FERb4812R2(ysN_m|JgpKPuaQ?( z@}to47b-bKrns*spY742Z9^YE3|-pVhxcVw@sIlO4(A=Qy56S!2fW>O|H6oppnvE>@rp&w+Gog1RX+bT(ravD<4AA@FFF4QZ@D(Si96m z1jb@~c+^J*o!lfoGOKY0EX-sxI8S9}Rr6eYhtx-QH7{)W$f3hGLDQbAGIOhWnHe-w z=Gn=nXP)gM} z!7)#V#atErDh&0dL>8qmb4E!upNbN&IYbbhfoQ6Z&PEj8AdB?ZNv#>DsSH(|PQ28J zt2w-*(2PpGAQ6?pGJ9guE|uaFKRI>^*Pt_})yVCtYu2jx2Grh`fy4AH>| z9ZXR{luy;4GjuRp2Pf&^G#$*-!F(Mo(!n`8xIhO@Ootb{;W9V8&kfhQ;bu2n>4wE? z+{g|$+^s^KFa$RUCSumW;#lA2&NB{tN}9iIIL0_|0diDQhu0?UN;pU2&U?$@zzHlm z2l1a+Fx)n_Hc8tA17f>a%3_5LUKl+F{h%cP}w`3X|G{}40s-Gz$1q-Q?wfJZb@esCOpqt z+=i(w@(3hj;=l}+SEucU|Ba6@*2W)LIMC6RQx|jnf#r2sY@wxm$2iS@!ZnXPhv5n7cOBK@71_)ZzAK@( zM`p<>d2CAla=pPu9Ce_Ky$(hm@DhKdG5$mz`vYf{)VNAv=-Hl)DSDJ{zT{ zh}o$#9D_t454@t_rZq$MDPm`$$n8b!*luXV8<_=g-iAaOcqjA73~UBi`T@tkkeDVM zmeG~+Vm2{nrsL7a*dF&7TV>9WD~i$LOu4g|eO|FfZ828RS*ar-XN8KGUb1!(D+osN zC=(k_k=#?lvTBP^8ilmC8|s@uq9>4Mh#b=4aSVP0(?5;~BIA+jX%T(m-A#7L!CN@7 z!(nB#Ie3$EEY>NTPTqX_`nHy(G(rNA&(B<{7%c^n}nmPK7B(T zoxb^cRY`EFpX{%nErY|;UPp{v6>MGZl!YYJa_SsTa z1bP0WQtVoJGNp`_g?1{wg{=>#u5w@*%cpYF5q77eDrLIIQI!eAM6$sC5~r=`muWQ8 zO2)|vSjWxrTgz}?fu+mZj!*&T$=`K^Sg2QNWZ88wO;_IbKb~1u~J#n$Zl;8Hm-3wE$sbYUeu%H*~NMF6!LIk1S zY{$sHm=kzImYZdRjltw>-qf_Cc~GPj$r0F)JBv#Csi7a!E~lW}E~9LUM(8Kk>}Yn1 z^p;tW-m|G*J>0@OiwX2I)ydFel zP!D~^??!mS52k(K;K9cZ9yB7Qa$#T0V5wZwmkmtoO|acAHys=liOLW9!id*fMrzmz ztgl>H!@7otMd|@{H&^iGoi(6`i<#V2!|HmDLBL9nilEdUi|_h&OGb>RTk2rRxmfSpN1 zJ7FL@C)5`LqKTD=L!mM9rGdd*2!ixIl9dTK1Q*m;*VZZ=DgKCC&KU^FMM8Kefh zWf1n8Qu)Fl7EPl*Y(cgc=6|2fFpxR*tOIf{t7ld!mO8OLrsEsoa5G_nNL9#=fme&1Bp0P>sm*(x7}gqV?D}ygjjhJn z=V{4U>$TN1Z}i$7BBw|;oaLY!dBdSo^p>{_XX6m;8_p&p7%~EqO>cS02pq>;Egu-c zy5no_2xfwkz0O*pIHodI|&h2O~vO#`Q21D z6`2#KAu#2pX(&2T2Bs^{e!+C=cRY9;>&Lu#W_lzqK57Po>rtNUKMPx7o}505bu{5l z1SKb-!PpF94!VdPKGGjKsASD$OE~KtU)#v866^}u{Y>1`J5@e=CJt+^i1YbulVHo^ zcP+$C6@KM6a_{fh=rE)gC8=`g0N=;~XS3n(tdf_WjVVC5`E1s!U8fuQ?b&R=5q5i5 zHX`me2Ci$ZK31%)kCmMFdv?-9SBgtYNO8%BNO8%K;*wgWIMQ6f(;)9U2e8So1>}QY zWF@r~>ZElJD@-{|d>efZd%t}TGu#bIc$ihupf5g84}Q~mtbPA7`PF&2!}_ng90i;m z9=am%wvYLu&PN}>hm6E_h@X&MMkt9CQyd^?HG~j7zyuWoq)U`=j-Um_5Ou5cCp8C& z(98_F9)@d#MUe`45QaRU5%oc26ZVkdjfIs%#Foq9v}Ra-f!l*7lnZKm2Q)}eJvf2t z2v7})eGd@6gTX&THDH5pMv>B_QhZL~0yvRj_rL(~4}M6FQb_=`9@ijl0jWXfa_mOu zE!_7sAYAXb96Vi+Hxb=0u{_k2aPD#ou4Ro*hzbhFJiHFBZR%=KRS!krIwG*$knf0t z;W!NW5aXRe3!pjp7CAdo7o3F-@8oo~k~>?L($3`UxQr7+LRp7d5Y;VcJm?Cc#w|l| z5Z_AW39D2T#i%%vd9;Dh`d^iW0D)mK$Q}!TKZUz)n4HI=qX>;~>~N#)!vOeu-R3zp zFA^YeKQs!s?ZX6k@oT}OwQX)|G&PO~tsOE#ToSffL(t-;VX`PL&$$Fhs5{^X!Qu)h z&`X|>3e66o7Z+jRM@H_EhUFDB%`|bE(s18(0fY}420V9}vpNyw&QcWx0rWGrKwHCA zv<6Tl3`v*=l`sQv;BRB%_8sb~g#azr`N==h^jNt0jjnqfl*IK$8Vq8=h!OD(G3dYg ztLtw&;0x|Z7a38pm@UB`K=-Lic`2Dloc;12H}O;FcHuQvp_x?9`@`=JK|Q?g5Dc-> zC>UX-Q!vKLFmd8O!78G!DOM&0Q>`otW?0!2%(ikVILQJ>>%vd7is@^f1;>zbKHq{b zh)lbbb%^F@t4AqJ54_P%fy*gYeW48p=`j|3fK6DvlMC?47um^ReW^~=$_SdNs_!t1 zD{X@aPVEga+o3!F%!VIERx-(i zhLs6=2&1dX(75q$L;-a#I>t^88=#O(Q;$)xx*!UqQfxSK8FFwPEo=(g%-QndCm@F9PJJmYzT3jKZyc6t< z6IOuSc7Pq5>@Etq7$OLXuq?n3gXHZ81BjK20Tdl&7)^s_kx?cY{l`C$2tdPC8yyv* z9%WQdg%e$9CO5dv5O|D)cFu^IOWP(^bD8ZON}c74%?SDeLzJz2F$&R!Va&24n1MpG zXjLc*GA=R;R|c`>y=Ea!mV+3s?jUV0u)CWcDA{(&1kaMle6Lv&>s3u%9LBn=|OVm+K zWFgyYMS_HY#Bv9redr&9L7=BtbtAFy3+H1J02IG;mVW4O1nvT3?R3Y$vJWnD-VqB5 zXx5xhuSso85gd~nG$RWCh2yZu*ib9jLe@b_fDUjb>VH@psX)ba=c`2ICpQx51&#+& ztwBu_ORVJp3LQgoe@hwj%p7-trknX@FwKJvRbwImldn6%EHk?S{r%~n7-i?9?JPhD zAk9oSvot#iTG25A|B<_oN>|BfaxokWvCMU$XIqDq`|(8>yu|Ai(+ z`SI_0W;EzhUe+O$7r{`l`6!xCEGjJDBhX&@p|t0rqqi2?O9$<_)>U5%?Gcf;tjV6q zIAsOeG88e6084=kK++>l49sjZo5FFR$pSKQ5hpE>bDDTY6iiWXvp6@SJ1Z$_XP_gn z6cdMEQ2Mdh!?4DA5W}IFuAJlEG+F+FVW!~N4-~K0MPhza>6AlLehPL)2+L+hY7iSq zlG>1B~rsq2G?z!Qo8;(|Q{c*wC0V5<7X5k%Opg;McpW@I@&!L~*LqC0oe){K3=EvUX_c;A9C>3q2EpD2UGo!IrpL*bI)-%Y-BiYL&Pz1|2D~1H`TZ&^PGj zO2B#dt|+fFplV^Up*y2I^|XAjbi8WmBs(T)*>D1aaEQWG7SfEa?Qyh{Lb+x#EdkPQ zgMg&BA~UGu2rML=d!vkEnOrSqNH(;J=`I@fp{RqEuA0F5hwl10DaQE@EPKw|I*P@B zkH^^P0wMqm5fCBYn_hIzkA2Fkw@SKwq*^gGI=xD@Z^4wh&5*zpAkgM7qNY#DW8^hX zvOA}}3qd1pGm#m>O2Gg;q8{o8ykg*k&l)WsxVqAufPX6DJ?fb+M}A>t&`?oMOKjdq zFQ^VE2%Q)`RvRD+)0`o&laQU-U`L`3wth4jQbPgD(L+g9pP>eD;Z&XCHzS7+j=G9I z62bwM_SQ@@L&=euP}4~F@j_xZlfcQK%9=i!4{Ws9p5fSqSs|e)N;E{)Cd`bWj(SWV z$&z7AiD+oVfIX!B1W1C0rb~PZ5_B?#N&+-cPv3SDc#^?A%|Xzj7MY>6sMbuJ-T{(& zWCxO50)h&uwWx~_qGB|SAwjKX7A&Xe3~d2sm;ezK`>X(6Tw6g_Br_1i3tg!Q_tv;Gh@Z4M* zDUef+=C872WcOouSO12+kZ$yg5in6>-Qc7mastq5`++HMWCSb;WQ#q=&fZ`{sff(M zbu}bIpotE{7P0zRo+TeUhG!-1e9wS6v(RDWB$Oq;Jcif!w|t<|WY1&yvHtttS0C}K zkL8kkKCOuq#Jf!Ar-%KQ|3#O&`BYw0e5o$=bAciSCmQ|b{!{rw-8HEM&UVx zW2eSz=5jA%N6CQ={5<(|D(hBHmoEq`k!FDAQ>`Ot2{@%zao3flt=9?(KL436GNXJk zlehdu6v}5G5y{a2j4uM-E}#Ph5iC3enXpJ9$OTm+D72C&FhMa0%CJZglv|*4Xp-Q% z2r99Z5%k6^AgF=+*a><(K1ED}a_ZUEjm)8hd zGbD$%X~c%Kh&wc-pC3|`%0O9#l@z3lcaw|;pa*FIDJbSX{`tL%w1bx4 z9ci#U3Qm&_5JqQFZ|AwjkUSVeR)9E-F5pTz6l8));7A7q3c^e!PUKFTtA~4_(dWP@ z;)7D^YT}-JY-k!yL{3Cv9$M89#Grg)CvVjodhy-M(; zqZ8X?;t>};TS-Tr%a9rM1D>V_nACjA!T<$ZO=bv_Nwg0N^0!W=ORY4g=%O|$c$7&2 zUSMrZ3YtK&hia@XD6oJO+8=1x7_*XOLp?qep(~k@MuUhSMj~#qsOjz_N?Q zpdit5B)}*dP@O*#3vqpUV4`bTgQv2ikN% zq-yJ&TFoaU=qH)BVma?LHY|#{C--B#8c2@EkovKGlkJ2&jX@(O0tmci2wD>QJDDIZ+Vr=eFea|0-$QXap7 z52w!!8~9v&rfuXOv1RhdjeIY@-noO1MbKjtw-8L+q`v;R2{%&UFZ22)ek_Uiy*Bes z?5Oy0n|T^zz2xb4@gDIzw(`e3Ii;8d%u57^lL&Gl_k#gMmdNM>7<#FE>j6FhL1CO% zBbXfLO$c6!^C*HT+xevkUf<5^Juh%v#9eR^A0H)oPOlX89uRqJ6TM@n!Eq>^+CdAT z2$)d=STmkmMT@W|;A0W2FVHC=%;35Z@gW#Tph>D1R8e{$ z0@z?f)TscALz5ww- zv)kGj3Q$V1MF)SC;*i^_IDqjgFM2Ij%7@^ZgET`9F9;aUH4TYrmo4(_u9N+MDUi zfG{DiewSxOAymM7K2i{T<8I;Y8TBvmoDZ$<0<{aa9!kH&U_OVno9aR`F)VB%q(k9I zhtv{IK?E8Ff=se+bcUE#MPDZ5F9c-}*AbLM%RtZ#dLe>JD1=djy`d2XVX&yNYAJaH zWEcP#WA&o1DbUk!P%+gSKwmR(5P@Je^dST%K@>!A8q`Gu^PtHfn2-5Iun77gf^#4b z66_1Ce)M@IgJ1~YE11=rzSqoVI2cFdM%+)OjJ3?_L+x#3)<8<%%y7OI?8>(=YY^pc zXI3?(?_fA^L%5S!com_XKg}$Q!snP}Q@ER1r4)u@Yb{&8eLnNk>qpnEU~$cqd? znGVWr*!k$2Zo&wX6g4DecT$H*NC&ub9Z)HJ(R~>Ny>(C%$%9fv16HZ^Iv}|2KuAJ& z#Zc3uA!Ar8-P{}9VJ~y>A2~_u^Ozl4pGGjT{M~t?Rgda{$axe@QIiI>gN!(!OFf6` z3pN2T4h^H!u$i-^2DS-V`T_4T*7&FL+HLTLXlzas&{*$`C;KG7;dVYiPy}WUvr|r8UE$a0EzfemZ~$@0cea3gTdQ}UHha2xU%dEgUX z;a|2F8%m^5R({G$tP{u_NE2vib0F+TYZ#1y28@B|M`VPY|0%EX-}0V;k3xCJr+h@x zfxoK{CqQ>+vt;ULd|1-8@94B7owo2Z-q-)k4qa*MXS@)%#-9I-PrxnHl7I43I@u(q z!gN~>Ro^06RmBf*x-K_ce>4fZRBrw!$1A*Y*FSmp%o4I=47bwBTog9pErW+sWZLI^ z5@4V7Iqwwhj}=B9FW3^n*9^P1IYc5y+y9#D%v!U5b8YiDyRNwadgcNQJ;ki0I5q%> zUJMVK$bxLsk_A=0Z5D5n#oJ_As0P%xR0DTvsfJsG&>CgeeSBuL3cdG(N8oBA#Pl1X z$PNV&w8#>ew|?jjm@k7R9h(G5Vgrm&K$stV1pOuBgcTw*c=d%r+n_4UE->@v&4Y4^ z>>^;ov&b^xw2rS%iW^!T%mRleFS0tiAY|GXJkKsOi|0|Ha-1Wp`-i4?o(-3PMOJ5= z&I3pnIpzyq7U*gg(pNWm&KJD6paLNA)!j7AvUxaBLh&-4)I)Clf)_)o_-N$8gh3XPAnBbd zZnjnqLtUjBSeGp|JaX)pyv%E%fu8d0FL^OU-c?_Mm`u4HU(w12JIe)5H(;S5{T)&m zHS!WOZ4%0;Zyl*`^xQUq&vjq|r6hD|EKY^-a=a?kK^39{J`~y`PzEWg+mr@~A42Fe z%K#34vjB|(qE{aM6;Jb4plo;9_!U2)Yk6BB?-7trD2%aVTXMl15N21HCA!J)zTzi( zJJStuIeR~DZinR6`*}W=)~5Y@OkN(ZR|p34DpmWAA~(9dnff)aORIGZ%K++WMoj2E zwQ}p%Jfp|mc+G+qfp30unj$8O6)IBXD#|HUAZq)X3x)jRLR`t-bGOLFeQxI)mW|-u zuleyX(StJrm0^&MTA&lZ;aMVtl{)tuUdu+y+rEK-9+J;~!>5Eo%^n5|YxAAVu9aQC z#UzE~sBd|N59ismTo!-J7a{4(Z+TtDXlPe3909X*%mU3EdvE=Byd*Nn9JE%u4;otr z-f9n$XMV?X`BU%6%fG|b?m_bL@4#~(lwW_xONSkR^`Q#Z2Qqd-bxlr)h$-%#n9*uh z47WsqFmR`#ilbsl;-F&I_uS$SJt3EV&&$D8H+>IY|1`KN9g(Ce2DthM9_V#Kt1^u_ zaha^M>mLvk)Z#7YALiMqs5J+|A6TvP(R;G)2i{E-IuXrAqd)MPqTBKCH$hH2tkVG) z==;l;e&CaeUVm8^Nk3wdqkiNQ>%MqJ7s)tM5ppTj!g8Rq5rLeCAYfHH@RBt^IJE?7N*J5TLIr;!E^!M2SkqiLN zI6$}T<@y7>B)JG{9madF*-P#^!1H`R4WiM>&kyjfRxc_)k7POQ!dkBxd=UK4tU@ro zz^;;Y&Dc8gIH*#M;toZ1*~r-9KZ3tbv$Iz)~aRfCO5w&AHC zY*@XpfS8HidPr#?iK^FNc7ff?tU?JbMn>|~Uo`;~xF^!dvo6W}k9kW&u0I;vv{ zg58BClm6#1Ye@X)ipv7; zS8aq3Zk6oF1kK$nCi<}f@#~nlim?LONr)29lhrtJ93_NP(8omp4Zp=PlMrQA%k@H3 zmsD?Xc7PIWSfordlNJ-l2B2sT#j50wLKFv7?}S+;A;1@ODS|~#6G~sPo1Pxp9d2lm zmhzM}aqSLG0jGFGR|nIvgU_>}0ucLjJ&X?}9}F840!i95v_=g{$ej(6 zHF4TK$ExL<*q3SfhF~N_0I``I(uK1OZQ)NwL7xLs@t0+6&v^CP0u_L6fkSdR*()sn zh41Qao{x{>s>D(QU1PdIcl6FVk&QycgI-aLGUz07LB-h3k%?A)0Lp@@%r_|0F;Qj> zcZ9OGQ(2+PA|Zqxs zTKZpX!uwg(5YUPUc~}xSdnb8-d`0kFS7%hNT7n#SG84;J4gs_P*sQ^f`V=LXGS3pT3Jx2v9Dy$)2m~RFYi5c23gHG5oDfD!09%oSx!&`Hp6l&N zqN4aJG9iF<7ip%O>h3q-tD6Nlk4P5Pc%7|ZvM>ksnt%-(j+2F&qIkVxG2juz5Fy}! z{H+F@`-8y1c@mujLTM|hl1n3^qkJ@396xPaZ)gGei91?}CP8L21pBaNj@*dS)mq!2 zJC|-7)8+1<=<2(o549m#NMsM|HGvj$o38&7n8YSQ{EvT^ z&xFKu^C>+LTjMU2*sI}d1cEXm!{v~$=m3gs2#adpUvVECJz5_Y9V-)KG%dBH&>x@? ztU<9yLS!lsi4~O?p*#>4T{7XE4dX-}ypoLJlM9mLX@UA=bN5HY~&n}K+_~mY@nnnIX6w5T2b|D zhm<3`vFRY8Th#2zW$B{$UmDyy>Ee>v_o=}-oi(WhT~ay9C|fkr8t^|s`X%|I zEM5QMnXY0Pf55_DlJS`XWiYm}o*Z(2v@?ZQ-I#IIUU z?UCfwd7|RPHx+|+dLF(Yuxq!wAb#zZqdG8UiGj2x2Fj!JMfbp;bqA{C+gT#} zUm`4O#y$*hzM~9d#9(uPIRFvEIIaLo(Jm09XI`%Nj9!P1o7mg`1Q&RwK-`E!rSV-w zR)<3-44Vt~Xy=12k%B|^&iE~bVj%M$c-w%s4V#x z7ceA<>GI7IG5I)m=m@y_l%s3wtWxf~v9v-kD}I`W;G_8XXi>B1$pDP)v~>`8BVzGPE-#s}2G zUv0GKw)TkKwlzPvS+&ftM0o^%{fuDX@cjTiLSH3ETf!>Yxm$~5wJnXins2)EYE7g< zF1JJn&r|&(6|u)RWyq&2G0u1IK()K$ib+rZ=Wpn(ezGkF^j0mv)EJ_%itVbEzG4eK zI=dyQRafb+bd^8jHU$X@J8jXA|LvL8r6PA&UaPAT(4@3gdIwzD27z1H1`Ws_B>Y32 zgvx>8(ES8F3IJ8gFnwry3`{4pO2s74OXV2&eWmajfTDUVm>~2E`BtgODbL?3(E_fq22Q62n4WuA*=mi}&(cDa*BtOrtyoJa zTH6Li0~Lxkze_0U>NsLO#+cgW(C?~KAu zv9Ait0~%#7VO5Zl5<*SrNsFNPH5;u;3e+rEoFMugqN4a+6-6HGj}v31l0eC(ak|%9OMCO!>4uPvW)0XQzF4xwI zER1M+xhU#z=!oDB;_Rjokz0yr5y9k*<)U)ZC*`XC6NW}pLc~|f2?TtIs7f3+k0AaY z0++YKE$%Gn1Ix=)YjxqqJ#)l|1TqU^q+gYU_n#51JRSLFN~Y#Z0NLv9Oe zF_b&>P;RdMw-`#c{IXv=Q!^y6Tn)u}@!yBe#t&#`FeS2LAXd(M%Jk&CB>yl-oP?1I5U|%^J$zelwH-gTzSR{t89&R}K<+zojRy07l?l z%?V!l^)qySz32leVr%^`+Gg96wFV7O$XYlCI+Dyl(kEmF+!Vj9okcTgFy>`PsgfC9 zZ8MIn@*}8iN1l`y2aB;2udtM&@>+Y6775uf37D3$qG7I;K|pDPbP-TVaEBNK!7#;Z9R8Zdh%}^?biqSrdmssY~p}&oM zo*OF8@V%{#Hub}PC9hgFObq&8ARhAA0P&nVTpSp=@bGdc$3H|JeXYsLw~Qq zKPCJ|jEm^JPZ=8E`G&QOgL67PqkD|n{xB2u23#4LZovY=%z^aR4`43F(-Vn&toOyL zgjazH(w{@ZE^#tALA9CqfrThFULH>WYzi*62f1j*W{oVVU*VVOSusZM2P~QK|P`Z!B z>bys-aTy((nCV}^&Pv9MTD%@8lGqTLGfoUmY6cIYqp6SNmhqxgE*mHM2kzH<(8p~i z=hrnc7|>4`FNXRbhQ*7F9e0lxa{}wMcJo;qu)kb+``?`N^L^_y1Kd6Fw=uwiNn&<_ z0WO^+vQw+I^@c8G!Hp6g5R*iYt}Z^laCeoI#K{)UwIYXASUp+v2prJ1)Gy`I$s$km z#>v;@$)YO^iP6ch)C`w5O%@%8zorf$oc%`til^I$Td)>6c$#)U9u?^in;fi5HOhWe zjuTqk&#dMD#h*`b^Ws1S9m?H8rJ^(G8{@X@%>U1$| z$}P5<(}V7)5-Zm+EaO)polL5UGa|{36TOq3(~@QrlO@wdc1^DdF!LIgdMxS?G`U7k zva}`y%tL@(31G#S*h*|&%Cvzn(M=cm@~z`UQIzbBN03%Y0%~zC(5KOYylx4h2;dQd zy9_W&!wiP|Toj<2@XMtF<$NQD_h~V`=txeexKse=f4K0#sTet#Iww=*AWL2_LljbY z{R~`!qYBQ-C*|WaL{`?yC)Ja}XV1fh2fRGxW_>b4d8iDWDMsMf|FW6l7zA(46cYj= zbO7g2Az3|3^z^;2a4Aop1@4FwhgqVmkUB!w(T~(c`RpuF!O`>&v)c5-I$oR#@RuJi zYV%C;Zd2}L5d_($iOby{#6t4*M&aj^SxfJ%+w2J!zr>_UNKvY_kV-iyR;4N znJp#;?pB<|xkR3R!f#_z7tVo(_cx{0$QS1PHZm?e0Whx7Jg)JC-v;9Wz?isCYgfx$ z8asj!+EtBy=|&+ZoTvoSpKFi5&QgEkf1^FR3V>n^<4+QovLgBNNy72}?LYKf6`w5X z;Zc74$zrTe>t^!alSQWi#7*-x&uV8#Dau|?cjG~4D>z&^TGo=xK1ECeq0B!8zAEJ1 zYK7$HQ$zuho<2p?mEhdc1F`r@7n?24E(uo``&4l?%HDgbs7kv2&#I%&Rnlq{8J??q z;M~V^nwW>ZbirxDfe5zkG%+~6Y9P-|xSIK$)fP(m=ZcxgK6$Q~;@Q;+36IPb782f` zE6#B>=@|{8*I*p#m;*?Q(GIt!x=sM8-aRSvI}ZXHPJ>M1gNbYGxNLn5Qx|uQ$PoEL zgBb3ATwfHBC57x{4vrO8L%Qkt1Jk z6pPR+0ik5dJavphI?omJMBk)G^ty6ZN%Lf!@w_!pBBu6OxZQ*LZ7VjB3YyEJ51c((2MV{|k z?FMttLeVLg?(P8BbT!V2DoR1UK;#_x&xIoQxZmTA5PHGWgkP=6oD3+_&hGw>5ASdY zx(?~Q(jPA*yYY{Dw#MJWxvWZ7UD)G8SKu7`9zthJKzC)%B6Q`4D%^0%mraNtmF(>E zH>m4Vk+W^O-{DFRPU>joN}E8QC-OTI8pbQHPm^$~C>yhwEZivby-5TAPUO;SQxSm-IjK1KJ7XnYz60$(&jdExIwujn~8 z_EhC-W_s{^6P2bT*AP0EI-2Mt~nFbVhV#QM))IZ zgF;^uy+{RwTud|Bgqci>5+3nVroKCx!!b z*xO*)qIX&n2o?&#Y&016s zi$u|ozDegkU51lBI_M@QpIBL25-ZE=+0h!^-5TA~8r_0Ex(jkgYjk%aD!ZH`D)U{W z;uau8L39E%j=N2`5|k_#or5L4NUk|Yly^#|dx9AEZX(IuAW8if-jbY+dfe~659tNm z;Dd8S$#exp-HB9>xDZr7tq!hlM&dbDvf`wG=aU@=6v%)Ez>Hn(jyVO z#f^C)3vGJM68+$v#U5OMz@N?Fi%rj62mo6A|*#%P2B8v47#OG=-~O_ zC`EG11tPl)Z&P6v5iVD>!R2O+%NL*4xcvA6MS8-?JR7?K6<*t>@Ljs_N(fbC>8@R@ zcA%MyMJEr&YRP4bMTH0BvgDr@i_Sib%W}5JhZc*%q^-K@+9zdri72tiquv2cK;20m zR{+`;^)3|=^D=uU?Vn5+Kj~s8&2%{k zZy)}`AN_3;C`Y&s17<>(SX}ONzk-8FzPmq!yc6ZCQPGhluWk~#om=Yfq56BMzFX;m zM5Tjus*=+LVezm^_{%6*?`FaXU90HqDu7HUDvg_ejXveTDJu66;=7sZ0ofC@G z$&Z$b+u-yBip5PYup#J}AkP~wgv)oHeBweuf46k+h49L)MeA5zF2_=r3l`jzA-i9M z>8g!U^w^6;y0;&4`pGjc617D|*kzS^jYkjFOGX0C5U0bxklcBZ=+uw2QByQ%3e)mB zp@E%+m#ozVQ!qjFI8h9b+8X#!Vtt2;MQJHz=-Rlzqb_cM1G~eZRY#&pw)Rx+ckSgjJ~pp$9h zRE{7%eY5K4iOVRx=Vmpq%Jew<#8Vg5_JM@xpe~`<1;wb^IxO#Zc3I6ae2HqOuL81D zAUlDS5sKk>*xX-8;oKUInF!}@F$EldiyC{FN!%`p+ihaK_!bHlLawxsPZ6+5?fBSm z8Q?*!RT8v@3BHsBFZu>`!L6oVUrtIx(v6r&*DUFpNtYMq?v<3>-7~^4b3Q0kMX*yp zeTynLRI5U&O_CblmxllCw?g#>-z0gDB-Gg7Z&k;gWKJ*Vi-QYXk4in`mrh(L(1=Wc zp2A_XG%0+(T_HZU{la=bbBgg?nJ-SHN21^J^v`coBPQgLE?)84q)w*5X@Z?x|n>>5vRm6aX9^f z49L1vccs5!EB)11O{E8KB$=BW^@tpIO0ux61)V9$cj4scl}44FvBfUozthOntwJAY zRKt&_YpG=OtIS?H#d}*@qcm1VoTak=37uchjT?v48NU#aaFNlI?VCTm(sP=+zNHXplVUJRVa6Y(dNDeZY2o3lPgLXQs(G}73A?aebHBLQF#qt z#2c%Osu;-~e8R;^$HT6fqSaUj1U34PD-_q(>FSjnSkBQ4SE_n~)>W!X_gTgM-_%dz zvhw_5ob)iH{9=_FI7Y^66(x-SWHeiHV!YHWBl&steCH@Jw9$&g=h+-E;G*l9cpqEq z4*}>Oj>rI5c%K^4I|V?-Bb)D2$NxKtjXL_z%DU%LbfEEmoMq?I8?x^g)%$(xWfL== zX-k+DaIUvMnf}B5GC9%NtJ%qwqia`VlF!jMtyV`d>TX@ligtOtND!C=_{h||SDOR} zR;#fOYI0I!zvB#|nT4GkJ!p*@-p2<@ zn9kKAmgT-aca5q|^yI&Q%!}Nj<&hhV5t(98lD#MW7@(HoO{AYa<1J1dxW~de#}OqP zjb9r?<{OZC38l}A`m8%rWZ!njfi79A2BGZlOtt|uf$6kPTB~Zr1j8K^p!pJZMk-=? z3Yz~mO-OHAYueq8wW>DDq?v_K6tvJVpR(msMo@rsaOcA1z_r6F~+ zsA&aE|0{x3$v8Qzk|Vk(oa0Vdr~K2!OWcF5xUO*XGcjdhB3cIm*^Ge2gWslDj~VcE z^3N5fNjBVP@*g}I9(mcYPEAZC-R`E`0n+U%L(D)jk)jb9laVNCj8-y5G27tGfV8K% zsiz$&94mn%pE;Q+Z}4D>4N(7RJ&n7+zI(koACvu>&8l1%Y*0Bomu+B;pqeX&s`Ydp zCrsqgEMg>2Y#8BSHPvJO$DxY6d?gLu@67_LnDL?*S=W1dgR1OC)?a6BRHdBb0HYqZ zQOzW(2s)LURDZp;JL;K@>T;qoZPYP26M3}jDEj1w*kp6tCUr(%v!Y=Xmn-vDS4?P1 zf4)f#fq)BvzMEA=?2C3iezTfu%P0<0zIh;7ykoX}ck!}VQ^&#ew-hgmk>cIIC0RU> z_17P7Nfs~TK{YsQsGtxf_pehO{+(1!%s;0ZF}3$YWa!2RlNoA$&@eR%rV>>;%D7fW zz+`C*B@oYIhuma`i>c%=QkLa+axYpuOP~3Wnn$I?NZ=;XPw|U)?b>#)~BMK9r;|rBwn2urax(#9hQ6~OjgIS+Y>2M8-3=( zsxrTt0*J9t`j-E@2OjS`Jn$4gqDJB%PfvJ6O+2FJV4joquR_SyM1+lxtmDK&k~8k$ zqb_a$tNr7|u}^7n(x%eAN4G{7{w`Lc#E25Ks-hxsq-DBbTvhc3DgPq~JOTlcFcuf- zq=8@s!|yXCV!ffUX`%fO-@Y9@RCJ0PX05-0#+Z zYc2Bk!&SrDN0A;ZcDO#wG)7M`IAoY786M!PE9yU5Y{IVHHdifSu42iBI<(?=@kxm* zJ?o)7-?#t^oo723r#>HxAH)P|DZu|_VRoF{33vjdh=ctaQ$zQf9J`R=3oONjU$E{o zH^6-xuZ6f;rEE^nX#8A)w81=ZNQ)K_-1KLJ6Bi~2a_Kj|MqUM!+fyg8ORS-AocQ;1 zgMG4R%QzK{O&T#y)t%C=IS}WJAfo3T_L8 z%~hda0?+s*h>L5~DshriB_4M;#Vu4O~Y-=;J;n_Uf+~T*w$7fXI z7~|U`Og}c4(I+JzOKna}jACQ2dM!b)yRWJZ$< zpR6mj1S13)8Nf($8kHs8&^->C%dnm{M*es~OB$G5@ntKk@{urYG{R)`6K?ugDc#sD zPvHbc&RUtONnGD zvn*)G9X(95f@fZZhoS7LfSW1eIZ~fF*8i5mLA(q|VPcNl3NkNVV9+HZe0B4?(TQZ2 z(er>0u7<*0U_Oa^XXDVzwRzx1I4tulM%CiXm$I81;#AZecGGX;+67cq7BY#_O46uQVN0!MndGI7KfiNYqUSN5|n zLH2uZIz$l4q;(A?En37UZ6c)$+-wtn`g@yrbC{U*_E3t9cQRZeSqVb92VARE_yg&$ z7X2Pm*VlK&*iw@bvM9msE02~k* zhX-cfIbE_z!hvRPm+RM7y$GuI!)GLnSUX@`Ur$KrvRFn%l^mZk_YEsy?#A_+hSa5ghjRFd{S8UeFB@A(F-rVF!+Ucl=G) zKdxqEejSUcgu8gzf)C4z#qBVSnji}u7&|JKSCOHA_PjcxcX;ay+k!j>GW-J&6qo`t#E3D} z#ztRS7-JKSMIJ7US%>HhTmn`2lfXf9Ga9Ol$>iFKFw79SJ7qv2&dAmjTKdwwBN_MD zW#^7O197ASvn>{HW7V;|h^NINONW7|kQ>eo6NQD}#=zXq|2<6m|MAN0=2enaL+gZ3 z{|c`L`~zO;ZNFCUxxLy}J;ioe*VCUpr_PFfRHN&jS3ik$HtMIJS4U^;X=J&kQUB?A zRTgXBr}H~l*6yW`>QEQC^YqdVj>AmW>pR$BIa&X`1H;v1{k<2|Om}hHT`#D+T`mh4 zxm}GaetT@Ng0l{Rzc9`%&Ao!Zd@tCp7i`C7I9fluT~%@Y!Pnc>vVU2Gd3t@SPpj-&OC zU1|d`3*J<7necy5cQ^cHdj-RNks~%UjzGyH%Ep_42m2)rsP}de__7)ynl> z-&U`>=j-jiQ9tZ|J{vBBta-V)17SNigB7}QhkNM&uGs?t!j?ViE4d9}#cx%H+!E2Y z_8m3U9njk0K1Q$AE68L-$9#A3a>Suv;Yg>oL+|}h+MfX+;`;6gQt)B?a^I_T^5YCh zek|bj>!Nh9Dg&0626k0C*k}Wmn+8_DoI!J#9gBaYfy+sQo12bqxB<&f1G_XGY^VXt zN&}mf0(P1yt8d^k)8H;hfiqwO4Om7R*ty+cy6*QWES=FEVGCDm(qn__!P4pJV1))u zrGZUL2g@^Hu{5x$%g;??X_kR=)8I}>N9P$ZCk?DF1x#}<#nEl&y{qcn*v9#K<$G%Q zfDQAv#``ofZ%11?3kQhch$K}y>*wot-%}-J>$(97ZM?`vrPDHB_wFKoZFjt9q&Q5BX=ozv}!|F*j?$YgRbCh>5k8` z@xs7LXDxL162GQ9K4#;EBb5&Hj^B$bLg+2ss|F^%rGT^y03`!q$-@lL6ifz^-@^hU z`+S!Sh45j9kafNv$^e9$?~=hjjm3twVGa>zBFN!{KdAAEjZq1*=``bBI|EC@2c#4z z$#=+~sA5V@#G#BsEJ+|06($JtjU4j*P(~tnd>$?;UrRzRSQ7PY{lF~KYx#`)V>LHV^;AW(Q zAqjw`E4b;0XlWz^xL!$~T9!^rM~9#Qmagxnrh_3ifTioZ6H>tRSs$sQ;;0WoCwUPQ zMJG+x+dfkJ6Rq3atp|&IS_2z+*gI0`m@ht8z>x|0R1kgQ7D0+Bp9-T-koVQWy-YTO zzdH-#1Nr`x8}EA%cd?csY?Z-j(W50uk^^?J8U;A~ieAPAk)XJLf zY{`s2-iH{;sLhu6^N$xrpG>wgo)zwr|QZQJ{_Fl@EZm(^VU}VnQC?WKEB0eH)<^C_2b|#1q{zD57- zb2UW5A^UAOb-%i%glZurzhNMFTAylrW4~&N<+Xx`yUz|@s9Lw^hCeZABwS^~wkQ9j z-Y6d4E*EET2Muh-)PhAqte>ou$)uAhi+o_3(|((NG{YNwGSFt`A>%J|m(WcNNE_PC zWaI#GU5(F~=MQ)uAv2T)iMIf`xgT`7!<^ukS-JPOwDr&A?qPj#kvFt$Qjyo1t#ix0 zv3g3mH=^wq<=%yE+b4s#121Rt)L_QU6Hc7;{gZUI?~T+`eQ$)ic)>Mot9|c2SJ%b8 zIePEWUP;?KaqsSovFBeh_o79Wi)LTH=tBSOX=nVvzjA>uZ{xAmXI4;%=P>o~&+9H+T9J^hDa z`m0QQS1Nw)H0R^C?*=gOFNEUbuvb!6BX#NXhy)2h94pXSq6f1cNp7u(aJ54+4erT>#JxVgO~B@N;&p4|#3 z_<*odFTTthDvWWC;BUASta=g1UOe}5f(KvJkCM8iX}g=7PmM{ffx%$ev|S%I$2&E) zWQYFI9Iqs{Zik_ibJI&;r$sfrq+g!nO^NM&N%xuS9e&ozm-(LO1RDwa7JJN3@FURlo5@?PQuFYRpma;|r2UTo`!ZRcF;&36;)_PM#$_@;E^Z^U=}rN&3k zHVhg*c5}<4bWt2=3_b}*I03HDbNdVHl p51aMNLIWHnpgy)qd;v8`m?MHH%$xp8C-_VvVEO^VtjG<@{{oA~Og#Vq delta 51302 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 0 ? max_tokens : 256, - .n_threads = g_wasm_threads, .kv_compress = 1, - }; - if (g_ctx) quant_free_ctx(g_ctx); - g_ctx = quant_new(g_model, &cfg); + /* Update generation params on the existing context (don't recreate — + * that would wipe the chat KV cache built up by previous turns). + * kv_compress is set at quant_new() time and is immutable on the ctx. */ + g_ctx->config.temperature = temperature; + g_ctx->config.top_p = 0.9f; + g_ctx->config.max_tokens = max_tokens > 0 ? max_tokens : 256; double t0 = emscripten_get_now(); - int n = quant_generate(g_ctx, prompt, on_token_streaming, NULL); + /* quant_chat reuses the KV cache across calls — turn N's prefill is + * O(new tokens since last call), not O(full history). The browser + * sees a near-instant response on every turn after the first. */ + int n = quant_chat(g_ctx, prompt, on_token_streaming, NULL); double elapsed = emscripten_get_now() - t0; js_on_done(n > 0 ? n : 0, elapsed); g_generating = 0; @@ -107,22 +109,24 @@ int wasm_generate(const char* prompt, float temperature, int max_tokens) { if (!g_model || !g_ctx || g_generating) return -1; g_generating = 1; g_output_pos = 0; g_output[0] = '\0'; - quant_config cfg = { - .temperature = temperature, .top_p = 0.9f, - .max_tokens = max_tokens > 0 ? max_tokens : 256, - .n_threads = g_wasm_threads, .kv_compress = 1, - }; - if (g_ctx) quant_free_ctx(g_ctx); - g_ctx = quant_new(g_model, &cfg); + g_ctx->config.temperature = temperature; + g_ctx->config.top_p = 0.9f; + g_ctx->config.max_tokens = max_tokens > 0 ? max_tokens : 256; double t0 = emscripten_get_now(); - int n = quant_generate(g_ctx, prompt, on_token_sync, NULL); + int n = quant_chat(g_ctx, prompt, on_token_sync, NULL); double elapsed = emscripten_get_now() - t0; js_on_done(n > 0 ? n : 0, elapsed); g_generating = 0; return 0; } +/* Reset the chat session — wipes KV cache. Call when user starts new chat. */ +EMSCRIPTEN_KEEPALIVE +void wasm_reset_chat(void) { + if (g_ctx) quant_chat(g_ctx, NULL, NULL, NULL); +} + EMSCRIPTEN_KEEPALIVE const char* wasm_model_info(void) { static char info[256]; snprintf(info, sizeof(info), g_model ? "Model loaded (%d threads)" : "No model loaded", g_wasm_threads);